@trpc/server 10.0.0-alpha.2 → 10.0.0-alpha.22

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 (301) hide show
  1. package/adapters/express/dist/trpc-server-adapters-express.cjs.dev.js +7 -6
  2. package/adapters/express/dist/trpc-server-adapters-express.cjs.prod.js +7 -6
  3. package/adapters/express/dist/trpc-server-adapters-express.esm.js +7 -6
  4. package/adapters/express/index.d.ts +1 -0
  5. package/adapters/express/index.js +1 -0
  6. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.d.ts +1 -0
  7. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.dev.js +109 -0
  8. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.js +7 -0
  9. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.prod.js +109 -0
  10. package/adapters/fastify/dist/trpc-server-adapters-fastify.esm.js +104 -0
  11. package/adapters/fastify/index.d.ts +1 -0
  12. package/adapters/fastify/index.js +1 -0
  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 +4 -3
  16. package/adapters/next/dist/trpc-server-adapters-next.cjs.prod.js +4 -3
  17. package/adapters/next/dist/trpc-server-adapters-next.esm.js +4 -3
  18. package/adapters/next/index.d.ts +1 -0
  19. package/adapters/next/index.js +1 -0
  20. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.dev.js +4 -3
  21. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.prod.js +4 -3
  22. package/adapters/node-http/dist/trpc-server-adapters-node-http.esm.js +4 -3
  23. package/adapters/node-http/index.d.ts +1 -0
  24. package/adapters/node-http/index.js +1 -0
  25. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.dev.js +5 -4
  26. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.prod.js +5 -4
  27. package/adapters/standalone/dist/trpc-server-adapters-standalone.esm.js +5 -4
  28. package/adapters/standalone/index.d.ts +1 -0
  29. package/adapters/standalone/index.js +1 -0
  30. package/adapters/ws/dist/trpc-server-adapters-ws.cjs.dev.js +6 -5
  31. package/adapters/ws/dist/trpc-server-adapters-ws.cjs.prod.js +6 -5
  32. package/adapters/ws/dist/trpc-server-adapters-ws.esm.js +6 -5
  33. package/adapters/ws/index.d.ts +1 -0
  34. package/adapters/ws/index.js +1 -0
  35. package/dist/TRPCError-7971540a.mjs +65 -0
  36. package/dist/TRPCError-ddec3395.js +69 -0
  37. package/dist/TRPCError.d.ts +11 -0
  38. package/dist/TRPCError.d.ts.map +1 -0
  39. package/dist/{declarations/src/adapters → adapters}/express.d.ts +5 -5
  40. package/dist/adapters/express.d.ts.map +1 -0
  41. package/dist/adapters/express.js +23 -0
  42. package/dist/adapters/express.mjs +19 -0
  43. package/dist/adapters/express.ts.js +1 -0
  44. package/dist/adapters/fastify/fastifyRequestHandler.d.ts +13 -0
  45. package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -0
  46. package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts +12 -0
  47. package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts.map +1 -0
  48. package/dist/adapters/fastify/index.d.ts +3 -0
  49. package/dist/adapters/fastify/index.d.ts.map +1 -0
  50. package/dist/adapters/fastify/index.js +108 -0
  51. package/dist/adapters/fastify/index.mjs +103 -0
  52. package/dist/adapters/fastify/index.ts.js +1 -0
  53. package/dist/adapters/fetch/fetchRequestHandler.d.ts +8 -0
  54. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -0
  55. package/dist/adapters/fetch/index.d.ts +3 -0
  56. package/dist/adapters/fetch/index.d.ts.map +1 -0
  57. package/dist/adapters/fetch/index.js +69 -0
  58. package/dist/adapters/fetch/index.mjs +65 -0
  59. package/dist/adapters/fetch/index.ts.js +1 -0
  60. package/dist/adapters/fetch/types.d.ts +21 -0
  61. package/dist/adapters/fetch/types.d.ts.map +1 -0
  62. package/dist/{declarations/src/adapters → adapters}/next.d.ts +5 -5
  63. package/dist/adapters/next.d.ts.map +1 -0
  64. package/dist/adapters/next.js +55 -0
  65. package/dist/adapters/next.mjs +51 -0
  66. package/dist/adapters/next.ts.js +1 -0
  67. package/dist/{declarations/src/adapters → adapters}/node-http/index.d.ts +2 -2
  68. package/dist/adapters/node-http/index.d.ts.map +1 -0
  69. package/dist/adapters/node-http/index.js +13 -0
  70. package/dist/adapters/node-http/index.mjs +5 -0
  71. package/dist/adapters/node-http/index.ts.js +1 -0
  72. package/dist/{declarations/src/adapters → adapters}/node-http/internals/getPostBody.d.ts +12 -12
  73. package/dist/adapters/node-http/internals/getPostBody.d.ts.map +1 -0
  74. package/dist/{declarations/src/adapters → adapters}/node-http/nodeHTTPRequestHandler.d.ts +9 -9
  75. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -0
  76. package/dist/{declarations/src/adapters → adapters}/node-http/types.d.ts +31 -32
  77. package/dist/adapters/node-http/types.d.ts.map +1 -0
  78. package/dist/{declarations/src/adapters → adapters}/standalone.d.ts +13 -13
  79. package/dist/adapters/standalone.d.ts.map +1 -0
  80. package/dist/adapters/standalone.js +49 -0
  81. package/dist/adapters/standalone.mjs +40 -0
  82. package/dist/adapters/standalone.ts.js +1 -0
  83. package/dist/{declarations/src/adapters → adapters}/ws.d.ts +16 -16
  84. package/dist/adapters/ws.d.ts.map +1 -0
  85. package/dist/adapters/ws.js +384 -0
  86. package/dist/adapters/ws.mjs +380 -0
  87. package/dist/adapters/ws.ts.js +1 -0
  88. package/dist/{declarations/src/assertNotBrowser.d.ts → assertNotBrowser.d.ts} +1 -1
  89. package/dist/assertNotBrowser.d.ts.map +1 -0
  90. package/dist/{codes-e0df67c4.cjs.prod.js → envelopes-1deb2fa7.mjs} +19 -5
  91. package/dist/{codes-33cef953.cjs.dev.js → envelopes-a953b930.js} +18 -0
  92. package/dist/{declarations/src/http → http}/ResponseMeta.d.ts +4 -4
  93. package/dist/http/ResponseMeta.d.ts.map +1 -0
  94. package/dist/{declarations/src/http → http}/index.d.ts +2 -2
  95. package/dist/http/index.d.ts.map +1 -0
  96. package/dist/{declarations/src/http → http}/internals/getHTTPStatusCode.d.ts +21 -20
  97. package/dist/http/internals/getHTTPStatusCode.d.ts.map +1 -0
  98. package/dist/{declarations/src/http → http}/internals/types.d.ts +40 -39
  99. package/dist/http/internals/types.d.ts.map +1 -0
  100. package/dist/{declarations/src/http → http}/resolveHTTPResponse.d.ts +12 -12
  101. package/dist/http/resolveHTTPResponse.d.ts.map +1 -0
  102. package/dist/index.d.ts +7 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/{trpc-server.cjs.dev.js → index.js} +81 -107
  105. package/dist/{trpc-server.esm.js → index.mjs} +71 -91
  106. package/dist/index.ts.js +1 -0
  107. package/dist/{declarations/src/internals → internals}/BaseHandlerOptions.d.ts +12 -12
  108. package/dist/internals/BaseHandlerOptions.d.ts.map +1 -0
  109. package/dist/{declarations/src/internals → internals}/OnErrorFunction.d.ts +10 -10
  110. package/dist/internals/OnErrorFunction.d.ts.map +1 -0
  111. package/dist/{declarations/src/internals → internals}/callProcedure.d.ts +9 -9
  112. package/dist/internals/callProcedure.d.ts.map +1 -0
  113. package/dist/{declarations/src/internals → internals}/errors.d.ts +4 -3
  114. package/dist/internals/errors.d.ts.map +1 -0
  115. package/dist/{declarations/src/internals → internals}/invert.d.ts +8 -8
  116. package/dist/internals/invert.d.ts.map +1 -0
  117. package/dist/{declarations/src/internals → internals}/middlewares.d.ts +34 -33
  118. package/dist/internals/middlewares.d.ts.map +1 -0
  119. package/dist/internals/procedure.d.ts +87 -0
  120. package/dist/internals/procedure.d.ts.map +1 -0
  121. package/dist/internals/transformTRPCResponse.d.ts +9 -0
  122. package/dist/internals/transformTRPCResponse.d.ts.map +1 -0
  123. package/dist/nodeHTTPRequestHandler-1cdb6383.mjs +105 -0
  124. package/dist/nodeHTTPRequestHandler-848f07b5.js +107 -0
  125. package/dist/observable/index.d.ts +5 -0
  126. package/dist/observable/index.d.ts.map +1 -0
  127. package/dist/observable/index.js +204 -0
  128. package/dist/observable/index.mjs +195 -0
  129. package/dist/observable/index.ts.js +1 -0
  130. package/dist/observable/internals/identity.d.ts +2 -0
  131. package/dist/observable/internals/identity.d.ts.map +1 -0
  132. package/dist/observable/internals/observableToPromise.d.ts +10 -0
  133. package/dist/observable/internals/observableToPromise.d.ts.map +1 -0
  134. package/dist/observable/internals/pipe.d.ts +4 -0
  135. package/dist/observable/internals/pipe.d.ts.map +1 -0
  136. package/dist/observable/observable.d.ts +5 -0
  137. package/dist/observable/observable.d.ts.map +1 -0
  138. package/dist/observable/operators/index.d.ts +4 -0
  139. package/dist/observable/operators/index.d.ts.map +1 -0
  140. package/dist/observable/operators/map.d.ts +3 -0
  141. package/dist/observable/operators/map.d.ts.map +1 -0
  142. package/dist/observable/operators/share.d.ts +6 -0
  143. package/dist/observable/operators/share.d.ts.map +1 -0
  144. package/dist/observable/operators/tap.d.ts +3 -0
  145. package/dist/observable/operators/tap.d.ts.map +1 -0
  146. package/dist/observable/types.d.ts +29 -0
  147. package/dist/observable/types.d.ts.map +1 -0
  148. package/dist/observable-137ea1bd.mjs +105 -0
  149. package/dist/observable-3aa4d911.js +108 -0
  150. package/dist/{nodeHTTPRequestHandler-2e6cc2d7.esm.js → resolveHTTPResponse-54a79e6c.mjs} +19 -126
  151. package/dist/{nodeHTTPRequestHandler-b7ff366e.cjs.dev.js → resolveHTTPResponse-ec3dccaa.js} +24 -132
  152. package/dist/router.d.ts +173 -0
  153. package/dist/router.d.ts.map +1 -0
  154. package/dist/{declarations/src/rpc → rpc}/codes.d.ts +48 -46
  155. package/dist/rpc/codes.d.ts.map +1 -0
  156. package/dist/rpc/envelopes.d.ts +94 -0
  157. package/dist/rpc/envelopes.d.ts.map +1 -0
  158. package/dist/{declarations/src/rpc → rpc}/index.d.ts +2 -2
  159. package/dist/rpc/index.d.ts.map +1 -0
  160. package/dist/rpc/index.js +14 -0
  161. package/dist/rpc/index.mjs +1 -0
  162. package/dist/rpc/index.ts.js +1 -0
  163. package/dist/subscription.d.ts +9 -0
  164. package/dist/subscription.d.ts.map +1 -0
  165. package/dist/subscription.js +44 -0
  166. package/dist/subscription.mjs +40 -0
  167. package/dist/subscription.ts.js +1 -0
  168. package/dist/transformTRPCResponse-333bed6c.js +56 -0
  169. package/dist/transformTRPCResponse-e0cba527.mjs +53 -0
  170. package/dist/{declarations/src/transformer.d.ts → transformer.d.ts} +29 -29
  171. package/dist/transformer.d.ts.map +1 -0
  172. package/dist/{declarations/src/types.d.ts → types.d.ts} +40 -40
  173. package/dist/types.d.ts.map +1 -0
  174. package/observable/index.d.ts +1 -0
  175. package/observable/index.js +1 -0
  176. package/package.json +82 -26
  177. package/rpc/dist/trpc-server-rpc.cjs.dev.js +1 -1
  178. package/rpc/dist/trpc-server-rpc.cjs.prod.js +1 -1
  179. package/rpc/dist/trpc-server-rpc.esm.js +1 -1
  180. package/rpc/index.d.ts +1 -0
  181. package/rpc/index.js +1 -0
  182. package/src/TRPCError.ts +5 -13
  183. package/src/adapters/express.ts +3 -3
  184. package/src/adapters/fastify/fastifyRequestHandler.ts +77 -0
  185. package/src/adapters/fastify/fastifyTRPCPlugin.ts +56 -0
  186. package/src/adapters/fastify/index.ts +2 -0
  187. package/src/adapters/fetch/fetchRequestHandler.ts +61 -0
  188. package/src/adapters/fetch/index.ts +2 -0
  189. package/src/adapters/fetch/types.ts +28 -0
  190. package/src/adapters/next.ts +9 -7
  191. package/src/adapters/node-http/internals/getPostBody.test.ts +2 -1
  192. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +5 -6
  193. package/src/adapters/node-http/types.ts +4 -5
  194. package/src/adapters/standalone.ts +11 -3
  195. package/src/adapters/ws.ts +122 -81
  196. package/src/assertNotBrowser.ts +1 -0
  197. package/src/http/internals/getHTTPStatusCode.ts +2 -1
  198. package/src/http/internals/types.ts +6 -7
  199. package/src/http/resolveHTTPResponse.ts +23 -27
  200. package/src/index.ts +1 -6
  201. package/src/internals/BaseHandlerOptions.ts +1 -1
  202. package/src/internals/OnErrorFunction.ts +1 -1
  203. package/src/internals/callProcedure.ts +6 -3
  204. package/src/internals/errors.ts +20 -4
  205. package/src/internals/middlewares.ts +3 -2
  206. package/src/internals/procedure.ts +213 -93
  207. package/src/internals/transformTRPCResponse.ts +20 -15
  208. package/src/observable/index.ts +4 -0
  209. package/src/observable/internals/identity.ts +3 -0
  210. package/src/observable/internals/observableToPromise.ts +49 -0
  211. package/src/observable/internals/pipe.ts +22 -0
  212. package/src/observable/observable.test.ts +101 -0
  213. package/src/observable/observable.ts +75 -0
  214. package/src/observable/operators/index.ts +3 -0
  215. package/src/observable/operators/map.test.ts +92 -0
  216. package/src/observable/operators/map.ts +25 -0
  217. package/src/observable/operators/share.test.ts +60 -0
  218. package/src/observable/operators/share.ts +67 -0
  219. package/src/observable/operators/tap.ts +26 -0
  220. package/src/observable/types.ts +69 -0
  221. package/src/router.ts +171 -82
  222. package/src/rpc/codes.ts +1 -0
  223. package/src/rpc/envelopes.ts +87 -68
  224. package/src/subscription.ts +6 -124
  225. package/src/types.ts +7 -9
  226. package/adapters/express/package.json +0 -4
  227. package/adapters/next/package.json +0 -4
  228. package/adapters/node-http/package.json +0 -4
  229. package/adapters/standalone/package.json +0 -4
  230. package/adapters/ws/package.json +0 -4
  231. package/dist/codes-fe07bf82.esm.js +0 -56
  232. package/dist/declarations/src/TRPCError.d.ts +0 -19
  233. package/dist/declarations/src/TRPCError.d.ts.map +0 -1
  234. package/dist/declarations/src/adapters/express.d.ts.map +0 -1
  235. package/dist/declarations/src/adapters/next.d.ts.map +0 -1
  236. package/dist/declarations/src/adapters/node-http/index.d.ts.map +0 -1
  237. package/dist/declarations/src/adapters/node-http/internals/getPostBody.d.ts.map +0 -1
  238. package/dist/declarations/src/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +0 -1
  239. package/dist/declarations/src/adapters/node-http/types.d.ts.map +0 -1
  240. package/dist/declarations/src/adapters/standalone.d.ts.map +0 -1
  241. package/dist/declarations/src/adapters/ws.d.ts.map +0 -1
  242. package/dist/declarations/src/assertNotBrowser.d.ts.map +0 -1
  243. package/dist/declarations/src/deprecated/LegacyRouter.d.ts +0 -3
  244. package/dist/declarations/src/deprecated/LegacyRouter.d.ts.map +0 -1
  245. package/dist/declarations/src/deprecated/createHttpServer.d.ts +0 -19
  246. package/dist/declarations/src/deprecated/createHttpServer.d.ts.map +0 -1
  247. package/dist/declarations/src/deprecated/requestHandler.d.ts +0 -15
  248. package/dist/declarations/src/deprecated/requestHandler.d.ts.map +0 -1
  249. package/dist/declarations/src/http/ResponseMeta.d.ts.map +0 -1
  250. package/dist/declarations/src/http/index.d.ts.map +0 -1
  251. package/dist/declarations/src/http/internals/getHTTPStatusCode.d.ts.map +0 -1
  252. package/dist/declarations/src/http/internals/types.d.ts.map +0 -1
  253. package/dist/declarations/src/http/resolveHTTPResponse.d.ts.map +0 -1
  254. package/dist/declarations/src/index.d.ts +0 -10
  255. package/dist/declarations/src/index.d.ts.map +0 -1
  256. package/dist/declarations/src/internals/BaseHandlerOptions.d.ts.map +0 -1
  257. package/dist/declarations/src/internals/OnErrorFunction.d.ts.map +0 -1
  258. package/dist/declarations/src/internals/callProcedure.d.ts.map +0 -1
  259. package/dist/declarations/src/internals/errors.d.ts.map +0 -1
  260. package/dist/declarations/src/internals/invert.d.ts.map +0 -1
  261. package/dist/declarations/src/internals/middlewares.d.ts.map +0 -1
  262. package/dist/declarations/src/internals/procedure.d.ts +0 -74
  263. package/dist/declarations/src/internals/procedure.d.ts.map +0 -1
  264. package/dist/declarations/src/internals/transformTRPCResponse.d.ts +0 -7
  265. package/dist/declarations/src/internals/transformTRPCResponse.d.ts.map +0 -1
  266. package/dist/declarations/src/internals/wrapCallSafe.d.ts +0 -16
  267. package/dist/declarations/src/internals/wrapCallSafe.d.ts.map +0 -1
  268. package/dist/declarations/src/router.d.ts +0 -176
  269. package/dist/declarations/src/router.d.ts.map +0 -1
  270. package/dist/declarations/src/rpc/codes.d.ts.map +0 -1
  271. package/dist/declarations/src/rpc/envelopes.d.ts +0 -72
  272. package/dist/declarations/src/rpc/envelopes.d.ts.map +0 -1
  273. package/dist/declarations/src/rpc/index.d.ts.map +0 -1
  274. package/dist/declarations/src/subscription.d.ts +0 -58
  275. package/dist/declarations/src/subscription.d.ts.map +0 -1
  276. package/dist/declarations/src/transformer.d.ts.map +0 -1
  277. package/dist/declarations/src/types.d.ts.map +0 -1
  278. package/dist/declarations/src/ws/index.d.ts +0 -7
  279. package/dist/declarations/src/ws/index.d.ts.map +0 -1
  280. package/dist/nodeHTTPRequestHandler-7325b53f.cjs.prod.js +0 -399
  281. package/dist/subscription-b8831081.cjs.dev.js +0 -136
  282. package/dist/subscription-c2e0bfbc.cjs.prod.js +0 -136
  283. package/dist/subscription-fbda2888.esm.js +0 -133
  284. package/dist/transformTRPCResponse-8248515e.cjs.dev.js +0 -114
  285. package/dist/transformTRPCResponse-dcbf66c5.cjs.prod.js +0 -114
  286. package/dist/transformTRPCResponse-f73dc4a2.esm.js +0 -109
  287. package/dist/trpc-server.cjs.d.ts +0 -1
  288. package/dist/trpc-server.cjs.js +0 -7
  289. package/dist/trpc-server.cjs.prod.js +0 -528
  290. package/rpc/package.json +0 -4
  291. package/src/deprecated/LegacyRouter.ts +0 -3
  292. package/src/deprecated/createHttpServer.ts +0 -29
  293. package/src/deprecated/requestHandler.ts +0 -26
  294. package/src/internals/wrapCallSafe.ts +0 -19
  295. package/src/ws/index.ts +0 -8
  296. package/ws/dist/trpc-server-ws.cjs.d.ts +0 -1
  297. package/ws/dist/trpc-server-ws.cjs.dev.js +0 -15
  298. package/ws/dist/trpc-server-ws.cjs.js +0 -7
  299. package/ws/dist/trpc-server-ws.cjs.prod.js +0 -15
  300. package/ws/dist/trpc-server-ws.esm.js +0 -11
  301. package/ws/package.json +0 -4
