@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
@@ -24,8 +24,8 @@ __export(client_exports, {
24
24
  });
25
25
  module.exports = __toCommonJS(client_exports);
26
26
 
27
- // transport/transport.ts
28
- var import_value = require("@sinclair/typebox/value");
27
+ // transport/client.ts
28
+ var import_api4 = require("@opentelemetry/api");
29
29
 
30
30
  // transport/message.ts
31
31
  var import_typebox = require("@sinclair/typebox");
@@ -105,6 +105,154 @@ function isAck(controlFlag) {
105
105
  return (controlFlag & 1 /* AckBit */) === 1 /* AckBit */;
106
106
  }
107
107
 
108
+ // codec/json.ts
109
+ var encoder = new TextEncoder();
110
+ var decoder = new TextDecoder();
111
+ function uint8ArrayToBase64(uint8Array) {
112
+ let binary = "";
113
+ uint8Array.forEach((byte) => {
114
+ binary += String.fromCharCode(byte);
115
+ });
116
+ return btoa(binary);
117
+ }
118
+ function base64ToUint8Array(base64) {
119
+ const binaryString = atob(base64);
120
+ const uint8Array = new Uint8Array(binaryString.length);
121
+ for (let i = 0; i < binaryString.length; i++) {
122
+ uint8Array[i] = binaryString.charCodeAt(i);
123
+ }
124
+ return uint8Array;
125
+ }
126
+ var NaiveJsonCodec = {
127
+ toBuffer: (obj) => {
128
+ return encoder.encode(
129
+ JSON.stringify(obj, function replacer(key) {
130
+ const val = this[key];
131
+ if (val instanceof Uint8Array) {
132
+ return { $t: uint8ArrayToBase64(val) };
133
+ } else {
134
+ return val;
135
+ }
136
+ })
137
+ );
138
+ },
139
+ fromBuffer: (buff) => {
140
+ try {
141
+ const parsed = JSON.parse(
142
+ decoder.decode(buff),
143
+ function reviver(_key, val) {
144
+ if (val?.$t) {
145
+ return base64ToUint8Array(val.$t);
146
+ } else {
147
+ return val;
148
+ }
149
+ }
150
+ );
151
+ if (typeof parsed === "object")
152
+ return parsed;
153
+ return null;
154
+ } catch {
155
+ return null;
156
+ }
157
+ }
158
+ };
159
+
160
+ // transport/options.ts
161
+ var defaultTransportOptions = {
162
+ heartbeatIntervalMs: 1e3,
163
+ heartbeatsUntilDead: 2,
164
+ sessionDisconnectGraceMs: 5e3,
165
+ codec: NaiveJsonCodec
166
+ };
167
+ var defaultConnectionRetryOptions = {
168
+ baseIntervalMs: 250,
169
+ maxJitterMs: 200,
170
+ maxBackoffMs: 32e3,
171
+ attemptBudgetCapacity: 5,
172
+ budgetRestoreIntervalMs: 200
173
+ };
174
+ var defaultClientTransportOptions = {
175
+ ...defaultTransportOptions,
176
+ ...defaultConnectionRetryOptions
177
+ };
178
+ var defaultServerTransportOptions = {
179
+ ...defaultTransportOptions
180
+ };
181
+
182
+ // transport/rateLimit.ts
183
+ var LeakyBucketRateLimit = class {
184
+ budgetConsumed;
185
+ intervalHandles;
186
+ options;
187
+ constructor(options) {
188
+ this.options = options;
189
+ this.budgetConsumed = /* @__PURE__ */ new Map();
190
+ this.intervalHandles = /* @__PURE__ */ new Map();
191
+ }
192
+ getBackoffMs(user) {
193
+ if (!this.budgetConsumed.has(user))
194
+ return 0;
195
+ const exponent = Math.max(0, this.getBudgetConsumed(user) - 1);
196
+ const jitter = Math.floor(Math.random() * this.options.maxJitterMs);
197
+ const backoffMs = Math.min(
198
+ this.options.baseIntervalMs * 2 ** exponent,
199
+ this.options.maxBackoffMs
200
+ );
201
+ return backoffMs + jitter;
202
+ }
203
+ get totalBudgetRestoreTime() {
204
+ return this.options.budgetRestoreIntervalMs * this.options.attemptBudgetCapacity;
205
+ }
206
+ consumeBudget(user) {
207
+ this.stopLeak(user);
208
+ this.budgetConsumed.set(user, this.getBudgetConsumed(user) + 1);
209
+ }
210
+ getBudgetConsumed(user) {
211
+ return this.budgetConsumed.get(user) ?? 0;
212
+ }
213
+ hasBudget(user) {
214
+ return this.getBudgetConsumed(user) < this.options.attemptBudgetCapacity;
215
+ }
216
+ startRestoringBudget(user) {
217
+ if (this.intervalHandles.has(user)) {
218
+ return;
219
+ }
220
+ const restoreBudgetForUser = () => {
221
+ const currentBudget = this.budgetConsumed.get(user);
222
+ if (!currentBudget) {
223
+ this.stopLeak(user);
224
+ return;
225
+ }
226
+ const newBudget = currentBudget - 1;
227
+ if (newBudget === 0) {
228
+ this.budgetConsumed.delete(user);
229
+ return;
230
+ }
231
+ this.budgetConsumed.set(user, newBudget);
232
+ };
233
+ const intervalHandle = setInterval(
234
+ restoreBudgetForUser,
235
+ this.options.budgetRestoreIntervalMs
236
+ );
237
+ this.intervalHandles.set(user, intervalHandle);
238
+ }
239
+ stopLeak(user) {
240
+ if (!this.intervalHandles.has(user)) {
241
+ return;
242
+ }
243
+ clearInterval(this.intervalHandles.get(user));
244
+ this.intervalHandles.delete(user);
245
+ }
246
+ close() {
247
+ for (const user of this.intervalHandles.keys()) {
248
+ this.stopLeak(user);
249
+ }
250
+ }
251
+ };
252
+
253
+ // transport/transport.ts
254
+ var import_value = require("@sinclair/typebox/value");
255
+
108
256
  // logging/log.ts
