@replit/river 0.19.2 → 0.20.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 (72) hide show
  1. package/dist/{chunk-D5PVGZPQ.js → chunk-5WFL722S.js} +15 -1
  2. package/dist/chunk-5WFL722S.js.map +1 -0
  3. package/dist/{chunk-NBE3D667.js → chunk-DT5JS6TM.js} +1 -0
  4. package/dist/chunk-DT5JS6TM.js.map +1 -0
  5. package/dist/{chunk-ZWPEZS27.js → chunk-HGBAUTIW.js} +2 -1
  6. package/dist/chunk-HGBAUTIW.js.map +1 -0
  7. package/dist/{chunk-YFPVQTWL.js → chunk-NYOK5VKK.js} +385 -246
  8. package/dist/chunk-NYOK5VKK.js.map +1 -0
  9. package/dist/{chunk-GZ7HCLLM.js → chunk-XAG3SC7R.js} +1 -0
  10. package/dist/chunk-XAG3SC7R.js.map +1 -0
  11. package/dist/{chunk-SR4DBLJ6.js → chunk-YB5LRYL6.js} +518 -260
  12. package/dist/chunk-YB5LRYL6.js.map +1 -0
  13. package/dist/{chunk-JH275HID.js → chunk-ZIWOHAQM.js} +2 -1
  14. package/dist/chunk-ZIWOHAQM.js.map +1 -0
  15. package/dist/codec/index.cjs +1 -0
  16. package/dist/codec/index.cjs.map +1 -0
  17. package/dist/codec/index.js +2 -1
  18. package/dist/codec/index.js.map +1 -0
  19. package/dist/{connection-cfec12e6.d.ts → connection-d49d5d56.d.ts} +1 -1
  20. package/dist/{connection-aa0ea000.d.ts → connection-dba95bc8.d.ts} +1 -1
  21. package/dist/{index-e2513701.d.ts → index-3ac92295.d.ts} +12 -0
  22. package/dist/logging/index.cjs +1 -0
  23. package/dist/logging/index.cjs.map +1 -0
  24. package/dist/logging/index.d.cts +1 -1
  25. package/dist/logging/index.d.ts +1 -1
  26. package/dist/logging/index.js +2 -1
  27. package/dist/logging/index.js.map +1 -0
  28. package/dist/router/index.cjs +515 -257
  29. package/dist/router/index.cjs.map +1 -0
  30. package/dist/router/index.d.cts +4 -4
  31. package/dist/router/index.d.ts +4 -4
  32. package/dist/router/index.js +4 -3
  33. package/dist/router/index.js.map +1 -0
  34. package/dist/{services-5fc5712d.d.ts → services-8496d6e8.d.ts} +1 -1
  35. package/dist/{services-4bba42d8.d.ts → services-abc077db.d.ts} +1 -1
  36. package/dist/transport/impls/uds/client.cjs +151 -74
  37. package/dist/transport/impls/uds/client.cjs.map +1 -0
  38. package/dist/transport/impls/uds/client.d.cts +2 -2
  39. package/dist/transport/impls/uds/client.d.ts +2 -2
  40. package/dist/transport/impls/uds/client.js +6 -5
  41. package/dist/transport/impls/uds/client.js.map +1 -0
  42. package/dist/transport/impls/uds/server.cjs +250 -169
  43. package/dist/transport/impls/uds/server.cjs.map +1 -0
  44. package/dist/transport/impls/uds/server.d.cts +2 -2
  45. package/dist/transport/impls/uds/server.d.ts +2 -2
  46. package/dist/transport/impls/uds/server.js +6 -5
  47. package/dist/transport/impls/uds/server.js.map +1 -0
  48. package/dist/transport/impls/ws/client.cjs +151 -74
  49. package/dist/transport/impls/ws/client.cjs.map +1 -0
  50. package/dist/transport/impls/ws/client.d.cts +2 -2
  51. package/dist/transport/impls/ws/client.d.ts +2 -2
  52. package/dist/transport/impls/ws/client.js +6 -5
  53. package/dist/transport/impls/ws/client.js.map +1 -0
  54. package/dist/transport/impls/ws/server.cjs +250 -169
  55. package/dist/transport/impls/ws/server.cjs.map +1 -0
  56. package/dist/transport/impls/ws/server.d.cts +2 -2
  57. package/dist/transport/impls/ws/server.d.ts +2 -2
  58. package/dist/transport/impls/ws/server.js +6 -5
  59. package/dist/transport/impls/ws/server.js.map +1 -0
  60. package/dist/transport/index.cjs +388 -243
  61. package/dist/transport/index.cjs.map +1 -0
  62. package/dist/transport/index.d.cts +3 -2
  63. package/dist/transport/index.d.ts +3 -2
  64. package/dist/transport/index.js +5 -4
  65. package/dist/transport/index.js.map +1 -0
  66. package/dist/util/testHelpers.cjs +2 -0
  67. package/dist/util/testHelpers.cjs.map +1 -0
  68. package/dist/util/testHelpers.d.cts +2 -2
  69. package/dist/util/testHelpers.d.ts +2 -2
  70. package/dist/util/testHelpers.js +6 -5
  71. package/dist/util/testHelpers.js.map +1 -0
  72. package/package.json +2 -1
