@replit/river 0.23.11 → 0.23.13

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 (74) hide show
  1. package/dist/chunk-2FNLANTJ.js +327 -0
  2. package/dist/chunk-2FNLANTJ.js.map +1 -0
  3. package/dist/{chunk-3AW3IXVD.js → chunk-4PVU7J25.js} +1 -21
  4. package/dist/chunk-4PVU7J25.js.map +1 -0
  5. package/dist/{chunk-T6YEMFUF.js → chunk-4QZOW4DH.js} +2 -2
  6. package/dist/{chunk-MEHCOYKJ.js → chunk-ES4XO2XD.js} +2 -2
  7. package/dist/{chunk-MEHCOYKJ.js.map → chunk-ES4XO2XD.js.map} +1 -1
  8. package/dist/{chunk-ZSKCZYVU.js → chunk-KFTGQ3QC.js} +2 -2
  9. package/dist/chunk-KFTGQ3QC.js.map +1 -0
  10. package/dist/chunk-S4DUN7KK.js +455 -0
  11. package/dist/chunk-S4DUN7KK.js.map +1 -0
  12. package/dist/{chunk-HM7VDTDJ.js → chunk-SX6HI63Q.js} +2 -2
  13. package/dist/chunk-XM656KMN.js +408 -0
  14. package/dist/chunk-XM656KMN.js.map +1 -0
  15. package/dist/chunk-ZUKDZY54.js +271 -0
  16. package/dist/chunk-ZUKDZY54.js.map +1 -0
  17. package/dist/client-dd5c9dd0.d.ts +52 -0
  18. package/dist/codec/index.js +20 -2
  19. package/dist/codec/index.js.map +1 -1
  20. package/dist/{connection-261eee8f.d.ts → connection-39816c00.d.ts} +1 -1
  21. package/dist/{connection-c1eeb95d.d.ts → connection-40318f22.d.ts} +1 -1
  22. package/dist/{transport-c8f36f6d.d.ts → handshake-e428d1c8.d.ts} +91 -155
  23. package/dist/{index-60f03cb7.d.ts → index-ea74cdbb.d.ts} +1 -1
  24. package/dist/logging/index.d.cts +1 -1
  25. package/dist/logging/index.d.ts +1 -1
  26. package/dist/router/index.cjs +1 -1
  27. package/dist/router/index.cjs.map +1 -1
  28. package/dist/router/index.d.cts +8 -6
  29. package/dist/router/index.d.ts +8 -6
  30. package/dist/router/index.js +2 -2
  31. package/dist/server-ebf80863.d.ts +24 -0
  32. package/dist/{services-524bab79.d.ts → services-f406b3aa.d.ts} +3 -2
  33. package/dist/transport/impls/uds/client.cjs +222 -174
  34. package/dist/transport/impls/uds/client.cjs.map +1 -1
  35. package/dist/transport/impls/uds/client.d.cts +6 -5
  36. package/dist/transport/impls/uds/client.d.ts +6 -5
  37. package/dist/transport/impls/uds/client.js +6 -4
  38. package/dist/transport/impls/uds/client.js.map +1 -1
  39. package/dist/transport/impls/uds/server.cjs +252 -223
  40. package/dist/transport/impls/uds/server.cjs.map +1 -1
  41. package/dist/transport/impls/uds/server.d.cts +6 -5
  42. package/dist/transport/impls/uds/server.d.ts +6 -5
  43. package/dist/transport/impls/uds/server.js +8 -6
  44. package/dist/transport/impls/uds/server.js.map +1 -1
  45. package/dist/transport/impls/ws/client.cjs +224 -176
  46. package/dist/transport/impls/ws/client.cjs.map +1 -1
  47. package/dist/transport/impls/ws/client.d.cts +6 -5
  48. package/dist/transport/impls/ws/client.d.ts +6 -5
  49. package/dist/transport/impls/ws/client.js +6 -4
  50. package/dist/transport/impls/ws/client.js.map +1 -1
  51. package/dist/transport/impls/ws/server.cjs +206 -177
  52. package/dist/transport/impls/ws/server.cjs.map +1 -1
  53. package/dist/transport/impls/ws/server.d.cts +4 -3
  54. package/dist/transport/impls/ws/server.d.ts +4 -3
  55. package/dist/transport/impls/ws/server.js +8 -6
  56. package/dist/transport/impls/ws/server.js.map +1 -1
  57. package/dist/transport/index.cjs +170 -116
  58. package/dist/transport/index.cjs.map +1 -1
  59. package/dist/transport/index.d.cts +4 -2
  60. package/dist/transport/index.d.ts +4 -2
  61. package/dist/transport/index.js +14 -8
  62. package/dist/util/testHelpers.cjs +6 -8
  63. package/dist/util/testHelpers.cjs.map +1 -1
  64. package/dist/util/testHelpers.d.cts +5 -4
  65. package/dist/util/testHelpers.d.ts +5 -4
  66. package/dist/util/testHelpers.js +4 -5
  67. package/dist/util/testHelpers.js.map +1 -1
  68. package/package.json +1 -1
  69. package/dist/chunk-3AW3IXVD.js.map +0 -1
  70. package/dist/chunk-EOJMKMDO.js +0 -1372
  71. package/dist/chunk-EOJMKMDO.js.map +0 -1
  72. package/dist/chunk-ZSKCZYVU.js.map +0 -1
  73. /package/dist/{chunk-T6YEMFUF.js.map → chunk-4QZOW4DH.js.map} +0 -0
  74. /package/dist/{chunk-HM7VDTDJ.js.map → chunk-SX6HI63Q.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../transport/impls/uds/client.ts"],"sourcesContent":["import { Socket } from 'node:net';\nimport { UdsConnection } from './connection';\nimport {\n ClientTransport,\n ProvidedClientTransportOptions,\n} from '../../transport';\nimport { TransportClientId } from '../../message';\n\nexport class UnixDomainSocketClientTransport extends ClientTransport<UdsConnection> {\n path: string;\n\n constructor(\n socketPath: string,\n clientId: string,\n providedOptions?: ProvidedClientTransportOptions,\n ) {\n super(clientId, providedOptions);\n this.path = socketPath;\n }\n\n async createNewOutgoingConnection(to: TransportClientId) {\n const oldConnection = this.connections.get(to);\n if (oldConnection) {\n oldConnection.close();\n }\n\n this.log?.info(`establishing a new uds to ${to}`, {\n clientId: this.clientId,\n connectedTo: to,\n });\n\n const sock = await new Promise<Socket>((resolve, reject) => {\n const sock = new Socket();\n sock.on('connect', () => resolve(sock));\n sock.on('error', (err) => reject(err));\n sock.connect(this.path);\n });\n\n const conn = new UdsConnection(sock);\n this.handleConnection(conn, to);\n return conn;\n }\n}\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,cAAc;AAQhB,IAAM,kCAAN,cAA8C,gBAA+B;AAAA,EAClF;AAAA,EAEA,YACE,YACA,UACA,iBACA;AACA,UAAM,UAAU,eAAe;AAC/B,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,MAAM,4BAA4B,IAAuB;AACvD,UAAM,gBAAgB,KAAK,YAAY,IAAI,EAAE;AAC7C,QAAI,eAAe;AACjB,oBAAc,MAAM;AAAA,IACtB;AAEA,SAAK,KAAK,KAAK,6BAA6B,EAAE,IAAI;AAAA,MAChD,UAAU,KAAK;AAAA,MACf,aAAa;AAAA,IACf,CAAC;AAED,UAAM,OAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC1D,YAAMA,QAAO,IAAI,OAAO;AACxB,MAAAA,MAAK,GAAG,WAAW,MAAM,QAAQA,KAAI,CAAC;AACtC,MAAAA,MAAK,GAAG,SAAS,CAAC,QAAQ,OAAO,GAAG,CAAC;AACrC,MAAAA,MAAK,QAAQ,KAAK,IAAI;AAAA,IACxB,CAAC;AAED,UAAM,OAAO,IAAI,cAAc,IAAI;AACnC,SAAK,iBAAiB,MAAM,EAAE;AAC9B,WAAO;AAAA,EACT;AACF;","names":["sock"]}
1
+ {"version":3,"sources":["../../../../transport/impls/uds/client.ts"],"sourcesContent":["import { Socket } from 'node:net';\nimport { UdsConnection } from './connection';\nimport { TransportClientId } from '../../message';\nimport { ClientTransport } from '../../client';\nimport { ProvidedClientTransportOptions } from '../../options';\n\nexport class UnixDomainSocketClientTransport extends ClientTransport<UdsConnection> {\n path: string;\n\n constructor(\n socketPath: string,\n clientId: string,\n providedOptions?: ProvidedClientTransportOptions,\n ) {\n super(clientId, providedOptions);\n this.path = socketPath;\n }\n\n async createNewOutgoingConnection(to: TransportClientId) {\n const oldConnection = this.connections.get(to);\n if (oldConnection) {\n oldConnection.close();\n }\n\n this.log?.info(`establishing a new uds to ${to}`, {\n clientId: this.clientId,\n connectedTo: to,\n });\n\n const sock = await new Promise<Socket>((resolve, reject) => {\n const sock = new Socket();\n sock.on('connect', () => resolve(sock));\n sock.on('error', (err) => reject(err));\n sock.connect(this.path);\n });\n\n const conn = new UdsConnection(sock);\n this.handleConnection(conn, to);\n return conn;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,cAAc;AAMhB,IAAM,kCAAN,cAA8C,gBAA+B;AAAA,EAClF;AAAA,EAEA,YACE,YACA,UACA,iBACA;AACA,UAAM,UAAU,eAAe;AAC/B,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,MAAM,4BAA4B,IAAuB;AACvD,UAAM,gBAAgB,KAAK,YAAY,IAAI,EAAE;AAC7C,QAAI,eAAe;AACjB,oBAAc,MAAM;AAAA,IACtB;AAEA,SAAK,KAAK,KAAK,6BAA6B,EAAE,IAAI;AAAA,MAChD,UAAU,KAAK;AAAA,MACf,aAAa;AAAA,IACf,CAAC;AAED,UAAM,OAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC1D,YAAMA,QAAO,IAAI,OAAO;AACxB,MAAAA,MAAK,GAAG,WAAW,MAAM,QAAQA,KAAI,CAAC;AACtC,MAAAA,MAAK,GAAG,SAAS,CAAC,QAAQ,OAAO,GAAG,CAAC;AACrC,MAAAA,MAAK,QAAQ,KAAK,IAAI;AAAA,IACxB,CAAC;AAED,UAAM,OAAO,IAAI,cAAc,IAAI;AACnC,SAAK,iBAAiB,MAAM,EAAE;AAC9B,WAAO;AAAA,EACT;AACF;","names":["sock"]}
@@ -24,8 +24,8 @@ __export(server_exports, {
24
24
  });
25
25
  module.exports = __toCommonJS(server_exports);
26
26
 
27
- // transport/transport.ts
28
- var import_value = require("@sinclair/typebox/value");
27
+ // transport/session.ts
28
+ var import_nanoid2 = require("nanoid");
29
29
 
30
30
  // transport/message.ts
31
31
  var import_typebox = require("@sinclair/typebox");
@@ -102,104 +102,11 @@ function isAck(controlFlag) {
102
102
  return (controlFlag & 1 /* AckBit */) === 1 /* AckBit */;
103
103
  }
104
104
 
105
- // logging/log.ts
106
- var LoggingLevels = {
107
- debug: -1,
108
- info: 0,
109
- warn: 1,
110
- error: 2
111
- };
112
- var cleanedLogFn = (log) => {
113
- return (msg, metadata) => {
114
- if (!metadata?.transportMessage) {
115
- log(msg, metadata);
116
- return;
117
- }
118
- const { payload, ...rest } = metadata.transportMessage;
119
- metadata.transportMessage = rest;
120
- log(msg, metadata);
121
- };
122
- };
123
- var BaseLogger = class {
124
- minLevel;
125
- output;
126
- constructor(output, minLevel = "info") {
127
- this.minLevel = minLevel;
128
- this.output = output;
129
- }
130
- debug(msg, metadata) {
131
- if (LoggingLevels[this.minLevel] <= LoggingLevels.debug) {
132
- this.output(msg, metadata ?? {}, "debug");
133
- }
134
- }
135
- info(msg, metadata) {
136
- if (LoggingLevels[this.minLevel] <= LoggingLevels.info) {
137
- this.output(msg, metadata ?? {}, "info");
138
- }
139
- }
140
- warn(msg, metadata) {
141
- if (LoggingLevels[this.minLevel] <= LoggingLevels.warn) {
142
- this.output(msg, metadata ?? {}, "warn");
143
- }
144
- }
145
- error(msg, metadata) {
146
- if (LoggingLevels[this.minLevel] <= LoggingLevels.error) {
147
- this.output(msg, metadata ?? {}, "error");
148
- }
149
- }
150
- };
151
- var createLogProxy = (log) => ({
152
- debug: cleanedLogFn(log.debug.bind(log)),
153
- info: cleanedLogFn(log.info.bind(log)),
154
- warn: cleanedLogFn(log.warn.bind(log)),
155
- error: cleanedLogFn(log.error.bind(log))
156
- });
157
-
158
- // transport/events.ts
159
- var ProtocolError = {
160
- RetriesExceeded: "conn_retry_exceeded",
161
- HandshakeFailed: "handshake_failed",
162
- MessageOrderingViolated: "message_ordering_violated"
163
- };
164
- var EventDispatcher = class {
165
- eventListeners = {};
166
- removeAllListeners() {
167
- this.eventListeners = {};
168
- }
169
- numberOfListeners(eventType) {
170
- return this.eventListeners[eventType]?.size ?? 0;
171
- }
172
- addEventListener(eventType, handler) {
173
- if (!this.eventListeners[eventType]) {
174
- this.eventListeners[eventType] = /* @__PURE__ */ new Set();
175
- }
176
- this.eventListeners[eventType]?.add(handler);
177
- }
178
- removeEventListener(eventType, handler) {
179
- const handlers = this.eventListeners[eventType];
180
- if (handlers) {
181
- this.eventListeners[eventType]?.delete(handler);
182
- }
183
- }
184
- dispatchEvent(eventType, event) {
185
- const handlers = this.eventListeners[eventType];
186
- if (handlers) {
187
- const copy = [...handlers];
188
- for (const handler of copy) {
189
- handler(event);
190
- }
191
- }
192
- }
193
- };
194
-
195
- // transport/session.ts
196
- var import_nanoid2 = require("nanoid");
197
-
198
105
  // tracing/index.ts
199
106
  var import_api = require("@opentelemetry/api");
200
107
 
201
108
  // package.json
202
- var version = "0.23.11";
109
+ var version = "0.23.13";
203
110
 
204
111
  // tracing/index.ts
205
112
  function createSessionTelemetryInfo(session, propagationCtx) {
@@ -449,10 +356,12 @@ var Session = class {
449
356
  this.connection.close();
450
357
  this.connection = void 0;
451
358
  }
452
- replaceWithNewConnection(newConn) {
359
+ replaceWithNewConnection(newConn, isTransparentReconnect) {
453
360
  this.closeStaleConnection(newConn);
454
361
  this.cancelGrace();
455
- this.sendBufferedMessages(newConn);
362
+ if (isTransparentReconnect) {
363
+ this.sendBufferedMessages(newConn);
364
+ }
456
365
  this.connection = newConn;
457
366
  this.handshakingConnection = void 0;
458
367
  }
@@ -523,13 +432,106 @@ var Session = class {
523
432
  }
524
433
  };
525
434
 
526
- // util/stringify.ts
527
- function coerceErrorString(err) {
528
- if (err instanceof Error) {
529
- return err.message || "unknown reason";
435
+ // transport/transforms/messageFraming.ts
436
+ var import_node_stream = require("stream");
437
+ var Uint32LengthPrefixFraming = class extends import_node_stream.Transform {
438
+ receivedBuffer;
439
+ maxBufferSizeBytes;
440
+ constructor({ maxBufferSizeBytes, ...options }) {
441
+ super(options);
442
+ this.maxBufferSizeBytes = maxBufferSizeBytes;
443
+ this.receivedBuffer = Buffer.alloc(0);
530
444
  }
531
- return `[coerced to error] ${String(err)}`;
445
+ _transform(chunk, _encoding, cb) {
446
+ if (this.receivedBuffer.byteLength + chunk.byteLength > this.maxBufferSizeBytes) {
447
+ const err = new Error(
448
+ `buffer overflow: ${this.receivedBuffer.byteLength}B > ${this.maxBufferSizeBytes}B`
449
+ );
450
+ this.emit("error", err);
451
+ cb(err);
452
+ return;
453
+ }
454
+ this.receivedBuffer = Buffer.concat([this.receivedBuffer, chunk]);
455
+ while (this.receivedBuffer.length > 4) {
456
+ const claimedMessageLength = this.receivedBuffer.readUInt32BE(0) + 4;
457
+ if (this.receivedBuffer.length >= claimedMessageLength) {
458
+ const message = this.receivedBuffer.subarray(4, claimedMessageLength);
459
+ this.push(message);
460
+ this.receivedBuffer = this.receivedBuffer.subarray(claimedMessageLength);
461
+ } else {
462
+ break;
463
+ }
464
+ }
465
+ cb();
466
+ }
467
+ _flush(cb) {
468
+ if (this.receivedBuffer.length) {
469
+ this.emit("error", new Error("got incomplete message while flushing"));
470
+ }
471
+ this.receivedBuffer = Buffer.alloc(0);
472
+ cb();
473
+ }
474
+ _destroy(error, callback) {
475
+ this.receivedBuffer = Buffer.alloc(0);
476
+ super._destroy(error, callback);
477
+ }
478
+ };
479
+ function createLengthEncodedStream(options) {
480
+ return new Uint32LengthPrefixFraming({
481
+ maxBufferSizeBytes: options?.maxBufferSizeBytes ?? 16 * 1024 * 1024
482
+ // 16MB
483
+ });
532
484
  }
485
+ var MessageFramer = {
486
+ createFramedStream: createLengthEncodedStream,
487
+ write: (buf) => {
488
+ const lengthPrefix = Buffer.alloc(4);
489
+ lengthPrefix.writeUInt32BE(buf.length, 0);
490
+ return Buffer.concat([lengthPrefix, buf]);
491
+ }
492
+ };
493
+
494
+ // transport/impls/uds/connection.ts
495
+ var UdsConnection = class extends Connection {
496
+ sock;
497
+ input;
498
+ framer;
499
+ constructor(sock) {
500
+ super();
501
+ this.framer = MessageFramer.createFramedStream();
502
+ this.sock = sock;
503
+ this.input = sock.pipe(this.framer);
504
+ }
505
+ addDataListener(cb) {
506
+ this.input.on("data", cb);
507
+ }
508
+ removeDataListener(cb) {
509
+ this.input.off("data", cb);
510
+ }
511
+ addCloseListener(cb) {
512
+ this.sock.on("close", cb);
513
+ }
514
+ addErrorListener(cb) {
515
+ this.sock.on("error", (err) => {
516
+ if (err instanceof Error && "code" in err && err.code === "EPIPE") {
517
+ return;
518
+ }
519
+ cb(err);
520
+ });
521
+ }
522
+ send(payload) {
523
+ if (this.framer.destroyed || !this.sock.writable)
524
+ return false;
525
+ return this.sock.write(MessageFramer.write(payload));
526
+ }
527
+ close() {
528
+ this.sock.destroy();
529
+ this.framer.destroy();
530
+ }
531
+ };
532
+
533
+ // transport/server.ts
534
+ var import_api4 = require("@opentelemetry/api");
533
535
 
534
536
  // codec/json.ts
535
537
  var encoder = new TextEncoder();
@@ -583,8 +585,7 @@ var NaiveJsonCodec = {
583
585
  }
584
586
  };
585
587
 
586
- // transport/transport.ts
587
- var import_api3 = require("@opentelemetry/api");
588
+ // transport/options.ts
588
589
  var defaultTransportOptions = {
589
590
  heartbeatIntervalMs: 1e3,
590
591
  heartbeatsUntilDead: 2,
@@ -605,6 +606,102 @@ var defaultClientTransportOptions = {
605
606
  var defaultServerTransportOptions = {
606
607
  ...defaultTransportOptions
607
608
  };
609
+
610
+ // transport/transport.ts
611
+ var import_value = require("@sinclair/typebox/value");
612
+
613
+ // logging/log.ts
614
+ var LoggingLevels = {
615
+ debug: -1,
616
+ info: 0,
617
+ warn: 1,
618
+ error: 2
619
+ };
620
+ var cleanedLogFn = (log) => {
621
+ return (msg, metadata) => {
622
+ if (!metadata?.transportMessage) {
623
+ log(msg, metadata);
624
+ return;
625
+ }
626
+ const { payload, ...rest } = metadata.transportMessage;
627
+ metadata.transportMessage = rest;
628
+ log(msg, metadata);
629
+ };
630
+ };
631
+ var BaseLogger = class {
632
+ minLevel;
633
+ output;
634
+ constructor(output, minLevel = "info") {
635
+ this.minLevel = minLevel;
636
+ this.output = output;
637
+ }
638
+ debug(msg, metadata) {
639
+ if (LoggingLevels[this.minLevel] <= LoggingLevels.debug) {
640
+ this.output(msg, metadata ?? {}, "debug");
641
+ }
642
+ }
643
+ info(msg, metadata) {
644
+ if (LoggingLevels[this.minLevel] <= LoggingLevels.info) {
645
+ this.output(msg, metadata ?? {}, "info");
646
+ }
647
+ }
648
+ warn(msg, metadata) {
649
+ if (LoggingLevels[this.minLevel] <= LoggingLevels.warn) {
650
+ this.output(msg, metadata ?? {}, "warn");
651
+ }
652
+ }
653
+ error(msg, metadata) {
654
+ if (LoggingLevels[this.minLevel] <= LoggingLevels.error) {
655
+ this.output(msg, metadata ?? {}, "error");
656
+ }
657
+ }
658
+ };
659
+ var createLogProxy = (log) => ({
660
+ debug: cleanedLogFn(log.debug.bind(log)),
661
+ info: cleanedLogFn(log.info.bind(log)),
662
+ warn: cleanedLogFn(log.warn.bind(log)),
663
+ error: cleanedLogFn(log.error.bind(log))
664
+ });
665
+
666
+ // transport/events.ts
667
+ var ProtocolError = {
668
+ RetriesExceeded: "conn_retry_exceeded",
669
+ HandshakeFailed: "handshake_failed",
670
+ MessageOrderingViolated: "message_ordering_violated"
671
+ };
672
+ var EventDispatcher = class {
673
+ eventListeners = {};
674
+ removeAllListeners() {
675
+ this.eventListeners = {};
676
+ }
677
+ numberOfListeners(eventType) {
678
+ return this.eventListeners[eventType]?.size ?? 0;
679
+ }
680
+ addEventListener(eventType, handler) {
681
+ if (!this.eventListeners[eventType]) {
682
+ this.eventListeners[eventType] = /* @__PURE__ */ new Set();
683
+ }
684
+ this.eventListeners[eventType]?.add(handler);
685
+ }
686
+ removeEventListener(eventType, handler) {
687
+ const handlers = this.eventListeners[eventType];
688
+ if (handlers) {
689
+ this.eventListeners[eventType]?.delete(handler);
690
+ }
691
+ }
692
+ dispatchEvent(eventType, event) {
693
+ const handlers = this.eventListeners[eventType];
694
+ if (handlers) {
695
+ const copy = [...handlers];
696
+ for (const handler of copy) {
697
+ handler(event);
698
+ }
699
+ }
700
+ }
701
+ };
702
+
703
+ // transport/transport.ts
704
+ var import_api3 = require("@opentelemetry/api");
608
705
  var Transport = class {
609
706
  /**
610
707
  * The status of the transport.
@@ -665,15 +762,13 @@ var Transport = class {
665
762
  * and we know the identity of the connected client.
666
763
  * @param conn The connection object.
667
764
  */
668
- onConnect(conn, session, isReconnect) {
765
+ onConnect(conn, session, isTransparentReconnect) {
669
766
  this.eventDispatcher.dispatchEvent("connectionStatus", {
670
767
  status: "connect",
671
768
  conn
672
769
  });
673
770
  conn.telemetry = createConnectionTelemetryInfo(conn, session.telemetry);
674
- if (isReconnect) {
675
- session.replaceWithNewConnection(conn);
676
- }
771
+ session.replaceWithNewConnection(conn, isTransparentReconnect);
677
772
  this.log?.info(`connected to ${session.to}`, {
678
773
  ...conn.loggingMetadata,
679
774
  ...session.loggingMetadata
@@ -705,7 +800,8 @@ var Transport = class {
705
800
  propagationCtx
706
801
  }) {
707
802
  let session = this.sessions.get(to);
708
- let isReconnect = session !== void 0;
803
+ const isReconnect = session !== void 0;
804
+ let isTransparentReconnect = isReconnect;
709
805
  if (session?.advertisedSessionId !== void 0 && sessionId !== void 0 && session.advertisedSessionId !== sessionId) {
710
806
  this.log?.info(
711
807
  `session for ${to} already exists but has a different session id (expected: ${session.advertisedSessionId}, got: ${sessionId}), creating a new one`,
@@ -716,7 +812,7 @@ var Transport = class {
716
812
  closeHandshakingConnection: handshakingConn !== void 0,
717
813
  handshakingConn
718
814
  });
719
- isReconnect = false;
815
+ isTransparentReconnect = false;
720
816
  session = void 0;
721
817
  }
722
818
  if (!session) {
@@ -732,7 +828,7 @@ var Transport = class {
732
828
  if (handshakingConn !== void 0) {
733
829
  session.replaceWithNewHandshakingConnection(handshakingConn);
734
830
  }
735
- return { session, isReconnect };
831
+ return { session, isReconnect, isTransparentReconnect };
736
832
  }
737
833
  deleteSession({
738
834
  session,
@@ -760,6 +856,16 @@ var Transport = class {
760
856
  * @param connectedTo The peer we are connected to.
761
857
  */
762
858
  onDisconnect(conn, session) {
859
+ if (session.connection !== void 0 && session.connection.id !== conn.id) {
860
+ session.telemetry.span.addEvent("onDisconnect race");
861
+ this.log?.warn("onDisconnect race", {
862
+ clientId: this.clientId,
863
+ ...session.loggingMetadata,
864
+ ...conn.loggingMetadata,
865
+ tags: ["invariant-violation"]
866
+ });
867
+ return;
868
+ }
763
869
  conn.telemetry?.span.end();
764
870
  this.eventDispatcher.dispatchEvent("connectionStatus", {
765
871
  status: "disconnect",
@@ -767,6 +873,16 @@ var Transport = class {
767
873
  });
768
874
  session.connection = void 0;
769
875
  session.beginGrace(() => {
876
+ if (session.connection !== void 0) {
877
+ session.telemetry.span.addEvent("session grace period race");
878
+ this.log?.warn("session grace period race", {
879
+ clientId: this.clientId,
880
+ ...session.loggingMetadata,
881
+ ...conn.loggingMetadata,
882
+ tags: ["invariant-violation"]
883
+ });
884
+ return;
885
+ }
770
886
  session.telemetry.span.addEvent("session grace period expired");
771
887
  this.deleteSession({
772
888
  session,
@@ -934,6 +1050,17 @@ var Transport = class {
934
1050
  return this.status;
935
1051
  }
936
1052
  };
1053
+
1054
+ // util/stringify.ts
1055
+ function coerceErrorString(err) {
1056
+ if (err instanceof Error) {
1057
+ return err.message || "unknown reason";
1058
+ }
1059
+ return `[coerced to error] ${String(err)}`;
1060
+ }
1061
+
1062
+ // transport/server.ts
1063
+ var import_value2 = require("@sinclair/typebox/value");
937
1064
  var ServerTransport = class extends Transport {
938
1065
  /**
939
1066
  * The options for this transport.
@@ -982,7 +1109,7 @@ var ServerTransport = class extends Transport {
982
1109
  }
983
1110
  );
984
1111
  conn.telemetry?.span.setStatus({
985
- code: import_api3.SpanStatusCode.ERROR,
1112
+ code: import_api4.SpanStatusCode.ERROR,
986
1113
  message: "handshake timeout"
987
1114
  });
988
1115
  conn.close();
@@ -1033,7 +1160,7 @@ var ServerTransport = class extends Transport {
1033
1160
  });
1034
1161
  conn.addErrorListener((err) => {
1035
1162
  conn.telemetry?.span.setStatus({
1036
- code: import_api3.SpanStatusCode.ERROR,
1163
+ code: import_api4.SpanStatusCode.ERROR,
1037
1164
  message: "connection error"
1038
1165
  });
1039
1166
  if (!session)
@@ -1047,9 +1174,9 @@ var ServerTransport = class extends Transport {
1047
1174
  async validateHandshakeMetadata(conn, session, rawMetadata, from) {
1048
1175
  let parsedMetadata = {};
1049
1176
  if (this.handshakeExtensions) {
1050
- if (!import_value.Value.Check(this.handshakeExtensions.schema, rawMetadata)) {
1177
+ if (!import_value2.Value.Check(this.handshakeExtensions.schema, rawMetadata)) {
1051
1178
  conn.telemetry?.span.setStatus({
1052
- code: import_api3.SpanStatusCode.ERROR,
1179
+ code: import_api4.SpanStatusCode.ERROR,
1053
1180
  message: "malformed handshake meta"
1054
1181
  });
1055
1182
  const reason = "received malformed handshake metadata";
@@ -1062,7 +1189,7 @@ var ServerTransport = class extends Transport {
1062
1189
  ...conn.loggingMetadata,
1063
1190
  clientId: this.clientId,
1064
1191
  validationErrors: [
1065
- ...import_value.Value.Errors(this.handshakeExtensions.schema, rawMetadata)
1192
+ ...import_value2.Value.Errors(this.handshakeExtensions.schema, rawMetadata)
1066
1193
  ]
1067
1194
  });
1068
1195
  this.protocolError(ProtocolError.HandshakeFailed, reason);
@@ -1076,7 +1203,7 @@ var ServerTransport = class extends Transport {
1076
1203
  if (parsedMetadata === false) {
1077
1204
  const reason = "rejected by handshake handler";
1078
1205
  conn.telemetry?.span.setStatus({
1079
- code: import_api3.SpanStatusCode.ERROR,
1206
+ code: import_api4.SpanStatusCode.ERROR,
1080
1207
  message: reason
1081
1208
  });
1082
1209
  const responseMsg = handshakeResponseMessage(this.clientId, from, {
@@ -1098,7 +1225,7 @@ var ServerTransport = class extends Transport {
1098
1225
  const parsed = this.parseMsg(data, conn);
1099
1226
  if (!parsed) {
1100
1227
  conn.telemetry?.span.setStatus({
1101
- code: import_api3.SpanStatusCode.ERROR,
1228
+ code: import_api4.SpanStatusCode.ERROR,
1102
1229
  message: "non-transport message"
1103
1230
  });
1104
1231
  this.protocolError(
@@ -1107,9 +1234,9 @@ var ServerTransport = class extends Transport {
1107
1234
  );
1108
1235
  return false;
1109
1236
  }
1110
- if (!import_value.Value.Check(ControlMessageHandshakeRequestSchema, parsed.payload)) {
1237
+ if (!import_value2.Value.Check(ControlMessageHandshakeRequestSchema, parsed.payload)) {
1111
1238
  conn.telemetry?.span.setStatus({
1112
- code: import_api3.SpanStatusCode.ERROR,
1239
+ code: import_api4.SpanStatusCode.ERROR,
1113
1240
  message: "invalid handshake request"
1114
1241
  });
1115
1242
  const reason = "received invalid handshake msg";
@@ -1125,7 +1252,7 @@ var ServerTransport = class extends Transport {
1125
1252
  // before passing it to user-land
1126
1253
  transportMessage: parsed,
1127
1254
  validationErrors: [
1128
- ...import_value.Value.Errors(ControlMessageHandshakeRequestSchema, parsed.payload)
1255
+ ...import_value2.Value.Errors(ControlMessageHandshakeRequestSchema, parsed.payload)
1129
1256
  ]
1130
1257
  });
1131
1258
  this.protocolError(
@@ -1137,7 +1264,7 @@ var ServerTransport = class extends Transport {
1137
1264
  const gotVersion = parsed.payload.protocolVersion;
1138
1265
  if (gotVersion !== PROTOCOL_VERSION) {
1139
1266
  conn.telemetry?.span.setStatus({
1140
- code: import_api3.SpanStatusCode.ERROR,
1267
+ code: import_api4.SpanStatusCode.ERROR,
1141
1268
  message: "incorrect protocol version"
1142
1269
  });
1143
1270
  const reason = `incorrect version (got: ${gotVersion} wanted ${PROTOCOL_VERSION})`;
@@ -1163,7 +1290,7 @@ var ServerTransport = class extends Transport {
1163
1290
  if (parsedMetadata === false) {
1164
1291
  return false;
1165
1292
  }
1166
- const { session, isReconnect } = this.getOrCreateSession({
1293
+ const { session, isTransparentReconnect } = this.getOrCreateSession({
1167
1294
  to: parsed.from,
1168
1295
  conn,
1169
1296
  sessionId: parsed.payload.sessionId,
@@ -1179,109 +1306,11 @@ var ServerTransport = class extends Transport {
1179
1306
  sessionId: session.id
1180
1307
  });
1181
1308
  conn.send(this.codec.toBuffer(responseMsg));
1182
- this.onConnect(conn, session, isReconnect);
1309
+ this.onConnect(conn, session, isTransparentReconnect);
1183
1310
  return session;
1184
1311
  }
1185
1312
  };
1186
1313
 
1187
- // transport/transforms/messageFraming.ts
1188
- var import_node_stream = require("stream");
1189
- var Uint32LengthPrefixFraming = class extends import_node_stream.Transform {
1190
- receivedBuffer;
1191
- maxBufferSizeBytes;
1192
- constructor({ maxBufferSizeBytes, ...options }) {
1193
- super(options);
1194
- this.maxBufferSizeBytes = maxBufferSizeBytes;
1195
- this.receivedBuffer = Buffer.alloc(0);
1196
- }
1197
- _transform(chunk, _encoding, cb) {
1198
- if (this.receivedBuffer.byteLength + chunk.byteLength > this.maxBufferSizeBytes) {
1199
- const err = new Error(
1200
- `buffer overflow: ${this.receivedBuffer.byteLength}B > ${this.maxBufferSizeBytes}B`
1201
- );
1202
- this.emit("error", err);
1203
- cb(err);
1204
- return;
1205
- }
1206
- this.receivedBuffer = Buffer.concat([this.receivedBuffer, chunk]);
1207
- while (this.receivedBuffer.length > 4) {
1208
- const claimedMessageLength = this.receivedBuffer.readUInt32BE(0) + 4;
1209
- if (this.receivedBuffer.length >= claimedMessageLength) {
1210
- const message = this.receivedBuffer.subarray(4, claimedMessageLength);
1211
- this.push(message);
1212
- this.receivedBuffer = this.receivedBuffer.subarray(claimedMessageLength);
1213
- } else {
1214
- break;
1215
- }
1216
- }
1217
- cb();
1218
- }
1219
- _flush(cb) {
1220
- if (this.receivedBuffer.length) {
1221
- this.emit("error", new Error("got incomplete message while flushing"));
1222
- }
1223
- this.receivedBuffer = Buffer.alloc(0);
1224
- cb();
1225
- }
1226
- _destroy(error, callback) {
1227
- this.receivedBuffer = Buffer.alloc(0);
1228
- super._destroy(error, callback);
1229
- }
1230
- };
1231
- function createLengthEncodedStream(options) {
1232
- return new Uint32LengthPrefixFraming({
1233
- maxBufferSizeBytes: options?.maxBufferSizeBytes ?? 16 * 1024 * 1024
1234
- // 16MB
1235
- });
1236
- }
1237
- var MessageFramer = {
1238
- createFramedStream: createLengthEncodedStream,
1239
- write: (buf) => {
1240
- const lengthPrefix = Buffer.alloc(4);
1241
- lengthPrefix.writeUInt32BE(buf.length, 0);
1242
- return Buffer.concat([lengthPrefix, buf]);
1243
- }
1244
- };
1245
-
1246
- // transport/impls/uds/connection.ts
1247
- var UdsConnection = class extends Connection {
1248
- sock;
1249
- input;
1250
- framer;
1251
- constructor(sock) {
1252
- super();
1253
- this.framer = MessageFramer.createFramedStream();
1254
- this.sock = sock;
1255
- this.input = sock.pipe(this.framer);
1256
- }
1257
- addDataListener(cb) {
1258
- this.input.on("data", cb);
1259
- }
1260
- removeDataListener(cb) {
1261
- this.input.off("data", cb);
1262
- }
1263
- addCloseListener(cb) {
1264
- this.sock.on("close", cb);
1265
- }
1266
- addErrorListener(cb) {
1267
- this.sock.on("error", (err) => {
1268
- if (err instanceof Error && "code" in err && err.code === "EPIPE") {
1269
- return;
1270
- }
1271
- cb(err);
1272
- });
1273
- }
1274
- send(payload) {
1275
- if (this.framer.destroyed || !this.sock.writable)
1276
- return false;
1277
- return this.sock.write(MessageFramer.write(payload));
1278
- }
1279
- close() {
1280
- this.sock.destroy();
1281
- this.framer.destroy();
1282
- }
1283
- };
1284
-
1285
1314
  // transport/impls/uds/server.ts
1286
1315
  var UnixDomainSocketServerTransport = class extends ServerTransport {
1287
1316
  server;