@probitas/client-connectrpc
ConnectRPC client for Probitas scenario testing framework.
This package provides a ConnectRPC-based client with Server Reflection support, designed for integration testing of gRPC and Connect protocol services.
Features
- Protocol Support: Connect, gRPC, and gRPC-Web protocols
- Server Reflection: Auto-discover services and methods at runtime
- TLS Support: Configure secure connections with custom certificates
- Duration Tracking: Built-in timing for performance monitoring
- Error Handling: Test error responses without throwing exceptions
- Resource Management: Implements
AsyncDisposablefor proper cleanup
Installation
deno add jsr:@probitas/client-connectrpc
Quick Start
import { createConnectRpcClient } from "@probitas/client-connectrpc";
// Create client (uses reflection by default)
const client = createConnectRpcClient({
url: "http://localhost:50051",
});
// Discover services via reflection
const services = await client.reflection.listServices();
console.log("Available services:", services);
// Get service info
const info = await client.reflection.getServiceInfo("echo.EchoService");
console.log("Methods:", info.methods);
// Call a method
const response = await client.call(
"echo.EchoService",
"echo",
{ message: "Hello!" }
);
console.log(response.data());
await client.close();
Testing Error Responses
// Test error responses without throwing
const errorResponse = await client.call(
"echo.EchoService",
"echo",
{ invalid: true },
{ throwOnError: false }
);
if (!errorResponse.ok) {
console.log("Error code:", errorResponse.code); // INVALID_ARGUMENT = 3
}
Using with using Statement
await using client = createConnectRpcClient({ url: "http://localhost:50051" });
const res = await client.call("echo.EchoService", "echo", { message: "test" });
console.log(res.data());
// Client automatically closed when block exits
Related Packages
| Package | Description |
|---|---|
@probitas/client |
Core utilities and types |
@probitas/client-grpc |
gRPC client (wrapper with protocol: "grpc") |
Links
Installation
deno add jsr:@probitas/client-connectrpcClasses
#ConnectRpcError
class ConnectRpcError extends ClientErrorClientErrorBase error class for ConnectRPC/gRPC errors.
Constructor
new ConnectRpcError(message: string, code: ConnectRpcStatusCode, rawMessage: string, options?: ConnectRpcErrorOptions)Properties
- readonly
namestring - readonly
kind"connectrpc" - readonly
rawMessagestring - readonly
metadata?Record<string, string>
#ConnectRpcInternalError
class ConnectRpcInternalError extends ConnectRpcErrorConnectRpcErrorError thrown for internal server errors (code 13).
Constructor
new ConnectRpcInternalError(rawMessage: string, options?: ConnectRpcErrorOptions)Properties
- readonly
name"ConnectRpcInternalError" - readonly
code13
#ConnectRpcNotFoundError
class ConnectRpcNotFoundError extends ConnectRpcErrorConnectRpcErrorError thrown when the requested resource is not found (code 5).
Constructor
new ConnectRpcNotFoundError(rawMessage: string, options?: ConnectRpcErrorOptions)Properties
- readonly
name"ConnectRpcNotFoundError" - readonly
code5
#ConnectRpcPermissionDeniedError
class ConnectRpcPermissionDeniedError extends ConnectRpcErrorConnectRpcErrorError thrown when the client lacks permission (code 7).
Constructor
new ConnectRpcPermissionDeniedError(rawMessage: string, options?: ConnectRpcErrorOptions)Properties
- readonly
name"ConnectRpcPermissionDeniedError" - readonly
code7
#ConnectRpcResourceExhaustedError
class ConnectRpcResourceExhaustedError extends ConnectRpcErrorConnectRpcErrorError thrown when a resource is exhausted (code 8).
Constructor
new ConnectRpcResourceExhaustedError(rawMessage: string, options?: ConnectRpcErrorOptions)Properties
- readonly
name"ConnectRpcResourceExhaustedError" - readonly
code8
#ConnectRpcResponseImpl
class ConnectRpcResponseImpl implements ConnectRpcResponseConnectRpcResponseImplementation of ConnectRpcResponse.
Constructor
new ConnectRpcResponseImpl(options: ConnectRpcResponseOptions)Properties
- readonly
type"connectrpc" - readonly
okboolean - readonly
messagestring - readonly
headersRecord<string, string> - readonly
trailersRecord<string, string> - readonly
durationnumber
Methods
data(): unknownraw(): unknown#ConnectRpcUnauthenticatedError
class ConnectRpcUnauthenticatedError extends ConnectRpcErrorConnectRpcErrorError thrown when the client is not authenticated (code 16).
Constructor
new ConnectRpcUnauthenticatedError(rawMessage: string, options?: ConnectRpcErrorOptions)Properties
- readonly
name"ConnectRpcUnauthenticatedError" - readonly
code16
Interfaces
#ConnectRpcClient
interface ConnectRpcClient extends AsyncDisposableConnectRPC client interface.
| Name | Description |
|---|---|
config | Client configuration |
reflection | Reflection API (only available when schema: "reflection") |
call() | Make a unary RPC call. |
serverStream() | Make a server streaming RPC call. |
clientStream() | Make a client streaming RPC call. |
bidiStream() | Make a bidirectional streaming RPC call. |
close() | Close the client connection. |
Properties
Client configuration
Reflection API (only available when schema: "reflection")
Methods
call<TRequest = unknown>(serviceName: string, methodName: string, request: TRequest, options?: ConnectRpcOptions): Promise<ConnectRpcResponse>Make a unary RPC call.
Parameters
serviceNamestring- Service name (e.g., "echo.EchoService")
methodNamestring- Method name (e.g., "echo")
requestTRequest- Request message
options?ConnectRpcOptions- Call options
serverStream<TRequest = unknown>(serviceName: string, methodName: string, request: TRequest, options?: ConnectRpcOptions): AsyncIterable<ConnectRpcResponse>Make a server streaming RPC call.
Parameters
serviceNamestring- Service name
methodNamestring- Method name
requestTRequest- Request message
options?ConnectRpcOptions- Call options
clientStream<TRequest = unknown>(serviceName: string, methodName: string, requests: AsyncIterable<TRequest>, options?: ConnectRpcOptions): Promise<ConnectRpcResponse>Make a client streaming RPC call.
Parameters
serviceNamestring- Service name
methodNamestring- Method name
requestsAsyncIterable<TRequest>- Async iterable of request messages
options?ConnectRpcOptions- Call options
bidiStream<TRequest = unknown>(serviceName: string, methodName: string, requests: AsyncIterable<TRequest>, options?: ConnectRpcOptions): AsyncIterable<ConnectRpcResponse>Make a bidirectional streaming RPC call.
Parameters
serviceNamestring- Service name
methodNamestring- Method name
requestsAsyncIterable<TRequest>- Async iterable of request messages
options?ConnectRpcOptions- Call options
close(): Promise<void>Close the client connection.
#ConnectRpcClientConfig
interface ConnectRpcClientConfig extends CommonOptionsConfiguration for creating a ConnectRPC client.
| Name | Description |
|---|---|
url | Server URL for ConnectRPC connections. |
protocol | Protocol to use. |
httpVersion | HTTP version to use. |
tls | TLS configuration. |
metadata | Default metadata to send with every request. |
schema | Schema resolution configuration. |
useBinaryFormat | Whether to use binary format for messages. |
throwOnError | Whether to throw ConnectRpcError on non-OK responses (code !== 0). |
Properties
Server URL for ConnectRPC connections.
Can be a URL string or a connection configuration object.
Protocol to use.
HTTP version to use.
TLS configuration. If not provided, uses insecure credentials.
- readonly
metadata?Record<string, string>Default metadata to send with every request.
Schema resolution configuration.
- "reflection": Use Server Reflection to discover services dynamically (default)
- string: Path to FileDescriptorSet binary file (from
buf build --output set.binpb) - Uint8Array: FileDescriptorSet binary data
- FileDescriptorSet: Pre-parsed FileDescriptorSet message object
- readonly
useBinaryFormat?booleanWhether to use binary format for messages.
- readonly
throwOnError?booleanWhether to throw ConnectRpcError on non-OK responses (code !== 0). Can be overridden per-request via ConnectRpcOptions.throwOnError.
#ConnectRpcConnectionConfig
interface ConnectRpcConnectionConfig extends CommonConnectionConfigConnectRPC connection configuration.
Extends CommonConnectionConfig with ConnectRPC-specific options.
Properties
- readonly
protocol?"http" | "https"Protocol to use.
- readonly
path?stringService path prefix.
#ConnectRpcErrorOptions
interface ConnectRpcErrorOptions extends ErrorOptionsOptions for ConnectRpcError construction.
| Name | Description |
|---|---|
metadata | Headers/metadata from the ConnectRPC response. |
details | Rich error details from google.rpc.Status. |
Properties
- readonly
metadata?Record<string, string>Headers/metadata from the ConnectRPC response.
Rich error details from google.rpc.Status.
#ConnectRpcOptions
interface ConnectRpcOptions extends CommonOptionsOptions for individual ConnectRPC calls.
| Name | Description |
|---|---|
metadata | Metadata to send with the request. |
throwOnError | Whether to throw ConnectRpcError on non-OK responses (code !== 0). |
Properties
- readonly
metadata?Record<string, string>Metadata to send with the request.
- readonly
throwOnError?booleanWhether to throw ConnectRpcError on non-OK responses (code !== 0). Overrides ConnectRpcClientConfig.throwOnError.
#ConnectRpcResponse
interface ConnectRpcResponseConnectRPC response interface.
| Name | Description |
|---|---|
type | Result type identifier |
ok | Whether the request was successful (code === 0). |
code | ConnectRPC/gRPC status code. |
message | Status message (empty string for successful responses). |
headers | Response headers |
trailers | Response trailers (sent at end of RPC) |
duration | Response time in milliseconds. |
data() | Get deserialized response data. |
raw() | Get raw response message. |
Properties
- readonly
type"connectrpc"Result type identifier
- readonly
okbooleanWhether the request was successful (code === 0).
ConnectRPC/gRPC status code.
- readonly
messagestringStatus message (empty string for successful responses).
- readonly
headersRecord<string, string>Response headers
- readonly
trailersRecord<string, string>Response trailers (sent at end of RPC)
- readonly
durationnumberResponse time in milliseconds.
Methods
data<T = any>(): T | nullGet deserialized response data. Returns the response message as-is (already deserialized by Connect). Returns null if the response is an error or has no data.
raw(): unknownGet raw response message.
#ConnectRpcResponseOptions
interface ConnectRpcResponseOptionsOptions for creating a ConnectRpcResponse.
Properties
- readonly
messagestring - readonly
headersRecord<string, string> - readonly
trailersRecord<string, string> - readonly
durationnumber - readonly
responseMessageunknown
#ErrorDetail
interface ErrorDetailRich error detail from google.rpc.Status.
ConnectRPC errors can include structured details encoded in error responses. These details follow the google.protobuf.Any format with a type URL and value.
Properties
- readonly
typeUrlstringType URL identifying the error detail type. Common types include:
- "type.googleapis.com/google.rpc.BadRequest"
- "type.googleapis.com/google.rpc.DebugInfo"
- "type.googleapis.com/google.rpc.RetryInfo"
- "type.googleapis.com/google.rpc.QuotaFailure"
- readonly
valueunknownDecoded error detail value. The structure depends on the typeUrl.
#MethodInfo
interface MethodInfoMethod information from reflection.
| Name | Description |
|---|---|
name | Method name (e.g., "Echo") |
localName | Local name (camelCase) |
kind | Method kind |
inputType | Input message type name |
outputType | Output message type name |
idempotent | Whether the method is idempotent |
Properties
- readonly
namestringMethod name (e.g., "Echo")
- readonly
localNamestringLocal name (camelCase)
- readonly
kind"unary" | "server_streaming" | "client_streaming" | "bidi_streaming"Method kind
- readonly
inputTypestringInput message type name
- readonly
outputTypestringOutput message type name
- readonly
idempotentbooleanWhether the method is idempotent
#ReflectionApi
interface ReflectionApiReflection API for ConnectRPC client. Only available when client is created with schema: "reflection".
| Name | Description |
|---|---|
enabled | Check if reflection is enabled. |
listServices() | List all available services on the server. |
getServiceInfo() | Get detailed information about a specific service. |
listMethods() | Get methods for a specific service. |
hasService() | Check if a service exists. |
Properties
- readonly
enabledbooleanCheck if reflection is enabled.
Methods
listServices(): Promise<ServiceInfo[]>List all available services on the server.
getServiceInfo(serviceName: string): Promise<ServiceDetail>Get detailed information about a specific service.
Parameters
serviceNamestring- Fully qualified service name (e.g., "echo.EchoService")
listMethods(serviceName: string): Promise<MethodInfo[]>Get methods for a specific service.
Parameters
serviceNamestring- Fully qualified service name
hasService(serviceName: string): Promise<boolean>Check if a service exists.
Parameters
serviceNamestring- Fully qualified service name
#ServiceDetail
interface ServiceDetailDetailed service information.
| Name | Description |
|---|---|
name | Service name |
fullName | Fully qualified service name |
packageName | Package name |
protoFile | Proto file name |
methods | All methods |
Properties
- readonly
namestringService name
- readonly
fullNamestringFully qualified service name
- readonly
packageNamestringPackage name
- readonly
protoFilestringProto file name
All methods
#ServiceInfo
interface ServiceInfoService information from reflection.
Properties
- readonly
namestringFully qualified service name (e.g., "echo.EchoService")
- readonly
filestringProto file name
#TlsConfig
interface TlsConfigTLS configuration for ConnectRPC connections.
| Name | Description |
|---|---|
rootCerts | Root CA certificate (PEM format). |
clientCert | Client certificate (PEM format). |
clientKey | Client private key (PEM format). |
insecure | Skip server certificate verification (use only for testing). |
Properties
- readonly
rootCerts?Uint8ArrayRoot CA certificate (PEM format).
- readonly
clientCert?Uint8ArrayClient certificate (PEM format).
- readonly
clientKey?Uint8ArrayClient private key (PEM format).
- readonly
insecure?booleanSkip server certificate verification (use only for testing).
Functions
#createConnectRpcClient
function createConnectRpcClient(config: ConnectRpcClientConfig): ConnectRpcClientCreate a new ConnectRPC client instance.
The client supports multiple protocols (Connect, gRPC, gRPC-Web) and provides Server Reflection for runtime service discovery without compile-time code generation.
Parameters
configConnectRpcClientConfig- Client configuration including server URL and protocol options
Returns
ConnectRpcClient — A new ConnectRPC client instance
Examples
Basic usage with reflection
const client = createConnectRpcClient({
url: "http://localhost:50051",
});
// Call a method
const response = await client.call(
"echo.EchoService",
"echo",
{ message: "Hello!" }
);
console.log(response.data());
await client.close();
Service discovery with reflection
const client = createConnectRpcClient({
url: "http://localhost:50051",
});
// Discover available services
const services = await client.reflection.listServices();
console.log("Services:", services);
// Get method information
const info = await client.reflection.getServiceInfo("echo.EchoService");
console.log("Methods:", info.methods);
await client.close();
Using different protocols
// Connect protocol (HTTP/1.1 or HTTP/2)
const connectClient = createConnectRpcClient({
url: "http://localhost:8080",
protocol: "connect",
});
// gRPC protocol (HTTP/2 with binary protobuf)
const grpcClient = createConnectRpcClient({
url: "http://localhost:50051",
protocol: "grpc",
});
// gRPC-Web protocol (for browser compatibility)
const grpcWebClient = createConnectRpcClient({
url: "http://localhost:8080",
protocol: "grpc-web",
});
Using connection config object
const client = createConnectRpcClient({
url: {
host: "grpc.example.com",
port: 443,
protocol: "https",
},
});
Using await using for automatic cleanup
await using client = createConnectRpcClient({
url: "http://localhost:50051",
});
const res = await client.call("echo.EchoService", "echo", { message: "test" });
// Client automatically closed when scope exits
#fromConnectError
function fromConnectError(error: ConnectError, metadata?: Record<string, string>): ConnectRpcErrorConvert ConnectRPC's ConnectError to ConnectRpcError.
Parameters
errorConnectError- The ConnectError from @connectrpc/connect
metadata?Record<string, string>- Optional metadata from the response
Returns
ConnectRpcError — Appropriate ConnectRpcError subclass based on error code
#getStatusName
function getStatusName(code: ConnectRpcStatusCode): stringGet the name of a ConnectRPC/gRPC status code.
Parameters
Examples
getStatusName(0); // "OK"
getStatusName(5); // "NOT_FOUND"
getStatusName(16); // "UNAUTHENTICATED"
#isConnectRpcStatusCode
function isConnectRpcStatusCode(code: number): code is ConnectRpcStatusCodeCheck if a number is a valid ConnectRPC/gRPC status code.
Parameters
codenumber
Examples
isConnectRpcStatusCode(0); // true
isConnectRpcStatusCode(16); // true
isConnectRpcStatusCode(99); // false
Type Aliases
#ConnectProtocol
type ConnectProtocol = "connect" | "grpc" | "grpc-web"Protocol to use for ConnectRPC transport.
#ConnectRpcStatusCode
type ConnectRpcStatusCode = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16ConnectRPC/gRPC status codes. These codes are used by both gRPC and ConnectRPC protocols.
#FileDescriptorSet
type FileDescriptorSet = MessageShape<FileDescriptorSetSchema>FileDescriptorSet message type from @bufbuild/protobuf. This is the decoded protobuf message containing file descriptors.
Variables
#ConnectRpcStatus
const ConnectRpcStatus: { OK: number; CANCELLED: number; UNKNOWN: number; INVALID_ARGUMENT: number; DEADLINE_EXCEEDED: number; NOT_FOUND: number; ALREADY_EXISTS: number; PERMISSION_DENIED: number; RESOURCE_EXHAUSTED: number; FAILED_PRECONDITION: number; ABORTED: number; OUT_OF_RANGE: number; UNIMPLEMENTED: number; INTERNAL: number; UNAVAILABLE: number; DATA_LOSS: number; UNAUTHENTICATED: number }Human-readable names for ConnectRPC/gRPC status codes.