@@ -322,6 +322,9 @@ var Procedure = {
322
322
  stream
323
323
  };
324
324
 
325
+ // router/client.ts
326
+ var import_api2 = require("@opentelemetry/api");
327
+
325
328
  // node_modules/p-defer/index.js
326
329
  function pDefer() {
327
330
  const deferred = {};
@@ -617,6 +620,12 @@ var TransportMessageSchema = (t) => import_typebox3.Type.Object({
617
620
  procedureName: import_typebox3.Type.Optional(import_typebox3.Type.String()),
618
621
  streamId: import_typebox3.Type.String(),
619
622
  controlFlags: import_typebox3.Type.Integer(),
623
+ tracing: import_typebox3.Type.Optional(
624
+ import_typebox3.Type.Object({
625
+ traceparent: import_typebox3.Type.String(),
626
+ tracestate: import_typebox3.Type.String()
627
+ })
628
+ ),
620
629
  payload: t
621
630
  });
622
631
  var ControlMessageAckSchema = import_typebox3.Type.Object({
@@ -696,6 +705,11 @@ function Err(error) {
696
705
  // logging/log.ts
697
706
  var log = void 0;
698
707
 
708
+ // tracing/index.ts
709
+ var import_api = require("@opentelemetry/api");
710
+ var tracer = import_api.trace.getTracer("river");
711
+ var tracing_default = tracer;
712
+
699
713
  // router/client.ts
700
714
  var noop = () => {
701
715
  };
@@ -767,220 +781,318 @@ function createSessionDisconnectHandler(from, cb) {
767
781
  }
768
782
  function handleRpc(transport, serverId, input, serviceName, procedureName) {
769
783
  const streamId = (0, import_nanoid2.nanoid)();
770
- transport.send(serverId, {
771
- streamId,
772
- serviceName,
773
- procedureName,
774
- payload: input,
775
- controlFlags: 2 /* StreamOpenBit */ | 4 /* StreamClosedBit */
776
- });
777
- const responsePromise = new Promise((resolve) => {
778
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
779
- cleanup();
780
- resolve(
781
- Err({
782
- code: UNEXPECTED_DISCONNECT,
783
- message: `${serverId} unexpectedly disconnected`
784
- })
785
- );
786
- });
787
- function cleanup() {
788
- transport.removeEventListener("message", onMessage);
789
- transport.removeEventListener("sessionStatus", onSessionStatus);
790
- }
791
- function onMessage(msg) {
792
- if (msg.streamId !== streamId)
793
- return;
794
- if (msg.to !== transport.clientId)
795
- return;
796
- cleanup();
797
- resolve(msg.payload);
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;
798
841
  }
799
- transport.addEventListener("message", onMessage);
800
- transport.addEventListener("sessionStatus", onSessionStatus);
801
- });
802
- return responsePromise;
842
+ );
803
843
  }
804
844
  function handleStream(transport, serverId, init, serviceName, procedureName) {
805
845
  const streamId = (0, import_nanoid2.nanoid)();
806
- const inputStream = pushable({ objectMode: true });
807
- const outputStream = pushable({ objectMode: true });
808
- let firstMessage = true;
809
- let healthyClose = true;
810
- if (init) {
811
- transport.send(serverId, {
812
- streamId,
813
- serviceName,
814
- procedureName,
815
- payload: init,
816
- controlFlags: 2 /* StreamOpenBit */
817
- });
818
- firstMessage = false;
819
- }
820
- const pipeInputToTransport = async () => {
821
- for await (const rawIn of inputStream) {
822
- const m = {
823
- streamId,
824
- payload: rawIn,
825
- controlFlags: 0
826
- };
827
- if (firstMessage) {
828
- m.serviceName = serviceName;
829
- m.procedureName = procedureName;
830
- m.controlFlags |= 2 /* StreamOpenBit */;
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
+ });
831
875
  firstMessage = false;
832
876
  }
833
- transport.send(serverId, m);
834
- }
835
- if (!healthyClose)
836
- return;
837
- transport.sendCloseStream(serverId, streamId);
838
- };
839
- void pipeInputToTransport();
840
- function onMessage(msg) {
841
- if (msg.streamId !== streamId)
842
- return;
843
- if (msg.to !== transport.clientId)
844
- return;
845
- if (isStreamClose(msg.controlFlags)) {
846
- cleanup();
847
- } else {
848
- outputStream.push(msg.payload);
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 });
897
+ };
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();
916
+ }
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];
849
931
  }
