@replit/river 0.26.9 → 0.26.11
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/README.md +1 -1
- package/dist/{chunk-6LX3MQEH.js → chunk-4DEPQJLU.js} +21 -19
- package/dist/chunk-4DEPQJLU.js.map +1 -0
- package/dist/{chunk-OPWZHQ7Z.js → chunk-ACAIVD7K.js} +3 -3
- package/dist/{chunk-YHILUN2S.js → chunk-BWFKJB6J.js} +4 -4
- package/dist/{chunk-SKWHS7YK.js → chunk-DKUZRRKE.js} +4 -4
- package/dist/{chunk-JVPSOBWJ.js → chunk-WXH5YYLA.js} +2 -2
- package/dist/{chunk-LODVVI6A.js → chunk-Z4Z7BX4W.js} +2 -2
- package/dist/{chunk-VPXUTLMK.js → chunk-ZWU5OYTF.js} +2 -2
- package/dist/chunk-ZWU5OYTF.js.map +1 -0
- package/dist/router/index.cjs +68 -66
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +1 -1
- package/dist/router/index.d.ts +1 -1
- package/dist/router/index.js +2 -2
- 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.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.js +5 -5
- package/dist/transport/index.cjs +1 -1
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.js +5 -5
- package/dist/util/testHelpers.cjs +1 -1
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +6 -2
- package/dist/util/testHelpers.d.ts +6 -2
- package/dist/util/testHelpers.js +3 -3
- package/package.json +3 -3
- package/dist/chunk-6LX3MQEH.js.map +0 -1
- package/dist/chunk-VPXUTLMK.js.map +0 -1
- /package/dist/{chunk-OPWZHQ7Z.js.map → chunk-ACAIVD7K.js.map} +0 -0
- /package/dist/{chunk-YHILUN2S.js.map → chunk-BWFKJB6J.js.map} +0 -0
- /package/dist/{chunk-SKWHS7YK.js.map → chunk-DKUZRRKE.js.map} +0 -0
- /package/dist/{chunk-JVPSOBWJ.js.map → chunk-WXH5YYLA.js.map} +0 -0
- /package/dist/{chunk-LODVVI6A.js.map → chunk-Z4Z7BX4W.js.map} +0 -0
|
@@ -56,9 +56,13 @@ declare const testingSessionOptions: SessionOptions;
|
|
|
56
56
|
declare const testingClientSessionOptions: ClientTransportOptions;
|
|
57
57
|
declare function dummySession(): SessionNoConnection;
|
|
58
58
|
declare function asClientRpc<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError, Init extends PayloadType | null = null>(state: State, proc: Procedure<State, 'rpc', I, O, E, Init>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<I>) => Promise<ProcedureResult<O, E>>;
|
|
59
|
-
declare function asClientStream<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError, Init extends PayloadType | null = null>(state: State, proc: Procedure<State, 'stream', I, O, E, Init>, init?: Init extends PayloadType ? Static<Init> : null, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): readonly [it_pushable.Pushable<
|
|
59
|
+
declare function asClientStream<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError, Init extends PayloadType | null = null>(state: State, proc: Procedure<State, 'stream', I, O, E, Init>, init?: Init extends PayloadType ? Static<Init> : null, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): readonly [it_pushable.Pushable<(I & {
|
|
60
|
+
params: [];
|
|
61
|
+
})["static"], void, unknown>, it_pushable.Pushable<ProcedureResult<O, E>, void, unknown>];
|
|
60
62
|
declare function asClientSubscription<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError>(state: State, proc: Procedure<State, 'subscription', I, O, E>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<I>) => it_pushable.Pushable<ProcedureResult<O, E>, void, unknown>;
|
|
61
|
-
declare function asClientUpload<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError, Init extends PayloadType | null = null>(state: State, proc: Procedure<State, 'upload', I, O, E, Init>, init?: Init extends PayloadType ? Static<Init> : null, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): readonly [it_pushable.Pushable<
|
|
63
|
+
declare function asClientUpload<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError, Init extends PayloadType | null = null>(state: State, proc: Procedure<State, 'upload', I, O, E, Init>, init?: Init extends PayloadType ? Static<Init> : null, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): readonly [it_pushable.Pushable<(I & {
|
|
64
|
+
params: [];
|
|
65
|
+
})["static"], void, unknown>, Promise<{
|
|
62
66
|
ok: true;
|
|
63
67
|
payload: unknown;
|
|
64
68
|
} | {
|
|
@@ -56,9 +56,13 @@ declare const testingSessionOptions: SessionOptions;
|
|
|
56
56
|
declare const testingClientSessionOptions: ClientTransportOptions;
|
|
57
57
|
declare function dummySession(): SessionNoConnection;
|
|
58
58
|
declare function asClientRpc<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError, Init extends PayloadType | null = null>(state: State, proc: Procedure<State, 'rpc', I, O, E, Init>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<I>) => Promise<ProcedureResult<O, E>>;
|
|
59
|
-
declare function asClientStream<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError, Init extends PayloadType | null = null>(state: State, proc: Procedure<State, 'stream', I, O, E, Init>, init?: Init extends PayloadType ? Static<Init> : null, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): readonly [it_pushable.Pushable<
|
|
59
|
+
declare function asClientStream<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError, Init extends PayloadType | null = null>(state: State, proc: Procedure<State, 'stream', I, O, E, Init>, init?: Init extends PayloadType ? Static<Init> : null, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): readonly [it_pushable.Pushable<(I & {
|
|
60
|
+
params: [];
|
|
61
|
+
})["static"], void, unknown>, it_pushable.Pushable<ProcedureResult<O, E>, void, unknown>];
|
|
60
62
|
declare function asClientSubscription<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError>(state: State, proc: Procedure<State, 'subscription', I, O, E>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<I>) => it_pushable.Pushable<ProcedureResult<O, E>, void, unknown>;
|
|
61
|
-
declare function asClientUpload<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError, Init extends PayloadType | null = null>(state: State, proc: Procedure<State, 'upload', I, O, E, Init>, init?: Init extends PayloadType ? Static<Init> : null, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): readonly [it_pushable.Pushable<
|
|
63
|
+
declare function asClientUpload<State extends object, I extends PayloadType, O extends PayloadType, E extends RiverError, Init extends PayloadType | null = null>(state: State, proc: Procedure<State, 'upload', I, O, E, Init>, init?: Init extends PayloadType ? Static<Init> : null, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): readonly [it_pushable.Pushable<(I & {
|
|
64
|
+
params: [];
|
|
65
|
+
})["static"], void, unknown>, Promise<{
|
|
62
66
|
ok: true;
|
|
63
67
|
payload: unknown;
|
|
64
68
|
} | {
|
package/dist/util/testHelpers.js
CHANGED
|
@@ -2,16 +2,16 @@ import {
|
|
|
2
2
|
Err,
|
|
3
3
|
UNCAUGHT_ERROR,
|
|
4
4
|
pushable
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-4DEPQJLU.js";
|
|
6
6
|
import {
|
|
7
7
|
SessionStateGraph,
|
|
8
8
|
defaultClientTransportOptions,
|
|
9
9
|
defaultTransportOptions
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-WXH5YYLA.js";
|
|
11
11
|
import {
|
|
12
12
|
coerceErrorString,
|
|
13
13
|
generateId
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-ZWU5OYTF.js";
|
|
15
15
|
import "../chunk-4PVU7J25.js";
|
|
16
16
|
|
|
17
17
|
// util/testHelpers.ts
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@replit/river",
|
|
3
3
|
"description": "It's like tRPC but... with JSON Schema Support, duplex streaming and support for service multiplexing. Transport agnostic!",
|
|
4
|
-
"version": "0.26.
|
|
4
|
+
"version": "0.26.11",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
|
@@ -50,12 +50,12 @@
|
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@msgpack/msgpack": "^3.0.0-beta2",
|
|
52
52
|
"it-pushable": "^3.2.3",
|
|
53
|
-
"nanoid": "
|
|
53
|
+
"nanoid": ">=5.0.9",
|
|
54
54
|
"ws": "^8.17.0"
|
|
55
55
|
},
|
|
56
56
|
"peerDependencies": {
|
|
57
57
|
"@opentelemetry/api": "^1.7.0",
|
|
58
|
-
"@sinclair/typebox": "~0.
|
|
58
|
+
"@sinclair/typebox": "~0.34.0"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@opentelemetry/sdk-trace-base": "^1.24.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../router/services.ts","../router/procedures.ts","../node_modules/p-defer/index.js","../node_modules/it-pushable/src/fifo.ts","../node_modules/it-pushable/src/index.ts","../router/result.ts","../router/client.ts","../router/server.ts","../router/handshake.ts"],"sourcesContent":["import { Type, TUnion, TSchema } from '@sinclair/typebox';\nimport { RiverError, RiverUncaughtSchema } from './result';\nimport {\n Branded,\n ProcedureMap,\n Unbranded,\n AnyProcedure,\n PayloadType,\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 whether the type definition for the procedure contains an init type.\n * @template S - The service.\n * @template ProcName - The name of the procedure.\n */\nexport type ProcHasInit<\n S extends AnyService,\n ProcName extends keyof S['procedures'],\n> = S['procedures'][ProcName] extends { init: PayloadType } ? true : false;\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> = S['procedures'][ProcName] extends { init: PayloadType }\n ? S['procedures'][ProcName]['init']\n : never;\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]['input'];\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> = 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> = TUnion<[S['procedures'][ProcName]['errors'], typeof RiverUncaughtSchema]>;\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 input: PayloadType;\n output: PayloadType;\n errors?: RiverError;\n type: 'rpc' | 'subscription' | 'upload' | 'stream';\n init?: PayloadType;\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 * input: Type.Object({ amount: Type.Number() }),\n * output: Type.Object({ current: Type.Number() }),\n * async handler(ctx, input) {\n * ctx.state.count += input.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 * input: Type.Object({ amount: Type.Number() }),\n * output: Type.Object({ current: Type.Number() }),\n * async handler(ctx, input) {\n * ctx.state.count += input.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 * input: Type.Object({ amount: Type.Number() }),\n * output: Type.Object({ current: Type.Number() }),\n * async handler(ctx, input) {\n * ctx.state.count += input.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 * input: Type.Object({ a: Type.Number(), b: Type.Number() }),\n * output: Type.Object({ result: Type.Number() }),\n * async handler(ctx, input) {\n * return Ok({ result: input.a + input.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 input: Type.Strict(procDef.input),\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 `init` field if the type declares it.\n ...('init' in procDef\n ? {\n init: Type.Strict(procDef.init),\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","import { Static, TNever, Type, TSchema } from '@sinclair/typebox';\nimport type { Pushable } from 'it-pushable';\nimport { ServiceContextWithTransportInfo } from './context';\nimport { Result, RiverError, RiverUncaughtSchema } from './result';\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 (potentially preceded by an initialization message), single message from server (n:1).\n | 'upload'\n // Single message from client, stream from server (1:n).\n | 'subscription'\n // Bidirectional stream (potentially preceded by an initialization message) (n:n).\n | 'stream';\n\n/**\n * Represents the payload type for {@link Procedure}s.\n */\nexport type PayloadType = TSchema;\n\n/**\n * Represents results from a {@link Procedure}. Might come from inside a stream or\n * from a single message.\n */\nexport type ProcedureResult<\n O extends PayloadType,\n E extends RiverError,\n> = Result<Static<O>, Static<E> | Static<typeof RiverUncaughtSchema>>;\n\n/**\n * Procedure for a single message in both directions (1:1).\n *\n * @template State - The context state object.\n * @template I - The TypeBox schema of the input object.\n * @template O - The TypeBox schema of the output object.\n * @template E - The TypeBox schema of the error object.\n */\nexport interface RpcProcedure<\n State,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n> {\n type: 'rpc';\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler(\n context: ServiceContextWithTransportInfo<State>,\n input: Static<I>,\n ): Promise<ProcedureResult<O, E>>;\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 I - The TypeBox schema of the input object.\n * @template O - The TypeBox schema of the output object.\n * @template E - The TypeBox schema of the error object.\n * @template Init - The TypeBox schema of the input initialization object, if any.\n */\nexport type UploadProcedure<\n State,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n Init extends PayloadType | null = null,\n> = Init extends PayloadType\n ? {\n type: 'upload';\n init: Init;\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler(\n context: ServiceContextWithTransportInfo<State>,\n init: Static<Init>,\n input: AsyncIterableIterator<Static<I>>,\n ): Promise<ProcedureResult<O, E>>;\n }\n : {\n type: 'upload';\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler(\n context: ServiceContextWithTransportInfo<State>,\n input: AsyncIterableIterator<Static<I>>,\n ): Promise<ProcedureResult<O, E>>;\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 I - The TypeBox schema of the input object.\n * @template O - The TypeBox schema of the output object.\n * @template E - The TypeBox schema of the error object.\n */\nexport interface SubscriptionProcedure<\n State,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n> {\n type: 'subscription';\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler(\n context: ServiceContextWithTransportInfo<State>,\n input: Static<I>,\n output: Pushable<ProcedureResult<O, E>>,\n ): Promise<(() => void) | void>;\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 I - The TypeBox schema of the input object.\n * @template O - The TypeBox schema of the output object.\n * @template E - The TypeBox schema of the error object.\n * @template Init - The TypeBox schema of the input initialization object, if any.\n */\nexport type StreamProcedure<\n State,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n Init extends PayloadType | null = null,\n> = Init extends PayloadType\n ? {\n type: 'stream';\n init: Init;\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler(\n context: ServiceContextWithTransportInfo<State>,\n init: Static<Init>,\n input: AsyncIterableIterator<Static<I>>,\n output: Pushable<ProcedureResult<O, E>>,\n ): Promise<(() => void) | void>;\n }\n : {\n type: 'stream';\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler(\n context: ServiceContextWithTransportInfo<State>,\n input: AsyncIterableIterator<Static<I>>,\n output: Pushable<ProcedureResult<O, E>>,\n ): Promise<(() => void) | void>;\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 I - The TypeBox schema of the input object.\n * @template O - The TypeBox schema of the output object.\n * @template Init - The TypeBox schema of the input initialization object, if any.\n */\n// prettier-ignore\nexport type Procedure<\n State,\n Ty extends ValidProcType,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n Init extends PayloadType | null = null,\n> = { type: Ty } & (\n Init extends PayloadType\n ? Ty extends 'upload' ? UploadProcedure<State, I, O, E, Init>\n : Ty extends 'stream' ? StreamProcedure<State, I, O, E, Init>\n : never\n : Ty extends 'rpc' ? RpcProcedure<State, I, O, E>\n : Ty extends 'upload' ? UploadProcedure<State, I, O, E>\n : Ty extends 'subscription' ? SubscriptionProcedure<State, I, O, E>\n : Ty extends 'stream' ? StreamProcedure<State, I, O, E>\n : never\n);\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,\n RiverError,\n PayloadType | null\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, I extends PayloadType, O extends PayloadType>(def: {\n input: I;\n output: O;\n errors?: never;\n description?: string;\n handler: RpcProcedure<State, I, O, TNever>['handler'];\n}): Branded<RpcProcedure<State, I, O, TNever>>;\n\n// signature: explicit errors\nfunction rpc<\n State,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n>(def: {\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler: RpcProcedure<State, I, O, E>['handler'];\n}): Branded<RpcProcedure<State, I, O, E>>;\n\n// implementation\nfunction rpc({\n input,\n output,\n errors = Type.Never(),\n description,\n handler,\n}: {\n input: PayloadType;\n output: PayloadType;\n errors?: RiverError;\n description?: string;\n handler: RpcProcedure<\n object,\n PayloadType,\n PayloadType,\n RiverError\n >['handler'];\n}) {\n return {\n ...(description ? { description } : {}),\n type: 'rpc',\n input,\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 I extends PayloadType,\n O extends PayloadType,\n Init extends PayloadType,\n>(def: {\n init: Init;\n input: I;\n output: O;\n errors?: never;\n description?: string;\n handler: UploadProcedure<State, I, O, TNever, Init>['handler'];\n}): Branded<UploadProcedure<State, I, O, TNever, Init>>;\n\n// signature: init with explicit errors\nfunction upload<\n State,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n Init extends PayloadType,\n>(def: {\n init: Init;\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler: UploadProcedure<State, I, O, E, Init>['handler'];\n}): Branded<UploadProcedure<State, I, O, E, Init>>;\n\n// signature: no init with default errors\nfunction upload<State, I extends PayloadType, O extends PayloadType>(def: {\n init?: never;\n input: I;\n output: O;\n errors?: never;\n description?: string;\n handler: UploadProcedure<State, I, O, TNever>['handler'];\n}): Branded<UploadProcedure<State, I, O, TNever>>;\n\n// signature: no init with explicit errors\nfunction upload<\n State,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n>(def: {\n init?: never;\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler: UploadProcedure<State, I, O, E>['handler'];\n}): Branded<UploadProcedure<State, I, O, E>>;\n\n// implementation\nfunction upload({\n init,\n input,\n output,\n errors = Type.Never(),\n description,\n handler,\n}: {\n init?: PayloadType | null;\n input: PayloadType;\n output: PayloadType;\n errors?: RiverError;\n description?: string;\n handler: UploadProcedure<\n object,\n PayloadType,\n PayloadType,\n RiverError,\n PayloadType | null\n >['handler'];\n}) {\n return init !== undefined && init !== null\n ? {\n type: 'upload',\n ...(description ? { description } : {}),\n init,\n input,\n output,\n errors,\n handler,\n }\n : {\n type: 'upload',\n ...(description ? { description } : {}),\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 I extends PayloadType,\n O extends PayloadType,\n>(def: {\n input: I;\n output: O;\n errors?: never;\n description?: string;\n handler: SubscriptionProcedure<State, I, O, TNever>['handler'];\n}): Branded<SubscriptionProcedure<State, I, O, TNever>>;\n\n// signature: explicit errors\nfunction subscription<\n State,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n>(def: {\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler: SubscriptionProcedure<State, I, O, E>['handler'];\n}): Branded<SubscriptionProcedure<State, I, O, E>>;\n\n// implementation\nfunction subscription({\n input,\n output,\n errors = Type.Never(),\n description,\n handler,\n}: {\n input: PayloadType;\n output: PayloadType;\n errors?: RiverError;\n description?: string;\n handler: SubscriptionProcedure<\n object,\n PayloadType,\n PayloadType,\n RiverError\n >['handler'];\n}) {\n return {\n type: 'subscription',\n ...(description ? { description } : {}),\n input,\n output,\n errors,\n handler,\n };\n}\n\n/**\n * Creates a {@link StreamProcedure}, optionally with an initialization message.\n */\n// signature: init with default errors\nfunction stream<\n State,\n I extends PayloadType,\n O extends PayloadType,\n Init extends PayloadType,\n>(def: {\n init: Init;\n input: I;\n output: O;\n errors?: never;\n description?: string;\n handler: StreamProcedure<State, I, O, TNever, Init>['handler'];\n}): Branded<StreamProcedure<State, I, O, TNever, Init>>;\n\n// signature: init with explicit errors\nfunction stream<\n State,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n Init extends PayloadType,\n>(def: {\n init: Init;\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler: StreamProcedure<State, I, O, E, Init>['handler'];\n}): Branded<StreamProcedure<State, I, O, E, Init>>;\n\n// signature: no init with default errors\nfunction stream<State, I extends PayloadType, O extends PayloadType>(def: {\n init?: never;\n input: I;\n output: O;\n errors?: never;\n description?: string;\n handler: StreamProcedure<State, I, O, TNever>['handler'];\n}): Branded<StreamProcedure<State, I, O, TNever>>;\n\n// signature: no init with explicit errors\nfunction stream<\n State,\n I extends PayloadType,\n O extends PayloadType,\n E extends RiverError,\n>(def: {\n init?: never;\n input: I;\n output: O;\n errors: E;\n description?: string;\n handler: StreamProcedure<State, I, O, E>['handler'];\n}): Branded<StreamProcedure<State, I, O, E>>;\n\n// implementation\nfunction stream({\n init,\n input,\n output,\n errors = Type.Never(),\n description,\n handler,\n}: {\n init?: PayloadType | null;\n input: PayloadType;\n output: PayloadType;\n errors?: RiverError;\n description?: string;\n handler: StreamProcedure<\n object,\n PayloadType,\n PayloadType,\n RiverError,\n PayloadType | null\n >['handler'];\n}) {\n return init !== undefined && init !== null\n ? {\n type: 'stream',\n ...(description ? { description } : {}),\n init,\n input,\n output,\n errors,\n handler,\n }\n : {\n type: 'stream',\n ...(description ? { description } : {}),\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","export default function pDefer() {\n\tconst deferred = {};\n\n\tdeferred.promise = new Promise((resolve, reject) => {\n\t\tdeferred.resolve = resolve;\n\t\tdeferred.reject = reject;\n\t});\n\n\treturn deferred;\n}\n","// ported from https://www.npmjs.com/package/fast-fifo\n\nexport interface Next<T> {\n done?: boolean\n error?: Error\n value?: T\n}\n\nclass FixedFIFO<T> {\n public buffer: Array<Next<T> | undefined>\n private readonly mask: number\n private top: number\n private btm: number\n public next: FixedFIFO<T> | null\n\n constructor (hwm: number) {\n if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) {\n throw new Error('Max size for a FixedFIFO should be a power of two')\n }\n\n this.buffer = new Array(hwm)\n this.mask = hwm - 1\n this.top = 0\n this.btm = 0\n this.next = null\n }\n\n push (data: Next<T>): boolean {\n if (this.buffer[this.top] !== undefined) {\n return false\n }\n\n this.buffer[this.top] = data\n this.top = (this.top + 1) & this.mask\n\n return true\n }\n\n shift (): Next<T> | undefined {\n const last = this.buffer[this.btm]\n\n if (last === undefined) {\n return undefined\n }\n\n this.buffer[this.btm] = undefined\n this.btm = (this.btm + 1) & this.mask\n return last\n }\n\n isEmpty (): boolean {\n return this.buffer[this.btm] === undefined\n }\n}\n\nexport interface FIFOOptions {\n /**\n * When the queue reaches this size, it will be split into head/tail parts\n */\n splitLimit?: number\n}\n\nexport class FIFO<T> {\n public size: number\n private readonly hwm: number\n private head: FixedFIFO<T>\n private tail: FixedFIFO<T>\n\n constructor (options: FIFOOptions = {}) {\n this.hwm = options.splitLimit ?? 16\n this.head = new FixedFIFO<T>(this.hwm)\n this.tail = this.head\n this.size = 0\n }\n\n calculateSize (obj: any): number {\n if (obj?.byteLength != null) {\n return obj.byteLength\n }\n\n return 1\n }\n\n push (val: Next<T>): void {\n if (val?.value != null) {\n this.size += this.calculateSize(val.value)\n }\n\n if (!this.head.push(val)) {\n const prev = this.head\n this.head = prev.next = new FixedFIFO<T>(2 * this.head.buffer.length)\n this.head.push(val)\n }\n }\n\n shift (): Next<T> | undefined {\n let val = this.tail.shift()\n\n if (val === undefined && (this.tail.next != null)) {\n const next = this.tail.next\n this.tail.next = null\n this.tail = next\n val = this.tail.shift()\n }\n\n if (val?.value != null) {\n this.size -= this.calculateSize(val.value)\n }\n\n return val\n }\n\n isEmpty (): boolean {\n return this.head.isEmpty()\n }\n}\n","/**\n * @packageDocumentation\n *\n * An iterable that you can push values into.\n *\n * @example\n *\n * ```js\n * import { pushable } from 'it-pushable'\n *\n * const source = pushable()\n *\n * setTimeout(() => source.push('hello'), 100)\n * setTimeout(() => source.push('world'), 200)\n * setTimeout(() => source.end(), 300)\n *\n * const start = Date.now()\n *\n * for await (const value of source) {\n * console.log(`got \"${value}\" after ${Date.now() - start}ms`)\n * }\n * console.log(`done after ${Date.now() - start}ms`)\n *\n * // Output:\n * // got \"hello\" after 105ms\n * // got \"world\" after 207ms\n * // done after 309ms\n * ```\n *\n * @example\n *\n * ```js\n * import { pushableV } from 'it-pushable'\n * import all from 'it-all'\n *\n * const source = pushableV()\n *\n * source.push(1)\n * source.push(2)\n * source.push(3)\n * source.end()\n *\n * console.info(await all(source))\n *\n * // Output:\n * // [ [1, 2, 3] ]\n * ```\n */\n\nimport deferred from 'p-defer'\nimport { FIFO, type Next } from './fifo.js'\n\nexport class AbortError extends Error {\n type: string\n code: string\n\n constructor (message?: string, code?: string) {\n super(message ?? 'The operation was aborted')\n this.type = 'aborted'\n this.code = code ?? 'ABORT_ERR'\n }\n}\n\nexport interface AbortOptions {\n signal?: AbortSignal\n}\n\ninterface BasePushable<T> {\n /**\n * End the iterable after all values in the buffer (if any) have been yielded. If an\n * error is passed the buffer is cleared immediately and the next iteration will\n * throw the passed error\n */\n end(err?: Error): this\n\n /**\n * Push a value into the iterable. Values are yielded from the iterable in the order\n * they are pushed. Values not yet consumed from the iterable are buffered.\n */\n push(value: T): this\n\n /**\n * Returns a promise that resolves when the underlying queue becomes empty (e.g.\n * this.readableLength === 0).\n *\n * If an AbortSignal is passed as an option and that signal aborts, it only\n * causes the returned promise to reject - it does not end the pushable.\n */\n onEmpty(options?: AbortOptions): Promise<void>\n\n /**\n * This property contains the number of bytes (or objects) in the queue ready to be read.\n *\n * If `objectMode` is true, this is the number of objects in the queue, if false it's the\n * total number of bytes in the queue.\n */\n readableLength: number\n}\n\n/**\n * An iterable that you can push values into.\n */\nexport interface Pushable<T, R = void, N = unknown> extends AsyncGenerator<T, R, N>, BasePushable<T> {}\n\n/**\n * Similar to `pushable`, except it yields multiple buffered chunks at a time. All values yielded from the iterable will be arrays.\n */\nexport interface PushableV<T, R = void, N = unknown> extends AsyncGenerator<T[], R, N>, BasePushable<T> {}\n\nexport interface Options {\n /**\n * A boolean value that means non-`Uint8Array`s will be passed to `.push`, default: `false`\n */\n objectMode?: boolean\n\n /**\n * A function called after *all* values have been yielded from the iterator (including\n * buffered values). In the case when the iterator is ended with an error it will be\n * passed the error as a parameter.\n */\n onEnd?(err?: Error): void\n}\n\nexport interface DoneResult { done: true }\nexport interface ValueResult<T> { done: false, value: T }\nexport type NextResult<T> = ValueResult<T> | DoneResult\n\ninterface getNext<T, V = T> { (buffer: FIFO<T>): NextResult<V> }\n\nexport interface ObjectPushableOptions extends Options {\n objectMode: true\n}\n\nexport interface BytePushableOptions extends Options {\n objectMode?: false\n}\n\n/**\n * Create a new async iterable. The values yielded from calls to `.next()`\n * or when used in a `for await of`loop are \"pushed\" into the iterable.\n * Returns an async iterable object with additional methods.\n */\nexport function pushable<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): Pushable<T>\nexport function pushable<T> (options: ObjectPushableOptions): Pushable<T>\nexport function pushable<T> (options: Options = {}): Pushable<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T> => {\n const next: Next<T> | undefined = buffer.shift()\n\n if (next == null) {\n return { done: true }\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n return {\n done: next.done === true,\n // @ts-expect-error if done is false, value will be present\n value: next.value\n }\n }\n\n return _pushable<T, T, Pushable<T>>(getNext, options)\n}\n\nexport function pushableV<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): PushableV<T>\nexport function pushableV<T> (options: ObjectPushableOptions): PushableV<T>\nexport function pushableV<T> (options: Options = {}): PushableV<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T[]> => {\n let next: Next<T> | undefined\n const values: T[] = []\n\n while (!buffer.isEmpty()) {\n next = buffer.shift()\n\n if (next == null) {\n break\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n if (next.done === false) {\n // @ts-expect-error if done is false value should be pushed\n values.push(next.value)\n }\n }\n\n if (next == null) {\n return { done: true }\n }\n\n return {\n done: next.done === true,\n value: values\n }\n }\n\n return _pushable<T, T[], PushableV<T>>(getNext, options)\n}\n\nfunction _pushable<PushType, ValueType, ReturnType> (getNext: getNext<PushType, ValueType>, options?: Options): ReturnType {\n options = options ?? {}\n let onEnd = options.onEnd\n let buffer = new FIFO<PushType>()\n let pushable: any\n let onNext: ((next: Next<PushType>) => ReturnType) | null\n let ended: boolean\n let drain = deferred()\n\n const waitNext = async (): Promise<NextResult<ValueType>> => {\n try {\n if (!buffer.isEmpty()) {\n return getNext(buffer)\n }\n\n if (ended) {\n return { done: true }\n }\n\n return await new Promise<NextResult<ValueType>>((resolve, reject) => {\n onNext = (next: Next<PushType>) => {\n onNext = null\n buffer.push(next)\n\n try {\n resolve(getNext(buffer))\n } catch (err) {\n reject(err)\n }\n\n return pushable\n }\n })\n } finally {\n if (buffer.isEmpty()) {\n // settle promise in the microtask queue to give consumers a chance to\n // await after calling .push\n queueMicrotask(() => {\n drain.resolve()\n drain = deferred()\n })\n }\n }\n }\n\n const bufferNext = (next: Next<PushType>): ReturnType => {\n if (onNext != null) {\n return onNext(next)\n }\n\n buffer.push(next)\n return pushable\n }\n\n const bufferError = (err: Error): ReturnType => {\n buffer = new FIFO()\n\n if (onNext != null) {\n return onNext({ error: err })\n }\n\n buffer.push({ error: err })\n return pushable\n }\n\n const push = (value: PushType): ReturnType => {\n if (ended) {\n return pushable\n }\n\n // @ts-expect-error `byteLength` is not declared on PushType\n if (options?.objectMode !== true && value?.byteLength == null) {\n throw new Error('objectMode was not true but tried to push non-Uint8Array value')\n }\n\n return bufferNext({ done: false, value })\n }\n const end = (err?: Error): ReturnType => {\n if (ended) return pushable\n ended = true\n\n return (err != null) ? bufferError(err) : bufferNext({ done: true })\n }\n const _return = (): DoneResult => {\n buffer = new FIFO()\n end()\n\n return { done: true }\n }\n const _throw = (err: Error): DoneResult => {\n end(err)\n\n return { done: true }\n }\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next: waitNext,\n return: _return,\n throw: _throw,\n push,\n end,\n get readableLength (): number {\n return buffer.size\n },\n onEmpty: async (options?: AbortOptions) => {\n const signal = options?.signal\n signal?.throwIfAborted()\n\n if (buffer.isEmpty()) {\n return\n }\n\n let cancel: Promise<void> | undefined\n let listener: (() => void) | undefined\n\n if (signal != null) {\n cancel = new Promise((resolve, reject) => {\n listener = () => {\n reject(new AbortError())\n }\n\n signal.addEventListener('abort', listener)\n })\n }\n\n try {\n await Promise.race([\n drain.promise,\n cancel\n ])\n } finally {\n if (listener != null && signal != null) {\n signal?.removeEventListener('abort', listener)\n }\n }\n }\n }\n\n if (onEnd == null) {\n return pushable\n }\n\n const _pushable = pushable\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next () {\n return _pushable.next()\n },\n throw (err: Error) {\n _pushable.throw(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return { done: true }\n },\n return () {\n _pushable.return()\n\n if (onEnd != null) {\n onEnd()\n onEnd = undefined\n }\n\n return { done: true }\n },\n push,\n end (err: Error) {\n _pushable.end(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return pushable\n },\n get readableLength () {\n return _pushable.readableLength\n },\n onEmpty: (opts?: AbortOptions) => {\n return _pushable.onEmpty(opts)\n }\n }\n\n return pushable\n}\n","import {\n TLiteral,\n TNever,\n TObject,\n TSchema,\n TString,\n TUnion,\n Type,\n} from '@sinclair/typebox';\nimport { Client } from './client';\n\ntype TLiteralString = TLiteral<string>;\n\nexport type RiverErrorSchema =\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\nexport type RiverError =\n | TUnion<Array<RiverErrorSchema>>\n | RiverErrorSchema\n | TNever;\n\nexport const UNCAUGHT_ERROR = 'UNCAUGHT_ERROR';\nexport const UNEXPECTED_DISCONNECT = 'UNEXPECTED_DISCONNECT';\nexport const RiverUncaughtSchema = Type.Object({\n code: Type.Union([\n Type.Literal(UNCAUGHT_ERROR),\n Type.Literal(UNEXPECTED_DISCONNECT),\n ]),\n message: Type.String(),\n});\n\nexport type Result<T, E> =\n | {\n ok: true;\n payload: T;\n }\n | {\n ok: false;\n payload: E;\n };\n\nexport function Ok<const T extends Array<unknown>, const E>(p: T): Result<T, E>;\nexport function Ok<const T extends ReadonlyArray<unknown>, const E>(\n p: T,\n): Result<T, E>;\nexport function Ok<const T, const E>(payload: T): Result<T, E>;\nexport function Ok<const T, const E>(payload: T): Result<T, E> {\n return {\n ok: true,\n payload,\n };\n}\n\nexport function Err<const T, const E>(error: E): Result<T, E> {\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 * Refine a {@link Result} type to its error payload.\n */\nexport type ResultUnwrapErr<R> = R extends Result<infer __T, infer E>\n ? E\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 ? Awaited<ReturnType<UploadHandler>> extends [\n infer __UploadInputMessage,\n infer UploadOutputMessage,\n ]\n ? Awaited<UploadOutputMessage>\n : never\n : Procedure extends object & { stream: infer StreamHandler extends Fn }\n ? Awaited<ReturnType<StreamHandler>> extends [\n infer __StreamInputMessage,\n AsyncGenerator<infer StreamOutputMessage>,\n infer __StreamCloseHandle,\n ]\n ? StreamOutputMessage\n : never\n : Procedure extends object & {\n subscribe: infer SubscriptionHandler extends Fn;\n }\n ? Awaited<ReturnType<SubscriptionHandler>> extends [\n AsyncGenerator<infer SubscriptionOutputMessage>,\n infer __SubscriptionCloseHandle,\n ]\n ? SubscriptionOutputMessage\n : never\n : never\n : never\n : never;\n","import {\n AnyService,\n ProcErrors,\n ProcHasInit,\n ProcInit,\n ProcInput,\n ProcOutput,\n ProcType,\n AnyServiceSchemaMap,\n InstantiatedServiceSchemaMap,\n} from './services';\nimport { pushable } from 'it-pushable';\nimport type { Pushable } from 'it-pushable';\nimport {\n OpaqueTransportMessage,\n ControlFlags,\n TransportClientId,\n isStreamClose,\n PartialTransportMessage,\n closeStreamMessage,\n} from '../transport/message';\nimport { Static } from '@sinclair/typebox';\nimport { Err, Result, UNEXPECTED_DISCONNECT } from './result';\nimport { EventMap } from '../transport/events';\nimport { createProcTelemetryInfo, getPropagationContext } from '../tracing';\nimport { ClientHandshakeOptions } from './handshake';\nimport { generateId } from '../transport/id';\nimport { Connection } from '../transport/connection';\nimport { ClientTransport } from '../transport/client';\n\n// helper to make next, yield, and return all the same type\nexport type AsyncIter<T> = AsyncGenerator<T, T>;\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 rpc: (\n input: Static<ProcInput<Router, ProcName>>,\n ) => Promise<\n Result<\n Static<ProcOutput<Router, ProcName>>,\n Static<ProcErrors<Router, ProcName>>\n >\n >;\n }\n : ProcType<Router, ProcName> extends 'upload'\n ? ProcHasInit<Router, ProcName> extends true\n ? {\n upload: (init: Static<ProcInit<Router, ProcName>>) => Promise<\n [\n Pushable<Static<ProcInput<Router, ProcName>>>, // input\n Promise<\n Result<\n Static<ProcOutput<Router, ProcName>>,\n Static<ProcErrors<Router, ProcName>>\n >\n >, // output\n ]\n >;\n }\n : {\n upload: () => Promise<\n [\n Pushable<Static<ProcInput<Router, ProcName>>>, // input\n Promise<\n Result<\n Static<ProcOutput<Router, ProcName>>,\n Static<ProcErrors<Router, ProcName>>\n >\n >, // output\n ]\n >;\n }\n : ProcType<Router, ProcName> extends 'stream'\n ? ProcHasInit<Router, ProcName> extends true\n ? {\n stream: (init: Static<ProcInit<Router, ProcName>>) => Promise<\n [\n Pushable<Static<ProcInput<Router, ProcName>>>, // input\n AsyncIter<\n Result<\n Static<ProcOutput<Router, ProcName>>,\n Static<ProcErrors<Router, ProcName>>\n >\n >, // output\n () => void, // close handle\n ]\n >;\n }\n : {\n stream: () => Promise<\n [\n Pushable<Static<ProcInput<Router, ProcName>>>, // input\n AsyncIter<\n Result<\n Static<ProcOutput<Router, ProcName>>,\n Static<ProcErrors<Router, ProcName>>\n >\n >, // output\n () => void, // close handle\n ]\n >;\n }\n : ProcType<Router, ProcName> extends 'subscription'\n ? {\n subscribe: (input: Static<ProcInput<Router, ProcName>>) => Promise<\n [\n AsyncIter<\n Result<\n Static<ProcOutput<Router, ProcName>>,\n Static<ProcErrors<Router, ProcName>>\n >\n >, // output\n () => void, // close handle\n ]\n >;\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 options = { ...defaultClientOptions, ...providedClientOptions };\n if (options.eagerlyConnect) {\n transport.connect(serverId);\n }\n\n return _createRecursiveProxy(async (opts) => {\n const [serviceName, procName, procType] = [...opts.path];\n if (!(serviceName && procName && procType)) {\n throw new Error(\n 'invalid river call, ensure the service and procedure you are calling exists',\n );\n }\n\n const [input] = opts.args;\n if (options.connectOnInvoke && !transport.sessions.has(serverId)) {\n transport.connect(serverId);\n }\n\n if (procType === 'rpc') {\n return handleRpc(transport, serverId, input, serviceName, procName);\n } else if (procType === 'stream') {\n return handleStream(transport, serverId, input, serviceName, procName);\n } else if (procType === 'subscribe') {\n return handleSubscribe(transport, serverId, input, serviceName, procName);\n } else if (procType === 'upload') {\n return handleUpload(transport, serverId, input, serviceName, procName);\n } else {\n throw new Error(`invalid river call, unknown procedure type ${procType}`);\n }\n }, []) as Client<ServiceSchemaMap>;\n}\n\nfunction createSessionDisconnectHandler(\n from: TransportClientId,\n cb: () => void,\n) {\n return (evt: EventMap['sessionStatus']) => {\n if (evt.status === 'disconnect' && evt.session.to === from) {\n cb();\n }\n };\n}\n\nfunction handleRpc(\n transport: ClientTransport<Connection>,\n serverId: TransportClientId,\n input: unknown,\n serviceName: string,\n procedureName: string,\n) {\n const streamId = generateId();\n const { span, ctx } = createProcTelemetryInfo(\n transport,\n 'rpc',\n serviceName,\n procedureName,\n streamId,\n );\n transport.send(serverId, {\n streamId,\n serviceName,\n procedureName,\n payload: input,\n tracing: getPropagationContext(ctx),\n controlFlags: ControlFlags.StreamOpenBit | ControlFlags.StreamClosedBit,\n });\n let cleanedUp = false;\n\n const responsePromise = new Promise((resolve) => {\n // on disconnect, set a timer to return an error\n // on (re)connect, clear the timer\n const onSessionStatus = createSessionDisconnectHandler(serverId, () => {\n cleanup();\n resolve(\n Err({\n code: UNEXPECTED_DISCONNECT,\n message: `${serverId} unexpectedly disconnected`,\n }),\n );\n });\n\n function cleanup() {\n if (cleanedUp) return;\n cleanedUp = true;\n transport.removeEventListener('message', onMessage);\n transport.removeEventListener('sessionStatus', onSessionStatus);\n span.end();\n }\n\n function onMessage(msg: OpaqueTransportMessage) {\n if (msg.streamId !== streamId) return;\n if (msg.to !== transport.clientId) return;\n\n // cleanup and resolve as soon as we get a message\n cleanup();\n resolve(msg.payload);\n }\n\n transport.addEventListener('message', onMessage);\n transport.addEventListener('sessionStatus', onSessionStatus);\n });\n return responsePromise;\n}\n\nfunction handleStream(\n transport: ClientTransport<Connection>,\n serverId: TransportClientId,\n init: unknown,\n serviceName: string,\n procedureName: string,\n) {\n const streamId = generateId();\n const { span, ctx } = createProcTelemetryInfo(\n transport,\n 'stream',\n serviceName,\n procedureName,\n streamId,\n );\n const inputStream = pushable({ objectMode: true });\n const outputStream = pushable({ objectMode: true });\n let firstMessage = true;\n let sentClose = false;\n let cleanedUp = false;\n\n if (init) {\n transport.send(serverId, {\n streamId,\n serviceName,\n procedureName,\n payload: init,\n tracing: getPropagationContext(ctx),\n controlFlags: ControlFlags.StreamOpenBit,\n });\n\n firstMessage = false;\n }\n\n // input -> transport\n // this gets cleaned up on inputStream.end() which is called by closeHandler\n const pipeInputToTransport = async () => {\n for await (const rawIn of inputStream) {\n const m: PartialTransportMessage = {\n streamId,\n payload: rawIn,\n controlFlags: 0,\n };\n\n if (firstMessage) {\n m.serviceName = serviceName;\n m.procedureName = procedureName;\n m.tracing = getPropagationContext(ctx);\n m.controlFlags |= ControlFlags.StreamOpenBit;\n firstMessage = false;\n }\n\n transport.send(serverId, m);\n }\n\n if (sentClose) return;\n sentClose = true;\n // after ending input stream, send a close message to the server\n const m = closeStreamMessage(streamId);\n // TODO: remove these fields once we are confident of the fix.\n m.serviceName = serviceName;\n m.procedureName = procedureName;\n m.tracing = getPropagationContext(ctx);\n if (firstMessage) {\n m.controlFlags |= ControlFlags.StreamOpenBit;\n firstMessage = false;\n }\n transport.send(serverId, m);\n };\n\n void pipeInputToTransport();\n\n // transport -> output\n function onMessage(msg: OpaqueTransportMessage) {\n if (msg.streamId !== streamId) return;\n if (msg.to !== transport.clientId) return;\n\n if (isStreamClose(msg.controlFlags)) {\n cleanup();\n } else {\n outputStream.push(msg.payload);\n }\n }\n\n function cleanup() {\n if (cleanedUp) return;\n cleanedUp = true;\n inputStream.end();\n outputStream.end();\n transport.removeEventListener('message', onMessage);\n transport.removeEventListener('sessionStatus', onSessionStatus);\n span.end();\n }\n\n // close stream after disconnect + grace period elapses\n const onSessionStatus = createSessionDisconnectHandler(serverId, () => {\n outputStream.push(\n Err({\n code: UNEXPECTED_DISCONNECT,\n message: `${serverId} unexpectedly disconnected`,\n }),\n );\n sentClose = true;\n cleanup();\n });\n\n transport.addEventListener('message', onMessage);\n transport.addEventListener('sessionStatus', onSessionStatus);\n return [inputStream, outputStream, cleanup];\n}\n\nfunction handleSubscribe(\n transport: ClientTransport<Connection>,\n serverId: TransportClientId,\n input: unknown,\n serviceName: string,\n procedureName: string,\n) {\n const streamId = generateId();\n const { span, ctx } = createProcTelemetryInfo(\n transport,\n 'subscription',\n serviceName,\n procedureName,\n streamId,\n );\n\n transport.send(serverId, {\n streamId,\n serviceName,\n procedureName,\n payload: input,\n tracing: getPropagationContext(ctx),\n controlFlags: ControlFlags.StreamOpenBit,\n });\n\n let sentClose = false;\n let cleanedUp = false;\n\n // transport -> output\n const outputStream = pushable({ objectMode: true });\n function onMessage(msg: OpaqueTransportMessage) {\n if (msg.streamId !== streamId) return;\n if (msg.to !== transport.clientId) return;\n\n if (isStreamClose(msg.controlFlags)) {\n cleanup();\n } else {\n outputStream.push(msg.payload);\n }\n }\n\n function cleanup() {\n if (cleanedUp) return;\n cleanedUp = true;\n outputStream.end();\n transport.removeEventListener('message', onMessage);\n transport.removeEventListener('sessionStatus', onSessionStatus);\n span.end();\n }\n\n const closeHandler = () => {\n cleanup();\n if (sentClose) return;\n sentClose = true;\n const m = closeStreamMessage(streamId);\n // TODO: remove these fields once we are confident of the fix.\n m.serviceName = serviceName;\n m.procedureName = procedureName;\n m.tracing = getPropagationContext(ctx);\n transport.send(serverId, m);\n };\n\n // close stream after disconnect + grace period elapses\n const onSessionStatus = createSessionDisconnectHandler(serverId, () => {\n outputStream.push(\n Err({\n code: UNEXPECTED_DISCONNECT,\n message: `${serverId} unexpectedly disconnected`,\n }),\n );\n sentClose = true;\n cleanup();\n });\n\n transport.addEventListener('message', onMessage);\n transport.addEventListener('sessionStatus', onSessionStatus);\n return [outputStream, closeHandler];\n}\n\nfunction handleUpload(\n transport: ClientTransport<Connection>,\n serverId: TransportClientId,\n init: unknown,\n serviceName: string,\n procedureName: string,\n) {\n const streamId = generateId();\n const { span, ctx } = createProcTelemetryInfo(\n transport,\n 'upload',\n serviceName,\n procedureName,\n streamId,\n );\n const inputStream = pushable({ objectMode: true });\n let firstMessage = true;\n let sentClose = false;\n let cleanedUp = false;\n\n if (init) {\n transport.send(serverId, {\n streamId,\n serviceName,\n procedureName,\n payload: init,\n tracing: getPropagationContext(ctx),\n controlFlags: ControlFlags.StreamOpenBit,\n });\n\n firstMessage = false;\n }\n\n // input -> transport\n // this gets cleaned up on inputStream.end(), which the caller should call.\n const pipeInputToTransport = async () => {\n for await (const rawIn of inputStream) {\n const m: PartialTransportMessage = {\n streamId,\n payload: rawIn,\n controlFlags: 0,\n };\n\n if (firstMessage) {\n m.serviceName = serviceName;\n m.procedureName = procedureName;\n m.tracing = getPropagationContext(ctx);\n m.controlFlags |= ControlFlags.StreamOpenBit;\n firstMessage = false;\n }\n\n transport.send(serverId, m);\n }\n\n if (sentClose) return;\n sentClose = true;\n // after ending input stream, send a close message to the server\n const m = closeStreamMessage(streamId);\n // TODO: remove these fields once we are confident of the fix.\n m.serviceName = serviceName;\n m.procedureName = procedureName;\n m.tracing = getPropagationContext(ctx);\n if (firstMessage) {\n m.controlFlags |= ControlFlags.StreamOpenBit;\n firstMessage = false;\n }\n transport.send(serverId, m);\n };\n\n void pipeInputToTransport();\n\n const responsePromise = new Promise((resolve) => {\n // on disconnect, set a timer to return an error\n // on (re)connect, clear the timer\n const onSessionStatus = createSessionDisconnectHandler(serverId, () => {\n sentClose = true;\n cleanup();\n resolve(\n Err({\n code: UNEXPECTED_DISCONNECT,\n message: `${serverId} unexpectedly disconnected`,\n }),\n );\n });\n\n function cleanup() {\n if (cleanedUp) return;\n cleanedUp = true;\n inputStream.end();\n transport.removeEventListener('message', onMessage);\n transport.removeEventListener('sessionStatus', onSessionStatus);\n span.end();\n }\n\n function onMessage(msg: OpaqueTransportMessage) {\n if (msg.streamId !== streamId) return;\n if (msg.to !== transport.clientId) return;\n\n // cleanup and resolve as soon as we get a message\n cleanup();\n resolve(msg.payload);\n }\n\n transport.addEventListener('message', onMessage);\n transport.addEventListener('sessionStatus', onSessionStatus);\n });\n return [inputStream, responsePromise];\n}\n","import { Static } from '@sinclair/typebox';\nimport { AnyProcedure, PayloadType } from './procedures';\nimport {\n AnyService,\n InstantiatedServiceSchemaMap,\n AnyServiceSchemaMap,\n} from './services';\nimport { pushable } from 'it-pushable';\nimport type { Pushable } from 'it-pushable';\nimport {\n ControlMessagePayloadSchema,\n OpaqueTransportMessage,\n isStreamClose,\n isStreamOpen,\n ControlFlags,\n closeStreamMessage,\n PartialTransportMessage,\n} from '../transport/message';\nimport {\n ServiceContext,\n ServiceContextWithState,\n ServiceContextWithTransportInfo,\n} from './context';\nimport { Logger } from '../logging/log';\nimport { Value } from '@sinclair/typebox/value';\nimport {\n Err,\n Result,\n RiverError,\n RiverUncaughtSchema,\n UNCAUGHT_ERROR,\n} from './result';\nimport { EventMap } from '../transport/events';\nimport { coerceErrorString } from '../util/stringify';\nimport { Span, SpanStatusCode } from '@opentelemetry/api';\nimport { createHandlerSpan } from '../tracing';\nimport { ServerHandshakeOptions } from './handshake';\nimport { Connection } from '../transport/connection';\nimport { ServerTransport } from '../transport/server';\nimport { SessionId } from '../transport/sessionStateMachine/common';\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 services: InstantiatedServiceSchemaMap<Services>;\n streams: Map<StreamId, ProcStream>;\n}\n\ntype StreamId = string;\n\ninterface ProcStream {\n id: StreamId;\n serviceName: string;\n procedureName: string;\n incoming: Pushable<PayloadType>;\n outgoing: Pushable<Result<Static<PayloadType>, Static<RiverError>>>;\n promises: {\n outputHandler: Promise<unknown>;\n inputHandler: Promise<unknown>;\n };\n}\n\nclass RiverServer<Services extends AnyServiceSchemaMap> {\n transport: ServerTransport<Connection>;\n services: InstantiatedServiceSchemaMap<Services>;\n contextMap: Map<AnyService, ServiceContextWithState<object>>;\n streamMap: Map<StreamId, ProcStream>;\n sessionToStreamId: Map<SessionId, Set<StreamId>>;\n\n // streams that are in the process of being cleaned up\n // this is to prevent output handlers from sending after the stream is cleaned up\n sessionsBeingCleanedUp = new Set<SessionId>();\n\n private log?: Logger;\n constructor(\n transport: ServerTransport<Connection>,\n services: Services,\n handshakeOptions?: ServerHandshakeOptions,\n extendedContext?: Omit<ServiceContext, 'state'>,\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.streamMap = new Map();\n this.sessionToStreamId = new Map();\n this.transport.addEventListener('message', this.onMessage);\n this.transport.addEventListener('sessionStatus', this.onSessionStatus);\n this.log = transport.log;\n\n this.transport.addEventListener('transportStatus', async ({ status }) => {\n if (status !== 'closed') {\n return;\n }\n\n this.transport.removeEventListener('message', this.onMessage);\n this.transport.removeEventListener('sessionStatus', this.onSessionStatus);\n await Promise.all([...this.streamMap.keys()].map(this.cleanupStream));\n });\n }\n\n get streams() {\n return this.streamMap;\n }\n\n onMessage = async (message: OpaqueTransportMessage) => {\n if (message.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: message,\n },\n );\n return;\n }\n\n let procStream = this.streamMap.get(message.streamId);\n const isInitMessage = !procStream;\n\n // create a proc stream if it doesnt exist\n procStream ||= this.createNewProcStream(message);\n if (!procStream) {\n // if we fail to create a proc stream, just abort\n return;\n }\n\n await this.pushToStream(procStream, message, isInitMessage);\n };\n\n onSessionStatus = async (evt: EventMap['sessionStatus']) => {\n const streamsFromThisClient = this.sessionToStreamId.get(evt.session.id);\n\n const cleanupStreams = async (ids: Set<string>) => {\n this.sessionsBeingCleanedUp.add(evt.session.id);\n await Promise.all(Array.from(ids).map(this.cleanupStream));\n this.sessionToStreamId.delete(evt.session.id);\n this.sessionsBeingCleanedUp.delete(evt.session.id);\n };\n\n if (evt.status === 'connect') {\n // check to see if we have any streams from this session\n if (streamsFromThisClient) {\n this.log?.error(\n `got session connect from ${evt.session.to} but there are still streams open from this session`,\n {\n clientId: this.transport.clientId,\n tags: ['invariant-violation'],\n },\n );\n\n await cleanupStreams(streamsFromThisClient);\n }\n\n this.sessionToStreamId.set(evt.session.id, new Set());\n return;\n }\n\n // cleanup\n this.log?.info(\n `got session disconnect from ${evt.session.to}, cleaning up streams for session`,\n evt.session.loggingMetadata,\n );\n\n if (!streamsFromThisClient) return;\n await cleanupStreams(streamsFromThisClient);\n };\n\n createNewProcStream(message: OpaqueTransportMessage) {\n if (!isStreamOpen(message.controlFlags)) {\n this.log?.error(\n `can't create a new procedure stream from a message that doesn't have the stream open bit set`,\n {\n clientId: this.transport.clientId,\n transportMessage: message,\n tags: ['invariant-violation'],\n },\n );\n return;\n }\n\n if (!message.procedureName || !message.serviceName) {\n this.log?.warn(\n `missing procedure or service name in stream open message`,\n {\n clientId: this.transport.clientId,\n transportMessage: message,\n },\n );\n return;\n }\n\n if (!(message.serviceName in this.services)) {\n this.log?.warn(`couldn't find service ${message.serviceName}`, {\n clientId: this.transport.clientId,\n transportMessage: message,\n });\n return;\n }\n\n const service = this.services[message.serviceName];\n const serviceContext = this.getContext(service, message.serviceName);\n if (!(message.procedureName in service.procedures)) {\n this.log?.warn(\n `couldn't find a matching procedure for ${message.serviceName}.${message.procedureName}`,\n {\n clientId: this.transport.clientId,\n transportMessage: message,\n },\n );\n return;\n }\n\n const session = this.transport.sessions.get(message.from);\n if (!session) {\n this.log?.warn(`couldn't find session for ${message.from}`, {\n clientId: this.transport.clientId,\n transportMessage: message,\n });\n return;\n }\n\n const {\n to,\n id: sessionId,\n loggingMetadata: sessionLoggingMetadata,\n } = session;\n const procedure = service.procedures[message.procedureName];\n const incoming: ProcStream['incoming'] = pushable({ objectMode: true });\n const outgoing: ProcStream['outgoing'] = pushable({ objectMode: true });\n const needsClose =\n procedure.type === 'subscription' || procedure.type === 'stream';\n const disposables: Array<() => void> = [];\n\n // this will be removed in v2 after have better abstractions for when to cleanup\n const wrappedSend = (payload: PartialTransportMessage) => {\n if (!this.sessionsBeingCleanedUp.has(sessionId)) {\n this.transport.send(to, payload);\n }\n };\n\n const outputHandler: Promise<unknown> =\n // sending outgoing messages back to client\n needsClose\n ? // subscription and stream case, we need to send a close bit after the response stream\n (async () => {\n for await (const response of outgoing) {\n wrappedSend({\n streamId: message.streamId,\n controlFlags: 0,\n payload: response,\n });\n }\n\n // we ended, send a close bit back to the client\n wrappedSend(closeStreamMessage(message.streamId));\n\n // call disposables returned from handlers\n disposables.forEach((d) => d());\n })()\n : // rpc and upload case, we just send the response back with close bit\n (async () => {\n const response = await outgoing.next().then((res) => res.value);\n if (response) {\n wrappedSend({\n streamId: message.streamId,\n controlFlags: ControlFlags.StreamClosedBit,\n payload: response,\n });\n\n // call disposables returned from handlers\n disposables.forEach((d) => d());\n }\n })();\n\n const errorHandler = (err: unknown, span: Span) => {\n const errorMsg = coerceErrorString(err);\n this.log?.error(\n `procedure ${message.serviceName}.${message.procedureName} threw an uncaught error: ${errorMsg}`,\n sessionLoggingMetadata,\n );\n\n span.recordException(err instanceof Error ? err : new Error(errorMsg));\n span.setStatus({ code: SpanStatusCode.ERROR });\n outgoing.push(\n Err({\n code: UNCAUGHT_ERROR,\n message: errorMsg,\n } satisfies Static<typeof RiverUncaughtSchema>),\n );\n };\n\n const sessionMeta = this.transport.sessionHandshakeMetadata.get(to);\n if (!sessionMeta) {\n this.log?.error(`session doesn't have handshake metadata`, {\n ...sessionLoggingMetadata,\n tags: ['invariant-violation'],\n });\n return;\n }\n\n // pump incoming message stream -> handler -> outgoing message stream\n let inputHandler: Promise<unknown>;\n const procHasInitMessage = 'init' in procedure;\n const serviceContextWithTransportInfo: ServiceContextWithTransportInfo<object> =\n {\n ...serviceContext,\n sessionId,\n to: message.to,\n from: message.from,\n streamId: message.streamId,\n metadata: sessionMeta,\n };\n\n switch (procedure.type) {\n case 'rpc':\n inputHandler = createHandlerSpan(\n procedure.type,\n message,\n async (span) => {\n const inputMessage = await incoming.next();\n if (inputMessage.done) {\n return;\n }\n try {\n const outputMessage = await procedure.handler(\n serviceContextWithTransportInfo,\n inputMessage.value,\n );\n outgoing.push(outputMessage);\n } catch (err) {\n errorHandler(err, span);\n } finally {\n span.end();\n }\n },\n );\n break;\n case 'stream':\n if (procHasInitMessage) {\n inputHandler = createHandlerSpan(\n procedure.type,\n message,\n async (span) => {\n const initMessage = await incoming.next();\n if (initMessage.done) {\n return;\n }\n\n try {\n const dispose = await procedure.handler(\n serviceContextWithTransportInfo,\n initMessage.value,\n incoming,\n outgoing,\n );\n\n if (dispose) {\n disposables.push(dispose);\n }\n } catch (err) {\n errorHandler(err, span);\n } finally {\n span.end();\n }\n },\n );\n } else {\n inputHandler = createHandlerSpan(\n procedure.type,\n message,\n async (span) => {\n try {\n const dispose = await procedure.handler(\n serviceContextWithTransportInfo,\n incoming,\n outgoing,\n );\n if (dispose) {\n disposables.push(dispose);\n }\n } catch (err) {\n errorHandler(err, span);\n } finally {\n span.end();\n }\n },\n );\n }\n break;\n case 'subscription':\n inputHandler = createHandlerSpan(\n procedure.type,\n message,\n async (span) => {\n const inputMessage = await incoming.next();\n if (inputMessage.done) {\n return;\n }\n\n try {\n const dispose = await procedure.handler(\n serviceContextWithTransportInfo,\n inputMessage.value,\n outgoing,\n );\n\n if (dispose) {\n disposables.push(dispose);\n }\n } catch (err) {\n errorHandler(err, span);\n } finally {\n span.end();\n }\n },\n );\n break;\n case 'upload':\n if (procHasInitMessage) {\n inputHandler = createHandlerSpan(\n procedure.type,\n message,\n async (span) => {\n const initMessage = await incoming.next();\n if (initMessage.done) {\n return;\n }\n try {\n const outputMessage = await procedure.handler(\n serviceContextWithTransportInfo,\n initMessage.value,\n incoming,\n );\n\n outgoing.push(outputMessage);\n } catch (err) {\n errorHandler(err, span);\n } finally {\n span.end();\n }\n },\n );\n } else {\n inputHandler = createHandlerSpan(\n procedure.type,\n message,\n async (span) => {\n try {\n const outputMessage = await procedure.handler(\n serviceContextWithTransportInfo,\n incoming,\n );\n\n outgoing.push(outputMessage);\n } catch (err) {\n errorHandler(err, span);\n } finally {\n span.end();\n }\n },\n );\n }\n\n break;\n default:\n // procedure is inferred to be never here as this is not a valid procedure type\n // we cast just to this.log\n this.log?.warn(\n `got request for invalid procedure type ${\n (procedure as AnyProcedure).type\n } at ${message.serviceName}.${message.procedureName}`,\n { ...sessionLoggingMetadata, transportMessage: message },\n );\n return;\n }\n\n const procStream: ProcStream = {\n id: message.streamId,\n incoming,\n outgoing,\n serviceName: message.serviceName,\n procedureName: message.procedureName,\n promises: { inputHandler, outputHandler },\n };\n\n this.streamMap.set(message.streamId, procStream);\n\n // add this stream to ones from that client so we can clean it up in the case of a disconnect without close\n const streamsForThisSession =\n this.sessionToStreamId.get(sessionId) ?? new Set();\n streamsForThisSession.add(message.streamId);\n this.sessionToStreamId.set(sessionId, streamsForThisSession);\n\n return procStream;\n }\n\n async pushToStream(\n procStream: ProcStream,\n message: OpaqueTransportMessage,\n isInit?: boolean,\n ) {\n const { serviceName, procedureName } = procStream;\n const procedure = this.services[serviceName].procedures[procedureName];\n const procHasInitMessage = 'init' in procedure;\n\n if (isInit && procHasInitMessage) {\n if (Value.Check(procedure.init, message.payload)) {\n procStream.incoming.push(message.payload as PayloadType);\n } else {\n this.log?.error(\n `procedure ${serviceName}.${procedureName} received invalid init payload`,\n {\n clientId: this.transport.clientId,\n transportMessage: message,\n validationErrors: [\n ...Value.Errors(procedure.init, message.payload),\n ],\n },\n );\n }\n } else if (Value.Check(procedure.input, message.payload)) {\n procStream.incoming.push(message.payload as PayloadType);\n } else if (!Value.Check(ControlMessagePayloadSchema, message.payload)) {\n // whelp we got a message that isn't a control message and doesn't match the procedure input\n // so definitely not a valid payload\n this.log?.error(\n `procedure ${serviceName}.${procedureName} received invalid payload`,\n {\n clientId: this.transport.clientId,\n transportMessage: message,\n validationErrors: [...Value.Errors(procedure.input, message.payload)],\n },\n );\n }\n\n if (isStreamClose(message.controlFlags)) {\n await this.cleanupStream(message.streamId);\n\n const streamsFromThisClient = this.sessionToStreamId.get(message.from);\n if (streamsFromThisClient) {\n streamsFromThisClient.delete(message.streamId);\n if (streamsFromThisClient.size === 0) {\n this.sessionToStreamId.delete(message.from);\n }\n }\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 cleanupStream = async (id: string) => {\n const stream = this.streamMap.get(id);\n if (!stream) {\n return;\n }\n\n // end the streams and wait for the handlers to finish\n stream.incoming.end();\n await stream.promises.inputHandler;\n stream.outgoing.end();\n await stream.promises.outputHandler;\n this.streamMap.delete(id);\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): Server<Services> {\n return new RiverServer(\n transport,\n services,\n providedServerOptions?.handshakeOptions,\n providedServerOptions?.extendedContext,\n );\n}\n","import { Static, TSchema } from '@sinclair/typebox';\nimport { ParsedMetadata } from './context';\nimport { HandshakeErrorCustomHandlerFatalResponseCodes } from '../transport/message';\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) =>\n | Static<typeof HandshakeErrorCustomHandlerFatalResponseCodes>\n | ParsedMetadata\n | Promise<\n | Static<typeof HandshakeErrorCustomHandlerFatalResponseCodes>\n | ParsedMetadata\n >;\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","pushable","options","_pushable","Type","m","stream"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../transport/id.ts","../transport/message.ts","../package.json","../util/stringify.ts","../tracing/index.ts"],"sourcesContent":["import { customAlphabet } from 'nanoid';\n\nconst alphabet = customAlphabet(\n '1234567890abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ',\n);\nexport const generateId = () => alphabet(12);\n","import { Type, TSchema, Static } from '@sinclair/typebox';\nimport { PropagationContext } from '../tracing';\nimport { generateId } from './id';\n\n/**\n * Control flags for transport messages.\n * An RPC message is coded with StreamOpenBit | StreamClosedBit.\n * Streams are expected to start with StreamOpenBit sent and the client SHOULD send an empty\n * message with StreamClosedBit to close the stream handler on the server, indicating that\n * it will not be using the stream anymore.\n */\nexport const enum ControlFlags {\n AckBit = 0b0001,\n StreamOpenBit = 0b0010,\n StreamClosedBit = 0b0100,\n}\n\n/**\n * Generic Typebox schema for a transport message.\n * @template T The type of the payload.\n * @param {T} t The payload schema.\n * @returns The transport message schema.\n */\nexport const TransportMessageSchema = <T extends TSchema>(t: T) =>\n Type.Object({\n id: Type.String(),\n from: Type.String(),\n to: Type.String(),\n seq: Type.Integer(),\n ack: Type.Integer(),\n serviceName: Type.Optional(Type.String()),\n procedureName: Type.Optional(Type.String()),\n streamId: Type.String(),\n controlFlags: Type.Integer(),\n tracing: Type.Optional(\n Type.Object({\n traceparent: Type.String(),\n tracestate: Type.String(),\n }),\n ),\n payload: t,\n });\n\n/**\n * Defines the schema for a transport acknowledgement message. This is never constructed manually\n * and is only used internally by the library for tracking inflight messages.\n * @returns The transport message schema.\n */\nexport const ControlMessageAckSchema = Type.Object({\n type: Type.Literal('ACK'),\n});\n\n/**\n * Defines the schema for a transport close message. This is never constructed manually and is only\n * used internally by the library for closing and cleaning up streams.\n */\nexport const ControlMessageCloseSchema = Type.Object({\n type: Type.Literal('CLOSE'),\n});\n\nexport const PROTOCOL_VERSION = 'v1.1';\nexport const ControlMessageHandshakeRequestSchema = Type.Object({\n type: Type.Literal('HANDSHAKE_REQ'),\n protocolVersion: Type.String(),\n sessionId: Type.String(),\n /**\n * Specifies what the server's expected session state (from the pov of the client). This can be\n * used by the server to know whether this is a new or a reestablished connection, and whether it\n * is compatible with what it already has.\n */\n expectedSessionState: Type.Object({\n // what the client expects the server to send next\n nextExpectedSeq: Type.Integer(),\n nextSentSeq: Type.Integer(),\n }),\n\n metadata: Type.Optional(Type.Unknown()),\n});\n\nexport const HandshakeErrorRetriableResponseCodes = Type.Union([\n Type.Literal('SESSION_STATE_MISMATCH'),\n]);\n\nexport const HandshakeErrorCustomHandlerFatalResponseCodes = Type.Union([\n // The custom validation handler rejected the handler because the client is unsupported.\n Type.Literal('REJECTED_UNSUPPORTED_CLIENT'),\n // The custom validation handler rejected the handshake.\n Type.Literal('REJECTED_BY_CUSTOM_HANDLER'),\n]);\n\nexport const HandshakeErrorFatalResponseCodes = Type.Union([\n HandshakeErrorCustomHandlerFatalResponseCodes,\n // The ciient sent a handshake that doesn't comply with the extended handshake metadata.\n Type.Literal('MALFORMED_HANDSHAKE_META'),\n // The ciient sent a handshake that doesn't comply with ControlMessageHandshakeRequestSchema.\n Type.Literal('MALFORMED_HANDSHAKE'),\n // The client's protocol version does not match the server's.\n Type.Literal('PROTOCOL_VERSION_MISMATCH'),\n]);\n\nexport const HandshakeErrorResponseCodes = Type.Union([\n HandshakeErrorRetriableResponseCodes,\n HandshakeErrorFatalResponseCodes,\n]);\n\nexport const ControlMessageHandshakeResponseSchema = Type.Object({\n type: Type.Literal('HANDSHAKE_RESP'),\n status: Type.Union([\n Type.Object({\n ok: Type.Literal(true),\n sessionId: Type.String(),\n }),\n Type.Object({\n ok: Type.Literal(false),\n reason: Type.String(),\n code: HandshakeErrorResponseCodes,\n }),\n ]),\n});\n\nexport const ControlMessagePayloadSchema = Type.Union([\n ControlMessageCloseSchema,\n ControlMessageAckSchema,\n ControlMessageHandshakeRequestSchema,\n ControlMessageHandshakeResponseSchema,\n]);\n\n/**\n * Defines the schema for an opaque transport message that is agnostic to any\n * procedure/service.\n * @returns The transport message schema.\n */\nexport const OpaqueTransportMessageSchema = TransportMessageSchema(\n Type.Unknown(),\n);\n\n/**\n * Represents a transport message. This is the same type as {@link TransportMessageSchema} but\n * we can't statically infer generics from generic Typebox schemas so we have to define it again here.\n *\n * TypeScript can't enforce types when a bitmask is involved, so these are the semantics of\n * `controlFlags`:\n * * If `controlFlags & StreamOpenBit == StreamOpenBit`, `streamId` must be set to a unique value\n * (suggestion: use `nanoid`).\n * * If `controlFlags & StreamOpenBit == StreamOpenBit`, `serviceName` and `procedureName` must be set.\n * * If `controlFlags & StreamClosedBit == StreamClosedBit` and the kind is `stream` or `subscription`,\n * `payload` should be discarded (usually contains a control message).\n * * If `controlFlags & AckBit == AckBit`, the message is an explicit acknowledgement message and doesn't\n * contain any payload that is relevant to the application so should not be delivered.\n * @template Payload The type of the payload.\n */\nexport interface TransportMessage<Payload = unknown> {\n id: string;\n from: string;\n to: string;\n seq: number;\n ack: number;\n serviceName?: string;\n procedureName?: string;\n streamId: string;\n controlFlags: number;\n tracing?: PropagationContext;\n payload: Payload;\n}\n\nexport type PartialTransportMessage<Payload = unknown> = Omit<\n TransportMessage<Payload>,\n 'id' | 'from' | 'to' | 'seq' | 'ack'\n>;\n\nexport function handshakeRequestMessage({\n from,\n to,\n sessionId,\n expectedSessionState,\n metadata,\n tracing,\n}: {\n from: TransportClientId;\n to: TransportClientId;\n sessionId: string;\n expectedSessionState: Static<\n typeof ControlMessageHandshakeRequestSchema\n >['expectedSessionState'];\n metadata?: unknown;\n tracing?: PropagationContext;\n}): TransportMessage<Static<typeof ControlMessageHandshakeRequestSchema>> {\n return {\n id: generateId(),\n from,\n to,\n seq: 0,\n ack: 0,\n streamId: generateId(),\n controlFlags: 0,\n tracing,\n payload: {\n type: 'HANDSHAKE_REQ',\n protocolVersion: PROTOCOL_VERSION,\n sessionId,\n expectedSessionState,\n metadata,\n } satisfies Static<typeof ControlMessageHandshakeRequestSchema>,\n };\n}\n\n/**\n * This is a reason that can be given during the handshake to indicate that the peer has the wrong\n * session state.\n */\nexport const SESSION_STATE_MISMATCH = 'session state mismatch';\n\nexport function handshakeResponseMessage({\n from,\n to,\n status,\n}: {\n from: TransportClientId;\n to: TransportClientId;\n status: Static<typeof ControlMessageHandshakeResponseSchema>['status'];\n}): TransportMessage<Static<typeof ControlMessageHandshakeResponseSchema>> {\n return {\n id: generateId(),\n from,\n to,\n seq: 0,\n ack: 0,\n streamId: generateId(),\n controlFlags: 0,\n payload: {\n type: 'HANDSHAKE_RESP',\n status,\n } satisfies Static<typeof ControlMessageHandshakeResponseSchema>,\n };\n}\n\nexport function closeStreamMessage(streamId: string): PartialTransportMessage {\n return {\n streamId,\n controlFlags: ControlFlags.StreamClosedBit,\n payload: {\n type: 'CLOSE' as const,\n } satisfies Static<typeof ControlMessagePayloadSchema>,\n };\n}\n\n/**\n * A type alias for a transport message with an opaque payload.\n * @template T - The type of the opaque payload.\n */\nexport type OpaqueTransportMessage = TransportMessage;\nexport type TransportClientId = string;\n\n/**\n * Checks if the given control flag (usually found in msg.controlFlag) is an ack message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the AckBit, false otherwise.\n */\nexport function isAck(controlFlag: number): boolean {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n return (controlFlag & ControlFlags.AckBit) === ControlFlags.AckBit;\n}\n\n/**\n * Checks if the given control flag (usually found in msg.controlFlag) is a stream open message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the StreamOpenBit, false otherwise.\n */\nexport function isStreamOpen(controlFlag: number): boolean {\n return (\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n (controlFlag & ControlFlags.StreamOpenBit) === ControlFlags.StreamOpenBit\n );\n}\n\n/**\n * Checks if the given control flag (usually found in msg.controlFlag) is a stream close message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the StreamCloseBit, false otherwise.\n */\nexport function isStreamClose(controlFlag: number): boolean {\n return (\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n (controlFlag & ControlFlags.StreamClosedBit) ===\n ControlFlags.StreamClosedBit\n );\n}\n","{\n \"name\": \"@replit/river\",\n \"description\": \"It's like tRPC but... with JSON Schema Support, duplex streaming and support for service multiplexing. Transport agnostic!\",\n \"version\": \"0.26.9\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/router/index.js\",\n \"require\": \"./dist/router/index.cjs\"\n },\n \"./logging\": {\n \"import\": \"./dist/logging/index.js\",\n \"require\": \"./dist/logging/index.cjs\"\n },\n \"./codec\": {\n \"import\": \"./dist/codec/index.js\",\n \"require\": \"./dist/codec/index.cjs\"\n },\n \"./transport\": {\n \"import\": \"./dist/transport/index.js\",\n \"require\": \"./dist/transport/index.cjs\"\n },\n \"./transport/ws/client\": {\n \"import\": \"./dist/transport/impls/ws/client.js\",\n \"require\": \"./dist/transport/impls/ws/client.cjs\"\n },\n \"./transport/ws/server\": {\n \"import\": \"./dist/transport/impls/ws/server.js\",\n \"require\": \"./dist/transport/impls/ws/server.cjs\"\n },\n \"./transport/uds/client\": {\n \"import\": \"./dist/transport/impls/uds/client.js\",\n \"require\": \"./dist/transport/impls/uds/client.cjs\"\n },\n \"./transport/uds/server\": {\n \"import\": \"./dist/transport/impls/uds/server.js\",\n \"require\": \"./dist/transport/impls/uds/server.cjs\"\n },\n \"./test-util\": {\n \"import\": \"./dist/util/testHelpers.js\",\n \"require\": \"./dist/util/testHelpers.cjs\"\n }\n },\n \"sideEffects\": [\n \"./dist/logging/index.js\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@msgpack/msgpack\": \"^3.0.0-beta2\",\n \"it-pushable\": \"^3.2.3\",\n \"nanoid\": \"^4.0.2\",\n \"ws\": \"^8.17.0\"\n },\n \"peerDependencies\": {\n \"@opentelemetry/api\": \"^1.7.0\",\n \"@sinclair/typebox\": \"~0.32.8\"\n },\n \"devDependencies\": {\n \"@opentelemetry/sdk-trace-base\": \"^1.24.1\",\n \"@opentelemetry/sdk-trace-web\": \"^1.24.1\",\n \"@opentelemetry/core\": \"^1.7.0\",\n \"@types/ws\": \"^8.5.5\",\n \"@typescript-eslint/eslint-plugin\": \"^7.8.0\",\n \"@typescript-eslint/parser\": \"^7.8.0\",\n \"@vitest/ui\": \"^1.3.1\",\n \"eslint\": \"^8.57.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-prettier\": \"^5.1.3\",\n \"prettier\": \"^3.0.0\",\n \"tsup\": \"^7.2.0\",\n \"typescript\": \"^5.4.5\",\n \"vitest\": \"^1.3.1\"\n },\n \"scripts\": {\n \"check\": \"tsc --noEmit && npm run format && npm run lint\",\n \"format\": \"npx prettier . --check\",\n \"format:fix\": \"npx prettier . --write\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"fix\": \"npm run format:fix && npm run lint:fix\",\n \"build\": \"rm -rf dist && tsup && du -sh dist\",\n \"prepack\": \"npm run build\",\n \"release\": \"npm publish --access public\",\n \"test:ui\": \"echo \\\"remember to go to /__vitest__ in the webview\\\" && vitest --ui --api.host 0.0.0.0 --api.port 3000\",\n \"test\": \"vitest\",\n \"test:single\": \"vitest run --reporter=dot\",\n \"test:flake\": \"./flake.sh\",\n \"bench\": \"vitest bench\"\n },\n \"engines\": {\n \"node\": \">=16\"\n },\n \"keywords\": [\n \"rpc\",\n \"websockets\",\n \"jsonschema\"\n ],\n \"author\": \"Jacky Zhao\",\n \"license\": \"MIT\"\n}\n","export function coerceErrorString(err: unknown): string {\n if (err instanceof Error) {\n return err.message || 'unknown reason';\n }\n\n return `[coerced to error] ${String(err)}`;\n}\n","import {\n Context,\n Span,\n SpanKind,\n context,\n propagation,\n trace,\n} from '@opentelemetry/api';\nimport { version as RIVER_VERSION } from '../package.json';\nimport { ValidProcType } from '../router';\nimport {\n ClientTransport,\n Connection,\n OpaqueTransportMessage,\n} from '../transport';\n\nexport interface PropagationContext {\n traceparent: string;\n tracestate: string;\n}\n\nexport interface TelemetryInfo {\n span: Span;\n ctx: Context;\n}\n\nexport function getPropagationContext(\n ctx: Context,\n): PropagationContext | undefined {\n const tracing = {\n traceparent: '',\n tracestate: '',\n };\n propagation.inject(ctx, tracing);\n return tracing;\n}\n\nexport function createSessionTelemetryInfo(\n sessionId: string,\n to: string,\n from: string,\n propagationCtx?: PropagationContext,\n): TelemetryInfo {\n const parentCtx = propagationCtx\n ? propagation.extract(context.active(), propagationCtx)\n : context.active();\n\n const span = tracer.startSpan(\n `session ${sessionId}`,\n {\n attributes: {\n component: 'river',\n 'river.session.id': sessionId,\n 'river.session.to': to,\n 'river.session.from': from,\n },\n },\n parentCtx,\n );\n\n const ctx = trace.setSpan(parentCtx, span);\n\n return { span, ctx };\n}\n\nexport function createConnectionTelemetryInfo(\n connection: Connection,\n info: TelemetryInfo,\n): TelemetryInfo {\n const span = tracer.startSpan(\n `connection ${connection.id}`,\n {\n attributes: {\n component: 'river',\n 'river.connection.id': connection.id,\n },\n links: [{ context: info.span.spanContext() }],\n },\n info.ctx,\n );\n\n const ctx = trace.setSpan(info.ctx, span);\n\n return { span, ctx };\n}\n\nexport function createProcTelemetryInfo(\n transport: ClientTransport<Connection>,\n kind: ValidProcType,\n serviceName: string,\n procedureName: string,\n streamId: string,\n): TelemetryInfo {\n const baseCtx = context.active();\n const span = tracer.startSpan(\n `procedure call ${serviceName}.${procedureName}`,\n {\n attributes: {\n component: 'river',\n 'river.method.kind': kind,\n 'river.method.service': serviceName,\n 'river.method.name': procedureName,\n 'river.streamId': streamId,\n 'span.kind': 'client',\n },\n kind: SpanKind.CLIENT,\n },\n baseCtx,\n );\n\n const ctx = trace.setSpan(baseCtx, span);\n\n transport.log?.info(`invoked ${serviceName}.${procedureName}`, {\n clientId: transport.clientId,\n transportMessage: {\n procedureName,\n serviceName,\n },\n telemetry: {\n traceId: span.spanContext().traceId,\n spanId: span.spanContext().spanId,\n },\n });\n return { span, ctx };\n}\n\nexport function createHandlerSpan(\n kind: ValidProcType,\n message: OpaqueTransportMessage,\n fn: (span: Span) => Promise<unknown>,\n) {\n const ctx = message.tracing\n ? propagation.extract(context.active(), message.tracing)\n : context.active();\n\n return tracer.startActiveSpan(\n `procedure handler ${message.serviceName}.${message.procedureName}`,\n {\n attributes: {\n component: 'river',\n 'river.method.kind': kind,\n 'river.method.service': message.serviceName,\n 'river.method.name': message.procedureName,\n 'river.streamId': message.streamId,\n 'span.kind': 'server',\n },\n kind: SpanKind.SERVER,\n },\n ctx,\n fn,\n );\n}\n\nconst tracer = trace.getTracer('river', RIVER_VERSION);\nexport default tracer;\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|