@replit/river 0.12.6 → 0.13.1

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 (51) hide show
  1. package/README.md +6 -1
  2. package/dist/{builder-c593de11.d.ts → builder-eef3b061.d.ts} +16 -7
  3. package/dist/{chunk-AFLZ6INU.js → chunk-JXKTY3GQ.js} +77 -49
  4. package/dist/{chunk-IIBVKYDB.js → chunk-JXO2SCQB.js} +39 -1
  5. package/dist/{chunk-4SDJ5VN4.js → chunk-LDUFHGZU.js} +150 -116
  6. package/dist/{chunk-VLBVQX5H.js → chunk-Q7AWJYDQ.js} +1 -1
  7. package/dist/{chunk-XFFS4UOD.js → chunk-SCG5S2EC.js} +9 -9
  8. package/dist/{messageFraming-b200ef25.d.ts → connection-03e650c8.d.ts} +17 -2
  9. package/dist/{connection-ba37d174.d.ts → connection-d052d027.d.ts} +1 -1
  10. package/dist/{index-54e0f99c.d.ts → index-9aa0aabb.d.ts} +29 -39
  11. package/dist/router/index.cjs +83 -56
  12. package/dist/router/index.d.cts +5 -5
  13. package/dist/router/index.d.ts +5 -5
  14. package/dist/router/index.js +2 -2
  15. package/dist/transport/impls/uds/client.cjs +144 -122
  16. package/dist/transport/impls/uds/client.d.cts +2 -3
  17. package/dist/transport/impls/uds/client.d.ts +2 -3
  18. package/dist/transport/impls/uds/client.js +5 -6
  19. package/dist/transport/impls/uds/server.cjs +153 -129
  20. package/dist/transport/impls/uds/server.d.cts +2 -3
  21. package/dist/transport/impls/uds/server.d.ts +2 -3
  22. package/dist/transport/impls/uds/server.js +4 -5
  23. package/dist/transport/impls/ws/client.cjs +151 -134
  24. package/dist/transport/impls/ws/client.d.cts +4 -4
  25. package/dist/transport/impls/ws/client.d.ts +4 -4
  26. package/dist/transport/impls/ws/client.js +10 -17
  27. package/dist/transport/impls/ws/server.cjs +153 -129
  28. package/dist/transport/impls/ws/server.d.cts +2 -2
  29. package/dist/transport/impls/ws/server.d.ts +2 -2
  30. package/dist/transport/impls/ws/server.js +4 -4
  31. package/dist/transport/index.cjs +204 -169
  32. package/dist/transport/index.d.cts +1 -1
  33. package/dist/transport/index.d.ts +1 -1
  34. package/dist/transport/index.js +3 -3
  35. package/dist/util/testHelpers.cjs +294 -16
  36. package/dist/util/testHelpers.d.cts +2 -2
  37. package/dist/util/testHelpers.d.ts +2 -2
  38. package/dist/util/testHelpers.js +30 -8
  39. package/package.json +1 -9
  40. package/dist/chunk-PBPXYLI6.js +0 -44
  41. package/dist/chunk-Q7GL34DZ.js +0 -47
  42. package/dist/connection-1f9971d8.d.ts +0 -17
  43. package/dist/connection-24d878ac.d.ts +0 -18
  44. package/dist/transport/impls/stdio/client.cjs +0 -904
  45. package/dist/transport/impls/stdio/client.d.cts +0 -27
  46. package/dist/transport/impls/stdio/client.d.ts +0 -27
  47. package/dist/transport/impls/stdio/client.js +0 -42
  48. package/dist/transport/impls/stdio/server.cjs +0 -879
  49. package/dist/transport/impls/stdio/server.d.cts +0 -25
  50. package/dist/transport/impls/stdio/server.d.ts +0 -25
  51. package/dist/transport/impls/stdio/server.js +0 -33
