@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.
Files changed (172) hide show
  1. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.d.ts +1 -0
  2. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.dev.js +90 -0
  3. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.js +7 -0
  4. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.prod.js +90 -0
  5. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.esm.js +86 -0
  6. package/adapters/express/dist/trpc-server-adapters-express.cjs.dev.js +3 -3
  7. package/adapters/express/dist/trpc-server-adapters-express.cjs.prod.js +3 -3
  8. package/adapters/express/dist/trpc-server-adapters-express.esm.js +3 -3
  9. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.dev.js +3 -3
  10. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.prod.js +3 -3
  11. package/adapters/fastify/dist/trpc-server-adapters-fastify.esm.js +3 -3
  12. package/adapters/fastify/index.js +1 -1
  13. package/adapters/fetch/index.d.ts +1 -0
  14. package/adapters/fetch/index.js +1 -0
  15. package/adapters/next/dist/trpc-server-adapters-next.cjs.dev.js +3 -3
  16. package/adapters/next/dist/trpc-server-adapters-next.cjs.prod.js +3 -3
  17. package/adapters/next/dist/trpc-server-adapters-next.esm.js +3 -3
  18. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.dev.js +3 -3
  19. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.prod.js +3 -3
  20. package/adapters/node-http/dist/trpc-server-adapters-node-http.esm.js +3 -3
  21. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.dev.js +3 -3
  22. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.prod.js +3 -3
  23. package/adapters/standalone/dist/trpc-server-adapters-standalone.esm.js +3 -3
  24. package/dist/{transformTRPCResponse-9fdeecca.mjs → TRPCError-7971540a.mjs} +1 -53
  25. package/dist/{transformTRPCResponse-a57d3226.js → TRPCError-ddec3395.js} +0 -54
  26. package/dist/adapters/express.js +5 -4
  27. package/dist/adapters/express.mjs +5 -4
  28. package/dist/adapters/fastify/index.js +6 -6
  29. package/dist/adapters/fastify/index.mjs +6 -6
  30. package/dist/adapters/fetch/fetchRequestHandler.d.ts +8 -0
  31. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -0
  32. package/dist/adapters/fetch/index.d.ts +3 -0
  33. package/dist/adapters/fetch/index.d.ts.map +1 -0
  34. package/dist/adapters/fetch/index.js +69 -0
  35. package/dist/adapters/fetch/index.mjs +65 -0
  36. package/dist/adapters/fetch/index.ts.js +1 -0
  37. package/dist/adapters/fetch/types.d.ts +21 -0
  38. package/dist/adapters/fetch/types.d.ts.map +1 -0
  39. package/dist/adapters/next.d.ts.map +1 -1
  40. package/dist/adapters/next.js +9 -9
  41. package/dist/adapters/next.mjs +8 -8
  42. package/dist/adapters/node-http/index.js +5 -4
  43. package/dist/adapters/node-http/index.mjs +5 -4
  44. package/dist/adapters/node-http/types.d.ts +6 -5
  45. package/dist/adapters/node-http/types.d.ts.map +1 -1
  46. package/dist/adapters/standalone.js +5 -4
  47. package/dist/adapters/standalone.mjs +5 -4
  48. package/dist/adapters/ws.d.ts +1 -1
  49. package/dist/adapters/ws.d.ts.map +1 -1
  50. package/dist/adapters/ws.js +117 -80
  51. package/dist/adapters/ws.mjs +111 -74
  52. package/dist/{codes-6c13cf43.mjs → envelopes-1deb2fa7.mjs} +17 -1
  53. package/dist/{codes-4e4d55a9.js → envelopes-a953b930.js} +16 -0
  54. package/dist/http/index.d.ts +1 -1
  55. package/dist/http/internals/types.d.ts +2 -2
  56. package/dist/http/resolveHTTPResponse.d.ts.map +1 -1
  57. package/dist/http/{ResponseMeta.d.ts → responseMeta.d.ts} +1 -1
  58. package/dist/http/responseMeta.d.ts.map +1 -0
  59. package/dist/index.d.ts +0 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +38 -52
  62. package/dist/index.mjs +31 -43
  63. package/dist/internals/{BaseHandlerOptions.d.ts → baseHandlerOptions.d.ts} +2 -2
  64. package/dist/internals/{BaseHandlerOptions.d.ts.map → baseHandlerOptions.d.ts.map} +1 -1
  65. package/dist/internals/callProcedure.d.ts +2 -2
  66. package/dist/internals/callProcedure.d.ts.map +1 -1
  67. package/dist/internals/middlewares.d.ts +3 -1
  68. package/dist/internals/middlewares.d.ts.map +1 -1
  69. package/dist/internals/{OnErrorFunction.d.ts → onErrorFunction.d.ts} +1 -1
  70. package/dist/internals/{OnErrorFunction.d.ts.map → onErrorFunction.d.ts.map} +1 -1
  71. package/dist/internals/procedure.d.ts +4 -3
  72. package/dist/internals/procedure.d.ts.map +1 -1
  73. package/dist/internals/transformTRPCResponse.d.ts +4 -2
  74. package/dist/internals/transformTRPCResponse.d.ts.map +1 -1
  75. package/dist/{nodeHTTPRequestHandler-13c4bded.mjs → nodeHTTPRequestHandler-1cdb6383.mjs} +2 -2
  76. package/dist/{nodeHTTPRequestHandler-745e43e5.js → nodeHTTPRequestHandler-848f07b5.js} +3 -3
  77. package/dist/observable/index.d.ts +5 -0
  78. package/dist/observable/index.d.ts.map +1 -0
  79. package/dist/observable/index.js +204 -0
  80. package/dist/observable/index.mjs +195 -0
  81. package/dist/observable/index.ts.js +1 -0
  82. package/dist/observable/internals/identity.d.ts +2 -0
  83. package/dist/observable/internals/identity.d.ts.map +1 -0
  84. package/dist/observable/internals/observableToPromise.d.ts +10 -0
  85. package/dist/observable/internals/observableToPromise.d.ts.map +1 -0
  86. package/dist/observable/internals/pipe.d.ts +4 -0
  87. package/dist/observable/internals/pipe.d.ts.map +1 -0
  88. package/dist/observable/observable.d.ts +5 -0
  89. package/dist/observable/observable.d.ts.map +1 -0
  90. package/dist/observable/operators/index.d.ts +4 -0
  91. package/dist/observable/operators/index.d.ts.map +1 -0
  92. package/dist/observable/operators/map.d.ts +3 -0
  93. package/dist/observable/operators/map.d.ts.map +1 -0
  94. package/dist/observable/operators/share.d.ts +6 -0
  95. package/dist/observable/operators/share.d.ts.map +1 -0
  96. package/dist/observable/operators/tap.d.ts +3 -0
  97. package/dist/observable/operators/tap.d.ts.map +1 -0
  98. package/dist/observable/types.d.ts +29 -0
  99. package/dist/observable/types.d.ts.map +1 -0
  100. package/dist/observable-137ea1bd.mjs +105 -0
  101. package/dist/observable-3aa4d911.js +108 -0
  102. package/dist/{resolveHTTPResponse-de40fda7.mjs → resolveHTTPResponse-54a79e6c.mjs} +14 -20
  103. package/dist/{resolveHTTPResponse-b1167b6a.js → resolveHTTPResponse-ec3dccaa.js} +21 -27
  104. package/dist/router.d.ts +6 -6
  105. package/dist/router.d.ts.map +1 -1
  106. package/dist/rpc/envelopes.d.ts +61 -39
  107. package/dist/rpc/envelopes.d.ts.map +1 -1
  108. package/dist/rpc/index.js +7 -3
  109. package/dist/rpc/index.mjs +1 -1
  110. package/dist/subscription.d.ts +3 -52
  111. package/dist/subscription.d.ts.map +1 -1
  112. package/dist/subscription.js +44 -0
  113. package/dist/subscription.mjs +40 -0
  114. package/dist/subscription.ts.js +1 -0
  115. package/dist/transformTRPCResponse-333bed6c.js +56 -0
  116. package/dist/transformTRPCResponse-e0cba527.mjs +53 -0
  117. package/dist/types.d.ts +8 -0
  118. package/dist/types.d.ts.map +1 -1
  119. package/observable/index.d.ts +1 -0
  120. package/observable/index.js +1 -0
  121. package/package.json +25 -7
  122. package/rpc/dist/trpc-server-rpc.cjs.dev.js +1 -1
  123. package/rpc/dist/trpc-server-rpc.cjs.prod.js +1 -1
  124. package/rpc/dist/trpc-server-rpc.esm.js +1 -1
  125. package/src/adapters/fastify/fastifyTRPCPlugin.ts +1 -1
  126. package/src/adapters/fetch/fetchRequestHandler.ts +61 -0
  127. package/src/adapters/fetch/index.ts +2 -0
  128. package/src/adapters/fetch/types.ts +28 -0
  129. package/src/adapters/next.ts +3 -5
  130. package/src/adapters/node-http/types.ts +6 -5
  131. package/src/adapters/ws.ts +110 -72
  132. package/src/http/index.ts +1 -1
  133. package/src/http/internals/types.ts +2 -2
  134. package/src/http/resolveHTTPResponse.ts +16 -20
  135. package/src/http/{ResponseMeta.ts → responseMeta.ts} +0 -0
  136. package/src/index.ts +0 -1
  137. package/src/internals/{BaseHandlerOptions.ts → baseHandlerOptions.ts} +1 -1
  138. package/src/internals/callProcedure.ts +6 -3
  139. package/src/internals/middlewares.ts +4 -1
  140. package/src/internals/{OnErrorFunction.ts → onErrorFunction.ts} +0 -0
  141. package/src/internals/procedure.ts +40 -27
  142. package/src/internals/transformTRPCResponse.ts +20 -15
  143. package/src/observable/index.ts +4 -0
  144. package/src/observable/internals/identity.ts +3 -0
  145. package/src/observable/internals/observableToPromise.ts +49 -0
  146. package/src/observable/internals/pipe.ts +22 -0
  147. package/src/observable/observable.test.ts +101 -0
  148. package/src/observable/observable.ts +75 -0
  149. package/src/observable/operators/index.ts +3 -0
  150. package/src/observable/operators/map.test.ts +92 -0
  151. package/src/observable/operators/map.ts +25 -0
  152. package/src/observable/operators/share.test.ts +60 -0
  153. package/src/observable/operators/share.ts +67 -0
  154. package/src/observable/operators/tap.ts +26 -0
  155. package/src/observable/types.ts +69 -0
  156. package/src/router.ts +7 -9
  157. package/src/rpc/envelopes.ts +87 -68
  158. package/src/subscription.ts +5 -123
  159. package/src/types.ts +7 -0
  160. package/dist/http/ResponseMeta.d.ts.map +0 -1
  161. package/dist/internals/wrapCallSafe.d.ts +0 -16
  162. package/dist/internals/wrapCallSafe.d.ts.map +0 -1
  163. package/dist/subscription-4b936ba3.js +0 -136
  164. package/dist/subscription-8a85f253.mjs +0 -133
  165. package/src/internals/wrapCallSafe.ts +0 -19
  166. package/ws/dist/trpc-server-ws.cjs.d.ts +0 -1
  167. package/ws/dist/trpc-server-ws.cjs.dev.js +0 -15
  168. package/ws/dist/trpc-server-ws.cjs.js +0 -7
  169. package/ws/dist/trpc-server-ws.cjs.prod.js +0 -15
  170. package/ws/dist/trpc-server-ws.esm.js +0 -11
  171. package/ws/index.d.ts +0 -1
  172. 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
