@trpc/server 11.4.1 → 11.4.2-canary.1

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 (105) hide show
  1. package/dist/adapters/aws-lambda/index.cjs +49 -42
  2. package/dist/adapters/aws-lambda/index.mjs +47 -40
  3. package/dist/adapters/aws-lambda/index.mjs.map +1 -1
  4. package/dist/adapters/express.cjs +14 -15
  5. package/dist/adapters/express.mjs +14 -15
  6. package/dist/adapters/express.mjs.map +1 -1
  7. package/dist/adapters/fastify/index.cjs +27 -28
  8. package/dist/adapters/fastify/index.mjs +27 -28
  9. package/dist/adapters/fastify/index.mjs.map +1 -1
  10. package/dist/adapters/fetch/index.cjs +18 -19
  11. package/dist/adapters/fetch/index.mjs +18 -19
  12. package/dist/adapters/fetch/index.mjs.map +1 -1
  13. package/dist/adapters/next-app-dir.cjs +57 -53
  14. package/dist/adapters/next-app-dir.mjs +15 -11
  15. package/dist/adapters/next-app-dir.mjs.map +1 -1
  16. package/dist/adapters/next.cjs +14 -15
  17. package/dist/adapters/next.mjs +14 -15
  18. package/dist/adapters/next.mjs.map +1 -1
  19. package/dist/adapters/node-http/index.cjs +8 -8
  20. package/dist/adapters/node-http/index.mjs +8 -8
  21. package/dist/adapters/standalone.cjs +17 -17
  22. package/dist/adapters/standalone.mjs +16 -16
  23. package/dist/adapters/standalone.mjs.map +1 -1
  24. package/dist/adapters/ws.cjs +10 -10
  25. package/dist/adapters/ws.mjs +10 -10
  26. package/dist/getErrorShape-DKiEF6Zc.cjs +339 -0
  27. package/dist/getErrorShape-Uhlrl4Bk.mjs +263 -0
  28. package/dist/getErrorShape-Uhlrl4Bk.mjs.map +1 -0
  29. package/dist/http.cjs +5 -5
  30. package/dist/http.mjs +5 -5
  31. package/dist/index.cjs +4 -4
  32. package/dist/index.mjs +4 -4
  33. package/dist/{initTRPC-DjEpHmY2.cjs → initTRPC-IT4M4lu3.cjs} +83 -64
  34. package/dist/{initTRPC-COaJMShh.mjs → initTRPC-IT_6ZYJd.mjs} +84 -65
  35. package/dist/initTRPC-IT_6ZYJd.mjs.map +1 -0
  36. package/dist/{node-http-BUQnHuGI.mjs → node-http-Du8akt-R.mjs} +26 -23
  37. package/dist/{node-http-BUQnHuGI.mjs.map → node-http-Du8akt-R.mjs.map} +1 -1
  38. package/dist/{node-http-BPR68yI4.cjs → node-http-kIQEhZUH.cjs} +25 -22
  39. package/dist/observable/index.cjs +2 -2
  40. package/dist/observable/index.mjs +2 -2
  41. package/dist/{observable-BwdrSFZU.cjs → observable-B1Nk6r1H.cjs} +7 -4
  42. package/dist/{observable-C6qq2Ydk.cjs → observable-BVzLuBs6.cjs} +19 -7
  43. package/dist/{observable-CFXA_tyK.mjs → observable-CUiPknO-.mjs} +20 -8
  44. package/dist/{observable-CFXA_tyK.mjs.map → observable-CUiPknO-.mjs.map} +1 -1
  45. package/dist/{observable-B1orLHHI.mjs → observable-UMO3vUa_.mjs} +8 -5
  46. package/dist/{observable-B1orLHHI.mjs.map → observable-UMO3vUa_.mjs.map} +1 -1
  47. package/dist/{parseTRPCMessage-CNyYMSRB.mjs → parseTRPCMessage-ByIHyFRz.mjs} +2 -2
  48. package/dist/{parseTRPCMessage-CNyYMSRB.mjs.map → parseTRPCMessage-ByIHyFRz.mjs.map} +1 -1
  49. package/dist/{parseTRPCMessage-ByQWigsq.cjs → parseTRPCMessage-snNQop7N.cjs} +1 -1
  50. package/dist/{resolveResponse-B2CuaT_1.cjs → resolveResponse-CVGbakBm.cjs} +664 -405
  51. package/dist/{resolveResponse-DPbYgJDD.mjs → resolveResponse-CzlbRpCI.mjs} +660 -389
  52. package/dist/resolveResponse-CzlbRpCI.mjs.map +1 -0
  53. package/dist/rpc.cjs +2 -2
  54. package/dist/rpc.mjs +2 -2
  55. package/dist/shared.cjs +2 -2
  56. package/dist/shared.mjs +2 -2
  57. package/dist/{tracked-Dl9sBZxY.cjs → tracked-HoF8L_mq.cjs} +30 -42
  58. package/dist/{tracked-GEWPoL0C.mjs → tracked-gU3ttYjg.mjs} +31 -43
  59. package/dist/{tracked-GEWPoL0C.mjs.map → tracked-gU3ttYjg.mjs.map} +1 -1
  60. package/dist/unstable-core-do-not-import.cjs +7 -7
  61. package/dist/unstable-core-do-not-import.mjs +7 -7
  62. package/dist/{utils-BHZJcBRv.mjs → utils-DdbbrDku.mjs} +1 -1
  63. package/dist/{utils-BHZJcBRv.mjs.map → utils-DdbbrDku.mjs.map} +1 -1
  64. package/dist/{ws-C2nEUNk_.cjs → ws-BhrWsMpl.cjs} +37 -26
  65. package/dist/{ws-eIVIMTrw.mjs → ws-Bn5rkP_I.mjs} +37 -26
  66. package/dist/{ws-eIVIMTrw.mjs.map → ws-Bn5rkP_I.mjs.map} +1 -1
  67. package/package.json +2 -2
  68. package/adapters/aws-lambda/index.d.ts +0 -1
  69. package/adapters/aws-lambda/index.js +0 -1
  70. package/adapters/express/index.d.ts +0 -1
  71. package/adapters/express/index.js +0 -1
  72. package/adapters/fastify/index.d.ts +0 -1
  73. package/adapters/fastify/index.js +0 -1
  74. package/adapters/fetch/index.d.ts +0 -1
  75. package/adapters/fetch/index.js +0 -1
  76. package/adapters/next/index.d.ts +0 -1
  77. package/adapters/next/index.js +0 -1
  78. package/adapters/next-app-dir/index.d.ts +0 -1
  79. package/adapters/next-app-dir/index.js +0 -1
  80. package/adapters/node-http/content-type/form-data/index.d.ts +0 -1
  81. package/adapters/node-http/content-type/form-data/index.js +0 -1
  82. package/adapters/node-http/content-type/json/index.d.ts +0 -1
  83. package/adapters/node-http/content-type/json/index.js +0 -1
  84. package/adapters/node-http/index.d.ts +0 -1
  85. package/adapters/node-http/index.js +0 -1
  86. package/adapters/standalone/index.d.ts +0 -1
  87. package/adapters/standalone/index.js +0 -1
  88. package/adapters/ws/index.d.ts +0 -1
  89. package/adapters/ws/index.js +0 -1
  90. package/dist/getErrorShape-CsikfkAc.cjs +0 -201
  91. package/dist/getErrorShape-DyYil4aT.mjs +0 -149
  92. package/dist/getErrorShape-DyYil4aT.mjs.map +0 -1
  93. package/dist/initTRPC-COaJMShh.mjs.map +0 -1
  94. package/dist/resolveResponse-DPbYgJDD.mjs.map +0 -1
  95. package/http/index.d.ts +0 -1
  96. package/http/index.js +0 -1
  97. package/observable/index.d.ts +0 -1
  98. package/observable/index.js +0 -1
  99. package/rpc/index.d.ts +0 -1
  100. package/rpc/index.js +0 -1
  101. package/shared/index.d.ts +0 -1
  102. package/shared/index.js +0 -1
  103. package/unstable-core-do-not-import/index.d.ts +0 -1
  104. package/unstable-core-do-not-import/index.js +0 -1
  105. /package/dist/{utils-DVO6HZiR.cjs → utils-BhNVZA-c.cjs} +0 -0
