@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
package/dist/transport/index.cjs
CHANGED
|
@@ -224,7 +224,7 @@ var import_nanoid2 = require("nanoid");
|
|
|
224
224
|
var import_api = require("@opentelemetry/api");
|
|
225
225
|
|
|
226
226
|
// package.json
|
|
227
|
-
var version = "0.23.
|
|
227
|
+
var version = "0.23.13";
|
|
228
228
|
|
|
229
229
|
// tracing/index.ts
|
|
230
230
|
function getPropagationContext(ctx) {
|
|
@@ -483,10 +483,12 @@ var Session = class {
|
|
|
483
483
|
this.connection.close();
|
|
484
484
|
this.connection = void 0;
|
|
485
485
|
}
|
|
486
|
-
replaceWithNewConnection(newConn) {
|
|
486
|
+
replaceWithNewConnection(newConn, isTransparentReconnect) {
|
|
487
487
|
this.closeStaleConnection(newConn);
|
|
488
488
|
this.cancelGrace();
|
|
489
|
-
|
|
489
|
+
if (isTransparentReconnect) {
|
|
490
|
+
this.sendBufferedMessages(newConn);
|
|
491
|
+
}
|
|
490
492
|
this.connection = newConn;
|
|
491
493
|
this.handshakingConnection = void 0;
|
|
492
494
|
}
|
|
@@ -557,84 +559,8 @@ var Session = class {
|
|
|
557
559
|
}
|
|
558
560
|
};
|
|
559
561
|
|
|
560
|
-
//
|
|
561
|
-
|
|
562
|
-
if (err instanceof Error) {
|
|
563
|
-
return err.message || "unknown reason";
|
|
564
|
-
}
|
|
565
|
-
return `[coerced to error] ${String(err)}`;
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
// transport/rateLimit.ts
|
|
569
|
-
var LeakyBucketRateLimit = class {
|
|
570
|
-
budgetConsumed;
|
|
571
|
-
intervalHandles;
|
|
572
|
-
options;
|
|
573
|
-
constructor(options) {
|
|
574
|
-
this.options = options;
|
|
575
|
-
this.budgetConsumed = /* @__PURE__ */ new Map();
|
|
576
|
-
this.intervalHandles = /* @__PURE__ */ new Map();
|
|
577
|
-
}
|
|
578
|
-
getBackoffMs(user) {
|
|
579
|
-
if (!this.budgetConsumed.has(user))
|
|
580
|
-
return 0;
|
|
581
|
-
const exponent = Math.max(0, this.getBudgetConsumed(user) - 1);
|
|
582
|
-
const jitter = Math.floor(Math.random() * this.options.maxJitterMs);
|
|
583
|
-
const backoffMs = Math.min(
|
|
584
|
-
this.options.baseIntervalMs * 2 ** exponent,
|
|
585
|
-
this.options.maxBackoffMs
|
|
586
|
-
);
|
|
587
|
-
return backoffMs + jitter;
|
|
588
|
-
}
|
|
589
|
-
get totalBudgetRestoreTime() {
|
|
590
|
-
return this.options.budgetRestoreIntervalMs * this.options.attemptBudgetCapacity;
|
|
591
|
-
}
|
|
592
|
-
consumeBudget(user) {
|
|
593
|
-
this.stopLeak(user);
|
|
594
|
-
this.budgetConsumed.set(user, this.getBudgetConsumed(user) + 1);
|
|
595
|
-
}
|
|
596
|
-
getBudgetConsumed(user) {
|
|
597
|
-
return this.budgetConsumed.get(user) ?? 0;
|
|
598
|
-
}
|
|
599
|
-
hasBudget(user) {
|
|
600
|
-
return this.getBudgetConsumed(user) < this.options.attemptBudgetCapacity;
|
|
601
|
-
}
|
|
602
|
-
startRestoringBudget(user) {
|
|
603
|
-
if (this.intervalHandles.has(user)) {
|
|
604
|
-
return;
|
|
605
|
-
}
|
|
606
|
-
const restoreBudgetForUser = () => {
|
|
607
|
-
const currentBudget = this.budgetConsumed.get(user);
|
|
608
|
-
if (!currentBudget) {
|
|
609
|
-
this.stopLeak(user);
|
|
610
|
-
return;
|
|
611
|
-
}
|
|
612
|
-
const newBudget = currentBudget - 1;
|
|
613
|
-
if (newBudget === 0) {
|
|
614
|
-
this.budgetConsumed.delete(user);
|
|
615
|
-
return;
|
|
616
|
-
}
|
|
617
|
-
this.budgetConsumed.set(user, newBudget);
|
|
618
|
-
};
|
|
619
|
-
const intervalHandle = setInterval(
|
|
620
|
-
restoreBudgetForUser,
|
|
621
|
-
this.options.budgetRestoreIntervalMs
|
|
622
|
-
);
|
|
623
|
-
this.intervalHandles.set(user, intervalHandle);
|
|
624
|
-
}
|
|
625
|
-
stopLeak(user) {
|
|
626
|
-
if (!this.intervalHandles.has(user)) {
|
|
627
|
-
return;
|
|
628
|
-
}
|
|
629
|
-
clearInterval(this.intervalHandles.get(user));
|
|
630
|
-
this.intervalHandles.delete(user);
|
|
631
|
-
}
|
|
632
|
-
close() {
|
|
633
|
-
for (const user of this.intervalHandles.keys()) {
|
|
634
|
-
this.stopLeak(user);
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
};
|
|
562
|
+
// transport/transport.ts
|
|
563
|
+
var import_api3 = require("@opentelemetry/api");
|
|
638
564
|
|
|
639
565
|
// codec/json.ts
|
|
640
566
|
var encoder = new TextEncoder();
|
|
@@ -688,8 +614,7 @@ var NaiveJsonCodec = {
|
|
|
688
614
|
}
|
|
689
615
|
};
|
|
690
616
|
|
|
691
|
-
// transport/
|
|
692
|
-
var import_api3 = require("@opentelemetry/api");
|
|
617
|
+
// transport/options.ts
|
|
693
618
|
var defaultTransportOptions = {
|
|
694
619
|
heartbeatIntervalMs: 1e3,
|
|
695
620
|
heartbeatsUntilDead: 2,
|
|
@@ -710,6 +635,8 @@ var defaultClientTransportOptions = {
|
|
|
710
635
|
var defaultServerTransportOptions = {
|
|
711
636
|
...defaultTransportOptions
|
|
712
637
|
};
|
|
638
|
+
|
|
639
|
+
// transport/transport.ts
|
|
713
640
|
var Transport = class {
|
|
714
641
|
/**
|
|
715
642
|
* The status of the transport.
|
|
@@ -770,15 +697,13 @@ var Transport = class {
|
|
|
770
697
|
* and we know the identity of the connected client.
|
|
771
698
|
* @param conn The connection object.
|
|
772
699
|
*/
|
|
773
|
-
onConnect(conn, session,
|
|
700
|
+
onConnect(conn, session, isTransparentReconnect) {
|
|
774
701
|
this.eventDispatcher.dispatchEvent("connectionStatus", {
|
|
775
702
|
status: "connect",
|
|
776
703
|
conn
|
|
777
704
|
});
|
|
778
705
|
conn.telemetry = createConnectionTelemetryInfo(conn, session.telemetry);
|
|
779
|
-
|
|
780
|
-
session.replaceWithNewConnection(conn);
|
|
781
|
-
}
|
|
706
|
+
session.replaceWithNewConnection(conn, isTransparentReconnect);
|
|
782
707
|
this.log?.info(`connected to ${session.to}`, {
|
|
783
708
|
...conn.loggingMetadata,
|
|
784
709
|
...session.loggingMetadata
|
|
@@ -810,7 +735,8 @@ var Transport = class {
|
|
|
810
735
|
propagationCtx
|
|
811
736
|
}) {
|
|
812
737
|
let session = this.sessions.get(to);
|
|
813
|
-
|
|
738
|
+
const isReconnect = session !== void 0;
|
|
739
|
+
let isTransparentReconnect = isReconnect;
|
|
814
740
|
if (session?.advertisedSessionId !== void 0 && sessionId !== void 0 && session.advertisedSessionId !== sessionId) {
|
|
815
741
|
this.log?.info(
|
|
816
742
|
`session for ${to} already exists but has a different session id (expected: ${session.advertisedSessionId}, got: ${sessionId}), creating a new one`,
|
|
@@ -821,7 +747,7 @@ var Transport = class {
|
|
|
821
747
|
closeHandshakingConnection: handshakingConn !== void 0,
|
|
822
748
|
handshakingConn
|
|
823
749
|
});
|
|
824
|
-
|
|
750
|
+
isTransparentReconnect = false;
|
|
825
751
|
session = void 0;
|
|
826
752
|
}
|
|
827
753
|
if (!session) {
|
|
@@ -837,7 +763,7 @@ var Transport = class {
|
|
|
837
763
|
if (handshakingConn !== void 0) {
|
|
838
764
|
session.replaceWithNewHandshakingConnection(handshakingConn);
|
|
839
765
|
}
|
|
840
|
-
return { session, isReconnect };
|
|
766
|
+
return { session, isReconnect, isTransparentReconnect };
|
|
841
767
|
}
|
|
842
768
|
deleteSession({
|
|
843
769
|
session,
|
|
@@ -865,6 +791,16 @@ var Transport = class {
|
|
|
865
791
|
* @param connectedTo The peer we are connected to.
|
|
866
792
|
*/
|
|
867
793
|
onDisconnect(conn, session) {
|
|
794
|
+
if (session.connection !== void 0 && session.connection.id !== conn.id) {
|
|
795
|
+
session.telemetry.span.addEvent("onDisconnect race");
|
|
796
|
+
this.log?.warn("onDisconnect race", {
|
|
797
|
+
clientId: this.clientId,
|
|
798
|
+
...session.loggingMetadata,
|
|
799
|
+
...conn.loggingMetadata,
|
|
800
|
+
tags: ["invariant-violation"]
|
|
801
|
+
});
|
|
802
|
+
return;
|
|
803
|
+
}
|
|
868
804
|
conn.telemetry?.span.end();
|
|
869
805
|
this.eventDispatcher.dispatchEvent("connectionStatus", {
|
|
870
806
|
status: "disconnect",
|
|
@@ -872,6 +808,16 @@ var Transport = class {
|
|
|
872
808
|
});
|
|
873
809
|
session.connection = void 0;
|
|
874
810
|
session.beginGrace(() => {
|
|
811
|
+
if (session.connection !== void 0) {
|
|
812
|
+
session.telemetry.span.addEvent("session grace period race");
|
|
813
|
+
this.log?.warn("session grace period race", {
|
|
814
|
+
clientId: this.clientId,
|
|
815
|
+
...session.loggingMetadata,
|
|
816
|
+
...conn.loggingMetadata,
|
|
817
|
+
tags: ["invariant-violation"]
|
|
818
|
+
});
|
|
819
|
+
return;
|
|
820
|
+
}
|
|
875
821
|
session.telemetry.span.addEvent("session grace period expired");
|
|
876
822
|
this.deleteSession({
|
|
877
823
|
session,
|
|
@@ -1039,6 +985,91 @@ var Transport = class {
|
|
|
1039
985
|
return this.status;
|
|
1040
986
|
}
|
|
1041
987
|
};
|
|
988
|
+
|
|
989
|
+
// transport/client.ts
|
|
990
|
+
var import_api4 = require("@opentelemetry/api");
|
|
991
|
+
|
|
992
|
+
// transport/rateLimit.ts
|
|
993
|
+
var LeakyBucketRateLimit = class {
|
|
994
|
+
budgetConsumed;
|
|
995
|
+
intervalHandles;
|
|
996
|
+
options;
|
|
997
|
+
constructor(options) {
|
|
998
|
+
this.options = options;
|
|
999
|
+
this.budgetConsumed = /* @__PURE__ */ new Map();
|
|
1000
|
+
this.intervalHandles = /* @__PURE__ */ new Map();
|
|
1001
|
+
}
|
|
1002
|
+
getBackoffMs(user) {
|
|
1003
|
+
if (!this.budgetConsumed.has(user))
|
|
1004
|
+
return 0;
|
|
1005
|
+
const exponent = Math.max(0, this.getBudgetConsumed(user) - 1);
|
|
1006
|
+
const jitter = Math.floor(Math.random() * this.options.maxJitterMs);
|
|
1007
|
+
const backoffMs = Math.min(
|
|
1008
|
+
this.options.baseIntervalMs * 2 ** exponent,
|
|
1009
|
+
this.options.maxBackoffMs
|
|
1010
|
+
);
|
|
1011
|
+
return backoffMs + jitter;
|
|
1012
|
+
}
|
|
1013
|
+
get totalBudgetRestoreTime() {
|
|
1014
|
+
return this.options.budgetRestoreIntervalMs * this.options.attemptBudgetCapacity;
|
|
1015
|
+
}
|
|
1016
|
+
consumeBudget(user) {
|
|
1017
|
+
this.stopLeak(user);
|
|
1018
|
+
this.budgetConsumed.set(user, this.getBudgetConsumed(user) + 1);
|
|
1019
|
+
}
|
|
1020
|
+
getBudgetConsumed(user) {
|
|
1021
|
+
return this.budgetConsumed.get(user) ?? 0;
|
|
1022
|
+
}
|
|
1023
|
+
hasBudget(user) {
|
|
1024
|
+
return this.getBudgetConsumed(user) < this.options.attemptBudgetCapacity;
|
|
1025
|
+
}
|
|
1026
|
+
startRestoringBudget(user) {
|
|
1027
|
+
if (this.intervalHandles.has(user)) {
|
|
1028
|
+
return;
|
|
1029
|
+
}
|
|
1030
|
+
const restoreBudgetForUser = () => {
|
|
1031
|
+
const currentBudget = this.budgetConsumed.get(user);
|
|
1032
|
+
if (!currentBudget) {
|
|
1033
|
+
this.stopLeak(user);
|
|
1034
|
+
return;
|
|
1035
|
+
}
|
|
1036
|
+
const newBudget = currentBudget - 1;
|
|
1037
|
+
if (newBudget === 0) {
|
|
1038
|
+
this.budgetConsumed.delete(user);
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
this.budgetConsumed.set(user, newBudget);
|
|
1042
|
+
};
|
|
1043
|
+
const intervalHandle = setInterval(
|
|
1044
|
+
restoreBudgetForUser,
|
|
1045
|
+
this.options.budgetRestoreIntervalMs
|
|
1046
|
+
);
|
|
1047
|
+
this.intervalHandles.set(user, intervalHandle);
|
|
1048
|
+
}
|
|
1049
|
+
stopLeak(user) {
|
|
1050
|
+
if (!this.intervalHandles.has(user)) {
|
|
1051
|
+
return;
|
|
1052
|
+
}
|
|
1053
|
+
clearInterval(this.intervalHandles.get(user));
|
|
1054
|
+
this.intervalHandles.delete(user);
|
|
1055
|
+
}
|
|
1056
|
+
close() {
|
|
1057
|
+
for (const user of this.intervalHandles.keys()) {
|
|
1058
|
+
this.stopLeak(user);
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
};
|
|
1062
|
+
|
|
1063
|
+
// util/stringify.ts
|
|
1064
|
+
function coerceErrorString(err) {
|
|
1065
|
+
if (err instanceof Error) {
|
|
1066
|
+
return err.message || "unknown reason";
|
|
1067
|
+
}
|
|
1068
|
+
return `[coerced to error] ${String(err)}`;
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
// transport/client.ts
|
|
1072
|
+
var import_value2 = require("@sinclair/typebox/value");
|
|
1042
1073
|
var ClientTransport = class extends Transport {
|
|
1043
1074
|
/**
|
|
1044
1075
|
* The options for this transport.
|
|
@@ -1099,7 +1130,7 @@ var ClientTransport = class extends Transport {
|
|
|
1099
1130
|
const parsed = this.parseMsg(data2, conn);
|
|
1100
1131
|
if (!parsed) {
|
|
1101
1132
|
conn.telemetry?.span.setStatus({
|
|
1102
|
-
code:
|
|
1133
|
+
code: import_api4.SpanStatusCode.ERROR,
|
|
1103
1134
|
message: "message parse failure"
|
|
1104
1135
|
});
|
|
1105
1136
|
conn.close();
|
|
@@ -1130,7 +1161,7 @@ var ClientTransport = class extends Transport {
|
|
|
1130
1161
|
});
|
|
1131
1162
|
conn.addErrorListener((err) => {
|
|
1132
1163
|
conn.telemetry?.span.setStatus({
|
|
1133
|
-
code:
|
|
1164
|
+
code: import_api4.SpanStatusCode.ERROR,
|
|
1134
1165
|
message: "connection error"
|
|
1135
1166
|
});
|
|
1136
1167
|
this.log?.warn(
|
|
@@ -1148,7 +1179,7 @@ var ClientTransport = class extends Transport {
|
|
|
1148
1179
|
const parsed = this.parseMsg(data, conn);
|
|
1149
1180
|
if (!parsed) {
|
|
1150
1181
|
conn.telemetry?.span.setStatus({
|
|
1151
|
-
code:
|
|
1182
|
+
code: import_api4.SpanStatusCode.ERROR,
|
|
1152
1183
|
message: "non-transport message"
|
|
1153
1184
|
});
|
|
1154
1185
|
this.protocolError(
|
|
@@ -1157,9 +1188,9 @@ var ClientTransport = class extends Transport {
|
|
|
1157
1188
|
);
|
|
1158
1189
|
return false;
|
|
1159
1190
|
}
|
|
1160
|
-
if (!
|
|
1191
|
+
if (!import_value2.Value.Check(ControlMessageHandshakeResponseSchema, parsed.payload)) {
|
|
1161
1192
|
conn.telemetry?.span.setStatus({
|
|
1162
|
-
code:
|
|
1193
|
+
code: import_api4.SpanStatusCode.ERROR,
|
|
1163
1194
|
message: "invalid handshake response"
|
|
1164
1195
|
});
|
|
1165
1196
|
this.log?.warn(`received invalid handshake resp`, {
|
|
@@ -1168,7 +1199,7 @@ var ClientTransport = class extends Transport {
|
|
|
1168
1199
|
connectedTo: parsed.from,
|
|
1169
1200
|
transportMessage: parsed,
|
|
1170
1201
|
validationErrors: [
|
|
1171
|
-
...
|
|
1202
|
+
...import_value2.Value.Errors(
|
|
1172
1203
|
ControlMessageHandshakeResponseSchema,
|
|
1173
1204
|
parsed.payload
|
|
1174
1205
|
)
|
|
@@ -1182,7 +1213,7 @@ var ClientTransport = class extends Transport {
|
|
|
1182
1213
|
}
|
|
1183
1214
|
if (!parsed.payload.status.ok) {
|
|
1184
1215
|
conn.telemetry?.span.setStatus({
|
|
1185
|
-
code:
|
|
1216
|
+
code: import_api4.SpanStatusCode.ERROR,
|
|
1186
1217
|
message: "handshake rejected"
|
|
1187
1218
|
});
|
|
1188
1219
|
this.log?.warn(`received handshake rejection`, {
|
|
@@ -1197,18 +1228,37 @@ var ClientTransport = class extends Transport {
|
|
|
1197
1228
|
);
|
|
1198
1229
|
return false;
|
|
1199
1230
|
}
|
|
1231
|
+
const previousSession = this.sessions.get(parsed.from);
|
|
1232
|
+
if (previousSession?.advertisedSessionId && previousSession.advertisedSessionId !== parsed.payload.status.sessionId) {
|
|
1233
|
+
this.deleteSession({
|
|
1234
|
+
session: previousSession,
|
|
1235
|
+
closeHandshakingConnection: true
|
|
1236
|
+
});
|
|
1237
|
+
conn.telemetry?.span.setStatus({
|
|
1238
|
+
code: import_api4.SpanStatusCode.ERROR,
|
|
1239
|
+
message: "session id mismatch"
|
|
1240
|
+
});
|
|
1241
|
+
this.log?.warn(`handshake from ${parsed.from} session id mismatch`, {
|
|
1242
|
+
...conn.loggingMetadata,
|
|
1243
|
+
clientId: this.clientId,
|
|
1244
|
+
connectedTo: parsed.from,
|
|
1245
|
+
transportMessage: parsed
|
|
1246
|
+
});
|
|
1247
|
+
this.protocolError(ProtocolError.HandshakeFailed, "session id mismatch");
|
|
1248
|
+
return false;
|
|
1249
|
+
}
|
|
1200
1250
|
this.log?.debug(`handshake from ${parsed.from} ok`, {
|
|
1201
1251
|
...conn.loggingMetadata,
|
|
1202
1252
|
clientId: this.clientId,
|
|
1203
1253
|
connectedTo: parsed.from,
|
|
1204
1254
|
transportMessage: parsed
|
|
1205
1255
|
});
|
|
1206
|
-
const { session,
|
|
1256
|
+
const { session, isTransparentReconnect } = this.getOrCreateSession({
|
|
1207
1257
|
to: parsed.from,
|
|
1208
1258
|
conn,
|
|
1209
1259
|
sessionId: parsed.payload.status.sessionId
|
|
1210
1260
|
});
|
|
1211
|
-
this.onConnect(conn, session,
|
|
1261
|
+
this.onConnect(conn, session, isTransparentReconnect);
|
|
1212
1262
|
this.retryBudget.startRestoringBudget(session.to);
|
|
1213
1263
|
return session;
|
|
1214
1264
|
}
|
|
@@ -1285,7 +1335,7 @@ var ClientTransport = class extends Transport {
|
|
|
1285
1335
|
} catch (err) {
|
|
1286
1336
|
const errStr = coerceErrorString(err);
|
|
1287
1337
|
span.recordException(errStr);
|
|
1288
|
-
span.setStatus({ code:
|
|
1338
|
+
span.setStatus({ code: import_api4.SpanStatusCode.ERROR });
|
|
1289
1339
|
throw err;
|
|
1290
1340
|
} finally {
|
|
1291
1341
|
span.end();
|
|
@@ -1336,13 +1386,13 @@ var ClientTransport = class extends Transport {
|
|
|
1336
1386
|
let metadata = void 0;
|
|
1337
1387
|
if (this.handshakeExtensions) {
|
|
1338
1388
|
metadata = await this.handshakeExtensions.construct();
|
|
1339
|
-
if (!
|
|
1389
|
+
if (!import_value2.Value.Check(this.handshakeExtensions.schema, metadata)) {
|
|
1340
1390
|
this.log?.error(`constructed handshake metadata did not match schema`, {
|
|
1341
1391
|
...conn.loggingMetadata,
|
|
1342
1392
|
clientId: this.clientId,
|
|
1343
1393
|
connectedTo: to,
|
|
1344
1394
|
validationErrors: [
|
|
1345
|
-
...
|
|
1395
|
+
...import_value2.Value.Errors(this.handshakeExtensions.schema, metadata)
|
|
1346
1396
|
],
|
|
1347
1397
|
tags: ["invariant-violation"]
|
|
1348
1398
|
});
|
|
@@ -1351,7 +1401,7 @@ var ClientTransport = class extends Transport {
|
|
|
1351
1401
|
"handshake metadata did not match schema"
|
|
1352
1402
|
);
|
|
1353
1403
|
conn.telemetry?.span.setStatus({
|
|
1354
|
-
code:
|
|
1404
|
+
code: import_api4.SpanStatusCode.ERROR,
|
|
1355
1405
|
message: "handshake meta mismatch"
|
|
1356
1406
|
});
|
|
1357
1407
|
return false;
|
|
@@ -1379,6 +1429,10 @@ var ClientTransport = class extends Transport {
|
|
|
1379
1429
|
super.close();
|
|
1380
1430
|
}
|
|
1381
1431
|
};
|
|
1432
|
+
|
|
1433
|
+
// transport/server.ts
|
|
1434
|
+
var import_api5 = require("@opentelemetry/api");
|
|
1435
|
+
var import_value3 = require("@sinclair/typebox/value");
|
|
1382
1436
|
var ServerTransport = class extends Transport {
|
|
1383
1437
|
/**
|
|
1384
1438
|
* The options for this transport.
|
|
@@ -1427,7 +1481,7 @@ var ServerTransport = class extends Transport {
|
|
|
1427
1481
|
}
|
|
1428
1482
|
);
|
|
1429
1483
|
conn.telemetry?.span.setStatus({
|
|
1430
|
-
code:
|
|
1484
|
+
code: import_api5.SpanStatusCode.ERROR,
|
|
1431
1485
|
message: "handshake timeout"
|
|
1432
1486
|
});
|
|
1433
1487
|
conn.close();
|
|
@@ -1478,7 +1532,7 @@ var ServerTransport = class extends Transport {
|
|
|
1478
1532
|
});
|
|
1479
1533
|
conn.addErrorListener((err) => {
|
|
1480
1534
|
conn.telemetry?.span.setStatus({
|
|
1481
|
-
code:
|
|
1535
|
+
code: import_api5.SpanStatusCode.ERROR,
|
|
1482
1536
|
message: "connection error"
|
|
1483
1537
|
});
|
|
1484
1538
|
if (!session)
|
|
@@ -1492,9 +1546,9 @@ var ServerTransport = class extends Transport {
|
|
|
1492
1546
|
async validateHandshakeMetadata(conn, session, rawMetadata, from) {
|
|
1493
1547
|
let parsedMetadata = {};
|
|
1494
1548
|
if (this.handshakeExtensions) {
|
|
1495
|
-
if (!
|
|
1549
|
+
if (!import_value3.Value.Check(this.handshakeExtensions.schema, rawMetadata)) {
|
|
1496
1550
|
conn.telemetry?.span.setStatus({
|
|
1497
|
-
code:
|
|
1551
|
+
code: import_api5.SpanStatusCode.ERROR,
|
|
1498
1552
|
message: "malformed handshake meta"
|
|
1499
1553
|
});
|
|
1500
1554
|
const reason = "received malformed handshake metadata";
|
|
@@ -1507,7 +1561,7 @@ var ServerTransport = class extends Transport {
|
|
|
1507
1561
|
...conn.loggingMetadata,
|
|
1508
1562
|
clientId: this.clientId,
|
|
1509
1563
|
validationErrors: [
|
|
1510
|
-
...
|
|
1564
|
+
...import_value3.Value.Errors(this.handshakeExtensions.schema, rawMetadata)
|
|
1511
1565
|
]
|
|
1512
1566
|
});
|
|
1513
1567
|
this.protocolError(ProtocolError.HandshakeFailed, reason);
|
|
@@ -1521,7 +1575,7 @@ var ServerTransport = class extends Transport {
|
|
|
1521
1575
|
if (parsedMetadata === false) {
|
|
1522
1576
|
const reason = "rejected by handshake handler";
|
|
1523
1577
|
conn.telemetry?.span.setStatus({
|
|
1524
|
-
code:
|
|
1578
|
+
code: import_api5.SpanStatusCode.ERROR,
|
|
1525
1579
|
message: reason
|
|
1526
1580
|
});
|
|
1527
1581
|
const responseMsg = handshakeResponseMessage(this.clientId, from, {
|
|
@@ -1543,7 +1597,7 @@ var ServerTransport = class extends Transport {
|
|
|
1543
1597
|
const parsed = this.parseMsg(data, conn);
|
|
1544
1598
|
if (!parsed) {
|
|
1545
1599
|
conn.telemetry?.span.setStatus({
|
|
1546
|
-
code:
|
|
1600
|
+
code: import_api5.SpanStatusCode.ERROR,
|
|
1547
1601
|
message: "non-transport message"
|
|
1548
1602
|
});
|
|
1549
1603
|
this.protocolError(
|
|
@@ -1552,9 +1606,9 @@ var ServerTransport = class extends Transport {
|
|
|
1552
1606
|
);
|
|
1553
1607
|
return false;
|
|
1554
1608
|
}
|
|
1555
|
-
if (!
|
|
1609
|
+
if (!import_value3.Value.Check(ControlMessageHandshakeRequestSchema, parsed.payload)) {
|
|
1556
1610
|
conn.telemetry?.span.setStatus({
|
|
1557
|
-
code:
|
|
1611
|
+
code: import_api5.SpanStatusCode.ERROR,
|
|
1558
1612
|
message: "invalid handshake request"
|
|
1559
1613
|
});
|
|
1560
1614
|
const reason = "received invalid handshake msg";
|
|
@@ -1570,7 +1624,7 @@ var ServerTransport = class extends Transport {
|
|
|
1570
1624
|
// before passing it to user-land
|
|
1571
1625
|
transportMessage: parsed,
|
|
1572
1626
|
validationErrors: [
|
|
1573
|
-
...
|
|
1627
|
+
...import_value3.Value.Errors(ControlMessageHandshakeRequestSchema, parsed.payload)
|
|
1574
1628
|
]
|
|
1575
1629
|
});
|
|
1576
1630
|
this.protocolError(
|
|
@@ -1582,7 +1636,7 @@ var ServerTransport = class extends Transport {
|
|
|
1582
1636
|
const gotVersion = parsed.payload.protocolVersion;
|
|
1583
1637
|
if (gotVersion !== PROTOCOL_VERSION) {
|
|
1584
1638
|
conn.telemetry?.span.setStatus({
|
|
1585
|
-
code:
|
|
1639
|
+
code: import_api5.SpanStatusCode.ERROR,
|
|
1586
1640
|
message: "incorrect protocol version"
|
|
1587
1641
|
});
|
|
1588
1642
|
const reason = `incorrect version (got: ${gotVersion} wanted ${PROTOCOL_VERSION})`;
|
|
@@ -1608,7 +1662,7 @@ var ServerTransport = class extends Transport {
|
|
|
1608
1662
|
if (parsedMetadata === false) {
|
|
1609
1663
|
return false;
|
|
1610
1664
|
}
|
|
1611
|
-
const { session,
|
|
1665
|
+
const { session, isTransparentReconnect } = this.getOrCreateSession({
|
|
1612
1666
|
to: parsed.from,
|
|
1613
1667
|
conn,
|
|
1614
1668
|
sessionId: parsed.payload.sessionId,
|
|
@@ -1624,7 +1678,7 @@ var ServerTransport = class extends Transport {
|
|
|
1624
1678
|
sessionId: session.id
|
|
1625
1679
|
});
|
|
1626
1680
|
conn.send(this.codec.toBuffer(responseMsg));
|
|
1627
|
-
this.onConnect(conn, session,
|
|
1681
|
+
this.onConnect(conn, session, isTransparentReconnect);
|
|
1628
1682
|
return session;
|
|
1629
1683
|
}
|
|
1630
1684
|
};
|