@replit/river 0.21.0 → 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 (68) 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-NFV77C2M.js → chunk-GCLEWC26.js} +340 -507
  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-DT5JS6TM.js → chunk-OTQNCLFH.js} +1 -1
  9. package/dist/chunk-OTQNCLFH.js.map +1 -0
  10. package/dist/{chunk-MJR36SUY.js → chunk-S3YKQT4J.js} +2 -2
  11. package/dist/{chunk-QU2EE6YU.js → chunk-ZPBWKBM5.js} +361 -394
  12. package/dist/chunk-ZPBWKBM5.js.map +1 -0
  13. package/dist/{connection-8a71dbe2.d.ts → connection-8b059ac4.d.ts} +6 -4
  14. package/dist/{connection-d49d5d56.d.ts → connection-bbfe1147.d.ts} +1 -1
  15. package/dist/{index-3ac92295.d.ts → index-2ece5234.d.ts} +18 -7
  16. package/dist/logging/index.cjs.map +1 -1
  17. package/dist/logging/index.d.cts +2 -1
  18. package/dist/logging/index.d.ts +2 -1
  19. package/dist/logging/index.js +1 -1
  20. package/dist/router/index.cjs +384 -492
  21. package/dist/router/index.cjs.map +1 -1
  22. package/dist/router/index.d.cts +5 -4
  23. package/dist/router/index.d.ts +5 -4
  24. package/dist/router/index.js +5 -4
  25. package/dist/{services-abc077db.d.ts → services-acbcc441.d.ts} +1 -1
  26. package/dist/{services-8496d6e8.d.ts → services-cb01a7a8.d.ts} +1 -1
  27. package/dist/transport/impls/uds/client.cjs +202 -155
  28. package/dist/transport/impls/uds/client.cjs.map +1 -1
  29. package/dist/transport/impls/uds/client.d.cts +3 -2
  30. package/dist/transport/impls/uds/client.d.ts +3 -2
  31. package/dist/transport/impls/uds/client.js +4 -4
  32. package/dist/transport/impls/uds/server.cjs +295 -264
  33. package/dist/transport/impls/uds/server.cjs.map +1 -1
  34. package/dist/transport/impls/uds/server.d.cts +3 -2
  35. package/dist/transport/impls/uds/server.d.ts +3 -2
  36. package/dist/transport/impls/uds/server.js +4 -4
  37. package/dist/transport/impls/ws/client.cjs +256 -214
  38. package/dist/transport/impls/ws/client.cjs.map +1 -1
  39. package/dist/transport/impls/ws/client.d.cts +6 -6
  40. package/dist/transport/impls/ws/client.d.ts +6 -6
  41. package/dist/transport/impls/ws/client.js +34 -49
  42. package/dist/transport/impls/ws/client.js.map +1 -1
  43. package/dist/transport/impls/ws/server.cjs +317 -278
  44. package/dist/transport/impls/ws/server.cjs.map +1 -1
  45. package/dist/transport/impls/ws/server.d.cts +5 -4
  46. package/dist/transport/impls/ws/server.d.ts +5 -4
  47. package/dist/transport/impls/ws/server.js +4 -4
  48. package/dist/transport/impls/ws/server.js.map +1 -1
  49. package/dist/transport/index.cjs +406 -391
  50. package/dist/transport/index.cjs.map +1 -1
  51. package/dist/transport/index.d.cts +5 -5
  52. package/dist/transport/index.d.ts +5 -5
  53. package/dist/transport/index.js +3 -3
  54. package/dist/util/testHelpers.cjs +71 -19
  55. package/dist/util/testHelpers.cjs.map +1 -1
  56. package/dist/util/testHelpers.d.cts +20 -8
  57. package/dist/util/testHelpers.d.ts +20 -8
  58. package/dist/util/testHelpers.js +13 -12
  59. package/dist/util/testHelpers.js.map +1 -1
  60. package/dist/wslike-e0b32dd5.d.ts +40 -0
  61. package/package.json +4 -5
  62. package/dist/chunk-2ERP6FUE.js +0 -42
  63. package/dist/chunk-2ERP6FUE.js.map +0 -1
  64. package/dist/chunk-5WFL722S.js.map +0 -1
  65. package/dist/chunk-DT5JS6TM.js.map +0 -1
  66. package/dist/chunk-NFV77C2M.js.map +0 -1
  67. package/dist/chunk-QU2EE6YU.js.map +0 -1
  68. /package/dist/{chunk-MJR36SUY.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
  }
