@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
@@ -1,13 +1,15 @@
1
1
  import {
2
2
  ControlMessagePayloadSchema,
3
3
  coerceErrorString,
4
+ createHandlerSpan,
5
+ createProcTelemetryInfo,
6
+ getPropagationContext,
4
7
  isStreamClose,
5
- isStreamOpen,
6
- tracing_default
7
- } from "./chunk-5WFL722S.js";
8
+ isStreamOpen
9
+ } from "./chunk-3MFX6NXA.js";
8
10
  import {
9
11
  log
10
- } from "./chunk-DT5JS6TM.js";
12
+ } from "./chunk-OTQNCLFH.js";
11
13
 
12
14
  // router/services.ts
13
15
  import { Type } from "@sinclair/typebox";
@@ -298,14 +300,6 @@ var Procedure = {
298
300
  stream
299
301
  };
300
302
 
301
- // router/client.ts
302
- import {
303
- context,
304
- propagation,
305
- SpanKind,
306
- SpanStatusCode
307
- } from "@opentelemetry/api";
308
-
309
303
  // node_modules/p-defer/index.js
310
304
  function pDefer() {
311
305
  const deferred = {};
@@ -688,324 +682,256 @@ function createSessionDisconnectHandler(from, cb) {
688
682
  }
689
683
  function handleRpc(transport, serverId, input, serviceName, procedureName) {
690
684
  const streamId = nanoid();
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;
748
- }
685
+ const { span, ctx } = createProcTelemetryInfo(
686
+ "rpc",
687
+ serviceName,
688
+ procedureName,
689
+ streamId
749
690
  );
691
+ transport.send(serverId, {
692
+ streamId,
693
+ serviceName,
694
+ procedureName,
695
+ payload: input,
696
+ tracing: getPropagationContext(ctx),
697
+ controlFlags: 2 /* StreamOpenBit */ | 4 /* StreamClosedBit */
698
+ });
699
+ const responsePromise = new Promise((resolve) => {
700
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
701
+ cleanup();
702
+ resolve(
703
+ Err({
704
+ code: UNEXPECTED_DISCONNECT,
705
+ message: `${serverId} unexpectedly disconnected`
706
+ })
707
+ );
708
+ });
709
+ function cleanup() {
710
+ transport.removeEventListener("message", onMessage);
711
+ transport.removeEventListener("sessionStatus", onSessionStatus);
712
+ span.end();
713
+ }
714
+ function onMessage(msg) {
715
+ if (msg.streamId !== streamId)
716
+ return;
717
+ if (msg.to !== transport.clientId)
718
+ return;
719
+ cleanup();
720
+ resolve(msg.payload);
721
+ }
722
+ transport.addEventListener("message", onMessage);
723
+ transport.addEventListener("sessionStatus", onSessionStatus);
724
+ });
725
+ return responsePromise;
750
726
  }
751
727
  function handleStream(transport, serverId, init, serviceName, procedureName) {
752
728
  const streamId = nanoid();
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
- });
782
- firstMessage = false;
783
- }
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 });
729
+ const { span, ctx } = createProcTelemetryInfo(
730
+ "stream",
731
+ serviceName,
732
+ procedureName,
733
+ streamId
734
+ );
735
+ const inputStream = pushable({ objectMode: true });
736
+ const outputStream = pushable({ objectMode: true });
737
+ let firstMessage = true;
738
+ let healthyClose = true;
739
+ if (init) {
740
+ transport.send(serverId, {
741
+ streamId,
742
+ serviceName,
743
+ procedureName,
744
+ payload: init,
745
+ tracing: getPropagationContext(ctx),
746
+ controlFlags: 2 /* StreamOpenBit */
747
+ });
748
+ firstMessage = false;
749
+ }
750
+ const pipeInputToTransport = async () => {
751
+ for await (const rawIn of inputStream) {
752
+ const m = {
753
+ streamId,
754
+ payload: rawIn,
755
+ controlFlags: 0
804
756
  };
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();
757
+ if (firstMessage) {
758
+ m.serviceName = serviceName;
759
+ m.procedureName = procedureName;
760
+ m.tracing = getPropagationContext(ctx);
761
+ m.controlFlags |= 2 /* StreamOpenBit */;
762
+ firstMessage = false;
823
763
  }
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];
764
+ transport.send(serverId, m);
838
765
  }
