@trpc/client 11.0.0-alpha-tmp-subscription-connection-state.488 → 11.0.0-alpha-tmp-12-06-react.665
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 -1
- package/dist/TRPCClientError.d.ts.map +1 -1
- package/dist/TRPCClientError.js +19 -1
- package/dist/TRPCClientError.mjs +19 -1
- package/dist/bundle-analysis.json +124 -98
- package/dist/createTRPCClient.d.ts +3 -2
- package/dist/createTRPCClient.d.ts.map +1 -1
- package/dist/createTRPCClient.js +1 -1
- package/dist/createTRPCClient.mjs +1 -1
- package/dist/index.js +6 -6
- package/dist/index.mjs +2 -2
- package/dist/internals/TRPCUntypedClient.d.ts +5 -4
- package/dist/internals/TRPCUntypedClient.d.ts.map +1 -1
- package/dist/internals/TRPCUntypedClient.js +42 -12
- package/dist/internals/TRPCUntypedClient.mjs +42 -12
- package/dist/internals/inputWithTrackedEventId.d.ts +2 -0
- package/dist/internals/inputWithTrackedEventId.d.ts.map +1 -0
- package/dist/internals/inputWithTrackedEventId.js +16 -0
- package/dist/internals/inputWithTrackedEventId.mjs +14 -0
- package/dist/internals/signals.d.ts +15 -0
- package/dist/internals/signals.d.ts.map +1 -0
- package/dist/internals/signals.js +47 -0
- package/dist/internals/signals.mjs +44 -0
- package/dist/internals/transformer.d.ts +2 -2
- package/dist/internals/types.d.ts +1 -1
- package/dist/internals/types.d.ts.map +1 -1
- package/dist/links/HTTPBatchLinkOptions.d.ts +1 -1
- package/dist/links/httpBatchLink.d.ts.map +1 -1
- package/dist/links/httpBatchLink.js +4 -3
- package/dist/links/httpBatchLink.mjs +5 -4
- package/dist/links/httpBatchStreamLink.d.ts.map +1 -1
- package/dist/links/httpBatchStreamLink.js +6 -4
- package/dist/links/httpBatchStreamLink.mjs +7 -5
- package/dist/links/httpLink.d.ts +2 -2
- package/dist/links/httpLink.js +3 -3
- package/dist/links/httpLink.mjs +3 -3
- package/dist/links/httpSubscriptionLink.d.ts +11 -6
- package/dist/links/httpSubscriptionLink.d.ts.map +1 -1
- package/dist/links/httpSubscriptionLink.js +130 -94
- package/dist/links/httpSubscriptionLink.mjs +132 -96
- package/dist/links/internals/contentTypes.d.ts +2 -2
- package/dist/links/internals/contentTypes.d.ts.map +1 -1
- package/dist/links/internals/httpUtils.d.ts +1 -8
- package/dist/links/internals/httpUtils.d.ts.map +1 -1
- package/dist/links/internals/httpUtils.js +1 -30
- package/dist/links/internals/httpUtils.mjs +2 -30
- package/dist/links/internals/subscriptions.d.ts +20 -0
- package/dist/links/internals/subscriptions.d.ts.map +1 -0
- package/dist/links/internals/urlWithConnectionParams.d.ts +2 -1
- package/dist/links/internals/urlWithConnectionParams.d.ts.map +1 -1
- package/dist/links/internals/urlWithConnectionParams.js +3 -2
- package/dist/links/internals/urlWithConnectionParams.mjs +3 -2
- package/dist/links/loggerLink.d.ts +5 -5
- package/dist/links/loggerLink.d.ts.map +1 -1
- package/dist/links/loggerLink.js +25 -21
- package/dist/links/loggerLink.mjs +25 -21
- package/dist/links/retryLink.d.ts +29 -0
- package/dist/links/retryLink.d.ts.map +1 -0
- package/dist/links/retryLink.js +65 -0
- package/dist/links/retryLink.mjs +63 -0
- package/dist/links/types.d.ts +4 -23
- package/dist/links/types.d.ts.map +1 -1
- package/dist/links/wsLink.d.ts +54 -6
- package/dist/links/wsLink.d.ts.map +1 -1
- package/dist/links/wsLink.js +244 -175
- package/dist/links/wsLink.mjs +245 -176
- package/dist/links.d.ts +1 -0
- package/dist/links.d.ts.map +1 -1
- package/dist/unstable-internals.d.ts +1 -0
- package/dist/unstable-internals.d.ts.map +1 -1
- package/package.json +14 -11
- package/src/TRPCClientError.ts +1 -1
- package/src/createTRPCClient.ts +28 -23
- package/src/internals/TRPCUntypedClient.ts +26 -15
- package/src/internals/inputWithTrackedEventId.ts +15 -0
- package/src/internals/signals.ts +54 -0
- package/src/internals/transformer.ts +2 -2
- package/src/internals/types.ts +1 -1
- package/src/links/HTTPBatchLinkOptions.ts +1 -1
- package/src/links/httpBatchLink.ts +3 -3
- package/src/links/httpBatchStreamLink.ts +7 -4
- package/src/links/httpLink.ts +2 -2
- package/src/links/httpSubscriptionLink.ts +172 -115
- package/src/links/internals/httpUtils.ts +1 -41
- package/src/links/internals/subscriptions.ts +26 -0
- package/src/links/internals/urlWithConnectionParams.ts +8 -2
- package/src/links/loggerLink.ts +21 -9
- package/src/links/retryLink.ts +101 -0
- package/src/links/types.ts +8 -46
- package/src/links/wsLink.ts +308 -181
- package/src/links.ts +1 -1
- package/src/unstable-internals.ts +1 -0
- package/dist/links/internals/retryLink.d.ts +0 -9
- package/dist/links/internals/retryLink.d.ts.map +0 -1
- package/dist/links/types.js +0 -7
- package/dist/links/types.mjs +0 -5
- package/src/links/internals/retryLink.ts +0 -53
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var observable = require('@trpc/server/observable');
|
|
4
|
+
var rpc = require('@trpc/server/rpc');
|
|
4
5
|
var unstableCoreDoNotImport = require('@trpc/server/unstable-core-do-not-import');
|
|
6
|
+
var inputWithTrackedEventId = require('../internals/inputWithTrackedEventId.js');
|
|
7
|
+
var signals = require('../internals/signals.js');
|
|
5
8
|
var TRPCClientError = require('../TRPCClientError.js');
|
|
6
9
|
var transformer = require('../internals/transformer.js');
|
|
7
10
|
var httpUtils = require('./internals/httpUtils.js');
|
|
@@ -16,89 +19,142 @@ async function urlWithConnectionParams(opts) {
|
|
|
16
19
|
}
|
|
17
20
|
return url;
|
|
18
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* tRPC error codes that are considered retryable
|
|
24
|
+
* With out of the box SSE, the client will reconnect when these errors are encountered
|
|
25
|
+
*/ const codes5xx = [
|
|
26
|
+
rpc.TRPC_ERROR_CODES_BY_KEY.BAD_GATEWAY,
|
|
27
|
+
rpc.TRPC_ERROR_CODES_BY_KEY.SERVICE_UNAVAILABLE,
|
|
28
|
+
rpc.TRPC_ERROR_CODES_BY_KEY.GATEWAY_TIMEOUT,
|
|
29
|
+
rpc.TRPC_ERROR_CODES_BY_KEY.INTERNAL_SERVER_ERROR
|
|
30
|
+
];
|
|
19
31
|
/**
|
|
20
32
|
* @see https://trpc.io/docs/client/links/httpSubscriptionLink
|
|
21
33
|
*/ function unstable_httpSubscriptionLink(opts) {
|
|
22
34
|
const transformer$1 = transformer.getTransformer(opts.transformer);
|
|
23
35
|
return ()=>{
|
|
24
|
-
return ({ op
|
|
36
|
+
return ({ op })=>{
|
|
25
37
|
return observable.observable((observer)=>{
|
|
26
|
-
const { type
|
|
38
|
+
const { type, path, input } = op;
|
|
27
39
|
/* istanbul ignore if -- @preserve */ if (type !== 'subscription') {
|
|
28
40
|
throw new Error('httpSubscriptionLink only supports subscriptions');
|
|
29
41
|
}
|
|
30
|
-
let
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
result: {
|
|
57
|
-
type: 'started'
|
|
58
|
-
},
|
|
59
|
-
context: {
|
|
60
|
-
eventSource
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
64
|
-
eventSource.removeEventListener('open', onStarted);
|
|
65
|
-
};
|
|
66
|
-
// console.log('starting', new Date());
|
|
67
|
-
eventSource.addEventListener('open', onStarted);
|
|
68
|
-
eventSource.addEventListener('open', ()=>{
|
|
42
|
+
let lastEventId = undefined;
|
|
43
|
+
const ac = new AbortController();
|
|
44
|
+
const signal = signals.raceAbortSignals(op.signal, ac.signal);
|
|
45
|
+
const eventSourceStream = unstableCoreDoNotImport.sseStreamConsumer({
|
|
46
|
+
url: async ()=>httpUtils.getUrl({
|
|
47
|
+
transformer: transformer$1,
|
|
48
|
+
url: await urlWithConnectionParams(opts),
|
|
49
|
+
input: inputWithTrackedEventId.inputWithTrackedEventId(input, lastEventId),
|
|
50
|
+
path,
|
|
51
|
+
type,
|
|
52
|
+
signal: null
|
|
53
|
+
}),
|
|
54
|
+
init: ()=>urlWithConnectionParams$1.resultOf(opts.eventSourceOptions, {
|
|
55
|
+
op
|
|
56
|
+
}),
|
|
57
|
+
signal,
|
|
58
|
+
deserialize: transformer$1.output.deserialize,
|
|
59
|
+
EventSource: opts.EventSource ?? globalThis.EventSource
|
|
60
|
+
});
|
|
61
|
+
const connectionState = observable.behaviorSubject({
|
|
62
|
+
type: 'state',
|
|
63
|
+
state: 'connecting',
|
|
64
|
+
error: null
|
|
65
|
+
});
|
|
66
|
+
const connectionSub = connectionState.subscribe({
|
|
67
|
+
next (state) {
|
|
69
68
|
observer.next({
|
|
70
|
-
result:
|
|
71
|
-
type: 'state',
|
|
72
|
-
state: 'pending'
|
|
73
|
-
}
|
|
69
|
+
result: state
|
|
74
70
|
});
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
unstableCoreDoNotImport.run(async ()=>{
|
|
74
|
+
for await (const chunk of eventSourceStream){
|
|
75
|
+
switch(chunk.type){
|
|
76
|
+
case 'ping':
|
|
77
|
+
break;
|
|
78
|
+
case 'data':
|
|
79
|
+
const chunkData = chunk.data;
|
|
80
|
+
let result;
|
|
81
|
+
if (chunkData.id) {
|
|
82
|
+
// if the `tracked()`-helper is used, we always have an `id` field
|
|
83
|
+
lastEventId = chunkData.id;
|
|
84
|
+
result = {
|
|
85
|
+
id: chunkData.id,
|
|
86
|
+
data: chunkData
|
|
87
|
+
};
|
|
88
|
+
} else {
|
|
89
|
+
result = {
|
|
90
|
+
data: chunkData.data
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
observer.next({
|
|
94
|
+
result,
|
|
95
|
+
context: {
|
|
96
|
+
eventSource: chunk.eventSource
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
break;
|
|
100
|
+
case 'connected':
|
|
101
|
+
{
|
|
102
|
+
observer.next({
|
|
103
|
+
result: {
|
|
104
|
+
type: 'started'
|
|
105
|
+
},
|
|
106
|
+
context: {
|
|
107
|
+
eventSource: chunk.eventSource
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
connectionState.next({
|
|
111
|
+
type: 'state',
|
|
112
|
+
state: 'pending',
|
|
113
|
+
error: null
|
|
114
|
+
});
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case 'serialized-error':
|
|
118
|
+
{
|
|
119
|
+
const error = TRPCClientError.TRPCClientError.from({
|
|
120
|
+
error: chunk.error
|
|
121
|
+
});
|
|
122
|
+
if (codes5xx.includes(chunk.error.code)) {
|
|
123
|
+
//
|
|
124
|
+
connectionState.next({
|
|
125
|
+
type: 'state',
|
|
126
|
+
state: 'connecting',
|
|
127
|
+
error
|
|
128
|
+
});
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
//
|
|
132
|
+
// non-retryable error, cancel the subscription
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
case 'connecting':
|
|
136
|
+
{
|
|
137
|
+
const lastState = connectionState.get();
|
|
138
|
+
const error = chunk.event && TRPCClientError.TRPCClientError.from(chunk.event);
|
|
139
|
+
if (!error && lastState.state === 'connecting') {
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
connectionState.next({
|
|
143
|
+
type: 'state',
|
|
144
|
+
state: 'connecting',
|
|
145
|
+
error
|
|
146
|
+
});
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
case 'timeout':
|
|
150
|
+
{
|
|
151
|
+
connectionState.next({
|
|
152
|
+
type: 'state',
|
|
153
|
+
state: 'connecting',
|
|
154
|
+
error: new TRPCClientError.TRPCClientError(`Timeout of ${chunk.ms}ms reached while waiting for a response`)
|
|
155
|
+
});
|
|
156
|
+
}
|
|
80
157
|
}
|
|
81
|
-
const error = globalThis.ErrorEvent && event instanceof ErrorEvent ? TRPCClientError.TRPCClientError.from(event.error) : TRPCClientError.TRPCClientError.from(new Error(`Unknown EventSource error`));
|
|
82
|
-
observer.next({
|
|
83
|
-
result: {
|
|
84
|
-
type: 'state',
|
|
85
|
-
state: 'connecting',
|
|
86
|
-
data: error
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
const iterable = unstableCoreDoNotImport.sseStreamConsumer({
|
|
91
|
-
from: eventSource,
|
|
92
|
-
deserialize: transformer$1.output.deserialize
|
|
93
|
-
});
|
|
94
|
-
for await (const chunk of iterable){
|
|
95
|
-
// if the `sse({})`-helper is used, we always have an `id` field
|
|
96
|
-
const data = 'id' in chunk ? chunk : chunk.data;
|
|
97
|
-
observer.next({
|
|
98
|
-
result: {
|
|
99
|
-
data
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
158
|
}
|
|
103
159
|
observer.next({
|
|
104
160
|
result: {
|
|
@@ -106,33 +162,13 @@ async function urlWithConnectionParams(opts) {
|
|
|
106
162
|
}
|
|
107
163
|
});
|
|
108
164
|
observer.complete();
|
|
109
|
-
observer.next({
|
|
110
|
-
result: {
|
|
111
|
-
type: 'state',
|
|
112
|
-
state: 'idle'
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
165
|
}).catch((error)=>{
|
|
116
|
-
|
|
117
|
-
observer.next({
|
|
118
|
-
result: {
|
|
119
|
-
type: 'state',
|
|
120
|
-
state: 'error',
|
|
121
|
-
data: TRPCClientError.TRPCClientError.from(trpcError)
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
observer.error(trpcError);
|
|
166
|
+
observer.error(TRPCClientError.TRPCClientError.from(error));
|
|
125
167
|
});
|
|
126
168
|
return ()=>{
|
|
127
169
|
observer.complete();
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
type: 'state',
|
|
131
|
-
state: 'idle'
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
eventSource?.close();
|
|
135
|
-
unsubscribed = true;
|
|
170
|
+
ac.abort();
|
|
171
|
+
connectionSub.unsubscribe();
|
|
136
172
|
};
|
|
137
173
|
});
|
|
138
174
|
};
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { observable } from '@trpc/server/observable';
|
|
2
|
-
import {
|
|
1
|
+
import { observable, behaviorSubject } from '@trpc/server/observable';
|
|
2
|
+
import { TRPC_ERROR_CODES_BY_KEY } from '@trpc/server/rpc';
|
|
3
|
+
import { sseStreamConsumer, run } from '@trpc/server/unstable-core-do-not-import';
|
|
4
|
+
import { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId.mjs';
|
|
5
|
+
import { raceAbortSignals } from '../internals/signals.mjs';
|
|
3
6
|
import { TRPCClientError } from '../TRPCClientError.mjs';
|
|
4
7
|
import { getTransformer } from '../internals/transformer.mjs';
|
|
5
8
|
import { getUrl } from './internals/httpUtils.mjs';
|
|
@@ -14,89 +17,142 @@ async function urlWithConnectionParams(opts) {
|
|
|
14
17
|
}
|
|
15
18
|
return url;
|
|
16
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* tRPC error codes that are considered retryable
|
|
22
|
+
* With out of the box SSE, the client will reconnect when these errors are encountered
|
|
23
|
+
*/ const codes5xx = [
|
|
24
|
+
TRPC_ERROR_CODES_BY_KEY.BAD_GATEWAY,
|
|
25
|
+
TRPC_ERROR_CODES_BY_KEY.SERVICE_UNAVAILABLE,
|
|
26
|
+
TRPC_ERROR_CODES_BY_KEY.GATEWAY_TIMEOUT,
|
|
27
|
+
TRPC_ERROR_CODES_BY_KEY.INTERNAL_SERVER_ERROR
|
|
28
|
+
];
|
|
17
29
|
/**
|
|
18
30
|
* @see https://trpc.io/docs/client/links/httpSubscriptionLink
|
|
19
31
|
*/ function unstable_httpSubscriptionLink(opts) {
|
|
20
32
|
const transformer = getTransformer(opts.transformer);
|
|
21
33
|
return ()=>{
|
|
22
|
-
return ({ op
|
|
34
|
+
return ({ op })=>{
|
|
23
35
|
return observable((observer)=>{
|
|
24
|
-
const { type
|
|
36
|
+
const { type, path, input } = op;
|
|
25
37
|
/* istanbul ignore if -- @preserve */ if (type !== 'subscription') {
|
|
26
38
|
throw new Error('httpSubscriptionLink only supports subscriptions');
|
|
27
39
|
}
|
|
28
|
-
let
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
result: {
|
|
55
|
-
type: 'started'
|
|
56
|
-
},
|
|
57
|
-
context: {
|
|
58
|
-
eventSource
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
62
|
-
eventSource.removeEventListener('open', onStarted);
|
|
63
|
-
};
|
|
64
|
-
// console.log('starting', new Date());
|
|
65
|
-
eventSource.addEventListener('open', onStarted);
|
|
66
|
-
eventSource.addEventListener('open', ()=>{
|
|
40
|
+
let lastEventId = undefined;
|
|
41
|
+
const ac = new AbortController();
|
|
42
|
+
const signal = raceAbortSignals(op.signal, ac.signal);
|
|
43
|
+
const eventSourceStream = sseStreamConsumer({
|
|
44
|
+
url: async ()=>getUrl({
|
|
45
|
+
transformer,
|
|
46
|
+
url: await urlWithConnectionParams(opts),
|
|
47
|
+
input: inputWithTrackedEventId(input, lastEventId),
|
|
48
|
+
path,
|
|
49
|
+
type,
|
|
50
|
+
signal: null
|
|
51
|
+
}),
|
|
52
|
+
init: ()=>resultOf(opts.eventSourceOptions, {
|
|
53
|
+
op
|
|
54
|
+
}),
|
|
55
|
+
signal,
|
|
56
|
+
deserialize: transformer.output.deserialize,
|
|
57
|
+
EventSource: opts.EventSource ?? globalThis.EventSource
|
|
58
|
+
});
|
|
59
|
+
const connectionState = behaviorSubject({
|
|
60
|
+
type: 'state',
|
|
61
|
+
state: 'connecting',
|
|
62
|
+
error: null
|
|
63
|
+
});
|
|
64
|
+
const connectionSub = connectionState.subscribe({
|
|
65
|
+
next (state) {
|
|
67
66
|
observer.next({
|
|
68
|
-
result:
|
|
69
|
-
type: 'state',
|
|
70
|
-
state: 'pending'
|
|
71
|
-
}
|
|
67
|
+
result: state
|
|
72
68
|
});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
run(async ()=>{
|
|
72
|
+
for await (const chunk of eventSourceStream){
|
|
73
|
+
switch(chunk.type){
|
|
74
|
+
case 'ping':
|
|
75
|
+
break;
|
|
76
|
+
case 'data':
|
|
77
|
+
const chunkData = chunk.data;
|
|
78
|
+
let result;
|
|
79
|
+
if (chunkData.id) {
|
|
80
|
+
// if the `tracked()`-helper is used, we always have an `id` field
|
|
81
|
+
lastEventId = chunkData.id;
|
|
82
|
+
result = {
|
|
83
|
+
id: chunkData.id,
|
|
84
|
+
data: chunkData
|
|
85
|
+
};
|
|
86
|
+
} else {
|
|
87
|
+
result = {
|
|
88
|
+
data: chunkData.data
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
observer.next({
|
|
92
|
+
result,
|
|
93
|
+
context: {
|
|
94
|
+
eventSource: chunk.eventSource
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
break;
|
|
98
|
+
case 'connected':
|
|
99
|
+
{
|
|
100
|
+
observer.next({
|
|
101
|
+
result: {
|
|
102
|
+
type: 'started'
|
|
103
|
+
},
|
|
104
|
+
context: {
|
|
105
|
+
eventSource: chunk.eventSource
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
connectionState.next({
|
|
109
|
+
type: 'state',
|
|
110
|
+
state: 'pending',
|
|
111
|
+
error: null
|
|
112
|
+
});
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
case 'serialized-error':
|
|
116
|
+
{
|
|
117
|
+
const error = TRPCClientError.from({
|
|
118
|
+
error: chunk.error
|
|
119
|
+
});
|
|
120
|
+
if (codes5xx.includes(chunk.error.code)) {
|
|
121
|
+
//
|
|
122
|
+
connectionState.next({
|
|
123
|
+
type: 'state',
|
|
124
|
+
state: 'connecting',
|
|
125
|
+
error
|
|
126
|
+
});
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
//
|
|
130
|
+
// non-retryable error, cancel the subscription
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
case 'connecting':
|
|
134
|
+
{
|
|
135
|
+
const lastState = connectionState.get();
|
|
136
|
+
const error = chunk.event && TRPCClientError.from(chunk.event);
|
|
137
|
+
if (!error && lastState.state === 'connecting') {
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
connectionState.next({
|
|
141
|
+
type: 'state',
|
|
142
|
+
state: 'connecting',
|
|
143
|
+
error
|
|
144
|
+
});
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
case 'timeout':
|
|
148
|
+
{
|
|
149
|
+
connectionState.next({
|
|
150
|
+
type: 'state',
|
|
151
|
+
state: 'connecting',
|
|
152
|
+
error: new TRPCClientError(`Timeout of ${chunk.ms}ms reached while waiting for a response`)
|
|
153
|
+
});
|
|
154
|
+
}
|
|
78
155
|
}
|
|
79
|
-
const error = globalThis.ErrorEvent && event instanceof ErrorEvent ? TRPCClientError.from(event.error) : TRPCClientError.from(new Error(`Unknown EventSource error`));
|
|
80
|
-
observer.next({
|
|
81
|
-
result: {
|
|
82
|
-
type: 'state',
|
|
83
|
-
state: 'connecting',
|
|
84
|
-
data: error
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
const iterable = sseStreamConsumer({
|
|
89
|
-
from: eventSource,
|
|
90
|
-
deserialize: transformer.output.deserialize
|
|
91
|
-
});
|
|
92
|
-
for await (const chunk of iterable){
|
|
93
|
-
// if the `sse({})`-helper is used, we always have an `id` field
|
|
94
|
-
const data = 'id' in chunk ? chunk : chunk.data;
|
|
95
|
-
observer.next({
|
|
96
|
-
result: {
|
|
97
|
-
data
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
156
|
}
|
|
101
157
|
observer.next({
|
|
102
158
|
result: {
|
|
@@ -104,33 +160,13 @@ async function urlWithConnectionParams(opts) {
|
|
|
104
160
|
}
|
|
105
161
|
});
|
|
106
162
|
observer.complete();
|
|
107
|
-
observer.next({
|
|
108
|
-
result: {
|
|
109
|
-
type: 'state',
|
|
110
|
-
state: 'idle'
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
163
|
}).catch((error)=>{
|
|
114
|
-
|
|
115
|
-
observer.next({
|
|
116
|
-
result: {
|
|
117
|
-
type: 'state',
|
|
118
|
-
state: 'error',
|
|
119
|
-
data: TRPCClientError.from(trpcError)
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
observer.error(trpcError);
|
|
164
|
+
observer.error(TRPCClientError.from(error));
|
|
123
165
|
});
|
|
124
166
|
return ()=>{
|
|
125
167
|
observer.complete();
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
type: 'state',
|
|
129
|
-
state: 'idle'
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
eventSource?.close();
|
|
133
|
-
unsubscribed = true;
|
|
168
|
+
ac.abort();
|
|
169
|
+
connectionSub.unsubscribe();
|
|
134
170
|
};
|
|
135
171
|
});
|
|
136
172
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare function isOctetType(input: unknown): input is Uint8Array | Blob;
|
|
1
|
+
export declare function isOctetType(input: unknown): input is Uint8Array<ArrayBufferLike> | Blob;
|
|
2
2
|
export declare function isFormData(input: unknown): input is FormData;
|
|
3
|
-
export declare function isNonJsonSerializable(input: unknown): input is
|
|
3
|
+
export declare function isNonJsonSerializable(input: unknown): input is FormData | Uint8Array<ArrayBufferLike> | Blob;
|
|
4
4
|
//# sourceMappingURL=contentTypes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentTypes.d.ts","sourceRoot":"","sources":["../../../src/links/internals/contentTypes.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO
|
|
1
|
+
{"version":3,"file":"contentTypes.d.ts","sourceRoot":"","sources":["../../../src/links/internals/contentTypes.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,+CAMzC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,qBAExC;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,0DAEnD"}
|
|
@@ -14,7 +14,7 @@ export type HTTPLinkBaseOptions<TRoot extends Pick<AnyClientTypes, 'transformer'
|
|
|
14
14
|
/**
|
|
15
15
|
* Send all requests `as POST`s requests regardless of the procedure type
|
|
16
16
|
* The HTTP handler must separately allow overriding the method. See:
|
|
17
|
-
* @
|
|
17
|
+
* @see https://trpc.io/docs/rpc
|
|
18
18
|
*/
|
|
19
19
|
methodOverride?: 'POST';
|
|
20
20
|
} & TransformerOptions<TRoot>;
|
|
@@ -64,12 +64,5 @@ export type HTTPRequestOptions = ContentOptions & HTTPBaseRequestOptions & {
|
|
|
64
64
|
};
|
|
65
65
|
export declare function fetchHTTPResponse(opts: HTTPRequestOptions): Promise<ResponseEsque>;
|
|
66
66
|
export declare function httpRequest(opts: HTTPRequestOptions): Promise<HTTPResult>;
|
|
67
|
-
/**
|
|
68
|
-
* Merges multiple abort signals into a single one
|
|
69
|
-
* - When all signals have been aborted, the merged signal will be aborted
|
|
70
|
-
*/
|
|
71
|
-
export declare function mergeAbortSignals(opts: {
|
|
72
|
-
signal: Maybe<AbortSignal>;
|
|
73
|
-
}[]): AbortController;
|
|
74
67
|
export {};
|
|
75
68
|
//# sourceMappingURL=httpUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpUtils.d.ts","sourceRoot":"","sources":["../../../src/links/internals/httpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,YAAY,EACb,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAC7B,KAAK,SAAS,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,IAC/C;IACF,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAE9B,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,uBAAuB,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,mBAAmB,CAAC,cAAc,CAAC,GACxC,uBAAuB,CAOzB;AAkBD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE;QACJ,QAAQ,EAAE,aAAa,CAAC;QACxB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAED,KAAK,eAAe,GAAG;IACrB,WAAW,EAAE,uBAAuB,CAAC;CACtC,GAAG,CAAC;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAAC;AAEjD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,eAAe,OAM7C;AAED,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAClD,uBAAuB,GAAG;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;CAC5B,CAAC;AAEJ,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,sBAAsB,KAAK,MAAM,CAAC;AACvD,KAAK,OAAO,GAAG,CAAC,IAAI,EAAE,sBAAsB,KAAK,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG;IAC3B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,MAuBpB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,OAMrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,CACtB,IAAI,EAAE,sBAAsB,GAAG;IAC7B,OAAO,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACnD,KACE,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,eAAO,MAAM,iBAAiB,EAAE,SAO/B,CAAC;AAcF,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAC7C,sBAAsB,GAAG;IACvB,OAAO,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACnD,CAAC;AAuBJ,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,0BA6B/D;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,UAAU,CAAC,CAcrB
|
|
1
|
+
{"version":3,"file":"httpUtils.d.ts","sourceRoot":"","sources":["../../../src/links/internals/httpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,YAAY,EACb,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAC7B,KAAK,SAAS,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,IAC/C;IACF,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAE9B,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,uBAAuB,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,mBAAmB,CAAC,cAAc,CAAC,GACxC,uBAAuB,CAOzB;AAkBD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE;QACJ,QAAQ,EAAE,aAAa,CAAC;QACxB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAED,KAAK,eAAe,GAAG;IACrB,WAAW,EAAE,uBAAuB,CAAC;CACtC,GAAG,CAAC;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAAC;AAEjD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,eAAe,OAM7C;AAED,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAClD,uBAAuB,GAAG;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;CAC5B,CAAC;AAEJ,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,sBAAsB,KAAK,MAAM,CAAC;AACvD,KAAK,OAAO,GAAG,CAAC,IAAI,EAAE,sBAAsB,KAAK,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG;IAC3B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,MAuBpB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,OAMrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,CACtB,IAAI,EAAE,sBAAsB,GAAG;IAC7B,OAAO,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACnD,KACE,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,eAAO,MAAM,iBAAiB,EAAE,SAO/B,CAAC;AAcF,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAC7C,sBAAsB,GAAG;IACvB,OAAO,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACnD,CAAC;AAuBJ,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,0BA6B/D;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,UAAU,CAAC,CAcrB"}
|
|
@@ -96,7 +96,7 @@ async function fetchHTTPResponse(opts) {
|
|
|
96
96
|
throwIfAborted(opts.signal);
|
|
97
97
|
const url = opts.getUrl(opts);
|
|
98
98
|
const body = opts.getBody(opts);
|
|
99
|
-
const { type
|
|
99
|
+
const { type } = opts;
|
|
100
100
|
const resolvedHeaders = await (async ()=>{
|
|
101
101
|
const heads = await opts.headers();
|
|
102
102
|
if (Symbol.iterator in heads) {
|
|
@@ -131,34 +131,6 @@ async function httpRequest(opts) {
|
|
|
131
131
|
meta
|
|
132
132
|
};
|
|
133
133
|
}
|
|
134
|
-
/**
|
|
135
|
-
* Merges multiple abort signals into a single one
|
|
136
|
-
* - When all signals have been aborted, the merged signal will be aborted
|
|
137
|
-
*/ function mergeAbortSignals(opts) {
|
|
138
|
-
const ac = new AbortController();
|
|
139
|
-
if (opts.some((o)=>!o.signal)) {
|
|
140
|
-
return ac;
|
|
141
|
-
}
|
|
142
|
-
const count = opts.length;
|
|
143
|
-
let abortedCount = 0;
|
|
144
|
-
const onAbort = ()=>{
|
|
145
|
-
if (++abortedCount === count) {
|
|
146
|
-
ac.abort();
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
for (const o of opts){
|
|
150
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
151
|
-
const signal = o.signal;
|
|
152
|
-
if (signal.aborted) {
|
|
153
|
-
onAbort();
|
|
154
|
-
} else {
|
|
155
|
-
signal.addEventListener('abort', onAbort, {
|
|
156
|
-
once: true
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return ac;
|
|
161
|
-
}
|
|
162
134
|
|
|
163
135
|
exports.fetchHTTPResponse = fetchHTTPResponse;
|
|
164
136
|
exports.getBody = getBody;
|
|
@@ -166,5 +138,4 @@ exports.getInput = getInput;
|
|
|
166
138
|
exports.getUrl = getUrl;
|
|
167
139
|
exports.httpRequest = httpRequest;
|
|
168
140
|
exports.jsonHttpRequester = jsonHttpRequester;
|
|
169
|
-
exports.mergeAbortSignals = mergeAbortSignals;
|
|
170
141
|
exports.resolveHTTPLinkOptions = resolveHTTPLinkOptions;
|