@replit/river 0.21.1 → 0.22.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 (63) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-5WFL722S.js → chunk-3MFX6NXA.js} +94 -3
  3. package/dist/chunk-3MFX6NXA.js.map +1 -0
  4. package/dist/{chunk-NCXUFDVL.js → chunk-GCLEWC26.js} +328 -500
  5. package/dist/chunk-GCLEWC26.js.map +1 -0
  6. package/dist/chunk-HUBFYN37.js +60 -0
  7. package/dist/chunk-HUBFYN37.js.map +1 -0
  8. package/dist/{chunk-FDLAPYCK.js → chunk-S3YKQT4J.js} +2 -2
  9. package/dist/{chunk-JMXO5L2X.js → chunk-ZPBWKBM5.js} +344 -384
  10. package/dist/chunk-ZPBWKBM5.js.map +1 -0
  11. package/dist/{connection-76c5ed01.d.ts → connection-8b059ac4.d.ts} +6 -4
  12. package/dist/{connection-975b25c9.d.ts → connection-bbfe1147.d.ts} +1 -1
  13. package/dist/{index-dfad460e.d.ts → index-2ece5234.d.ts} +16 -7
  14. package/dist/logging/index.d.cts +2 -1
  15. package/dist/logging/index.d.ts +2 -1
  16. package/dist/router/index.cjs +373 -486
  17. package/dist/router/index.cjs.map +1 -1
  18. package/dist/router/index.d.cts +5 -4
  19. package/dist/router/index.d.ts +5 -4
  20. package/dist/router/index.js +4 -3
  21. package/dist/{services-7b716dcf.d.ts → services-acbcc441.d.ts} +1 -1
  22. package/dist/{services-9c496c6e.d.ts → services-cb01a7a8.d.ts} +1 -1
  23. package/dist/transport/impls/uds/client.cjs +186 -145
  24. package/dist/transport/impls/uds/client.cjs.map +1 -1
  25. package/dist/transport/impls/uds/client.d.cts +3 -2
  26. package/dist/transport/impls/uds/client.d.ts +3 -2
  27. package/dist/transport/impls/uds/client.js +3 -3
  28. package/dist/transport/impls/uds/server.cjs +281 -256
  29. package/dist/transport/impls/uds/server.cjs.map +1 -1
  30. package/dist/transport/impls/uds/server.d.cts +3 -2
  31. package/dist/transport/impls/uds/server.d.ts +3 -2
  32. package/dist/transport/impls/uds/server.js +3 -3
  33. package/dist/transport/impls/ws/client.cjs +240 -204
  34. package/dist/transport/impls/ws/client.cjs.map +1 -1
  35. package/dist/transport/impls/ws/client.d.cts +6 -6
  36. package/dist/transport/impls/ws/client.d.ts +6 -6
  37. package/dist/transport/impls/ws/client.js +33 -48
  38. package/dist/transport/impls/ws/client.js.map +1 -1
  39. package/dist/transport/impls/ws/server.cjs +303 -270
  40. package/dist/transport/impls/ws/server.cjs.map +1 -1
  41. package/dist/transport/impls/ws/server.d.cts +5 -4
  42. package/dist/transport/impls/ws/server.d.ts +5 -4
  43. package/dist/transport/impls/ws/server.js +3 -3
  44. package/dist/transport/impls/ws/server.js.map +1 -1
  45. package/dist/transport/index.cjs +390 -382
  46. package/dist/transport/index.cjs.map +1 -1
  47. package/dist/transport/index.d.cts +5 -5
  48. package/dist/transport/index.d.ts +5 -5
  49. package/dist/transport/index.js +2 -2
  50. package/dist/util/testHelpers.cjs +57 -7
  51. package/dist/util/testHelpers.cjs.map +1 -1
  52. package/dist/util/testHelpers.d.cts +14 -5
  53. package/dist/util/testHelpers.d.ts +14 -5
  54. package/dist/util/testHelpers.js +10 -4
  55. package/dist/util/testHelpers.js.map +1 -1
  56. package/dist/wslike-e0b32dd5.d.ts +40 -0
  57. package/package.json +4 -5
  58. package/dist/chunk-3Y7AB5EB.js +0 -42
  59. package/dist/chunk-3Y7AB5EB.js.map +0 -1
  60. package/dist/chunk-5WFL722S.js.map +0 -1
  61. package/dist/chunk-JMXO5L2X.js.map +0 -1
  62. package/dist/chunk-NCXUFDVL.js.map +0 -1
  63. /package/dist/{chunk-FDLAPYCK.js.map → chunk-S3YKQT4J.js.map} +0 -0
@@ -322,9 +322,6 @@ var Procedure = {
322
322
  stream
323
323
  };
324
324
 
325
- // router/client.ts
326
- var import_api2 = require("@opentelemetry/api");
327
-
328
325
  // node_modules/p-defer/index.js