839
- );
766
+ if (!healthyClose)
767
+ return;
768
+ transport.sendCloseStream(serverId, streamId);
769
+ };
770
+ void pipeInputToTransport();
771
+ function onMessage(msg) {
772
+ if (msg.streamId !== streamId)
773
+ return;
774
+ if (msg.to !== transport.clientId)
775
+ return;
776
+ if (isStreamClose(msg.controlFlags)) {
777
+ cleanup();
778
+ } else {
779
+ outputStream.push(msg.payload);
780
+ }
781
+ }
782
+ function cleanup() {
783
+ inputStream.end();
784
+ outputStream.end();
785
+ transport.removeEventListener("message", onMessage);
786
+ transport.removeEventListener("sessionStatus", onSessionStatus);
787
+ span.end();
788
+ }
789
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
790
+ outputStream.push(
791
+ Err({
792
+ code: UNEXPECTED_DISCONNECT,
793
+ message: `${serverId} unexpectedly disconnected`
794
+ })
795
+ );
796
+ healthyClose = false;
797
+ cleanup();
798
+ });
799
+ transport.addEventListener("message", onMessage);
800
+ transport.addEventListener("sessionStatus", onSessionStatus);
801
+ return [inputStream, outputStream, cleanup];
840
802
  }
841
803
  function handleSubscribe(transport, serverId, input, serviceName, procedureName) {
842
804
  const streamId = nanoid();
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];
906
- }
805
+ const { span, ctx } = createProcTelemetryInfo(
806
+ "subscription",
807
+ serviceName,
808
+ procedureName,
809
+ streamId
907
810
  );
811
+ transport.send(serverId, {
812
+ streamId,
813
+ serviceName,
814
+ procedureName,
815
+ payload: input,
816
+ tracing: getPropagationContext(ctx),
817
+ controlFlags: 2 /* StreamOpenBit */
818
+ });
819
+ let healthyClose = true;
820
+ const outputStream = pushable({ objectMode: true });
821
+ function onMessage(msg) {
822
+ if (msg.streamId !== streamId)
823
+ return;
824
+ if (msg.to !== transport.clientId)
825
+ return;
826
+ if (isStreamClose(msg.controlFlags)) {
827
+ cleanup();
828
+ } else {
829
+ outputStream.push(msg.payload);
830
+ }
831
+ }
832
+ function cleanup() {
833
+ outputStream.end();
834
+ transport.removeEventListener("message", onMessage);
835
+ transport.removeEventListener("sessionStatus", onSessionStatus);
836
+ span.end();
837
+ }
838
+ const closeHandler = () => {
839
+ cleanup();
840
+ if (!healthyClose)
841
+ return;
842
+ transport.sendCloseStream(serverId, streamId);
843
+ };
844
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
845
+ outputStream.push(
846
+ Err({
847
+ code: UNEXPECTED_DISCONNECT,
848
+ message: `${serverId} unexpectedly disconnected`
849
+ })
850
+ );
851
+ healthyClose = false;
852
+ cleanup();
853
+ });
854
+ transport.addEventListener("message", onMessage);
855
+ transport.addEventListener("sessionStatus", onSessionStatus);
856
+ return [outputStream, closeHandler];
908
857
  }
909
858
  function handleUpload(transport, serverId, init, serviceName, procedureName) {
910
859
  const streamId = nanoid();
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
- });
860
+ const { span, ctx } = createProcTelemetryInfo(
861
+ "upload",
862
+ serviceName,
863
+ procedureName,
864
+ streamId
865
+ );
866
+ const inputStream = pushable({ objectMode: true });
867
+ let firstMessage = true;
868
+ let healthyClose = true;
869
+ if (init) {
870
+ transport.send(serverId, {
871
+ streamId,
872
+ serviceName,
873
+ procedureName,
874
+ payload: init,
875
+ tracing: getPropagationContext(ctx),
876
+ controlFlags: 2 /* StreamOpenBit */
877
+ });
878
+ firstMessage = false;
879
+ }
880
+ const pipeInputToTransport = async () => {
881
+ for await (const rawIn of inputStream) {
882
+ const m = {
883
+ streamId,
884
+ payload: rawIn,
885
+ controlFlags: 0
886
+ };
887
+ if (firstMessage) {
888
+ m.serviceName = serviceName;
889
+ m.procedureName = procedureName;
890
+ m.tracing = getPropagationContext(ctx);
891
+ m.controlFlags |= 2 /* StreamOpenBit */;
939
892
  firstMessage = false;
940
893
  }
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];
894
+ transport.send(serverId, m);
997
895
  }
