@replit/river 0.23.16 → 0.24.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.
Files changed (85) hide show
  1. package/README.md +21 -20
  2. package/dist/{chunk-UDXM64QK.js → chunk-AASMR3CQ.js} +24 -18
  3. package/dist/chunk-AASMR3CQ.js.map +1 -0
  4. package/dist/chunk-JA57I7MG.js +653 -0
  5. package/dist/chunk-JA57I7MG.js.map +1 -0
  6. package/dist/chunk-KX5PQRVN.js +382 -0
  7. package/dist/chunk-KX5PQRVN.js.map +1 -0
  8. package/dist/{chunk-LTSLICON.js → chunk-KYYB4DUR.js} +68 -519
  9. package/dist/chunk-KYYB4DUR.js.map +1 -0
  10. package/dist/chunk-NLQPPDOT.js +399 -0
  11. package/dist/chunk-NLQPPDOT.js.map +1 -0
  12. package/dist/{chunk-TXSQRTZB.js → chunk-PJGGC3LV.js} +55 -41
  13. package/dist/chunk-PJGGC3LV.js.map +1 -0
  14. package/dist/chunk-RXJLI2OP.js +50 -0
  15. package/dist/chunk-RXJLI2OP.js.map +1 -0
  16. package/dist/{chunk-6LCL2ZZF.js → chunk-TAH2GVTJ.js} +1 -1
  17. package/dist/chunk-TAH2GVTJ.js.map +1 -0
  18. package/dist/chunk-ZAT3R4CU.js +277 -0
  19. package/dist/chunk-ZAT3R4CU.js.map +1 -0
  20. package/dist/{client-0926d3d6.d.ts → client-ba0d3315.d.ts} +12 -15
  21. package/dist/{connection-99a67d3e.d.ts → connection-c3a96d09.d.ts} +1 -5
  22. package/dist/connection-d33e3246.d.ts +11 -0
  23. package/dist/{handshake-75d0124f.d.ts → handshake-cdead82a.d.ts} +149 -180
  24. package/dist/logging/index.cjs.map +1 -1
  25. package/dist/logging/index.d.cts +1 -1
  26. package/dist/logging/index.d.ts +1 -1
  27. package/dist/logging/index.js +1 -1
  28. package/dist/{index-ea74cdbb.d.ts → message-e6c560fd.d.ts} +2 -2
  29. package/dist/router/index.cjs +107 -530
  30. package/dist/router/index.cjs.map +1 -1
  31. package/dist/router/index.d.cts +12 -50
  32. package/dist/router/index.d.ts +12 -50
  33. package/dist/router/index.js +2 -4
  34. package/dist/server-2ef5e6ec.d.ts +42 -0
  35. package/dist/{services-75e84a9f.d.ts → services-e1417b33.d.ts} +7 -7
  36. package/dist/transport/impls/uds/client.cjs +1242 -1223
  37. package/dist/transport/impls/uds/client.cjs.map +1 -1
  38. package/dist/transport/impls/uds/client.d.cts +4 -4
  39. package/dist/transport/impls/uds/client.d.ts +4 -4
  40. package/dist/transport/impls/uds/client.js +7 -13
  41. package/dist/transport/impls/uds/client.js.map +1 -1
  42. package/dist/transport/impls/uds/server.cjs +1301 -1151
  43. package/dist/transport/impls/uds/server.cjs.map +1 -1
  44. package/dist/transport/impls/uds/server.d.cts +4 -4
  45. package/dist/transport/impls/uds/server.d.ts +4 -4
  46. package/dist/transport/impls/uds/server.js +6 -6
  47. package/dist/transport/impls/ws/client.cjs +980 -969
  48. package/dist/transport/impls/ws/client.cjs.map +1 -1
  49. package/dist/transport/impls/ws/client.d.cts +4 -4
  50. package/dist/transport/impls/ws/client.d.ts +4 -4
  51. package/dist/transport/impls/ws/client.js +6 -7
  52. package/dist/transport/impls/ws/client.js.map +1 -1
  53. package/dist/transport/impls/ws/server.cjs +1182 -1047
  54. package/dist/transport/impls/ws/server.cjs.map +1 -1
  55. package/dist/transport/impls/ws/server.d.cts +4 -4
  56. package/dist/transport/impls/ws/server.d.ts +4 -4
  57. package/dist/transport/impls/ws/server.js +6 -6
  58. package/dist/transport/index.cjs +1434 -1360
  59. package/dist/transport/index.cjs.map +1 -1
  60. package/dist/transport/index.d.cts +4 -4
  61. package/dist/transport/index.d.ts +4 -4
  62. package/dist/transport/index.js +9 -9
  63. package/dist/util/testHelpers.cjs +743 -309
  64. package/dist/util/testHelpers.cjs.map +1 -1
  65. package/dist/util/testHelpers.d.cts +10 -7
  66. package/dist/util/testHelpers.d.ts +10 -7
  67. package/dist/util/testHelpers.js +33 -10
  68. package/dist/util/testHelpers.js.map +1 -1
  69. package/package.json +1 -1
  70. package/dist/chunk-6LCL2ZZF.js.map +0 -1
  71. package/dist/chunk-JA7XGTAL.js +0 -476
  72. package/dist/chunk-JA7XGTAL.js.map +0 -1
  73. package/dist/chunk-LTSLICON.js.map +0 -1
  74. package/dist/chunk-MQCGG6KL.js +0 -335
  75. package/dist/chunk-MQCGG6KL.js.map +0 -1
  76. package/dist/chunk-R47IZD67.js +0 -59
  77. package/dist/chunk-R47IZD67.js.map +0 -1
  78. package/dist/chunk-TXSQRTZB.js.map +0 -1
  79. package/dist/chunk-UDXM64QK.js.map +0 -1
  80. package/dist/chunk-WN77AT67.js +0 -476
  81. package/dist/chunk-WN77AT67.js.map +0 -1
  82. package/dist/chunk-YXDAOVP7.js +0 -347
  83. package/dist/chunk-YXDAOVP7.js.map +0 -1
  84. package/dist/connection-d738cc08.d.ts +0 -17
  85. package/dist/server-3740c5d9.d.ts +0 -24
