@replit/river 0.200.0-rc.2 → 0.200.0-rc.4

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 (84) hide show
  1. package/README.md +21 -20
  2. package/dist/chunk-2BF4VMUZ.js +50 -0
  3. package/dist/chunk-2BF4VMUZ.js.map +1 -0
  4. package/dist/chunk-BZQQXMVF.js +401 -0
  5. package/dist/chunk-BZQQXMVF.js.map +1 -0
  6. package/dist/{chunk-4VNY34QG.js → chunk-F7Z2QQRL.js} +24 -18
  7. package/dist/chunk-F7Z2QQRL.js.map +1 -0
  8. package/dist/chunk-IMFMNIEO.js +384 -0
  9. package/dist/chunk-IMFMNIEO.js.map +1 -0
  10. package/dist/chunk-RDGHFHXN.js +658 -0
  11. package/dist/chunk-RDGHFHXN.js.map +1 -0
  12. package/dist/chunk-SI4YHBTI.js +277 -0
  13. package/dist/chunk-SI4YHBTI.js.map +1 -0
  14. package/dist/{chunk-7CKIN3JT.js → chunk-SIRRYRLQ.js} +73 -490
  15. package/dist/chunk-SIRRYRLQ.js.map +1 -0
  16. package/dist/{chunk-S5RL45KH.js → chunk-V57VWV5S.js} +80 -44
  17. package/dist/chunk-V57VWV5S.js.map +1 -0
  18. package/dist/{chunk-QMM35C3H.js → chunk-VXYHC666.js} +1 -1
  19. package/dist/chunk-VXYHC666.js.map +1 -0
  20. package/dist/client-f56a6da3.d.ts +49 -0
  21. package/dist/{connection-f900e390.d.ts → connection-11991b13.d.ts} +1 -5
  22. package/dist/connection-6031a354.d.ts +11 -0
  23. package/dist/context-73df8978.d.ts +528 -0
  24. package/dist/logging/index.cjs.map +1 -1
  25. package/dist/logging/index.d.cts +1 -1
  26. package/dist/logging/index.d.ts +1 -1
  27. package/dist/logging/index.js +1 -1
  28. package/dist/{index-10ebd26a.d.ts → message-fd349b27.d.ts} +31 -31
  29. package/dist/router/index.cjs +125 -502
  30. package/dist/router/index.cjs.map +1 -1
  31. package/dist/router/index.d.cts +11 -46
  32. package/dist/router/index.d.ts +11 -46
  33. package/dist/router/index.js +2 -4
  34. package/dist/server-9f31d98f.d.ts +42 -0
  35. package/dist/{services-970f97bb.d.ts → services-c67758fc.d.ts} +5 -602
  36. package/dist/transport/impls/uds/client.cjs +1247 -1238
  37. package/dist/transport/impls/uds/client.cjs.map +1 -1
  38. package/dist/transport/impls/uds/client.d.cts +4 -3
  39. package/dist/transport/impls/uds/client.d.ts +4 -3
  40. package/dist/transport/impls/uds/client.js +7 -13
  41. package/dist/transport/impls/uds/client.js.map +1 -1
  42. package/dist/transport/impls/uds/server.cjs +1311 -1170
  43. package/dist/transport/impls/uds/server.cjs.map +1 -1
  44. package/dist/transport/impls/uds/server.d.cts +4 -4
  45. package/dist/transport/impls/uds/server.d.ts +4 -4
  46. package/dist/transport/impls/uds/server.js +6 -6
  47. package/dist/transport/impls/ws/client.cjs +988 -987
  48. package/dist/transport/impls/ws/client.cjs.map +1 -1
  49. package/dist/transport/impls/ws/client.d.cts +6 -5
  50. package/dist/transport/impls/ws/client.d.ts +6 -5
  51. package/dist/transport/impls/ws/client.js +6 -7
  52. package/dist/transport/impls/ws/client.js.map +1 -1
  53. package/dist/transport/impls/ws/server.cjs +1192 -1066
  54. package/dist/transport/impls/ws/server.cjs.map +1 -1
  55. package/dist/transport/impls/ws/server.d.cts +4 -4
  56. package/dist/transport/impls/ws/server.d.ts +4 -4
  57. package/dist/transport/impls/ws/server.js +6 -6
  58. package/dist/transport/index.cjs +1446 -1380
  59. package/dist/transport/index.cjs.map +1 -1
  60. package/dist/transport/index.d.cts +4 -26
  61. package/dist/transport/index.d.ts +4 -26
  62. package/dist/transport/index.js +9 -9
  63. package/dist/util/testHelpers.cjs +746 -303
  64. package/dist/util/testHelpers.cjs.map +1 -1
  65. package/dist/util/testHelpers.d.cts +9 -4
  66. package/dist/util/testHelpers.d.ts +9 -4
  67. package/dist/util/testHelpers.js +36 -10
  68. package/dist/util/testHelpers.js.map +1 -1
  69. package/package.json +1 -1
  70. package/dist/chunk-47TFNAY2.js +0 -476
  71. package/dist/chunk-47TFNAY2.js.map +0 -1
  72. package/dist/chunk-4VNY34QG.js.map +0 -1
  73. package/dist/chunk-7CKIN3JT.js.map +0 -1
  74. package/dist/chunk-CZP4LK3F.js +0 -335
  75. package/dist/chunk-CZP4LK3F.js.map +0 -1
  76. package/dist/chunk-DJCW3SKT.js +0 -59
  77. package/dist/chunk-DJCW3SKT.js.map +0 -1
  78. package/dist/chunk-NQWDT6GS.js +0 -347
  79. package/dist/chunk-NQWDT6GS.js.map +0 -1
  80. package/dist/chunk-ONUXWVRC.js +0 -492
  81. package/dist/chunk-ONUXWVRC.js.map +0 -1
  82. package/dist/chunk-QMM35C3H.js.map +0 -1
  83. package/dist/chunk-S5RL45KH.js.map +0 -1
  84. package/dist/connection-3f117047.d.ts +0 -17
