@replit/river 0.23.13 → 0.23.14

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 (62) hide show
  1. package/dist/{chunk-SX6HI63Q.js → chunk-BEALFLCB.js} +2 -2
  2. package/dist/{chunk-S4DUN7KK.js → chunk-D2DHRRBN.js} +41 -20
  3. package/dist/chunk-D2DHRRBN.js.map +1 -0
  4. package/dist/{chunk-ES4XO2XD.js → chunk-GCCRVSMR.js} +33 -4
  5. package/dist/chunk-GCCRVSMR.js.map +1 -0
  6. package/dist/{chunk-KFTGQ3QC.js → chunk-GN4YEXT7.js} +2 -2
  7. package/dist/{chunk-2FNLANTJ.js → chunk-O2AVDJCQ.js} +10 -2
  8. package/dist/{chunk-2FNLANTJ.js.map → chunk-O2AVDJCQ.js.map} +1 -1
  9. package/dist/{chunk-XM656KMN.js → chunk-OTVTKAN6.js} +46 -3
  10. package/dist/chunk-OTVTKAN6.js.map +1 -0
  11. package/dist/{chunk-ZUKDZY54.js → chunk-WUL63FR6.js} +89 -25
  12. package/dist/chunk-WUL63FR6.js.map +1 -0
  13. package/dist/{chunk-4QZOW4DH.js → chunk-YCLZWES2.js} +2 -2
  14. package/dist/{client-dd5c9dd0.d.ts → client-e13979ac.d.ts} +1 -1
  15. package/dist/{connection-39816c00.d.ts → connection-5d0978ce.d.ts} +1 -1
  16. package/dist/{connection-40318f22.d.ts → connection-e57e98ea.d.ts} +1 -1
  17. package/dist/{handshake-e428d1c8.d.ts → handshake-5665ffd3.d.ts} +13 -0
  18. package/dist/router/index.cjs +16 -1
  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 +2 -2
  23. package/dist/{server-ebf80863.d.ts → server-1cfc88d1.d.ts} +1 -1
  24. package/dist/{services-f406b3aa.d.ts → services-86c4d10d.d.ts} +2 -2
  25. package/dist/transport/impls/uds/client.cjs +113 -18
  26. package/dist/transport/impls/uds/client.cjs.map +1 -1
  27. package/dist/transport/impls/uds/client.d.cts +3 -3
  28. package/dist/transport/impls/uds/client.d.ts +3 -3
  29. package/dist/transport/impls/uds/client.js +5 -5
  30. package/dist/transport/impls/uds/server.cjs +157 -23
  31. package/dist/transport/impls/uds/server.cjs.map +1 -1
  32. package/dist/transport/impls/uds/server.d.cts +3 -3
  33. package/dist/transport/impls/uds/server.d.ts +3 -3
  34. package/dist/transport/impls/uds/server.js +5 -5
  35. package/dist/transport/impls/ws/client.cjs +113 -18
  36. package/dist/transport/impls/ws/client.cjs.map +1 -1
  37. package/dist/transport/impls/ws/client.d.cts +3 -3
  38. package/dist/transport/impls/ws/client.d.ts +3 -3
  39. package/dist/transport/impls/ws/client.js +5 -5
  40. package/dist/transport/impls/ws/server.cjs +157 -23
  41. package/dist/transport/impls/ws/server.cjs.map +1 -1
  42. package/dist/transport/impls/ws/server.d.cts +3 -3
  43. package/dist/transport/impls/ws/server.d.ts +3 -3
  44. package/dist/transport/impls/ws/server.js +5 -5
  45. package/dist/transport/index.cjs +202 -40
  46. package/dist/transport/index.cjs.map +1 -1
  47. package/dist/transport/index.d.cts +3 -3
  48. package/dist/transport/index.d.ts +3 -3
  49. package/dist/transport/index.js +5 -5
  50. package/dist/util/testHelpers.cjs +9 -1
  51. package/dist/util/testHelpers.cjs.map +1 -1
  52. package/dist/util/testHelpers.d.cts +3 -3
  53. package/dist/util/testHelpers.d.ts +3 -3
  54. package/dist/util/testHelpers.js +3 -3
  55. package/package.json +13 -14
  56. package/dist/chunk-ES4XO2XD.js.map +0 -1
  57. package/dist/chunk-S4DUN7KK.js.map +0 -1
  58. package/dist/chunk-XM656KMN.js.map +0 -1
  59. package/dist/chunk-ZUKDZY54.js.map +0 -1
  60. /package/dist/{chunk-SX6HI63Q.js.map → chunk-BEALFLCB.js.map} +0 -0
  61. /package/dist/{chunk-KFTGQ3QC.js.map → chunk-GN4YEXT7.js.map} +0 -0
  62. /package/dist/{chunk-4QZOW4DH.js.map → chunk-YCLZWES2.js.map} +0 -0
