@trpc-proto/runtime 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/batch/grpcweb/direct_dispatcher.d.ts +10 -0
- package/dist/batch/grpcweb/direct_dispatcher.d.ts.map +1 -0
- package/dist/batch/grpcweb/direct_dispatcher.js +71 -0
- package/dist/batch/grpcweb/direct_dispatcher.js.map +1 -0
- package/dist/batch/grpcweb/forwarding_dispatcher.d.ts +5 -0
- package/dist/batch/grpcweb/forwarding_dispatcher.d.ts.map +1 -0
- package/dist/batch/grpcweb/forwarding_dispatcher.js +62 -0
- package/dist/batch/grpcweb/forwarding_dispatcher.js.map +1 -0
- package/dist/batch/index.d.ts +5 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/batch/index.js +4 -0
- package/dist/batch/index.js.map +1 -0
- package/dist/batch/link/web_link.d.ts +18 -0
- package/dist/batch/link/web_link.d.ts.map +1 -0
- package/dist/batch/link/web_link.js +216 -0
- package/dist/batch/link/web_link.js.map +1 -0
- package/dist/batch/proto/batch_router.d.ts +41 -0
- package/dist/batch/proto/batch_router.d.ts.map +1 -0
- package/dist/batch/proto/batch_router.js +59 -0
- package/dist/batch/proto/batch_router.js.map +1 -0
- package/dist/batch/proto/generated/schema.d.ts +262 -0
- package/dist/batch/proto/generated/schema.d.ts.map +1 -0
- package/dist/batch/proto/generated/schema.js +327 -0
- package/dist/batch/proto/generated/schema.js.map +1 -0
- package/dist/batch/proto/wire.d.ts +42 -0
- package/dist/batch/proto/wire.d.ts.map +1 -0
- package/dist/batch/proto/wire.js +52 -0
- package/dist/batch/proto/wire.js.map +1 -0
- package/dist/grpc/client.d.ts +10 -0
- package/dist/grpc/client.d.ts.map +1 -0
- package/dist/grpc/client.js +62 -0
- package/dist/grpc/client.js.map +1 -0
- package/dist/grpc/link.d.ts +11 -0
- package/dist/grpc/link.d.ts.map +1 -0
- package/dist/grpc/link.js +10 -0
- package/dist/grpc/link.js.map +1 -0
- package/dist/grpc/proto_link.d.ts +56 -0
- package/dist/grpc/proto_link.d.ts.map +1 -0
- package/dist/grpc/proto_link.js +112 -0
- package/dist/grpc/proto_link.js.map +1 -0
- package/dist/grpc/server.d.ts +28 -0
- package/dist/grpc/server.d.ts.map +1 -0
- package/dist/grpc/server.js +113 -0
- package/dist/grpc/server.js.map +1 -0
- package/dist/grpc/status.d.ts +5 -0
- package/dist/grpc/status.d.ts.map +1 -0
- package/dist/grpc/status.js +42 -0
- package/dist/grpc/status.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/noop.d.ts +10 -0
- package/dist/noop.d.ts.map +1 -0
- package/dist/noop.js +12 -0
- package/dist/noop.js.map +1 -0
- package/dist/proto_codec/index.d.ts +3 -0
- package/dist/proto_codec/index.d.ts.map +1 -0
- package/dist/proto_codec/index.js +2 -0
- package/dist/proto_codec/index.js.map +1 -0
- package/dist/proto_codec/proto_codec.d.ts +24 -0
- package/dist/proto_codec/proto_codec.d.ts.map +1 -0
- package/dist/proto_codec/proto_codec.js +327 -0
- package/dist/proto_codec/proto_codec.js.map +1 -0
- package/dist/router_invoker.d.ts +12 -0
- package/dist/router_invoker.d.ts.map +1 -0
- package/dist/router_invoker.js +79 -0
- package/dist/router_invoker.js.map +1 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/web/codec/base64_codec.d.ts +7 -0
- package/dist/web/codec/base64_codec.d.ts.map +1 -0
- package/dist/web/codec/base64_codec.js +57 -0
- package/dist/web/codec/base64_codec.js.map +1 -0
- package/dist/web/codec/codec.d.ts +33 -0
- package/dist/web/codec/codec.d.ts.map +1 -0
- package/dist/web/codec/codec.js +11 -0
- package/dist/web/codec/codec.js.map +1 -0
- package/dist/web/codec/compression.d.ts +15 -0
- package/dist/web/codec/compression.d.ts.map +1 -0
- package/dist/web/codec/compression.js +32 -0
- package/dist/web/codec/compression.js.map +1 -0
- package/dist/web/codec/frame_codec.d.ts +20 -0
- package/dist/web/codec/frame_codec.d.ts.map +1 -0
- package/dist/web/codec/frame_codec.js +109 -0
- package/dist/web/codec/frame_codec.js.map +1 -0
- package/dist/web/codec/protocol_codec.d.ts +40 -0
- package/dist/web/codec/protocol_codec.d.ts.map +1 -0
- package/dist/web/codec/protocol_codec.js +162 -0
- package/dist/web/codec/protocol_codec.js.map +1 -0
- package/dist/web/content_type.d.ts +19 -0
- package/dist/web/content_type.d.ts.map +1 -0
- package/dist/web/content_type.js +42 -0
- package/dist/web/content_type.js.map +1 -0
- package/dist/web/dispatchers/direct.d.ts +10 -0
- package/dist/web/dispatchers/direct.d.ts.map +1 -0
- package/dist/web/dispatchers/direct.js +72 -0
- package/dist/web/dispatchers/direct.js.map +1 -0
- package/dist/web/dispatchers/forward.d.ts +5 -0
- package/dist/web/dispatchers/forward.d.ts.map +1 -0
- package/dist/web/dispatchers/forward.js +99 -0
- package/dist/web/dispatchers/forward.js.map +1 -0
- package/dist/web/dispatchers/types.d.ts +21 -0
- package/dist/web/dispatchers/types.d.ts.map +1 -0
- package/dist/web/dispatchers/types.js +2 -0
- package/dist/web/dispatchers/types.js.map +1 -0
- package/dist/web/fetch_call.d.ts +13 -0
- package/dist/web/fetch_call.d.ts.map +1 -0
- package/dist/web/fetch_call.js +126 -0
- package/dist/web/fetch_call.js.map +1 -0
- package/dist/web/http_handler.d.ts +65 -0
- package/dist/web/http_handler.d.ts.map +1 -0
- package/dist/web/http_handler.js +295 -0
- package/dist/web/http_handler.js.map +1 -0
- package/dist/web/index.d.ts +8 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +4 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/link.d.ts +26 -0
- package/dist/web/link.d.ts.map +1 -0
- package/dist/web/link.js +24 -0
- package/dist/web/link.js.map +1 -0
- package/dist/web/server.d.ts +33 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +77 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +90 -0
- package/src/batch/proto/generated/trpc_batch_v1.proto +40 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ProtoCodec } from '../../proto_codec/index.js';
|
|
2
|
+
import { protoSchema as batchProtoSchema } from './generated/schema.js';
|
|
3
|
+
export const BATCH_PROCEDURE_PATH = 'batch.execute';
|
|
4
|
+
export const DEFAULT_MAX_BATCH_ITEMS = 100;
|
|
5
|
+
const batchCodec = new ProtoCodec(batchProtoSchema);
|
|
6
|
+
const resolvedBatchRpc = batchCodec.lookupRpc(BATCH_PROCEDURE_PATH);
|
|
7
|
+
if (!resolvedBatchRpc) {
|
|
8
|
+
throw new Error('batch router did not generate a protobuf RPC mapping');
|
|
9
|
+
}
|
|
10
|
+
const batchRpc = resolvedBatchRpc;
|
|
11
|
+
/** The fixed gRPC path for the batch procedure. */
|
|
12
|
+
export const BATCH_GRPC_PATH = `/${batchProtoSchema.package}.${batchRpc.service}/${batchRpc.method.name}`;
|
|
13
|
+
export function decodeBatchCalls(message) {
|
|
14
|
+
let decoded;
|
|
15
|
+
try {
|
|
16
|
+
decoded = batchCodec.decode(batchRpc.method.requestType, message);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
20
|
+
}
|
|
21
|
+
if (!decoded || typeof decoded !== 'object') {
|
|
22
|
+
return { error: 'batch request must be an object' };
|
|
23
|
+
}
|
|
24
|
+
const calls = decoded.calls;
|
|
25
|
+
if (!Array.isArray(calls)) {
|
|
26
|
+
return { error: 'batch request calls must be an array' };
|
|
27
|
+
}
|
|
28
|
+
const ids = new Set();
|
|
29
|
+
for (const call of calls) {
|
|
30
|
+
if (!call ||
|
|
31
|
+
typeof call !== 'object' ||
|
|
32
|
+
!Number.isInteger(call.id) ||
|
|
33
|
+
call.id <= 0 ||
|
|
34
|
+
ids.has(call.id) ||
|
|
35
|
+
typeof call.path !== 'string' ||
|
|
36
|
+
call.path.length === 0 ||
|
|
37
|
+
(call.input !== undefined && !(call.input instanceof Uint8Array))) {
|
|
38
|
+
return {
|
|
39
|
+
error: 'batch calls require a unique positive id, path, and bytes input',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
ids.add(call.id);
|
|
43
|
+
}
|
|
44
|
+
return { calls };
|
|
45
|
+
}
|
|
46
|
+
export function encodeBatchResponse(response) {
|
|
47
|
+
return batchCodec.encode(batchRpc.method.responseType, response);
|
|
48
|
+
}
|
|
49
|
+
export function batchProtocol() {
|
|
50
|
+
return { codec: batchCodec, rpc: batchRpc };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/batch/proto/wire.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwB,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAExE,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AACpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACpD,MAAM,gBAAgB,GAAG,UAAU,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AACpE,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACtB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AAC1E,CAAC;AACD,MAAM,QAAQ,GAAoB,gBAAgB,CAAC;AAEnD,mDAAmD;AACnD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,gBAAgB,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAkC1G,MAAM,UAAU,gBAAgB,CAAC,OAAmB;IAClD,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;IACtD,CAAC;IACD,MAAM,KAAK,GAAI,OAAqC,CAAC,KAAK,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;IAC3D,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IACE,CAAC,IAAI;YACL,OAAO,IAAI,KAAK,QAAQ;YACxB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,EAAE,IAAI,CAAC;YACZ,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YACtB,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,YAAY,UAAU,CAAC,CAAC,EACjE,CAAC;YACD,OAAO;gBACL,KAAK,EACH,iEAAiE;aACpE,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAA2B;IAC7D,OAAO,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,aAAa;IAI3B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProtoSchema } from '@trpc-proto/schema_ir';
|
|
2
|
+
import type { StubCall } from './proto_link.js';
|
|
3
|
+
/** Schema and address used by a native gRPC client call. */
|
|
4
|
+
export interface GrpcProtoOptions {
|
|
5
|
+
schema: ProtoSchema;
|
|
6
|
+
address?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Creates the byte-oriented native gRPC transport used by `grpcLink`. */
|
|
9
|
+
export declare function createGrpcStubCall(opts: GrpcProtoOptions): StubCall;
|
|
10
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/grpc/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,4DAA4D;AAC5D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,QAAQ,CA4EnE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as grpc from '@grpc/grpc-js';
|
|
2
|
+
import { ProtoCodec, } from '../proto_codec/proto_codec.js';
|
|
3
|
+
const DEFAULT_ADDRESS = '127.0.0.1:50051';
|
|
4
|
+
/** Creates the byte-oriented native gRPC transport used by `grpcLink`. */
|
|
5
|
+
export function createGrpcStubCall(opts) {
|
|
6
|
+
const schema = opts.schema;
|
|
7
|
+
const { address = DEFAULT_ADDRESS } = opts;
|
|
8
|
+
const codec = new ProtoCodec(schema);
|
|
9
|
+
const client = new grpc.Client(address, grpc.credentials.createInsecure());
|
|
10
|
+
return (request) => {
|
|
11
|
+
let serviceName;
|
|
12
|
+
let method;
|
|
13
|
+
if (request.service && request.method) {
|
|
14
|
+
serviceName = request.service;
|
|
15
|
+
method = codec.lookupMethod(serviceName, request.method);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
const rpc = codec.lookupRpc(request.path);
|
|
19
|
+
serviceName = rpc?.service;
|
|
20
|
+
method = rpc?.method;
|
|
21
|
+
}
|
|
22
|
+
if (!serviceName || !method) {
|
|
23
|
+
return Promise.reject(new Error('no gRPC mapping for call'));
|
|
24
|
+
}
|
|
25
|
+
const rpcPath = request.grpcPath ?? `/${schema.package}.${serviceName}/${method.name}`;
|
|
26
|
+
const payload = request.bytes
|
|
27
|
+
? Buffer.from(request.bytes)
|
|
28
|
+
: Buffer.from(codec.encode(method.requestType, request.input));
|
|
29
|
+
const metadata = new grpc.Metadata();
|
|
30
|
+
if (request.metadata) {
|
|
31
|
+
for (const [key, value] of Object.entries(request.metadata)) {
|
|
32
|
+
metadata.set(key, value);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (method.responseStream) {
|
|
36
|
+
const stream = client.makeServerStreamRequest(rpcPath, (value) => value, (value) => value, payload, metadata);
|
|
37
|
+
if (request.signal) {
|
|
38
|
+
request.signal.addEventListener('abort', () => stream.cancel(), {
|
|
39
|
+
once: true,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return Promise.resolve((async function* () {
|
|
43
|
+
for await (const chunk of stream) {
|
|
44
|
+
if (!(chunk instanceof Uint8Array)) {
|
|
45
|
+
throw new Error('expected protobuf bytes');
|
|
46
|
+
}
|
|
47
|
+
yield codec.decode(method.responseType, chunk);
|
|
48
|
+
}
|
|
49
|
+
})());
|
|
50
|
+
}
|
|
51
|
+
const pending = Promise.withResolvers();
|
|
52
|
+
client.makeUnaryRequest(rpcPath, (value) => value, (value) => value, payload, metadata, (error, response) => {
|
|
53
|
+
if (error)
|
|
54
|
+
pending.reject(error);
|
|
55
|
+
else {
|
|
56
|
+
pending.resolve(codec.decode(method.responseType, new Uint8Array(response ?? Buffer.alloc(0))));
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return pending.promise;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/grpc/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TRPCLink } from '@trpc/client';
|
|
2
|
+
import type { AnyRouter } from '@trpc/server';
|
|
3
|
+
import { type ProtoLinkOptions } from './proto_link.js';
|
|
4
|
+
export { authInterceptor, createProtoLink } from './proto_link.js';
|
|
5
|
+
export type { AuthConfig, CallContext, CallInterceptor, MaybePromise, ProtoLinkOptions, StubCall, StubRequest, } from './proto_link.js';
|
|
6
|
+
/** Options for a tRPC link backed by a native gRPC client. */
|
|
7
|
+
export interface GrpcLinkOptions extends ProtoLinkOptions {
|
|
8
|
+
address?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function grpcLink<TRouter extends AnyRouter>(opts: GrpcLinkOptions): TRPCLink<TRouter>;
|
|
11
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/grpc/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EACV,UAAU,EACV,WAAW,EACX,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAEzB,8DAA8D;AAC9D,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,QAAQ,CAAC,OAAO,SAAS,SAAS,EAChD,IAAI,EAAE,eAAe,GACpB,QAAQ,CAAC,OAAO,CAAC,CAQnB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createGrpcStubCall } from './client.js';
|
|
2
|
+
import { createProtoLink } from './proto_link.js';
|
|
3
|
+
export { authInterceptor, createProtoLink } from './proto_link.js';
|
|
4
|
+
export function grpcLink(opts) {
|
|
5
|
+
return createProtoLink(opts, createGrpcStubCall({
|
|
6
|
+
schema: opts.schema,
|
|
7
|
+
address: opts.address,
|
|
8
|
+
}));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/grpc/link.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAyB,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAgBnE,MAAM,UAAU,QAAQ,CACtB,IAAqB;IAErB,OAAO,eAAe,CACpB,IAAI,EACJ,kBAAkB,CAAC;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type TRPCLink } from '@trpc/client';
|
|
2
|
+
import type { AnyRouter } from '@trpc/server';
|
|
3
|
+
import type { ProtoSchema } from '@trpc-proto/schema_ir';
|
|
4
|
+
import type { MaybePromise } from '../types.js';
|
|
5
|
+
export type { MaybePromise } from '../types.js';
|
|
6
|
+
/** Transport-neutral request passed from a protobuf link to its stub call. */
|
|
7
|
+
export interface StubRequest {
|
|
8
|
+
path: string;
|
|
9
|
+
type: 'query' | 'mutation' | 'subscription';
|
|
10
|
+
/** JS value (pre-codec). */
|
|
11
|
+
input: unknown;
|
|
12
|
+
/** Runtime-encoded protobuf payload. Prefer this on the wire. */
|
|
13
|
+
bytes?: Uint8Array;
|
|
14
|
+
service?: string;
|
|
15
|
+
method?: string;
|
|
16
|
+
grpcPath?: string;
|
|
17
|
+
metadata?: Record<string, string>;
|
|
18
|
+
signal?: AbortSignal;
|
|
19
|
+
}
|
|
20
|
+
/** Transport. Return decoded JS or raw response bytes (link will decode). */
|
|
21
|
+
export interface StubCall<TResult = unknown> {
|
|
22
|
+
(request: StubRequest): Promise<TResult>;
|
|
23
|
+
}
|
|
24
|
+
/** Mutable request context passed through protobuf link interceptors. */
|
|
25
|
+
export interface CallContext {
|
|
26
|
+
path: string;
|
|
27
|
+
type: 'query' | 'mutation' | 'subscription';
|
|
28
|
+
service: string;
|
|
29
|
+
method: string;
|
|
30
|
+
grpcPath: string;
|
|
31
|
+
input: unknown;
|
|
32
|
+
metadata: Map<string, string>;
|
|
33
|
+
signal?: AbortSignal;
|
|
34
|
+
}
|
|
35
|
+
export type CallInterceptor = (ctx: CallContext, next: (ctx: CallContext) => Promise<unknown>) => Promise<unknown>;
|
|
36
|
+
/** Authorization metadata generated for each protobuf link call. */
|
|
37
|
+
export interface AuthConfig {
|
|
38
|
+
/** Bearer token, or getter. Empty/undefined skips the header. */
|
|
39
|
+
token?: string | (() => MaybePromise<string | undefined>);
|
|
40
|
+
/** Extra gRPC metadata (static or getter). */
|
|
41
|
+
metadata?: Record<string, string> | (() => MaybePromise<Record<string, string>>);
|
|
42
|
+
/** Metadata key. Default `authorization`. */
|
|
43
|
+
header?: string;
|
|
44
|
+
/** Token scheme. Default `Bearer`. Set `''` for a raw value. */
|
|
45
|
+
scheme?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Shared schema, interceptor, and authorization options for protobuf links. */
|
|
48
|
+
export interface ProtoLinkOptions {
|
|
49
|
+
schema: ProtoSchema;
|
|
50
|
+
interceptors?: CallInterceptor[];
|
|
51
|
+
auth?: AuthConfig;
|
|
52
|
+
}
|
|
53
|
+
export declare function authInterceptor(auth: AuthConfig): CallInterceptor;
|
|
54
|
+
/** Schema-driven protobuf link. `call` is native gRPC or gRPC-Web. */
|
|
55
|
+
export declare function createProtoLink<TRouter extends AnyRouter>(opts: ProtoLinkOptions, call: StubCall): TRPCLink<TRouter>;
|
|
56
|
+
//# sourceMappingURL=proto_link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proto_link.d.ts","sourceRoot":"","sources":["../../src/grpc/proto_link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,8EAA8E;AAC9E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAC5C,4BAA4B;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,6EAA6E;AAC7E,MAAM,WAAW,QAAQ,CAAC,OAAO,GAAG,OAAO;IACzC,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,eAAe,GAAG,CAC5B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,KACzC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,oEAAoE;AACpE,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC1D,8CAA8C;IAC9C,QAAQ,CAAC,EACP,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAeD,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAoBjE;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,OAAO,SAAS,SAAS,EACvD,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,QAAQ,GACb,QAAQ,CAAC,OAAO,CAAC,CA+EnB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { TRPCClientError } from '@trpc/client';
|
|
2
|
+
import { observable } from '@trpc/server/observable';
|
|
3
|
+
import { isAsyncIterable, isBytes } from '@trpc-proto/utility';
|
|
4
|
+
import { ProtoCodec } from '../proto_codec/proto_codec.js';
|
|
5
|
+
/** gRPC metadata / HTTP header key for bearer credentials. */
|
|
6
|
+
const AUTH_METADATA_KEY = 'authorization';
|
|
7
|
+
/** Default authorization scheme. Empty `AuthConfig.scheme` sends a raw token. */
|
|
8
|
+
const AUTH_SCHEME_BEARER = 'Bearer';
|
|
9
|
+
function compose(interceptors, terminal) {
|
|
10
|
+
let next = terminal;
|
|
11
|
+
for (let i = interceptors.length - 1; i >= 0; i--) {
|
|
12
|
+
const wrap = interceptors[i];
|
|
13
|
+
const inner = next;
|
|
14
|
+
next = (ctx) => wrap(ctx, inner);
|
|
15
|
+
}
|
|
16
|
+
return next;
|
|
17
|
+
}
|
|
18
|
+
export function authInterceptor(auth) {
|
|
19
|
+
const header = auth.header ?? AUTH_METADATA_KEY;
|
|
20
|
+
const scheme = auth.scheme === undefined ? AUTH_SCHEME_BEARER : auth.scheme;
|
|
21
|
+
return async (ctx, next) => {
|
|
22
|
+
const token = typeof auth.token === 'function' ? await auth.token() : auth.token;
|
|
23
|
+
if (token) {
|
|
24
|
+
ctx.metadata.set(header, scheme ? `${scheme} ${token}` : token);
|
|
25
|
+
}
|
|
26
|
+
const extra = typeof auth.metadata === 'function'
|
|
27
|
+
? await auth.metadata()
|
|
28
|
+
: auth.metadata;
|
|
29
|
+
if (extra) {
|
|
30
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
31
|
+
ctx.metadata.set(key, value);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return next(ctx);
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Schema-driven protobuf link. `call` is native gRPC or gRPC-Web. */
|
|
38
|
+
export function createProtoLink(opts, call) {
|
|
39
|
+
const schema = opts.schema;
|
|
40
|
+
const codec = new ProtoCodec(schema);
|
|
41
|
+
const interceptors = [
|
|
42
|
+
...(opts.auth ? [authInterceptor(opts.auth)] : []),
|
|
43
|
+
...(opts.interceptors ?? []),
|
|
44
|
+
];
|
|
45
|
+
return () => ({ op }) => observable((observer) => {
|
|
46
|
+
const rpc = codec.lookupRpc(op.path);
|
|
47
|
+
if (!rpc) {
|
|
48
|
+
observer.error(TRPCClientError.from(new Error(`no gRPC mapping for ${op.path}`)));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const { service, method } = rpc;
|
|
52
|
+
const ac = new AbortController();
|
|
53
|
+
if (op.signal) {
|
|
54
|
+
op.signal.addEventListener('abort', () => ac.abort(), { once: true });
|
|
55
|
+
}
|
|
56
|
+
const ctx = {
|
|
57
|
+
path: op.path,
|
|
58
|
+
type: op.type,
|
|
59
|
+
service,
|
|
60
|
+
method: method.name,
|
|
61
|
+
grpcPath: `/${schema.package}.${service}/${method.name}`,
|
|
62
|
+
input: op.input,
|
|
63
|
+
metadata: new Map(),
|
|
64
|
+
signal: ac.signal,
|
|
65
|
+
};
|
|
66
|
+
async function invoke(current) {
|
|
67
|
+
const bytes = codec.encode(method.requestType, current.input);
|
|
68
|
+
const data = await call({
|
|
69
|
+
path: current.path,
|
|
70
|
+
type: current.type,
|
|
71
|
+
input: current.input,
|
|
72
|
+
bytes,
|
|
73
|
+
service: current.service,
|
|
74
|
+
method: current.method,
|
|
75
|
+
grpcPath: current.grpcPath,
|
|
76
|
+
metadata: Object.fromEntries(current.metadata),
|
|
77
|
+
signal: current.signal,
|
|
78
|
+
});
|
|
79
|
+
if (isAsyncIterable(data))
|
|
80
|
+
return data;
|
|
81
|
+
if (isBytes(data)) {
|
|
82
|
+
return codec.decode(method.responseType, data);
|
|
83
|
+
}
|
|
84
|
+
return data;
|
|
85
|
+
}
|
|
86
|
+
const execute = compose(interceptors, invoke);
|
|
87
|
+
void execute(ctx)
|
|
88
|
+
.then(async (data) => {
|
|
89
|
+
if (isAsyncIterable(data)) {
|
|
90
|
+
for await (const item of data) {
|
|
91
|
+
if (ac.signal.aborted)
|
|
92
|
+
break;
|
|
93
|
+
const decoded = isBytes(item)
|
|
94
|
+
? codec.decode(method.responseType, item)
|
|
95
|
+
: item;
|
|
96
|
+
observer.next({ result: { type: 'data', data: decoded } });
|
|
97
|
+
}
|
|
98
|
+
observer.complete();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
observer.next({ result: { type: 'data', data } });
|
|
102
|
+
observer.complete();
|
|
103
|
+
})
|
|
104
|
+
.catch((cause) => {
|
|
105
|
+
if (!ac.signal.aborted) {
|
|
106
|
+
observer.error(TRPCClientError.from(cause));
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
return () => ac.abort();
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=proto_link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proto_link.js","sourceRoot":"","sources":["../../src/grpc/proto_link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as grpc from '@grpc/grpc-js';
|
|
2
|
+
import { type AnyRouter } from '@trpc/server';
|
|
3
|
+
import type { ProtoSchema } from '@trpc-proto/schema_ir';
|
|
4
|
+
/** `{ UserService: { GetById: (input) => ... } }` — spread onto generated server stubs. */
|
|
5
|
+
export type StubHandlers = Record<string, Record<string, (input: unknown) => Promise<unknown>>>;
|
|
6
|
+
/** Schema and context used to bind generated service handlers. */
|
|
7
|
+
export interface BindRouterOptions {
|
|
8
|
+
schema: ProtoSchema;
|
|
9
|
+
createContext?: () => unknown | Promise<unknown>;
|
|
10
|
+
}
|
|
11
|
+
/** Proto-shaped handlers that call a tRPC router. */
|
|
12
|
+
export declare function bindRouter(router: AnyRouter, opts: BindRouterOptions): StubHandlers;
|
|
13
|
+
/** Options for serving a tRPC router over native gRPC. */
|
|
14
|
+
export interface ServeGrpcOptions {
|
|
15
|
+
schema: ProtoSchema;
|
|
16
|
+
address?: string;
|
|
17
|
+
createContext?: () => unknown | Promise<unknown>;
|
|
18
|
+
credentials?: grpc.ServerCredentials;
|
|
19
|
+
}
|
|
20
|
+
/** Bound native gRPC server and its lifecycle controls. */
|
|
21
|
+
export interface GrpcServerHandle {
|
|
22
|
+
address: string;
|
|
23
|
+
port: number;
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/** Serve a tRPC router over gRPC with protobuf encoding. */
|
|
27
|
+
export declare function serveGrpc(router: AnyRouter, opts: ServeGrpcOptions): Promise<GrpcServerHandle>;
|
|
28
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/grpc/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMzD,2FAA2F;AAC3F,MAAM,MAAM,YAAY,GAAG,MAAM,CAC/B,MAAM,EACN,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CACrD,CAAC;AAiBF,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClD;AAED,qDAAqD;AACrD,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,iBAAiB,GACtB,YAAY,CAKd;AAED,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,WAAW,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC;CACtC;AAED,2DAA2D;AAC3D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAkBD,4DAA4D;AAC5D,wBAAsB,SAAS,CAC7B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAuF3B"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import * as grpc from '@grpc/grpc-js';
|
|
2
|
+
import { TRPCError } from '@trpc/server';
|
|
3
|
+
import { createRouterInvoker, toAsyncIterable, } from '../router_invoker.js';
|
|
4
|
+
import { ProtoCodec } from '../proto_codec/proto_codec.js';
|
|
5
|
+
import { grpcStatus } from './status.js';
|
|
6
|
+
/** Default insecure gRPC dial target for local development. */
|
|
7
|
+
const DEFAULT_ADDRESS = '127.0.0.1:50051';
|
|
8
|
+
function bindStubHandlers(schema, invoke) {
|
|
9
|
+
const services = {};
|
|
10
|
+
for (const service of schema.services) {
|
|
11
|
+
const methods = {};
|
|
12
|
+
for (const method of service.methods) {
|
|
13
|
+
methods[method.name] = (input) => invoke({ path: method.path, input });
|
|
14
|
+
}
|
|
15
|
+
services[service.name] = methods;
|
|
16
|
+
}
|
|
17
|
+
return services;
|
|
18
|
+
}
|
|
19
|
+
/** Proto-shaped handlers that call a tRPC router. */
|
|
20
|
+
export function bindRouter(router, opts) {
|
|
21
|
+
return bindStubHandlers(opts.schema, createRouterInvoker(router, { createContext: opts.createContext }));
|
|
22
|
+
}
|
|
23
|
+
function toServiceError(err) {
|
|
24
|
+
if (err instanceof TRPCError) {
|
|
25
|
+
return Object.assign(new Error(err.message), {
|
|
26
|
+
code: grpcStatus(err),
|
|
27
|
+
details: err.message,
|
|
28
|
+
metadata: new grpc.Metadata(),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
32
|
+
return Object.assign(new Error(message), {
|
|
33
|
+
code: grpc.status.UNKNOWN,
|
|
34
|
+
details: message,
|
|
35
|
+
metadata: new grpc.Metadata(),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** Serve a tRPC router over gRPC with protobuf encoding. */
|
|
39
|
+
export async function serveGrpc(router, opts) {
|
|
40
|
+
const address = opts.address ?? DEFAULT_ADDRESS;
|
|
41
|
+
const credentials = opts.credentials ?? grpc.ServerCredentials.createInsecure();
|
|
42
|
+
const schema = opts.schema;
|
|
43
|
+
const codec = new ProtoCodec(schema);
|
|
44
|
+
const invoke = createRouterInvoker(router, {
|
|
45
|
+
createContext: opts.createContext,
|
|
46
|
+
});
|
|
47
|
+
const server = new grpc.Server();
|
|
48
|
+
for (const service of schema.services) {
|
|
49
|
+
const definition = {};
|
|
50
|
+
const implementation = {};
|
|
51
|
+
for (const method of service.methods) {
|
|
52
|
+
definition[method.name] = {
|
|
53
|
+
path: `/${schema.package}.${service.name}/${method.name}`,
|
|
54
|
+
requestStream: false,
|
|
55
|
+
responseStream: method.isResponseStreaming,
|
|
56
|
+
requestSerialize: (value) => Buffer.from(codec.encode(method.requestType, value)),
|
|
57
|
+
requestDeserialize: (bytes) => codec.decode(method.requestType, new Uint8Array(bytes)),
|
|
58
|
+
responseSerialize: (value) => Buffer.from(codec.encode(method.responseType, value)),
|
|
59
|
+
responseDeserialize: (bytes) => codec.decode(method.responseType, new Uint8Array(bytes)),
|
|
60
|
+
};
|
|
61
|
+
if (method.isResponseStreaming) {
|
|
62
|
+
implementation[method.name] = (call) => {
|
|
63
|
+
const ac = new AbortController();
|
|
64
|
+
call.on('cancelled', () => ac.abort());
|
|
65
|
+
void (async () => {
|
|
66
|
+
try {
|
|
67
|
+
const result = await invoke({
|
|
68
|
+
path: method.path,
|
|
69
|
+
input: call.request,
|
|
70
|
+
signal: ac.signal,
|
|
71
|
+
});
|
|
72
|
+
for await (const item of toAsyncIterable(result)) {
|
|
73
|
+
if (ac.signal.aborted)
|
|
74
|
+
break;
|
|
75
|
+
call.write(item);
|
|
76
|
+
}
|
|
77
|
+
call.end();
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (!ac.signal.aborted) {
|
|
81
|
+
call.destroy(toServiceError(err));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
})();
|
|
85
|
+
};
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
implementation[method.name] = (call, callback) => {
|
|
89
|
+
void invoke({ path: method.path, input: call.request }).then((res) => callback(null, res), (err) => callback(toServiceError(err)));
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
server.addService(definition, implementation);
|
|
93
|
+
}
|
|
94
|
+
const { promise, resolve, reject } = Promise.withResolvers();
|
|
95
|
+
server.bindAsync(address, credentials, (err, port) => {
|
|
96
|
+
if (err)
|
|
97
|
+
reject(err);
|
|
98
|
+
else
|
|
99
|
+
resolve(port);
|
|
100
|
+
});
|
|
101
|
+
const port = await promise;
|
|
102
|
+
const host = address.replace(/:\d+$/, '');
|
|
103
|
+
return {
|
|
104
|
+
address: `${host}:${port}`,
|
|
105
|
+
port,
|
|
106
|
+
close() {
|
|
107
|
+
const shutdown = Promise.withResolvers();
|
|
108
|
+
server.tryShutdown(() => shutdown.resolve());
|
|
109
|
+
return shutdown.promise;
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/grpc/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/grpc/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,CAkDxD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as grpc from '@grpc/grpc-js';
|
|
2
|
+
/** Maps a tRPC error code to its equivalent gRPC status. */
|
|
3
|
+
export function grpcStatus(error) {
|
|
4
|
+
switch (error.code) {
|
|
5
|
+
case 'PARSE_ERROR':
|
|
6
|
+
case 'BAD_REQUEST':
|
|
7
|
+
case 'UNPROCESSABLE_CONTENT':
|
|
8
|
+
case 'UNSUPPORTED_MEDIA_TYPE':
|
|
9
|
+
return grpc.status.INVALID_ARGUMENT;
|
|
10
|
+
case 'UNAUTHORIZED':
|
|
11
|
+
return grpc.status.UNAUTHENTICATED;
|
|
12
|
+
case 'FORBIDDEN':
|
|
13
|
+
case 'PAYMENT_REQUIRED':
|
|
14
|
+
return grpc.status.PERMISSION_DENIED;
|
|
15
|
+
case 'NOT_FOUND':
|
|
16
|
+
return grpc.status.NOT_FOUND;
|
|
17
|
+
case 'CONFLICT':
|
|
18
|
+
return grpc.status.ALREADY_EXISTS;
|
|
19
|
+
case 'PRECONDITION_FAILED':
|
|
20
|
+
case 'PRECONDITION_REQUIRED':
|
|
21
|
+
return grpc.status.FAILED_PRECONDITION;
|
|
22
|
+
case 'PAYLOAD_TOO_LARGE':
|
|
23
|
+
case 'TOO_MANY_REQUESTS':
|
|
24
|
+
return grpc.status.RESOURCE_EXHAUSTED;
|
|
25
|
+
case 'TIMEOUT':
|
|
26
|
+
case 'GATEWAY_TIMEOUT':
|
|
27
|
+
return grpc.status.DEADLINE_EXCEEDED;
|
|
28
|
+
case 'CLIENT_CLOSED_REQUEST':
|
|
29
|
+
return grpc.status.CANCELLED;
|
|
30
|
+
case 'METHOD_NOT_SUPPORTED':
|
|
31
|
+
case 'NOT_IMPLEMENTED':
|
|
32
|
+
return grpc.status.UNIMPLEMENTED;
|
|
33
|
+
case 'SERVICE_UNAVAILABLE':
|
|
34
|
+
case 'BAD_GATEWAY':
|
|
35
|
+
return grpc.status.UNAVAILABLE;
|
|
36
|
+
case 'INTERNAL_SERVER_ERROR':
|
|
37
|
+
return grpc.status.INTERNAL;
|
|
38
|
+
default:
|
|
39
|
+
return grpc.status.UNKNOWN;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/grpc/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAGtC,4DAA4D;AAC5D,MAAM,UAAU,UAAU,CAAC,KAAgB;IACzC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,aAAa,CAAC;QACnB,KAAK,aAAa,CAAC;QACnB,KAAK,uBAAuB,CAAC;QAC7B,KAAK,wBAAwB;YAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAEtC,KAAK,cAAc;YACjB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QAErC,KAAK,WAAW,CAAC;QACjB,KAAK,kBAAkB;YACrB,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAEvC,KAAK,WAAW;YACd,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAE/B,KAAK,UAAU;YACb,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAEpC,KAAK,qBAAqB,CAAC;QAC3B,KAAK,uBAAuB;YAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;QAEzC,KAAK,mBAAmB,CAAC;QACzB,KAAK,mBAAmB;YACtB,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAExC,KAAK,SAAS,CAAC;QACf,KAAK,iBAAiB;YACpB,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAEvC,KAAK,uBAAuB;YAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAE/B,KAAK,sBAAsB,CAAC;QAC5B,KAAK,iBAAiB;YACpB,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QAEnC,KAAK,qBAAqB,CAAC;QAC3B,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QAEjC,KAAK,uBAAuB;YAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAE9B;YACE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { noopForNonTsBackend } from './noop.js';
|
|
2
|
+
export { grpcLink } from './grpc/link.js';
|
|
3
|
+
export type { AuthConfig, GrpcLinkOptions } from './grpc/link.js';
|
|
4
|
+
export { bindRouter, serveGrpc } from './grpc/server.js';
|
|
5
|
+
export type { BindRouterOptions, ServeGrpcOptions, StubHandlers, } from './grpc/server.js';
|
|
6
|
+
export { createDirectGrpcWebHttpHandler, createForwardingGrpcWebHttpHandler, } from './web/http_handler.js';
|
|
7
|
+
export type { GrpcWebCorsOptions, DirectGrpcWebHttpHandlerOptions, ForwardingGrpcWebHttpHandlerOptions, GrpcWebUpstreamCredentials, MtlsConfig, ForwardingGrpcWebHttpHandler, } from './web/http_handler.js';
|
|
8
|
+
export { serveGrpcWeb } from './web/server.js';
|
|
9
|
+
export type { GrpcWebServerHandle, ServeGrpcWebDirectOptions, ServeGrpcWebForwardOptions, ServeGrpcWebOptions, } from './web/server.js';
|
|
10
|
+
export { grpcWebLink } from './web/link.js';
|
|
11
|
+
export type { GrpcWebLinkOptions } from './web/link.js';
|
|
12
|
+
export type { GrpcWebEncoding } from './web/content_type.js';
|
|
13
|
+
export { zAsyncIterable } from '@trpc-proto/schema_ir';
|
|
14
|
+
export type { ProtoMeta, ProtoSchema } from '@trpc-proto/schema_ir';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,GACnC,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,kBAAkB,EAClB,+BAA+B,EAC/B,mCAAmC,EACnC,0BAA0B,EAC1B,UAAU,EACV,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { noopForNonTsBackend } from './noop.js';
|
|
2
|
+
export { grpcLink } from './grpc/link.js';
|
|
3
|
+
export { bindRouter, serveGrpc } from './grpc/server.js';
|
|
4
|
+
export { createDirectGrpcWebHttpHandler, createForwardingGrpcWebHttpHandler, } from './web/http_handler.js';
|
|
5
|
+
export { serveGrpcWeb } from './web/server.js';
|
|
6
|
+
export { grpcWebLink } from './web/link.js';
|
|
7
|
+
export { zAsyncIterable } from '@trpc-proto/schema_ir';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAMzD,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,GACnC,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAO/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/noop.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Empty procedure body. tRPC requires a resolver; `.input()` / `.output()`
|
|
3
|
+
* are the contract. A non-TS service that implements the generated proto
|
|
4
|
+
* is the real backend.
|
|
5
|
+
*
|
|
6
|
+
* The generic return type lets schema-only procedures state their resolver
|
|
7
|
+
* output explicitly. At runtime the function returns `undefined`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function noopForNonTsBackend<T>(_opts?: unknown): T;
|
|
10
|
+
//# sourceMappingURL=noop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,CAAC,CAEzD"}
|