@trpc/server 10.0.0-alpha.21 → 10.0.0-alpha.24
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/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.d.ts +1 -0
- package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.dev.js +90 -0
- package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.js +7 -0
- package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.prod.js +90 -0
- package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.esm.js +86 -0
- package/adapters/express/dist/trpc-server-adapters-express.cjs.dev.js +3 -3
- package/adapters/express/dist/trpc-server-adapters-express.cjs.prod.js +3 -3
- package/adapters/express/dist/trpc-server-adapters-express.esm.js +3 -3
- package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.dev.js +3 -3
- package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.prod.js +3 -3
- package/adapters/fastify/dist/trpc-server-adapters-fastify.esm.js +3 -3
- package/adapters/fastify/index.js +1 -1
- package/adapters/fetch/index.d.ts +1 -0
- package/adapters/fetch/index.js +1 -0
- package/adapters/next/dist/trpc-server-adapters-next.cjs.dev.js +3 -3
- package/adapters/next/dist/trpc-server-adapters-next.cjs.prod.js +3 -3
- package/adapters/next/dist/trpc-server-adapters-next.esm.js +3 -3
- package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.dev.js +3 -3
- package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.prod.js +3 -3
- package/adapters/node-http/dist/trpc-server-adapters-node-http.esm.js +3 -3
- package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.dev.js +3 -3
- package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.prod.js +3 -3
- package/adapters/standalone/dist/trpc-server-adapters-standalone.esm.js +3 -3
- package/dist/{transformTRPCResponse-9fdeecca.mjs → TRPCError-7971540a.mjs} +1 -53
- package/dist/{transformTRPCResponse-a57d3226.js → TRPCError-ddec3395.js} +0 -54
- package/dist/adapters/express.js +5 -4
- package/dist/adapters/express.mjs +5 -4
- package/dist/adapters/fastify/index.js +6 -6
- package/dist/adapters/fastify/index.mjs +6 -6
- package/dist/adapters/fetch/fetchRequestHandler.d.ts +8 -0
- package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -0
- package/dist/adapters/fetch/index.d.ts +3 -0
- package/dist/adapters/fetch/index.d.ts.map +1 -0
- package/dist/adapters/fetch/index.js +69 -0
- package/dist/adapters/fetch/index.mjs +65 -0
- package/dist/adapters/fetch/index.ts.js +1 -0
- package/dist/adapters/fetch/types.d.ts +21 -0
- package/dist/adapters/fetch/types.d.ts.map +1 -0
- package/dist/adapters/next.d.ts.map +1 -1
- package/dist/adapters/next.js +9 -9
- package/dist/adapters/next.mjs +8 -8
- package/dist/adapters/node-http/index.js +5 -4
- package/dist/adapters/node-http/index.mjs +5 -4
- package/dist/adapters/node-http/types.d.ts +6 -5
- package/dist/adapters/node-http/types.d.ts.map +1 -1
- package/dist/adapters/standalone.js +5 -4
- package/dist/adapters/standalone.mjs +5 -4
- package/dist/adapters/ws.d.ts +1 -1
- package/dist/adapters/ws.d.ts.map +1 -1
- package/dist/adapters/ws.js +117 -80
- package/dist/adapters/ws.mjs +111 -74
- package/dist/{codes-6c13cf43.mjs → envelopes-1deb2fa7.mjs} +17 -1
- package/dist/{codes-4e4d55a9.js → envelopes-a953b930.js} +16 -0
- package/dist/http/index.d.ts +1 -1
- package/dist/http/internals/types.d.ts +2 -2
- package/dist/http/resolveHTTPResponse.d.ts.map +1 -1
- package/dist/http/{ResponseMeta.d.ts → responseMeta.d.ts} +1 -1
- package/dist/http/responseMeta.d.ts.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -52
- package/dist/index.mjs +31 -43
- package/dist/internals/{BaseHandlerOptions.d.ts → baseHandlerOptions.d.ts} +2 -2
- package/dist/internals/{BaseHandlerOptions.d.ts.map → baseHandlerOptions.d.ts.map} +1 -1
- package/dist/internals/callProcedure.d.ts +2 -2
- package/dist/internals/callProcedure.d.ts.map +1 -1
- package/dist/internals/middlewares.d.ts +3 -1
- package/dist/internals/middlewares.d.ts.map +1 -1
- package/dist/internals/{OnErrorFunction.d.ts → onErrorFunction.d.ts} +1 -1
- package/dist/internals/{OnErrorFunction.d.ts.map → onErrorFunction.d.ts.map} +1 -1
- package/dist/internals/procedure.d.ts +4 -3
- package/dist/internals/procedure.d.ts.map +1 -1
- package/dist/internals/transformTRPCResponse.d.ts +4 -2
- package/dist/internals/transformTRPCResponse.d.ts.map +1 -1
- package/dist/{nodeHTTPRequestHandler-13c4bded.mjs → nodeHTTPRequestHandler-1cdb6383.mjs} +2 -2
- package/dist/{nodeHTTPRequestHandler-745e43e5.js → nodeHTTPRequestHandler-848f07b5.js} +3 -3
- package/dist/observable/index.d.ts +5 -0
- package/dist/observable/index.d.ts.map +1 -0
- package/dist/observable/index.js +204 -0
- package/dist/observable/index.mjs +195 -0
- package/dist/observable/index.ts.js +1 -0
- package/dist/observable/internals/identity.d.ts +2 -0
- package/dist/observable/internals/identity.d.ts.map +1 -0
- package/dist/observable/internals/observableToPromise.d.ts +10 -0
- package/dist/observable/internals/observableToPromise.d.ts.map +1 -0
- package/dist/observable/internals/pipe.d.ts +4 -0
- package/dist/observable/internals/pipe.d.ts.map +1 -0
- package/dist/observable/observable.d.ts +5 -0
- package/dist/observable/observable.d.ts.map +1 -0
- package/dist/observable/operators/index.d.ts +4 -0
- package/dist/observable/operators/index.d.ts.map +1 -0
- package/dist/observable/operators/map.d.ts +3 -0
- package/dist/observable/operators/map.d.ts.map +1 -0
- package/dist/observable/operators/share.d.ts +6 -0
- package/dist/observable/operators/share.d.ts.map +1 -0
- package/dist/observable/operators/tap.d.ts +3 -0
- package/dist/observable/operators/tap.d.ts.map +1 -0
- package/dist/observable/types.d.ts +29 -0
- package/dist/observable/types.d.ts.map +1 -0
- package/dist/observable-137ea1bd.mjs +105 -0
- package/dist/observable-3aa4d911.js +108 -0
- package/dist/{resolveHTTPResponse-de40fda7.mjs → resolveHTTPResponse-54a79e6c.mjs} +14 -20
- package/dist/{resolveHTTPResponse-b1167b6a.js → resolveHTTPResponse-ec3dccaa.js} +21 -27
- package/dist/router.d.ts +6 -6
- package/dist/router.d.ts.map +1 -1
- package/dist/rpc/envelopes.d.ts +61 -39
- package/dist/rpc/envelopes.d.ts.map +1 -1
- package/dist/rpc/index.js +7 -3
- package/dist/rpc/index.mjs +1 -1
- package/dist/subscription.d.ts +3 -52
- package/dist/subscription.d.ts.map +1 -1
- package/dist/subscription.js +44 -0
- package/dist/subscription.mjs +40 -0
- package/dist/subscription.ts.js +1 -0
- package/dist/transformTRPCResponse-333bed6c.js +56 -0
- package/dist/transformTRPCResponse-e0cba527.mjs +53 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/observable/index.d.ts +1 -0
- package/observable/index.js +1 -0
- package/package.json +25 -7
- package/rpc/dist/trpc-server-rpc.cjs.dev.js +1 -1
- package/rpc/dist/trpc-server-rpc.cjs.prod.js +1 -1
- package/rpc/dist/trpc-server-rpc.esm.js +1 -1
- package/src/adapters/fastify/fastifyTRPCPlugin.ts +1 -1
- package/src/adapters/fetch/fetchRequestHandler.ts +61 -0
- package/src/adapters/fetch/index.ts +2 -0
- package/src/adapters/fetch/types.ts +28 -0
- package/src/adapters/next.ts +3 -5
- package/src/adapters/node-http/types.ts +6 -5
- package/src/adapters/ws.ts +110 -72
- package/src/http/index.ts +1 -1
- package/src/http/internals/types.ts +2 -2
- package/src/http/resolveHTTPResponse.ts +16 -20
- package/src/http/{ResponseMeta.ts → responseMeta.ts} +0 -0
- package/src/index.ts +0 -1
- package/src/internals/{BaseHandlerOptions.ts → baseHandlerOptions.ts} +1 -1
- package/src/internals/callProcedure.ts +6 -3
- package/src/internals/middlewares.ts +4 -1
- package/src/internals/{OnErrorFunction.ts → onErrorFunction.ts} +0 -0
- package/src/internals/procedure.ts +40 -27
- package/src/internals/transformTRPCResponse.ts +20 -15
- package/src/observable/index.ts +4 -0
- package/src/observable/internals/identity.ts +3 -0
- package/src/observable/internals/observableToPromise.ts +49 -0
- package/src/observable/internals/pipe.ts +22 -0
- package/src/observable/observable.test.ts +101 -0
- package/src/observable/observable.ts +75 -0
- package/src/observable/operators/index.ts +3 -0
- package/src/observable/operators/map.test.ts +92 -0
- package/src/observable/operators/map.ts +25 -0
- package/src/observable/operators/share.test.ts +60 -0
- package/src/observable/operators/share.ts +67 -0
- package/src/observable/operators/tap.ts +26 -0
- package/src/observable/types.ts +69 -0
- package/src/router.ts +7 -9
- package/src/rpc/envelopes.ts +87 -68
- package/src/subscription.ts +5 -123
- package/src/types.ts +7 -0
- package/dist/http/ResponseMeta.d.ts.map +0 -1
- package/dist/internals/wrapCallSafe.d.ts +0 -16
- package/dist/internals/wrapCallSafe.d.ts.map +0 -1
- package/dist/subscription-4b936ba3.js +0 -136
- package/dist/subscription-8a85f253.mjs +0 -133
- package/src/internals/wrapCallSafe.ts +0 -19
- package/ws/dist/trpc-server-ws.cjs.d.ts +0 -1
- package/ws/dist/trpc-server-ws.cjs.dev.js +0 -15
- package/ws/dist/trpc-server-ws.cjs.js +0 -7
- package/ws/dist/trpc-server-ws.cjs.prod.js +0 -15
- package/ws/dist/trpc-server-ws.esm.js +0 -11
- package/ws/index.d.ts +0 -1
- package/ws/index.js +0 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
async function callProcedure(opts) {
|
|
2
|
+
const {
|
|
3
|
+
type,
|
|
4
|
+
path,
|
|
5
|
+
input
|
|
6
|
+
} = opts;
|
|
7
|
+
const caller = opts.router.createCaller(opts.ctx);
|
|
8
|
+
|
|
9
|
+
if (type === 'query') {
|
|
10
|
+
return caller.query(path, input);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (type === 'mutation') {
|
|
14
|
+
return caller.mutation(path, input);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (type === 'subscription') {
|
|
18
|
+
const sub = await caller.subscription(path, input);
|
|
19
|
+
return sub;
|
|
20
|
+
}
|
|
21
|
+
/* istanbul ignore next */
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
throw new Error(`Unknown procedure type ${type}`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function transformTRPCResponseItem(router, item) {
|
|
28
|
+
if ('error' in item) {
|
|
29
|
+
return { ...item,
|
|
30
|
+
error: router._def.transformer.output.serialize(item.error)
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if ('data' in item.result) {
|
|
35
|
+
return { ...item,
|
|
36
|
+
result: { ...item.result,
|
|
37
|
+
data: router._def.transformer.output.serialize(item.result.data)
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return item;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Takes a unserialized `TRPCResponse` and serializes it with the router's transformers
|
|
46
|
+
**/
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
function transformTRPCResponse(router, itemOrItems) {
|
|
50
|
+
return Array.isArray(itemOrItems) ? itemOrItems.map(item => transformTRPCResponseItem(router, item)) : transformTRPCResponseItem(router, itemOrItems);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { callProcedure as c, transformTRPCResponse as t };
|
package/dist/types.d.ts
CHANGED
|
@@ -30,4 +30,12 @@ export declare type ThenArg<T> = T extends PromiseLike<infer U> ? ThenArg<U> : T
|
|
|
30
30
|
* @public
|
|
31
31
|
*/
|
|
32
32
|
export declare type Dict<T> = Record<string, T | undefined>;
|
|
33
|
+
/**
|
|
34
|
+
* @internal
|
|
35
|
+
* Creates a "lower-priority" type inference.
|
|
36
|
+
* https://github.com/microsoft/TypeScript/issues/14829#issuecomment-322267089
|
|
37
|
+
*/
|
|
38
|
+
export declare type InferLast<T> = T & {
|
|
39
|
+
[K in keyof T]: T[K];
|
|
40
|
+
};
|
|
33
41
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,oBAAY,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AAEpE;;GAEG;AACH,oBAAY,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,oBAAY,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC;KAClC,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GACvC,CAAC,CAAC,CAAC,CAAC,GACJ,CAAC,SAAS,MAAM,CAAC,GACjB,CAAC,CAAC,CAAC,CAAC,GACJ,KAAK;CACV,CAAC,CAAC;AAEH;;GAEG;AACH,oBAAY,QAAQ,CAClB,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChC,OAAO,SAAS,MAAM,IACpB;KACD,CAAC,IAAI,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;CAC1D,CAAC;AAEF;;GAEG;AACH,oBAAY,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;AAE5C;;GAEG;AACH,oBAAY,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAEzE;;GAEG;AACH,oBAAY,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,oBAAY,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AAEpE;;GAEG;AACH,oBAAY,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,oBAAY,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC;KAClC,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GACvC,CAAC,CAAC,CAAC,CAAC,GACJ,CAAC,SAAS,MAAM,CAAC,GACjB,CAAC,CAAC,CAAC,CAAC,GACJ,KAAK;CACV,CAAC,CAAC;AAEH;;GAEG;AACH,oBAAY,QAAQ,CAClB,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChC,OAAO,SAAS,MAAM,IACpB;KACD,CAAC,IAAI,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;CAC1D,CAAC;AAEF;;GAEG;AACH,oBAAY,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;AAE5C;;GAEG;AACH,oBAAY,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAEzE;;GAEG;AACH,oBAAY,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;AAEpD;;;;GAIG;AACH,oBAAY,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/observable';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../dist/observable/index');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trpc/server",
|
|
3
|
-
"version": "10.0.0-alpha.
|
|
3
|
+
"version": "10.0.0-alpha.24",
|
|
4
4
|
"description": "tRPC Server",
|
|
5
5
|
"author": "KATT",
|
|
6
6
|
"license": "MIT",
|
|
@@ -62,41 +62,59 @@
|
|
|
62
62
|
"require": "./dist/adapters/ws.js",
|
|
63
63
|
"default": "./dist/adapters/ws.js"
|
|
64
64
|
},
|
|
65
|
+
"./adapters/fetch": {
|
|
66
|
+
"import": "./dist/adapters/fetch/index.mjs",
|
|
67
|
+
"require": "./dist/adapters/fetch/index.js",
|
|
68
|
+
"default": "./dist/adapters/fetch/index.js"
|
|
69
|
+
},
|
|
65
70
|
"./rpc": {
|
|
66
71
|
"import": "./dist/rpc/index.mjs",
|
|
67
72
|
"require": "./dist/rpc/index.js",
|
|
68
73
|
"default": "./dist/rpc/index.js"
|
|
74
|
+
},
|
|
75
|
+
"./observable": {
|
|
76
|
+
"import": "./dist/observable/index.mjs",
|
|
77
|
+
"require": "./dist/observable/index.js",
|
|
78
|
+
"default": "./dist/observable/index.js"
|
|
79
|
+
},
|
|
80
|
+
"./subscription": {
|
|
81
|
+
"import": "./dist/subscription.mjs",
|
|
82
|
+
"require": "./dist/subscription.js",
|
|
83
|
+
"default": "./dist/subscription.js"
|
|
69
84
|
}
|
|
70
85
|
},
|
|
71
86
|
"files": [
|
|
72
87
|
"README.md",
|
|
73
88
|
"dist",
|
|
74
89
|
"adapters",
|
|
75
|
-
"ws",
|
|
76
90
|
"rpc",
|
|
91
|
+
"observable",
|
|
77
92
|
"src"
|
|
78
93
|
],
|
|
79
94
|
"publishConfig": {
|
|
80
95
|
"access": "public"
|
|
81
96
|
},
|
|
82
97
|
"devDependencies": {
|
|
83
|
-
"@
|
|
84
|
-
"@
|
|
85
|
-
"@
|
|
98
|
+
"@cloudflare/workers-types": "^3.8.0",
|
|
99
|
+
"@fastify/websocket": "^5.0.0",
|
|
100
|
+
"@miniflare/core": "^2.4.0",
|
|
86
101
|
"@types/express": "^4.17.12",
|
|
87
102
|
"@types/hash-sum": "^1.0.0",
|
|
88
103
|
"@types/ws": "^8.2.0",
|
|
89
104
|
"abort-controller": "^3.0.0",
|
|
90
105
|
"devalue": "^2.0.1",
|
|
106
|
+
"esbuild": "^0.14.38",
|
|
91
107
|
"express": "^4.17.1",
|
|
92
108
|
"fastify": "^3.27.1",
|
|
93
109
|
"fastify-plugin": "^3.0.1",
|
|
94
110
|
"fastify-websocket": "^4.0.0",
|
|
95
111
|
"hash-sum": "^2.0.0",
|
|
96
112
|
"jest": "^27.1.0",
|
|
113
|
+
"jest-environment-miniflare": "^2.4.0",
|
|
97
114
|
"konn": "^0.7.0",
|
|
115
|
+
"miniflare": "^2.4.0",
|
|
98
116
|
"myzod": "^1.3.1",
|
|
99
|
-
"next": "^12.
|
|
117
|
+
"next": "^12.1.6",
|
|
100
118
|
"node-fetch": "^2.6.1",
|
|
101
119
|
"superstruct": "^0.15.2",
|
|
102
120
|
"typescript": "4.4.4",
|
|
@@ -107,5 +125,5 @@
|
|
|
107
125
|
"dependencies": {
|
|
108
126
|
"tslib": "^2.1.0"
|
|
109
127
|
},
|
|
110
|
-
"gitHead": "
|
|
128
|
+
"gitHead": "a3ecf56d83dd9774aaf885e83e9ccfe363fbab48"
|
|
111
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { T as TRPC_ERROR_CODES_BY_KEY, a as TRPC_ERROR_CODES_BY_NUMBER } from '../../dist/codes-
|
|
1
|
+
export { T as TRPC_ERROR_CODES_BY_KEY, a as TRPC_ERROR_CODES_BY_NUMBER } from '../../dist/codes-5678cc97.esm.js';
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { assertNotBrowser } from '../../assertNotBrowser';
|
|
2
|
+
import { HTTPRequest } from '../../http/internals/types';
|
|
3
|
+
import { resolveHTTPResponse } from '../../http/resolveHTTPResponse';
|
|
4
|
+
import { AnyRouter } from '../../router';
|
|
5
|
+
import { FetchHandlerOptions } from './types';
|
|
6
|
+
|
|
7
|
+
assertNotBrowser();
|
|
8
|
+
|
|
9
|
+
export type FetchHandlerRequestOptions<TRouter extends AnyRouter> = {
|
|
10
|
+
req: Request;
|
|
11
|
+
endpoint: string;
|
|
12
|
+
} & FetchHandlerOptions<TRouter>;
|
|
13
|
+
|
|
14
|
+
export async function fetchRequestHandler<TRouter extends AnyRouter>(
|
|
15
|
+
opts: FetchHandlerRequestOptions<TRouter>,
|
|
16
|
+
): Promise<Response> {
|
|
17
|
+
const createContext = async () => {
|
|
18
|
+
return opts.createContext?.({ req: opts.req });
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const url = new URL(opts.req.url);
|
|
22
|
+
const path = url.pathname.slice(opts.endpoint.length + 1);
|
|
23
|
+
const req: HTTPRequest = {
|
|
24
|
+
query: url.searchParams,
|
|
25
|
+
method: opts.req.method,
|
|
26
|
+
headers: Object.fromEntries(opts.req.headers),
|
|
27
|
+
body: await opts.req.text(),
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const result = await resolveHTTPResponse({
|
|
31
|
+
req,
|
|
32
|
+
createContext,
|
|
33
|
+
path,
|
|
34
|
+
router: opts.router,
|
|
35
|
+
batching: opts.batching,
|
|
36
|
+
responseMeta: opts.responseMeta,
|
|
37
|
+
onError(o) {
|
|
38
|
+
opts?.onError?.({ ...o, req: opts.req });
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const res = new Response(result.body, {
|
|
43
|
+
status: result.status,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
for (const [key, value] of Object.entries(result.headers ?? {})) {
|
|
47
|
+
if (typeof value === 'undefined') {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (typeof value === 'string') {
|
|
52
|
+
res.headers.set(key, value);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for (const v of value) {
|
|
57
|
+
res.headers.append(key, v);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return res;
|
|
61
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { HTTPBaseHandlerOptions } from '../../http/internals/types';
|
|
2
|
+
import { AnyRouter, inferRouterContext } from '../../router';
|
|
3
|
+
|
|
4
|
+
export type FetchCreateContextFnOptions = {
|
|
5
|
+
req: Request;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type FetchCreateContextFn<TRouter extends AnyRouter> = (opts: {
|
|
9
|
+
req: Request;
|
|
10
|
+
}) => inferRouterContext<TRouter> | Promise<inferRouterContext<TRouter>>;
|
|
11
|
+
|
|
12
|
+
export type FetchCreateContextOption<TRouter extends AnyRouter> =
|
|
13
|
+
unknown extends inferRouterContext<TRouter>
|
|
14
|
+
? {
|
|
15
|
+
/**
|
|
16
|
+
* @link https://trpc.io/docs/context
|
|
17
|
+
**/
|
|
18
|
+
createContext?: FetchCreateContextFn<TRouter>;
|
|
19
|
+
}
|
|
20
|
+
: {
|
|
21
|
+
/**
|
|
22
|
+
* @link https://trpc.io/docs/context
|
|
23
|
+
**/
|
|
24
|
+
createContext: FetchCreateContextFn<TRouter>;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type FetchHandlerOptions<TRouter extends AnyRouter> =
|
|
28
|
+
HTTPBaseHandlerOptions<TRouter, Request> & FetchCreateContextOption<TRouter>;
|
package/src/adapters/next.ts
CHANGED
|
@@ -7,7 +7,6 @@ import type {
|
|
|
7
7
|
} from 'next/types';
|
|
8
8
|
import { TRPCError } from '../TRPCError';
|
|
9
9
|
import { AnyRouter } from '../router';
|
|
10
|
-
import { TRPCErrorResponse } from '../rpc';
|
|
11
10
|
import { nodeHTTPRequestHandler } from './node-http';
|
|
12
11
|
import {
|
|
13
12
|
NodeHTTPCreateContextFnOptions,
|
|
@@ -46,12 +45,11 @@ export function createNextApiHandler<TRouter extends AnyRouter>(
|
|
|
46
45
|
path: undefined,
|
|
47
46
|
input: undefined,
|
|
48
47
|
});
|
|
49
|
-
|
|
48
|
+
res.statusCode = 500;
|
|
49
|
+
res.json({
|
|
50
50
|
id: -1,
|
|
51
51
|
error,
|
|
52
|
-
};
|
|
53
|
-
res.statusCode = 500;
|
|
54
|
-
res.json(json);
|
|
52
|
+
});
|
|
55
53
|
return;
|
|
56
54
|
}
|
|
57
55
|
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
2
|
-
import qs from 'qs';
|
|
3
|
-
import { inferRouterContext } from '../..';
|
|
4
2
|
import { HTTPBaseHandlerOptions } from '../../http/internals/types';
|
|
5
|
-
import { AnyRouter } from '../../router';
|
|
3
|
+
import { AnyRouter, inferRouterContext } from '../../router';
|
|
4
|
+
|
|
5
|
+
interface ParsedQs {
|
|
6
|
+
[key: string]: undefined | string | string[] | ParsedQs | ParsedQs[];
|
|
7
|
+
}
|
|
6
8
|
|
|
7
9
|
export type NodeHTTPRequest = IncomingMessage & {
|
|
8
|
-
|
|
9
|
-
query?: qs.ParsedQs;
|
|
10
|
+
query?: ParsedQs;
|
|
10
11
|
body?: unknown;
|
|
11
12
|
};
|
|
12
13
|
export type NodeHTTPResponse = ServerResponse;
|
package/src/adapters/ws.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { IncomingMessage } from 'http';
|
|
2
2
|
import ws from 'ws';
|
|
3
3
|
import { TRPCError } from '../TRPCError';
|
|
4
|
-
import { BaseHandlerOptions } from '../internals/
|
|
4
|
+
import { BaseHandlerOptions } from '../internals/baseHandlerOptions';
|
|
5
5
|
import { callProcedure } from '../internals/callProcedure';
|
|
6
6
|
import { getCauseFromUnknown, getErrorFromUnknown } from '../internals/errors';
|
|
7
7
|
import { transformTRPCResponse } from '../internals/transformTRPCResponse';
|
|
8
|
+
import { Unsubscribable, isObservable } from '../observable';
|
|
8
9
|
import { AnyRouter, ProcedureType, inferRouterContext } from '../router';
|
|
9
10
|
import {
|
|
10
|
-
|
|
11
|
+
JSONRPC2,
|
|
12
|
+
TRPCClientOutgoingMessage,
|
|
11
13
|
TRPCReconnectNotification,
|
|
12
|
-
|
|
13
|
-
TRPCResponse,
|
|
14
|
+
TRPCResponseMessage,
|
|
14
15
|
} from '../rpc';
|
|
15
|
-
import { Subscription } from '../subscription';
|
|
16
16
|
import { CombinedDataTransformer } from '../transformer';
|
|
17
17
|
import { NodeHTTPCreateContextOption } from './node-http';
|
|
18
18
|
|
|
@@ -58,7 +58,7 @@ function assertIsJSONRPC2OrUndefined(
|
|
|
58
58
|
function parseMessage(
|
|
59
59
|
obj: unknown,
|
|
60
60
|
transformer: CombinedDataTransformer,
|
|
61
|
-
):
|
|
61
|
+
): TRPCClientOutgoingMessage {
|
|
62
62
|
assertIsObject(obj);
|
|
63
63
|
const { method, params, id, jsonrpc } = obj;
|
|
64
64
|
assertIsRequestId(id);
|
|
@@ -66,8 +66,8 @@ function parseMessage(
|
|
|
66
66
|
if (method === 'subscription.stop') {
|
|
67
67
|
return {
|
|
68
68
|
id,
|
|
69
|
+
jsonrpc,
|
|
69
70
|
method,
|
|
70
|
-
params: undefined,
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
73
|
assertIsProcedureType(method);
|
|
@@ -76,7 +76,15 @@ function parseMessage(
|
|
|
76
76
|
const { input: rawInput, path } = params;
|
|
77
77
|
assertIsString(path);
|
|
78
78
|
const input = transformer.input.deserialize(rawInput);
|
|
79
|
-
return {
|
|
79
|
+
return {
|
|
80
|
+
id,
|
|
81
|
+
jsonrpc,
|
|
82
|
+
method,
|
|
83
|
+
params: {
|
|
84
|
+
input,
|
|
85
|
+
path,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
80
88
|
}
|
|
81
89
|
|
|
82
90
|
/**
|
|
@@ -97,21 +105,34 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
|
|
|
97
105
|
|
|
98
106
|
const { transformer } = router._def;
|
|
99
107
|
wss.on('connection', async (client, req) => {
|
|
100
|
-
const clientSubscriptions = new Map<
|
|
101
|
-
number | string,
|
|
102
|
-
Subscription<TRouter>
|
|
103
|
-
>();
|
|
108
|
+
const clientSubscriptions = new Map<number | string, Unsubscribable>();
|
|
104
109
|
|
|
105
|
-
function respond(untransformedJSON:
|
|
110
|
+
function respond(untransformedJSON: TRPCResponseMessage) {
|
|
106
111
|
client.send(
|
|
107
112
|
JSON.stringify(transformTRPCResponse(router, untransformedJSON)),
|
|
108
113
|
);
|
|
109
114
|
}
|
|
115
|
+
|
|
116
|
+
function stopSubscription(
|
|
117
|
+
subscription: Unsubscribable,
|
|
118
|
+
{ id, jsonrpc }: { id: JSONRPC2.RequestId } & JSONRPC2.BaseEnvelope,
|
|
119
|
+
) {
|
|
120
|
+
subscription.unsubscribe();
|
|
121
|
+
|
|
122
|
+
respond({
|
|
123
|
+
id,
|
|
124
|
+
jsonrpc,
|
|
125
|
+
result: {
|
|
126
|
+
type: 'stopped',
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
110
131
|
const ctxPromise = createContext?.({ req, res: client });
|
|
111
132
|
let ctx: inferRouterContext<TRouter> | undefined = undefined;
|
|
112
133
|
|
|
113
|
-
async function handleRequest(msg:
|
|
114
|
-
const { id } = msg;
|
|
134
|
+
async function handleRequest(msg: TRPCClientOutgoingMessage) {
|
|
135
|
+
const { id, jsonrpc } = msg;
|
|
115
136
|
/* istanbul ignore next */
|
|
116
137
|
if (id === null) {
|
|
117
138
|
throw new TRPCError({
|
|
@@ -122,7 +143,7 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
|
|
|
122
143
|
if (msg.method === 'subscription.stop') {
|
|
123
144
|
const sub = clientSubscriptions.get(id);
|
|
124
145
|
if (sub) {
|
|
125
|
-
sub
|
|
146
|
+
stopSubscription(sub, { id, jsonrpc });
|
|
126
147
|
}
|
|
127
148
|
clientSubscriptions.delete(id);
|
|
128
149
|
return;
|
|
@@ -139,9 +160,18 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
|
|
|
139
160
|
ctx,
|
|
140
161
|
});
|
|
141
162
|
|
|
142
|
-
if (
|
|
163
|
+
if (type === 'subscription') {
|
|
164
|
+
if (!isObservable(result)) {
|
|
165
|
+
throw new TRPCError({
|
|
166
|
+
message: `Subscription ${path} did not return an observable`,
|
|
167
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
} else {
|
|
171
|
+
// send the value as data if the method is not a subscription
|
|
143
172
|
respond({
|
|
144
173
|
id,
|
|
174
|
+
jsonrpc,
|
|
145
175
|
result: {
|
|
146
176
|
type: 'data',
|
|
147
177
|
data: result,
|
|
@@ -150,75 +180,84 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
|
|
|
150
180
|
return;
|
|
151
181
|
}
|
|
152
182
|
|
|
153
|
-
const
|
|
183
|
+
const observable = result;
|
|
184
|
+
const sub = observable.subscribe({
|
|
185
|
+
next(data) {
|
|
186
|
+
respond({
|
|
187
|
+
id,
|
|
188
|
+
jsonrpc,
|
|
189
|
+
result: {
|
|
190
|
+
type: 'data',
|
|
191
|
+
data,
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
},
|
|
195
|
+
error(err) {
|
|
196
|
+
const error = getErrorFromUnknown(err);
|
|
197
|
+
opts.onError?.({ error, path, type, ctx, req, input });
|
|
198
|
+
respond({
|
|
199
|
+
id,
|
|
200
|
+
jsonrpc,
|
|
201
|
+
error: router.getErrorShape({
|
|
202
|
+
error,
|
|
203
|
+
type,
|
|
204
|
+
path,
|
|
205
|
+
input,
|
|
206
|
+
ctx,
|
|
207
|
+
}),
|
|
208
|
+
});
|
|
209
|
+
},
|
|
210
|
+
complete() {
|
|
211
|
+
respond({
|
|
212
|
+
id,
|
|
213
|
+
jsonrpc,
|
|
214
|
+
result: {
|
|
215
|
+
type: 'stopped',
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
},
|
|
219
|
+
});
|
|
154
220
|
/* istanbul ignore next */
|
|
155
221
|
if (client.readyState !== client.OPEN) {
|
|
156
222
|
// if the client got disconnected whilst initializing the subscription
|
|
157
|
-
|
|
223
|
+
// no need to send stopped message if the client is disconnected
|
|
224
|
+
sub.unsubscribe();
|
|
158
225
|
return;
|
|
159
226
|
}
|
|
227
|
+
|
|
160
228
|
/* istanbul ignore next */
|
|
161
229
|
if (clientSubscriptions.has(id)) {
|
|
162
230
|
// duplicate request ids for client
|
|
163
|
-
sub
|
|
231
|
+
stopSubscription(sub, { id, jsonrpc });
|
|
164
232
|
throw new TRPCError({
|
|
165
233
|
message: `Duplicate id ${id}`,
|
|
166
234
|
code: 'BAD_REQUEST',
|
|
167
235
|
});
|
|
168
236
|
}
|
|
169
237
|
clientSubscriptions.set(id, sub);
|
|
170
|
-
sub.on('data', (data: unknown) => {
|
|
171
|
-
respond({
|
|
172
|
-
id,
|
|
173
|
-
result: {
|
|
174
|
-
type: 'data',
|
|
175
|
-
data,
|
|
176
|
-
},
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
sub.on('error', (_error: unknown) => {
|
|
180
|
-
const error = getErrorFromUnknown(_error);
|
|
181
|
-
const json: TRPCErrorResponse = {
|
|
182
|
-
id,
|
|
183
|
-
error: router.getErrorShape({
|
|
184
|
-
error,
|
|
185
|
-
type,
|
|
186
|
-
path,
|
|
187
|
-
input,
|
|
188
|
-
ctx,
|
|
189
|
-
}),
|
|
190
|
-
};
|
|
191
|
-
opts.onError?.({ error, path, type, ctx, req, input });
|
|
192
|
-
respond(json);
|
|
193
|
-
});
|
|
194
|
-
sub.on('destroy', () => {
|
|
195
|
-
respond({
|
|
196
|
-
id,
|
|
197
|
-
result: {
|
|
198
|
-
type: 'stopped',
|
|
199
|
-
},
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
238
|
|
|
203
239
|
respond({
|
|
204
240
|
id,
|
|
241
|
+
jsonrpc,
|
|
205
242
|
result: {
|
|
206
243
|
type: 'started',
|
|
207
244
|
},
|
|
208
245
|
});
|
|
209
|
-
await sub.start();
|
|
210
246
|
} catch (cause) /* istanbul ignore next */ {
|
|
211
247
|
// procedure threw an error
|
|
212
248
|
const error = getErrorFromUnknown(cause);
|
|
213
|
-
const json = router.getErrorShape({
|
|
214
|
-
error,
|
|
215
|
-
type,
|
|
216
|
-
path,
|
|
217
|
-
input,
|
|
218
|
-
ctx,
|
|
219
|
-
});
|
|
220
249
|
opts.onError?.({ error, path, type, ctx, req, input });
|
|
221
|
-
respond({
|
|
250
|
+
respond({
|
|
251
|
+
id,
|
|
252
|
+
jsonrpc,
|
|
253
|
+
error: router.getErrorShape({
|
|
254
|
+
error,
|
|
255
|
+
type,
|
|
256
|
+
path,
|
|
257
|
+
input,
|
|
258
|
+
ctx,
|
|
259
|
+
}),
|
|
260
|
+
});
|
|
222
261
|
}
|
|
223
262
|
}
|
|
224
263
|
client.on('message', async (message) => {
|
|
@@ -250,7 +289,7 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
|
|
|
250
289
|
|
|
251
290
|
client.once('close', () => {
|
|
252
291
|
for (const sub of clientSubscriptions.values()) {
|
|
253
|
-
sub.
|
|
292
|
+
sub.unsubscribe();
|
|
254
293
|
}
|
|
255
294
|
clientSubscriptions.clear();
|
|
256
295
|
});
|
|
@@ -259,7 +298,15 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
|
|
|
259
298
|
ctx = await ctxPromise;
|
|
260
299
|
} catch (cause) {
|
|
261
300
|
const error = getErrorFromUnknown(cause);
|
|
262
|
-
|
|
301
|
+
opts.onError?.({
|
|
302
|
+
error,
|
|
303
|
+
path: undefined,
|
|
304
|
+
type: 'unknown',
|
|
305
|
+
ctx,
|
|
306
|
+
req,
|
|
307
|
+
input: undefined,
|
|
308
|
+
});
|
|
309
|
+
respond({
|
|
263
310
|
id: null,
|
|
264
311
|
error: router.getErrorShape({
|
|
265
312
|
error,
|
|
@@ -268,16 +315,7 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
|
|
|
268
315
|
input: undefined,
|
|
269
316
|
ctx,
|
|
270
317
|
}),
|
|
271
|
-
};
|
|
272
|
-
opts.onError?.({
|
|
273
|
-
error,
|
|
274
|
-
path: undefined,
|
|
275
|
-
type: 'unknown',
|
|
276
|
-
ctx,
|
|
277
|
-
req,
|
|
278
|
-
input: undefined,
|
|
279
318
|
});
|
|
280
|
-
respond(json);
|
|
281
319
|
|
|
282
320
|
// close in next tick
|
|
283
321
|
(global.setImmediate ?? global.setTimeout)(() => {
|
package/src/http/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TRPCError } from '../../TRPCError';
|
|
2
|
-
import { BaseHandlerOptions } from '../../internals/
|
|
2
|
+
import { BaseHandlerOptions } from '../../internals/baseHandlerOptions';
|
|
3
3
|
import {
|
|
4
4
|
AnyRouter,
|
|
5
5
|
ProcedureType,
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
} from '../../router';
|
|
9
9
|
import { TRPCResponse } from '../../rpc';
|
|
10
10
|
import { Dict } from '../../types';
|
|
11
|
-
import { ResponseMeta } from '../
|
|
11
|
+
import { ResponseMeta } from '../responseMeta';
|
|
12
12
|
|
|
13
13
|
export type HTTPHeaders = Dict<string | string[]>;
|
|
14
14
|
|