@trpc/server 10.0.0-alpha.4 → 10.0.0-alpha.40

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 (340) hide show
  1. package/README.md +79 -1
  2. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.d.ts +1 -0
  3. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.dev.js +190 -0
  4. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.js +7 -0
  5. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.prod.js +190 -0
  6. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.esm.js +186 -0
  7. package/adapters/aws-lambda/index.d.ts +1 -0
  8. package/adapters/aws-lambda/index.js +1 -0
  9. package/adapters/express/dist/trpc-server-adapters-express.cjs.dev.js +7 -6
  10. package/adapters/express/dist/trpc-server-adapters-express.cjs.prod.js +7 -6
  11. package/adapters/express/dist/trpc-server-adapters-express.esm.js +7 -6
  12. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.d.ts +1 -0
  13. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.dev.js +109 -0
  14. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.js +7 -0
  15. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.prod.js +109 -0
  16. package/adapters/fastify/dist/trpc-server-adapters-fastify.esm.js +104 -0
  17. package/adapters/fastify/index.d.ts +1 -0
  18. package/adapters/fastify/index.js +1 -0
  19. package/adapters/fetch/index.d.ts +1 -0
  20. package/adapters/fetch/index.js +1 -0
  21. package/adapters/lambda/dist/trpc-server-adapters-lambda.cjs.d.ts +1 -0
  22. package/adapters/lambda/dist/trpc-server-adapters-lambda.cjs.dev.js +25 -0
  23. package/adapters/lambda/dist/trpc-server-adapters-lambda.cjs.js +7 -0
  24. package/adapters/lambda/dist/trpc-server-adapters-lambda.cjs.prod.js +25 -0
  25. package/adapters/lambda/dist/trpc-server-adapters-lambda.esm.js +21 -0
  26. package/adapters/next/dist/trpc-server-adapters-next.cjs.dev.js +4 -3
  27. package/adapters/next/dist/trpc-server-adapters-next.cjs.prod.js +4 -3
  28. package/adapters/next/dist/trpc-server-adapters-next.esm.js +4 -3
  29. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.dev.js +4 -3
  30. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.prod.js +4 -3
  31. package/adapters/node-http/dist/trpc-server-adapters-node-http.esm.js +4 -3
  32. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.dev.js +5 -4
  33. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.prod.js +5 -4
  34. package/adapters/standalone/dist/trpc-server-adapters-standalone.esm.js +5 -4
  35. package/adapters/ws/dist/trpc-server-adapters-ws.cjs.dev.js +6 -5
  36. package/adapters/ws/dist/trpc-server-adapters-ws.cjs.prod.js +6 -5
  37. package/adapters/ws/dist/trpc-server-adapters-ws.esm.js +6 -5
  38. package/dist/TRPCError-9050a68d.js +69 -0
  39. package/dist/TRPCError-b7fa0c31.mjs +65 -0
  40. package/dist/adapters/aws-lambda/index.d.ts +14 -0
  41. package/dist/adapters/aws-lambda/index.d.ts.map +1 -0
  42. package/dist/adapters/aws-lambda/utils.d.ts +35 -0
  43. package/dist/adapters/aws-lambda/utils.d.ts.map +1 -0
  44. package/dist/adapters/express.d.ts +1 -1
  45. package/dist/adapters/express.d.ts.map +1 -1
  46. package/dist/adapters/express.js +8 -7
  47. package/dist/adapters/express.mjs +8 -7
  48. package/dist/adapters/fastify/fastifyRequestHandler.d.ts +13 -0
  49. package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -0
  50. package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts +12 -0
  51. package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts.map +1 -0
  52. package/dist/adapters/fastify/index.d.ts +3 -0
  53. package/dist/adapters/fastify/index.d.ts.map +1 -0
  54. package/dist/adapters/fastify/index.js +108 -0
  55. package/dist/adapters/fastify/index.mjs +103 -0
  56. package/dist/{ws → adapters/fastify}/index.ts.js +0 -0
  57. package/dist/adapters/fetch/fetchRequestHandler.d.ts +8 -0
  58. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -0
  59. package/dist/adapters/fetch/index.d.ts +3 -0
  60. package/dist/adapters/fetch/index.d.ts.map +1 -0
  61. package/dist/adapters/fetch/index.js +69 -0
  62. package/dist/adapters/fetch/index.mjs +65 -0
  63. package/dist/adapters/fetch/index.ts.js +1 -0
  64. package/dist/adapters/fetch/types.d.ts +21 -0
  65. package/dist/adapters/fetch/types.d.ts.map +1 -0
  66. package/dist/adapters/lambda/index.d.ts +12 -0
  67. package/dist/adapters/lambda/index.d.ts.map +1 -0
  68. package/dist/adapters/next.d.ts +2 -2
  69. package/dist/adapters/next.d.ts.map +1 -1
  70. package/dist/adapters/next.js +9 -9
  71. package/dist/adapters/next.mjs +8 -8
  72. package/dist/adapters/node-http/index.js +5 -4
  73. package/dist/adapters/node-http/index.mjs +5 -4
  74. package/dist/adapters/node-http/internals/getPostBody.d.ts +1 -1
  75. package/dist/adapters/node-http/internals/getPostBody.d.ts.map +1 -1
  76. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts +2 -2
  77. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
  78. package/dist/adapters/node-http/types.d.ts +11 -9
  79. package/dist/adapters/node-http/types.d.ts.map +1 -1
  80. package/dist/adapters/standalone.d.ts +2 -2
  81. package/dist/adapters/standalone.d.ts.map +1 -1
  82. package/dist/adapters/standalone.js +11 -7
  83. package/dist/adapters/standalone.mjs +11 -6
  84. package/dist/adapters/ws.d.ts +8 -6
  85. package/dist/adapters/ws.d.ts.map +1 -1
  86. package/dist/adapters/ws.js +123 -90
  87. package/dist/adapters/ws.mjs +118 -85
  88. package/dist/assertNotBrowser.d.ts.map +1 -1
  89. package/dist/core/index.d.ts +6 -0
  90. package/dist/core/index.d.ts.map +1 -0
  91. package/dist/core/initTRPC.d.ts +87 -0
  92. package/dist/core/initTRPC.d.ts.map +1 -0
  93. package/dist/core/internals/__generated__/mergeRoutersGeneric.d.ts +282 -0
  94. package/dist/core/internals/__generated__/mergeRoutersGeneric.d.ts.map +1 -0
  95. package/dist/core/internals/config.d.ts +36 -0
  96. package/dist/core/internals/config.d.ts.map +1 -0
  97. package/dist/core/internals/getParseFn.d.ts +9 -0
  98. package/dist/core/internals/getParseFn.d.ts.map +1 -0
  99. package/dist/core/internals/mergeRouters.d.ts +3 -0
  100. package/dist/core/internals/mergeRouters.d.ts.map +1 -0
  101. package/dist/core/internals/mergeWithoutOverrides.d.ts +5 -0
  102. package/dist/core/internals/mergeWithoutOverrides.d.ts.map +1 -0
  103. package/dist/core/internals/omitPrototype.d.ts +6 -0
  104. package/dist/core/internals/omitPrototype.d.ts.map +1 -0
  105. package/dist/core/internals/prefixObjectKeys.d.ts +2 -0
  106. package/dist/core/internals/prefixObjectKeys.d.ts.map +1 -0
  107. package/dist/core/internals/procedureBuilder.d.ts +127 -0
  108. package/dist/core/internals/procedureBuilder.d.ts.map +1 -0
  109. package/dist/core/internals/utils.d.ts +44 -0
  110. package/dist/core/internals/utils.d.ts.map +1 -0
  111. package/dist/core/middleware.d.ts +87 -0
  112. package/dist/core/middleware.d.ts.map +1 -0
  113. package/dist/core/parser.d.ts +25 -0
  114. package/dist/core/parser.d.ts.map +1 -0
  115. package/dist/core/procedure.d.ts +84 -0
  116. package/dist/core/procedure.d.ts.map +1 -0
  117. package/dist/core/router.d.ts +128 -0
  118. package/dist/core/router.d.ts.map +1 -0
  119. package/dist/core/types.d.ts +19 -0
  120. package/dist/core/types.d.ts.map +1 -0
  121. package/dist/{internals → deprecated/internals}/callProcedure.d.ts +5 -2
  122. package/dist/deprecated/internals/callProcedure.d.ts.map +1 -0
  123. package/dist/{internals → deprecated/internals}/middlewares.d.ts +21 -3
  124. package/dist/deprecated/internals/middlewares.d.ts.map +1 -0
  125. package/dist/deprecated/internals/procedure.d.ts +96 -0
  126. package/dist/deprecated/internals/procedure.d.ts.map +1 -0
  127. package/dist/deprecated/interop.d.ts +34 -0
  128. package/dist/deprecated/interop.d.ts.map +1 -0
  129. package/dist/deprecated/router.d.ts +194 -0
  130. package/dist/deprecated/router.d.ts.map +1 -0
  131. package/dist/{codes-7a3d4f65.mjs → envelopes-af8c2959.mjs} +30 -1
  132. package/dist/{codes-7f46544e.js → envelopes-b6dd0367.js} +29 -1
  133. package/dist/error/TRPCError.d.ts +11 -0
  134. package/dist/error/TRPCError.d.ts.map +1 -0
  135. package/dist/error/formatter.d.ts +33 -0
  136. package/dist/error/formatter.d.ts.map +1 -0
  137. package/dist/{internals/errors.d.ts → error/utils.d.ts} +3 -2
  138. package/dist/error/utils.d.ts.map +1 -0
  139. package/dist/http/index.d.ts +1 -1
  140. package/dist/http/index.d.ts.map +1 -1
  141. package/dist/http/internals/getHTTPStatusCode.d.ts +2 -1
  142. package/dist/http/internals/getHTTPStatusCode.d.ts.map +1 -1
  143. package/dist/http/internals/types.d.ts +11 -8
  144. package/dist/http/internals/types.d.ts.map +1 -1
  145. package/dist/http/resolveHTTPResponse.d.ts +4 -4
  146. package/dist/http/resolveHTTPResponse.d.ts.map +1 -1
  147. package/dist/http/{ResponseMeta.d.ts → types.d.ts} +1 -1
  148. package/dist/http/types.d.ts.map +1 -0
  149. package/dist/index-1a25ccbd.js +33 -0
  150. package/dist/index-a3bd54c7.mjs +31 -0
  151. package/dist/index.d.ts +4 -5
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +798 -108
  154. package/dist/index.mjs +785 -93
  155. package/dist/internals/transformTRPCResponse.d.ts +5 -3
  156. package/dist/internals/transformTRPCResponse.d.ts.map +1 -1
  157. package/dist/internals/types.d.ts +23 -0
  158. package/dist/internals/types.d.ts.map +1 -0
  159. package/dist/internals.d.ts +11 -0
  160. package/dist/internals.d.ts.map +1 -0
  161. package/dist/nodeHTTPRequestHandler-174459c5.mjs +105 -0
  162. package/dist/nodeHTTPRequestHandler-6b7c8622.js +107 -0
  163. package/dist/observable/index.d.ts +5 -0
  164. package/dist/observable/index.d.ts.map +1 -0
  165. package/dist/observable/index.js +204 -0
  166. package/dist/observable/index.mjs +195 -0
  167. package/dist/observable/index.ts.js +1 -0
  168. package/dist/observable/internals/identity.d.ts +2 -0
  169. package/dist/observable/internals/identity.d.ts.map +1 -0
  170. package/dist/observable/internals/observableToPromise.d.ts +10 -0
  171. package/dist/observable/internals/observableToPromise.d.ts.map +1 -0
  172. package/dist/observable/internals/pipe.d.ts +4 -0
  173. package/dist/observable/internals/pipe.d.ts.map +1 -0
  174. package/dist/observable/observable.d.ts +5 -0
  175. package/dist/observable/observable.d.ts.map +1 -0
  176. package/dist/observable/operators/index.d.ts +4 -0
  177. package/dist/observable/operators/index.d.ts.map +1 -0
  178. package/dist/observable/operators/map.d.ts +3 -0
  179. package/dist/observable/operators/map.d.ts.map +1 -0
  180. package/dist/observable/operators/share.d.ts +6 -0
  181. package/dist/observable/operators/share.d.ts.map +1 -0
  182. package/dist/observable/operators/tap.d.ts +3 -0
  183. package/dist/observable/operators/tap.d.ts.map +1 -0
  184. package/dist/observable/types.d.ts +29 -0
  185. package/dist/observable/types.d.ts.map +1 -0
  186. package/dist/observable-341a0506.js +109 -0
  187. package/dist/observable-cfedfa30.mjs +106 -0
  188. package/dist/{nodeHTTPRequestHandler-10e6d2f9.mjs → resolveHTTPResponse-8657b8de.mjs} +32 -133
  189. package/dist/{nodeHTTPRequestHandler-d7c307d3.js → resolveHTTPResponse-fcc8f644.js} +37 -139
  190. package/dist/rpc/codes.d.ts +2 -0
  191. package/dist/rpc/codes.d.ts.map +1 -1
  192. package/dist/rpc/envelopes.d.ts +62 -40
  193. package/dist/rpc/envelopes.d.ts.map +1 -1
  194. package/dist/rpc/index.js +7 -3
  195. package/dist/rpc/index.mjs +1 -1
  196. package/dist/rpc/internals/invert.d.ts +18 -0
  197. package/dist/rpc/internals/invert.d.ts.map +1 -0
  198. package/dist/shared/createProxy/index.d.ts +12 -0
  199. package/dist/shared/createProxy/index.d.ts.map +1 -0
  200. package/dist/shared/index.d.ts +2 -0
  201. package/dist/shared/index.d.ts.map +1 -0
  202. package/dist/shared/index.js +9 -0
  203. package/dist/shared/index.mjs +1 -0
  204. package/dist/shared/index.ts.js +1 -0
  205. package/dist/subscription.d.ts +3 -52
  206. package/dist/subscription.d.ts.map +1 -1
  207. package/dist/subscription.js +44 -0
  208. package/dist/subscription.mjs +40 -0
  209. package/dist/subscription.ts.js +1 -0
  210. package/dist/transformTRPCResponse-0c261655.js +29 -0
  211. package/dist/transformTRPCResponse-747b9a68.mjs +27 -0
  212. package/dist/transformer.d.ts +14 -0
  213. package/dist/transformer.d.ts.map +1 -1
  214. package/dist/types.d.ts +35 -8
  215. package/dist/types.d.ts.map +1 -1
  216. package/observable/index.d.ts +1 -0
  217. package/observable/index.js +1 -0
  218. package/package.json +56 -16
  219. package/rpc/dist/trpc-server-rpc.cjs.dev.js +1 -1
  220. package/rpc/dist/trpc-server-rpc.cjs.prod.js +1 -1
  221. package/rpc/dist/trpc-server-rpc.esm.js +1 -1
  222. package/shared/index.d.ts +1 -0
  223. package/shared/index.js +1 -0
  224. package/src/adapters/aws-lambda/index.ts +173 -0
  225. package/src/adapters/aws-lambda/utils.ts +92 -0
  226. package/src/adapters/express.ts +4 -4
  227. package/src/adapters/fastify/fastifyRequestHandler.ts +77 -0
  228. package/src/adapters/fastify/fastifyTRPCPlugin.ts +56 -0
  229. package/src/adapters/fastify/index.ts +2 -0
  230. package/src/adapters/fetch/fetchRequestHandler.ts +61 -0
  231. package/src/adapters/fetch/index.ts +2 -0
  232. package/src/adapters/fetch/types.ts +28 -0
  233. package/src/adapters/lambda/index.ts +18 -0
  234. package/src/adapters/next.ts +10 -8
  235. package/src/adapters/node-http/internals/getPostBody.test.ts +2 -1
  236. package/src/adapters/node-http/internals/getPostBody.ts +1 -1
  237. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +7 -7
  238. package/src/adapters/node-http/types.ts +11 -9
  239. package/src/adapters/standalone.ts +12 -4
  240. package/src/adapters/ws.ts +135 -91
  241. package/src/assertNotBrowser.ts +1 -0
  242. package/src/core/index.ts +6 -0
  243. package/src/core/initTRPC.ts +95 -0
  244. package/src/core/internals/__generated__/mergeRoutersGeneric.ts +386 -0
  245. package/src/core/internals/config.ts +43 -0
  246. package/src/core/internals/getParseFn.ts +47 -0
  247. package/src/core/internals/mergeRouters.ts +45 -0
  248. package/src/core/internals/mergeWithoutOverrides.ts +19 -0
  249. package/src/core/internals/omitPrototype.ts +9 -0
  250. package/src/core/internals/prefixObjectKeys.ts +9 -0
  251. package/src/core/internals/procedureBuilder.ts +420 -0
  252. package/src/core/internals/utils.ts +64 -0
  253. package/src/core/middleware.ts +96 -0
  254. package/src/core/parser.ts +45 -0
  255. package/src/core/procedure.ts +115 -0
  256. package/src/core/router.ts +366 -0
  257. package/src/core/types.ts +58 -0
  258. package/src/{internals → deprecated/internals}/callProcedure.ts +9 -3
  259. package/src/{internals → deprecated/internals}/middlewares.ts +23 -3
  260. package/src/deprecated/internals/procedure.ts +415 -0
  261. package/src/deprecated/interop.ts +229 -0
  262. package/src/{router.ts → deprecated/router.ts} +219 -104
  263. package/src/{TRPCError.ts → error/TRPCError.ts} +6 -14
  264. package/src/error/formatter.ts +51 -0
  265. package/src/{internals/errors.ts → error/utils.ts} +21 -5
  266. package/src/http/index.ts +1 -1
  267. package/src/http/internals/getHTTPStatusCode.ts +3 -2
  268. package/src/http/internals/types.ts +11 -14
  269. package/src/http/resolveHTTPResponse.ts +29 -38
  270. package/src/http/{ResponseMeta.ts → types.ts} +0 -0
  271. package/src/index.ts +4 -7
  272. package/src/internals/transformTRPCResponse.ts +21 -16
  273. package/src/internals/types.ts +24 -0
  274. package/src/internals.ts +14 -0
  275. package/src/observable/index.ts +4 -0
  276. package/src/observable/internals/identity.ts +3 -0
  277. package/src/observable/internals/observableToPromise.ts +49 -0
  278. package/src/observable/internals/pipe.ts +23 -0
  279. package/src/observable/observable.test.ts +101 -0
  280. package/src/observable/observable.ts +78 -0
  281. package/src/observable/operators/index.ts +3 -0
  282. package/src/observable/operators/map.test.ts +92 -0
  283. package/src/observable/operators/map.ts +25 -0
  284. package/src/observable/operators/share.test.ts +60 -0
  285. package/src/observable/operators/share.ts +67 -0
  286. package/src/observable/operators/tap.ts +26 -0
  287. package/src/observable/types.ts +69 -0
  288. package/src/rpc/codes.ts +2 -1
  289. package/src/rpc/envelopes.ts +88 -69
  290. package/src/rpc/internals/invert.ts +27 -0
  291. package/src/shared/createProxy/index.ts +38 -0
  292. package/src/shared/index.ts +1 -0
  293. package/src/subscription.ts +7 -125
  294. package/src/transformer.ts +28 -0
  295. package/src/types.ts +40 -9
  296. package/dist/TRPCError.d.ts +0 -19
  297. package/dist/TRPCError.d.ts.map +0 -1
  298. package/dist/deprecated/LegacyRouter.d.ts +0 -3
  299. package/dist/deprecated/LegacyRouter.d.ts.map +0 -1
  300. package/dist/deprecated/createHttpServer.d.ts +0 -19
  301. package/dist/deprecated/createHttpServer.d.ts.map +0 -1
  302. package/dist/deprecated/requestHandler.d.ts +0 -15
  303. package/dist/deprecated/requestHandler.d.ts.map +0 -1
  304. package/dist/http/ResponseMeta.d.ts.map +0 -1
  305. package/dist/internals/BaseHandlerOptions.d.ts +0 -13
  306. package/dist/internals/BaseHandlerOptions.d.ts.map +0 -1
  307. package/dist/internals/OnErrorFunction.d.ts +0 -11
  308. package/dist/internals/OnErrorFunction.d.ts.map +0 -1
  309. package/dist/internals/callProcedure.d.ts.map +0 -1
  310. package/dist/internals/errors.d.ts.map +0 -1
  311. package/dist/internals/middlewares.d.ts.map +0 -1
  312. package/dist/internals/procedure.d.ts +0 -74
  313. package/dist/internals/procedure.d.ts.map +0 -1
  314. package/dist/internals/wrapCallSafe.d.ts +0 -16
  315. package/dist/internals/wrapCallSafe.d.ts.map +0 -1
  316. package/dist/router.d.ts +0 -176
  317. package/dist/router.d.ts.map +0 -1
  318. package/dist/subscription-5b7e1eba.js +0 -136
  319. package/dist/subscription-e1d42e69.mjs +0 -133
  320. package/dist/transformTRPCResponse-76e0c91e.mjs +0 -109
  321. package/dist/transformTRPCResponse-bd24f548.js +0 -114
  322. package/dist/ws/index.d.ts +0 -7
  323. package/dist/ws/index.d.ts.map +0 -1
  324. package/dist/ws/index.js +0 -15
  325. package/dist/ws/index.mjs +0 -11
  326. package/src/deprecated/LegacyRouter.ts +0 -3
  327. package/src/deprecated/createHttpServer.ts +0 -29
  328. package/src/deprecated/requestHandler.ts +0 -26
  329. package/src/internals/BaseHandlerOptions.ts +0 -13
  330. package/src/internals/OnErrorFunction.ts +0 -11
  331. package/src/internals/procedure.ts +0 -283
  332. package/src/internals/wrapCallSafe.ts +0 -19
  333. package/src/ws/index.ts +0 -8
  334. package/ws/dist/trpc-server-ws.cjs.d.ts +0 -1
  335. package/ws/dist/trpc-server-ws.cjs.dev.js +0 -15
  336. package/ws/dist/trpc-server-ws.cjs.js +0 -7
  337. package/ws/dist/trpc-server-ws.cjs.prod.js +0 -15
  338. package/ws/dist/trpc-server-ws.esm.js +0 -11
  339. package/ws/index.d.ts +0 -1
  340. package/ws/index.js +0 -1
