@replit/river 0.23.12 → 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-H6KTH6W6.js → chunk-4QZOW4DH.js} +2 -2
  6. package/dist/{chunk-7RUKEUKE.js → chunk-ES4XO2XD.js} +2 -2
  7. package/dist/{chunk-7RUKEUKE.js.map → chunk-ES4XO2XD.js.map} +1 -1
  8. package/dist/{chunk-XZ6IOBM5.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-HDBVL7EF.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-8debd45f.d.ts → connection-39816c00.d.ts} +1 -1
  21. package/dist/{connection-581558f8.d.ts → connection-40318f22.d.ts} +1 -1
  22. package/dist/{transport-47af1c81.d.ts → handshake-e428d1c8.d.ts} +88 -153
  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-ca72c9f8.d.ts → services-f406b3aa.d.ts} +3 -2
  33. package/dist/transport/impls/uds/client.cjs +192 -164
  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 +240 -212
  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 +194 -166
  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 +194 -166
  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 +138 -104
  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 +2 -6
  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-VRU4IKRT.js +0 -1392
  71. package/dist/chunk-VRU4IKRT.js.map +0 -1
  72. package/dist/chunk-XZ6IOBM5.js.map +0 -1
  73. /package/dist/{chunk-H6KTH6W6.js.map → chunk-4QZOW4DH.js.map} +0 -0
  74. /package/dist/{chunk-HDBVL7EF.js.map → chunk-SX6HI63Q.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../transport/impls/ws/client.ts"],"sourcesContent":["import {\n ClientTransport,\n ProvidedClientTransportOptions,\n} from '../../transport';\nimport { TransportClientId } from '../../message';\nimport { WebSocketConnection } from './connection';\nimport { WsLike } from './wslike';\n\n/**\n * A transport implementation that uses a WebSocket connection with automatic reconnection.\n * @class\n * @extends Transport\n */\nexport class WebSocketClientTransport extends ClientTransport<WebSocketConnection> {\n /**\n * A function that returns a Promise that resolves to a websocket URL.\n */\n wsGetter: (to: TransportClientId) => Promise<WsLike> | WsLike;\n\n /**\n * Creates a new WebSocketClientTransport instance.\n * @param wsGetter A function that returns a Promise that resolves to a WebSocket instance.\n * @param clientId The ID of the client using the transport. This should be unique per session.\n * @param serverId The ID of the server this transport is connecting to.\n * @param providedOptions An optional object containing configuration options for the transport.\n */\n constructor(\n wsGetter: (to: TransportClientId) => Promise<WsLike> | WsLike,\n clientId: TransportClientId,\n providedOptions?: ProvidedClientTransportOptions,\n ) {\n super(clientId, providedOptions);\n this.wsGetter = wsGetter;\n }\n\n async createNewOutgoingConnection(to: string) {\n this.log?.info(`establishing a new websocket to ${to}`, {\n clientId: this.clientId,\n connectedTo: to,\n });\n\n const ws = await this.wsGetter(to);\n\n await new Promise<void>((resolve, reject) => {\n if (ws.readyState === ws.OPEN) {\n resolve();\n return;\n }\n\n if (ws.readyState === ws.CLOSING || ws.readyState === ws.CLOSED) {\n reject(new Error('ws is closing or closed'));\n return;\n }\n\n ws.onopen = () => {\n resolve();\n };\n\n ws.onclose = (evt) => {\n reject(new Error(evt.reason));\n };\n\n ws.onerror = (err) => {\n reject(new Error(err.message));\n };\n });\n\n const conn = new WebSocketConnection(ws);\n this.log?.info(`raw websocket to ${to} ok, starting handshake`, {\n clientId: this.clientId,\n connectedTo: to,\n });\n\n this.handleConnection(conn, to);\n return conn;\n }\n}\n"],"mappings":";;;;;;;;;;;AAaO,IAAM,2BAAN,cAAuC,gBAAqC;AAAA;AAAA;AAAA;AAAA,EAIjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YACE,UACA,UACA,iBACA;AACA,UAAM,UAAU,eAAe;AAC/B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,4BAA4B,IAAY;AAC5C,SAAK,KAAK,KAAK,mCAAmC,EAAE,IAAI;AAAA,MACtD,UAAU,KAAK;AAAA,MACf,aAAa;AAAA,IACf,CAAC;AAED,UAAM,KAAK,MAAM,KAAK,SAAS,EAAE;AAEjC,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,UAAI,GAAG,eAAe,GAAG,MAAM;AAC7B,gBAAQ;AACR;AAAA,MACF;AAEA,UAAI,GAAG,eAAe,GAAG,WAAW,GAAG,eAAe,GAAG,QAAQ;AAC/D,eAAO,IAAI,MAAM,yBAAyB,CAAC;AAC3C;AAAA,MACF;AAEA,SAAG,SAAS,MAAM;AAChB,gBAAQ;AAAA,MACV;AAEA,SAAG,UAAU,CAAC,QAAQ;AACpB,eAAO,IAAI,MAAM,IAAI,MAAM,CAAC;AAAA,MAC9B;AAEA,SAAG,UAAU,CAAC,QAAQ;AACpB,eAAO,IAAI,MAAM,IAAI,OAAO,CAAC;AAAA,MAC/B;AAAA,IACF,CAAC;AAED,UAAM,OAAO,IAAI,oBAAoB,EAAE;AACvC,SAAK,KAAK,KAAK,oBAAoB,EAAE,2BAA2B;AAAA,MAC9D,UAAU,KAAK;AAAA,MACf,aAAa;AAAA,IACf,CAAC;AAED,SAAK,iBAAiB,MAAM,EAAE;AAC9B,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../transport/impls/ws/client.ts"],"sourcesContent":["import { ClientTransport } from '../../client';\nimport { TransportClientId } from '../../message';\nimport { ProvidedClientTransportOptions } from '../../options';\nimport { WebSocketConnection } from './connection';\nimport { WsLike } from './wslike';\n\n/**\n * A transport implementation that uses a WebSocket connection with automatic reconnection.\n * @class\n * @extends Transport\n */\nexport class WebSocketClientTransport extends ClientTransport<WebSocketConnection> {\n /**\n * A function that returns a Promise that resolves to a websocket URL.\n */\n wsGetter: (to: TransportClientId) => Promise<WsLike> | WsLike;\n\n /**\n * Creates a new WebSocketClientTransport instance.\n * @param wsGetter A function that returns a Promise that resolves to a WebSocket instance.\n * @param clientId The ID of the client using the transport. This should be unique per session.\n * @param serverId The ID of the server this transport is connecting to.\n * @param providedOptions An optional object containing configuration options for the transport.\n */\n constructor(\n wsGetter: (to: TransportClientId) => Promise<WsLike> | WsLike,\n clientId: TransportClientId,\n providedOptions?: ProvidedClientTransportOptions,\n ) {\n super(clientId, providedOptions);\n this.wsGetter = wsGetter;\n }\n\n async createNewOutgoingConnection(to: string) {\n this.log?.info(`establishing a new websocket to ${to}`, {\n clientId: this.clientId,\n connectedTo: to,\n });\n\n const ws = await this.wsGetter(to);\n\n await new Promise<void>((resolve, reject) => {\n if (ws.readyState === ws.OPEN) {\n resolve();\n return;\n }\n\n if (ws.readyState === ws.CLOSING || ws.readyState === ws.CLOSED) {\n reject(new Error('ws is closing or closed'));\n return;\n }\n\n ws.onopen = () => {\n resolve();\n };\n\n ws.onclose = (evt) => {\n reject(new Error(evt.reason));\n };\n\n ws.onerror = (err) => {\n reject(new Error(err.message));\n };\n });\n\n const conn = new WebSocketConnection(ws);\n this.log?.info(`raw websocket to ${to} ok, starting handshake`, {\n clientId: this.clientId,\n connectedTo: to,\n });\n\n this.handleConnection(conn, to);\n return conn;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAWO,IAAM,2BAAN,cAAuC,gBAAqC;AAAA;AAAA;AAAA;AAAA,EAIjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YACE,UACA,UACA,iBACA;AACA,UAAM,UAAU,eAAe;AAC/B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,4BAA4B,IAAY;AAC5C,SAAK,KAAK,KAAK,mCAAmC,EAAE,IAAI;AAAA,MACtD,UAAU,KAAK;AAAA,MACf,aAAa;AAAA,IACf,CAAC;AAED,UAAM,KAAK,MAAM,KAAK,SAAS,EAAE;AAEjC,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,UAAI,GAAG,eAAe,GAAG,MAAM;AAC7B,gBAAQ;AACR;AAAA,MACF;AAEA,UAAI,GAAG,eAAe,GAAG,WAAW,GAAG,eAAe,GAAG,QAAQ;AAC/D,eAAO,IAAI,MAAM,yBAAyB,CAAC;AAC3C;AAAA,MACF;AAEA,SAAG,SAAS,MAAM;AAChB,gBAAQ;AAAA,MACV;AAEA,SAAG,UAAU,CAAC,QAAQ;AACpB,eAAO,IAAI,MAAM,IAAI,MAAM,CAAC;AAAA,MAC9B;AAEA,SAAG,UAAU,CAAC,QAAQ;AACpB,eAAO,IAAI,MAAM,IAAI,OAAO,CAAC;AAAA,MAC/B;AAAA,IACF,CAAC;AAED,UAAM,OAAO,IAAI,oBAAoB,EAAE;AACvC,SAAK,KAAK,KAAK,oBAAoB,EAAE,2BAA2B;AAAA,MAC9D,UAAU,KAAK;AAAA,MACf,aAAa;AAAA,IACf,CAAC;AAED,SAAK,iBAAiB,MAAM,EAAE;AAC9B,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -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.12";
109
+ var version = "0.23.13";
203
110
 
204
111
  // tracing/index.ts
205
112
  function createSessionTelemetryInfo(session, propagationCtx) {
@@ -525,13 +432,59 @@ var Session = class {
525
432
  }
526
433
  };
527
434
 
528
- // util/stringify.ts
529
- function coerceErrorString(err) {
530
- if (err instanceof Error) {
531
- return err.message || "unknown reason";
435
+ // transport/impls/ws/connection.ts
436
+ var WebSocketConnection = class extends Connection {
437
+ errorCb = null;
438
+ closeCb = null;
439
+ ws;
440
+ constructor(ws) {
441
+ super();
442
+ this.ws = ws;
443
+ this.ws.binaryType = "arraybuffer";
444
+ let didError = false;
445
+ this.ws.onerror = () => {
446
+ didError = true;
447
+ };
448
+ this.ws.onclose = ({ code, reason }) => {
449
+ if (didError && this.errorCb) {
450
+ this.errorCb(
451
+ new Error(
452
+ `websocket closed with code and reason: ${code} - ${reason}`
453
+ )
454
+ );
455
+ }
456
+ if (this.closeCb) {
457
+ this.closeCb();
458
+ }
459
+ };
532
460
  }
533
- return `[coerced to error] ${String(err)}`;
534
- }
461
+ addDataListener(cb) {
462
+ this.ws.onmessage = (msg) => cb(msg.data);
463
+ }
464
+ removeDataListener() {
465
+ this.ws.onmessage = null;
466
+ }
467
+ addCloseListener(cb) {
468
+ this.closeCb = cb;
469
+ }
470
+ addErrorListener(cb) {
471
+ this.errorCb = cb;
472
+ }
473
+ send(payload) {
474
+ if (this.ws.readyState === this.ws.OPEN) {
475
+ this.ws.send(payload);
476
+ return true;
477
+ } else {
478
+ return false;
479
+ }
480
+ }
481
+ close() {
482
+ this.ws.close();
483
+ }
484
+ };
485
+
486
+ // transport/server.ts
487
+ var import_api4 = require("@opentelemetry/api");
535
488
 
536
489
  // codec/json.ts
537
490
  var encoder = new TextEncoder();
@@ -585,8 +538,7 @@ var NaiveJsonCodec = {
585
538
  }
586
539
  };
587
540
 
588
- // transport/transport.ts
589
- var import_api3 = require("@opentelemetry/api");
541
+ // transport/options.ts
590
542
  var defaultTransportOptions = {
591
543
  heartbeatIntervalMs: 1e3,
592
544
  heartbeatsUntilDead: 2,
@@ -607,6 +559,102 @@ var defaultClientTransportOptions = {
607
559
  var defaultServerTransportOptions = {
608
560
  ...defaultTransportOptions
609
561
  };
562
+
563
+ // transport/transport.ts
564
+ var import_value = require("@sinclair/typebox/value");
565
+
566
+ // logging/log.ts
567
+ var LoggingLevels = {
568
+ debug: -1,
569
+ info: 0,
570
+ warn: 1,
571
+ error: 2
572
+ };
573
+ var cleanedLogFn = (log) => {
574
+ return (msg, metadata) => {
575
+ if (!metadata?.transportMessage) {
576
+ log(msg, metadata);
577
+ return;
578
+ }
579
+ const { payload, ...rest } = metadata.transportMessage;
580
+ metadata.transportMessage = rest;
581
+ log(msg, metadata);
582
+ };
583
+ };
584
+ var BaseLogger = class {
585
+ minLevel;
586
+ output;
587
+ constructor(output, minLevel = "info") {
588
+ this.minLevel = minLevel;
589
+ this.output = output;
590
+ }
591
+ debug(msg, metadata) {
592
+ if (LoggingLevels[this.minLevel] <= LoggingLevels.debug) {
593
+ this.output(msg, metadata ?? {}, "debug");
594
+ }
595
+ }
596
+ info(msg, metadata) {
597
+ if (LoggingLevels[this.minLevel] <= LoggingLevels.info) {
598
+ this.output(msg, metadata ?? {}, "info");
599
+ }
600
+ }
601
+ warn(msg, metadata) {
602
+ if (LoggingLevels[this.minLevel] <= LoggingLevels.warn) {
603
+ this.output(msg, metadata ?? {}, "warn");
604
+ }
605
+ }
606
+ error(msg, metadata) {
607
+ if (LoggingLevels[this.minLevel] <= LoggingLevels.error) {
608
+ this.output(msg, metadata ?? {}, "error");
609
+ }
610
+ }
611
+ };
612
+ var createLogProxy = (log) => ({
613
+ debug: cleanedLogFn(log.debug.bind(log)),
614
+ info: cleanedLogFn(log.info.bind(log)),
615
+ warn: cleanedLogFn(log.warn.bind(log)),
616
+ error: cleanedLogFn(log.error.bind(log))
617
+ });
618
+
619
+ // transport/events.ts
620
+ var ProtocolError = {
621
+ RetriesExceeded: "conn_retry_exceeded",
622
+ HandshakeFailed: "handshake_failed",
623
+ MessageOrderingViolated: "message_ordering_violated"
624
+ };
625
+ var EventDispatcher = class {
626
+ eventListeners = {};
627
+ removeAllListeners() {
628
+ this.eventListeners = {};
629
+ }
630
+ numberOfListeners(eventType) {
631
+ return this.eventListeners[eventType]?.size ?? 0;
632
+ }
633
+ addEventListener(eventType, handler) {
634
+ if (!this.eventListeners[eventType]) {
635
+ this.eventListeners[eventType] = /* @__PURE__ */ new Set();
636
+ }
637
+ this.eventListeners[eventType]?.add(handler);
638
+ }
639
+ removeEventListener(eventType, handler) {
640
+ const handlers = this.eventListeners[eventType];
641
+ if (handlers) {
642
+ this.eventListeners[eventType]?.delete(handler);
643
+ }
644
+ }
645
+ dispatchEvent(eventType, event) {
646
+ const handlers = this.eventListeners[eventType];
647
+ if (handlers) {
648
+ const copy = [...handlers];
649
+ for (const handler of copy) {
650
+ handler(event);
651
+ }
652
+ }
653
+ }
654
+ };
655
+
656
+ // transport/transport.ts
657
+ var import_api3 = require("@opentelemetry/api");
610
658
  var Transport = class {
611
659
  /**
612
660
  * The status of the transport.
@@ -761,6 +809,16 @@ var Transport = class {
761
809
  * @param connectedTo The peer we are connected to.
762
810
  */
763
811
  onDisconnect(conn, session) {
812
+ if (session.connection !== void 0 && session.connection.id !== conn.id) {
813
+ session.telemetry.span.addEvent("onDisconnect race");
814
+ this.log?.warn("onDisconnect race", {
815
+ clientId: this.clientId,
816
+ ...session.loggingMetadata,
817
+ ...conn.loggingMetadata,
818
+ tags: ["invariant-violation"]
819
+ });
820
+ return;
821
+ }
764
822
  conn.telemetry?.span.end();
765
823
  this.eventDispatcher.dispatchEvent("connectionStatus", {
766
824
  status: "disconnect",
@@ -768,6 +826,16 @@ var Transport = class {
768
826
  });
769
827
  session.connection = void 0;
770
828
  session.beginGrace(() => {
829
+ if (session.connection !== void 0) {
830
+ session.telemetry.span.addEvent("session grace period race");
831
+ this.log?.warn("session grace period race", {
832
+ clientId: this.clientId,
833
+ ...session.loggingMetadata,
834
+ ...conn.loggingMetadata,
835
+ tags: ["invariant-violation"]
836
+ });
837
+ return;
838
+ }
771
839
  session.telemetry.span.addEvent("session grace period expired");
772
840
  this.deleteSession({
773
841
  session,
@@ -935,6 +1003,17 @@ var Transport = class {
935
1003
  return this.status;
936
1004
  }
937
1005
  };
1006
+
1007
+ // util/stringify.ts
1008
+ function coerceErrorString(err) {
1009
+ if (err instanceof Error) {
1010
+ return err.message || "unknown reason";
1011
+ }
1012
+ return `[coerced to error] ${String(err)}`;
1013
+ }
1014
+
1015
+ // transport/server.ts
1016
+ var import_value2 = require("@sinclair/typebox/value");
938
1017
  var ServerTransport = class extends Transport {
939
1018
  /**
940
1019
  * The options for this transport.
@@ -983,7 +1062,7 @@ var ServerTransport = class extends Transport {
983
1062
  }
984
1063
  );
985
1064
  conn.telemetry?.span.setStatus({
986
- code: import_api3.SpanStatusCode.ERROR,
1065
+ code: import_api4.SpanStatusCode.ERROR,
987
1066
  message: "handshake timeout"
988
1067
  });
989
1068
  conn.close();
@@ -1034,7 +1113,7 @@ var ServerTransport = class extends Transport {
1034
1113
  });
1035
1114
  conn.addErrorListener((err) => {
1036
1115
  conn.telemetry?.span.setStatus({
1037
- code: import_api3.SpanStatusCode.ERROR,
1116
+ code: import_api4.SpanStatusCode.ERROR,
1038
1117
  message: "connection error"
1039
1118
  });
1040
1119
  if (!session)
@@ -1048,9 +1127,9 @@ var ServerTransport = class extends Transport {
1048
1127
  async validateHandshakeMetadata(conn, session, rawMetadata, from) {
1049
1128
  let parsedMetadata = {};
1050
1129
  if (this.handshakeExtensions) {
1051
- if (!import_value.Value.Check(this.handshakeExtensions.schema, rawMetadata)) {
1130
+ if (!import_value2.Value.Check(this.handshakeExtensions.schema, rawMetadata)) {
1052
1131
  conn.telemetry?.span.setStatus({
1053
- code: import_api3.SpanStatusCode.ERROR,
1132
+ code: import_api4.SpanStatusCode.ERROR,
1054
1133
  message: "malformed handshake meta"
1055
1134
  });
1056
1135
  const reason = "received malformed handshake metadata";
@@ -1063,7 +1142,7 @@ var ServerTransport = class extends Transport {
1063
1142
  ...conn.loggingMetadata,
1064
1143
  clientId: this.clientId,
1065
1144
  validationErrors: [
1066
- ...import_value.Value.Errors(this.handshakeExtensions.schema, rawMetadata)
1145
+ ...import_value2.Value.Errors(this.handshakeExtensions.schema, rawMetadata)
1067
1146
  ]
1068
1147
  });
1069
1148
  this.protocolError(ProtocolError.HandshakeFailed, reason);
@@ -1077,7 +1156,7 @@ var ServerTransport = class extends Transport {
1077
1156
  if (parsedMetadata === false) {
1078
1157
  const reason = "rejected by handshake handler";
1079
1158
  conn.telemetry?.span.setStatus({
1080
- code: import_api3.SpanStatusCode.ERROR,
1159
+ code: import_api4.SpanStatusCode.ERROR,
1081
1160
  message: reason
1082
1161
  });
1083
1162
  const responseMsg = handshakeResponseMessage(this.clientId, from, {
@@ -1099,7 +1178,7 @@ var ServerTransport = class extends Transport {
1099
1178
  const parsed = this.parseMsg(data, conn);
1100
1179
  if (!parsed) {
1101
1180
  conn.telemetry?.span.setStatus({
1102
- code: import_api3.SpanStatusCode.ERROR,
1181
+ code: import_api4.SpanStatusCode.ERROR,
1103
1182
  message: "non-transport message"
1104
1183
  });
1105
1184
  this.protocolError(
@@ -1108,9 +1187,9 @@ var ServerTransport = class extends Transport {
1108
1187
  );
1109
1188
  return false;
1110
1189
  }
1111
- if (!import_value.Value.Check(ControlMessageHandshakeRequestSchema, parsed.payload)) {
1190
+ if (!import_value2.Value.Check(ControlMessageHandshakeRequestSchema, parsed.payload)) {
1112
1191
  conn.telemetry?.span.setStatus({
1113
- code: import_api3.SpanStatusCode.ERROR,
1192
+ code: import_api4.SpanStatusCode.ERROR,
1114
1193
  message: "invalid handshake request"
1115
1194
  });
1116
1195
  const reason = "received invalid handshake msg";
@@ -1126,7 +1205,7 @@ var ServerTransport = class extends Transport {
1126
1205
  // before passing it to user-land
1127
1206
  transportMessage: parsed,
1128
1207
  validationErrors: [
1129
- ...import_value.Value.Errors(ControlMessageHandshakeRequestSchema, parsed.payload)
1208
+ ...import_value2.Value.Errors(ControlMessageHandshakeRequestSchema, parsed.payload)
1130
1209
  ]
1131
1210
  });
1132
1211
  this.protocolError(
@@ -1138,7 +1217,7 @@ var ServerTransport = class extends Transport {
1138
1217
  const gotVersion = parsed.payload.protocolVersion;
1139
1218
  if (gotVersion !== PROTOCOL_VERSION) {
1140
1219
  conn.telemetry?.span.setStatus({
1141
- code: import_api3.SpanStatusCode.ERROR,
1220
+ code: import_api4.SpanStatusCode.ERROR,
1142
1221
  message: "incorrect protocol version"
1143
1222
  });
1144
1223
  const reason = `incorrect version (got: ${gotVersion} wanted ${PROTOCOL_VERSION})`;
@@ -1185,57 +1264,6 @@ var ServerTransport = class extends Transport {
1185
1264
  }
1186
1265
  };
1187
1266
 
1188
- // transport/impls/ws/connection.ts
1189
- var WebSocketConnection = class extends Connection {
1190
- errorCb = null;
1191
- closeCb = null;
1192
- ws;
1193
- constructor(ws) {
1194
- super();
1195
- this.ws = ws;
1196
- this.ws.binaryType = "arraybuffer";
1197
- let didError = false;
1198
- this.ws.onerror = () => {
1199
- didError = true;
1200
- };
1201
- this.ws.onclose = ({ code, reason }) => {
1202
- if (didError && this.errorCb) {
1203
- this.errorCb(
1204
- new Error(
1205
- `websocket closed with code and reason: ${code} - ${reason}`
1206
- )
1207
- );
1208
- }
1209
- if (this.closeCb) {
1210
- this.closeCb();
1211
- }
1212
- };
1213
- }
1214
- addDataListener(cb) {
1215
- this.ws.onmessage = (msg) => cb(msg.data);
1216
- }
1217
- removeDataListener() {
1218
- this.ws.onmessage = null;
1219
- }
1220
- addCloseListener(cb) {
1221
- this.closeCb = cb;
1222
- }
1223
- addErrorListener(cb) {
1224
- this.errorCb = cb;
1225
- }
1226
- send(payload) {
1227
- if (this.ws.readyState === this.ws.OPEN) {
1228
- this.ws.send(payload);
1229
- return true;
1230
- } else {
1231
- return false;
1232
- }
1233
- }
1234
- close() {
1235
- this.ws.close();
1236
- }
1237
- };
1238
-
1239
1267
  // transport/impls/ws/server.ts
1240
1268
  var WebSocketServerTransport = class extends ServerTransport {
1241
1269
  wss;