@@ -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.21",
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
- "@testing-library/jest-dom": "^5.14.1",
84
- "@testing-library/react": "^12.0.0",
85
- "@testing-library/user-event": "^13.2.1",
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.0.1",
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": "0db16da18ee5fc1ea4b2149490c316a4a700d2ab"
128
+ "gitHead": "a3ecf56d83dd9774aaf885e83e9ccfe363fbab48"
111
129
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var codes = require('../../dist/codes-33cef953.cjs.dev.js');
5
+ var codes = require('../../dist/codes-130e62df.cjs.dev.js');
6
6
 
7
7
 
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var codes = require('../../dist/codes-e0df67c4.cjs.prod.js');
5
+ var codes = require('../../dist/codes-aff770a3.cjs.prod.js');
6
6
 
7
7
 
8
8
 
@@ -1 +1 @@
1
- export { T as TRPC_ERROR_CODES_BY_KEY, a as TRPC_ERROR_CODES_BY_NUMBER } from '../../dist/codes-fe07bf82.esm.js';
1
+ export { T as TRPC_ERROR_CODES_BY_KEY, a as TRPC_ERROR_CODES_BY_NUMBER } from '../../dist/codes-5678cc97.esm.js';
@@ -1,4 +1,4 @@
1
- /// <reference types="fastify-websocket" />
1
+ /// <reference types="@fastify/websocket" />
2
2
  import { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';
3
3
  import { FastifyHandlerOptions } from '.';
4
4
  import { AnyRouter } from '../..';
@@ -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,2 @@
1
+ export * from './fetchRequestHandler';
2
+ export * from './types';
@@ -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>;
@@ -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
- const json: TRPCErrorResponse = {
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
- method?: string;
9
- query?: qs.ParsedQs;
10
+ query?: ParsedQs;
10
11
  body?: unknown;
11
12
  };
12
13
  export type NodeHTTPResponse = ServerResponse;
@@ -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/BaseHandlerOptions';
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
- TRPCErrorResponse,
11
+ JSONRPC2,
12
+ TRPCClientOutgoingMessage,
11
13
  TRPCReconnectNotification,
12
- TRPCRequest,
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
- ): TRPCRequest {
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 { jsonrpc, id, method, params: { input, path } };
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: TRPCResponse) {
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: TRPCRequest) {
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.destroy();
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 (!(result instanceof Subscription)) {
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 sub = result;
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
- sub.destroy();
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.destroy();
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({ id, error: json });
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.destroy();
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
- const json: TRPCErrorResponse = {
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,6 +1,6 @@
1
1
  import { assertNotBrowser } from '../assertNotBrowser';
2
2
 
3
3
  export * from './resolveHTTPResponse';
4
- export * from './ResponseMeta';
4
+ export * from './responseMeta';
5
5
 
6
6
  assertNotBrowser();
@@ -1,5 +1,5 @@
1
1
  import { TRPCError } from '../../TRPCError';
2
- import { BaseHandlerOptions } from '../../internals/BaseHandlerOptions';
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 '../ResponseMeta';
11
+ import { ResponseMeta } from '../responseMeta';
12
12
 
13
13
  export type HTTPHeaders = Dict<string | string[]>;
14
14