@replit/river 0.215.1 → 0.216.1
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 +47 -0
- package/dist/{adapter-Dtt4bYL-.d.ts → adapter-BXCk-dmy.d.ts} +3 -21
- package/dist/{adapter-CjgmjtUJ.d.cts → adapter-D5X11kmP.d.cts} +3 -21
- package/dist/{chunk-3DDZCLJM.js → chunk-62BM2WOT.js} +22 -6
- package/dist/{chunk-3DDZCLJM.js.map → chunk-62BM2WOT.js.map} +1 -1
- package/dist/{chunk-NUGV5QWU.js → chunk-C4EPHIKQ.js} +21 -3
- package/dist/chunk-C4EPHIKQ.js.map +1 -0
- package/dist/chunk-SHND2JG6.js +86 -0
- package/dist/chunk-SHND2JG6.js.map +1 -0
- package/dist/{client-BOc8blGj.d.ts → client-BNc5Pj_4.d.ts} +2 -2
- package/dist/{client-B9aKi9Li.d.cts → client-BZUvFL6B.d.cts} +2 -2
- package/dist/codec/index.cjs.map +1 -1
- package/dist/codec/index.d.cts +3 -3
- package/dist/codec/index.d.ts +3 -3
- package/dist/codec/index.js +2 -2
- package/dist/{connection-DnMYvolf.d.ts → connection-ou9w2dSY.d.ts} +3 -3
- package/dist/{connection-1hFoyxuX.d.cts → connection-xxgJHs2o.d.cts} +3 -3
- package/dist/{index-Bf9PGbS4.d.cts → index-BAGGleT3.d.cts} +1 -1
- package/dist/{index-DiAq34gk.d.ts → index-ZWkoesQD.d.ts} +1 -1
- package/dist/logging/index.d.cts +2 -2
- package/dist/logging/index.d.ts +2 -2
- package/dist/{message-DL74OqsX.d.cts → message-CpXWqmJw.d.cts} +1 -1
- package/dist/{message-DL74OqsX.d.ts → message-CpXWqmJw.d.ts} +1 -1
- package/dist/protobuf/codec.cjs +107 -0
- package/dist/protobuf/codec.cjs.map +1 -0
- package/dist/protobuf/codec.d.cts +13 -0
- package/dist/protobuf/codec.d.ts +13 -0
- package/dist/protobuf/codec.js +7 -0
- package/dist/protobuf/codec.js.map +1 -0
- package/dist/protobuf/index.cjs +1877 -0
- package/dist/protobuf/index.cjs.map +1 -0
- package/dist/protobuf/index.d.cts +488 -0
- package/dist/protobuf/index.d.ts +488 -0
- package/dist/protobuf/index.js +1260 -0
- package/dist/protobuf/index.js.map +1 -0
- package/dist/router/index.cjs +10 -2
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +11 -10
- package/dist/router/index.d.ts +11 -10
- package/dist/router/index.js +1 -1
- package/dist/{server-_bfE7LYc.d.ts → server-BPu7Td80.d.ts} +4 -4
- package/dist/{server-BkEzDYIv.d.cts → server-JdnoVO11.d.cts} +4 -4
- package/dist/{services-zaansuuR.d.cts → services-CjigASqe.d.cts} +114 -93
- package/dist/{services-KdKBWdJr.d.ts → services-DpT2yNtt.d.ts} +114 -93
- package/dist/testUtil/index.cjs +21 -5
- package/dist/testUtil/index.cjs.map +1 -1
- package/dist/testUtil/index.d.cts +8 -7
- package/dist/testUtil/index.d.ts +8 -7
- package/dist/testUtil/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.d.cts +7 -6
- package/dist/transport/impls/ws/client.d.ts +7 -6
- package/dist/transport/impls/ws/client.js +2 -2
- package/dist/transport/impls/ws/server.cjs +21 -5
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +7 -6
- package/dist/transport/impls/ws/server.d.ts +7 -6
- package/dist/transport/impls/ws/server.js +2 -2
- package/dist/transport/index.cjs +21 -5
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +8 -7
- package/dist/transport/index.d.ts +8 -7
- package/dist/transport/index.js +2 -2
- package/dist/{transport-CCBNESLA.d.cts → transport-B1MUtXL7.d.ts} +5 -4
- package/dist/{transport-kW92H6x-.d.ts → transport-BnU3Zb0Q.d.cts} +5 -4
- package/dist/types-BGGvYIJM.d.cts +20 -0
- package/dist/types-BGGvYIJM.d.ts +20 -0
- package/package.json +12 -1
- package/dist/chunk-NUGV5QWU.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../protobuf/index.ts","../../protobuf/codec.ts","../../protobuf/gen/transport_pb.ts","../../protobuf/client.ts","../../transport/message.ts","../../transport/id.ts","../../router/result.ts","../../router/streams.ts","../../tracing/index.ts","../../router/errors.ts","../../transport/stringifyError.ts","../../router/handshake.ts","../../package.json","../../protobuf/errors.ts","../../protobuf/shared.ts","../../protobuf/handshake.ts","../../protobuf/service.ts","../../protobuf/server.ts"],"sourcesContent":["export { ProtoCodec } from './codec';\nexport { createClient } from './client';\nexport type { ClientOptions as ProtobufClientOptions } from './client';\nexport type { ProtobufHandlerContext } from './context';\nexport {\n RiverErrorCode,\n isClientError,\n isProtocolError,\n isRiverError,\n isSerializedClientErrorResult,\n isSerializedProtocolErrorResult,\n} from './errors';\nexport type {\n ClientError,\n ClientErrorCode,\n ProtocolError,\n ProtocolErrorCode,\n RiverErrorDetail,\n} from './errors';\nexport {\n createClientHandshakeOptions,\n createServerHandshakeOptions,\n} from './handshake';\nexport { createProtoService } from './service';\nexport type {\n AnyProtoService,\n InstantiatedProtoService,\n MaybeDisposable,\n} from './service';\nexport { createServer } from './server';\nexport type {\n Middleware,\n MiddlewareContext,\n MiddlewareParam,\n Server,\n ServerOptions as ProtobufServerOptions,\n} from './server';\nexport type {\n BiDiStreamingCall,\n CallOptions,\n Client,\n ClientMethod,\n ClientStreamingCall,\n MethodImpl,\n ServiceImpl,\n} from './types';\nexport { Err, Ok } from '../router/result';\nexport type {\n ErrResult,\n OkResult,\n Result,\n ResultUnwrapErr,\n ResultUnwrapOk,\n} from '../router/result';\nexport type { Readable, ReadableResult, Writable } from '../router/streams';\nexport { ReadableBrokenError } from '../router/streams';\nexport {\n CANCEL_CODE,\n INVALID_REQUEST_CODE,\n UNCAUGHT_ERROR_CODE,\n UNEXPECTED_DISCONNECT_CODE,\n} from '../router/errors';\n","import { create, fromBinary, toBinary } from '@bufbuild/protobuf';\nimport type { MessageInitShape, MessageShape } from '@bufbuild/protobuf';\nimport {\n decode as msgpackDecode,\n encode as msgpackEncode,\n} from '@msgpack/msgpack';\nimport type { OpaqueTransportMessage } from '../transport/message';\nimport { Codec } from '../codec/types';\nimport { TransportEnvelopeSchema } from './gen/transport_pb';\n\n/**\n * A protobuf-native transport envelope codec.\n *\n * The envelope schema is defined in `proto/transport.proto` and generated via\n * `buf generate`. Handler payloads that are already raw protobuf bytes use\n * `payload_bytes`. Non-protobuf payloads (error results, control messages)\n * are msgpack-encoded into `payload_msgpack`.\n */\nexport const ProtoCodec: Codec = {\n toBuffer(obj) {\n const message = coerceTransportMessage(obj);\n\n return toBinary(\n TransportEnvelopeSchema,\n create(TransportEnvelopeSchema, toEnvelopeInit(message)),\n ) as Uint8Array;\n },\n\n fromBuffer(buff: Uint8Array) {\n // WebSocketConnection sets binaryType='arraybuffer', so the buffer\n // arriving here is actually an ArrayBuffer despite the Uint8Array\n // signature on Codec.fromBuffer. The JSON and msgpack codecs happen\n // to tolerate this because TextDecoder.decode() and msgpack.decode()\n // accept ArrayBuffer, but protobuf's fromBinary() requires a real\n // Uint8Array (it uses indexed access). The proper fix is to have the\n // connection hand out Uint8Array in the first place.\n const bytes =\n buff instanceof Uint8Array ? buff : new Uint8Array(buff as ArrayBuffer);\n\n return fromEnvelope(fromBinary(TransportEnvelopeSchema, bytes));\n },\n};\n\nfunction coerceTransportMessage(obj: object): OpaqueTransportMessage {\n const candidate = obj as Partial<OpaqueTransportMessage>;\n\n if (\n typeof candidate.id !== 'string' ||\n typeof candidate.from !== 'string' ||\n typeof candidate.to !== 'string' ||\n typeof candidate.seq !== 'number' ||\n typeof candidate.ack !== 'number' ||\n typeof candidate.streamId !== 'string' ||\n typeof candidate.controlFlags !== 'number' ||\n !('payload' in candidate)\n ) {\n throw new Error('ProtoCodec expects an opaque transport message');\n }\n\n return candidate as OpaqueTransportMessage;\n}\n\nfunction toEnvelopeInit(\n message: OpaqueTransportMessage,\n): MessageInitShape<typeof TransportEnvelopeSchema> {\n return {\n id: message.id,\n from: message.from,\n to: message.to,\n seq: message.seq,\n ack: message.ack,\n streamId: message.streamId,\n controlFlags: message.controlFlags,\n serviceName: message.serviceName ?? '',\n procedureName: message.procedureName ?? '',\n tracing: message.tracing\n ? {\n traceparent: message.tracing.traceparent,\n tracestate: message.tracing.tracestate,\n }\n : undefined,\n payloadKind:\n message.payload instanceof Uint8Array\n ? { case: 'payloadBytes', value: message.payload }\n : { case: 'payloadMsgpack', value: msgpackEncode(message.payload) },\n };\n}\n\nfunction fromEnvelope(\n envelope: MessageShape<typeof TransportEnvelopeSchema>,\n): OpaqueTransportMessage {\n return {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n seq: envelope.seq,\n ack: envelope.ack,\n streamId: envelope.streamId,\n controlFlags: envelope.controlFlags,\n payload: decodePayloadKind(envelope),\n ...(envelope.serviceName === ''\n ? {}\n : { serviceName: envelope.serviceName }),\n ...(envelope.procedureName === ''\n ? {}\n : { procedureName: envelope.procedureName }),\n ...(envelope.tracing\n ? {\n tracing: {\n traceparent: envelope.tracing.traceparent,\n tracestate: envelope.tracing.tracestate,\n },\n }\n : {}),\n };\n}\n\nfunction decodePayloadKind(\n envelope: MessageShape<typeof TransportEnvelopeSchema>,\n): unknown {\n switch (envelope.payloadKind.case) {\n case 'payloadBytes':\n return envelope.payloadKind.value;\n case 'payloadMsgpack':\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return msgpackDecode(envelope.payloadKind.value);\n default:\n throw new Error('invalid protobuf transport envelope: missing payload');\n }\n}\n","// @generated by protoc-gen-es v2.11.0 with parameter \"target=ts,import_extension=none\"\n// @generated from file transport.proto (package replit.river.internal.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file transport.proto.\n */\nexport const file_transport: GenFile = /*@__PURE__*/\n fileDesc(\"Cg90cmFuc3BvcnQucHJvdG8SGHJlcGxpdC5yaXZlci5pbnRlcm5hbC52MSI9ChJQcm9wYWdhdGlvbkNvbnRleHQSEwoLdHJhY2VwYXJlbnQYASABKAkSEgoKdHJhY2VzdGF0ZRgCIAEoCSKuAgoRVHJhbnNwb3J0RW52ZWxvcGUSCgoCaWQYASABKAkSDAoEZnJvbRgCIAEoCRIKCgJ0bxgDIAEoCRILCgNzZXEYBCABKA0SCwoDYWNrGAUgASgNEhEKCXN0cmVhbV9pZBgGIAEoCRIVCg1jb250cm9sX2ZsYWdzGAcgASgNEhQKDHNlcnZpY2VfbmFtZRgIIAEoCRIWCg5wcm9jZWR1cmVfbmFtZRgJIAEoCRI9Cgd0cmFjaW5nGAogASgLMiwucmVwbGl0LnJpdmVyLmludGVybmFsLnYxLlByb3BhZ2F0aW9uQ29udGV4dBIXCg1wYXlsb2FkX2J5dGVzGAsgASgMSAASGQoPcGF5bG9hZF9tc2dwYWNrGAwgASgMSABCDgoMcGF5bG9hZF9raW5kYgZwcm90bzM\");\n\n/**\n * *\n * OpenTelemetry propagation context forwarded between peers.\n *\n * @generated from message replit.river.internal.v1.PropagationContext\n */\nexport type PropagationContext = Message<\"replit.river.internal.v1.PropagationContext\"> & {\n /**\n * @generated from field: string traceparent = 1;\n */\n traceparent: string;\n\n /**\n * @generated from field: string tracestate = 2;\n */\n tracestate: string;\n};\n\n/**\n * Describes the message replit.river.internal.v1.PropagationContext.\n * Use `create(PropagationContextSchema)` to create a new message.\n */\nexport const PropagationContextSchema: GenMessage<PropagationContext> = /*@__PURE__*/\n messageDesc(file_transport, 0);\n\n/**\n * *\n * Internal protobuf envelope used by the proto codec to carry River transport\n * messages.\n *\n * @generated from message replit.river.internal.v1.TransportEnvelope\n */\nexport type TransportEnvelope = Message<\"replit.river.internal.v1.TransportEnvelope\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: string from = 2;\n */\n from: string;\n\n /**\n * @generated from field: string to = 3;\n */\n to: string;\n\n /**\n * @generated from field: uint32 seq = 4;\n */\n seq: number;\n\n /**\n * @generated from field: uint32 ack = 5;\n */\n ack: number;\n\n /**\n * @generated from field: string stream_id = 6;\n */\n streamId: string;\n\n /**\n * @generated from field: uint32 control_flags = 7;\n */\n controlFlags: number;\n\n /**\n * @generated from field: string service_name = 8;\n */\n serviceName: string;\n\n /**\n * @generated from field: string procedure_name = 9;\n */\n procedureName: string;\n\n /**\n * @generated from field: replit.river.internal.v1.PropagationContext tracing = 10;\n */\n tracing?: PropagationContext;\n\n /**\n * @generated from oneof replit.river.internal.v1.TransportEnvelope.payload_kind\n */\n payloadKind: {\n /**\n * @generated from field: bytes payload_bytes = 11;\n */\n value: Uint8Array;\n case: \"payloadBytes\";\n } | {\n /**\n * @generated from field: bytes payload_msgpack = 12;\n */\n value: Uint8Array;\n case: \"payloadMsgpack\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * Describes the message replit.river.internal.v1.TransportEnvelope.\n * Use `create(TransportEnvelopeSchema)` to create a new message.\n */\nexport const TransportEnvelopeSchema: GenMessage<TransportEnvelope> = /*@__PURE__*/\n messageDesc(file_transport, 1);\n\n","import type {\n DescMethod,\n DescMethodBiDiStreaming,\n DescMethodClientStreaming,\n DescService,\n MessageInitShape,\n MessageShape,\n} from '@bufbuild/protobuf';\nimport { Value } from '@sinclair/typebox/value';\nimport { ClientTransport } from '../transport/client';\nimport { Connection } from '../transport/connection';\nimport { EventMap } from '../transport/events';\nimport {\n ControlFlags,\n ControlMessageCloseSchema,\n OpaqueTransportMessage,\n TransportClientId,\n cancelMessage,\n closeStreamMessage,\n isStreamCancel,\n isStreamClose,\n} from '../transport/message';\nimport { generateId } from '../transport/id';\nimport { ClientHandshakeOptions } from '../router/handshake';\nimport { Err, Ok, type Result } from '../router/result';\nimport {\n Readable,\n ReadableBrokenError,\n ReadableImpl,\n WritableImpl,\n} from '../router/streams';\nimport { Logger } from '../logging';\nimport { createProcTelemetryInfo, getPropagationContext } from '../tracing';\nimport { type ClientError, isSerializedClientErrorResult } from './errors';\nimport {\n CANCEL_CODE,\n INVALID_REQUEST_CODE,\n UNEXPECTED_DISCONNECT_CODE,\n} from '../router/errors';\nimport {\n EMPTY_PROTO_BYTES,\n decodeMessageBytes,\n encodeMessageBytes,\n methodKindToProcType,\n} from './shared';\nimport type {\n BiDiStreamingCall,\n CallOptions,\n Client as ProtobufClient,\n ClientMethod,\n ClientStreamingCall,\n} from './types';\n\n/**\n * Options for the protobuf client.\n */\nexport interface ClientOptions {\n readonly connectOnInvoke: boolean;\n readonly eagerlyConnect: boolean;\n}\n\nconst defaultClientOptions: ClientOptions = {\n connectOnInvoke: true,\n eagerlyConnect: true,\n};\n\ninterface StartedMethodCall<\n InputDesc extends DescMethod['input'],\n OutputDesc extends DescMethod['output'],\n> {\n readonly reqWritable: WritableImpl<MessageInitShape<InputDesc>>;\n readonly resReadable: ReadableImpl<MessageShape<OutputDesc>, ClientError>;\n}\n\n/**\n * Creates a protobuf client for a single protobuf service descriptor.\n */\nexport function createClient<Service extends DescService>(\n service: Service,\n transport: ClientTransport<Connection>,\n serverId: TransportClientId,\n providedClientOptions: Partial<\n ClientOptions & {\n handshakeOptions: ClientHandshakeOptions;\n }\n > = {},\n): ProtobufClient<Service> {\n if (providedClientOptions.handshakeOptions) {\n transport.extendHandshake(providedClientOptions.handshakeOptions);\n }\n\n const clientOptions = { ...defaultClientOptions, ...providedClientOptions };\n if (clientOptions.eagerlyConnect) {\n transport.connect(serverId);\n }\n\n const client: Partial<Record<keyof Service['method'], unknown>> = {};\n for (const methodName of Object.keys(service.method) as Array<\n keyof Service['method']\n >) {\n const method = (service.method as Service['method'])[methodName];\n client[methodName] = createMethodCaller(\n service,\n method,\n transport,\n serverId,\n clientOptions,\n );\n }\n\n return client as ProtobufClient<Service>;\n}\n\nfunction createMethodCaller<Method extends DescMethod>(\n service: DescService,\n method: Method,\n transport: ClientTransport<Connection>,\n serverId: TransportClientId,\n clientOptions: ClientOptions,\n): ClientMethod<Method> {\n switch (method.methodKind) {\n case 'unary':\n return ((\n request: MessageInitShape<Method['input']>,\n options?: CallOptions,\n ) => {\n if (transport.getStatus() === 'closed') {\n return Promise.resolve(\n Err({\n code: UNEXPECTED_DISCONNECT_CODE,\n message: 'transport is closed',\n }),\n );\n }\n\n connectOnInvokeIfNeeded(clientOptions, transport, serverId);\n const { resReadable } = startMethodCall(\n service,\n method,\n transport,\n serverId,\n encodeMessageBytes(method.input, request),\n true,\n options?.signal,\n );\n\n return getSingleMessage(resReadable, transport.log);\n }) as unknown as ClientMethod<Method>;\n\n case 'server_streaming':\n return ((\n request: MessageInitShape<Method['input']>,\n options?: CallOptions,\n ) => {\n if (transport.getStatus() === 'closed') {\n return createPreClosedReadable<MessageShape<Method['output']>>({\n code: UNEXPECTED_DISCONNECT_CODE,\n message: 'transport is closed',\n });\n }\n\n connectOnInvokeIfNeeded(clientOptions, transport, serverId);\n\n return startMethodCall(\n service,\n method,\n transport,\n serverId,\n encodeMessageBytes(method.input, request),\n true,\n options?.signal,\n ).resReadable;\n }) as unknown as ClientMethod<Method>;\n\n case 'client_streaming':\n return ((options?: CallOptions) => {\n if (transport.getStatus() === 'closed') {\n return createPreClosedClientStreamingCall<\n MessageInitShape<Method['input']>,\n MessageShape<Method['output']>\n >();\n }\n\n connectOnInvokeIfNeeded(clientOptions, transport, serverId);\n const { reqWritable, resReadable } = startMethodCall(\n service,\n method,\n transport,\n serverId,\n EMPTY_PROTO_BYTES,\n false,\n options?.signal,\n );\n\n let didFinalize = false;\n\n return {\n reqWritable,\n finalize: () => {\n if (didFinalize) {\n throw new Error('client streaming call already finalized');\n }\n\n didFinalize = true;\n if (!reqWritable.isClosed()) {\n reqWritable.close();\n }\n\n return getSingleMessage(resReadable, transport.log);\n },\n } satisfies ClientStreamingCall<DescMethodClientStreaming>;\n }) as unknown as ClientMethod<Method>;\n\n case 'bidi_streaming':\n return ((options?: CallOptions) => {\n if (transport.getStatus() === 'closed') {\n return createPreClosedBiDiStreamingCall<\n MessageInitShape<Method['input']>,\n MessageShape<Method['output']>\n >();\n }\n\n connectOnInvokeIfNeeded(clientOptions, transport, serverId);\n\n return startMethodCall(\n service,\n method,\n transport,\n serverId,\n EMPTY_PROTO_BYTES,\n false,\n options?.signal,\n ) satisfies BiDiStreamingCall<DescMethodBiDiStreaming>;\n }) as unknown as ClientMethod<Method>;\n }\n}\n\nfunction connectOnInvokeIfNeeded(\n clientOptions: ClientOptions,\n transport: ClientTransport<Connection>,\n serverId: TransportClientId,\n) {\n if (clientOptions.connectOnInvoke && !transport.sessions.has(serverId)) {\n transport.connect(serverId);\n }\n}\n\nfunction startMethodCall<Method extends DescMethod>(\n service: DescService,\n method: Method,\n transport: ClientTransport<Connection>,\n serverId: TransportClientId,\n initialPayload: Uint8Array,\n procClosesWithInit: boolean,\n abortSignal?: AbortSignal,\n): StartedMethodCall<Method['input'], Method['output']> {\n const session =\n transport.sessions.get(serverId) ??\n transport.createUnconnectedSession(serverId);\n const sessionScopedSend = transport.getSessionBoundSendFn(\n serverId,\n session.id,\n );\n\n const streamId = generateId();\n const { span, ctx } = createProcTelemetryInfo(\n transport.tracer,\n session,\n methodKindToProcType(method.methodKind),\n service.typeName,\n method.name,\n streamId,\n );\n\n let cleanClose = true;\n const reqWritable = new WritableImpl<MessageInitShape<Method['input']>>({\n writeCb: (value) => {\n sessionScopedSend({\n streamId,\n payload: encodeMessageBytes(method.input, value),\n controlFlags: 0,\n });\n },\n closeCb: () => {\n span.addEvent('reqWritable closed');\n\n if (!procClosesWithInit && cleanClose) {\n sessionScopedSend(closeStreamMessage(streamId));\n }\n\n if (resReadable.isClosed()) {\n cleanup();\n }\n },\n });\n\n const resReadable = new ReadableImpl<\n MessageShape<Method['output']>,\n ClientError\n >();\n const closeReadable = () => {\n if (resReadable.isClosed()) {\n return;\n }\n\n resReadable._triggerClose();\n span.addEvent('resReadable closed');\n\n if (reqWritable.isClosed()) {\n cleanup();\n }\n };\n\n function cleanup() {\n transport.removeEventListener('message', onMessage);\n transport.removeEventListener('sessionStatus', onSessionStatus);\n abortSignal?.removeEventListener('abort', onClientCancel);\n span.end();\n }\n\n function pushResponseError(error: ClientError) {\n if (!resReadable.isClosed()) {\n resReadable._pushValue(Err(error));\n closeReadable();\n }\n\n reqWritable.close();\n }\n\n function onClientCancel() {\n if (resReadable.isClosed() && reqWritable.isClosed()) {\n return;\n }\n\n span.addEvent('sending cancel');\n cleanClose = false;\n\n const error: ClientError = {\n code: CANCEL_CODE,\n message: 'cancelled by client',\n };\n pushResponseError(error);\n sessionScopedSend(cancelMessage(streamId, Err(error)));\n }\n\n function onMessage(msg: OpaqueTransportMessage) {\n if (msg.streamId !== streamId) {\n return;\n }\n\n if (msg.to !== transport.clientId) {\n transport.log?.error('got stream message from unexpected client', {\n clientId: transport.clientId,\n transportMessage: msg,\n });\n\n return;\n }\n\n if (isStreamCancel(msg.controlFlags)) {\n cleanClose = false;\n span.addEvent('received cancel');\n\n const error: ClientError = isSerializedClientErrorResult(msg.payload)\n ? msg.payload.payload\n : {\n code: CANCEL_CODE,\n message: 'stream cancelled with invalid payload',\n };\n pushResponseError(error);\n\n return;\n }\n\n if (resReadable.isClosed()) {\n transport.log?.error('received message after response stream is closed', {\n clientId: transport.clientId,\n transportMessage: msg,\n });\n\n return;\n }\n\n if (!Value.Check(ControlMessageCloseSchema, msg.payload)) {\n if (msg.payload instanceof Uint8Array) {\n try {\n resReadable._pushValue(\n Ok(\n decodeMessageBytes(method.output, msg.payload) as MessageShape<\n Method['output']\n >,\n ),\n );\n } catch (err) {\n pushResponseError({\n code: INVALID_REQUEST_CODE,\n message: 'failed to decode protobuf response payload',\n extras: { cause: err },\n });\n\n return;\n }\n } else if (isSerializedClientErrorResult(msg.payload)) {\n resReadable._pushValue(msg.payload);\n } else {\n pushResponseError({\n code: INVALID_REQUEST_CODE,\n message: 'received invalid protobuf response payload',\n });\n\n return;\n }\n }\n\n if (isStreamClose(msg.controlFlags)) {\n span.addEvent('received response close');\n closeReadable();\n }\n }\n\n function onSessionStatus(evt: EventMap['sessionStatus']) {\n if (\n evt.status !== 'closing' ||\n evt.session.to !== serverId ||\n session.id !== evt.session.id\n ) {\n return;\n }\n\n cleanClose = false;\n pushResponseError({\n code: UNEXPECTED_DISCONNECT_CODE,\n message: `${serverId} unexpectedly disconnected`,\n });\n }\n\n abortSignal?.addEventListener('abort', onClientCancel);\n transport.addEventListener('message', onMessage);\n transport.addEventListener('sessionStatus', onSessionStatus);\n\n try {\n sessionScopedSend({\n streamId,\n serviceName: service.typeName,\n procedureName: method.name,\n tracing: getPropagationContext(ctx),\n payload: initialPayload,\n controlFlags: procClosesWithInit\n ? ControlFlags.StreamOpenBit | ControlFlags.StreamClosedBit\n : ControlFlags.StreamOpenBit,\n });\n } catch (err) {\n cleanup();\n throw err;\n }\n\n if (procClosesWithInit) {\n reqWritable.close();\n }\n\n return { reqWritable, resReadable };\n}\n\nfunction createPreClosedReadable<T>(\n error: ClientError,\n): Readable<T, ClientError> {\n const readable = new ReadableImpl<T, ClientError>();\n readable._pushValue(Err(error));\n readable._triggerClose();\n\n return readable;\n}\n\nfunction createPreClosedWritable<T>(): WritableImpl<T> {\n const writable = new WritableImpl<T>({\n writeCb: () => undefined,\n closeCb: () => undefined,\n });\n writable.close();\n\n return writable;\n}\n\nfunction createPreClosedClientStreamingCall<Input, Output>(): {\n reqWritable: WritableImpl<Input>;\n finalize: () => Promise<Result<Output, ClientError>>;\n} {\n return {\n reqWritable: createPreClosedWritable<Input>(),\n finalize: () =>\n Promise.resolve(\n Err({\n code: UNEXPECTED_DISCONNECT_CODE,\n message: 'transport is closed',\n }),\n ),\n };\n}\n\nfunction createPreClosedBiDiStreamingCall<Input, Output>(): {\n reqWritable: WritableImpl<Input>;\n resReadable: Readable<Output, ClientError>;\n} {\n return {\n reqWritable: createPreClosedWritable<Input>(),\n resReadable: createPreClosedReadable<Output>({\n code: UNEXPECTED_DISCONNECT_CODE,\n message: 'transport is closed',\n }),\n };\n}\n\nasync function getSingleMessage<T>(\n resReadable: Readable<T, ClientError>,\n log?: Logger,\n): Promise<Result<T, ClientError>> {\n const ret = await resReadable.collect();\n if (ret.length === 0) {\n return Err({\n code: INVALID_REQUEST_CODE,\n message: 'expected single response from server, got none',\n });\n }\n\n if (ret.length > 1) {\n log?.error('expected single protobuf response from server, got multiple');\n }\n\n const first = ret[0];\n if (!first.ok) {\n if (first.payload.code === ReadableBrokenError.code) {\n return Err({\n code: UNEXPECTED_DISCONNECT_CODE,\n message: first.payload.message,\n });\n }\n\n return Err(first.payload);\n }\n\n return first;\n}\n","import { Type, TSchema, Static } from '@sinclair/typebox';\nimport { PropagationContext } from '../tracing';\nimport { generateId } from './id';\nimport { ErrResult } from '../router';\nimport type { ErrorPayload } from '../router/result';\n\n/**\n * Control flags for transport messages.\n */\nexport const enum ControlFlags {\n /**\n * Used in heartbeat messages.\n */\n AckBit = 0b00001,\n /**\n * Used in stream open requests.\n */\n StreamOpenBit = 0b00010,\n /**\n * Used when a stream is cancelled due errors or to explicit cancellation\n */\n StreamCancelBit = 0b00100,\n /**\n * Used when writer closes the stream.\n */\n StreamClosedBit = 0b01000,\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 type ProtocolVersion = 'v1.1' | 'v2.0';\nexport const currentProtocolVersion = 'v2.0' satisfies ProtocolVersion;\nexport const acceptedProtocolVersions = ['v1.1', currentProtocolVersion];\nexport function isAcceptedProtocolVersion(\n version: string,\n): version is ProtocolVersion {\n return acceptedProtocolVersions.includes(version);\n}\n\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: TransportClientId;\n to: TransportClientId;\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: currentProtocolVersion,\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\nexport function cancelMessage(\n streamId: string,\n payload: ErrResult<ErrorPayload>,\n) {\n return {\n streamId,\n controlFlags: ControlFlags.StreamCancelBit,\n payload,\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 * An encoded message that is ready to be sent over the transport.\n * The seq number is kept to track which messages have been\n * acked by the peer and can be dropped from the send buffer.\n */\nexport interface EncodedTransportMessage {\n id: string;\n seq: number;\n msg: PartialTransportMessage;\n data: Uint8Array;\n}\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/**\n * Checks if the given control flag (usually found in msg.controlFlag) is an cancel message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the CancelBit, false otherwise\n */\nexport function isStreamCancel(controlFlag: number): boolean {\n return (\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n (controlFlag & ControlFlags.StreamCancelBit) ===\n ControlFlags.StreamCancelBit\n );\n}\n","import { customAlphabet } from 'nanoid';\n\nconst alphabet = customAlphabet(\n '1234567890abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ',\n);\nexport const generateId = () => alphabet(12);\n","import { Static, Type } from '@sinclair/typebox';\nimport { Client } from './client';\nimport { Readable } from './streams';\nimport { BaseErrorSchemaType } from './errors';\n\n/**\n * AnyResultSchema is a schema to validate any result.\n */\nexport const AnyResultSchema = Type.Union([\n Type.Object({\n ok: Type.Literal(false),\n payload: Type.Object({\n code: Type.String(),\n message: Type.String(),\n extras: Type.Optional(Type.Unknown()),\n }),\n }),\n\n Type.Object({\n ok: Type.Literal(true),\n payload: Type.Unknown(),\n }),\n]);\n\n/**\n * The minimum error shape supported by river's `Result` and stream primitives.\n *\n * The existing TypeBox router uses schema-derived object types for this, while\n * the protobuf router can use a richer structural error type.\n */\nexport interface ErrorPayload {\n code: string;\n message: string;\n extras?: unknown;\n}\n\nexport interface OkResult<T> {\n ok: true;\n payload: T;\n}\nexport interface ErrResult<Err extends ErrorPayload> {\n ok: false;\n payload: Err;\n}\nexport type Result<T, Err extends ErrorPayload> = OkResult<T> | ErrResult<Err>;\n\nexport function Ok<const T extends Array<unknown>>(p: T): OkResult<T>;\nexport function Ok<const T extends ReadonlyArray<unknown>>(p: T): OkResult<T>;\nexport function Ok<const T>(payload: T): OkResult<T>;\nexport function Ok<const T>(payload: T): OkResult<T> {\n return {\n ok: true,\n payload,\n };\n}\n\nexport function Err<const Err extends ErrorPayload>(\n error: Err,\n): ErrResult<Err> {\n return {\n ok: false,\n payload: error,\n };\n}\n\n/**\n * Refine a {@link Result} type to its returned payload.\n */\nexport type ResultUnwrapOk<R> = R extends Result<infer T, infer __E>\n ? T\n : never;\n\n/**\n * Unwrap a {@link Result} type and return the payload if successful,\n * otherwise throws an error.\n * @param result - The result to unwrap.\n * @throws Will throw an error if the result is not ok.\n */\nexport function unwrapOrThrow<T, Err extends ErrorPayload>(\n result: Result<T, Err>,\n): T {\n if (result.ok) {\n return result.payload;\n }\n\n throw new Error(\n `Cannot non-ok result, got: ${result.payload.code} - ${result.payload.message}`,\n );\n}\n\n/**\n * Refine a {@link Result} type to its error payload.\n */\nexport type ResultUnwrapErr<R> = R extends Result<infer __T, infer Err>\n ? Err\n : never;\n\n/**\n * Retrieve the response type for a procedure, represented as a {@link Result}\n * type.\n * Example:\n * ```\n * type Message = ResponseData<typeof client, 'serviceName', 'procedureName'>\n * ```\n */\nexport type ResponseData<\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 RpcFn extends Fn }\n ? Awaited<ReturnType<RpcFn>>\n : Procedure extends object & { upload: infer UploadFn extends Fn }\n ? ReturnType<UploadFn> extends {\n finalize: (...args: never) => Promise<infer UploadOutputMessage>;\n }\n ? UploadOutputMessage\n : never\n : Procedure extends object & { stream: infer StreamFn extends Fn }\n ? ReturnType<StreamFn> extends {\n resReadable: Readable<\n infer StreamOutputMessage,\n Static<BaseErrorSchemaType>\n >;\n }\n ? StreamOutputMessage\n : never\n : Procedure extends object & {\n subscribe: infer SubscriptionFn extends Fn;\n }\n ? Awaited<ReturnType<SubscriptionFn>> extends {\n resReadable: Readable<\n infer SubscriptionOutputMessage,\n Static<BaseErrorSchemaType>\n >;\n }\n ? SubscriptionOutputMessage\n : never\n : never\n : never\n : never;\n","import { Err, ErrorPayload, Result } from './result';\n\nexport const ReadableBrokenError = {\n code: 'READABLE_BROKEN',\n message: 'Readable was broken before it is fully consumed',\n} as const satisfies ErrorPayload;\n\n/**\n * Similar to {@link Result} but with an extra error to handle cases where {@link Readable.break} is called\n */\nexport type ReadableResult<T, E extends ErrorPayload = ErrorPayload> = Result<\n T,\n E | typeof ReadableBrokenError\n>;\n\n/**\n * A simple {@link AsyncIterator} used in {@link Readable}\n * that doesn't have a the extra \"return\" and \"throw\" methods, and\n * the doesn't have a \"done value\" (TReturn).\n */\nexport interface ReadableIterator<T, E extends ErrorPayload>\n extends AsyncIterator<ReadableResult<T, E>> {\n next(): Promise<\n | {\n done: false;\n value: ReadableResult<T, E>;\n }\n | {\n done: true;\n value: undefined;\n }\n >;\n}\n\n/**\n * A {@link Readable} is an abstraction from which data is consumed from {@link Writable} source.\n *\n * - On the server the argument passed the procedure handler for `upload` and `stream` implements a {@link Readable} interface\n * so you can read client's request data.\n * - On the client the returned value of `subscription` or `stream` invocation implements a {@link Readable} interface\n * so you can read server's response data.\n *\n * A {@link Readable} can only have one consumer (iterator or {@link collect}) for the {@link Readable}'s\n * lifetime, in essense, reading from a {@link Readable} locks it forever.\n */\nexport interface Readable<T, E extends ErrorPayload> {\n /**\n * {@link Readable} implements AsyncIterator API and can be consumed via\n * for-await-of loops. Iteration locks the Readable. Exiting the loop\n * will **not** release the lock and it'll be equivalent of calling\n * {@link break}.\n */\n [Symbol.asyncIterator](): ReadableIterator<T, E>;\n /**\n * {@link collect} locks the {@link Readable} and returns a promise that resolves\n * with an array of the content when the {@link Readable} is fully done. This could\n * be due to the {@link Writable} end of the pipe closing cleanly, the procedure invocation\n * is cancelled, or {@link break} is called.\n */\n collect(): Promise<Array<ReadableResult<T, E>>>;\n /**\n * {@link break} locks the {@link Readable} and discards any existing or future incoming data.\n *\n * If there is an existing reader waiting for the next value, {@link break} causes it to\n * resolve with a {@link ReadableBrokenError} error.\n */\n break(): undefined;\n /**\n * {@link isReadable} returns true if it's safe to read from the {@link Readable}, either\n * via iteration or {@link collect}. It returns false if the {@link Readable} is locked\n * by a consumer (iterator or {@link collect}) or readable was broken via {@link break}.\n */\n isReadable(): boolean;\n}\n\n/**\n * A {@link Writeable} is a an abstraction for a {@link Readable} destination to which data is written to.\n *\n * - On the server the argument passed the procedure handler for `subscription` and `stream` implements a {@link Writeable}\n * so you can write server's response data.\n * - On the client the returned value of `upload` or `stream` invocation implements a {@link Writeable}\n * so you can write client's request data.\n *\n * Once closed, a {@link Writeable} can't be re-opened.` `\n */\nexport interface Writable<T> {\n /**\n * {@link write} writes a value to the pipe. An error is thrown if writing to a closed {@link Writable}.\n */\n write(value: T): undefined;\n /**\n * {@link close} signals the closure of the {@link Writeable}, informing the {@link Readable} end that\n * all data has been transmitted and we've cleanly closed.\n * Optionally a final value can be passed to {@link close}, which will be the last value\n * to write before it closes.\n *\n * Calling {@link close} multiple times is a no-op.\n */\n close(value?: T): undefined;\n /**\n * {@link isWritable} returns true if it's safe to call {@link write}, which\n * means that the {@link Writable} hasn't been closed due to {@link close} being called\n * on this {@link Writable} or the procedure invocation ending for any reason.\n */\n isWritable(): boolean;\n}\n\n/**\n * @internal\n *\n * @see {@link createPromiseWithResolvers}\n */\ninterface PromiseWithResolvers<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason: unknown) => void;\n}\n\n/**\n * @internal\n *\n * Same as https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers\n * but we support versions where it doesn't exist\n */\nfunction createPromiseWithResolvers<T>(): PromiseWithResolvers<T> {\n let resolve: (value: T) => void;\n let reject: (reason: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return {\n promise,\n // @ts-expect-error promise callbacks are sync\n resolve,\n // @ts-expect-error promise callbacks are sync\n reject,\n };\n}\n\n/**\n * Internal implementation of a {@link Readable}.\n * This should generally not be constructed directly by consumers\n * of river, but rather through either the client or procedure handlers.\n *\n * There are rare cases where this is useful to construct in tests or\n * to 'tee' a {@link Readable} to create a copy of the stream but\n * this is not the common case.\n */\nexport class ReadableImpl<T, E extends ErrorPayload> implements Readable<T, E> {\n /**\n * Whether the {@link Readable} is closed.\n *\n * Closed {@link Readable}s are done receiving values, but that doesn't affect\n * any other aspect of the {@link Readable} such as it's consumability.\n */\n private closed = false;\n /**\n * Whether the {@link Readable} is locked.\n *\n * @see {@link Readable}'s typedoc to understand locking\n */\n private locked = false;\n /**\n * Whether {@link break} was called.\n *\n * @see {@link break} for more information\n */\n private broken = false;\n /**\n * This flag allows us to avoid emitting a {@link ReadableBrokenError} after {@link break} was called\n * in cases where the {@link queue} is fully consumed and {@link ReadableImpl} is {@link closed}. This is just an\n * ergonomic feature to avoid emitting an error in our iteration when we don't have to.\n */\n private brokenWithValuesLeftToRead = false;\n /**\n * A list of values that have been pushed to the {@link ReadableImpl} but not yet emitted to the user.\n */\n private queue: Array<ReadableResult<T, E>> = [];\n /**\n * Used by methods in the class to signal to the iterator that it\n * should check for the next value.\n */\n private next: PromiseWithResolvers<void> | null = null;\n\n /**\n * Consumes the {@link Readable} and returns an {@link AsyncIterator} that can be used\n * to iterate over the values in the {@link Readable}.\n */\n public [Symbol.asyncIterator](): ReadableIterator<T, E> {\n if (this.locked) {\n throw new TypeError('Readable is already locked');\n }\n\n this.locked = true;\n\n /**\n * First iteration with {@link break} signals an error, the following one signals end of iteration.\n * This variable is used to signal the end of iteration.\n */\n let didSignalBreak = false;\n\n return {\n next: async () => {\n if (didSignalBreak) {\n return {\n done: true,\n value: undefined,\n } as const;\n }\n\n /**\n * In a normal iteration case the while loop can be structured as a couple of if statements,\n * in other words the loop will run at most a couple of times:\n * - it will run 0 times if we have something in the queue to consume\n * - it will run 1 time if we have nothing in the queue and then get something in the queue\n * - it will run 2 times if we have nothing in the queue and then the readable closes or breaks\n *\n * However, in a degenerate case where something has the handle to the iterator and is calling `next`\n * eagerly multiple times this loop will come in handy by queuing them up and looping as needed.\n */\n while (this.queue.length === 0) {\n if (this.closed && !this.brokenWithValuesLeftToRead) {\n return {\n done: true,\n value: undefined,\n } as const;\n }\n\n if (this.broken) {\n didSignalBreak = true;\n\n return {\n done: false,\n value: Err(ReadableBrokenError),\n } as const;\n }\n\n if (!this.next) {\n this.next = createPromiseWithResolvers();\n }\n\n await this.next.promise;\n this.next = null;\n }\n\n // Unfortunately we have to use non-null assertion here, because T can be undefined\n // we already check for array length above anyway\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const value = this.queue.shift()!;\n\n return { done: false, value } as const;\n },\n return: async () => {\n this.break();\n\n return { done: true, value: undefined } as const;\n },\n };\n }\n\n /**\n * Collects all the values from the {@link Readable} into an array.\n *\n * @see {@link Readable}'s typedoc for more information\n */\n public async collect(): Promise<Array<ReadableResult<T, E>>> {\n const array: Array<ReadableResult<T, E>> = [];\n for await (const value of this) {\n array.push(value);\n }\n\n return array;\n }\n\n /**\n * Breaks the {@link Readable} and signals an error to any iterators waiting for the next value.\n *\n * @see {@link Readable}'s typedoc for more information\n */\n public break(): undefined {\n if (this.broken) {\n return;\n }\n\n this.locked = true;\n this.broken = true;\n this.brokenWithValuesLeftToRead = this.queue.length > 0;\n this.queue.length = 0;\n\n // if we have any iterators waiting for the next value,\n this.next?.resolve();\n }\n\n /**\n * Whether the {@link Readable} is readable.\n *\n * @see {@link Readable}'s typedoc for more information\n */\n public isReadable(): boolean {\n return !this.locked && !this.broken;\n }\n\n /**\n * Pushes a value to be read.\n */\n public _pushValue(value: Result<T, E>): undefined {\n if (this.broken) {\n return;\n }\n\n if (this.closed) {\n throw new Error('Cannot push to closed Readable');\n }\n\n this.queue.push(value);\n this.next?.resolve();\n }\n\n /**\n * Triggers the close of the {@link Readable}. Make sure to push all remaining\n * values before calling this method.\n */\n public _triggerClose(): undefined {\n if (this.closed) {\n throw new Error('Unexpected closing multiple times');\n }\n\n this.closed = true;\n this.next?.resolve();\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n */\n public _hasValuesInQueue(): boolean {\n return this.queue.length > 0;\n }\n\n /**\n * Whether the {@link Readable} is closed.\n */\n public isClosed(): boolean {\n return this.closed;\n }\n}\n\n/**\n * Internal implementation of a {@link Writable}.\n * This won't be exposed as an interface to river\n * consumers directly.\n */\nexport class WritableImpl<T> implements Writable<T> {\n /**\n * Passed via constructor to pass on calls to {@link write}\n */\n private writeCb: (value: T) => void;\n\n /**\n * Passed via constructor to pass on calls to {@link close}\n */\n private closeCb: (value?: T) => void;\n /**\n * Whether {@link close} was called, and {@link Writable} is not writable anymore.\n */\n private closed = false;\n\n constructor(callbacks: { writeCb: (value: T) => void; closeCb: () => void }) {\n this.writeCb = callbacks.writeCb;\n this.closeCb = callbacks.closeCb;\n }\n\n public write(value: T): undefined {\n if (this.closed) {\n throw new Error('Cannot write to closed Writable');\n }\n\n this.writeCb(value);\n }\n\n public isWritable(): boolean {\n return !this.closed;\n }\n\n public close(value?: T): undefined {\n if (this.closed) {\n return;\n }\n\n if (value !== undefined) {\n this.writeCb(value);\n }\n\n this.closed = true;\n this.writeCb = () => undefined;\n this.closeCb();\n this.closeCb = () => undefined;\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n */\n public isClosed(): boolean {\n return this.closed;\n }\n}\n","import {\n Context,\n Span,\n SpanKind,\n SpanStatusCode,\n context,\n propagation,\n trace,\n Tracer,\n} from '@opentelemetry/api';\nimport { RIVER_VERSION, ValidProcType } from '../router';\nimport { ErrorPayload } from '../router/result';\nimport { Connection } from '../transport';\nimport { MessageMetadata } from '../logging';\nimport { ClientSession } from '../transport/sessionStateMachine/transitions';\nimport { IdentifiedSession } from '../transport/sessionStateMachine/common';\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\n return tracing;\n}\n\nexport function createSessionTelemetryInfo(\n tracer: Tracer,\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 `river.session`,\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 tracer: Tracer,\n connection: Connection,\n info: TelemetryInfo,\n): TelemetryInfo {\n const span = tracer.startSpan(\n `river.connection`,\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 tracer: Tracer,\n session: ClientSession<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 `river.client.${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 links: [{ context: session.telemetry.span.spanContext() }],\n kind: SpanKind.CLIENT,\n },\n baseCtx,\n );\n\n const ctx = trace.setSpan(baseCtx, span);\n const metadata: MessageMetadata = {\n ...session.loggingMetadata,\n transportMessage: {\n procedureName,\n serviceName,\n },\n };\n\n if (span.isRecording()) {\n metadata.telemetry = {\n traceId: span.spanContext().traceId,\n spanId: span.spanContext().spanId,\n };\n }\n\n session.log?.info(`invoked ${serviceName}.${procedureName}`, metadata);\n\n return { span, ctx };\n}\n\nexport function createHandlerSpan<Fn extends (span: Span) => unknown>(\n tracer: Tracer,\n session: IdentifiedSession,\n kind: ValidProcType,\n serviceName: string,\n procedureName: string,\n streamId: string,\n tracing: PropagationContext | undefined,\n fn: Fn,\n): ReturnType<Fn> {\n const ctx = tracing\n ? propagation.extract(context.active(), tracing)\n : context.active();\n\n return tracer.startActiveSpan<Fn>(\n `river.server.${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': 'server',\n },\n links: [{ context: session.telemetry.span.spanContext() }],\n kind: SpanKind.SERVER,\n },\n ctx,\n fn,\n );\n}\n\nexport function recordRiverError(span: Span, error: ErrorPayload): void {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.setAttributes({\n 'river.error_code': error.code,\n 'river.error_message': error.message,\n });\n}\n\nexport function getTracer(): Tracer {\n return trace.getTracer('river', RIVER_VERSION);\n}\n","import {\n Kind,\n Static,\n TEnum,\n TLiteral,\n TNever,\n TObject,\n TSchema,\n TString,\n TUnion,\n Type,\n} from '@sinclair/typebox';\nimport { ValueErrorIterator } from '@sinclair/typebox/errors';\n\n/**\n * {@link UNCAUGHT_ERROR_CODE} is the code that is used when an error is thrown\n * inside a procedure handler that's not required.\n */\nexport const UNCAUGHT_ERROR_CODE = 'UNCAUGHT_ERROR';\n/**\n * {@link UNEXPECTED_DISCONNECT_CODE} is the code used the stream's session\n * disconnect unexpetedly.\n */\nexport const UNEXPECTED_DISCONNECT_CODE = 'UNEXPECTED_DISCONNECT';\n/**\n * {@link INVALID_REQUEST_CODE} is the code used when a client's request is invalid.\n */\nexport const INVALID_REQUEST_CODE = 'INVALID_REQUEST';\n/**\n * {@link CANCEL_CODE} is the code used when either server or client cancels the stream.\n */\nexport const CANCEL_CODE = 'CANCEL';\n\ntype TLiteralString = TLiteral<string>;\n\ntype TEnumString = TEnum<Record<string, string>>;\n\nexport type BaseErrorSchemaType =\n | TObject<{\n code: TLiteralString | TEnumString;\n message: TLiteralString | TString;\n }>\n | TObject<{\n code: TLiteralString | TEnumString;\n message: TLiteralString | TString;\n extras: TSchema;\n }>;\n\n/**\n * Takes in a specific error schema and returns a result schema the error\n */\nexport const ErrResultSchema = <T extends ProcedureErrorSchemaType>(t: T) =>\n Type.Object({\n ok: Type.Literal(false),\n payload: t,\n });\n\nconst ValidationErrorDetails = Type.Object({\n path: Type.String(),\n message: Type.String(),\n});\n\nexport const ValidationErrors = Type.Array(ValidationErrorDetails);\nexport function castTypeboxValueErrors(\n errors: ValueErrorIterator,\n): Static<typeof ValidationErrors> {\n const result = [];\n for (const error of errors) {\n result.push({\n path: error.path,\n message: error.message,\n });\n }\n\n return result;\n}\n\n/**\n * A schema for cancel payloads sent from the client\n */\nexport const CancelErrorSchema = Type.Object({\n code: Type.Literal(CANCEL_CODE),\n message: Type.String(),\n});\n\nexport const CancelResultSchema = ErrResultSchema(CancelErrorSchema);\n\n/**\n * {@link ReaderErrorSchema} is the schema for all the built-in river errors that\n * can be emitted to a reader (request reader on the server, and response reader\n * on the client).\n */\nexport const ReaderErrorSchema = Type.Union([\n Type.Object({\n code: Type.Literal(UNCAUGHT_ERROR_CODE),\n message: Type.String(),\n }),\n Type.Object({\n code: Type.Literal(UNEXPECTED_DISCONNECT_CODE),\n message: Type.String(),\n }),\n Type.Object({\n code: Type.Literal(INVALID_REQUEST_CODE),\n message: Type.String(),\n extras: Type.Optional(\n Type.Object({\n firstValidationErrors: Type.Array(ValidationErrorDetails),\n totalErrors: Type.Number(),\n }),\n ),\n }),\n CancelErrorSchema,\n]) satisfies ProcedureErrorSchemaType;\n\nexport const ReaderErrorResultSchema = ErrResultSchema(ReaderErrorSchema);\n\n/**\n * Represents an acceptable schema to pass to a procedure.\n * Just a type of a schema, not an actual schema.\n *\n */\nexport type ProcedureErrorSchemaType =\n | TNever\n | BaseErrorSchemaType\n | TUnion<Array<BaseErrorSchemaType>>;\n\n// arbitrarily nested unions\n// river doesn't accept this by default, use the `flattenErrorType` helper\ntype NestableProcedureErrorSchemaType =\n | BaseErrorSchemaType\n | TUnion<NestableProcedureErrorSchemaTypeArray>;\n\n// use an interface to defer the type definition to be evaluated lazily\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface NestableProcedureErrorSchemaTypeArray\n extends Array<NestableProcedureErrorSchemaType> {}\n\nfunction isUnion(schema: TSchema): schema is TUnion {\n return schema[Kind] === 'Union';\n}\n\nexport type Flatten<T> = T extends BaseErrorSchemaType\n ? T\n : T extends TUnion<Array<infer U extends TSchema>>\n ? Flatten<U>\n : unknown;\n\n/**\n * In the case where API consumers for some god-forsaken reason want to use\n * arbitrarily nested unions, this helper flattens them to a single level.\n *\n * Note that loses some metadata information on the nested unions like\n * nested description fields, etc.\n *\n * @param errType - An arbitrarily union-nested error schema.\n * @returns The flattened error schema.\n */\nexport function flattenErrorType<T extends NestableProcedureErrorSchemaType>(\n errType: T,\n): Flatten<T>;\nexport function flattenErrorType(\n errType: NestableProcedureErrorSchemaType,\n): ProcedureErrorSchemaType {\n if (!isUnion(errType)) {\n return errType;\n }\n\n const flattenedTypes: Array<BaseErrorSchemaType> = [];\n function flatten(type: NestableProcedureErrorSchemaType) {\n if (isUnion(type)) {\n for (const t of type.anyOf) {\n flatten(t);\n }\n } else {\n flattenedTypes.push(type);\n }\n }\n\n flatten(errType);\n\n return Type.Union(flattenedTypes);\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 { Static, TSchema } from '@sinclair/typebox';\nimport { HandshakeErrorCustomHandlerFatalResponseCodes } from '../transport/message';\n\ntype ConstructHandshake<T extends TSchema> = () =>\n | Static<T>\n | Promise<Static<T>>;\n\ntype ValidateHandshake<T extends TSchema, ParsedMetadata> = (\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 ParsedMetadata extends object = object,\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, ParsedMetadata>;\n}\n\nexport function createClientHandshakeOptions<\n MetadataSchema extends TSchema = TSchema,\n>(\n schema: MetadataSchema,\n construct: ConstructHandshake<MetadataSchema>,\n): ClientHandshakeOptions<MetadataSchema> {\n return { schema, construct };\n}\n\nexport function createServerHandshakeOptions<\n MetadataSchema extends TSchema = TSchema,\n ParsedMetadata extends object = object,\n>(\n schema: MetadataSchema,\n validate: ValidateHandshake<MetadataSchema, ParsedMetadata>,\n): ServerHandshakeOptions<MetadataSchema, ParsedMetadata> {\n return { schema, validate };\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.216.1\",\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 \"./protobuf\": {\n \"import\": \"./dist/protobuf/index.js\",\n \"require\": \"./dist/protobuf/index.cjs\"\n },\n \"./protobuf/codec\": {\n \"import\": \"./dist/protobuf/codec.js\",\n \"require\": \"./dist/protobuf/codec.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 \"./test-util\": {\n \"import\": \"./dist/testUtil/index.js\",\n \"require\": \"./dist/testUtil/index.cjs\"\n }\n },\n \"sideEffects\": [\n \"./dist/logging/index.js\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@bufbuild/protobuf\": \"^2.11.0\",\n \"@msgpack/msgpack\": \"^3.1.2\",\n \"nanoid\": \"^5.0.9\",\n \"ws\": \"^8.17.0\"\n },\n \"peerDependencies\": {\n \"@opentelemetry/api\": \"^1.7.0\",\n \"@sinclair/typebox\": \"~0.34.0\"\n },\n \"devDependencies\": {\n \"@bufbuild/buf\": \"^1.67.0\",\n \"@opentelemetry/api\": \"^1.7.0\",\n \"@opentelemetry/context-async-hooks\": \"^1.26.0\",\n \"@opentelemetry/core\": \"^1.7.0\",\n \"@opentelemetry/sdk-trace-base\": \"^1.24.1\",\n \"@sinclair/typebox\": \"~0.34.0\",\n \"@stylistic/eslint-plugin\": \"^2.6.4\",\n \"@types/ws\": \"^8.5.5\",\n \"@typescript-eslint/eslint-plugin\": \"^7.8.0\",\n \"@typescript-eslint/parser\": \"^7.8.0\",\n \"@vitest/ui\": \"^3.1.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\": \"^8.4.0\",\n \"typescript\": \"^5.4.5\",\n \"vitest\": \"^3.1.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 \"proto:generate\": \"buf generate --template buf.gen.yaml --clean --path proto/transport.proto && buf generate --template buf.gen.test.yaml --clean --path proto/test/test_service.proto\",\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","import {\n CANCEL_CODE,\n INVALID_REQUEST_CODE,\n UNCAUGHT_ERROR_CODE,\n UNEXPECTED_DISCONNECT_CODE,\n} from '../router/errors';\nimport { type ErrResult, type ErrorPayload } from '../router/result';\n\n/**\n * Canonical RPC error codes shared by gRPC and Connect.\n *\n * The protobuf router uses these codes for unary rejections and streamed error\n * messages so applications can reason about familiar transport-agnostic error\n * categories.\n */\nexport enum RiverErrorCode {\n OK = 'OK',\n CANCELED = 'CANCELED',\n UNKNOWN = 'UNKNOWN',\n INVALID_ARGUMENT = 'INVALID_ARGUMENT',\n DEADLINE_EXCEEDED = 'DEADLINE_EXCEEDED',\n NOT_FOUND = 'NOT_FOUND',\n ALREADY_EXISTS = 'ALREADY_EXISTS',\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n RESOURCE_EXHAUSTED = 'RESOURCE_EXHAUSTED',\n FAILED_PRECONDITION = 'FAILED_PRECONDITION',\n ABORTED = 'ABORTED',\n OUT_OF_RANGE = 'OUT_OF_RANGE',\n UNIMPLEMENTED = 'UNIMPLEMENTED',\n INTERNAL = 'INTERNAL',\n UNAVAILABLE = 'UNAVAILABLE',\n DATA_LOSS = 'DATA_LOSS',\n UNAUTHENTICATED = 'UNAUTHENTICATED',\n}\n\n/**\n * Protocol-level error codes surfaced by River itself rather than user\n * handlers.\n */\nexport type ProtocolErrorCode =\n | typeof CANCEL_CODE\n | typeof INVALID_REQUEST_CODE\n | typeof UNCAUGHT_ERROR_CODE\n | typeof UNEXPECTED_DISCONNECT_CODE;\n\n/**\n * Error codes visible from the protobuf client surface.\n */\nexport type ClientErrorCode = RiverErrorCode | ProtocolErrorCode;\n\nconst riverErrorCodeSet = new Set<string>(Object.values(RiverErrorCode));\nconst protocolErrorCodeSet = new Set<string>([\n CANCEL_CODE,\n INVALID_REQUEST_CODE,\n UNCAUGHT_ERROR_CODE,\n UNEXPECTED_DISCONNECT_CODE,\n]);\n\n/**\n * A serialized protobuf error detail.\n *\n * The `typeName` identifies the protobuf message descriptor the client can use\n * to decode `value`.\n */\nexport interface RiverErrorDetail {\n readonly typeName: string;\n readonly value: Uint8Array;\n}\n\n/**\n * A plain-object error payload used by the protobuf router.\n *\n * Handlers return these via `Err({ code, message, ... })`.\n */\nexport interface ClientError extends ErrorPayload {\n readonly code: ClientErrorCode;\n readonly metadata?: Readonly<Record<string, string>>;\n readonly details?: ReadonlyArray<RiverErrorDetail>;\n}\n\n/**\n * A protocol error emitted by the River runtime.\n */\nexport interface ProtocolError extends ClientError {\n readonly code: ProtocolErrorCode;\n}\n\n/**\n * Returns true when the given value matches the wire shape of a client error\n * with a canonical RPC error code.\n */\nexport function isRiverError(value: unknown): value is ClientError {\n if (!(typeof value === 'object' && value !== null)) {\n return false;\n }\n\n const candidate = value as Partial<ClientError>;\n\n return (\n isRiverErrorCode(candidate.code) && typeof candidate.message === 'string'\n );\n}\n\n/**\n * Returns true when the given value is a protocol error.\n */\nexport function isProtocolError(value: unknown): value is ProtocolError {\n if (!(typeof value === 'object' && value !== null)) {\n return false;\n }\n\n const candidate = value as Partial<ProtocolError>;\n\n return (\n isProtocolErrorCode(candidate.code) && typeof candidate.message === 'string'\n );\n}\n\n/**\n * Returns true when the given value is any client-visible error.\n */\nexport function isClientError(value: unknown): value is ClientError {\n return isRiverError(value) || isProtocolError(value);\n}\n\n/**\n * Returns true when the given value matches the `Err(...)` wrapper used for\n * protobuf cancel payloads sent by the runtime or handlers.\n */\nexport function isSerializedClientErrorResult(\n value: unknown,\n): value is ErrResult<ClientError> {\n return isErrResultWithPayload(value, isClientError);\n}\n\n/**\n * Returns true when the given value matches the protocol-only cancel payloads\n * sent by clients.\n */\nexport function isSerializedProtocolErrorResult(\n value: unknown,\n): value is ErrResult<ProtocolError> {\n return isErrResultWithPayload(value, isProtocolError);\n}\n\n// -- internal helpers --\n\nfunction isRiverErrorCode(value: unknown): value is RiverErrorCode {\n return typeof value === 'string' && riverErrorCodeSet.has(value);\n}\n\nfunction isProtocolErrorCode(value: unknown): value is ProtocolErrorCode {\n return typeof value === 'string' && protocolErrorCodeSet.has(value);\n}\n\nfunction isErrResultWithPayload<T extends ErrorPayload>(\n value: unknown,\n predicate: (payload: unknown) => payload is T,\n): value is ErrResult<T> {\n if (!(typeof value === 'object' && value !== null)) {\n return false;\n }\n\n const candidate = value as { ok?: unknown; payload?: unknown };\n\n return candidate.ok === false && predicate(candidate.payload);\n}\n","import { create, fromBinary, toBinary } from '@bufbuild/protobuf';\nimport type {\n DescMessage,\n DescMethod,\n MessageInitShape,\n MessageShape,\n} from '@bufbuild/protobuf';\nimport type { ValidProcType } from '../router';\n\n/**\n * Empty protobuf payload used to open client-streaming and bidi streams without\n * inventing a separate request-init concept.\n */\nexport const EMPTY_PROTO_BYTES = new Uint8Array(0);\n\n/**\n * Convert protobuf method kinds into River procedure kinds for telemetry and\n * stream lifecycle behavior.\n */\nexport function methodKindToProcType(\n methodKind: DescMethod['methodKind'],\n): ValidProcType {\n switch (methodKind) {\n case 'unary':\n return 'rpc';\n case 'server_streaming':\n return 'subscription';\n case 'client_streaming':\n return 'upload';\n case 'bidi_streaming':\n return 'stream';\n }\n}\n\n/**\n * A stable registration key for a protobuf method.\n */\nexport function methodKey(serviceName: string, methodName: string): string {\n return `${serviceName}/${methodName}`;\n}\n\n/**\n * Encode a protobuf message init shape into wire bytes.\n */\nexport function encodeMessageBytes<Schema extends DescMessage>(\n schema: Schema,\n message: MessageInitShape<Schema>,\n): Uint8Array {\n return toBinary(schema, create(schema, message)) as Uint8Array;\n}\n\n/**\n * Decode protobuf wire bytes into a typed message shape.\n */\nexport function decodeMessageBytes<Schema extends DescMessage>(\n schema: Schema,\n payload: Uint8Array,\n): MessageShape<Schema> {\n return fromBinary(schema, payload) as MessageShape<Schema>;\n}\n","import type {\n DescMessage,\n MessageInitShape,\n MessageShape,\n} from '@bufbuild/protobuf';\nimport { Static, Type } from '@sinclair/typebox';\nimport {\n createClientHandshakeOptions as createTransportClientHandshakeOptions,\n createServerHandshakeOptions as createTransportServerHandshakeOptions,\n type ClientHandshakeOptions,\n type ServerHandshakeOptions,\n} from '../router/handshake';\nimport { HandshakeErrorCustomHandlerFatalResponseCodes } from '../transport/message';\nimport { decodeMessageBytes, encodeMessageBytes } from './shared';\n\n/**\n * The handshake metadata for protobuf services travels as encoded protobuf bytes\n * over River's existing handshake extension slot.\n */\nconst HandshakeBytesSchema = Type.Uint8Array();\n\ntype ProtobufHandshakeFailureCode = Static<\n typeof HandshakeErrorCustomHandlerFatalResponseCodes\n>;\n\ntype ConstructHandshake<Schema extends DescMessage> = () =>\n | MessageInitShape<Schema>\n | Promise<MessageInitShape<Schema>>;\n\ntype ValidateHandshake<Schema extends DescMessage, ParsedMetadata> = (\n metadata: MessageShape<Schema>,\n previousParsedMetadata?: ParsedMetadata,\n) =>\n | ParsedMetadata\n | ProtobufHandshakeFailureCode\n | Promise<ParsedMetadata | ProtobufHandshakeFailureCode>;\n\n/**\n * Create client-side handshake options backed by a protobuf message type.\n */\nexport function createClientHandshakeOptions<Schema extends DescMessage>(\n schema: Schema,\n construct: ConstructHandshake<Schema>,\n): ClientHandshakeOptions<typeof HandshakeBytesSchema> {\n return createTransportClientHandshakeOptions(\n HandshakeBytesSchema,\n async () => {\n const metadata = await construct();\n\n return encodeMessageBytes(schema, metadata);\n },\n );\n}\n\n/**\n * Create server-side handshake options backed by a protobuf message type.\n */\nexport function createServerHandshakeOptions<\n Schema extends DescMessage,\n ParsedMetadata extends object = object,\n>(\n schema: Schema,\n validate: ValidateHandshake<Schema, ParsedMetadata>,\n): ServerHandshakeOptions<typeof HandshakeBytesSchema, ParsedMetadata> {\n return createTransportServerHandshakeOptions(\n HandshakeBytesSchema,\n async (metadata, previousParsedMetadata) => {\n let decoded;\n try {\n decoded = decodeMessageBytes(schema, metadata);\n } catch {\n return 'REJECTED_BY_CUSTOM_HANDLER' as ProtobufHandshakeFailureCode;\n }\n\n return await validate(decoded, previousParsedMetadata);\n },\n );\n}\n","import type { DescMethod, DescService } from '@bufbuild/protobuf';\nimport type { MethodImpl, ServiceImpl } from './types';\n\n/**\n * An object that may implement async or sync disposal.\n */\nexport type MaybeDisposable<T extends object = Record<string, unknown>> = T & {\n [Symbol.asyncDispose]?: () => PromiseLike<void>;\n [Symbol.dispose]?: () => void;\n};\n\n/**\n * Stored registration for a single protobuf method handler.\n */\nexport interface RegisteredMethod {\n readonly service: DescService;\n readonly method: DescMethod;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly impl: MethodImpl<DescMethod, any, any, any>;\n}\n\n/**\n * An instantiated protobuf service with initialized state and a disposal hook.\n */\nexport interface InstantiatedProtoService {\n readonly descriptor: DescService;\n readonly state: MaybeDisposable<object>;\n readonly methods: ReadonlyMap<string, RegisteredMethod>;\n [Symbol.asyncDispose]: () => PromiseLike<void>;\n}\n\n/**\n * Type-erased interface used by the server to interact with a\n * service definition without knowing its full generic signature.\n */\nexport interface AnyProtoService {\n readonly descriptor: DescService;\n readonly methods: ReadonlyMap<string, RegisteredMethod>;\n instantiate(ctx: object): InstantiatedProtoService;\n}\n\ninterface ServiceConfiguration<Context extends object, State extends object> {\n initializeState: (ctx: Context) => MaybeDisposable<State>;\n}\n\nfunction buildMethodMap<\n Service extends DescService,\n Context extends object,\n State extends object,\n ParsedMetadata extends object,\n>(\n descriptor: Service,\n handlers: ServiceImpl<Service, Context, State, ParsedMetadata>,\n): Map<string, RegisteredMethod> {\n const methods = new Map<string, RegisteredMethod>();\n const typedMethods = descriptor.method as Service['method'];\n\n for (const methodName of Object.keys(handlers) as Array<\n keyof typeof handlers & string\n >) {\n const handler = handlers[methodName];\n if (handler === undefined) {\n continue;\n }\n\n const method = typedMethods[methodName as keyof Service['method']] as\n | DescMethod\n | undefined;\n if (!method) {\n throw new Error(`unknown method ${methodName} on ${descriptor.typeName}`);\n }\n\n methods.set(method.name, {\n service: descriptor,\n method,\n impl: handler as MethodImpl<DescMethod>,\n });\n }\n\n return methods;\n}\n\n/**\n * A scaffold for defining a protobuf service's handlers across multiple files.\n *\n * @see {@link ProtoServiceSchema.scaffold}\n */\nclass ProtoServiceScaffold<\n Service extends DescService,\n Context extends object,\n State extends object,\n ParsedMetadata extends object,\n> {\n private readonly descriptor: Service;\n private readonly config: ServiceConfiguration<Context, State>;\n\n constructor(\n descriptor: Service,\n config: ServiceConfiguration<Context, State>,\n ) {\n this.descriptor = descriptor;\n this.config = config;\n }\n\n /**\n * Type-check a partial set of handler implementations against this\n * service's types. Returns the input unchanged -- this is purely a\n * type-level helper for splitting handlers across files.\n *\n * @param handlers - A partial set of method implementations.\n */\n procedures(\n handlers: ServiceImpl<Service, Context, State, ParsedMetadata>,\n ): ServiceImpl<Service, Context, State, ParsedMetadata> {\n return handlers;\n }\n\n /**\n * Finalize the scaffold into a service definition. Provide all handlers\n * here (or spread in handler objects from {@link procedures}).\n *\n * @param handlers - Method implementations (missing methods return\n * UNIMPLEMENTED at runtime).\n */\n finalize(handlers: ServiceImpl<Service, Context, State, ParsedMetadata>) {\n return createProtoService<Context, ParsedMetadata>().define(\n this.descriptor,\n this.config,\n handlers,\n );\n }\n}\n\n/**\n * Creates a factory for defining protobuf services with typed context and\n * metadata.\n *\n * This mirrors {@link createServiceSchema} from the TypeBox router. The\n * factory binds the `Context` and `ParsedMetadata` types, then provides\n * `.define()` and `.scaffold()` methods for creating service definitions.\n *\n * @example\n * ```ts\n * const ProtoService = createProtoService<AppContext, ParsedMetadata>();\n *\n * // all-in-one (stateless)\n * const testSvc = ProtoService.define(TestService, {\n * echo: (req, ctx) => Ok({ text: req.text }),\n * });\n *\n * // all-in-one (with state)\n * const testSvc = ProtoService.define(\n * TestService,\n * { initializeState: (ctx) => ({ counter: 0 }) },\n * {\n * echo: (req, ctx) => {\n * ctx.state.counter++;\n * return Ok({ text: req.text });\n * },\n * },\n * );\n *\n * // scaffold for file-splitting\n * const scaffold = ProtoService.scaffold(TestService, {\n * initializeState: (ctx) => ({ counter: 0 }),\n * });\n * const echoHandlers = scaffold.procedures({\n * echo: (req, ctx) => Ok({ text: req.text }),\n * });\n * const testSvc = scaffold.finalize({\n * ...echoHandlers,\n * });\n *\n * const server = createServer(transport, [testSvc], {\n * context: myAppContext,\n * });\n * ```\n */\nexport function createProtoService<\n Context extends object = object,\n ParsedMetadata extends object = object,\n>() {\n return class ProtoServiceSchema<\n Service extends DescService,\n State extends object,\n > implements AnyProtoService\n {\n readonly descriptor: Service;\n readonly methods: ReadonlyMap<string, RegisteredMethod>;\n\n /** @internal */\n readonly initializeStateFn:\n | ((ctx: Context) => MaybeDisposable<State>)\n | undefined;\n\n constructor(\n descriptor: Service,\n initializeStateFn: ((ctx: Context) => MaybeDisposable<State>) | undefined,\n methods: Map<string, RegisteredMethod>,\n ) {\n this.descriptor = descriptor;\n this.initializeStateFn = initializeStateFn;\n this.methods = methods;\n }\n\n /**\n * Create a live service instance with initialized state.\n *\n * @param ctx - The user-provided context, passed to `initializeState`.\n */\n instantiate(ctx: Context): InstantiatedProtoService {\n const state = this.initializeStateFn\n ? this.initializeStateFn(ctx)\n : ({} as MaybeDisposable<State>);\n\n return Object.freeze({\n descriptor: this.descriptor,\n state,\n methods: this.methods,\n async [Symbol.asyncDispose]() {\n await state[Symbol.asyncDispose]?.();\n state[Symbol.dispose]?.();\n },\n });\n }\n\n /**\n * Define a stateless protobuf service with the given handlers.\n *\n * @param descriptor - The generated protobuf service descriptor.\n * @param handlers - Method implementations (missing methods return\n * UNIMPLEMENTED at runtime).\n */\n static define<S extends DescService>(\n descriptor: S,\n handlers: ServiceImpl<S, Context, object, ParsedMetadata>,\n ): ProtoServiceSchema<S, object>;\n /**\n * Define a stateful protobuf service with configuration and handlers.\n *\n * @param descriptor - The generated protobuf service descriptor.\n * @param config - Service configuration including `initializeState`.\n * @param handlers - Method implementations (missing methods return\n * UNIMPLEMENTED at runtime).\n */\n static define<S extends DescService, St extends object>(\n descriptor: S,\n config: ServiceConfiguration<Context, St>,\n handlers: ServiceImpl<S, Context, St, ParsedMetadata>,\n ): ProtoServiceSchema<S, St>;\n static define<S extends DescService, St extends object>(\n descriptor: S,\n configOrHandlers:\n | ServiceConfiguration<Context, St>\n | ServiceImpl<S, Context, St, ParsedMetadata>,\n maybeHandlers?: ServiceImpl<S, Context, St, ParsedMetadata>,\n ): ProtoServiceSchema<S, St> {\n let initializeStateFn:\n | ((ctx: Context) => MaybeDisposable<St>)\n | undefined;\n let handlers: ServiceImpl<S, Context, St, ParsedMetadata>;\n\n if (\n 'initializeState' in configOrHandlers &&\n typeof configOrHandlers.initializeState === 'function'\n ) {\n if (!maybeHandlers) {\n throw new Error('expected handlers as third argument');\n }\n\n initializeStateFn = (\n configOrHandlers as ServiceConfiguration<Context, St>\n ).initializeState;\n handlers = maybeHandlers;\n } else {\n initializeStateFn = undefined;\n handlers = configOrHandlers as ServiceImpl<\n S,\n Context,\n St,\n ParsedMetadata\n >;\n }\n\n return new ProtoServiceSchema(\n descriptor,\n initializeStateFn,\n buildMethodMap(descriptor, handlers),\n );\n }\n\n /**\n * Create a scaffold for splitting handler implementations across files.\n *\n * @param descriptor - The generated protobuf service descriptor.\n * @param config - Service configuration including `initializeState`.\n */\n static scaffold<S extends DescService, St extends object>(\n descriptor: S,\n config: ServiceConfiguration<Context, St>,\n ) {\n return new ProtoServiceScaffold<S, Context, St, ParsedMetadata>(\n descriptor,\n config,\n );\n }\n };\n}\n","import type {\n DescMethod,\n DescService,\n MessageInitShape,\n MessageShape,\n} from '@bufbuild/protobuf';\nimport { TSchema } from '@sinclair/typebox';\nimport { Value } from '@sinclair/typebox/value';\nimport { context as otelContext, trace, type Span } from '@opentelemetry/api';\nimport { Logger } from '../logging';\nimport { ServerHandshakeOptions } from '../router/handshake';\nimport { Err, Ok, type Result } from '../router/result';\nimport { ReadableImpl, WritableImpl } from '../router/streams';\nimport { Connection } from '../transport/connection';\nimport { EventMap } from '../transport/events';\nimport {\n ControlFlags,\n ControlMessageCloseSchema,\n OpaqueTransportMessage,\n TransportClientId,\n cancelMessage,\n closeStreamMessage,\n isStreamCancel,\n isStreamClose,\n isStreamOpen,\n} from '../transport/message';\nimport { ServerTransport } from '../transport/server';\nimport { coerceErrorString } from '../transport/stringifyError';\nimport type { SessionBoundSendFn } from '../transport/transport';\nimport type { IdentifiedSession } from '../transport/sessionStateMachine/common';\nimport {\n PropagationContext,\n createHandlerSpan,\n getTracer,\n recordRiverError,\n} from '../tracing';\nimport type { ProtobufHandlerContext } from './context';\nimport {\n type ClientError,\n type ProtocolError,\n RiverErrorCode,\n isSerializedProtocolErrorResult,\n} from './errors';\nimport {\n CANCEL_CODE,\n INVALID_REQUEST_CODE,\n UNCAUGHT_ERROR_CODE,\n UNEXPECTED_DISCONNECT_CODE,\n} from '../router/errors';\nimport {\n decodeMessageBytes,\n encodeMessageBytes,\n methodKey,\n methodKindToProcType,\n} from './shared';\nimport type {\n AnyProtoService,\n InstantiatedProtoService,\n MaybeDisposable,\n RegisteredMethod,\n} from './service';\n\ntype StreamId = string;\n\ntype HandlerResponse<Method extends DescMethod> = Result<\n MessageInitShape<Method['output']>,\n ClientError\n>;\n\ninterface StreamInitProps {\n readonly streamId: StreamId;\n readonly service: DescService;\n readonly method: DescMethod;\n readonly impl: RegisteredMethod['impl'];\n readonly serviceContext: object;\n readonly serviceState: object;\n readonly sessionMetadata: object;\n readonly initialSession: IdentifiedSession;\n readonly initialRequest: MessageShape<DescMethod['input']> | null;\n readonly closeRequestOnStart: boolean;\n readonly tracingCtx: PropagationContext | undefined;\n}\n\ninterface ProcStream {\n readonly streamId: StreamId;\n readonly from: TransportClientId;\n readonly service: DescService;\n readonly method: DescMethod;\n readonly handleMsg: (msg: OpaqueTransportMessage) => void;\n readonly handleSessionDisconnect: () => void;\n}\n\n/**\n * Server instance for the protobuf router.\n */\nexport interface Server {\n readonly streams: Map<StreamId, ProcStream>;\n close(): Promise<void>;\n}\n\n/**\n * Context passed to protobuf middleware.\n */\nexport type MiddlewareContext<ParsedMetadata extends object = object> =\n Readonly<\n Omit<ProtobufHandlerContext<object, object, ParsedMetadata>, 'cancel'>\n > & {\n readonly streamId: StreamId;\n readonly procedureName: string;\n readonly serviceName: string;\n };\n\n/**\n * Parameters passed to protobuf middleware.\n */\nexport interface MiddlewareParam<ParsedMetadata extends object = object> {\n readonly ctx: MiddlewareContext<ParsedMetadata>;\n readonly reqInit: MessageShape<DescMethod['input']> | null;\n next: () => void;\n}\n\n/**\n * Middleware is a function that can inspect protobuf requests as they are\n * received.\n */\nexport type Middleware<ParsedMetadata extends object = object> = (\n param: MiddlewareParam<ParsedMetadata>,\n) => void;\n\n/**\n * Options for creating a protobuf server.\n */\nexport interface ServerOptions<\n MetadataSchema extends TSchema,\n ParsedMetadata extends object,\n> {\n readonly extendedContext?: object;\n readonly handshakeOptions?: ServerHandshakeOptions<\n MetadataSchema,\n ParsedMetadata\n >;\n readonly middlewares?: Array<Middleware<ParsedMetadata>>;\n readonly maxCancelledStreamTombstonesPerSession?: number;\n}\n\nclass ProtobufServer<\n MetadataSchema extends TSchema,\n ParsedMetadata extends object,\n> implements Server\n{\n readonly streams: Map<StreamId, ProcStream>;\n\n private readonly transport: ServerTransport<\n Connection,\n MetadataSchema,\n ParsedMetadata\n >;\n\n private readonly methods: Map<string, RegisteredMethod>;\n private readonly serviceInstances: Map<string, InstantiatedProtoService>;\n private readonly userContext: object;\n\n private readonly log?: Logger;\n private readonly middlewares: Array<Middleware<ParsedMetadata>>;\n private readonly serverCancelledStreams: Map<\n TransportClientId,\n LRUSet<StreamId>\n >;\n\n private readonly maxCancelledStreamTombstonesPerSession: number;\n private unregisterTransportListeners: () => void;\n\n constructor(\n transport: ServerTransport<Connection, MetadataSchema, ParsedMetadata>,\n services: ReadonlyArray<AnyProtoService>,\n options: ServerOptions<MetadataSchema, ParsedMetadata> = {},\n ) {\n this.transport = transport;\n this.log = transport.log;\n this.middlewares = options.middlewares ?? [];\n this.maxCancelledStreamTombstonesPerSession =\n options.maxCancelledStreamTombstonesPerSession ?? 200;\n this.serverCancelledStreams = new Map();\n this.streams = new Map();\n this.userContext = options.extendedContext ?? {};\n\n // merge method registrations from all services\n this.methods = new Map();\n this.serviceInstances = new Map();\n\n for (const svc of services) {\n if (this.serviceInstances.has(svc.descriptor.typeName)) {\n throw new Error(\n `duplicate protobuf service registration for ${svc.descriptor.typeName}`,\n );\n }\n\n const instance = svc.instantiate(this.userContext);\n this.serviceInstances.set(svc.descriptor.typeName, instance);\n\n for (const [, reg] of instance.methods) {\n this.methods.set(\n methodKey(svc.descriptor.typeName, reg.method.name),\n reg,\n );\n }\n }\n\n if (options.handshakeOptions) {\n transport.extendHandshake(options.handshakeOptions);\n }\n\n const handleCreatingNewStreams = (message: EventMap['message']) => {\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\n return;\n }\n\n const stream = this.streams.get(message.streamId);\n if (stream) {\n stream.handleMsg(message);\n\n return;\n }\n\n if (\n this.serverCancelledStreams.get(message.from)?.has(message.streamId)\n ) {\n return;\n }\n\n const newStreamProps = this.validateNewProcStream(message);\n if (!newStreamProps) {\n return;\n }\n\n createHandlerSpan(\n transport.tracer,\n newStreamProps.initialSession,\n methodKindToProcType(newStreamProps.method.methodKind),\n newStreamProps.service.typeName,\n newStreamProps.method.name,\n newStreamProps.streamId,\n newStreamProps.tracingCtx,\n (span) => {\n this.createNewProcStream(span, newStreamProps);\n },\n );\n };\n\n const handleSessionStatus = (evt: EventMap['sessionStatus']) => {\n if (evt.status !== 'closing') {\n return;\n }\n\n const disconnectedClientId = evt.session.to;\n this.log?.info(\n `got session disconnect from ${disconnectedClientId}, cleaning up protobuf streams`,\n evt.session.loggingMetadata,\n );\n\n for (const stream of this.streams.values()) {\n if (stream.from === disconnectedClientId) {\n stream.handleSessionDisconnect();\n }\n }\n\n this.serverCancelledStreams.delete(disconnectedClientId);\n };\n\n const handleTransportStatus = (evt: EventMap['transportStatus']) => {\n if (evt.status === 'closed') {\n this.unregisterTransportListeners();\n }\n };\n\n this.unregisterTransportListeners = () => {\n this.transport.removeEventListener('message', handleCreatingNewStreams);\n this.transport.removeEventListener('sessionStatus', handleSessionStatus);\n this.transport.removeEventListener(\n 'transportStatus',\n handleTransportStatus,\n );\n };\n\n this.transport.addEventListener('message', handleCreatingNewStreams);\n this.transport.addEventListener('sessionStatus', handleSessionStatus);\n this.transport.addEventListener('transportStatus', handleTransportStatus);\n }\n\n async close() {\n this.unregisterTransportListeners();\n\n for (const instance of this.serviceInstances.values()) {\n await instance[Symbol.asyncDispose]();\n }\n\n const ctx = this.userContext as MaybeDisposable;\n if (ctx[Symbol.asyncDispose]) {\n await ctx[Symbol.asyncDispose]?.();\n } else if (ctx[Symbol.dispose]) {\n ctx[Symbol.dispose]?.();\n } else {\n for (const value of Object.values(ctx)) {\n if (value && typeof value === 'object') {\n const v = value as MaybeDisposable;\n if (v[Symbol.asyncDispose]) {\n await v[Symbol.asyncDispose]?.();\n } else if (v[Symbol.dispose]) {\n v[Symbol.dispose]?.();\n }\n }\n }\n }\n }\n\n private createNewProcStream(span: Span, props: StreamInitProps) {\n const {\n streamId,\n service,\n method,\n impl,\n serviceContext,\n serviceState,\n sessionMetadata,\n initialSession,\n initialRequest,\n closeRequestOnStart,\n } = props;\n const { to: from, loggingMetadata, id: sessionId } = initialSession;\n\n loggingMetadata.telemetry = {\n traceId: span.spanContext().traceId,\n spanId: span.spanContext().spanId,\n };\n\n let cleanClose = true;\n const finishedController = new AbortController();\n const sessionScopedSend = this.transport.getSessionBoundSendFn(\n from,\n sessionId,\n );\n\n const deferredCleanups: Array<() => void | Promise<void>> = [];\n let cleanupsHaveRun = false;\n\n const runCleanupSafe = async (fn: () => void | Promise<void>) => {\n try {\n await fn();\n } catch (err) {\n span.recordException(\n err instanceof Error ? err : new Error(String(err)),\n );\n }\n };\n\n const deferCleanup = (fn: () => void | Promise<void>) => {\n if (cleanupsHaveRun) {\n void runCleanupSafe(fn);\n\n return;\n }\n\n deferredCleanups.push(fn);\n };\n\n const runDeferredCleanups = async () => {\n if (deferredCleanups.length === 0) {\n cleanupsHaveRun = true;\n span.end();\n\n return;\n }\n\n const cleanupSpan = getTracer().startSpan(\n 'river.cleanup',\n {},\n trace.setSpan(otelContext.active(), span),\n );\n\n try {\n for (let fn = deferredCleanups.pop(); fn; fn = deferredCleanups.pop()) {\n await runCleanupSafe(fn);\n }\n } finally {\n cleanupsHaveRun = true;\n cleanupSpan.end();\n span.end();\n }\n };\n\n const cleanup = () => {\n finishedController.abort();\n this.streams.delete(streamId);\n void runDeferredCleanups();\n };\n\n const reqReadable = new ReadableImpl<\n MessageShape<DescMethod['input']>,\n ProtocolError\n >();\n const closeReadable = () => {\n if (reqReadable.isClosed()) {\n return;\n }\n\n reqReadable._triggerClose();\n if (resWritable.isClosed()) {\n cleanup();\n }\n };\n\n const procClosesWithResponse =\n method.methodKind === 'unary' || method.methodKind === 'client_streaming';\n\n const resWritable = new WritableImpl<HandlerResponse<DescMethod>>({\n writeCb: (response) => {\n const payload = response.ok\n ? encodeMessageBytes(method.output, response.payload)\n : Err(response.payload);\n\n if (!response.ok) {\n recordRiverError(span, response.payload);\n }\n\n sessionScopedSend({\n streamId,\n controlFlags: procClosesWithResponse\n ? ControlFlags.StreamClosedBit\n : 0,\n payload,\n });\n\n if (procClosesWithResponse) {\n resWritable.close();\n }\n },\n closeCb: () => {\n if (!procClosesWithResponse && cleanClose) {\n sessionScopedSend(closeStreamMessage(streamId));\n }\n\n if (reqReadable.isClosed()) {\n cleanup();\n }\n },\n });\n\n const cancelStream = (error: ClientError) => {\n this.cancelStream(from, sessionScopedSend, streamId, error);\n };\n\n const pushRequestError = (error: ProtocolError) => {\n if (!reqReadable.isClosed()) {\n reqReadable._pushValue(Err(error));\n closeReadable();\n }\n\n resWritable.close();\n };\n\n const onServerCancel = (error: ProtocolError) => {\n recordRiverError(span, error);\n\n if (reqReadable.isClosed() && resWritable.isClosed()) {\n return;\n }\n\n cleanClose = false;\n pushRequestError(error);\n cancelStream(error);\n };\n\n const onHandlerError = (err: unknown) => {\n const errorMsg = coerceErrorString(err);\n\n span.recordException(err instanceof Error ? err : new Error(errorMsg));\n\n this.log?.error(\n `${service.typeName}.${method.name} handler threw an uncaught error`,\n {\n ...loggingMetadata,\n transportMessage: {\n procedureName: method.name,\n serviceName: service.typeName,\n },\n extras: {\n error: errorMsg,\n originalException: err,\n },\n tags: ['uncaught-handler-error'],\n },\n );\n\n const error: ClientError = {\n code: UNCAUGHT_ERROR_CODE,\n message: errorMsg,\n };\n recordRiverError(span, error);\n\n if (reqReadable.isClosed() && resWritable.isClosed()) {\n return;\n }\n\n if (!resWritable.isClosed()) {\n resWritable.write(Err(error));\n if (!procClosesWithResponse) {\n resWritable.close();\n }\n }\n\n if (!reqReadable.isClosed()) {\n closeReadable();\n }\n };\n\n const onMessage = (msg: OpaqueTransportMessage) => {\n if (msg.from !== from) {\n this.log?.error('got stream message from unexpected client', {\n ...loggingMetadata,\n transportMessage: msg,\n tags: ['invariant-violation'],\n });\n\n return;\n }\n\n if (isStreamCancel(msg.controlFlags)) {\n const error: ProtocolError = isSerializedProtocolErrorResult(\n msg.payload,\n )\n ? msg.payload.payload\n : {\n code: CANCEL_CODE,\n message: 'stream cancelled, client sent invalid payload',\n };\n\n pushRequestError(error);\n\n return;\n }\n\n if (reqReadable.isClosed()) {\n this.log?.warn('received message after request stream is closed', {\n ...loggingMetadata,\n transportMessage: msg,\n tags: ['invalid-request'],\n });\n onServerCancel({\n code: INVALID_REQUEST_CODE,\n message: 'received message after request stream is closed',\n });\n\n return;\n }\n\n if (msg.payload instanceof Uint8Array) {\n try {\n reqReadable._pushValue(\n Ok(decodeMessageBytes(method.input, msg.payload)),\n );\n } catch {\n onServerCancel({\n code: INVALID_REQUEST_CODE,\n message: 'failed to decode protobuf request payload',\n });\n\n return;\n }\n\n if (isStreamClose(msg.controlFlags)) {\n closeReadable();\n }\n\n return;\n }\n\n if (\n Value.Check(ControlMessageCloseSchema, msg.payload) &&\n isStreamClose(msg.controlFlags)\n ) {\n closeReadable();\n\n return;\n }\n\n onServerCancel({\n code: INVALID_REQUEST_CODE,\n message: 'received invalid protobuf request payload',\n });\n };\n\n const procStream: ProcStream = {\n from,\n streamId,\n service,\n method,\n handleMsg: onMessage,\n handleSessionDisconnect: () => {\n cleanClose = false;\n pushRequestError({\n code: UNEXPECTED_DISCONNECT_CODE,\n message: 'client unexpectedly disconnected',\n });\n },\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n const handlerContext: ProtobufHandlerContext<any, any, any> = {\n ...serviceContext,\n state: serviceState,\n from,\n sessionId,\n metadata: sessionMetadata,\n span,\n service,\n method,\n deferCleanup,\n cancel: (message?: string) => {\n const error: ProtocolError = {\n code: CANCEL_CODE,\n message: message ?? 'cancelled by server procedure handler',\n };\n onServerCancel(error);\n\n return Err(error);\n },\n signal: finishedController.signal,\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const middlewareContext: MiddlewareContext<ParsedMetadata> = {\n ...handlerContext,\n streamId,\n procedureName: method.name,\n serviceName: service.typeName,\n };\n\n if (initialRequest !== null) {\n reqReadable._pushValue(Ok(initialRequest));\n }\n if (closeRequestOnStart) {\n closeReadable();\n }\n\n // type-erased handler dispatch; ProtoService.define() enforces the\n // correct handler signatures at registration time.\n /* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any */\n const handler = impl as (...args: Array<any>) => any;\n\n const runProcedureHandler = async () => {\n try {\n switch (method.methodKind) {\n case 'unary': {\n const response: HandlerResponse<DescMethod> = await handler(\n requireInitialRequest(initialRequest, method),\n handlerContext,\n );\n if (!resWritable.isClosed()) {\n resWritable.write(response);\n }\n break;\n }\n\n case 'server_streaming':\n await handler({\n request: requireInitialRequest(initialRequest, method),\n ctx: handlerContext,\n resWritable,\n });\n break;\n\n case 'client_streaming': {\n const response: HandlerResponse<DescMethod> = await handler({\n ctx: handlerContext,\n reqReadable,\n });\n if (!resWritable.isClosed()) {\n resWritable.write(response);\n }\n break;\n }\n\n case 'bidi_streaming':\n await handler({\n ctx: handlerContext,\n reqReadable,\n resWritable,\n });\n break;\n }\n } catch (err) {\n onHandlerError(err);\n }\n };\n /* eslint-enable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any */\n\n this.middlewares.reduceRight(\n (next: () => void, middleware: Middleware<ParsedMetadata>) => {\n return () => {\n middleware({\n ctx: middlewareContext,\n reqInit: initialRequest,\n next,\n });\n };\n },\n () => {\n void runProcedureHandler();\n },\n )();\n\n if (!finishedController.signal.aborted) {\n this.streams.set(streamId, procStream);\n }\n }\n\n private validateNewProcStream(\n initMessage: OpaqueTransportMessage,\n ): StreamInitProps | null {\n const session = this.transport.sessions.get(initMessage.from);\n if (!session) {\n this.log?.error(`couldn't find session for ${initMessage.from}`, {\n clientId: this.transport.clientId,\n transportMessage: initMessage,\n tags: ['invariant-violation'],\n });\n\n return null;\n }\n\n const sessionScopedSend = this.transport.getSessionBoundSendFn(\n initMessage.from,\n session.id,\n );\n const sendCancel = (error: ClientError) => {\n this.cancelStream(\n initMessage.from,\n sessionScopedSend,\n initMessage.streamId,\n error,\n );\n };\n\n const sessionMetadata = this.transport.sessionHandshakeMetadata.get(\n session.to,\n );\n if (!sessionMetadata) {\n sendCancel({\n code: UNCAUGHT_ERROR_CODE,\n message: `session doesn't have handshake metadata`,\n });\n\n return null;\n }\n\n if (!isStreamOpen(initMessage.controlFlags)) {\n sendCancel({\n code: INVALID_REQUEST_CODE,\n message: `can't create a new procedure stream from a message without the stream open bit set`,\n });\n\n return null;\n }\n\n if (!initMessage.serviceName) {\n sendCancel({\n code: INVALID_REQUEST_CODE,\n message: `missing service name in stream open message`,\n });\n\n return null;\n }\n\n if (!initMessage.procedureName) {\n sendCancel({\n code: INVALID_REQUEST_CODE,\n message: `missing procedure name in stream open message`,\n });\n\n return null;\n }\n\n const route = this.methods.get(\n methodKey(initMessage.serviceName, initMessage.procedureName),\n );\n if (!route) {\n sendCancel({\n code: RiverErrorCode.UNIMPLEMENTED,\n message: `${initMessage.serviceName}.${initMessage.procedureName} is not implemented`,\n });\n\n return null;\n }\n\n const serviceInstance = this.serviceInstances.get(initMessage.serviceName);\n\n let initialRequest: MessageShape<DescMethod['input']> | null = null;\n let closeRequestOnStart = false;\n\n if (\n route.method.methodKind === 'unary' ||\n route.method.methodKind === 'server_streaming'\n ) {\n if (!(initMessage.payload instanceof Uint8Array)) {\n sendCancel({\n code: INVALID_REQUEST_CODE,\n message: 'expected protobuf request payload in opening frame',\n });\n\n return null;\n }\n\n try {\n initialRequest = decodeMessageBytes(\n route.method.input,\n initMessage.payload,\n );\n } catch {\n sendCancel({\n code: INVALID_REQUEST_CODE,\n message: 'failed to decode protobuf request payload',\n });\n\n return null;\n }\n\n if (!isStreamClose(initMessage.controlFlags)) {\n sendCancel({\n code: INVALID_REQUEST_CODE,\n message:\n 'protobuf unary and server-streaming calls must close the request stream in the opening frame',\n });\n\n return null;\n }\n\n closeRequestOnStart = true;\n } else if (initMessage.payload instanceof Uint8Array) {\n if (initMessage.payload.byteLength > 0) {\n try {\n initialRequest = decodeMessageBytes(\n route.method.input,\n initMessage.payload,\n );\n } catch {\n sendCancel({\n code: INVALID_REQUEST_CODE,\n message: 'failed to decode protobuf request payload',\n });\n\n return null;\n }\n }\n\n closeRequestOnStart = isStreamClose(initMessage.controlFlags);\n } else if (\n Value.Check(ControlMessageCloseSchema, initMessage.payload) &&\n isStreamClose(initMessage.controlFlags)\n ) {\n closeRequestOnStart = true;\n } else {\n sendCancel({\n code: INVALID_REQUEST_CODE,\n message: 'received invalid protobuf request payload',\n });\n\n return null;\n }\n\n return {\n streamId: initMessage.streamId,\n service: route.service,\n method: route.method,\n impl: route.impl,\n serviceContext: this.userContext,\n serviceState: serviceInstance?.state ?? {},\n sessionMetadata,\n initialSession: session,\n initialRequest,\n closeRequestOnStart,\n tracingCtx: initMessage.tracing,\n };\n }\n\n private cancelStream(\n to: TransportClientId,\n sessionScopedSend: SessionBoundSendFn,\n streamId: StreamId,\n error: ClientError,\n ) {\n let cancelledStreamsInSession = this.serverCancelledStreams.get(to);\n if (!cancelledStreamsInSession) {\n cancelledStreamsInSession = new LRUSet(\n this.maxCancelledStreamTombstonesPerSession,\n );\n this.serverCancelledStreams.set(to, cancelledStreamsInSession);\n }\n\n cancelledStreamsInSession.add(streamId);\n sessionScopedSend(cancelMessage(streamId, Err(error)));\n }\n}\n\nfunction requireInitialRequest<Method extends DescMethod>(\n initialRequest: MessageShape<Method['input']> | null,\n method: Method,\n): MessageShape<Method['input']> {\n if (initialRequest === null) {\n throw new Error(\n `missing initial request for protobuf ${method.parent.typeName}.${method.name}`,\n );\n }\n\n return initialRequest;\n}\n\nclass LRUSet<T> {\n private readonly items = new Set<T>();\n\n constructor(private readonly maxItems: number) {}\n\n add(item: T) {\n if (this.items.has(item)) {\n this.items.delete(item);\n } else if (this.items.size >= this.maxItems) {\n const first = this.items.values().next();\n if (!first.done) {\n this.items.delete(first.value);\n }\n }\n\n this.items.add(item);\n }\n\n has(item: T) {\n return this.items.has(item);\n }\n}\n\n/**\n * Creates a protobuf server that listens on an existing River transport.\n *\n * @param transport - The server transport to listen on.\n * @param services - Array of {@link ProtoService} definitions.\n * @param options - Server options including context, handshake, and middleware.\n */\nexport function createServer<\n MetadataSchema extends TSchema,\n ParsedMetadata extends object,\n>(\n transport: ServerTransport<Connection, MetadataSchema, ParsedMetadata>,\n services: ReadonlyArray<AnyProtoService>,\n options?: ServerOptions<MetadataSchema, ParsedMetadata>,\n): Server {\n return new ProtobufServer(transport, services, options);\n}\n"],"mappings":"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","names":["createClientHandshakeOptions","createServerHandshakeOptions","msgpackEncode","msgpackDecode","import_typebox","import_typebox","RiverErrorCode","import_protobuf","import_typebox","createClientHandshakeOptions","createServerHandshakeOptions","import_value","import_api","otelContext"]}
|