@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
@@ -2,11 +2,12 @@ import {
2
2
  ControlMessagePayloadSchema,
3
3
  coerceErrorString,
4
4
  isStreamClose,
5
- isStreamOpen
6
- } from "./chunk-D5PVGZPQ.js";
5
+ isStreamOpen,
6
+ tracing_default
7
+ } from "./chunk-5WFL722S.js";
7
8
  import {
8
9
  log
9
- } from "./chunk-NBE3D667.js";
10
+ } from "./chunk-DT5JS6TM.js";
10
11
 
11
12
  // router/services.ts
12
13
  import { Type } from "@sinclair/typebox";
@@ -297,6 +298,14 @@ var Procedure = {
297
298
  stream
298
299
  };
299
300
 
301
+ // router/client.ts
302
+ import {
303
+ context,
304
+ propagation,
305
+ SpanKind,
306
+ SpanStatusCode
307
+ } from "@opentelemetry/api";
308
+
300
309
  // node_modules/p-defer/index.js
301
310
  function pDefer() {
302
311
  const deferred = {};
@@ -679,220 +688,323 @@ function createSessionDisconnectHandler(from, cb) {
679
688
  }
680
689
  function handleRpc(transport, serverId, input, serviceName, procedureName) {
681
690
  const streamId = nanoid();
682
- transport.send(serverId, {
683
- streamId,
684
- serviceName,
685
- procedureName,
686
- payload: input,
687
- controlFlags: 2 /* StreamOpenBit */ | 4 /* StreamClosedBit */
688
- });
689
- const responsePromise = new Promise((resolve) => {
690
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
691
- cleanup();
692
- resolve(
693
- Err({
694
- code: UNEXPECTED_DISCONNECT,
695
- message: `${serverId} unexpectedly disconnected`
696
- })
697
- );
698
- });
699
- function cleanup() {
700
- transport.removeEventListener("message", onMessage);
701
- transport.removeEventListener("sessionStatus", onSessionStatus);
702
- }
703
- function onMessage(msg) {
704
- if (msg.streamId !== streamId)
705
- return;
706
- if (msg.to !== transport.clientId)
707
- return;
708
- cleanup();
709
- resolve(msg.payload);
691
+ return tracing_default.startActiveSpan(
692
+ `${serviceName}.${procedureName}`,
693
+ {
694
+ attributes: {
695
+ component: "river",
696
+ "river.method.kind": "rpc",
697
+ "river.method.service": serviceName,
698
+ "river.method.name": procedureName,
699
+ "river.streamId": streamId,
700
+ "span.kind": "client"
701
+ },
702
+ kind: SpanKind.CLIENT
703
+ },
704
+ (span) => {
705
+ const tracing = { traceparent: "", tracestate: "" };
706
+ propagation.inject(context.active(), tracing);
707
+ transport.send(serverId, {
708
+ streamId,
709
+ serviceName,
710
+ procedureName,
711
+ tracing,
712
+ payload: input,
713
+ controlFlags: 2 /* StreamOpenBit */ | 4 /* StreamClosedBit */
714
+ });
715
+ const responsePromise = new Promise((resolve) => {
716
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
717
+ span.setStatus({ code: SpanStatusCode.ERROR });
718
+ cleanup();
719
+ resolve(
720
+ Err({
721
+ code: UNEXPECTED_DISCONNECT,
722
+ message: `${serverId} unexpectedly disconnected`
723
+ })
724
+ );
725
+ });
726
+ function cleanup() {
727
+ transport.removeEventListener("message", onMessage);
728
+ transport.removeEventListener("sessionStatus", onSessionStatus);
729
+ span.end();
730
+ }
731
+ function onMessage(msg) {
732
+ if (msg.streamId !== streamId)
733
+ return;
734
+ if (msg.to !== transport.clientId)
735
+ return;
736
+ if (msg.payload && typeof msg.payload === "object" && "ok" in msg.payload) {
737
+ span.setStatus({
738
+ code: msg.payload.ok ? SpanStatusCode.OK : SpanStatusCode.ERROR
739
+ });
740
+ }
741
+ cleanup();
742
+ resolve(msg.payload);
743
+ }
744
+ transport.addEventListener("message", onMessage);
745
+ transport.addEventListener("sessionStatus", onSessionStatus);
746
+ });
747
+ return responsePromise;
710
748
  }
711
- transport.addEventListener("message", onMessage);
712
- transport.addEventListener("sessionStatus", onSessionStatus);
713
- });
714
- return responsePromise;
749
+ );
715
750
  }