329
326
  function pDefer() {
330
327
  const deferred = {};
@@ -707,8 +704,58 @@ var log = void 0;
707
704
 
708
705
  // tracing/index.ts
709
706
  var import_api = require("@opentelemetry/api");
710
- var tracer = import_api.trace.getTracer("river");
711
- var tracing_default = tracer;
707
+
708
+ // package.json
709
+ var version = "0.22.0";
710
+
711
+ // tracing/index.ts
712
+ function getPropagationContext(ctx) {
713
+ const tracing = {
714
+ traceparent: "",
715
+ tracestate: ""
716
+ };
717
+ import_api.propagation.inject(ctx, tracing);
718
+ return tracing;
719
+ }
720
+ function createProcTelemetryInfo(kind, serviceName, procedureName, streamId) {
721
+ const ctx = import_api.context.active();
722
+ const span = tracer.startSpan(
723
+ `procedure call ${serviceName}.${procedureName}`,
724
+ {
725
+ attributes: {
726
+ component: "river",
727
+ "river.method.kind": kind,
728
+ "river.method.service": serviceName,
729
+ "river.method.name": procedureName,
730
+ "river.streamId": streamId,
731
+ "span.kind": "client"
732
+ },
733
+ kind: import_api.SpanKind.CLIENT
734
+ },
735
+ ctx
736
+ );
737
+ return { span, ctx };
738
+ }
739
+ function createHandlerSpan(kind, message, fn) {
740
+ const ctx = message.tracing ? import_api.propagation.extract(import_api.context.active(), message.tracing) : import_api.context.active();
741
+ return tracer.startActiveSpan(
742
+ `procedure handler ${message.serviceName}.${message.procedureName}`,
743
+ {
744
+ attributes: {
745
+ component: "river",
746
+ "river.method.kind": kind,
747
+ "river.method.service": message.serviceName,
748
+ "river.method.name": message.procedureName,
749
+ "river.streamId": message.streamId,
750
+ "span.kind": "server"
751
+ },
752
+ kind: import_api.SpanKind.SERVER
753
+ },
754
+ ctx,
755
+ fn
756
+ );
757
+ }
758
+ var tracer = import_api.trace.getTracer("river", version);
712
759
 
713
760
  // router/client.ts
714
761
  var noop = () => {
@@ -781,318 +828,254 @@ function createSessionDisconnectHandler(from, cb) {
781
828
  }
782
829
  function handleRpc(transport, serverId, input, serviceName, procedureName) {
783
830
  const streamId = (0, import_nanoid2.nanoid)();
784
- return tracing_default.startActiveSpan(
785
- `${serviceName}.${procedureName}`,
786
- {
787
- attributes: {
788
- component: "river",
789
- "river.method.kind": "rpc",
790
- "river.method.service": serviceName,
791
- "river.method.name": procedureName,
792
- "river.streamId": streamId,
793
- "span.kind": "client"
794
- },
795
- kind: import_api2.SpanKind.CLIENT
796
- },
797
- (span) => {
798
- const tracing = { traceparent: "", tracestate: "" };
799
- import_api2.propagation.inject(import_api2.context.active(), tracing);
800
- transport.send(serverId, {
801
- streamId,
802
- serviceName,
803
- procedureName,
804
- tracing,
805
- payload: input,
806
- controlFlags: 2 /* StreamOpenBit */ | 4 /* StreamClosedBit */
807
- });
808
- const responsePromise = new Promise((resolve) => {
809
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
810
- span.setStatus({ code: import_api2.SpanStatusCode.ERROR });
811
- cleanup();
812
- resolve(
813
- Err({
814
- code: UNEXPECTED_DISCONNECT,
815
- message: `${serverId} unexpectedly disconnected`
816
- })
817
- );
818
- });
819
- function cleanup() {
820
- transport.removeEventListener("message", onMessage);
821
- transport.removeEventListener("sessionStatus", onSessionStatus);
822
- span.end();
823
- }
824
- function onMessage(msg) {
825
- if (msg.streamId !== streamId)
826
- return;
827
- if (msg.to !== transport.clientId)
828
- return;
829
- if (msg.payload && typeof msg.payload === "object" && "ok" in msg.payload) {
830
- span.setStatus({
831
- code: msg.payload.ok ? import_api2.SpanStatusCode.OK : import_api2.SpanStatusCode.ERROR
832
- });
833
- }
834
- cleanup();
835
- resolve(msg.payload);
836
- }
837
- transport.addEventListener("message", onMessage);
838
- transport.addEventListener("sessionStatus", onSessionStatus);
839
- });
840
- return responsePromise;
841
- }
831
+ const { span, ctx } = createProcTelemetryInfo(
832
+ "rpc",
833
+ serviceName,
834
+ procedureName,
835
+ streamId
842
836
  );
837
+ transport.send(serverId, {
838
+ streamId,
839
+ serviceName,
840
+ procedureName,
841
+ payload: input,
842
+ tracing: getPropagationContext(ctx),
843
+ controlFlags: 2 /* StreamOpenBit */ | 4 /* StreamClosedBit */
844
+ });
845
+ const responsePromise = new Promise((resolve) => {
846
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
847
+ cleanup();
848
+ resolve(
849
+ Err({
850
+ code: UNEXPECTED_DISCONNECT,
851
+ message: `${serverId} unexpectedly disconnected`
852
+ })
853
+ );
854
+ });
855
+ function cleanup() {
856
+ transport.removeEventListener("message", onMessage);
857
+ transport.removeEventListener("sessionStatus", onSessionStatus);
858
+ span.end();
859
+ }
860
+ function onMessage(msg) {
861
+ if (msg.streamId !== streamId)
862
+ return;
863
+ if (msg.to !== transport.clientId)
864
+ return;
865
+ cleanup();
866
+ resolve(msg.payload);
867
+ }
868
+ transport.addEventListener("message", onMessage);
869
+ transport.addEventListener("sessionStatus", onSessionStatus);
870
+ });
871
+ return responsePromise;
843
872
  }