@@ -59,6 +59,21 @@ var ControlMessageHandshakeRequestSchema = import_typebox.Type.Object({
59
59
  type: import_typebox.Type.Literal("HANDSHAKE_REQ"),
60
60
  protocolVersion: import_typebox.Type.String(),
61
61
  sessionId: import_typebox.Type.String(),
62
+ /**
63
+ * Specifies what the server's expected session state (from the pov of the client). This can be
64
+ * used by the server to know whether this is a new or a reestablished connection, and whether it
65
+ * is compatible with what it already has.
66
+ */
67
+ expectedSessionState: import_typebox.Type.Optional(
68
+ import_typebox.Type.Object({
69
+ /**
70
+ * reconnect is set to true if the client explicitly wants to reestablish an existing
71
+ * connection.
72
+ */
73
+ reconnect: import_typebox.Type.Boolean(),
74
+ nextExpectedSeq: import_typebox.Type.Integer()
75
+ })
76
+ ),
62
77
  metadata: import_typebox.Type.Optional(import_typebox.Type.Unknown())
63
78
  });
64
79
  var ControlMessageHandshakeResponseSchema = import_typebox.Type.Object({
@@ -83,7 +98,14 @@ var ControlMessagePayloadSchema = import_typebox.Type.Union([
83
98
  var OpaqueTransportMessageSchema = TransportMessageSchema(
84
99
  import_typebox.Type.Unknown()
85
100
  );
86
- function handshakeRequestMessage(from, to, sessionId, metadata, tracing) {
101
+ function handshakeRequestMessage({
102
+ from,
103
+ to,
104
+ sessionId,
105
+ expectedSessionState,
106
+ metadata,
107
+ tracing
108
+ }) {
87
109
  return {
88
110
  id: (0, import_nanoid.nanoid)(),
89
111
  from,
@@ -97,10 +119,12 @@ function handshakeRequestMessage(from, to, sessionId, metadata, tracing) {
97
119
  type: "HANDSHAKE_REQ",
98
120
  protocolVersion: PROTOCOL_VERSION,
99
121
  sessionId,
122
+ expectedSessionState,
100
123
  metadata
101
124
  }
102
125
  };
103
126
  }
127
+ var SESSION_STATE_MISMATCH = "session state mismatch";
104
128
  function isAck(controlFlag) {
105
129
  return (controlFlag & 1 /* AckBit */) === 1 /* AckBit */;
106
130
  }
@@ -350,7 +374,7 @@ var import_nanoid2 = require("nanoid");
350
374
  var import_api = require("@opentelemetry/api");
351
375
 
352
376
  // package.json
353
- var version = "0.23.13";
377
+ var version = "0.23.14";
354
378
 
355
379
  // tracing/index.ts
356
380
  function getPropagationContext(ctx) {
@@ -664,9 +688,17 @@ var Session = class {
664
688
  get connected() {
665
689
  return this.connection !== void 0;
666
690
  }
691
+ get nextExpectedAck() {
692
+ return this.seq;
693
+ }
667
694
  get nextExpectedSeq() {
668
695
  return this.ack;
669
696
  }
697
+ // This is only used in tests to make the session misbehave.
698
+ /* @internal */
699
+ advanceAckForTesting(by) {
700
+ this.ack += by;
701
+ }
670
702
  constructMsg(partialMsg) {
671
703
  const msg = {
672
704
  ...partialMsg,
@@ -777,6 +809,49 @@ var Transport = class {
777
809
  });
778
810
  return session;
779
811
  }
812
+ createNewSession({
813
+ to,
814
+ conn,
815
+ sessionId,
816
+ propagationCtx
817
+ }) {
818
+ let session = this.sessions.get(to);
819
+ if (session !== void 0) {
820
+ this.log?.info(
821
+ `session for ${to} already exists, replacing it with a new session as requested`,
822
+ session.loggingMetadata
823
+ );
824
+ this.deleteSession({
825
+ session,
826
+ closeHandshakingConnection: false
827
+ });
828
+ session = void 0;
829
+ }
830
+ session = this.createSession(to, conn, propagationCtx);
831
+ session.advertisedSessionId = sessionId;
832
+ this.log?.info(`created new session for ${to}`, session.loggingMetadata);
833
+ return session;
834
+ }
835
+ getExistingSession({
836
+ to,
837
+ sessionId,
838
+ nextExpectedSeq
839
+ }) {
840
+ const session = this.sessions.get(to);
841
+ if (
842
+ // reject this request if there was no previous session to replace
843
+ session === void 0 || // or if both parties do not agree about the next expected sequence number
844
+ session.nextExpectedAck < nextExpectedSeq || // or if both parties do not agree on the advertised session id
845
+ session.advertisedSessionId !== sessionId
846
+ ) {
847
+ return false;
848
+ }
849
+ this.log?.info(
850
+ `reused existing session for ${to}`,
851
+ session.loggingMetadata
852
+ );
853
+ return session;
854
+ }
780
855
  getOrCreateSession({
781
856
  to,
782
857
  conn,
@@ -1187,24 +1262,40 @@ var ClientTransport = class extends Transport {
1187
1262
  );
1188
1263
  return false;
1189
1264
  }
1265
+ const previousSession = this.sessions.get(parsed.from);
1190
1266
  if (!parsed.payload.status.ok) {
1191
- conn.telemetry?.span.setStatus({
1192
- code: import_api4.SpanStatusCode.ERROR,
1193
- message: "handshake rejected"
1194
- });
1195
- this.log?.warn(`received handshake rejection`, {
1196
- ...conn.loggingMetadata,
1197
- clientId: this.clientId,
1198
- connectedTo: parsed.from,
1199
- transportMessage: parsed
1200
- });
1267
+ if (parsed.payload.status.reason === SESSION_STATE_MISMATCH) {
1268
+ if (previousSession) {
1269
+ this.deleteSession({
1270
+ session: previousSession,
1271
+ closeHandshakingConnection: true
1272
+ });
1273
+ }
1274
+ conn.telemetry?.span.setStatus({
1275
+ code: import_api4.SpanStatusCode.ERROR,
1276
+ message: parsed.payload.status.reason
1277
+ });
1278
+ } else {
1279
+ conn.telemetry?.span.setStatus({
1280
+ code: import_api4.SpanStatusCode.ERROR,
1281
+ message: "handshake rejected"
1282
+ });
1283
+ }
1284
+ this.log?.warn(
1285
+ `received handshake rejection: ${parsed.payload.status.reason}`,
1286
+ {
1287
+ ...conn.loggingMetadata,
1288
+ clientId: this.clientId,
1289
+ connectedTo: parsed.from,
1290
+ transportMessage: parsed
1291
+ }
1292
+ );
1201
1293
  this.protocolError(
1202
1294
  ProtocolError.HandshakeFailed,
1203
1295
  parsed.payload.status.reason
1204
1296
  );
1205
1297
  return false;
1206
1298
  }
1207
- const previousSession = this.sessions.get(parsed.from);
1208
1299
  if (previousSession?.advertisedSessionId && previousSession.advertisedSessionId !== parsed.payload.status.sessionId) {
1209
1300
  this.deleteSession({
1210
1301
  session: previousSession,
@@ -1384,13 +1475,17 @@ var ClientTransport = class extends Transport {
1384
1475
  }
1385
1476
  }
1386
1477
  const { session } = this.getOrCreateSession({ to, handshakingConn: conn });
1387
- const requestMsg = handshakeRequestMessage(
1388
- this.clientId,
1478
+ const requestMsg = handshakeRequestMessage({
1479
+ from: this.clientId,
1389
1480
  to,
1390
- session.id,
1481
+ sessionId: session.id,
1482
+ expectedSessionState: {
1483
+ reconnect: session.advertisedSessionId !== void 0,
1484
+ nextExpectedSeq: session.nextExpectedSeq
1485
+ },
1391
1486
  metadata,
1392
- getPropagationContext(session.telemetry.ctx)
1393
- );
1487
+ tracing: getPropagationContext(session.telemetry.ctx)
1488
+ });
1394
1489
  this.log?.debug(`sending handshake request to ${to}`, {
1395
1490
  ...conn.loggingMetadata,
1396
1491
  clientId: this.clientId,