@@ -0,0 +1,78 @@
1
+ import { pipeFromArray } from './internals/pipe';
2
+ import { Observable, Observer, OperatorFunction, TeardownLogic } from './types';
3
+
4
+ export type inferObservableValue<TObservable> = TObservable extends Observable<
5
+ infer TValue,
6
+ unknown
7
+ >
8
+ ? TValue
9
+ : never;
10
+
11
+ export function isObservable(x: unknown): x is Observable<unknown, unknown> {
12
+ return typeof x === 'object' && x !== null && 'subscribe' in x;
13
+ }
14
+
15
+ export function observable<TValue, TError = unknown>(
16
+ subscribe: (observer: Observer<TValue, TError>) => TeardownLogic,
17
+ ): Observable<TValue, TError> {
18
+ const self: Observable<TValue, TError> = {
19
+ subscribe(observer) {
20
+ let teardownRef: TeardownLogic | null = null;
21
+ let isDone = false;
22
+ let unsubscribed = false;
23
+ let teardownImmediately = false;
24
+ function unsubscribe() {
25
+ if (teardownRef === null) {
26
+ teardownImmediately = true;
27
+ return;
28
+ }
29
+ if (unsubscribed) {
30
+ return;
31
+ }
32
+ unsubscribed = true;
33
+
34
+ if (typeof teardownRef === 'function') {
35
+ teardownRef();
36
+ } else if (teardownRef) {
37
+ teardownRef.unsubscribe();
38
+ }
39
+ }
40
+ teardownRef = subscribe({
41
+ next(value) {
42
+ if (isDone) {
43
+ return;
44
+ }
45
+ observer.next?.(value);
46
+ },
47
+ error(err) {
48
+ if (isDone) {
49
+ return;
50
+ }
51
+ isDone = true;
52
+ observer.error?.(err);
53
+ unsubscribe();
54
+ },
55
+ complete() {
56
+ if (isDone) {
57
+ return;
58
+ }
59
+ isDone = true;
60
+ observer.complete?.();
61
+ unsubscribe();
62
+ },
63
+ });
64
+ if (teardownImmediately) {
65
+ unsubscribe();
66
+ }
67
+ return {
68
+ unsubscribe,
69
+ };
70
+ },
71
+ pipe(
72
+ ...operations: OperatorFunction<any, any, any, any>[]
73
+ ): Observable<any, any> {
74
+ return pipeFromArray(operations)(self) as any;
75
+ },
76
+ };
77
+ return self;
78
+ }
@@ -0,0 +1,3 @@
1
+ export * from './share';
2
+ export * from './map';
3
+ export * from './tap';
@@ -0,0 +1,92 @@
1
+ import { EventEmitter } from 'events';
2
+ import { expectTypeOf } from 'expect-type';
3
+ import { map } from '.';
4
+ import { observable } from '../observable';
5
+
6
+ interface SubscriptionEvents<TOutput> {
7
+ data: (data: TOutput) => void;
8
+ }
9
+
10
+ declare interface CustomEventEmitter<TOutput> {
11
+ on<U extends keyof SubscriptionEvents<TOutput>>(
12
+ event: U,
13
+ listener: SubscriptionEvents<TOutput>[U],
14
+ ): this;
15
+
16
+ once<U extends keyof SubscriptionEvents<TOutput>>(
17
+ event: U,
18
+ listener: SubscriptionEvents<TOutput>[U],
19
+ ): this;
20
+
21
+ emit<U extends keyof SubscriptionEvents<TOutput>>(
22
+ event: U,
23
+ ...args: Parameters<SubscriptionEvents<TOutput>[U]>
24
+ ): boolean;
25
+ }
26
+ class CustomEventEmitter<TOutput>
27
+ extends EventEmitter
28
+ implements CustomEventEmitter<TOutput> {}
29
+ test('map', () => {
30
+ type EventShape = { num: number };
31
+ const ee = new CustomEventEmitter<EventShape>();
32
+ const eventObservable = observable<EventShape, unknown>((observer) => {
33
+ const callback = (data: EventShape) => {
34
+ observer.next(data);
35
+ };
36
+ ee.on('data', callback);
37
+
38
+ return () => {
39
+ ee.off('data', callback);
40
+ };
41
+ });
42
+ const pipeCalls = jest.fn();
43
+ const piped = eventObservable.pipe(
44
+ map((...args) => {
45
+ pipeCalls(...args);
46
+ const [value] = args;
47
+ return value.num;
48
+ }),
49
+ );
50
+
51
+ const next = jest.fn();
52
+ const subscription = piped.subscribe({
53
+ next(value) {
54
+ expectTypeOf<number>(value);
55
+ next(value);
56
+ },
57
+ });
58
+ expect(next).not.toHaveBeenCalled();
59
+ ee.emit('data', { num: 1 });
60
+ ee.emit('data', { num: 2 });
61
+ expect(next).toHaveBeenCalledTimes(2);
62
+ expect(next.mock.calls).toMatchInlineSnapshot(`
63
+ Array [
64
+ Array [
65
+ 1,
66
+ ],
67
+ Array [
68
+ 2,
69
+ ],
70
+ ]
71
+ `);
72
+ expect(pipeCalls.mock.calls).toMatchInlineSnapshot(`
73
+ Array [
74
+ Array [
75
+ Object {
76
+ "num": 1,
77
+ },
78
+ 0,
79
+ ],
80
+ Array [
81
+ Object {
82
+ "num": 2,
83
+ },
84
+ 1,
85
+ ],
86
+ ]
87
+ `);
88
+
89
+ expect(ee.listeners('data')).toHaveLength(1);
90
+ subscription.unsubscribe();
91
+ expect(ee.listeners('data')).toHaveLength(0);
92
+ });
@@ -0,0 +1,25 @@
1
+ import { OperatorFunction } from '../types';
2
+
3
+ export function map<TValueBefore, TError, TValueAfter>(
4
+ project: (value: TValueBefore, index: number) => TValueAfter,
5
+ ): OperatorFunction<TValueBefore, TError, TValueAfter, TError> {
6
+ return (originalObserver) => {
7
+ return {
8
+ subscribe(observer) {
9
+ let index = 0;
10
+ const subscription = originalObserver.subscribe({
11
+ next(value) {
12
+ observer.next?.(project(value, index++));
13
+ },
14
+ error(error) {
15
+ observer.error?.(error);
16
+ },
17
+ complete() {
18
+ observer.complete?.();
19
+ },
20
+ });
21
+ return subscription;
22
+ },
23
+ };
24
+ };
25
+ }
@@ -0,0 +1,60 @@
1
+ /* eslint-disable no-var */
2
+ import { observable } from '../observable';
3
+ import { share } from './share';
4
+
5
+ test('share', () => {
6
+ const obs = share()(
7
+ observable<number, Error>((observer) => {
8
+ observer.next(1);
9
+ }),
10
+ );
11
+
12
+ {
13
+ const next = jest.fn();
14
+ const error = jest.fn();
15
+ const complete = jest.fn();
16
+ var subscription1 = obs.subscribe({
17
+ next,
18
+ error,
19
+ complete,
20
+ });
21
+ expect(next.mock.calls).toHaveLength(1);
22
+ expect(complete.mock.calls).toHaveLength(0);
23
+ expect(error.mock.calls).toHaveLength(0);
24
+ expect(next.mock.calls[0]![0]!).toBe(1);
25
+ }
26
+
27
+ {
28
+ // subscribe again - it's shared so should not propagate any results
29
+ const next = jest.fn();
30
+ const error = jest.fn();
31
+ const complete = jest.fn();
32
+ var subscription2 = obs.subscribe({
33
+ next,
34
+ error,
35
+ complete,
36
+ });
37
+ expect(next.mock.calls).toHaveLength(0);
38
+ expect(complete.mock.calls).toHaveLength(0);
39
+ expect(error.mock.calls).toHaveLength(0);
40
+ }
41
+
42
+ subscription1.unsubscribe();
43
+ subscription2.unsubscribe();
44
+ // now it should be reset so we can do a new subscription
45
+ {
46
+ const next = jest.fn();
47
+ const error = jest.fn();
48
+ const complete = jest.fn();
49
+ var subscription3 = obs.subscribe({
50
+ next,
51
+ error,
52
+ complete,
53
+ });
54
+ expect(next.mock.calls).toHaveLength(1);
55
+ expect(complete.mock.calls).toHaveLength(0);
56
+ expect(error.mock.calls).toHaveLength(0);
57
+ expect(next.mock.calls[0]![0]!).toBe(1);
58
+ subscription3.unsubscribe();
59
+ }
60
+ });
@@ -0,0 +1,67 @@
1
+ import { MonoTypeOperatorFunction, Observer, Unsubscribable } from '../types';
2
+
3
+ /* eslint-disable @typescript-eslint/no-empty-interface */
4
+ interface ShareConfig {}
5
+ export function share<TValue, TError>(
6
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
7
+ _opts?: ShareConfig,
8
+ ): MonoTypeOperatorFunction<TValue, TError> {
9
+ return (originalObserver) => {
10
+ let refCount = 0;
11
+
12
+ let subscription: Unsubscribable | null = null;
13
+ const observers: Partial<Observer<TValue, TError>>[] = [];
14
+
15
+ function startIfNeeded() {
16
+ if (subscription) {
17
+ return;
18
+ }
19
+ subscription = originalObserver.subscribe({
20
+ next(value) {
21
+ for (const observer of observers) {
22
+ observer.next?.(value);
23
+ }
24
+ },
25
+ error(error) {
26
+ for (const observer of observers) {
27
+ observer.error?.(error);
28
+ }
29
+ },
30
+ complete() {
31
+ for (const observer of observers) {
32
+ observer.complete?.();
33
+ }
34
+ },
35
+ });
36
+ }
37
+ function resetIfNeeded() {
38
+ // "resetOnRefCountZero"
39
+ if (refCount === 0 && subscription) {
40
+ const _sub = subscription;
41
+ subscription = null;
42
+ _sub.unsubscribe();
43
+ }
44
+ }
45
+
46
+ return {
47
+ subscribe(observer) {
48
+ refCount++;
49
+
50
+ observers.push(observer);
51
+ startIfNeeded();
52
+ return {
53
+ unsubscribe() {
54
+ refCount--;
55
+ resetIfNeeded();
56
+
57
+ const index = observers.findIndex((v) => v === observer);
58
+
59
+ if (index > -1) {
60
+ observers.splice(index, 1);
61
+ }
62
+ },
63
+ };
64
+ },
65
+ };
66
+ };
67
+ }
@@ -0,0 +1,26 @@
1
+ import { MonoTypeOperatorFunction, Observer } from '../types';
2
+
3
+ export function tap<TValue, TError>(
4
+ observer: Partial<Observer<TValue, TError>>,
5
+ ): MonoTypeOperatorFunction<TValue, TError> {
6
+ return (originalObserver) => {
7
+ return {
8
+ subscribe(observer2) {
9
+ return originalObserver.subscribe({
10
+ next(v) {
11
+ observer.next?.(v);
12
+ observer2.next?.(v);
13
+ },
14
+ error(v) {
15
+ observer.error?.(v);
16
+ observer2.error?.(v);
17
+ },
18
+ complete() {
19
+ observer.complete?.();
20
+ observer2.complete?.();
21
+ },
22
+ });
23
+ },
24
+ };
25
+ };
26
+ }
@@ -0,0 +1,69 @@
1
+ export interface Unsubscribable {
2
+ unsubscribe(): void;
3
+ }
4
+ export type UnsubscribeFn = () => void;
5
+ export interface Subscribable<TValue, TError> {
6
+ subscribe(observer: Partial<Observer<TValue, TError>>): Unsubscribable;
7
+ }
8
+ export interface Observable<TValue, TError>
9
+ extends Subscribable<TValue, TError> {
10
+ pipe(): Observable<TValue, TError>;
11
+ pipe<V1, E1>(
12
+ op1: OperatorFunction<TValue, TError, V1, E1>,
13
+ ): Observable<V1, E1>;
14
+ pipe<V1, E1, V2, E2>(
15
+ op1: OperatorFunction<TValue, TError, V1, E1>,
16
+ op2: OperatorFunction<V1, E1, V2, E2>,
17
+ ): Observable<V2, E2>;
18
+ pipe<V1, E1, V2, E2, V3, E3>(
19
+ op1: OperatorFunction<TValue, TError, V1, E1>,
20
+ op2: OperatorFunction<V1, E1, V2, E2>,
21
+ op3: OperatorFunction<V2, E2, V3, E3>,
22
+ ): Observable<V2, E2>;
23
+ pipe<V1, E1, V2, E2, V3, E3, V4, E4>(
24
+ op1: OperatorFunction<TValue, TError, V1, E1>,
25
+ op2: OperatorFunction<V1, E1, V2, E2>,
26
+ op3: OperatorFunction<V2, E2, V3, E3>,
27
+ op4: OperatorFunction<V3, E3, V4, E4>,
28
+ ): Observable<V2, E2>;
29
+ pipe<V1, E1, V2, E2, V3, E3, V4, E4, V5, E5>(
30
+ op1: OperatorFunction<TValue, TError, V1, E1>,
31
+ op2: OperatorFunction<V1, E1, V2, E2>,
32
+ op3: OperatorFunction<V2, E2, V3, E3>,
33
+ op4: OperatorFunction<V3, E3, V4, E4>,
34
+ op5: OperatorFunction<V4, E4, V5, E5>,
35
+ ): Observable<V2, E2>;
36
+ }
37
+ export interface SubscriptionLike extends Unsubscribable {
38
+ unsubscribe(): void;
39
+ readonly closed: boolean;
40
+ }
41
+
42
+ export interface Observer<TValue, TError> {
43
+ next: (value: TValue) => void;
44
+ error: (err: TError) => void;
45
+ complete: () => void;
46
+ }
47
+
48
+ export type TeardownLogic =
49
+ // | SubscriptionLike
50
+ Unsubscribable | UnsubscribeFn | void;
51
+
52
+ export type UnaryFunction<T, R> = (source: T) => R;
53
+
54
+ export type OperatorFunction<
55
+ TValueBefore,
56
+ TErrorBefore,
57
+ TValueAfter,
58
+ TErrorAfter,
59
+ > = UnaryFunction<
60
+ Subscribable<TValueBefore, TErrorBefore>,
61
+ Subscribable<TValueAfter, TErrorAfter>
62
+ >;
63
+
64
+ export type MonoTypeOperatorFunction<TValue, TError> = OperatorFunction<
65
+ TValue,
66
+ TError,
67
+ TValue,
68
+ TError
69
+ >;
package/src/rpc/codes.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { invert } from '../internals/invert';
1
+ import { invert } from './internals/invert';
2
2
 
