@replit/river 0.19.3 → 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.
- package/dist/{chunk-2Z2NE47H.js → chunk-5WFL722S.js} +15 -2
- package/dist/chunk-5WFL722S.js.map +1 -0
- package/dist/{chunk-LDCCELCJ.js → chunk-HGBAUTIW.js} +2 -2
- package/dist/{chunk-QZD2UTDJ.js → chunk-NYOK5VKK.js} +383 -245
- package/dist/chunk-NYOK5VKK.js.map +1 -0
- package/dist/{chunk-SLYSDRLE.js → chunk-YB5LRYL6.js} +517 -260
- package/dist/chunk-YB5LRYL6.js.map +1 -0
- package/dist/{chunk-YHKIWQOC.js → chunk-ZIWOHAQM.js} +2 -2
- package/dist/{connection-cfec12e6.d.ts → connection-d49d5d56.d.ts} +1 -1
- package/dist/{connection-aa0ea000.d.ts → connection-dba95bc8.d.ts} +1 -1
- package/dist/{index-e2513701.d.ts → index-3ac92295.d.ts} +12 -0
- package/dist/logging/index.d.cts +1 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/router/index.cjs +514 -257
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +4 -4
- package/dist/router/index.d.ts +4 -4
- package/dist/router/index.js +2 -2
- package/dist/{services-5fc5712d.d.ts → services-8496d6e8.d.ts} +1 -1
- package/dist/{services-4bba42d8.d.ts → services-abc077db.d.ts} +1 -1
- package/dist/transport/impls/uds/client.cjs +150 -74
- package/dist/transport/impls/uds/client.cjs.map +1 -1
- package/dist/transport/impls/uds/client.d.cts +2 -2
- package/dist/transport/impls/uds/client.d.ts +2 -2
- package/dist/transport/impls/uds/client.js +3 -3
- package/dist/transport/impls/uds/server.cjs +249 -169
- package/dist/transport/impls/uds/server.cjs.map +1 -1
- package/dist/transport/impls/uds/server.d.cts +2 -2
- package/dist/transport/impls/uds/server.d.ts +2 -2
- package/dist/transport/impls/uds/server.js +3 -3
- package/dist/transport/impls/ws/client.cjs +150 -74
- package/dist/transport/impls/ws/client.cjs.map +1 -1
- package/dist/transport/impls/ws/client.d.cts +2 -2
- package/dist/transport/impls/ws/client.d.ts +2 -2
- package/dist/transport/impls/ws/client.js +3 -3
- package/dist/transport/impls/ws/server.cjs +249 -169
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +2 -2
- package/dist/transport/impls/ws/server.d.ts +2 -2
- package/dist/transport/impls/ws/server.js +3 -3
- package/dist/transport/index.cjs +387 -243
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +3 -2
- package/dist/transport/index.d.ts +3 -2
- package/dist/transport/index.js +2 -2
- package/dist/util/testHelpers.cjs +1 -0
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +2 -2
- package/dist/util/testHelpers.d.ts +2 -2
- package/dist/util/testHelpers.js +3 -3
- package/package.json +2 -1
- package/dist/chunk-2Z2NE47H.js.map +0 -1
- package/dist/chunk-QZD2UTDJ.js.map +0 -1
- package/dist/chunk-SLYSDRLE.js.map +0 -1
- /package/dist/{chunk-LDCCELCJ.js.map → chunk-HGBAUTIW.js.map} +0 -0
- /package/dist/{chunk-YHKIWQOC.js.map → chunk-ZIWOHAQM.js.map} +0 -0
|
@@ -2,8 +2,9 @@ import {
|
|
|
2
2
|
ControlMessagePayloadSchema,
|
|
3
3
|
coerceErrorString,
|
|
4
4
|
isStreamClose,
|
|
5
|
-
isStreamOpen
|
|
6
|
-
|
|
5
|
+
isStreamOpen,
|
|
6
|
+
tracing_default
|
|
7
|
+
} from "./chunk-5WFL722S.js";
|
|
7
8
|
import {
|
|
8
9
|
log
|
|
9
10
|
} from "./chunk-DT5JS6TM.js";
|
|
@@ -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
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
);
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
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
|
-
|
|
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
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
const
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
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
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
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
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
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
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
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
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
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
|
-
|
|
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
|
|
968
|
-
if (Symbol.dispose in
|
|
969
|
-
const 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
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
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
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
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
|
-
|
|
1121
|
-
errorHandler(err);
|
|
1122
|
-
}
|
|
1286
|
+
);
|
|
1123
1287
|
})();
|
|
1124
1288
|
} else {
|
|
1125
|
-
inputHandler =
|
|
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
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
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
|
-
|
|
1165
|
-
errorHandler(err);
|
|
1166
|
-
}
|
|
1406
|
+
);
|
|
1167
1407
|
})();
|
|
1168
1408
|
} else {
|
|
1169
|
-
inputHandler = (
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
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
|
|
1232
|
-
if (!
|
|
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
|
|
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.
|
|
1515
|
+
var version = "0.20.0";
|
|
1259
1516
|
|
|
1260
1517
|
export {
|
|
1261
1518
|
serializeSchema,
|
|
@@ -1270,4 +1527,4 @@ export {
|
|
|
1270
1527
|
createServer,
|
|
1271
1528
|
version
|
|
1272
1529
|
};
|
|
1273
|
-
//# sourceMappingURL=chunk-
|
|
1530
|
+
//# sourceMappingURL=chunk-YB5LRYL6.js.map
|