@@ -1,19 +1,19 @@
1
- import http from 'http';
1
+ import { IncomingMessage } from 'http';
2
2
  import ws from 'ws';
3
+ import { TRPCError } from '../TRPCError';
3
4
  import { BaseHandlerOptions } from '../internals/BaseHandlerOptions';
4
5
  import { callProcedure } from '../internals/callProcedure';
5
- import { getErrorFromUnknown } from '../internals/errors';
6
+ import { getCauseFromUnknown, getErrorFromUnknown } from '../internals/errors';
6
7
  import { transformTRPCResponse } from '../internals/transformTRPCResponse';
7
- import { AnyRouter, inferRouterContext, ProcedureType } from '../router';
8
+ import { Unsubscribable, isObservable } from '../observable';
9
+ import { AnyRouter, ProcedureType, inferRouterContext } from '../router';
8
10
  import {
9
- TRPCErrorResponse,
11
+ JSONRPC2,
12
+ TRPCClientOutgoingMessage,
10
13
  TRPCReconnectNotification,
11
- TRPCRequest,
12
- TRPCResponse,
14
+ TRPCResponseMessage,
13
15
  } from '../rpc';
14
- import { Subscription } from '../subscription';
15
16
  import { CombinedDataTransformer } from '../transformer';
16
- import { TRPCError } from '../TRPCError';
17
17
  import { NodeHTTPCreateContextOption } from './node-http';
