@trpc/client 11.1.2 → 11.1.3-alpha-tmp-tsdown.23

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 (234) hide show
  1. package/dist/TRPCClientError.d.mts +33 -0
  2. package/dist/TRPCClientError.d.mts.map +1 -0
  3. package/dist/TRPCClientError.d.ts +29 -25
  4. package/dist/TRPCClientError.d.ts.map +1 -1
  5. package/dist/TRPCClientError.js +48 -72
  6. package/dist/TRPCClientError.mjs +48 -71
  7. package/dist/TRPCClientError.mjs.map +1 -0
  8. package/dist/_virtual/rolldown_runtime.js +39 -0
  9. package/dist/_virtual/rolldown_runtime.mjs +27 -0
  10. package/dist/createTRPCClient.d.mts +73 -0
  11. package/dist/createTRPCClient.d.mts.map +1 -0
  12. package/dist/createTRPCClient.d.ts +38 -34
  13. package/dist/createTRPCClient.d.ts.map +1 -1
  14. package/dist/createTRPCClient.js +34 -34
  15. package/dist/createTRPCClient.mjs +33 -31
  16. package/dist/createTRPCClient.mjs.map +1 -0
  17. package/dist/createTRPCUntypedClient.d.mts +9 -0
  18. package/dist/createTRPCUntypedClient.d.mts.map +1 -0
  19. package/dist/createTRPCUntypedClient.d.ts +8 -6
  20. package/dist/createTRPCUntypedClient.d.ts.map +1 -1
  21. package/dist/createTRPCUntypedClient.js +5 -6
  22. package/dist/createTRPCUntypedClient.mjs +6 -3
  23. package/dist/createTRPCUntypedClient.mjs.map +1 -0
  24. package/dist/getFetch.d.mts +10 -0
  25. package/dist/getFetch.d.mts.map +1 -0
  26. package/dist/getFetch.d.ts +9 -2
  27. package/dist/getFetch.d.ts.map +1 -1
  28. package/dist/getFetch.js +8 -13
  29. package/dist/getFetch.mjs +8 -11
  30. package/dist/getFetch.mjs.map +1 -0
  31. package/dist/index.d.mts +21 -0
  32. package/dist/index.d.ts +21 -16
  33. package/dist/index.js +41 -42
  34. package/dist/index.mjs +18 -15
  35. package/dist/internals/TRPCUntypedClient.d.mts +46 -0
  36. package/dist/internals/TRPCUntypedClient.d.mts.map +1 -0
  37. package/dist/internals/TRPCUntypedClient.d.ts +40 -33
  38. package/dist/internals/TRPCUntypedClient.d.ts.map +1 -1
  39. package/dist/internals/TRPCUntypedClient.js +94 -113
  40. package/dist/internals/TRPCUntypedClient.mjs +93 -110
  41. package/dist/internals/TRPCUntypedClient.mjs.map +1 -0
  42. package/dist/internals/dataLoader.js +101 -116
  43. package/dist/internals/dataLoader.mjs +101 -114
  44. package/dist/internals/dataLoader.mjs.map +1 -0
  45. package/dist/internals/inputWithTrackedEventId.js +9 -12
  46. package/dist/internals/inputWithTrackedEventId.mjs +9 -10
  47. package/dist/internals/inputWithTrackedEventId.mjs.map +1 -0
  48. package/dist/internals/signals.js +39 -40
  49. package/dist/internals/signals.mjs +39 -39
  50. package/dist/internals/signals.mjs.map +1 -0
  51. package/dist/internals/transformer.d.mts +47 -0
  52. package/dist/internals/transformer.d.mts.map +1 -0
  53. package/dist/internals/transformer.d.ts +28 -23
  54. package/dist/internals/transformer.d.ts.map +1 -1
  55. package/dist/internals/transformer.js +25 -26
  56. package/dist/internals/transformer.mjs +25 -24
  57. package/dist/internals/transformer.mjs.map +1 -0
  58. package/dist/internals/types.d.mts +85 -0
  59. package/dist/internals/types.d.mts.map +1 -0
  60. package/dist/internals/types.d.ts +45 -42
  61. package/dist/internals/types.d.ts.map +1 -1
  62. package/dist/links/HTTPBatchLinkOptions.d.mts +25 -0
  63. package/dist/links/HTTPBatchLinkOptions.d.mts.map +1 -0
  64. package/dist/links/HTTPBatchLinkOptions.d.ts +23 -18
  65. package/dist/links/HTTPBatchLinkOptions.d.ts.map +1 -1
  66. package/dist/links/httpBatchLink.d.mts +18 -0
  67. package/dist/links/httpBatchLink.d.mts.map +1 -0
  68. package/dist/links/httpBatchLink.d.ts +14 -4
  69. package/dist/links/httpBatchLink.d.ts.map +1 -1
  70. package/dist/links/httpBatchLink.js +90 -106
  71. package/dist/links/httpBatchLink.mjs +89 -103
  72. package/dist/links/httpBatchLink.mjs.map +1 -0
  73. package/dist/links/httpBatchStreamLink.d.mts +22 -0
  74. package/dist/links/httpBatchStreamLink.d.mts.map +1 -0
  75. package/dist/links/httpBatchStreamLink.d.ts +15 -5
  76. package/dist/links/httpBatchStreamLink.d.ts.map +1 -1
  77. package/dist/links/httpBatchStreamLink.js +120 -144
  78. package/dist/links/httpBatchStreamLink.mjs +119 -141
  79. package/dist/links/httpBatchStreamLink.mjs.map +1 -0
  80. package/dist/links/httpLink.d.mts +24 -0
  81. package/dist/links/httpLink.d.mts.map +1 -0
  82. package/dist/links/httpLink.d.ts +19 -12
  83. package/dist/links/httpLink.d.ts.map +1 -1
  84. package/dist/links/httpLink.js +74 -90
  85. package/dist/links/httpLink.mjs +73 -87
  86. package/dist/links/httpLink.mjs.map +1 -0
  87. package/dist/links/httpSubscriptionLink.d.mts +30 -0
  88. package/dist/links/httpSubscriptionLink.d.mts.map +1 -0
  89. package/dist/links/httpSubscriptionLink.d.ts +21 -17
  90. package/dist/links/httpSubscriptionLink.d.ts.map +1 -1
  91. package/dist/links/httpSubscriptionLink.js +134 -179
  92. package/dist/links/httpSubscriptionLink.mjs +133 -176
  93. package/dist/links/httpSubscriptionLink.mjs.map +1 -0
  94. package/dist/links/internals/contentTypes.d.mts +10 -0
  95. package/dist/links/internals/contentTypes.d.mts.map +1 -0
  96. package/dist/links/internals/contentTypes.d.ts +9 -3
  97. package/dist/links/internals/contentTypes.d.ts.map +1 -1
  98. package/dist/links/internals/contentTypes.js +6 -6
  99. package/dist/links/internals/contentTypes.mjs +6 -4
  100. package/dist/links/internals/contentTypes.mjs.map +1 -0
  101. package/dist/links/internals/createChain.js +23 -23
  102. package/dist/links/internals/createChain.mjs +22 -20
  103. package/dist/links/internals/createChain.mjs.map +1 -0
  104. package/dist/links/internals/httpUtils.d.mts +26 -0
  105. package/dist/links/internals/httpUtils.d.mts.map +1 -0
  106. package/dist/links/internals/httpUtils.d.ts +22 -64
  107. package/dist/links/internals/httpUtils.d.ts.map +1 -1
  108. package/dist/links/internals/httpUtils.js +93 -116
  109. package/dist/links/internals/httpUtils.mjs +94 -113
  110. package/dist/links/internals/httpUtils.mjs.map +1 -0
  111. package/dist/links/internals/subscriptions.d.mts +20 -0
  112. package/dist/links/internals/subscriptions.d.mts.map +1 -0
  113. package/dist/links/internals/subscriptions.d.ts +11 -8
  114. package/dist/links/internals/subscriptions.d.ts.map +1 -1
  115. package/dist/links/internals/urlWithConnectionParams.d.mts +27 -0
  116. package/dist/links/internals/urlWithConnectionParams.d.mts.map +1 -0
  117. package/dist/links/internals/urlWithConnectionParams.d.ts +22 -18
  118. package/dist/links/internals/urlWithConnectionParams.d.ts.map +1 -1
  119. package/dist/links/internals/urlWithConnectionParams.js +8 -6
  120. package/dist/links/internals/urlWithConnectionParams.mjs +8 -4
  121. package/dist/links/internals/urlWithConnectionParams.mjs.map +1 -0
  122. package/dist/links/localLink.d.mts +22 -0
  123. package/dist/links/localLink.d.mts.map +1 -0
  124. package/dist/links/localLink.d.ts +22 -0
  125. package/dist/links/localLink.d.ts.map +1 -0
  126. package/dist/links/localLink.js +192 -0
  127. package/dist/links/localLink.mjs +193 -0
  128. package/dist/links/localLink.mjs.map +1 -0
  129. package/dist/links/loggerLink.d.mts +56 -0
  130. package/dist/links/loggerLink.d.mts.map +1 -0
  131. package/dist/links/loggerLink.d.ts +40 -36
  132. package/dist/links/loggerLink.d.ts.map +1 -1
  133. package/dist/links/loggerLink.js +113 -166
  134. package/dist/links/loggerLink.mjs +112 -163
  135. package/dist/links/loggerLink.mjs.map +1 -0
  136. package/dist/links/retryLink.d.mts +35 -0
  137. package/dist/links/retryLink.d.mts.map +1 -0
  138. package/dist/links/retryLink.d.ts +27 -25
  139. package/dist/links/retryLink.d.ts.map +1 -1
  140. package/dist/links/retryLink.js +60 -68
  141. package/dist/links/retryLink.mjs +59 -65
  142. package/dist/links/retryLink.mjs.map +1 -0
  143. package/dist/links/splitLink.d.mts +21 -0
  144. package/dist/links/splitLink.d.mts.map +1 -0
  145. package/dist/links/splitLink.d.ts +19 -12
  146. package/dist/links/splitLink.d.ts.map +1 -1
  147. package/dist/links/splitLink.js +20 -21
  148. package/dist/links/splitLink.mjs +19 -18
  149. package/dist/links/splitLink.mjs.map +1 -0
  150. package/dist/links/types.d.mts +71 -0
  151. package/dist/links/types.d.mts.map +1 -0
  152. package/dist/links/types.d.ts +37 -29
  153. package/dist/links/types.d.ts.map +1 -1
  154. package/dist/links/wsLink/createWsClient.d.mts +10 -0
  155. package/dist/links/wsLink/createWsClient.d.mts.map +1 -0
  156. package/dist/links/wsLink/createWsClient.d.ts +9 -5
  157. package/dist/links/wsLink/createWsClient.d.ts.map +1 -1
  158. package/dist/links/wsLink/createWsClient.js +5 -5
  159. package/dist/links/wsLink/createWsClient.mjs +5 -2
  160. package/dist/links/wsLink/createWsClient.mjs.map +1 -0
  161. package/dist/links/wsLink/wsClient/options.d.mts +69 -0
  162. package/dist/links/wsLink/wsClient/options.d.mts.map +1 -0
  163. package/dist/links/wsLink/wsClient/options.d.ts +54 -64
  164. package/dist/links/wsLink/wsClient/options.d.ts.map +1 -1
  165. package/dist/links/wsLink/wsClient/options.js +14 -12
  166. package/dist/links/wsLink/wsClient/options.mjs +14 -10
  167. package/dist/links/wsLink/wsClient/options.mjs.map +1 -0
  168. package/dist/links/wsLink/wsClient/requestManager.js +133 -135
  169. package/dist/links/wsLink/wsClient/requestManager.mjs +133 -132
  170. package/dist/links/wsLink/wsClient/requestManager.mjs.map +1 -0
  171. package/dist/links/wsLink/wsClient/utils.js +64 -81
  172. package/dist/links/wsLink/wsClient/utils.mjs +64 -78
  173. package/dist/links/wsLink/wsClient/utils.mjs.map +1 -0
  174. package/dist/links/wsLink/wsClient/wsClient.d.mts +104 -0
  175. package/dist/links/wsLink/wsClient/wsClient.d.mts.map +1 -0
  176. package/dist/links/wsLink/wsClient/wsClient.d.ts +99 -79
  177. package/dist/links/wsLink/wsClient/wsClient.d.ts.map +1 -1
  178. package/dist/links/wsLink/wsClient/wsClient.js +273 -322
  179. package/dist/links/wsLink/wsClient/wsClient.mjs +272 -319
  180. package/dist/links/wsLink/wsClient/wsClient.mjs.map +1 -0
  181. package/dist/links/wsLink/wsClient/wsConnection.js +155 -178
  182. package/dist/links/wsLink/wsClient/wsConnection.mjs +154 -175
  183. package/dist/links/wsLink/wsClient/wsConnection.mjs.map +1 -0
  184. package/dist/links/wsLink/wsLink.d.mts +15 -0
  185. package/dist/links/wsLink/wsLink.d.mts.map +1 -0
  186. package/dist/links/wsLink/wsLink.d.ts +13 -9
  187. package/dist/links/wsLink/wsLink.d.ts.map +1 -1
  188. package/dist/links/wsLink/wsLink.js +30 -31
  189. package/dist/links/wsLink/wsLink.mjs +29 -28
  190. package/dist/links/wsLink/wsLink.mjs.map +1 -0
  191. package/dist/links.js +11 -0
  192. package/dist/links.mjs +11 -0
  193. package/dist/node_modules/.pnpm/@oxc-project_runtime@0.71.0/node_modules/@oxc-project/runtime/src/helpers/usingCtx.js +68 -0
  194. package/dist/node_modules/.pnpm/@oxc-project_runtime@0.71.0/node_modules/@oxc-project/runtime/src/helpers/usingCtx.mjs +66 -0
  195. package/dist/node_modules/.pnpm/@oxc-project_runtime@0.71.0/node_modules/@oxc-project/runtime/src/helpers/usingCtx.mjs.map +1 -0
  196. package/dist/unstable-internals.d.mts +3 -0
  197. package/dist/unstable-internals.d.ts +3 -3
  198. package/dist/unstable-internals.js +2 -6
  199. package/dist/unstable-internals.mjs +3 -1
  200. package/links/httpBatchLink/package.json +1 -0
  201. package/links/httpLink/package.json +1 -0
  202. package/links/loggerLink/package.json +1 -0
  203. package/links/splitLink/package.json +1 -0
  204. package/links/wsLink/wsLink/package.json +1 -0
  205. package/package.json +64 -29
  206. package/src/TRPCClientError.ts +4 -9
  207. package/src/internals/dataLoader.ts +2 -6
  208. package/src/internals/signals.ts +16 -0
  209. package/src/links/httpSubscriptionLink.ts +3 -18
  210. package/src/links/localLink.ts +277 -0
  211. package/src/links/wsLink/wsClient/requestManager.ts +9 -0
  212. package/src/links/wsLink/wsClient/wsClient.ts +1 -1
  213. package/src/links.ts +1 -0
  214. package/unstable-internals/package.json +1 -0
  215. package/dist/index.d.ts.map +0 -1
  216. package/dist/internals/dataLoader.d.ts +0 -13
  217. package/dist/internals/dataLoader.d.ts.map +0 -1
  218. package/dist/internals/inputWithTrackedEventId.d.ts +0 -2
  219. package/dist/internals/inputWithTrackedEventId.d.ts.map +0 -1
  220. package/dist/internals/signals.d.ts +0 -15
  221. package/dist/internals/signals.d.ts.map +0 -1
  222. package/dist/links/internals/createChain.d.ts +0 -8
  223. package/dist/links/internals/createChain.d.ts.map +0 -1
  224. package/dist/links/internals/dedupeLink.d.ts +0 -7
  225. package/dist/links/internals/dedupeLink.d.ts.map +0 -1
  226. package/dist/links/wsLink/wsClient/requestManager.d.ts +0 -102
  227. package/dist/links/wsLink/wsClient/requestManager.d.ts.map +0 -1
  228. package/dist/links/wsLink/wsClient/utils.d.ts +0 -38
  229. package/dist/links/wsLink/wsClient/utils.d.ts.map +0 -1
  230. package/dist/links/wsLink/wsClient/wsConnection.d.ts +0 -79
  231. package/dist/links/wsLink/wsClient/wsConnection.d.ts.map +0 -1
  232. package/dist/links.d.ts +0 -11
  233. package/dist/links.d.ts.map +0 -1
  234. package/dist/unstable-internals.d.ts.map +0 -1