998
- );
896
+ if (!healthyClose)
897
+ return;
898
+ transport.sendCloseStream(serverId, streamId);
899
+ };
900
+ void pipeInputToTransport();
901
+ const responsePromise = new Promise((resolve) => {
902
+ const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
903
+ healthyClose = false;
904
+ cleanup();
905
+ resolve(
906
+ Err({
907
+ code: UNEXPECTED_DISCONNECT,
908
+ message: `${serverId} unexpectedly disconnected`
909
+ })
910
+ );
911
+ });
912
+ function cleanup() {
913
+ inputStream.end();
914
+ transport.removeEventListener("message", onMessage);
915
+ transport.removeEventListener("sessionStatus", onSessionStatus);
916
+ span.end();
917
+ }
918
+ function onMessage(msg) {
919
+ if (msg.streamId !== streamId)
920
+ return;
921
+ if (msg.to !== transport.clientId)
922
+ return;
923
+ cleanup();
924
+ resolve(msg.payload);
925
+ }
926
+ transport.addEventListener("message", onMessage);
927
+ transport.addEventListener("sessionStatus", onSessionStatus);
928
+ });
929
+ return [inputStream, responsePromise];
999
930
  }
1000
931
 
1001
932
  // 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";
1008
933
  import { Value } from "@sinclair/typebox/value";