3
3
  // reference: https://www.jsonrpc.org/specification
4
4
 
@@ -28,6 +28,7 @@ export const TRPC_ERROR_CODES_BY_KEY = {
28
28
  NOT_FOUND: -32004, // 404
29
29
  METHOD_NOT_SUPPORTED: -32005, // 405
30
30
  TIMEOUT: -32008, // 408
31
+ CONFLICT: -32009, // 409
31
32
  PRECONDITION_FAILED: -32012, // 412
32
33
  PAYLOAD_TOO_LARGE: -32013, // 413
33
34
  CLIENT_CLOSED_REQUEST: -32099, // 499
@@ -1,31 +1,10 @@
1
- import { ProcedureType } from '../router';
1
+ /* eslint-disable @typescript-eslint/no-namespace */
2
+ import { ProcedureType } from '../deprecated/router';
2
3
  import { TRPC_ERROR_CODE_NUMBER } from './codes';
3
4
 
4
- type JSONRPC2RequestId = number | string | null;
5
-
6
5
  /**
7
- * All requests/responses extends this shape
6
+ * Error response
8
7
  */
9
- interface JSONRPC2BaseEnvelope {
10
- id: JSONRPC2RequestId;
11
- jsonrpc?: '2.0';
12
- }
13
-
14
- interface JSONRPC2BaseRequest<TMethod extends string = string>
15
- extends JSONRPC2BaseEnvelope {
16
- method: TMethod;
17
- }
18
- interface JSONRPC2Request<TMethod extends string = string, TParams = unknown>
19
- extends JSONRPC2BaseRequest<TMethod> {
20
- params: TParams;
21
- }
22
-
23
- interface JSONRPC2ResultResponse<TResult = unknown>
24
- extends JSONRPC2BaseEnvelope {
25
- result: TResult;
26
- }
27
-
28
- // inner types
29
8
  export interface TRPCErrorShape<
30
9
  TCode extends number = TRPC_ERROR_CODE_NUMBER,
31
10
  TData extends Record<string, unknown> = Record<string, unknown>,
@@ -36,74 +15,114 @@ export interface TRPCErrorShape<
36
15
  }
