@replit/river 0.22.0 → 0.23.1

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 (57) hide show
  1. package/dist/{chunk-ZPBWKBM5.js → chunk-AUH7GO52.js} +84 -88
  2. package/dist/chunk-AUH7GO52.js.map +1 -0
  3. package/dist/{chunk-GCLEWC26.js → chunk-IKKP6BZG.js} +34 -18
  4. package/dist/chunk-IKKP6BZG.js.map +1 -0
  5. package/dist/{chunk-S3YKQT4J.js → chunk-KA5T736W.js} +2 -2
  6. package/dist/{chunk-3MFX6NXA.js → chunk-RBH47IKH.js} +2 -2
  7. package/dist/chunk-RBH47IKH.js.map +1 -0
  8. package/dist/{chunk-HUBFYN37.js → chunk-XTVPDTQD.js} +2 -2
  9. package/dist/{connection-8b059ac4.d.ts → connection-5685d817.d.ts} +1 -1
  10. package/dist/{connection-bbfe1147.d.ts → connection-7582fb92.d.ts} +1 -1
  11. package/dist/{index-2ece5234.d.ts → index-a6fe0edd.d.ts} +40 -53
  12. package/dist/logging/index.d.cts +1 -1
  13. package/dist/logging/index.d.ts +1 -1
  14. package/dist/router/index.cjs +33 -17
  15. package/dist/router/index.cjs.map +1 -1
  16. package/dist/router/index.d.cts +11 -6
  17. package/dist/router/index.d.ts +11 -6
  18. package/dist/router/index.js +2 -2
  19. package/dist/{services-cb01a7a8.d.ts → services-95cb17b9.d.ts} +23 -52
  20. package/dist/{services-acbcc441.d.ts → services-e95a89d6.d.ts} +23 -52
  21. package/dist/transport/impls/uds/client.cjs +14 -13
  22. package/dist/transport/impls/uds/client.cjs.map +1 -1
  23. package/dist/transport/impls/uds/client.d.cts +2 -2
  24. package/dist/transport/impls/uds/client.d.ts +2 -2
  25. package/dist/transport/impls/uds/client.js +3 -3
  26. package/dist/transport/impls/uds/server.cjs +71 -82
  27. package/dist/transport/impls/uds/server.cjs.map +1 -1
  28. package/dist/transport/impls/uds/server.d.cts +2 -2
  29. package/dist/transport/impls/uds/server.d.ts +2 -2
  30. package/dist/transport/impls/uds/server.js +3 -3
  31. package/dist/transport/impls/ws/client.cjs +14 -13
  32. package/dist/transport/impls/ws/client.cjs.map +1 -1
  33. package/dist/transport/impls/ws/client.d.cts +2 -2
  34. package/dist/transport/impls/ws/client.d.ts +2 -2
  35. package/dist/transport/impls/ws/client.js +3 -3
  36. package/dist/transport/impls/ws/server.cjs +71 -82
  37. package/dist/transport/impls/ws/server.cjs.map +1 -1
  38. package/dist/transport/impls/ws/server.d.cts +2 -2
  39. package/dist/transport/impls/ws/server.d.ts +2 -2
  40. package/dist/transport/impls/ws/server.js +3 -3
  41. package/dist/transport/index.cjs +83 -87
  42. package/dist/transport/index.cjs.map +1 -1
  43. package/dist/transport/index.d.cts +22 -11
  44. package/dist/transport/index.d.ts +22 -11
  45. package/dist/transport/index.js +2 -2
  46. package/dist/util/testHelpers.cjs +4 -9
  47. package/dist/util/testHelpers.cjs.map +1 -1
  48. package/dist/util/testHelpers.d.cts +2 -2
  49. package/dist/util/testHelpers.d.ts +2 -2
  50. package/dist/util/testHelpers.js +5 -4
  51. package/dist/util/testHelpers.js.map +1 -1
  52. package/package.json +4 -4
  53. package/dist/chunk-3MFX6NXA.js.map +0 -1
  54. package/dist/chunk-GCLEWC26.js.map +0 -1
  55. package/dist/chunk-ZPBWKBM5.js.map +0 -1
  56. /package/dist/{chunk-S3YKQT4J.js.map → chunk-KA5T736W.js.map} +0 -0
  57. /package/dist/{chunk-HUBFYN37.js.map → chunk-XTVPDTQD.js.map} +0 -0