@@ -1,12 +1,13 @@
1
- import { Unpromise, __toESM, iteratorResource, parseConnectionParamsFromUnknown, require_usingCtx } from "./resolveResponse-DPbYgJDD.mjs";
2
- import { getErrorShape } from "./getErrorShape-DyYil4aT.mjs";
3
- import { TRPCError, callProcedure, getTRPCErrorFromUnknown, isTrackedEnvelope, transformTRPCResponse } from "./tracked-GEWPoL0C.mjs";
4
- import { isAsyncIterable, isObject, run } from "./utils-BHZJcBRv.mjs";
5
- import { parseTRPCMessage } from "./parseTRPCMessage-CNyYMSRB.mjs";
6
- import { isObservable, observableToAsyncIterable } from "./observable-B1orLHHI.mjs";
7
- import { createURL } from "./node-http-BUQnHuGI.mjs";
1
+ import { __toESM, getErrorShape, require_objectSpread2 } from "./getErrorShape-Uhlrl4Bk.mjs";
2
+ import { TRPCError, callProcedure, getTRPCErrorFromUnknown, isTrackedEnvelope, transformTRPCResponse } from "./tracked-gU3ttYjg.mjs";
3
+ import { isAsyncIterable, isObject, run } from "./utils-DdbbrDku.mjs";
4
+ import { parseTRPCMessage } from "./parseTRPCMessage-ByIHyFRz.mjs";
5
+ import { Unpromise, iteratorResource, parseConnectionParamsFromUnknown, require_usingCtx } from "./resolveResponse-CzlbRpCI.mjs";
6
+ import { isObservable, observableToAsyncIterable } from "./observable-UMO3vUa_.mjs";
7
+ import { createURL } from "./node-http-Du8akt-R.mjs";
8
8
 
9
9
  //#region src/adapters/ws.ts
10
+ var import_objectSpread2 = __toESM(require_objectSpread2(), 1);
10
11
  var import_usingCtx = __toESM(require_usingCtx(), 1);
11
12
  /**
12
13
  * Importing ws causes a build error
@@ -17,9 +18,10 @@ function getWSConnectionHandler(opts) {
17
18
  const { createContext, router } = opts;
18
19
  const { transformer } = router._def._config;
19
20
  return (client, req) => {
21
+ var _opts$keepAlive;
20
22
  const clientSubscriptions = /* @__PURE__ */ new Map();
21
23
  const abortController = new AbortController();