850
- }
851
- function cleanup() {
852
- inputStream.end();
853
- outputStream.end();
854
- transport.removeEventListener("message", onMessage);
855
- transport.removeEventListener("sessionStatus", onSessionStatus);
856
- }
857
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
858
- outputStream.push(
859
- Err({
860
- code: UNEXPECTED_DISCONNECT,
861
- message: `${serverId} unexpectedly disconnected`
862
- })
863
- );
864
- healthyClose = false;
865
- cleanup();
866
- });
867
- transport.addEventListener("message", onMessage);
868
- transport.addEventListener("sessionStatus", onSessionStatus);
869
- return [inputStream, outputStream, cleanup];
932
+ );
870
933
  }
871
934
  function handleSubscribe(transport, serverId, input, serviceName, procedureName) {
872
935
  const streamId = (0, import_nanoid2.nanoid)();
873
- transport.send(serverId, {
874
- streamId,
875
- serviceName,
876
- procedureName,
877
- payload: input,
878
- controlFlags: 2 /* StreamOpenBit */
879
- });
880
- let healthyClose = true;
881
- const outputStream = pushable({ objectMode: true });
882
- function onMessage(msg) {
883
- if (msg.streamId !== streamId)
884
- return;
885
- if (msg.to !== transport.clientId)
886
- return;
887
- if (isStreamClose(msg.controlFlags)) {
888
- cleanup();
889
- } else {
890
- outputStream.push(msg.payload);
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];
891
999
  }
892
- }
893
- function cleanup() {
894
- outputStream.end();
895
- transport.removeEventListener("message", onMessage);
896
- transport.removeEventListener("sessionStatus", onSessionStatus);
897
- }
898
- const closeHandler = () => {
899
- cleanup();
900
- if (!healthyClose)
901
- return;
902
- transport.sendCloseStream(serverId, streamId);
903
- };
904
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
905
- outputStream.push(
906
- Err({
907
- code: UNEXPECTED_DISCONNECT,
908
- message: `${serverId} unexpectedly disconnected`
909
- })
910
- );
911
- healthyClose = false;
912
- cleanup();
913
- });
914
- transport.addEventListener("message", onMessage);
915
- transport.addEventListener("sessionStatus", onSessionStatus);
916
- return [outputStream, closeHandler];
1000
+ );
917
1001
  }