@@ -171,7 +171,7 @@ var import_nanoid2 = require("nanoid");
171
171
  var import_api = require("@opentelemetry/api");
172
172
 
173
173
  // package.json
174
- var version = "0.22.0";
174
+ var version = "0.23.1";
175
175
 
176
176
  // tracing/index.ts
177
177
  function getPropagationContext(ctx) {
@@ -250,12 +250,6 @@ var Session = class {
250
250
  * for this session.
251
251
  */
252
252
  advertisedSessionId;
253
- /**
254
- * The metadata for this session, as parsed from the handshake.
255
- *
256
- * Will only ever be populated on the server side.
257
- */
258
- metadata;
259
253
  /**
260
254
  * Number of messages we've sent along this session (excluding handshake and acks)
261
255
  */
@@ -413,8 +407,8 @@ var Session = class {
413
407
  replaceWithNewConnection(newConn) {
414
408
  this.closeStaleConnection(newConn);
415
409
  this.cancelGrace();
416
- this.connection = newConn;
417
410
  this.sendBufferedMessages(newConn);
411
+ this.connection = newConn;
418
412
  }
419
413
  beginGrace(cb) {
420
414
  log?.info(
@@ -925,6 +919,10 @@ var ClientTransport = class extends Transport {
925
919
  * tests or a special case where you don't want to reconnect.
926
920
  */
927
921
  reconnectOnConnectionDrop = true;
922
+ /**
923
+ * Optional handshake options for this client.
924
+ */
925
+ handshakeExtensions;
928
926
  constructor(clientId, providedOptions) {
929
927
  super(clientId, providedOptions);
930
928
  this.options = {
@@ -934,6 +932,9 @@ var ClientTransport = class extends Transport {
934
932
  this.inflightConnectionPromises = /* @__PURE__ */ new Map();
935
933
  this.retryBudget = new LeakyBucketRateLimit(this.options);
936
934
  }
935
+ extendHandshake(options) {
936
+ this.handshakeExtensions = options;
937
+ }
937
938
  handleConnection(conn, to) {
938
939
  if (this.state !== "open")
939
940
  return;
@@ -1157,10 +1158,10 @@ var ClientTransport = class extends Transport {
1157
1158
  }
1158
1159
  async sendHandshake(to, conn) {
1159
1160
  let metadata;
1160
- if (this.options.handshake) {
1161
- metadata = await this.options.handshake.get();
1162
- if (!import_value.Value.Check(this.options.handshake.schema, metadata)) {
1163
- log?.error(`handshake metadata did not match schema`, {
1161
+ if (this.handshakeExtensions) {
1162
+ metadata = await this.handshakeExtensions.construct();
1163
+ if (!import_value.Value.Check(this.handshakeExtensions.schema, metadata)) {
1164
+ log?.error(`constructed handshake metadata did not match schema`, {
1164
1165
  clientId: this.clientId,
1165
1166
  connectedTo: to,
1166
1167
  tags: ["invariant-violation"]
@@ -1176,7 +1177,7 @@ var ClientTransport = class extends Transport {
1176
1177
  return false;
1177
1178
  }
1178
1179
  }
1179
- const { session } = this.getOrCreateSession(to, conn);
1180
+ const { session } = this.getOrCreateSession(to);
1180
1181
  const requestMsg = handshakeRequestMessage(
1181
1182
  this.clientId,
1182
1183
  to,
@@ -1201,17 +1202,29 @@ var ServerTransport = class extends Transport {
1201
1202
  * The options for this transport.
1202
1203
  */
1203
1204
  options;
1205
+ /**
1206
+ * Optional handshake options for the server.
1207
+ */
1208
+ handshakeExtensions;
1209
+ /**
1210
+ * A map of session handshake data for each session.
1211
+ */
1212
+ sessionHandshakeMetadata;
1204
1213
  constructor(clientId, providedOptions) {
1205
1214
  super(clientId, providedOptions);
1206
1215
  this.options = {
1207
1216
  ...defaultServerTransportOptions,
1208
1217
  ...providedOptions
1209
1218
  };
1219
+ this.sessionHandshakeMetadata = /* @__PURE__ */ new WeakMap();
1210
1220
  log?.info(`initiated server transport`, {
1211
1221
  clientId: this.clientId,
1212
1222
  protocolVersion: PROTOCOL_VERSION
1213
1223
  });
1214
1224
  }
1225
+ extendHandshake(options) {
1226
+ this.handshakeExtensions = options;
1227
+ }
1215
1228
  handleConnection(conn) {
1216
1229
  if (this.state !== "open")
1217
1230
  return;
@@ -1294,6 +1307,52 @@ var ServerTransport = class extends Transport {
1294
1307
  );
1295
1308
  });
1296
1309
  }
1310
+ async validateHandshakeMetadata(conn, session, rawMetadata, from) {
1311
+ let parsedMetadata = {};
1312
+ if (this.handshakeExtensions) {
1313
+ if (!import_value.Value.Check(this.handshakeExtensions.schema, rawMetadata)) {
1314
+ conn.telemetry?.span.setStatus({
1315
+ code: import_api3.SpanStatusCode.ERROR,
1316
+ message: "malformed handshake meta"
1317
+ });
1318
+ const reason = "received malformed handshake metadata";
1319
+ const responseMsg = handshakeResponseMessage(this.clientId, from, {
1320
+ ok: false,
1321
+ reason
1322
+ });
1323
+ conn.send(this.codec.toBuffer(responseMsg));
1324
+ log?.warn(`received malformed handshake metadata from ${from}`, {
1325
+ clientId: this.clientId,
1326
+ connId: conn.id
1327
+ });
1328
+ this.protocolError(ProtocolError.HandshakeFailed, reason);
1329
+ return false;
1330
+ }
1331
+ parsedMetadata = await this.handshakeExtensions.validate(
1332
+ rawMetadata,
1333
+ session
1334
+ );
1335
+ if (parsedMetadata === false) {
1336
+ const reason = "rejected by handshake handler";
1337
+ conn.telemetry?.span.setStatus({
1338
+ code: import_api3.SpanStatusCode.ERROR,
1339
+ message: reason
1340
+ });
1341
+ const responseMsg = handshakeResponseMessage(this.clientId, from, {
1342
+ ok: false,
1343
+ reason
1344
+ });
1345
+ conn.send(this.codec.toBuffer(responseMsg));
1346
+ log?.warn(`rejected handshake from ${from}`, {
1347
+ clientId: this.clientId,
1348
+ connId: conn.id
1349
+ });
1350
+ this.protocolError(ProtocolError.HandshakeFailed, reason);
1351
+ return false;
1352
+ }
1353
+ }
1354
+ return parsedMetadata;
1355
+ }
1297
1356
  async receiveHandshakeRequestMessage(data, conn) {
1298
1357
  const parsed = this.parseMsg(data);
1299
1358
  if (!parsed) {
@@ -1349,86 +1408,23 @@ var ServerTransport = class extends Transport {
1349
1408
  this.protocolError(ProtocolError.HandshakeFailed, reason);
1350
1409
  return false;
1351
1410
  }
1411
+ const oldSession = this.sessions.get(parsed.from);
1412
+ const parsedMetadata = await this.validateHandshakeMetadata(
1413
+ conn,
1414
+ oldSession,
1415
+ parsed.payload.metadata,
1416
+ parsed.from
1417
+ );
1418
+ if (parsedMetadata === false) {
1419
+ return false;
1420
+ }
1352
1421
  const { session, isReconnect } = this.getOrCreateSession(
1353
1422
  parsed.from,
1354
1423
  conn,
1355
1424
  parsed.payload.sessionId,
1356
1425
  parsed.tracing
1357
1426
  );
1358
- let handshakeMetadata;
1359
- if (this.options.handshake) {
1360
- if (!import_value.Value.Check(
1361
- this.options.handshake.requestSchema,
1362
- parsed.payload.metadata
1363
- )) {
1364
- conn.telemetry?.span.setStatus({
1365
- code: import_api3.SpanStatusCode.ERROR,
1366
- message: "malformed handshake meta"
1367
- });
1368
- const reason = "received malformed handshake metadata";
1369
- const responseMsg2 = handshakeResponseMessage(
1370
- this.clientId,
1371
- parsed.from,
1372
- { ok: false, reason }
1373
- );
1374
- conn.send(this.codec.toBuffer(responseMsg2));
1375
- log?.warn(`received malformed handshake metadata from ${parsed.from}`, {
1376
- clientId: this.clientId,
1377
- connId: conn.id
1378
- });
1379
- this.protocolError(ProtocolError.HandshakeFailed, reason);
1380
- this.deleteSession(session);
1381
- return false;
1382
- }
1383
- const parsedMetadata = await this.options.handshake.parse(
1384
- parsed.payload.metadata,
1385
- session,
1386
- isReconnect
1387
- );
1388
- if (parsedMetadata === false) {
1389
- conn.telemetry?.span.setStatus({
1390
- code: import_api3.SpanStatusCode.ERROR,
1391
- message: "rejected by handshake handler"
1392
- });
1393
- const reason = "rejected by handshake handler";
1394
- const responseMsg2 = handshakeResponseMessage(
1395
- this.clientId,
1396
- parsed.from,
1397
- { ok: false, reason }
1398
- );
1399
- conn.send(this.codec.toBuffer(responseMsg2));
1400
- log?.warn(`rejected handshake from ${parsed.from}`, {
1401
- clientId: this.clientId,
1402
- connId: conn.id
1403
- });
1404
- this.protocolError(ProtocolError.HandshakeFailed, reason);
1405
- this.deleteSession(session);
1406
- return false;
1407
- }
1408
- if (!import_value.Value.Check(this.options.handshake.parsedSchema, parsedMetadata)) {
1409
- conn.telemetry?.span.setStatus({
1410
- code: import_api3.SpanStatusCode.ERROR,
1411
- message: "malformed handshake meta"
1412
- });
1413
- const reason = "failed to parse handshake metadata";
1414
- const responseMsg2 = handshakeResponseMessage(
1415
- this.clientId,
1416
- parsed.from,
1417
- { ok: false, reason }
1418
- );
1419
- conn.send(this.codec.toBuffer(responseMsg2));
1420
- log?.error(`failed to parse handshake metadata`, {
1421
- clientId: this.clientId,
1422
- connId: conn.id
1423
- });
1424
- this.protocolError(ProtocolError.HandshakeFailed, reason);
1425
- this.deleteSession(session);
1426
- return false;
1427
- }
1428
- handshakeMetadata = parsedMetadata;
1429
- }
1430
- handshakeMetadata ??= {};
1431
- session.metadata = handshakeMetadata;
1427
+ this.sessionHandshakeMetadata.set(session, parsedMetadata);
1432
1428
  log?.debug(
1433
1429
  `handshake from ${parsed.from} ok, responding with handshake success`,
1434
1430
  { clientId: this.clientId, connId: conn.id }