716
751
  function handleStream(transport, serverId, init, serviceName, procedureName) {
717
752
  const streamId = nanoid();
718
- const inputStream = pushable({ objectMode: true });
719
- const outputStream = pushable({ objectMode: true });
720
- let firstMessage = true;
721
- let healthyClose = true;
722
- if (init) {
723
- transport.send(serverId, {
724
- streamId,
725
- serviceName,
726
- procedureName,
727
- payload: init,
728
- controlFlags: 2 /* StreamOpenBit */
729
- });
730
- firstMessage = false;
731
- }
732
- const pipeInputToTransport = async () => {
733
- for await (const rawIn of inputStream) {
734
- const m = {
735
- streamId,
736
- payload: rawIn,
737
- controlFlags: 0
738
- };
739
- if (firstMessage) {
740
- m.serviceName = serviceName;
741
- m.procedureName = procedureName;
742
- m.controlFlags |= 2 /* StreamOpenBit */;
753
+ return tracing_default.startActiveSpan(
754
+ `${serviceName}.${procedureName}`,
755
+ {
756
+ attributes: {
757
+ component: "river",
758
+ "river.method.kind": init ? "stream-with-init" : "stream",
759
+ "river.method.service": serviceName,
760
+ "river.method.name": procedureName,
761
+ "river.streamId": streamId,
762
+ "span.kind": "client"
763
+ },
764
+ kind: SpanKind.CLIENT
765
+ },
766
+ (span) => {
767
+ const tracing = { traceparent: "", tracestate: "" };
768
+ propagation.inject(context.active(), tracing);
769
+ const inputStream = pushable({ objectMode: true });
770
+ const outputStream = pushable({ objectMode: true });
771
+ let firstMessage = true;
772
+ let healthyClose = true;
773
+ if (init) {
774
+ transport.send(serverId, {
775
+ streamId,
776
+ serviceName,
777
+ procedureName,
778
+ tracing,
779
+ payload: init,
780
+ controlFlags: 2 /* StreamOpenBit */
781
+ });
743
782
  firstMessage = false;
744
783
  }
745
- transport.send(serverId, m);
746
- }
747
- if (!healthyClose)
748
- return;
749
- transport.sendCloseStream(serverId, streamId);
750
- };
751
- void pipeInputToTransport();
752
- function onMessage(msg) {
753
- if (msg.streamId !== streamId)
754
- return;
755
- if (msg.to !== transport.clientId)
756
- return;
757
- if (isStreamClose(msg.controlFlags)) {
758
- cleanup();
759
- } else {
760
- outputStream.push(msg.payload);
784
+ const pipeInputToTransport = async () => {
785
+ for await (const rawIn of inputStream) {
786
+ const m = {
787
+ streamId,
788
+ payload: rawIn,
789
+ controlFlags: 0
790
+ };
791
+ if (firstMessage) {
792
+ m.serviceName = serviceName;
793
+ m.procedureName = procedureName;
794
+ m.tracing = tracing;
795
+ m.controlFlags |= 2 /* StreamOpenBit */;
796
+ firstMessage = false;
797
+ }
798
+ transport.send(serverId, m);
799
+ }
800
+ if (!healthyClose)
801
+ return;
802
+ transport.sendCloseStream(serverId, streamId);
803
+ span.setStatus({ code: SpanStatusCode.OK });
804
+ };
805
+ void pipeInputToTransport();
806
+ function onMessage(msg) {
807
+ if (msg.streamId !== streamId)
808
+ return;
809
+ if (msg.to !== transport.clientId)
810
+ return;
811
+ if (isStreamClose(msg.controlFlags)) {
812
+ cleanup();
813
+ } else {
814
+ outputStream.push(msg.payload);
815
+ }
816
+ }
817
+ function cleanup() {
818
+ inputStream.end();
819
+ outputStream.end();
820
+ transport.removeEventListener("message", onMessage);
821
+ transport.removeEventListener("sessionStatus", onSessionStatus);
822
+ span.end();
823
+ }
824
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
825
+ outputStream.push(
826
+ Err({
827
+ code: UNEXPECTED_DISCONNECT,
828
+ message: `${serverId} unexpectedly disconnected`
829
+ })
830
+ );
831
+ healthyClose = false;
832
+ span.setStatus({ code: SpanStatusCode.ERROR });
833
+ cleanup();
834
+ });
835
+ transport.addEventListener("message", onMessage);
836
+ transport.addEventListener("sessionStatus", onSessionStatus);
837
+ return [inputStream, outputStream, cleanup];
761
838
  }
762
- }
763
- function cleanup() {
764
- inputStream.end();
765
- outputStream.end();
766
- transport.removeEventListener("message", onMessage);
767
- transport.removeEventListener("sessionStatus", onSessionStatus);
768
- }
769
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
770
- outputStream.push(
771
- Err({
772
- code: UNEXPECTED_DISCONNECT,
773
- message: `${serverId} unexpectedly disconnected`
774
- })
775
- );
776
- healthyClose = false;
777
- cleanup();
778
- });
779
- transport.addEventListener("message", onMessage);
780
- transport.addEventListener("sessionStatus", onSessionStatus);
781
- return [inputStream, outputStream, cleanup];
839
+ );
782
840
  }