37
16
 
38
17
  /**
39
- * The result data wrapped
18
+ * JSON-RPC 2.0 Specification
40
19
  */
41
- export type TRPCResult<TData = unknown> =
42
- | {
43
- type: 'data';
44
- data: TData;
45
- }
46
- | {
47
- type: 'started';
48
- }
49
- | {
50
- type: 'stopped';
51
- };
20
+ export namespace JSONRPC2 {
21
+ export type RequestId = number | string | null;
22
+
23
+ /**
24
+ * All requests/responses extends this shape
25
+ */
26
+ export interface BaseEnvelope {
27
+ id?: RequestId;
28
+ jsonrpc?: '2.0';
29
+ }
30
+
31
+ export interface BaseRequest<TMethod extends string = string>
32
+ extends BaseEnvelope {
33
+ method: TMethod;
34
+ }
35
+
36
+ export interface Request<TMethod extends string = string, TParams = unknown>
37
+ extends BaseRequest<TMethod> {
38
+ params: TParams;
39
+ }
40
+
41
+ export interface ResultResponse<TResult = unknown> extends BaseEnvelope {
42
+ result: TResult;
43
+ }
44
+
45
+ export interface ErrorResponse<TError extends TRPCErrorShape = TRPCErrorShape>
46
+ extends BaseEnvelope {
47
+ error: TError;
48
+ }
49
+ }
52
50
 
