@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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Thanh Ngo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# @trpc-proto/runtime
|
|
2
|
+
|
|
3
|
+
Runtime transports for protobuf contracts generated from tRPC 11 and Zod 4 routers.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @trpc-proto/runtime @trpc/client @trpc/server @grpc/grpc-js zod
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Exports
|
|
12
|
+
|
|
13
|
+
- `@trpc-proto/runtime` — native gRPC clients and servers plus the Node gRPC-Web wrapper.
|
|
14
|
+
- `@trpc-proto/runtime/web` — browser `grpcWebLink`, including optional unary batching.
|
|
15
|
+
- `@trpc-proto/runtime/batch` — standalone browser batch link and batch protocol metadata.
|
|
16
|
+
- `@trpc-proto/runtime/batch.proto` — built-in batch protocol for external tooling.
|
|
17
|
+
- `@trpc-proto/runtime/proto_codec` — runtime protobuf codec.
|
|
18
|
+
|
|
19
|
+
See the [repository README](https://github.com/iocat/trpc-proto#readme) for direct and forwarding deployment examples.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProtoSchema } from '@trpc-proto/schema_ir';
|
|
2
|
+
import type { GrpcWebDispatcher } from '../../web/dispatchers/types.js';
|
|
3
|
+
/** Application schema and context dependencies for direct batch dispatch. */
|
|
4
|
+
export interface DirectBatchDispatcherOptions {
|
|
5
|
+
schema: ProtoSchema;
|
|
6
|
+
createContext?: () => unknown | Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
/** Adds built-in batch handling around an in-process gRPC-Web dispatcher. */
|
|
9
|
+
export declare function createDirectBatchDispatcher(dispatch: GrpcWebDispatcher, options: DirectBatchDispatcherOptions): GrpcWebDispatcher;
|
|
10
|
+
//# sourceMappingURL=direct_dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct_dispatcher.d.ts","sourceRoot":"","sources":["../../../src/batch/grpcweb/direct_dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EACV,iBAAiB,EAGlB,MAAM,gCAAgC,CAAC;AAUxC,6EAA6E;AAC7E,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClD;AA8BD,6EAA6E;AAC7E,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,4BAA4B,GACpC,iBAAiB,CAiFnB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as grpc from '@grpc/grpc-js';
|
|
2
|
+
import { BATCH_GRPC_PATH, decodeBatchCalls, encodeBatchResponse, } from '../proto/wire.js';
|
|
3
|
+
function batchRoutes(schema) {
|
|
4
|
+
const routes = new Map();
|
|
5
|
+
for (const service of schema.services) {
|
|
6
|
+
for (const method of service.methods) {
|
|
7
|
+
routes.set(method.path, {
|
|
8
|
+
grpcPath: `/${schema.package}.${service.name}/${method.name}`,
|
|
9
|
+
responseStream: method.isResponseStreaming,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return routes;
|
|
14
|
+
}
|
|
15
|
+
function itemError(call, code, message) {
|
|
16
|
+
return { result: 'error', id: call.id, code, message };
|
|
17
|
+
}
|
|
18
|
+
/** Adds built-in batch handling around an in-process gRPC-Web dispatcher. */
|
|
19
|
+
export function createDirectBatchDispatcher(dispatch, options) {
|
|
20
|
+
const routes = batchRoutes(options.schema);
|
|
21
|
+
async function executeCall(call, request, dispatchOptions) {
|
|
22
|
+
const route = routes.get(call.path);
|
|
23
|
+
if (!route) {
|
|
24
|
+
return itemError(call, grpc.status.UNIMPLEMENTED, `no gRPC mapping for ${call.path}`);
|
|
25
|
+
}
|
|
26
|
+
if (route.responseStream) {
|
|
27
|
+
return itemError(call, grpc.status.UNIMPLEMENTED, `subscriptions cannot be included in a batch: ${call.path}`);
|
|
28
|
+
}
|
|
29
|
+
const outputs = [];
|
|
30
|
+
const status = await dispatch({
|
|
31
|
+
...request,
|
|
32
|
+
grpcPath: route.grpcPath,
|
|
33
|
+
message: call.input ?? new Uint8Array(),
|
|
34
|
+
}, async (message) => {
|
|
35
|
+
outputs.push(message);
|
|
36
|
+
}, dispatchOptions);
|
|
37
|
+
if (status.code !== grpc.status.OK) {
|
|
38
|
+
return itemError(call, status.code, status.message);
|
|
39
|
+
}
|
|
40
|
+
if (outputs.length !== 1) {
|
|
41
|
+
return itemError(call, grpc.status.INTERNAL, `direct dispatcher returned ${outputs.length} messages for unary call ${call.path}`);
|
|
42
|
+
}
|
|
43
|
+
return { result: 'success', id: call.id, output: outputs[0] };
|
|
44
|
+
}
|
|
45
|
+
return async (request, emit, dispatchOptions) => {
|
|
46
|
+
if (request.grpcPath !== BATCH_GRPC_PATH) {
|
|
47
|
+
return dispatch(request, emit, dispatchOptions);
|
|
48
|
+
}
|
|
49
|
+
const validation = decodeBatchCalls(request.message);
|
|
50
|
+
if ('error' in validation) {
|
|
51
|
+
return { code: grpc.status.INVALID_ARGUMENT, message: validation.error };
|
|
52
|
+
}
|
|
53
|
+
const directContext = dispatchOptions && 'directContext' in dispatchOptions
|
|
54
|
+
? dispatchOptions.directContext
|
|
55
|
+
: options.createContext
|
|
56
|
+
? await options.createContext()
|
|
57
|
+
: {};
|
|
58
|
+
const itemDispatchOptions = {
|
|
59
|
+
...dispatchOptions,
|
|
60
|
+
directContext,
|
|
61
|
+
};
|
|
62
|
+
const results = await Promise.all(validation.calls.map((call) => executeCall(call, request, itemDispatchOptions)));
|
|
63
|
+
if (request.signal.aborted) {
|
|
64
|
+
return { code: grpc.status.CANCELLED, message: 'batch cancelled' };
|
|
65
|
+
}
|
|
66
|
+
const response = { results };
|
|
67
|
+
await emit(encodeBatchResponse(response));
|
|
68
|
+
return { code: grpc.status.OK, message: '' };
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=direct_dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct_dispatcher.js","sourceRoot":"","sources":["../../../src/batch/grpcweb/direct_dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAOtC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GAIpB,MAAM,kBAAkB,CAAC;AAa1B,SAAS,WAAW,CAClB,MAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IACnD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;gBACtB,QAAQ,EAAE,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;gBAC7D,cAAc,EAAE,MAAM,CAAC,mBAAmB;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAChB,IAAmB,EACnB,IAAY,EACZ,OAAe;IAEf,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACzD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,2BAA2B,CACzC,QAA2B,EAC3B,OAAqC;IAErC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3C,KAAK,UAAU,WAAW,CACxB,IAAmB,EACnB,OAA+B,EAC/B,eAAuC;QAEvC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CACd,IAAI,EACJ,IAAI,CAAC,MAAM,CAAC,aAAa,EACzB,uBAAuB,IAAI,CAAC,IAAI,EAAE,CACnC,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,SAAS,CACd,IAAI,EACJ,IAAI,CAAC,MAAM,CAAC,aAAa,EACzB,gDAAgD,IAAI,CAAC,IAAI,EAAE,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;YACE,GAAG,OAAO;YACV,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,UAAU,EAAE;SACxC,EACD,KAAK,EAAE,OAAO,EAAE,EAAE;YAChB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,EACD,eAAe,CAChB,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,SAAS,CACd,IAAI,EACJ,IAAI,CAAC,MAAM,CAAC,QAAQ,EACpB,8BAA8B,OAAO,CAAC,MAAM,4BAA4B,IAAI,CAAC,IAAI,EAAE,CACpF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,CAAC;IAED,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;QAC9C,IAAI,OAAO,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;YACzC,OAAO,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3E,CAAC;QAED,MAAM,aAAa,GACjB,eAAe,IAAI,eAAe,IAAI,eAAe;YACnD,CAAC,CAAC,eAAe,CAAC,aAAa;YAC/B,CAAC,CAAC,OAAO,CAAC,aAAa;gBACrB,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE;gBAC/B,CAAC,CAAC,EAAE,CAAC;QACX,MAAM,mBAAmB,GAA2B;YAClD,GAAG,eAAe;YAClB,aAAa;SACd,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5B,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAChD,CACF,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;QACrE,CAAC;QAED,MAAM,QAAQ,GAAsB,EAAE,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ProtoSchema } from '@trpc-proto/schema_ir';
|
|
2
|
+
import type { GrpcWebDispatcher } from '../../web/dispatchers/types.js';
|
|
3
|
+
/** Expands a batch envelope into ordinary native gRPC backend calls. */
|
|
4
|
+
export declare function createForwardingBatchDispatcher(dispatch: GrpcWebDispatcher, schema: ProtoSchema): GrpcWebDispatcher;
|
|
5
|
+
//# sourceMappingURL=forwarding_dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forwarding_dispatcher.d.ts","sourceRoot":"","sources":["../../../src/batch/grpcweb/forwarding_dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EACV,iBAAiB,EAGlB,MAAM,gCAAgC,CAAC;AAqCxC,wEAAwE;AACxE,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,WAAW,GAClB,iBAAiB,CAuEnB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as grpc from '@grpc/grpc-js';
|
|
2
|
+
import { BATCH_GRPC_PATH, decodeBatchCalls, encodeBatchResponse, } from '../proto/wire.js';
|
|
3
|
+
function batchRoutes(schema) {
|
|
4
|
+
const routes = new Map();
|
|
5
|
+
for (const service of schema.services) {
|
|
6
|
+
for (const method of service.methods) {
|
|
7
|
+
routes.set(method.path, {
|
|
8
|
+
grpcPath: `/${schema.package}.${service.name}/${method.name}`,
|
|
9
|
+
responseStream: method.isResponseStreaming,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return routes;
|
|
14
|
+
}
|
|
15
|
+
function itemError(call, code, message) {
|
|
16
|
+
return { result: 'error', id: call.id, code, message };
|
|
17
|
+
}
|
|
18
|
+
/** Expands a batch envelope into ordinary native gRPC backend calls. */
|
|
19
|
+
export function createForwardingBatchDispatcher(dispatch, schema) {
|
|
20
|
+
const routes = batchRoutes(schema);
|
|
21
|
+
async function executeCall(call, request, dispatchOptions) {
|
|
22
|
+
const route = routes.get(call.path);
|
|
23
|
+
if (!route) {
|
|
24
|
+
return itemError(call, grpc.status.UNIMPLEMENTED, `no gRPC mapping for ${call.path}`);
|
|
25
|
+
}
|
|
26
|
+
if (route.responseStream) {
|
|
27
|
+
return itemError(call, grpc.status.UNIMPLEMENTED, `subscriptions cannot be included in a batch: ${call.path}`);
|
|
28
|
+
}
|
|
29
|
+
const outputs = [];
|
|
30
|
+
const status = await dispatch({
|
|
31
|
+
...request,
|
|
32
|
+
grpcPath: route.grpcPath,
|
|
33
|
+
message: call.input ?? new Uint8Array(),
|
|
34
|
+
}, async (message) => {
|
|
35
|
+
outputs.push(message);
|
|
36
|
+
}, dispatchOptions);
|
|
37
|
+
if (status.code !== grpc.status.OK) {
|
|
38
|
+
return itemError(call, status.code, status.message);
|
|
39
|
+
}
|
|
40
|
+
if (outputs.length !== 1) {
|
|
41
|
+
return itemError(call, grpc.status.INTERNAL, `backend returned ${outputs.length} messages for unary call ${call.path}`);
|
|
42
|
+
}
|
|
43
|
+
return { result: 'success', id: call.id, output: outputs[0] };
|
|
44
|
+
}
|
|
45
|
+
return async (request, emit, dispatchOptions) => {
|
|
46
|
+
if (request.grpcPath !== BATCH_GRPC_PATH) {
|
|
47
|
+
return dispatch(request, emit, dispatchOptions);
|
|
48
|
+
}
|
|
49
|
+
const validation = decodeBatchCalls(request.message);
|
|
50
|
+
if ('error' in validation) {
|
|
51
|
+
return { code: grpc.status.INVALID_ARGUMENT, message: validation.error };
|
|
52
|
+
}
|
|
53
|
+
const results = await Promise.all(validation.calls.map((call) => executeCall(call, request, dispatchOptions)));
|
|
54
|
+
if (request.signal.aborted) {
|
|
55
|
+
return { code: grpc.status.CANCELLED, message: 'batch cancelled' };
|
|
56
|
+
}
|
|
57
|
+
const response = { results };
|
|
58
|
+
await emit(encodeBatchResponse(response));
|
|
59
|
+
return { code: grpc.status.OK, message: '' };
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=forwarding_dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forwarding_dispatcher.js","sourceRoot":"","sources":["../../../src/batch/grpcweb/forwarding_dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { protoSchema as batchProtoSchema } from './proto/generated/schema.js';
|
|
2
|
+
export { grpcWebBatchLink } from './link/web_link.js';
|
|
3
|
+
export type { GrpcWebBatchLinkOptions } from './link/web_link.js';
|
|
4
|
+
export { BATCH_GRPC_PATH, BATCH_PROCEDURE_PATH } from './proto/wire.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/batch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/batch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type TRPCLink } from '@trpc/client';
|
|
2
|
+
import type { AnyRouter } from '@trpc/server';
|
|
3
|
+
import { type ProtoLinkOptions } from '../../grpc/proto_link.js';
|
|
4
|
+
import type { GrpcWebEncoding } from '../../web/content_type.js';
|
|
5
|
+
/** Configuration for batching tRPC operations over gRPC-Web. */
|
|
6
|
+
export interface GrpcWebBatchLinkOptions extends ProtoLinkOptions {
|
|
7
|
+
/** Origin for gRPC-Web POSTs. Default `''` (same origin). */
|
|
8
|
+
url?: string;
|
|
9
|
+
/** HTTP body representation. Defaults to base64 gRPC-Web. */
|
|
10
|
+
encoding?: GrpcWebEncoding;
|
|
11
|
+
/** Gzip-compresses the batch request message. Defaults to false. */
|
|
12
|
+
compress?: boolean;
|
|
13
|
+
/** Maximum operations per gRPC request. Defaults to 100. */
|
|
14
|
+
maxItems?: number;
|
|
15
|
+
}
|
|
16
|
+
/** Batches query and mutation operations into the built-in unary batch RPC. */
|
|
17
|
+
export declare function grpcWebBatchLink<TRouter extends AnyRouter>(options: GrpcWebBatchLinkOptions): TRPCLink<TRouter>;
|
|
18
|
+
//# sourceMappingURL=web_link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web_link.d.ts","sourceRoot":"","sources":["../../../src/batch/link/web_link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,cAAc,CAAC;AAE7D,OAAO,EAIL,KAAK,gBAAgB,EAEtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAYjE,gEAAgE;AAChE,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAsQD,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,OAAO,SAAS,SAAS,EACxD,OAAO,EAAE,uBAAuB,GAC/B,QAAQ,CAAC,OAAO,CAAC,CAEnB"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { TRPCClientError } from '@trpc/client';
|
|
2
|
+
import { observable } from '@trpc/server/observable';
|
|
3
|
+
import { authInterceptor, } from '../../grpc/proto_link.js';
|
|
4
|
+
import { ProtoCodec } from '../../proto_codec/index.js';
|
|
5
|
+
import { GrpcWebError } from '../../web/codec/protocol_codec.js';
|
|
6
|
+
import { createGrpcWebFetchCall } from '../../web/fetch_call.js';
|
|
7
|
+
import { BATCH_GRPC_PATH, BATCH_PROCEDURE_PATH, DEFAULT_MAX_BATCH_ITEMS, batchProtocol, } from '../proto/wire.js';
|
|
8
|
+
function compose(interceptors, terminal) {
|
|
9
|
+
let next = terminal;
|
|
10
|
+
for (let index = interceptors.length - 1; index >= 0; index--) {
|
|
11
|
+
const interceptor = interceptors[index];
|
|
12
|
+
const inner = next;
|
|
13
|
+
next = (ctx) => interceptor(ctx, inner);
|
|
14
|
+
}
|
|
15
|
+
return next;
|
|
16
|
+
}
|
|
17
|
+
class GrpcWebBatchLink {
|
|
18
|
+
#appCodec;
|
|
19
|
+
#batchCodec;
|
|
20
|
+
#batchRpc;
|
|
21
|
+
#call;
|
|
22
|
+
#interceptors;
|
|
23
|
+
#maxItems;
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this.#appCodec = new ProtoCodec(options.schema);
|
|
26
|
+
const protocol = batchProtocol();
|
|
27
|
+
this.#batchCodec = protocol.codec;
|
|
28
|
+
this.#batchRpc = protocol.rpc;
|
|
29
|
+
this.#call = createGrpcWebFetchCall({
|
|
30
|
+
baseUrl: options.url,
|
|
31
|
+
encoding: options.encoding,
|
|
32
|
+
compress: options.compress,
|
|
33
|
+
});
|
|
34
|
+
this.#maxItems = options.maxItems ?? DEFAULT_MAX_BATCH_ITEMS;
|
|
35
|
+
if (!Number.isInteger(this.#maxItems) || this.#maxItems < 1) {
|
|
36
|
+
throw new Error('maxItems must be a positive integer');
|
|
37
|
+
}
|
|
38
|
+
this.#interceptors = [
|
|
39
|
+
...(options.auth ? [authInterceptor(options.auth)] : []),
|
|
40
|
+
...(options.interceptors ?? []),
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
link() {
|
|
44
|
+
return () => {
|
|
45
|
+
const enqueue = {
|
|
46
|
+
query: this.#createQueue('query'),
|
|
47
|
+
mutation: this.#createQueue('mutation'),
|
|
48
|
+
};
|
|
49
|
+
return ({ op }) => observable((observer) => {
|
|
50
|
+
if (op.type === 'subscription') {
|
|
51
|
+
observer.error(TRPCClientError.from(new Error('Subscriptions are unsupported by grpcWebBatchLink; use grpcWebLink')));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
let completed = false;
|
|
55
|
+
const abort = () => {
|
|
56
|
+
item.cancelled = true;
|
|
57
|
+
item.abortBatch?.();
|
|
58
|
+
};
|
|
59
|
+
const item = {
|
|
60
|
+
op,
|
|
61
|
+
cancelled: op.signal?.aborted ?? false,
|
|
62
|
+
deliver(value) {
|
|
63
|
+
if (completed || item.cancelled)
|
|
64
|
+
return;
|
|
65
|
+
completed = true;
|
|
66
|
+
op.signal?.removeEventListener('abort', abort);
|
|
67
|
+
observer.next({ result: { type: 'data', data: value } });
|
|
68
|
+
observer.complete();
|
|
69
|
+
},
|
|
70
|
+
fail(cause) {
|
|
71
|
+
if (completed || item.cancelled)
|
|
72
|
+
return;
|
|
73
|
+
completed = true;
|
|
74
|
+
op.signal?.removeEventListener('abort', abort);
|
|
75
|
+
observer.error(TRPCClientError.from(cause instanceof Error ? cause : new Error(String(cause))));
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
op.signal?.addEventListener('abort', abort, { once: true });
|
|
79
|
+
enqueue[op.type](item);
|
|
80
|
+
return abort;
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
#createQueue(type) {
|
|
85
|
+
let pending = [];
|
|
86
|
+
let scheduled = false;
|
|
87
|
+
const flush = () => {
|
|
88
|
+
scheduled = false;
|
|
89
|
+
const queued = pending;
|
|
90
|
+
pending = [];
|
|
91
|
+
const groups = [];
|
|
92
|
+
for (let index = 0; index < queued.length; index += this.#maxItems) {
|
|
93
|
+
groups.push(queued.slice(index, index + this.#maxItems));
|
|
94
|
+
}
|
|
95
|
+
void (async () => {
|
|
96
|
+
for (const group of groups)
|
|
97
|
+
await this.#execute(type, group);
|
|
98
|
+
})();
|
|
99
|
+
};
|
|
100
|
+
return (item) => {
|
|
101
|
+
pending.push(item);
|
|
102
|
+
if (!scheduled) {
|
|
103
|
+
scheduled = true;
|
|
104
|
+
queueMicrotask(flush);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async #execute(type, items) {
|
|
109
|
+
const active = items.filter((item) => !item.cancelled && !item.op.signal?.aborted);
|
|
110
|
+
if (active.length === 0)
|
|
111
|
+
return;
|
|
112
|
+
const byId = new Map();
|
|
113
|
+
const responseTypes = new Map();
|
|
114
|
+
const request = { calls: [] };
|
|
115
|
+
for (const item of active) {
|
|
116
|
+
const rpc = this.#appCodec.lookupRpc(item.op.path);
|
|
117
|
+
if (!rpc || rpc.method.responseStream) {
|
|
118
|
+
item.fail(new Error(rpc
|
|
119
|
+
? `subscriptions cannot be included in a batch: ${item.op.path}`
|
|
120
|
+
: `no gRPC mapping for ${item.op.path}`));
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const id = request.calls.length + 1;
|
|
124
|
+
try {
|
|
125
|
+
request.calls.push({
|
|
126
|
+
id,
|
|
127
|
+
path: item.op.path,
|
|
128
|
+
input: this.#appCodec.encode(rpc.method.requestType, item.op.input),
|
|
129
|
+
});
|
|
130
|
+
byId.set(id, item);
|
|
131
|
+
responseTypes.set(id, rpc.method.responseType);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
item.fail(error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (request.calls.length === 0)
|
|
138
|
+
return;
|
|
139
|
+
const controller = new AbortController();
|
|
140
|
+
const abortWhenUnused = () => {
|
|
141
|
+
if ([...byId.values()].every((item) => item.cancelled)) {
|
|
142
|
+
controller.abort();
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
for (const item of byId.values())
|
|
146
|
+
item.abortBatch = abortWhenUnused;
|
|
147
|
+
const context = {
|
|
148
|
+
path: BATCH_PROCEDURE_PATH,
|
|
149
|
+
type,
|
|
150
|
+
service: this.#batchRpc.service,
|
|
151
|
+
method: this.#batchRpc.method.name,
|
|
152
|
+
grpcPath: BATCH_GRPC_PATH,
|
|
153
|
+
input: request,
|
|
154
|
+
metadata: new Map(),
|
|
155
|
+
signal: controller.signal,
|
|
156
|
+
};
|
|
157
|
+
const invoke = compose(this.#interceptors, async (current) => this.#call({
|
|
158
|
+
path: current.path,
|
|
159
|
+
type,
|
|
160
|
+
input: current.input,
|
|
161
|
+
bytes: this.#batchCodec.encode(this.#batchRpc.method.requestType, current.input),
|
|
162
|
+
service: current.service,
|
|
163
|
+
method: current.method,
|
|
164
|
+
grpcPath: current.grpcPath,
|
|
165
|
+
metadata: Object.fromEntries(current.metadata),
|
|
166
|
+
signal: current.signal,
|
|
167
|
+
}));
|
|
168
|
+
try {
|
|
169
|
+
const encoded = await invoke(context);
|
|
170
|
+
if (!(encoded instanceof Uint8Array)) {
|
|
171
|
+
throw new Error('batch RPC returned a streaming response');
|
|
172
|
+
}
|
|
173
|
+
const decoded = this.#batchCodec.decode(this.#batchRpc.method.responseType, encoded);
|
|
174
|
+
const results = new Map((decoded.results ?? []).map((result) => [result.id, result]));
|
|
175
|
+
if (results.size !== (decoded.results ?? []).length) {
|
|
176
|
+
throw new Error('batch RPC returned duplicate result ids');
|
|
177
|
+
}
|
|
178
|
+
for (const [id, item] of byId) {
|
|
179
|
+
if (item.cancelled)
|
|
180
|
+
continue;
|
|
181
|
+
const result = results.get(id);
|
|
182
|
+
if (!result) {
|
|
183
|
+
item.fail(new Error(`batch RPC omitted result ${id}`));
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (result.result === 'error') {
|
|
187
|
+
item.fail(new GrpcWebError(result.code, result.message));
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
item.deliver(this.#appCodec.decode(responseTypes.get(id), result.output ?? new Uint8Array()));
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
item.fail(error);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
if (!controller.signal.aborted) {
|
|
200
|
+
for (const item of byId.values()) {
|
|
201
|
+
if (!item.cancelled)
|
|
202
|
+
item.fail(error);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
for (const item of byId.values())
|
|
208
|
+
item.abortBatch = undefined;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** Batches query and mutation operations into the built-in unary batch RPC. */
|
|
213
|
+
export function grpcWebBatchLink(options) {
|
|
214
|
+
return new GrpcWebBatchLink(options).link();
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=web_link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web_link.js","sourceRoot":"","sources":["../../../src/batch/link/web_link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ProtoMeta } from '@trpc-proto/schema_ir';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/** Declarative tRPC router that defines the transport-level batch envelope. */
|
|
4
|
+
export declare const batchRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
5
|
+
ctx: object;
|
|
6
|
+
meta: ProtoMeta;
|
|
7
|
+
errorShape: import("@trpc/server").TRPCDefaultErrorShape;
|
|
8
|
+
transformer: false;
|
|
9
|
+
}, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
|
|
10
|
+
batch: import("@trpc/server").TRPCBuiltRouter<{
|
|
11
|
+
ctx: object;
|
|
12
|
+
meta: ProtoMeta;
|
|
13
|
+
errorShape: import("@trpc/server").TRPCDefaultErrorShape;
|
|
14
|
+
transformer: false;
|
|
15
|
+
}, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
|
|
16
|
+
execute: import("@trpc/server").TRPCMutationProcedure<{
|
|
17
|
+
input: {
|
|
18
|
+
calls: {
|
|
19
|
+
id: number;
|
|
20
|
+
path: string;
|
|
21
|
+
input: z.core.File;
|
|
22
|
+
}[];
|
|
23
|
+
};
|
|
24
|
+
output: {
|
|
25
|
+
results: ({
|
|
26
|
+
result: "success";
|
|
27
|
+
id: number;
|
|
28
|
+
output: z.core.File;
|
|
29
|
+
} | {
|
|
30
|
+
result: "error";
|
|
31
|
+
id: number;
|
|
32
|
+
code: number;
|
|
33
|
+
message: string;
|
|
34
|
+
})[];
|
|
35
|
+
};
|
|
36
|
+
meta: ProtoMeta;
|
|
37
|
+
}>;
|
|
38
|
+
}>>;
|
|
39
|
+
}>>;
|
|
40
|
+
export type BatchRouter = typeof batchRouter;
|
|
41
|
+
//# sourceMappingURL=batch_router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch_router.d.ts","sourceRoot":"","sources":["../../../src/batch/proto/batch_router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyDxB,+EAA+E;AAC/E,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOtB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { initTRPC, TRPCError } from '@trpc/server';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
const t = initTRPC.meta().create({
|
|
4
|
+
allowOutsideOfServer: true,
|
|
5
|
+
defaultMeta: {
|
|
6
|
+
proto: {
|
|
7
|
+
package: 'trpc.batch.v1',
|
|
8
|
+
cache: 'src/batch/proto/generated/schema.ts',
|
|
9
|
+
syntax: 'proto3',
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
const BatchCall = z
|
|
14
|
+
.object({
|
|
15
|
+
id: z.int().positive(),
|
|
16
|
+
path: z.string(),
|
|
17
|
+
input: z.file(),
|
|
18
|
+
})
|
|
19
|
+
.meta({ protoMessageName: 'BatchCall' });
|
|
20
|
+
const BatchRequest = z
|
|
21
|
+
.object({
|
|
22
|
+
calls: z.array(BatchCall),
|
|
23
|
+
})
|
|
24
|
+
.meta({ protoMessageName: 'BatchRequest' });
|
|
25
|
+
const BatchSuccess = z.object({
|
|
26
|
+
result: z.literal('success'),
|
|
27
|
+
id: z.int().positive(),
|
|
28
|
+
output: z.file(),
|
|
29
|
+
});
|
|
30
|
+
const BatchFailure = z.object({
|
|
31
|
+
result: z.literal('error'),
|
|
32
|
+
id: z.int().positive(),
|
|
33
|
+
code: z.int32(),
|
|
34
|
+
message: z.string(),
|
|
35
|
+
});
|
|
36
|
+
const BatchResult = z
|
|
37
|
+
.discriminatedUnion('result', [BatchSuccess, BatchFailure])
|
|
38
|
+
.meta({ protoMessageName: 'BatchResult' });
|
|
39
|
+
const BatchResponse = z
|
|
40
|
+
.object({
|
|
41
|
+
results: z.array(BatchResult),
|
|
42
|
+
})
|
|
43
|
+
.meta({ protoMessageName: 'BatchResponse' });
|
|
44
|
+
const notImplemented = () => {
|
|
45
|
+
throw new TRPCError({
|
|
46
|
+
code: 'NOT_IMPLEMENTED',
|
|
47
|
+
message: 'The batch procedure is implemented by the transport runtime',
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
/** Declarative tRPC router that defines the transport-level batch envelope. */
|
|
51
|
+
export const batchRouter = t.router({
|
|
52
|
+
batch: t.router({
|
|
53
|
+
execute: t.procedure
|
|
54
|
+
.input(BatchRequest)
|
|
55
|
+
.output(BatchResponse)
|
|
56
|
+
.mutation(notImplemented),
|
|
57
|
+
}),
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=batch_router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch_router.js","sourceRoot":"","sources":["../../../src/batch/proto/batch_router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAa,CAAC,MAAM,CAAC;IAC1C,oBAAoB,EAAE,IAAI;IAC1B,WAAW,EAAE;QACX,KAAK,EAAE;YACL,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE,qCAAqC;YAC5C,MAAM,EAAE,QAAQ;SACjB;KACF;CACF,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE;CAChB,CAAC;KACD,IAAI,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;AAE3C,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;CAC1B,CAAC;KACD,IAAI,CAAC,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC,CAAC;AAE9C,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5B,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACtB,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE;CACjB,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC1B,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACtB,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE;IACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC;KAClB,kBAAkB,CAAC,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;KAC1D,IAAI,CAAC,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC,CAAC;AAE7C,MAAM,aAAa,GAAG,CAAC;KACpB,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;CAC9B,CAAC;KACD,IAAI,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,CAAC;AAE/C,MAAM,cAAc,GAAG,GAAU,EAAE;IACjC,MAAM,IAAI,SAAS,CAAC;QAClB,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,6DAA6D;KACvE,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,SAAS;aACjB,KAAK,CAAC,YAAY,CAAC;aACnB,MAAM,CAAC,aAAa,CAAC;aACrB,QAAQ,CAAC,cAAc,CAAC;KAC5B,CAAC;CACH,CAAC,CAAC"}
|