783
841
  function handleSubscribe(transport, serverId, input, serviceName, procedureName) {
784
842
  const streamId = nanoid();
785
- transport.send(serverId, {
786
- streamId,
787
- serviceName,
788
- procedureName,
789
- payload: input,
790
- controlFlags: 2 /* StreamOpenBit */
791
- });
792
- let healthyClose = true;
793
- const outputStream = pushable({ objectMode: true });
794
- function onMessage(msg) {
795
- if (msg.streamId !== streamId)
796
- return;
797
- if (msg.to !== transport.clientId)
798
- return;
799
- if (isStreamClose(msg.controlFlags)) {
800
- cleanup();
801
- } else {
802
- outputStream.push(msg.payload);
843
+ return tracing_default.startActiveSpan(
844
+ `${serviceName}.${procedureName}`,
845
+ {
846
+ attributes: {
847
+ component: "river",
848
+ "river.method.kind": "subscribe",
849
+ "river.method.service": serviceName,
850
+ "river.method.name": procedureName,
851
+ "river.streamId": streamId,
852
+ "span.kind": "client"
853
+ },
854
+ kind: SpanKind.CLIENT
855
+ },
856
+ (span) => {
857
+ const tracing = { traceparent: "", tracestate: "" };
858
+ propagation.inject(context.active(), tracing);
859
+ transport.send(serverId, {
860
+ streamId,
861
+ serviceName,
862
+ procedureName,
863
+ tracing,
864
+ payload: input,
865
+ controlFlags: 2 /* StreamOpenBit */
866
+ });
867
+ let healthyClose = true;
868
+ const outputStream = pushable({ objectMode: true });
869
+ function onMessage(msg) {
870
+ if (msg.streamId !== streamId)
871
+ return;
872
+ if (msg.to !== transport.clientId)
873
+ return;
874
+ if (isStreamClose(msg.controlFlags)) {
875
+ cleanup();
876
+ } else {
877
+ outputStream.push(msg.payload);
878
+ }
879
+ }
880
+ function cleanup() {
881
+ outputStream.end();
882
+ transport.removeEventListener("message", onMessage);
883
+ transport.removeEventListener("sessionStatus", onSessionStatus);
884
+ span.end();
885
+ }
886
+ const closeHandler = () => {
887
+ cleanup();
888
+ if (!healthyClose)
889
+ return;
890
+ transport.sendCloseStream(serverId, streamId);
891
+ };
892
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
893
+ outputStream.push(
894
+ Err({
895
+ code: UNEXPECTED_DISCONNECT,
896
+ message: `${serverId} unexpectedly disconnected`
897
+ })
898
+ );
899
+ healthyClose = false;
900
+ span.setStatus({ code: SpanStatusCode.ERROR });
901
+ cleanup();
902
+ });
903
+ transport.addEventListener("message", onMessage);
904
+ transport.addEventListener("sessionStatus", onSessionStatus);
905
+ return [outputStream, closeHandler];
803
906
  }
804
- }
805
- function cleanup() {
806
- outputStream.end();
807
- transport.removeEventListener("message", onMessage);
808
- transport.removeEventListener("sessionStatus", onSessionStatus);
809
- }
810
- const closeHandler = () => {
811
- cleanup();
812
- if (!healthyClose)
813
- return;
814
- transport.sendCloseStream(serverId, streamId);
815
- };
816
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
817
- outputStream.push(
818
- Err({
819
- code: UNEXPECTED_DISCONNECT,
820
- message: `${serverId} unexpectedly disconnected`
821
- })
822
- );
823
- healthyClose = false;
824
- cleanup();
825
- });
826
- transport.addEventListener("message", onMessage);
827
- transport.addEventListener("sessionStatus", onSessionStatus);
828
- return [outputStream, closeHandler];
907
+ );
829
908
  }