844
873
  function handleStream(transport, serverId, init, serviceName, procedureName) {
845
874
  const streamId = (0, import_nanoid2.nanoid)();
846
- return tracing_default.startActiveSpan(
847
- `${serviceName}.${procedureName}`,
848
- {
849
- attributes: {
850
- component: "river",
851
- "river.method.kind": init ? "stream-with-init" : "stream",
852
- "river.method.service": serviceName,
853
- "river.method.name": procedureName,
854
- "river.streamId": streamId,
855
- "span.kind": "client"
856
- },
857
- kind: import_api2.SpanKind.CLIENT
858
- },
859
- (span) => {
860
- const tracing = { traceparent: "", tracestate: "" };
861
- import_api2.propagation.inject(import_api2.context.active(), tracing);
862
- const inputStream = pushable({ objectMode: true });
863
- const outputStream = pushable({ objectMode: true });
864
- let firstMessage = true;
865
- let healthyClose = true;
866
- if (init) {
867
- transport.send(serverId, {
868
- streamId,
869
- serviceName,
870
- procedureName,
871
- tracing,
872
- payload: init,
873
- controlFlags: 2 /* StreamOpenBit */
874
- });
875
- firstMessage = false;
876
- }
877
- const pipeInputToTransport = async () => {
878
- for await (const rawIn of inputStream) {
879
- const m = {
880
- streamId,
881
- payload: rawIn,
882
- controlFlags: 0
883
- };
884
- if (firstMessage) {
885
- m.serviceName = serviceName;
886
- m.procedureName = procedureName;
887
- m.tracing = tracing;
888
- m.controlFlags |= 2 /* StreamOpenBit */;
889
- firstMessage = false;
890
- }
891
- transport.send(serverId, m);
892
- }
893
- if (!healthyClose)
894
- return;
895
- transport.sendCloseStream(serverId, streamId);
896
- span.setStatus({ code: import_api2.SpanStatusCode.OK });
875
+ const { span, ctx } = createProcTelemetryInfo(
876
+ "stream",
877
+ serviceName,
878
+ procedureName,
879
+ streamId
880
+ );
881
+ const inputStream = pushable({ objectMode: true });
882
+ const outputStream = pushable({ objectMode: true });
883
+ let firstMessage = true;
884
+ let healthyClose = true;
885
+ if (init) {
886
+ transport.send(serverId, {
887
+ streamId,
888
+ serviceName,
889
+ procedureName,
890
+ payload: init,
891
+ tracing: getPropagationContext(ctx),
892
+ controlFlags: 2 /* StreamOpenBit */
893
+ });
894
+ firstMessage = false;
895
+ }
896
+ const pipeInputToTransport = async () => {
897
+ for await (const rawIn of inputStream) {
898
+ const m = {
899
+ streamId,
900
+ payload: rawIn,
901
+ controlFlags: 0
897
902
  };
898
- void pipeInputToTransport();
899
- function onMessage(msg) {
900
- if (msg.streamId !== streamId)
901
- return;
902
- if (msg.to !== transport.clientId)
903
- return;
904
- if (isStreamClose(msg.controlFlags)) {
905
- cleanup();
906
- } else {
907
- outputStream.push(msg.payload);
908
- }
909
- }
910
- function cleanup() {
911
- inputStream.end();
912
- outputStream.end();
913
- transport.removeEventListener("message", onMessage);
914
- transport.removeEventListener("sessionStatus", onSessionStatus);
915
- span.end();
903
+ if (firstMessage) {
904
+ m.serviceName = serviceName;
905
+ m.procedureName = procedureName;
906
+ m.tracing = getPropagationContext(ctx);
907
+ m.controlFlags |= 2 /* StreamOpenBit */;
908
+ firstMessage = false;
916
909
  }
917
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
918
- outputStream.push(
919
- Err({
920
- code: UNEXPECTED_DISCONNECT,
921
- message: `${serverId} unexpectedly disconnected`
922
- })
923
- );
924
- healthyClose = false;
925
- span.setStatus({ code: import_api2.SpanStatusCode.ERROR });
926
- cleanup();
927
- });
928
- transport.addEventListener("message", onMessage);
929
- transport.addEventListener("sessionStatus", onSessionStatus);
930
- return [inputStream, outputStream, cleanup];
910
+ transport.send(serverId, m);
931
911
  }
932
- );
912
+ if (!healthyClose)
913
+ return;
914
+ transport.sendCloseStream(serverId, streamId);
915
+ };
916
+ void pipeInputToTransport();
917
+ function onMessage(msg) {
918
+ if (msg.streamId !== streamId)
919
+ return;
920
+ if (msg.to !== transport.clientId)
921
+ return;
922
+ if (isStreamClose(msg.controlFlags)) {
923
+ cleanup();
924
+ } else {
925
+ outputStream.push(msg.payload);
926
+ }
927
+ }
928
+ function cleanup() {
929
+ inputStream.end();
930
+ outputStream.end();
931
+ transport.removeEventListener("message", onMessage);
932
+ transport.removeEventListener("sessionStatus", onSessionStatus);
933
+ span.end();
934
+ }
935
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
936
+ outputStream.push(
937
+ Err({
938
+ code: UNEXPECTED_DISCONNECT,
939
+ message: `${serverId} unexpectedly disconnected`
940
+ })
941
+ );
942
+ healthyClose = false;
943
+ cleanup();
944
+ });
945
+ transport.addEventListener("message", onMessage);
946
+ transport.addEventListener("sessionStatus", onSessionStatus);
947
+ return [inputStream, outputStream, cleanup];
933
948
  }