53
51
  /**
54
- * Request envelope
52
+ * TRPC HTTP Envelopes
55
53
  */
56
- export type TRPCRequest =
57
- | JSONRPC2Request<'subscription.stop'>
58
- | JSONRPC2Request<
59
- ProcedureType,
60
- {
61
- path: string;
62
- input: unknown;
63
- }
64
- >;
54
+
55
+ export type TRPCRequest = JSONRPC2.Request<
56
+ ProcedureType,
57
+ { path: string; input: unknown }
58
+ >;
59
+
60
+ export type TRPCResult<TData = unknown> = { data: TData };
61
+
62
+ export type TRPCErrorResponse<TError extends TRPCErrorShape = TRPCErrorShape> =
63
+ JSONRPC2.ErrorResponse<TError>;
64
+
65
+ export type TRPCResponse<
66
+ TResult = unknown,
67
+ TError extends TRPCErrorShape = TRPCErrorShape,
68
+ > = JSONRPC2.ResultResponse<TRPCResult<TResult>> | TRPCErrorResponse<TError>;
65
69
 
66
70
  /**
67
- * OK response
71
+ * HTTP WS Envelopes
68
72
  */
69
- export type TRPCResultResponse<TData = unknown> = JSONRPC2ResultResponse<
70
- TRPCResult<TData>
71
- >;
73
+
74
+ export type TRPCRequestMessage = {
75
+ id: JSONRPC2.RequestId;
76
+ } & TRPCRequest;
72
77
 