830
909
  function handleUpload(transport, serverId, init, serviceName, procedureName) {
831
910
  const streamId = nanoid();
832
- const inputStream = pushable({ objectMode: true });
833
- let firstMessage = true;
834
- let healthyClose = true;
835
- if (init) {
836
- transport.send(serverId, {
837
- streamId,
838
- serviceName,
839
- procedureName,
840
- payload: init,
841
- controlFlags: 2 /* StreamOpenBit */
842
- });
843
- firstMessage = false;
844
- }
845
- const pipeInputToTransport = async () => {
846
- for await (const rawIn of inputStream) {
847
- const m = {
848
- streamId,
849
- payload: rawIn,
850
- controlFlags: 0
851
- };
852
- if (firstMessage) {
853
- m.serviceName = serviceName;
854
- m.procedureName = procedureName;
855
- m.controlFlags |= 2 /* StreamOpenBit */;
911
+ return tracing_default.startActiveSpan(
912
+ `${serviceName}.${procedureName}`,
913
+ {
914
+ attributes: {
915
+ component: "river",
916
+ "river.method.kind": init ? "upload-with-init" : "upload",
917
+ "river.method.service": serviceName,
918
+ "river.method.name": procedureName,
919
+ "river.streamId": streamId,
920
+ "span.kind": "client"
921
+ },
922
+ kind: SpanKind.CLIENT
923
+ },
924
+ (span) => {
925
+ const tracing = { traceparent: "", tracestate: "" };
926
+ propagation.inject(context.active(), tracing);
927
+ const inputStream = pushable({ objectMode: true });
928
+ let firstMessage = true;
929
+ let healthyClose = true;
930
+ if (init) {
931
+ transport.send(serverId, {
932
+ streamId,
933
+ serviceName,
934
+ procedureName,
935
+ tracing,
936
+ payload: init,
937
+ controlFlags: 2 /* StreamOpenBit */
938
+ });
856
939
  firstMessage = false;
857
940
  }
858
- transport.send(serverId, m);
859
- }
860
- if (!healthyClose)
861
- return;
862
- transport.sendCloseStream(serverId, streamId);
863
- };
864
- void pipeInputToTransport();
865
- const responsePromise = new Promise((resolve) => {
866
- const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
867
- healthyClose = false;
868
- cleanup();
869
- resolve(
870
- Err({
871
- code: UNEXPECTED_DISCONNECT,
872
- message: `${serverId} unexpectedly disconnected`
873
- })
874
- );
875
- });
876
- function cleanup() {
877
- inputStream.end();
878
- transport.removeEventListener("message", onMessage);
879
- transport.removeEventListener("sessionStatus", onSessionStatus);
880
- }
881
- function onMessage(msg) {
882
- if (msg.streamId !== streamId)
883
- return;
884
- if (msg.to !== transport.clientId)
885
- return;
886
- cleanup();
887
- resolve(msg.payload);
941
+ const pipeInputToTransport = async () => {
942
+ for await (const rawIn of inputStream) {
943
+ const m = {
944
+ streamId,
945
+ payload: rawIn,
946
+ controlFlags: 0
947
+ };
948
+ if (firstMessage) {
949
+ m.serviceName = serviceName;
950
+ m.procedureName = procedureName;
951
+ m.tracing = tracing;
952
+ m.controlFlags |= 2 /* StreamOpenBit */;
953
+ firstMessage = false;
954
+ }
955
+ transport.send(serverId, m);
956
+ }
957
+ if (!healthyClose)
958
+ return;
959
+ transport.sendCloseStream(serverId, streamId);
960
+ };
961
+ void pipeInputToTransport();
962
+ const responsePromise = new Promise((resolve) => {
963
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
964
+ healthyClose = false;
965
+ span.setStatus({ code: SpanStatusCode.ERROR });
966
+ cleanup();
967
+ resolve(
968
+ Err({
969
+ code: UNEXPECTED_DISCONNECT,
970
+ message: `${serverId} unexpectedly disconnected`
971
+ })
972
+ );
973
+ });
974
+ function cleanup() {
975
+ inputStream.end();
976
+ transport.removeEventListener("message", onMessage);
977
+ transport.removeEventListener("sessionStatus", onSessionStatus);
978
+ span.end();
979
+ }
980
+ function onMessage(msg) {
981
+ if (msg.streamId !== streamId)
982
+ return;
983
+ if (msg.to !== transport.clientId)
984
+ return;
985
+ if (msg.payload && typeof msg.payload === "object" && "ok" in msg.payload) {
986
+ span.setStatus({
987
+ code: msg.payload.ok ? SpanStatusCode.OK : SpanStatusCode.ERROR
988
+ });
989
+ }
990
+ cleanup();
991
+ resolve(msg.payload);
992
+ }
993
+ transport.addEventListener("message", onMessage);
994
+ transport.addEventListener("sessionStatus", onSessionStatus);
995
+ });
996
+ return [inputStream, responsePromise];
888
997
  }
889
- transport.addEventListener("message", onMessage);
890
- transport.addEventListener("sessionStatus", onSessionStatus);
891
- });
892
- return [inputStream, responsePromise];
998
+ );
893
999
  }