934
949
  function handleSubscribe(transport, serverId, input, serviceName, procedureName) {
935
950
  const streamId = (0, import_nanoid2.nanoid)();
936
- return tracing_default.startActiveSpan(
937
- `${serviceName}.${procedureName}`,
938
- {
939
- attributes: {
940
- component: "river",
941
- "river.method.kind": "subscribe",
942
- "river.method.service": serviceName,
943
- "river.method.name": procedureName,
944
- "river.streamId": streamId,
945
- "span.kind": "client"
946
- },
947
- kind: import_api2.SpanKind.CLIENT
948
- },
949
- (span) => {
950
- const tracing = { traceparent: "", tracestate: "" };
951
- import_api2.propagation.inject(import_api2.context.active(), tracing);
952
- transport.send(serverId, {
953
- streamId,
954
- serviceName,
955
- procedureName,
956
- tracing,
957
- payload: input,
958
- controlFlags: 2 /* StreamOpenBit */
959
- });
960
- let healthyClose = true;
961
- const outputStream = pushable({ objectMode: true });
962
- function onMessage(msg) {
963
- if (msg.streamId !== streamId)
964
- return;
965
- if (msg.to !== transport.clientId)
966
- return;
967
- if (isStreamClose(msg.controlFlags)) {
968
- cleanup();
969
- } else {
970
- outputStream.push(msg.payload);
971
- }
972
- }
973
- function cleanup() {
974
- outputStream.end();
975
- transport.removeEventListener("message", onMessage);
976
- transport.removeEventListener("sessionStatus", onSessionStatus);
977
- span.end();
978
- }
979
- const closeHandler = () => {
980
- cleanup();
981
- if (!healthyClose)
982
- return;
983
- transport.sendCloseStream(serverId, streamId);
984
- };
985
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
986
- outputStream.push(
987
- Err({
988
- code: UNEXPECTED_DISCONNECT,
989
- message: `${serverId} unexpectedly disconnected`
990
- })
991
- );
992
- healthyClose = false;
993
- span.setStatus({ code: import_api2.SpanStatusCode.ERROR });
994
- cleanup();
995
- });
996
- transport.addEventListener("message", onMessage);
997
- transport.addEventListener("sessionStatus", onSessionStatus);
998
- return [outputStream, closeHandler];
999
- }
951
+ const { span, ctx } = createProcTelemetryInfo(
952
+ "subscription",
953
+ serviceName,
954
+ procedureName,
955
+ streamId
1000
956
  );
957
+ transport.send(serverId, {
958
+ streamId,
959
+ serviceName,
960
+ procedureName,
961
+ payload: input,
962
+ tracing: getPropagationContext(ctx),
963
+ controlFlags: 2 /* StreamOpenBit */
964
+ });
965
+ let healthyClose = true;
966
+ const outputStream = pushable({ objectMode: true });
967
+ function onMessage(msg) {
968
+ if (msg.streamId !== streamId)
969
+ return;
970
+ if (msg.to !== transport.clientId)
971
+ return;
972
+ if (isStreamClose(msg.controlFlags)) {
973
+ cleanup();
974
+ } else {
975
+ outputStream.push(msg.payload);
976
+ }
977
+ }
978
+ function cleanup() {
979
+ outputStream.end();
980
+ transport.removeEventListener("message", onMessage);
981
+ transport.removeEventListener("sessionStatus", onSessionStatus);
982
+ span.end();
983
+ }
984
+ const closeHandler = () => {
985
+ cleanup();
986
+ if (!healthyClose)
987
+ return;
988
+ transport.sendCloseStream(serverId, streamId);
989
+ };
990
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
991
+ outputStream.push(
992
+ Err({
993
+ code: UNEXPECTED_DISCONNECT,
994
+ message: `${serverId} unexpectedly disconnected`
995
+ })
996
+ );
997
+ healthyClose = false;
998
+ cleanup();
999
+ });
1000
+ transport.addEventListener("message", onMessage);
1001
+ transport.addEventListener("sessionStatus", onSessionStatus);
1002
+ return [outputStream, closeHandler];
1001
1003
  }
