@trpc/client 11.2.0 → 11.2.1-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/TRPCClientError.d.ts +1 -0
- package/dist/TRPCClientError.d.ts.map +1 -1
- package/dist/TRPCClientError.js +2 -4
- package/dist/TRPCClientError.mjs +2 -5
- package/dist/bundle-analysis.json +451 -0
- package/dist/index.js +3 -0
- package/dist/index.mjs +2 -1
- package/dist/internals/signals.d.ts +1 -0
- package/dist/internals/signals.d.ts.map +1 -1
- package/dist/internals/signals.js +14 -0
- package/dist/internals/signals.mjs +14 -1
- package/dist/links/httpSubscriptionLink.d.ts.map +1 -1
- package/dist/links/httpSubscriptionLink.js +1 -11
- package/dist/links/httpSubscriptionLink.mjs +2 -12
- package/dist/links/localLink.d.ts +15 -0
- package/dist/links/localLink.d.ts.map +1 -0
- package/dist/links/localLink.js +333 -0
- package/dist/links/localLink.mjs +331 -0
- package/dist/links.d.ts +1 -0
- package/dist/links.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/TRPCClientError.ts +4 -9
- package/src/internals/signals.ts +16 -0
- package/src/links/httpSubscriptionLink.ts +3 -18
- package/src/links/localLink.ts +277 -0
- package/src/links.ts +1 -0
- package/links/wsLink/index.d.ts +0 -1
- package/links/wsLink/index.js +0 -1
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { getTRPCErrorFromUnknown, isTrackedEnvelope, getTRPCErrorShape } from '@trpc/server';
|
|
2
|
+
import { observable, behaviorSubject } from '@trpc/server/observable';
|
|
3
|
+
import { TRPC_ERROR_CODES_BY_KEY } from '@trpc/server/rpc';
|
|
4
|
+
import { run, makeResource, isAsyncIterable, iteratorResource, isAbortError, retryableRpcCodes, callProcedure } from '@trpc/server/unstable-core-do-not-import';
|
|
5
|
+
import { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId.mjs';
|
|
6
|
+
import { raceAbortSignals, abortSignalToPromise } from '../internals/signals.mjs';
|
|
7
|
+
import { getTransformer } from '../internals/transformer.mjs';
|
|
8
|
+
import { isTRPCClientError, TRPCClientError } from '../TRPCClientError.mjs';
|
|
9
|
+
|
|
10
|
+
function _ts_add_disposable_resource(env, value, async) {
|
|
11
|
+
if (value !== null && value !== void 0) {
|
|
12
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
13
|
+
var dispose, inner;
|
|
14
|
+
if (async) {
|
|
15
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
16
|
+
dispose = value[Symbol.asyncDispose];
|
|
17
|
+
}
|
|
18
|
+
if (dispose === void 0) {
|
|
19
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
20
|
+
dispose = value[Symbol.dispose];
|
|
21
|
+
if (async) inner = dispose;
|
|
22
|
+
}
|
|
23
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
24
|
+
if (inner) dispose = function() {
|
|
25
|
+
try {
|
|
26
|
+
inner.call(this);
|
|
27
|
+
} catch (e) {
|
|
28
|
+
return Promise.reject(e);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
env.stack.push({
|
|
32
|
+
value: value,
|
|
33
|
+
dispose: dispose,
|
|
34
|
+
async: async
|
|
35
|
+
});
|
|
36
|
+
} else if (async) {
|
|
37
|
+
env.stack.push({
|
|
38
|
+
async: true
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
function _ts_dispose_resources(env) {
|
|
44
|
+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
45
|
+
var e = new Error(message);
|
|
46
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
47
|
+
};
|
|
48
|
+
return (_ts_dispose_resources = function _ts_dispose_resources(env) {
|
|
49
|
+
function fail(e) {
|
|
50
|
+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
51
|
+
env.hasError = true;
|
|
52
|
+
}
|
|
53
|
+
var r, s = 0;
|
|
54
|
+
function next() {
|
|
55
|
+
while(r = env.stack.pop()){
|
|
56
|
+
try {
|
|
57
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
58
|
+
if (r.dispose) {
|
|
59
|
+
var result = r.dispose.call(r.value);
|
|
60
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
|
|
61
|
+
fail(e);
|
|
62
|
+
return next();
|
|
63
|
+
});
|
|
64
|
+
} else s |= 1;
|
|
65
|
+
} catch (e) {
|
|
66
|
+
fail(e);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
70
|
+
if (env.hasError) throw env.error;
|
|
71
|
+
}
|
|
72
|
+
return next();
|
|
73
|
+
})(env);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* localLink is a terminating link that allows you to make tRPC procedure calls directly in your application without going through HTTP.
|
|
77
|
+
*
|
|
78
|
+
* @see https://trpc.io/docs/links/localLink
|
|
79
|
+
*/ function experimental_localLink(opts) {
|
|
80
|
+
const transformer = getTransformer(opts.transformer);
|
|
81
|
+
const transformChunk = (chunk)=>{
|
|
82
|
+
if (opts.transformer) {
|
|
83
|
+
// assume transformer will do the right thing
|
|
84
|
+
return chunk;
|
|
85
|
+
}
|
|
86
|
+
// Special case for undefined, because `JSON.stringify(undefined)` throws
|
|
87
|
+
if (chunk === undefined) {
|
|
88
|
+
return chunk;
|
|
89
|
+
}
|
|
90
|
+
const serialized = JSON.stringify(transformer.input.serialize(chunk));
|
|
91
|
+
const deserialized = JSON.parse(transformer.output.deserialize(serialized));
|
|
92
|
+
return deserialized;
|
|
93
|
+
};
|
|
94
|
+
return ()=>({ op })=>observable((observer)=>{
|
|
95
|
+
let ctx = undefined;
|
|
96
|
+
const ac = new AbortController();
|
|
97
|
+
const signal = raceAbortSignals(op.signal, ac.signal);
|
|
98
|
+
const signalPromise = abortSignalToPromise(signal);
|
|
99
|
+
signalPromise.catch(()=>{
|
|
100
|
+
// prevent unhandled rejection
|
|
101
|
+
});
|
|
102
|
+
let input = op.input;
|
|
103
|
+
async function runProcedure(newInput) {
|
|
104
|
+
input = newInput;
|
|
105
|
+
ctx = await opts.createContext();
|
|
106
|
+
return callProcedure({
|
|
107
|
+
router: opts.router,
|
|
108
|
+
path: op.path,
|
|
109
|
+
getRawInput: async ()=>newInput,
|
|
110
|
+
ctx,
|
|
111
|
+
type: op.type,
|
|
112
|
+
signal
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
function onErrorCallback(cause) {
|
|
116
|
+
if (isAbortError(cause)) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
opts.onError?.({
|
|
120
|
+
error: getTRPCErrorFromUnknown(cause),
|
|
121
|
+
type: op.type,
|
|
122
|
+
path: op.path,
|
|
123
|
+
input,
|
|
124
|
+
ctx
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function coerceToTRPCClientError(cause) {
|
|
128
|
+
if (isTRPCClientError(cause)) {
|
|
129
|
+
return cause;
|
|
130
|
+
}
|
|
131
|
+
const error = getTRPCErrorFromUnknown(cause);
|
|
132
|
+
const shape = getTRPCErrorShape({
|
|
133
|
+
config: opts.router._def._config,
|
|
134
|
+
ctx,
|
|
135
|
+
error,
|
|
136
|
+
input,
|
|
137
|
+
path: op.path,
|
|
138
|
+
type: op.type
|
|
139
|
+
});
|
|
140
|
+
return TRPCClientError.from({
|
|
141
|
+
error: transformChunk(shape)
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
run(async ()=>{
|
|
145
|
+
switch(op.type){
|
|
146
|
+
case 'query':
|
|
147
|
+
case 'mutation':
|
|
148
|
+
{
|
|
149
|
+
const result = await runProcedure(op.input);
|
|
150
|
+
if (!isAsyncIterable(result)) {
|
|
151
|
+
observer.next({
|
|
152
|
+
result: {
|
|
153
|
+
data: transformChunk(result)
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
observer.complete();
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
observer.next({
|
|
160
|
+
result: {
|
|
161
|
+
data: async function*() {
|
|
162
|
+
const env = {
|
|
163
|
+
stack: [],
|
|
164
|
+
error: void 0,
|
|
165
|
+
hasError: false
|
|
166
|
+
};
|
|
167
|
+
try {
|
|
168
|
+
const iterator = _ts_add_disposable_resource(env, iteratorResource(result), true);
|
|
169
|
+
;
|
|
170
|
+
const _finally = _ts_add_disposable_resource(env, makeResource({}, ()=>{
|
|
171
|
+
observer.complete();
|
|
172
|
+
}), false);
|
|
173
|
+
;
|
|
174
|
+
try {
|
|
175
|
+
while(true){
|
|
176
|
+
const res = await Promise.race([
|
|
177
|
+
iterator.next(),
|
|
178
|
+
signalPromise
|
|
179
|
+
]);
|
|
180
|
+
if (res.done) {
|
|
181
|
+
return transformChunk(res.value);
|
|
182
|
+
}
|
|
183
|
+
yield transformChunk(res.value);
|
|
184
|
+
}
|
|
185
|
+
} catch (cause) {
|
|
186
|
+
onErrorCallback(cause);
|
|
187
|
+
throw coerceToTRPCClientError(cause);
|
|
188
|
+
}
|
|
189
|
+
} catch (e) {
|
|
190
|
+
env.error = e;
|
|
191
|
+
env.hasError = true;
|
|
192
|
+
} finally{
|
|
193
|
+
const result = _ts_dispose_resources(env);
|
|
194
|
+
if (result) await result;
|
|
195
|
+
}
|
|
196
|
+
}()
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
case 'subscription':
|
|
202
|
+
{
|
|
203
|
+
const env = {
|
|
204
|
+
stack: [],
|
|
205
|
+
error: void 0,
|
|
206
|
+
hasError: false
|
|
207
|
+
};
|
|
208
|
+
try {
|
|
209
|
+
const connectionState = behaviorSubject({
|
|
210
|
+
type: 'state',
|
|
211
|
+
state: 'connecting',
|
|
212
|
+
error: null
|
|
213
|
+
});
|
|
214
|
+
const connectionSub = connectionState.subscribe({
|
|
215
|
+
next (state) {
|
|
216
|
+
observer.next({
|
|
217
|
+
result: state
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
let lastEventId = undefined;
|
|
222
|
+
const _finally = _ts_add_disposable_resource(env, makeResource({}, async ()=>{
|
|
223
|
+
observer.complete();
|
|
224
|
+
connectionState.next({
|
|
225
|
+
type: 'state',
|
|
226
|
+
state: 'idle',
|
|
227
|
+
error: null
|
|
228
|
+
});
|
|
229
|
+
connectionSub.unsubscribe();
|
|
230
|
+
}), false);
|
|
231
|
+
;
|
|
232
|
+
while(true){
|
|
233
|
+
const env = {
|
|
234
|
+
stack: [],
|
|
235
|
+
error: void 0,
|
|
236
|
+
hasError: false
|
|
237
|
+
};
|
|
238
|
+
try {
|
|
239
|
+
const result = await runProcedure(inputWithTrackedEventId(op.input, lastEventId));
|
|
240
|
+
if (!isAsyncIterable(result)) {
|
|
241
|
+
throw new Error('Expected an async iterable');
|
|
242
|
+
}
|
|
243
|
+
const iterator = _ts_add_disposable_resource(env, iteratorResource(result), true);
|
|
244
|
+
;
|
|
245
|
+
observer.next({
|
|
246
|
+
result: {
|
|
247
|
+
type: 'started'
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
connectionState.next({
|
|
251
|
+
type: 'state',
|
|
252
|
+
state: 'pending',
|
|
253
|
+
error: null
|
|
254
|
+
});
|
|
255
|
+
// Use a while loop to handle errors and reconnects
|
|
256
|
+
while(true){
|
|
257
|
+
let res;
|
|
258
|
+
try {
|
|
259
|
+
res = await Promise.race([
|
|
260
|
+
iterator.next(),
|
|
261
|
+
signalPromise
|
|
262
|
+
]);
|
|
263
|
+
} catch (cause) {
|
|
264
|
+
if (isAbortError(cause)) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const error = getTRPCErrorFromUnknown(cause);
|
|
268
|
+
if (!retryableRpcCodes.includes(TRPC_ERROR_CODES_BY_KEY[error.code])) {
|
|
269
|
+
throw coerceToTRPCClientError(error);
|
|
270
|
+
}
|
|
271
|
+
onErrorCallback(error);
|
|
272
|
+
connectionState.next({
|
|
273
|
+
type: 'state',
|
|
274
|
+
state: 'connecting',
|
|
275
|
+
error: coerceToTRPCClientError(error)
|
|
276
|
+
});
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
if (res.done) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
let chunk;
|
|
283
|
+
if (isTrackedEnvelope(res.value)) {
|
|
284
|
+
lastEventId = res.value[0];
|
|
285
|
+
chunk = {
|
|
286
|
+
id: res.value[0],
|
|
287
|
+
data: {
|
|
288
|
+
id: res.value[0],
|
|
289
|
+
data: res.value[1]
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
} else {
|
|
293
|
+
chunk = {
|
|
294
|
+
data: res.value
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
observer.next({
|
|
298
|
+
result: {
|
|
299
|
+
...chunk,
|
|
300
|
+
data: transformChunk(chunk.data)
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
} catch (e) {
|
|
305
|
+
env.error = e;
|
|
306
|
+
env.hasError = true;
|
|
307
|
+
} finally{
|
|
308
|
+
const result = _ts_dispose_resources(env);
|
|
309
|
+
if (result) await result;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
break;
|
|
313
|
+
} catch (e) {
|
|
314
|
+
env.error = e;
|
|
315
|
+
env.hasError = true;
|
|
316
|
+
} finally{
|
|
317
|
+
_ts_dispose_resources(env);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}).catch((cause)=>{
|
|
322
|
+
onErrorCallback(cause);
|
|
323
|
+
observer.error(coerceToTRPCClientError(cause));
|
|
324
|
+
});
|
|
325
|
+
return ()=>{
|
|
326
|
+
ac.abort();
|
|
327
|
+
};
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export { experimental_localLink };
|
package/dist/links.d.ts
CHANGED
package/dist/links.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAE9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAE9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trpc/client",
|
|
3
|
-
"version": "11.2.
|
|
3
|
+
"version": "11.2.1-canary.1+e54c2b3ee",
|
|
4
4
|
"description": "The tRPC client library",
|
|
5
5
|
"author": "KATT",
|
|
6
6
|
"license": "MIT",
|
|
@@ -77,11 +77,11 @@
|
|
|
77
77
|
"!**/__tests__"
|
|
78
78
|
],
|
|
79
79
|
"peerDependencies": {
|
|
80
|
-
"@trpc/server": "11.2.
|
|
80
|
+
"@trpc/server": "11.2.1-canary.1+e54c2b3ee",
|
|
81
81
|
"typescript": ">=5.7.2"
|
|
82
82
|
},
|
|
83
83
|
"devDependencies": {
|
|
84
|
-
"@trpc/server": "11.2.
|
|
84
|
+
"@trpc/server": "11.2.1-canary.1+e54c2b3ee",
|
|
85
85
|
"@types/isomorphic-fetch": "^0.0.39",
|
|
86
86
|
"@types/node": "^22.13.5",
|
|
87
87
|
"dataloader": "^2.2.2",
|
|
@@ -101,5 +101,5 @@
|
|
|
101
101
|
"funding": [
|
|
102
102
|
"https://trpc.io/sponsor"
|
|
103
103
|
],
|
|
104
|
-
"gitHead": "
|
|
104
|
+
"gitHead": "e54c2b3ee6d9559847e8f3a9710d629c809043ad"
|
|
105
105
|
}
|
package/src/TRPCClientError.ts
CHANGED
|
@@ -19,15 +19,10 @@ export interface TRPCClientErrorBase<TShape extends DefaultErrorShape> {
|
|
|
19
19
|
export type TRPCClientErrorLike<TInferrable extends InferrableClientTypes> =
|
|
20
20
|
TRPCClientErrorBase<inferErrorShape<TInferrable>>;
|
|
21
21
|
|
|
22
|
-
function isTRPCClientError
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
* @deprecated
|
|
27
|
-
* Delete in next major
|
|
28
|
-
*/
|
|
29
|
-
(cause instanceof Error && cause.name === 'TRPCClientError')
|
|
30
|
-
);
|
|
22
|
+
export function isTRPCClientError<TInferrable extends InferrableClientTypes>(
|
|
23
|
+
cause: unknown,
|
|
24
|
+
): cause is TRPCClientError<TInferrable> {
|
|
25
|
+
return cause instanceof TRPCClientError;
|
|
31
26
|
}
|
|
32
27
|
|
|
33
28
|
function isTRPCErrorResponse(obj: unknown): obj is TRPCErrorResponse<any> {
|
package/src/internals/signals.ts
CHANGED
|
@@ -52,3 +52,19 @@ export function raceAbortSignals(
|
|
|
52
52
|
|
|
53
53
|
return ac.signal;
|
|
54
54
|
}
|
|
55
|
+
|
|
56
|
+
export function abortSignalToPromise(signal: AbortSignal): Promise<never> {
|
|
57
|
+
return new Promise((_, reject) => {
|
|
58
|
+
if (signal.aborted) {
|
|
59
|
+
reject(signal.reason);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
signal.addEventListener(
|
|
63
|
+
'abort',
|
|
64
|
+
() => {
|
|
65
|
+
reject(signal.reason);
|
|
66
|
+
},
|
|
67
|
+
{ once: true },
|
|
68
|
+
);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import { behaviorSubject, observable } from '@trpc/server/observable';
|
|
2
|
-
import type {
|
|
3
|
-
TRPC_ERROR_CODE_NUMBER,
|
|
4
|
-
TRPCErrorShape,
|
|
5
|
-
TRPCResult,
|
|
6
|
-
} from '@trpc/server/rpc';
|
|
7
|
-
import { TRPC_ERROR_CODES_BY_KEY } from '@trpc/server/rpc';
|
|
2
|
+
import type { TRPCErrorShape, TRPCResult } from '@trpc/server/rpc';
|
|
8
3
|
import type {
|
|
9
4
|
AnyClientTypes,
|
|
10
5
|
EventSourceLike,
|
|
@@ -12,6 +7,7 @@ import type {
|
|
|
12
7
|
InferrableClientTypes,
|
|
13
8
|
} from '@trpc/server/unstable-core-do-not-import';
|
|
14
9
|
import {
|
|
10
|
+
retryableRpcCodes,
|
|
15
11
|
run,
|
|
16
12
|
sseStreamConsumer,
|
|
17
13
|
} from '@trpc/server/unstable-core-do-not-import';
|
|
@@ -63,17 +59,6 @@ type HTTPSubscriptionLinkOptions<
|
|
|
63
59
|
} & TransformerOptions<TRoot> &
|
|
64
60
|
UrlOptionsWithConnectionParams;
|
|
65
61
|
|
|
66
|
-
/**
|
|
67
|
-
* tRPC error codes that are considered retryable
|
|
68
|
-
* With out of the box SSE, the client will reconnect when these errors are encountered
|
|
69
|
-
*/
|
|
70
|
-
const codes5xx: TRPC_ERROR_CODE_NUMBER[] = [
|
|
71
|
-
TRPC_ERROR_CODES_BY_KEY.BAD_GATEWAY,
|
|
72
|
-
TRPC_ERROR_CODES_BY_KEY.SERVICE_UNAVAILABLE,
|
|
73
|
-
TRPC_ERROR_CODES_BY_KEY.GATEWAY_TIMEOUT,
|
|
74
|
-
TRPC_ERROR_CODES_BY_KEY.INTERNAL_SERVER_ERROR,
|
|
75
|
-
];
|
|
76
|
-
|
|
77
62
|
/**
|
|
78
63
|
* @see https://trpc.io/docs/client/links/httpSubscriptionLink
|
|
79
64
|
*/
|
|
@@ -190,7 +175,7 @@ export function httpSubscriptionLink<
|
|
|
190
175
|
case 'serialized-error': {
|
|
191
176
|
const error = TRPCClientError.from({ error: chunk.error });
|
|
192
177
|
|
|
193
|
-
if (
|
|
178
|
+
if (retryableRpcCodes.includes(chunk.error.code)) {
|
|
194
179
|
//
|
|
195
180
|
connectionState.next({
|
|
196
181
|
type: 'state',
|