@@ -1187,7 +1171,11 @@ var RiverServer = class {
1187
1171
  if (!isStreamOpen(message.controlFlags)) {
1188
1172
  log?.error(
1189
1173
  `can't create a new procedure stream from a message that doesn't have the stream open bit set`,
1190
- { clientId: this.transport.clientId, fullTransportMessage: message }
1174
+ {
1175
+ clientId: this.transport.clientId,
1176
+ fullTransportMessage: message,
1177
+ tags: ["invariant-violation"]
1178
+ }
1191
1179
  );
1192
1180
  return;
1193
1181
  }
@@ -1205,10 +1193,6 @@ var RiverServer = class {
1205
1193
  });
1206
1194
  return;
1207
1195
  }
1208
- let activeContext = import_api3.context.active();
1209
- if (message.tracing) {
1210
- activeContext = import_api3.propagation.extract(activeContext, message.tracing);
1211
- }
1212
1196
  const service = this.services[message.serviceName];
1213
1197
  const serviceContext = this.getContext(service, message.serviceName);
1214
1198
  if (!(message.procedureName in service.procedures)) {
@@ -1272,12 +1256,8 @@ var RiverServer = class {
1272
1256
  `procedure ${message.serviceName}.${message.procedureName} threw an uncaught error: ${errorMsg}`,
1273
1257
  session.loggingMetadata
1274
1258
  );
1275
- if (err instanceof Error) {
1276
- span.recordException(err);
1277
- } else {
1278
- span.recordException(errorMsg);
1279
- }
1280
- 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 });
1281
1261
  outgoing.push(
1282
1262
  Err({
1283
1263
  code: UNCAUGHT_ERROR,
@@ -1286,10 +1266,10 @@ var RiverServer = class {
1286
1266
  );
1287
1267
  };
1288
1268
  if (session.metadata === void 0) {
1289
- log?.error(
1290
- `(invariant violation) session doesn't have handshake metadata`,
1291
- session.loggingMetadata
1292
- );
1269
+ log?.error(`session doesn't have handshake metadata`, {
1270
+ ...session.loggingMetadata,
1271
+ tags: ["invariant-violation"]
1272
+ });
1293
1273
  return;
1294
1274
  }
1295
1275
  let inputHandler;
@@ -1304,32 +1284,48 @@ var RiverServer = class {
1304
1284
  };
1305
1285
  switch (procedure.type) {
1306
1286
  case "rpc":
1307
- inputHandler = (async () => {
1308
- const inputMessage = await incoming.next();
1309
- if (inputMessage.done) {
1310
- 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
+ }
1311
1306
  }
1312
- await tracing_default.startActiveSpan(
1313
- `${message.serviceName}.${message.procedureName}`,
1314
- {
1315
- attributes: {
1316
- component: "river",
1317
- "river.method.kind": "rpc",
1318
- "river.method.service": message.serviceName,
1319
- "river.method.name": message.procedureName,
1320
- "river.streamId": message.streamId,
1321
- "span.kind": "server"
1322
- },
1323
- kind: import_api3.SpanKind.SERVER
1324
- },
1325
- activeContext,
1307
+ );
1308
+ break;
1309
+ case "stream":
1310
+ if (procHasInitMessage) {
1311
+ inputHandler = createHandlerSpan(
1312
+ procedure.type,
1313
+ message,
1326
1314
  async (span) => {
1315
+ const initMessage = await incoming.next();
1316
+ if (initMessage.done) {
1317
+ return;
1318
+ }
1327
1319
  try {
1328
- const outputMessage = await procedure.handler(
1320
+ const dispose = await procedure.handler(
1329
1321
  serviceContextWithTransportInfo,
1330
- inputMessage.value
1322
+ initMessage.value,
1323
+ incoming,
1324
+ outgoing
1331
1325
  );
1332
- outgoing.push(outputMessage);
1326
+ if (dispose) {
1327
+ disposables.push(dispose);
1328
+ }
1333
1329
  } catch (err) {
1334
1330
  errorHandler(err, span);
1335
1331
  } finally {
@@ -1337,67 +1333,10 @@ var RiverServer = class {
1337
1333
  }
1338
1334
  }
1339
1335
  );
1340
- })();
1341
- break;
1342
- case "stream":
1343
- if (procHasInitMessage) {
1344
- inputHandler = (async () => {
1345
- const initMessage = await incoming.next();
1346
- if (initMessage.done) {
1347
- return;
1348
- }
1349
- await tracing_default.startActiveSpan(
1350
- `${message.serviceName}.${message.procedureName}`,
1351
- {
1352
- attributes: {
1353
- component: "river",
1354
- "river.method.kind": "stream-with-init",
1355
- "river.method.service": message.serviceName,
1356
- "river.method.name": message.procedureName,
1357
- "river.streamId": message.streamId,
1358
- "span.kind": "server"
1359
- },
1360
- kind: import_api3.SpanKind.SERVER
1361
- },
1362
- activeContext,
1363
- async (span) => {
1364
- try {
1365
- const dispose = await procedure.handler(
1366
- serviceContextWithTransportInfo,
1367
- initMessage.value,
1368
- incoming,
1369
- outgoing
1370
- );
1371
- if (dispose) {
1372
- disposables.push(() => {
1373
- dispose();
1374
- span.end();
1375
- });
1376
- } else {
1377
- span.end();
1378
- }
1379
- } catch (err) {
1380
- errorHandler(err, span);
1381
- span.end();
1382
- }
1383
- }
1384
- );
1385
- })();
1386
1336
  } else {
1387
- inputHandler = tracing_default.startActiveSpan(
1388
- `${message.serviceName}.${message.procedureName}`,
1389
- {
1390
- attributes: {
1391
- component: "river",
1392
- "river.method.kind": "stream",
1393
- "river.method.service": message.serviceName,
1394
- "river.method.name": message.procedureName,
1395
- "river.streamId": message.streamId,
1396
- "span.kind": "server"
1397
- },
1398
- kind: import_api3.SpanKind.SERVER
1399
- },
1400
- activeContext,
1337
+ inputHandler = createHandlerSpan(
1338
+ procedure.type,
1339
+ message,
1401
1340
  async (span) => {
1402
1341
  try {
1403
1342
  const dispose = await procedure.handler(
@@ -1406,15 +1345,11 @@ var RiverServer = class {
1406
1345
  outgoing
1407
1346
  );
1408
1347
  if (dispose) {
1409
- disposables.push(() => {
1410
- dispose();
1411
- span.end();
1412
- });
1413
- } else {
1414
- span.end();
1348
+ disposables.push(dispose);
1415
1349
  }
1416
1350
  } catch (err) {
1417
1351
  errorHandler(err, span);
1352
+ } finally {
1418
1353
  span.end();
1419
1354
  }
1420
1355
  }
@@ -1422,102 +1357,61 @@ var RiverServer = class {
1422
1357
  }
1423
1358
  break;
1424
1359
  case "subscription":
1425
- inputHandler = (async () => {
1426
- const inputMessage = await incoming.next();
1427
- if (inputMessage.done) {
1428
- 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
+ }
1429
1382
  }
1430
- await tracing_default.startActiveSpan(
1431
- `${message.serviceName}.${message.procedureName}`,
1432
- {
1433
- attributes: {
1434
- component: "river",
1435
- "river.method.kind": "subscription",
1436
- "river.method.service": message.serviceName,
1437
- "river.method.name": message.procedureName,
1438
- "river.streamId": message.streamId,
1439
- "span.kind": "server"
1440
- },
1441
- kind: import_api3.SpanKind.SERVER
1442
- },
1443
- activeContext,
1383
+ );
1384
+ break;
1385
+ case "upload":
1386
+ if (procHasInitMessage) {
1387
+ inputHandler = createHandlerSpan(
1388
+ procedure.type,
1389
+ message,
1444
1390
  async (span) => {
1391
+ const initMessage = await incoming.next();
1392
+ if (initMessage.done) {
1393
+ return;
1394
+ }
1445
1395
  try {
1446
- const dispose = await procedure.handler(
1396
+ const outputMessage = await procedure.handler(
1447
1397
  serviceContextWithTransportInfo,
1448
- inputMessage.value,
1449
- outgoing
1398
+ initMessage.value,
1399
+ incoming
1450
1400
  );
1451
- if (dispose) {
1452
- disposables.push(() => {
1453
- dispose();
1454
- span.end();
1455
- });
1456
- } else {
1457
- span.end();
1401
+ if (!this.disconnectedSessions.has(message.from)) {
1402
+ outgoing.push(outputMessage);
1458
1403
  }
1459
1404
  } catch (err) {
1460
1405
  errorHandler(err, span);
1406
+ } finally {
1461
1407
  span.end();
1462
1408
  }
1463
1409
  }
1464
1410
  );
1465
- })();
1466
- break;
1467
- case "upload":
1468
- if (procHasInitMessage) {
1469
- inputHandler = (async () => {
1470
- const initMessage = await incoming.next();
1471
- if (initMessage.done) {
1472
- return;
1473
- }
1474
- await tracing_default.startActiveSpan(
1475
- `${message.serviceName}.${message.procedureName}`,
1476
- {
1477
- attributes: {
1478
- component: "river",
1479
- "river.method.kind": "upload-with-init",
1480
- "river.method.service": message.serviceName,
1481
- "river.method.name": message.procedureName,
1482
- "river.streamId": message.streamId,
1483
- "span.kind": "server"
1484
- },
1485
- kind: import_api3.SpanKind.SERVER
1486
- },
1487
- activeContext,
1488
- async (span) => {
1489
- try {
1490
- const outputMessage = await procedure.handler(
1491
- serviceContextWithTransportInfo,
1492
- initMessage.value,
1493
- incoming
1494
- );
1495
- if (!this.disconnectedSessions.has(message.from)) {
1496
- outgoing.push(outputMessage);
1497
- }
1498
- } catch (err) {
1499
- errorHandler(err, span);
1500
- } finally {
1501
- span.end();
1502
- }
1503
- }
1504
- );
1505
- })();
1506
1411
  } else {
1507
- inputHandler = tracing_default.startActiveSpan(
1508
- `${message.serviceName}.${message.procedureName}`,
1509
- {
1510
- attributes: {
1511
- component: "river",
1512
- "river.method.kind": "upload",
1513
- "river.method.service": message.serviceName,
1514
- "river.method.name": message.procedureName,
1515
- "river.streamId": message.streamId,
1516
- "span.kind": "server"
1517
- },
1518
- kind: import_api3.SpanKind.SERVER
1519
- },
1520
- activeContext,
1412
+ inputHandler = createHandlerSpan(
1413
+ procedure.type,
1414
+ message,
1521
1415
  async (span) => {
1522
1416
  try {
1523
1417
  const outputMessage = await procedure.handler(
@@ -1583,15 +1477,16 @@ var RiverServer = class {
1583
1477
  }
1584
1478
  }
1585
1479
  getContext(service, serviceName) {
1586
- const context3 = this.contextMap.get(service);
1587
- if (!context3) {
1480
+ const context2 = this.contextMap.get(service);
1481
+ if (!context2) {
1588
1482
  const err = `no context found for ${serviceName}`;
1589
1483
  log?.error(err, {
1590
- clientId: this.transport.clientId
1484
+ clientId: this.transport.clientId,
1485
+ tags: ["invariant-violation"]
1591
1486
  });
1592
1487
  throw new Error(err);
1593
1488
  }
1594
- return context3;
1489
+ return context2;
1595
1490
  }
1596
1491
  cleanupStream = async (id) => {
1597
1492
  const stream2 = this.streamMap.get(id);
@@ -1608,9 +1503,6 @@ var RiverServer = class {
1608
1503
  function createServer(transport, services, extendedContext) {
1609
1504
  return new RiverServer(transport, services, extendedContext);
1610
1505
  }
1611
-
1612
- // package.json
1613
- var version = "0.21.0";
1614
1506
  // Annotate the CommonJS export names for ESM import in node:
1615
1507
  0 && (module.exports = {
1616
1508
  Err,