@replit/river 0.200.0-rc.1 → 0.200.0-rc.2
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-W75HU4F6.js → chunk-47TFNAY2.js} +4 -4
- package/dist/{chunk-WQVOMUNR.js → chunk-4VNY34QG.js} +2 -2
- package/dist/{chunk-45HIR2AS.js → chunk-7CKIN3JT.js} +63 -52
- package/dist/chunk-7CKIN3JT.js.map +1 -0
- package/dist/{chunk-LH2VHMQM.js → chunk-CZP4LK3F.js} +4 -4
- package/dist/{chunk-EMIERCU7.js → chunk-DJCW3SKT.js} +2 -2
- package/dist/{chunk-75B5D7MR.js → chunk-NQWDT6GS.js} +2 -2
- package/dist/{chunk-AJBZUHSI.js → chunk-ONUXWVRC.js} +3 -3
- package/dist/{chunk-XLXRFSRB.js → chunk-S5RL45KH.js} +2 -2
- package/dist/{chunk-XLXRFSRB.js.map → chunk-S5RL45KH.js.map} +1 -1
- package/dist/{connection-0638316b.d.ts → connection-3f117047.d.ts} +1 -1
- package/dist/{connection-c6521735.d.ts → connection-f900e390.d.ts} +1 -1
- package/dist/router/index.cjs +62 -51
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +3 -3
- package/dist/router/index.d.ts +3 -3
- package/dist/router/index.js +2 -2
- package/dist/{services-34d97070.d.ts → services-970f97bb.d.ts} +6 -0
- package/dist/transport/impls/uds/client.cjs +1 -1
- 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 +5 -5
- package/dist/transport/impls/uds/server.cjs +1 -1
- 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 +5 -5
- package/dist/transport/impls/ws/client.cjs +1 -1
- 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 +5 -5
- package/dist/transport/impls/ws/server.cjs +1 -1
- 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 +5 -5
- package/dist/transport/index.cjs +1 -1
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +2 -2
- package/dist/transport/index.d.ts +2 -2
- package/dist/transport/index.js +5 -5
- package/dist/util/testHelpers.cjs +45 -32
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +1 -1
- package/dist/util/testHelpers.d.ts +1 -1
- package/dist/util/testHelpers.js +16 -18
- package/dist/util/testHelpers.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-45HIR2AS.js.map +0 -1
- /package/dist/{chunk-W75HU4F6.js.map → chunk-47TFNAY2.js.map} +0 -0
- /package/dist/{chunk-WQVOMUNR.js.map → chunk-4VNY34QG.js.map} +0 -0
- /package/dist/{chunk-LH2VHMQM.js.map → chunk-CZP4LK3F.js.map} +0 -0
- /package/dist/{chunk-EMIERCU7.js.map → chunk-DJCW3SKT.js.map} +0 -0
- /package/dist/{chunk-75B5D7MR.js.map → chunk-NQWDT6GS.js.map} +0 -0
- /package/dist/{chunk-AJBZUHSI.js.map → chunk-ONUXWVRC.js.map} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ProtocolError,
|
|
3
3
|
Transport
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ONUXWVRC.js";
|
|
5
5
|
import {
|
|
6
6
|
defaultClientTransportOptions
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-NQWDT6GS.js";
|
|
8
8
|
import {
|
|
9
9
|
ControlMessageHandshakeResponseSchema,
|
|
10
10
|
SESSION_STATE_MISMATCH,
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
getPropagationContext,
|
|
13
13
|
handshakeRequestMessage,
|
|
14
14
|
tracing_default
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-S5RL45KH.js";
|
|
16
16
|
|
|
17
17
|
// transport/client.ts
|
|
18
18
|
import { SpanStatusCode } from "@opentelemetry/api";
|
|
@@ -473,4 +473,4 @@ var ClientTransport = class extends Transport {
|
|
|
473
473
|
export {
|
|
474
474
|
ClientTransport
|
|
475
475
|
};
|
|
476
|
-
//# sourceMappingURL=chunk-
|
|
476
|
+
//# sourceMappingURL=chunk-47TFNAY2.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Connection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NQWDT6GS.js";
|
|
4
4
|
|
|
5
5
|
// transport/transforms/messageFraming.ts
|
|
6
6
|
import { Transform } from "node:stream";
|
|
@@ -103,4 +103,4 @@ var UdsConnection = class extends Connection {
|
|
|
103
103
|
export {
|
|
104
104
|
UdsConnection
|
|
105
105
|
};
|
|
106
|
-
//# sourceMappingURL=chunk-
|
|
106
|
+
//# sourceMappingURL=chunk-4VNY34QG.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
isStreamClose,
|
|
10
10
|
isStreamCloseRequest,
|
|
11
11
|
isStreamOpen
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-S5RL45KH.js";
|
|
13
13
|
|
|
14
14
|
// router/services.ts
|
|
15
15
|
import { Type } from "@sinclair/typebox";
|
|
@@ -900,26 +900,26 @@ var WriteStreamImpl = class {
|
|
|
900
900
|
* Passed via constructor to pass on write requests
|
|
901
901
|
*/
|
|
902
902
|
writeCb;
|
|
903
|
-
/**
|
|
904
|
-
* Passed via constructor to pass on close requests
|
|
905
|
-
*/
|
|
906
|
-
closeCb;
|
|
907
903
|
/**
|
|
908
904
|
* Whether the stream is closed.
|
|
909
905
|
*/
|
|
910
906
|
closed = false;
|
|
907
|
+
/**
|
|
908
|
+
* A list of listeners that will be called when the stream is closed.
|
|
909
|
+
*/
|
|
910
|
+
onCloseListeners;
|
|
911
911
|
/**
|
|
912
912
|
* Whether the reader has requested to close the stream.
|
|
913
913
|
*/
|
|
914
914
|
closeRequested = false;
|
|
915
915
|
/**
|
|
916
|
-
* A list of listeners that will be called when
|
|
916
|
+
* A list of listeners that will be called when a close request is triggered.
|
|
917
917
|
*/
|
|
918
|
-
|
|
919
|
-
constructor(writeCb
|
|
918
|
+
onCloseRequestListeners;
|
|
919
|
+
constructor(writeCb) {
|
|
920
920
|
this.writeCb = writeCb;
|
|
921
|
-
this.closeCb = closeCb;
|
|
922
921
|
this.onCloseListeners = /* @__PURE__ */ new Set();
|
|
922
|
+
this.onCloseRequestListeners = /* @__PURE__ */ new Set();
|
|
923
923
|
}
|
|
924
924
|
write(value) {
|
|
925
925
|
if (this.isClosed()) {
|
|
@@ -927,12 +927,26 @@ var WriteStreamImpl = class {
|
|
|
927
927
|
}
|
|
928
928
|
this.writeCb(value);
|
|
929
929
|
}
|
|
930
|
+
isClosed() {
|
|
931
|
+
return this.closed;
|
|
932
|
+
}
|
|
933
|
+
onClose(cb) {
|
|
934
|
+
if (this.isClosed()) {
|
|
935
|
+
cb();
|
|
936
|
+
return () => void 0;
|
|
937
|
+
}
|
|
938
|
+
this.onCloseListeners.add(cb);
|
|
939
|
+
return () => this.onCloseListeners.delete(cb);
|
|
940
|
+
}
|
|
930
941
|
close() {
|
|
931
942
|
if (this.isClosed()) {
|
|
932
943
|
return;
|
|
933
944
|
}
|
|
934
945
|
this.closed = true;
|
|
935
|
-
this.
|
|
946
|
+
this.onCloseListeners.forEach((cb) => cb());
|
|
947
|
+
this.onCloseListeners.clear();
|
|
948
|
+
this.onCloseRequestListeners.clear();
|
|
949
|
+
this.writeCb = () => void 0;
|
|
936
950
|
}
|
|
937
951
|
isCloseRequested() {
|
|
938
952
|
return this.closeRequested;
|
|
@@ -941,11 +955,12 @@ var WriteStreamImpl = class {
|
|
|
941
955
|
if (this.isClosed()) {
|
|
942
956
|
throw new Error("Stream is already closed");
|
|
943
957
|
}
|
|
944
|
-
this.
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
958
|
+
if (this.isCloseRequested()) {
|
|
959
|
+
cb();
|
|
960
|
+
return () => void 0;
|
|
961
|
+
}
|
|
962
|
+
this.onCloseRequestListeners.add(cb);
|
|
963
|
+
return () => this.onCloseRequestListeners.delete(cb);
|
|
949
964
|
}
|
|
950
965
|
/**
|
|
951
966
|
* @internal meant for use within river, not exposed as a public API
|
|
@@ -960,8 +975,8 @@ var WriteStreamImpl = class {
|
|
|
960
975
|
throw new Error("Cannot trigger close request on closed stream");
|
|
961
976
|
}
|
|
962
977
|
this.closeRequested = true;
|
|
963
|
-
this.
|
|
964
|
-
this.
|
|
978
|
+
this.onCloseRequestListeners.forEach((cb) => cb());
|
|
979
|
+
this.onCloseRequestListeners.clear();
|
|
965
980
|
}
|
|
966
981
|
};
|
|
967
982
|
|
|
@@ -1140,25 +1155,23 @@ function handleProc(procType, transport, serverId, init, serviceName, procedureN
|
|
|
1140
1155
|
streamId
|
|
1141
1156
|
);
|
|
1142
1157
|
let cleanClose = true;
|
|
1143
|
-
const inputWriter = new WriteStreamImpl(
|
|
1144
|
-
(
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
()
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
transport.sendCloseControl(serverId, streamId);
|
|
1156
|
-
}
|
|
1157
|
-
if (outputReader.isClosed()) {
|
|
1158
|
-
cleanup();
|
|
1159
|
-
}
|
|
1158
|
+
const inputWriter = new WriteStreamImpl((rawIn) => {
|
|
1159
|
+
transport.send(serverId, {
|
|
1160
|
+
streamId,
|
|
1161
|
+
payload: rawIn,
|
|
1162
|
+
controlFlags: 0,
|
|
1163
|
+
tracing: getPropagationContext(ctx)
|
|
1164
|
+
});
|
|
1165
|
+
});
|
|
1166
|
+
inputWriter.onClose(() => {
|
|
1167
|
+
span.addEvent("inputWriter closed");
|
|
1168
|
+
if (!procClosesWithInit && cleanClose) {
|
|
1169
|
+
transport.sendCloseControl(serverId, streamId);
|
|
1160
1170
|
}
|
|
1161
|
-
|
|
1171
|
+
if (outputReader.isClosed()) {
|
|
1172
|
+
cleanup();
|
|
1173
|
+
}
|
|
1174
|
+
});
|
|
1162
1175
|
const outputReader = new ReadStreamImpl(() => {
|
|
1163
1176
|
transport.sendRequestCloseControl(serverId, streamId);
|
|
1164
1177
|
});
|
|
@@ -1583,23 +1596,21 @@ var RiverServer = class {
|
|
|
1583
1596
|
}
|
|
1584
1597
|
});
|
|
1585
1598
|
const procClosesWithResponse = procedure.type === "rpc" || procedure.type === "upload";
|
|
1586
|
-
const outputWriter = new WriteStreamImpl(
|
|
1587
|
-
(
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
()
|
|
1595
|
-
|
|
1596
|
-
this.transport.sendCloseControl(from, streamId);
|
|
1597
|
-
}
|
|
1598
|
-
if (inputReader.isClosed()) {
|
|
1599
|
-
cleanup();
|
|
1600
|
-
}
|
|
1599
|
+
const outputWriter = new WriteStreamImpl((response) => {
|
|
1600
|
+
this.transport.send(from, {
|
|
1601
|
+
streamId,
|
|
1602
|
+
controlFlags: procClosesWithResponse ? 8 /* StreamClosedBit */ : 0,
|
|
1603
|
+
payload: response
|
|
1604
|
+
});
|
|
1605
|
+
});
|
|
1606
|
+
outputWriter.onClose(() => {
|
|
1607
|
+
if (!procClosesWithResponse && cleanClose) {
|
|
1608
|
+
this.transport.sendCloseControl(from, streamId);
|
|
1601
1609
|
}
|
|
1602
|
-
|
|
1610
|
+
if (inputReader.isClosed()) {
|
|
1611
|
+
cleanup();
|
|
1612
|
+
}
|
|
1613
|
+
});
|
|
1603
1614
|
const onHandlerError = (err, span) => {
|
|
1604
1615
|
const errorMsg = coerceErrorString(err);
|
|
1605
1616
|
span.recordException(err instanceof Error ? err : new Error(errorMsg));
|
|
@@ -1990,4 +2001,4 @@ export {
|
|
|
1990
2001
|
createClientHandshakeOptions,
|
|
1991
2002
|
createServerHandshakeOptions
|
|
1992
2003
|
};
|
|
1993
|
-
//# sourceMappingURL=chunk-
|
|
2004
|
+
//# sourceMappingURL=chunk-7CKIN3JT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../router/services.ts","../router/diff.ts","../router/result.ts","../router/streams.ts","../router/procedures.ts","../router/client.ts","../router/server.ts","../router/handshake.ts"],"sourcesContent":["import { Type, TSchema, Static } from '@sinclair/typebox';\nimport {\n Branded,\n ProcedureMap,\n Unbranded,\n AnyProcedure,\n PayloadType,\n ProcedureErrorSchemaType,\n OutputReaderErrorSchema,\n} from './procedures';\nimport { ServiceContext } from './context';\n\n/**\n * An instantiated service, probably from a {@link ServiceSchema}.\n *\n * You shouldn't construct these directly, use {@link ServiceSchema} instead.\n */\nexport interface Service<\n State extends object,\n Procs extends ProcedureMap<State>,\n> {\n readonly state: State;\n readonly procedures: Procs;\n}\n\n/**\n * Represents any {@link Service} object.\n */\nexport type AnyService = Service<object, ProcedureMap>;\n\n/**\n * Represents any {@link ServiceSchema} object.\n */\nexport type AnyServiceSchema = ServiceSchema<object, ProcedureMap>;\n\n/**\n * A dictionary of {@link ServiceSchema}s, where the key is the service name.\n */\nexport type AnyServiceSchemaMap = Record<string, AnyServiceSchema>;\n\n// This has the secret sauce to keep go to definition working, the structure is\n// somewhat delicate, so be careful when modifying it. Would be nice to add a\n// static test for this.\n/**\n * Takes a {@link AnyServiceSchemaMap} and returns a dictionary of instantiated\n * services.\n */\nexport type InstantiatedServiceSchemaMap<T extends AnyServiceSchemaMap> = {\n [K in keyof T]: T[K] extends ServiceSchema<infer S, infer P>\n ? Service<S, P>\n : never;\n};\n\n/**\n * Helper to get the type definition for a specific handler of a procedure in a service.\n * @template S - The service.\n * @template ProcName - The name of the procedure.\n */\nexport type ProcHandler<\n S extends AnyService,\n ProcName extends keyof S['procedures'],\n> = S['procedures'][ProcName]['handler'];\n\n/**\n * Helper to get the type definition for the procedure init type of a service.\n * @template S - The service.\n * @template ProcName - The name of the procedure.\n */\nexport type ProcInit<\n S extends AnyService,\n ProcName extends keyof S['procedures'],\n> = Static<S['procedures'][ProcName]['init']>;\n\n/**\n * Helper to get the type definition for the procedure input of a service.\n * @template S - The service.\n * @template ProcName - The name of the procedure.\n */\nexport type ProcInput<\n S extends AnyService,\n ProcName extends keyof S['procedures'],\n> = S['procedures'][ProcName] extends { input: PayloadType }\n ? Static<S['procedures'][ProcName]['input']>\n : never;\n\n/**\n * Helper to get the type definition for the procedure output of a service.\n * @template S - The service.\n * @template ProcName - The name of the procedure.\n */\nexport type ProcOutput<\n S extends AnyService,\n ProcName extends keyof S['procedures'],\n> = Static<S['procedures'][ProcName]['output']>;\n\n/**\n * Helper to get the type definition for the procedure errors of a service.\n * @template S - The service.\n * @template ProcName - The name of the procedure.\n */\nexport type ProcErrors<\n S extends AnyService,\n ProcName extends keyof S['procedures'],\n> =\n | Static<S['procedures'][ProcName]['errors']>\n | Static<typeof OutputReaderErrorSchema>;\n\n/**\n * Helper to get the type of procedure in a service.\n * @template S - The service.\n * @template ProcName - The name of the procedure.\n */\nexport type ProcType<\n S extends AnyService,\n ProcName extends keyof S['procedures'],\n> = S['procedures'][ProcName]['type'];\n\n/**\n * A list of procedures where every procedure is \"branded\", as-in the procedure\n * was created via the {@link Procedure} constructors.\n */\ntype BrandedProcedureMap<State> = Record<string, Branded<AnyProcedure<State>>>;\n\n/**\n * The configuration for a service.\n */\nexport interface ServiceConfiguration<State extends object> {\n /**\n * A factory function for creating a fresh state.\n */\n initializeState: (extendedContext: ServiceContext) => State;\n}\n\nexport interface SerializedProcedureSchema {\n init: PayloadType;\n input?: PayloadType;\n output: PayloadType;\n errors?: ProcedureErrorSchemaType;\n type: 'rpc' | 'subscription' | 'upload' | 'stream';\n}\n\nexport interface SerializedServiceSchema {\n procedures: Record<string, SerializedProcedureSchema>;\n}\n\nexport interface SerializedServerSchema {\n handshakeSchema?: TSchema;\n services: Record<string, SerializedServiceSchema>;\n}\n\nexport function serializeSchema(\n services: AnyServiceSchemaMap,\n handshakeSchema?: TSchema,\n): SerializedServerSchema {\n const serializedServiceObject = Object.entries(services).reduce<\n Record<string, SerializedServiceSchema>\n >((acc, [name, value]) => {\n acc[name] = value.serialize();\n return acc;\n }, {});\n\n const schema: SerializedServerSchema = {\n services: serializedServiceObject,\n };\n\n if (handshakeSchema) {\n schema.handshakeSchema = Type.Strict(handshakeSchema);\n }\n\n return schema;\n}\n\n/**\n * The schema for a {@link Service}. This is used to define a service, specifically\n * its initial state and procedures.\n *\n * There are two ways to define a service:\n * 1. the {@link ServiceSchema.define} static method, which takes a configuration and\n * a list of procedures directly. Use this to ergonomically define a service schema\n * in one go. Good for smaller services, especially if they're stateless.\n * 2. the {@link ServiceSchema.scaffold} static method, which creates a scaffold that\n * can be used to define procedures separately from the configuration. Use this to\n * better organize your service's definition, especially if it's a large service.\n * You can also use it in a builder pattern to define the service in a more\n * fluent way.\n *\n * See the static methods for more information and examples.\n *\n * When defining procedures, use the {@link Procedure} constructors to create them.\n */\nexport class ServiceSchema<\n State extends object,\n Procedures extends ProcedureMap<State>,\n> {\n /**\n * Factory function for creating a fresh state.\n */\n protected readonly initializeState: (\n extendedContext: ServiceContext,\n ) => State;\n\n /**\n * The procedures for this service.\n */\n readonly procedures: Procedures;\n\n /**\n * @param config - The configuration for this service.\n * @param procedures - The procedures for this service.\n */\n protected constructor(\n config: ServiceConfiguration<State>,\n procedures: Procedures,\n ) {\n this.initializeState = config.initializeState;\n this.procedures = procedures;\n }\n\n /**\n * Creates a {@link ServiceScaffold}, which can be used to define procedures\n * that can then be merged into a {@link ServiceSchema}, via the scaffold's\n * `finalize` method.\n *\n * There are two patterns that work well with this method. The first is using\n * it to separate the definition of procedures from the definition of the\n * service's configuration:\n * ```ts\n * const MyServiceScaffold = ServiceSchema.scaffold({\n * initializeState: () => ({ count: 0 }),\n * });\n *\n * const incrementProcedures = MyServiceScaffold.procedures({\n * increment: Procedure.rpc({\n * init: Type.Object({ amount: Type.Number() }),\n * output: Type.Object({ current: Type.Number() }),\n * async handler(ctx, init) {\n * ctx.state.count += init.amount;\n * return Ok({ current: ctx.state.count });\n * }\n * }),\n * })\n *\n * const MyService = MyServiceScaffold.finalize({\n * ...incrementProcedures,\n * // you can also directly define procedures here\n * });\n * ```\n * This might be really handy if you have a very large service and you're\n * wanting to split it over multiple files. You can define the scaffold\n * in one file, and then import that scaffold in other files where you\n * define procedures - and then finally import the scaffolds and your\n * procedure objects in a final file where you finalize the scaffold into\n * a service schema.\n *\n * The other way is to use it like in a builder pattern:\n * ```ts\n * const MyService = ServiceSchema\n * .scaffold({ initializeState: () => ({ count: 0 }) })\n * .finalize({\n * increment: Procedure.rpc({\n * init: Type.Object({ amount: Type.Number() }),\n * output: Type.Object({ current: Type.Number() }),\n * async handler(ctx, init) {\n * ctx.state.count += init.amount;\n * return Ok({ current: ctx.state.count });\n * }\n * }),\n * })\n * ```\n * Depending on your preferences, this may be a more appealing way to define\n * a schema versus using the {@link ServiceSchema.define} method.\n */\n static scaffold<State extends object>(config: ServiceConfiguration<State>) {\n return new ServiceScaffold(config);\n }\n\n /**\n * Creates a new {@link ServiceSchema} with the given configuration and procedures.\n *\n * All procedures must be created with the {@link Procedure} constructors.\n *\n * NOTE: There is an overload that lets you just provide the procedures alone if your\n * service has no state.\n *\n * @param config - The configuration for this service.\n * @param procedures - The procedures for this service.\n *\n * @example\n * ```\n * const service = ServiceSchema.define(\n * { initializeState: () => ({ count: 0 }) },\n * {\n * increment: Procedure.rpc({\n * init: Type.Object({ amount: Type.Number() }),\n * output: Type.Object({ current: Type.Number() }),\n * async handler(ctx, init) {\n * ctx.state.count += init.amount;\n * return Ok({ current: ctx.state.count });\n * }\n * }),\n * },\n * );\n * ```\n */\n static define<\n State extends object,\n Procedures extends BrandedProcedureMap<State>,\n >(\n config: ServiceConfiguration<State>,\n procedures: Procedures,\n ): ServiceSchema<\n State,\n { [K in keyof Procedures]: Unbranded<Procedures[K]> }\n >;\n /**\n * Creates a new {@link ServiceSchema} with the given procedures.\n *\n * All procedures must be created with the {@link Procedure} constructors.\n *\n * NOTE: There is an overload that lets you provide configuration as well,\n * if your service has extra configuration like a state.\n *\n * @param procedures - The procedures for this service.\n *\n * @example\n * ```\n * const service = ServiceSchema.define({\n * add: Procedure.rpc({\n * init: Type.Object({ a: Type.Number(), b: Type.Number() }),\n * output: Type.Object({ result: Type.Number() }),\n * async handler(ctx, init) {\n * return Ok({ result: init.a + init.b });\n * }\n * }),\n * });\n */\n static define<Procedures extends BrandedProcedureMap<Record<string, never>>>(\n procedures: Procedures,\n ): ServiceSchema<\n Record<string, never>,\n { [K in keyof Procedures]: Unbranded<Procedures[K]> }\n >;\n // actual implementation\n static define(\n configOrProcedures:\n | ServiceConfiguration<object>\n | BrandedProcedureMap<object>,\n maybeProcedures?: BrandedProcedureMap<object>,\n ): ServiceSchema<object, ProcedureMap> {\n let config: ServiceConfiguration<object>;\n let procedures: BrandedProcedureMap<object>;\n\n if (\n 'initializeState' in configOrProcedures &&\n typeof configOrProcedures.initializeState === 'function'\n ) {\n if (!maybeProcedures) {\n throw new Error('Expected procedures to be defined');\n }\n\n config = configOrProcedures as ServiceConfiguration<object>;\n procedures = maybeProcedures;\n } else {\n config = { initializeState: () => ({}) };\n procedures = configOrProcedures as BrandedProcedureMap<object>;\n }\n\n return new ServiceSchema(config, procedures);\n }\n\n /**\n * Serializes this schema's procedures into a plain object that is JSON compatible.\n */\n serialize(): SerializedServiceSchema {\n return {\n procedures: Object.fromEntries(\n Object.entries(this.procedures).map(([procName, procDef]) => [\n procName,\n {\n init: Type.Strict(procDef.init),\n output: Type.Strict(procDef.output),\n // Only add `description` field if the type declares it.\n ...('description' in procDef\n ? { description: procDef.description }\n : {}),\n // Only add the `errors` field if the type declares it.\n ...('errors' in procDef\n ? {\n errors: Type.Strict(procDef.errors),\n }\n : {}),\n type: procDef.type,\n // Only add the `input` field if the type declares it.\n ...('input' in procDef\n ? {\n input: Type.Strict(procDef.input),\n }\n : {}),\n },\n ]),\n ),\n };\n }\n\n /**\n * Instantiates this schema into a {@link Service} object.\n *\n * You probably don't need this, usually the River server will handle this\n * for you.\n */\n instantiate(extendedContext: ServiceContext): Service<State, Procedures> {\n return Object.freeze({\n state: this.initializeState(extendedContext),\n procedures: this.procedures,\n });\n }\n}\n\n/**\n * A scaffold for defining a service's procedures.\n *\n * @see {@link ServiceSchema.scaffold}\n */\n// note that this isn't exported\nclass ServiceScaffold<State extends object> {\n /**\n * The configuration for this service.\n */\n protected readonly config: ServiceConfiguration<State>;\n\n /**\n * @param config - The configuration for this service.\n */\n constructor(config: ServiceConfiguration<State>) {\n this.config = config;\n }\n\n /**\n * Define procedures for this service. Use the {@link Procedure} constructors\n * to create them. This returns the procedures object, which can then be\n * passed to {@link ServiceSchema.finalize} to create a {@link ServiceSchema}.\n *\n * @example\n * ```\n * const myProcedures = MyServiceScaffold.procedures({\n * myRPC: Procedure.rpc({\n * // ...\n * }),\n * });\n *\n * const MyService = MyServiceScaffold.finalize({\n * ...myProcedures,\n * });\n * ```\n *\n * @param procedures - The procedures for this service.\n */\n procedures<T extends BrandedProcedureMap<State>>(procedures: T): T {\n return procedures;\n }\n\n /**\n * Finalizes the scaffold into a {@link ServiceSchema}. This is where you\n * provide the service's procedures and get a {@link ServiceSchema} in return.\n *\n * You can directly define procedures here, or you can define them separately\n * with the {@link ServiceScaffold.procedures} method, and then pass them here.\n *\n * @example\n * ```\n * const MyService = MyServiceScaffold.finalize({\n * myRPC: Procedure.rpc({\n * // ...\n * }),\n * // e.g. from the procedures method\n * ...myOtherProcedures,\n * });\n * ```\n */\n finalize<T extends BrandedProcedureMap<State>>(\n procedures: T,\n ): ServiceSchema<State, { [K in keyof T]: Unbranded<T[K]> }> {\n return ServiceSchema.define(this.config, procedures);\n }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport { TProperties, TAnySchema } from '@sinclair/typebox';\nimport type {\n SerializedServerSchema,\n SerializedServiceSchema,\n SerializedProcedureSchema,\n} from '../router';\n\nexport interface ServerBreakage {\n serviceBreakages: Record<string, ServiceBreakage>;\n}\n\nexport type ServiceBreakage =\n | {\n reason: 'removed';\n }\n | {\n reason: 'modified';\n procedureBreakages: Record<string, ProcedureBreakage>;\n };\n\nexport type ProcedureBreakage =\n | {\n reason: 'removed';\n }\n | { reason: 'type-changed'; oldType: string; newType: string }\n | {\n reason: 'modified';\n input?: PayloadBreakage;\n init?: PayloadBreakage;\n output?: PayloadBreakage;\n };\n\nexport type PayloadBreakage =\n | {\n reason: 'type-changed';\n oldType: string;\n newType: string;\n }\n | { reason: 'new-required' }\n | { reason: 'removed-required' }\n | {\n reason: 'field-breakage';\n fieldBreakages: Record<string, PayloadBreakage>;\n };\n\nexport interface DiffOptions {\n allowServiceRemoval?: boolean;\n allowProcedureRemoval?: boolean;\n}\n\nexport function diffServerSchema(\n oldServer: SerializedServerSchema,\n newServer: SerializedServerSchema,\n options?: DiffOptions,\n): ServerBreakage | null {\n const allServices = new Set([\n ...Object.keys(oldServer.services),\n ...Object.keys(newServer.services),\n ]);\n\n const breakages: Record<string, ServiceBreakage> = {};\n for (const serviceName of allServices) {\n const oldService = oldServer.services[serviceName];\n const newService = newServer.services[serviceName];\n\n const breakage = diffService(oldService, newService, options);\n if (breakage) {\n breakages[serviceName] = breakage;\n }\n }\n\n if (Object.keys(breakages).length) {\n return { serviceBreakages: breakages };\n }\n\n return null;\n}\n\nfunction diffService(\n oldService: SerializedServiceSchema | null,\n newService: SerializedServiceSchema | null,\n options?: DiffOptions,\n): ServiceBreakage | null {\n if (!newService) {\n return options?.allowServiceRemoval ? null : { reason: 'removed' };\n }\n // New service, perfectly fine.\n if (!oldService) {\n return null;\n }\n\n const allProcedures = new Set([\n ...Object.keys(oldService.procedures),\n ...Object.keys(newService.procedures),\n ]);\n\n const breakages: Record<string, ProcedureBreakage> = {};\n for (const procedureName of allProcedures) {\n const aProcedure = oldService.procedures[procedureName];\n const bProcedure = newService.procedures[procedureName];\n\n const breakage = diffProcedure(aProcedure, bProcedure, options);\n if (breakage) {\n breakages[procedureName] = breakage;\n }\n }\n if (Object.keys(breakages).length) {\n return { reason: 'modified', procedureBreakages: breakages };\n }\n\n return null;\n}\n\nfunction diffProcedure(\n oldProcedure: SerializedProcedureSchema | null,\n newProcedure: SerializedProcedureSchema | null,\n options?: DiffOptions,\n): ProcedureBreakage | null {\n if (!newProcedure) {\n return options?.allowProcedureRemoval ? null : { reason: 'removed' };\n }\n // New service, perfectly fine.\n if (!oldProcedure) {\n return null;\n }\n\n if (oldProcedure.type !== newProcedure.type) {\n return {\n reason: 'type-changed',\n oldType: oldProcedure.type,\n newType: newProcedure.type,\n };\n }\n\n const inputBreakage = diffProcedureField(\n oldProcedure.input,\n newProcedure.input,\n 'client',\n );\n const initBreakage = diffProcedureField(\n oldProcedure.init,\n newProcedure.init,\n 'client',\n );\n const outputBreakage = diffProcedureField(\n oldProcedure.output,\n newProcedure.output,\n 'server',\n );\n\n if (inputBreakage ?? initBreakage ?? outputBreakage) {\n const result: ProcedureBreakage = {\n reason: 'modified',\n };\n if (inputBreakage) {\n result.input = inputBreakage;\n }\n if (initBreakage) {\n result.init = initBreakage;\n }\n if (outputBreakage) {\n result.output = outputBreakage;\n }\n return result;\n }\n\n return null;\n}\n\nfunction diffProcedureField(\n oldSchema: TAnySchema | undefined,\n newSchema: TAnySchema | undefined,\n origin: 'server' | 'client',\n): PayloadBreakage | null {\n if (!oldSchema && !newSchema) {\n return null;\n }\n\n const diffBreakage = diffRequired(oldSchema, newSchema, origin, false, false);\n if (diffBreakage) {\n return diffBreakage;\n }\n\n if (!oldSchema || !newSchema) {\n throw new Error('Appease typescript, this should never happen');\n }\n\n return diffJSONSchema(oldSchema, newSchema, origin);\n}\n\nfunction diffRequired(\n oldSchema: TAnySchema | undefined,\n newSchema: TAnySchema | undefined,\n origin: 'server' | 'client',\n oldRequired: boolean,\n newRequired: boolean,\n): PayloadBreakage | null {\n if (!newSchema && !oldSchema) {\n throw new Error('Both old and new schema are undefined');\n }\n\n // old server will send this field, new client will not\n if (!newSchema) {\n // This is only okay if the the field was optional and the origin is the server.\n if (!oldRequired && origin == 'server') {\n return null;\n }\n return { reason: 'removed-required' };\n }\n if (!oldSchema) {\n if (newRequired && origin === 'client') {\n return { reason: 'new-required' };\n }\n // New field, perfectly fine.\n return null;\n }\n\n if (origin === 'client' && !oldRequired && newRequired) {\n return { reason: 'new-required' };\n }\n if (origin === 'server' && oldRequired && !newRequired) {\n return { reason: 'removed-required' };\n }\n\n return null;\n}\n\nfunction diffJSONSchema(\n oldSchema: TAnySchema,\n newSchema: TAnySchema,\n origin: 'server' | 'client',\n): PayloadBreakage | null {\n if (oldSchema.type !== newSchema.type) {\n return {\n reason: 'type-changed',\n oldType: getReportingType(oldSchema),\n newType: getReportingType(newSchema),\n };\n }\n\n if (getReportingType(oldSchema) !== getReportingType(newSchema)) {\n return {\n reason: 'type-changed',\n oldType: getReportingType(oldSchema),\n newType: getReportingType(newSchema),\n };\n }\n\n if (\n 'const' in oldSchema &&\n 'const' in newSchema &&\n oldSchema.const !== newSchema.const\n ) {\n return {\n reason: 'type-changed',\n oldType: `${getReportingType(oldSchema)}-const-${oldSchema.const}`,\n newType: `${getReportingType(newSchema)}-const-${newSchema.const}`,\n };\n }\n\n // if const in old and coming from the server, then it's not okay\n if ('const' in oldSchema && !('const' in newSchema) && origin === 'server') {\n return {\n reason: 'type-changed',\n oldType: `${getReportingType(oldSchema)}-const-${oldSchema.const}`,\n newType: getReportingType(newSchema),\n };\n }\n\n if ('const' in newSchema && !('const' in oldSchema) && origin === 'client') {\n return {\n reason: 'type-changed',\n oldType: getReportingType(oldSchema),\n newType: `${getReportingType(newSchema)}-const-${newSchema.const}`,\n };\n }\n\n const breakages: Record<string, PayloadBreakage> = {};\n if ('$ref' in newSchema) {\n // TRef\n if (newSchema.$ref !== oldSchema.$ref) {\n return {\n reason: 'type-changed',\n oldType: getReportingType(oldSchema),\n newType: getReportingType(newSchema),\n };\n }\n } else if ('not' in newSchema) {\n // TNot\n const notBreakage = diffJSONSchema(\n oldSchema.not as TAnySchema,\n newSchema.not as TAnySchema,\n origin,\n );\n\n if (notBreakage) {\n breakages.not = notBreakage;\n }\n } else if ('anyOf' in newSchema) {\n // TUnion or TEnum\n\n // best effort, permissiveness relies on not changing order, but it's the best\n // we can do without going too wild doing a matrix diff\n\n const oldAnyOfStringified = oldSchema.anyOf\n .map((el: unknown) => JSON.stringify(el))\n .sort();\n const newAnyOfStringified = newSchema.anyOf\n .map((el: unknown) => JSON.stringify(el))\n .sort();\n\n const anyOfBreakages: Record<string, PayloadBreakage> = {};\n\n for (let i = 0; i < oldAnyOfStringified.length; i++) {\n if (newAnyOfStringified.includes(oldAnyOfStringified[i])) {\n // perfect match\n continue;\n }\n\n if (!newAnyOfStringified[i]) {\n if (origin === 'server') {\n continue;\n }\n\n anyOfBreakages[`old-${i}`] = { reason: 'removed-required' };\n } else {\n const breakage = diffJSONSchema(\n JSON.parse(oldAnyOfStringified[i]),\n JSON.parse(newAnyOfStringified[i]),\n origin,\n );\n\n if (breakage) {\n anyOfBreakages[`old-${i}`] = breakage;\n }\n }\n }\n\n for (let i = 0; i < newAnyOfStringified.length; i++) {\n if (oldAnyOfStringified.includes(newAnyOfStringified[i])) {\n // perfect match\n continue;\n }\n\n if (!oldAnyOfStringified[i]) {\n if (origin === 'client') {\n continue;\n }\n\n anyOfBreakages[`new-${i}`] = { reason: 'new-required' };\n } else {\n const breakage = diffJSONSchema(\n JSON.parse(oldAnyOfStringified[i]),\n JSON.parse(newAnyOfStringified[i]),\n origin,\n );\n\n if (breakage) {\n anyOfBreakages[`new-${i}`] = breakage;\n }\n }\n }\n\n if (Object.keys(anyOfBreakages).length > 0) {\n breakages.anyOf = {\n reason: 'field-breakage',\n fieldBreakages: anyOfBreakages,\n };\n }\n } else if ('oneOf' in newSchema) {\n throw new Error('oneOf is not supported, typebox does not emit it');\n } else if ('allOf' in newSchema) {\n // TIntersect\n\n // best effort, permissiveness relies on not changing order and not changing the\n // types in the intersection\n\n if (newSchema.allOf.length !== oldSchema.allOf.length) {\n breakages.allOf = {\n reason: 'type-changed',\n oldType: `${oldSchema.allOf}`,\n newType: `${newSchema.allOf}`,\n };\n } else {\n for (let i = 0; i < newSchema.allOf.length; i++) {\n const breakage = diffJSONSchema(\n oldSchema.allOf[i],\n newSchema.allOf[i],\n origin,\n );\n\n if (breakage) {\n breakages.allOf = breakage;\n break;\n }\n }\n }\n } else if (newSchema.type === 'array') {\n // TArray or TTuple\n const itemsBreakages = diffJSONSchema(\n oldSchema.items as TAnySchema,\n newSchema.items as TAnySchema,\n origin,\n );\n\n if (itemsBreakages) {\n breakages.items = itemsBreakages;\n }\n\n if (oldSchema.minItems < newSchema.minItems) {\n if (origin === 'client') {\n breakages.minItems = {\n reason: 'type-changed',\n oldType: `${oldSchema.minItems}`,\n newType: `${newSchema.minItems}`,\n };\n }\n } else if (oldSchema.minItems > newSchema.minItems) {\n if (origin === 'server') {\n breakages.minItems = {\n reason: 'type-changed',\n oldType: `${oldSchema.minItems}`,\n newType: `${newSchema.minItems}`,\n };\n }\n }\n\n if (oldSchema.maxItems < newSchema.maxItems) {\n if (origin === 'server') {\n breakages.maxItems = {\n reason: 'type-changed',\n oldType: `${oldSchema.maxItems}`,\n newType: `${newSchema.maxItems}`,\n };\n }\n } else if (oldSchema.maxItems > newSchema.maxItems) {\n if (origin === 'client') {\n breakages.maxItems = {\n reason: 'type-changed',\n oldType: `${oldSchema.maxItems}`,\n newType: `${newSchema.maxItems}`,\n };\n }\n }\n\n if (\n !oldSchema.uniqueItems &&\n newSchema.uniqueItems &&\n origin === 'client'\n ) {\n breakages.uniqueItems = {\n reason: 'type-changed',\n oldType: `${!!oldSchema.uniqueItems}`,\n newType: `${!!newSchema.uniqueItems}`,\n };\n }\n\n if ('contains' in newSchema !== 'contains' in oldSchema) {\n if (\n 'contains' in newSchema &&\n !('contains' in oldSchema) &&\n origin === 'client'\n ) {\n breakages.contains = {\n reason: 'type-changed',\n oldType: 'no-contains',\n newType: 'contains',\n };\n }\n } else if ('contains' in newSchema) {\n const containsBreakage = diffJSONSchema(\n oldSchema.contains,\n newSchema.contains,\n origin,\n );\n\n if (containsBreakage) {\n breakages.contains = containsBreakage;\n }\n }\n\n if (oldSchema.minContains < newSchema.minContains) {\n if (origin === 'client') {\n breakages.minContains = {\n reason: 'type-changed',\n oldType: `${oldSchema.minContains}`,\n newType: `${newSchema.minContains}`,\n };\n }\n } else if (oldSchema.minContains > newSchema.minContains) {\n if (origin === 'server') {\n breakages.minContains = {\n reason: 'type-changed',\n oldType: `${oldSchema.minContains}`,\n newType: `${newSchema.minContains}`,\n };\n }\n }\n\n if (oldSchema.maxContains < newSchema.maxContains) {\n if (origin === 'server') {\n breakages.maxContains = {\n reason: 'type-changed',\n oldType: `${oldSchema.maxContains}`,\n newType: `${newSchema.maxContains}`,\n };\n }\n } else if (oldSchema.maxContains > newSchema.maxContains) {\n if (origin === 'client') {\n breakages.maxContains = {\n reason: 'type-changed',\n oldType: `${oldSchema.maxContains}`,\n newType: `${newSchema.maxContains}`,\n };\n }\n }\n /**\n * ignoring `additionalItems` since it's not represented in typebox\n */\n } else if (newSchema.type === 'object') {\n // TRecord or TObject or TComposite or TMapped\n\n if ('properties' in newSchema !== 'properties' in oldSchema) {\n // In theory we can get fancy in this case since Objects are Records with literals as keys\n // but reporting breakage to keep things simpler\n return {\n reason: 'type-changed',\n oldType:\n 'properties' in oldSchema ? 'probably-object' : 'probably-record',\n newType:\n 'properties' in newSchema ? 'probably-object' : 'probably-record',\n };\n }\n\n if ('properties' in newSchema) {\n // TObject\n const propertiesBreakages = diffObjectProperties(\n oldSchema.properties,\n newSchema.properties,\n origin,\n oldSchema.required,\n newSchema.required,\n );\n\n if (Object.keys(propertiesBreakages).length) {\n breakages.properties = {\n reason: 'field-breakage',\n fieldBreakages: propertiesBreakages,\n };\n }\n }\n\n if ('patternProperties' in newSchema) {\n // TRecord\n\n const patternPropertiesBreakages = diffObjectProperties(\n oldSchema.patternProperties,\n newSchema.patternProperties,\n origin,\n oldSchema.required,\n newSchema.required,\n );\n\n if (Object.keys(patternPropertiesBreakages).length) {\n breakages.patternProperties = {\n reason: 'field-breakage',\n fieldBreakages: patternPropertiesBreakages,\n };\n }\n }\n\n if (\n 'additionalProperties' in newSchema ||\n 'additionalProperties' in oldSchema\n ) {\n throw new Error('additionalProperties is not supported');\n }\n\n if ('minProperties' in newSchema || 'minProperties' in oldSchema) {\n throw new Error('minProperties is not supported');\n }\n\n if ('maxProperties' in newSchema || 'maxProperties' in oldSchema) {\n throw new Error('maxProperties is not supported');\n }\n }\n\n if (Object.keys(breakages).length) {\n return {\n reason: 'field-breakage',\n fieldBreakages: breakages,\n };\n }\n\n return null;\n}\n\nfunction diffObjectProperties(\n oldProperties: TProperties,\n newProperties: TProperties,\n origin: 'server' | 'client',\n oldRequiredProperties: Array<string> = [],\n newRequiredProperties: Array<string> = [],\n): Record<string, PayloadBreakage> {\n // TRecord\n const allProperties = new Set([\n ...Object.keys(oldProperties),\n ...Object.keys(newProperties),\n ]);\n\n const breakages: Record<string, PayloadBreakage> = {};\n\n for (const propertyName of allProperties) {\n const requiredBreakage = diffRequired(\n oldProperties[propertyName],\n newProperties[propertyName],\n origin,\n oldRequiredProperties.includes(propertyName),\n newRequiredProperties.includes(propertyName),\n );\n\n if (requiredBreakage) {\n breakages[propertyName] = requiredBreakage;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } else if (oldProperties[propertyName] && newProperties[propertyName]) {\n const propertyBreakage = diffJSONSchema(\n oldProperties[propertyName],\n newProperties[propertyName],\n origin,\n );\n\n if (propertyBreakage) {\n breakages[propertyName] = propertyBreakage;\n }\n }\n }\n\n return breakages;\n}\n\nfunction getReportingType(schema: TAnySchema): string {\n if ('not' in schema) {\n return 'not';\n }\n\n if ('anyOf' in schema) {\n return 'anyOf';\n }\n\n if ('allOf' in schema) {\n return 'allOf';\n }\n\n if ('$ref' in schema) {\n return '$ref';\n }\n\n if (schema.type && typeof schema.type === 'string') {\n return schema.type;\n }\n\n throw new Error(\n 'Subschema not supported, probably a conditional subschema. Check logs.',\n );\n}\n","import {\n Static,\n TLiteral,\n TObject,\n TSchema,\n TString,\n TUnion,\n Type,\n} from '@sinclair/typebox';\nimport { Client } from './client';\nimport { ReadStream } from './streams';\n\ntype TLiteralString = TLiteral<string>;\n\nexport type BaseErrorSchemaType =\n | TObject<{\n code: TLiteralString | TUnion<Array<TLiteralString>>;\n message: TLiteralString | TString;\n }>\n | TObject<{\n code: TLiteralString | TUnion<Array<TLiteralString>>;\n message: TLiteralString | TString;\n extras: TSchema;\n }>;\n\n/**\n * Takes in a specific error schema and returns a result schema the error\n */\nexport const ErrResultSchema = <T extends BaseErrorSchemaType>(t: T) =>\n Type.Object({\n ok: Type.Literal(false),\n payload: t,\n });\n\n/**\n * AnyResultSchema is a schema to validate any result.\n */\nexport const AnyResultSchema = Type.Union([\n Type.Object({\n ok: Type.Literal(false),\n payload: Type.Object({\n code: Type.String(),\n message: Type.String(),\n extras: Type.Optional(Type.Unknown()),\n }),\n }),\n\n Type.Object({\n ok: Type.Literal(true),\n payload: Type.Unknown(),\n }),\n]);\n\nexport interface OkResult<T> {\n ok: true;\n payload: T;\n}\nexport interface ErrResult<Err extends Static<BaseErrorSchemaType>> {\n ok: false;\n payload: Err;\n}\nexport type Result<T, Err extends Static<BaseErrorSchemaType>> =\n | OkResult<T>\n | ErrResult<Err>;\n\nexport function Ok<const T extends Array<unknown>>(p: T): OkResult<T>;\nexport function Ok<const T extends ReadonlyArray<unknown>>(p: T): OkResult<T>;\nexport function Ok<const T>(payload: T): OkResult<T>;\nexport function Ok<const T>(payload: T): OkResult<T> {\n return {\n ok: true,\n payload,\n };\n}\n\nexport function Err<const Err extends Static<BaseErrorSchemaType>>(\n error: Err,\n): ErrResult<Err> {\n return {\n ok: false,\n payload: error,\n };\n}\n\n/**\n * Refine a {@link Result} type to its returned payload.\n */\nexport type ResultUnwrapOk<R> = R extends Result<infer T, infer __E>\n ? T\n : never;\n\n/**\n * Unwrap a {@link Result} type and return the payload if successful,\n * otherwise throws an error.\n * @param result - The result to unwrap.\n * @throws Will throw an error if the result is not ok.\n */\nexport function unwrap<T, Err extends Static<BaseErrorSchemaType>>(\n result: Result<T, Err>,\n): T {\n if (result.ok) {\n return result.payload;\n }\n\n throw new Error(\n `Cannot non-ok result, got: ${result.payload.code} - ${result.payload.message}`,\n );\n}\n\n/**\n * Refine a {@link Result} type to its error payload.\n */\nexport type ResultUnwrapErr<R> = R extends Result<infer __T, infer Err>\n ? Err\n : never;\n\n/**\n * Retrieve the output type for a procedure, represented as a {@link Result}\n * type.\n * Example:\n * ```\n * type Message = Output<typeof client, 'serviceName', 'procedureName'>\n * ```\n */\nexport type Output<\n RiverClient,\n ServiceName extends keyof RiverClient,\n ProcedureName extends keyof RiverClient[ServiceName],\n Procedure = RiverClient[ServiceName][ProcedureName],\n Fn extends (...args: never) => unknown = (...args: never) => unknown,\n> = RiverClient extends Client<infer __ServiceSchemaMap>\n ? Procedure extends object\n ? Procedure extends object & { rpc: infer RpcHandler extends Fn }\n ? Awaited<ReturnType<RpcHandler>>\n : Procedure extends object & { upload: infer UploadHandler extends Fn }\n ? ReturnType<UploadHandler> extends [\n infer __UploadInputMessage,\n (...args: never) => Promise<infer UploadOutputMessage>,\n ]\n ? UploadOutputMessage\n : never\n : Procedure extends object & { stream: infer StreamHandler extends Fn }\n ? ReturnType<StreamHandler> extends [\n infer __StreamInputMessage,\n ReadStream<infer StreamOutputMessage, Static<BaseErrorSchemaType>>,\n ]\n ? StreamOutputMessage\n : never\n : Procedure extends object & {\n subscribe: infer SubscriptionHandler extends Fn;\n }\n ? Awaited<ReturnType<SubscriptionHandler>> extends ReadStream<\n infer SubscriptionOutputMessage,\n Static<BaseErrorSchemaType>\n >\n ? SubscriptionOutputMessage\n : never\n : never\n : never\n : never;\n","import { Static } from '@sinclair/typebox';\nimport { BaseErrorSchemaType, Err, Result } from './result';\n\nexport const StreamDrainedError = {\n code: 'STREAM_DRAINED',\n message: 'Stream was drained',\n} as const;\n\ntype ReadStreamResult<T, E extends Static<BaseErrorSchemaType>> = Result<\n T,\n E | typeof StreamDrainedError\n>;\n\n/**\n * A `ReadStream` represents a stream of data.\n *\n * This stream is not closable by the reader, the reader must wait for\n * the writer to close it.\n *\n * The stream can only be locked (aka consumed) once and will remain\n * locked, trying to lock the stream again will throw an TypeError.\n */\nexport interface ReadStream<T, E extends Static<BaseErrorSchemaType>> {\n /**\n * Stream implements AsyncIterator API and can be consumed via\n * for-await-of loops.\n *\n */\n [Symbol.asyncIterator](): {\n next(): Promise<\n | {\n done: false;\n value: ReadStreamResult<T, E>;\n }\n | {\n done: true;\n value: undefined;\n }\n >;\n };\n /**\n * `asArray` locks the stream and returns a promise that resolves\n * with an array of the stream's content when the stream is closed.\n *\n */\n asArray(): Promise<Array<ReadStreamResult<T, E>>>;\n /**\n * `drain` locks the stream and discards any existing or future data.\n *\n * If there is an existing Promise waiting for the next value,\n * `drain` causes it to resolve with a {@link StreamDrainedError} error.\n */\n drain(): undefined;\n /**\n * `isLocked` returns true if the stream is locked.\n */\n isLocked(): boolean;\n /**\n * `onClose` registers a callback that will be called when the stream\n * is closed. Returns a function that can be used to unregister the\n * listener.\n */\n onClose(cb: () => void): () => void;\n /**\n * `isClosed` returns true if the stream was closed by the writer.\n *\n * Note that the stream can still have queued data and can still be\n * consumed.\n */\n isClosed(): boolean;\n /**\n * `requestClose` sends a request to the writer to close the stream,\n * and resolves the writer closes its end of the stream..\n *\n * The stream can still receive more data after the request is sent. If you\n * no longer wish to use the stream, make sure to call `drain`.\n */\n requestClose(): Promise<undefined>;\n /**\n * `isCloseRequested` checks if the reader has requested to close the stream.\n */\n isCloseRequested(): boolean;\n}\n\n/**\n * A `WriteStream` is a streams that can be written to.\n */\nexport interface WriteStream<T> {\n /**\n * `write` writes a value to the stream. An error is thrown if writing to a closed stream.\n */\n write(value: T): undefined;\n /**\n * `close` signals the closure of the write stream, informing the reader that the stream is complete.\n * Calling close multiple times has no effect.\n */\n close(): undefined;\n /**\n * `isCloseRequested` checks if the reader has requested to close the stream.\n */\n isCloseRequested(): boolean;\n /**\n * `onCloseRequest` registers a callback that will be called when the stream's\n * reader requests a close. Returns a function that can be used to unregister the\n * listener.\n */\n onCloseRequest(cb: () => void): () => void;\n /**\n * `isClosed` returns true if the stream was closed by the writer.\n */\n isClosed(): boolean;\n /**\n * `onClose` registers a callback that will be called when the stream\n * is closed. Returns a function that can be used to unregister the\n * listener.\n */\n onClose(cb: () => void): () => void;\n}\n\n/**\n * Internal implementation of a `ReadStream`.\n * This won't be exposed as an interface to river\n * consumers directly, it has internal river methods\n * to pushed data to the stream and close it.\n */\nexport class ReadStreamImpl<T, E extends Static<BaseErrorSchemaType>>\n implements ReadStream<T, E>\n{\n /**\n * Whether the stream is closed.\n */\n private closed = false;\n /**\n * A list of listeners that will be called when the stream is closed.\n */\n private onCloseListeners: Set<() => void>;\n /**\n * Whether the user has requested to close the stream.\n */\n private closeRequested = false;\n /**\n * Used to signal to the outside world that the user has requested to close the stream.\n */\n private closeRequestCallback: () => void;\n /**\n * Whether the stream is locked.\n */\n private locked = false;\n /**\n * Whether drain was called.\n */\n private drained = false;\n /**\n * This flag allows us to avoid cases where drain was called,\n * but the stream is fully consumed and closed. We don't need\n * to signal that drain was closed.\n */\n private didDrainDisposeValues = false;\n /**\n * A list of values that have been pushed to the stream but not yet emitted to the user.\n */\n private queue: Array<ReadStreamResult<T, E>> = [];\n /**\n * Used by methods in the class to signal to the iterator that it\n * should check for the next value.\n */\n private nextPromise: Promise<void> | null = null;\n /**\n * Resolves nextPromise\n */\n private resolveNextPromise: null | (() => void) = null;\n\n constructor(closeRequestCallback: () => void) {\n this.closeRequestCallback = closeRequestCallback;\n this.onCloseListeners = new Set();\n }\n\n public [Symbol.asyncIterator]() {\n if (this.isLocked()) {\n throw new TypeError('ReadStream is already locked');\n }\n\n // first iteration with drain signals an error, the following one signals end of iteration.\n let didSignalDrain = false;\n this.locked = true;\n\n return {\n next: async () => {\n if (this.drained && didSignalDrain) {\n return {\n done: true,\n value: undefined,\n } as const;\n }\n\n // Wait until we have something in the queue\n while (this.queue.length === 0) {\n if (this.isClosed() && !this.didDrainDisposeValues) {\n return {\n done: true,\n value: undefined,\n } as const;\n }\n\n if (this.drained) {\n didSignalDrain = true;\n\n return {\n done: false,\n value: Err(StreamDrainedError),\n } as const;\n }\n\n if (!this.nextPromise) {\n this.nextPromise = new Promise<void>((resolve) => {\n this.resolveNextPromise = resolve;\n });\n }\n\n await this.nextPromise;\n this.nextPromise = null;\n this.resolveNextPromise = null;\n }\n\n // Unfortunately we have to use non-null assertion here, because T can be undefined\n // we already check for array length above anyway\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const value = this.queue.shift()!;\n\n return { done: false, value } as const;\n },\n return: async () => {\n this.drain();\n return { done: true, value: undefined } as const;\n },\n };\n }\n\n public async asArray(): Promise<Array<ReadStreamResult<T, E>>> {\n const array: Array<ReadStreamResult<T, E>> = [];\n for await (const value of this) {\n array.push(value);\n }\n\n return array;\n }\n\n public drain(): undefined {\n if (this.drained) {\n return;\n }\n\n this.locked = true;\n this.drained = true;\n this.didDrainDisposeValues = this.queue.length > 0;\n this.queue.length = 0;\n\n this.resolveNextPromise?.();\n }\n\n public isClosed(): boolean {\n return this.closed;\n }\n\n public isLocked(): boolean {\n return this.locked;\n }\n\n public onClose(cb: () => void): () => void {\n if (this.isClosed()) {\n throw new Error('Stream is already closed');\n }\n\n this.onCloseListeners.add(cb);\n\n return () => {\n this.onCloseListeners.delete(cb);\n };\n }\n\n public requestClose(): Promise<undefined> {\n if (this.isClosed()) {\n throw new Error('Cannot request close after stream already closed');\n }\n\n if (!this.closeRequested) {\n this.closeRequested = true;\n this.closeRequestCallback();\n }\n\n return new Promise<undefined>((resolve) => {\n this.onClose(() => {\n resolve(undefined);\n });\n });\n }\n\n public isCloseRequested(): boolean {\n return this.closeRequested;\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n *\n * Pushes a value to the stream.\n */\n public pushValue(value: Result<T, E>): undefined {\n if (this.drained) {\n return;\n }\n\n if (this.closed) {\n throw new Error('Cannot push to closed stream');\n }\n\n this.queue.push(value);\n this.resolveNextPromise?.();\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n *\n * Triggers the close of the stream. Make sure to push all remaining\n * values before calling this method.\n */\n public triggerClose(): undefined {\n if (this.isClosed()) {\n throw new Error('Unexpected closing multiple times');\n }\n\n this.closed = true;\n this.resolveNextPromise?.();\n this.onCloseListeners.forEach((cb) => cb());\n this.onCloseListeners.clear();\n\n // TODO maybe log a warn if after a certain amount of time\n // the queue was not fully consumed\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n */\n public hasValuesInQueue(): boolean {\n return this.queue.length > 0;\n }\n}\n\n/**\n * Internal implementation of a `WriteStream`.\n * This won't be exposed as an interface to river\n * consumers directly, it has internal river methods\n * to trigger a close request, a way to pass on close\n * signals, and a way to push data to the stream.\n */\nexport class WriteStreamImpl<T> implements WriteStream<T> {\n /**\n * Passed via constructor to pass on write requests\n */\n private writeCb: (value: T) => void;\n /**\n * Whether the stream is closed.\n */\n private closed = false;\n /**\n * A list of listeners that will be called when the stream is closed.\n */\n private onCloseListeners: Set<() => void>;\n /**\n * Whether the reader has requested to close the stream.\n */\n private closeRequested = false;\n /**\n * A list of listeners that will be called when a close request is triggered.\n */\n private onCloseRequestListeners: Set<() => void>;\n\n constructor(writeCb: (value: T) => void) {\n this.writeCb = writeCb;\n this.onCloseListeners = new Set();\n this.onCloseRequestListeners = new Set();\n }\n\n public write(value: T): undefined {\n if (this.isClosed()) {\n throw new Error('Cannot write to closed stream');\n }\n\n this.writeCb(value);\n }\n\n public isClosed(): boolean {\n return this.closed;\n }\n\n onClose(cb: () => void): () => void {\n if (this.isClosed()) {\n cb();\n\n return () => undefined;\n }\n\n this.onCloseListeners.add(cb);\n\n return () => this.onCloseListeners.delete(cb);\n }\n\n public close(): undefined {\n if (this.isClosed()) {\n return;\n }\n\n this.closed = true;\n this.onCloseListeners.forEach((cb) => cb());\n\n // cleanup\n this.onCloseListeners.clear();\n this.onCloseRequestListeners.clear();\n this.writeCb = () => undefined;\n }\n\n public isCloseRequested(): boolean {\n return this.closeRequested;\n }\n\n public onCloseRequest(cb: () => void): () => void {\n if (this.isClosed()) {\n throw new Error('Stream is already closed');\n }\n\n if (this.isCloseRequested()) {\n cb();\n\n return () => undefined;\n }\n\n this.onCloseRequestListeners.add(cb);\n\n return () => this.onCloseRequestListeners.delete(cb);\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n *\n * Triggers a close request.\n */\n public triggerCloseRequest(): undefined {\n if (this.isCloseRequested()) {\n throw new Error('Cannot trigger close request multiple times');\n }\n\n if (this.isClosed()) {\n throw new Error('Cannot trigger close request on closed stream');\n }\n\n this.closeRequested = true;\n this.onCloseRequestListeners.forEach((cb) => cb());\n this.onCloseRequestListeners.clear();\n }\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */\nimport { Static, TNever, TSchema, TUnion, Type } from '@sinclair/typebox';\nimport { ProcedureHandlerContext } from './context';\nimport { BaseErrorSchemaType, Result } from './result';\nimport { ReadStream, WriteStream } from './streams';\n\n/**\n * Brands a type to prevent it from being directly constructed.\n */\nexport type Branded<T> = T & { readonly __BRAND_DO_NOT_USE: unique symbol };\n\n/**\n * Unbrands a {@link Branded} type.\n */\nexport type Unbranded<T> = T extends Branded<infer U> ? U : never;\n\n/**\n * The valid {@link Procedure} types. The `stream` and `upload` types can optionally have a\n * different type for the very first initialization message. The suffixless types correspond to\n * gRPC's four combinations of stream / non-stream in each direction.\n */\nexport type ValidProcType =\n // Single message in both directions (1:1).\n | 'rpc'\n // Client-stream single message from server (n:1).\n | 'upload'\n // Single message from client, stream from server (1:n).\n | 'subscription'\n // Bidirectional stream (n:n).\n | 'stream';\n\n/**\n * Represents the payload type for {@link Procedure}s.\n */\nexport type PayloadType = TSchema;\n\n/**\n * INTERNAL_RIVER_ERROR_CODE is the code that is used when an internal error occurs,\n * this means that some invariants expected by the river server implementation have\n * been violated. When encountering this error please report this to river maintainers.\n */\nexport const INTERNAL_RIVER_ERROR_CODE = 'INTERNAL_RIVER_ERROR';\n/**\n * UNCAUGHT_ERROR_CODE is the code that is used when an error is thrown\n * inside a procedure handler that's not required.\n */\nexport const UNCAUGHT_ERROR_CODE = 'UNCAUGHT_ERROR' as const;\n/**\n * UNEXPECTED_DISCONNECT_CODE is the code used the stream's session\n * disconnect unexpetedly.\n */\nexport const UNEXPECTED_DISCONNECT_CODE = 'UNEXPECTED_DISCONNECT' as const;\n/**\n * INVALID_REQUEST_CODE is the code used when a client's request is invalid.\n */\nexport const INVALID_REQUEST_CODE = 'INVALID_REQUEST' as const;\n/**\n * ABORT_CODE is the code used when either server or client aborts the stream.\n */\nexport const ABORT_CODE = 'ABORT' as const;\n\n/**\n * OutputReaderErrorSchema is the schema for all the errors that can be\n * emitted in the Output ReadStream on the client.\n */\nexport const OutputReaderErrorSchema = Type.Object({\n code: Type.Union([\n Type.Literal(INTERNAL_RIVER_ERROR_CODE),\n Type.Literal(UNCAUGHT_ERROR_CODE),\n Type.Literal(UNEXPECTED_DISCONNECT_CODE),\n Type.Literal(INVALID_REQUEST_CODE),\n Type.Literal(ABORT_CODE),\n ]),\n message: Type.String(),\n});\n\n/**\n * InputReaderErrorSchema is the schema for all the errors that can be\n * emitted in the Input ReadStream on the server.\n */\nexport const InputReaderErrorSchema = Type.Object({\n code: Type.Union([\n Type.Literal(UNCAUGHT_ERROR_CODE),\n Type.Literal(UNEXPECTED_DISCONNECT_CODE),\n Type.Literal(INVALID_REQUEST_CODE),\n Type.Literal(ABORT_CODE),\n ]),\n message: Type.String(),\n});\n\n/**\n * Represents an acceptable schema to pass to a procedure.\n * Just a type of a schema, not an actual schema.\n */\nexport type ProcedureErrorSchemaType =\n | TUnion<Array<BaseErrorSchemaType>>\n | BaseErrorSchemaType\n | TNever;\n\n/**\n * Procedure for a single message in both directions (1:1).\n *\n * @template State - The context state object.\n * @template Init - The TypeBox schema of the initialization object.\n * @template Output - The TypeBox schema of the output object.\n * @template Err - The TypeBox schema of the error object.\n */\nexport interface RpcProcedure<\n State,\n Init extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n> {\n type: 'rpc';\n init: Init;\n output: Output;\n errors: Err;\n description?: string;\n handler(\n context: ProcedureHandlerContext<State>,\n init: Static<Init>,\n ): Promise<Result<Static<Output>, Static<Err>>>;\n}\n\n/**\n * Procedure for a client-stream (potentially preceded by an initialization message),\n * single message from server (n:1).\n *\n * @template State - The context state object.\n * @template Init - The TypeBox schema of the initialization object.\n * @template Input - The TypeBox schema of the input object.\n * @template Output - The TypeBox schema of the output object.\n * @template Err - The TypeBox schema of the error object.\n */\nexport interface UploadProcedure<\n State,\n Init extends PayloadType,\n Input extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n> {\n type: 'upload';\n init: Init;\n input: Input;\n output: Output;\n errors: Err;\n description?: string;\n handler(\n context: ProcedureHandlerContext<State>,\n init: Static<Init>,\n input: ReadStream<Static<Input>, Static<typeof InputReaderErrorSchema>>,\n ): Promise<Result<Static<Output>, Static<Err>>>;\n}\n\n/**\n * Procedure for a single message from client, stream from server (1:n).\n *\n * @template State - The context state object.\n * @template Init - The TypeBox schema of the initialization object.\n * @template Output - The TypeBox schema of the output object.\n * @template Err - The TypeBox schema of the error object.\n */\nexport interface SubscriptionProcedure<\n State,\n Init extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n> {\n type: 'subscription';\n init: Init;\n output: Output;\n errors: Err;\n description?: string;\n handler(\n context: ProcedureHandlerContext<State>,\n init: Static<Init>,\n output: WriteStream<Result<Static<Output>, Static<Err>>>,\n ): Promise<void | undefined>;\n}\n\n/**\n * Procedure for a bidirectional stream (potentially preceded by an initialization message),\n * (n:n).\n *\n * @template State - The context state object.\n * @template Init - The TypeBox schema of the initialization object.\n * @template Input - The TypeBox schema of the input object.\n * @template Output - The TypeBox schema of the output object.\n * @template Err - The TypeBox schema of the error object.\n */\nexport interface StreamProcedure<\n State,\n Init extends PayloadType,\n Input extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n> {\n type: 'stream';\n init: Init;\n input: Input;\n output: Output;\n errors: Err;\n description?: string;\n handler(\n context: ProcedureHandlerContext<State>,\n init: Static<Init>,\n input: ReadStream<Static<Input>, Static<typeof InputReaderErrorSchema>>,\n output: WriteStream<Result<Static<Output>, Static<Err>>>,\n ): Promise<void | undefined>;\n}\n\n/**\n * Defines a Procedure type that can be a:\n * - {@link RpcProcedure} for a single message in both directions (1:1)\n * - {@link UploadProcedure} for a client-stream (potentially preceded by an\n * initialization message)\n * - {@link SubscriptionProcedure} for a single message from client, stream from server (1:n)\n * - {@link StreamProcedure} for a bidirectional stream (potentially preceded by an\n * initialization message)\n *\n * @template State - The TypeBox schema of the state object.\n * @template Ty - The type of the procedure.\n * @template Input - The TypeBox schema of the input object.\n * @template Init - The TypeBox schema of the input initialization object, if any.\n * @template Output - The TypeBox schema of the output object.\n */\nexport type Procedure<\n State,\n Ty extends ValidProcType,\n Init extends PayloadType,\n Input extends PayloadType | null,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n> = { type: Ty } & (Input extends PayloadType\n ? Ty extends 'upload'\n ? UploadProcedure<State, Init, Input, Output, Err>\n : Ty extends 'stream'\n ? StreamProcedure<State, Init, Input, Output, Err>\n : never\n : Ty extends 'rpc'\n ? RpcProcedure<State, Init, Output, Err>\n : Ty extends 'subscription'\n ? SubscriptionProcedure<State, Init, Output, Err>\n : never);\n\n/**\n * Represents any {@link Procedure} type.\n *\n * @template State - The context state object. You can provide this to constrain\n * the type of procedures.\n */\nexport type AnyProcedure<State = object> = Procedure<\n State,\n ValidProcType,\n PayloadType,\n PayloadType | null,\n PayloadType,\n ProcedureErrorSchemaType\n>;\n\n/**\n * Represents a map of {@link Procedure}s.\n *\n * @template State - The context state object. You can provide this to constrain\n * the type of procedures.\n */\nexport type ProcedureMap<State = object> = Record<string, AnyProcedure<State>>;\n\n// typescript is funky so with these upcoming procedure constructors, the overloads\n// which handle the `init` case _must_ come first, otherwise the `init` property\n// is not recognized as optional, for some reason\n\n/**\n * Creates an {@link RpcProcedure}.\n */\n// signature: default errors\nfunction rpc<State, Init extends PayloadType, Output extends PayloadType>(def: {\n init: Init;\n output: Output;\n errors?: never;\n description?: string;\n handler: RpcProcedure<State, Init, Output, TNever>['handler'];\n}): Branded<RpcProcedure<State, Init, Output, TNever>>;\n\n// signature: explicit errors\nfunction rpc<\n State,\n Init extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(def: {\n init: Init;\n output: Output;\n errors: Err;\n description?: string;\n handler: RpcProcedure<State, Init, Output, Err>['handler'];\n}): Branded<RpcProcedure<State, Init, Output, Err>>;\n\n// implementation\nfunction rpc({\n init,\n output,\n errors = Type.Never(),\n description,\n handler,\n}: {\n init: PayloadType;\n output: PayloadType;\n errors?: ProcedureErrorSchemaType;\n description?: string;\n handler: RpcProcedure<\n object,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n ...(description ? { description } : {}),\n type: 'rpc',\n init,\n output,\n errors,\n handler,\n };\n}\n\n/**\n * Creates an {@link UploadProcedure}, optionally with an initialization message.\n */\n// signature: init with default errors\nfunction upload<\n State,\n Init extends PayloadType,\n Input extends PayloadType,\n Output extends PayloadType,\n>(def: {\n init: Init;\n input: Input;\n output: Output;\n errors?: never;\n description?: string;\n handler: UploadProcedure<State, Init, Input, Output, TNever>['handler'];\n}): Branded<UploadProcedure<State, Init, Input, Output, TNever>>;\n\n// signature: init with explicit errors\nfunction upload<\n State,\n Init extends PayloadType,\n Input extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(def: {\n init: Init;\n input: Input;\n output: Output;\n errors: Err;\n description?: string;\n handler: UploadProcedure<State, Init, Input, Output, Err>['handler'];\n}): Branded<UploadProcedure<State, Init, Input, Output, Err>>;\n\n// implementation\nfunction upload({\n init,\n input,\n output,\n errors = Type.Never(),\n description,\n handler,\n}: {\n init: PayloadType;\n input: PayloadType;\n output: PayloadType;\n errors?: ProcedureErrorSchemaType;\n description?: string;\n handler: UploadProcedure<\n object,\n PayloadType,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n type: 'upload',\n ...(description ? { description } : {}),\n init,\n input,\n output,\n errors,\n handler,\n };\n}\n\n/**\n * Creates a {@link SubscriptionProcedure}.\n */\n// signature: default errors\nfunction subscription<\n State,\n Init extends PayloadType,\n Output extends PayloadType,\n>(def: {\n init: Init;\n output: Output;\n errors?: never;\n description?: string;\n handler: SubscriptionProcedure<State, Init, Output, TNever>['handler'];\n}): Branded<SubscriptionProcedure<State, Init, Output, TNever>>;\n\n// signature: explicit errors\nfunction subscription<\n State,\n Init extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(def: {\n init: Init;\n output: Output;\n errors: Err;\n description?: string;\n handler: SubscriptionProcedure<State, Init, Output, Err>['handler'];\n}): Branded<SubscriptionProcedure<State, Init, Output, Err>>;\n\n// implementation\nfunction subscription({\n init,\n output,\n errors = Type.Never(),\n description,\n handler,\n}: {\n init: PayloadType;\n output: PayloadType;\n errors?: ProcedureErrorSchemaType;\n description?: string;\n handler: SubscriptionProcedure<\n object,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n type: 'subscription',\n ...(description ? { description } : {}),\n init,\n output,\n errors,\n handler,\n };\n}\n\n/**\n * Creates a {@link StreamProcedure}, optionally with an initialization message.\n */\n// signature: with default errors\nfunction stream<\n State,\n Init extends PayloadType,\n Input extends PayloadType,\n Output extends PayloadType,\n>(def: {\n init: Init;\n input: Input;\n output: Output;\n errors?: never;\n description?: string;\n handler: StreamProcedure<State, Init, Input, Output, TNever>['handler'];\n}): Branded<StreamProcedure<State, Init, Input, Output, TNever>>;\n\n// signature: explicit errors\nfunction stream<\n State,\n Init extends PayloadType,\n Input extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(def: {\n init: Init;\n input: Input;\n output: Output;\n errors: Err;\n description?: string;\n handler: StreamProcedure<State, Init, Input, Output, Err>['handler'];\n}): Branded<StreamProcedure<State, Init, Input, Output, Err>>;\n\n// implementation\nfunction stream({\n init,\n input,\n output,\n errors = Type.Never(),\n description,\n handler,\n}: {\n init: PayloadType;\n input: PayloadType;\n output: PayloadType;\n errors?: ProcedureErrorSchemaType;\n description?: string;\n handler: StreamProcedure<\n object,\n PayloadType,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n type: 'stream',\n ...(description ? { description } : {}),\n init,\n input,\n output,\n errors,\n handler,\n };\n}\n\n/**\n * Holds the {@link Procedure} creation functions. Use these to create\n * procedures for services. You aren't allowed to create procedures directly.\n */\nexport const Procedure = {\n rpc,\n upload,\n subscription,\n stream,\n};\n","import {\n AnyService,\n ProcErrors,\n ProcInit,\n ProcInput,\n ProcOutput,\n ProcType,\n AnyServiceSchemaMap,\n InstantiatedServiceSchemaMap,\n} from './services';\nimport {\n OpaqueTransportMessage,\n ControlFlags,\n TransportClientId,\n isStreamClose,\n ControlMessageCloseSchema,\n isStreamCloseRequest,\n isStreamAbort,\n} from '../transport/message';\nimport { Static } from '@sinclair/typebox';\nimport { nanoid } from 'nanoid';\nimport {\n BaseErrorSchemaType,\n Err,\n Result,\n AnyResultSchema,\n ErrResultSchema,\n} from './result';\nimport { EventMap } from '../transport/events';\nimport { Connection } from '../transport/session';\nimport { Logger } from '../logging';\nimport { createProcTelemetryInfo, getPropagationContext } from '../tracing';\nimport { ClientHandshakeOptions } from './handshake';\nimport { ClientTransport } from '../transport';\nimport {\n ReadStream,\n ReadStreamImpl,\n WriteStream,\n WriteStreamImpl,\n} from './streams';\nimport { Value } from '@sinclair/typebox/value';\nimport {\n ABORT_CODE,\n OutputReaderErrorSchema,\n PayloadType,\n UNEXPECTED_DISCONNECT_CODE,\n ValidProcType,\n} from './procedures';\n\nconst OutputErrResultSchema = ErrResultSchema(OutputReaderErrorSchema);\n\ninterface CallOptions {\n signal?: AbortSignal;\n}\n\ntype RpcFn<\n Router extends AnyService,\n ProcName extends keyof Router['procedures'],\n> = (\n init: ProcInit<Router, ProcName>,\n options?: CallOptions,\n) => Promise<\n Result<ProcOutput<Router, ProcName>, ProcErrors<Router, ProcName>>\n>;\n\ntype UploadFn<\n Router extends AnyService,\n ProcName extends keyof Router['procedures'],\n> = (\n init: ProcInit<Router, ProcName>,\n options?: CallOptions,\n) => [\n WriteStream<ProcInput<Router, ProcName>>,\n () => Promise<\n Result<ProcOutput<Router, ProcName>, ProcErrors<Router, ProcName>>\n >,\n];\n\ntype StreamFn<\n Router extends AnyService,\n ProcName extends keyof Router['procedures'],\n> = (\n init: ProcInit<Router, ProcName>,\n options?: CallOptions,\n) => [\n WriteStream<ProcInput<Router, ProcName>>,\n ReadStream<ProcOutput<Router, ProcName>, ProcErrors<Router, ProcName>>,\n];\n\ntype SubscriptionFn<\n Router extends AnyService,\n ProcName extends keyof Router['procedures'],\n> = (\n init: ProcInit<Router, ProcName>,\n options?: CallOptions,\n) => ReadStream<ProcOutput<Router, ProcName>, ProcErrors<Router, ProcName>>;\n\n/**\n * A helper type to transform an actual service type into a type\n * we can case to in the proxy.\n * @template Router - The type of the Router.\n */\ntype ServiceClient<Router extends AnyService> = {\n [ProcName in keyof Router['procedures']]: ProcType<\n Router,\n ProcName\n > extends 'rpc'\n ? {\n // If your go-to-definition ended up here, you probably meant to\n // go to the procedure name. For example:\n // riverClient.myService.someprocedure.rpc({})\n // click here ^^^^^^^^^^^^^\n rpc: RpcFn<Router, ProcName>;\n }\n : ProcType<Router, ProcName> extends 'upload'\n ? {\n // If your go-to-definition ended up here, you probably meant to\n // go to the procedure name. For example:\n // riverClient.myService.someprocedure.upload({})\n // click here ^^^^^^^^^^^^^\n upload: UploadFn<Router, ProcName>;\n }\n : ProcType<Router, ProcName> extends 'stream'\n ? {\n // If your go-to-definition ended up here, you probably meant to\n // go to the procedure name. For example:\n // riverClient.myService.someprocedure.stream({})\n // click here ^^^^^^^^^^^^^\n stream: StreamFn<Router, ProcName>;\n }\n : ProcType<Router, ProcName> extends 'subscription'\n ? {\n // If your go-to-definition ended up here, you probably meant to\n // go to the procedure name. For example:\n // riverClient.myService.subscribe.stream({})\n // click here ^^^^^^^^^^^^^\n subscribe: SubscriptionFn<Router, ProcName>;\n }\n : never;\n};\n\n/**\n * Defines a type that represents a client for a server with a set of services.\n * @template Srv - The type of the server.\n */\nexport type Client<\n Services extends AnyServiceSchemaMap,\n IS extends\n InstantiatedServiceSchemaMap<Services> = InstantiatedServiceSchemaMap<Services>,\n> = {\n [SvcName in keyof IS]: ServiceClient<IS[SvcName]>;\n};\n\ninterface ProxyCallbackOptions {\n path: Array<string>;\n args: Array<unknown>;\n}\n\ntype ProxyCallback = (opts: ProxyCallbackOptions) => unknown;\n/* eslint-disable-next-line @typescript-eslint/no-empty-function */\nconst noop = () => {};\n\nfunction _createRecursiveProxy(\n callback: ProxyCallback,\n path: Array<string>,\n): unknown {\n const proxy: unknown = new Proxy(noop, {\n // property access, recurse and add field to path\n get(_obj, key) {\n if (typeof key !== 'string') return undefined;\n return _createRecursiveProxy(callback, [...path, key]);\n },\n // hit the end, let's invoke the handler\n apply(_target, _this, args) {\n return callback({\n path,\n args,\n });\n },\n });\n\n return proxy;\n}\n\nexport interface ClientOptions {\n connectOnInvoke: boolean;\n eagerlyConnect: boolean;\n}\n\nconst defaultClientOptions: ClientOptions = {\n connectOnInvoke: true,\n eagerlyConnect: true,\n};\n\n/**\n * Creates a client for a given server using the provided transport.\n * Note that the client only needs the type of the server, not the actual\n * server definition itself.\n *\n * This relies on a proxy to dynamically create the client, so the client\n * will be typed as if it were the actual server with the appropriate services\n * and procedures.\n *\n * @template Srv - The type of the server.\n * @param {Transport} transport - The transport to use for communication.\n * @param {TransportClientId} serverId - The ID of the server to connect to.\n * @param {Partial<ClientOptions>} providedClientOptions - The options for the client.\n * @returns The client for the server.\n */\nexport function createClient<ServiceSchemaMap extends AnyServiceSchemaMap>(\n transport: ClientTransport<Connection>,\n serverId: TransportClientId,\n providedClientOptions: Partial<\n ClientOptions & {\n handshakeOptions: ClientHandshakeOptions;\n }\n > = {},\n): Client<ServiceSchemaMap> {\n if (providedClientOptions.handshakeOptions) {\n transport.extendHandshake(providedClientOptions.handshakeOptions);\n }\n\n const clientOptions = { ...defaultClientOptions, ...providedClientOptions };\n if (clientOptions.eagerlyConnect) {\n void transport.connect(serverId);\n }\n\n return _createRecursiveProxy((opts) => {\n const [serviceName, procName, procMethod] = [...opts.path];\n if (!(serviceName && procName && procMethod)) {\n throw new Error(\n 'invalid river call, ensure the service and procedure you are calling exists',\n );\n }\n\n const [init, callOptions] = opts.args;\n\n if (clientOptions.connectOnInvoke && !transport.connections.has(serverId)) {\n void transport.connect(serverId);\n }\n\n if (\n procMethod !== 'rpc' &&\n procMethod !== 'subscribe' &&\n procMethod !== 'stream' &&\n procMethod !== 'upload'\n ) {\n throw new Error(\n `invalid river call, unknown procedure type ${procMethod}`,\n );\n }\n\n return handleProc(\n procMethod === 'subscribe' ? 'subscription' : procMethod,\n transport,\n serverId,\n init,\n serviceName,\n procName,\n callOptions ? (callOptions as CallOptions).signal : undefined,\n );\n }, []) as Client<ServiceSchemaMap>;\n}\n\ntype ClientProcReturn<ProcType extends ValidProcType> = ReturnType<\n ProcType extends 'rpc'\n ? RpcFn<AnyService, string>\n : ProcType extends 'upload'\n ? UploadFn<AnyService, string>\n : ProcType extends 'stream'\n ? StreamFn<AnyService, string>\n : ProcType extends 'subscription'\n ? SubscriptionFn<AnyService, string>\n : never\n>;\n\nfunction handleProc(\n procType: ValidProcType,\n transport: ClientTransport<Connection>,\n serverId: TransportClientId,\n init: Static<PayloadType>,\n serviceName: string,\n procedureName: string,\n abortSignal?: AbortSignal,\n): ClientProcReturn<ValidProcType> {\n const procClosesWithInit = procType === 'rpc' || procType === 'subscription';\n\n const streamId = nanoid();\n const { span, ctx } = createProcTelemetryInfo(\n transport,\n procType,\n serviceName,\n procedureName,\n streamId,\n );\n let cleanClose = true;\n const inputWriter = new WriteStreamImpl<Static<PayloadType>>((rawIn) => {\n transport.send(serverId, {\n streamId,\n payload: rawIn,\n controlFlags: 0,\n tracing: getPropagationContext(ctx),\n });\n });\n inputWriter.onClose(() => {\n span.addEvent('inputWriter closed');\n\n if (!procClosesWithInit && cleanClose) {\n transport.sendCloseControl(serverId, streamId);\n }\n\n if (outputReader.isClosed()) {\n cleanup();\n }\n });\n\n const outputReader = new ReadStreamImpl<\n Static<PayloadType>,\n Static<BaseErrorSchemaType>\n >(() => {\n transport.sendRequestCloseControl(serverId, streamId);\n });\n outputReader.onClose(() => {\n span.addEvent('outputReader closed');\n\n if (inputWriter.isClosed()) {\n cleanup();\n }\n });\n\n function cleanup() {\n transport.removeEventListener('message', onMessage);\n transport.removeEventListener('sessionStatus', onSessionStatus);\n abortSignal?.removeEventListener('abort', onClientAbort);\n span.end();\n }\n\n function onClientAbort() {\n if (outputReader.isClosed() && inputWriter.isClosed()) {\n return;\n }\n\n span.addEvent('sending abort');\n\n cleanClose = false;\n\n if (!outputReader.isClosed()) {\n outputReader.pushValue(\n Err({\n code: ABORT_CODE,\n message: 'Aborted by client',\n }),\n );\n outputReader.triggerClose();\n }\n\n inputWriter.close();\n transport.sendAbort(\n serverId,\n streamId,\n Err({\n code: ABORT_CODE,\n message: 'Aborted by client',\n }),\n );\n }\n\n function onMessage(msg: OpaqueTransportMessage) {\n if (msg.streamId !== streamId) return;\n if (msg.to !== transport.clientId) {\n transport.log?.error('Got stream message from unexpected client', {\n clientId: transport.clientId,\n transportMessage: msg,\n });\n\n return;\n }\n\n if (isStreamCloseRequest(msg.controlFlags)) {\n inputWriter.triggerCloseRequest();\n }\n\n if (isStreamAbort(msg.controlFlags)) {\n cleanClose = false;\n\n span.addEvent('received abort');\n let abortResult: Static<typeof OutputErrResultSchema>;\n\n if (Value.Check(OutputErrResultSchema, msg.payload)) {\n abortResult = msg.payload;\n } else {\n abortResult = Err({\n code: ABORT_CODE,\n message: 'Stream aborted with invalid payload',\n });\n transport.log?.error(\n 'Got stream abort without a valid protocol error',\n {\n clientId: transport.clientId,\n transportMessage: msg,\n validationErrors: [\n ...Value.Errors(OutputErrResultSchema, msg.payload),\n ],\n },\n );\n }\n\n if (!outputReader.isClosed()) {\n outputReader.pushValue(abortResult);\n outputReader.triggerClose();\n }\n\n inputWriter.close();\n\n return;\n }\n\n if (outputReader.isClosed()) {\n span.recordException('Received message after output stream is closed');\n\n transport.log?.error('Received message after output stream is closed', {\n clientId: transport.clientId,\n transportMessage: msg,\n });\n\n return;\n }\n\n if (!Value.Check(ControlMessageCloseSchema, msg.payload)) {\n if (Value.Check(AnyResultSchema, msg.payload)) {\n outputReader.pushValue(msg.payload);\n } else {\n transport.log?.error(\n 'Got non-control payload, but was not a valid result',\n {\n clientId: transport.clientId,\n transportMessage: msg,\n validationErrors: [...Value.Errors(AnyResultSchema, msg.payload)],\n },\n );\n }\n }\n\n if (isStreamClose(msg.controlFlags)) {\n span.addEvent('received output close');\n\n outputReader.triggerClose();\n }\n }\n\n function onSessionStatus(evt: EventMap['sessionStatus']) {\n if (evt.status !== 'disconnect') {\n return;\n }\n\n if (evt.session.to !== serverId) {\n return;\n }\n\n cleanClose = false;\n if (!outputReader.isClosed()) {\n outputReader.pushValue(\n Err({\n code: UNEXPECTED_DISCONNECT_CODE,\n message: `${serverId} unexpectedly disconnected`,\n }),\n );\n }\n inputWriter.close();\n outputReader.triggerClose();\n }\n\n abortSignal?.addEventListener('abort', onClientAbort);\n transport.addEventListener('message', onMessage);\n transport.addEventListener('sessionStatus', onSessionStatus);\n\n transport.send(serverId, {\n streamId,\n serviceName,\n procedureName,\n tracing: getPropagationContext(ctx),\n payload: init,\n controlFlags: procClosesWithInit\n ? ControlFlags.StreamOpenBit | ControlFlags.StreamClosedBit\n : ControlFlags.StreamOpenBit,\n });\n\n if (procClosesWithInit) {\n inputWriter.close();\n }\n\n if (procType === 'subscription') {\n return outputReader;\n }\n\n if (procType === 'rpc') {\n return getSingleMessage(outputReader, transport.log);\n }\n\n if (procType === 'upload') {\n let didFinalize = false;\n return [\n inputWriter,\n async () => {\n if (didFinalize) {\n throw new Error('upload stream already finalized');\n }\n\n didFinalize = true;\n\n if (!inputWriter.isClosed()) {\n inputWriter.close();\n }\n\n return getSingleMessage(outputReader, transport.log);\n },\n ];\n }\n\n // good ol' `stream` procType\n return [inputWriter, outputReader];\n}\n\nasync function getSingleMessage(\n outputReader: ReadStream<unknown, Static<BaseErrorSchemaType>>,\n log?: Logger,\n): Promise<Result<unknown, Static<BaseErrorSchemaType>>> {\n const ret = await outputReader.asArray();\n\n if (ret.length > 1) {\n log?.error('Expected single message from server, got multiple');\n }\n\n return ret[0];\n}\n","import { Static } from '@sinclair/typebox';\nimport { ServerTransport } from '../transport';\nimport {\n PayloadType,\n ProcedureErrorSchemaType,\n InputReaderErrorSchema,\n OutputReaderErrorSchema,\n UNCAUGHT_ERROR_CODE,\n UNEXPECTED_DISCONNECT_CODE,\n AnyProcedure,\n ABORT_CODE,\n INVALID_REQUEST_CODE,\n INTERNAL_RIVER_ERROR_CODE,\n} from './procedures';\nimport {\n AnyService,\n InstantiatedServiceSchemaMap,\n AnyServiceSchemaMap,\n} from './services';\nimport {\n ControlMessagePayloadSchema,\n OpaqueTransportMessage,\n isStreamClose,\n isStreamOpen,\n ControlFlags,\n isStreamCloseRequest,\n isStreamAbort,\n} from '../transport/message';\nimport {\n ServiceContext,\n ProcedureHandlerContext,\n ParsedMetadata,\n} from './context';\nimport { Logger, MessageMetadata } from '../logging/log';\nimport { Value } from '@sinclair/typebox/value';\nimport { Err, Result, Ok, ErrResultSchema, ErrResult } from './result';\nimport { EventMap } from '../transport/events';\nimport { Connection } from '../transport/session';\nimport { coerceErrorString } from '../util/stringify';\nimport { Span, SpanStatusCode } from '@opentelemetry/api';\nimport { PropagationContext, createHandlerSpan } from '../tracing';\nimport { ServerHandshakeOptions } from './handshake';\nimport { ReadStreamImpl, WriteStreamImpl } from './streams';\n\n/**\n * A result schema for errors that can be passed to input's readstream\n */\nconst InputErrResultSchema = ErrResultSchema(InputReaderErrorSchema);\n\n/**\n * Represents a server with a set of services. Use {@link createServer} to create it.\n * @template Services - The type of services provided by the server.\n */\nexport interface Server<Services extends AnyServiceSchemaMap> {\n /**\n * Services defined for this server.\n */\n services: InstantiatedServiceSchemaMap<Services>;\n /**\n * A set of stream ids that are currently open.\n */\n openStreams: Set<string>;\n}\n\ntype InputHandlerReturn = Promise<(() => void) | void>;\n\ninterface NewProcStreamInput {\n procedure: AnyProcedure;\n procedureName: string;\n service: AnyService;\n serviceName: string;\n sessionMetadata: ParsedMetadata;\n loggingMetadata: MessageMetadata;\n streamId: string;\n controlFlags: number;\n tracingCtx?: PropagationContext;\n initPayload: Static<PayloadType>;\n from: string;\n}\n\nclass RiverServer<Services extends AnyServiceSchemaMap>\n implements Server<Services>\n{\n private transport: ServerTransport<Connection>;\n private contextMap: Map<AnyService, ServiceContext & { state: object }>;\n private log?: Logger;\n /**\n * We create a tombstones for streams aborted by the server\n * so that we don't hit errors when the client has inflight\n * requests it sent before it saw the abort.\n * We track aborted streams for every session separately, so\n * that bad clients don't affect good clients.\n */\n private serverAbortedStreams: Map<string, LRUSet>;\n private maxAbortedStreamTombstonesPerSession: number;\n\n public openStreams: Set<string>;\n public services: InstantiatedServiceSchemaMap<Services>;\n\n constructor(\n transport: ServerTransport<Connection>,\n services: Services,\n handshakeOptions?: ServerHandshakeOptions,\n extendedContext?: Omit<ServiceContext, 'state'>,\n maxAbortedStreamTombstonesPerSession = 200,\n ) {\n const instances: Record<string, AnyService> = {};\n\n this.services = instances as InstantiatedServiceSchemaMap<Services>;\n this.contextMap = new Map();\n\n for (const [name, service] of Object.entries(services)) {\n const instance = service.instantiate(extendedContext ?? {});\n instances[name] = instance;\n\n this.contextMap.set(instance, {\n ...extendedContext,\n state: instance.state,\n });\n }\n\n if (handshakeOptions) {\n transport.extendHandshake(handshakeOptions);\n }\n\n this.transport = transport;\n this.openStreams = new Set();\n this.serverAbortedStreams = new Map();\n this.maxAbortedStreamTombstonesPerSession =\n maxAbortedStreamTombstonesPerSession;\n this.log = transport.log;\n\n const handleMessage = (msg: EventMap['message']) => {\n if (msg.to !== this.transport.clientId) {\n this.log?.info(\n `got msg with destination that isn't this server, ignoring`,\n {\n clientId: this.transport.clientId,\n transportMessage: msg,\n },\n );\n return;\n }\n\n if (this.openStreams.has(msg.streamId)) {\n // has its own message handler\n return;\n }\n\n if (this.serverAbortedStreams.get(msg.from)?.has(msg.streamId)) {\n return;\n }\n\n const validated = this.validateNewProcStream(msg);\n\n if (!validated) {\n return;\n }\n\n this.createNewProcStream(validated);\n };\n this.transport.addEventListener('message', handleMessage);\n\n const handleSessionStatus = (evt: EventMap['sessionStatus']) => {\n if (evt.status !== 'disconnect') return;\n\n const disconnectedClientId = evt.session.to;\n this.log?.info(\n `got session disconnect from ${disconnectedClientId}, cleaning up streams`,\n evt.session.loggingMetadata,\n );\n\n this.serverAbortedStreams.delete(disconnectedClientId);\n };\n this.transport.addEventListener('sessionStatus', handleSessionStatus);\n\n this.transport.addEventListener('transportStatus', (evt) => {\n if (evt.status !== 'closed') return;\n\n this.transport.removeEventListener('message', handleMessage);\n this.transport.removeEventListener('sessionStatus', handleSessionStatus);\n });\n }\n\n private createNewProcStream({\n procedure,\n procedureName,\n service,\n serviceName,\n sessionMetadata,\n loggingMetadata,\n streamId,\n controlFlags,\n initPayload,\n from,\n tracingCtx,\n }: NewProcStreamInput) {\n this.openStreams.add(streamId);\n\n let cleanClose = true;\n\n const onServerAbort = (errResult: Static<typeof InputErrResultSchema>) => {\n if (inputReader.isClosed() && outputWriter.isClosed()) {\n // Everything already closed, no-op.\n return;\n }\n\n cleanClose = false;\n\n if (!inputReader.isClosed()) {\n inputReader.pushValue(errResult);\n inputReader.triggerClose();\n }\n\n outputWriter.close();\n this.abortStream(from, streamId, errResult);\n };\n\n const onHandlerAbort = () => {\n onServerAbort(\n Err({\n code: ABORT_CODE,\n message: 'Aborted by server procedure handler',\n }),\n );\n };\n const handlerAbortController = new AbortController();\n handlerAbortController.signal.addEventListener('abort', onHandlerAbort);\n\n const clientAbortController = new AbortController();\n\n const onSessionStatus = (evt: EventMap['sessionStatus']) => {\n if (evt.status !== 'disconnect') {\n return;\n }\n\n if (evt.session.to !== from) {\n return;\n }\n\n cleanClose = false;\n\n const errPayload = {\n code: UNEXPECTED_DISCONNECT_CODE,\n message: `client unexpectedly disconnected`,\n } as const;\n if (!inputReader.isClosed()) {\n inputReader.pushValue(Err(errPayload));\n inputReader.triggerClose();\n }\n\n clientAbortController.abort(errPayload);\n\n outputWriter.close();\n };\n this.transport.addEventListener('sessionStatus', onSessionStatus);\n\n const onMessage = (msg: OpaqueTransportMessage) => {\n if (streamId !== msg.streamId) {\n return;\n }\n\n if (msg.from !== from) {\n this.log?.error('Got stream message from unexpected client', {\n ...loggingMetadata,\n clientId: this.transport.clientId,\n transportMessage: msg,\n tags: ['invariant-violation'],\n });\n\n return;\n }\n\n if (isStreamCloseRequest(msg.controlFlags)) {\n outputWriter.triggerCloseRequest();\n }\n\n if (isStreamAbort(msg.controlFlags)) {\n let abortResult: Static<typeof InputErrResultSchema>;\n if (Value.Check(InputErrResultSchema, msg.payload)) {\n abortResult = msg.payload;\n } else {\n abortResult = Err({\n code: ABORT_CODE,\n message: 'Stream aborted, client sent invalid payload',\n });\n this.log?.warn('Got stream abort without a valid protocol error', {\n ...loggingMetadata,\n clientId: this.transport.clientId,\n transportMessage: msg,\n validationErrors: [\n ...Value.Errors(InputErrResultSchema, msg.payload),\n ],\n tags: ['invalid-request'],\n });\n }\n\n if (!inputReader.isClosed()) {\n inputReader.pushValue(abortResult);\n inputReader.triggerClose();\n }\n\n outputWriter.close();\n\n clientAbortController.abort(abortResult.payload);\n\n return;\n }\n\n if (inputReader.isClosed()) {\n this.log?.warn('Received message after input stream is closed', {\n ...loggingMetadata,\n clientId: this.transport.clientId,\n transportMessage: msg,\n tags: ['invalid-request'],\n });\n\n onServerAbort(\n Err({\n code: INVALID_REQUEST_CODE,\n message: 'Received message after input stream is closed',\n }),\n );\n\n return;\n }\n\n if ('input' in procedure && Value.Check(procedure.input, msg.payload)) {\n inputReader.pushValue(Ok(msg.payload));\n } else if (!Value.Check(ControlMessagePayloadSchema, msg.payload)) {\n const validationErrors = [\n ...Value.Errors(ControlMessagePayloadSchema, msg.payload),\n ];\n let errMessage = 'Expected control payload for procedure with no input';\n if ('input' in procedure) {\n errMessage =\n 'Expected either control or input payload, validation failed for both';\n validationErrors.push(...Value.Errors(procedure.input, msg.payload));\n }\n\n this.log?.warn(errMessage, {\n ...loggingMetadata,\n clientId: this.transport.clientId,\n transportMessage: msg,\n validationErrors,\n tags: ['invalid-request'],\n });\n\n onServerAbort(\n Err({\n code: INVALID_REQUEST_CODE,\n message: errMessage,\n }),\n );\n }\n\n if (isStreamClose(msg.controlFlags)) {\n inputReader.triggerClose();\n }\n };\n this.transport.addEventListener('message', onMessage);\n\n const onFinishedCallbacks: Array<() => void> = [];\n const cleanup = () => {\n this.transport.removeEventListener('message', onMessage);\n this.transport.removeEventListener('sessionStatus', onSessionStatus);\n handlerAbortController.signal.addEventListener('abort', onHandlerAbort);\n\n this.openStreams.delete(streamId);\n onFinishedCallbacks.forEach((cb) => {\n try {\n cb();\n } catch {\n // ignore user errors\n }\n });\n onFinishedCallbacks.length = 0;\n };\n\n const inputReader = new ReadStreamImpl<\n Static<PayloadType>,\n Static<typeof InputReaderErrorSchema>\n >(() => {\n this.transport.sendRequestCloseControl(from, streamId);\n });\n inputReader.onClose(() => {\n if (outputWriter.isClosed()) {\n cleanup();\n }\n });\n\n const procClosesWithResponse =\n procedure.type === 'rpc' || procedure.type === 'upload';\n const outputWriter = new WriteStreamImpl<\n Result<Static<PayloadType>, Static<ProcedureErrorSchemaType>>\n >((response) => {\n this.transport.send(from, {\n streamId,\n controlFlags: procClosesWithResponse ? ControlFlags.StreamClosedBit : 0,\n payload: response,\n });\n });\n outputWriter.onClose(() => {\n if (!procClosesWithResponse && cleanClose) {\n // we ended, send a close bit back to the client\n // also, if the client has disconnected, we don't need to send a close\n this.transport.sendCloseControl(from, streamId);\n }\n\n if (inputReader.isClosed()) {\n cleanup();\n }\n });\n\n const onHandlerError = (err: unknown, span: Span) => {\n const errorMsg = coerceErrorString(err);\n\n span.recordException(err instanceof Error ? err : new Error(errorMsg));\n span.setStatus({ code: SpanStatusCode.ERROR });\n\n onServerAbort(\n Err({\n code: UNCAUGHT_ERROR_CODE,\n message: errorMsg,\n }),\n );\n };\n\n if (isStreamClose(controlFlags)) {\n inputReader.triggerClose();\n } else if (procedure.type === 'rpc' || procedure.type === 'subscription') {\n // Though things can work just fine if they eventually follow up with a stream\n // control message with a close bit set, it's an unusual client implementation!\n this.log?.warn(`${procedure.type} sent an init without a stream close`, {\n ...loggingMetadata,\n clientId: this.transport.clientId,\n });\n }\n\n const serviceContextWithTransportInfo: ProcedureHandlerContext<object> = {\n ...this.getContext(service, serviceName),\n from,\n metadata: sessionMetadata,\n abortController: handlerAbortController,\n clientAbortSignal: clientAbortController.signal,\n onRequestFinished: (cb) => {\n if (inputReader.isClosed() && outputWriter.isClosed()) {\n // Everything already closed, call cleanup immediately.\n try {\n cb();\n } catch {\n // ignore user errors\n }\n\n return;\n }\n\n onFinishedCallbacks.push(cb);\n },\n };\n\n switch (procedure.type) {\n case 'rpc':\n void createHandlerSpan(\n procedure.type,\n serviceName,\n procedureName,\n streamId,\n tracingCtx,\n async (span): InputHandlerReturn => {\n try {\n // TODO handle never resolving after cleanup/full close\n // which would lead to us holding on to the closure forever\n const outputMessage = await procedure.handler(\n serviceContextWithTransportInfo,\n initPayload,\n );\n\n if (outputWriter.isClosed()) {\n // A disconnect happened\n return;\n }\n\n outputWriter.write(outputMessage);\n outputWriter.close();\n } catch (err) {\n onHandlerError(err, span);\n } finally {\n span.end();\n }\n },\n );\n break;\n case 'stream':\n void createHandlerSpan(\n procedure.type,\n serviceName,\n procedureName,\n streamId,\n tracingCtx,\n async (span): InputHandlerReturn => {\n try {\n // TODO handle never resolving after cleanup/full close\n // which would lead to us holding on to the closure forever\n await procedure.handler(\n serviceContextWithTransportInfo,\n initPayload,\n inputReader,\n outputWriter,\n );\n } catch (err) {\n onHandlerError(err, span);\n } finally {\n span.end();\n }\n },\n );\n\n break;\n case 'subscription':\n void createHandlerSpan(\n procedure.type,\n serviceName,\n procedureName,\n streamId,\n tracingCtx,\n async (span): InputHandlerReturn => {\n try {\n // TODO handle never resolving after cleanup/full close\n // which would lead to us holding on to the closure forever\n await procedure.handler(\n serviceContextWithTransportInfo,\n initPayload,\n outputWriter,\n );\n } catch (err) {\n onHandlerError(err, span);\n } finally {\n span.end();\n }\n },\n );\n break;\n case 'upload':\n void createHandlerSpan(\n procedure.type,\n serviceName,\n procedureName,\n streamId,\n tracingCtx,\n async (span): InputHandlerReturn => {\n try {\n // TODO handle never resolving after cleanup/full close\n // which would lead to us holding on to the closure forever\n const outputMessage = await procedure.handler(\n serviceContextWithTransportInfo,\n initPayload,\n inputReader,\n );\n\n if (outputWriter.isClosed()) {\n // A disconnect happened\n return;\n }\n outputWriter.write(outputMessage);\n outputWriter.close();\n } catch (err) {\n onHandlerError(err, span);\n } finally {\n span.end();\n }\n },\n );\n\n break;\n default:\n this.log?.error(\n `got request for invalid procedure type ${\n (procedure as AnyProcedure).type\n } at ${serviceName}.${procedureName}`,\n {\n ...loggingMetadata,\n tags: ['invariant-violation'],\n },\n );\n\n return;\n }\n }\n\n private getContext(service: AnyService, serviceName: string) {\n const context = this.contextMap.get(service);\n if (!context) {\n const err = `no context found for ${serviceName}`;\n this.log?.error(err, {\n clientId: this.transport.clientId,\n tags: ['invariant-violation'],\n });\n throw new Error(err);\n }\n\n return context;\n }\n\n private validateNewProcStream(\n initMessage: OpaqueTransportMessage,\n ): null | NewProcStreamInput {\n const session = this.transport.sessions.get(initMessage.from);\n if (!session) {\n const errMessage = `couldn't find a session for ${initMessage.from}`;\n this.log?.error(`couldn't find session for ${initMessage.from}`, {\n clientId: this.transport.clientId,\n transportMessage: initMessage,\n tags: ['invariant-violation'],\n });\n\n this.abortStream(\n initMessage.from,\n initMessage.streamId,\n Err({\n code: INTERNAL_RIVER_ERROR_CODE,\n message: errMessage,\n }),\n );\n\n return null;\n }\n\n const sessionMetadata =\n this.transport.sessionHandshakeMetadata.get(session);\n if (!sessionMetadata) {\n const errMessage = `session doesn't have handshake metadata`;\n this.log?.error(errMessage, {\n ...session.loggingMetadata,\n tags: ['invariant-violation'],\n });\n\n this.abortStream(\n initMessage.from,\n initMessage.streamId,\n Err({\n code: INTERNAL_RIVER_ERROR_CODE,\n message: errMessage,\n }),\n );\n\n return null;\n }\n\n if (!isStreamOpen(initMessage.controlFlags)) {\n const errMessage = `can't create a new procedure stream from a message that doesn't have the stream open bit set`;\n this.log?.warn(errMessage, {\n ...session.loggingMetadata,\n clientId: this.transport.clientId,\n transportMessage: initMessage,\n tags: ['invalid-request'],\n });\n\n this.abortStream(\n initMessage.from,\n initMessage.streamId,\n Err({\n code: INVALID_REQUEST_CODE,\n message: errMessage,\n }),\n );\n\n return null;\n }\n\n if (!initMessage.serviceName) {\n const errMessage = `missing service name in stream open message`;\n this.log?.warn(errMessage, {\n ...session.loggingMetadata,\n clientId: this.transport.clientId,\n transportMessage: initMessage,\n tags: ['invalid-request'],\n });\n\n this.abortStream(\n initMessage.from,\n initMessage.streamId,\n Err({\n code: INVALID_REQUEST_CODE,\n message: errMessage,\n }),\n );\n\n return null;\n }\n\n if (!initMessage.procedureName) {\n const errMessage = `missing procedure name in stream open message`;\n this.log?.warn(errMessage, {\n ...session.loggingMetadata,\n clientId: this.transport.clientId,\n transportMessage: initMessage,\n tags: ['invalid-request'],\n });\n\n this.abortStream(\n initMessage.from,\n initMessage.streamId,\n Err({\n code: INVALID_REQUEST_CODE,\n message: errMessage,\n }),\n );\n\n return null;\n }\n\n if (!(initMessage.serviceName in this.services)) {\n const errMessage = `couldn't find service ${initMessage.serviceName}`;\n this.log?.warn(errMessage, {\n ...session.loggingMetadata,\n clientId: this.transport.clientId,\n transportMessage: initMessage,\n tags: ['invalid-request'],\n });\n\n this.abortStream(\n initMessage.from,\n initMessage.streamId,\n Err({\n code: INVALID_REQUEST_CODE,\n message: errMessage,\n }),\n );\n\n return null;\n }\n\n const service = this.services[initMessage.serviceName];\n if (!(initMessage.procedureName in service.procedures)) {\n const errMessage = `couldn't find a matching procedure for ${initMessage.serviceName}.${initMessage.procedureName}`;\n this.log?.warn(errMessage, {\n ...session.loggingMetadata,\n clientId: this.transport.clientId,\n transportMessage: initMessage,\n tags: ['invalid-request'],\n });\n\n this.abortStream(\n initMessage.from,\n initMessage.streamId,\n Err({\n code: INVALID_REQUEST_CODE,\n message: errMessage,\n }),\n );\n\n return null;\n }\n\n const procedure = service.procedures[initMessage.procedureName];\n\n if (!Value.Check(procedure.init, initMessage.payload)) {\n const errMessage = `procedure init failed validation`;\n this.log?.warn(errMessage, {\n ...session.loggingMetadata,\n clientId: this.transport.clientId,\n transportMessage: initMessage,\n tags: ['invalid-request'],\n });\n\n this.abortStream(\n initMessage.from,\n initMessage.streamId,\n Err({\n code: INVALID_REQUEST_CODE,\n message: errMessage,\n }),\n );\n\n return null;\n }\n\n return {\n sessionMetadata,\n procedure,\n procedureName: initMessage.procedureName,\n service,\n serviceName: initMessage.serviceName,\n loggingMetadata: {\n ...session.loggingMetadata,\n transportMessage: initMessage,\n },\n streamId: initMessage.streamId,\n controlFlags: initMessage.controlFlags,\n tracingCtx: initMessage.tracing,\n initPayload: initMessage.payload,\n from: initMessage.from,\n };\n }\n\n abortStream(\n to: string,\n streamId: string,\n payload: ErrResult<Static<typeof OutputReaderErrorSchema>>,\n ) {\n let abortedForSession = this.serverAbortedStreams.get(to);\n\n if (!abortedForSession) {\n abortedForSession = new LRUSet(this.maxAbortedStreamTombstonesPerSession);\n\n this.serverAbortedStreams.set(to, abortedForSession);\n }\n\n abortedForSession.add(streamId);\n\n this.transport.sendAbort(to, streamId, payload);\n }\n}\n\nclass LRUSet {\n private items: Set<string>;\n private maxItems: number;\n\n constructor(maxItems: number) {\n this.items = new Set();\n this.maxItems = maxItems;\n }\n\n add(item: string) {\n if (this.items.has(item)) {\n this.items.delete(item);\n } else if (this.items.size >= this.maxItems) {\n const first = this.items.values().next();\n if (!first.done) {\n this.items.delete(first.value);\n }\n }\n this.items.add(item);\n }\n\n has(item: string) {\n return this.items.has(item);\n }\n}\n\n/**\n * Creates a server instance that listens for incoming messages from a transport and routes them to the appropriate service and procedure.\n * The server tracks the state of each service along with open streams and the extended context object.\n * @param transport - The transport to listen to.\n * @param services - An object containing all the services to be registered on the server.\n * @param handshakeOptions - An optional object containing additional handshake options to be passed to the transport.\n * @param extendedContext - An optional object containing additional context to be passed to all services.\n * @returns A promise that resolves to a server instance with the registered services.\n */\nexport function createServer<Services extends AnyServiceSchemaMap>(\n transport: ServerTransport<Connection>,\n services: Services,\n providedServerOptions?: Partial<{\n handshakeOptions?: ServerHandshakeOptions;\n extendedContext?: Omit<ServiceContext, 'state'>;\n /**\n * Maximum number of aborted streams to keep track of to avoid\n * cascading stream errors.\n */\n maxAbortedStreamTombstonesPerSession?: number;\n }>,\n): Server<Services> {\n return new RiverServer(\n transport,\n services,\n providedServerOptions?.handshakeOptions,\n providedServerOptions?.extendedContext,\n providedServerOptions?.maxAbortedStreamTombstonesPerSession,\n );\n}\n","import { Static, TSchema } from '@sinclair/typebox';\nimport { ParsedMetadata } from './context';\n\ntype ConstructHandshake<T extends TSchema> = () =>\n | Static<T>\n | Promise<Static<T>>;\n\ntype ValidateHandshake<T extends TSchema> = (\n metadata: Static<T>,\n previousParsedMetadata?: ParsedMetadata,\n) => false | ParsedMetadata | Promise<false | ParsedMetadata>;\n\nexport interface ClientHandshakeOptions<\n MetadataSchema extends TSchema = TSchema,\n> {\n /**\n * Schema for the metadata that the client sends to the server\n * during the handshake.\n */\n schema: MetadataSchema;\n\n /**\n * Gets the {@link HandshakeRequestMetadata} to send to the server.\n */\n construct: ConstructHandshake<MetadataSchema>;\n}\n\nexport interface ServerHandshakeOptions<\n MetadataSchema extends TSchema = TSchema,\n> {\n /**\n * Schema for the metadata that the server receives from the client\n * during the handshake.\n */\n schema: MetadataSchema;\n\n /**\n * Parses the {@link HandshakeRequestMetadata} sent by the client, transforming\n * it into {@link ParsedHandshakeMetadata}.\n *\n * May return `false` if the client should be rejected.\n *\n * @param metadata - The metadata sent by the client.\n * @param session - The session that the client would be associated with.\n * @param isReconnect - Whether the client is reconnecting to the session,\n * or if this is a new session.\n */\n validate: ValidateHandshake<MetadataSchema>;\n}\n\nexport function createClientHandshakeOptions<\n MetadataSchema extends TSchema = TSchema,\n>(\n schema: MetadataSchema,\n construct: ConstructHandshake<MetadataSchema>,\n): ClientHandshakeOptions {\n return { schema, construct };\n}\n\nexport function createServerHandshakeOptions<\n MetadataSchema extends TSchema = TSchema,\n>(\n schema: MetadataSchema,\n validate: ValidateHandshake<MetadataSchema>,\n): ServerHandshakeOptions {\n return { schema, validate: validate as ValidateHandshake<TSchema> };\n}\n"],"mappings":"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","names":["Type","Type","Value","Value"]}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ProtocolError,
|
|
3
3
|
Transport
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ONUXWVRC.js";
|
|
5
5
|
import {
|
|
6
6
|
defaultServerTransportOptions
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-NQWDT6GS.js";
|
|
8
8
|
import {
|
|
9
9
|
ControlMessageHandshakeRequestSchema,
|
|
10
10
|
PROTOCOL_VERSION,
|
|
11
11
|
SESSION_STATE_MISMATCH,
|
|
12
12
|
coerceErrorString,
|
|
13
13
|
handshakeResponseMessage
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-S5RL45KH.js";
|
|
15
15
|
|
|
16
16
|
// transport/server.ts
|
|
17
17
|
import { SpanStatusCode } from "@opentelemetry/api";
|
|
@@ -332,4 +332,4 @@ var ServerTransport = class extends Transport {
|
|
|
332
332
|
export {
|
|
333
333
|
ServerTransport
|
|
334
334
|
};
|
|
335
|
-
//# sourceMappingURL=chunk-
|
|
335
|
+
//# sourceMappingURL=chunk-CZP4LK3F.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Connection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NQWDT6GS.js";
|
|
4
4
|
|
|
5
5
|
// transport/impls/ws/connection.ts
|
|
6
6
|
var WebSocketConnection = class extends Connection {
|
|
@@ -56,4 +56,4 @@ var WebSocketConnection = class extends Connection {
|
|
|
56
56
|
export {
|
|
57
57
|
WebSocketConnection
|
|
58
58
|
};
|
|
59
|
-
//# sourceMappingURL=chunk-
|
|
59
|
+
//# sourceMappingURL=chunk-DJCW3SKT.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createSessionTelemetryInfo
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-S5RL45KH.js";
|
|
4
4
|
import {
|
|
5
5
|
NaiveJsonCodec
|
|
6
6
|
} from "./chunk-4PVU7J25.js";
|
|
@@ -344,4 +344,4 @@ export {
|
|
|
344
344
|
defaultClientTransportOptions,
|
|
345
345
|
defaultServerTransportOptions
|
|
346
346
|
};
|
|
347
|
-
//# sourceMappingURL=chunk-
|
|
347
|
+
//# sourceMappingURL=chunk-NQWDT6GS.js.map
|