934
+ import { SpanStatusCode } from "@opentelemetry/api";
1009
935
  var RiverServer = class {
1010
936
  transport;
1011
937
  services;
@@ -1076,9 +1002,9 @@ var RiverServer = class {
1076
1002
  this.transport.removeEventListener("message", this.onMessage);
1077
1003
  this.transport.removeEventListener("sessionStatus", this.onSessionStatus);
1078
1004
  await Promise.all([...this.streamMap.keys()].map(this.cleanupStream));
1079
- for (const context3 of this.contextMap.values()) {
1080
- if (Symbol.dispose in context3.state) {
1081
- const dispose = context3.state[Symbol.dispose];
1005
+ for (const context of this.contextMap.values()) {
1006
+ if (Symbol.dispose in context.state) {
1007
+ const dispose = context.state[Symbol.dispose];
1082
1008
  if (typeof dispose === "function") {
1083
1009
  dispose();
1084
1010
  }
@@ -1089,7 +1015,11 @@ var RiverServer = class {
1089
1015
  if (!isStreamOpen(message.controlFlags)) {
1090
1016
  log?.error(
1091
1017
  `can't create a new procedure stream from a message that doesn't have the stream open bit set`,
1092
- { clientId: this.transport.clientId, fullTransportMessage: message }
1018
+ {
1019
+ clientId: this.transport.clientId,
1020
+ fullTransportMessage: message,
1021
+ tags: ["invariant-violation"]
1022
+ }
1093
1023
  );
1094
1024
  return;
1095
1025
  }
@@ -1107,10 +1037,6 @@ var RiverServer = class {
1107
1037
  });
1108
1038
  return;
1109
1039
  }
1110
- let activeContext = context2.active();
1111
- if (message.tracing) {
1112
- activeContext = propagation2.extract(activeContext, message.tracing);
1113
- }
1114
1040
  const service = this.services[message.serviceName];
1115
1041
  const serviceContext = this.getContext(service, message.serviceName);
1116
1042
  if (!(message.procedureName in service.procedures)) {
@@ -1174,12 +1100,8 @@ var RiverServer = class {
1174
1100
  `procedure ${message.serviceName}.${message.procedureName} threw an uncaught error: ${errorMsg}`,
1175
1101
  session.loggingMetadata
1176
1102
  );
1177
- if (err instanceof Error) {
1178
- span.recordException(err);
1179
- } else {
1180
- span.recordException(errorMsg);
1181
- }
1182
- span.setStatus({ code: SpanStatusCode2.ERROR });
1103
+ span.recordException(err instanceof Error ? err : new Error(errorMsg));
1104
+ span.setStatus({ code: SpanStatusCode.ERROR });
1183
1105
  outgoing.push(
1184
1106
  Err({
1185
1107
  code: UNCAUGHT_ERROR,
@@ -1188,10 +1110,10 @@ var RiverServer = class {
1188
1110
  );
1189
1111
  };
1190
1112
  if (session.metadata === void 0) {
1191
- log?.error(
1192
- `(invariant violation) session doesn't have handshake metadata`,
1193
- session.loggingMetadata
1194
- );
1113
+ log?.error(`session doesn't have handshake metadata`, {
1114
+ ...session.loggingMetadata,
1115
+ tags: ["invariant-violation"]
1116
+ });
1195
1117
  return;
1196
1118
  }
1197
1119
  let inputHandler;
@@ -1206,32 +1128,48 @@ var RiverServer = class {
1206
1128
  };
1207
1129
  switch (procedure.type) {
1208
1130
  case "rpc":
1209
- inputHandler = (async () => {
1210
- const inputMessage = await incoming.next();
1211
- if (inputMessage.done) {
1212
- return;
1131
+ inputHandler = createHandlerSpan(
1132
+ procedure.type,
1133
+ message,
1134
+ async (span) => {
1135
+ const inputMessage = await incoming.next();
1136
+ if (inputMessage.done) {
1137
+ return;
1138
+ }
1139
+ try {
1140
+ const outputMessage = await procedure.handler(
1141
+ serviceContextWithTransportInfo,
1142
+ inputMessage.value
1143
+ );
1144
+ outgoing.push(outputMessage);
1145
+ } catch (err) {
1146
+ errorHandler(err, span);
1147
+ } finally {
1148
+ span.end();
1149
+ }
1213
1150
  }
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,
1151
+ );
1152
+ break;
1153
+ case "stream":
1154
+ if (procHasInitMessage) {
1155
+ inputHandler = createHandlerSpan(
1156
+ procedure.type,
1157
+ message,
1228
1158
  async (span) => {
1159
+ const initMessage = await incoming.next();
1160
+ if (initMessage.done) {
1161
+ return;
1162
+ }
1229
1163
  try {
1230
- const outputMessage = await procedure.handler(
1164
+ const dispose = await procedure.handler(
1231
1165
  serviceContextWithTransportInfo,
1232
- inputMessage.value
1166
+ initMessage.value,
1167
+ incoming,
1168
+ outgoing
1233
1169
  );
1234
- outgoing.push(outputMessage);
1170
+ if (dispose) {
1171
+ disposables.push(dispose);
1172
+ }
1235
1173
  } catch (err) {
1236
1174
  errorHandler(err, span);
1237
1175
  } finally {
@@ -1239,67 +1177,10 @@ var RiverServer = class {
1239
1177
  }
1240
1178
  }
1241
1179
  );
1242
- })();
1243
- break;
1244
- case "stream":
1245
- if (procHasInitMessage) {
1246
- inputHandler = (async () => {
1247
- const initMessage = await incoming.next();
1248
- if (initMessage.done) {
1249
- return;
1250
- }
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
- }
1285
- }
1286
- );
1287
- })();
1288
1180
  } else {
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,
1181
+ inputHandler = createHandlerSpan(
1182
+ procedure.type,
1183
+ message,
1303
1184
  async (span) => {
1304
1185
  try {
1305
1186
  const dispose = await procedure.handler(
@@ -1308,15 +1189,11 @@ var RiverServer = class {
1308
1189
  outgoing
1309
1190
  );
1310
1191
  if (dispose) {
1311
- disposables.push(() => {
1312
- dispose();
1313
- span.end();
1314
- });
1315
- } else {
1316
- span.end();
1192
+ disposables.push(dispose);
1317
1193
  }
1318
1194
  } catch (err) {
1319
1195
  errorHandler(err, span);
1196
+ } finally {
1320
1197
  span.end();
1321
1198
  }
1322
1199
  }
@@ -1324,102 +1201,61 @@ var RiverServer = class {
1324
1201
  }
1325
1202
  break;
1326
1203
  case "subscription":
1327
- inputHandler = (async () => {
1328
- const inputMessage = await incoming.next();
1329
- if (inputMessage.done) {
1330
- return;
1204
+ inputHandler = createHandlerSpan(
1205
+ procedure.type,
1206
+ message,
1207
+ async (span) => {
1208
+ const inputMessage = await incoming.next();
1209
+ if (inputMessage.done) {
1210
+ return;
1211
+ }
1212
+ try {
1213
+ const dispose = await procedure.handler(
1214
+ serviceContextWithTransportInfo,
1215
+ inputMessage.value,
1216
+ outgoing
1217
+ );
1218
+ if (dispose) {
1219
+ disposables.push(dispose);
1220
+ }
1221
+ } catch (err) {
1222
+ errorHandler(err, span);
1223
+ } finally {
1224
+ span.end();
1225
+ }
1331
1226
  }
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,
1227
+ );
1228
+ break;
1229
+ case "upload":
1230
+ if (procHasInitMessage) {
1231
+ inputHandler = createHandlerSpan(
1232
+ procedure.type,
1233
+ message,
1346
1234
  async (span) => {
1235
+ const initMessage = await incoming.next();
1236
+ if (initMessage.done) {
1237
+ return;
1238
+ }
1347
1239
  try {
1348
- const dispose = await procedure.handler(
1240
+ const outputMessage = await procedure.handler(
1349
1241
  serviceContextWithTransportInfo,
1350
- inputMessage.value,
1351
- outgoing
1242
+ initMessage.value,
1243
+ incoming
1352
1244
  );
1353
- if (dispose) {
1354
- disposables.push(() => {
1355
- dispose();
1356
- span.end();
1357
- });
1358
- } else {
1359
- span.end();
1245
+ if (!this.disconnectedSessions.has(message.from)) {
1246
+ outgoing.push(outputMessage);
1360
1247
  }
1361
1248
  } catch (err) {
1362
1249
  errorHandler(err, span);
1250
+ } finally {
1363
1251
  span.end();
1364
1252
  }
1365
1253
  }
1366
1254
  );
1367
- })();
1368
- break;
1369
- case "upload":
1370
- if (procHasInitMessage) {
1371
- inputHandler = (async () => {
1372
- const initMessage = await incoming.next();
1373
- if (initMessage.done) {
1374
- return;
1375
- }
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
- }
1405
- }
1406
- );
1407
- })();
1408
1255
  } else {
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,
1256
+ inputHandler = createHandlerSpan(
1257
+ procedure.type,
1258
+ message,
1423
1259
  async (span) => {
1424
1260
  try {
1425
1261
  const outputMessage = await procedure.handler(
@@ -1485,15 +1321,16 @@ var RiverServer = class {
1485
1321
  }
1486
1322
  }
1487
1323
  getContext(service, serviceName) {
1488
- const context3 = this.contextMap.get(service);
1489
- if (!context3) {
1324
+ const context = this.contextMap.get(service);
1325
+ if (!context) {
1490
1326
  const err = `no context found for ${serviceName}`;
1491
1327
  log?.error(err, {
1492
- clientId: this.transport.clientId
1328
+ clientId: this.transport.clientId,
1329
+ tags: ["invariant-violation"]
1493
1330
  });
1494
1331
  throw new Error(err);
1495
1332
  }
1496
- return context3;
1333
+ return context;
1497
1334
  }
1498
1335
  cleanupStream = async (id) => {
1499
1336
  const stream2 = this.streamMap.get(id);
@@ -1511,9 +1348,6 @@ function createServer(transport, services, extendedContext) {
1511
1348
  return new RiverServer(transport, services, extendedContext);
1512
1349
  }
1513
1350
 
1514
- // package.json
1515
- var version = "0.21.0";
1516
-
1517
1351
  export {
1518
1352
  serializeSchema,
1519
1353
  ServiceSchema,
@@ -1524,7 +1358,6 @@ export {
1524
1358
  Ok,
1525
1359
  Err,
1526
1360
  createClient,
1527
- createServer,
1528
- version
1361
+ createServer
1529
1362
  };
1530
- //# sourceMappingURL=chunk-NFV77C2M.js.map
1363
+ //# sourceMappingURL=chunk-GCLEWC26.js.map