109
257
  var LoggingLevels = {
110
258
  debug: -1,
@@ -202,7 +350,7 @@ var import_nanoid2 = require("nanoid");
202
350
  var import_api = require("@opentelemetry/api");
203
351
 
204
352
  // package.json
205
- var version = "0.23.12";
353
+ var version = "0.23.13";
206
354
 
207
355
  // tracing/index.ts
208
356
  function getPropagationContext(ctx) {
@@ -537,159 +685,8 @@ var Session = class {
537
685
  }
538
686
  };
539
687
 
540
- // util/stringify.ts
541
- function coerceErrorString(err) {
542
- if (err instanceof Error) {
543
- return err.message || "unknown reason";
544
- }
545
- return `[coerced to error] ${String(err)}`;
546
- }
547
-
548
- // transport/rateLimit.ts
549
- var LeakyBucketRateLimit = class {
550
- budgetConsumed;
551
- intervalHandles;
552
- options;
553
- constructor(options) {
554
- this.options = options;
555
- this.budgetConsumed = /* @__PURE__ */ new Map();
556
- this.intervalHandles = /* @__PURE__ */ new Map();
557
- }
558
- getBackoffMs(user) {
559
- if (!this.budgetConsumed.has(user))
560
- return 0;
561
- const exponent = Math.max(0, this.getBudgetConsumed(user) - 1);
562
- const jitter = Math.floor(Math.random() * this.options.maxJitterMs);
563
- const backoffMs = Math.min(
564
- this.options.baseIntervalMs * 2 ** exponent,
565
- this.options.maxBackoffMs
566
- );
567
- return backoffMs + jitter;
568
- }
569
- get totalBudgetRestoreTime() {
570
- return this.options.budgetRestoreIntervalMs * this.options.attemptBudgetCapacity;
571
- }
572
- consumeBudget(user) {
573
- this.stopLeak(user);
574
- this.budgetConsumed.set(user, this.getBudgetConsumed(user) + 1);
575
- }
576
- getBudgetConsumed(user) {
577
- return this.budgetConsumed.get(user) ?? 0;
578
- }
579
- hasBudget(user) {
580
- return this.getBudgetConsumed(user) < this.options.attemptBudgetCapacity;
581
- }
582
- startRestoringBudget(user) {
583
- if (this.intervalHandles.has(user)) {
584
- return;
585
- }
586
- const restoreBudgetForUser = () => {
587
- const currentBudget = this.budgetConsumed.get(user);
588
- if (!currentBudget) {
589
- this.stopLeak(user);
590
- return;
591
- }
592
- const newBudget = currentBudget - 1;
593
- if (newBudget === 0) {
594
- this.budgetConsumed.delete(user);
595
- return;
596
- }
597
- this.budgetConsumed.set(user, newBudget);
598
- };
599
- const intervalHandle = setInterval(
600
- restoreBudgetForUser,
601
- this.options.budgetRestoreIntervalMs
602
- );
603
- this.intervalHandles.set(user, intervalHandle);
604
- }
605
- stopLeak(user) {
606
- if (!this.intervalHandles.has(user)) {
607
- return;
608
- }
609
- clearInterval(this.intervalHandles.get(user));
610
- this.intervalHandles.delete(user);
611
- }
612
- close() {
613
- for (const user of this.intervalHandles.keys()) {
614
- this.stopLeak(user);
615
- }
616
- }
617
- };
618
-
619
- // codec/json.ts
620
- var encoder = new TextEncoder();
621
- var decoder = new TextDecoder();
622
- function uint8ArrayToBase64(uint8Array) {
623
- let binary = "";
624
- uint8Array.forEach((byte) => {
625
- binary += String.fromCharCode(byte);
626
- });
627
- return btoa(binary);
628
- }
629
- function base64ToUint8Array(base64) {
630
- const binaryString = atob(base64);
631
- const uint8Array = new Uint8Array(binaryString.length);
632
- for (let i = 0; i < binaryString.length; i++) {
633
- uint8Array[i] = binaryString.charCodeAt(i);
634
- }
635
- return uint8Array;
636
- }
637
- var NaiveJsonCodec = {
638
- toBuffer: (obj) => {
639
- return encoder.encode(
640
- JSON.stringify(obj, function replacer(key) {
641
- const val = this[key];
642
- if (val instanceof Uint8Array) {
643
- return { $t: uint8ArrayToBase64(val) };
644
- } else {
645
- return val;
646
- }
647
- })
648
- );
649
- },
650
- fromBuffer: (buff) => {
651
- try {
652
- const parsed = JSON.parse(
653
- decoder.decode(buff),
654
- function reviver(_key, val) {
655
- if (val?.$t) {
656
- return base64ToUint8Array(val.$t);
657
- } else {
658
- return val;
659
- }
660
- }
661
- );
662
- if (typeof parsed === "object")
663
- return parsed;
664
- return null;
665
- } catch {
666
- return null;
667
- }
668
- }
669
- };
670
-
671
688
  // transport/transport.ts
672
689
  var import_api3 = require("@opentelemetry/api");
673
- var defaultTransportOptions = {
674
- heartbeatIntervalMs: 1e3,
675
- heartbeatsUntilDead: 2,
676
- sessionDisconnectGraceMs: 5e3,
677
- codec: NaiveJsonCodec
678
- };
679
- var defaultConnectionRetryOptions = {
680
- baseIntervalMs: 250,
681
- maxJitterMs: 200,
682
- maxBackoffMs: 32e3,
683
- attemptBudgetCapacity: 5,
684
- budgetRestoreIntervalMs: 200
685
- };
686
- var defaultClientTransportOptions = {
687
- ...defaultTransportOptions,
688
- ...defaultConnectionRetryOptions
689
- };
690
- var defaultServerTransportOptions = {
691
- ...defaultTransportOptions
692
- };
693
690
  var Transport = class {
694
691
  /**
695
692
  * The status of the transport.
@@ -844,6 +841,16 @@ var Transport = class {
844
841
  * @param connectedTo The peer we are connected to.
845
842
  */
846
843
  onDisconnect(conn, session) {
844
+ if (session.connection !== void 0 && session.connection.id !== conn.id) {
845
+ session.telemetry.span.addEvent("onDisconnect race");
846
+ this.log?.warn("onDisconnect race", {
847
+ clientId: this.clientId,
848
+ ...session.loggingMetadata,
849
+ ...conn.loggingMetadata,
850
+ tags: ["invariant-violation"]
851
+ });
852
+ return;
853
+ }
847
854
  conn.telemetry?.span.end();
848
855
  this.eventDispatcher.dispatchEvent("connectionStatus", {
849
856
  status: "disconnect",
@@ -851,6 +858,16 @@ var Transport = class {
851
858
  });
852
859
  session.connection = void 0;
853
860
  session.beginGrace(() => {
861
+ if (session.connection !== void 0) {
862
+ session.telemetry.span.addEvent("session grace period race");
863
+ this.log?.warn("session grace period race", {
864
+ clientId: this.clientId,
865
+ ...session.loggingMetadata,
866
+ ...conn.loggingMetadata,
867
+ tags: ["invariant-violation"]
868
+ });
869
+ return;
870
+ }
854
871
  session.telemetry.span.addEvent("session grace period expired");
855
872
  this.deleteSession({
856
873
  session,
@@ -1018,6 +1035,17 @@ var Transport = class {
1018
1035
  return this.status;
1019
1036
  }
1020
1037
  };
1038
+
1039
+ // util/stringify.ts
1040
+ function coerceErrorString(err) {
1041
+ if (err instanceof Error) {
1042
+ return err.message || "unknown reason";
1043
+ }
1044
+ return `[coerced to error] ${String(err)}`;
1045
+ }
1046
+
1047
+ // transport/client.ts
1048
+ var import_value2 = require("@sinclair/typebox/value");
1021
1049
  var ClientTransport = class extends Transport {
1022
1050
  /**
1023
1051
  * The options for this transport.
@@ -1078,7 +1106,7 @@ var ClientTransport = class extends Transport {
1078
1106
  const parsed = this.parseMsg(data2, conn);
1079
1107
  if (!parsed) {
1080
1108
  conn.telemetry?.span.setStatus({
1081
- code: import_api3.SpanStatusCode.ERROR,
1109
+ code: import_api4.SpanStatusCode.ERROR,
1082
1110
  message: "message parse failure"
1083
1111
  });
1084
1112
  conn.close();
@@ -1109,7 +1137,7 @@ var ClientTransport = class extends Transport {
1109
1137
  });
1110
1138
  conn.addErrorListener((err) => {
1111
1139
  conn.telemetry?.span.setStatus({
1112
- code: import_api3.SpanStatusCode.ERROR,
1140
+ code: import_api4.SpanStatusCode.ERROR,
1113
1141
  message: "connection error"
1114
1142
  });
1115
1143
  this.log?.warn(
@@ -1127,7 +1155,7 @@ var ClientTransport = class extends Transport {
1127
1155
  const parsed = this.parseMsg(data, conn);
1128
1156
  if (!parsed) {
1129
1157
  conn.telemetry?.span.setStatus({
1130
- code: import_api3.SpanStatusCode.ERROR,
1158
+ code: import_api4.SpanStatusCode.ERROR,
1131
1159
  message: "non-transport message"
1132
1160
  });
1133
1161
  this.protocolError(
@@ -1136,9 +1164,9 @@ var ClientTransport = class extends Transport {
1136
1164
  );
1137
1165
  return false;
1138
1166
  }
1139
- if (!import_value.Value.Check(ControlMessageHandshakeResponseSchema, parsed.payload)) {
1167
+ if (!import_value2.Value.Check(ControlMessageHandshakeResponseSchema, parsed.payload)) {
1140
1168
  conn.telemetry?.span.setStatus({
1141
- code: import_api3.SpanStatusCode.ERROR,
1169
+ code: import_api4.SpanStatusCode.ERROR,
1142
1170
  message: "invalid handshake response"
1143
1171
  });
1144
1172
  this.log?.warn(`received invalid handshake resp`, {
@@ -1147,7 +1175,7 @@ var ClientTransport = class extends Transport {
1147
1175
  connectedTo: parsed.from,
1148
1176
  transportMessage: parsed,
1149
1177
  validationErrors: [
1150
- ...import_value.Value.Errors(
1178
+ ...import_value2.Value.Errors(
1151
1179
  ControlMessageHandshakeResponseSchema,
1152
1180
  parsed.payload
1153
1181
  )
@@ -1161,7 +1189,7 @@ var ClientTransport = class extends Transport {
1161
1189
  }
1162
1190
  if (!parsed.payload.status.ok) {
1163
1191
  conn.telemetry?.span.setStatus({
1164
- code: import_api3.SpanStatusCode.ERROR,
1192
+ code: import_api4.SpanStatusCode.ERROR,
1165
1193
  message: "handshake rejected"
1166
1194
  });
1167
1195
  this.log?.warn(`received handshake rejection`, {
@@ -1183,7 +1211,7 @@ var ClientTransport = class extends Transport {
1183
1211
  closeHandshakingConnection: true
1184
1212
  });
1185
1213
  conn.telemetry?.span.setStatus({
1186
- code: import_api3.SpanStatusCode.ERROR,
1214
+ code: import_api4.SpanStatusCode.ERROR,
1187
1215
  message: "session id mismatch"
1188
1216
  });
1189
1217
  this.log?.warn(`handshake from ${parsed.from} session id mismatch`, {
@@ -1283,7 +1311,7 @@ var ClientTransport = class extends Transport {
1283
1311
  } catch (err) {
1284
1312
  const errStr = coerceErrorString(err);
1285
1313
  span.recordException(errStr);
1286
- span.setStatus({ code: import_api3.SpanStatusCode.ERROR });
1314
+ span.setStatus({ code: import_api4.SpanStatusCode.ERROR });
1287
1315
  throw err;
1288
1316
  } finally {
1289
1317
  span.end();
@@ -1334,13 +1362,13 @@ var ClientTransport = class extends Transport {
1334
1362
  let metadata = void 0;
1335
1363
  if (this.handshakeExtensions) {
1336
1364
  metadata = await this.handshakeExtensions.construct();
1337
- if (!import_value.Value.Check(this.handshakeExtensions.schema, metadata)) {
1365
+ if (!import_value2.Value.Check(this.handshakeExtensions.schema, metadata)) {
1338
1366
  this.log?.error(`constructed handshake metadata did not match schema`, {
1339
1367
  ...conn.loggingMetadata,
1340
1368
  clientId: this.clientId,
1341
1369
  connectedTo: to,
1342
1370
  validationErrors: [
1343
- ...import_value.Value.Errors(this.handshakeExtensions.schema, metadata)
1371
+ ...import_value2.Value.Errors(this.handshakeExtensions.schema, metadata)
1344
1372
  ],
1345
1373
  tags: ["invariant-violation"]
1346
1374
  });
@@ -1349,7 +1377,7 @@ var ClientTransport = class extends Transport {
1349
1377
  "handshake metadata did not match schema"
1350
1378
  );
1351
1379
  conn.telemetry?.span.setStatus({
1352
- code: import_api3.SpanStatusCode.ERROR,
1380
+ code: import_api4.SpanStatusCode.ERROR,
1353
1381
  message: "handshake meta mismatch"
1354
1382
  });
1355
1383
  return false;