894
1000
 
895
1001
  // router/server.ts
1002
+ import {
1003
+ context as context2,
1004
+ propagation as propagation2,
1005
+ SpanKind as SpanKind2,
1006
+ SpanStatusCode as SpanStatusCode2
1007
+ } from "@opentelemetry/api";
896
1008
  import { Value } from "@sinclair/typebox/value";
897
1009
  var RiverServer = class {
898
1010
  transport;
@@ -964,9 +1076,9 @@ var RiverServer = class {
964
1076
  this.transport.removeEventListener("message", this.onMessage);
965
1077
  this.transport.removeEventListener("sessionStatus", this.onSessionStatus);
966
1078
  await Promise.all([...this.streamMap.keys()].map(this.cleanupStream));
967
- for (const context of this.contextMap.values()) {
968
- if (Symbol.dispose in context.state) {
969
- const dispose = context.state[Symbol.dispose];
1079
+ for (const context3 of this.contextMap.values()) {
1080
+ if (Symbol.dispose in context3.state) {
1081
+ const dispose = context3.state[Symbol.dispose];
970
1082
  if (typeof dispose === "function") {
971
1083
  dispose();
972
1084
  }
@@ -995,6 +1107,10 @@ var RiverServer = class {
995
1107
  });
996
1108
  return;
997
1109
  }
1110
+ let activeContext = context2.active();
1111
+ if (message.tracing) {
1112
+ activeContext = propagation2.extract(activeContext, message.tracing);
1113
+ }
998
1114
  const service = this.services[message.serviceName];
999
1115
  const serviceContext = this.getContext(service, message.serviceName);
1000
1116
  if (!(message.procedureName in service.procedures)) {
@@ -1052,12 +1168,18 @@ var RiverServer = class {
1052
1168
  })()
1053
1169
  )
1054
1170
  );
1055
- const errorHandler = (err) => {
1171
+ const errorHandler = (err, span) => {
1056
1172
  const errorMsg = coerceErrorString(err);
1057
1173
  log?.error(
1058
1174
  `procedure ${message.serviceName}.${message.procedureName} threw an uncaught error: ${errorMsg}`,
1059
1175
  session.loggingMetadata
1060
1176
  );
1177
+ if (err instanceof Error) {
1178
+ span.recordException(err);
1179
+ } else {
1180
+ span.recordException(errorMsg);
1181
+ }
1182
+ span.setStatus({ code: SpanStatusCode2.ERROR });
1061
1183
  outgoing.push(
1062
1184
  Err({
1063
1185
  code: UNCAUGHT_ERROR,
@@ -1089,15 +1211,34 @@ var RiverServer = class {
1089
1211
  if (inputMessage.done) {
1090
1212
  return;
1091
1213
  }
1092
- try {
1093
- const outputMessage = await procedure.handler(
1094
- serviceContextWithTransportInfo,
1095
- inputMessage.value
1096
- );
1097
- outgoing.push(outputMessage);
1098
- } catch (err) {
1099
- errorHandler(err);
1100
- }
1214
+ await tracing_default.startActiveSpan(
1215
+ `${message.serviceName}.${message.procedureName}`,
1216
+ {
1217
+ attributes: {
1218
+ component: "river",
1219
+ "river.method.kind": "rpc",
1220
+ "river.method.service": message.serviceName,
1221
+ "river.method.name": message.procedureName,
1222
+ "river.streamId": message.streamId,
1223
+ "span.kind": "server"
1224
+ },
1225
+ kind: SpanKind2.SERVER
1226
+ },
1227
+ activeContext,
1228
+ async (span) => {
1229
+ try {
1230
+ const outputMessage = await procedure.handler(
1231
+ serviceContextWithTransportInfo,
1232
+ inputMessage.value
1233
+ );
1234
+ outgoing.push(outputMessage);
1235
+ } catch (err) {
1236
+ errorHandler(err, span);
1237
+ } finally {
1238
+ span.end();
1239
+ }
1240
+ }
1241
+ );
1101
1242
  })();
1102
1243
  break;
1103
1244
  case "stream":
@@ -1107,22 +1248,79 @@ var RiverServer = class {
1107
1248
  if (initMessage.done) {
1108
1249
  return;
1109
1250
  }
1110
- try {
1111
- const dispose = await procedure.handler(
1112
- serviceContextWithTransportInfo,
1113
- initMessage.value,
1114
- incoming,
1115
- outgoing
1116
- );
1117
- if (dispose) {
1118
- disposables.push(dispose);
1251
+ await tracing_default.startActiveSpan(
1252
+ `${message.serviceName}.${message.procedureName}`,
1253
+ {
1254
+ attributes: {
1255
+ component: "river",
1256
+ "river.method.kind": "stream-with-init",
1257
+ "river.method.service": message.serviceName,
1258
+ "river.method.name": message.procedureName,
1259
+ "river.streamId": message.streamId,
1260
+ "span.kind": "server"
1261
+ },
1262
+ kind: SpanKind2.SERVER
1263
+ },
1264
+ activeContext,
1265
+ async (span) => {
1266
+ try {
1267
+ const dispose = await procedure.handler(
1268
+ serviceContextWithTransportInfo,
1269
+ initMessage.value,
1270
+ incoming,
1271
+ outgoing
1272
+ );
1273
+ if (dispose) {
1274
+ disposables.push(() => {
1275
+ dispose();
1276
+ span.end();
1277
+ });
1278
+ } else {
1279
+ span.end();
1280
+ }
1281
+ } catch (err) {
1282
+ errorHandler(err, span);
1283
+ span.end();
1284
+ }
1119
1285
  }
1120
- } catch (err) {
1121
- errorHandler(err);
1122
- }
1286
+ );
1123
1287
  })();
1124
1288
  } else {
1125
- inputHandler = procedure.handler(serviceContextWithTransportInfo, incoming, outgoing).catch(errorHandler);
1289
+ inputHandler = tracing_default.startActiveSpan(
1290
+ `${message.serviceName}.${message.procedureName}`,
1291
+ {
1292
+ attributes: {
1293
+ component: "river",
1294
+ "river.method.kind": "stream",
1295
+ "river.method.service": message.serviceName,
1296
+ "river.method.name": message.procedureName,
1297
+ "river.streamId": message.streamId,
1298
+ "span.kind": "server"
1299
+ },
1300
+ kind: SpanKind2.SERVER
1301
+ },
1302
+ activeContext,
1303
+ async (span) => {
1304
+ try {
1305
+ const dispose = await procedure.handler(
1306
+ serviceContextWithTransportInfo,
1307
+ incoming,
1308
+ outgoing
1309
+ );
1310
+ if (dispose) {
1311
+ disposables.push(() => {
1312
+ dispose();
1313
+ span.end();
1314
+ });
1315
+ } else {
1316
+ span.end();
1317
+ }
1318
+ } catch (err) {
1319
+ errorHandler(err, span);
1320
+ span.end();
1321
+ }
1322
+ }
1323
+ );
1126
1324
  }
1127
1325
  break;
1128
1326
  case "subscription":
@@ -1131,18 +1329,41 @@ var RiverServer = class {
1131
1329
  if (inputMessage.done) {
1132
1330
  return;
1133
1331
  }
1134
- try {
1135
- const dispose = await procedure.handler(
1136
- serviceContextWithTransportInfo,
1137
- inputMessage.value,
1138
- outgoing
1139
- );
1140
- if (dispose) {
1141
- disposables.push(dispose);
1332
+ await tracing_default.startActiveSpan(
1333
+ `${message.serviceName}.${message.procedureName}`,
1334
+ {
1335
+ attributes: {
1336
+ component: "river",
1337
+ "river.method.kind": "subscription",
1338
+ "river.method.service": message.serviceName,
1339
+ "river.method.name": message.procedureName,
1340
+ "river.streamId": message.streamId,
1341
+ "span.kind": "server"
1342
+ },
1343
+ kind: SpanKind2.SERVER
1344
+ },
1345
+ activeContext,
1346
+ async (span) => {
1347
+ try {
1348
+ const dispose = await procedure.handler(
1349
+ serviceContextWithTransportInfo,
1350
+ inputMessage.value,
1351
+ outgoing
1352
+ );
1353
+ if (dispose) {
1354
+ disposables.push(() => {
1355
+ dispose();
1356
+ span.end();
1357
+ });
1358
+ } else {
1359
+ span.end();
1360
+ }
1361
+ } catch (err) {
1362
+ errorHandler(err, span);
1363
+ span.end();
1364
+ }
1142
1365
  }
1143
- } catch (err) {
1144
- errorHandler(err);
1145
- }
1366
+ );
1146
1367
  })();
1147
1368
  break;
1148
1369
  case "upload":
@@ -1152,33 +1373,69 @@ var RiverServer = class {
1152
1373
  if (initMessage.done) {
1153
1374
  return;
1154
1375
  }
1155
- try {
1156
- const outputMessage = await procedure.handler(
1157
- serviceContextWithTransportInfo,
1158
- initMessage.value,
1159
- incoming
1160
- );
1161
- if (!this.disconnectedSessions.has(message.from)) {
1162
- outgoing.push(outputMessage);
1376
+ await tracing_default.startActiveSpan(
1377
+ `${message.serviceName}.${message.procedureName}`,
1378
+ {
1379
+ attributes: {
1380
+ component: "river",
1381
+ "river.method.kind": "upload-with-init",
1382
+ "river.method.service": message.serviceName,
1383
+ "river.method.name": message.procedureName,
1384
+ "river.streamId": message.streamId,
1385
+ "span.kind": "server"
1386
+ },
1387
+ kind: SpanKind2.SERVER
1388
+ },
1389
+ activeContext,
1390
+ async (span) => {
1391
+ try {
1392
+ const outputMessage = await procedure.handler(
1393
+ serviceContextWithTransportInfo,
1394
+ initMessage.value,
1395
+ incoming
1396
+ );
1397
+ if (!this.disconnectedSessions.has(message.from)) {
1398
+ outgoing.push(outputMessage);
1399
+ }
1400
+ } catch (err) {
1401
+ errorHandler(err, span);
1402
+ } finally {
1403
+ span.end();
1404
+ }
1163
1405
  }
1164
- } catch (err) {
1165
- errorHandler(err);
1166
- }
1406
+ );
1167
1407
  })();
1168
1408
  } else {
1169
- inputHandler = (async () => {
1170
- try {
1171
- const outputMessage = await procedure.handler(
1172
- serviceContextWithTransportInfo,
1173
- incoming
1174
- );
1175
- if (!this.disconnectedSessions.has(message.from)) {
1176
- outgoing.push(outputMessage);
1409
+ inputHandler = tracing_default.startActiveSpan(
1410
+ `${message.serviceName}.${message.procedureName}`,
1411
+ {
1412
+ attributes: {
1413
+ component: "river",
1414
+ "river.method.kind": "upload",
1415
+ "river.method.service": message.serviceName,
1416
+ "river.method.name": message.procedureName,
1417
+ "river.streamId": message.streamId,
1418
+ "span.kind": "server"
1419
+ },
1420
+ kind: SpanKind2.SERVER
1421
+ },
1422
+ activeContext,
1423
+ async (span) => {
1424
+ try {
1425
+ const outputMessage = await procedure.handler(
1426
+ serviceContextWithTransportInfo,
1427
+ incoming
1428
+ );
1429
+ if (!this.disconnectedSessions.has(message.from)) {
1430
+ outgoing.push(outputMessage);
1431
+ }
1432
+ } catch (err) {
1433
+ errorHandler(err, span);
1434
+ } finally {
1435
+ span.end();
1177
1436
  }
1178
- } catch (err) {
1179
- errorHandler(err);
1180
1437
  }
1181
- })();
1438
+ );
1182
1439
  }
1183
1440
  break;
1184
1441
  default:
@@ -1228,15 +1485,15 @@ var RiverServer = class {
1228
1485
  }
1229
1486
  }
1230
1487
  getContext(service, serviceName) {
1231
- const context = this.contextMap.get(service);
1232
- if (!context) {
1488
+ const context3 = this.contextMap.get(service);
1489
+ if (!context3) {
1233
1490
  const err = `no context found for ${serviceName}`;
1234
1491
  log?.error(err, {
1235
1492
  clientId: this.transport.clientId
1236
1493
  });
1237
1494
  throw new Error(err);
1238
1495
  }
1239
- return context;
1496
+ return context3;
1240
1497
  }
1241
1498
  cleanupStream = async (id) => {
1242
1499
  const stream2 = this.streamMap.get(id);
@@ -1255,7 +1512,7 @@ function createServer(transport, services, extendedContext) {
1255
1512
  }
1256
1513
 
1257
1514
  // package.json
1258
- var version = "0.19.2";
1515
+ var version = "0.20.0";
1259
1516
 
1260
1517
  export {
1261
1518
  serializeSchema,
@@ -1270,3 +1527,4 @@ export {
1270
1527
  createServer,
1271
1528
  version
1272
1529
  };
1530
+ //# sourceMappingURL=chunk-YB5LRYL6.js.map