@trpc/client 11.1.3-alpha-tmp-tsdown.24 → 11.1.3-alpha-tmp-tsdown.28

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 (263) hide show
  1. package/dist/{TRPCClientError.js → TRPCClientError-CGgRtttT.cjs} +14 -4
  2. package/dist/{TRPCClientError.mjs → TRPCClientError-COkhCKf3.mjs} +1 -1
  3. package/dist/TRPCClientError-COkhCKf3.mjs.map +1 -0
  4. package/dist/httpBatchLink-CIC9PZ_Z.cjs +267 -0
  5. package/dist/httpBatchLink-DIfnmmcu.mjs +238 -0
  6. package/dist/httpBatchLink-DIfnmmcu.mjs.map +1 -0
  7. package/dist/{links/HTTPBatchLinkOptions.d.mts → httpBatchLink.d-BN2Iw_cK.d.mts} +13 -5
  8. package/dist/httpBatchLink.d-BN2Iw_cK.d.mts.map +1 -0
  9. package/dist/{links/HTTPBatchLinkOptions.d.ts → httpBatchLink.d-CLAuJKNV.d.cts} +13 -5
  10. package/dist/httpBatchLink.d-CLAuJKNV.d.cts.map +1 -0
  11. package/dist/httpLink-9bpwQ15c.mjs +90 -0
  12. package/dist/httpLink-9bpwQ15c.mjs.map +1 -0
  13. package/dist/{links/httpLink.js → httpLink-BbVj_TgM.cjs} +43 -9
  14. package/dist/{links/httpLink.d.ts → httpLink.d-CTSOARfE.d.mts} +3 -3
  15. package/dist/httpLink.d-CTSOARfE.d.mts.map +1 -0
  16. package/dist/httpLink.d-yMKfOlTU.d.cts +23 -0
  17. package/dist/httpLink.d-yMKfOlTU.d.cts.map +1 -0
  18. package/dist/{links/internals/httpUtils.mjs → httpUtils-3pbQzhUL.mjs} +13 -4
  19. package/dist/httpUtils-3pbQzhUL.mjs.map +1 -0
  20. package/dist/{links/internals/httpUtils.js → httpUtils-Buf6jCgh.cjs} +55 -10
  21. package/dist/{links/internals/httpUtils.d.ts → httpUtils.d-C8wPxU79.d.mts} +3 -3
  22. package/dist/httpUtils.d-C8wPxU79.d.mts.map +1 -0
  23. package/dist/{links/internals/httpUtils.d.mts → httpUtils.d-DNRVGNHs.d.cts} +3 -3
  24. package/dist/httpUtils.d-DNRVGNHs.d.cts.map +1 -0
  25. package/dist/index.cjs +731 -0
  26. package/dist/index.d.cts +197 -0
  27. package/dist/index.d.cts.map +1 -0
  28. package/dist/index.d.mts +197 -21
  29. package/dist/index.d.mts.map +1 -0
  30. package/dist/index.mjs +733 -19
  31. package/dist/index.mjs.map +1 -0
  32. package/dist/links/httpBatchLink.cjs +6 -0
  33. package/dist/links/httpBatchLink.d.cts +6 -0
  34. package/dist/links/httpBatchLink.d.mts +6 -15
  35. package/dist/links/httpBatchLink.mjs +5 -93
  36. package/dist/links/httpLink.cjs +6 -0
  37. package/dist/links/httpLink.d.cts +6 -0
  38. package/dist/links/httpLink.d.mts +6 -23
  39. package/dist/links/httpLink.mjs +5 -78
  40. package/dist/links/loggerLink.cjs +3 -0
  41. package/dist/links/loggerLink.d.cts +4 -0
  42. package/dist/links/loggerLink.d.mts +4 -55
  43. package/dist/links/loggerLink.mjs +2 -124
  44. package/dist/links/splitLink.cjs +3 -0
  45. package/dist/links/splitLink.d.cts +4 -0
  46. package/dist/links/splitLink.d.mts +4 -20
  47. package/dist/links/splitLink.mjs +2 -25
  48. package/dist/links/wsLink/wsLink.cjs +6 -0
  49. package/dist/links/wsLink/wsLink.d.cts +5 -0
  50. package/dist/links/wsLink/wsLink.d.mts +5 -14
  51. package/dist/links/wsLink/wsLink.mjs +4 -32
  52. package/dist/{links/loggerLink.js → loggerLink-CsDfg5Bb.cjs} +8 -3
  53. package/dist/loggerLink-PGBSQFcR.mjs +125 -0
  54. package/dist/loggerLink-PGBSQFcR.mjs.map +1 -0
  55. package/dist/{links/loggerLink.d.ts → loggerLink.d-CZjK1CXm.d.mts} +2 -3
  56. package/dist/loggerLink.d-CZjK1CXm.d.mts.map +1 -0
  57. package/dist/loggerLink.d-DU855urG.d.cts +54 -0
  58. package/dist/loggerLink.d-DU855urG.d.cts.map +1 -0
  59. package/dist/splitLink-BMgxggng.cjs +58 -0
  60. package/dist/{links/internals/createChain.mjs → splitLink-BVblHq4n.mjs} +23 -2
  61. package/dist/splitLink-BVblHq4n.mjs.map +1 -0
  62. package/dist/{links/splitLink.d.ts → splitLink.d-BAqgq0NG.d.mts} +2 -2
  63. package/dist/splitLink.d-BAqgq0NG.d.mts.map +1 -0
  64. package/dist/splitLink.d-GdevSkGW.d.cts +20 -0
  65. package/dist/splitLink.d-GdevSkGW.d.cts.map +1 -0
  66. package/dist/{links/internals/subscriptions.d.mts → subscriptions.d-Ciljg_dH.d.cts} +1 -1
  67. package/dist/subscriptions.d-Ciljg_dH.d.cts.map +1 -0
  68. package/dist/{links/internals/subscriptions.d.ts → subscriptions.d-U92STdZl.d.mts} +1 -1
  69. package/dist/subscriptions.d-U92STdZl.d.mts.map +1 -0
  70. package/dist/types.d-DXbqQLCC.d.mts +182 -0
  71. package/dist/types.d-DXbqQLCC.d.mts.map +1 -0
  72. package/dist/types.d-DqGYG6S_.d.cts +182 -0
  73. package/dist/types.d-DqGYG6S_.d.cts.map +1 -0
  74. package/dist/{internals/transformer.js → unstable-internals-CYBH4jbF.cjs} +6 -1
  75. package/dist/{internals/transformer.mjs → unstable-internals-DU4WecoG.mjs} +1 -1
  76. package/dist/unstable-internals-DU4WecoG.mjs.map +1 -0
  77. package/dist/unstable-internals.cjs +3 -0
  78. package/dist/{internals/transformer.d.mts → unstable-internals.d-DyLd-B0J.d.mts} +1 -1
  79. package/dist/unstable-internals.d-DyLd-B0J.d.mts.map +1 -0
  80. package/dist/{internals/transformer.d.ts → unstable-internals.d-kWsZTlQq.d.cts} +1 -1
  81. package/dist/unstable-internals.d-kWsZTlQq.d.cts.map +1 -0
  82. package/dist/unstable-internals.d.cts +3 -0
  83. package/dist/unstable-internals.d.mts +2 -2
  84. package/dist/unstable-internals.mjs +1 -1
  85. package/dist/wsLink-DbSHOzlB.mjs +698 -0
  86. package/dist/wsLink-DbSHOzlB.mjs.map +1 -0
  87. package/dist/wsLink-DhJ50EC5.cjs +715 -0
  88. package/dist/wsLink.d-BqO7ltN_.d.mts +194 -0
  89. package/dist/wsLink.d-BqO7ltN_.d.mts.map +1 -0
  90. package/dist/wsLink.d-DtZjg09g.d.cts +194 -0
  91. package/dist/wsLink.d-DtZjg09g.d.cts.map +1 -0
  92. package/links/httpBatchLink/package.json +1 -1
  93. package/links/httpLink/package.json +1 -1
  94. package/links/loggerLink/package.json +1 -1
  95. package/links/splitLink/package.json +1 -1
  96. package/links/wsLink/wsLink/package.json +1 -1
  97. package/package.json +22 -21
  98. package/unstable-internals/package.json +1 -1
  99. package/dist/TRPCClientError.d.mts +0 -32
  100. package/dist/TRPCClientError.d.mts.map +0 -1
  101. package/dist/TRPCClientError.d.ts +0 -32
  102. package/dist/TRPCClientError.d.ts.map +0 -1
  103. package/dist/TRPCClientError.mjs.map +0 -1
  104. package/dist/_virtual/rolldown_runtime.mjs +0 -27
  105. package/dist/createTRPCClient.d.mts +0 -69
  106. package/dist/createTRPCClient.d.mts.map +0 -1
  107. package/dist/createTRPCClient.d.ts +0 -69
  108. package/dist/createTRPCClient.d.ts.map +0 -1
  109. package/dist/createTRPCClient.js +0 -48
  110. package/dist/createTRPCClient.mjs +0 -45
  111. package/dist/createTRPCClient.mjs.map +0 -1
  112. package/dist/createTRPCUntypedClient.d.mts +0 -8
  113. package/dist/createTRPCUntypedClient.d.mts.map +0 -1
  114. package/dist/createTRPCUntypedClient.d.ts +0 -8
  115. package/dist/createTRPCUntypedClient.d.ts.map +0 -1
  116. package/dist/createTRPCUntypedClient.js +0 -9
  117. package/dist/createTRPCUntypedClient.mjs +0 -10
  118. package/dist/createTRPCUntypedClient.mjs.map +0 -1
  119. package/dist/getFetch.d.mts +0 -9
  120. package/dist/getFetch.d.mts.map +0 -1
  121. package/dist/getFetch.d.ts +0 -9
  122. package/dist/getFetch.d.ts.map +0 -1
  123. package/dist/getFetch.js +0 -12
  124. package/dist/getFetch.mjs +0 -12
  125. package/dist/getFetch.mjs.map +0 -1
  126. package/dist/index.d.ts +0 -21
  127. package/dist/index.js +0 -43
  128. package/dist/internals/TRPCUntypedClient.d.mts +0 -45
  129. package/dist/internals/TRPCUntypedClient.d.mts.map +0 -1
  130. package/dist/internals/TRPCUntypedClient.d.ts +0 -45
  131. package/dist/internals/TRPCUntypedClient.d.ts.map +0 -1
  132. package/dist/internals/TRPCUntypedClient.js +0 -96
  133. package/dist/internals/TRPCUntypedClient.mjs +0 -96
  134. package/dist/internals/TRPCUntypedClient.mjs.map +0 -1
  135. package/dist/internals/dataLoader.js +0 -106
  136. package/dist/internals/dataLoader.mjs +0 -106
  137. package/dist/internals/dataLoader.mjs.map +0 -1
  138. package/dist/internals/inputWithTrackedEventId.js +0 -13
  139. package/dist/internals/inputWithTrackedEventId.mjs +0 -13
  140. package/dist/internals/inputWithTrackedEventId.mjs.map +0 -1
  141. package/dist/internals/signals.js +0 -46
  142. package/dist/internals/signals.mjs +0 -44
  143. package/dist/internals/signals.mjs.map +0 -1
  144. package/dist/internals/transformer.d.mts.map +0 -1
  145. package/dist/internals/transformer.d.ts.map +0 -1
  146. package/dist/internals/transformer.mjs.map +0 -1
  147. package/dist/internals/types.d.mts +0 -84
  148. package/dist/internals/types.d.mts.map +0 -1
  149. package/dist/internals/types.d.ts +0 -84
  150. package/dist/internals/types.d.ts.map +0 -1
  151. package/dist/links/HTTPBatchLinkOptions.d.mts.map +0 -1
  152. package/dist/links/HTTPBatchLinkOptions.d.ts.map +0 -1
  153. package/dist/links/httpBatchLink.d.mts.map +0 -1
  154. package/dist/links/httpBatchLink.d.ts +0 -15
  155. package/dist/links/httpBatchLink.d.ts.map +0 -1
  156. package/dist/links/httpBatchLink.js +0 -94
  157. package/dist/links/httpBatchLink.mjs.map +0 -1
  158. package/dist/links/httpBatchStreamLink.d.mts +0 -19
  159. package/dist/links/httpBatchStreamLink.d.mts.map +0 -1
  160. package/dist/links/httpBatchStreamLink.d.ts +0 -19
  161. package/dist/links/httpBatchStreamLink.d.ts.map +0 -1
  162. package/dist/links/httpBatchStreamLink.js +0 -126
  163. package/dist/links/httpBatchStreamLink.mjs +0 -125
  164. package/dist/links/httpBatchStreamLink.mjs.map +0 -1
  165. package/dist/links/httpLink.d.mts.map +0 -1
  166. package/dist/links/httpLink.d.ts.map +0 -1
  167. package/dist/links/httpLink.mjs.map +0 -1
  168. package/dist/links/httpSubscriptionLink.d.mts +0 -29
  169. package/dist/links/httpSubscriptionLink.d.mts.map +0 -1
  170. package/dist/links/httpSubscriptionLink.d.ts +0 -29
  171. package/dist/links/httpSubscriptionLink.d.ts.map +0 -1
  172. package/dist/links/httpSubscriptionLink.js +0 -142
  173. package/dist/links/httpSubscriptionLink.mjs +0 -141
  174. package/dist/links/httpSubscriptionLink.mjs.map +0 -1
  175. package/dist/links/internals/contentTypes.d.mts +0 -9
  176. package/dist/links/internals/contentTypes.d.mts.map +0 -1
  177. package/dist/links/internals/contentTypes.d.ts +0 -9
  178. package/dist/links/internals/contentTypes.d.ts.map +0 -1
  179. package/dist/links/internals/contentTypes.js +0 -16
  180. package/dist/links/internals/contentTypes.mjs +0 -14
  181. package/dist/links/internals/contentTypes.mjs.map +0 -1
  182. package/dist/links/internals/createChain.js +0 -26
  183. package/dist/links/internals/createChain.mjs.map +0 -1
  184. package/dist/links/internals/httpUtils.d.mts.map +0 -1
  185. package/dist/links/internals/httpUtils.d.ts.map +0 -1
  186. package/dist/links/internals/httpUtils.mjs.map +0 -1
  187. package/dist/links/internals/subscriptions.d.mts.map +0 -1
  188. package/dist/links/internals/subscriptions.d.ts.map +0 -1
  189. package/dist/links/internals/urlWithConnectionParams.d.mts +0 -24
  190. package/dist/links/internals/urlWithConnectionParams.d.mts.map +0 -1
  191. package/dist/links/internals/urlWithConnectionParams.d.ts +0 -24
  192. package/dist/links/internals/urlWithConnectionParams.d.ts.map +0 -1
  193. package/dist/links/internals/urlWithConnectionParams.js +0 -12
  194. package/dist/links/internals/urlWithConnectionParams.mjs +0 -12
  195. package/dist/links/internals/urlWithConnectionParams.mjs.map +0 -1
  196. package/dist/links/localLink.d.mts +0 -21
  197. package/dist/links/localLink.d.mts.map +0 -1
  198. package/dist/links/localLink.d.ts +0 -21
  199. package/dist/links/localLink.d.ts.map +0 -1
  200. package/dist/links/localLink.js +0 -192
  201. package/dist/links/localLink.mjs +0 -193
  202. package/dist/links/localLink.mjs.map +0 -1
  203. package/dist/links/loggerLink.d.mts.map +0 -1
  204. package/dist/links/loggerLink.d.ts.map +0 -1
  205. package/dist/links/loggerLink.mjs.map +0 -1
  206. package/dist/links/retryLink.d.mts +0 -36
  207. package/dist/links/retryLink.d.mts.map +0 -1
  208. package/dist/links/retryLink.d.ts +0 -36
  209. package/dist/links/retryLink.d.ts.map +0 -1
  210. package/dist/links/retryLink.js +0 -64
  211. package/dist/links/retryLink.mjs +0 -64
  212. package/dist/links/retryLink.mjs.map +0 -1
  213. package/dist/links/splitLink.d.mts.map +0 -1
  214. package/dist/links/splitLink.d.ts.map +0 -1
  215. package/dist/links/splitLink.js +0 -26
  216. package/dist/links/splitLink.mjs.map +0 -1
  217. package/dist/links/types.d.mts +0 -68
  218. package/dist/links/types.d.mts.map +0 -1
  219. package/dist/links/types.d.ts +0 -68
  220. package/dist/links/types.d.ts.map +0 -1
  221. package/dist/links/wsLink/createWsClient.d.mts +0 -9
  222. package/dist/links/wsLink/createWsClient.d.mts.map +0 -1
  223. package/dist/links/wsLink/createWsClient.d.ts +0 -9
  224. package/dist/links/wsLink/createWsClient.d.ts.map +0 -1
  225. package/dist/links/wsLink/createWsClient.js +0 -9
  226. package/dist/links/wsLink/createWsClient.mjs +0 -10
  227. package/dist/links/wsLink/createWsClient.mjs.map +0 -1
  228. package/dist/links/wsLink/wsClient/options.d.mts +0 -69
  229. package/dist/links/wsLink/wsClient/options.d.mts.map +0 -1
  230. package/dist/links/wsLink/wsClient/options.d.ts +0 -69
  231. package/dist/links/wsLink/wsClient/options.d.ts.map +0 -1
  232. package/dist/links/wsLink/wsClient/options.js +0 -24
  233. package/dist/links/wsLink/wsClient/options.mjs +0 -22
  234. package/dist/links/wsLink/wsClient/options.mjs.map +0 -1
  235. package/dist/links/wsLink/wsClient/requestManager.js +0 -136
  236. package/dist/links/wsLink/wsClient/requestManager.mjs +0 -137
  237. package/dist/links/wsLink/wsClient/requestManager.mjs.map +0 -1
  238. package/dist/links/wsLink/wsClient/utils.js +0 -77
  239. package/dist/links/wsLink/wsClient/utils.mjs +0 -74
  240. package/dist/links/wsLink/wsClient/utils.mjs.map +0 -1
  241. package/dist/links/wsLink/wsClient/wsClient.d.mts +0 -101
  242. package/dist/links/wsLink/wsClient/wsClient.d.mts.map +0 -1
  243. package/dist/links/wsLink/wsClient/wsClient.d.ts +0 -101
  244. package/dist/links/wsLink/wsClient/wsClient.d.ts.map +0 -1
  245. package/dist/links/wsLink/wsClient/wsClient.js +0 -276
  246. package/dist/links/wsLink/wsClient/wsClient.mjs +0 -276
  247. package/dist/links/wsLink/wsClient/wsClient.mjs.map +0 -1
  248. package/dist/links/wsLink/wsClient/wsConnection.js +0 -165
  249. package/dist/links/wsLink/wsClient/wsConnection.mjs +0 -164
  250. package/dist/links/wsLink/wsClient/wsConnection.mjs.map +0 -1
  251. package/dist/links/wsLink/wsLink.d.mts.map +0 -1
  252. package/dist/links/wsLink/wsLink.d.ts +0 -14
  253. package/dist/links/wsLink/wsLink.d.ts.map +0 -1
  254. package/dist/links/wsLink/wsLink.js +0 -34
  255. package/dist/links/wsLink/wsLink.mjs.map +0 -1
  256. package/dist/links.js +0 -11
  257. package/dist/links.mjs +0 -11
  258. package/dist/node_modules/.pnpm/@oxc-project_runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.js +0 -68
  259. package/dist/node_modules/.pnpm/@oxc-project_runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.mjs +0 -66
  260. package/dist/node_modules/.pnpm/@oxc-project_runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.mjs.map +0 -1
  261. package/dist/unstable-internals.d.ts +0 -3
  262. package/dist/unstable-internals.js +0 -3
  263. /package/dist/{_virtual/rolldown_runtime.js → chunk-DWy1uDak.cjs} +0 -0