18
18
 
19
19
  /* istanbul ignore next */
@@ -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
  /**
@@ -84,11 +92,11 @@ function parseMessage(
84
92
  */
85
93
  export type WSSHandlerOptions<TRouter extends AnyRouter> = BaseHandlerOptions<
86
94
  TRouter,
87
- http.IncomingMessage
95
+ IncomingMessage
88
96
  > & {
89
97
  wss: ws.Server;
90
98
  process?: NodeJS.Process;
91
- } & NodeHTTPCreateContextOption<TRouter, http.IncomingMessage, ws>;
99
+ } & NodeHTTPCreateContextOption<TRouter, IncomingMessage, ws>;
92
100
 
93
101
  export function applyWSSHandler<TRouter extends AnyRouter>(
94
102
  opts: WSSHandlerOptions<TRouter>,
@@ -96,22 +104,35 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
96
104
  const { wss, createContext, router } = opts;
97
105
 
98
106
  const { transformer } = router._def;
99
- wss.on('connection', (client, req) => {
100
- const clientSubscriptions = new Map<
101
- number | string,
102
- Subscription<TRouter>
103
- >();
107
+ wss.on('connection', async (client, req) => {
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,86 +180,98 @@ 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) => {
225
264
  try {
226
265
  const msgJSON: unknown = JSON.parse(message.toString());
227
266
  const msgs: unknown[] = Array.isArray(msgJSON) ? msgJSON : [msgJSON];
228
- msgs.map((raw) => parseMessage(raw, transformer)).map(handleRequest);
267
+ const promises = msgs
268
+ .map((raw) => parseMessage(raw, transformer))
269
+ .map(handleRequest);
270
+ await Promise.all(promises);
229
271
  } catch (cause) {
230
272
  const error = new TRPCError({
231
273
  code: 'PARSE_ERROR',
232
- cause,
274
+ cause: getCauseFromUnknown(cause),
233
275
  });
234
276
 
235
277
  respond({
@@ -247,7 +289,7 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
247
289
 
248
290
  client.once('close', () => {
249
291
  for (const sub of clientSubscriptions.values()) {
250
- sub.destroy();
292
+ sub.unsubscribe();
251
293
  }
252
294
  clientSubscriptions.clear();
253
295
  });
@@ -256,7 +298,15 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
256
298
  ctx = await ctxPromise;
257
299
  } catch (cause) {
258
300
  const error = getErrorFromUnknown(cause);
259
- const json: TRPCErrorResponse = {
301
+ opts.onError?.({
302
+ error,
303
+ path: undefined,
304
+ type: 'unknown',
305
+ ctx,
306
+ req,
307
+ input: undefined,
308
+ });
309
+ respond({
260
310
  id: null,
261
311
  error: router.getErrorShape({
262
312
  error,
@@ -265,16 +315,7 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
265
315
  input: undefined,
266
316
  ctx,
267
317
  }),
268
- };
269
- opts.onError?.({
270
- error,
271
- path: undefined,
272
- type: 'unknown',
273
- ctx,
274
- req,
275
- input: undefined,
276
318
  });
277
- respond(json);
278
319
 
279
320
  // close in next tick
280
321
  (global.setImmediate ?? global.setTimeout)(() => {
@@ -282,7 +323,7 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
282
323
  });
283
324
  }
284
325
  }
285
- createContextAsync();
326
+ await createContextAsync();
286
327
  });
287
328
 
288
329
  return {
@@ -3,6 +3,7 @@
3
3
  export function assertNotBrowser() {
4
4
  if (
5
5
  typeof window !== 'undefined' &&
6
+ !('Deno' in window) &&
6
7
  process.env.NODE_ENV !== 'test' &&
7
8
  process.env.JEST_WORKER_ID === undefined
8
9
  ) {
@@ -1,6 +1,6 @@
1
- import { TRPCResponse, TRPC_ERROR_CODES_BY_KEY } from '../../rpc';
2
1
  import { TRPCError } from '../../TRPCError';
3
2
  import { invert } from '../../internals/invert';
3
+ import { TRPCResponse, TRPC_ERROR_CODES_BY_KEY } from '../../rpc';
4
4
 
5
5
  export const TRPC_ERROR_CODES_BY_NUMBER = invert(TRPC_ERROR_CODES_BY_KEY);
6
6
  type ValueOf<T> = T[keyof T];
@@ -17,6 +17,7 @@ const JSONRPC2_TO_HTTP_CODE: Record<
17
17
  UNAUTHORIZED: 401,
18
18
  FORBIDDEN: 403,
19
19
  TIMEOUT: 408,
20
+ CONFLICT: 409,
20
21
  CLIENT_CLOSED_REQUEST: 499,
21
22
  PRECONDITION_FAILED: 412,
22
23
  PAYLOAD_TOO_LARGE: 413,
@@ -1,15 +1,14 @@
1
+ import { TRPCError } from '../../TRPCError';
2
+ import { BaseHandlerOptions } from '../../internals/BaseHandlerOptions';
1
3
  import {
2
4
  AnyRouter,
3
- Dict,
5
+ ProcedureType,
4
6
  inferRouterContext,
5
7
  inferRouterError,
6
- ProcedureType,
7
- ResponseMeta,
8
- TRPCError,
9
- } from '@trpc/server';
10
- import { URLSearchParams } from 'url';
11
- import { BaseHandlerOptions } from '../../internals/BaseHandlerOptions';
8
+ } from '../../router';
12
9
  import { TRPCResponse } from '../../rpc';
10
+ import { Dict } from '../../types';
11
+ import { ResponseMeta } from '../ResponseMeta';
13
12
 
14
13
  export type HTTPHeaders = Dict<string | string[]>;
15
14
 
@@ -1,22 +1,22 @@
1
1
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
- import { Maybe } from '@trpc/server';
2
+ import { TRPCError } from '../TRPCError';
3
3
  import { callProcedure } from '../internals/callProcedure';
4
- import { getErrorFromUnknown } from '../internals/errors';
4
+ import { getCauseFromUnknown, getErrorFromUnknown } from '../internals/errors';
5
5
  import { transformTRPCResponse } from '../internals/transformTRPCResponse';
6
6
  import {
7
7
  AnyRouter,
8
+ ProcedureType,
8
9
  inferRouterContext,
9
10
  inferRouterError,
10
- ProcedureType,
11
11
  } from '../router';
12
- import { TRPCErrorResponse, TRPCResponse, TRPCResultResponse } from '../rpc';
13
- import { TRPCError } from '../TRPCError';
12
+ import { TRPCResponse } from '../rpc';
13
+ import { Maybe } from '../types';
14
14
  import { getHTTPStatusCode } from './internals/getHTTPStatusCode';
15
15
  import {
16
+ HTTPBaseHandlerOptions,
16
17
  HTTPHeaders,
17
18
  HTTPRequest,
18
19
  HTTPResponse,
19
- HTTPBaseHandlerOptions,
20
20
  } from './internals/types';
21
21
 
22
22
  const HTTP_METHOD_PROCEDURE_TYPE_MAP: Record<
@@ -37,10 +37,10 @@ function getRawProcedureInputOrThrow(req: HTTPRequest) {
37
37
  return JSON.parse(raw!);
38
38
  }
39
39
  return typeof req.body === 'string' ? JSON.parse(req.body) : req.body;
40
- } catch (cause) {
40
+ } catch (err) {
41
41
  throw new TRPCError({
42
42
  code: 'PARSE_ERROR',
43
- cause,
43
+ cause: getCauseFromUnknown(err),
44
44
  });
45
45
  }
46
46
  }
@@ -196,12 +196,11 @@ export async function resolveHTTPResponse<
196
196
  }),
197
197
  );
198
198
  const errors = rawResults.flatMap((obj) => (obj.error ? [obj.error] : []));
199
- const resultEnvelopes = rawResults.map((obj) => {
199
+ const resultEnvelopes = rawResults.map((obj): TRouterResponse => {
200
200
  const { path, input } = obj;
201
201
 
202
202
  if (obj.error) {
203
- const json: TRPCErrorResponse<TRouterError> = {
204
- id: null,
203
+ return {
205
204
  error: router.getErrorShape({
206
205
  error: obj.error,
207
206
  type,
@@ -210,16 +209,12 @@ export async function resolveHTTPResponse<
210
209
  ctx,
211
210
  }),
212
211
  };
213
- return json;
214
212
  } else {
215
- const json: TRPCResultResponse<unknown> = {
216
- id: null,
213
+ return {
217
214
  result: {
218
- type: 'data',
219
215
  data: obj.data,
220
216
  },
221
217
  };
222
- return json;
223
218
  }
224
219
  });
225
220
 
@@ -233,16 +228,6 @@ export async function resolveHTTPResponse<
233
228
  // - input deserialization fails
234
229
  const error = getErrorFromUnknown(cause);
235
230
 
236
- const json: TRPCErrorResponse<TRouterError> = {
237
- id: null,
238
- error: router.getErrorShape({
239
- error,
240
- type,
241
- path: undefined,
242
- input: undefined,
243
- ctx,
244
- }),
245
- };
246
231
  onError?.({
247
232
  error,
248
233
  path: undefined,
@@ -251,6 +236,17 @@ export async function resolveHTTPResponse<
251
236
  type: type,
252
237
  req,
253
238
  });
254
- return endResponse(json, [error]);
239
+ return endResponse(
240
+ {
241
+ error: router.getErrorShape({
242
+ error,
243
+ type,
244
+ path: undefined,
245
+ input: undefined,
246
+ ctx,
247
+ }),
248
+ },
249
+ [error],
250
+ );
255
251
  }
256
252
  }
package/src/index.ts CHANGED
@@ -1,11 +1,6 @@
1
1
  export * from './assertNotBrowser';
2
2
  export * from './http';
3
- export * from './subscription';
4
3
  export * from './transformer';
5
4
  export * from './TRPCError';
6
5
  export * from './types';
7
-
8
- // deprecated
9
- export * from './deprecated/createHttpServer';
10
- export * from './deprecated/requestHandler';
11
- export * from './deprecated/LegacyRouter';
6
+ export * from './router';
@@ -1,5 +1,5 @@
1
- import { OnErrorFunction } from './OnErrorFunction';
2
1
  import { AnyRouter } from '../router';
2
+ import { OnErrorFunction } from './OnErrorFunction';
3
3
 
4
4
  /**
5
5
  * Base interface for any response handler
@@ -1,5 +1,5 @@
1
- import { AnyRouter, inferRouterContext, ProcedureType } from '../router';
2
1
  import { TRPCError } from '../TRPCError';
2
+ import { AnyRouter, ProcedureType, inferRouterContext } from '../router';
3
3
 
4
4
  export type OnErrorFunction<TRouter extends AnyRouter, TRequest> = (opts: {
5
5
  error: TRPCError;
@@ -1,5 +1,5 @@
1
+ import { Observable } from '../observable';
1
2
  import { AnyRouter, ProcedureType } from '../router';
2
- import { Subscription } from '../subscription';
3
3
 
4
4
  export async function callProcedure<
5
5
  TRouter extends AnyRouter<TContext>,
@@ -10,7 +10,7 @@ export async function callProcedure<
10
10
  router: TRouter;
11
11
  ctx: TContext;
12
12
  type: ProcedureType;
13
- }): Promise<unknown | Subscription<TRouter>> {
13
+ }): Promise<unknown | Observable<TRouter, any>> {
14
14
  const { type, path, input } = opts;
15
15
 
16
16
  const caller = opts.router.createCaller(opts.ctx);
@@ -21,7 +21,10 @@ export async function callProcedure<
21
21
  return caller.mutation(path, input as any);
22
22
  }
23
23
  if (type === 'subscription') {
24
- const sub = (await caller.subscription(path, input as any)) as Subscription;
24
+ const sub = (await caller.subscription(path, input as any)) as Observable<
25
+ any,
26
+ any
27
+ >;
25
28
  return sub;
26
29
  }
27
30
  /* istanbul ignore next */
@@ -20,14 +20,30 @@ export function getErrorFromUnknown(cause: unknown): TRPCError {
20
20
  if (cause instanceof Error && cause.name === 'TRPCError') {
21
21
  return cause as TRPCError;
22
22
  }
23
+
24
+ let errorCause: Error | undefined = undefined;
25
+ let stack: string | undefined = undefined;
26
+
27
+ if (cause instanceof Error) {
28
+ errorCause = cause;
29
+ // take stack trace from cause
30
+ stack = cause.stack;
31
+ }
32
+
23
33
  const err = new TRPCError({
24
34
  code: 'INTERNAL_SERVER_ERROR',
25
- cause,
35
+ cause: errorCause,
26
36
  });
27
37
 
28
- // take stack trace from cause
38
+ err.stack = stack;
39
+
40
+ return err;
41
+ }
42
+
43
+ export function getCauseFromUnknown(cause: unknown) {
29
44
  if (cause instanceof Error) {
30
- err.stack = cause.stack;
45
+ return cause;
31
46
  }
32
- return err;
47
+
48
+ return undefined;
33
49
  }
@@ -1,5 +1,5 @@
1
- import { ProcedureType } from '../router';
2
1
  import { TRPCError } from '../TRPCError';
2
+ import { ProcedureType } from '../router';
3
3
 
4
4
  export const middlewareMarker = Symbol('middlewareMarker');
5
5
  interface MiddlewareResultBase<TContext> {
@@ -27,11 +27,12 @@ export type MiddlewareResult<TContext> =
27
27
  | MiddlewareOKResult<TContext>
28
28
  | MiddlewareErrorResult<TContext>;
29
29
 
30
- export type MiddlewareFunction<TInputContext, TContext> = (opts: {
30
+ export type MiddlewareFunction<TInputContext, TContext, TMeta> = (opts: {
31
31
  ctx: TInputContext;
32
32
  type: ProcedureType;
33
33
  path: string;
34
34
  rawInput: unknown;
35
+ meta?: TMeta;
35
36
  next: {
36
37
  (): Promise<MiddlewareResult<TInputContext>>;
37
38
  <T>(opts: { ctx: T }): Promise<MiddlewareResult<T>>;