918
1002
  function handleUpload(transport, serverId, init, serviceName, procedureName) {
919
1003
  const streamId = (0, import_nanoid2.nanoid)();
920
- const inputStream = pushable({ objectMode: true });
921
- let firstMessage = true;
922
- let healthyClose = true;
923
- if (init) {
924
- transport.send(serverId, {
925
- streamId,
926
- serviceName,
927
- procedureName,
928
- payload: init,
929
- controlFlags: 2 /* StreamOpenBit */
930
- });
931
- firstMessage = false;
932
- }
933
- const pipeInputToTransport = async () => {
934
- for await (const rawIn of inputStream) {
935
- const m = {
936
- streamId,
937
- payload: rawIn,
938
- controlFlags: 0
939
- };
940
- if (firstMessage) {
941
- m.serviceName = serviceName;
942
- m.procedureName = procedureName;
943
- m.controlFlags |= 2 /* StreamOpenBit */;
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
+ });
944
1032
  firstMessage = false;
945
1033
  }
946
- transport.send(serverId, m);
947
- }
948
- if (!healthyClose)
949
- return;
950
- transport.sendCloseStream(serverId, streamId);
951
- };
952
- void pipeInputToTransport();
953
- const responsePromise = new Promise((resolve) => {
954
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
955
- healthyClose = false;
956
- cleanup();
957
- resolve(
958
- Err({
959
- code: UNEXPECTED_DISCONNECT,
960
- message: `${serverId} unexpectedly disconnected`
961
- })
962
- );
963
- });
964
- function cleanup() {
965
- inputStream.end();
966
- transport.removeEventListener("message", onMessage);
967
- transport.removeEventListener("sessionStatus", onSessionStatus);
968
- }
969
- function onMessage(msg) {
970
- if (msg.streamId !== streamId)
971
- return;
972
- if (msg.to !== transport.clientId)
973
- return;
974
- cleanup();
975
- resolve(msg.payload);
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];
976
1090
  }
977
- transport.addEventListener("message", onMessage);
978
- transport.addEventListener("sessionStatus", onSessionStatus);
979
- });
980
- return [inputStream, responsePromise];
1091
+ );
981
1092
  }
982
1093
 
983
1094
  // router/server.ts
1095
+ var import_api3 = require("@opentelemetry/api");
984
1096
  var import_value = require("@sinclair/typebox/value");
985
1097
 
986
1098
  // util/stringify.ts
