@trpc/client 11.4.1 → 11.4.2
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.
- package/dist/TRPCClientError-CjKyS10w.mjs +47 -0
- package/dist/{TRPCClientError-COkhCKf3.mjs.map → TRPCClientError-CjKyS10w.mjs.map} +1 -1
- package/dist/{TRPCClientError-CGgRtttT.cjs → TRPCClientError-Dey88Uiy.cjs} +15 -24
- package/dist/{httpBatchLink-DIfnmmcu.mjs → httpBatchLink-CA96-gnJ.mjs} +33 -24
- package/dist/{httpBatchLink-DIfnmmcu.mjs.map → httpBatchLink-CA96-gnJ.mjs.map} +1 -1
- package/dist/{httpBatchLink-CIC9PZ_Z.cjs → httpBatchLink-JKXaA6dG.cjs} +32 -23
- package/dist/{httpBatchLink.d-BN2Iw_cK.d.mts → httpBatchLink.d-CAaMQOtX.d.mts} +3 -3
- package/dist/{httpBatchLink.d-BN2Iw_cK.d.mts.map → httpBatchLink.d-CAaMQOtX.d.mts.map} +1 -1
- package/dist/{httpLink-9bpwQ15c.mjs → httpLink-CYOcG9kQ.mjs} +11 -12
- package/dist/{httpLink-9bpwQ15c.mjs.map → httpLink-CYOcG9kQ.mjs.map} +1 -1
- package/dist/{httpLink-BbVj_TgM.cjs → httpLink-CbZZVG--.cjs} +10 -11
- package/dist/{httpLink.d-CTSOARfE.d.mts → httpLink.d-B0nHKy2W.d.mts} +3 -3
- package/dist/{httpLink.d-CTSOARfE.d.mts.map → httpLink.d-B0nHKy2W.d.mts.map} +1 -1
- package/dist/{httpUtils-3pbQzhUL.mjs → httpUtils-Bkv1johT.mjs} +12 -13
- package/dist/{httpUtils-3pbQzhUL.mjs.map → httpUtils-Bkv1johT.mjs.map} +1 -1
- package/dist/{httpUtils-Buf6jCgh.cjs → httpUtils-rn2lxsJO.cjs} +12 -12
- package/dist/{httpUtils.d-C8wPxU79.d.mts → httpUtils.d-cQRQZrfo.d.mts} +3 -3
- package/dist/{httpUtils.d-C8wPxU79.d.mts.map → httpUtils.d-cQRQZrfo.d.mts.map} +1 -1
- package/dist/index.cjs +268 -104
- package/dist/index.d.mts +9 -9
- package/dist/index.mjs +269 -131
- package/dist/index.mjs.map +1 -1
- package/dist/links/httpBatchLink.cjs +5 -4
- package/dist/links/httpBatchLink.d.mts +5 -5
- package/dist/links/httpBatchLink.mjs +5 -4
- package/dist/links/httpLink.cjs +5 -4
- package/dist/links/httpLink.d.mts +5 -5
- package/dist/links/httpLink.mjs +5 -4
- package/dist/links/loggerLink.cjs +2 -1
- package/dist/links/loggerLink.d.mts +3 -3
- package/dist/links/loggerLink.mjs +2 -1
- package/dist/links/splitLink.d.mts +3 -3
- package/dist/links/splitLink.mjs +1 -1
- package/dist/links/wsLink/wsLink.cjs +4 -3
- package/dist/links/wsLink/wsLink.d.mts +4 -4
- package/dist/links/wsLink/wsLink.mjs +4 -3
- package/dist/{loggerLink-CsDfg5Bb.cjs → loggerLink-CuYvRzyH.cjs} +14 -21
- package/dist/{loggerLink-PGBSQFcR.mjs → loggerLink-ineCN1PO.mjs} +15 -22
- package/dist/{loggerLink-PGBSQFcR.mjs.map → loggerLink-ineCN1PO.mjs.map} +1 -1
- package/dist/{loggerLink.d-CZjK1CXm.d.mts → loggerLink.d-g_uYSbus.d.mts} +2 -2
- package/dist/{loggerLink.d-CZjK1CXm.d.mts.map → loggerLink.d-g_uYSbus.d.mts.map} +1 -1
- package/dist/objectSpread2-Bsvh_OqM.cjs +100 -0
- package/dist/objectSpread2-BvkFp-_Y.mjs +114 -0
- package/dist/objectSpread2-BvkFp-_Y.mjs.map +1 -0
- package/dist/{splitLink-BVblHq4n.mjs → splitLink-B7Cuf2c_.mjs} +1 -1
- package/dist/{splitLink-BVblHq4n.mjs.map → splitLink-B7Cuf2c_.mjs.map} +1 -1
- package/dist/{splitLink.d-BAqgq0NG.d.mts → splitLink.d-od8YIcex.d.mts} +2 -2
- package/dist/{splitLink.d-BAqgq0NG.d.mts.map → splitLink.d-od8YIcex.d.mts.map} +1 -1
- package/dist/{subscriptions.d-U92STdZl.d.mts → subscriptions.d-Dlr1nWGD.d.mts} +1 -1
- package/dist/{subscriptions.d-U92STdZl.d.mts.map → subscriptions.d-Dlr1nWGD.d.mts.map} +1 -1
- package/dist/{types.d-DXbqQLCC.d.mts → types.d-POgEdUB1.d.mts} +2 -2
- package/dist/{types.d-DXbqQLCC.d.mts.map → types.d-POgEdUB1.d.mts.map} +1 -1
- package/dist/{unstable-internals-DU4WecoG.mjs → unstable-internals-Bg7n9BBj.mjs} +1 -1
- package/dist/{unstable-internals-DU4WecoG.mjs.map → unstable-internals-Bg7n9BBj.mjs.map} +1 -1
- package/dist/unstable-internals.cjs +1 -1
- package/dist/{unstable-internals.d-DyLd-B0J.d.mts → unstable-internals.d-BOmV7EK1.d.mts} +1 -1
- package/dist/{unstable-internals.d-DyLd-B0J.d.mts.map → unstable-internals.d-BOmV7EK1.d.mts.map} +1 -1
- package/dist/unstable-internals.d.mts +2 -2
- package/dist/unstable-internals.mjs +1 -1
- package/dist/{wsLink-DhJ50EC5.cjs → wsLink-BcTLPVgc.cjs} +93 -106
- package/dist/{wsLink-DbSHOzlB.mjs → wsLink-H5IjZfJW.mjs} +94 -107
- package/dist/wsLink-H5IjZfJW.mjs.map +1 -0
- package/dist/{wsLink.d-BqO7ltN_.d.mts → wsLink.d-BZxAJRBO.d.mts} +4 -4
- package/dist/{wsLink.d-BqO7ltN_.d.mts.map → wsLink.d-BZxAJRBO.d.mts.map} +1 -1
- package/package.json +4 -4
- package/dist/TRPCClientError-COkhCKf3.mjs +0 -56
- package/dist/wsLink-DbSHOzlB.mjs.map +0 -1
- /package/dist/{unstable-internals-CYBH4jbF.cjs → unstable-internals-M84gUQCV.cjs} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { __toESM, require_defineProperty, require_objectSpread2 } from "./objectSpread2-BvkFp-_Y.mjs";
|
|
2
|
+
import { TRPCClientError } from "./TRPCClientError-CjKyS10w.mjs";
|
|
3
|
+
import { getTransformer } from "./unstable-internals-Bg7n9BBj.mjs";
|
|
3
4
|
import { behaviorSubject, observable } from "@trpc/server/observable";
|
|
4
5
|
import { run, sleep, transformResult } from "@trpc/server/unstable-core-do-not-import";
|
|
5
6
|
|
|
@@ -34,6 +35,7 @@ const resultOf = (value, ...args) => {
|
|
|
34
35
|
|
|
35
36
|
//#endregion
|
|
36
37
|
//#region src/links/wsLink/wsClient/utils.ts
|
|
38
|
+
var import_defineProperty$3 = __toESM(require_defineProperty(), 1);
|
|
37
39
|
var TRPCWebSocketClosedError = class TRPCWebSocketClosedError extends Error {
|
|
38
40
|
constructor(opts) {
|
|
39
41
|
super(opts.message, { cause: opts.cause });
|
|
@@ -46,10 +48,10 @@ var TRPCWebSocketClosedError = class TRPCWebSocketClosedError extends Error {
|
|
|
46
48
|
* Useful for scenarios where the timeout duration is reset dynamically based on events.
|
|
47
49
|
*/
|
|
48
50
|
var ResettableTimeout = class {
|
|
49
|
-
timeout;
|
|
50
51
|
constructor(onTimeout, timeoutMs) {
|
|
51
52
|
this.onTimeout = onTimeout;
|
|
52
53
|
this.timeoutMs = timeoutMs;
|
|
54
|
+
(0, import_defineProperty$3.default)(this, "timeout", void 0);
|
|
53
55
|
}
|
|
54
56
|
/**
|
|
55
57
|
* Resets the current timeout, restarting it with the same duration.
|
|
@@ -104,6 +106,7 @@ async function buildConnectionMessage(connectionParams) {
|
|
|
104
106
|
|
|
105
107
|
//#endregion
|
|
106
108
|
//#region src/links/wsLink/wsClient/requestManager.ts
|
|
109
|
+
var import_defineProperty$2 = __toESM(require_defineProperty(), 1);
|
|
107
110
|
/**
|
|
108
111
|
* Manages WebSocket requests, tracking their lifecycle and providing utility methods
|
|
109
112
|
* for handling outgoing and pending requests.
|
|
@@ -113,16 +116,10 @@ async function buildConnectionMessage(connectionParams) {
|
|
|
113
116
|
* For subscriptions, multiple responses may be received until the subscription is closed.
|
|
114
117
|
*/
|
|
115
118
|
var RequestManager = class {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Stores requests that are pending (in flight), meaning they have been sent over the WebSocket
|
|
122
|
-
* and are awaiting responses. For subscriptions, this includes requests
|
|
123
|
-
* that may receive multiple responses.
|
|
124
|
-
*/
|
|
125
|
-
pendingRequests = {};
|
|
119
|
+
constructor() {
|
|
120
|
+
(0, import_defineProperty$2.default)(this, "outgoingRequests", new Array());
|
|
121
|
+
(0, import_defineProperty$2.default)(this, "pendingRequests", {});
|
|
122
|
+
}
|
|
126
123
|
/**
|
|
127
124
|
* Registers a new request by adding it to the outgoing queue and setting up
|
|
128
125
|
* callbacks for lifecycle events such as completion or error.
|
|
@@ -237,6 +234,7 @@ var RequestManager = class {
|
|
|
237
234
|
|
|
238
235
|
//#endregion
|
|
239
236
|
//#region src/links/wsLink/wsClient/wsConnection.ts
|
|
237
|
+
var import_defineProperty$1 = __toESM(require_defineProperty(), 1);
|
|
240
238
|
/**
|
|
241
239
|
* Opens a WebSocket connection asynchronously and returns a promise
|
|
242
240
|
* that resolves when the connection is successfully established.
|
|
@@ -298,14 +296,15 @@ function setupPingInterval(ws, { intervalMs, pongTimeoutMs }) {
|
|
|
298
296
|
* and observable state tracking.
|
|
299
297
|
*/
|
|
300
298
|
var WsConnection = class WsConnection {
|
|
301
|
-
static connectCount = 0;
|
|
302
|
-
id = ++WsConnection.connectCount;
|
|
303
|
-
WebSocketPonyfill;
|
|
304
|
-
urlOptions;
|
|
305
|
-
keepAliveOpts;
|
|
306
|
-
wsObservable = behaviorSubject(null);
|
|
307
299
|
constructor(opts) {
|
|
308
|
-
|
|
300
|
+
var _opts$WebSocketPonyfi;
|
|
301
|
+
(0, import_defineProperty$1.default)(this, "id", ++WsConnection.connectCount);
|
|
302
|
+
(0, import_defineProperty$1.default)(this, "WebSocketPonyfill", void 0);
|
|
303
|
+
(0, import_defineProperty$1.default)(this, "urlOptions", void 0);
|
|
304
|
+
(0, import_defineProperty$1.default)(this, "keepAliveOpts", void 0);
|
|
305
|
+
(0, import_defineProperty$1.default)(this, "wsObservable", behaviorSubject(null));
|
|
306
|
+
(0, import_defineProperty$1.default)(this, "openPromise", null);
|
|
307
|
+
this.WebSocketPonyfill = (_opts$WebSocketPonyfi = opts.WebSocketPonyfill) !== null && _opts$WebSocketPonyfi !== void 0 ? _opts$WebSocketPonyfi : WebSocket;
|
|
309
308
|
if (!this.WebSocketPonyfill) throw new Error("No WebSocket implementation found - you probably don't want to use this on the server, but if you do you need to pass a `WebSocket`-ponyfill");
|
|
310
309
|
this.urlOptions = opts.urlOptions;
|
|
311
310
|
this.keepAliveOpts = opts.keepAlive;
|
|
@@ -328,36 +327,27 @@ var WsConnection = class WsConnection {
|
|
|
328
327
|
isClosed() {
|
|
329
328
|
return !!this.ws && (this.ws.readyState === this.WebSocketPonyfill.CLOSING || this.ws.readyState === this.WebSocketPonyfill.CLOSED);
|
|
330
329
|
}
|
|
331
|
-
/**
|
|
332
|
-
* Manages the WebSocket opening process, ensuring that only one open operation
|
|
333
|
-
* occurs at a time. Tracks the ongoing operation with `openPromise` to avoid
|
|
334
|
-
* redundant calls and ensure proper synchronization.
|
|
335
|
-
*
|
|
336
|
-
* Sets up the keep-alive mechanism and necessary event listeners for the connection.
|
|
337
|
-
*
|
|
338
|
-
* @returns A promise that resolves once the WebSocket connection is successfully opened.
|
|
339
|
-
*/
|
|
340
|
-
openPromise = null;
|
|
341
330
|
async open() {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
331
|
+
var _this = this;
|
|
332
|
+
if (_this.openPromise) return _this.openPromise;
|
|
333
|
+
_this.id = ++WsConnection.connectCount;
|
|
334
|
+
const wsPromise = prepareUrl(_this.urlOptions).then((url) => new _this.WebSocketPonyfill(url));
|
|
335
|
+
_this.openPromise = wsPromise.then(async (ws) => {
|
|
336
|
+
_this.ws = ws;
|
|
347
337
|
ws.addEventListener("message", function({ data }) {
|
|
348
338
|
if (data === "PING") this.send("PONG");
|
|
349
339
|
});
|
|
350
|
-
if (
|
|
340
|
+
if (_this.keepAliveOpts.enabled) setupPingInterval(ws, _this.keepAliveOpts);
|
|
351
341
|
ws.addEventListener("close", () => {
|
|
352
|
-
if (
|
|
342
|
+
if (_this.ws === ws) _this.ws = null;
|
|
353
343
|
});
|
|
354
344
|
await asyncWsOpen(ws);
|
|
355
|
-
if (
|
|
345
|
+
if (_this.urlOptions.connectionParams) ws.send(await buildConnectionMessage(_this.urlOptions.connectionParams));
|
|
356
346
|
});
|
|
357
347
|
try {
|
|
358
|
-
await
|
|
348
|
+
await _this.openPromise;
|
|
359
349
|
} finally {
|
|
360
|
-
|
|
350
|
+
_this.openPromise = null;
|
|
361
351
|
}
|
|
362
352
|
}
|
|
363
353
|
/**
|
|
@@ -365,13 +355,16 @@ var WsConnection = class WsConnection {
|
|
|
365
355
|
* Waits for any ongoing open operation to complete before closing.
|
|
366
356
|
*/
|
|
367
357
|
async close() {
|
|
358
|
+
var _this2 = this;
|
|
368
359
|
try {
|
|
369
|
-
await
|
|
360
|
+
await _this2.openPromise;
|
|
370
361
|
} finally {
|
|
371
|
-
|
|
362
|
+
var _this$ws;
|
|
363
|
+
(_this$ws = _this2.ws) === null || _this$ws === void 0 || _this$ws.close();
|
|
372
364
|
}
|
|
373
365
|
}
|
|
374
366
|
};
|
|
367
|
+
(0, import_defineProperty$1.default)(WsConnection, "connectCount", 0);
|
|
375
368
|
/**
|
|
376
369
|
* Provides a backward-compatible representation of the connection state.
|
|
377
370
|
*/
|
|
@@ -396,32 +389,30 @@ function backwardCompatibility(connection) {
|
|
|
396
389
|
|
|
397
390
|
//#endregion
|
|
398
391
|
//#region src/links/wsLink/wsClient/wsClient.ts
|
|
392
|
+
var import_defineProperty = __toESM(require_defineProperty(), 1);
|
|
393
|
+
var import_objectSpread2 = __toESM(require_objectSpread2(), 1);
|
|
399
394
|
/**
|
|
400
395
|
* A WebSocket client for managing TRPC operations, supporting lazy initialization,
|
|
401
396
|
* reconnection, keep-alive, and request management.
|
|
402
397
|
*/
|
|
403
398
|
var WsClient = class {
|
|
404
|
-
/**
|
|
405
|
-
* Observable tracking the current connection state, including errors.
|
|
406
|
-
*/
|
|
407
|
-
connectionState;
|
|
408
|
-
allowReconnect = false;
|
|
409
|
-
requestManager = new RequestManager();
|
|
410
|
-
activeConnection;
|
|
411
|
-
reconnectRetryDelay;
|
|
412
|
-
inactivityTimeout;
|
|
413
|
-
callbacks;
|
|
414
|
-
lazyMode;
|
|
415
399
|
constructor(opts) {
|
|
400
|
+
var _opts$retryDelayMs;
|
|
401
|
+
(0, import_defineProperty.default)(this, "connectionState", void 0);
|
|
402
|
+
(0, import_defineProperty.default)(this, "allowReconnect", false);
|
|
403
|
+
(0, import_defineProperty.default)(this, "requestManager", new RequestManager());
|
|
404
|
+
(0, import_defineProperty.default)(this, "activeConnection", void 0);
|
|
405
|
+
(0, import_defineProperty.default)(this, "reconnectRetryDelay", void 0);
|
|
406
|
+
(0, import_defineProperty.default)(this, "inactivityTimeout", void 0);
|
|
407
|
+
(0, import_defineProperty.default)(this, "callbacks", void 0);
|
|
408
|
+
(0, import_defineProperty.default)(this, "lazyMode", void 0);
|
|
409
|
+
(0, import_defineProperty.default)(this, "reconnecting", null);
|
|
416
410
|
this.callbacks = {
|
|
417
411
|
onOpen: opts.onOpen,
|
|
418
412
|
onClose: opts.onClose,
|
|
419
413
|
onError: opts.onError
|
|
420
414
|
};
|
|
421
|
-
const lazyOptions = {
|
|
422
|
-
...lazyDefaults,
|
|
423
|
-
...opts.lazy
|
|
424
|
-
};
|
|
415
|
+
const lazyOptions = (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, lazyDefaults), opts.lazy);
|
|
425
416
|
this.inactivityTimeout = new ResettableTimeout(() => {
|
|
426
417
|
if (this.requestManager.hasOutgoingRequests() || this.requestManager.hasPendingRequests()) {
|
|
427
418
|
this.inactivityTimeout.reset();
|
|
@@ -432,16 +423,13 @@ var WsClient = class {
|
|
|
432
423
|
this.activeConnection = new WsConnection({
|
|
433
424
|
WebSocketPonyfill: opts.WebSocket,
|
|
434
425
|
urlOptions: opts,
|
|
435
|
-
keepAlive: {
|
|
436
|
-
...keepAliveDefaults,
|
|
437
|
-
...opts.keepAlive
|
|
438
|
-
}
|
|
426
|
+
keepAlive: (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, keepAliveDefaults), opts.keepAlive)
|
|
439
427
|
});
|
|
440
428
|
this.activeConnection.wsObservable.subscribe({ next: (ws) => {
|
|
441
429
|
if (!ws) return;
|
|
442
430
|
this.setupWebSocketListeners(ws);
|
|
443
431
|
} });
|
|
444
|
-
this.reconnectRetryDelay = opts.retryDelayMs
|
|
432
|
+
this.reconnectRetryDelay = (_opts$retryDelayMs = opts.retryDelayMs) !== null && _opts$retryDelayMs !== void 0 ? _opts$retryDelayMs : exponentialBackoff;
|
|
445
433
|
this.lazyMode = lazyOptions.enabled;
|
|
446
434
|
this.connectionState = behaviorSubject({
|
|
447
435
|
type: "state",
|
|
@@ -455,20 +443,21 @@ var WsClient = class {
|
|
|
455
443
|
* the connection state accordingly.
|
|
456
444
|
*/
|
|
457
445
|
async open() {
|
|
458
|
-
|
|
459
|
-
|
|
446
|
+
var _this = this;
|
|
447
|
+
_this.allowReconnect = true;
|
|
448
|
+
if (_this.connectionState.get().state !== "connecting") _this.connectionState.next({
|
|
460
449
|
type: "state",
|
|
461
450
|
state: "connecting",
|
|
462
451
|
error: null
|
|
463
452
|
});
|
|
464
453
|
try {
|
|
465
|
-
await
|
|
454
|
+
await _this.activeConnection.open();
|
|
466
455
|
} catch (error) {
|
|
467
|
-
|
|
456
|
+
_this.reconnect(new TRPCWebSocketClosedError({
|
|
468
457
|
message: "Initialization error",
|
|
469
458
|
cause: error
|
|
470
459
|
}));
|
|
471
|
-
return
|
|
460
|
+
return _this.reconnecting;
|
|
472
461
|
}
|
|
473
462
|
}
|
|
474
463
|
/**
|
|
@@ -476,15 +465,16 @@ var WsClient = class {
|
|
|
476
465
|
* Ensures all outgoing and pending requests are properly finalized.
|
|
477
466
|
*/
|
|
478
467
|
async close() {
|
|
479
|
-
|
|
480
|
-
|
|
468
|
+
var _this2 = this;
|
|
469
|
+
_this2.allowReconnect = false;
|
|
470
|
+
_this2.inactivityTimeout.stop();
|
|
481
471
|
const requestsToAwait = [];
|
|
482
|
-
for (const request of
|
|
472
|
+
for (const request of _this2.requestManager.getRequests()) if (request.message.method === "subscription") request.callbacks.complete();
|
|
483
473
|
else if (request.state === "outgoing") request.callbacks.error(TRPCClientError.from(new TRPCWebSocketClosedError({ message: "Closed before connection was established" })));
|
|
484
474
|
else requestsToAwait.push(request.end);
|
|
485
475
|
await Promise.all(requestsToAwait).catch(() => null);
|
|
486
|
-
await
|
|
487
|
-
|
|
476
|
+
await _this2.activeConnection.close().catch(() => null);
|
|
477
|
+
_this2.connectionState.next({
|
|
488
478
|
type: "state",
|
|
489
479
|
state: "idle",
|
|
490
480
|
error: null
|
|
@@ -510,37 +500,29 @@ var WsClient = class {
|
|
|
510
500
|
path,
|
|
511
501
|
lastEventId
|
|
512
502
|
}
|
|
513
|
-
}, {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
observer.error(TRPCClientError.from(transformed.error));
|
|
519
|
-
return;
|
|
520
|
-
}
|
|
521
|
-
observer.next({ result: transformed.result });
|
|
503
|
+
}, (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, observer), {}, { next(event) {
|
|
504
|
+
const transformed = transformResult(event, transformer.output);
|
|
505
|
+
if (!transformed.ok) {
|
|
506
|
+
observer.error(TRPCClientError.from(transformed.error));
|
|
507
|
+
return;
|
|
522
508
|
}
|
|
523
|
-
|
|
509
|
+
observer.next({ result: transformed.result });
|
|
510
|
+
} }));
|
|
524
511
|
return () => {
|
|
525
512
|
abort();
|
|
526
513
|
if (type === "subscription" && this.activeConnection.isOpen()) this.send({
|
|
527
514
|
id,
|
|
528
515
|
method: "subscription.stop"
|
|
529
516
|
});
|
|
530
|
-
signal
|
|
517
|
+
signal === null || signal === void 0 || signal.removeEventListener("abort", abort);
|
|
531
518
|
};
|
|
532
519
|
});
|
|
533
520
|
}
|
|
534
521
|
get connection() {
|
|
535
522
|
return backwardCompatibility(this.activeConnection);
|
|
536
523
|
}
|
|
537
|
-
/**
|
|
538
|
-
* Manages the reconnection process for the WebSocket using retry logic.
|
|
539
|
-
* Ensures that only one reconnection attempt is active at a time by tracking the current
|
|
540
|
-
* reconnection state in the `reconnecting` promise.
|
|
541
|
-
*/
|
|
542
|
-
reconnecting = null;
|
|
543
524
|
reconnect(closedError) {
|
|
525
|
+
var _this3 = this;
|
|
544
526
|
this.connectionState.next({
|
|
545
527
|
type: "state",
|
|
546
528
|
state: "connecting",
|
|
@@ -549,25 +531,26 @@ var WsClient = class {
|
|
|
549
531
|
if (this.reconnecting) return;
|
|
550
532
|
const tryReconnect = async (attemptIndex) => {
|
|
551
533
|
try {
|
|
552
|
-
await sleep(
|
|
553
|
-
if (
|
|
554
|
-
await
|
|
555
|
-
await
|
|
556
|
-
if (
|
|
534
|
+
await sleep(_this3.reconnectRetryDelay(attemptIndex));
|
|
535
|
+
if (_this3.allowReconnect) {
|
|
536
|
+
await _this3.activeConnection.close();
|
|
537
|
+
await _this3.activeConnection.open();
|
|
538
|
+
if (_this3.requestManager.hasPendingRequests()) _this3.send(_this3.requestManager.getPendingRequests().map(({ message }) => message));
|
|
557
539
|
}
|
|
558
|
-
|
|
559
|
-
} catch {
|
|
540
|
+
_this3.reconnecting = null;
|
|
541
|
+
} catch (_unused) {
|
|
560
542
|
await tryReconnect(attemptIndex + 1);
|
|
561
543
|
}
|
|
562
544
|
};
|
|
563
545
|
this.reconnecting = tryReconnect(0);
|
|
564
546
|
}
|
|
565
547
|
setupWebSocketListeners(ws) {
|
|
548
|
+
var _this4 = this;
|
|
566
549
|
const handleCloseOrError = (cause) => {
|
|
567
550
|
const reqs = this.requestManager.getPendingRequests();
|
|
568
551
|
for (const { message, callbacks } of reqs) {
|
|
569
552
|
if (message.method === "subscription") continue;
|
|
570
|
-
callbacks.error(TRPCClientError.from(cause
|
|
553
|
+
callbacks.error(TRPCClientError.from(cause !== null && cause !== void 0 ? cause : new TRPCWebSocketClosedError({
|
|
571
554
|
message: "WebSocket closed",
|
|
572
555
|
cause
|
|
573
556
|
})));
|
|
@@ -576,9 +559,10 @@ var WsClient = class {
|
|
|
576
559
|
};
|
|
577
560
|
ws.addEventListener("open", () => {
|
|
578
561
|
run(async () => {
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
562
|
+
var _this$callbacks$onOpe, _this$callbacks;
|
|
563
|
+
if (_this4.lazyMode) _this4.inactivityTimeout.start();
|
|
564
|
+
(_this$callbacks$onOpe = (_this$callbacks = _this4.callbacks).onOpen) === null || _this$callbacks$onOpe === void 0 || _this$callbacks$onOpe.call(_this$callbacks);
|
|
565
|
+
_this4.connectionState.next({
|
|
582
566
|
type: "state",
|
|
583
567
|
state: "pending",
|
|
584
568
|
error: null
|
|
@@ -599,16 +583,18 @@ var WsClient = class {
|
|
|
599
583
|
this.handleResponseMessage(incomingMessage);
|
|
600
584
|
});
|
|
601
585
|
ws.addEventListener("close", (event) => {
|
|
586
|
+
var _this$callbacks$onClo, _this$callbacks2;
|
|
602
587
|
handleCloseOrError(event);
|
|
603
|
-
this.callbacks.onClose
|
|
588
|
+
(_this$callbacks$onClo = (_this$callbacks2 = this.callbacks).onClose) === null || _this$callbacks$onClo === void 0 || _this$callbacks$onClo.call(_this$callbacks2, event);
|
|
604
589
|
if (!this.lazyMode || this.requestManager.hasPendingSubscriptions()) this.reconnect(new TRPCWebSocketClosedError({
|
|
605
590
|
message: "WebSocket closed",
|
|
606
591
|
cause: event
|
|
607
592
|
}));
|
|
608
593
|
});
|
|
609
594
|
ws.addEventListener("error", (event) => {
|
|
595
|
+
var _this$callbacks$onErr, _this$callbacks3;
|
|
610
596
|
handleCloseOrError(event);
|
|
611
|
-
this.callbacks.onError
|
|
597
|
+
(_this$callbacks$onErr = (_this$callbacks3 = this.callbacks).onError) === null || _this$callbacks$onErr === void 0 || _this$callbacks$onErr.call(_this$callbacks3, event);
|
|
612
598
|
this.reconnect(new TRPCWebSocketClosedError({
|
|
613
599
|
message: "WebSocket closed",
|
|
614
600
|
cause: event
|
|
@@ -646,12 +632,13 @@ var WsClient = class {
|
|
|
646
632
|
* @returns A function to abort the batched request.
|
|
647
633
|
*/
|
|
648
634
|
batchSend(message, callbacks) {
|
|
635
|
+
var _this5 = this;
|
|
649
636
|
this.inactivityTimeout.reset();
|
|
650
637
|
run(async () => {
|
|
651
|
-
if (!
|
|
638
|
+
if (!_this5.activeConnection.isOpen()) await _this5.open();
|
|
652
639
|
await sleep(0);
|
|
653
|
-
if (!
|
|
654
|
-
|
|
640
|
+
if (!_this5.requestManager.hasOutgoingRequests()) return;
|
|
641
|
+
_this5.send(_this5.requestManager.flush().map(({ message: message$1 }) => message$1));
|
|
655
642
|
}).catch((err) => {
|
|
656
643
|
this.requestManager.delete(message.id);
|
|
657
644
|
callbacks.error(TRPCClientError.from(err));
|
|
@@ -686,7 +673,7 @@ function wsLink(opts) {
|
|
|
686
673
|
}).subscribe(observer);
|
|
687
674
|
return () => {
|
|
688
675
|
requestSubscription.unsubscribe();
|
|
689
|
-
connStateSubscription
|
|
676
|
+
connStateSubscription === null || connStateSubscription === void 0 || connStateSubscription.unsubscribe();
|
|
690
677
|
};
|
|
691
678
|
});
|
|
692
679
|
};
|
|
@@ -695,4 +682,4 @@ function wsLink(opts) {
|
|
|
695
682
|
|
|
696
683
|
//#endregion
|
|
697
684
|
export { createWSClient, resultOf, wsLink };
|
|
698
|
-
//# sourceMappingURL=wsLink-
|
|
685
|
+
//# sourceMappingURL=wsLink-H5IjZfJW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsLink-H5IjZfJW.mjs","names":["lazyDefaults: LazyOptions","keepAliveDefaults: KeepAliveOptions","attemptIndex: number","value: T | ((...args: TArgs) => T)","opts: { message: string; cause?: unknown }","onTimeout: () => void","timeoutMs: number","resolve: (value: T | PromiseLike<T>) => void","reject: (reason?: any) => void","urlOptions: UrlOptionsWithConnectionParams","connectionParams: CallbackOrValue<TRPCRequestInfo['connectionParams']>","message: TRPCConnectionParamsMessage","message: TRPCClientOutgoingMessage","callbacks: TCallbacks","messageId: MessageIdLike","ws: WebSocket","pingTimeout: ReturnType<typeof setTimeout> | undefined","pongTimeout: ReturnType<typeof setTimeout> | undefined","opts: WebSocketConnectionOptions","this","connection: WsConnection","opts: WebSocketClientOptions","this","requestsToAwait: Promise<void>[]","closedError: TRPCWebSocketClosedError","attemptIndex: number","ws: WebSocket","cause: unknown","message: TRPCResponseMessage","message: TRPCClientIncomingRequest","messageOrMessages: TRPCClientOutgoingMessage | TRPCClientOutgoingMessage[]","message: TRPCClientOutgoingMessage","callbacks: TCallbacks","message","opts: WebSocketClientOptions","opts: WebSocketLinkOptions<TRouter>"],"sources":["../src/links/wsLink/wsClient/options.ts","../src/links/internals/urlWithConnectionParams.ts","../src/links/wsLink/wsClient/utils.ts","../src/links/wsLink/wsClient/requestManager.ts","../src/links/wsLink/wsClient/wsConnection.ts","../src/links/wsLink/wsClient/wsClient.ts","../src/links/wsLink/createWsClient.ts","../src/links/wsLink/wsLink.ts"],"sourcesContent":["import type { UrlOptionsWithConnectionParams } from '../../internals/urlWithConnectionParams';\n\nexport interface WebSocketClientOptions extends UrlOptionsWithConnectionParams {\n /**\n * Ponyfill which WebSocket implementation to use\n */\n WebSocket?: typeof WebSocket;\n /**\n * The number of milliseconds before a reconnect is attempted.\n * @default {@link exponentialBackoff}\n */\n retryDelayMs?: (attemptIndex: number) => number;\n /**\n * Triggered when a WebSocket connection is established\n */\n onOpen?: () => void;\n /**\n * Triggered when a WebSocket connection encounters an error\n */\n onError?: (evt?: Event) => void;\n /**\n * Triggered when a WebSocket connection is closed\n */\n onClose?: (cause?: { code?: number }) => void;\n /**\n * Lazy mode will close the WebSocket automatically after a period of inactivity (no messages sent or received and no pending requests)\n */\n lazy?: {\n /**\n * Enable lazy mode\n * @default false\n */\n enabled: boolean;\n /**\n * Close the WebSocket after this many milliseconds\n * @default 0\n */\n closeMs: number;\n };\n /**\n * Send ping messages to the server and kill the connection if no pong message is returned\n */\n keepAlive?: {\n /**\n * @default false\n */\n enabled: boolean;\n /**\n * Send a ping message every this many milliseconds\n * @default 5_000\n */\n intervalMs?: number;\n /**\n * Close the WebSocket after this many milliseconds if the server does not respond\n * @default 1_000\n */\n pongTimeoutMs?: number;\n };\n}\n\n/**\n * Default options for lazy WebSocket connections.\n * Determines whether the connection should be established lazily and defines the delay before closure.\n */\nexport type LazyOptions = Required<NonNullable<WebSocketClientOptions['lazy']>>;\nexport const lazyDefaults: LazyOptions = {\n enabled: false,\n closeMs: 0,\n};\n\n/**\n * Default options for the WebSocket keep-alive mechanism.\n * Configures whether keep-alive is enabled and specifies the timeout and interval for ping-pong messages.\n */\nexport type KeepAliveOptions = Required<\n NonNullable<WebSocketClientOptions['keepAlive']>\n>;\nexport const keepAliveDefaults: KeepAliveOptions = {\n enabled: false,\n pongTimeoutMs: 1_000,\n intervalMs: 5_000,\n};\n\n/**\n * Calculates a delay for exponential backoff based on the retry attempt index.\n * The delay starts at 0 for the first attempt and doubles for each subsequent attempt,\n * capped at 30 seconds.\n */\nexport const exponentialBackoff = (attemptIndex: number) => {\n return attemptIndex === 0 ? 0 : Math.min(1000 * 2 ** attemptIndex, 30000);\n};\n","import { type TRPCRequestInfo } from '@trpc/server/http';\n\n/**\n * Get the result of a value or function that returns a value\n * It also optionally accepts typesafe arguments for the function\n */\nexport const resultOf = <T, TArgs extends any[]>(\n value: T | ((...args: TArgs) => T),\n ...args: TArgs\n): T => {\n return typeof value === 'function'\n ? (value as (...args: TArgs) => T)(...args)\n : value;\n};\n\n/**\n * A value that can be wrapped in callback\n */\nexport type CallbackOrValue<T> = T | (() => T | Promise<T>);\n\nexport interface UrlOptionsWithConnectionParams {\n /**\n * The URL to connect to (can be a function that returns a URL)\n */\n url: CallbackOrValue<string>;\n\n /**\n * Connection params that are available in `createContext()`\n * - For `wsLink`/`wsClient`, these are sent as the first message\n * - For `httpSubscriptionLink`, these are serialized as part of the URL under the `connectionParams` query\n */\n connectionParams?: CallbackOrValue<TRPCRequestInfo['connectionParams']>;\n}\n","import type {\n TRPCConnectionParamsMessage,\n TRPCRequestInfo,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type {\n CallbackOrValue,\n UrlOptionsWithConnectionParams,\n} from '../../internals/urlWithConnectionParams';\nimport { resultOf } from '../../internals/urlWithConnectionParams';\n\nexport class TRPCWebSocketClosedError extends Error {\n constructor(opts: { message: string; cause?: unknown }) {\n super(opts.message, {\n cause: opts.cause,\n });\n this.name = 'TRPCWebSocketClosedError';\n Object.setPrototypeOf(this, TRPCWebSocketClosedError.prototype);\n }\n}\n\n/**\n * Utility class for managing a timeout that can be started, stopped, and reset.\n * Useful for scenarios where the timeout duration is reset dynamically based on events.\n */\nexport class ResettableTimeout {\n private timeout: ReturnType<typeof setTimeout> | undefined;\n\n constructor(\n private readonly onTimeout: () => void,\n private readonly timeoutMs: number,\n ) {}\n\n /**\n * Resets the current timeout, restarting it with the same duration.\n * Does nothing if no timeout is active.\n */\n public reset() {\n if (!this.timeout) return;\n\n clearTimeout(this.timeout);\n this.timeout = setTimeout(this.onTimeout, this.timeoutMs);\n }\n\n public start() {\n clearTimeout(this.timeout);\n this.timeout = setTimeout(this.onTimeout, this.timeoutMs);\n }\n\n public stop() {\n clearTimeout(this.timeout);\n this.timeout = undefined;\n }\n}\n\n// Ponyfill for Promise.withResolvers https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers\nexport function withResolvers<T>() {\n let resolve: (value: T | PromiseLike<T>) => void;\n let reject: (reason?: any) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return { promise, resolve: resolve!, reject: reject! };\n}\n\n/**\n * Resolves a WebSocket URL and optionally appends connection parameters.\n *\n * If connectionParams are provided, appends 'connectionParams=1' query parameter.\n */\nexport async function prepareUrl(urlOptions: UrlOptionsWithConnectionParams) {\n const url = await resultOf(urlOptions.url);\n\n if (!urlOptions.connectionParams) return url;\n\n // append `?connectionParams=1` when connection params are used\n const prefix = url.includes('?') ? '&' : '?';\n const connectionParams = `${prefix}connectionParams=1`;\n\n return url + connectionParams;\n}\n\nexport async function buildConnectionMessage(\n connectionParams: CallbackOrValue<TRPCRequestInfo['connectionParams']>,\n) {\n const message: TRPCConnectionParamsMessage = {\n method: 'connectionParams',\n data: await resultOf(connectionParams),\n };\n\n return JSON.stringify(message);\n}\n","import type { AnyTRPCRouter, inferRouterError } from '@trpc/server';\nimport type { Observer } from '@trpc/server/observable';\nimport type {\n TRPCClientOutgoingMessage,\n TRPCResponseMessage,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type { TRPCClientError } from '../../../TRPCClientError';\nimport { withResolvers } from './utils';\n\nexport type TCallbacks = Observer<\n TRPCResponseMessage<unknown, inferRouterError<AnyTRPCRouter>>,\n TRPCClientError<AnyTRPCRouter>\n>;\n\ntype MessageId = string;\ntype MessageIdLike = string | number | null;\n\n/**\n * Represents a WebSocket request managed by the RequestManager.\n * Combines the network message, a utility promise (`end`) that mirrors the lifecycle\n * handled by `callbacks`, and a set of state monitoring callbacks.\n */\ninterface Request {\n message: TRPCClientOutgoingMessage;\n end: Promise<void>;\n callbacks: TCallbacks;\n}\n\n/**\n * Manages WebSocket requests, tracking their lifecycle and providing utility methods\n * for handling outgoing and pending requests.\n *\n * - **Outgoing requests**: Requests that are queued and waiting to be sent.\n * - **Pending requests**: Requests that have been sent and are in flight awaiting a response.\n * For subscriptions, multiple responses may be received until the subscription is closed.\n */\nexport class RequestManager {\n /**\n * Stores requests that are outgoing, meaning they are registered but not yet sent over the WebSocket.\n */\n private outgoingRequests = new Array<Request & { id: MessageId }>();\n\n /**\n * Stores requests that are pending (in flight), meaning they have been sent over the WebSocket\n * and are awaiting responses. For subscriptions, this includes requests\n * that may receive multiple responses.\n */\n private pendingRequests: Record<MessageId, Request> = {};\n\n /**\n * Registers a new request by adding it to the outgoing queue and setting up\n * callbacks for lifecycle events such as completion or error.\n *\n * @param message - The outgoing message to be sent.\n * @param callbacks - Callback functions to observe the request's state.\n * @returns A cleanup function to manually remove the request.\n */\n public register(message: TRPCClientOutgoingMessage, callbacks: TCallbacks) {\n const { promise: end, resolve } = withResolvers<void>();\n\n this.outgoingRequests.push({\n id: String(message.id),\n message,\n end,\n callbacks: {\n next: callbacks.next,\n complete: () => {\n callbacks.complete();\n resolve();\n },\n error: (e) => {\n callbacks.error(e);\n resolve();\n },\n },\n });\n\n return () => {\n this.delete(message.id);\n callbacks.complete();\n resolve();\n };\n }\n\n /**\n * Deletes a request from both the outgoing and pending collections, if it exists.\n */\n public delete(messageId: MessageIdLike) {\n if (messageId === null) return;\n\n this.outgoingRequests = this.outgoingRequests.filter(\n ({ id }) => id !== String(messageId),\n );\n delete this.pendingRequests[String(messageId)];\n }\n\n /**\n * Moves all outgoing requests to the pending state and clears the outgoing queue.\n *\n * The caller is expected to handle the actual sending of the requests\n * (e.g., sending them over the network) after this method is called.\n *\n * @returns The list of requests that were transitioned to the pending state.\n */\n public flush() {\n const requests = this.outgoingRequests;\n this.outgoingRequests = [];\n\n for (const request of requests) {\n this.pendingRequests[request.id] = request;\n }\n return requests;\n }\n\n /**\n * Retrieves all currently pending requests, which are in flight awaiting responses\n * or handling ongoing subscriptions.\n */\n public getPendingRequests() {\n return Object.values(this.pendingRequests);\n }\n\n /**\n * Retrieves a specific pending request by its message ID.\n */\n public getPendingRequest(messageId: MessageIdLike) {\n if (messageId === null) return null;\n\n return this.pendingRequests[String(messageId)];\n }\n\n /**\n * Retrieves all outgoing requests, which are waiting to be sent.\n */\n public getOutgoingRequests() {\n return this.outgoingRequests;\n }\n\n /**\n * Retrieves all requests, both outgoing and pending, with their respective states.\n *\n * @returns An array of all requests with their state (\"outgoing\" or \"pending\").\n */\n public getRequests() {\n return [\n ...this.getOutgoingRequests().map((request) => ({\n state: 'outgoing' as const,\n message: request.message,\n end: request.end,\n callbacks: request.callbacks,\n })),\n ...this.getPendingRequests().map((request) => ({\n state: 'pending' as const,\n message: request.message,\n end: request.end,\n callbacks: request.callbacks,\n })),\n ];\n }\n\n /**\n * Checks if there are any pending requests, including ongoing subscriptions.\n */\n public hasPendingRequests() {\n return this.getPendingRequests().length > 0;\n }\n\n /**\n * Checks if there are any pending subscriptions\n */\n public hasPendingSubscriptions() {\n return this.getPendingRequests().some(\n (request) => request.message.method === 'subscription',\n );\n }\n\n /**\n * Checks if there are any outgoing requests waiting to be sent.\n */\n public hasOutgoingRequests() {\n return this.outgoingRequests.length > 0;\n }\n}\n","import { behaviorSubject } from '@trpc/server/observable';\nimport type { UrlOptionsWithConnectionParams } from '../../internals/urlWithConnectionParams';\nimport { buildConnectionMessage, prepareUrl, withResolvers } from './utils';\n\n/**\n * Opens a WebSocket connection asynchronously and returns a promise\n * that resolves when the connection is successfully established.\n * The promise rejects if an error occurs during the connection attempt.\n */\nfunction asyncWsOpen(ws: WebSocket) {\n const { promise, resolve, reject } = withResolvers<void>();\n\n ws.addEventListener('open', () => {\n ws.removeEventListener('error', reject);\n resolve();\n });\n ws.addEventListener('error', reject);\n\n return promise;\n}\n\ninterface PingPongOptions {\n /**\n * The interval (in milliseconds) between \"PING\" messages.\n */\n intervalMs: number;\n\n /**\n * The timeout (in milliseconds) to wait for a \"PONG\" response before closing the connection.\n */\n pongTimeoutMs: number;\n}\n\n/**\n * Sets up a periodic ping-pong mechanism to keep the WebSocket connection alive.\n *\n * - Sends \"PING\" messages at regular intervals defined by `intervalMs`.\n * - If a \"PONG\" response is not received within the `pongTimeoutMs`, the WebSocket is closed.\n * - The ping timer resets upon receiving any message to maintain activity.\n * - Automatically starts the ping process when the WebSocket connection is opened.\n * - Cleans up timers when the WebSocket is closed.\n *\n * @param ws - The WebSocket instance to manage.\n * @param options - Configuration options for ping-pong intervals and timeouts.\n */\nfunction setupPingInterval(\n ws: WebSocket,\n { intervalMs, pongTimeoutMs }: PingPongOptions,\n) {\n let pingTimeout: ReturnType<typeof setTimeout> | undefined;\n let pongTimeout: ReturnType<typeof setTimeout> | undefined;\n\n function start() {\n pingTimeout = setTimeout(() => {\n ws.send('PING');\n pongTimeout = setTimeout(() => {\n ws.close();\n }, pongTimeoutMs);\n }, intervalMs);\n }\n\n function reset() {\n clearTimeout(pingTimeout);\n start();\n }\n\n function pong() {\n clearTimeout(pongTimeout);\n reset();\n }\n\n ws.addEventListener('open', start);\n ws.addEventListener('message', ({ data }) => {\n clearTimeout(pingTimeout);\n start();\n\n if (data === 'PONG') {\n pong();\n }\n });\n ws.addEventListener('close', () => {\n clearTimeout(pingTimeout);\n clearTimeout(pongTimeout);\n });\n}\n\nexport interface WebSocketConnectionOptions {\n WebSocketPonyfill?: typeof WebSocket;\n urlOptions: UrlOptionsWithConnectionParams;\n keepAlive: PingPongOptions & {\n enabled: boolean;\n };\n}\n\n/**\n * Manages a WebSocket connection with support for reconnection, keep-alive mechanisms,\n * and observable state tracking.\n */\nexport class WsConnection {\n static connectCount = 0;\n public id = ++WsConnection.connectCount;\n\n private readonly WebSocketPonyfill: typeof WebSocket;\n private readonly urlOptions: UrlOptionsWithConnectionParams;\n private readonly keepAliveOpts: WebSocketConnectionOptions['keepAlive'];\n public readonly wsObservable = behaviorSubject<WebSocket | null>(null);\n\n constructor(opts: WebSocketConnectionOptions) {\n this.WebSocketPonyfill = opts.WebSocketPonyfill ?? WebSocket;\n if (!this.WebSocketPonyfill) {\n throw new Error(\n \"No WebSocket implementation found - you probably don't want to use this on the server, but if you do you need to pass a `WebSocket`-ponyfill\",\n );\n }\n\n this.urlOptions = opts.urlOptions;\n this.keepAliveOpts = opts.keepAlive;\n }\n\n public get ws() {\n return this.wsObservable.get();\n }\n\n private set ws(ws) {\n this.wsObservable.next(ws);\n }\n\n /**\n * Checks if the WebSocket connection is open and ready to communicate.\n */\n public isOpen(): this is { ws: WebSocket } {\n return (\n !!this.ws &&\n this.ws.readyState === this.WebSocketPonyfill.OPEN &&\n !this.openPromise\n );\n }\n\n /**\n * Checks if the WebSocket connection is closed or in the process of closing.\n */\n public isClosed(): this is { ws: WebSocket } {\n return (\n !!this.ws &&\n (this.ws.readyState === this.WebSocketPonyfill.CLOSING ||\n this.ws.readyState === this.WebSocketPonyfill.CLOSED)\n );\n }\n\n /**\n * Manages the WebSocket opening process, ensuring that only one open operation\n * occurs at a time. Tracks the ongoing operation with `openPromise` to avoid\n * redundant calls and ensure proper synchronization.\n *\n * Sets up the keep-alive mechanism and necessary event listeners for the connection.\n *\n * @returns A promise that resolves once the WebSocket connection is successfully opened.\n */\n private openPromise: Promise<void> | null = null;\n public async open() {\n if (this.openPromise) return this.openPromise;\n\n this.id = ++WsConnection.connectCount;\n const wsPromise = prepareUrl(this.urlOptions).then(\n (url) => new this.WebSocketPonyfill(url),\n );\n this.openPromise = wsPromise.then(async (ws) => {\n this.ws = ws;\n\n // Setup ping listener\n ws.addEventListener('message', function ({ data }) {\n if (data === 'PING') {\n this.send('PONG');\n }\n });\n\n if (this.keepAliveOpts.enabled) {\n setupPingInterval(ws, this.keepAliveOpts);\n }\n\n ws.addEventListener('close', () => {\n if (this.ws === ws) {\n this.ws = null;\n }\n });\n\n await asyncWsOpen(ws);\n\n if (this.urlOptions.connectionParams) {\n ws.send(await buildConnectionMessage(this.urlOptions.connectionParams));\n }\n });\n\n try {\n await this.openPromise;\n } finally {\n this.openPromise = null;\n }\n }\n\n /**\n * Closes the WebSocket connection gracefully.\n * Waits for any ongoing open operation to complete before closing.\n */\n public async close() {\n try {\n await this.openPromise;\n } finally {\n this.ws?.close();\n }\n }\n}\n\n/**\n * Provides a backward-compatible representation of the connection state.\n */\nexport function backwardCompatibility(connection: WsConnection) {\n if (connection.isOpen()) {\n return {\n id: connection.id,\n state: 'open',\n ws: connection.ws,\n } as const;\n }\n\n if (connection.isClosed()) {\n return {\n id: connection.id,\n state: 'closed',\n ws: connection.ws,\n } as const;\n }\n\n if (!connection.ws) {\n return null;\n }\n\n return {\n id: connection.id,\n state: 'connecting',\n ws: connection.ws,\n } as const;\n}\n","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","import type { WebSocketClientOptions } from './wsClient/options';\nimport { WsClient } from './wsClient/wsClient';\n\nexport function createWSClient(opts: WebSocketClientOptions) {\n return new WsClient(opts);\n}\n\nexport type TRPCWebSocketClient = ReturnType<typeof createWSClient>;\n\nexport { WebSocketClientOptions };\n","import { observable } from '@trpc/server/observable';\nimport type {\n AnyRouter,\n inferClientTypes,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type { TransformerOptions } from '../../unstable-internals';\nimport { getTransformer } from '../../unstable-internals';\nimport type { TRPCLink } from '../types';\nimport type {\n TRPCWebSocketClient,\n WebSocketClientOptions,\n} from './createWsClient';\nimport { createWSClient } from './createWsClient';\n\nexport type WebSocketLinkOptions<TRouter extends AnyRouter> = {\n client: TRPCWebSocketClient;\n} & TransformerOptions<inferClientTypes<TRouter>>;\n\nexport function wsLink<TRouter extends AnyRouter>(\n opts: WebSocketLinkOptions<TRouter>,\n): TRPCLink<TRouter> {\n const { client } = opts;\n const transformer = getTransformer(opts.transformer);\n return () => {\n return ({ op }) => {\n return observable((observer) => {\n const connStateSubscription =\n op.type === 'subscription'\n ? client.connectionState.subscribe({\n next(result) {\n observer.next({\n result,\n context: op.context,\n });\n },\n })\n : null;\n\n const requestSubscription = client\n .request({\n op,\n transformer,\n })\n .subscribe(observer);\n\n return () => {\n requestSubscription.unsubscribe();\n connStateSubscription?.unsubscribe();\n };\n });\n };\n };\n}\n\nexport { TRPCWebSocketClient, WebSocketClientOptions, createWSClient };\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { TRPCConnectionState } from "./subscriptions.d-
|
|
2
|
-
import { Operation, OperationResultEnvelope, TRPCClientError, TRPCLink } from "./types.d-
|
|
3
|
-
import { TransformerOptions } from "./unstable-internals.d-
|
|
1
|
+
import { TRPCConnectionState } from "./subscriptions.d-Dlr1nWGD.mjs";
|
|
2
|
+
import { Operation, OperationResultEnvelope, TRPCClientError, TRPCLink } from "./types.d-POgEdUB1.mjs";
|
|
3
|
+
import { TransformerOptions } from "./unstable-internals.d-BOmV7EK1.mjs";
|
|
4
4
|
import * as _trpc_server_observable0 from "@trpc/server/observable";
|
|
5
5
|
import { BehaviorSubject } from "@trpc/server/observable";
|
|
6
6
|
import { AnyRouter, CombinedDataTransformer, inferClientTypes } from "@trpc/server/unstable-core-do-not-import";
|
|
@@ -191,4 +191,4 @@ type WebSocketLinkOptions<TRouter extends AnyRouter> = {
|
|
|
191
191
|
declare function wsLink<TRouter extends AnyRouter>(opts: WebSocketLinkOptions<TRouter>): TRPCLink<TRouter>;
|
|
192
192
|
//#endregion
|
|
193
193
|
export { TRPCWebSocketClient, UrlOptionsWithConnectionParams, WebSocketClientOptions, WebSocketLinkOptions, createWSClient, wsLink };
|
|
194
|
-
//# sourceMappingURL=wsLink.d-
|
|
194
|
+
//# sourceMappingURL=wsLink.d-BZxAJRBO.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wsLink.d-
|
|
1
|
+
{"version":3,"file":"wsLink.d-BZxAJRBO.d.mts","names":[],"sources":["../src/links/internals/urlWithConnectionParams.ts","../src/links/wsLink/wsClient/options.ts","../src/links/wsLink/wsClient/wsClient.ts","../src/links/wsLink/createWsClient.ts","../src/links/wsLink/wsLink.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;KAkBY,qBAAqB,WAAW,IAAI,QAAQ;AAA5C,UAEK,8BAAA,CAFU;EAAA;;;EAAkB,GAAW,EAMjD,eANiD,CAAA,MAAA,CAAA;EAAC;AAAF;AAEvD;;;EAIsB,gBAOe,CAAA,EAAhB,eAAgB,CAAA,eAAA,CAAA,kBAAA,CAAA,CAAA;;AAAD;;;UC7BnB,sBAAA,SAA+B;;;;qBAI3B;;;;;EDYT,YAAA,CAAA,EAAA,CAAA,YAAe,EAAA,MAAA,EAAA,GAAA,MAAA;EAAA;;;EAAkB,MAAW,CAAA,EAAA,GAAA,GAAA,IAAA;EAAC;AAAF;AAEvD;EAA+C,OAAA,CAAA,EAAA,CAAA,GAAA,CAAA,ECD5B,KDC4B,EAAA,GAAA,IAAA;EAAA;;;EAWX,OAAA,CAAA,EAAA,CAAA,MAAA,EAAA;;;;AC7BpC;;EAAwC,IAInB,CAAA,EAAA;IAaF;;AAjB2D;;;;AC2B9E;;;IAKwB,OAAA,EAAA,MAAA;EAAe,CAAA;EAAhB;;;EAwGH,SA0CV,CAAA,EAAA;IAAI;;;IAAmB,OAAA,EAAA,OAAA;IAC7B;;;;IAIa,UAAA,CAAA,EAAA,MAAA;IAEd;;;;IAAA,aAAA,CAAA,EAAA,MAAA;EAAA,CAAA;;;;;;;;;;;AFzKH;AAA2B,cEWd,QAAA,CFXc;EAAA;;;EAA8B,SAAT,eAAA,EEeb,eFfa,CEgB5C,mBFhB4C,CEgBxB,eFhBwB,CEgBR,aFhBQ,CAAA,CAAA,CAAA;EAAO,QAAA,cAAA;EAEtC,QAAA,cAAA;EAA8B,iBAAA,gBAAA;EAAA,iBAIxC,mBAAA;EAAe,QAOe,iBAAA;EAAe,iBAA/B,SAAA;EAAe,iBAAA,QAAA;oBEiBhB;;;AD9CpB;;EAAwC,QAInB,IAAA;EAAS;;AAJgD;;WCwI1D;;AA7GpB;;;;;;;;;EAuJY,OAAE,CAAA;IAAA,EAAA,EAAA;MAAA,EAAA;MAAA,IAAA;MAAA,IAAA;MAAA,KAAA;MAAA;IAAA,CAAA;IAAA,WAAA;IAAA;EAAyB,CAAzB,EAAA;IAAM,EAAA,EAIZ,IAJY,CAIP,SAJO,EAAA,IAAA,GAAA,MAAA,GAAA,MAAA,GAAA,OAAA,GAAA,QAAA,CAAA;IAAM,WAAA,EAKT,uBALS;IAAO,WAAA,CAAA,EAAA,MAAA;EAAM,CAAA,CAAA,EAOpC,wBAAA,CAAA,UANC,CAMD,uBANC,CAAA,OAAA,EAMD,eANC,CAMD,aANC,CAAA,CAAA,EAMD,eANC,CAMD,aANC,CAAA,CAAA;EAAW,IACX,UAAA,CAAA,CAAA,EAAA;IAES,SAAA,EAAA,EAAA,MAAA;IAAL,SAAA,KAAA,EAAA,MAAA;IACS,SAAA,EAAA,EAEd,SAFc;EAAuB,CAAA,GAErC;IAAA,SAAA,EAAA,EAAA,MAAA;IAAA,SAAA,KAAA,EAAA,QAAA;IAAA,SAAA,EAAA,WAAA;EAAA,CAAA,GAAA;IAAA,SAAA,EAAA,EAAA,MAAA;IAAA,SAAA,KAAA,EAAA,YAAA;;;;;;;ACxLH;EAA8B,QAAA,YAAA;EAAA,QAAO,SAAA;EAAsB,QAAA,uBAAA;EAAA,QAAA,qBAAA;EAI/C,QAAA,qBAAmB;EAAA;;;EAAa,QAAA,IAAA;;;;ACO5C;;EAAgC,QAAiB,SAAA;;;;;iBDXjC,cAAA,OAAqB,yBAAsB;KAI/C,mBAAA,GAAsB,kBAAkB;;;KCOxC,qCAAqC;UACvC;IACN,mBAAmB,iBAAiB;iBAExB,uBAAuB,iBAC/B,qBAAqB,WAC1B,SAAS"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trpc/client",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "11.4.
|
|
4
|
+
"version": "11.4.2",
|
|
5
5
|
"description": "The tRPC client library",
|
|
6
6
|
"author": "KATT",
|
|
7
7
|
"license": "MIT",
|
|
@@ -112,11 +112,11 @@
|
|
|
112
112
|
"!**/__tests__"
|
|
113
113
|
],
|
|
114
114
|
"peerDependencies": {
|
|
115
|
-
"@trpc/server": "11.4.
|
|
115
|
+
"@trpc/server": "11.4.2",
|
|
116
116
|
"typescript": ">=5.7.2"
|
|
117
117
|
},
|
|
118
118
|
"devDependencies": {
|
|
119
|
-
"@trpc/server": "11.4.
|
|
119
|
+
"@trpc/server": "11.4.2",
|
|
120
120
|
"@types/isomorphic-fetch": "^0.0.39",
|
|
121
121
|
"@types/node": "^22.13.5",
|
|
122
122
|
"dataloader": "^2.2.2",
|
|
@@ -135,5 +135,5 @@
|
|
|
135
135
|
"funding": [
|
|
136
136
|
"https://trpc.io/sponsor"
|
|
137
137
|
],
|
|
138
|
-
"gitHead": "
|
|
138
|
+
"gitHead": "094e2ae3041bfb90c3d3bf20470ec7d4feefa381"
|
|
139
139
|
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { isObject } from "@trpc/server/unstable-core-do-not-import";
|
|
2
|
-
|
|
3
|
-
//#region src/TRPCClientError.ts
|
|
4
|
-
function isTRPCClientError(cause) {
|
|
5
|
-
return cause instanceof TRPCClientError;
|
|
6
|
-
}
|
|
7
|
-
function isTRPCErrorResponse(obj) {
|
|
8
|
-
return isObject(obj) && isObject(obj["error"]) && typeof obj["error"]["code"] === "number" && typeof obj["error"]["message"] === "string";
|
|
9
|
-
}
|
|
10
|
-
function getMessageFromUnknownError(err, fallback) {
|
|
11
|
-
if (typeof err === "string") return err;
|
|
12
|
-
if (isObject(err) && typeof err["message"] === "string") return err["message"];
|
|
13
|
-
return fallback;
|
|
14
|
-
}
|
|
15
|
-
var TRPCClientError = class TRPCClientError extends Error {
|
|
16
|
-
cause;
|
|
17
|
-
shape;
|
|
18
|
-
data;
|
|
19
|
-
/**
|
|
20
|
-
* Additional meta data about the error
|
|
21
|
-
* In the case of HTTP-errors, we'll have `response` and potentially `responseJSON` here
|
|
22
|
-
*/
|
|
23
|
-
meta;
|
|
24
|
-
constructor(message, opts) {
|
|
25
|
-
const cause = opts?.cause;
|
|
26
|
-
super(message, { cause });
|
|
27
|
-
this.meta = opts?.meta;
|
|
28
|
-
this.cause = cause;
|
|
29
|
-
this.shape = opts?.result?.error;
|
|
30
|
-
this.data = opts?.result?.error.data;
|
|
31
|
-
this.name = "TRPCClientError";
|
|
32
|
-
Object.setPrototypeOf(this, TRPCClientError.prototype);
|
|
33
|
-
}
|
|
34
|
-
static from(_cause, opts = {}) {
|
|
35
|
-
const cause = _cause;
|
|
36
|
-
if (isTRPCClientError(cause)) {
|
|
37
|
-
if (opts.meta) cause.meta = {
|
|
38
|
-
...cause.meta,
|
|
39
|
-
...opts.meta
|
|
40
|
-
};
|
|
41
|
-
return cause;
|
|
42
|
-
}
|
|
43
|
-
if (isTRPCErrorResponse(cause)) return new TRPCClientError(cause.error.message, {
|
|
44
|
-
...opts,
|
|
45
|
-
result: cause
|
|
46
|
-
});
|
|
47
|
-
return new TRPCClientError(getMessageFromUnknownError(cause, "Unknown error"), {
|
|
48
|
-
...opts,
|
|
49
|
-
cause
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
//#endregion
|
|
55
|
-
export { TRPCClientError, isTRPCClientError };
|
|
56
|
-
//# sourceMappingURL=TRPCClientError-COkhCKf3.mjs.map
|