1002
1004
  function handleUpload(transport, serverId, init, serviceName, procedureName) {
1003
1005
  const streamId = (0, import_nanoid2.nanoid)();
1004
- return tracing_default.startActiveSpan(
1005
- `${serviceName}.${procedureName}`,
1006
- {
1007
- attributes: {
1008
- component: "river",
1009
- "river.method.kind": init ? "upload-with-init" : "upload",
1010
- "river.method.service": serviceName,
1011
- "river.method.name": procedureName,
1012
- "river.streamId": streamId,
1013
- "span.kind": "client"
1014
- },
1015
- kind: import_api2.SpanKind.CLIENT
1016
- },
1017
- (span) => {
1018
- const tracing = { traceparent: "", tracestate: "" };
1019
- import_api2.propagation.inject(import_api2.context.active(), tracing);
1020
- const inputStream = pushable({ objectMode: true });
1021
- let firstMessage = true;
1022
- let healthyClose = true;
1023
- if (init) {
1024
- transport.send(serverId, {
1025
- streamId,
1026
- serviceName,
1027
- procedureName,
1028
- tracing,
1029
- payload: init,
1030
- controlFlags: 2 /* StreamOpenBit */
1031
- });
1006
+ const { span, ctx } = createProcTelemetryInfo(
1007
+ "upload",
1008
+ serviceName,
1009
+ procedureName,
1010
+ streamId
1011
+ );
1012
+ const inputStream = pushable({ objectMode: true });
1013
+ let firstMessage = true;
1014
+ let healthyClose = true;
1015
+ if (init) {
1016
+ transport.send(serverId, {
1017
+ streamId,
1018
+ serviceName,
1019
+ procedureName,
1020
+ payload: init,
1021
+ tracing: getPropagationContext(ctx),
1022
+ controlFlags: 2 /* StreamOpenBit */
1023
+ });
1024
+ firstMessage = false;
1025
+ }
1026
+ const pipeInputToTransport = async () => {
1027
+ for await (const rawIn of inputStream) {
1028
+ const m = {
1029
+ streamId,
1030
+ payload: rawIn,
1031
+ controlFlags: 0
1032
+ };
1033
+ if (firstMessage) {
1034
+ m.serviceName = serviceName;
1035
+ m.procedureName = procedureName;
1036
+ m.tracing = getPropagationContext(ctx);
1037
+ m.controlFlags |= 2 /* StreamOpenBit */;
1032
1038
  firstMessage = false;
1033
1039
  }
1034
- const pipeInputToTransport = async () => {
1035
- for await (const rawIn of inputStream) {
1036
- const m = {
1037
- streamId,
1038
- payload: rawIn,
1039
- controlFlags: 0
1040
- };
1041
- if (firstMessage) {
1042
- m.serviceName = serviceName;
1043
- m.procedureName = procedureName;
1044
- m.tracing = tracing;
1045
- m.controlFlags |= 2 /* StreamOpenBit */;
1046
- firstMessage = false;
1047
- }
1048
- transport.send(serverId, m);
1049
- }
1050
- if (!healthyClose)
1051
- return;
1052
- transport.sendCloseStream(serverId, streamId);
1053
- };
1054
- void pipeInputToTransport();
1055
- const responsePromise = new Promise((resolve) => {
1056
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
1057
- healthyClose = false;
1058
- span.setStatus({ code: import_api2.SpanStatusCode.ERROR });
1059
- cleanup();
1060
- resolve(
1061
- Err({
1062
- code: UNEXPECTED_DISCONNECT,
1063
- message: `${serverId} unexpectedly disconnected`
1064
- })
1065
- );
1066
- });
1067
- function cleanup() {
1068
- inputStream.end();
1069
- transport.removeEventListener("message", onMessage);
1070
- transport.removeEventListener("sessionStatus", onSessionStatus);
1071
- span.end();
1072
- }
1073
- function onMessage(msg) {
1074
- if (msg.streamId !== streamId)
1075
- return;
1076
- if (msg.to !== transport.clientId)
1077
- return;
1078
- if (msg.payload && typeof msg.payload === "object" && "ok" in msg.payload) {
1079
- span.setStatus({
1080
- code: msg.payload.ok ? import_api2.SpanStatusCode.OK : import_api2.SpanStatusCode.ERROR
1081
- });
1082
- }
1083
- cleanup();
1084
- resolve(msg.payload);
1085
- }
1086
- transport.addEventListener("message", onMessage);
1087
- transport.addEventListener("sessionStatus", onSessionStatus);
1088
- });
1089
- return [inputStream, responsePromise];
1040
+ transport.send(serverId, m);
1090
1041
  }
1091
- );
1042
+ if (!healthyClose)
1043
+ return;
1044
+ transport.sendCloseStream(serverId, streamId);
1045
+ };
1046
+ void pipeInputToTransport();
1047
+ const responsePromise = new Promise((resolve) => {
1048
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
1049
+ healthyClose = false;
1050
+ cleanup();
1051
+ resolve(
1052
+ Err({
1053
+ code: UNEXPECTED_DISCONNECT,
1054
+ message: `${serverId} unexpectedly disconnected`
1055
+ })
1056
+ );
1057
+ });
1058
+ function cleanup() {
1059
+ inputStream.end();
1060
+ transport.removeEventListener("message", onMessage);
1061
+ transport.removeEventListener("sessionStatus", onSessionStatus);
1062
+ span.end();
1063
+ }
1064
+ function onMessage(msg) {
1065
+ if (msg.streamId !== streamId)
1066
+ return;
1067
+ if (msg.to !== transport.clientId)
1068
+ return;
1069
+ cleanup();
1070
+ resolve(msg.payload);
1071
+ }
1072
+ transport.addEventListener("message", onMessage);
1073
+ transport.addEventListener("sessionStatus", onSessionStatus);
1074
+ });
1075
+ return [inputStream, responsePromise];
1092
1076
  }