@@ -1,12 +1,14 @@
1
1
  import {
2
2
  ControlMessagePayloadSchema,
3
+ closeStreamMessage,
3
4
  coerceErrorString,
4
5
  createHandlerSpan,
5
6
  createProcTelemetryInfo,
7
+ generateId,
6
8
  getPropagationContext,
7
9
  isStreamClose,
8
10
  isStreamOpen
9
- } from "./chunk-TXSQRTZB.js";
11
+ } from "./chunk-PJGGC3LV.js";
10
12
 
11
13
  // router/services.ts
12
14
  import { Type } from "@sinclair/typebox";
@@ -146,9 +148,9 @@ var ServiceSchema = class _ServiceSchema {
146
148
  * You probably don't need this, usually the River server will handle this
147
149
  * for you.
148
150
  */
149
- instantiate() {
151
+ instantiate(extendedContext) {
150
152
  return Object.freeze({
151
- state: this.initializeState(),
153
+ state: this.initializeState(extendedContext),
152
154
  procedures: this.procedures
153
155
  });
154
156
  }
@@ -210,468 +212,6 @@ var ServiceScaffold = class {
210
212
  }
211
213
  };
212
214
 
213
- // router/diff.ts
214
- function diffServerSchema(oldServer, newServer, options) {
215
- const allServices = /* @__PURE__ */ new Set([
216
- ...Object.keys(oldServer.services),
217
- ...Object.keys(newServer.services)
218
- ]);
219
- const breakages = {};
220
- for (const serviceName of allServices) {
221
- const oldService = oldServer.services[serviceName];
222
- const newService = newServer.services[serviceName];
223
- const breakage = diffService(oldService, newService, options);
224
- if (breakage) {
225
- breakages[serviceName] = breakage;
226
- }
227
- }
228
- if (Object.keys(breakages).length) {
229
- return { serviceBreakages: breakages };
230
- }
231
- return null;
232
- }
233
- function diffService(oldService, newService, options) {
234
- if (!newService) {
235
- return options?.allowServiceRemoval ? null : { reason: "removed" };
236
- }
237
- if (!oldService) {
238
- return null;
239
- }
240
- const allProcedures = /* @__PURE__ */ new Set([
241
- ...Object.keys(oldService.procedures),
242
- ...Object.keys(newService.procedures)
243
- ]);
244
- const breakages = {};
245
- for (const procedureName of allProcedures) {
246
- const aProcedure = oldService.procedures[procedureName];
247
- const bProcedure = newService.procedures[procedureName];
248
- const breakage = diffProcedure(aProcedure, bProcedure, options);
249
- if (breakage) {
250
- breakages[procedureName] = breakage;
251
- }
252
- }
253
- if (Object.keys(breakages).length) {
254
- return { reason: "modified", procedureBreakages: breakages };
255
- }
256
- return null;
257
- }
258
- function diffProcedure(oldProcedure, newProcedure, options) {
259
- if (!newProcedure) {
260
- return options?.allowProcedureRemoval ? null : { reason: "removed" };
261
- }
262
- if (!oldProcedure) {
263
- return null;
264
- }
265
- if (oldProcedure.type !== newProcedure.type) {
266
- return {
267
- reason: "type-changed",
268
- oldType: oldProcedure.type,
269
- newType: newProcedure.type
270
- };
271
- }
272
- const inputBreakage = diffProcedureField(
273
- oldProcedure.input,
274
- newProcedure.input,
275
- "client"
276
- );
277
- const initBreakage = diffProcedureField(
278
- oldProcedure.init,
279
- newProcedure.init,
280
- "client"
281
- );
282
- const outputBreakage = diffProcedureField(
283
- oldProcedure.output,
284
- newProcedure.output,
285
- "server"
286
- );
287
- if (inputBreakage ?? initBreakage ?? outputBreakage) {
288
- const result = {
289
- reason: "modified"
290
- };
291
- if (inputBreakage) {
292
- result.input = inputBreakage;
293
- }
294
- if (initBreakage) {
295
- result.init = initBreakage;
296
- }
297
- if (outputBreakage) {
298
- result.output = outputBreakage;
299
- }
300
- return result;
301
- }
302
- return null;
303
- }
304
- function diffProcedureField(oldSchema, newSchema, origin) {
305
- if (!oldSchema && !newSchema) {
306
- return null;
307
- }
308
- const diffBreakage = diffRequired(oldSchema, newSchema, origin, false, false);
309
- if (diffBreakage) {
310
- return diffBreakage;
311
- }
312
- if (!oldSchema || !newSchema) {
313
- throw new Error("Appease typescript, this should never happen");
314
- }
315
- return diffJSONSchema(oldSchema, newSchema, origin);
316
- }
317
- function diffRequired(oldSchema, newSchema, origin, oldRequired, newRequired) {
318
- if (!newSchema && !oldSchema) {
319
- throw new Error("Both old and new schema are undefined");
320
- }
321
- if (!newSchema) {
322
- if (!oldRequired && origin == "server") {
323
- return null;
324
- }
325
- return { reason: "removed-required" };
326
- }
327
- if (!oldSchema) {
328
- if (newRequired && origin === "client") {
329
- return { reason: "new-required" };
330
- }
331
- return null;
332
- }
333
- if (origin === "client" && !oldRequired && newRequired) {
334
- return { reason: "new-required" };
335
- }
336
- if (origin === "server" && oldRequired && !newRequired) {
337
- return { reason: "removed-required" };
338
- }
339
- return null;
340
- }
341
- function diffJSONSchema(oldSchema, newSchema, origin) {
342
- if (oldSchema.type !== newSchema.type) {
343
- return {
344
- reason: "type-changed",
345
- oldType: getReportingType(oldSchema),
346
- newType: getReportingType(newSchema)
347
- };
348
- }
349
- if (getReportingType(oldSchema) !== getReportingType(newSchema)) {
350
- return {
351
- reason: "type-changed",
352
- oldType: getReportingType(oldSchema),
353
- newType: getReportingType(newSchema)
354
- };
355
- }
356
- if ("const" in oldSchema && "const" in newSchema && oldSchema.const !== newSchema.const) {
357
- return {
358
- reason: "type-changed",
359
- oldType: `${getReportingType(oldSchema)}-const-${oldSchema.const}`,
360
- newType: `${getReportingType(newSchema)}-const-${newSchema.const}`
361
- };
362
- }
363
- if ("const" in oldSchema && !("const" in newSchema) && origin === "server") {
364
- return {
365
- reason: "type-changed",
366
- oldType: `${getReportingType(oldSchema)}-const-${oldSchema.const}`,
367
- newType: getReportingType(newSchema)
368
- };
369
- }
370
- if ("const" in newSchema && !("const" in oldSchema) && origin === "client") {
371
- return {
372
- reason: "type-changed",
373
- oldType: getReportingType(oldSchema),
374
- newType: `${getReportingType(newSchema)}-const-${newSchema.const}`
375
- };
376
- }
377
- const breakages = {};
378
- if ("$ref" in newSchema) {
379
- if (newSchema.$ref !== oldSchema.$ref) {
380
- return {
381
- reason: "type-changed",
382
- oldType: getReportingType(oldSchema),
383
- newType: getReportingType(newSchema)
384
- };
385
- }
386
- } else if ("not" in newSchema) {
387
- const notBreakage = diffJSONSchema(
388
- oldSchema.not,
389
- newSchema.not,
390
- origin
391
- );
392
- if (notBreakage) {
393
- breakages.not = notBreakage;
394
- }
395
- } else if ("anyOf" in newSchema) {
396
- const oldAnyOfStringified = oldSchema.anyOf.map((el) => JSON.stringify(el)).sort();
397
- const newAnyOfStringified = newSchema.anyOf.map((el) => JSON.stringify(el)).sort();
398
- const anyOfBreakages = {};
399
- for (let i = 0; i < oldAnyOfStringified.length; i++) {
400
- if (newAnyOfStringified.includes(oldAnyOfStringified[i])) {
401
- continue;
402
- }
403
- if (!newAnyOfStringified[i]) {
404
- if (origin === "server") {
405
- continue;
406
- }
407
- anyOfBreakages[`old-${i}`] = { reason: "removed-required" };
408
- } else {
409
- const breakage = diffJSONSchema(
410
- JSON.parse(oldAnyOfStringified[i]),
411
- JSON.parse(newAnyOfStringified[i]),
412
- origin
413
- );
414
- if (breakage) {
415
- anyOfBreakages[`old-${i}`] = breakage;
416
- }
417
- }
418
- }
419
- for (let i = 0; i < newAnyOfStringified.length; i++) {
420
- if (oldAnyOfStringified.includes(newAnyOfStringified[i])) {
421
- continue;
422
- }
423
- if (!oldAnyOfStringified[i]) {
424
- if (origin === "client") {
425
- continue;
426
- }
427
- anyOfBreakages[`new-${i}`] = { reason: "new-required" };
428
- } else {
429
- const breakage = diffJSONSchema(
430
- JSON.parse(oldAnyOfStringified[i]),
431
- JSON.parse(newAnyOfStringified[i]),
432
- origin
433
- );
434
- if (breakage) {
435
- anyOfBreakages[`new-${i}`] = breakage;
436
- }
437
- }
438
- }
439
- if (Object.keys(anyOfBreakages).length > 0) {
440
- breakages.anyOf = {
441
- reason: "field-breakage",
442
- fieldBreakages: anyOfBreakages
443
- };
444
- }
445
- } else if ("oneOf" in newSchema) {
446
- throw new Error("oneOf is not supported, typebox does not emit it");
447
- } else if ("allOf" in newSchema) {
448
- if (newSchema.allOf.length !== oldSchema.allOf.length) {
449
- breakages.allOf = {
450
- reason: "type-changed",
451
- oldType: `${oldSchema.allOf}`,
452
- newType: `${newSchema.allOf}`
453
- };
454
- } else {
455
- for (let i = 0; i < newSchema.allOf.length; i++) {
456
- const breakage = diffJSONSchema(
457
- oldSchema.allOf[i],
458
- newSchema.allOf[i],
459
- origin
460
- );
461
- if (breakage) {
462
- breakages.allOf = breakage;
463
- break;
464
- }
465
- }
466
- }
467
- } else if (newSchema.type === "array") {
468
- const itemsBreakages = diffJSONSchema(
469
- oldSchema.items,
470
- newSchema.items,
471
- origin
472
- );
473
- if (itemsBreakages) {
474
- breakages.items = itemsBreakages;
475
- }
476
- if (oldSchema.minItems < newSchema.minItems) {
477
- if (origin === "client") {
478
- breakages.minItems = {
479
- reason: "type-changed",
480
- oldType: `${oldSchema.minItems}`,
481
- newType: `${newSchema.minItems}`
482
- };
483
- }
484
- } else if (oldSchema.minItems > newSchema.minItems) {
485
- if (origin === "server") {
486
- breakages.minItems = {
487
- reason: "type-changed",
488
- oldType: `${oldSchema.minItems}`,
489
- newType: `${newSchema.minItems}`
490
- };
491
- }
492
- }
493
- if (oldSchema.maxItems < newSchema.maxItems) {
494
- if (origin === "server") {
495
- breakages.maxItems = {
496
- reason: "type-changed",
497
- oldType: `${oldSchema.maxItems}`,
498
- newType: `${newSchema.maxItems}`
499
- };
500
- }
501
- } else if (oldSchema.maxItems > newSchema.maxItems) {
502
- if (origin === "client") {
503
- breakages.maxItems = {
504
- reason: "type-changed",
505
- oldType: `${oldSchema.maxItems}`,
506
- newType: `${newSchema.maxItems}`
507
- };
508
- }
509
- }
510
- if (!oldSchema.uniqueItems && newSchema.uniqueItems && origin === "client") {
511
- breakages.uniqueItems = {
512
- reason: "type-changed",
513
- oldType: `${!!oldSchema.uniqueItems}`,
514
- newType: `${!!newSchema.uniqueItems}`
515
- };
516
- }
517
- if ("contains" in newSchema !== "contains" in oldSchema) {
518
- if ("contains" in newSchema && !("contains" in oldSchema) && origin === "client") {
519
- breakages.contains = {
520
- reason: "type-changed",
521
- oldType: "no-contains",
522
- newType: "contains"
523
- };
524
- }
525
- } else if ("contains" in newSchema) {
526
- const containsBreakage = diffJSONSchema(
527
- oldSchema.contains,
528
- newSchema.contains,
529
- origin
530
- );
531
- if (containsBreakage) {
532
- breakages.contains = containsBreakage;
533
- }
534
- }
535
- if (oldSchema.minContains < newSchema.minContains) {
536
- if (origin === "client") {
537
- breakages.minContains = {
538
- reason: "type-changed",
539
- oldType: `${oldSchema.minContains}`,
540
- newType: `${newSchema.minContains}`
541
- };
542
- }
543
- } else if (oldSchema.minContains > newSchema.minContains) {
544
- if (origin === "server") {
545
- breakages.minContains = {
546
- reason: "type-changed",
547
- oldType: `${oldSchema.minContains}`,
548
- newType: `${newSchema.minContains}`
549
- };
550
- }
551
- }
552
- if (oldSchema.maxContains < newSchema.maxContains) {
553
- if (origin === "server") {
554
- breakages.maxContains = {
555
- reason: "type-changed",
556
- oldType: `${oldSchema.maxContains}`,
557
- newType: `${newSchema.maxContains}`
558
- };
559
- }
560
- } else if (oldSchema.maxContains > newSchema.maxContains) {
561
- if (origin === "client") {
562
- breakages.maxContains = {
563
- reason: "type-changed",
564
- oldType: `${oldSchema.maxContains}`,
565
- newType: `${newSchema.maxContains}`
566
- };
567
- }
568
- }
569
- } else if (newSchema.type === "object") {
570
- if ("properties" in newSchema !== "properties" in oldSchema) {
571
- return {
572
- reason: "type-changed",
573
- oldType: "properties" in oldSchema ? "probably-object" : "probably-record",
574
- newType: "properties" in newSchema ? "probably-object" : "probably-record"
575
- };
576
- }
577
- if ("properties" in newSchema) {
578
- const propertiesBreakages = diffObjectProperties(
579
- oldSchema.properties,
580
- newSchema.properties,
581
- origin,
582
- oldSchema.required,
583
- newSchema.required
584
- );
585
- if (Object.keys(propertiesBreakages).length) {
586
- breakages.properties = {
587
- reason: "field-breakage",
588
- fieldBreakages: propertiesBreakages
589
- };
590
- }
591
- }
592
- if ("patternProperties" in newSchema) {
593
- const patternPropertiesBreakages = diffObjectProperties(
594
- oldSchema.patternProperties,
595
- newSchema.patternProperties,
596
- origin,
597
- oldSchema.required,
598
- newSchema.required
599
- );
600
- if (Object.keys(patternPropertiesBreakages).length) {
601
- breakages.patternProperties = {
602
- reason: "field-breakage",
603
- fieldBreakages: patternPropertiesBreakages
604
- };
605
- }
606
- }
607
- if ("additionalProperties" in newSchema || "additionalProperties" in oldSchema) {
608
- throw new Error("additionalProperties is not supported");
609
- }
610
- if ("minProperties" in newSchema || "minProperties" in oldSchema) {
611
- throw new Error("minProperties is not supported");
612
- }
613
- if ("maxProperties" in newSchema || "maxProperties" in oldSchema) {
614
- throw new Error("maxProperties is not supported");
615
- }
616
- }
617
- if (Object.keys(breakages).length) {
618
- return {
619
- reason: "field-breakage",
620
- fieldBreakages: breakages
621
- };
622
- }
623
- return null;
624
- }
625
- function diffObjectProperties(oldProperties, newProperties, origin, oldRequiredProperties = [], newRequiredProperties = []) {
626
- const allProperties = /* @__PURE__ */ new Set([
627
- ...Object.keys(oldProperties),
628
- ...Object.keys(newProperties)
629
- ]);
630
- const breakages = {};
631
- for (const propertyName of allProperties) {
632
- const requiredBreakage = diffRequired(
633
- oldProperties[propertyName],
634
- newProperties[propertyName],
635
- origin,
636
- oldRequiredProperties.includes(propertyName),
637
- newRequiredProperties.includes(propertyName)
638
- );
639
- if (requiredBreakage) {
640
- breakages[propertyName] = requiredBreakage;
641
- } else if (oldProperties[propertyName] && newProperties[propertyName]) {
642
- const propertyBreakage = diffJSONSchema(
643
- oldProperties[propertyName],
644
- newProperties[propertyName],
645
- origin
646
- );
647
- if (propertyBreakage) {
648
- breakages[propertyName] = propertyBreakage;
649
- }
650
- }
651
- }
652
- return breakages;
653
- }
654
- function getReportingType(schema) {
655
- if ("not" in schema) {
656
- return "not";
657
- }
658
- if ("anyOf" in schema) {
659
- return "anyOf";
660
- }
661
- if ("allOf" in schema) {
662
- return "allOf";
663
- }
664
- if ("$ref" in schema) {
665
- return "$ref";
666
- }
667
- if (schema.type && typeof schema.type === "string") {
668
- return schema.type;
669
- }
670
- throw new Error(
671
- "Subschema not supported, probably a conditional subschema. Check logs."
672
- );
673
- }
674
-
675
215
  // router/procedures.ts
676
216
  import { Type as Type2 } from "@sinclair/typebox";
677
217
  function rpc({
@@ -1045,9 +585,6 @@ function _pushable(getNext, options) {
1045
585
  return pushable2;
1046
586
  }
1047
587
 
1048
- // router/client.ts
1049
- import { nanoid } from "nanoid";
1050
-
1051
588
  // router/result.ts
1052
589
  import {
1053
590
  Type as Type3
@@ -1105,7 +642,7 @@ function createClient(transport, serverId, providedClientOptions = {}) {
1105
642
  }
1106
643
  const options = { ...defaultClientOptions, ...providedClientOptions };
1107
644
  if (options.eagerlyConnect) {
1108
- void transport.connect(serverId);
645
+ transport.connect(serverId);
1109
646
  }
1110
647
  return _createRecursiveProxy(async (opts) => {
1111
648
  const [serviceName, procName, procType] = [...opts.path];
@@ -1115,8 +652,8 @@ function createClient(transport, serverId, providedClientOptions = {}) {
1115
652
  );
1116
653
  }
1117
654
  const [input] = opts.args;
1118
- if (options.connectOnInvoke && !transport.connections.has(serverId)) {
1119
- void transport.connect(serverId);
655
+ if (options.connectOnInvoke && !transport.sessions.has(serverId)) {
656
+ transport.connect(serverId);
1120
657
  }
1121
658
  if (procType === "rpc") {
1122
659
  return handleRpc(transport, serverId, input, serviceName, procName);
@@ -1139,7 +676,7 @@ function createSessionDisconnectHandler(from, cb) {
1139
676
  };
1140
677
  }
1141
678
  function handleRpc(transport, serverId, input, serviceName, procedureName) {
1142
- const streamId = nanoid();
679
+ const streamId = generateId();
1143
680
  const { span, ctx } = createProcTelemetryInfo(
1144
681
  transport,
1145
682
  "rpc",
@@ -1184,7 +721,7 @@ function handleRpc(transport, serverId, input, serviceName, procedureName) {
1184
721
  return responsePromise;
1185
722
  }
1186
723
  function handleStream(transport, serverId, init, serviceName, procedureName) {
1187
- const streamId = nanoid();
724
+ const streamId = generateId();
1188
725
  const { span, ctx } = createProcTelemetryInfo(
1189
726
  transport,
1190
727
  "stream",
@@ -1225,7 +762,7 @@ function handleStream(transport, serverId, init, serviceName, procedureName) {
1225
762
  }
1226
763
  if (!healthyClose)
1227
764
  return;
1228
- transport.sendCloseStream(serverId, streamId);
765
+ transport.send(serverId, closeStreamMessage(streamId));
1229
766
  };
1230
767
  void pipeInputToTransport();
1231
768
  function onMessage(msg) {
@@ -1261,7 +798,7 @@ function handleStream(transport, serverId, init, serviceName, procedureName) {
1261
798
  return [inputStream, outputStream, cleanup];
1262
799
  }
1263
800
  function handleSubscribe(transport, serverId, input, serviceName, procedureName) {
1264
- const streamId = nanoid();
801
+ const streamId = generateId();
1265
802
  const { span, ctx } = createProcTelemetryInfo(
1266
803
  transport,
1267
804
  "subscription",
@@ -1300,7 +837,7 @@ function handleSubscribe(transport, serverId, input, serviceName, procedureName)
1300
837
  cleanup();
1301
838
  if (!healthyClose)
1302
839
  return;
1303
- transport.sendCloseStream(serverId, streamId);
840
+ transport.send(serverId, closeStreamMessage(streamId));
1304
841
  };
1305
842
  const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
1306
843
  outputStream.push(
@@ -1317,7 +854,7 @@ function handleSubscribe(transport, serverId, input, serviceName, procedureName)
1317
854
  return [outputStream, closeHandler];
1318
855
  }
1319
856
  function handleUpload(transport, serverId, init, serviceName, procedureName) {
1320
- const streamId = nanoid();
857
+ const streamId = generateId();
1321
858
  const { span, ctx } = createProcTelemetryInfo(
1322
859
  transport,
1323
860
  "upload",
@@ -1357,7 +894,7 @@ function handleUpload(transport, serverId, init, serviceName, procedureName) {
1357
894
  }
1358
895
  if (!healthyClose)
1359
896
  return;
1360
- transport.sendCloseStream(serverId, streamId);
897
+ transport.send(serverId, closeStreamMessage(streamId));
1361
898
  };
1362
899
  void pipeInputToTransport();
1363
900
  const responsePromise = new Promise((resolve) => {
@@ -1398,18 +935,18 @@ var RiverServer = class {
1398
935
  transport;
1399
936
  services;
1400
937
  contextMap;
1401
- // map of streamId to ProcStream
1402
938
  streamMap;
1403
- // map of client to their open streams by streamId
1404
- clientStreams;
1405
- disconnectedSessions;
939
+ sessionToStreamId;
940
+ // streams that are in the process of being cleaned up
941
+ // this is to prevent output handlers from sending after the stream is cleaned up
942
+ sessionsBeingCleanedUp = /* @__PURE__ */ new Set();
1406
943
  log;
1407
944
  constructor(transport, services, handshakeOptions, extendedContext) {
1408
945
  const instances = {};
1409
946
  this.services = instances;
1410
947
  this.contextMap = /* @__PURE__ */ new Map();
1411
948
  for (const [name, service] of Object.entries(services)) {
1412
- const instance = service.instantiate();
949
+ const instance = service.instantiate(extendedContext ?? {});
1413
950
  instances[name] = instance;
1414
951
  this.contextMap.set(instance, {
1415
952
  ...extendedContext,
@@ -1420,9 +957,8 @@ var RiverServer = class {
1420
957
  transport.extendHandshake(handshakeOptions);
1421
958
  }
1422
959
  this.transport = transport;
1423
- this.disconnectedSessions = /* @__PURE__ */ new Set();
1424
960
  this.streamMap = /* @__PURE__ */ new Map();
1425
- this.clientStreams = /* @__PURE__ */ new Map();
961
+ this.sessionToStreamId = /* @__PURE__ */ new Map();
1426
962
  this.transport.addEventListener("message", this.onMessage);
1427
963
  this.transport.addEventListener("sessionStatus", this.onSessionStatus);
1428
964
  this.log = transport.log;
@@ -1457,24 +993,35 @@ var RiverServer = class {
1457
993
  }
1458
994
  await this.pushToStream(procStream, message, isInitMessage);
1459
995
  };
1460
- // cleanup streams on session close
1461
996
  onSessionStatus = async (evt) => {
1462
- if (evt.status !== "disconnect")
997
+ const streamsFromThisClient = this.sessionToStreamId.get(evt.session.id);
998
+ const cleanupStreams = async (ids) => {
999
+ this.sessionsBeingCleanedUp.add(evt.session.id);
1000
+ await Promise.all(Array.from(ids).map(this.cleanupStream));
1001
+ this.sessionToStreamId.delete(evt.session.id);
1002
+ this.sessionsBeingCleanedUp.delete(evt.session.id);
1003
+ };
1004
+ if (evt.status === "connect") {
1005
+ if (streamsFromThisClient) {
1006
+ this.log?.error(
1007
+ `got session connect from ${evt.session.to} but there are still streams open from this session`,
1008
+ {
1009
+ clientId: this.transport.clientId,
1010
+ tags: ["invariant-violation"]
1011
+ }
1012
+ );
1013
+ await cleanupStreams(streamsFromThisClient);
1014
+ }
1015
+ this.sessionToStreamId.set(evt.session.id, /* @__PURE__ */ new Set());
1463
1016
  return;
1464
- const disconnectedClientId = evt.session.to;
1017
+ }
1465
1018
  this.log?.info(
1466
- `got session disconnect from ${disconnectedClientId}, cleaning up streams`,
1019
+ `got session disconnect from ${evt.session.to}, cleaning up streams for session`,
1467
1020
  evt.session.loggingMetadata
1468
1021
  );
1469
- const streamsFromThisClient = this.clientStreams.get(disconnectedClientId);
1470
1022
  if (!streamsFromThisClient)
1471
1023
  return;
1472
- this.disconnectedSessions.add(disconnectedClientId);
1473
- await Promise.all(
1474
- Array.from(streamsFromThisClient).map(this.cleanupStream)
1475
- );
1476
- this.disconnectedSessions.delete(disconnectedClientId);
1477
- this.clientStreams.delete(disconnectedClientId);
1024
+ await cleanupStreams(streamsFromThisClient);
1478
1025
  };
1479
1026
  createNewProcStream(message) {
1480
1027
  if (!isStreamOpen(message.controlFlags)) {
@@ -1525,26 +1072,34 @@ var RiverServer = class {
1525
1072
  });
1526
1073
  return;
1527
1074
  }
1075
+ const {
1076
+ to,
1077
+ id: sessionId,
1078
+ loggingMetadata: sessionLoggingMetadata
1079
+ } = session;
1528
1080
  const procedure = service.procedures[message.procedureName];
1529
1081
  const incoming = pushable({ objectMode: true });
1530
1082
  const outgoing = pushable({ objectMode: true });
1531
1083
  const needsClose = procedure.type === "subscription" || procedure.type === "stream";
1532
1084
  const disposables = [];
1085
+ const wrappedSend = (payload) => {
1086
+ if (!this.sessionsBeingCleanedUp.has(sessionId)) {
1087
+ this.transport.send(to, payload);
1088
+ }
1089
+ };
1533
1090
  const outputHandler = (
1534
1091
  // sending outgoing messages back to client
1535
1092
  needsClose ? (
1536
1093
  // subscription and stream case, we need to send a close bit after the response stream
1537
1094
  (async () => {
1538
1095
  for await (const response of outgoing) {
1539
- this.transport.send(session.to, {
1096
+ wrappedSend({
1540
1097
  streamId: message.streamId,
1541
1098
  controlFlags: 0,
1542
1099
  payload: response
1543
1100
  });
1544
1101
  }
1545
- if (!this.disconnectedSessions.has(message.from)) {
1546
- this.transport.sendCloseStream(session.to, message.streamId);
1547
- }
1102
+ wrappedSend(closeStreamMessage(message.streamId));
1548
1103
  disposables.forEach((d) => d());
1549
1104
  })()
1550
1105
  ) : (
@@ -1552,7 +1107,7 @@ var RiverServer = class {
1552
1107
  (async () => {
1553
1108
  const response = await outgoing.next().then((res) => res.value);
1554
1109
  if (response) {
1555
- this.transport.send(session.to, {
1110
+ wrappedSend({
1556
1111
  streamId: message.streamId,
1557
1112
  controlFlags: 4 /* StreamClosedBit */,
1558
1113
  payload: response
@@ -1566,7 +1121,7 @@ var RiverServer = class {
1566
1121
  const errorMsg = coerceErrorString(err);
1567
1122
  this.log?.error(
1568
1123
  `procedure ${message.serviceName}.${message.procedureName} threw an uncaught error: ${errorMsg}`,
1569
- session.loggingMetadata
1124
+ sessionLoggingMetadata
1570
1125
  );
1571
1126
  span.recordException(err instanceof Error ? err : new Error(errorMsg));
1572
1127
  span.setStatus({ code: SpanStatusCode.ERROR });
@@ -1577,10 +1132,10 @@ var RiverServer = class {
1577
1132
  })
1578
1133
  );
1579
1134
  };
1580
- const sessionMeta = this.transport.sessionHandshakeMetadata.get(session);
1135
+ const sessionMeta = this.transport.sessionHandshakeMetadata.get(to);
1581
1136
  if (!sessionMeta) {
1582
1137
  this.log?.error(`session doesn't have handshake metadata`, {
1583
- ...session.loggingMetadata,
1138
+ ...sessionLoggingMetadata,
1584
1139
  tags: ["invariant-violation"]
1585
1140
  });
1586
1141
  return;
@@ -1592,7 +1147,6 @@ var RiverServer = class {
1592
1147
  to: message.to,
1593
1148
  from: message.from,
1594
1149
  streamId: message.streamId,
1595
- session,
1596
1150
  metadata: sessionMeta
1597
1151
  };
1598
1152
  switch (procedure.type) {
@@ -1711,9 +1265,7 @@ var RiverServer = class {
1711
1265
  initMessage.value,
1712
1266
  incoming
1713
1267
  );
1714
- if (!this.disconnectedSessions.has(message.from)) {
1715
- outgoing.push(outputMessage);
1716
- }
1268
+ outgoing.push(outputMessage);
1717
1269
  } catch (err) {
1718
1270
  errorHandler(err, span);
1719
1271
  } finally {
@@ -1731,9 +1283,7 @@ var RiverServer = class {
1731
1283
  serviceContextWithTransportInfo,
1732
1284
  incoming
1733
1285
  );
1734
- if (!this.disconnectedSessions.has(message.from)) {
1735
- outgoing.push(outputMessage);
1736
- }
1286
+ outgoing.push(outputMessage);
1737
1287
  } catch (err) {
1738
1288
  errorHandler(err, span);
1739
1289
  } finally {
@@ -1746,7 +1296,7 @@ var RiverServer = class {
1746
1296
  default:
1747
1297
  this.log?.warn(
1748
1298
  `got request for invalid procedure type ${procedure.type} at ${message.serviceName}.${message.procedureName}`,
1749
- { ...session.loggingMetadata, transportMessage: message }
1299
+ { ...sessionLoggingMetadata, transportMessage: message }
1750
1300
  );
1751
1301
  return;
1752
1302
  }
@@ -1759,9 +1309,9 @@ var RiverServer = class {
1759
1309
  promises: { inputHandler, outputHandler }
1760
1310
  };
1761
1311
  this.streamMap.set(message.streamId, procStream);
1762
- const streamsFromThisClient = this.clientStreams.get(message.from) ?? /* @__PURE__ */ new Set();
1763
- streamsFromThisClient.add(message.streamId);
1764
- this.clientStreams.set(message.from, streamsFromThisClient);
1312
+ const streamsForThisSession = this.sessionToStreamId.get(sessionId) ?? /* @__PURE__ */ new Set();
1313
+ streamsForThisSession.add(message.streamId);
1314
+ this.sessionToStreamId.set(sessionId, streamsForThisSession);
1765
1315
  return procStream;
1766
1316
  }
1767
1317
  async pushToStream(procStream, message, isInit) {
@@ -1797,11 +1347,11 @@ var RiverServer = class {
1797
1347
  }
1798
1348
  if (isStreamClose(message.controlFlags)) {
1799
1349
  await this.cleanupStream(message.streamId);
1800
- const streamsFromThisClient = this.clientStreams.get(message.from);
1350
+ const streamsFromThisClient = this.sessionToStreamId.get(message.from);
1801
1351
  if (streamsFromThisClient) {
1802
1352
  streamsFromThisClient.delete(message.streamId);
1803
1353
  if (streamsFromThisClient.size === 0) {
1804
- this.clientStreams.delete(message.from);
1354
+ this.sessionToStreamId.delete(message.from);
1805
1355
  }
1806
1356
  }
1807
1357
  }
@@ -1850,7 +1400,6 @@ function createServerHandshakeOptions(schema, validate) {
1850
1400
  export {
1851
1401
  serializeSchema,
1852
1402
  ServiceSchema,
1853
- diffServerSchema,
1854
1403
  Procedure,
1855
1404
  pushable,
1856
1405
  UNCAUGHT_ERROR,
@@ -1862,4 +1411,4 @@ export {
1862
1411
  createClientHandshakeOptions,
1863
1412
  createServerHandshakeOptions
1864
1413
  };
1865
- //# sourceMappingURL=chunk-LTSLICON.js.map
1414
+ //# sourceMappingURL=chunk-KYYB4DUR.js.map