@@ -1,276 +0,0 @@
1
- const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.js');
2
- const require_TRPCClientError = require('../../../TRPCClientError.js');
3
- const require_options = require('./options.js');
4
- const require_utils = require('./utils.js');
5
- const require_requestManager = require('./requestManager.js');
6
- const require_wsConnection = require('./wsConnection.js');
7
- const __trpc_server_observable = require_rolldown_runtime.__toESM(require("@trpc/server/observable"));
8
- const __trpc_server_unstable_core_do_not_import = require_rolldown_runtime.__toESM(require("@trpc/server/unstable-core-do-not-import"));
9
-
10
- //#region src/links/wsLink/wsClient/wsClient.ts
11
- /**
12
- * A WebSocket client for managing TRPC operations, supporting lazy initialization,
13
- * reconnection, keep-alive, and request management.
14
- */
15
- var WsClient = class {
16
- /**
17
- * Observable tracking the current connection state, including errors.
18
- */
19
- connectionState;
20
- allowReconnect = false;
21
- requestManager = new require_requestManager.RequestManager();
22
- activeConnection;
23
- reconnectRetryDelay;
24
- inactivityTimeout;
25
- callbacks;
26
- lazyMode;
27
- constructor(opts) {
28
- this.callbacks = {
29
- onOpen: opts.onOpen,
30
- onClose: opts.onClose,
31
- onError: opts.onError
32
- };
33
- const lazyOptions = {
34
- ...require_options.lazyDefaults,
35
- ...opts.lazy
36
- };
37
- this.inactivityTimeout = new require_utils.ResettableTimeout(() => {
38
- if (this.requestManager.hasOutgoingRequests() || this.requestManager.hasPendingRequests()) {
39
- this.inactivityTimeout.reset();
40
- return;
41
- }
42
- this.close().catch(() => null);
43
- }, lazyOptions.closeMs);
44
- this.activeConnection = new require_wsConnection.WsConnection({
45
- WebSocketPonyfill: opts.WebSocket,
46
- urlOptions: opts,
47
- keepAlive: {
48
- ...require_options.keepAliveDefaults,
49
- ...opts.keepAlive
50
- }
51
- });
52
- this.activeConnection.wsObservable.subscribe({ next: (ws) => {
53
- if (!ws) return;
54
- this.setupWebSocketListeners(ws);
55
- } });
56
- this.reconnectRetryDelay = opts.retryDelayMs ?? require_options.exponentialBackoff;
57
- this.lazyMode = lazyOptions.enabled;
58
- this.connectionState = (0, __trpc_server_observable.behaviorSubject)({
59
- type: "state",
60
- state: lazyOptions.enabled ? "idle" : "connecting",
61
- error: null
62
- });
63
- if (!this.lazyMode) this.open().catch(() => null);
64
- }
65
- /**
66
- * Opens the WebSocket connection. Handles reconnection attempts and updates
67
- * the connection state accordingly.
68
- */
69
- async open() {
70
- this.allowReconnect = true;
71
- if (this.connectionState.get().state !== "connecting") this.connectionState.next({
72
- type: "state",
73
- state: "connecting",
74
- error: null
75
- });
76
- try {
77
- await this.activeConnection.open();
78
- } catch (error) {
79
- this.reconnect(new require_utils.TRPCWebSocketClosedError({
80
- message: "Initialization error",
81
- cause: error
82
- }));
83
- return this.reconnecting;
84
- }
85
- }
86
- /**
87
- * Closes the WebSocket connection and stops managing requests.
88
- * Ensures all outgoing and pending requests are properly finalized.
89
- */
90
- async close() {
91
- this.allowReconnect = false;
92
- this.inactivityTimeout.stop();
93
- const requestsToAwait = [];
94
- for (const request of this.requestManager.getRequests()) if (request.message.method === "subscription") request.callbacks.complete();
95
- else if (request.state === "outgoing") request.callbacks.error(require_TRPCClientError.TRPCClientError.from(new require_utils.TRPCWebSocketClosedError({ message: "Closed before connection was established" })));
96
- else requestsToAwait.push(request.end);
97
- await Promise.all(requestsToAwait).catch(() => null);
98
- await this.activeConnection.close().catch(() => null);
99
- this.connectionState.next({
100
- type: "state",
101
- state: "idle",
102
- error: null
103
- });
104
- }
105
- /**
106
- * Method to request the server.
107
- * Handles data transformation, batching of requests, and subscription lifecycle.
108
- *
109
- * @param op - The operation details including id, type, path, input and signal
110
- * @param transformer - Data transformer for serializing requests and deserializing responses
111
- * @param lastEventId - Optional ID of the last received event for subscriptions
112
- *
113
- * @returns An observable that emits operation results and handles cleanup
114
- */
115
- request({ op: { id, type, path, input, signal }, transformer, lastEventId }) {
116
- return (0, __trpc_server_observable.observable)((observer) => {
117
- const abort = this.batchSend({
118
- id,
119
- method: type,
120
- params: {
121
- input: transformer.input.serialize(input),
122
- path,
123
- lastEventId
124
- }
125
- }, {
126
- ...observer,
127
- next(event) {
128
- const transformed = (0, __trpc_server_unstable_core_do_not_import.transformResult)(event, transformer.output);
129
- if (!transformed.ok) {
130
- observer.error(require_TRPCClientError.TRPCClientError.from(transformed.error));
131
- return;
132
- }
133
- observer.next({ result: transformed.result });
134
- }
135
- });
136
- return () => {
137
- abort();
138
- if (type === "subscription" && this.activeConnection.isOpen()) this.send({
139
- id,
140
- method: "subscription.stop"
141
- });
142
- signal?.removeEventListener("abort", abort);
143
- };
144
- });
145
- }
146
- get connection() {
147
- return require_wsConnection.backwardCompatibility(this.activeConnection);
148
- }
149
- /**
150
- * Manages the reconnection process for the WebSocket using retry logic.
151
- * Ensures that only one reconnection attempt is active at a time by tracking the current
152
- * reconnection state in the `reconnecting` promise.
153
- */
154
- reconnecting = null;
155
- reconnect(closedError) {
156
- this.connectionState.next({
157
- type: "state",
158
- state: "connecting",
159
- error: require_TRPCClientError.TRPCClientError.from(closedError)
160
- });
161
- if (this.reconnecting) return;
162
- const tryReconnect = async (attemptIndex) => {
163
- try {
164
- await (0, __trpc_server_unstable_core_do_not_import.sleep)(this.reconnectRetryDelay(attemptIndex));
165
- if (this.allowReconnect) {
166
- await this.activeConnection.close();
167
- await this.activeConnection.open();
168
- if (this.requestManager.hasPendingRequests()) this.send(this.requestManager.getPendingRequests().map(({ message }) => message));
169
- }
170
- this.reconnecting = null;
171
- } catch {
172
- await tryReconnect(attemptIndex + 1);
173
- }
174
- };
175
- this.reconnecting = tryReconnect(0);
176
- }
177
- setupWebSocketListeners(ws) {
178
- const handleCloseOrError = (cause) => {
179
- const reqs = this.requestManager.getPendingRequests();
180
- for (const { message, callbacks } of reqs) {
181
- if (message.method === "subscription") continue;
182
- callbacks.error(require_TRPCClientError.TRPCClientError.from(cause ?? new require_utils.TRPCWebSocketClosedError({
183
- message: "WebSocket closed",
184
- cause
185
- })));
186
- this.requestManager.delete(message.id);
187
- }
188
- };
189
- ws.addEventListener("open", () => {
190
- (0, __trpc_server_unstable_core_do_not_import.run)(async () => {
191
- if (this.lazyMode) this.inactivityTimeout.start();
192
- this.callbacks.onOpen?.();
193
- this.connectionState.next({
194
- type: "state",
195
- state: "pending",
196
- error: null
197
- });
198
- }).catch((error) => {
199
- ws.close(3e3);
200
- handleCloseOrError(error);
201
- });
202
- });
203
- ws.addEventListener("message", ({ data }) => {
204
- this.inactivityTimeout.reset();
205
- if (typeof data !== "string" || ["PING", "PONG"].includes(data)) return;
206
- const incomingMessage = JSON.parse(data);
207
- if ("method" in incomingMessage) {
208
- this.handleIncomingRequest(incomingMessage);
209
- return;
210
- }
211
- this.handleResponseMessage(incomingMessage);
212
- });
213
- ws.addEventListener("close", (event) => {
214
- handleCloseOrError(event);
215
- this.callbacks.onClose?.(event);
216
- if (!this.lazyMode || this.requestManager.hasPendingSubscriptions()) this.reconnect(new require_utils.TRPCWebSocketClosedError({
217
- message: "WebSocket closed",
218
- cause: event
219
- }));
220
- });
221
- ws.addEventListener("error", (event) => {
222
- handleCloseOrError(event);
223
- this.callbacks.onError?.(event);
224
- this.reconnect(new require_utils.TRPCWebSocketClosedError({
225
- message: "WebSocket closed",
226
- cause: event
227
- }));
228
- });
229
- }
230
- handleResponseMessage(message) {
231
- const request = this.requestManager.getPendingRequest(message.id);
232
- if (!request) return;
233
- request.callbacks.next(message);
234
- let completed = true;
235
- if ("result" in message && request.message.method === "subscription") {
236
- if (message.result.type === "data") request.message.params.lastEventId = message.result.id;
237
- if (message.result.type !== "stopped") completed = false;
238
- }
239
- if (completed) {
240
- request.callbacks.complete();
241
- this.requestManager.delete(message.id);
242
- }
243
- }
244
- handleIncomingRequest(message) {
245
- if (message.method === "reconnect") this.reconnect(new require_utils.TRPCWebSocketClosedError({ message: "Server requested reconnect" }));
246
- }
247
- /**
248
- * Sends a message or batch of messages directly to the server.
249
- */
250
- send(messageOrMessages) {
251
- if (!this.activeConnection.isOpen()) throw new Error("Active connection is not open");
252
- const messages = messageOrMessages instanceof Array ? messageOrMessages : [messageOrMessages];
253
- this.activeConnection.ws.send(JSON.stringify(messages.length === 1 ? messages[0] : messages));
254
- }
255
- /**
256
- * Groups requests for batch sending.
257
- *
258
- * @returns A function to abort the batched request.
259
- */
260
- batchSend(message, callbacks) {
261
- this.inactivityTimeout.reset();
262
- (0, __trpc_server_unstable_core_do_not_import.run)(async () => {
263
- if (!this.activeConnection.isOpen()) await this.open();
264
- await (0, __trpc_server_unstable_core_do_not_import.sleep)(0);
265
- if (!this.requestManager.hasOutgoingRequests()) return;
266
- this.send(this.requestManager.flush().map(({ message: message$1 }) => message$1));
267
- }).catch((err) => {
268
- this.requestManager.delete(message.id);
269
- callbacks.error(require_TRPCClientError.TRPCClientError.from(err));
270
- });
271
- return this.requestManager.register(message, callbacks);
272
- }
273
- };
274
-
275
- //#endregion
276
- exports.WsClient = WsClient;
@@ -1,276 +0,0 @@
1
- import { TRPCClientError } from "../../../TRPCClientError.mjs";
2
- import { exponentialBackoff, keepAliveDefaults, lazyDefaults } from "./options.mjs";
3
- import { ResettableTimeout, TRPCWebSocketClosedError } from "./utils.mjs";
4
- import { RequestManager } from "./requestManager.mjs";
5
- import { WsConnection, backwardCompatibility } from "./wsConnection.mjs";
6
- import { behaviorSubject, observable } from "@trpc/server/observable";
7
- import { run, sleep, transformResult } from "@trpc/server/unstable-core-do-not-import";
8
-
9
- //#region src/links/wsLink/wsClient/wsClient.ts
10
- /**
11
- * A WebSocket client for managing TRPC operations, supporting lazy initialization,
12
- * reconnection, keep-alive, and request management.
13
- */
14
- var WsClient = class {
15
- /**
16
- * Observable tracking the current connection state, including errors.
17
- */
18
- connectionState;
19
- allowReconnect = false;
20
- requestManager = new RequestManager();
21
- activeConnection;
22
- reconnectRetryDelay;
23
- inactivityTimeout;
24
- callbacks;
25
- lazyMode;
26
- constructor(opts) {
27
- this.callbacks = {
28
- onOpen: opts.onOpen,
29
- onClose: opts.onClose,
30
- onError: opts.onError
31
- };
32
- const lazyOptions = {
33
- ...lazyDefaults,
34
- ...opts.lazy
35
- };
36
- this.inactivityTimeout = new ResettableTimeout(() => {
37
- if (this.requestManager.hasOutgoingRequests() || this.requestManager.hasPendingRequests()) {
38
- this.inactivityTimeout.reset();
39
- return;
40
- }
41
- this.close().catch(() => null);
42
- }, lazyOptions.closeMs);
43
- this.activeConnection = new WsConnection({
44
- WebSocketPonyfill: opts.WebSocket,
45
- urlOptions: opts,
46
- keepAlive: {
47
- ...keepAliveDefaults,
48
- ...opts.keepAlive
49
- }
50
- });
51
- this.activeConnection.wsObservable.subscribe({ next: (ws) => {
52
- if (!ws) return;
53
- this.setupWebSocketListeners(ws);
54
- } });
55
- this.reconnectRetryDelay = opts.retryDelayMs ?? exponentialBackoff;
56
- this.lazyMode = lazyOptions.enabled;
57
- this.connectionState = behaviorSubject({
58
- type: "state",
59
- state: lazyOptions.enabled ? "idle" : "connecting",
60
- error: null
61
- });
62
- if (!this.lazyMode) this.open().catch(() => null);
63
- }
64
- /**
65
- * Opens the WebSocket connection. Handles reconnection attempts and updates
66
- * the connection state accordingly.
67
- */
68
- async open() {
69
- this.allowReconnect = true;
70
- if (this.connectionState.get().state !== "connecting") this.connectionState.next({
71
- type: "state",
72
- state: "connecting",
73
- error: null
74
- });
75
- try {
76
- await this.activeConnection.open();
77
- } catch (error) {
78
- this.reconnect(new TRPCWebSocketClosedError({
79
- message: "Initialization error",
80
- cause: error
81
- }));
82
- return this.reconnecting;
83
- }
84
- }
85
- /**
86
- * Closes the WebSocket connection and stops managing requests.
87
- * Ensures all outgoing and pending requests are properly finalized.
88
- */
89
- async close() {
90
- this.allowReconnect = false;
91
- this.inactivityTimeout.stop();
92
- const requestsToAwait = [];
93
- for (const request of this.requestManager.getRequests()) if (request.message.method === "subscription") request.callbacks.complete();
94
- else if (request.state === "outgoing") request.callbacks.error(TRPCClientError.from(new TRPCWebSocketClosedError({ message: "Closed before connection was established" })));
95
- else requestsToAwait.push(request.end);
96
- await Promise.all(requestsToAwait).catch(() => null);
97
- await this.activeConnection.close().catch(() => null);
98
- this.connectionState.next({
99
- type: "state",
100
- state: "idle",
101
- error: null
102
- });
103
- }
104
- /**
105
- * Method to request the server.
106
- * Handles data transformation, batching of requests, and subscription lifecycle.
107
- *
108
- * @param op - The operation details including id, type, path, input and signal
109
- * @param transformer - Data transformer for serializing requests and deserializing responses
110
- * @param lastEventId - Optional ID of the last received event for subscriptions
111
- *
112
- * @returns An observable that emits operation results and handles cleanup
113
- */
114
- request({ op: { id, type, path, input, signal }, transformer, lastEventId }) {
115
- return observable((observer) => {
116
- const abort = this.batchSend({
117
- id,
118
- method: type,
119
- params: {
120
- input: transformer.input.serialize(input),
121
- path,
122
- lastEventId
123
- }
124
- }, {
125
- ...observer,
126
- next(event) {
127
- const transformed = transformResult(event, transformer.output);
128
- if (!transformed.ok) {
129
- observer.error(TRPCClientError.from(transformed.error));
130
- return;
131
- }
132
- observer.next({ result: transformed.result });
133
- }
134
- });
135
- return () => {
136
- abort();
137
- if (type === "subscription" && this.activeConnection.isOpen()) this.send({
138
- id,
139
- method: "subscription.stop"
140
- });
141
- signal?.removeEventListener("abort", abort);
142
- };
143
- });
144
- }
145
- get connection() {
146
- return backwardCompatibility(this.activeConnection);
147
- }
148
- /**
149
- * Manages the reconnection process for the WebSocket using retry logic.
150
- * Ensures that only one reconnection attempt is active at a time by tracking the current
151
- * reconnection state in the `reconnecting` promise.
152
- */
153
- reconnecting = null;
154
- reconnect(closedError) {
155
- this.connectionState.next({
156
- type: "state",
157
- state: "connecting",
158
- error: TRPCClientError.from(closedError)
159
- });
160
- if (this.reconnecting) return;
161
- const tryReconnect = async (attemptIndex) => {
162
- try {
163
- await sleep(this.reconnectRetryDelay(attemptIndex));
164
- if (this.allowReconnect) {
165
- await this.activeConnection.close();
166
- await this.activeConnection.open();
167
- if (this.requestManager.hasPendingRequests()) this.send(this.requestManager.getPendingRequests().map(({ message }) => message));
168
- }
169
- this.reconnecting = null;
170
- } catch {
171
- await tryReconnect(attemptIndex + 1);
172
- }
173
- };
174
- this.reconnecting = tryReconnect(0);
175
- }
176
- setupWebSocketListeners(ws) {
177
- const handleCloseOrError = (cause) => {
178
- const reqs = this.requestManager.getPendingRequests();
179
- for (const { message, callbacks } of reqs) {
180
- if (message.method === "subscription") continue;
181
- callbacks.error(TRPCClientError.from(cause ?? new TRPCWebSocketClosedError({
182
- message: "WebSocket closed",
183
- cause
184
- })));
185
- this.requestManager.delete(message.id);
186
- }
187
- };
188
- ws.addEventListener("open", () => {
189
- run(async () => {
190
- if (this.lazyMode) this.inactivityTimeout.start();
191
- this.callbacks.onOpen?.();
192
- this.connectionState.next({
193
- type: "state",
194
- state: "pending",
195
- error: null
196
- });
197
- }).catch((error) => {
198
- ws.close(3e3);
199
- handleCloseOrError(error);
200
- });
201
- });
202
- ws.addEventListener("message", ({ data }) => {
203
- this.inactivityTimeout.reset();
204
- if (typeof data !== "string" || ["PING", "PONG"].includes(data)) return;
205
- const incomingMessage = JSON.parse(data);
206
- if ("method" in incomingMessage) {
207
- this.handleIncomingRequest(incomingMessage);
208
- return;
209
- }
210
- this.handleResponseMessage(incomingMessage);
211
- });
212
- ws.addEventListener("close", (event) => {
213
- handleCloseOrError(event);
214
- this.callbacks.onClose?.(event);
215
- if (!this.lazyMode || this.requestManager.hasPendingSubscriptions()) this.reconnect(new TRPCWebSocketClosedError({
216
- message: "WebSocket closed",
217
- cause: event
218
- }));
219
- });
220
- ws.addEventListener("error", (event) => {
221
- handleCloseOrError(event);
222
- this.callbacks.onError?.(event);
223
- this.reconnect(new TRPCWebSocketClosedError({
224
- message: "WebSocket closed",
225
- cause: event
226
- }));
227
- });
228
- }
229
- handleResponseMessage(message) {
230
- const request = this.requestManager.getPendingRequest(message.id);
231
- if (!request) return;
232
- request.callbacks.next(message);
233
- let completed = true;
234
- if ("result" in message && request.message.method === "subscription") {
235
- if (message.result.type === "data") request.message.params.lastEventId = message.result.id;
236
- if (message.result.type !== "stopped") completed = false;
237
- }
238
- if (completed) {
239
- request.callbacks.complete();
240
- this.requestManager.delete(message.id);
241
- }
242
- }
243
- handleIncomingRequest(message) {
244
- if (message.method === "reconnect") this.reconnect(new TRPCWebSocketClosedError({ message: "Server requested reconnect" }));
245
- }
246
- /**
247
- * Sends a message or batch of messages directly to the server.
248
- */
249
- send(messageOrMessages) {
250
- if (!this.activeConnection.isOpen()) throw new Error("Active connection is not open");
251
- const messages = messageOrMessages instanceof Array ? messageOrMessages : [messageOrMessages];
252
- this.activeConnection.ws.send(JSON.stringify(messages.length === 1 ? messages[0] : messages));
253
- }
254
- /**
255
- * Groups requests for batch sending.
256
- *
257
- * @returns A function to abort the batched request.
258
- */
259
- batchSend(message, callbacks) {
260
- this.inactivityTimeout.reset();
261
- run(async () => {
262
- if (!this.activeConnection.isOpen()) await this.open();
263
- await sleep(0);
264
- if (!this.requestManager.hasOutgoingRequests()) return;
265
- this.send(this.requestManager.flush().map(({ message: message$1 }) => message$1));
266
- }).catch((err) => {
267
- this.requestManager.delete(message.id);
268
- callbacks.error(TRPCClientError.from(err));
269
- });
270
- return this.requestManager.register(message, callbacks);
271
- }
272
- };
273
-
274
- //#endregion
275
- export { WsClient };
276
- //# sourceMappingURL=wsClient.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wsClient.mjs","names":["opts: WebSocketClientOptions","requestsToAwait: Promise<void>[]","closedError: TRPCWebSocketClosedError","attemptIndex: number","ws: WebSocket","cause: unknown","message: TRPCResponseMessage","message: TRPCClientIncomingRequest","messageOrMessages: TRPCClientOutgoingMessage | TRPCClientOutgoingMessage[]","message: TRPCClientOutgoingMessage","callbacks: TCallbacks","message"],"sources":["../../../../src/links/wsLink/wsClient/wsClient.ts"],"sourcesContent":["import type { AnyTRPCRouter } from '@trpc/server';\nimport type { BehaviorSubject } from '@trpc/server/observable';\nimport { behaviorSubject, observable } from '@trpc/server/observable';\nimport type {\n CombinedDataTransformer,\n TRPCClientIncomingMessage,\n TRPCClientIncomingRequest,\n TRPCClientOutgoingMessage,\n TRPCResponseMessage,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n run,\n sleep,\n transformResult,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { TRPCClientError } from '../../../TRPCClientError';\nimport type { TRPCConnectionState } from '../../internals/subscriptions';\nimport type { Operation, OperationResultEnvelope } from '../../types';\nimport type { WebSocketClientOptions } from './options';\nimport { exponentialBackoff, keepAliveDefaults, lazyDefaults } from './options';\nimport type { TCallbacks } from './requestManager';\nimport { RequestManager } from './requestManager';\nimport { ResettableTimeout, TRPCWebSocketClosedError } from './utils';\nimport { backwardCompatibility, WsConnection } from './wsConnection';\n\n/**\n * A WebSocket client for managing TRPC operations, supporting lazy initialization,\n * reconnection, keep-alive, and request management.\n */\nexport class WsClient {\n /**\n * Observable tracking the current connection state, including errors.\n */\n public readonly connectionState: BehaviorSubject<\n TRPCConnectionState<TRPCClientError<AnyTRPCRouter>>\n >;\n\n private allowReconnect = false;\n private requestManager = new RequestManager();\n private readonly activeConnection: WsConnection;\n private readonly reconnectRetryDelay: (attemptIndex: number) => number;\n private inactivityTimeout: ResettableTimeout;\n private readonly callbacks: Pick<\n WebSocketClientOptions,\n 'onOpen' | 'onClose' | 'onError'\n >;\n private readonly lazyMode: boolean;\n\n constructor(opts: WebSocketClientOptions) {\n // Initialize callbacks, connection parameters, and options.\n this.callbacks = {\n onOpen: opts.onOpen,\n onClose: opts.onClose,\n onError: opts.onError,\n };\n\n const lazyOptions = {\n ...lazyDefaults,\n ...opts.lazy,\n };\n\n // Set up inactivity timeout for lazy connections.\n this.inactivityTimeout = new ResettableTimeout(() => {\n if (\n this.requestManager.hasOutgoingRequests() ||\n this.requestManager.hasPendingRequests()\n ) {\n this.inactivityTimeout.reset();\n return;\n }\n\n this.close().catch(() => null);\n }, lazyOptions.closeMs);\n\n // Initialize the WebSocket connection.\n this.activeConnection = new WsConnection({\n WebSocketPonyfill: opts.WebSocket,\n urlOptions: opts,\n keepAlive: {\n ...keepAliveDefaults,\n ...opts.keepAlive,\n },\n });\n this.activeConnection.wsObservable.subscribe({\n next: (ws) => {\n if (!ws) return;\n this.setupWebSocketListeners(ws);\n },\n });\n this.reconnectRetryDelay = opts.retryDelayMs ?? exponentialBackoff;\n\n this.lazyMode = lazyOptions.enabled;\n\n this.connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<AnyTRPCRouter>>\n >({\n type: 'state',\n state: lazyOptions.enabled ? 'idle' : 'connecting',\n error: null,\n });\n\n // Automatically open the connection if lazy mode is disabled.\n if (!this.lazyMode) {\n this.open().catch(() => null);\n }\n }\n\n /**\n * Opens the WebSocket connection. Handles reconnection attempts and updates\n * the connection state accordingly.\n */\n private async open() {\n this.allowReconnect = true;\n if (this.connectionState.get().state !== 'connecting') {\n this.connectionState.next({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n }\n\n try {\n await this.activeConnection.open();\n } catch (error) {\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'Initialization error',\n cause: error,\n }),\n );\n return this.reconnecting;\n }\n }\n\n /**\n * Closes the WebSocket connection and stops managing requests.\n * Ensures all outgoing and pending requests are properly finalized.\n */\n public async close() {\n this.allowReconnect = false;\n this.inactivityTimeout.stop();\n\n const requestsToAwait: Promise<void>[] = [];\n for (const request of this.requestManager.getRequests()) {\n if (request.message.method === 'subscription') {\n request.callbacks.complete();\n } else if (request.state === 'outgoing') {\n request.callbacks.error(\n TRPCClientError.from(\n new TRPCWebSocketClosedError({\n message: 'Closed before connection was established',\n }),\n ),\n );\n } else {\n requestsToAwait.push(request.end);\n }\n }\n\n await Promise.all(requestsToAwait).catch(() => null);\n await this.activeConnection.close().catch(() => null);\n\n this.connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n }\n\n /**\n * Method to request the server.\n * Handles data transformation, batching of requests, and subscription lifecycle.\n *\n * @param op - The operation details including id, type, path, input and signal\n * @param transformer - Data transformer for serializing requests and deserializing responses\n * @param lastEventId - Optional ID of the last received event for subscriptions\n *\n * @returns An observable that emits operation results and handles cleanup\n */\n public request({\n op: { id, type, path, input, signal },\n transformer,\n lastEventId,\n }: {\n op: Pick<Operation, 'id' | 'type' | 'path' | 'input' | 'signal'>;\n transformer: CombinedDataTransformer;\n lastEventId?: string;\n }) {\n return observable<\n OperationResultEnvelope<unknown, TRPCClientError<AnyTRPCRouter>>,\n TRPCClientError<AnyTRPCRouter>\n >((observer) => {\n const abort = this.batchSend(\n {\n id,\n method: type,\n params: {\n input: transformer.input.serialize(input),\n path,\n lastEventId,\n },\n },\n {\n ...observer,\n next(event) {\n const transformed = transformResult(event, transformer.output);\n\n if (!transformed.ok) {\n observer.error(TRPCClientError.from(transformed.error));\n return;\n }\n\n observer.next({\n result: transformed.result,\n });\n },\n },\n );\n\n return () => {\n abort();\n\n if (type === 'subscription' && this.activeConnection.isOpen()) {\n this.send({\n id,\n method: 'subscription.stop',\n });\n }\n\n signal?.removeEventListener('abort', abort);\n };\n });\n }\n\n public get connection() {\n return backwardCompatibility(this.activeConnection);\n }\n\n /**\n * Manages the reconnection process for the WebSocket using retry logic.\n * Ensures that only one reconnection attempt is active at a time by tracking the current\n * reconnection state in the `reconnecting` promise.\n */\n private reconnecting: Promise<void> | null = null;\n private reconnect(closedError: TRPCWebSocketClosedError) {\n this.connectionState.next({\n type: 'state',\n state: 'connecting',\n error: TRPCClientError.from(closedError),\n });\n if (this.reconnecting) return;\n\n const tryReconnect = async (attemptIndex: number) => {\n try {\n await sleep(this.reconnectRetryDelay(attemptIndex));\n if (this.allowReconnect) {\n await this.activeConnection.close();\n await this.activeConnection.open();\n\n if (this.requestManager.hasPendingRequests()) {\n this.send(\n this.requestManager\n .getPendingRequests()\n .map(({ message }) => message),\n );\n }\n }\n this.reconnecting = null;\n } catch {\n await tryReconnect(attemptIndex + 1);\n }\n };\n\n this.reconnecting = tryReconnect(0);\n }\n\n private setupWebSocketListeners(ws: WebSocket) {\n const handleCloseOrError = (cause: unknown) => {\n const reqs = this.requestManager.getPendingRequests();\n for (const { message, callbacks } of reqs) {\n if (message.method === 'subscription') continue;\n\n callbacks.error(\n TRPCClientError.from(\n cause ??\n new TRPCWebSocketClosedError({\n message: 'WebSocket closed',\n cause,\n }),\n ),\n );\n this.requestManager.delete(message.id);\n }\n };\n\n ws.addEventListener('open', () => {\n run(async () => {\n if (this.lazyMode) {\n this.inactivityTimeout.start();\n }\n\n this.callbacks.onOpen?.();\n\n this.connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n }).catch((error) => {\n ws.close(3000);\n handleCloseOrError(error);\n });\n });\n\n ws.addEventListener('message', ({ data }) => {\n this.inactivityTimeout.reset();\n\n if (typeof data !== 'string' || ['PING', 'PONG'].includes(data)) return;\n\n const incomingMessage = JSON.parse(data) as TRPCClientIncomingMessage;\n if ('method' in incomingMessage) {\n this.handleIncomingRequest(incomingMessage);\n return;\n }\n\n this.handleResponseMessage(incomingMessage);\n });\n\n ws.addEventListener('close', (event) => {\n handleCloseOrError(event);\n this.callbacks.onClose?.(event);\n\n if (!this.lazyMode || this.requestManager.hasPendingSubscriptions()) {\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'WebSocket closed',\n cause: event,\n }),\n );\n }\n });\n\n ws.addEventListener('error', (event) => {\n handleCloseOrError(event);\n this.callbacks.onError?.(event);\n\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'WebSocket closed',\n cause: event,\n }),\n );\n });\n }\n\n private handleResponseMessage(message: TRPCResponseMessage) {\n const request = this.requestManager.getPendingRequest(message.id);\n if (!request) return;\n\n request.callbacks.next(message);\n\n let completed = true;\n if ('result' in message && request.message.method === 'subscription') {\n if (message.result.type === 'data') {\n request.message.params.lastEventId = message.result.id;\n }\n\n if (message.result.type !== 'stopped') {\n completed = false;\n }\n }\n\n if (completed) {\n request.callbacks.complete();\n this.requestManager.delete(message.id);\n }\n }\n\n private handleIncomingRequest(message: TRPCClientIncomingRequest) {\n if (message.method === 'reconnect') {\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'Server requested reconnect',\n }),\n );\n }\n }\n\n /**\n * Sends a message or batch of messages directly to the server.\n */\n private send(\n messageOrMessages: TRPCClientOutgoingMessage | TRPCClientOutgoingMessage[],\n ) {\n if (!this.activeConnection.isOpen()) {\n throw new Error('Active connection is not open');\n }\n\n const messages =\n messageOrMessages instanceof Array\n ? messageOrMessages\n : [messageOrMessages];\n this.activeConnection.ws.send(\n JSON.stringify(messages.length === 1 ? messages[0] : messages),\n );\n }\n\n /**\n * Groups requests for batch sending.\n *\n * @returns A function to abort the batched request.\n */\n private batchSend(message: TRPCClientOutgoingMessage, callbacks: TCallbacks) {\n this.inactivityTimeout.reset();\n\n run(async () => {\n if (!this.activeConnection.isOpen()) {\n await this.open();\n }\n await sleep(0);\n\n if (!this.requestManager.hasOutgoingRequests()) return;\n\n this.send(this.requestManager.flush().map(({ message }) => message));\n }).catch((err) => {\n this.requestManager.delete(message.id);\n callbacks.error(TRPCClientError.from(err));\n });\n\n return this.requestManager.register(message, callbacks);\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA6BA,IAAa,WAAb,MAAsB;;;;CAIpB,AAAgB;CAIhB,AAAQ,iBAAiB;CACzB,AAAQ,iBAAiB,IAAI;CAC7B,AAAiB;CACjB,AAAiB;CACjB,AAAQ;CACR,AAAiB;CAIjB,AAAiB;CAEjB,YAAYA,MAA8B;AAExC,OAAK,YAAY;GACf,QAAQ,KAAK;GACb,SAAS,KAAK;GACd,SAAS,KAAK;EACf;EAED,MAAM,cAAc;GAClB,GAAG;GACH,GAAG,KAAK;EACT;AAGD,OAAK,oBAAoB,IAAI,kBAAkB,MAAM;AACnD,OACE,KAAK,eAAe,qBAAqB,IACzC,KAAK,eAAe,oBAAoB,EACxC;AACA,SAAK,kBAAkB,OAAO;AAC9B;GACD;AAED,QAAK,OAAO,CAAC,MAAM,MAAM,KAAK;EAC/B,GAAE,YAAY;AAGf,OAAK,mBAAmB,IAAI,aAAa;GACvC,mBAAmB,KAAK;GACxB,YAAY;GACZ,WAAW;IACT,GAAG;IACH,GAAG,KAAK;GACT;EACF;AACD,OAAK,iBAAiB,aAAa,UAAU,EAC3C,MAAM,CAAC,OAAO;AACZ,QAAK,GAAI;AACT,QAAK,wBAAwB,GAAG;EACjC,EACF,EAAC;AACF,OAAK,sBAAsB,KAAK,gBAAgB;AAEhD,OAAK,WAAW,YAAY;AAE5B,OAAK,kBAAkB,gBAErB;GACA,MAAM;GACN,OAAO,YAAY,UAAU,SAAS;GACtC,OAAO;EACR,EAAC;AAGF,OAAK,KAAK,SACR,MAAK,MAAM,CAAC,MAAM,MAAM,KAAK;CAEhC;;;;;CAMD,MAAc,OAAO;AACnB,OAAK,iBAAiB;AACtB,MAAI,KAAK,gBAAgB,KAAK,CAAC,UAAU,aACvC,MAAK,gBAAgB,KAAK;GACxB,MAAM;GACN,OAAO;GACP,OAAO;EACR,EAAC;AAGJ,MAAI;AACF,SAAM,KAAK,iBAAiB,MAAM;EACnC,SAAQ,OAAO;AACd,QAAK,UACH,IAAI,yBAAyB;IAC3B,SAAS;IACT,OAAO;GACR,GACF;AACD,UAAO,KAAK;EACb;CACF;;;;;CAMD,MAAa,QAAQ;AACnB,OAAK,iBAAiB;AACtB,OAAK,kBAAkB,MAAM;EAE7B,MAAMC,kBAAmC,CAAE;AAC3C,OAAK,MAAM,WAAW,KAAK,eAAe,aAAa,CACrD,KAAI,QAAQ,QAAQ,WAAW,eAC7B,SAAQ,UAAU,UAAU;WACnB,QAAQ,UAAU,WAC3B,SAAQ,UAAU,MAChB,gBAAgB,KACd,IAAI,yBAAyB,EAC3B,SAAS,2CACV,GACF,CACF;MAED,iBAAgB,KAAK,QAAQ,IAAI;AAIrC,QAAM,QAAQ,IAAI,gBAAgB,CAAC,MAAM,MAAM,KAAK;AACpD,QAAM,KAAK,iBAAiB,OAAO,CAAC,MAAM,MAAM,KAAK;AAErD,OAAK,gBAAgB,KAAK;GACxB,MAAM;GACN,OAAO;GACP,OAAO;EACR,EAAC;CACH;;;;;;;;;;;CAYD,AAAO,QAAQ,EACb,IAAI,EAAE,IAAI,MAAM,MAAM,OAAO,QAAQ,EACrC,aACA,aAKD,EAAE;AACD,SAAO,WAGL,CAAC,aAAa;GACd,MAAM,QAAQ,KAAK,UACjB;IACE;IACA,QAAQ;IACR,QAAQ;KACN,OAAO,YAAY,MAAM,UAAU,MAAM;KACzC;KACA;IACD;GACF,GACD;IACE,GAAG;IACH,KAAK,OAAO;KACV,MAAM,cAAc,gBAAgB,OAAO,YAAY,OAAO;AAE9D,UAAK,YAAY,IAAI;AACnB,eAAS,MAAM,gBAAgB,KAAK,YAAY,MAAM,CAAC;AACvD;KACD;AAED,cAAS,KAAK,EACZ,QAAQ,YAAY,OACrB,EAAC;IACH;GACF,EACF;AAED,UAAO,MAAM;AACX,WAAO;AAEP,QAAI,SAAS,kBAAkB,KAAK,iBAAiB,QAAQ,CAC3D,MAAK,KAAK;KACR;KACA,QAAQ;IACT,EAAC;AAGJ,YAAQ,oBAAoB,SAAS,MAAM;GAC5C;EACF,EAAC;CACH;CAED,IAAW,aAAa;AACtB,SAAO,sBAAsB,KAAK,iBAAiB;CACpD;;;;;;CAOD,AAAQ,eAAqC;CAC7C,AAAQ,UAAUC,aAAuC;AACvD,OAAK,gBAAgB,KAAK;GACxB,MAAM;GACN,OAAO;GACP,OAAO,gBAAgB,KAAK,YAAY;EACzC,EAAC;AACF,MAAI,KAAK,aAAc;EAEvB,MAAM,eAAe,OAAOC,iBAAyB;AACnD,OAAI;AACF,UAAM,MAAM,KAAK,oBAAoB,aAAa,CAAC;AACnD,QAAI,KAAK,gBAAgB;AACvB,WAAM,KAAK,iBAAiB,OAAO;AACnC,WAAM,KAAK,iBAAiB,MAAM;AAElC,SAAI,KAAK,eAAe,oBAAoB,CAC1C,MAAK,KACH,KAAK,eACF,oBAAoB,CACpB,IAAI,CAAC,EAAE,SAAS,KAAK,QAAQ,CACjC;IAEJ;AACD,SAAK,eAAe;GACrB,QAAO;AACN,UAAM,aAAa,eAAe,EAAE;GACrC;EACF;AAED,OAAK,eAAe,aAAa,EAAE;CACpC;CAED,AAAQ,wBAAwBC,IAAe;EAC7C,MAAM,qBAAqB,CAACC,UAAmB;GAC7C,MAAM,OAAO,KAAK,eAAe,oBAAoB;AACrD,QAAK,MAAM,EAAE,SAAS,WAAW,IAAI,MAAM;AACzC,QAAI,QAAQ,WAAW,eAAgB;AAEvC,cAAU,MACR,gBAAgB,KACd,SACE,IAAI,yBAAyB;KAC3B,SAAS;KACT;IACD,GACJ,CACF;AACD,SAAK,eAAe,OAAO,QAAQ,GAAG;GACvC;EACF;AAED,KAAG,iBAAiB,QAAQ,MAAM;AAChC,OAAI,YAAY;AACd,QAAI,KAAK,SACP,MAAK,kBAAkB,OAAO;AAGhC,SAAK,UAAU,UAAU;AAEzB,SAAK,gBAAgB,KAAK;KACxB,MAAM;KACN,OAAO;KACP,OAAO;IACR,EAAC;GACH,EAAC,CAAC,MAAM,CAAC,UAAU;AAClB,OAAG,MAAM,IAAK;AACd,uBAAmB,MAAM;GAC1B,EAAC;EACH,EAAC;AAEF,KAAG,iBAAiB,WAAW,CAAC,EAAE,MAAM,KAAK;AAC3C,QAAK,kBAAkB,OAAO;AAE9B,cAAW,SAAS,YAAY,CAAC,QAAQ,MAAO,EAAC,SAAS,KAAK,CAAE;GAEjE,MAAM,kBAAkB,KAAK,MAAM,KAAK;AACxC,OAAI,YAAY,iBAAiB;AAC/B,SAAK,sBAAsB,gBAAgB;AAC3C;GACD;AAED,QAAK,sBAAsB,gBAAgB;EAC5C,EAAC;AAEF,KAAG,iBAAiB,SAAS,CAAC,UAAU;AACtC,sBAAmB,MAAM;AACzB,QAAK,UAAU,UAAU,MAAM;AAE/B,QAAK,KAAK,YAAY,KAAK,eAAe,yBAAyB,CACjE,MAAK,UACH,IAAI,yBAAyB;IAC3B,SAAS;IACT,OAAO;GACR,GACF;EAEJ,EAAC;AAEF,KAAG,iBAAiB,SAAS,CAAC,UAAU;AACtC,sBAAmB,MAAM;AACzB,QAAK,UAAU,UAAU,MAAM;AAE/B,QAAK,UACH,IAAI,yBAAyB;IAC3B,SAAS;IACT,OAAO;GACR,GACF;EACF,EAAC;CACH;CAED,AAAQ,sBAAsBC,SAA8B;EAC1D,MAAM,UAAU,KAAK,eAAe,kBAAkB,QAAQ,GAAG;AACjE,OAAK,QAAS;AAEd,UAAQ,UAAU,KAAK,QAAQ;EAE/B,IAAI,YAAY;AAChB,MAAI,YAAY,WAAW,QAAQ,QAAQ,WAAW,gBAAgB;AACpE,OAAI,QAAQ,OAAO,SAAS,OAC1B,SAAQ,QAAQ,OAAO,cAAc,QAAQ,OAAO;AAGtD,OAAI,QAAQ,OAAO,SAAS,UAC1B,aAAY;EAEf;AAED,MAAI,WAAW;AACb,WAAQ,UAAU,UAAU;AAC5B,QAAK,eAAe,OAAO,QAAQ,GAAG;EACvC;CACF;CAED,AAAQ,sBAAsBC,SAAoC;AAChE,MAAI,QAAQ,WAAW,YACrB,MAAK,UACH,IAAI,yBAAyB,EAC3B,SAAS,6BACV,GACF;CAEJ;;;;CAKD,AAAQ,KACNC,mBACA;AACA,OAAK,KAAK,iBAAiB,QAAQ,CACjC,OAAM,IAAI,MAAM;EAGlB,MAAM,WACJ,6BAA6B,QACzB,oBACA,CAAC,iBAAkB;AACzB,OAAK,iBAAiB,GAAG,KACvB,KAAK,UAAU,SAAS,WAAW,IAAI,SAAS,KAAK,SAAS,CAC/D;CACF;;;;;;CAOD,AAAQ,UAAUC,SAAoCC,WAAuB;AAC3E,OAAK,kBAAkB,OAAO;AAE9B,MAAI,YAAY;AACd,QAAK,KAAK,iBAAiB,QAAQ,CACjC,OAAM,KAAK,MAAM;AAEnB,SAAM,MAAM,EAAE;AAEd,QAAK,KAAK,eAAe,qBAAqB,CAAE;AAEhD,QAAK,KAAK,KAAK,eAAe,OAAO,CAAC,IAAI,CAAC,EAAE,oBAAS,KAAKC,UAAQ,CAAC;EACrE,EAAC,CAAC,MAAM,CAAC,QAAQ;AAChB,QAAK,eAAe,OAAO,QAAQ,GAAG;AACtC,aAAU,MAAM,gBAAgB,KAAK,IAAI,CAAC;EAC3C,EAAC;AAEF,SAAO,KAAK,eAAe,SAAS,SAAS,UAAU;CACxD;AACF"}