@@ -1062,9 +1174,9 @@ var RiverServer = class {
1062
1174
  this.transport.removeEventListener("message", this.onMessage);
1063
1175
  this.transport.removeEventListener("sessionStatus", this.onSessionStatus);
1064
1176
  await Promise.all([...this.streamMap.keys()].map(this.cleanupStream));
1065
- for (const context of this.contextMap.values()) {
1066
- if (Symbol.dispose in context.state) {
1067
- const dispose = context.state[Symbol.dispose];
1177
+ for (const context3 of this.contextMap.values()) {
1178
+ if (Symbol.dispose in context3.state) {
1179
+ const dispose = context3.state[Symbol.dispose];
1068
1180
  if (typeof dispose === "function") {
1069
1181
  dispose();
1070
1182
  }
@@ -1093,6 +1205,10 @@ var RiverServer = class {
1093
1205
  });
1094
1206
  return;
1095
1207
  }
1208
+ let activeContext = import_api3.context.active();
1209
+ if (message.tracing) {
1210
+ activeContext = import_api3.propagation.extract(activeContext, message.tracing);
1211
+ }
1096
1212
  const service = this.services[message.serviceName];
1097
1213
  const serviceContext = this.getContext(service, message.serviceName);
1098
1214
  if (!(message.procedureName in service.procedures)) {
@@ -1150,12 +1266,18 @@ var RiverServer = class {
1150
1266
  })()
1151
1267
  )
1152
1268
  );
1153
- const errorHandler = (err) => {
1269
+ const errorHandler = (err, span) => {
1154
1270
  const errorMsg = coerceErrorString(err);
1155
1271
  log?.error(
1156
1272
  `procedure ${message.serviceName}.${message.procedureName} threw an uncaught error: ${errorMsg}`,
1157
1273
  session.loggingMetadata
1158
1274
  );
1275
+ if (err instanceof Error) {
1276
+ span.recordException(err);
1277
+ } else {
1278
+ span.recordException(errorMsg);
1279
+ }
1280
+ span.setStatus({ code: import_api3.SpanStatusCode.ERROR });
1159
1281
  outgoing.push(
1160
1282
  Err({
1161
1283
  code: UNCAUGHT_ERROR,
@@ -1187,15 +1309,34 @@ var RiverServer = class {
1187
1309
  if (inputMessage.done) {
1188
1310
  return;
1189
1311
  }
1190
- try {
1191
- const outputMessage = await procedure.handler(
1192
- serviceContextWithTransportInfo,
1193
- inputMessage.value
1194
- );
1195
- outgoing.push(outputMessage);
1196
- } catch (err) {
1197
- errorHandler(err);
1198
- }
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,
1326
+ async (span) => {
1327
+ try {
1328
+ const outputMessage = await procedure.handler(
1329
+ serviceContextWithTransportInfo,
1330
+ inputMessage.value
1331
+ );
1332
+ outgoing.push(outputMessage);
1333
+ } catch (err) {
1334
+ errorHandler(err, span);
1335
+ } finally {
1336
+ span.end();
1337
+ }
1338
+ }
1339
+ );
1199
1340
  })();
1200
1341
  break;
1201
1342
  case "stream":
@@ -1205,22 +1346,79 @@ var RiverServer = class {
1205
1346
  if (initMessage.done) {
1206
1347
  return;
1207
1348
  }
1208
- try {
1209
- const dispose = await procedure.handler(
1210
- serviceContextWithTransportInfo,
1211
- initMessage.value,
1212
- incoming,
1213
- outgoing
1214
- );
1215
- if (dispose) {
1216
- disposables.push(dispose);
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
+ }
1217
1383
  }
1218
- } catch (err) {
1219
- errorHandler(err);
1220
- }
1384
+ );
1221
1385
  })();
1222
1386
  } else {
1223
- inputHandler = procedure.handler(serviceContextWithTransportInfo, incoming, outgoing).catch(errorHandler);
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,
1401
+ async (span) => {
1402
+ try {
1403
+ const dispose = await procedure.handler(
1404
+ serviceContextWithTransportInfo,
1405
+ incoming,
1406
+ outgoing
1407
+ );
1408
+ if (dispose) {
1409
+ disposables.push(() => {
1410
+ dispose();
1411
+ span.end();
1412
+ });
1413
+ } else {
1414
+ span.end();
1415
+ }
1416
+ } catch (err) {
1417
+ errorHandler(err, span);
1418
+ span.end();
1419
+ }
1420
+ }
1421
+ );
1224
1422
  }
1225
1423
  break;
1226
1424
  case "subscription":