@@ -42,8 +42,8 @@ var TransportMessageSchema = (t) => import_typebox.Type.Object({
42
42
  to: import_typebox.Type.String(),
43
43
  seq: import_typebox.Type.Integer(),
44
44
  ack: import_typebox.Type.Integer(),
45
- serviceName: import_typebox.Type.Optional(import_typebox.Type.Union([import_typebox.Type.String(), import_typebox.Type.Null()])),
46
- procedureName: import_typebox.Type.Optional(import_typebox.Type.Union([import_typebox.Type.String(), import_typebox.Type.Null()])),
45
+ serviceName: import_typebox.Type.Optional(import_typebox.Type.String()),
46
+ procedureName: import_typebox.Type.Optional(import_typebox.Type.String()),
47
47
  streamId: import_typebox.Type.String(),
48
48
  controlFlags: import_typebox.Type.Integer(),
49
49
  payload: t
@@ -57,7 +57,7 @@ var ControlMessageCloseSchema = import_typebox.Type.Object({
57
57
  var PROTOCOL_VERSION = "v1";
58
58
  var ControlMessageHandshakeRequestSchema = import_typebox.Type.Object({
59
59
  type: import_typebox.Type.Literal("HANDSHAKE_REQ"),
60
- protocolVersion: import_typebox.Type.Literal(PROTOCOL_VERSION),
60
+ protocolVersion: import_typebox.Type.String(),
61
61
  instanceId: import_typebox.Type.String()
62
62
  });
63
63
  var ControlMessageHandshakeResponseSchema = import_typebox.Type.Object({
@@ -69,7 +69,7 @@ var ControlMessageHandshakeResponseSchema = import_typebox.Type.Object({
69
69
  }),
70
70
  import_typebox.Type.Object({
71
71
  ok: import_typebox.Type.Literal(false),
72
- reason: import_typebox.Type.Union([import_typebox.Type.Literal("VERSION_MISMATCH")])
72
+ reason: import_typebox.Type.String()
73
73
  })
74
74
  ])
75
75
  });
@@ -82,7 +82,7 @@ var ControlMessagePayloadSchema = import_typebox.Type.Union([
82
82
  var OpaqueTransportMessageSchema = TransportMessageSchema(
83
83
  import_typebox.Type.Unknown()
84
84
  );
85
- function bootRequestMessage(from, to, instanceId) {
85
+ function handshakeRequestMessage(from, to, instanceId) {
86
86
  return {
87
87
  id: (0, import_nanoid.nanoid)(),
88
88
  from,
@@ -98,7 +98,7 @@ function bootRequestMessage(from, to, instanceId) {
98
98
  }
99
99
  };
100
100
  }
101
- function bootResponseMessage(from, instanceId, to, ok) {
101
+ function handshakeResponseMessage(from, instanceId, to, ok, reason) {
102
102
  return {
103
103
  id: (0, import_nanoid.nanoid)(),
104
104
  from,
@@ -117,7 +117,7 @@ function bootResponseMessage(from, instanceId, to, ok) {
117
117
  type: "HANDSHAKE_RESP",
118
118
  status: {
119
119
  ok: false,
120
- reason: "VERSION_MISMATCH"
120
+ reason: reason ?? "Unknown reason"
121
121
  }
122
122
  }
123
123
  };
@@ -159,6 +159,60 @@ var EventDispatcher = class {
159
159
 
160
160
  // transport/session.ts
161
161
  var import_nanoid2 = require("nanoid");
162
+
163
+ // codec/json.ts
164
+ var encoder = new TextEncoder();
165
+ var decoder = new TextDecoder();
166
+ function uint8ArrayToBase64(uint8Array) {
167
+ let binary = "";
168
+ uint8Array.forEach((byte) => {
169
+ binary += String.fromCharCode(byte);
170
+ });
171
+ return btoa(binary);
172
+ }
173
+ function base64ToUint8Array(base64) {
174
+ const binaryString = atob(base64);
175
+ const uint8Array = new Uint8Array(binaryString.length);
176
+ for (let i = 0; i < binaryString.length; i++) {
177
+ uint8Array[i] = binaryString.charCodeAt(i);
178
+ }
179
+ return uint8Array;
180
+ }
181
+ var NaiveJsonCodec = {
182
+ toBuffer: (obj) => {
183
+ return encoder.encode(
184
+ JSON.stringify(obj, function replacer(key) {
185
+ const val = this[key];
186
+ if (val instanceof Uint8Array) {
187
+ return { $t: uint8ArrayToBase64(val) };
188
+ } else {
189
+ return val;
190
+ }
191
+ })
192
+ );
193
+ },
194
+ fromBuffer: (buff) => {
195
+ try {
196
+ const parsed = JSON.parse(
197
+ decoder.decode(buff),
198
+ function reviver(_key, val) {
199
+ if (val?.$t) {
200
+ return base64ToUint8Array(val.$t);
201
+ } else {
202
+ return val;
203
+ }
204
+ }
205
+ );
206
+ if (typeof parsed === "object")
207
+ return parsed;
208
+ return null;
209
+ } catch {
210
+ return null;
211
+ }
212
+ }
213
+ };
214
+
215
+ // transport/session.ts
162
216
  var nanoid2 = (0, import_nanoid2.customAlphabet)("1234567890abcdefghijklmnopqrstuvxyz", 6);
163
217
  var unsafeId = () => nanoid2();
164
218
  var Connection = class {
@@ -170,8 +224,15 @@ var Connection = class {
170
224
  var HEARTBEAT_INTERVAL_MS = 1e3;
171
225
  var HEARTBEATS_TILL_DEAD = 2;
172
226
  var SESSION_DISCONNECT_GRACE_MS = 5e3;
227
+ var defaultSessionOptions = {
228
+ heartbeatIntervalMs: HEARTBEAT_INTERVAL_MS,
229
+ heartbeatsUntilDead: HEARTBEATS_TILL_DEAD,
230
+ sessionDisconnectGraceMs: SESSION_DISCONNECT_GRACE_MS,
231
+ codec: NaiveJsonCodec
232
+ };
173
233
  var Session = class {
174
234
  codec;
235
+ options;
175
236
  /**
176
237
  * The buffer of messages that have been sent but not yet acknowledged.
177
238
  */
@@ -207,16 +268,17 @@ var Session = class {
207
268
  * The interval for sending heartbeats.
208
269
  */
209
270
  heartbeat;
210
- constructor(codec, from, connectedTo, conn) {
271
+ constructor(from, connectedTo, conn, options) {
272
+ this.options = options;
211
273
  this.debugId = `sess-${unsafeId()}`;
212
274
  this.from = from;
213
275
  this.to = connectedTo;
214
276
  this.connection = conn;
215
- this.codec = codec;
277
+ this.codec = options.codec;
216
278
  this.heartbeatMisses = 0;
217
279
  this.heartbeat = setInterval(
218
280
  () => this.sendHeartbeat(),
219
- HEARTBEAT_INTERVAL_MS
281
+ options.heartbeatIntervalMs
220
282
  );
221
283
  }
222
284
  /**
@@ -252,7 +314,7 @@ var Session = class {
252
314
  return fullMsg.id;
253
315
  }
254
316
  sendHeartbeat() {
255
- if (this.heartbeatMisses >= HEARTBEATS_TILL_DEAD) {
317
+ if (this.heartbeatMisses >= this.options.heartbeatsUntilDead) {
256
318
  if (this.connection) {
257
319
  log?.info(
258
320
  `${this.from} -- closing connection (id: ${this.connection.debugId}) to ${this.to} due to inactivity`
@@ -322,7 +384,7 @@ var Session = class {
322
384
  this.disconnectionGrace = setTimeout(() => {
323
385
  this.close();
324
386
  cb();
325
- }, SESSION_DISCONNECT_GRACE_MS);
387
+ }, this.options.sessionDisconnectGraceMs);
326
388
  }
327
389
  // called on reconnect of the underlying session
328
390
  cancelGrace() {
@@ -360,58 +422,6 @@ var Session = class {
360
422
  }
361
423
  };
362
424
 
363
- // codec/json.ts
364
- var encoder = new TextEncoder();
365
- var decoder = new TextDecoder();
366
- function uint8ArrayToBase64(uint8Array) {
367
- let binary = "";
368
- uint8Array.forEach((byte) => {
369
- binary += String.fromCharCode(byte);
370
- });
371
- return btoa(binary);
372
- }
373
- function base64ToUint8Array(base64) {
374
- const binaryString = atob(base64);
375
- const uint8Array = new Uint8Array(binaryString.length);
376
- for (let i = 0; i < binaryString.length; i++) {
377
- uint8Array[i] = binaryString.charCodeAt(i);
378
- }
379
- return uint8Array;
380
- }
381
- var NaiveJsonCodec = {
382
- toBuffer: (obj) => {
383
- return encoder.encode(
384
- JSON.stringify(obj, function replacer(key) {
385
- const val = this[key];
386
- if (val instanceof Uint8Array) {
387
- return { $t: uint8ArrayToBase64(val) };
388
- } else {
389
- return val;
390
- }
391
- })
392
- );
393
- },
394
- fromBuffer: (buff) => {
395
- try {
396
- const parsed = JSON.parse(
397
- decoder.decode(buff),
398
- function reviver(_key, val) {
399
- if (val?.$t) {
400
- return base64ToUint8Array(val.$t);
401
- } else {
402
- return val;
403
- }
404
- }
405
- );
406
- if (typeof parsed === "object")
407
- return parsed;
408
- return null;
409
- } catch {
410
- return null;
411
- }
412
- }
413
- };
414
-
415
425
  // transport/transport.ts
416
426
  var import_nanoid3 = require("nanoid");
417
427
 
@@ -424,13 +434,13 @@ function coerceErrorString(err) {
424
434
  }
425
435
 
426
436
  // transport/transport.ts
427
- var DEFAULT_RECONNECT_JITTER_MAX_MS = 500;
428
- var DEFAULT_RECONNECT_INTERVAL_MS = 250;
437
+ var RECONNECT_JITTER_MAX_MS = 500;
438
+ var RECONNECT_INTERVAL_MS = 250;
429
439
  var defaultTransportOptions = {
430
- retryIntervalMs: DEFAULT_RECONNECT_INTERVAL_MS,
431
- retryJitterMs: DEFAULT_RECONNECT_JITTER_MAX_MS,
440
+ retryIntervalMs: RECONNECT_INTERVAL_MS,
441
+ retryJitterMs: RECONNECT_JITTER_MAX_MS,
432
442
  retryAttemptsMax: 5,
433
- codec: NaiveJsonCodec
443
+ ...defaultSessionOptions
434
444
  };
435
445
  var Transport = class {
436
446
  /**
@@ -501,7 +511,7 @@ var Transport = class {
501
511
  const lastInstanceId = this.connectedInstanceIds.get(connectedTo);
502
512
  if (oldSession && lastInstanceId !== void 0 && lastInstanceId !== instanceId) {
503
513
  log?.warn(
504
- `${this.clientId} -- handshake from ${connectedTo} is a different instance (got: ${instanceId}, last connected to: ${lastInstanceId}), starting a new session`
514
+ `${this.clientId} -- connection from ${connectedTo} is a different instance (got: ${instanceId}, last connected to: ${lastInstanceId}), starting a new session`
505
515
  );
506
516
  oldSession.close();
507
517
  this.deleteSession(oldSession);
@@ -524,10 +534,10 @@ var Transport = class {
524
534
  }
525
535
  createSession(connectedTo, conn) {
526
536
  const session = new Session(
527
- this.codec,
528
537
  this.clientId,
529
538
  connectedTo,
530
- conn
539
+ conn,
540
+ this.options
531
541
  );
532
542
  this.sessions.set(session.to, session);
533
543
  this.eventDispatcher.dispatchEvent("sessionStatus", {
@@ -570,7 +580,7 @@ var Transport = class {
570
580
  parseMsg(msg) {
571
581
  const parsedMsg = this.codec.fromBuffer(msg);
572
582
  if (parsedMsg === null) {
573
- const decodedBuffer = new TextDecoder().decode(msg);
583
+ const decodedBuffer = new TextDecoder().decode(Buffer.from(msg));
574
584
  log?.error(
575
585
  `${this.clientId} -- received malformed msg, killing conn: ${decodedBuffer}`
576
586
  );
@@ -584,11 +594,7 @@ var Transport = class {
584
594
  );
585
595
  return null;
586
596
  }
587
- return {
588
- ...parsedMsg,
589
- serviceName: parsedMsg.serviceName === null ? void 0 : parsedMsg.serviceName,
590
- procedureName: parsedMsg.procedureName === null ? void 0 : parsedMsg.procedureName
591
- };
597
+ return parsedMsg;
592
598
  }
593
599
  /**
594
600
  * Called when a message is received by this transport.
@@ -607,11 +613,18 @@ var Transport = class {
607
613
  session.cancelGrace();
608
614
  log?.debug(`${this.clientId} -- received msg: ${JSON.stringify(msg)}`);
609
615
  if (msg.seq !== session.nextExpectedSeq) {
610
- log?.warn(
611
- `${this.clientId} -- received out-of-order msg (got: ${msg.seq}, wanted: ${session.nextExpectedSeq}), discarding: ${JSON.stringify(
612
- msg
613
- )}`
614
- );
616
+ if (msg.seq < session.nextExpectedSeq) {
617
+ log?.debug(
618
+ `${this.clientId} -- received duplicate msg (got: ${msg.seq}, wanted: ${session.nextExpectedSeq}), discarding: ${JSON.stringify(
619
+ msg
620
+ )}`
621
+ );
622
+ } else {
623
+ log?.error(
624
+ `${this.clientId} -- received out-of-order msg (got: ${msg.seq}, wanted: ${session.nextExpectedSeq}), marking connection as dead: ${JSON.stringify(msg)}`
625
+ );
626
+ session.closeStaleConnection(session.connection);
627
+ }
615
628
  return;
616
629
  }
617
630
  if (!isAck(msg.controlFlags)) {
@@ -629,7 +642,7 @@ var Transport = class {
629
642
  }
630
643
  /**
631
644
  * Removes a listener from this transport.
632
- * @param the type of event to unlisten on
645
+ * @param the type of event to un-listen on
633
646
  * @param handler The message handler to remove.
634
647
  */
635
648
  removeEventListener(type, handler) {
@@ -706,23 +719,31 @@ var ClientTransport = class extends Transport {
706
719
  */
707
720
  inflightConnectionPromises;
708
721
  tryReconnecting = true;
709
- constructor(clientId, providedOptions) {
722
+ connectedTo;
723
+ constructor(clientId, connectedTo, providedOptions) {
710
724
  super(clientId, providedOptions);
725
+ this.connectedTo = connectedTo;
711
726
  this.inflightConnectionPromises = /* @__PURE__ */ new Map();
712
727
  }
713
728
  handleConnection(conn, to) {
714
- const bootHandler = this.receiveWithBootSequence(conn, () => {
715
- conn.removeDataListener(bootHandler);
716
- conn.addDataListener((data) => {
717
- const parsed = this.parseMsg(data);
729
+ const handshakeHandler = (data) => {
730
+ const handshake = this.receiveHandshakeResponseMessage(data);
731
+ if (!handshake) {
732
+ conn.close();
733
+ return;
734
+ }
735
+ this.onConnect(conn, handshake.from, handshake.instanceId);
736
+ conn.removeDataListener(handshakeHandler);
737
+ conn.addDataListener((data2) => {
738
+ const parsed = this.parseMsg(data2);
718
739
  if (!parsed) {
719
740
  conn.close();
720
741
  return;
721
742
  }
722
743
  this.handleMsg(parsed);
723
744
  });
724
- });
725
- conn.addDataListener(bootHandler);
745
+ };
746
+ conn.addDataListener(handshakeHandler);
726
747
  conn.addCloseListener(() => {
727
748
  this.onDisconnect(conn, to);
728
749
  void this.connect(to);
@@ -733,6 +754,32 @@ var ClientTransport = class extends Transport {
733
754
  );
734
755
  });
735
756
  }
757
+ receiveHandshakeResponseMessage(data) {
758
+ const parsed = this.parseMsg(data);
759
+ if (!parsed)
760
+ return false;
761
+ if (!import_value.Value.Check(ControlMessageHandshakeResponseSchema, parsed.payload)) {
762
+ log?.warn(
763
+ `${this.clientId} -- received invalid handshake resp: ${JSON.stringify(
764
+ parsed
765
+ )}`
766
+ );
767
+ return false;
768
+ }
769
+ if (!parsed.payload.status.ok) {
770
+ log?.warn(
771
+ `${this.clientId} -- received failed handshake resp: ${JSON.stringify(
772
+ parsed
773
+ )}`
774
+ );
775
+ return false;
776
+ }
777
+ const instanceId = parsed.payload.status.instanceId;
778
+ log?.debug(
779
+ `${this.clientId} -- handshake from ${parsed.from} ok (instance: ${instanceId})`
780
+ );
781
+ return { instanceId, from: parsed.from };
782
+ }
736
783
  /**
737
784
  * Manually attempts to connect to a client.
738
785
  * @param to The client ID of the node to connect to.
@@ -751,10 +798,7 @@ var ClientTransport = class extends Transport {
751
798
  }
752
799
  try {
753
800
  const conn = await reconnectPromise;
754
- this.state = "open";
755
- const requestMsg = bootRequestMessage(this.clientId, to, this.instanceId);
756
- log?.debug(`${this.clientId} -- sending boot handshake to ${to}`);
757
- conn.send(this.codec.toBuffer(requestMsg));
801
+ this.sendHandshake(to, conn);
758
802
  } catch (error) {
759
803
  const errStr = coerceErrorString(error);
760
804
  this.inflightConnectionPromises.delete(to);
@@ -772,34 +816,14 @@ var ClientTransport = class extends Transport {
772
816
  }
773
817
  }
774
818
  }
775
- receiveWithBootSequence(conn, sessionCb) {
776
- const bootHandler = (data) => {
777
- const parsed = this.parseMsg(data);
778
- if (!parsed) {
779
- conn.close();
780
- return;
781
- }
782
- if (!import_value.Value.Check(ControlMessageHandshakeResponseSchema, parsed.payload)) {
783
- log?.warn(
784
- `${this.clientId} -- received invalid handshake resp: ${JSON.stringify(parsed)}`
785
- );
786
- return;
787
- }
788
- if (!parsed.payload.status.ok) {
789
- log?.warn(
790
- `${this.clientId} -- received failed handshake resp: ${JSON.stringify(
791
- parsed
792
- )}`
793
- );
794
- return;
795
- }
796
- const serverInstanceId = parsed.payload.status.instanceId;
797
- log?.debug(
798
- `${this.clientId} -- handshake from ${parsed.from} ok (server instance: ${serverInstanceId})`
799
- );
800
- sessionCb(this.onConnect(conn, parsed.from, serverInstanceId));
801
- };
802
- return bootHandler;
819
+ sendHandshake(to, conn) {
820
+ const requestMsg = handshakeRequestMessage(
821
+ this.clientId,
822
+ to,
823
+ this.instanceId
824
+ );
825
+ log?.debug(`${this.clientId} -- sending handshake request to ${to}`);
826
+ conn.send(this.codec.toBuffer(requestMsg));
803
827
  }
804
828
  onDisconnect(conn, connectedTo) {
805
829
  this.inflightConnectionPromises.delete(connectedTo);
@@ -816,22 +840,24 @@ var ServerTransport = class extends Transport {
816
840
  handleConnection(conn) {
817
841
  let session = void 0;
818
842
  const client = () => session?.to ?? "unknown";
819
- const bootHandler = this.receiveWithBootSequence(
820
- conn,
821
- (establishedSession) => {
822
- session = establishedSession;
823
- conn.removeDataListener(bootHandler);
824
- conn.addDataListener((data) => {
825
- const parsed = this.parseMsg(data);
826
- if (!parsed) {
827
- conn.close();
828
- return;
829
- }
830
- this.handleMsg(parsed);
831
- });
843
+ const handshakeHandler = (data) => {
844
+ const handshake = this.receiveHandshakeRequestMessage(data, conn);
845
+ if (!handshake) {
846
+ conn.close();
847
+ return;
832
848
  }
833
- );
834
- conn.addDataListener(bootHandler);
849
+ session = this.onConnect(conn, handshake.from, handshake.instanceId);
850
+ conn.removeDataListener(handshakeHandler);
851
+ conn.addDataListener((data2) => {
852
+ const parsed = this.parseMsg(data2);
853
+ if (!parsed) {
854
+ conn.close();
855
+ return;
856
+ }
857
+ this.handleMsg(parsed);
858
+ });
859
+ };
860
+ conn.addDataListener(handshakeHandler);
835
861
  conn.addCloseListener(() => {
836
862
  if (!session)
837
863
  return;
@@ -848,42 +874,51 @@ var ServerTransport = class extends Transport {
848
874
  );
849
875
  });
850
876
  }
851
- receiveWithBootSequence(conn, sessionCb) {
852
- const bootHandler = (data) => {
853
- const parsed = this.parseMsg(data);
854
- if (!parsed) {
855
- conn.close();
856
- return;
857
- }
858
- if (!import_value.Value.Check(ControlMessageHandshakeRequestSchema, parsed.payload)) {
859
- const responseMsg2 = bootResponseMessage(
860
- this.clientId,
861
- this.instanceId,
862
- parsed.from,
863
- false
864
- );
865
- conn.send(this.codec.toBuffer(responseMsg2));
866
- log?.warn(
867
- `${this.clientId} -- received invalid handshake msg: ${JSON.stringify(
868
- parsed
869
- )}`
870
- );
871
- return;
872
- }
873
- const instanceId = parsed.payload.instanceId;
874
- log?.debug(
875
- `${this.clientId} -- handshake from ${parsed.from} ok (instance id: ${instanceId}), responding with handshake success`
877
+ receiveHandshakeRequestMessage(data, conn) {
878
+ const parsed = this.parseMsg(data);
879
+ if (!parsed)
880
+ return false;
881
+ if (!import_value.Value.Check(ControlMessageHandshakeRequestSchema, parsed.payload)) {
882
+ const responseMsg2 = handshakeResponseMessage(
883
+ this.clientId,
884
+ this.instanceId,
885
+ parsed.from,
886
+ false
887
+ );
888
+ conn.send(this.codec.toBuffer(responseMsg2));
889
+ log?.warn(
890
+ `${this.clientId} -- received invalid handshake msg: ${JSON.stringify(
891
+ parsed
892
+ )}`
876
893
  );
877
- const responseMsg = bootResponseMessage(
894
+ return false;
895
+ }
896
+ const gotVersion = parsed.payload.protocolVersion;
897
+ if (gotVersion !== PROTOCOL_VERSION) {
898
+ const responseMsg2 = handshakeResponseMessage(
878
899
  this.clientId,
879
900
  this.instanceId,
880
901
  parsed.from,
881
- true
902
+ false
882
903
  );
883
- conn.send(this.codec.toBuffer(responseMsg));
884
- sessionCb(this.onConnect(conn, parsed.from, instanceId));
885
- };
886
- return bootHandler;
904
+ conn.send(this.codec.toBuffer(responseMsg2));
905
+ log?.warn(
906
+ `${this.clientId} -- received handshake msg with incompatible protocol version (got: ${gotVersion}, expected: ${PROTOCOL_VERSION})`
907
+ );
908
+ return false;
909
+ }
910
+ const instanceId = parsed.payload.instanceId;
911
+ log?.debug(
912
+ `${this.clientId} -- handshake from ${parsed.from} ok (instance id: ${instanceId}), responding with handshake success`
913
+ );
914
+ const responseMsg = handshakeResponseMessage(
915
+ this.clientId,
916
+ this.instanceId,
917
+ parsed.from,
918
+ true
919
+ );
920
+ conn.send(this.codec.toBuffer(responseMsg));
921
+ return { instanceId, from: parsed.from };
887
922
  }
888
923
  };
889
924
  // Annotate the CommonJS export names for ESM import in node:
@@ -1,3 +1,3 @@
1
- export { a as ClientTransport, C as Connection, k as EventHandler, E as EventMap, j as EventTypes, O as OpaqueTransportMessage, f as OpaqueTransportMessageSchema, S as ServerTransport, d as Session, T as Transport, b as TransportClientId, g as TransportMessage, e as TransportMessageSchema, h as isStreamClose, i as isStreamOpen } from '../index-54e0f99c.js';
1
+ export { a as ClientTransport, C as Connection, k as EventHandler, E as EventMap, j as EventTypes, O as OpaqueTransportMessage, f as OpaqueTransportMessageSchema, S as ServerTransport, d as Session, T as Transport, b as TransportClientId, g as TransportMessage, e as TransportMessageSchema, h as isStreamClose, i as isStreamOpen } from '../index-9aa0aabb.js';
2
2
  import '../types-3e5768ec.js';
3
3
  import '@sinclair/typebox';
@@ -1,3 +1,3 @@
1
- export { a as ClientTransport, C as Connection, k as EventHandler, E as EventMap, j as EventTypes, O as OpaqueTransportMessage, f as OpaqueTransportMessageSchema, S as ServerTransport, d as Session, T as Transport, b as TransportClientId, g as TransportMessage, e as TransportMessageSchema, h as isStreamClose, i as isStreamOpen } from '../index-54e0f99c.js';
1
+ export { a as ClientTransport, C as Connection, k as EventHandler, E as EventMap, j as EventTypes, O as OpaqueTransportMessage, f as OpaqueTransportMessageSchema, S as ServerTransport, d as Session, T as Transport, b as TransportClientId, g as TransportMessage, e as TransportMessageSchema, h as isStreamClose, i as isStreamOpen } from '../index-9aa0aabb.js';
2
2
  import '../types-3e5768ec.js';
3
3
  import '@sinclair/typebox';
@@ -5,13 +5,13 @@ import {
5
5
  ServerTransport,
6
6
  Session,
7
7
  Transport
8
- } from "../chunk-4SDJ5VN4.js";
9
- import "../chunk-GZ7HCLLM.js";
8
+ } from "../chunk-LDUFHGZU.js";
10
9
  import {
11
10
  OpaqueTransportMessageSchema,
12
11
  TransportMessageSchema
13
- } from "../chunk-XFFS4UOD.js";
12
+ } from "../chunk-SCG5S2EC.js";
14
13
  import "../chunk-H4BYJELI.js";
14
+ import "../chunk-GZ7HCLLM.js";
15
15
  export {
16
16
  ClientTransport,
17
17
  Connection,