@replit/river 0.12.6 → 0.13.0
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/README.md +4 -1
- package/dist/{builder-c593de11.d.ts → builder-169fbf7f.d.ts} +16 -7
- package/dist/{chunk-AFLZ6INU.js → chunk-CBRQM65K.js} +29 -10
- package/dist/{chunk-IIBVKYDB.js → chunk-CDH7QSB4.js} +39 -1
- package/dist/{chunk-XFFS4UOD.js → chunk-MGGIUH5O.js} +7 -7
- package/dist/{chunk-VLBVQX5H.js → chunk-NPXAAD7M.js} +1 -1
- package/dist/{chunk-4SDJ5VN4.js → chunk-R2IMXRVU.js} +150 -116
- package/dist/{connection-ba37d174.d.ts → connection-ab681c08.d.ts} +1 -1
- package/dist/{messageFraming-b200ef25.d.ts → connection-dd789651.d.ts} +17 -2
- package/dist/{index-54e0f99c.d.ts → index-21c1b21d.d.ts} +29 -13
- package/dist/router/index.cjs +31 -13
- package/dist/router/index.d.cts +5 -5
- package/dist/router/index.d.ts +5 -5
- package/dist/router/index.js +2 -2
- package/dist/transport/impls/uds/client.cjs +143 -121
- package/dist/transport/impls/uds/client.d.cts +2 -3
- package/dist/transport/impls/uds/client.d.ts +2 -3
- package/dist/transport/impls/uds/client.js +5 -6
- package/dist/transport/impls/uds/server.cjs +151 -127
- package/dist/transport/impls/uds/server.d.cts +2 -3
- package/dist/transport/impls/uds/server.d.ts +2 -3
- package/dist/transport/impls/uds/server.js +4 -5
- package/dist/transport/impls/ws/client.cjs +147 -123
- package/dist/transport/impls/ws/client.d.cts +4 -4
- package/dist/transport/impls/ws/client.d.ts +4 -4
- package/dist/transport/impls/ws/client.js +7 -7
- package/dist/transport/impls/ws/server.cjs +151 -127
- package/dist/transport/impls/ws/server.d.cts +2 -2
- package/dist/transport/impls/ws/server.d.ts +2 -2
- package/dist/transport/impls/ws/server.js +4 -4
- package/dist/transport/index.cjs +202 -167
- package/dist/transport/index.d.cts +1 -1
- package/dist/transport/index.d.ts +1 -1
- package/dist/transport/index.js +3 -3
- package/dist/util/testHelpers.cjs +294 -16
- package/dist/util/testHelpers.d.cts +2 -2
- package/dist/util/testHelpers.d.ts +2 -2
- package/dist/util/testHelpers.js +30 -8
- package/package.json +1 -9
- package/dist/chunk-PBPXYLI6.js +0 -44
- package/dist/chunk-Q7GL34DZ.js +0 -47
- package/dist/connection-1f9971d8.d.ts +0 -17
- package/dist/connection-24d878ac.d.ts +0 -18
- package/dist/transport/impls/stdio/client.cjs +0 -904
- package/dist/transport/impls/stdio/client.d.cts +0 -27
- package/dist/transport/impls/stdio/client.d.ts +0 -27
- package/dist/transport/impls/stdio/client.js +0 -42
- package/dist/transport/impls/stdio/server.cjs +0 -879
- package/dist/transport/impls/stdio/server.d.cts +0 -25
- package/dist/transport/impls/stdio/server.d.ts +0 -25
- package/dist/transport/impls/stdio/server.js +0 -33
package/dist/transport/index.cjs
CHANGED
|
@@ -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.
|
|
46
|
-
procedureName: import_typebox.Type.Optional(import_typebox.Type.
|
|
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.
|
|
60
|
+
protocolVersion: import_typebox.Type.String(),
|
|
61
61
|
instanceId: import_typebox.Type.String()
|
|
62
62
|
});
|
|
63
63
|
var ControlMessageHandshakeResponseSchema = import_typebox.Type.Object({
|
|
@@ -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
|
|
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
|
|
101
|
+
function handshakeResponseMessage(from, instanceId, to, ok) {
|
|
102
102
|
return {
|
|
103
103
|
id: (0, import_nanoid.nanoid)(),
|
|
104
104
|
from,
|
|
@@ -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(
|
|
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
|
-
|
|
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 >=
|
|
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
|
-
},
|
|
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
|
|
428
|
-
var
|
|
437
|
+
var RECONNECT_JITTER_MAX_MS = 500;
|
|
438
|
+
var RECONNECT_INTERVAL_MS = 250;
|
|
429
439
|
var defaultTransportOptions = {
|
|
430
|
-
retryIntervalMs:
|
|
431
|
-
retryJitterMs:
|
|
440
|
+
retryIntervalMs: RECONNECT_INTERVAL_MS,
|
|
441
|
+
retryJitterMs: RECONNECT_JITTER_MAX_MS,
|
|
432
442
|
retryAttemptsMax: 5,
|
|
433
|
-
|
|
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} --
|
|
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
|
-
|
|
611
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
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(
|
|
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.
|
|
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
|
-
|
|
776
|
-
const
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
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
|
|
820
|
-
conn
|
|
821
|
-
(
|
|
822
|
-
|
|
823
|
-
|
|
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
|
-
|
|
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
|
-
|
|
852
|
-
const
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
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
|
-
|
|
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
|
-
|
|
902
|
+
false
|
|
882
903
|
);
|
|
883
|
-
conn.send(this.codec.toBuffer(
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
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-
|
|
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-21c1b21d.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-
|
|
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-21c1b21d.js';
|
|
2
2
|
import '../types-3e5768ec.js';
|
|
3
3
|
import '@sinclair/typebox';
|
package/dist/transport/index.js
CHANGED
|
@@ -5,13 +5,13 @@ import {
|
|
|
5
5
|
ServerTransport,
|
|
6
6
|
Session,
|
|
7
7
|
Transport
|
|
8
|
-
} from "../chunk-
|
|
9
|
-
import "../chunk-GZ7HCLLM.js";
|
|
8
|
+
} from "../chunk-R2IMXRVU.js";
|
|
10
9
|
import {
|
|
11
10
|
OpaqueTransportMessageSchema,
|
|
12
11
|
TransportMessageSchema
|
|
13
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-MGGIUH5O.js";
|
|
14
13
|
import "../chunk-H4BYJELI.js";
|
|
14
|
+
import "../chunk-GZ7HCLLM.js";
|
|
15
15
|
export {
|
|
16
16
|
ClientTransport,
|
|
17
17
|
Connection,
|