73
78
  /**
74
- * Generic response wrapper that is either a result or error
79
+ * The client asked the server to unsubscribe
75
80
  */
76
- export type TRPCResponse<
77
- TData = unknown,
78
- TError extends TRPCErrorShape = TRPCErrorShape,
79
- > = TRPCResultResponse<TData> | TRPCErrorResponse<TError>;
81
+ export type TRPCSubscriptionStopNotification = {
82
+ id: null;
83
+ } & JSONRPC2.BaseRequest<'subscription.stop'>;
80
84
 
81
85
  /**
82
- * Error response
86
+ * The client's outgoing request types
83
87
  */
84
- export interface TRPCErrorResponse<
88
+ export type TRPCClientOutgoingRequest = TRPCSubscriptionStopNotification;
89
+
90
+ /**
91
+ * The client's sent messages shape
92
+ */
93
+ export type TRPCClientOutgoingMessage =
94
+ | TRPCRequestMessage
95
+ | ({ id: JSONRPC2.RequestId } & JSONRPC2.BaseRequest<'subscription.stop'>);
96
+
97
+ export type TRPCResultMessage<TData = unknown> =
98
+ | ({ type: 'data' } & TRPCResult<TData>)
99
+ | { type: 'started' }
100
+ | { type: 'stopped' };
101
+
102
+ export type TRPCResponseMessage<
103
+ TResult = unknown,
85
104
  TError extends TRPCErrorShape = TRPCErrorShape,
