@replit/river 0.200.0-rc.9 → 0.200.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/README.md +8 -8
- package/dist/{chunk-42Z2FQIU.js → chunk-6BH2CXVE.js} +21 -13
- package/dist/chunk-6BH2CXVE.js.map +1 -0
- package/dist/{chunk-4HT6P2ZG.js → chunk-A4JKES5A.js} +22 -30
- package/dist/chunk-A4JKES5A.js.map +1 -0
- package/dist/{chunk-4PVU7J25.js → chunk-AJGIY2UB.js} +1 -1
- package/dist/chunk-AJGIY2UB.js.map +1 -0
- package/dist/{chunk-EETL2L77.js → chunk-GJUUVID2.js} +14 -32
- package/dist/chunk-GJUUVID2.js.map +1 -0
- package/dist/{chunk-GR3AQKHL.js → chunk-HRKM7BIE.js} +14 -4
- package/dist/chunk-HRKM7BIE.js.map +1 -0
- package/dist/{chunk-ZXZE253M.js → chunk-PJB2Y2AV.js} +24 -37
- package/dist/chunk-PJB2Y2AV.js.map +1 -0
- package/dist/{chunk-I75XYO5W.js → chunk-QIDEN5PP.js} +82 -20
- package/dist/chunk-QIDEN5PP.js.map +1 -0
- package/dist/{chunk-VXYHC666.js → chunk-YTMS7OP6.js} +1 -1
- package/dist/chunk-YTMS7OP6.js.map +1 -0
- package/dist/chunk-Z4PX66JO.js +307 -0
- package/dist/chunk-Z4PX66JO.js.map +1 -0
- package/dist/{client-22a47343.d.ts → client-9292552a.d.ts} +3 -4
- package/dist/codec/index.cjs.map +1 -1
- package/dist/codec/index.js +1 -1
- package/dist/connection-94dea547.d.ts +32 -0
- package/dist/{context-b4aff18f.d.ts → context-69f37ac1.d.ts} +48 -43
- package/dist/logging/index.cjs.map +1 -1
- package/dist/logging/index.d.cts +1 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.js +1 -1
- package/dist/{message-7d135e38.d.ts → message-57bb8187.d.ts} +5 -3
- package/dist/router/index.cjs +649 -709
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +22 -12
- package/dist/router/index.d.ts +22 -12
- package/dist/router/index.js +502 -404
- package/dist/router/index.js.map +1 -1
- package/dist/{server-dd6a9853.d.ts → server-8fdd7fb2.d.ts} +5 -5
- package/dist/{services-1b5ac5bc.d.ts → services-259f39a3.d.ts} +191 -194
- package/dist/transport/impls/ws/client.cjs +129 -62
- package/dist/transport/impls/ws/client.cjs.map +1 -1
- package/dist/transport/impls/ws/client.d.cts +4 -4
- package/dist/transport/impls/ws/client.d.ts +4 -4
- package/dist/transport/impls/ws/client.js +7 -7
- package/dist/transport/impls/ws/client.js.map +1 -1
- package/dist/transport/impls/ws/server.cjs +146 -70
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +6 -5
- package/dist/transport/impls/ws/server.d.ts +6 -5
- package/dist/transport/impls/ws/server.js +21 -9
- package/dist/transport/impls/ws/server.js.map +1 -1
- package/dist/transport/index.cjs +138 -92
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +4 -4
- package/dist/transport/index.d.ts +4 -4
- package/dist/transport/index.js +7 -7
- package/dist/util/testHelpers.cjs +265 -327
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +36 -31
- package/dist/util/testHelpers.d.ts +36 -31
- package/dist/util/testHelpers.js +82 -52
- package/dist/util/testHelpers.js.map +1 -1
- package/package.json +4 -3
- package/dist/chunk-42Z2FQIU.js.map +0 -1
- package/dist/chunk-4HT6P2ZG.js.map +0 -1
- package/dist/chunk-4PVU7J25.js.map +0 -1
- package/dist/chunk-EETL2L77.js.map +0 -1
- package/dist/chunk-GR3AQKHL.js.map +0 -1
- package/dist/chunk-I75XYO5W.js.map +0 -1
- package/dist/chunk-MQ6ANR3H.js +0 -451
- package/dist/chunk-MQ6ANR3H.js.map +0 -1
- package/dist/chunk-VXYHC666.js.map +0 -1
- package/dist/chunk-ZXZE253M.js.map +0 -1
- package/dist/connection-260e45a8.d.ts +0 -11
package/dist/chunk-MQ6ANR3H.js
DELETED
|
@@ -1,451 +0,0 @@
|
|
|
1
|
-
// router/procedures.ts
|
|
2
|
-
import { Type } from "@sinclair/typebox";
|
|
3
|
-
var INTERNAL_RIVER_ERROR_CODE = "INTERNAL_RIVER_ERROR";
|
|
4
|
-
var UNCAUGHT_ERROR_CODE = "UNCAUGHT_ERROR";
|
|
5
|
-
var UNEXPECTED_DISCONNECT_CODE = "UNEXPECTED_DISCONNECT";
|
|
6
|
-
var INVALID_REQUEST_CODE = "INVALID_REQUEST";
|
|
7
|
-
var ABORT_CODE = "ABORT";
|
|
8
|
-
var ResponseReaderErrorSchema = Type.Object({
|
|
9
|
-
code: Type.Union([
|
|
10
|
-
Type.Literal(INTERNAL_RIVER_ERROR_CODE),
|
|
11
|
-
Type.Literal(UNCAUGHT_ERROR_CODE),
|
|
12
|
-
Type.Literal(UNEXPECTED_DISCONNECT_CODE),
|
|
13
|
-
Type.Literal(INVALID_REQUEST_CODE),
|
|
14
|
-
Type.Literal(ABORT_CODE)
|
|
15
|
-
]),
|
|
16
|
-
message: Type.String()
|
|
17
|
-
});
|
|
18
|
-
var RequestReaderErrorSchema = Type.Object({
|
|
19
|
-
code: Type.Union([
|
|
20
|
-
Type.Literal(UNCAUGHT_ERROR_CODE),
|
|
21
|
-
Type.Literal(UNEXPECTED_DISCONNECT_CODE),
|
|
22
|
-
Type.Literal(INVALID_REQUEST_CODE),
|
|
23
|
-
Type.Literal(ABORT_CODE)
|
|
24
|
-
]),
|
|
25
|
-
message: Type.String()
|
|
26
|
-
});
|
|
27
|
-
function rpc({
|
|
28
|
-
requestInit,
|
|
29
|
-
responseData,
|
|
30
|
-
responseError = Type.Never(),
|
|
31
|
-
description,
|
|
32
|
-
handler
|
|
33
|
-
}) {
|
|
34
|
-
return {
|
|
35
|
-
...description ? { description } : {},
|
|
36
|
-
type: "rpc",
|
|
37
|
-
requestInit,
|
|
38
|
-
responseData,
|
|
39
|
-
responseError,
|
|
40
|
-
handler
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
function upload({
|
|
44
|
-
requestInit,
|
|
45
|
-
requestData,
|
|
46
|
-
responseData,
|
|
47
|
-
responseError = Type.Never(),
|
|
48
|
-
description,
|
|
49
|
-
handler
|
|
50
|
-
}) {
|
|
51
|
-
return {
|
|
52
|
-
type: "upload",
|
|
53
|
-
...description ? { description } : {},
|
|
54
|
-
requestInit,
|
|
55
|
-
requestData,
|
|
56
|
-
responseData,
|
|
57
|
-
responseError,
|
|
58
|
-
handler
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
function subscription({
|
|
62
|
-
requestInit,
|
|
63
|
-
responseData,
|
|
64
|
-
responseError = Type.Never(),
|
|
65
|
-
description,
|
|
66
|
-
handler
|
|
67
|
-
}) {
|
|
68
|
-
return {
|
|
69
|
-
type: "subscription",
|
|
70
|
-
...description ? { description } : {},
|
|
71
|
-
requestInit,
|
|
72
|
-
responseData,
|
|
73
|
-
responseError,
|
|
74
|
-
handler
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
function stream({
|
|
78
|
-
requestInit,
|
|
79
|
-
requestData,
|
|
80
|
-
responseData,
|
|
81
|
-
responseError = Type.Never(),
|
|
82
|
-
description,
|
|
83
|
-
handler
|
|
84
|
-
}) {
|
|
85
|
-
return {
|
|
86
|
-
type: "stream",
|
|
87
|
-
...description ? { description } : {},
|
|
88
|
-
requestInit,
|
|
89
|
-
requestData,
|
|
90
|
-
responseData,
|
|
91
|
-
responseError,
|
|
92
|
-
handler
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
var Procedure = {
|
|
96
|
-
rpc,
|
|
97
|
-
upload,
|
|
98
|
-
subscription,
|
|
99
|
-
stream
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
// router/result.ts
|
|
103
|
-
import {
|
|
104
|
-
Type as Type2
|
|
105
|
-
} from "@sinclair/typebox";
|
|
106
|
-
var ErrResultSchema = (t) => Type2.Object({
|
|
107
|
-
ok: Type2.Literal(false),
|
|
108
|
-
payload: t
|
|
109
|
-
});
|
|
110
|
-
var AnyResultSchema = Type2.Union([
|
|
111
|
-
Type2.Object({
|
|
112
|
-
ok: Type2.Literal(false),
|
|
113
|
-
payload: Type2.Object({
|
|
114
|
-
code: Type2.String(),
|
|
115
|
-
message: Type2.String(),
|
|
116
|
-
extras: Type2.Optional(Type2.Unknown())
|
|
117
|
-
})
|
|
118
|
-
}),
|
|
119
|
-
Type2.Object({
|
|
120
|
-
ok: Type2.Literal(true),
|
|
121
|
-
payload: Type2.Unknown()
|
|
122
|
-
})
|
|
123
|
-
]);
|
|
124
|
-
function Ok(payload) {
|
|
125
|
-
return {
|
|
126
|
-
ok: true,
|
|
127
|
-
payload
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
function Err(error) {
|
|
131
|
-
return {
|
|
132
|
-
ok: false,
|
|
133
|
-
payload: error
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// router/streams.ts
|
|
138
|
-
var StreamDrainedError = {
|
|
139
|
-
code: "STREAM_DRAINED",
|
|
140
|
-
message: "Stream was drained"
|
|
141
|
-
};
|
|
142
|
-
var ReadStreamImpl = class {
|
|
143
|
-
/**
|
|
144
|
-
* Whether the stream is closed.
|
|
145
|
-
*/
|
|
146
|
-
closed = false;
|
|
147
|
-
/**
|
|
148
|
-
* A list of listeners that will be called when the stream is closed.
|
|
149
|
-
*/
|
|
150
|
-
onCloseListeners;
|
|
151
|
-
/**
|
|
152
|
-
* Whether the user has requested to close the stream.
|
|
153
|
-
*/
|
|
154
|
-
closeRequested = false;
|
|
155
|
-
/**
|
|
156
|
-
* Used to signal to the outside world that the user has requested to close the stream.
|
|
157
|
-
*/
|
|
158
|
-
closeRequestCallback;
|
|
159
|
-
/**
|
|
160
|
-
* Whether the stream is locked.
|
|
161
|
-
*/
|
|
162
|
-
locked = false;
|
|
163
|
-
/**
|
|
164
|
-
* Whether drain was called.
|
|
165
|
-
*/
|
|
166
|
-
drained = false;
|
|
167
|
-
/**
|
|
168
|
-
* This flag allows us to avoid cases where drain was called,
|
|
169
|
-
* but the stream is fully consumed and closed. We don't need
|
|
170
|
-
* to signal that drain was called.
|
|
171
|
-
*/
|
|
172
|
-
didDrainDisposeValues = false;
|
|
173
|
-
/**
|
|
174
|
-
* A list of values that have been pushed to the stream but not yet emitted to the user.
|
|
175
|
-
*/
|
|
176
|
-
queue = [];
|
|
177
|
-
/**
|
|
178
|
-
* Used by methods in the class to signal to the iterator that it
|
|
179
|
-
* should check for the next value.
|
|
180
|
-
*/
|
|
181
|
-
nextPromise = null;
|
|
182
|
-
/**
|
|
183
|
-
* Resolves nextPromise
|
|
184
|
-
*/
|
|
185
|
-
resolveNextPromise = null;
|
|
186
|
-
constructor(closeRequestCallback) {
|
|
187
|
-
this.closeRequestCallback = closeRequestCallback;
|
|
188
|
-
this.onCloseListeners = /* @__PURE__ */ new Set();
|
|
189
|
-
}
|
|
190
|
-
[Symbol.asyncIterator]() {
|
|
191
|
-
if (this.isLocked()) {
|
|
192
|
-
throw new TypeError("ReadStream is already locked");
|
|
193
|
-
}
|
|
194
|
-
let didSignalDrain = false;
|
|
195
|
-
this.locked = true;
|
|
196
|
-
return {
|
|
197
|
-
next: async () => {
|
|
198
|
-
if (this.drained && didSignalDrain) {
|
|
199
|
-
return {
|
|
200
|
-
done: true,
|
|
201
|
-
value: void 0
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
while (this.queue.length === 0) {
|
|
205
|
-
if (this.isClosed() && !this.didDrainDisposeValues) {
|
|
206
|
-
return {
|
|
207
|
-
done: true,
|
|
208
|
-
value: void 0
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
if (this.drained) {
|
|
212
|
-
didSignalDrain = true;
|
|
213
|
-
return {
|
|
214
|
-
done: false,
|
|
215
|
-
value: Err(StreamDrainedError)
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
if (!this.nextPromise) {
|
|
219
|
-
this.nextPromise = new Promise((resolve) => {
|
|
220
|
-
this.resolveNextPromise = resolve;
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
await this.nextPromise;
|
|
224
|
-
this.nextPromise = null;
|
|
225
|
-
this.resolveNextPromise = null;
|
|
226
|
-
}
|
|
227
|
-
const value = this.queue.shift();
|
|
228
|
-
return { done: false, value };
|
|
229
|
-
},
|
|
230
|
-
return: () => {
|
|
231
|
-
this.drain();
|
|
232
|
-
return { done: true, value: void 0 };
|
|
233
|
-
}
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
unwrappedIter() {
|
|
237
|
-
const iterator = this[Symbol.asyncIterator]();
|
|
238
|
-
let unwrappedLock = false;
|
|
239
|
-
return {
|
|
240
|
-
[Symbol.asyncIterator]() {
|
|
241
|
-
if (unwrappedLock) {
|
|
242
|
-
throw new TypeError("ReadStream is already locked");
|
|
243
|
-
}
|
|
244
|
-
unwrappedLock = true;
|
|
245
|
-
return {
|
|
246
|
-
next: async () => {
|
|
247
|
-
const next = await iterator.next();
|
|
248
|
-
if (next.done) {
|
|
249
|
-
return next;
|
|
250
|
-
}
|
|
251
|
-
if (next.value.ok) {
|
|
252
|
-
return { done: false, value: next.value.payload };
|
|
253
|
-
}
|
|
254
|
-
iterator.return();
|
|
255
|
-
throw new Error(
|
|
256
|
-
`Got err result in unwrappedIter: ${next.value.payload.code} - ${next.value.payload.message}`
|
|
257
|
-
);
|
|
258
|
-
},
|
|
259
|
-
return: () => iterator.return()
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
async asArray() {
|
|
265
|
-
const array = [];
|
|
266
|
-
for await (const value of this) {
|
|
267
|
-
array.push(value);
|
|
268
|
-
}
|
|
269
|
-
return array;
|
|
270
|
-
}
|
|
271
|
-
drain() {
|
|
272
|
-
if (this.drained) {
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
this.locked = true;
|
|
276
|
-
this.drained = true;
|
|
277
|
-
this.didDrainDisposeValues = this.queue.length > 0;
|
|
278
|
-
this.queue.length = 0;
|
|
279
|
-
this.resolveNextPromise?.();
|
|
280
|
-
}
|
|
281
|
-
isClosed() {
|
|
282
|
-
return this.closed;
|
|
283
|
-
}
|
|
284
|
-
isLocked() {
|
|
285
|
-
return this.locked;
|
|
286
|
-
}
|
|
287
|
-
onClose(cb) {
|
|
288
|
-
if (this.isClosed()) {
|
|
289
|
-
throw new Error("Stream is already closed");
|
|
290
|
-
}
|
|
291
|
-
this.onCloseListeners.add(cb);
|
|
292
|
-
return () => {
|
|
293
|
-
this.onCloseListeners.delete(cb);
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
requestClose() {
|
|
297
|
-
if (this.isClosed()) {
|
|
298
|
-
throw new Error("Cannot request close after stream already closed");
|
|
299
|
-
}
|
|
300
|
-
if (!this.closeRequested) {
|
|
301
|
-
this.closeRequested = true;
|
|
302
|
-
this.closeRequestCallback();
|
|
303
|
-
}
|
|
304
|
-
return new Promise((resolve) => {
|
|
305
|
-
this.onClose(() => {
|
|
306
|
-
resolve(void 0);
|
|
307
|
-
});
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
isCloseRequested() {
|
|
311
|
-
return this.closeRequested;
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* @internal meant for use within river, not exposed as a public API
|
|
315
|
-
*
|
|
316
|
-
* Pushes a value to the stream.
|
|
317
|
-
*/
|
|
318
|
-
pushValue(value) {
|
|
319
|
-
if (this.drained) {
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
if (this.closed) {
|
|
323
|
-
throw new Error("Cannot push to closed stream");
|
|
324
|
-
}
|
|
325
|
-
this.queue.push(value);
|
|
326
|
-
this.resolveNextPromise?.();
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* @internal meant for use within river, not exposed as a public API
|
|
330
|
-
*
|
|
331
|
-
* Triggers the close of the stream. Make sure to push all remaining
|
|
332
|
-
* values before calling this method.
|
|
333
|
-
*/
|
|
334
|
-
triggerClose() {
|
|
335
|
-
if (this.isClosed()) {
|
|
336
|
-
throw new Error("Unexpected closing multiple times");
|
|
337
|
-
}
|
|
338
|
-
this.closed = true;
|
|
339
|
-
this.resolveNextPromise?.();
|
|
340
|
-
this.onCloseListeners.forEach((cb) => cb());
|
|
341
|
-
this.onCloseListeners.clear();
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* @internal meant for use within river, not exposed as a public API
|
|
345
|
-
*/
|
|
346
|
-
hasValuesInQueue() {
|
|
347
|
-
return this.queue.length > 0;
|
|
348
|
-
}
|
|
349
|
-
};
|
|
350
|
-
var WriteStreamImpl = class {
|
|
351
|
-
/**
|
|
352
|
-
* Passed via constructor to pass on write requests
|
|
353
|
-
*/
|
|
354
|
-
writeCb;
|
|
355
|
-
/**
|
|
356
|
-
* Whether the stream is closed.
|
|
357
|
-
*/
|
|
358
|
-
closed = false;
|
|
359
|
-
/**
|
|
360
|
-
* A list of listeners that will be called when the stream is closed.
|
|
361
|
-
*/
|
|
362
|
-
onCloseListeners;
|
|
363
|
-
/**
|
|
364
|
-
* Whether the reader has requested to close the stream.
|
|
365
|
-
*/
|
|
366
|
-
closeRequested = false;
|
|
367
|
-
/**
|
|
368
|
-
* A list of listeners that will be called when a close request is triggered.
|
|
369
|
-
*/
|
|
370
|
-
onCloseRequestListeners;
|
|
371
|
-
constructor(writeCb) {
|
|
372
|
-
this.writeCb = writeCb;
|
|
373
|
-
this.onCloseListeners = /* @__PURE__ */ new Set();
|
|
374
|
-
this.onCloseRequestListeners = /* @__PURE__ */ new Set();
|
|
375
|
-
}
|
|
376
|
-
write(value) {
|
|
377
|
-
if (this.isClosed()) {
|
|
378
|
-
throw new Error("Cannot write to closed stream");
|
|
379
|
-
}
|
|
380
|
-
this.writeCb(value);
|
|
381
|
-
}
|
|
382
|
-
isClosed() {
|
|
383
|
-
return this.closed;
|
|
384
|
-
}
|
|
385
|
-
onClose(cb) {
|
|
386
|
-
if (this.isClosed()) {
|
|
387
|
-
cb();
|
|
388
|
-
return () => void 0;
|
|
389
|
-
}
|
|
390
|
-
this.onCloseListeners.add(cb);
|
|
391
|
-
return () => this.onCloseListeners.delete(cb);
|
|
392
|
-
}
|
|
393
|
-
close() {
|
|
394
|
-
if (this.isClosed()) {
|
|
395
|
-
return;
|
|
396
|
-
}
|
|
397
|
-
this.closed = true;
|
|
398
|
-
this.onCloseListeners.forEach((cb) => cb());
|
|
399
|
-
this.onCloseListeners.clear();
|
|
400
|
-
this.onCloseRequestListeners.clear();
|
|
401
|
-
this.writeCb = () => void 0;
|
|
402
|
-
}
|
|
403
|
-
isCloseRequested() {
|
|
404
|
-
return this.closeRequested;
|
|
405
|
-
}
|
|
406
|
-
onCloseRequest(cb) {
|
|
407
|
-
if (this.isClosed()) {
|
|
408
|
-
throw new Error("Stream is already closed");
|
|
409
|
-
}
|
|
410
|
-
if (this.isCloseRequested()) {
|
|
411
|
-
cb();
|
|
412
|
-
return () => void 0;
|
|
413
|
-
}
|
|
414
|
-
this.onCloseRequestListeners.add(cb);
|
|
415
|
-
return () => this.onCloseRequestListeners.delete(cb);
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* @internal meant for use within river, not exposed as a public API
|
|
419
|
-
*
|
|
420
|
-
* Triggers a close request.
|
|
421
|
-
*/
|
|
422
|
-
triggerCloseRequest() {
|
|
423
|
-
if (this.isCloseRequested()) {
|
|
424
|
-
throw new Error("Cannot trigger close request multiple times");
|
|
425
|
-
}
|
|
426
|
-
if (this.isClosed()) {
|
|
427
|
-
throw new Error("Cannot trigger close request on closed stream");
|
|
428
|
-
}
|
|
429
|
-
this.closeRequested = true;
|
|
430
|
-
this.onCloseRequestListeners.forEach((cb) => cb());
|
|
431
|
-
this.onCloseRequestListeners.clear();
|
|
432
|
-
}
|
|
433
|
-
};
|
|
434
|
-
|
|
435
|
-
export {
|
|
436
|
-
INTERNAL_RIVER_ERROR_CODE,
|
|
437
|
-
UNCAUGHT_ERROR_CODE,
|
|
438
|
-
UNEXPECTED_DISCONNECT_CODE,
|
|
439
|
-
INVALID_REQUEST_CODE,
|
|
440
|
-
ABORT_CODE,
|
|
441
|
-
ResponseReaderErrorSchema,
|
|
442
|
-
RequestReaderErrorSchema,
|
|
443
|
-
Procedure,
|
|
444
|
-
ErrResultSchema,
|
|
445
|
-
AnyResultSchema,
|
|
446
|
-
Ok,
|
|
447
|
-
Err,
|
|
448
|
-
ReadStreamImpl,
|
|
449
|
-
WriteStreamImpl
|
|
450
|
-
};
|
|
451
|
-
//# sourceMappingURL=chunk-MQ6ANR3H.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../router/procedures.ts","../router/result.ts","../router/streams.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */\nimport { Static, TNever, TSchema, TUnion, Type } from '@sinclair/typebox';\nimport { ProcedureHandlerContext } from './context';\nimport { BaseErrorSchemaType, Result } from './result';\nimport { ReadStream, WriteStream } from './streams';\n\n/**\n * Brands a type to prevent it from being directly constructed.\n */\nexport type Branded<T> = T & { readonly __BRAND_DO_NOT_USE: unique symbol };\n\n/**\n * Unbrands a {@link Branded} type.\n */\nexport type Unbranded<T> = T extends Branded<infer U> ? U : never;\n\n/**\n * The valid {@link Procedure} types. The `stream` and `upload` types can optionally have a\n * different type for the very first initialization message. The suffixless types correspond to\n * gRPC's four combinations of stream / non-stream in each direction.\n */\nexport type ValidProcType =\n // Single message in both directions (1:1).\n | 'rpc'\n // Client-stream single message from server (n:1).\n | 'upload'\n // Single message from client, stream from server (1:n).\n | 'subscription'\n // Bidirectional stream (n:n).\n | 'stream';\n\n/**\n * Represents the payload type for {@link Procedure}s.\n */\nexport type PayloadType = TSchema;\n\n/**\n * INTERNAL_RIVER_ERROR_CODE is the code that is used when an internal error occurs,\n * this means that some invariants expected by the river server implementation have\n * been violated. When encountering this error please report this to river maintainers.\n */\nexport const INTERNAL_RIVER_ERROR_CODE = 'INTERNAL_RIVER_ERROR' as const;\n/**\n * UNCAUGHT_ERROR_CODE is the code that is used when an error is thrown\n * inside a procedure handler that's not required.\n */\nexport const UNCAUGHT_ERROR_CODE = 'UNCAUGHT_ERROR' as const;\n/**\n * UNEXPECTED_DISCONNECT_CODE is the code used the stream's session\n * disconnect unexpetedly.\n */\nexport const UNEXPECTED_DISCONNECT_CODE = 'UNEXPECTED_DISCONNECT' as const;\n/**\n * INVALID_REQUEST_CODE is the code used when a client's request is invalid.\n */\nexport const INVALID_REQUEST_CODE = 'INVALID_REQUEST' as const;\n/**\n * ABORT_CODE is the code used when either server or client aborts the stream.\n */\nexport const ABORT_CODE = 'ABORT' as const;\n\n/**\n * ResponseReaderErrorSchema is the schema for all the errors that can be\n * emitted in the ResponseData ReadStream on the client.\n */\nexport const ResponseReaderErrorSchema = Type.Object({\n code: Type.Union([\n Type.Literal(INTERNAL_RIVER_ERROR_CODE),\n Type.Literal(UNCAUGHT_ERROR_CODE),\n Type.Literal(UNEXPECTED_DISCONNECT_CODE),\n Type.Literal(INVALID_REQUEST_CODE),\n Type.Literal(ABORT_CODE),\n ]),\n message: Type.String(),\n});\n\n/**\n * RequestReaderErrorSchema is the schema for all the errors that can be\n * emitted in the RequestData ReadStream on the server.\n */\nexport const RequestReaderErrorSchema = Type.Object({\n code: Type.Union([\n Type.Literal(UNCAUGHT_ERROR_CODE),\n Type.Literal(UNEXPECTED_DISCONNECT_CODE),\n Type.Literal(INVALID_REQUEST_CODE),\n Type.Literal(ABORT_CODE),\n ]),\n message: Type.String(),\n});\n\n/**\n * Represents an acceptable schema to pass to a procedure.\n * Just a type of a schema, not an actual schema.\n */\nexport type ProcedureErrorSchemaType =\n | TUnion<Array<BaseErrorSchemaType>>\n | BaseErrorSchemaType\n | TNever;\n\n/**\n * Procedure for a single message in both directions (1:1).\n *\n * @template State - The context state object.\n * @template RequestInit - The TypeBox schema of the initialization object.\n * @template ResponseData - The TypeBox schema of the output object.\n * @template ResponseErr - The TypeBox schema of the error object.\n */\nexport interface RpcProcedure<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n> {\n type: 'rpc';\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler({\n ctx,\n reqInit,\n }: {\n ctx: ProcedureHandlerContext<State>;\n reqInit: Static<RequestInit>;\n }): Promise<Result<Static<ResponseData>, Static<ResponseErr>>>;\n}\n\n/**\n * Procedure for a client-stream (potentially preceded by an initialization message),\n * single message from server (n:1).\n *\n * @template State - The context state object.\n * @template RequestInit - The TypeBox schema of the initialization object.\n * @template RequestData - The TypeBox schema of the input object.\n * @template ResponseData - The TypeBox schema of the output object.\n * @template ResponseErr - The TypeBox schema of the error object.\n */\nexport interface UploadProcedure<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n> {\n type: 'upload';\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler({\n ctx,\n reqInit,\n reqReader,\n }: {\n ctx: ProcedureHandlerContext<State>;\n reqInit: Static<RequestInit>;\n reqReader: ReadStream<\n Static<RequestData>,\n Static<typeof RequestReaderErrorSchema>\n >;\n }): Promise<Result<Static<ResponseData>, Static<ResponseErr>>>;\n}\n\n/**\n * Procedure for a single message from client, stream from server (1:n).\n *\n * @template State - The context state object.\n * @template RequestInit - The TypeBox schema of the initialization object.\n * @template ResponseData - The TypeBox schema of the output object.\n * @template ResponseErr - The TypeBox schema of the error object.\n */\nexport interface SubscriptionProcedure<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n> {\n type: 'subscription';\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler({\n ctx,\n reqInit,\n resWriter,\n }: {\n ctx: ProcedureHandlerContext<State>;\n reqInit: Static<RequestInit>;\n resWriter: WriteStream<Result<Static<ResponseData>, Static<ResponseErr>>>;\n }): Promise<void | undefined>;\n}\n\n/**\n * Procedure for a bidirectional stream (potentially preceded by an initialization message),\n * (n:n).\n *\n * @template State - The context state object.\n * @template RequestInit - The TypeBox schema of the initialization object.\n * @template RequestData - The TypeBox schema of the input object.\n * @template ResponseData - The TypeBox schema of the output object.\n * @template ResponseErr - The TypeBox schema of the error object.\n */\nexport interface StreamProcedure<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n> {\n type: 'stream';\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler({\n ctx,\n reqInit,\n reqReader,\n resWriter,\n }: {\n ctx: ProcedureHandlerContext<State>;\n reqInit: Static<RequestInit>;\n reqReader: ReadStream<\n Static<RequestData>,\n Static<typeof RequestReaderErrorSchema>\n >;\n resWriter: WriteStream<Result<Static<ResponseData>, Static<ResponseErr>>>;\n }): Promise<void | undefined>;\n}\n\n/**\n * Defines a Procedure type that can be a:\n * - {@link RpcProcedure} for a single message in both directions (1:1)\n * - {@link UploadProcedure} for a client-stream (potentially preceded by an\n * initialization message)\n * - {@link SubscriptionProcedure} for a single message from client, stream from server (1:n)\n * - {@link StreamProcedure} for a bidirectional stream (potentially preceded by an\n * initialization message)\n *\n * @template State - The TypeBox schema of the state object.\n * @template Ty - The type of the procedure.\n * @template RequestData - The TypeBox schema of the input object.\n * @template RequestInit - The TypeBox schema of the input initialization object, if any.\n * @template ResponseData - The TypeBox schema of the output object.\n */\nexport type Procedure<\n State,\n Ty extends ValidProcType,\n RequestInit extends PayloadType,\n RequestData extends PayloadType | null,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n> = { type: Ty } & (RequestData extends PayloadType\n ? Ty extends 'upload'\n ? UploadProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n ResponseErr\n >\n : Ty extends 'stream'\n ? StreamProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n ResponseErr\n >\n : never\n : Ty extends 'rpc'\n ? RpcProcedure<State, RequestInit, ResponseData, ResponseErr>\n : Ty extends 'subscription'\n ? SubscriptionProcedure<State, RequestInit, ResponseData, ResponseErr>\n : never);\n\n/**\n * Represents any {@link Procedure} type.\n *\n * @template State - The context state object. You can provide this to constrain\n * the type of procedures.\n */\nexport type AnyProcedure<State = object> = Procedure<\n State,\n ValidProcType,\n PayloadType,\n PayloadType | null,\n PayloadType,\n ProcedureErrorSchemaType\n>;\n\n/**\n * Represents a map of {@link Procedure}s.\n *\n * @template State - The context state object. You can provide this to constrain\n * the type of procedures.\n */\nexport type ProcedureMap<State = object> = Record<string, AnyProcedure<State>>;\n\n// typescript is funky so with these upcoming procedure constructors, the overloads\n// which handle the `init` case _must_ come first, otherwise the `init` property\n// is not recognized as optional, for some reason\n\n/**\n * Creates an {@link RpcProcedure}.\n */\n// signature: default errors\nfunction rpc<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n>(def: {\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError?: never;\n description?: string;\n handler: RpcProcedure<State, RequestInit, ResponseData, TNever>['handler'];\n}): Branded<RpcProcedure<State, RequestInit, ResponseData, TNever>>;\n\n// signature: explicit errors\nfunction rpc<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n>(def: {\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler: RpcProcedure<\n State,\n RequestInit,\n ResponseData,\n ResponseErr\n >['handler'];\n}): Branded<RpcProcedure<State, RequestInit, ResponseData, ResponseErr>>;\n\n// implementation\nfunction rpc({\n requestInit,\n responseData,\n responseError = Type.Never(),\n description,\n handler,\n}: {\n requestInit: PayloadType;\n responseData: PayloadType;\n responseError?: ProcedureErrorSchemaType;\n description?: string;\n handler: RpcProcedure<\n object,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n ...(description ? { description } : {}),\n type: 'rpc',\n requestInit,\n responseData,\n responseError,\n handler,\n };\n}\n\n/**\n * Creates an {@link UploadProcedure}, optionally with an initialization message.\n */\n// signature: init with default errors\nfunction upload<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n>(def: {\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError?: never;\n description?: string;\n handler: UploadProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n TNever\n >['handler'];\n}): Branded<\n UploadProcedure<State, RequestInit, RequestData, ResponseData, TNever>\n>;\n\n// signature: init with explicit errors\nfunction upload<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n>(def: {\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler: UploadProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n ResponseErr\n >['handler'];\n}): Branded<\n UploadProcedure<State, RequestInit, RequestData, ResponseData, ResponseErr>\n>;\n\n// implementation\nfunction upload({\n requestInit,\n requestData,\n responseData,\n responseError = Type.Never(),\n description,\n handler,\n}: {\n requestInit: PayloadType;\n requestData: PayloadType;\n responseData: PayloadType;\n responseError?: ProcedureErrorSchemaType;\n description?: string;\n handler: UploadProcedure<\n object,\n PayloadType,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n type: 'upload',\n ...(description ? { description } : {}),\n requestInit,\n requestData,\n responseData,\n responseError,\n handler,\n };\n}\n\n/**\n * Creates a {@link SubscriptionProcedure}.\n */\n// signature: default errors\nfunction subscription<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n>(def: {\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError?: never;\n description?: string;\n handler: SubscriptionProcedure<\n State,\n RequestInit,\n ResponseData,\n TNever\n >['handler'];\n}): Branded<SubscriptionProcedure<State, RequestInit, ResponseData, TNever>>;\n\n// signature: explicit errors\nfunction subscription<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n>(def: {\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler: SubscriptionProcedure<\n State,\n RequestInit,\n ResponseData,\n ResponseErr\n >['handler'];\n}): Branded<\n SubscriptionProcedure<State, RequestInit, ResponseData, ResponseErr>\n>;\n\n// implementation\nfunction subscription({\n requestInit,\n responseData,\n responseError = Type.Never(),\n description,\n handler,\n}: {\n requestInit: PayloadType;\n responseData: PayloadType;\n responseError?: ProcedureErrorSchemaType;\n description?: string;\n handler: SubscriptionProcedure<\n object,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n type: 'subscription',\n ...(description ? { description } : {}),\n requestInit,\n responseData,\n responseError,\n handler,\n };\n}\n\n/**\n * Creates a {@link StreamProcedure}, optionally with an initialization message.\n */\n// signature: with default errors\nfunction stream<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n>(def: {\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError?: never;\n description?: string;\n handler: StreamProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n TNever\n >['handler'];\n}): Branded<\n StreamProcedure<State, RequestInit, RequestData, ResponseData, TNever>\n>;\n\n// signature: explicit errors\nfunction stream<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n>(def: {\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler: StreamProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n ResponseErr\n >['handler'];\n}): Branded<\n StreamProcedure<State, RequestInit, RequestData, ResponseData, ResponseErr>\n>;\n\n// implementation\nfunction stream({\n requestInit,\n requestData,\n responseData,\n responseError = Type.Never(),\n description,\n handler,\n}: {\n requestInit: PayloadType;\n requestData: PayloadType;\n responseData: PayloadType;\n responseError?: ProcedureErrorSchemaType;\n description?: string;\n handler: StreamProcedure<\n object,\n PayloadType,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n type: 'stream',\n ...(description ? { description } : {}),\n requestInit,\n requestData,\n responseData,\n responseError,\n handler,\n };\n}\n\n/**\n * Holds the {@link Procedure} creation functions. Use these to create\n * procedures for services. You aren't allowed to create procedures directly.\n */\nexport const Procedure = {\n rpc,\n upload,\n subscription,\n stream,\n};\n","import {\n Static,\n TLiteral,\n TObject,\n TSchema,\n TString,\n TUnion,\n Type,\n} from '@sinclair/typebox';\nimport { Client } from './client';\nimport { ReadStream } from './streams';\n\ntype TLiteralString = TLiteral<string>;\n\nexport type BaseErrorSchemaType =\n | TObject<{\n code: TLiteralString | TUnion<Array<TLiteralString>>;\n message: TLiteralString | TString;\n }>\n | TObject<{\n code: TLiteralString | TUnion<Array<TLiteralString>>;\n message: TLiteralString | TString;\n extras: TSchema;\n }>;\n\n/**\n * Takes in a specific error schema and returns a result schema the error\n */\nexport const ErrResultSchema = <T extends BaseErrorSchemaType>(t: T) =>\n Type.Object({\n ok: Type.Literal(false),\n payload: t,\n });\n\n/**\n * AnyResultSchema is a schema to validate any result.\n */\nexport const AnyResultSchema = Type.Union([\n Type.Object({\n ok: Type.Literal(false),\n payload: Type.Object({\n code: Type.String(),\n message: Type.String(),\n extras: Type.Optional(Type.Unknown()),\n }),\n }),\n\n Type.Object({\n ok: Type.Literal(true),\n payload: Type.Unknown(),\n }),\n]);\n\nexport interface OkResult<T> {\n ok: true;\n payload: T;\n}\nexport interface ErrResult<Err extends Static<BaseErrorSchemaType>> {\n ok: false;\n payload: Err;\n}\nexport type Result<T, Err extends Static<BaseErrorSchemaType>> =\n | OkResult<T>\n | ErrResult<Err>;\n\nexport function Ok<const T extends Array<unknown>>(p: T): OkResult<T>;\nexport function Ok<const T extends ReadonlyArray<unknown>>(p: T): OkResult<T>;\nexport function Ok<const T>(payload: T): OkResult<T>;\nexport function Ok<const T>(payload: T): OkResult<T> {\n return {\n ok: true,\n payload,\n };\n}\n\nexport function Err<const Err extends Static<BaseErrorSchemaType>>(\n error: Err,\n): ErrResult<Err> {\n return {\n ok: false,\n payload: error,\n };\n}\n\n/**\n * Refine a {@link Result} type to its returned payload.\n */\nexport type ResultUnwrapOk<R> = R extends Result<infer T, infer __E>\n ? T\n : never;\n\n/**\n * Unwrap a {@link Result} type and return the payload if successful,\n * otherwise throws an error.\n * @param result - The result to unwrap.\n * @throws Will throw an error if the result is not ok.\n */\nexport function unwrap<T, Err extends Static<BaseErrorSchemaType>>(\n result: Result<T, Err>,\n): T {\n if (result.ok) {\n return result.payload;\n }\n\n throw new Error(\n `Cannot non-ok result, got: ${result.payload.code} - ${result.payload.message}`,\n );\n}\n\n/**\n * Refine a {@link Result} type to its error payload.\n */\nexport type ResultUnwrapErr<R> = R extends Result<infer __T, infer Err>\n ? Err\n : never;\n\n/**\n * Retrieve the output type for a procedure, represented as a {@link Result}\n * type.\n * Example:\n * ```\n * type Message = Output<typeof client, 'serviceName', 'procedureName'>\n * ```\n */\nexport type Output<\n RiverClient,\n ServiceName extends keyof RiverClient,\n ProcedureName extends keyof RiverClient[ServiceName],\n Procedure = RiverClient[ServiceName][ProcedureName],\n Fn extends (...args: never) => unknown = (...args: never) => unknown,\n> = RiverClient extends Client<infer __ServiceSchemaMap>\n ? Procedure extends object\n ? Procedure extends object & { rpc: infer RpcFn extends Fn }\n ? Awaited<ReturnType<RpcFn>>\n : Procedure extends object & { upload: infer UploadFn extends Fn }\n ? ReturnType<UploadFn> extends {\n finalize: (...args: never) => Promise<infer UploadOutputMessage>;\n }\n ? UploadOutputMessage\n : never\n : Procedure extends object & { stream: infer StreamFn extends Fn }\n ? ReturnType<StreamFn> extends {\n resReader: ReadStream<\n infer StreamOutputMessage,\n Static<BaseErrorSchemaType>\n >;\n }\n ? StreamOutputMessage\n : never\n : Procedure extends object & {\n subscribe: infer SubscriptionFn extends Fn;\n }\n ? Awaited<ReturnType<SubscriptionFn>> extends {\n resReader: ReadStream<\n infer SubscriptionOutputMessage,\n Static<BaseErrorSchemaType>\n >;\n }\n ? SubscriptionOutputMessage\n : never\n : never\n : never\n : never;\n","import { Static } from '@sinclair/typebox';\nimport { BaseErrorSchemaType, Err, Result } from './result';\n\nexport const StreamDrainedError = {\n code: 'STREAM_DRAINED',\n message: 'Stream was drained',\n} as const;\n\ntype ReadStreamResult<T, E extends Static<BaseErrorSchemaType>> = Result<\n T,\n E | typeof StreamDrainedError\n>;\n\n/**\n * Using simple iterator here to lock down the iteration and disallow\n * `return` and `throw` to be called from the outside.\n */\nexport interface SimpleIterator<T> {\n next(): Promise<\n | {\n done: false;\n value: T;\n }\n | {\n done: true;\n value: undefined;\n }\n >;\n}\n\n/**\n * A `ReadStream` represents a stream of data.\n *\n * This stream is not closable by the reader, the reader must wait for\n * the writer to close it.\n *\n * The stream can only be locked (aka consumed) once and will remain\n * locked, trying to lock the stream again will throw an TypeError.\n */\nexport interface ReadStream<T, E extends Static<BaseErrorSchemaType>> {\n /**\n * Stream implements AsyncIterator API and can be consumed via\n * for-await-of loops. Iteration locks the stream\n *\n */\n [Symbol.asyncIterator](): SimpleIterator<ReadStreamResult<T, E>>;\n /**\n * `unwrappedIter` returns an AsyncIterator that will unwrap the results coming\n * into the stream, yielding the payload if successful, otherwise throwing.\n * We generally recommend using the normal iterator instead of this method,\n * and handling errors explicitly.\n */\n unwrappedIter(): {\n [Symbol.asyncIterator](): SimpleIterator<T>;\n };\n /**\n * `asArray` locks the stream and returns a promise that resolves\n * with an array of the stream's content when the stream is closed.\n *\n */\n asArray(): Promise<Array<ReadStreamResult<T, E>>>;\n /**\n * `drain` locks the stream and discards any existing or future data.\n *\n * If there is an existing Promise waiting for the next value,\n * `drain` causes it to resolve with a {@link StreamDrainedError} error.\n */\n drain(): undefined;\n /**\n * `isLocked` returns true if the stream is locked.\n */\n isLocked(): boolean;\n /**\n * `onClose` registers a callback that will be called when the stream\n * is closed. Returns a function that can be used to unregister the\n * listener.\n */\n onClose(cb: () => void): () => void;\n /**\n * `isClosed` returns true if the stream was closed by the writer.\n *\n * Note that the stream can still have queued data and can still be\n * consumed.\n */\n isClosed(): boolean;\n /**\n * `requestClose` sends a request to the writer to close the stream,\n * and resolves the writer closes its end of the stream..\n *\n * The stream can still receive more data after the request is sent. If you\n * no longer wish to use the stream, make sure to call `drain`.\n */\n requestClose(): Promise<undefined>;\n /**\n * `isCloseRequested` checks if the reader has requested to close the stream.\n */\n isCloseRequested(): boolean;\n}\n\n/**\n * A `WriteStream` is a streams that can be written to.\n */\nexport interface WriteStream<T> {\n /**\n * `write` writes a value to the stream. An error is thrown if writing to a closed stream.\n */\n write(value: T): undefined;\n /**\n * `close` signals the closure of the write stream, informing the reader that the stream is complete.\n * Calling close multiple times has no effect.\n */\n close(): undefined;\n /**\n * `isCloseRequested` checks if the reader has requested to close the stream.\n */\n isCloseRequested(): boolean;\n /**\n * `onCloseRequest` registers a callback that will be called when the stream's\n * reader requests a close. Returns a function that can be used to unregister the\n * listener.\n */\n onCloseRequest(cb: () => void): () => void;\n /**\n * `isClosed` returns true if the stream was closed by the writer.\n */\n isClosed(): boolean;\n /**\n * `onClose` registers a callback that will be called when the stream\n * is closed. Returns a function that can be used to unregister the\n * listener.\n */\n onClose(cb: () => void): () => void;\n}\n\n/**\n * Internal implementation of a `ReadStream`.\n * This won't be exposed as an interface to river\n * consumers directly, it has internal river methods\n * to pushed data to the stream and close it.\n */\nexport class ReadStreamImpl<T, E extends Static<BaseErrorSchemaType>>\n implements ReadStream<T, E>\n{\n /**\n * Whether the stream is closed.\n */\n private closed = false;\n /**\n * A list of listeners that will be called when the stream is closed.\n */\n private onCloseListeners: Set<() => void>;\n /**\n * Whether the user has requested to close the stream.\n */\n private closeRequested = false;\n /**\n * Used to signal to the outside world that the user has requested to close the stream.\n */\n private closeRequestCallback: () => void;\n /**\n * Whether the stream is locked.\n */\n private locked = false;\n /**\n * Whether drain was called.\n */\n private drained = false;\n /**\n * This flag allows us to avoid cases where drain was called,\n * but the stream is fully consumed and closed. We don't need\n * to signal that drain was called.\n */\n private didDrainDisposeValues = false;\n /**\n * A list of values that have been pushed to the stream but not yet emitted to the user.\n */\n private queue: Array<ReadStreamResult<T, E>> = [];\n /**\n * Used by methods in the class to signal to the iterator that it\n * should check for the next value.\n */\n private nextPromise: Promise<void> | null = null;\n /**\n * Resolves nextPromise\n */\n private resolveNextPromise: null | (() => void) = null;\n\n constructor(closeRequestCallback: () => void) {\n this.closeRequestCallback = closeRequestCallback;\n this.onCloseListeners = new Set();\n }\n\n public [Symbol.asyncIterator]() {\n if (this.isLocked()) {\n throw new TypeError('ReadStream is already locked');\n }\n\n // first iteration with drain signals an error, the following one signals end of iteration.\n let didSignalDrain = false;\n this.locked = true;\n\n return {\n next: async () => {\n if (this.drained && didSignalDrain) {\n return {\n done: true,\n value: undefined,\n } as const;\n }\n\n // Wait until we have something in the queue\n while (this.queue.length === 0) {\n if (this.isClosed() && !this.didDrainDisposeValues) {\n return {\n done: true,\n value: undefined,\n } as const;\n }\n\n if (this.drained) {\n didSignalDrain = true;\n\n return {\n done: false,\n value: Err(StreamDrainedError),\n } as const;\n }\n\n if (!this.nextPromise) {\n this.nextPromise = new Promise<void>((resolve) => {\n this.resolveNextPromise = resolve;\n });\n }\n\n await this.nextPromise;\n this.nextPromise = null;\n this.resolveNextPromise = null;\n }\n\n // Unfortunately we have to use non-null assertion here, because T can be undefined\n // we already check for array length above anyway\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const value = this.queue.shift()!;\n\n return { done: false, value } as const;\n },\n return: () => {\n this.drain();\n return { done: true, value: undefined } as const;\n },\n };\n }\n\n public unwrappedIter() {\n const iterator = this[Symbol.asyncIterator]();\n\n let unwrappedLock = false;\n return {\n [Symbol.asyncIterator]() {\n if (unwrappedLock) {\n throw new TypeError('ReadStream is already locked');\n }\n\n unwrappedLock = true;\n\n return {\n next: async (): ReturnType<SimpleIterator<T>['next']> => {\n const next = await iterator.next();\n\n if (next.done) {\n return next;\n }\n\n if (next.value.ok) {\n return { done: false, value: next.value.payload };\n }\n\n iterator.return();\n\n throw new Error(\n `Got err result in unwrappedIter: ${next.value.payload.code} - ${next.value.payload.message}`,\n );\n },\n return: () => iterator.return(),\n };\n },\n };\n }\n\n public async asArray(): Promise<Array<ReadStreamResult<T, E>>> {\n const array: Array<ReadStreamResult<T, E>> = [];\n for await (const value of this) {\n array.push(value);\n }\n\n return array;\n }\n\n public drain(): undefined {\n if (this.drained) {\n return;\n }\n\n this.locked = true;\n this.drained = true;\n this.didDrainDisposeValues = this.queue.length > 0;\n this.queue.length = 0;\n\n this.resolveNextPromise?.();\n }\n\n public isClosed(): boolean {\n return this.closed;\n }\n\n public isLocked(): boolean {\n return this.locked;\n }\n\n public onClose(cb: () => void): () => void {\n if (this.isClosed()) {\n throw new Error('Stream is already closed');\n }\n\n this.onCloseListeners.add(cb);\n\n return () => {\n this.onCloseListeners.delete(cb);\n };\n }\n\n public requestClose(): Promise<undefined> {\n if (this.isClosed()) {\n throw new Error('Cannot request close after stream already closed');\n }\n\n if (!this.closeRequested) {\n this.closeRequested = true;\n this.closeRequestCallback();\n }\n\n return new Promise<undefined>((resolve) => {\n this.onClose(() => {\n resolve(undefined);\n });\n });\n }\n\n public isCloseRequested(): boolean {\n return this.closeRequested;\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n *\n * Pushes a value to the stream.\n */\n public pushValue(value: Result<T, E>): undefined {\n if (this.drained) {\n return;\n }\n\n if (this.closed) {\n throw new Error('Cannot push to closed stream');\n }\n\n this.queue.push(value);\n this.resolveNextPromise?.();\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n *\n * Triggers the close of the stream. Make sure to push all remaining\n * values before calling this method.\n */\n public triggerClose(): undefined {\n if (this.isClosed()) {\n throw new Error('Unexpected closing multiple times');\n }\n\n this.closed = true;\n this.resolveNextPromise?.();\n this.onCloseListeners.forEach((cb) => cb());\n this.onCloseListeners.clear();\n\n // TODO maybe log a warn if after a certain amount of time\n // the queue was not fully consumed\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n */\n public hasValuesInQueue(): boolean {\n return this.queue.length > 0;\n }\n}\n\n/**\n * Internal implementation of a `WriteStream`.\n * This won't be exposed as an interface to river\n * consumers directly, it has internal river methods\n * to trigger a close request, a way to pass on close\n * signals, and a way to push data to the stream.\n */\nexport class WriteStreamImpl<T> implements WriteStream<T> {\n /**\n * Passed via constructor to pass on write requests\n */\n private writeCb: (value: T) => void;\n /**\n * Whether the stream is closed.\n */\n private closed = false;\n /**\n * A list of listeners that will be called when the stream is closed.\n */\n private onCloseListeners: Set<() => void>;\n /**\n * Whether the reader has requested to close the stream.\n */\n private closeRequested = false;\n /**\n * A list of listeners that will be called when a close request is triggered.\n */\n private onCloseRequestListeners: Set<() => void>;\n\n constructor(writeCb: (value: T) => void) {\n this.writeCb = writeCb;\n this.onCloseListeners = new Set();\n this.onCloseRequestListeners = new Set();\n }\n\n public write(value: T): undefined {\n if (this.isClosed()) {\n throw new Error('Cannot write to closed stream');\n }\n\n this.writeCb(value);\n }\n\n public isClosed(): boolean {\n return this.closed;\n }\n\n onClose(cb: () => void): () => void {\n if (this.isClosed()) {\n cb();\n\n return () => undefined;\n }\n\n this.onCloseListeners.add(cb);\n\n return () => this.onCloseListeners.delete(cb);\n }\n\n public close(): undefined {\n if (this.isClosed()) {\n return;\n }\n\n this.closed = true;\n this.onCloseListeners.forEach((cb) => cb());\n\n // cleanup\n this.onCloseListeners.clear();\n this.onCloseRequestListeners.clear();\n this.writeCb = () => undefined;\n }\n\n public isCloseRequested(): boolean {\n return this.closeRequested;\n }\n\n public onCloseRequest(cb: () => void): () => void {\n if (this.isClosed()) {\n throw new Error('Stream is already closed');\n }\n\n if (this.isCloseRequested()) {\n cb();\n\n return () => undefined;\n }\n\n this.onCloseRequestListeners.add(cb);\n\n return () => this.onCloseRequestListeners.delete(cb);\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n *\n * Triggers a close request.\n */\n public triggerCloseRequest(): undefined {\n if (this.isCloseRequested()) {\n throw new Error('Cannot trigger close request multiple times');\n }\n\n if (this.isClosed()) {\n throw new Error('Cannot trigger close request on closed stream');\n }\n\n this.closeRequested = true;\n this.onCloseRequestListeners.forEach((cb) => cb());\n this.onCloseRequestListeners.clear();\n }\n}\n"],"mappings":"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","names":["Type"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../logging/log.ts"],"sourcesContent":["import { ValueError } from '@sinclair/typebox/value';\nimport { OpaqueTransportMessage } from '../transport/message';\n\nconst LoggingLevels = {\n debug: -1,\n info: 0,\n warn: 1,\n error: 2,\n} as const;\nexport type LoggingLevel = keyof typeof LoggingLevels;\n\nexport type LogFn = (\n msg: string,\n ctx?: MessageMetadata,\n level?: LoggingLevel,\n) => void;\nexport type Logger = {\n [key in LoggingLevel]: (msg: string, metadata?: MessageMetadata) => void;\n};\n\nexport type Tags =\n | 'invariant-violation'\n | 'state-transition'\n | 'invalid-request';\n\nconst cleanedLogFn = (log: LogFn) => {\n return (msg: string, metadata?: MessageMetadata) => {\n // skip cloning object if metadata has no transportMessage\n if (!metadata?.transportMessage) {\n log(msg, metadata);\n return;\n }\n\n // clone metadata and clean transportMessage\n const { payload, ...rest } = metadata.transportMessage;\n metadata.transportMessage = rest;\n log(msg, metadata);\n };\n};\n\nexport type MessageMetadata = Partial<{\n protocolVersion: string;\n clientId: string;\n connectedTo: string;\n sessionId: string;\n connId: string;\n transportMessage: Partial<OpaqueTransportMessage>;\n validationErrors: Array<ValueError>;\n tags: Array<Tags>;\n telemetry: {\n traceId: string;\n spanId: string;\n };\n}>;\n\nexport class BaseLogger implements Logger {\n minLevel: LoggingLevel;\n private output: LogFn;\n\n constructor(output: LogFn, minLevel: LoggingLevel = 'info') {\n this.minLevel = minLevel;\n this.output = output;\n }\n\n debug(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.debug) {\n this.output(msg, metadata ?? {}, 'debug');\n }\n }\n\n info(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.info) {\n this.output(msg, metadata ?? {}, 'info');\n }\n }\n\n warn(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.warn) {\n this.output(msg, metadata ?? {}, 'warn');\n }\n }\n\n error(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.error) {\n this.output(msg, metadata ?? {}, 'error');\n }\n }\n}\n\nexport const stringLogger: LogFn = (msg, ctx, level = 'info') => {\n const from = ctx?.clientId ? `${ctx.clientId} -- ` : '';\n console.log(`[river:${level}] ${from}${msg}`);\n};\n\nconst colorMap = {\n debug: '\\u001b[34m',\n info: '\\u001b[32m',\n warn: '\\u001b[33m',\n error: '\\u001b[31m',\n};\n\nexport const coloredStringLogger: LogFn = (msg, ctx, level = 'info') => {\n const color = colorMap[level];\n const from = ctx?.clientId ? `${ctx.clientId} -- ` : '';\n console.log(`[river:${color}${level}\\u001b[0m] ${from}${msg}`);\n};\n\nexport const jsonLogger: LogFn = (msg, ctx, level) => {\n console.log(JSON.stringify({ msg, ctx, level }));\n};\n\nexport const createLogProxy = (log: Logger) => ({\n debug: cleanedLogFn(log.debug.bind(log)),\n info: cleanedLogFn(log.info.bind(log)),\n warn: cleanedLogFn(log.warn.bind(log)),\n error: cleanedLogFn(log.error.bind(log)),\n});\n"],"mappings":";AAGA,IAAM,gBAAgB;AAAA,EACpB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AAiBA,IAAM,eAAe,CAAC,QAAe;AACnC,SAAO,CAAC,KAAa,aAA+B;AAElD,QAAI,CAAC,UAAU,kBAAkB;AAC/B,UAAI,KAAK,QAAQ;AACjB;AAAA,IACF;AAGA,UAAM,EAAE,SAAS,GAAG,KAAK,IAAI,SAAS;AACtC,aAAS,mBAAmB;AAC5B,QAAI,KAAK,QAAQ;AAAA,EACnB;AACF;AAiBO,IAAM,aAAN,MAAmC;AAAA,EACxC;AAAA,EACQ;AAAA,EAER,YAAY,QAAe,WAAyB,QAAQ;AAC1D,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAa,UAA4B;AAC7C,QAAI,cAAc,KAAK,QAAQ,KAAK,cAAc,OAAO;AACvD,WAAK,OAAO,KAAK,YAAY,CAAC,GAAG,OAAO;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,KAAK,KAAa,UAA4B;AAC5C,QAAI,cAAc,KAAK,QAAQ,KAAK,cAAc,MAAM;AACtD,WAAK,OAAO,KAAK,YAAY,CAAC,GAAG,MAAM;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,KAAK,KAAa,UAA4B;AAC5C,QAAI,cAAc,KAAK,QAAQ,KAAK,cAAc,MAAM;AACtD,WAAK,OAAO,KAAK,YAAY,CAAC,GAAG,MAAM;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,KAAa,UAA4B;AAC7C,QAAI,cAAc,KAAK,QAAQ,KAAK,cAAc,OAAO;AACvD,WAAK,OAAO,KAAK,YAAY,CAAC,GAAG,OAAO;AAAA,IAC1C;AAAA,EACF;AACF;AAEO,IAAM,eAAsB,CAAC,KAAK,KAAK,QAAQ,WAAW;AAC/D,QAAM,OAAO,KAAK,WAAW,GAAG,IAAI,QAAQ,SAAS;AACrD,UAAQ,IAAI,UAAU,KAAK,KAAK,IAAI,GAAG,GAAG,EAAE;AAC9C;AAEA,IAAM,WAAW;AAAA,EACf,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AAEO,IAAM,sBAA6B,CAAC,KAAK,KAAK,QAAQ,WAAW;AACtE,QAAM,QAAQ,SAAS,KAAK;AAC5B,QAAM,OAAO,KAAK,WAAW,GAAG,IAAI,QAAQ,SAAS;AACrD,UAAQ,IAAI,UAAU,KAAK,GAAG,KAAK,YAAc,IAAI,GAAG,GAAG,EAAE;AAC/D;AAEO,IAAM,aAAoB,CAAC,KAAK,KAAK,UAAU;AACpD,UAAQ,IAAI,KAAK,UAAU,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC;AACjD;AAEO,IAAM,iBAAiB,CAAC,SAAiB;AAAA,EAC9C,OAAO,aAAa,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,EACvC,MAAM,aAAa,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,EACrC,MAAM,aAAa,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,EACrC,OAAO,aAAa,IAAI,MAAM,KAAK,GAAG,CAAC;AACzC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../transport/server.ts"],"sourcesContent":["import { SpanStatusCode } from '@opentelemetry/api';\nimport { ParsedMetadata } from '../router/context';\nimport { ServerHandshakeOptions } from '../router/handshake';\nimport {\n ControlMessageHandshakeRequestSchema,\n HandshakeErrorCustomHandlerFatalResponseCodes,\n HandshakeErrorResponseCodes,\n OpaqueTransportMessage,\n acceptedProtocolVersions,\n PartialTransportMessage,\n TransportClientId,\n handshakeResponseMessage,\n currentProtocolVersion,\n} from './message';\nimport {\n ProvidedServerTransportOptions,\n ServerTransportOptions,\n defaultServerTransportOptions,\n} from './options';\nimport { Transport } from './transport';\nimport { coerceErrorString } from '../util/stringify';\nimport { Static } from '@sinclair/typebox';\nimport { Value } from '@sinclair/typebox/value';\nimport { ProtocolError } from './events';\nimport { Connection } from './connection';\nimport { MessageMetadata } from '../logging';\nimport { SessionWaitingForHandshake } from './sessionStateMachine/SessionWaitingForHandshake';\nimport { SessionState } from './sessionStateMachine/common';\nimport {\n ServerSession,\n ServerSessionStateGraph,\n} from './sessionStateMachine/transitions';\n\nexport abstract class ServerTransport<\n ConnType extends Connection,\n> extends Transport<ConnType> {\n /**\n * The options for this transport.\n */\n protected options: ServerTransportOptions;\n\n /**\n * Optional handshake options for the server.\n */\n handshakeExtensions?: ServerHandshakeOptions;\n\n /**\n * A map of session handshake data for each session.\n */\n sessionHandshakeMetadata = new Map<TransportClientId, ParsedMetadata>();\n\n sessions = new Map<TransportClientId, ServerSession<ConnType>>();\n pendingSessions = new Set<SessionWaitingForHandshake<ConnType>>();\n\n constructor(\n clientId: TransportClientId,\n providedOptions?: ProvidedServerTransportOptions,\n ) {\n super(clientId, providedOptions);\n this.sessions = new Map();\n this.options = {\n ...defaultServerTransportOptions,\n ...providedOptions,\n };\n this.log?.info(`initiated server transport`, {\n clientId: this.clientId,\n protocolVersion: currentProtocolVersion,\n });\n }\n\n extendHandshake(options: ServerHandshakeOptions) {\n this.handshakeExtensions = options;\n }\n\n send(to: string, msg: PartialTransportMessage): string {\n if (this.getStatus() === 'closed') {\n const err = 'transport is closed, cant send';\n this.log?.error(err, {\n clientId: this.clientId,\n transportMessage: msg,\n tags: ['invariant-violation'],\n });\n\n throw new Error(err);\n }\n\n const session = this.sessions.get(to);\n if (!session) {\n const err = `session to ${to} does not exist`;\n this.log?.error(err, {\n clientId: this.clientId,\n transportMessage: msg,\n tags: ['invariant-violation'],\n });\n\n throw new Error(err);\n }\n\n return session.send(msg);\n }\n\n protected deletePendingSession(\n pendingSession: SessionWaitingForHandshake<ConnType>,\n ) {\n pendingSession.close();\n // we don't dispatch a session disconnect event\n // for a non-identified session, just delete directly\n\n this.pendingSessions.delete(pendingSession);\n }\n\n protected deleteSession(session: ServerSession<ConnType>): void {\n this.sessionHandshakeMetadata.delete(session.to);\n super.deleteSession(session);\n }\n\n protected handleConnection(conn: ConnType) {\n if (this.getStatus() !== 'open') return;\n\n this.log?.info(`new incoming connection`, {\n ...conn.loggingMetadata,\n clientId: this.clientId,\n });\n\n let receivedHandshake = false;\n const pendingSession = ServerSessionStateGraph.entrypoint(\n this.clientId,\n conn,\n {\n onConnectionClosed: () => {\n this.log?.warn(\n `connection from unknown closed before handshake finished`,\n pendingSession.loggingMetadata,\n );\n\n this.deletePendingSession(pendingSession);\n },\n onConnectionErrored: (err) => {\n const errorString = coerceErrorString(err);\n this.log?.warn(\n `connection from unknown errored before handshake finished: ${errorString}`,\n pendingSession.loggingMetadata,\n );\n\n this.deletePendingSession(pendingSession);\n },\n onHandshakeTimeout: () => {\n this.log?.warn(\n `connection from unknown timed out before handshake finished`,\n pendingSession.loggingMetadata,\n );\n\n this.deletePendingSession(pendingSession);\n },\n onHandshake: (msg) => {\n if (receivedHandshake) {\n this.log?.error(\n `received multiple handshake messages from pending session`,\n {\n ...pendingSession.loggingMetadata,\n connectedTo: msg.from,\n transportMessage: msg,\n },\n );\n\n this.deletePendingSession(pendingSession);\n return;\n }\n\n // let this resolve async, we just need to make sure its only\n // called once so we don't race while transitioning to connected\n // onHandshakeRequest is async as custom validation may be async\n receivedHandshake = true;\n void this.onHandshakeRequest(pendingSession, msg);\n },\n onInvalidHandshake: (reason, code) => {\n this.log?.error(\n `invalid handshake: ${reason}`,\n pendingSession.loggingMetadata,\n );\n this.deletePendingSession(pendingSession);\n this.protocolError({\n type: ProtocolError.HandshakeFailed,\n code,\n message: reason,\n });\n },\n },\n this.options,\n this.log,\n );\n\n this.pendingSessions.add(pendingSession);\n }\n\n private rejectHandshakeRequest(\n session: SessionWaitingForHandshake<ConnType>,\n to: TransportClientId,\n reason: string,\n code: Static<typeof HandshakeErrorResponseCodes>,\n metadata: MessageMetadata,\n ) {\n session.conn.telemetry?.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: reason,\n });\n\n this.log?.warn(reason, metadata);\n\n session.sendHandshake(\n handshakeResponseMessage({\n from: this.clientId,\n to,\n status: {\n ok: false,\n code,\n reason,\n },\n }),\n );\n\n this.protocolError({\n type: ProtocolError.HandshakeFailed,\n code,\n message: reason,\n });\n this.deletePendingSession(session);\n }\n\n protected async onHandshakeRequest(\n session: SessionWaitingForHandshake<ConnType>,\n msg: OpaqueTransportMessage,\n ) {\n // invariant: msg is a handshake request\n if (!Value.Check(ControlMessageHandshakeRequestSchema, msg.payload)) {\n this.rejectHandshakeRequest(\n session,\n msg.from,\n 'received invalid handshake request',\n 'MALFORMED_HANDSHAKE',\n {\n ...session.loggingMetadata,\n transportMessage: msg,\n connectedTo: msg.from,\n validationErrors: [\n ...Value.Errors(ControlMessageHandshakeRequestSchema, msg.payload),\n ],\n },\n );\n\n return;\n }\n\n // invariant: handshake request passes all the validation\n const gotVersion = msg.payload.protocolVersion;\n if (!acceptedProtocolVersions.includes(gotVersion)) {\n this.rejectHandshakeRequest(\n session,\n msg.from,\n `expected protocol version oneof [${acceptedProtocolVersions.toString()}], got ${gotVersion}`,\n 'PROTOCOL_VERSION_MISMATCH',\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n transportMessage: msg,\n },\n );\n\n return;\n }\n\n let oldSession = this.sessions.get(msg.from);\n\n // invariant: must pass custom validation if defined\n let parsedMetadata: ParsedMetadata = {};\n if (this.handshakeExtensions) {\n if (!Value.Check(this.handshakeExtensions.schema, msg.payload.metadata)) {\n this.rejectHandshakeRequest(\n session,\n msg.from,\n 'received malformed handshake metadata',\n 'MALFORMED_HANDSHAKE_META',\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n validationErrors: [\n ...Value.Errors(\n this.handshakeExtensions.schema,\n msg.payload.metadata,\n ),\n ],\n },\n );\n\n return;\n }\n\n const previousParsedMetadata = oldSession\n ? this.sessionHandshakeMetadata.get(oldSession.to)\n : undefined;\n\n const parsedMetadataOrFailureCode =\n await this.handshakeExtensions.validate(\n msg.payload.metadata,\n previousParsedMetadata,\n );\n\n // double-check to make sure we haven't transitioned the session yet\n if (session._isConsumed) {\n // bail out, don't need to do anything\n return;\n }\n\n // handler rejected the connection\n if (\n Value.Check(\n HandshakeErrorCustomHandlerFatalResponseCodes,\n parsedMetadataOrFailureCode,\n )\n ) {\n this.rejectHandshakeRequest(\n session,\n msg.from,\n 'rejected by handshake handler',\n parsedMetadataOrFailureCode,\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n clientId: this.clientId,\n },\n );\n\n return;\n }\n\n // success!\n parsedMetadata = parsedMetadataOrFailureCode;\n }\n\n // 4 connect cases\n // 1. new session\n // we dont have a session and the client is requesting a new one\n // we can create the session as normal\n // 2. client is reconnecting to an existing session but we don't have it\n // reject this handshake, there's nothing we can do to salvage it\n // 3. transparent reconnect (old session exists and is the same as the client wants)\n // assign to old session\n // 4. hard reconnect (oldSession exists but but the client wants a new one)\n // we close the old session and create a new one\n let connectCase:\n | 'new session'\n | 'unknown session'\n | 'transparent reconnection'\n | 'hard reconnection' = 'new session';\n const clientNextExpectedSeq =\n msg.payload.expectedSessionState.nextExpectedSeq;\n const clientNextSentSeq = msg.payload.expectedSessionState.nextSentSeq ?? 0;\n\n if (\n this.options.enableTransparentSessionReconnects &&\n oldSession &&\n oldSession.id === msg.payload.sessionId\n ) {\n connectCase = 'transparent reconnection';\n\n // invariant: ordering must be correct\n const ourNextSeq = oldSession.nextSeq();\n const ourAck = oldSession.ack;\n\n // two incorrect cases where we cannot permit a reconnect:\n // - if the client is about to send a message in the future w.r.t to the server\n // - client.seq > server.ack => nextSentSeq > oldSession.ack\n if (clientNextSentSeq > ourAck) {\n this.rejectHandshakeRequest(\n session,\n msg.from,\n `client is in the future: server wanted next message to be ${ourAck} but client would have sent ${clientNextSentSeq}`,\n 'SESSION_STATE_MISMATCH',\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n transportMessage: msg,\n },\n );\n\n return;\n }\n\n // - if the server is about to send a message in the future w.r.t to the client\n // - server.seq > client.ack => oldSession.nextSeq() > nextExpectedSeq\n if (ourNextSeq > clientNextExpectedSeq) {\n this.rejectHandshakeRequest(\n session,\n msg.from,\n `server is in the future: client wanted next message to be ${clientNextExpectedSeq} but server would have sent ${ourNextSeq}`,\n 'SESSION_STATE_MISMATCH',\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n transportMessage: msg,\n },\n );\n\n return;\n }\n\n // transparent reconnect seems ok, proceed by transitioning old session\n // to not connected\n if (oldSession.state !== SessionState.NoConnection) {\n const noConnectionSession =\n ServerSessionStateGraph.transition.ConnectedToNoConnection(\n oldSession,\n {\n onSessionGracePeriodElapsed: () => {\n this.onSessionGracePeriodElapsed(noConnectionSession);\n },\n },\n );\n\n oldSession = noConnectionSession;\n }\n\n this.updateSession(oldSession);\n } else if (oldSession) {\n connectCase = 'hard reconnection';\n\n // just nuke the old session entirely and proceed as if this was new\n this.log?.info(\n `client is reconnecting to a new session (${msg.payload.sessionId}) with an old session (${oldSession.id}) already existing, closing old session`,\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n sessionId: msg.payload.sessionId,\n },\n );\n this.deleteSession(oldSession);\n oldSession = undefined;\n }\n\n if (!oldSession && (clientNextSentSeq > 0 || clientNextExpectedSeq > 0)) {\n // we don't have a session, but the client is trying to reconnect\n // to an old session. we can't do anything about this, so we reject\n connectCase = 'unknown session';\n\n const rejectionMessage = this.options.enableTransparentSessionReconnects\n ? `client is trying to reconnect to a session the server don't know about: ${msg.payload.sessionId}`\n : `client is attempting a transparent reconnect to a session but the server does not support it: ${msg.payload.sessionId}`;\n\n this.rejectHandshakeRequest(\n session,\n msg.from,\n rejectionMessage,\n 'SESSION_STATE_MISMATCH',\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n transportMessage: msg,\n },\n );\n return;\n }\n\n // from this point on, we're committed to connecting\n const sessionId = msg.payload.sessionId;\n this.log?.info(\n `handshake from ${msg.from} ok (${connectCase}), responding with handshake success`,\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n },\n );\n\n const responseMsg = handshakeResponseMessage({\n from: this.clientId,\n to: msg.from,\n status: {\n ok: true,\n sessionId,\n },\n });\n\n session.sendHandshake(responseMsg);\n\n // transition\n const connectedSession =\n ServerSessionStateGraph.transition.WaitingForHandshakeToConnected(\n session,\n // by this point oldSession is either no connection or we dont have an old session\n oldSession,\n sessionId,\n msg.from,\n msg.tracing,\n {\n onConnectionErrored: (err) => {\n // just log, when we error we also emit close\n const errStr = coerceErrorString(err);\n this.log?.warn(\n `connection to ${connectedSession.to} errored: ${errStr}`,\n connectedSession.loggingMetadata,\n );\n },\n onConnectionClosed: () => {\n this.log?.info(\n `connection to ${connectedSession.to} closed`,\n connectedSession.loggingMetadata,\n );\n this.onConnClosed(connectedSession);\n },\n onMessage: (msg) => this.handleMsg(msg),\n onInvalidMessage: (reason) => {\n this.protocolError({\n type: ProtocolError.MessageOrderingViolated,\n message: reason,\n });\n this.deleteSession(connectedSession);\n },\n },\n gotVersion,\n );\n\n this.sessionHandshakeMetadata.set(connectedSession.to, parsedMetadata);\n this.updateSession(connectedSession);\n this.pendingSessions.delete(session);\n connectedSession.startActiveHeartbeat();\n }\n}\n"],"mappings":"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","names":["msg"]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { C as Connection } from './context-b4aff18f.js';
|
|
2
|
-
import { W as WsLike } from './wslike-e0b32dd5.js';
|
|
3
|
-
|
|
4
|
-
declare class WebSocketConnection extends Connection {
|
|
5
|
-
ws: WsLike;
|
|
6
|
-
constructor(ws: WsLike);
|
|
7
|
-
send(payload: Uint8Array): boolean;
|
|
8
|
-
close(): void;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export { WebSocketConnection as W };
|