@@ -0,0 +1,658 @@
1
+ import {
2
+ OpaqueTransportMessageSchema,
3
+ createSessionTelemetryInfo,
4
+ generateId,
5
+ isAck
6
+ } from "./chunk-V57VWV5S.js";
7
+ import {
8
+ NaiveJsonCodec
9
+ } from "./chunk-4PVU7J25.js";
10
+
11
+ // transport/options.ts
12
+ var defaultTransportOptions = {
13
+ heartbeatIntervalMs: 1e3,
14
+ heartbeatsUntilDead: 2,
15
+ sessionDisconnectGraceMs: 5e3,
16
+ connectionTimeoutMs: 2e3,
17
+ handshakeTimeoutMs: 1e3,
18
+ codec: NaiveJsonCodec
19
+ };
20
+ var defaultConnectionRetryOptions = {
21
+ baseIntervalMs: 250,
22
+ maxJitterMs: 200,
23
+ maxBackoffMs: 32e3,
24
+ attemptBudgetCapacity: 5,
25
+ budgetRestoreIntervalMs: 200
26
+ };
27
+ var defaultClientTransportOptions = {
28
+ ...defaultTransportOptions,
29
+ ...defaultConnectionRetryOptions
30
+ };
31
+ var defaultServerTransportOptions = {
32
+ ...defaultTransportOptions
33
+ };
34
+
35
+ // transport/sessionStateMachine/common.ts
36
+ import { Value } from "@sinclair/typebox/value";
37
+ var SessionState = /* @__PURE__ */ ((SessionState2) => {
38
+ SessionState2["NoConnection"] = "NoConnection";
39
+ SessionState2["Connecting"] = "Connecting";
40
+ SessionState2["Handshaking"] = "Handshaking";
41
+ SessionState2["Connected"] = "Connected";
42
+ SessionState2["WaitingForHandshake"] = "WaitingForHandshake";
43
+ return SessionState2;
44
+ })(SessionState || {});
45
+ var ERR_CONSUMED = `session state has been consumed and is no longer valid`;
46
+ var StateMachineState = class {
47
+ /*
48
+ * Whether this state has been consumed
49
+ * and we've moved on to another state
50
+ */
51
+ _isConsumed;
52
+ close() {
53
+ this._handleClose();
54
+ }
55
+ constructor() {
56
+ this._isConsumed = false;
57
+ return new Proxy(this, {
58
+ get(target, prop) {
59
+ if (prop === "_isConsumed" || prop === "id" || prop === "state") {
60
+ return Reflect.get(target, prop);
61
+ }
62
+ if (prop === "_handleStateExit") {
63
+ return () => {
64
+ target._isConsumed = true;
65
+ target._handleStateExit();
66
+ };
67
+ }
68
+ if (prop === "_handleClose") {
69
+ return () => {
70
+ target._handleStateExit();
71
+ target._handleClose();
72
+ };
73
+ }
74
+ if (target._isConsumed) {
75
+ throw new Error(
76
+ `${ERR_CONSUMED}: getting ${prop.toString()} on consumed state`
77
+ );
78
+ }
79
+ return Reflect.get(target, prop);
80
+ },
81
+ set(target, prop, value) {
82
+ if (target._isConsumed) {
83
+ throw new Error(
84
+ `${ERR_CONSUMED}: setting ${prop.toString()} on consumed state`
85
+ );
86
+ }
87
+ return Reflect.set(target, prop, value);
88
+ }
89
+ });
90
+ }
91
+ };
92
+ var CommonSession = class extends StateMachineState {
93
+ from;
94
+ options;
95
+ log;
96
+ constructor(from, options, log) {
97
+ super();
98
+ this.from = from;
99
+ this.options = options;
100
+ this.log = log;
101
+ }
102
+ parseMsg(msg) {
103
+ const parsedMsg = this.options.codec.fromBuffer(msg);
104
+ if (parsedMsg === null) {
105
+ const decodedBuffer = new TextDecoder().decode(Buffer.from(msg));
106
+ this.log?.error(
107
+ `received malformed msg: ${decodedBuffer}`,
108
+ this.loggingMetadata
109
+ );
110
+ return null;
111
+ }
112
+ if (!Value.Check(OpaqueTransportMessageSchema, parsedMsg)) {
113
+ this.log?.error(`received invalid msg: ${JSON.stringify(parsedMsg)}`, {
114
+ ...this.loggingMetadata,
115
+ validationErrors: [
116
+ ...Value.Errors(OpaqueTransportMessageSchema, parsedMsg)
117
+ ]
118
+ });
119
+ return null;
120
+ }
121
+ return parsedMsg;
122
+ }
123
+ };
124
+ var IdentifiedSession = class extends CommonSession {
125
+ id;
126
+ telemetry;
127
+ to;
128
+ protocolVersion;
129
+ /**
130
+ * Index of the message we will send next (excluding handshake)
131
+ */
132
+ seq;
133
+ /**
134
+ * Number of unique messages we've received this session (excluding handshake)
135
+ */
136
+ ack;
137
+ sendBuffer;
138
+ constructor(id, from, to, seq, ack, sendBuffer, telemetry, options, protocolVersion, log) {
139
+ super(from, options, log);
140
+ this.id = id;
141
+ this.to = to;
142
+ this.seq = seq;
143
+ this.ack = ack;
144
+ this.sendBuffer = sendBuffer;
145
+ this.telemetry = telemetry;
146
+ this.log = log;
147
+ this.protocolVersion = protocolVersion;
148
+ }
149
+ get loggingMetadata() {
150
+ const spanContext = this.telemetry.span.spanContext();
151
+ return {
152
+ clientId: this.from,
153
+ connectedTo: this.to,
154
+ sessionId: this.id,
155
+ telemetry: {
156
+ traceId: spanContext.traceId,
157
+ spanId: spanContext.spanId
158
+ }
159
+ };
160
+ }
161
+ constructMsg(partialMsg) {
162
+ const msg = {
163
+ ...partialMsg,
164
+ id: generateId(),
165
+ to: this.to,
166
+ from: this.from,
167
+ seq: this.seq,
168
+ ack: this.ack
169
+ };
170
+ this.seq++;
171
+ return msg;
172
+ }
173
+ nextSeq() {
174
+ return this.sendBuffer.length > 0 ? this.sendBuffer[0].seq : this.seq;
175
+ }
176
+ send(msg) {
177
+ const constructedMsg = this.constructMsg(msg);
178
+ this.sendBuffer.push(constructedMsg);
179
+ return constructedMsg.id;
180
+ }
181
+ _handleStateExit() {
182
+ }
183
+ _handleClose() {
184
+ this.sendBuffer.length = 0;
185
+ this.telemetry.span.end();
186
+ }
187
+ };
188
+
189
+ // transport/sessionStateMachine/SessionConnecting.ts
190
+ var SessionConnecting = class extends IdentifiedSession {
191
+ state = "Connecting" /* Connecting */;
192
+ connPromise;
193
+ listeners;
194
+ connectionTimeout;
195
+ constructor(connPromise, listeners, ...args) {
196
+ super(...args);
197
+ this.connPromise = connPromise;
198
+ this.listeners = listeners;
199
+ this.connectionTimeout = setTimeout(() => {
200
+ listeners.onConnectionTimeout();
201
+ }, this.options.connectionTimeoutMs);
202
+ connPromise.then(
203
+ (conn) => {
204
+ if (this._isConsumed)
205
+ return;
206
+ listeners.onConnectionEstablished(conn);
207
+ },
208
+ (err) => {
209
+ if (this._isConsumed)
210
+ return;
211
+ listeners.onConnectionFailed(err);
212
+ }
213
+ );
214
+ }
215
+ // close a pending connection if it resolves, ignore errors if the promise
216
+ // ends up rejected anyways
217
+ bestEffortClose() {
218
+ void this.connPromise.then((conn) => conn.close()).catch(() => {
219
+ });
220
+ }
221
+ _handleStateExit() {
222
+ super._handleStateExit();
223
+ clearTimeout(this.connectionTimeout);
224
+ this.connectionTimeout = void 0;
225
+ }
226
+ _handleClose() {
227
+ this.bestEffortClose();
228
+ super._handleClose();
229
+ }
230
+ };
231
+
232
+ // transport/sessionStateMachine/SessionNoConnection.ts
233
+ var SessionNoConnection = class extends IdentifiedSession {
234
+ state = "NoConnection" /* NoConnection */;
235
+ listeners;
236
+ gracePeriodTimeout;
237
+ constructor(listeners, ...args) {
238
+ super(...args);
239
+ this.listeners = listeners;
240
+ this.gracePeriodTimeout = setTimeout(() => {
241
+ this.listeners.onSessionGracePeriodElapsed();
242
+ }, this.options.sessionDisconnectGraceMs);
243
+ }
244
+ _handleClose() {
245
+ super._handleClose();
246
+ }
247
+ _handleStateExit() {
248
+ super._handleStateExit();
249
+ if (this.gracePeriodTimeout) {
250
+ clearTimeout(this.gracePeriodTimeout);
251
+ this.gracePeriodTimeout = void 0;
252
+ }
253
+ }
254
+ };
255
+
256
+ // transport/sessionStateMachine/SessionWaitingForHandshake.ts
257
+ var SessionWaitingForHandshake = class extends CommonSession {
258
+ state = "WaitingForHandshake" /* WaitingForHandshake */;
259
+ conn;
260
+ listeners;
261
+ handshakeTimeout;
262
+ constructor(conn, listeners, ...args) {
263
+ super(...args);
264
+ this.conn = conn;
265
+ this.listeners = listeners;
266
+ this.handshakeTimeout = setTimeout(() => {
267
+ listeners.onHandshakeTimeout();
268
+ }, this.options.handshakeTimeoutMs);
269
+ this.conn.addDataListener(this.onHandshakeData);
270
+ this.conn.addErrorListener(listeners.onConnectionErrored);
271
+ this.conn.addCloseListener(listeners.onConnectionClosed);
272
+ }
273
+ onHandshakeData = (msg) => {
274
+ const parsedMsg = this.parseMsg(msg);
275
+ if (parsedMsg === null) {
276
+ this.listeners.onInvalidHandshake("could not parse message");
277
+ return;
278
+ }
279
+ this.listeners.onHandshake(parsedMsg);
280
+ };
281
+ get loggingMetadata() {
282
+ return {
283
+ clientId: this.from,
284
+ connId: this.conn.id
285
+ };
286
+ }
287
+ sendHandshake(msg) {
288
+ return this.conn.send(this.options.codec.toBuffer(msg));
289
+ }
290
+ _handleStateExit() {
291
+ this.conn.removeDataListener(this.onHandshakeData);
292
+ this.conn.removeErrorListener(this.listeners.onConnectionErrored);
293
+ this.conn.removeCloseListener(this.listeners.onConnectionClosed);
294
+ clearTimeout(this.handshakeTimeout);
295
+ this.handshakeTimeout = void 0;
296
+ }
297
+ _handleClose() {
298
+ this.conn.close();
299
+ }
300
+ };
301
+
302
+ // transport/sessionStateMachine/SessionHandshaking.ts
303
+ var SessionHandshaking = class extends IdentifiedSession {
304
+ state = "Handshaking" /* Handshaking */;
305
+ conn;
306
+ listeners;
307
+ handshakeTimeout;
308
+ constructor(conn, listeners, ...args) {
309
+ super(...args);
310
+ this.conn = conn;
311
+ this.listeners = listeners;
312
+ this.handshakeTimeout = setTimeout(() => {
313
+ listeners.onHandshakeTimeout();
314
+ }, this.options.handshakeTimeoutMs);
315
+ this.conn.addDataListener(this.onHandshakeData);
316
+ this.conn.addErrorListener(listeners.onConnectionErrored);
317
+ this.conn.addCloseListener(listeners.onConnectionClosed);
318
+ }
319
+ onHandshakeData = (msg) => {
320
+ const parsedMsg = this.parseMsg(msg);
321
+ if (parsedMsg === null) {
322
+ this.listeners.onInvalidHandshake("could not parse message");
323
+ return;
324
+ }
325
+ this.listeners.onHandshake(parsedMsg);
326
+ };
327
+ sendHandshake(msg) {
328
+ return this.conn.send(this.options.codec.toBuffer(msg));
329
+ }
330
+ _handleStateExit() {
331
+ super._handleStateExit();
332
+ this.conn.removeDataListener(this.onHandshakeData);
333
+ this.conn.removeErrorListener(this.listeners.onConnectionErrored);
334
+ this.conn.removeCloseListener(this.listeners.onConnectionClosed);
335
+ clearTimeout(this.handshakeTimeout);
336
+ }
337
+ _handleClose() {
338
+ super._handleClose();
339
+ this.conn.close();
340
+ }
341
+ };
342
+
343
+ // transport/sessionStateMachine/SessionConnected.ts
344
+ import { SpanStatusCode } from "@opentelemetry/api";
345
+ var SessionConnected = class extends IdentifiedSession {
346
+ state = "Connected" /* Connected */;
347
+ conn;
348
+ listeners;
349
+ heartbeatHandle;
350
+ heartbeatMisses = 0;
351
+ get isActivelyHeartbeating() {
352
+ return this.heartbeatHandle !== void 0;
353
+ }
354
+ updateBookkeeping(ack, seq) {
355
+ this.sendBuffer = this.sendBuffer.filter((unacked) => unacked.seq >= ack);
356
+ this.ack = seq + 1;
357
+ this.heartbeatMisses = 0;
358
+ }
359
+ send(msg) {
360
+ const constructedMsg = this.constructMsg(msg);
361
+ this.sendBuffer.push(constructedMsg);
362
+ this.conn.send(this.options.codec.toBuffer(constructedMsg));
363
+ return constructedMsg.id;
364
+ }
365
+ constructor(conn, listeners, ...args) {
366
+ super(...args);
367
+ this.conn = conn;
368
+ this.listeners = listeners;
369
+ this.conn.addDataListener(this.onMessageData);
370
+ this.conn.addCloseListener(listeners.onConnectionClosed);
371
+ this.conn.addErrorListener(listeners.onConnectionErrored);
372
+ if (this.sendBuffer.length > 0) {
373
+ this.log?.debug(
374
+ `sending ${this.sendBuffer.length} buffered messages`,
375
+ this.loggingMetadata
376
+ );
377
+ }
378
+ for (const msg of this.sendBuffer) {
379
+ conn.send(this.options.codec.toBuffer(msg));
380
+ }
381
+ }
382
+ startActiveHeartbeat() {
383
+ this.heartbeatHandle = setInterval(() => {
384
+ const misses = this.heartbeatMisses;
385
+ const missDuration = misses * this.options.heartbeatIntervalMs;
386
+ if (misses >= this.options.heartbeatsUntilDead) {
387
+ this.log?.info(
388
+ `closing connection to ${this.to} due to inactivity (missed ${misses} heartbeats which is ${missDuration}ms)`,
389
+ this.loggingMetadata
390
+ );
391
+ this.telemetry.span.addEvent("closing connection due to inactivity");
392
+ this.conn.close();
393
+ clearInterval(this.heartbeatHandle);
394
+ this.heartbeatHandle = void 0;
395
+ return;
396
+ }
397
+ this.sendHeartbeat();
398
+ this.heartbeatMisses++;
399
+ }, this.options.heartbeatIntervalMs);
400
+ }
401
+ sendHeartbeat() {
402
+ this.send({
403
+ streamId: "heartbeat",
404
+ controlFlags: 1 /* AckBit */,
405
+ payload: {
406
+ type: "ACK"
407
+ }
408
+ });
409
+ }
410
+ onMessageData = (msg) => {
411
+ const parsedMsg = this.parseMsg(msg);
412
+ if (parsedMsg === null)
413
+ return;
414
+ if (parsedMsg.seq !== this.ack) {
415
+ if (parsedMsg.seq < this.ack) {
416
+ this.log?.debug(
417
+ `received duplicate msg (got seq: ${parsedMsg.seq}, wanted seq: ${this.ack}), discarding`,
418
+ {
419
+ ...this.loggingMetadata,
420
+ transportMessage: parsedMsg
421
+ }
422
+ );
423
+ } else {
424
+ const reason = `received out-of-order msg (got seq: ${parsedMsg.seq}, wanted seq: ${this.ack})`;
425
+ this.log?.error(reason, {
426
+ ...this.loggingMetadata,
427
+ transportMessage: parsedMsg,
428
+ tags: ["invariant-violation"]
429
+ });
430
+ this.telemetry.span.setStatus({
431
+ code: SpanStatusCode.ERROR,
432
+ message: reason
433
+ });
434
+ this.listeners.onInvalidMessage(reason);
435
+ }
436
+ return;
437
+ }
438
+ this.log?.debug(`received msg`, {
439
+ ...this.loggingMetadata,
440
+ transportMessage: parsedMsg
441
+ });
442
+ this.updateBookkeeping(parsedMsg.ack, parsedMsg.seq);
443
+ if (!isAck(parsedMsg.controlFlags)) {
444
+ this.listeners.onMessage(parsedMsg);
445
+ return;
446
+ }
447
+ this.log?.debug(`discarding msg (ack bit set)`, {
448
+ ...this.loggingMetadata,
449
+ transportMessage: parsedMsg
450
+ });
451
+ if (!this.isActivelyHeartbeating) {
452
+ this.sendHeartbeat();
453
+ }
454
+ };
455
+ _handleStateExit() {
456
+ super._handleStateExit();
457
+ this.conn.removeDataListener(this.onMessageData);
458
+ this.conn.removeCloseListener(this.listeners.onConnectionClosed);
459
+ this.conn.removeErrorListener(this.listeners.onConnectionErrored);
460
+ clearInterval(this.heartbeatHandle);
461
+ this.heartbeatHandle = void 0;
462
+ }
463
+ _handleClose() {
464
+ super._handleClose();
465
+ this.conn.close();
466
+ }
467
+ };
468
+
469
+ // transport/sessionStateMachine/transitions.ts
470
+ 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
+ ];
483
+ }
484
+ var SessionStateGraph = {
485
+ entrypoints: {
486
+ NoConnection(to, from, listeners, options, protocolVersion, log) {
487
+ const id = `session-${generateId()}`;
488
+ const telemetry = createSessionTelemetryInfo(id, to, from);
489
+ const sendBuffer = [];
490
+ const session = new SessionNoConnection(
491
+ listeners,
492
+ id,
493
+ from,
494
+ to,
495
+ 0,
496
+ 0,
497
+ sendBuffer,
498
+ telemetry,
499
+ options,
500
+ protocolVersion,
501
+ log
502
+ );
503
+ session.log?.info(`session ${session.id} created in NoConnection state`, {
504
+ ...session.loggingMetadata,
505
+ tags: ["state-transition"]
506
+ });
507
+ return session;
508
+ },
509
+ WaitingForHandshake(from, conn, listeners, options, log) {
510
+ const session = new SessionWaitingForHandshake(
511
+ conn,
512
+ listeners,
513
+ from,
514
+ options,
515
+ log
516
+ );
517
+ session.log?.info(`session created in WaitingForHandshake state`, {
518
+ ...session.loggingMetadata,
519
+ tags: ["state-transition"]
520
+ });
521
+ return session;
522
+ }
523
+ },
524
+ // All of the transitions 'move'/'consume' the old session and return a new one.
525
+ // After a session is transitioned, any usage of the old session will throw.
526
+ transition: {
527
+ // happy path transitions
528
+ NoConnectionToConnecting(oldSession, connPromise, listeners) {
529
+ const carriedState = inheritSharedSession(oldSession);
530
+ oldSession._handleStateExit();
531
+ const session = new SessionConnecting(
532
+ connPromise,
533
+ listeners,
534
+ ...carriedState
535
+ );
536
+ session.log?.info(
537
+ `session ${session.id} transition from NoConnection to Connecting`,
538
+ {
539
+ ...session.loggingMetadata,
540
+ tags: ["state-transition"]
541
+ }
542
+ );
543
+ return session;
544
+ },
545
+ ConnectingToHandshaking(oldSession, conn, listeners) {
546
+ const carriedState = inheritSharedSession(oldSession);
547
+ oldSession._handleStateExit();
548
+ const session = new SessionHandshaking(conn, listeners, ...carriedState);
549
+ session.log?.info(
550
+ `session ${session.id} transition from Connecting to Handshaking`,
551
+ {
552
+ ...session.loggingMetadata,
553
+ tags: ["state-transition"]
554
+ }
555
+ );
556
+ return session;
557
+ },
558
+ HandshakingToConnected(oldSession, listeners) {
559
+ const carriedState = inheritSharedSession(oldSession);
560
+ const conn = oldSession.conn;
561
+ oldSession._handleStateExit();
562
+ const session = new SessionConnected(conn, listeners, ...carriedState);
563
+ session.log?.info(
564
+ `session ${session.id} transition from Handshaking to Connected`,
565
+ {
566
+ ...session.loggingMetadata,
567
+ tags: ["state-transition"]
568
+ }
569
+ );
570
+ return session;
571
+ },
572
+ WaitingForHandshakeToConnected(pendingSession, oldSession, sessionId, to, propagationCtx, listeners, protocolVersion) {
573
+ const conn = pendingSession.conn;
574
+ const { from, options } = pendingSession;
575
+ const carriedState = oldSession ? (
576
+ // old session exists, inherit state
577
+ inheritSharedSession(oldSession)
578
+ ) : (
579
+ // old session does not exist, create new state
580
+ [
581
+ sessionId,
582
+ from,
583
+ to,
584
+ 0,
585
+ 0,
586
+ [],
587
+ createSessionTelemetryInfo(sessionId, to, from, propagationCtx),
588
+ options,
589
+ protocolVersion,
590
+ pendingSession.log
591
+ ]
592
+ );
593
+ pendingSession._handleStateExit();
594
+ oldSession?._handleStateExit();
595
+ const session = new SessionConnected(conn, listeners, ...carriedState);
596
+ session.log?.info(
597
+ `session ${session.id} transition from WaitingForHandshake to Connected`,
598
+ {
599
+ ...session.loggingMetadata,
600
+ tags: ["state-transition"]
601
+ }
602
+ );
603
+ return session;
604
+ },
605
+ // disconnect paths
606
+ ConnectingToNoConnection(oldSession, listeners) {
607
+ const carriedState = inheritSharedSession(oldSession);
608
+ oldSession.bestEffortClose();
609
+ oldSession._handleStateExit();
610
+ const session = new SessionNoConnection(listeners, ...carriedState);
611
+ session.log?.info(
612
+ `session ${session.id} transition from Connecting to NoConnection`,
613
+ {
614
+ ...session.loggingMetadata,
615
+ tags: ["state-transition"]
616
+ }
617
+ );
618
+ return session;
619
+ },
620
+ HandshakingToNoConnection(oldSession, listeners) {
621
+ const carriedState = inheritSharedSession(oldSession);
622
+ oldSession.conn.close();
623
+ oldSession._handleStateExit();
624
+ const session = new SessionNoConnection(listeners, ...carriedState);
625
+ session.log?.info(
626
+ `session ${session.id} transition from Handshaking to NoConnection`,
627
+ {
628
+ ...session.loggingMetadata,
629
+ tags: ["state-transition"]
630
+ }
631
+ );
632
+ return session;
633
+ },
634
+ ConnectedToNoConnection(oldSession, listeners) {
635
+ const carriedState = inheritSharedSession(oldSession);
636
+ oldSession.conn.close();
637
+ oldSession._handleStateExit();
638
+ const session = new SessionNoConnection(listeners, ...carriedState);
639
+ session.log?.info(
640
+ `session ${session.id} transition from Connected to NoConnection`,
641
+ {
642
+ ...session.loggingMetadata,
643
+ tags: ["state-transition"]
644
+ }
645
+ );
646
+ return session;
647
+ }
648
+ }
649
+ };
650
+
651
+ export {
652
+ defaultTransportOptions,
653
+ defaultClientTransportOptions,
654
+ defaultServerTransportOptions,
655
+ SessionState,
656
+ SessionStateGraph
657
+ };
658
+ //# sourceMappingURL=chunk-RDGHFHXN.js.map