86
- > extends JSONRPC2BaseEnvelope {
87
- error: TError;
88
- }
105
+ > = { id: JSONRPC2.RequestId } & (
106
+ | JSONRPC2.ResultResponse<TRPCResultMessage<TResult>>
107
+ | TRPCErrorResponse<TError>
108
+ );
89
109
 
90
110
  /**
91
111
  * The server asked the client to reconnect - useful when restarting/redeploying service
92
112
  */
93
- export interface TRPCReconnectNotification
94
- extends JSONRPC2BaseRequest<'reconnect'> {
95
- id: null;
96
- }
113
+ export type TRPCReconnectNotification = {
114
+ id: JSONRPC2.RequestId;
115
+ } & JSONRPC2.BaseRequest<'reconnect'>;
97
116
 
98
117
  /**
99
118
  * The client's incoming request types
100
119
  */
101
- export type TRPCClientIncomingRequest =
102
- TRPCReconnectNotification /* could be extended in future */;
120
+ export type TRPCClientIncomingRequest = TRPCReconnectNotification;
103
121
 
104
122
  /**
105
123
  * The client's received messages shape
106
124
  */
107
- export type TRPCClientIncomingMessage =
108
- | TRPCResponse
109
- | TRPCClientIncomingRequest;
125
+ export type TRPCClientIncomingMessage<
126
+ TResult = unknown,
127
+ TError extends TRPCErrorShape = TRPCErrorShape,
128
+ > = TRPCResponseMessage<TResult, TError> | TRPCClientIncomingRequest;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @internal
3
+ */
4
+ type KeyFromValue<V, T extends Record<PropertyKey, PropertyKey>> = {
5
+ [K in keyof T]: V extends T[K] ? K : never;
6
+ }[keyof T];
7
+
8
+ /**
9
+ * @internal
10
+ */
11
+ type Invert<T extends Record<PropertyKey, PropertyKey>> = {
12
+ [V in T[keyof T]]: KeyFromValue<V, T>;
13
+ };
14
+
15
+ /**
16
+ * @internal
17
+ */
18
+ export function invert<T extends Record<PropertyKey, PropertyKey>>(
19
+ obj: T,
20
+ ): Invert<T> {
21
+ const newObj = Object.create(null) as any;
22
+ for (const key in obj) {
23
+ const v = obj[key];
24
+ newObj[v] = key;
25
+ }
26
+ return newObj;
27
+ }