@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.
- package/dist/{chunk-D5PVGZPQ.js → chunk-5WFL722S.js} +15 -1
- package/dist/chunk-5WFL722S.js.map +1 -0
- package/dist/{chunk-NBE3D667.js → chunk-DT5JS6TM.js} +1 -0
- package/dist/chunk-DT5JS6TM.js.map +1 -0
- package/dist/{chunk-ZWPEZS27.js → chunk-HGBAUTIW.js} +2 -1
- package/dist/chunk-HGBAUTIW.js.map +1 -0
- package/dist/{chunk-YFPVQTWL.js → chunk-NYOK5VKK.js} +385 -246
- package/dist/chunk-NYOK5VKK.js.map +1 -0
- package/dist/{chunk-GZ7HCLLM.js → chunk-XAG3SC7R.js} +1 -0
- package/dist/chunk-XAG3SC7R.js.map +1 -0
- package/dist/{chunk-SR4DBLJ6.js → chunk-YB5LRYL6.js} +518 -260
- package/dist/chunk-YB5LRYL6.js.map +1 -0
- package/dist/{chunk-JH275HID.js → chunk-ZIWOHAQM.js} +2 -1
- package/dist/chunk-ZIWOHAQM.js.map +1 -0
- package/dist/codec/index.cjs +1 -0
- package/dist/codec/index.cjs.map +1 -0
- package/dist/codec/index.js +2 -1
- package/dist/codec/index.js.map +1 -0
- 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.cjs +1 -0
- package/dist/logging/index.cjs.map +1 -0
- package/dist/logging/index.d.cts +1 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.js +2 -1
- package/dist/logging/index.js.map +1 -0
- package/dist/router/index.cjs +515 -257
- package/dist/router/index.cjs.map +1 -0
- package/dist/router/index.d.cts +4 -4
- package/dist/router/index.d.ts +4 -4
- package/dist/router/index.js +4 -3
- package/dist/router/index.js.map +1 -0
- 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 +151 -74
- package/dist/transport/impls/uds/client.cjs.map +1 -0
- 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 +6 -5
- package/dist/transport/impls/uds/client.js.map +1 -0
- package/dist/transport/impls/uds/server.cjs +250 -169
- package/dist/transport/impls/uds/server.cjs.map +1 -0
- 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 +6 -5
- package/dist/transport/impls/uds/server.js.map +1 -0
- package/dist/transport/impls/ws/client.cjs +151 -74
- package/dist/transport/impls/ws/client.cjs.map +1 -0
- 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 +6 -5
- package/dist/transport/impls/ws/client.js.map +1 -0
- package/dist/transport/impls/ws/server.cjs +250 -169
- package/dist/transport/impls/ws/server.cjs.map +1 -0
- 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 +6 -5
- package/dist/transport/impls/ws/server.js.map +1 -0
- package/dist/transport/index.cjs +388 -243
- package/dist/transport/index.cjs.map +1 -0
- package/dist/transport/index.d.cts +3 -2
- package/dist/transport/index.d.ts +3 -2
- package/dist/transport/index.js +5 -4
- package/dist/transport/index.js.map +1 -0
- package/dist/util/testHelpers.cjs +2 -0
- package/dist/util/testHelpers.cjs.map +1 -0
- package/dist/util/testHelpers.d.cts +2 -2
- package/dist/util/testHelpers.d.ts +2 -2
- package/dist/util/testHelpers.js +6 -5
- package/dist/util/testHelpers.js.map +1 -0
- package/package.json +2 -1
package/dist/router/index.cjs
CHANGED
|
@@ -322,6 +322,9 @@ var Procedure = {
|
|
|
322
322
|
stream
|
|
323
323
|
};
|
|
324
324
|
|
|
325
|
+
// router/client.ts
|
|
326
|
+
var import_api2 = require("@opentelemetry/api");
|
|
327
|
+
|
|
325
328
|
// node_modules/p-defer/index.js
|
|
326
329
|
function pDefer() {
|
|
327
330
|
const deferred = {};
|
|
@@ -617,6 +620,12 @@ var TransportMessageSchema = (t) => import_typebox3.Type.Object({
|
|
|
617
620
|
procedureName: import_typebox3.Type.Optional(import_typebox3.Type.String()),
|
|
618
621
|
streamId: import_typebox3.Type.String(),
|
|
619
622
|
controlFlags: import_typebox3.Type.Integer(),
|
|
623
|
+
tracing: import_typebox3.Type.Optional(
|
|
624
|
+
import_typebox3.Type.Object({
|
|
625
|
+
traceparent: import_typebox3.Type.String(),
|
|
626
|
+
tracestate: import_typebox3.Type.String()
|
|
627
|
+
})
|
|
628
|
+
),
|
|
620
629
|
payload: t
|
|
621
630
|
});
|
|
622
631
|
var ControlMessageAckSchema = import_typebox3.Type.Object({
|
|
@@ -696,6 +705,11 @@ function Err(error) {
|
|
|
696
705
|
// logging/log.ts
|
|
697
706
|
var log = void 0;
|
|
698
707
|
|
|
708
|
+
// tracing/index.ts
|
|
709
|
+
var import_api = require("@opentelemetry/api");
|
|
710
|
+
var tracer = import_api.trace.getTracer("river");
|
|
711
|
+
var tracing_default = tracer;
|
|
712
|
+
|
|
699
713
|
// router/client.ts
|
|
700
714
|
var noop = () => {
|
|
701
715
|
};
|
|
@@ -767,220 +781,318 @@ function createSessionDisconnectHandler(from, cb) {
|
|
|
767
781
|
}
|
|
768
782
|
function handleRpc(transport, serverId, input, serviceName, procedureName) {
|
|
769
783
|
const streamId = (0, import_nanoid2.nanoid)();
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
);
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
784
|
+
return tracing_default.startActiveSpan(
|
|
785
|
+
`${serviceName}.${procedureName}`,
|
|
786
|
+
{
|
|
787
|
+
attributes: {
|
|
788
|
+
component: "river",
|
|
789
|
+
"river.method.kind": "rpc",
|
|
790
|
+
"river.method.service": serviceName,
|
|
791
|
+
"river.method.name": procedureName,
|
|
792
|
+
"river.streamId": streamId,
|
|
793
|
+
"span.kind": "client"
|
|
794
|
+
},
|
|
795
|
+
kind: import_api2.SpanKind.CLIENT
|
|
796
|
+
},
|
|
797
|
+
(span) => {
|
|
798
|
+
const tracing = { traceparent: "", tracestate: "" };
|
|
799
|
+
import_api2.propagation.inject(import_api2.context.active(), tracing);
|
|
800
|
+
transport.send(serverId, {
|
|
801
|
+
streamId,
|
|
802
|
+
serviceName,
|
|
803
|
+
procedureName,
|
|
804
|
+
tracing,
|
|
805
|
+
payload: input,
|
|
806
|
+
controlFlags: 2 /* StreamOpenBit */ | 4 /* StreamClosedBit */
|
|
807
|
+
});
|
|
808
|
+
const responsePromise = new Promise((resolve) => {
|
|
809
|
+
const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
|
|
810
|
+
span.setStatus({ code: import_api2.SpanStatusCode.ERROR });
|
|
811
|
+
cleanup();
|
|
812
|
+
resolve(
|
|
813
|
+
Err({
|
|
814
|
+
code: UNEXPECTED_DISCONNECT,
|
|
815
|
+
message: `${serverId} unexpectedly disconnected`
|
|
816
|
+
})
|
|
817
|
+
);
|
|
818
|
+
});
|
|
819
|
+
function cleanup() {
|
|
820
|
+
transport.removeEventListener("message", onMessage);
|
|
821
|
+
transport.removeEventListener("sessionStatus", onSessionStatus);
|
|
822
|
+
span.end();
|
|
823
|
+
}
|
|
824
|
+
function onMessage(msg) {
|
|
825
|
+
if (msg.streamId !== streamId)
|
|
826
|
+
return;
|
|
827
|
+
if (msg.to !== transport.clientId)
|
|
828
|
+
return;
|
|
829
|
+
if (msg.payload && typeof msg.payload === "object" && "ok" in msg.payload) {
|
|
830
|
+
span.setStatus({
|
|
831
|
+
code: msg.payload.ok ? import_api2.SpanStatusCode.OK : import_api2.SpanStatusCode.ERROR
|
|
832
|
+
});
|
|
833
|
+
}
|
|
834
|
+
cleanup();
|
|
835
|
+
resolve(msg.payload);
|
|
836
|
+
}
|
|
837
|
+
transport.addEventListener("message", onMessage);
|
|
838
|
+
transport.addEventListener("sessionStatus", onSessionStatus);
|
|
839
|
+
});
|
|
840
|
+
return responsePromise;
|
|
798
841
|
}
|
|
799
|
-
|
|
800
|
-
transport.addEventListener("sessionStatus", onSessionStatus);
|
|
801
|
-
});
|
|
802
|
-
return responsePromise;
|
|
842
|
+
);
|
|
803
843
|
}
|
|
804
844
|
function handleStream(transport, serverId, init, serviceName, procedureName) {
|
|
805
845
|
const streamId = (0, import_nanoid2.nanoid)();
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
const
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
846
|
+
return tracing_default.startActiveSpan(
|
|
847
|
+
`${serviceName}.${procedureName}`,
|
|
848
|
+
{
|
|
849
|
+
attributes: {
|
|
850
|
+
component: "river",
|
|
851
|
+
"river.method.kind": init ? "stream-with-init" : "stream",
|
|
852
|
+
"river.method.service": serviceName,
|
|
853
|
+
"river.method.name": procedureName,
|
|
854
|
+
"river.streamId": streamId,
|
|
855
|
+
"span.kind": "client"
|
|
856
|
+
},
|
|
857
|
+
kind: import_api2.SpanKind.CLIENT
|
|
858
|
+
},
|
|
859
|
+
(span) => {
|
|
860
|
+
const tracing = { traceparent: "", tracestate: "" };
|
|
861
|
+
import_api2.propagation.inject(import_api2.context.active(), tracing);
|
|
862
|
+
const inputStream = pushable({ objectMode: true });
|
|
863
|
+
const outputStream = pushable({ objectMode: true });
|
|
864
|
+
let firstMessage = true;
|
|
865
|
+
let healthyClose = true;
|
|
866
|
+
if (init) {
|
|
867
|
+
transport.send(serverId, {
|
|
868
|
+
streamId,
|
|
869
|
+
serviceName,
|
|
870
|
+
procedureName,
|
|
871
|
+
tracing,
|
|
872
|
+
payload: init,
|
|
873
|
+
controlFlags: 2 /* StreamOpenBit */
|
|
874
|
+
});
|
|
831
875
|
firstMessage = false;
|
|
832
876
|
}
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
877
|
+
const pipeInputToTransport = async () => {
|
|
878
|
+
for await (const rawIn of inputStream) {
|
|
879
|
+
const m = {
|
|
880
|
+
streamId,
|
|
881
|
+
payload: rawIn,
|
|
882
|
+
controlFlags: 0
|
|
883
|
+
};
|
|
884
|
+
if (firstMessage) {
|
|
885
|
+
m.serviceName = serviceName;
|
|
886
|
+
m.procedureName = procedureName;
|
|
887
|
+
m.tracing = tracing;
|
|
888
|
+
m.controlFlags |= 2 /* StreamOpenBit */;
|
|
889
|
+
firstMessage = false;
|
|
890
|
+
}
|
|
891
|
+
transport.send(serverId, m);
|
|
892
|
+
}
|
|
893
|
+
if (!healthyClose)
|
|
894
|
+
return;
|
|
895
|
+
transport.sendCloseStream(serverId, streamId);
|
|
896
|
+
span.setStatus({ code: import_api2.SpanStatusCode.OK });
|
|
897
|
+
};
|
|
898
|
+
void pipeInputToTransport();
|
|
899
|
+
function onMessage(msg) {
|
|
900
|
+
if (msg.streamId !== streamId)
|
|
901
|
+
return;
|
|
902
|
+
if (msg.to !== transport.clientId)
|
|
903
|
+
return;
|
|
904
|
+
if (isStreamClose(msg.controlFlags)) {
|
|
905
|
+
cleanup();
|
|
906
|
+
} else {
|
|
907
|
+
outputStream.push(msg.payload);
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
function cleanup() {
|
|
911
|
+
inputStream.end();
|
|
912
|
+
outputStream.end();
|
|
913
|
+
transport.removeEventListener("message", onMessage);
|
|
914
|
+
transport.removeEventListener("sessionStatus", onSessionStatus);
|
|
915
|
+
span.end();
|
|
916
|
+
}
|
|
917
|
+
const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
|
|
918
|
+
outputStream.push(
|
|
919
|
+
Err({
|
|
920
|
+
code: UNEXPECTED_DISCONNECT,
|
|
921
|
+
message: `${serverId} unexpectedly disconnected`
|
|
922
|
+
})
|
|
923
|
+
);
|
|
924
|
+
healthyClose = false;
|
|
925
|
+
span.setStatus({ code: import_api2.SpanStatusCode.ERROR });
|
|
926
|
+
cleanup();
|
|
927
|
+
});
|
|
928
|
+
transport.addEventListener("message", onMessage);
|
|
929
|
+
transport.addEventListener("sessionStatus", onSessionStatus);
|
|
930
|
+
return [inputStream, outputStream, cleanup];
|
|
849
931
|
}
|
|
850
|
-
|
|
851
|
-
function cleanup() {
|
|
852
|
-
inputStream.end();
|
|
853
|
-
outputStream.end();
|
|
854
|
-
transport.removeEventListener("message", onMessage);
|
|
855
|
-
transport.removeEventListener("sessionStatus", onSessionStatus);
|
|
856
|
-
}
|
|
857
|
-
const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
|
|
858
|
-
outputStream.push(
|
|
859
|
-
Err({
|
|
860
|
-
code: UNEXPECTED_DISCONNECT,
|
|
861
|
-
message: `${serverId} unexpectedly disconnected`
|
|
862
|
-
})
|
|
863
|
-
);
|
|
864
|
-
healthyClose = false;
|
|
865
|
-
cleanup();
|
|
866
|
-
});
|
|
867
|
-
transport.addEventListener("message", onMessage);
|
|
868
|
-
transport.addEventListener("sessionStatus", onSessionStatus);
|
|
869
|
-
return [inputStream, outputStream, cleanup];
|
|
932
|
+
);
|
|
870
933
|
}
|
|
871
934
|
function handleSubscribe(transport, serverId, input, serviceName, procedureName) {
|
|
872
935
|
const streamId = (0, import_nanoid2.nanoid)();
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
936
|
+
return tracing_default.startActiveSpan(
|
|
937
|
+
`${serviceName}.${procedureName}`,
|
|
938
|
+
{
|
|
939
|
+
attributes: {
|
|
940
|
+
component: "river",
|
|
941
|
+
"river.method.kind": "subscribe",
|
|
942
|
+
"river.method.service": serviceName,
|
|
943
|
+
"river.method.name": procedureName,
|
|
944
|
+
"river.streamId": streamId,
|
|
945
|
+
"span.kind": "client"
|
|
946
|
+
},
|
|
947
|
+
kind: import_api2.SpanKind.CLIENT
|
|
948
|
+
},
|
|
949
|
+
(span) => {
|
|
950
|
+
const tracing = { traceparent: "", tracestate: "" };
|
|
951
|
+
import_api2.propagation.inject(import_api2.context.active(), tracing);
|
|
952
|
+
transport.send(serverId, {
|
|
953
|
+
streamId,
|
|
954
|
+
serviceName,
|
|
955
|
+
procedureName,
|
|
956
|
+
tracing,
|
|
957
|
+
payload: input,
|
|
958
|
+
controlFlags: 2 /* StreamOpenBit */
|
|
959
|
+
});
|
|
960
|
+
let healthyClose = true;
|
|
961
|
+
const outputStream = pushable({ objectMode: true });
|
|
962
|
+
function onMessage(msg) {
|
|
963
|
+
if (msg.streamId !== streamId)
|
|
964
|
+
return;
|
|
965
|
+
if (msg.to !== transport.clientId)
|
|
966
|
+
return;
|
|
967
|
+
if (isStreamClose(msg.controlFlags)) {
|
|
968
|
+
cleanup();
|
|
969
|
+
} else {
|
|
970
|
+
outputStream.push(msg.payload);
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
function cleanup() {
|
|
974
|
+
outputStream.end();
|
|
975
|
+
transport.removeEventListener("message", onMessage);
|
|
976
|
+
transport.removeEventListener("sessionStatus", onSessionStatus);
|
|
977
|
+
span.end();
|
|
978
|
+
}
|
|
979
|
+
const closeHandler = () => {
|
|
980
|
+
cleanup();
|
|
981
|
+
if (!healthyClose)
|
|
982
|
+
return;
|
|
983
|
+
transport.sendCloseStream(serverId, streamId);
|
|
984
|
+
};
|
|
985
|
+
const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
|
|
986
|
+
outputStream.push(
|
|
987
|
+
Err({
|
|
988
|
+
code: UNEXPECTED_DISCONNECT,
|
|
989
|
+
message: `${serverId} unexpectedly disconnected`
|
|
990
|
+
})
|
|
991
|
+
);
|
|
992
|
+
healthyClose = false;
|
|
993
|
+
span.setStatus({ code: import_api2.SpanStatusCode.ERROR });
|
|
994
|
+
cleanup();
|
|
995
|
+
});
|
|
996
|
+
transport.addEventListener("message", onMessage);
|
|
997
|
+
transport.addEventListener("sessionStatus", onSessionStatus);
|
|
998
|
+
return [outputStream, closeHandler];
|
|
891
999
|
}
|
|
892
|
-
|
|
893
|
-
function cleanup() {
|
|
894
|
-
outputStream.end();
|
|
895
|
-
transport.removeEventListener("message", onMessage);
|
|
896
|
-
transport.removeEventListener("sessionStatus", onSessionStatus);
|
|
897
|
-
}
|
|
898
|
-
const closeHandler = () => {
|
|
899
|
-
cleanup();
|
|
900
|
-
if (!healthyClose)
|
|
901
|
-
return;
|
|
902
|
-
transport.sendCloseStream(serverId, streamId);
|
|
903
|
-
};
|
|
904
|
-
const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
|
|
905
|
-
outputStream.push(
|
|
906
|
-
Err({
|
|
907
|
-
code: UNEXPECTED_DISCONNECT,
|
|
908
|
-
message: `${serverId} unexpectedly disconnected`
|
|
909
|
-
})
|
|
910
|
-
);
|
|
911
|
-
healthyClose = false;
|
|
912
|
-
cleanup();
|
|
913
|
-
});
|
|
914
|
-
transport.addEventListener("message", onMessage);
|
|
915
|
-
transport.addEventListener("sessionStatus", onSessionStatus);
|
|
916
|
-
return [outputStream, closeHandler];
|
|
1000
|
+
);
|
|
917
1001
|
}
|
|
918
1002
|
function handleUpload(transport, serverId, init, serviceName, procedureName) {
|
|
919
1003
|
const streamId = (0, import_nanoid2.nanoid)();
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
1004
|
+
return tracing_default.startActiveSpan(
|
|
1005
|
+
`${serviceName}.${procedureName}`,
|
|
1006
|
+
{
|
|
1007
|
+
attributes: {
|
|
1008
|
+
component: "river",
|
|
1009
|
+
"river.method.kind": init ? "upload-with-init" : "upload",
|
|
1010
|
+
"river.method.service": serviceName,
|
|
1011
|
+
"river.method.name": procedureName,
|
|
1012
|
+
"river.streamId": streamId,
|
|
1013
|
+
"span.kind": "client"
|
|
1014
|
+
},
|
|
1015
|
+
kind: import_api2.SpanKind.CLIENT
|
|
1016
|
+
},
|
|
1017
|
+
(span) => {
|
|
1018
|
+
const tracing = { traceparent: "", tracestate: "" };
|
|
1019
|
+
import_api2.propagation.inject(import_api2.context.active(), tracing);
|
|
1020
|
+
const inputStream = pushable({ objectMode: true });
|
|
1021
|
+
let firstMessage = true;
|
|
1022
|
+
let healthyClose = true;
|
|
1023
|
+
if (init) {
|
|
1024
|
+
transport.send(serverId, {
|
|
1025
|
+
streamId,
|
|
1026
|
+
serviceName,
|
|
1027
|
+
procedureName,
|
|
1028
|
+
tracing,
|
|
1029
|
+
payload: init,
|
|
1030
|
+
controlFlags: 2 /* StreamOpenBit */
|
|
1031
|
+
});
|
|
944
1032
|
firstMessage = false;
|
|
945
1033
|
}
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
}
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
1034
|
+
const pipeInputToTransport = async () => {
|
|
1035
|
+
for await (const rawIn of inputStream) {
|
|
1036
|
+
const m = {
|
|
1037
|
+
streamId,
|
|
1038
|
+
payload: rawIn,
|
|
1039
|
+
controlFlags: 0
|
|
1040
|
+
};
|
|
1041
|
+
if (firstMessage) {
|
|
1042
|
+
m.serviceName = serviceName;
|
|
1043
|
+
m.procedureName = procedureName;
|
|
1044
|
+
m.tracing = tracing;
|
|
1045
|
+
m.controlFlags |= 2 /* StreamOpenBit */;
|
|
1046
|
+
firstMessage = false;
|
|
1047
|
+
}
|
|
1048
|
+
transport.send(serverId, m);
|
|
1049
|
+
}
|
|
1050
|
+
if (!healthyClose)
|
|
1051
|
+
return;
|
|
1052
|
+
transport.sendCloseStream(serverId, streamId);
|
|
1053
|
+
};
|
|
1054
|
+
void pipeInputToTransport();
|
|
1055
|
+
const responsePromise = new Promise((resolve) => {
|
|
1056
|
+
const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
|
|
1057
|
+
healthyClose = false;
|
|
1058
|
+
span.setStatus({ code: import_api2.SpanStatusCode.ERROR });
|
|
1059
|
+
cleanup();
|
|
1060
|
+
resolve(
|
|
1061
|
+
Err({
|
|
1062
|
+
code: UNEXPECTED_DISCONNECT,
|
|
1063
|
+
message: `${serverId} unexpectedly disconnected`
|
|
1064
|
+
})
|
|
1065
|
+
);
|
|
1066
|
+
});
|
|
1067
|
+
function cleanup() {
|
|
1068
|
+
inputStream.end();
|
|
1069
|
+
transport.removeEventListener("message", onMessage);
|
|
1070
|
+
transport.removeEventListener("sessionStatus", onSessionStatus);
|
|
1071
|
+
span.end();
|
|
1072
|
+
}
|
|
1073
|
+
function onMessage(msg) {
|
|
1074
|
+
if (msg.streamId !== streamId)
|
|
1075
|
+
return;
|
|
1076
|
+
if (msg.to !== transport.clientId)
|
|
1077
|
+
return;
|
|
1078
|
+
if (msg.payload && typeof msg.payload === "object" && "ok" in msg.payload) {
|
|
1079
|
+
span.setStatus({
|
|
1080
|
+
code: msg.payload.ok ? import_api2.SpanStatusCode.OK : import_api2.SpanStatusCode.ERROR
|
|
1081
|
+
});
|
|
1082
|
+
}
|
|
1083
|
+
cleanup();
|
|
1084
|
+
resolve(msg.payload);
|
|
1085
|
+
}
|
|
1086
|
+
transport.addEventListener("message", onMessage);
|
|
1087
|
+
transport.addEventListener("sessionStatus", onSessionStatus);
|
|
1088
|
+
});
|
|
1089
|
+
return [inputStream, responsePromise];
|
|
976
1090
|
}
|
|
977
|
-
|
|
978
|
-
transport.addEventListener("sessionStatus", onSessionStatus);
|
|
979
|
-
});
|
|
980
|
-
return [inputStream, responsePromise];
|
|
1091
|
+
);
|
|
981
1092
|
}
|
|
982
1093
|
|
|
983
1094
|
// router/server.ts
|
|
1095
|
+
var import_api3 = require("@opentelemetry/api");
|
|
984
1096
|
var import_value = require("@sinclair/typebox/value");
|
|
985
1097
|
|
|
986
1098
|
// util/stringify.ts
|
|
@@ -1062,9 +1174,9 @@ var RiverServer = class {
|
|
|
1062
1174
|
this.transport.removeEventListener("message", this.onMessage);
|
|
1063
1175
|
this.transport.removeEventListener("sessionStatus", this.onSessionStatus);
|
|
1064
1176
|
await Promise.all([...this.streamMap.keys()].map(this.cleanupStream));
|
|
1065
|
-
for (const
|
|
1066
|
-
if (Symbol.dispose in
|
|
1067
|
-
const dispose =
|
|
1177
|
+
for (const context3 of this.contextMap.values()) {
|
|
1178
|
+
if (Symbol.dispose in context3.state) {
|
|
1179
|
+
const dispose = context3.state[Symbol.dispose];
|
|
1068
1180
|
if (typeof dispose === "function") {
|
|
1069
1181
|
dispose();
|
|
1070
1182
|
}
|
|
@@ -1093,6 +1205,10 @@ var RiverServer = class {
|
|
|
1093
1205
|
});
|
|
1094
1206
|
return;
|
|
1095
1207
|
}
|
|
1208
|
+
let activeContext = import_api3.context.active();
|
|
1209
|
+
if (message.tracing) {
|
|
1210
|
+
activeContext = import_api3.propagation.extract(activeContext, message.tracing);
|
|
1211
|
+
}
|
|
1096
1212
|
const service = this.services[message.serviceName];
|
|
1097
1213
|
const serviceContext = this.getContext(service, message.serviceName);
|
|
1098
1214
|
if (!(message.procedureName in service.procedures)) {
|
|
@@ -1150,12 +1266,18 @@ var RiverServer = class {
|
|
|
1150
1266
|
})()
|
|
1151
1267
|
)
|
|
1152
1268
|
);
|
|
1153
|
-
const errorHandler = (err) => {
|
|
1269
|
+
const errorHandler = (err, span) => {
|
|
1154
1270
|
const errorMsg = coerceErrorString(err);
|
|
1155
1271
|
log?.error(
|
|
1156
1272
|
`procedure ${message.serviceName}.${message.procedureName} threw an uncaught error: ${errorMsg}`,
|
|
1157
1273
|
session.loggingMetadata
|
|
1158
1274
|
);
|
|
1275
|
+
if (err instanceof Error) {
|
|
1276
|
+
span.recordException(err);
|
|
1277
|
+
} else {
|
|
1278
|
+
span.recordException(errorMsg);
|
|
1279
|
+
}
|
|
1280
|
+
span.setStatus({ code: import_api3.SpanStatusCode.ERROR });
|
|
1159
1281
|
outgoing.push(
|
|
1160
1282
|
Err({
|
|
1161
1283
|
code: UNCAUGHT_ERROR,
|
|
@@ -1187,15 +1309,34 @@ var RiverServer = class {
|
|
|
1187
1309
|
if (inputMessage.done) {
|
|
1188
1310
|
return;
|
|
1189
1311
|
}
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1312
|
+
await tracing_default.startActiveSpan(
|
|
1313
|
+
`${message.serviceName}.${message.procedureName}`,
|
|
1314
|
+
{
|
|
1315
|
+
attributes: {
|
|
1316
|
+
component: "river",
|
|
1317
|
+
"river.method.kind": "rpc",
|
|
1318
|
+
"river.method.service": message.serviceName,
|
|
1319
|
+
"river.method.name": message.procedureName,
|
|
1320
|
+
"river.streamId": message.streamId,
|
|
1321
|
+
"span.kind": "server"
|
|
1322
|
+
},
|
|
1323
|
+
kind: import_api3.SpanKind.SERVER
|
|
1324
|
+
},
|
|
1325
|
+
activeContext,
|
|
1326
|
+
async (span) => {
|
|
1327
|
+
try {
|
|
1328
|
+
const outputMessage = await procedure.handler(
|
|
1329
|
+
serviceContextWithTransportInfo,
|
|
1330
|
+
inputMessage.value
|
|
1331
|
+
);
|
|
1332
|
+
outgoing.push(outputMessage);
|
|
1333
|
+
} catch (err) {
|
|
1334
|
+
errorHandler(err, span);
|
|
1335
|
+
} finally {
|
|
1336
|
+
span.end();
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
);
|
|
1199
1340
|
})();
|
|
1200
1341
|
break;
|
|
1201
1342
|
case "stream":
|
|
@@ -1205,22 +1346,79 @@ var RiverServer = class {
|
|
|
1205
1346
|
if (initMessage.done) {
|
|
1206
1347
|
return;
|
|
1207
1348
|
}
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1349
|
+
await tracing_default.startActiveSpan(
|
|
1350
|
+
`${message.serviceName}.${message.procedureName}`,
|
|
1351
|
+
{
|
|
1352
|
+
attributes: {
|
|
1353
|
+
component: "river",
|
|
1354
|
+
"river.method.kind": "stream-with-init",
|
|
1355
|
+
"river.method.service": message.serviceName,
|
|
1356
|
+
"river.method.name": message.procedureName,
|
|
1357
|
+
"river.streamId": message.streamId,
|
|
1358
|
+
"span.kind": "server"
|
|
1359
|
+
},
|
|
1360
|
+
kind: import_api3.SpanKind.SERVER
|
|
1361
|
+
},
|
|
1362
|
+
activeContext,
|
|
1363
|
+
async (span) => {
|
|
1364
|
+
try {
|
|
1365
|
+
const dispose = await procedure.handler(
|
|
1366
|
+
serviceContextWithTransportInfo,
|
|
1367
|
+
initMessage.value,
|
|
1368
|
+
incoming,
|
|
1369
|
+
outgoing
|
|
1370
|
+
);
|
|
1371
|
+
if (dispose) {
|
|
1372
|
+
disposables.push(() => {
|
|
1373
|
+
dispose();
|
|
1374
|
+
span.end();
|
|
1375
|
+
});
|
|
1376
|
+
} else {
|
|
1377
|
+
span.end();
|
|
1378
|
+
}
|
|
1379
|
+
} catch (err) {
|
|
1380
|
+
errorHandler(err, span);
|
|
1381
|
+
span.end();
|
|
1382
|
+
}
|
|
1217
1383
|
}
|
|
1218
|
-
|
|
1219
|
-
errorHandler(err);
|
|
1220
|
-
}
|
|
1384
|
+
);
|
|
1221
1385
|
})();
|
|
1222
1386
|
} else {
|
|
1223
|
-
inputHandler =
|
|
1387
|
+
inputHandler = tracing_default.startActiveSpan(
|
|
1388
|
+
`${message.serviceName}.${message.procedureName}`,
|
|
1389
|
+
{
|
|
1390
|
+
attributes: {
|
|
1391
|
+
component: "river",
|
|
1392
|
+
"river.method.kind": "stream",
|
|
1393
|
+
"river.method.service": message.serviceName,
|
|
1394
|
+
"river.method.name": message.procedureName,
|
|
1395
|
+
"river.streamId": message.streamId,
|
|
1396
|
+
"span.kind": "server"
|
|
1397
|
+
},
|
|
1398
|
+
kind: import_api3.SpanKind.SERVER
|
|
1399
|
+
},
|
|
1400
|
+
activeContext,
|
|
1401
|
+
async (span) => {
|
|
1402
|
+
try {
|
|
1403
|
+
const dispose = await procedure.handler(
|
|
1404
|
+
serviceContextWithTransportInfo,
|
|
1405
|
+
incoming,
|
|
1406
|
+
outgoing
|
|
1407
|
+
);
|
|
1408
|
+
if (dispose) {
|
|
1409
|
+
disposables.push(() => {
|
|
1410
|
+
dispose();
|
|
1411
|
+
span.end();
|
|
1412
|
+
});
|
|
1413
|
+
} else {
|
|
1414
|
+
span.end();
|
|
1415
|
+
}
|
|
1416
|
+
} catch (err) {
|
|
1417
|
+
errorHandler(err, span);
|
|
1418
|
+
span.end();
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
);
|
|
1224
1422
|
}
|
|
1225
1423
|
break;
|
|
1226
1424
|
case "subscription":
|
|
@@ -1229,18 +1427,41 @@ var RiverServer = class {
|
|
|
1229
1427
|
if (inputMessage.done) {
|
|
1230
1428
|
return;
|
|
1231
1429
|
}
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1430
|
+
await tracing_default.startActiveSpan(
|
|
1431
|
+
`${message.serviceName}.${message.procedureName}`,
|
|
1432
|
+
{
|
|
1433
|
+
attributes: {
|
|
1434
|
+
component: "river",
|
|
1435
|
+
"river.method.kind": "subscription",
|
|
1436
|
+
"river.method.service": message.serviceName,
|
|
1437
|
+
"river.method.name": message.procedureName,
|
|
1438
|
+
"river.streamId": message.streamId,
|
|
1439
|
+
"span.kind": "server"
|
|
1440
|
+
},
|
|
1441
|
+
kind: import_api3.SpanKind.SERVER
|
|
1442
|
+
},
|
|
1443
|
+
activeContext,
|
|
1444
|
+
async (span) => {
|
|
1445
|
+
try {
|
|
1446
|
+
const dispose = await procedure.handler(
|
|
1447
|
+
serviceContextWithTransportInfo,
|
|
1448
|
+
inputMessage.value,
|
|
1449
|
+
outgoing
|
|
1450
|
+
);
|
|
1451
|
+
if (dispose) {
|
|
1452
|
+
disposables.push(() => {
|
|
1453
|
+
dispose();
|
|
1454
|
+
span.end();
|
|
1455
|
+
});
|
|
1456
|
+
} else {
|
|
1457
|
+
span.end();
|
|
1458
|
+
}
|
|
1459
|
+
} catch (err) {
|
|
1460
|
+
errorHandler(err, span);
|
|
1461
|
+
span.end();
|
|
1462
|
+
}
|
|
1240
1463
|
}
|
|
1241
|
-
|
|
1242
|
-
errorHandler(err);
|
|
1243
|
-
}
|
|
1464
|
+
);
|
|
1244
1465
|
})();
|
|
1245
1466
|
break;
|
|
1246
1467
|
case "upload":
|
|
@@ -1250,33 +1471,69 @@ var RiverServer = class {
|
|
|
1250
1471
|
if (initMessage.done) {
|
|
1251
1472
|
return;
|
|
1252
1473
|
}
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1474
|
+
await tracing_default.startActiveSpan(
|
|
1475
|
+
`${message.serviceName}.${message.procedureName}`,
|
|
1476
|
+
{
|
|
1477
|
+
attributes: {
|
|
1478
|
+
component: "river",
|
|
1479
|
+
"river.method.kind": "upload-with-init",
|
|
1480
|
+
"river.method.service": message.serviceName,
|
|
1481
|
+
"river.method.name": message.procedureName,
|
|
1482
|
+
"river.streamId": message.streamId,
|
|
1483
|
+
"span.kind": "server"
|
|
1484
|
+
},
|
|
1485
|
+
kind: import_api3.SpanKind.SERVER
|
|
1486
|
+
},
|
|
1487
|
+
activeContext,
|
|
1488
|
+
async (span) => {
|
|
1489
|
+
try {
|
|
1490
|
+
const outputMessage = await procedure.handler(
|
|
1491
|
+
serviceContextWithTransportInfo,
|
|
1492
|
+
initMessage.value,
|
|
1493
|
+
incoming
|
|
1494
|
+
);
|
|
1495
|
+
if (!this.disconnectedSessions.has(message.from)) {
|
|
1496
|
+
outgoing.push(outputMessage);
|
|
1497
|
+
}
|
|
1498
|
+
} catch (err) {
|
|
1499
|
+
errorHandler(err, span);
|
|
1500
|
+
} finally {
|
|
1501
|
+
span.end();
|
|
1502
|
+
}
|
|
1261
1503
|
}
|
|
1262
|
-
|
|
1263
|
-
errorHandler(err);
|
|
1264
|
-
}
|
|
1504
|
+
);
|
|
1265
1505
|
})();
|
|
1266
1506
|
} else {
|
|
1267
|
-
inputHandler = (
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1507
|
+
inputHandler = tracing_default.startActiveSpan(
|
|
1508
|
+
`${message.serviceName}.${message.procedureName}`,
|
|
1509
|
+
{
|
|
1510
|
+
attributes: {
|
|
1511
|
+
component: "river",
|
|
1512
|
+
"river.method.kind": "upload",
|
|
1513
|
+
"river.method.service": message.serviceName,
|
|
1514
|
+
"river.method.name": message.procedureName,
|
|
1515
|
+
"river.streamId": message.streamId,
|
|
1516
|
+
"span.kind": "server"
|
|
1517
|
+
},
|
|
1518
|
+
kind: import_api3.SpanKind.SERVER
|
|
1519
|
+
},
|
|
1520
|
+
activeContext,
|
|
1521
|
+
async (span) => {
|
|
1522
|
+
try {
|
|
1523
|
+
const outputMessage = await procedure.handler(
|
|
1524
|
+
serviceContextWithTransportInfo,
|
|
1525
|
+
incoming
|
|
1526
|
+
);
|
|
1527
|
+
if (!this.disconnectedSessions.has(message.from)) {
|
|
1528
|
+
outgoing.push(outputMessage);
|
|
1529
|
+
}
|
|
1530
|
+
} catch (err) {
|
|
1531
|
+
errorHandler(err, span);
|
|
1532
|
+
} finally {
|
|
1533
|
+
span.end();
|
|
1275
1534
|
}
|
|
1276
|
-
} catch (err) {
|
|
1277
|
-
errorHandler(err);
|
|
1278
1535
|
}
|
|
1279
|
-
|
|
1536
|
+
);
|
|
1280
1537
|
}
|
|
1281
1538
|
break;
|
|
1282
1539
|
default:
|
|
@@ -1326,15 +1583,15 @@ var RiverServer = class {
|
|
|
1326
1583
|
}
|
|
1327
1584
|
}
|
|
1328
1585
|
getContext(service, serviceName) {
|
|
1329
|
-
const
|
|
1330
|
-
if (!
|
|
1586
|
+
const context3 = this.contextMap.get(service);
|
|
1587
|
+
if (!context3) {
|
|
1331
1588
|
const err = `no context found for ${serviceName}`;
|
|
1332
1589
|
log?.error(err, {
|
|
1333
1590
|
clientId: this.transport.clientId
|
|
1334
1591
|
});
|
|
1335
1592
|
throw new Error(err);
|
|
1336
1593
|
}
|
|
1337
|
-
return
|
|
1594
|
+
return context3;
|
|
1338
1595
|
}
|
|
1339
1596
|
cleanupStream = async (id) => {
|
|
1340
1597
|
const stream2 = this.streamMap.get(id);
|
|
@@ -1353,7 +1610,7 @@ function createServer(transport, services, extendedContext) {
|
|
|
1353
1610
|
}
|
|
1354
1611
|
|
|
1355
1612
|
// package.json
|
|
1356
|
-
var version = "0.
|
|
1613
|
+
var version = "0.20.0";
|
|
1357
1614
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1358
1615
|
0 && (module.exports = {
|
|
1359
1616
|
Err,
|
|
@@ -1367,3 +1624,4 @@ var version = "0.19.2";
|
|
|
1367
1624
|
createServer,
|
|
1368
1625
|
serializeSchema
|
|
1369
1626
|
});
|
|
1627
|
+
//# sourceMappingURL=index.cjs.map
|