@@ -1,323 +1,276 @@
1
- import { observable, behaviorSubject } from '@trpc/server/observable';
2
- import { transformResult, run, sleep } from '@trpc/server/unstable-core-do-not-import';
3
- import { TRPCClientError } from '../../../TRPCClientError.mjs';
4
- import { lazyDefaults, keepAliveDefaults, exponentialBackoff } from './options.mjs';
5
- import { RequestManager } from './requestManager.mjs';
6
- import { TRPCWebSocketClosedError, ResettableTimeout } from './utils.mjs';
7
- import { backwardCompatibility, WsConnection } from './wsConnection.mjs';
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
8
 
9
- function _define_property(obj, key, value) {
10
- if (key in obj) {
11
- Object.defineProperty(obj, key, {
12
- value: value,
13
- enumerable: true,
14
- configurable: true,
15
- writable: true
16
- });
17
- } else {
18
- obj[key] = value;
19
- }
20
- return obj;
21
- }
9
+ //#region src/links/wsLink/wsClient/wsClient.ts
22
10
  /**
23
- * A WebSocket client for managing TRPC operations, supporting lazy initialization,
24
- * reconnection, keep-alive, and request management.
25
- */ class WsClient {
26
- /**
27
- * Opens the WebSocket connection. Handles reconnection attempts and updates
28
- * the connection state accordingly.
29
- */ async open() {
30
- this.allowReconnect = true;
31
- if (this.connectionState.get().state !== 'connecting') {
32
- this.connectionState.next({
33
- type: 'state',
34
- state: 'connecting',
35
- error: null
36
- });
37
- }
38
- try {
39
- await this.activeConnection.open();
40
- } catch (error) {
41
- this.reconnect(new TRPCWebSocketClosedError({
42
- message: 'Initialization error',
43
- cause: error
44
- }));
45
- return this.reconnecting;
46
- }
47
- }
48
- /**
49
- * Closes the WebSocket connection and stops managing requests.
50
- * Ensures all outgoing and pending requests are properly finalized.
51
- */ async close() {
52
- this.allowReconnect = false;
53
- this.inactivityTimeout.stop();
54
- const requestsToAwait = [];
55
- for (const request of this.requestManager.getRequests()){
56
- if (request.message.method === 'subscription') {
57
- request.callbacks.complete();
58
- } else if (request.state === 'outgoing') {
59
- request.callbacks.error(TRPCClientError.from(new TRPCWebSocketClosedError({
60
- message: 'Closed before connection was established'
61
- })));
62
- } else {
63
- requestsToAwait.push(request.end);
64
- }
65
- }
66
- await Promise.all(requestsToAwait).catch(()=>null);
67
- await this.activeConnection.close().catch(()=>null);
68
- this.connectionState.next({
69
- type: 'state',
70
- state: 'idle',
71
- error: null
72
- });
73
- }
74
- /**
75
- * Method to request the server.
76
- * Handles data transformation, batching of requests, and subscription lifecycle.
77
- *
78
- * @param op - The operation details including id, type, path, input and signal
79
- * @param transformer - Data transformer for serializing requests and deserializing responses
80
- * @param lastEventId - Optional ID of the last received event for subscriptions
81
- *
82
- * @returns An observable that emits operation results and handles cleanup
83
- */ request({ op: { id, type, path, input, signal }, transformer, lastEventId }) {
84
- return observable((observer)=>{
85
- const abort = this.batchSend({
86
- id,
87
- method: type,
88
- params: {
89
- input: transformer.input.serialize(input),
90
- path,
91
- lastEventId
92
- }
93
- }, {
94
- ...observer,
95
- next (event) {
96
- const transformed = transformResult(event, transformer.output);
97
- if (!transformed.ok) {
98
- observer.error(TRPCClientError.from(transformed.error));
99
- return;
100
- }
101
- observer.next({
102
- result: transformed.result
103
- });
104
- }
105
- });
106
- return ()=>{
107
- abort();
108
- if (type === 'subscription' && this.activeConnection.isOpen()) {
109
- this.send({
110
- id,
111
- method: 'subscription.stop'
112
- });
113
- }
114
- signal?.removeEventListener('abort', abort);
115
- };
116
- });
117
- }
118
- get connection() {
119
- return backwardCompatibility(this.activeConnection);
120
- }
121
- reconnect(closedError) {
122
- this.connectionState.next({
123
- type: 'state',
124
- state: 'connecting',
125
- error: TRPCClientError.from(closedError)
126
- });
127
- if (this.reconnecting) return;
128
- const tryReconnect = async (attemptIndex)=>{
129
- try {
130
- await sleep(this.reconnectRetryDelay(attemptIndex));
131
- if (this.allowReconnect) {
132
- await this.activeConnection.close();
133
- await this.activeConnection.open();
134
- if (this.requestManager.hasPendingRequests()) {
135
- this.send(this.requestManager.getPendingRequests().map(({ message })=>message));
136
- }
137
- }
138
- this.reconnecting = null;
139
- } catch {
140
- await tryReconnect(attemptIndex + 1);
141
- }
142
- };
143
- this.reconnecting = tryReconnect(0);
144
- }
145
- setupWebSocketListeners(ws) {
146
- const handleCloseOrError = (cause)=>{
147
- const reqs = this.requestManager.getPendingRequests();
148
- for (const { message, callbacks } of reqs){
149
- if (message.method === 'subscription') continue;
150
- callbacks.error(TRPCClientError.from(cause ?? new TRPCWebSocketClosedError({
151
- message: 'WebSocket closed',
152
- cause
153
- })));
154
- this.requestManager.delete(message.id);
155
- }
156
- };
157
- ws.addEventListener('open', ()=>{
158
- run(async ()=>{
159
- if (this.lazyMode) {
160
- this.inactivityTimeout.start();
161
- }
162
- this.callbacks.onOpen?.();
163
- this.connectionState.next({
164
- type: 'state',
165
- state: 'pending',
166
- error: null
167
- });
168
- }).catch((error)=>{
169
- ws.close(3000);
170
- handleCloseOrError(error);
171
- });
172
- });
173
- ws.addEventListener('message', ({ data })=>{
174
- this.inactivityTimeout.reset();
175
- if (typeof data !== 'string' || [
176
- 'PING',
177
- 'PONG'
178
- ].includes(data)) return;
179
- const incomingMessage = JSON.parse(data);
180
- if ('method' in incomingMessage) {
181
- this.handleIncomingRequest(incomingMessage);
182
- return;
183
- }
184
- this.handleResponseMessage(incomingMessage);
185
- });
186
- ws.addEventListener('close', (event)=>{
187
- handleCloseOrError(event);
188
- this.callbacks.onClose?.(event);
189
- if (!this.lazyMode) {
190
- this.reconnect(new TRPCWebSocketClosedError({
191
- message: 'WebSocket closed',
192
- cause: event
193
- }));
194
- }
195
- });
196
- ws.addEventListener('error', (event)=>{
197
- handleCloseOrError(event);
198
- this.callbacks.onError?.(event);
199
- this.reconnect(new TRPCWebSocketClosedError({
200
- message: 'WebSocket closed',
201
- cause: event
202
- }));
203
- });
204
- }
205
- handleResponseMessage(message) {
206
- const request = this.requestManager.getPendingRequest(message.id);
207
- if (!request) return;
208
- request.callbacks.next(message);
209
- let completed = true;
210
- if ('result' in message && request.message.method === 'subscription') {
211
- if (message.result.type === 'data') {
212
- request.message.params.lastEventId = message.result.id;
213
- }
214
- if (message.result.type !== 'stopped') {
215
- completed = false;
216
- }
217
- }
218
- if (completed) {
219
- request.callbacks.complete();
220
- this.requestManager.delete(message.id);
221
- }
222
- }
223
- handleIncomingRequest(message) {
224
- if (message.method === 'reconnect') {
225
- this.reconnect(new TRPCWebSocketClosedError({
226
- message: 'Server requested reconnect'
227
- }));
228
- }
229
- }
230
- /**
231
- * Sends a message or batch of messages directly to the server.
232
- */ send(messageOrMessages) {
233
- if (!this.activeConnection.isOpen()) {
234
- throw new Error('Active connection is not open');
235
- }
236
- const messages = messageOrMessages instanceof Array ? messageOrMessages : [
237
- messageOrMessages
238
- ];
239
- this.activeConnection.ws.send(JSON.stringify(messages.length === 1 ? messages[0] : messages));
240
- }
241
- /**
242
- * Groups requests for batch sending.
243
- *
244
- * @returns A function to abort the batched request.
245
- */ batchSend(message, callbacks) {
246
- this.inactivityTimeout.reset();
247
- run(async ()=>{
248
- if (!this.activeConnection.isOpen()) {
249
- await this.open();
250
- }
251
- await sleep(0);
252
- if (!this.requestManager.hasOutgoingRequests()) return;
253
- this.send(this.requestManager.flush().map(({ message })=>message));
254
- }).catch((err)=>{
255
- this.requestManager.delete(message.id);
256
- callbacks.error(TRPCClientError.from(err));
257
- });
258
- return this.requestManager.register(message, callbacks);
259
- }
260
- constructor(opts){
261
- /**
262
- * Observable tracking the current connection state, including errors.
263
- */ _define_property(this, "connectionState", void 0);
264
- _define_property(this, "allowReconnect", false);
265
- _define_property(this, "requestManager", new RequestManager());
266
- _define_property(this, "activeConnection", void 0);
267
- _define_property(this, "reconnectRetryDelay", void 0);
268
- _define_property(this, "inactivityTimeout", void 0);
269
- _define_property(this, "callbacks", void 0);
270
- _define_property(this, "lazyMode", void 0);
271
- /**
272
- * Manages the reconnection process for the WebSocket using retry logic.
273
- * Ensures that only one reconnection attempt is active at a time by tracking the current
274
- * reconnection state in the `reconnecting` promise.
275
- */ _define_property(this, "reconnecting", null);
276
- // Initialize callbacks, connection parameters, and options.
277
- this.callbacks = {
278
- onOpen: opts.onOpen,
279
- onClose: opts.onClose,
280
- onError: opts.onError
281
- };
282
- const lazyOptions = {
283
- ...lazyDefaults,
284
- ...opts.lazy
285
- };
286
- // Set up inactivity timeout for lazy connections.
287
- this.inactivityTimeout = new ResettableTimeout(()=>{
288
- if (this.requestManager.hasOutgoingRequests() || this.requestManager.hasPendingRequests()) {
289
- this.inactivityTimeout.reset();
290
- return;
291
- }
292
- this.close().catch(()=>null);
293
- }, lazyOptions.closeMs);
294
- // Initialize the WebSocket connection.
295
- this.activeConnection = new WsConnection({
296
- WebSocketPonyfill: opts.WebSocket,
297
- urlOptions: opts,
298
- keepAlive: {
299
- ...keepAliveDefaults,
300
- ...opts.keepAlive
301
- }
302
- });
303
- this.activeConnection.wsObservable.subscribe({
304
- next: (ws)=>{
305
- if (!ws) return;
306
- this.setupWebSocketListeners(ws);
307
- }
308
- });
309
- this.reconnectRetryDelay = opts.retryDelayMs ?? exponentialBackoff;
310
- this.lazyMode = lazyOptions.enabled;
311
- this.connectionState = behaviorSubject({
312
- type: 'state',
313
- state: lazyOptions.enabled ? 'idle' : 'connecting',
314
- error: null
315
- });
316
- // Automatically open the connection if lazy mode is disabled.
317
- if (!this.lazyMode) {
318
- this.open().catch(()=>null);
319
- }
320
- }
321
- }
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
+ };
322
273
 
274
+ //#endregion
323
275
  export { WsClient };
276
+ //# sourceMappingURL=wsClient.mjs.map