@@ -1229,18 +1427,41 @@ var RiverServer = class {
1229
1427
  if (inputMessage.done) {
1230
1428
  return;
1231
1429
  }
1232
- try {
1233
- const dispose = await procedure.handler(
1234
- serviceContextWithTransportInfo,
1235
- inputMessage.value,
1236
- outgoing
1237
- );
1238
- if (dispose) {
1239
- disposables.push(dispose);
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,
1444
+ async (span) => {
1445
+ try {
1446
+ const dispose = await procedure.handler(
1447
+ serviceContextWithTransportInfo,
1448
+ inputMessage.value,
1449
+ outgoing
1450
+ );
1451
+ if (dispose) {
1452
+ disposables.push(() => {
1453
+ dispose();
1454
+ span.end();
1455
+ });
1456
+ } else {
1457
+ span.end();
1458
+ }
1459
+ } catch (err) {
1460
+ errorHandler(err, span);
1461
+ span.end();
1462
+ }
1240
1463
  }
1241
- } catch (err) {
1242
- errorHandler(err);
1243
- }
1464
+ );
1244
1465
  })();
1245
1466
  break;
1246
1467
  case "upload":
@@ -1250,33 +1471,69 @@ var RiverServer = class {
1250
1471
  if (initMessage.done) {
1251
1472
  return;
1252
1473
  }
1253
- try {
1254
- const outputMessage = await procedure.handler(
1255
- serviceContextWithTransportInfo,
1256
- initMessage.value,
1257
- incoming
1258
- );
1259
- if (!this.disconnectedSessions.has(message.from)) {
1260
- outgoing.push(outputMessage);
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
+ }
1261
1503
  }
1262
- } catch (err) {
1263
- errorHandler(err);
1264
- }
1504
+ );
1265
1505
  })();
1266
1506
  } else {
1267
- inputHandler = (async () => {
1268
- try {
1269
- const outputMessage = await procedure.handler(
1270
- serviceContextWithTransportInfo,
1271
- incoming
1272
- );
1273
- if (!this.disconnectedSessions.has(message.from)) {
1274
- outgoing.push(outputMessage);
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,
1521
+ async (span) => {
1522
+ try {
1523
+ const outputMessage = await procedure.handler(
1524
+ serviceContextWithTransportInfo,
1525
+ incoming
1526
+ );
1527
+ if (!this.disconnectedSessions.has(message.from)) {
1528
+ outgoing.push(outputMessage);
1529
+ }
1530
+ } catch (err) {
1531
+ errorHandler(err, span);
1532
+ } finally {
1533
+ span.end();
1275
1534
  }
1276
- } catch (err) {
1277
- errorHandler(err);
1278
1535
  }
1279
- })();
1536
+ );
1280
1537
  }
1281
1538
  break;
1282
1539
  default:
@@ -1326,15 +1583,15 @@ var RiverServer = class {
1326
1583
  }
1327
1584
  }
1328
1585
  getContext(service, serviceName) {
1329
- const context = this.contextMap.get(service);
1330
- if (!context) {
1586
+ const context3 = this.contextMap.get(service);
1587
+ if (!context3) {
1331
1588
  const err = `no context found for ${serviceName}`;
1332
1589
  log?.error(err, {
1333
1590
  clientId: this.transport.clientId
1334
1591
  });
1335
1592
  throw new Error(err);
1336
1593
  }
1337
- return context;
1594
+ return context3;
1338
1595
  }
1339
1596
  cleanupStream = async (id) => {
1340
1597
  const stream2 = this.streamMap.get(id);
@@ -1353,7 +1610,7 @@ function createServer(transport, services, extendedContext) {
1353
1610
  }
1354
1611
 
1355
1612
  // package.json
1356
- var version = "0.19.2";
1613
+ var version = "0.20.0";
1357
1614
  // Annotate the CommonJS export names for ESM import in node:
1358
1615
  0 && (module.exports = {
1359
1616
  Err,
@@ -1367,3 +1624,4 @@ var version = "0.19.2";
1367
1624
  createServer,
1368
1625
  serializeSchema
1369
1626
  });
1627
+ //# sourceMappingURL=index.cjs.map