@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.
Files changed (68) hide show
  1. package/README.md +2 -2
  2. package/dist/{chunk-TMNVRR5R.js → chunk-3XKJOFZA.js} +193 -90
  3. package/dist/chunk-3XKJOFZA.js.map +1 -0
  4. package/dist/{chunk-IGNFE3QW.js → chunk-BZBEE2VR.js} +2 -2
  5. package/dist/chunk-BZBEE2VR.js.map +1 -0
  6. package/dist/{chunk-WE2PAPNC.js → chunk-CXPZSAU4.js} +102 -95
  7. package/dist/chunk-CXPZSAU4.js.map +1 -0
  8. package/dist/{chunk-WF3AW2CB.js → chunk-F2E7ILHW.js} +41 -45
  9. package/dist/chunk-F2E7ILHW.js.map +1 -0
  10. package/dist/{chunk-NOLXEIRP.js → chunk-U4W75CMT.js} +3 -3
  11. package/dist/chunk-U4W75CMT.js.map +1 -0
  12. package/dist/{chunk-GXRIBO3N.js → chunk-VLW5OKZG.js} +2 -2
  13. package/dist/{chunk-MXU6DJVG.js → chunk-XIJVDPYY.js} +161 -159
  14. package/dist/chunk-XIJVDPYY.js.map +1 -0
  15. package/dist/{client-f56a6da3.d.ts → client-829bf1f9.d.ts} +3 -1
  16. package/dist/{connection-6031a354.d.ts → connection-5e67d641.d.ts} +1 -1
  17. package/dist/{context-73df8978.d.ts → context-9eabf54f.d.ts} +132 -81
  18. package/dist/router/index.cjs +162 -160
  19. package/dist/router/index.cjs.map +1 -1
  20. package/dist/router/index.d.cts +7 -7
  21. package/dist/router/index.d.ts +7 -7
  22. package/dist/router/index.js +6 -6
  23. package/dist/{server-9f31d98f.d.ts → server-d82a2d9b.d.ts} +8 -3
  24. package/dist/{services-69d72cd5.d.ts → services-6a446f04.d.ts} +157 -139
  25. package/dist/transport/impls/ws/client.cjs +285 -178
  26. package/dist/transport/impls/ws/client.cjs.map +1 -1
  27. package/dist/transport/impls/ws/client.d.cts +3 -3
  28. package/dist/transport/impls/ws/client.d.ts +3 -3
  29. package/dist/transport/impls/ws/client.js +7 -7
  30. package/dist/transport/impls/ws/server.cjs +224 -128
  31. package/dist/transport/impls/ws/server.cjs.map +1 -1
  32. package/dist/transport/impls/ws/server.d.cts +3 -3
  33. package/dist/transport/impls/ws/server.d.ts +3 -3
  34. package/dist/transport/impls/ws/server.js +5 -5
  35. package/dist/transport/index.cjs +322 -218
  36. package/dist/transport/index.cjs.map +1 -1
  37. package/dist/transport/index.d.cts +3 -3
  38. package/dist/transport/index.d.ts +3 -3
  39. package/dist/transport/index.js +7 -7
  40. package/dist/util/testHelpers.cjs +227 -133
  41. package/dist/util/testHelpers.cjs.map +1 -1
  42. package/dist/util/testHelpers.d.cts +15 -12
  43. package/dist/util/testHelpers.d.ts +15 -12
  44. package/dist/util/testHelpers.js +41 -43
  45. package/dist/util/testHelpers.js.map +1 -1
  46. package/package.json +1 -1
  47. package/dist/chunk-IGNFE3QW.js.map +0 -1
  48. package/dist/chunk-MU25KVV7.js +0 -112
  49. package/dist/chunk-MU25KVV7.js.map +0 -1
  50. package/dist/chunk-MXU6DJVG.js.map +0 -1
  51. package/dist/chunk-NOLXEIRP.js.map +0 -1
  52. package/dist/chunk-TMNVRR5R.js.map +0 -1
  53. package/dist/chunk-WE2PAPNC.js.map +0 -1
  54. package/dist/chunk-WF3AW2CB.js.map +0 -1
  55. package/dist/connection-11991b13.d.ts +0 -31
  56. package/dist/transport/impls/uds/client.cjs +0 -1696
  57. package/dist/transport/impls/uds/client.cjs.map +0 -1
  58. package/dist/transport/impls/uds/client.d.cts +0 -18
  59. package/dist/transport/impls/uds/client.d.ts +0 -18
  60. package/dist/transport/impls/uds/client.js +0 -38
  61. package/dist/transport/impls/uds/client.js.map +0 -1
  62. package/dist/transport/impls/uds/server.cjs +0 -1663
  63. package/dist/transport/impls/uds/server.cjs.map +0 -1
  64. package/dist/transport/impls/uds/server.d.cts +0 -19
  65. package/dist/transport/impls/uds/server.d.ts +0 -19
  66. package/dist/transport/impls/uds/server.js +0 -33
  67. package/dist/transport/impls/uds/server.js.map +0 -1
  68. /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
- input: Type.Object({ n: Type.Number() }),
96
- output: Type.Object({ result: Type.Number() }),
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-IGNFE3QW.js";
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: 250,
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(id, from, to, seq, ack, sendBuffer, telemetry, options, protocolVersion, log) {
139
- super(from, options, log);
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(connPromise, listeners, ...args) {
196
- super(...args);
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(listeners, ...args) {
238
- super(...args);
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(conn, listeners, ...args) {
263
- super(...args);
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(conn, listeners, ...args) {
309
- super(...args);
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
- get isActivelyHeartbeating() {
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(conn, listeners, ...args) {
366
- super(...args);
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.sendHeartbeat();
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.protocolVersion,
481
- session.log
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
- NoConnectionToConnecting(oldSession, connPromise, listeners) {
557
+ NoConnectionToBackingOff: (oldSession, backoffMs, listeners) => {
529
558
  const carriedState = inheritSharedSession(oldSession);
530
559
  oldSession._handleStateExit();
531
- const session = new SessionConnecting(
532
- connPromise,
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 NoConnection to Connecting`,
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(conn, listeners, ...carriedState);
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(conn, listeners, ...carriedState);
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(sessionId, to, from, propagationCtx),
638
+ seq: 0,
639
+ ack: 0,
640
+ sendBuffer: [],
641
+ telemetry: createSessionTelemetryInfo(
642
+ sessionId,
643
+ to,
644
+ from,
645
+ propagationCtx
646
+ ),
588
647
  options,
589
- protocolVersion,
590
- pendingSession.log
591
- ]
648
+ log: pendingSession.log,
649
+ protocolVersion
650
+ }
592
651
  );
593
652
  pendingSession._handleStateExit();
594
653
  oldSession?._handleStateExit();
595
- const session = new SessionConnected(conn, listeners, ...carriedState);
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
- ConnectingToNoConnection(oldSession, listeners) {
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-TMNVRR5R.js.map
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.6";
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-IGNFE3QW.js.map
318
+ //# sourceMappingURL=chunk-BZBEE2VR.js.map