1093
1077
 
1094
1078
  // router/server.ts
1095
- var import_api3 = require("@opentelemetry/api");
1096
1079
  var import_value = require("@sinclair/typebox/value");
1097
1080
 
1098
1081
  // util/stringify.ts
@@ -1104,6 +1087,7 @@ function coerceErrorString(err) {
1104
1087
  }
1105
1088
 
1106
1089
  // router/server.ts
1090
+ var import_api2 = require("@opentelemetry/api");
1107
1091
  var RiverServer = class {
1108
1092
  transport;
1109
1093
  services;
@@ -1174,9 +1158,9 @@ var RiverServer = class {
1174
1158
  this.transport.removeEventListener("message", this.onMessage);
1175
1159
  this.transport.removeEventListener("sessionStatus", this.onSessionStatus);
1176
1160
  await Promise.all([...this.streamMap.keys()].map(this.cleanupStream));
1177
- for (const context3 of this.contextMap.values()) {
1178
- if (Symbol.dispose in context3.state) {
1179
- const dispose = context3.state[Symbol.dispose];
1161
+ for (const context2 of this.contextMap.values()) {
1162
+ if (Symbol.dispose in context2.state) {
1163
+ const dispose = context2.state[Symbol.dispose];
1180
1164
  if (typeof dispose === "function") {
1181
1165
  dispose();
1182
1166
  }
@@ -1209,10 +1193,6 @@ var RiverServer = class {
1209
1193
  });
1210
1194
  return;
1211
1195
  }
1212
- let activeContext = import_api3.context.active();
1213
- if (message.tracing) {
1214
- activeContext = import_api3.propagation.extract(activeContext, message.tracing);
1215
- }
1216
1196
  const service = this.services[message.serviceName];
1217
1197
  const serviceContext = this.getContext(service, message.serviceName);
1218
1198
  if (!(message.procedureName in service.procedures)) {
@@ -1276,12 +1256,8 @@ var RiverServer = class {
1276
1256
  `procedure ${message.serviceName}.${message.procedureName} threw an uncaught error: ${errorMsg}`,
1277
1257
  session.loggingMetadata
1278
1258
  );
1279
- if (err instanceof Error) {
1280
- span.recordException(err);
1281
- } else {
1282
- span.recordException(errorMsg);
1283
- }
1284
- span.setStatus({ code: import_api3.SpanStatusCode.ERROR });
1259
+ span.recordException(err instanceof Error ? err : new Error(errorMsg));
1260
+ span.setStatus({ code: import_api2.SpanStatusCode.ERROR });
1285
1261
  outgoing.push(
1286
1262
  Err({
1287
1263
  code: UNCAUGHT_ERROR,
@@ -1308,32 +1284,48 @@ var RiverServer = class {
1308
1284
  };
1309
1285
  switch (procedure.type) {
1310
1286
  case "rpc":
1311
- inputHandler = (async () => {
1312
- const inputMessage = await incoming.next();
1313
- if (inputMessage.done) {
1314
- return;
1287
+ inputHandler = createHandlerSpan(
1288
+ procedure.type,
1289
+ message,
1290
+ async (span) => {
1291
+ const inputMessage = await incoming.next();
1292
+ if (inputMessage.done) {
1293
+ return;
1294
+ }
1295
+ try {
1296
+ const outputMessage = await procedure.handler(
1297
+ serviceContextWithTransportInfo,
1298
+ inputMessage.value
1299
+ );
1300
+ outgoing.push(outputMessage);
1301
+ } catch (err) {
1302
+ errorHandler(err, span);
1303
+ } finally {
1304
+ span.end();
1305
+ }
1315
1306
  }
1316
- await tracing_default.startActiveSpan(
1317
- `${message.serviceName}.${message.procedureName}`,
1318
- {
1319
- attributes: {
1320
- component: "river",
1321
- "river.method.kind": "rpc",
1322
- "river.method.service": message.serviceName,
1323
- "river.method.name": message.procedureName,
1324
- "river.streamId": message.streamId,
1325
- "span.kind": "server"
1326
- },
1327
- kind: import_api3.SpanKind.SERVER
1328
- },
1329
- activeContext,
1307
+ );
1308
+ break;
1309
+ case "stream":
1310
+ if (procHasInitMessage) {
1311
+ inputHandler = createHandlerSpan(
1312
+ procedure.type,
1313
+ message,
1330
1314
  async (span) => {
1315
+ const initMessage = await incoming.next();
1316
+ if (initMessage.done) {
1317
+ return;
1318
+ }
1331
1319
  try {
1332
- const outputMessage = await procedure.handler(
1320
+ const dispose = await procedure.handler(
1333
1321
  serviceContextWithTransportInfo,
1334
- inputMessage.value
1322
+ initMessage.value,
1323
+ incoming,
1324
+ outgoing
1335
1325
  );
1336
- outgoing.push(outputMessage);
1326
+ if (dispose) {
1327
+ disposables.push(dispose);
1328
+ }
1337
1329
  } catch (err) {
1338
1330
  errorHandler(err, span);
1339
1331
  } finally {
@@ -1341,67 +1333,10 @@ var RiverServer = class {
1341
1333
  }
1342
1334
  }
1343
1335
  );
1344
- })();
1345
- break;
1346
- case "stream":
1347
- if (procHasInitMessage) {
1348
- inputHandler = (async () => {
1349
- const initMessage = await incoming.next();
1350
- if (initMessage.done) {
1351
- return;
1352
- }
1353
- await tracing_default.startActiveSpan(
1354
- `${message.serviceName}.${message.procedureName}`,
1355
- {
1356
- attributes: {
1357
- component: "river",
1358
- "river.method.kind": "stream-with-init",
1359
- "river.method.service": message.serviceName,
1360
- "river.method.name": message.procedureName,
1361
- "river.streamId": message.streamId,
1362
- "span.kind": "server"
1363
- },
1364
- kind: import_api3.SpanKind.SERVER
1365
- },
1366
- activeContext,
1367
- async (span) => {
1368
- try {
1369
- const dispose = await procedure.handler(
1370
- serviceContextWithTransportInfo,
1371
- initMessage.value,
1372
- incoming,
1373
- outgoing
1374
- );
1375
- if (dispose) {
1376
- disposables.push(() => {
1377
- dispose();
1378
- span.end();
1379
- });
1380
- } else {
1381
- span.end();
1382
- }
1383
- } catch (err) {
1384
- errorHandler(err, span);
1385
- span.end();
1386
- }
1387
- }
1388
- );
1389
- })();
1390
1336
  } else {
1391
- inputHandler = tracing_default.startActiveSpan(
1392
- `${message.serviceName}.${message.procedureName}`,
1393
- {
1394
- attributes: {
1395
- component: "river",
1396
- "river.method.kind": "stream",
1397
- "river.method.service": message.serviceName,
1398
- "river.method.name": message.procedureName,
1399
- "river.streamId": message.streamId,
1400
- "span.kind": "server"
1401
- },
1402
- kind: import_api3.SpanKind.SERVER
1403
- },
1404
- activeContext,
1337
+ inputHandler = createHandlerSpan(
1338
+ procedure.type,
1339
+ message,
1405
1340
  async (span) => {
1406
1341
  try {
1407
1342
  const dispose = await procedure.handler(
@@ -1410,15 +1345,11 @@ var RiverServer = class {
1410
1345
  outgoing
1411
1346
  );
1412
1347
  if (dispose) {
1413
- disposables.push(() => {
1414
- dispose();
1415
- span.end();
1416
- });
1417
- } else {
1418
- span.end();
1348
+ disposables.push(dispose);
1419
1349
  }
1420
1350
  } catch (err) {
1421
1351
  errorHandler(err, span);
1352
+ } finally {
1422
1353
  span.end();
1423
1354
  }
1424
1355
  }
@@ -1426,102 +1357,61 @@ var RiverServer = class {
1426
1357
  }
1427
1358
  break;
1428
1359
  case "subscription":
1429
- inputHandler = (async () => {
1430
- const inputMessage = await incoming.next();
1431
- if (inputMessage.done) {
1432
- return;
1360
+ inputHandler = createHandlerSpan(
1361
+ procedure.type,
1362
+ message,
1363
+ async (span) => {
1364
+ const inputMessage = await incoming.next();
1365
+ if (inputMessage.done) {
1366
+ return;
1367
+ }
1368
+ try {
1369
+ const dispose = await procedure.handler(
1370
+ serviceContextWithTransportInfo,
1371
+ inputMessage.value,
1372
+ outgoing
1373
+ );
1374
+ if (dispose) {
1375
+ disposables.push(dispose);
1376
+ }
1377
+ } catch (err) {
1378
+ errorHandler(err, span);
1379
+ } finally {
1380
+ span.end();
1381
+ }
1433
1382
  }
1434
- await tracing_default.startActiveSpan(
1435
- `${message.serviceName}.${message.procedureName}`,
1436
- {
1437
- attributes: {
1438
- component: "river",
1439
- "river.method.kind": "subscription",
1440
- "river.method.service": message.serviceName,
1441
- "river.method.name": message.procedureName,
1442
- "river.streamId": message.streamId,
1443
- "span.kind": "server"
1444
- },
1445
- kind: import_api3.SpanKind.SERVER
1446
- },
1447
- activeContext,
1383
+ );
1384
+ break;
1385
+ case "upload":
1386
+ if (procHasInitMessage) {
1387
+ inputHandler = createHandlerSpan(
1388
+ procedure.type,
1389
+ message,
1448
1390
  async (span) => {
1391
+ const initMessage = await incoming.next();
1392
+ if (initMessage.done) {
1393
+ return;
1394
+ }
1449
1395
  try {
1450
- const dispose = await procedure.handler(
1396
+ const outputMessage = await procedure.handler(
1451
1397
  serviceContextWithTransportInfo,
1452
- inputMessage.value,
1453
- outgoing
1398
+ initMessage.value,
1399
+ incoming
1454
1400
  );
1455
- if (dispose) {
1456
- disposables.push(() => {
1457
- dispose();
1458
- span.end();
1459
- });
1460
- } else {
1461
- span.end();
1401
+ if (!this.disconnectedSessions.has(message.from)) {
1402
+ outgoing.push(outputMessage);
1462
1403
  }
1463
1404
  } catch (err) {
1464
1405
  errorHandler(err, span);
1406
+ } finally {
1465
1407
  span.end();
1466
1408
  }
1467
1409
  }
1468
1410
  );
1469
- })();
1470
- break;
1471
- case "upload":
1472
- if (procHasInitMessage) {
1473
- inputHandler = (async () => {
1474
- const initMessage = await incoming.next();
1475
- if (initMessage.done) {
1476
- return;
1477
- }
1478
- await tracing_default.startActiveSpan(
1479
- `${message.serviceName}.${message.procedureName}`,
1480
- {
1481
- attributes: {
1482
- component: "river",
1483
- "river.method.kind": "upload-with-init",
1484
- "river.method.service": message.serviceName,
1485
- "river.method.name": message.procedureName,
1486
- "river.streamId": message.streamId,
1487
- "span.kind": "server"
1488
- },
1489
- kind: import_api3.SpanKind.SERVER
1490
- },
1491
- activeContext,
1492
- async (span) => {
1493
- try {
1494
- const outputMessage = await procedure.handler(
1495
- serviceContextWithTransportInfo,
1496
- initMessage.value,
1497
- incoming
1498
- );
1499
- if (!this.disconnectedSessions.has(message.from)) {
1500
- outgoing.push(outputMessage);
1501
- }
1502
- } catch (err) {
1503
- errorHandler(err, span);
1504
- } finally {
1505
- span.end();
1506
- }
1507
- }
1508
- );
1509
- })();
1510
1411
  } else {
1511
- inputHandler = tracing_default.startActiveSpan(
1512
- `${message.serviceName}.${message.procedureName}`,
1513
- {
1514
- attributes: {
1515
- component: "river",
1516
- "river.method.kind": "upload",
1517
- "river.method.service": message.serviceName,
1518
- "river.method.name": message.procedureName,
1519
- "river.streamId": message.streamId,
1520
- "span.kind": "server"
1521
- },
1522
- kind: import_api3.SpanKind.SERVER
1523
- },
1524
- activeContext,
1412
+ inputHandler = createHandlerSpan(
1413
+ procedure.type,
1414
+ message,
1525
1415
  async (span) => {
1526
1416
  try {
1527
1417
  const outputMessage = await procedure.handler(
@@ -1587,8 +1477,8 @@ var RiverServer = class {
1587
1477
  }
1588
1478
  }
1589
1479
  getContext(service, serviceName) {
1590
- const context3 = this.contextMap.get(service);
1591
- if (!context3) {
1480
+ const context2 = this.contextMap.get(service);
1481
+ if (!context2) {
1592
1482
  const err = `no context found for ${serviceName}`;
1593
1483
  log?.error(err, {
1594
1484
  clientId: this.transport.clientId,
@@ -1596,7 +1486,7 @@ var RiverServer = class {
1596
1486
  });
1597
1487
  throw new Error(err);
1598
1488
  }
1599
- return context3;
1489
+ return context2;
1600
1490
  }
1601
1491
  cleanupStream = async (id) => {
1602
1492
  const stream2 = this.streamMap.get(id);
@@ -1613,9 +1503,6 @@ var RiverServer = class {
1613
1503
  function createServer(transport, services, extendedContext) {
1614
1504
  return new RiverServer(transport, services, extendedContext);
1615
1505
  }
1616
-
1617
- // package.json
1618
- var version = "0.21.1";
1619
1506
  // Annotate the CommonJS export names for ESM import in node:
1620
1507
  0 && (module.exports = {
1621
1508
  Err,