@trpc/client 10.2.0 → 10.3.0

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.
@@ -79,7 +79,7 @@ function httpRequest(opts) {
79
79
  const body = getBody(opts);
80
80
  const meta = {};
81
81
  Promise.resolve(opts.headers()).then((headers)=>{
82
- if (type === 'subscription') {
82
+ /* istanbul ignore if */ if (type === 'subscription') {
83
83
  throw new Error('Subscriptions should use wsLink');
84
84
  }
85
85
  return opts.fetch(url, {
@@ -77,7 +77,7 @@ function httpRequest(opts) {
77
77
  const body = getBody(opts);
78
78
  const meta = {};
79
79
  Promise.resolve(opts.headers()).then((headers)=>{
80
- if (type === 'subscription') {
80
+ /* istanbul ignore if */ if (type === 'subscription') {
81
81
  throw new Error('Subscriptions should use wsLink');
82
82
  }
83
83
  return opts.fetch(url, {
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ var transformResult = require('./transformResult-000baed1.js');
7
7
  var links_splitLink = require('./splitLink-f29e84be.js');
8
8
  var links_httpBatchLink = require('./links/httpBatchLink.js');
9
9
  var shared = require('@trpc/server/shared');
10
- var httpUtils = require('./httpUtils-47077ecd.js');
10
+ var httpUtils = require('./httpUtils-277fd63a.js');
11
11
  var links_httpLink = require('./links/httpLink.js');
12
12
  var links_loggerLink = require('./links/loggerLink.js');
13
13
  var links_wsLink = require('./links/wsLink.js');
package/dist/index.mjs CHANGED
@@ -6,7 +6,7 @@ export { s as splitLink } from './splitLink-4c75f7be.mjs';
6
6
  import { httpBatchLink } from './links/httpBatchLink.mjs';
7
7
  export { httpBatchLink } from './links/httpBatchLink.mjs';
8
8
  import { createFlatProxy, createRecursiveProxy } from '@trpc/server/shared';
9
- export { g as getFetch } from './httpUtils-01e0c677.mjs';
9
+ export { g as getFetch } from './httpUtils-939364d7.mjs';
10
10
  export { httpLink } from './links/httpLink.mjs';
11
11
  export { loggerLink } from './links/loggerLink.mjs';
12
12
  export { createWSClient, wsLink } from './links/wsLink.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"dedupeLink.d.ts","sourceRoot":"","sources":["../../src/links/dedupeLink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,wBAAgB,UAAU,CACxB,OAAO,SAAS,SAAS,GAAG,SAAS,KAClC,QAAQ,CAAC,OAAO,CAAC,CA6CrB"}
1
+ {"version":3,"file":"dedupeLink.d.ts","sourceRoot":"","sources":["../../src/links/dedupeLink.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,wBAAgB,UAAU,CACxB,OAAO,SAAS,SAAS,GAAG,SAAS,KAClC,QAAQ,CAAC,OAAO,CAAC,CA2CrB"}
@@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var observable = require('@trpc/server/observable');
6
6
  var transformResult = require('../transformResult-000baed1.js');
7
- var httpUtils = require('../httpUtils-47077ecd.js');
7
+ var httpUtils = require('../httpUtils-277fd63a.js');
8
8
 
9
9
  /* eslint-disable @typescript-eslint/no-non-null-assertion */ /**
10
10
  * A function that should never be called unless we messed something up.
@@ -1,6 +1,6 @@
1
1
  import { observable } from '@trpc/server/observable';
2
2
  import { t as transformResult, T as TRPCClientError } from '../transformResult-b10d288d.mjs';
3
- import { r as resolveHTTPLinkOptions, a as getUrl, h as httpRequest } from '../httpUtils-01e0c677.mjs';
3
+ import { r as resolveHTTPLinkOptions, a as getUrl, h as httpRequest } from '../httpUtils-939364d7.mjs';
4
4
 
5
5
  /* eslint-disable @typescript-eslint/no-non-null-assertion */ /**
6
6
  * A function that should never be called unless we messed something up.
@@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var observable = require('@trpc/server/observable');
6
6
  var transformResult = require('../transformResult-000baed1.js');
7
- var httpUtils = require('../httpUtils-47077ecd.js');
7
+ var httpUtils = require('../httpUtils-277fd63a.js');
8
8
 
9
9
  function httpLink(opts) {
10
10
  const resolvedOpts = httpUtils.resolveHTTPLinkOptions(opts);
@@ -1,6 +1,6 @@
1
1
  import { observable } from '@trpc/server/observable';
2
2
  import { t as transformResult, T as TRPCClientError } from '../transformResult-b10d288d.mjs';
3
- import { r as resolveHTTPLinkOptions, h as httpRequest } from '../httpUtils-01e0c677.mjs';
3
+ import { r as resolveHTTPLinkOptions, h as httpRequest } from '../httpUtils-939364d7.mjs';
4
4
 
5
5
  function httpLink(opts) {
6
6
  const resolvedOpts = resolveHTTPLinkOptions(opts);
@@ -1 +1 @@
1
- {"version":3,"file":"httpUtils.d.ts","sourceRoot":"","sources":["../../../src/links/internals/httpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,eAAe,GAAG,IAAI,CAAC;IAChD;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,eAAe,EAAE,OAAO,eAAe,GAAG,IAAI,CAAC;IAC/C;;;OAGG;IACH,OAAO,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACnD;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,eAAe,GACpB,uBAAuB,CAQzB;AAiBD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE;QACJ,QAAQ,EAAE,QAAQ,CAAC;KACpB,CAAC;CACH;AAED,aAAK,eAAe,GAAG;IACrB,OAAO,EAAE,iBAAiB,CAAC;CAC5B,GAAG,CAAC;IAAE,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAUjD,oBAAY,kBAAkB,GAAG,uBAAuB,GACtD,eAAe,GAAG;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEJ,wBAAgB,MAAM,CAAC,IAAI,EAAE,kBAAkB,UAgB9C;AAED,aAAK,cAAc,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GAAG,eAAe,CAAC;AAEhE,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,sBAM3C;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,kBAAkB,GACvB,gBAAgB,CAAC,UAAU,CAAC,CAwC9B"}
1
+ {"version":3,"file":"httpUtils.d.ts","sourceRoot":"","sources":["../../../src/links/internals/httpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,eAAe,GAAG,IAAI,CAAC;IAChD;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,eAAe,EAAE,OAAO,eAAe,GAAG,IAAI,CAAC;IAC/C;;;OAGG;IACH,OAAO,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACnD;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,eAAe,GACpB,uBAAuB,CAQzB;AAiBD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE;QACJ,QAAQ,EAAE,QAAQ,CAAC;KACpB,CAAC;CACH;AAED,aAAK,eAAe,GAAG;IACrB,OAAO,EAAE,iBAAiB,CAAC;CAC5B,GAAG,CAAC;IAAE,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAUjD,oBAAY,kBAAkB,GAAG,uBAAuB,GACtD,eAAe,GAAG;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEJ,wBAAgB,MAAM,CAAC,IAAI,EAAE,kBAAkB,UAgB9C;AAED,aAAK,cAAc,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GAAG,eAAe,CAAC;AAEhE,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,sBAM3C;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,kBAAkB,GACvB,gBAAgB,CAAC,UAAU,CAAC,CAyC9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"retryLink.d.ts","sourceRoot":"","sources":["../../src/links/retryLink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,wBAAgB,SAAS,CAAC,OAAO,SAAS,SAAS,GAAG,SAAS,EAAE,IAAI,EAAE;IACrE,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAiDpB"}
1
+ {"version":3,"file":"retryLink.d.ts","sourceRoot":"","sources":["../../src/links/retryLink.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,wBAAgB,SAAS,CAAC,OAAO,SAAS,SAAS,GAAG,SAAS,EAAE,IAAI,EAAE;IACrE,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAwCpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"wsLink.d.ts","sourceRoot":"","sources":["../../src/links/wsLink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAc,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAKL,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9C,aAAK,gBAAgB,CAAC,OAAO,SAAS,SAAS,EAAE,OAAO,IAAI,mBAAmB,CAC7E,OAAO,EACP,gBAAgB,CAAC,OAAO,CAAC,CAC1B,CAAC;AAEF,aAAK,kBAAkB,CAAC,OAAO,SAAS,SAAS,EAAE,OAAO,IAAI,QAAQ,CACpE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClC,eAAe,CAAC,OAAO,CAAC,CACzB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,UAAU,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,sBAAsB;;kBAuMpC,SAAS,wDAA0B,aAAa;;EAiDtE;AACD,oBAAY,mBAAmB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAiBD,wBAAgB,MAAM,CAAC,OAAO,SAAS,SAAS,EAC9C,IAAI,EAAE,oBAAoB,GACzB,QAAQ,CAAC,OAAO,CAAC,CA4DnB"}
1
+ {"version":3,"file":"wsLink.d.ts","sourceRoot":"","sources":["../../src/links/wsLink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAc,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAKL,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9C,aAAK,gBAAgB,CAAC,OAAO,SAAS,SAAS,EAAE,OAAO,IAAI,mBAAmB,CAC7E,OAAO,EACP,gBAAgB,CAAC,OAAO,CAAC,CAC1B,CAAC;AAEF,aAAK,kBAAkB,CAAC,OAAO,SAAS,SAAS,EAAE,OAAO,IAAI,QAAQ,CACpE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClC,eAAe,CAAC,OAAO,CAAC,CACzB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,UAAU,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,sBAAsB;;kBA+MpC,SAAS,wDAA0B,aAAa;;EAoDtE;AACD,oBAAY,mBAAmB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAiBD,wBAAgB,MAAM,CAAC,OAAO,SAAS,SAAS,EAC9C,IAAI,EAAE,oBAAoB,GACzB,QAAQ,CAAC,OAAO,CAAC,CA4DnB"}
@@ -148,13 +148,20 @@ function createWSClient(opts) {
148
148
  if (req.ws !== conn) {
149
149
  continue;
150
150
  }
151
- req.callbacks.error?.(transformResult.TRPCClientError.from(new TRPCWebSocketClosedError('WebSocket closed prematurely')));
152
- if (req.type !== 'subscription') {
151
+ if (state === 'closed') {
152
+ // If the connection was closed, we just call `complete()` on the request
153
153
  delete pendingRequests[key];
154
154
  req.callbacks.complete?.();
155
- } else if (state !== 'closed') {
156
- // request restart of sub with next connection
155
+ continue;
156
+ }
157
+ // The connection was closed either unexpectedly or because of a reconnect
158
+ if (req.type === 'subscription') {
159
+ // Subscriptions will resume after we've reconnected
157
160
  resumeSubscriptionOnReconnect(req);
161
+ } else {
162
+ // Queries and mutations will error if interrupted
163
+ delete pendingRequests[key];
164
+ req.callbacks.error?.(transformResult.TRPCClientError.from(new TRPCWebSocketClosedError('WebSocket closed prematurely')));
158
165
  }
159
166
  }
160
167
  });
@@ -184,7 +191,7 @@ function createWSClient(opts) {
184
191
  delete pendingRequests[id];
185
192
  outgoing = outgoing.filter((msg)=>msg.id !== id);
186
193
  callbacks?.complete?.();
187
- if (op.type === 'subscription') {
194
+ if (activeConnection.readyState === WebSocket.OPEN && op.type === 'subscription') {
188
195
  outgoing.push({
189
196
  id,
190
197
  method: 'subscription.stop'
@@ -144,13 +144,20 @@ function createWSClient(opts) {
144
144
  if (req.ws !== conn) {
145
145
  continue;
146
146
  }
147
- req.callbacks.error?.(TRPCClientError.from(new TRPCWebSocketClosedError('WebSocket closed prematurely')));
148
- if (req.type !== 'subscription') {
147
+ if (state === 'closed') {
148
+ // If the connection was closed, we just call `complete()` on the request
149
149
  delete pendingRequests[key];
150
150
  req.callbacks.complete?.();
151
- } else if (state !== 'closed') {
152
- // request restart of sub with next connection
151
+ continue;
152
+ }
153
+ // The connection was closed either unexpectedly or because of a reconnect
154
+ if (req.type === 'subscription') {
155
+ // Subscriptions will resume after we've reconnected
153
156
  resumeSubscriptionOnReconnect(req);
157
+ } else {
158
+ // Queries and mutations will error if interrupted
159
+ delete pendingRequests[key];
160
+ req.callbacks.error?.(TRPCClientError.from(new TRPCWebSocketClosedError('WebSocket closed prematurely')));
154
161
  }
155
162
  }
156
163
  });
@@ -180,7 +187,7 @@ function createWSClient(opts) {
180
187
  delete pendingRequests[id];
181
188
  outgoing = outgoing.filter((msg)=>msg.id !== id);
182
189
  callbacks?.complete?.();
183
- if (op.type === 'subscription') {
190
+ if (activeConnection.readyState === WebSocket.OPEN && op.type === 'subscription') {
184
191
  outgoing.push({
185
192
  id,
186
193
  method: 'subscription.stop'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trpc/client",
3
- "version": "10.2.0",
3
+ "version": "10.3.0",
4
4
  "description": "tRPC Client lib",
5
5
  "author": "KATT",
6
6
  "license": "MIT",
@@ -66,11 +66,11 @@
66
66
  "links"
67
67
  ],
68
68
  "peerDependencies": {
69
- "@trpc/server": "10.2.0"
69
+ "@trpc/server": "10.3.0"
70
70
  },
71
71
  "devDependencies": {
72
72
  "@testing-library/dom": "^8.18.1",
73
- "@trpc/server": "10.2.0",
73
+ "@trpc/server": "10.3.0",
74
74
  "@types/node": "^18.7.20",
75
75
  "rollup": "^2.79.1",
76
76
  "tsx": "^3.9.0"
@@ -78,5 +78,5 @@
78
78
  "publishConfig": {
79
79
  "access": "public"
80
80
  },
81
- "gitHead": "c4039504c5c170a6ef8a64c964f0593fafdb52ea"
81
+ "gitHead": "0d425918917ecadb58c87f5b0af62dfd386727cd"
82
82
  }
@@ -1,3 +1,5 @@
1
+ /* istanbul ignore file */
2
+ // We're not actually exporting this link
1
3
  import { AnyRouter } from '@trpc/server';
2
4
  import { Observable, observable, share } from '@trpc/server/observable';
3
5
  import { TRPCLink } from './types';
@@ -28,9 +30,7 @@ export function dedupeLink<
28
30
  delete pending[key];
29
31
  }
30
32
  const subscription = next(op).subscribe({
31
- next(v) {
32
- observer.next(v);
33
- },
33
+ ...observer,
34
34
  error(e) {
35
35
  reset();
36
36
  observer.error(e);
@@ -125,6 +125,7 @@ export function httpRequest(
125
125
  const meta = {} as HTTPResult['meta'];
126
126
  Promise.resolve(opts.headers())
127
127
  .then((headers) => {
128
+ /* istanbul ignore if */
128
129
  if (type === 'subscription') {
129
130
  throw new Error('Subscriptions should use wsLink');
130
131
  }
@@ -1,3 +1,5 @@
1
+ /* istanbul ignore file */
2
+ // We're not actually exporting this link
1
3
  import { AnyRouter } from '@trpc/server';
2
4
  import { Unsubscribable, observable } from '@trpc/server/observable';
3
5
  import { TRPCLink } from './types';
@@ -19,6 +21,7 @@ export function retryLink<TRouter extends AnyRouter = AnyRouter>(opts: {
19
21
  next$?.unsubscribe();
20
22
  next$ = next(op).subscribe({
21
23
  error(error) {
24
+ /* istanbul ignore if */
22
25
  if (attempts >= opts.attempts) {
23
26
  observer.error(error);
24
27
  return;
@@ -26,17 +29,7 @@ export function retryLink<TRouter extends AnyRouter = AnyRouter>(opts: {
26
29
  attempt();
27
30
  },
28
31
  next(result) {
29
- if ('result' in result.result) {
30
- isDone = true;
31
- observer.next(result);
32
- return;
33
- }
34
- if (attempts >= opts.attempts) {
35
- isDone = true;
36
- observer.next(result);
37
- return;
38
- }
39
- attempt();
32
+ observer.next(result);
40
33
  },
41
34
  complete() {
42
35
  if (isDone) {
@@ -212,17 +212,25 @@ export function createWSClient(opts: WebSocketClientOptions) {
212
212
  if (req.ws !== conn) {
213
213
  continue;
214
214
  }
215
- req.callbacks.error?.(
216
- TRPCClientError.from(
217
- new TRPCWebSocketClosedError('WebSocket closed prematurely'),
218
- ),
219
- );
220
- if (req.type !== 'subscription') {
215
+
216
+ if (state === 'closed') {
217
+ // If the connection was closed, we just call `complete()` on the request
221
218
  delete pendingRequests[key];
222
219
  req.callbacks.complete?.();
223
- } else if (state !== 'closed') {
224
- // request restart of sub with next connection
220
+ continue;
221
+ }
222
+ // The connection was closed either unexpectedly or because of a reconnect
223
+ if (req.type === 'subscription') {
224
+ // Subscriptions will resume after we've reconnected
225
225
  resumeSubscriptionOnReconnect(req);
226
+ } else {
227
+ // Queries and mutations will error if interrupted
228
+ delete pendingRequests[key];
229
+ req.callbacks.error?.(
230
+ TRPCClientError.from(
231
+ new TRPCWebSocketClosedError('WebSocket closed prematurely'),
232
+ ),
233
+ );
226
234
  }
227
235
  }
228
236
  });
@@ -256,7 +264,10 @@ export function createWSClient(opts: WebSocketClientOptions) {
256
264
  outgoing = outgoing.filter((msg) => msg.id !== id);
257
265
 
258
266
  callbacks?.complete?.();
259
- if (op.type === 'subscription') {
267
+ if (
268
+ activeConnection.readyState === WebSocket.OPEN &&
269
+ op.type === 'subscription'
270
+ ) {
260
271
  outgoing.push({
261
272
  id,
262
273
  method: 'subscription.stop',