22
- if (opts.keepAlive?.enabled) {
24
+ if ((_opts$keepAlive = opts.keepAlive) === null || _opts$keepAlive === void 0 ? void 0 : _opts$keepAlive.enabled) {
23
25
  const { pingMs, pongWaitMs } = opts.keepAlive;
24
26
  handleKeepAlive(client, pingMs, pongWaitMs);
25
27
  }
@@ -29,7 +31,7 @@ function getWSConnectionHandler(opts) {
29
31
  async function createCtxPromise(getConnectionParams) {
30
32
  try {
31
33
  return await run(async () => {
32
- ctx = await createContext?.({
34
+ ctx = await (createContext === null || createContext === void 0 ? void 0 : createContext({
33
35
  req,
34
36
  res: client,
35
37
  info: {
@@ -41,15 +43,16 @@ function getWSConnectionHandler(opts) {
41
43
  signal: abortController.signal,
42
44
  url: null
43
45
  }
44
- });
46
+ }));
45
47
  return {
46
48
  ok: true,
47
49
  value: ctx
48
50
  };
49
51
  });
50
52
  } catch (cause) {
53
+ var _opts$onError, _globalThis$setImmedi;
51
54
  const error = getTRPCErrorFromUnknown(cause);
52
- opts.onError?.({
55
+ (_opts$onError = opts.onError) === null || _opts$onError === void 0 || _opts$onError.call(opts, {
53
56
  error,
54
57
  path: void 0,
55
58
  type: "unknown",
@@ -68,7 +71,7 @@ function getWSConnectionHandler(opts) {
68
71
  ctx
69
72
  })
70
73
  });
71
- (globalThis.setImmediate ?? globalThis.setTimeout)(() => {
74
+ ((_globalThis$setImmedi = globalThis.setImmediate) !== null && _globalThis$setImmedi !== void 0 ? _globalThis$setImmedi : globalThis.setTimeout)(() => {
72
75
  client.close();
73
76
  });
74
77
  return {
@@ -88,11 +91,12 @@ function getWSConnectionHandler(opts) {
88
91
  function handleRequest(msg) {
89
92
  const { id, jsonrpc } = msg;
90
93
  if (id === null) {
94
+ var _opts$onError2;
91
95
  const error = getTRPCErrorFromUnknown(new TRPCError({
92
96
  code: "PARSE_ERROR",
93
97
  message: "`id` is required"
94
98
  }));
95
- opts.onError?.({
99
+ (_opts$onError2 = opts.onError) === null || _opts$onError2 === void 0 || _opts$onError2.call(opts, {
96
100
  error,
97
101
  path: void 0,
98
102
  type: "unknown",
@@ -115,17 +119,18 @@ function getWSConnectionHandler(opts) {
115
119
  return;
116
120
  }
117
121
  if (msg.method === "subscription.stop") {
118
- clientSubscriptions.get(id)?.abort();
122
+ var _clientSubscriptions$;
123
+ (_clientSubscriptions$ = clientSubscriptions.get(id)) === null || _clientSubscriptions$ === void 0 || _clientSubscriptions$.abort();
119
124
  return;
120
125
  }
121
126
  const { path, lastEventId } = msg.params;
122
127
  let { input } = msg.params;
123
128
  const type = msg.method;
124
- if (lastEventId !== void 0) if (isObject(input)) input = {
125
- ...input,
126
- lastEventId
127
- };
128
- else input ??= { lastEventId };
129
+ if (lastEventId !== void 0) if (isObject(input)) input = (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, input), {}, { lastEventId });
130
+ else {
131
+ var _input;
132
+ (_input = input) !== null && _input !== void 0 || (input = { lastEventId });
133
+ }
129
134
  run(async () => {
130
135
  const res = await ctxPromise;
131
136
  if (!res.ok) throw res.error;
@@ -178,12 +183,14 @@ function getWSConnectionHandler(opts) {
178
183
  while (true) {
179
184
  next = await Unpromise.race([iterator.next().catch(getTRPCErrorFromUnknown), abortPromise]);
180
185
  if (next === "abort") {
181
- await iterator.return?.();
186
+ var _iterator$return;
187
+ await ((_iterator$return = iterator.return) === null || _iterator$return === void 0 ? void 0 : _iterator$return.call(iterator));
182
188
  break;
183
189
  }
184
190
  if (next instanceof Error) {
191
+ var _opts$onError3;
185
192
  const error = getTRPCErrorFromUnknown(next);
186
- opts.onError?.({
193
+ (_opts$onError3 = opts.onError) === null || _opts$onError3 === void 0 || _opts$onError3.call(opts, {
187
194
  error,
188
195
  path,
189
196
  type,
@@ -238,8 +245,9 @@ function getWSConnectionHandler(opts) {
238
245
  await _usingCtx.d();
239
246
  }
240
247
  }).catch((cause) => {
248
+ var _opts$onError4;
241
249
  const error = getTRPCErrorFromUnknown(cause);
242
- opts.onError?.({
250
+ (_opts$onError4 = opts.onError) === null || _opts$onError4 === void 0 || _opts$onError4.call(opts, {
243
251
  error,
244
252
  path,
245
253
  type,
@@ -268,8 +276,9 @@ function getWSConnectionHandler(opts) {
268
276
  result: { type: "started" }
269
277
  });
270
278
  }).catch((cause) => {
279
+ var _opts$onError5;
271
280
  const error = getTRPCErrorFromUnknown(cause);
272
- opts.onError?.({
281
+ (_opts$onError5 = opts.onError) === null || _opts$onError5 === void 0 || _opts$onError5.call(opts, {
273
282
  error,
274
283
  path,
275
284
  type,
@@ -343,7 +352,8 @@ function getWSConnectionHandler(opts) {
343
352
  parsedMsgs.map(handleRequest);
344
353
  });
345
354
  client.on("error", (cause) => {
346
- opts.onError?.({
355
+ var _opts$onError6;
356
+ (_opts$onError6 = opts.onError) === null || _opts$onError6 === void 0 || _opts$onError6.call(opts, {
347
357
  ctx,
348
358
  error: getTRPCErrorFromUnknown(cause),
349
359
  input: void 0,
@@ -391,7 +401,8 @@ function handleKeepAlive(client, pingMs = 3e4, pongWaitMs = 5e3) {
391
401
  function applyWSSHandler(opts) {
392
402
  const onConnection = getWSConnectionHandler(opts);
393
403
  opts.wss.on("connection", (client, req) => {
394
- if (opts.prefix && !req.url?.startsWith(opts.prefix)) return;
404
+ var _req$url;
405
+ if (opts.prefix && !((_req$url = req.url) === null || _req$url === void 0 ? void 0 : _req$url.startsWith(opts.prefix))) return;
395
406
  onConnection(client, req);
396
407
  });
397
408
  return { broadcastReconnectNotification: () => {
@@ -406,4 +417,4 @@ function applyWSSHandler(opts) {
406
417
 
407
418
  //#endregion
408
419
  export { applyWSSHandler, getWSConnectionHandler, handleKeepAlive };
409
- //# sourceMappingURL=ws-eIVIMTrw.mjs.map
420
+ //# sourceMappingURL=ws-Bn5rkP_I.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ws-eIVIMTrw.mjs","names":["opts: WSSHandlerOptions<TRouter>","client: ws.WebSocket","req: IncomingMessage","untransformedJSON: TRPCResponseMessage","getConnectionParams: () => TRPCRequestInfo['connectionParams']","ctx: Context | undefined","msg: TRPCClientOutgoingMessage","abortController","next:\n | null\n | TRPCError\n | Awaited<\n typeof abortPromise | ReturnType<(typeof iterator)['next']>\n >","result: null | TRPCResultMessage<unknown>['result']","id","msgJSON: unknown","msgs: unknown[]","timeout: NodeJS.Timeout | undefined","ping: NodeJS.Timeout | undefined","response: TRPCReconnectNotification"],"sources":["../src/adapters/ws.ts"],"sourcesContent":["import type { IncomingMessage } from 'http';\nimport type ws from 'ws';\nimport type {\n AnyRouter,\n CreateContextCallback,\n inferRouterContext,\n} from '../@trpc/server';\nimport {\n callTRPCProcedure,\n getErrorShape,\n getTRPCErrorFromUnknown,\n transformTRPCResponse,\n TRPCError,\n} from '../@trpc/server';\nimport type { TRPCRequestInfo } from '../@trpc/server/http';\nimport { type BaseHandlerOptions } from '../@trpc/server/http';\nimport { parseTRPCMessage } from '../@trpc/server/rpc';\n// @trpc/server/rpc\nimport type {\n TRPCClientOutgoingMessage,\n TRPCConnectionParamsMessage,\n TRPCReconnectNotification,\n TRPCResponseMessage,\n TRPCResultMessage,\n} from '../@trpc/server/rpc';\nimport { parseConnectionParamsFromUnknown } from '../http';\nimport { isObservable, observableToAsyncIterable } from '../observable';\n// eslint-disable-next-line no-restricted-imports\nimport {\n isAsyncIterable,\n isObject,\n isTrackedEnvelope,\n run,\n type MaybePromise,\n} from '../unstable-core-do-not-import';\n// eslint-disable-next-line no-restricted-imports\nimport type { Result } from '../unstable-core-do-not-import';\n// eslint-disable-next-line no-restricted-imports\nimport { iteratorResource } from '../unstable-core-do-not-import/stream/utils/asyncIterable';\nimport { Unpromise } from '../vendor/unpromise';\nimport { createURL, type NodeHTTPCreateContextFnOptions } from './node-http';\n\n/**\n * Importing ws causes a build error\n * @see https://github.com/trpc/trpc/pull/5279\n */\nconst WEBSOCKET_OPEN = 1; /* ws.WebSocket.OPEN */\n\n/**\n * @public\n */\nexport type CreateWSSContextFnOptions = NodeHTTPCreateContextFnOptions<\n IncomingMessage,\n ws.WebSocket\n>;\n\n/**\n * @public\n */\nexport type CreateWSSContextFn<TRouter extends AnyRouter> = (\n opts: CreateWSSContextFnOptions,\n) => MaybePromise<inferRouterContext<TRouter>>;\n\nexport type WSConnectionHandlerOptions<TRouter extends AnyRouter> =\n BaseHandlerOptions<TRouter, IncomingMessage> &\n CreateContextCallback<\n inferRouterContext<TRouter>,\n CreateWSSContextFn<TRouter>\n >;\n\n/**\n * Web socket server handler\n */\nexport type WSSHandlerOptions<TRouter extends AnyRouter> =\n WSConnectionHandlerOptions<TRouter> & {\n wss: ws.WebSocketServer;\n prefix?: string;\n keepAlive?: {\n /**\n * Enable heartbeat messages\n * @default false\n */\n enabled: boolean;\n /**\n * Heartbeat interval in milliseconds\n * @default 30_000\n */\n pingMs?: number;\n /**\n * Terminate the WebSocket if no pong is received after this many milliseconds\n * @default 5_000\n */\n pongWaitMs?: number;\n };\n /**\n * Disable responding to ping messages from the client\n * **Not recommended** - this is mainly used for testing\n * @default false\n */\n dangerouslyDisablePong?: boolean;\n };\n\nexport function getWSConnectionHandler<TRouter extends AnyRouter>(\n opts: WSSHandlerOptions<TRouter>,\n) {\n const { createContext, router } = opts;\n const { transformer } = router._def._config;\n\n return (client: ws.WebSocket, req: IncomingMessage) => {\n type Context = inferRouterContext<TRouter>;\n type ContextResult = Result<Context>;\n\n const clientSubscriptions = new Map<number | string, AbortController>();\n const abortController = new AbortController();\n\n if (opts.keepAlive?.enabled) {\n const { pingMs, pongWaitMs } = opts.keepAlive;\n handleKeepAlive(client, pingMs, pongWaitMs);\n }\n\n function respond(untransformedJSON: TRPCResponseMessage) {\n client.send(\n JSON.stringify(\n transformTRPCResponse(router._def._config, untransformedJSON),\n ),\n );\n }\n\n async function createCtxPromise(\n getConnectionParams: () => TRPCRequestInfo['connectionParams'],\n ): Promise<ContextResult> {\n try {\n return await run(async (): Promise<ContextResult> => {\n ctx = await createContext?.({\n req,\n res: client,\n info: {\n connectionParams: getConnectionParams(),\n calls: [],\n isBatchCall: false,\n accept: null,\n type: 'unknown',\n signal: abortController.signal,\n url: null,\n },\n });\n\n return {\n ok: true,\n value: ctx,\n };\n });\n } catch (cause) {\n const error = getTRPCErrorFromUnknown(cause);\n opts.onError?.({\n error,\n path: undefined,\n type: 'unknown',\n ctx,\n req,\n input: undefined,\n });\n respond({\n id: null,\n error: getErrorShape({\n config: router._def._config,\n error,\n type: 'unknown',\n path: undefined,\n input: undefined,\n ctx,\n }),\n });\n\n // close in next tick\n (globalThis.setImmediate ?? globalThis.setTimeout)(() => {\n client.close();\n });\n return {\n ok: false,\n error,\n };\n }\n }\n\n let ctx: Context | undefined = undefined;\n\n /**\n * promise for initializing the context\n *\n * - the context promise will be created immediately on connection if no connectionParams are expected\n * - if connection params are expected, they will be created once received\n */\n let ctxPromise =\n createURL(req).searchParams.get('connectionParams') === '1'\n ? null\n : createCtxPromise(() => null);\n\n function handleRequest(msg: TRPCClientOutgoingMessage) {\n const { id, jsonrpc } = msg;\n\n if (id === null) {\n const error = getTRPCErrorFromUnknown(\n new TRPCError({\n code: 'PARSE_ERROR',\n message: '`id` is required',\n }),\n );\n opts.onError?.({\n error,\n path: undefined,\n type: 'unknown',\n ctx,\n req,\n input: undefined,\n });\n respond({\n id,\n jsonrpc,\n error: getErrorShape({\n config: router._def._config,\n error,\n type: 'unknown',\n path: undefined,\n input: undefined,\n ctx,\n }),\n });\n return;\n }\n if (msg.method === 'subscription.stop') {\n clientSubscriptions.get(id)?.abort();\n return;\n }\n const { path, lastEventId } = msg.params;\n let { input } = msg.params;\n const type = msg.method;\n\n if (lastEventId !== undefined) {\n if (isObject(input)) {\n input = {\n ...input,\n lastEventId: lastEventId,\n };\n } else {\n input ??= {\n lastEventId: lastEventId,\n };\n }\n }\n run(async () => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const res = await ctxPromise!; // asserts context has been set\n if (!res.ok) {\n throw res.error;\n }\n\n const abortController = new AbortController();\n const result = await callTRPCProcedure({\n router,\n path,\n getRawInput: async () => input,\n ctx,\n type,\n signal: abortController.signal,\n });\n\n const isIterableResult =\n isAsyncIterable(result) || isObservable(result);\n\n if (type !== 'subscription') {\n if (isIterableResult) {\n throw new TRPCError({\n code: 'UNSUPPORTED_MEDIA_TYPE',\n message: `Cannot return an async iterable or observable from a ${type} procedure with WebSockets`,\n });\n }\n // send the value as data if the method is not a subscription\n respond({\n id,\n jsonrpc,\n result: {\n type: 'data',\n data: result,\n },\n });\n return;\n }\n\n if (!isIterableResult) {\n throw new TRPCError({\n message: `Subscription ${path} did not return an observable or a AsyncGenerator`,\n code: 'INTERNAL_SERVER_ERROR',\n });\n }\n\n /* istanbul ignore next -- @preserve */\n if (client.readyState !== WEBSOCKET_OPEN) {\n // if the client got disconnected whilst initializing the subscription\n // no need to send stopped message if the client is disconnected\n\n return;\n }\n\n /* istanbul ignore next -- @preserve */\n if (clientSubscriptions.has(id)) {\n // duplicate request ids for client\n\n throw new TRPCError({\n message: `Duplicate id ${id}`,\n code: 'BAD_REQUEST',\n });\n }\n\n const iterable = isObservable(result)\n ? observableToAsyncIterable(result, abortController.signal)\n : result;\n\n run(async () => {\n await using iterator = iteratorResource(iterable);\n\n const abortPromise = new Promise<'abort'>((resolve) => {\n abortController.signal.onabort = () => resolve('abort');\n });\n // We need those declarations outside the loop for garbage collection reasons. If they\n // were declared inside, they would not be freed until the next value is present.\n let next:\n | null\n | TRPCError\n | Awaited<\n typeof abortPromise | ReturnType<(typeof iterator)['next']>\n >;\n let result: null | TRPCResultMessage<unknown>['result'];\n\n while (true) {\n next = await Unpromise.race([\n iterator.next().catch(getTRPCErrorFromUnknown),\n abortPromise,\n ]);\n\n if (next === 'abort') {\n await iterator.return?.();\n break;\n }\n if (next instanceof Error) {\n const error = getTRPCErrorFromUnknown(next);\n opts.onError?.({ error, path, type, ctx, req, input });\n respond({\n id,\n jsonrpc,\n error: getErrorShape({\n config: router._def._config,\n error,\n type,\n path,\n input,\n ctx,\n }),\n });\n break;\n }\n if (next.done) {\n break;\n }\n\n result = {\n type: 'data',\n data: next.value,\n };\n\n if (isTrackedEnvelope(next.value)) {\n const [id, data] = next.value;\n result.id = id;\n result.data = {\n id,\n data,\n };\n }\n\n respond({\n id,\n jsonrpc,\n result,\n });\n\n // free up references for garbage collection\n next = null;\n result = null;\n }\n\n respond({\n id,\n jsonrpc,\n result: {\n type: 'stopped',\n },\n });\n clientSubscriptions.delete(id);\n }).catch((cause) => {\n const error = getTRPCErrorFromUnknown(cause);\n opts.onError?.({ error, path, type, ctx, req, input });\n respond({\n id,\n jsonrpc,\n error: getErrorShape({\n config: router._def._config,\n error,\n type,\n path,\n input,\n ctx,\n }),\n });\n abortController.abort();\n });\n clientSubscriptions.set(id, abortController);\n\n respond({\n id,\n jsonrpc,\n result: {\n type: 'started',\n },\n });\n }).catch((cause) => {\n // procedure threw an error\n const error = getTRPCErrorFromUnknown(cause);\n opts.onError?.({ error, path, type, ctx, req, input });\n respond({\n id,\n jsonrpc,\n error: getErrorShape({\n config: router._def._config,\n error,\n type,\n path,\n input,\n ctx,\n }),\n });\n });\n }\n client.on('message', (rawData) => {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const msgStr = rawData.toString();\n if (msgStr === 'PONG') {\n return;\n }\n if (msgStr === 'PING') {\n if (!opts.dangerouslyDisablePong) {\n client.send('PONG');\n }\n return;\n }\n if (!ctxPromise) {\n // If the ctxPromise wasn't created immediately, we're expecting the first message to be a TRPCConnectionParamsMessage\n ctxPromise = createCtxPromise(() => {\n let msg;\n try {\n msg = JSON.parse(msgStr) as TRPCConnectionParamsMessage;\n\n if (!isObject(msg)) {\n throw new Error('Message was not an object');\n }\n } catch (cause) {\n throw new TRPCError({\n code: 'PARSE_ERROR',\n message: `Malformed TRPCConnectionParamsMessage`,\n cause,\n });\n }\n\n const connectionParams = parseConnectionParamsFromUnknown(msg.data);\n\n return connectionParams;\n });\n return;\n }\n\n const parsedMsgs = run(() => {\n try {\n const msgJSON: unknown = JSON.parse(msgStr);\n const msgs: unknown[] = Array.isArray(msgJSON) ? msgJSON : [msgJSON];\n\n return msgs.map((raw) => parseTRPCMessage(raw, transformer));\n } catch (cause) {\n const error = new TRPCError({\n code: 'PARSE_ERROR',\n cause,\n });\n\n respond({\n id: null,\n error: getErrorShape({\n config: router._def._config,\n error,\n type: 'unknown',\n path: undefined,\n input: undefined,\n ctx,\n }),\n });\n\n return [];\n }\n });\n\n parsedMsgs.map(handleRequest);\n });\n\n // WebSocket errors should be handled, as otherwise unhandled exceptions will crash Node.js.\n // This line was introduced after the following error brought down production systems:\n // \"RangeError: Invalid WebSocket frame: RSV2 and RSV3 must be clear\"\n // Here is the relevant discussion: https://github.com/websockets/ws/issues/1354#issuecomment-774616962\n client.on('error', (cause) => {\n opts.onError?.({\n ctx,\n error: getTRPCErrorFromUnknown(cause),\n input: undefined,\n path: undefined,\n type: 'unknown',\n req,\n });\n });\n\n client.once('close', () => {\n for (const sub of clientSubscriptions.values()) {\n sub.abort();\n }\n clientSubscriptions.clear();\n abortController.abort();\n });\n };\n}\n\n/**\n * Handle WebSocket keep-alive messages\n */\nexport function handleKeepAlive(\n client: ws.WebSocket,\n pingMs = 30_000,\n pongWaitMs = 5_000,\n) {\n let timeout: NodeJS.Timeout | undefined = undefined;\n let ping: NodeJS.Timeout | undefined = undefined;\n\n const schedulePing = () => {\n const scheduleTimeout = () => {\n timeout = setTimeout(() => {\n client.terminate();\n }, pongWaitMs) as any;\n };\n ping = setTimeout(() => {\n client.send('PING');\n\n scheduleTimeout();\n }, pingMs) as any;\n };\n\n const onMessage = () => {\n clearTimeout(ping);\n clearTimeout(timeout);\n\n schedulePing();\n };\n\n client.on('message', onMessage);\n\n client.on('close', () => {\n clearTimeout(ping);\n clearTimeout(timeout);\n });\n\n schedulePing();\n}\n\nexport function applyWSSHandler<TRouter extends AnyRouter>(\n opts: WSSHandlerOptions<TRouter>,\n) {\n const onConnection = getWSConnectionHandler(opts);\n opts.wss.on('connection', (client, req) => {\n if (opts.prefix && !req.url?.startsWith(opts.prefix)) {\n return;\n }\n\n onConnection(client, req);\n });\n\n return {\n broadcastReconnectNotification: () => {\n const response: TRPCReconnectNotification = {\n id: null,\n method: 'reconnect',\n };\n const data = JSON.stringify(response);\n for (const client of opts.wss.clients) {\n if (client.readyState === WEBSOCKET_OPEN) {\n client.send(data);\n }\n }\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ws-Bn5rkP_I.mjs","names":["opts: WSSHandlerOptions<TRouter>","client: ws.WebSocket","req: IncomingMessage","untransformedJSON: TRPCResponseMessage","getConnectionParams: () => TRPCRequestInfo['connectionParams']","ctx: Context | undefined","msg: TRPCClientOutgoingMessage","abortController","next:\n | null\n | TRPCError\n | Awaited<\n typeof abortPromise | ReturnType<(typeof iterator)['next']>\n >","result: null | TRPCResultMessage<unknown>['result']","id","msgJSON: unknown","msgs: unknown[]","timeout: NodeJS.Timeout | undefined","ping: NodeJS.Timeout | undefined","response: TRPCReconnectNotification"],"sources":["../src/adapters/ws.ts"],"sourcesContent":["import type { IncomingMessage } from 'http';\nimport type ws from 'ws';\nimport type {\n AnyRouter,\n CreateContextCallback,\n inferRouterContext,\n} from '../@trpc/server';\nimport {\n callTRPCProcedure,\n getErrorShape,\n getTRPCErrorFromUnknown,\n transformTRPCResponse,\n TRPCError,\n} from '../@trpc/server';\nimport type { TRPCRequestInfo } from '../@trpc/server/http';\nimport { type BaseHandlerOptions } from '../@trpc/server/http';\nimport { parseTRPCMessage } from '../@trpc/server/rpc';\n// @trpc/server/rpc\nimport type {\n TRPCClientOutgoingMessage,\n TRPCConnectionParamsMessage,\n TRPCReconnectNotification,\n TRPCResponseMessage,\n TRPCResultMessage,\n} from '../@trpc/server/rpc';\nimport { parseConnectionParamsFromUnknown } from '../http';\nimport { isObservable, observableToAsyncIterable } from '../observable';\n// eslint-disable-next-line no-restricted-imports\nimport {\n isAsyncIterable,\n isObject,\n isTrackedEnvelope,\n run,\n type MaybePromise,\n} from '../unstable-core-do-not-import';\n// eslint-disable-next-line no-restricted-imports\nimport type { Result } from '../unstable-core-do-not-import';\n// eslint-disable-next-line no-restricted-imports\nimport { iteratorResource } from '../unstable-core-do-not-import/stream/utils/asyncIterable';\nimport { Unpromise } from '../vendor/unpromise';\nimport { createURL, type NodeHTTPCreateContextFnOptions } from './node-http';\n\n/**\n * Importing ws causes a build error\n * @see https://github.com/trpc/trpc/pull/5279\n */\nconst WEBSOCKET_OPEN = 1; /* ws.WebSocket.OPEN */\n\n/**\n * @public\n */\nexport type CreateWSSContextFnOptions = NodeHTTPCreateContextFnOptions<\n IncomingMessage,\n ws.WebSocket\n>;\n\n/**\n * @public\n */\nexport type CreateWSSContextFn<TRouter extends AnyRouter> = (\n opts: CreateWSSContextFnOptions,\n) => MaybePromise<inferRouterContext<TRouter>>;\n\nexport type WSConnectionHandlerOptions<TRouter extends AnyRouter> =\n BaseHandlerOptions<TRouter, IncomingMessage> &\n CreateContextCallback<\n inferRouterContext<TRouter>,\n CreateWSSContextFn<TRouter>\n >;\n\n/**\n * Web socket server handler\n */\nexport type WSSHandlerOptions<TRouter extends AnyRouter> =\n WSConnectionHandlerOptions<TRouter> & {\n wss: ws.WebSocketServer;\n prefix?: string;\n keepAlive?: {\n /**\n * Enable heartbeat messages\n * @default false\n */\n enabled: boolean;\n /**\n * Heartbeat interval in milliseconds\n * @default 30_000\n */\n pingMs?: number;\n /**\n * Terminate the WebSocket if no pong is received after this many milliseconds\n * @default 5_000\n */\n pongWaitMs?: number;\n };\n /**\n * Disable responding to ping messages from the client\n * **Not recommended** - this is mainly used for testing\n * @default false\n */\n dangerouslyDisablePong?: boolean;\n };\n\nexport function getWSConnectionHandler<TRouter extends AnyRouter>(\n opts: WSSHandlerOptions<TRouter>,\n) {\n const { createContext, router } = opts;\n const { transformer } = router._def._config;\n\n return (client: ws.WebSocket, req: IncomingMessage) => {\n type Context = inferRouterContext<TRouter>;\n type ContextResult = Result<Context>;\n\n const clientSubscriptions = new Map<number | string, AbortController>();\n const abortController = new AbortController();\n\n if (opts.keepAlive?.enabled) {\n const { pingMs, pongWaitMs } = opts.keepAlive;\n handleKeepAlive(client, pingMs, pongWaitMs);\n }\n\n function respond(untransformedJSON: TRPCResponseMessage) {\n client.send(\n JSON.stringify(\n transformTRPCResponse(router._def._config, untransformedJSON),\n ),\n );\n }\n\n async function createCtxPromise(\n getConnectionParams: () => TRPCRequestInfo['connectionParams'],\n ): Promise<ContextResult> {\n try {\n return await run(async (): Promise<ContextResult> => {\n ctx = await createContext?.({\n req,\n res: client,\n info: {\n connectionParams: getConnectionParams(),\n calls: [],\n isBatchCall: false,\n accept: null,\n type: 'unknown',\n signal: abortController.signal,\n url: null,\n },\n });\n\n return {\n ok: true,\n value: ctx,\n };\n });\n } catch (cause) {\n const error = getTRPCErrorFromUnknown(cause);\n opts.onError?.({\n error,\n path: undefined,\n type: 'unknown',\n ctx,\n req,\n input: undefined,\n });\n respond({\n id: null,\n error: getErrorShape({\n config: router._def._config,\n error,\n type: 'unknown',\n path: undefined,\n input: undefined,\n ctx,\n }),\n });\n\n // close in next tick\n (globalThis.setImmediate ?? globalThis.setTimeout)(() => {\n client.close();\n });\n return {\n ok: false,\n error,\n };\n }\n }\n\n let ctx: Context | undefined = undefined;\n\n /**\n * promise for initializing the context\n *\n * - the context promise will be created immediately on connection if no connectionParams are expected\n * - if connection params are expected, they will be created once received\n */\n let ctxPromise =\n createURL(req).searchParams.get('connectionParams') === '1'\n ? null\n : createCtxPromise(() => null);\n\n function handleRequest(msg: TRPCClientOutgoingMessage) {\n const { id, jsonrpc } = msg;\n\n if (id === null) {\n const error = getTRPCErrorFromUnknown(\n new TRPCError({\n code: 'PARSE_ERROR',\n message: '`id` is required',\n }),\n );\n opts.onError?.({\n error,\n path: undefined,\n type: 'unknown',\n ctx,\n req,\n input: undefined,\n });\n respond({\n id,\n jsonrpc,\n error: getErrorShape({\n config: router._def._config,\n error,\n type: 'unknown',\n path: undefined,\n input: undefined,\n ctx,\n }),\n });\n return;\n }\n if (msg.method === 'subscription.stop') {\n clientSubscriptions.get(id)?.abort();\n return;\n }\n const { path, lastEventId } = msg.params;\n let { input } = msg.params;\n const type = msg.method;\n\n if (lastEventId !== undefined) {\n if (isObject(input)) {\n input = {\n ...input,\n lastEventId: lastEventId,\n };\n } else {\n input ??= {\n lastEventId: lastEventId,\n };\n }\n }\n run(async () => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const res = await ctxPromise!; // asserts context has been set\n if (!res.ok) {\n throw res.error;\n }\n\n const abortController = new AbortController();\n const result = await callTRPCProcedure({\n router,\n path,\n getRawInput: async () => input,\n ctx,\n type,\n signal: abortController.signal,\n });\n\n const isIterableResult =\n isAsyncIterable(result) || isObservable(result);\n\n if (type !== 'subscription') {\n if (isIterableResult) {\n throw new TRPCError({\n code: 'UNSUPPORTED_MEDIA_TYPE',\n message: `Cannot return an async iterable or observable from a ${type} procedure with WebSockets`,\n });\n }\n // send the value as data if the method is not a subscription\n respond({\n id,\n jsonrpc,\n result: {\n type: 'data',\n data: result,\n },\n });\n return;\n }\n\n if (!isIterableResult) {\n throw new TRPCError({\n message: `Subscription ${path} did not return an observable or a AsyncGenerator`,\n code: 'INTERNAL_SERVER_ERROR',\n });\n }\n\n /* istanbul ignore next -- @preserve */\n if (client.readyState !== WEBSOCKET_OPEN) {\n // if the client got disconnected whilst initializing the subscription\n // no need to send stopped message if the client is disconnected\n\n return;\n }\n\n /* istanbul ignore next -- @preserve */\n if (clientSubscriptions.has(id)) {\n // duplicate request ids for client\n\n throw new TRPCError({\n message: `Duplicate id ${id}`,\n code: 'BAD_REQUEST',\n });\n }\n\n const iterable = isObservable(result)\n ? observableToAsyncIterable(result, abortController.signal)\n : result;\n\n run(async () => {\n await using iterator = iteratorResource(iterable);\n\n const abortPromise = new Promise<'abort'>((resolve) => {\n abortController.signal.onabort = () => resolve('abort');\n });\n // We need those declarations outside the loop for garbage collection reasons. If they\n // were declared inside, they would not be freed until the next value is present.\n let next:\n | null\n | TRPCError\n | Awaited<\n typeof abortPromise | ReturnType<(typeof iterator)['next']>\n >;\n let result: null | TRPCResultMessage<unknown>['result'];\n\n while (true) {\n next = await Unpromise.race([\n iterator.next().catch(getTRPCErrorFromUnknown),\n abortPromise,\n ]);\n\n if (next === 'abort') {\n await iterator.return?.();\n break;\n }\n if (next instanceof Error) {\n const error = getTRPCErrorFromUnknown(next);\n opts.onError?.({ error, path, type, ctx, req, input });\n respond({\n id,\n jsonrpc,\n error: getErrorShape({\n config: router._def._config,\n error,\n type,\n path,\n input,\n ctx,\n }),\n });\n break;\n }\n if (next.done) {\n break;\n }\n\n result = {\n type: 'data',\n data: next.value,\n };\n\n if (isTrackedEnvelope(next.value)) {\n const [id, data] = next.value;\n result.id = id;\n result.data = {\n id,\n data,\n };\n }\n\n respond({\n id,\n jsonrpc,\n result,\n });\n\n // free up references for garbage collection\n next = null;\n result = null;\n }\n\n respond({\n id,\n jsonrpc,\n result: {\n type: 'stopped',\n },\n });\n clientSubscriptions.delete(id);\n }).catch((cause) => {\n const error = getTRPCErrorFromUnknown(cause);\n opts.onError?.({ error, path, type, ctx, req, input });\n respond({\n id,\n jsonrpc,\n error: getErrorShape({\n config: router._def._config,\n error,\n type,\n path,\n input,\n ctx,\n }),\n });\n abortController.abort();\n });\n clientSubscriptions.set(id, abortController);\n\n respond({\n id,\n jsonrpc,\n result: {\n type: 'started',\n },\n });\n }).catch((cause) => {\n // procedure threw an error\n const error = getTRPCErrorFromUnknown(cause);\n opts.onError?.({ error, path, type, ctx, req, input });\n respond({\n id,\n jsonrpc,\n error: getErrorShape({\n config: router._def._config,\n error,\n type,\n path,\n input,\n ctx,\n }),\n });\n });\n }\n client.on('message', (rawData) => {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const msgStr = rawData.toString();\n if (msgStr === 'PONG') {\n return;\n }\n if (msgStr === 'PING') {\n if (!opts.dangerouslyDisablePong) {\n client.send('PONG');\n }\n return;\n }\n if (!ctxPromise) {\n // If the ctxPromise wasn't created immediately, we're expecting the first message to be a TRPCConnectionParamsMessage\n ctxPromise = createCtxPromise(() => {\n let msg;\n try {\n msg = JSON.parse(msgStr) as TRPCConnectionParamsMessage;\n\n if (!isObject(msg)) {\n throw new Error('Message was not an object');\n }\n } catch (cause) {\n throw new TRPCError({\n code: 'PARSE_ERROR',\n message: `Malformed TRPCConnectionParamsMessage`,\n cause,\n });\n }\n\n const connectionParams = parseConnectionParamsFromUnknown(msg.data);\n\n return connectionParams;\n });\n return;\n }\n\n const parsedMsgs = run(() => {\n try {\n const msgJSON: unknown = JSON.parse(msgStr);\n const msgs: unknown[] = Array.isArray(msgJSON) ? msgJSON : [msgJSON];\n\n return msgs.map((raw) => parseTRPCMessage(raw, transformer));\n } catch (cause) {\n const error = new TRPCError({\n code: 'PARSE_ERROR',\n cause,\n });\n\n respond({\n id: null,\n error: getErrorShape({\n config: router._def._config,\n error,\n type: 'unknown',\n path: undefined,\n input: undefined,\n ctx,\n }),\n });\n\n return [];\n }\n });\n\n parsedMsgs.map(handleRequest);\n });\n\n // WebSocket errors should be handled, as otherwise unhandled exceptions will crash Node.js.\n // This line was introduced after the following error brought down production systems:\n // \"RangeError: Invalid WebSocket frame: RSV2 and RSV3 must be clear\"\n // Here is the relevant discussion: https://github.com/websockets/ws/issues/1354#issuecomment-774616962\n client.on('error', (cause) => {\n opts.onError?.({\n ctx,\n error: getTRPCErrorFromUnknown(cause),\n input: undefined,\n path: undefined,\n type: 'unknown',\n req,\n });\n });\n\n client.once('close', () => {\n for (const sub of clientSubscriptions.values()) {\n sub.abort();\n }\n clientSubscriptions.clear();\n abortController.abort();\n });\n };\n}\n\n/**\n * Handle WebSocket keep-alive messages\n */\nexport function handleKeepAlive(\n client: ws.WebSocket,\n pingMs = 30_000,\n pongWaitMs = 5_000,\n) {\n let timeout: NodeJS.Timeout | undefined = undefined;\n let ping: NodeJS.Timeout | undefined = undefined;\n\n const schedulePing = () => {\n const scheduleTimeout = () => {\n timeout = setTimeout(() => {\n client.terminate();\n }, pongWaitMs) as any;\n };\n ping = setTimeout(() => {\n client.send('PING');\n\n scheduleTimeout();\n }, pingMs) as any;\n };\n\n const onMessage = () => {\n clearTimeout(ping);\n clearTimeout(timeout);\n\n schedulePing();\n };\n\n client.on('message', onMessage);\n\n client.on('close', () => {\n clearTimeout(ping);\n clearTimeout(timeout);\n });\n\n schedulePing();\n}\n\nexport function applyWSSHandler<TRouter extends AnyRouter>(\n opts: WSSHandlerOptions<TRouter>,\n) {\n const onConnection = getWSConnectionHandler(opts);\n opts.wss.on('connection', (client, req) => {\n if (opts.prefix && !req.url?.startsWith(opts.prefix)) {\n return;\n }\n\n onConnection(client, req);\n });\n\n return {\n broadcastReconnectNotification: () => {\n const response: TRPCReconnectNotification = {\n id: null,\n method: 'reconnect',\n };\n const data = JSON.stringify(response);\n for (const client of opts.wss.clients) {\n if (client.readyState === WEBSOCKET_OPEN) {\n client.send(data);\n }\n }\n },\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@trpc/server",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "11.4.1",
5
+ "version": "11.4.2-canary.1+ea5ee89c6",
6
6
  "description": "The tRPC server library",
7
7
  "author": "KATT",
8
8
  "license": "MIT",
@@ -228,5 +228,5 @@
228
228
  "peerDependencies": {
229
229
  "typescript": ">=5.7.2"
230
230
  },
231
- "gitHead": "40025d7df6c0bc9fefe21c9a20969565017be138"
231
+ "gitHead": "ea5ee89c66f5b966efc41c9a059c5061a7cd8321"
232
232
  }
@@ -1 +0,0 @@
1
- export * from '../../dist/adapters/aws-lambda';
@@ -1 +0,0 @@
1
- module.exports = require('../../dist/adapters/aws-lambda');
@@ -1 +0,0 @@
1
- export * from '../../dist/adapters/express';
@@ -1 +0,0 @@
1
- module.exports = require('../../dist/adapters/express');
@@ -1 +0,0 @@
1
- export * from '../../dist/adapters/fastify';
@@ -1 +0,0 @@
1
- module.exports = require('../../dist/adapters/fastify');
@@ -1 +0,0 @@
1
- export * from '../../dist/adapters/fetch';
@@ -1 +0,0 @@
1
- module.exports = require('../../dist/adapters/fetch');
@@ -1 +0,0 @@
1
- export * from '../../dist/adapters/next';
@@ -1 +0,0 @@
1
- module.exports = require('../../dist/adapters/next');
@@ -1 +0,0 @@
1
- export * from '../../dist/adapters/next-app-dir';
@@ -1 +0,0 @@
1
- module.exports = require('../../dist/adapters/next-app-dir');
@@ -1 +0,0 @@
1
- export * from '../../../../dist/adapters/node-http/content-type/form-data';
@@ -1 +0,0 @@
1
- module.exports = require('../../../../dist/adapters/node-http/content-type/form-data');
@@ -1 +0,0 @@
1
- export * from '../../../../dist/adapters/node-http/content-type/json';
@@ -1 +0,0 @@
1
- module.exports = require('../../../../dist/adapters/node-http/content-type/json');
@@ -1 +0,0 @@
1
- export * from '../../dist/adapters/node-http';
@@ -1 +0,0 @@
1
- module.exports = require('../../dist/adapters/node-http');
@@ -1 +0,0 @@
1
- export * from '../../dist/adapters/standalone';
@@ -1 +0,0 @@
1
- module.exports = require('../../dist/adapters/standalone');
@@ -1 +0,0 @@
1
- export * from '../../dist/adapters/ws';
@@ -1 +0,0 @@
1
- module.exports = require('../../dist/adapters/ws');
@@ -1,201 +0,0 @@
1
- const require_utils = require('./utils-DVO6HZiR.cjs');
2
-
3
- //#region src/unstable-core-do-not-import/createProxy.ts
4
- const noop = () => {};
5
- const freezeIfAvailable = (obj) => {
6
- if (Object.freeze) Object.freeze(obj);
7
- };
8
- function createInnerProxy(callback, path, memo) {
9
- const cacheKey = path.join(".");
10
- memo[cacheKey] ??= new Proxy(noop, {
11
- get(_obj, key) {
12
- if (typeof key !== "string" || key === "then") return void 0;
13
- return createInnerProxy(callback, [...path, key], memo);
14
- },
15
- apply(_1, _2, args) {
16
- const lastOfPath = path[path.length - 1];
17
- let opts = {
18
- args,
19
- path
20
- };
21
- if (lastOfPath === "call") opts = {
22
- args: args.length >= 2 ? [args[1]] : [],
23
- path: path.slice(0, -1)
24
- };
25
- else if (lastOfPath === "apply") opts = {
26
- args: args.length >= 2 ? args[1] : [],
27
- path: path.slice(0, -1)
28
- };
29
- freezeIfAvailable(opts.args);
30
- freezeIfAvailable(opts.path);
31
- return callback(opts);
32
- }
33
- });
34
- return memo[cacheKey];
35
- }
36
- /**
37
- * Creates a proxy that calls the callback with the path and arguments
38
- *
39
- * @internal
40
- */
41
- const createRecursiveProxy = (callback) => createInnerProxy(callback, [], Object.create(null));
42
- /**
43
- * Used in place of `new Proxy` where each handler will map 1 level deep to another value.
44
- *
45
- * @internal
46
- */
47
- const createFlatProxy = (callback) => {
48
- return new Proxy(noop, { get(_obj, name) {
49
- if (name === "then") return void 0;
50
- return callback(name);
51
- } });
52
- };
53
-
54
- //#endregion
55
- //#region src/unstable-core-do-not-import/http/getHTTPStatusCode.ts
56
- const JSONRPC2_TO_HTTP_CODE = {
57
- PARSE_ERROR: 400,
58
- BAD_REQUEST: 400,
59
- UNAUTHORIZED: 401,
60
- PAYMENT_REQUIRED: 402,
61
- FORBIDDEN: 403,
62
- NOT_FOUND: 404,
63
- METHOD_NOT_SUPPORTED: 405,
64
- TIMEOUT: 408,
65
- CONFLICT: 409,
66
- PRECONDITION_FAILED: 412,
67
- PAYLOAD_TOO_LARGE: 413,
68
- UNSUPPORTED_MEDIA_TYPE: 415,
69
- UNPROCESSABLE_CONTENT: 422,
70
- TOO_MANY_REQUESTS: 429,
71
- CLIENT_CLOSED_REQUEST: 499,
72
- INTERNAL_SERVER_ERROR: 500,
73
- NOT_IMPLEMENTED: 501,
74
- BAD_GATEWAY: 502,
75
- SERVICE_UNAVAILABLE: 503,
76
- GATEWAY_TIMEOUT: 504
77
- };
78
- const HTTP_CODE_TO_JSONRPC2 = {
79
- 400: "BAD_REQUEST",
80
- 401: "UNAUTHORIZED",
81
- 402: "PAYMENT_REQUIRED",
82
- 403: "FORBIDDEN",
83
- 404: "NOT_FOUND",
84
- 405: "METHOD_NOT_SUPPORTED",
85
- 408: "TIMEOUT",
86
- 409: "CONFLICT",
87
- 412: "PRECONDITION_FAILED",
88
- 413: "PAYLOAD_TOO_LARGE",
89
- 415: "UNSUPPORTED_MEDIA_TYPE",
90
- 422: "UNPROCESSABLE_CONTENT",
91
- 429: "TOO_MANY_REQUESTS",
92
- 499: "CLIENT_CLOSED_REQUEST",
93
- 500: "INTERNAL_SERVER_ERROR",
94
- 501: "NOT_IMPLEMENTED",
95
- 502: "BAD_GATEWAY",
96
- 503: "SERVICE_UNAVAILABLE",
97
- 504: "GATEWAY_TIMEOUT"
98
- };
99
- function getStatusCodeFromKey(code) {
100
- return JSONRPC2_TO_HTTP_CODE[code] ?? 500;
101
- }
102
- function getStatusKeyFromCode(code) {
103
- return HTTP_CODE_TO_JSONRPC2[code] ?? "INTERNAL_SERVER_ERROR";
104
- }
105
- function getHTTPStatusCode(json) {
106
- const arr = Array.isArray(json) ? json : [json];
107
- const httpStatuses = new Set(arr.map((res) => {
108
- if ("error" in res && require_utils.isObject(res.error.data)) {
109
- if (typeof res.error.data?.["httpStatus"] === "number") return res.error.data["httpStatus"];
110
- const code = require_utils.TRPC_ERROR_CODES_BY_NUMBER[res.error.code];
111
- return getStatusCodeFromKey(code);
112
- }
113
- return 200;
114
- }));
115
- if (httpStatuses.size !== 1) return 207;
116
- const httpStatus = httpStatuses.values().next().value;
117
- return httpStatus;
118
- }
119
- function getHTTPStatusCodeFromError(error) {
120
- return getStatusCodeFromKey(error.code);
121
- }
122
-
123
- //#endregion
124
- //#region src/unstable-core-do-not-import/error/getErrorShape.ts
125
- /**
126
- * @internal
127
- */
128
- function getErrorShape(opts) {
129
- const { path, error, config } = opts;
130
- const { code } = opts.error;
131
- const shape = {
132
- message: error.message,
133
- code: require_utils.TRPC_ERROR_CODES_BY_KEY[code],
134
- data: {
135
- code,
136
- httpStatus: getHTTPStatusCodeFromError(error)
137
- }
138
- };
139
- if (config.isDev && typeof opts.error.stack === "string") shape.data.stack = opts.error.stack;
140
- if (typeof path === "string") shape.data.path = path;
141
- return config.errorFormatter({
142
- ...opts,
143
- shape
144
- });
145
- }
146
-
147
- //#endregion
148
- Object.defineProperty(exports, 'HTTP_CODE_TO_JSONRPC2', {
149
- enumerable: true,
150
- get: function () {
151
- return HTTP_CODE_TO_JSONRPC2;
152
- }
153
- });
154
- Object.defineProperty(exports, 'JSONRPC2_TO_HTTP_CODE', {
155
- enumerable: true,
156
- get: function () {
157
- return JSONRPC2_TO_HTTP_CODE;
158
- }
159
- });
160
- Object.defineProperty(exports, 'createFlatProxy', {
161
- enumerable: true,
162
- get: function () {
163
- return createFlatProxy;
164
- }
165
- });
166
- Object.defineProperty(exports, 'createRecursiveProxy', {
167
- enumerable: true,
168
- get: function () {
169
- return createRecursiveProxy;
170
- }
171
- });
172
- Object.defineProperty(exports, 'getErrorShape', {
173
- enumerable: true,
174
- get: function () {
175
- return getErrorShape;
176
- }
177
- });
178
- Object.defineProperty(exports, 'getHTTPStatusCode', {
179
- enumerable: true,
180
- get: function () {
181
- return getHTTPStatusCode;
182
- }
183
- });
184
- Object.defineProperty(exports, 'getHTTPStatusCodeFromError', {
185
- enumerable: true,
186
- get: function () {
187
- return getHTTPStatusCodeFromError;
188
- }
189
- });
190
- Object.defineProperty(exports, 'getStatusCodeFromKey', {
191
- enumerable: true,
192
- get: function () {
193
- return getStatusCodeFromKey;
194
- }
195
- });
196
- Object.defineProperty(exports, 'getStatusKeyFromCode', {
197
- enumerable: true,
198
- get: function () {
199
- return getStatusKeyFromCode;
200
- }
201
- });