@replit/river 0.200.0-rc.6 → 0.200.0-rc.7
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 +2 -2
- package/dist/{chunk-TMNVRR5R.js → chunk-3XKJOFZA.js} +193 -90
- package/dist/chunk-3XKJOFZA.js.map +1 -0
- package/dist/{chunk-IGNFE3QW.js → chunk-BZBEE2VR.js} +2 -2
- package/dist/chunk-BZBEE2VR.js.map +1 -0
- package/dist/{chunk-WE2PAPNC.js → chunk-CXPZSAU4.js} +102 -95
- package/dist/chunk-CXPZSAU4.js.map +1 -0
- package/dist/{chunk-WF3AW2CB.js → chunk-F2E7ILHW.js} +41 -45
- package/dist/chunk-F2E7ILHW.js.map +1 -0
- package/dist/{chunk-NOLXEIRP.js → chunk-U4W75CMT.js} +3 -3
- package/dist/chunk-U4W75CMT.js.map +1 -0
- package/dist/{chunk-GXRIBO3N.js → chunk-VLW5OKZG.js} +2 -2
- package/dist/{chunk-MXU6DJVG.js → chunk-XIJVDPYY.js} +161 -159
- package/dist/chunk-XIJVDPYY.js.map +1 -0
- package/dist/{client-f56a6da3.d.ts → client-829bf1f9.d.ts} +3 -1
- package/dist/{connection-6031a354.d.ts → connection-5e67d641.d.ts} +1 -1
- package/dist/{context-73df8978.d.ts → context-9eabf54f.d.ts} +132 -81
- package/dist/router/index.cjs +162 -160
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +7 -7
- package/dist/router/index.d.ts +7 -7
- package/dist/router/index.js +6 -6
- package/dist/{server-9f31d98f.d.ts → server-d82a2d9b.d.ts} +8 -3
- package/dist/{services-69d72cd5.d.ts → services-6a446f04.d.ts} +157 -139
- package/dist/transport/impls/ws/client.cjs +285 -178
- package/dist/transport/impls/ws/client.cjs.map +1 -1
- package/dist/transport/impls/ws/client.d.cts +3 -3
- package/dist/transport/impls/ws/client.d.ts +3 -3
- package/dist/transport/impls/ws/client.js +7 -7
- package/dist/transport/impls/ws/server.cjs +224 -128
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +3 -3
- package/dist/transport/impls/ws/server.d.ts +3 -3
- package/dist/transport/impls/ws/server.js +5 -5
- package/dist/transport/index.cjs +322 -218
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +3 -3
- package/dist/transport/index.d.ts +3 -3
- package/dist/transport/index.js +7 -7
- package/dist/util/testHelpers.cjs +227 -133
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +15 -12
- package/dist/util/testHelpers.d.ts +15 -12
- package/dist/util/testHelpers.js +41 -43
- package/dist/util/testHelpers.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-IGNFE3QW.js.map +0 -1
- package/dist/chunk-MU25KVV7.js +0 -112
- package/dist/chunk-MU25KVV7.js.map +0 -1
- package/dist/chunk-MXU6DJVG.js.map +0 -1
- package/dist/chunk-NOLXEIRP.js.map +0 -1
- package/dist/chunk-TMNVRR5R.js.map +0 -1
- package/dist/chunk-WE2PAPNC.js.map +0 -1
- package/dist/chunk-WF3AW2CB.js.map +0 -1
- package/dist/connection-11991b13.d.ts +0 -31
- package/dist/transport/impls/uds/client.cjs +0 -1696
- package/dist/transport/impls/uds/client.cjs.map +0 -1
- package/dist/transport/impls/uds/client.d.cts +0 -18
- package/dist/transport/impls/uds/client.d.ts +0 -18
- package/dist/transport/impls/uds/client.js +0 -38
- package/dist/transport/impls/uds/client.js.map +0 -1
- package/dist/transport/impls/uds/server.cjs +0 -1663
- package/dist/transport/impls/uds/server.cjs.map +0 -1
- package/dist/transport/impls/uds/server.d.cts +0 -19
- package/dist/transport/impls/uds/server.d.ts +0 -19
- package/dist/transport/impls/uds/server.js +0 -33
- package/dist/transport/impls/uds/server.js.map +0 -1
- /package/dist/{chunk-GXRIBO3N.js.map → chunk-VLW5OKZG.js.map} +0 -0
package/README.md
CHANGED
|
@@ -92,8 +92,8 @@ export const ExampleService = ServiceSchema.define(
|
|
|
92
92
|
// procedures
|
|
93
93
|
{
|
|
94
94
|
add: Procedure.rpc({
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
requestData: Type.Object({ n: Type.Number() }),
|
|
96
|
+
responseData: Type.Object({ result: Type.Number() }),
|
|
97
97
|
errors: Type.Never(),
|
|
98
98
|
// note that a handler is unique per user RPC
|
|
99
99
|
async handler(ctx, { n }) {
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
createSessionTelemetryInfo,
|
|
4
4
|
generateId,
|
|
5
5
|
isAck
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BZBEE2VR.js";
|
|
7
7
|
import {
|
|
8
8
|
NaiveJsonCodec
|
|
9
9
|
} from "./chunk-4PVU7J25.js";
|
|
@@ -18,7 +18,7 @@ var defaultTransportOptions = {
|
|
|
18
18
|
codec: NaiveJsonCodec
|
|
19
19
|
};
|
|
20
20
|
var defaultConnectionRetryOptions = {
|
|
21
|
-
baseIntervalMs:
|
|
21
|
+
baseIntervalMs: 150,
|
|
22
22
|
maxJitterMs: 200,
|
|
23
23
|
maxBackoffMs: 32e3,
|
|
24
24
|
attemptBudgetCapacity: 5,
|
|
@@ -36,6 +36,7 @@ var defaultServerTransportOptions = {
|
|
|
36
36
|
import { Value } from "@sinclair/typebox/value";
|
|
37
37
|
var SessionState = /* @__PURE__ */ ((SessionState2) => {
|
|
38
38
|
SessionState2["NoConnection"] = "NoConnection";
|
|
39
|
+
SessionState2["BackingOff"] = "BackingOff";
|
|
39
40
|
SessionState2["Connecting"] = "Connecting";
|
|
40
41
|
SessionState2["Handshaking"] = "Handshaking";
|
|
41
42
|
SessionState2["Connected"] = "Connected";
|
|
@@ -93,7 +94,7 @@ var CommonSession = class extends StateMachineState {
|
|
|
93
94
|
from;
|
|
94
95
|
options;
|
|
95
96
|
log;
|
|
96
|
-
constructor(from, options, log) {
|
|
97
|
+
constructor({ from, options, log }) {
|
|
97
98
|
super();
|
|
98
99
|
this.from = from;
|
|
99
100
|
this.options = options;
|
|
@@ -135,8 +136,9 @@ var IdentifiedSession = class extends CommonSession {
|
|
|
135
136
|
*/
|
|
136
137
|
ack;
|
|
137
138
|
sendBuffer;
|
|
138
|
-
constructor(
|
|
139
|
-
|
|
139
|
+
constructor(props) {
|
|
140
|
+
const { id, to, seq, ack, sendBuffer, telemetry, log, protocolVersion } = props;
|
|
141
|
+
super(props);
|
|
140
142
|
this.id = id;
|
|
141
143
|
this.to = to;
|
|
142
144
|
this.seq = seq;
|
|
@@ -192,23 +194,23 @@ var SessionConnecting = class extends IdentifiedSession {
|
|
|
192
194
|
connPromise;
|
|
193
195
|
listeners;
|
|
194
196
|
connectionTimeout;
|
|
195
|
-
constructor(
|
|
196
|
-
super(
|
|
197
|
-
this.connPromise = connPromise;
|
|
198
|
-
this.listeners = listeners;
|
|
197
|
+
constructor(props) {
|
|
198
|
+
super(props);
|
|
199
|
+
this.connPromise = props.connPromise;
|
|
200
|
+
this.listeners = props.listeners;
|
|
199
201
|
this.connectionTimeout = setTimeout(() => {
|
|
200
|
-
listeners.onConnectionTimeout();
|
|
202
|
+
this.listeners.onConnectionTimeout();
|
|
201
203
|
}, this.options.connectionTimeoutMs);
|
|
202
|
-
connPromise.then(
|
|
204
|
+
this.connPromise.then(
|
|
203
205
|
(conn) => {
|
|
204
206
|
if (this._isConsumed)
|
|
205
207
|
return;
|
|
206
|
-
listeners.onConnectionEstablished(conn);
|
|
208
|
+
this.listeners.onConnectionEstablished(conn);
|
|
207
209
|
},
|
|
208
210
|
(err) => {
|
|
209
211
|
if (this._isConsumed)
|
|
210
212
|
return;
|
|
211
|
-
listeners.onConnectionFailed(err);
|
|
213
|
+
this.listeners.onConnectionFailed(err);
|
|
212
214
|
}
|
|
213
215
|
);
|
|
214
216
|
}
|
|
@@ -234,9 +236,9 @@ var SessionNoConnection = class extends IdentifiedSession {
|
|
|
234
236
|
state = "NoConnection" /* NoConnection */;
|
|
235
237
|
listeners;
|
|
236
238
|
gracePeriodTimeout;
|
|
237
|
-
constructor(
|
|
238
|
-
super(
|
|
239
|
-
this.listeners = listeners;
|
|
239
|
+
constructor(props) {
|
|
240
|
+
super(props);
|
|
241
|
+
this.listeners = props.listeners;
|
|
240
242
|
this.gracePeriodTimeout = setTimeout(() => {
|
|
241
243
|
this.listeners.onSessionGracePeriodElapsed();
|
|
242
244
|
}, this.options.sessionDisconnectGraceMs);
|
|
@@ -259,16 +261,16 @@ var SessionWaitingForHandshake = class extends CommonSession {
|
|
|
259
261
|
conn;
|
|
260
262
|
listeners;
|
|
261
263
|
handshakeTimeout;
|
|
262
|
-
constructor(
|
|
263
|
-
super(
|
|
264
|
-
this.conn = conn;
|
|
265
|
-
this.listeners = listeners;
|
|
264
|
+
constructor(props) {
|
|
265
|
+
super(props);
|
|
266
|
+
this.conn = props.conn;
|
|
267
|
+
this.listeners = props.listeners;
|
|
266
268
|
this.handshakeTimeout = setTimeout(() => {
|
|
267
|
-
listeners.onHandshakeTimeout();
|
|
269
|
+
this.listeners.onHandshakeTimeout();
|
|
268
270
|
}, this.options.handshakeTimeoutMs);
|
|
269
271
|
this.conn.addDataListener(this.onHandshakeData);
|
|
270
|
-
this.conn.addErrorListener(listeners.onConnectionErrored);
|
|
271
|
-
this.conn.addCloseListener(listeners.onConnectionClosed);
|
|
272
|
+
this.conn.addErrorListener(this.listeners.onConnectionErrored);
|
|
273
|
+
this.conn.addCloseListener(this.listeners.onConnectionClosed);
|
|
272
274
|
}
|
|
273
275
|
onHandshakeData = (msg) => {
|
|
274
276
|
const parsedMsg = this.parseMsg(msg);
|
|
@@ -305,16 +307,16 @@ var SessionHandshaking = class extends IdentifiedSession {
|
|
|
305
307
|
conn;
|
|
306
308
|
listeners;
|
|
307
309
|
handshakeTimeout;
|
|
308
|
-
constructor(
|
|
309
|
-
super(
|
|
310
|
-
this.conn = conn;
|
|
311
|
-
this.listeners = listeners;
|
|
310
|
+
constructor(props) {
|
|
311
|
+
super(props);
|
|
312
|
+
this.conn = props.conn;
|
|
313
|
+
this.listeners = props.listeners;
|
|
312
314
|
this.handshakeTimeout = setTimeout(() => {
|
|
313
|
-
listeners.onHandshakeTimeout();
|
|
315
|
+
this.listeners.onHandshakeTimeout();
|
|
314
316
|
}, this.options.handshakeTimeoutMs);
|
|
315
317
|
this.conn.addDataListener(this.onHandshakeData);
|
|
316
|
-
this.conn.addErrorListener(listeners.onConnectionErrored);
|
|
317
|
-
this.conn.addCloseListener(listeners.onConnectionClosed);
|
|
318
|
+
this.conn.addErrorListener(this.listeners.onConnectionErrored);
|
|
319
|
+
this.conn.addCloseListener(this.listeners.onConnectionClosed);
|
|
318
320
|
}
|
|
319
321
|
onHandshakeData = (msg) => {
|
|
320
322
|
const parsedMsg = this.parseMsg(msg);
|
|
@@ -348,9 +350,7 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
348
350
|
listeners;
|
|
349
351
|
heartbeatHandle;
|
|
350
352
|
heartbeatMisses = 0;
|
|
351
|
-
|
|
352
|
-
return this.heartbeatHandle !== void 0;
|
|
353
|
-
}
|
|
353
|
+
isActivelyHeartbeating;
|
|
354
354
|
updateBookkeeping(ack, seq) {
|
|
355
355
|
this.sendBuffer = this.sendBuffer.filter((unacked) => unacked.seq >= ack);
|
|
356
356
|
this.ack = seq + 1;
|
|
@@ -362,13 +362,13 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
362
362
|
this.conn.send(this.options.codec.toBuffer(constructedMsg));
|
|
363
363
|
return constructedMsg.id;
|
|
364
364
|
}
|
|
365
|
-
constructor(
|
|
366
|
-
super(
|
|
367
|
-
this.conn = conn;
|
|
368
|
-
this.listeners = listeners;
|
|
365
|
+
constructor(props) {
|
|
366
|
+
super(props);
|
|
367
|
+
this.conn = props.conn;
|
|
368
|
+
this.listeners = props.listeners;
|
|
369
369
|
this.conn.addDataListener(this.onMessageData);
|
|
370
|
-
this.conn.addCloseListener(listeners.onConnectionClosed);
|
|
371
|
-
this.conn.addErrorListener(listeners.onConnectionErrored);
|
|
370
|
+
this.conn.addCloseListener(this.listeners.onConnectionClosed);
|
|
371
|
+
this.conn.addErrorListener(this.listeners.onConnectionErrored);
|
|
372
372
|
if (this.sendBuffer.length > 0) {
|
|
373
373
|
this.log?.debug(
|
|
374
374
|
`sending ${this.sendBuffer.length} buffered messages`,
|
|
@@ -376,10 +376,9 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
376
376
|
);
|
|
377
377
|
}
|
|
378
378
|
for (const msg of this.sendBuffer) {
|
|
379
|
-
conn.send(this.options.codec.toBuffer(msg));
|
|
379
|
+
this.conn.send(this.options.codec.toBuffer(msg));
|
|
380
380
|
}
|
|
381
|
-
|
|
382
|
-
startActiveHeartbeat() {
|
|
381
|
+
this.isActivelyHeartbeating = false;
|
|
383
382
|
this.heartbeatHandle = setInterval(() => {
|
|
384
383
|
const misses = this.heartbeatMisses;
|
|
385
384
|
const missDuration = misses * this.options.heartbeatIntervalMs;
|
|
@@ -394,11 +393,17 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
394
393
|
this.heartbeatHandle = void 0;
|
|
395
394
|
return;
|
|
396
395
|
}
|
|
397
|
-
this.
|
|
396
|
+
if (this.isActivelyHeartbeating) {
|
|
397
|
+
this.sendHeartbeat();
|
|
398
|
+
}
|
|
398
399
|
this.heartbeatMisses++;
|
|
399
400
|
}, this.options.heartbeatIntervalMs);
|
|
400
401
|
}
|
|
402
|
+
startActiveHeartbeat() {
|
|
403
|
+
this.isActivelyHeartbeating = true;
|
|
404
|
+
}
|
|
401
405
|
sendHeartbeat() {
|
|
406
|
+
this.log?.debug("sending heartbeat", this.loggingMetadata);
|
|
402
407
|
this.send({
|
|
403
408
|
streamId: "heartbeat",
|
|
404
409
|
controlFlags: 1 /* AckBit */,
|
|
@@ -466,54 +471,78 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
466
471
|
}
|
|
467
472
|
};
|
|
468
473
|
|
|
474
|
+
// transport/sessionStateMachine/SessionBackingOff.ts
|
|
475
|
+
var SessionBackingOff = class extends IdentifiedSession {
|
|
476
|
+
state = "BackingOff" /* BackingOff */;
|
|
477
|
+
listeners;
|
|
478
|
+
backoffTimeout;
|
|
479
|
+
constructor(props) {
|
|
480
|
+
super(props);
|
|
481
|
+
this.listeners = props.listeners;
|
|
482
|
+
this.backoffTimeout = setTimeout(() => {
|
|
483
|
+
this.listeners.onBackoffFinished();
|
|
484
|
+
}, props.backoffMs);
|
|
485
|
+
}
|
|
486
|
+
_handleClose() {
|
|
487
|
+
super._handleClose();
|
|
488
|
+
}
|
|
489
|
+
_handleStateExit() {
|
|
490
|
+
super._handleStateExit();
|
|
491
|
+
if (this.backoffTimeout) {
|
|
492
|
+
clearTimeout(this.backoffTimeout);
|
|
493
|
+
this.backoffTimeout = void 0;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
};
|
|
497
|
+
|
|
469
498
|
// transport/sessionStateMachine/transitions.ts
|
|
470
499
|
function inheritSharedSession(session) {
|
|
471
|
-
return
|
|
472
|
-
session.id,
|
|
473
|
-
session.from,
|
|
474
|
-
session.to,
|
|
475
|
-
session.seq,
|
|
476
|
-
session.ack,
|
|
477
|
-
session.sendBuffer,
|
|
478
|
-
session.telemetry,
|
|
479
|
-
session.options,
|
|
480
|
-
session.
|
|
481
|
-
session.
|
|
482
|
-
|
|
500
|
+
return {
|
|
501
|
+
id: session.id,
|
|
502
|
+
from: session.from,
|
|
503
|
+
to: session.to,
|
|
504
|
+
seq: session.seq,
|
|
505
|
+
ack: session.ack,
|
|
506
|
+
sendBuffer: session.sendBuffer,
|
|
507
|
+
telemetry: session.telemetry,
|
|
508
|
+
options: session.options,
|
|
509
|
+
log: session.log,
|
|
510
|
+
protocolVersion: session.protocolVersion
|
|
511
|
+
};
|
|
483
512
|
}
|
|
484
513
|
var SessionStateGraph = {
|
|
485
514
|
entrypoints: {
|
|
486
|
-
NoConnection(to, from, listeners, options, protocolVersion, log) {
|
|
515
|
+
NoConnection: (to, from, listeners, options, protocolVersion, log) => {
|
|
487
516
|
const id = `session-${generateId()}`;
|
|
488
517
|
const telemetry = createSessionTelemetryInfo(id, to, from);
|
|
489
518
|
const sendBuffer = [];
|
|
490
|
-
const session = new SessionNoConnection(
|
|
519
|
+
const session = new SessionNoConnection({
|
|
491
520
|
listeners,
|
|
492
521
|
id,
|
|
493
522
|
from,
|
|
494
523
|
to,
|
|
495
|
-
0,
|
|
496
|
-
0,
|
|
524
|
+
seq: 0,
|
|
525
|
+
ack: 0,
|
|
497
526
|
sendBuffer,
|
|
498
527
|
telemetry,
|
|
499
528
|
options,
|
|
500
529
|
protocolVersion,
|
|
501
530
|
log
|
|
502
|
-
);
|
|
531
|
+
});
|
|
503
532
|
session.log?.info(`session ${session.id} created in NoConnection state`, {
|
|
504
533
|
...session.loggingMetadata,
|
|
505
534
|
tags: ["state-transition"]
|
|
506
535
|
});
|
|
507
536
|
return session;
|
|
508
537
|
},
|
|
509
|
-
WaitingForHandshake(from, conn, listeners, options, log) {
|
|
510
|
-
const session = new SessionWaitingForHandshake(
|
|
538
|
+
WaitingForHandshake: (from, conn, listeners, options, log) => {
|
|
539
|
+
const session = new SessionWaitingForHandshake({
|
|
511
540
|
conn,
|
|
512
541
|
listeners,
|
|
513
542
|
from,
|
|
514
543
|
options,
|
|
515
544
|
log
|
|
516
|
-
);
|
|
545
|
+
});
|
|
517
546
|
session.log?.info(`session created in WaitingForHandshake state`, {
|
|
518
547
|
...session.loggingMetadata,
|
|
519
548
|
tags: ["state-transition"]
|
|
@@ -525,16 +554,33 @@ var SessionStateGraph = {
|
|
|
525
554
|
// After a session is transitioned, any usage of the old session will throw.
|
|
526
555
|
transition: {
|
|
527
556
|
// happy path transitions
|
|
528
|
-
|
|
557
|
+
NoConnectionToBackingOff: (oldSession, backoffMs, listeners) => {
|
|
529
558
|
const carriedState = inheritSharedSession(oldSession);
|
|
530
559
|
oldSession._handleStateExit();
|
|
531
|
-
const session = new
|
|
532
|
-
|
|
560
|
+
const session = new SessionBackingOff({
|
|
561
|
+
backoffMs,
|
|
533
562
|
listeners,
|
|
534
563
|
...carriedState
|
|
564
|
+
});
|
|
565
|
+
session.log?.info(
|
|
566
|
+
`session ${session.id} transition from NoConnection to BackingOff`,
|
|
567
|
+
{
|
|
568
|
+
...session.loggingMetadata,
|
|
569
|
+
tags: ["state-transition"]
|
|
570
|
+
}
|
|
535
571
|
);
|
|
572
|
+
return session;
|
|
573
|
+
},
|
|
574
|
+
BackingOffToConnecting: (oldSession, connPromise, listeners) => {
|
|
575
|
+
const carriedState = inheritSharedSession(oldSession);
|
|
576
|
+
oldSession._handleStateExit();
|
|
577
|
+
const session = new SessionConnecting({
|
|
578
|
+
connPromise,
|
|
579
|
+
listeners,
|
|
580
|
+
...carriedState
|
|
581
|
+
});
|
|
536
582
|
session.log?.info(
|
|
537
|
-
`session ${session.id} transition from
|
|
583
|
+
`session ${session.id} transition from BackingOff to Connecting`,
|
|
538
584
|
{
|
|
539
585
|
...session.loggingMetadata,
|
|
540
586
|
tags: ["state-transition"]
|
|
@@ -542,10 +588,14 @@ var SessionStateGraph = {
|
|
|
542
588
|
);
|
|
543
589
|
return session;
|
|
544
590
|
},
|
|
545
|
-
ConnectingToHandshaking(oldSession, conn, listeners) {
|
|
591
|
+
ConnectingToHandshaking: (oldSession, conn, listeners) => {
|
|
546
592
|
const carriedState = inheritSharedSession(oldSession);
|
|
547
593
|
oldSession._handleStateExit();
|
|
548
|
-
const session = new SessionHandshaking(
|
|
594
|
+
const session = new SessionHandshaking({
|
|
595
|
+
conn,
|
|
596
|
+
listeners,
|
|
597
|
+
...carriedState
|
|
598
|
+
});
|
|
549
599
|
session.log?.info(
|
|
550
600
|
`session ${session.id} transition from Connecting to Handshaking`,
|
|
551
601
|
{
|
|
@@ -555,11 +605,15 @@ var SessionStateGraph = {
|
|
|
555
605
|
);
|
|
556
606
|
return session;
|
|
557
607
|
},
|
|
558
|
-
HandshakingToConnected(oldSession, listeners) {
|
|
608
|
+
HandshakingToConnected: (oldSession, listeners) => {
|
|
559
609
|
const carriedState = inheritSharedSession(oldSession);
|
|
560
610
|
const conn = oldSession.conn;
|
|
561
611
|
oldSession._handleStateExit();
|
|
562
|
-
const session = new SessionConnected(
|
|
612
|
+
const session = new SessionConnected({
|
|
613
|
+
conn,
|
|
614
|
+
listeners,
|
|
615
|
+
...carriedState
|
|
616
|
+
});
|
|
563
617
|
session.log?.info(
|
|
564
618
|
`session ${session.id} transition from Handshaking to Connected`,
|
|
565
619
|
{
|
|
@@ -569,7 +623,7 @@ var SessionStateGraph = {
|
|
|
569
623
|
);
|
|
570
624
|
return session;
|
|
571
625
|
},
|
|
572
|
-
WaitingForHandshakeToConnected(pendingSession, oldSession, sessionId, to, propagationCtx, listeners, protocolVersion) {
|
|
626
|
+
WaitingForHandshakeToConnected: (pendingSession, oldSession, sessionId, to, propagationCtx, listeners, protocolVersion) => {
|
|
573
627
|
const conn = pendingSession.conn;
|
|
574
628
|
const { from, options } = pendingSession;
|
|
575
629
|
const carriedState = oldSession ? (
|
|
@@ -577,22 +631,31 @@ var SessionStateGraph = {
|
|
|
577
631
|
inheritSharedSession(oldSession)
|
|
578
632
|
) : (
|
|
579
633
|
// old session does not exist, create new state
|
|
580
|
-
|
|
581
|
-
sessionId,
|
|
634
|
+
{
|
|
635
|
+
id: sessionId,
|
|
582
636
|
from,
|
|
583
637
|
to,
|
|
584
|
-
0,
|
|
585
|
-
0,
|
|
586
|
-
[],
|
|
587
|
-
createSessionTelemetryInfo(
|
|
638
|
+
seq: 0,
|
|
639
|
+
ack: 0,
|
|
640
|
+
sendBuffer: [],
|
|
641
|
+
telemetry: createSessionTelemetryInfo(
|
|
642
|
+
sessionId,
|
|
643
|
+
to,
|
|
644
|
+
from,
|
|
645
|
+
propagationCtx
|
|
646
|
+
),
|
|
588
647
|
options,
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
648
|
+
log: pendingSession.log,
|
|
649
|
+
protocolVersion
|
|
650
|
+
}
|
|
592
651
|
);
|
|
593
652
|
pendingSession._handleStateExit();
|
|
594
653
|
oldSession?._handleStateExit();
|
|
595
|
-
const session = new SessionConnected(
|
|
654
|
+
const session = new SessionConnected({
|
|
655
|
+
conn,
|
|
656
|
+
listeners,
|
|
657
|
+
...carriedState
|
|
658
|
+
});
|
|
596
659
|
session.log?.info(
|
|
597
660
|
`session ${session.id} transition from WaitingForHandshake to Connected`,
|
|
598
661
|
{
|
|
@@ -603,11 +666,24 @@ var SessionStateGraph = {
|
|
|
603
666
|
return session;
|
|
604
667
|
},
|
|
605
668
|
// disconnect paths
|
|
606
|
-
|
|
669
|
+
BackingOffToNoConnection: (oldSession, listeners) => {
|
|
670
|
+
const carriedState = inheritSharedSession(oldSession);
|
|
671
|
+
oldSession._handleStateExit();
|
|
672
|
+
const session = new SessionNoConnection({ listeners, ...carriedState });
|
|
673
|
+
session.log?.info(
|
|
674
|
+
`session ${session.id} transition from BackingOff to NoConnection`,
|
|
675
|
+
{
|
|
676
|
+
...session.loggingMetadata,
|
|
677
|
+
tags: ["state-transition"]
|
|
678
|
+
}
|
|
679
|
+
);
|
|
680
|
+
return session;
|
|
681
|
+
},
|
|
682
|
+
ConnectingToNoConnection: (oldSession, listeners) => {
|
|
607
683
|
const carriedState = inheritSharedSession(oldSession);
|
|
608
684
|
oldSession.bestEffortClose();
|
|
609
685
|
oldSession._handleStateExit();
|
|
610
|
-
const session = new SessionNoConnection(listeners, ...carriedState);
|
|
686
|
+
const session = new SessionNoConnection({ listeners, ...carriedState });
|
|
611
687
|
session.log?.info(
|
|
612
688
|
`session ${session.id} transition from Connecting to NoConnection`,
|
|
613
689
|
{
|
|
@@ -617,11 +693,11 @@ var SessionStateGraph = {
|
|
|
617
693
|
);
|
|
618
694
|
return session;
|
|
619
695
|
},
|
|
620
|
-
HandshakingToNoConnection(oldSession, listeners) {
|
|
696
|
+
HandshakingToNoConnection: (oldSession, listeners) => {
|
|
621
697
|
const carriedState = inheritSharedSession(oldSession);
|
|
622
698
|
oldSession.conn.close();
|
|
623
699
|
oldSession._handleStateExit();
|
|
624
|
-
const session = new SessionNoConnection(listeners, ...carriedState);
|
|
700
|
+
const session = new SessionNoConnection({ listeners, ...carriedState });
|
|
625
701
|
session.log?.info(
|
|
626
702
|
`session ${session.id} transition from Handshaking to NoConnection`,
|
|
627
703
|
{
|
|
@@ -631,11 +707,11 @@ var SessionStateGraph = {
|
|
|
631
707
|
);
|
|
632
708
|
return session;
|
|
633
709
|
},
|
|
634
|
-
ConnectedToNoConnection(oldSession, listeners) {
|
|
710
|
+
ConnectedToNoConnection: (oldSession, listeners) => {
|
|
635
711
|
const carriedState = inheritSharedSession(oldSession);
|
|
636
712
|
oldSession.conn.close();
|
|
637
713
|
oldSession._handleStateExit();
|
|
638
|
-
const session = new SessionNoConnection(listeners, ...carriedState);
|
|
714
|
+
const session = new SessionNoConnection({ listeners, ...carriedState });
|
|
639
715
|
session.log?.info(
|
|
640
716
|
`session ${session.id} transition from Connected to NoConnection`,
|
|
641
717
|
{
|
|
@@ -647,12 +723,39 @@ var SessionStateGraph = {
|
|
|
647
723
|
}
|
|
648
724
|
}
|
|
649
725
|
};
|
|
726
|
+
var transitions = SessionStateGraph.transition;
|
|
727
|
+
var ClientSessionStateGraph = {
|
|
728
|
+
entrypoint: SessionStateGraph.entrypoints.NoConnection,
|
|
729
|
+
transition: {
|
|
730
|
+
// happy paths
|
|
731
|
+
NoConnectionToBackingOff: transitions.NoConnectionToBackingOff,
|
|
732
|
+
BackingOffToConnecting: transitions.BackingOffToConnecting,
|
|
733
|
+
ConnectingToHandshaking: transitions.ConnectingToHandshaking,
|
|
734
|
+
HandshakingToConnected: transitions.HandshakingToConnected,
|
|
735
|
+
// disconnect paths
|
|
736
|
+
BackingOffToNoConnection: transitions.BackingOffToNoConnection,
|
|
737
|
+
ConnectingToNoConnection: transitions.ConnectingToNoConnection,
|
|
738
|
+
HandshakingToNoConnection: transitions.HandshakingToNoConnection,
|
|
739
|
+
ConnectedToNoConnection: transitions.ConnectedToNoConnection
|
|
740
|
+
}
|
|
741
|
+
};
|
|
742
|
+
var ServerSessionStateGraph = {
|
|
743
|
+
entrypoint: SessionStateGraph.entrypoints.WaitingForHandshake,
|
|
744
|
+
transition: {
|
|
745
|
+
// happy paths
|
|
746
|
+
WaitingForHandshakeToConnected: transitions.WaitingForHandshakeToConnected,
|
|
747
|
+
// disconnect paths
|
|
748
|
+
ConnectedToNoConnection: transitions.ConnectedToNoConnection
|
|
749
|
+
}
|
|
750
|
+
};
|
|
650
751
|
|
|
651
752
|
export {
|
|
652
753
|
defaultTransportOptions,
|
|
653
754
|
defaultClientTransportOptions,
|
|
654
755
|
defaultServerTransportOptions,
|
|
655
756
|
SessionState,
|
|
656
|
-
SessionStateGraph
|
|
757
|
+
SessionStateGraph,
|
|
758
|
+
ClientSessionStateGraph,
|
|
759
|
+
ServerSessionStateGraph
|
|
657
760
|
};
|
|
658
|
-
//# sourceMappingURL=chunk-
|
|
761
|
+
//# sourceMappingURL=chunk-3XKJOFZA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../transport/options.ts","../transport/sessionStateMachine/common.ts","../transport/sessionStateMachine/SessionConnecting.ts","../transport/sessionStateMachine/SessionNoConnection.ts","../transport/sessionStateMachine/SessionWaitingForHandshake.ts","../transport/sessionStateMachine/SessionHandshaking.ts","../transport/sessionStateMachine/SessionConnected.ts","../transport/sessionStateMachine/SessionBackingOff.ts","../transport/sessionStateMachine/transitions.ts"],"sourcesContent":["import { NaiveJsonCodec } from '../codec/json';\nimport { ConnectionRetryOptions } from './rateLimit';\nimport { SessionOptions } from './sessionStateMachine/common';\n\nexport type TransportOptions = SessionOptions;\n\nexport type ProvidedTransportOptions = Partial<TransportOptions>;\n\nexport const defaultTransportOptions: TransportOptions = {\n heartbeatIntervalMs: 1_000,\n heartbeatsUntilDead: 2,\n sessionDisconnectGraceMs: 5_000,\n connectionTimeoutMs: 2_000,\n handshakeTimeoutMs: 1_000,\n codec: NaiveJsonCodec,\n};\n\nexport type ClientTransportOptions = TransportOptions & ConnectionRetryOptions;\n\nexport type ProvidedClientTransportOptions = Partial<ClientTransportOptions>;\n\nconst defaultConnectionRetryOptions: ConnectionRetryOptions = {\n baseIntervalMs: 150,\n maxJitterMs: 200,\n maxBackoffMs: 32_000,\n attemptBudgetCapacity: 5,\n budgetRestoreIntervalMs: 200,\n};\n\nexport const defaultClientTransportOptions: ClientTransportOptions = {\n ...defaultTransportOptions,\n ...defaultConnectionRetryOptions,\n};\n\nexport type ServerTransportOptions = TransportOptions;\n\nexport type ProvidedServerTransportOptions = Partial<ServerTransportOptions>;\n\nexport const defaultServerTransportOptions: ServerTransportOptions = {\n ...defaultTransportOptions,\n};\n","import { Logger, MessageMetadata } from '../../logging';\nimport { TelemetryInfo } from '../../tracing';\nimport {\n OpaqueTransportMessage,\n OpaqueTransportMessageSchema,\n PartialTransportMessage,\n TransportClientId,\n TransportMessage,\n} from '../message';\nimport { Value } from '@sinclair/typebox/value';\nimport { Codec } from '../../codec';\nimport { generateId } from '../id';\n\nexport const enum SessionState {\n NoConnection = 'NoConnection',\n BackingOff = 'BackingOff',\n Connecting = 'Connecting',\n Handshaking = 'Handshaking',\n Connected = 'Connected',\n WaitingForHandshake = 'WaitingForHandshake',\n}\n\nexport const ERR_CONSUMED = `session state has been consumed and is no longer valid`;\n\nabstract class StateMachineState {\n abstract readonly state: SessionState;\n\n /*\n * Whether this state has been consumed\n * and we've moved on to another state\n */\n _isConsumed: boolean;\n\n // called when we're transitioning to another state\n // note that this is internal and should not be called directly\n // by consumers, the proxy will call this when the state is consumed\n // and we're transitioning to another state\n abstract _handleStateExit(): void;\n\n // called when we exit the state machine entirely\n // note that this is internal and should not be called directly\n // by consumers, the proxy will call this when .close is closed\n abstract _handleClose(): void;\n\n close(): void {\n this._handleClose();\n }\n\n constructor() {\n this._isConsumed = false;\n\n // proxy helps us prevent access to properties after the state has been consumed\n // e.g. if we hold a reference to a state and try to access it after it's been consumed\n // we intercept the access and throw an error to help catch bugs\n return new Proxy(this, {\n get(target, prop) {\n // always allow access to _isConsumed, id, and state\n if (prop === '_isConsumed' || prop === 'id' || prop === 'state') {\n return Reflect.get(target, prop);\n }\n\n // modify _handleStateExit\n if (prop === '_handleStateExit') {\n return () => {\n target._isConsumed = true;\n target._handleStateExit();\n };\n }\n\n // modify _handleClose\n if (prop === '_handleClose') {\n return () => {\n target._handleStateExit();\n target._handleClose();\n };\n }\n\n if (target._isConsumed) {\n throw new Error(\n `${ERR_CONSUMED}: getting ${prop.toString()} on consumed state`,\n );\n }\n\n return Reflect.get(target, prop);\n },\n set(target, prop, value) {\n if (target._isConsumed) {\n throw new Error(\n `${ERR_CONSUMED}: setting ${prop.toString()} on consumed state`,\n );\n }\n\n return Reflect.set(target, prop, value);\n },\n });\n }\n}\n\nexport interface SessionOptions {\n /**\n * Frequency at which to send heartbeat acknowledgements\n */\n heartbeatIntervalMs: number;\n /**\n * Number of elapsed heartbeats without a response message before we consider\n * the connection dead.\n */\n heartbeatsUntilDead: number;\n /**\n * Duration to wait between connection disconnect and actual session disconnect\n */\n sessionDisconnectGraceMs: number;\n /**\n * Connection timeout in milliseconds\n */\n connectionTimeoutMs: number;\n /**\n * Handshake timeout in milliseconds\n */\n handshakeTimeoutMs: number;\n /**\n * The codec to use for encoding/decoding messages over the wire\n */\n codec: Codec;\n}\n\n// all session states have a from and options\nexport interface CommonSessionProps {\n from: TransportClientId;\n options: SessionOptions;\n log: Logger | undefined;\n}\n\nexport abstract class CommonSession extends StateMachineState {\n readonly from: TransportClientId;\n readonly options: SessionOptions;\n\n log?: Logger;\n abstract get loggingMetadata(): MessageMetadata;\n\n constructor({ from, options, log }: CommonSessionProps) {\n super();\n this.from = from;\n this.options = options;\n this.log = log;\n }\n\n parseMsg(msg: Uint8Array): OpaqueTransportMessage | null {\n const parsedMsg = this.options.codec.fromBuffer(msg);\n\n if (parsedMsg === null) {\n const decodedBuffer = new TextDecoder().decode(Buffer.from(msg));\n this.log?.error(\n `received malformed msg: ${decodedBuffer}`,\n this.loggingMetadata,\n );\n return null;\n }\n\n if (!Value.Check(OpaqueTransportMessageSchema, parsedMsg)) {\n this.log?.error(`received invalid msg: ${JSON.stringify(parsedMsg)}`, {\n ...this.loggingMetadata,\n validationErrors: [\n ...Value.Errors(OpaqueTransportMessageSchema, parsedMsg),\n ],\n });\n\n return null;\n }\n\n return parsedMsg;\n }\n}\n\nexport type InheritedProperties = Pick<\n IdentifiedSession,\n 'id' | 'from' | 'to' | 'seq' | 'ack' | 'sendBuffer' | 'telemetry' | 'options'\n>;\n\nexport type SessionId = string;\n\n// all sessions where we know the other side's client id\nexport interface IdentifiedSessionProps extends CommonSessionProps {\n id: SessionId;\n to: TransportClientId;\n seq: number;\n ack: number;\n sendBuffer: Array<OpaqueTransportMessage>;\n telemetry: TelemetryInfo;\n protocolVersion: string;\n}\n\nexport abstract class IdentifiedSession extends CommonSession {\n readonly id: SessionId;\n readonly telemetry: TelemetryInfo;\n readonly to: TransportClientId;\n readonly protocolVersion: string;\n\n /**\n * Index of the message we will send next (excluding handshake)\n */\n seq: number;\n\n /**\n * Number of unique messages we've received this session (excluding handshake)\n */\n ack: number;\n sendBuffer: Array<OpaqueTransportMessage>;\n\n constructor(props: IdentifiedSessionProps) {\n const { id, to, seq, ack, sendBuffer, telemetry, log, protocolVersion } =\n props;\n super(props);\n this.id = id;\n this.to = to;\n this.seq = seq;\n this.ack = ack;\n this.sendBuffer = sendBuffer;\n this.telemetry = telemetry;\n this.log = log;\n this.protocolVersion = protocolVersion;\n }\n\n get loggingMetadata(): MessageMetadata {\n const spanContext = this.telemetry.span.spanContext();\n\n return {\n clientId: this.from,\n connectedTo: this.to,\n sessionId: this.id,\n telemetry: {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n },\n };\n }\n\n constructMsg<Payload>(\n partialMsg: PartialTransportMessage<Payload>,\n ): TransportMessage<Payload> {\n const msg = {\n ...partialMsg,\n id: generateId(),\n to: this.to,\n from: this.from,\n seq: this.seq,\n ack: this.ack,\n };\n\n this.seq++;\n return msg;\n }\n\n nextSeq(): number {\n return this.sendBuffer.length > 0 ? this.sendBuffer[0].seq : this.seq;\n }\n\n send(msg: PartialTransportMessage): string {\n const constructedMsg = this.constructMsg(msg);\n this.sendBuffer.push(constructedMsg);\n return constructedMsg.id;\n }\n\n _handleStateExit(): void {\n // noop\n }\n\n _handleClose(): void {\n // zero out the buffer\n this.sendBuffer.length = 0;\n this.telemetry.span.end();\n }\n}\n","import { Connection } from '../connection';\nimport {\n IdentifiedSession,\n IdentifiedSessionProps,\n SessionState,\n} from './common';\n\nexport interface SessionConnectingListeners {\n onConnectionEstablished: (conn: Connection) => void;\n onConnectionFailed: (err: unknown) => void;\n\n // timeout related\n onConnectionTimeout: () => void;\n}\n\nexport interface SessionConnectingProps<ConnType extends Connection>\n extends IdentifiedSessionProps {\n connPromise: Promise<ConnType>;\n listeners: SessionConnectingListeners;\n}\n\n/*\n * A session that is connecting but we don't have access to the raw connection yet.\n * See transitions.ts for valid transitions.\n */\nexport class SessionConnecting<\n ConnType extends Connection,\n> extends IdentifiedSession {\n readonly state = SessionState.Connecting as const;\n connPromise: Promise<ConnType>;\n listeners: SessionConnectingListeners;\n\n connectionTimeout?: ReturnType<typeof setTimeout>;\n\n constructor(props: SessionConnectingProps<ConnType>) {\n super(props);\n this.connPromise = props.connPromise;\n this.listeners = props.listeners;\n\n this.connectionTimeout = setTimeout(() => {\n this.listeners.onConnectionTimeout();\n }, this.options.connectionTimeoutMs);\n\n this.connPromise.then(\n (conn) => {\n if (this._isConsumed) return;\n this.listeners.onConnectionEstablished(conn);\n },\n (err) => {\n if (this._isConsumed) return;\n this.listeners.onConnectionFailed(err);\n },\n );\n }\n\n // close a pending connection if it resolves, ignore errors if the promise\n // ends up rejected anyways\n bestEffortClose() {\n void this.connPromise\n .then((conn) => conn.close())\n .catch(() => {\n // ignore errors\n });\n }\n\n _handleStateExit(): void {\n super._handleStateExit();\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n\n _handleClose(): void {\n // close the pending connection if it resolves\n this.bestEffortClose();\n super._handleClose();\n }\n}\n","import {\n IdentifiedSession,\n IdentifiedSessionProps,\n SessionState,\n} from './common';\n\nexport interface SessionNoConnectionListeners {\n // timeout related\n onSessionGracePeriodElapsed: () => void;\n}\n\nexport interface SessionNoConnectionProps extends IdentifiedSessionProps {\n listeners: SessionNoConnectionListeners;\n}\n\n/*\n * A session that is not connected and cannot send or receive messages.\n * See transitions.ts for valid transitions.\n */\nexport class SessionNoConnection extends IdentifiedSession {\n readonly state = SessionState.NoConnection as const;\n listeners: SessionNoConnectionListeners;\n\n gracePeriodTimeout?: ReturnType<typeof setTimeout>;\n\n constructor(props: SessionNoConnectionProps) {\n super(props);\n this.listeners = props.listeners;\n this.gracePeriodTimeout = setTimeout(() => {\n this.listeners.onSessionGracePeriodElapsed();\n }, this.options.sessionDisconnectGraceMs);\n }\n\n _handleClose(): void {\n super._handleClose();\n }\n\n _handleStateExit(): void {\n super._handleStateExit();\n\n if (this.gracePeriodTimeout) {\n clearTimeout(this.gracePeriodTimeout);\n this.gracePeriodTimeout = undefined;\n }\n }\n}\n","import { MessageMetadata } from '../../logging';\nimport { Connection } from '../connection';\nimport { TransportMessage } from '../message';\nimport { SessionHandshakingListeners } from './SessionHandshaking';\nimport { CommonSession, CommonSessionProps, SessionState } from './common';\n\nexport interface SessionWaitingForHandshakeProps<ConnType extends Connection>\n extends CommonSessionProps {\n conn: ConnType;\n listeners: SessionHandshakingListeners;\n}\n\n/*\n * Server-side session that has a connection but is waiting for the client to identify itself.\n * See transitions.ts for valid transitions.\n */\nexport class SessionWaitingForHandshake<\n ConnType extends Connection,\n> extends CommonSession {\n readonly state = SessionState.WaitingForHandshake as const;\n conn: ConnType;\n listeners: SessionHandshakingListeners;\n\n handshakeTimeout?: ReturnType<typeof setTimeout>;\n\n constructor(props: SessionWaitingForHandshakeProps<ConnType>) {\n super(props);\n this.conn = props.conn;\n this.listeners = props.listeners;\n\n this.handshakeTimeout = setTimeout(() => {\n this.listeners.onHandshakeTimeout();\n }, this.options.handshakeTimeoutMs);\n\n this.conn.addDataListener(this.onHandshakeData);\n this.conn.addErrorListener(this.listeners.onConnectionErrored);\n this.conn.addCloseListener(this.listeners.onConnectionClosed);\n }\n\n onHandshakeData = (msg: Uint8Array) => {\n const parsedMsg = this.parseMsg(msg);\n if (parsedMsg === null) {\n this.listeners.onInvalidHandshake('could not parse message');\n return;\n }\n\n // after this fires, the listener is responsible for transitioning the session\n // and thus removing the handshake timeout\n this.listeners.onHandshake(parsedMsg);\n };\n\n get loggingMetadata(): MessageMetadata {\n return {\n clientId: this.from,\n connId: this.conn.id,\n };\n }\n\n sendHandshake(msg: TransportMessage): boolean {\n return this.conn.send(this.options.codec.toBuffer(msg));\n }\n\n _handleStateExit(): void {\n this.conn.removeDataListener(this.onHandshakeData);\n this.conn.removeErrorListener(this.listeners.onConnectionErrored);\n this.conn.removeCloseListener(this.listeners.onConnectionClosed);\n clearTimeout(this.handshakeTimeout);\n this.handshakeTimeout = undefined;\n }\n\n _handleClose(): void {\n this.conn.close();\n }\n}\n","import { Connection } from '../connection';\nimport { OpaqueTransportMessage, TransportMessage } from '../message';\nimport {\n IdentifiedSession,\n IdentifiedSessionProps,\n SessionState,\n} from './common';\n\nexport interface SessionHandshakingListeners {\n onConnectionErrored: (err: unknown) => void;\n onConnectionClosed: () => void;\n onHandshake: (msg: OpaqueTransportMessage) => void;\n onInvalidHandshake: (reason: string) => void;\n\n // timeout related\n onHandshakeTimeout: () => void;\n}\n\nexport interface SessionHandshakingProps<ConnType extends Connection>\n extends IdentifiedSessionProps {\n conn: ConnType;\n listeners: SessionHandshakingListeners;\n}\n\n/*\n * A session that is handshaking and waiting for the other side to identify itself.\n * See transitions.ts for valid transitions.\n */\nexport class SessionHandshaking<\n ConnType extends Connection,\n> extends IdentifiedSession {\n readonly state = SessionState.Handshaking as const;\n conn: ConnType;\n listeners: SessionHandshakingListeners;\n\n handshakeTimeout: ReturnType<typeof setTimeout>;\n\n constructor(props: SessionHandshakingProps<ConnType>) {\n super(props);\n this.conn = props.conn;\n this.listeners = props.listeners;\n\n this.handshakeTimeout = setTimeout(() => {\n this.listeners.onHandshakeTimeout();\n }, this.options.handshakeTimeoutMs);\n\n this.conn.addDataListener(this.onHandshakeData);\n this.conn.addErrorListener(this.listeners.onConnectionErrored);\n this.conn.addCloseListener(this.listeners.onConnectionClosed);\n }\n\n onHandshakeData = (msg: Uint8Array) => {\n const parsedMsg = this.parseMsg(msg);\n if (parsedMsg === null) {\n this.listeners.onInvalidHandshake('could not parse message');\n return;\n }\n\n this.listeners.onHandshake(parsedMsg);\n };\n\n sendHandshake(msg: TransportMessage): boolean {\n return this.conn.send(this.options.codec.toBuffer(msg));\n }\n\n _handleStateExit(): void {\n super._handleStateExit();\n this.conn.removeDataListener(this.onHandshakeData);\n this.conn.removeErrorListener(this.listeners.onConnectionErrored);\n this.conn.removeCloseListener(this.listeners.onConnectionClosed);\n clearTimeout(this.handshakeTimeout);\n }\n\n _handleClose(): void {\n super._handleClose();\n this.conn.close();\n }\n}\n","import { Static } from '@sinclair/typebox';\nimport {\n ControlFlags,\n ControlMessageAckSchema,\n OpaqueTransportMessage,\n PartialTransportMessage,\n isAck,\n} from '../message';\nimport {\n IdentifiedSession,\n IdentifiedSessionProps,\n SessionState,\n} from './common';\nimport { Connection } from '../connection';\nimport { SpanStatusCode } from '@opentelemetry/api';\n\nexport interface SessionConnectedListeners {\n onConnectionErrored: (err: unknown) => void;\n onConnectionClosed: () => void;\n onMessage: (msg: OpaqueTransportMessage) => void;\n onInvalidMessage: (reason: string) => void;\n}\n\nexport interface SessionConnectedProps<ConnType extends Connection>\n extends IdentifiedSessionProps {\n conn: ConnType;\n listeners: SessionConnectedListeners;\n}\n\n/*\n * A session that is connected and can send and receive messages.\n * See transitions.ts for valid transitions.\n */\nexport class SessionConnected<\n ConnType extends Connection,\n> extends IdentifiedSession {\n readonly state = SessionState.Connected as const;\n conn: ConnType;\n listeners: SessionConnectedListeners;\n\n private heartbeatHandle?: ReturnType<typeof setInterval> | undefined;\n private heartbeatMisses = 0;\n isActivelyHeartbeating: boolean;\n\n updateBookkeeping(ack: number, seq: number) {\n this.sendBuffer = this.sendBuffer.filter((unacked) => unacked.seq >= ack);\n this.ack = seq + 1;\n this.heartbeatMisses = 0;\n }\n\n send(msg: PartialTransportMessage): string {\n const constructedMsg = this.constructMsg(msg);\n this.sendBuffer.push(constructedMsg);\n this.conn.send(this.options.codec.toBuffer(constructedMsg));\n return constructedMsg.id;\n }\n\n constructor(props: SessionConnectedProps<ConnType>) {\n super(props);\n this.conn = props.conn;\n this.listeners = props.listeners;\n\n this.conn.addDataListener(this.onMessageData);\n this.conn.addCloseListener(this.listeners.onConnectionClosed);\n this.conn.addErrorListener(this.listeners.onConnectionErrored);\n\n // send any buffered messages\n if (this.sendBuffer.length > 0) {\n this.log?.debug(\n `sending ${this.sendBuffer.length} buffered messages`,\n this.loggingMetadata,\n );\n }\n\n for (const msg of this.sendBuffer) {\n this.conn.send(this.options.codec.toBuffer(msg));\n }\n\n // dont explicity clear the buffer, we'll just filter out old messages\n // when we receive an ack\n\n // setup heartbeat\n this.isActivelyHeartbeating = false;\n this.heartbeatHandle = setInterval(() => {\n const misses = this.heartbeatMisses;\n const missDuration = misses * this.options.heartbeatIntervalMs;\n if (misses >= this.options.heartbeatsUntilDead) {\n this.log?.info(\n `closing connection to ${this.to} due to inactivity (missed ${misses} heartbeats which is ${missDuration}ms)`,\n this.loggingMetadata,\n );\n this.telemetry.span.addEvent('closing connection due to inactivity');\n\n // it is OK to close this even on the client when we can't trust the client timer\n // due to browser throttling or hibernation\n // at worst, this interval will fire later than what the server expects and the server\n // will have already closed the connection\n // this just helps us in cases where we have a proxying setup where the server has closed\n // the connection but the proxy hasn't synchronized the server-side close to the client so\n // the client isn't stuck with a pseudo-dead connection forever\n this.conn.close();\n clearInterval(this.heartbeatHandle);\n this.heartbeatHandle = undefined;\n return;\n }\n\n if (this.isActivelyHeartbeating) {\n this.sendHeartbeat();\n }\n\n this.heartbeatMisses++;\n }, this.options.heartbeatIntervalMs);\n }\n\n startActiveHeartbeat() {\n this.isActivelyHeartbeating = true;\n }\n\n private sendHeartbeat() {\n this.log?.debug('sending heartbeat', this.loggingMetadata);\n this.send({\n streamId: 'heartbeat',\n controlFlags: ControlFlags.AckBit,\n payload: {\n type: 'ACK',\n } satisfies Static<typeof ControlMessageAckSchema>,\n });\n }\n\n onMessageData = (msg: Uint8Array) => {\n const parsedMsg = this.parseMsg(msg);\n if (parsedMsg === null) return;\n\n // check message ordering here\n if (parsedMsg.seq !== this.ack) {\n if (parsedMsg.seq < this.ack) {\n this.log?.debug(\n `received duplicate msg (got seq: ${parsedMsg.seq}, wanted seq: ${this.ack}), discarding`,\n {\n ...this.loggingMetadata,\n transportMessage: parsedMsg,\n },\n );\n } else {\n const reason = `received out-of-order msg (got seq: ${parsedMsg.seq}, wanted seq: ${this.ack})`;\n this.log?.error(reason, {\n ...this.loggingMetadata,\n transportMessage: parsedMsg,\n tags: ['invariant-violation'],\n });\n this.telemetry.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: reason,\n });\n\n this.listeners.onInvalidMessage(reason);\n }\n\n return;\n }\n\n // message is ok to update bookkeeping with\n this.log?.debug(`received msg`, {\n ...this.loggingMetadata,\n transportMessage: parsedMsg,\n });\n\n this.updateBookkeeping(parsedMsg.ack, parsedMsg.seq);\n\n // dispatch directly if its not an explicit ack\n if (!isAck(parsedMsg.controlFlags)) {\n this.listeners.onMessage(parsedMsg);\n return;\n }\n\n // discard acks (unless we aren't heartbeating in which case just respond)\n this.log?.debug(`discarding msg (ack bit set)`, {\n ...this.loggingMetadata,\n transportMessage: parsedMsg,\n });\n\n // if we are not actively heartbeating, we are in passive\n // heartbeat mode and should send a response to the ack\n if (!this.isActivelyHeartbeating) {\n this.sendHeartbeat();\n }\n };\n\n _handleStateExit(): void {\n super._handleStateExit();\n this.conn.removeDataListener(this.onMessageData);\n this.conn.removeCloseListener(this.listeners.onConnectionClosed);\n this.conn.removeErrorListener(this.listeners.onConnectionErrored);\n clearInterval(this.heartbeatHandle);\n this.heartbeatHandle = undefined;\n }\n\n _handleClose(): void {\n super._handleClose();\n this.conn.close();\n }\n}\n","import {\n IdentifiedSession,\n IdentifiedSessionProps,\n SessionState,\n} from './common';\n\nexport interface SessionBackingOffListeners {\n onBackoffFinished: () => void;\n}\n\nexport interface SessionBackingOffProps extends IdentifiedSessionProps {\n backoffMs: number;\n listeners: SessionBackingOffListeners;\n}\n\n/*\n * A session that is backing off before attempting to connect.\n * See transitions.ts for valid transitions.\n */\nexport class SessionBackingOff extends IdentifiedSession {\n readonly state = SessionState.BackingOff as const;\n listeners: SessionBackingOffListeners;\n\n backoffTimeout?: ReturnType<typeof setTimeout>;\n\n constructor(props: SessionBackingOffProps) {\n super(props);\n this.listeners = props.listeners;\n\n this.backoffTimeout = setTimeout(() => {\n this.listeners.onBackoffFinished();\n }, props.backoffMs);\n }\n\n _handleClose(): void {\n super._handleClose();\n }\n\n _handleStateExit(): void {\n super._handleStateExit();\n\n if (this.backoffTimeout) {\n clearTimeout(this.backoffTimeout);\n this.backoffTimeout = undefined;\n }\n }\n}\n","import { OpaqueTransportMessage, TransportClientId } from '..';\nimport {\n SessionConnecting,\n SessionConnectingListeners,\n} from './SessionConnecting';\nimport {\n SessionNoConnection,\n SessionNoConnectionListeners,\n} from './SessionNoConnection';\nimport {\n IdentifiedSession,\n IdentifiedSessionProps,\n SessionOptions,\n} from './common';\nimport { PropagationContext, createSessionTelemetryInfo } from '../../tracing';\nimport { SessionWaitingForHandshake } from './SessionWaitingForHandshake';\nimport {\n SessionHandshaking,\n SessionHandshakingListeners,\n} from './SessionHandshaking';\nimport {\n SessionConnected,\n SessionConnectedListeners,\n} from './SessionConnected';\nimport { generateId } from '../id';\nimport { Connection } from '../connection';\nimport { Logger } from '../../logging';\nimport {\n SessionBackingOff,\n SessionBackingOffListeners,\n} from './SessionBackingOff';\n\nfunction inheritSharedSession(\n session: IdentifiedSession,\n): IdentifiedSessionProps {\n return {\n id: session.id,\n from: session.from,\n to: session.to,\n seq: session.seq,\n ack: session.ack,\n sendBuffer: session.sendBuffer,\n telemetry: session.telemetry,\n options: session.options,\n log: session.log,\n protocolVersion: session.protocolVersion,\n };\n}\n\nexport const SessionStateGraph = {\n entrypoints: {\n NoConnection: (\n to: TransportClientId,\n from: TransportClientId,\n listeners: SessionNoConnectionListeners,\n options: SessionOptions,\n protocolVersion: string,\n log?: Logger,\n ) => {\n const id = `session-${generateId()}`;\n const telemetry = createSessionTelemetryInfo(id, to, from);\n const sendBuffer: Array<OpaqueTransportMessage> = [];\n\n const session = new SessionNoConnection({\n listeners,\n id,\n from,\n to,\n seq: 0,\n ack: 0,\n sendBuffer,\n telemetry,\n options,\n protocolVersion,\n log,\n });\n\n session.log?.info(`session ${session.id} created in NoConnection state`, {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n });\n\n return session;\n },\n WaitingForHandshake: <ConnType extends Connection>(\n from: TransportClientId,\n conn: ConnType,\n listeners: SessionHandshakingListeners,\n options: SessionOptions,\n log?: Logger,\n ): SessionWaitingForHandshake<ConnType> => {\n const session = new SessionWaitingForHandshake({\n conn,\n listeners,\n from,\n options,\n log,\n });\n\n session.log?.info(`session created in WaitingForHandshake state`, {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n });\n\n return session;\n },\n },\n // All of the transitions 'move'/'consume' the old session and return a new one.\n // After a session is transitioned, any usage of the old session will throw.\n transition: {\n // happy path transitions\n NoConnectionToBackingOff: (\n oldSession: SessionNoConnection,\n backoffMs: number,\n listeners: SessionBackingOffListeners,\n ): SessionBackingOff => {\n const carriedState = inheritSharedSession(oldSession);\n oldSession._handleStateExit();\n\n const session = new SessionBackingOff({\n backoffMs,\n listeners,\n ...carriedState,\n });\n\n session.log?.info(\n `session ${session.id} transition from NoConnection to BackingOff`,\n {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n },\n );\n return session;\n },\n BackingOffToConnecting: <ConnType extends Connection>(\n oldSession: SessionBackingOff,\n connPromise: Promise<ConnType>,\n listeners: SessionConnectingListeners,\n ): SessionConnecting<ConnType> => {\n const carriedState = inheritSharedSession(oldSession);\n oldSession._handleStateExit();\n\n const session = new SessionConnecting({\n connPromise,\n listeners,\n ...carriedState,\n });\n\n session.log?.info(\n `session ${session.id} transition from BackingOff to Connecting`,\n {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n },\n );\n return session;\n },\n ConnectingToHandshaking: <ConnType extends Connection>(\n oldSession: SessionConnecting<ConnType>,\n conn: ConnType,\n listeners: SessionHandshakingListeners,\n ): SessionHandshaking<ConnType> => {\n const carriedState = inheritSharedSession(oldSession);\n oldSession._handleStateExit();\n\n const session = new SessionHandshaking({\n conn,\n listeners,\n ...carriedState,\n });\n\n session.log?.info(\n `session ${session.id} transition from Connecting to Handshaking`,\n {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n },\n );\n\n return session;\n },\n HandshakingToConnected: <ConnType extends Connection>(\n oldSession: SessionHandshaking<ConnType>,\n listeners: SessionConnectedListeners,\n ): SessionConnected<ConnType> => {\n const carriedState = inheritSharedSession(oldSession);\n const conn = oldSession.conn;\n oldSession._handleStateExit();\n\n const session = new SessionConnected({\n conn,\n listeners,\n ...carriedState,\n });\n\n session.log?.info(\n `session ${session.id} transition from Handshaking to Connected`,\n {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n },\n );\n\n return session;\n },\n WaitingForHandshakeToConnected: <ConnType extends Connection>(\n pendingSession: SessionWaitingForHandshake<ConnType>,\n oldSession: SessionNoConnection | undefined,\n sessionId: string,\n to: TransportClientId,\n propagationCtx: PropagationContext | undefined,\n listeners: SessionConnectedListeners,\n protocolVersion: string,\n ): SessionConnected<ConnType> => {\n const conn = pendingSession.conn;\n const { from, options } = pendingSession;\n const carriedState: IdentifiedSessionProps = oldSession\n ? // old session exists, inherit state\n inheritSharedSession(oldSession)\n : // old session does not exist, create new state\n {\n id: sessionId,\n from,\n to,\n seq: 0,\n ack: 0,\n sendBuffer: [],\n telemetry: createSessionTelemetryInfo(\n sessionId,\n to,\n from,\n propagationCtx,\n ),\n options,\n log: pendingSession.log,\n protocolVersion,\n };\n\n pendingSession._handleStateExit();\n oldSession?._handleStateExit();\n\n const session = new SessionConnected({\n conn,\n listeners,\n ...carriedState,\n });\n session.log?.info(\n `session ${session.id} transition from WaitingForHandshake to Connected`,\n {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n },\n );\n\n return session;\n },\n // disconnect paths\n BackingOffToNoConnection: (\n oldSession: SessionBackingOff,\n listeners: SessionNoConnectionListeners,\n ): SessionNoConnection => {\n const carriedState = inheritSharedSession(oldSession);\n oldSession._handleStateExit();\n\n const session = new SessionNoConnection({ listeners, ...carriedState });\n session.log?.info(\n `session ${session.id} transition from BackingOff to NoConnection`,\n {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n },\n );\n\n return session;\n },\n ConnectingToNoConnection: <ConnType extends Connection>(\n oldSession: SessionConnecting<ConnType>,\n listeners: SessionNoConnectionListeners,\n ): SessionNoConnection => {\n const carriedState = inheritSharedSession(oldSession);\n oldSession.bestEffortClose();\n oldSession._handleStateExit();\n\n const session = new SessionNoConnection({ listeners, ...carriedState });\n session.log?.info(\n `session ${session.id} transition from Connecting to NoConnection`,\n {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n },\n );\n\n return session;\n },\n HandshakingToNoConnection: <ConnType extends Connection>(\n oldSession: SessionHandshaking<ConnType>,\n listeners: SessionNoConnectionListeners,\n ): SessionNoConnection => {\n const carriedState = inheritSharedSession(oldSession);\n oldSession.conn.close();\n oldSession._handleStateExit();\n\n const session = new SessionNoConnection({ listeners, ...carriedState });\n session.log?.info(\n `session ${session.id} transition from Handshaking to NoConnection`,\n {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n },\n );\n\n return session;\n },\n ConnectedToNoConnection: <ConnType extends Connection>(\n oldSession: SessionConnected<ConnType>,\n listeners: SessionNoConnectionListeners,\n ): SessionNoConnection => {\n const carriedState = inheritSharedSession(oldSession);\n oldSession.conn.close();\n oldSession._handleStateExit();\n\n const session = new SessionNoConnection({ listeners, ...carriedState });\n session.log?.info(\n `session ${session.id} transition from Connected to NoConnection`,\n {\n ...session.loggingMetadata,\n tags: ['state-transition'],\n },\n );\n\n return session;\n },\n },\n} as const;\n\nconst transitions = SessionStateGraph.transition;\n\n/*\n * 0. SessionNoConnection ◄──┐\n * │ reconnect / connect attempt │\n * ▼ │\n * 1. SessionBackingOff │\n * │ ───┤ explicit close\n * ▼ │\n * 2. SessionConnecting │\n * │ connect success ──────────────┤ connect failure\n * ▼ │\n * 3. SessionHandshaking │\n * │ handshake success ┌──────┤ connection drop\n * │ handshake failure ─────┤ │\n * ▼ │ │ connection drop\n * 4. SessionConnected │ │ heartbeat misses\n * │ invalid message ───────┼──────┘\n * ▼ │\n * x. Destroy Session ◄─────┘\n */\nexport const ClientSessionStateGraph = {\n entrypoint: SessionStateGraph.entrypoints.NoConnection,\n transition: {\n // happy paths\n NoConnectionToBackingOff: transitions.NoConnectionToBackingOff,\n BackingOffToConnecting: transitions.BackingOffToConnecting,\n ConnectingToHandshaking: transitions.ConnectingToHandshaking,\n HandshakingToConnected: transitions.HandshakingToConnected,\n // disconnect paths\n BackingOffToNoConnection: transitions.BackingOffToNoConnection,\n ConnectingToNoConnection: transitions.ConnectingToNoConnection,\n HandshakingToNoConnection: transitions.HandshakingToNoConnection,\n ConnectedToNoConnection: transitions.ConnectedToNoConnection,\n },\n};\n\nexport type ClientSession<ConnType extends Connection> =\n | SessionNoConnection\n | SessionBackingOff\n | SessionConnecting<ConnType>\n | SessionHandshaking<ConnType>\n | SessionConnected<ConnType>;\n\n/*\n * 0. SessionNoConnection ◄──┐\n * │ reconnect / connect attempt │\n * ▼ │\n * 1. WaitingForHandshake │\n * │ handshake success ┌──────┤ connection drop\n * │ handshake failure ─────┤ │\n * ▼ │ │ connection drop\n * 2. SessionConnected │ │ heartbeat misses\n * │ invalid message ───────┼──────┘\n * ▼ │\n * x. Destroy Session ◄─────┘\n */\nexport const ServerSessionStateGraph = {\n entrypoint: SessionStateGraph.entrypoints.WaitingForHandshake,\n transition: {\n // happy paths\n WaitingForHandshakeToConnected: transitions.WaitingForHandshakeToConnected,\n // disconnect paths\n ConnectedToNoConnection: transitions.ConnectedToNoConnection,\n },\n};\n\nexport type ServerSession<ConnType extends Connection> =\n // SessionWaitingForHandshake<ConnType> is stored separately in the server transport\n SessionConnected<ConnType> | SessionNoConnection;\n\nexport type Session<ConnType extends Connection> =\n | ClientSession<ConnType>\n | ServerSession<ConnType>;\n"],"mappings":"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","names":["SessionState"]}
|
|
@@ -191,7 +191,7 @@ function isStreamAbort(controlFlag) {
|
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
// package.json
|
|
194
|
-
var version = "0.200.0-rc.
|
|
194
|
+
var version = "0.200.0-rc.7";
|
|
195
195
|
|
|
196
196
|
// util/stringify.ts
|
|
197
197
|
function coerceErrorString(err) {
|
|
@@ -315,4 +315,4 @@ export {
|
|
|
315
315
|
tracing_default,
|
|
316
316
|
coerceErrorString
|
|
317
317
|
};
|
|
318
|
-
//# sourceMappingURL=chunk-
|
|
318
|
+
//# sourceMappingURL=chunk-BZBEE2VR.js.map
|