@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.
- package/dist/chunk-2FNLANTJ.js +327 -0
- package/dist/chunk-2FNLANTJ.js.map +1 -0
- package/dist/{chunk-3AW3IXVD.js → chunk-4PVU7J25.js} +1 -21
- package/dist/chunk-4PVU7J25.js.map +1 -0
- package/dist/{chunk-T6YEMFUF.js → chunk-4QZOW4DH.js} +2 -2
- package/dist/{chunk-MEHCOYKJ.js → chunk-ES4XO2XD.js} +2 -2
- package/dist/{chunk-MEHCOYKJ.js.map → chunk-ES4XO2XD.js.map} +1 -1
- package/dist/{chunk-ZSKCZYVU.js → chunk-KFTGQ3QC.js} +2 -2
- package/dist/chunk-KFTGQ3QC.js.map +1 -0
- package/dist/chunk-S4DUN7KK.js +455 -0
- package/dist/chunk-S4DUN7KK.js.map +1 -0
- package/dist/{chunk-HM7VDTDJ.js → chunk-SX6HI63Q.js} +2 -2
- package/dist/chunk-XM656KMN.js +408 -0
- package/dist/chunk-XM656KMN.js.map +1 -0
- package/dist/chunk-ZUKDZY54.js +271 -0
- package/dist/chunk-ZUKDZY54.js.map +1 -0
- package/dist/client-dd5c9dd0.d.ts +52 -0
- package/dist/codec/index.js +20 -2
- package/dist/codec/index.js.map +1 -1
- package/dist/{connection-261eee8f.d.ts → connection-39816c00.d.ts} +1 -1
- package/dist/{connection-c1eeb95d.d.ts → connection-40318f22.d.ts} +1 -1
- package/dist/{transport-c8f36f6d.d.ts → handshake-e428d1c8.d.ts} +91 -155
- package/dist/{index-60f03cb7.d.ts → index-ea74cdbb.d.ts} +1 -1
- package/dist/logging/index.d.cts +1 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/router/index.cjs +1 -1
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +8 -6
- package/dist/router/index.d.ts +8 -6
- package/dist/router/index.js +2 -2
- package/dist/server-ebf80863.d.ts +24 -0
- package/dist/{services-524bab79.d.ts → services-f406b3aa.d.ts} +3 -2
- package/dist/transport/impls/uds/client.cjs +222 -174
- package/dist/transport/impls/uds/client.cjs.map +1 -1
- package/dist/transport/impls/uds/client.d.cts +6 -5
- package/dist/transport/impls/uds/client.d.ts +6 -5
- package/dist/transport/impls/uds/client.js +6 -4
- package/dist/transport/impls/uds/client.js.map +1 -1
- package/dist/transport/impls/uds/server.cjs +252 -223
- package/dist/transport/impls/uds/server.cjs.map +1 -1
- package/dist/transport/impls/uds/server.d.cts +6 -5
- package/dist/transport/impls/uds/server.d.ts +6 -5
- package/dist/transport/impls/uds/server.js +8 -6
- package/dist/transport/impls/uds/server.js.map +1 -1
- package/dist/transport/impls/ws/client.cjs +224 -176
- package/dist/transport/impls/ws/client.cjs.map +1 -1
- package/dist/transport/impls/ws/client.d.cts +6 -5
- package/dist/transport/impls/ws/client.d.ts +6 -5
- package/dist/transport/impls/ws/client.js +6 -4
- package/dist/transport/impls/ws/client.js.map +1 -1
- package/dist/transport/impls/ws/server.cjs +206 -177
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +4 -3
- package/dist/transport/impls/ws/server.d.ts +4 -3
- package/dist/transport/impls/ws/server.js +8 -6
- package/dist/transport/impls/ws/server.js.map +1 -1
- package/dist/transport/index.cjs +170 -116
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +4 -2
- package/dist/transport/index.d.ts +4 -2
- package/dist/transport/index.js +14 -8
- package/dist/util/testHelpers.cjs +6 -8
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +5 -4
- package/dist/util/testHelpers.d.ts +5 -4
- package/dist/util/testHelpers.js +4 -5
- package/dist/util/testHelpers.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-3AW3IXVD.js.map +0 -1
- package/dist/chunk-EOJMKMDO.js +0 -1372
- package/dist/chunk-EOJMKMDO.js.map +0 -1
- package/dist/chunk-ZSKCZYVU.js.map +0 -1
- /package/dist/{chunk-T6YEMFUF.js.map → chunk-4QZOW4DH.js.map} +0 -0
- /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 {
|
|
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/
|
|
28
|
-
var
|
|
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.
|
|
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
|
-
|
|
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
|
-
//
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
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
|
-
|
|
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/
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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 (!
|
|
1177
|
+
if (!import_value2.Value.Check(this.handshakeExtensions.schema, rawMetadata)) {
|
|
1051
1178
|
conn.telemetry?.span.setStatus({
|
|
1052
|
-
code:
|
|
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
|
-
...
|
|
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:
|
|
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:
|
|
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 (!
|
|
1237
|
+
if (!import_value2.Value.Check(ControlMessageHandshakeRequestSchema, parsed.payload)) {
|
|
1111
1238
|
conn.telemetry?.span.setStatus({
|
|
1112
|
-
code:
|
|
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
|
-
...
|
|
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:
|
|
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,
|
|
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,
|
|
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;
|