@replit/river 0.200.0-rc.16 → 0.200.0-rc.18
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 +8 -8
- package/dist/{chunk-SKB2I27D.js → chunk-3TABKMH3.js} +8 -25
- package/dist/chunk-3TABKMH3.js.map +1 -0
- package/dist/{chunk-7URZZXRT.js → chunk-5T2KKCF7.js} +2 -2
- package/dist/{chunk-DH7WAJZM.js → chunk-INUAOMRY.js} +4 -4
- package/dist/{chunk-DDAGE6MV.js → chunk-L6IIRKIH.js} +4 -4
- package/dist/{chunk-J274XPWD.js → chunk-RNVY6YNO.js} +2 -2
- package/dist/{chunk-LYIHSVPM.js → chunk-VFIFB24N.js} +3 -3
- package/dist/chunk-VH6UPCRA.js +342 -0
- package/dist/chunk-VH6UPCRA.js.map +1 -0
- package/dist/{client-86d14d9b.d.ts → client-75090f07.d.ts} +1 -1
- package/dist/{connection-306ef0cc.d.ts → connection-c9f96b64.d.ts} +1 -1
- package/dist/{context-00e2b444.d.ts → context-9c907028.d.ts} +15 -26
- package/dist/router/index.cjs +353 -490
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +9 -9
- package/dist/router/index.d.ts +9 -9
- package/dist/router/index.js +261 -278
- package/dist/router/index.js.map +1 -1
- package/dist/{server-561859e2.d.ts → server-109a29e2.d.ts} +1 -1
- package/dist/{services-b0927cc0.d.ts → services-d2750fdb.d.ts} +121 -159
- 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 +3 -3
- package/dist/transport/impls/ws/client.d.ts +3 -3
- package/dist/transport/impls/ws/client.js +5 -5
- package/dist/transport/impls/ws/server.cjs +1 -1
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +3 -3
- package/dist/transport/impls/ws/server.d.ts +3 -3
- package/dist/transport/impls/ws/server.js +5 -5
- package/dist/transport/index.cjs +1 -1
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +3 -3
- package/dist/transport/index.d.ts +3 -3
- package/dist/transport/index.js +5 -5
- package/dist/util/testHelpers.cjs +154 -249
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +31 -29
- package/dist/util/testHelpers.d.ts +31 -29
- package/dist/util/testHelpers.js +62 -51
- package/dist/util/testHelpers.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-A2MGUPER.js +0 -451
- package/dist/chunk-A2MGUPER.js.map +0 -1
- package/dist/chunk-SKB2I27D.js.map +0 -1
- /package/dist/{chunk-7URZZXRT.js.map → chunk-5T2KKCF7.js.map} +0 -0
- /package/dist/{chunk-DH7WAJZM.js.map → chunk-INUAOMRY.js.map} +0 -0
- /package/dist/{chunk-DDAGE6MV.js.map → chunk-L6IIRKIH.js.map} +0 -0
- /package/dist/{chunk-J274XPWD.js.map → chunk-RNVY6YNO.js.map} +0 -0
- /package/dist/{chunk-LYIHSVPM.js.map → chunk-VFIFB24N.js.map} +0 -0
package/README.md
CHANGED
|
@@ -65,11 +65,11 @@ Before proceeding, ensure you have TypeScript 5 installed and configured appropr
|
|
|
65
65
|
|
|
66
66
|
- Router: a collection of services, namespaced by service name.
|
|
67
67
|
- Service: a collection of procedures with a shared state.
|
|
68
|
-
- Procedure: a single procedure. A procedure declares its type,
|
|
69
|
-
- `rpc
|
|
70
|
-
- `upload
|
|
71
|
-
- `subscription
|
|
72
|
-
- `stream
|
|
68
|
+
- Procedure: a single procedure. A procedure declares its type, a request data type, a response data type, optionally a response error type, and the associated handler. Valid types are:
|
|
69
|
+
- `rpc`, single request, single response
|
|
70
|
+
- `upload`, multiple requests, single response
|
|
71
|
+
- `subscription`, single request, multiple responses
|
|
72
|
+
- `stream`, multiple requests, multiple response
|
|
73
73
|
- Transport: manages the lifecycle (creation/deletion) of connections and multiplexing read/writes from clients. Both the client and the server must be passed in a subclass of `Transport` to work.
|
|
74
74
|
- Connection: the actual raw underlying transport connection
|
|
75
75
|
- Session: a higher-level abstraction that operates over the span of potentially multiple transport-level connections
|
|
@@ -92,11 +92,11 @@ export const ExampleService = ServiceSchema.define(
|
|
|
92
92
|
// procedures
|
|
93
93
|
{
|
|
94
94
|
add: Procedure.rpc({
|
|
95
|
-
|
|
95
|
+
requestInit: Type.Object({ n: Type.Number() }),
|
|
96
96
|
responseData: Type.Object({ result: Type.Number() }),
|
|
97
|
-
|
|
97
|
+
requestErrors: Type.Never(),
|
|
98
98
|
// note that a handler is unique per user RPC
|
|
99
|
-
async handler(ctx, { n }) {
|
|
99
|
+
async handler({ ctx, reqInit: { n } }) {
|
|
100
100
|
// access and mutate shared state
|
|
101
101
|
ctx.state.count += n;
|
|
102
102
|
return Ok({ result: ctx.state.count });
|
|
@@ -150,19 +150,10 @@ function closeStreamMessage(streamId) {
|
|
|
150
150
|
}
|
|
151
151
|
};
|
|
152
152
|
}
|
|
153
|
-
function
|
|
153
|
+
function cancelMessage(streamId, payload) {
|
|
154
154
|
return {
|
|
155
155
|
streamId,
|
|
156
|
-
controlFlags:
|
|
157
|
-
payload: {
|
|
158
|
-
type: "CLOSE"
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
function abortMessage(streamId, payload) {
|
|
163
|
-
return {
|
|
164
|
-
streamId,
|
|
165
|
-
controlFlags: 4 /* StreamAbortBit */,
|
|
156
|
+
controlFlags: 4 /* StreamCancelBit */,
|
|
166
157
|
payload
|
|
167
158
|
};
|
|
168
159
|
}
|
|
@@ -181,21 +172,15 @@ function isStreamClose(controlFlag) {
|
|
|
181
172
|
(controlFlag & 8 /* StreamClosedBit */) === 8 /* StreamClosedBit */
|
|
182
173
|
);
|
|
183
174
|
}
|
|
184
|
-
function
|
|
185
|
-
return (
|
|
186
|
-
/* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */
|
|
187
|
-
(controlFlag & 16 /* StreamCloseRequestBit */) === 16 /* StreamCloseRequestBit */
|
|
188
|
-
);
|
|
189
|
-
}
|
|
190
|
-
function isStreamAbort(controlFlag) {
|
|
175
|
+
function isStreamCancel(controlFlag) {
|
|
191
176
|
return (
|
|
192
177
|
/* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */
|
|
193
|
-
(controlFlag & 4 /*
|
|
178
|
+
(controlFlag & 4 /* StreamCancelBit */) === 4 /* StreamCancelBit */
|
|
194
179
|
);
|
|
195
180
|
}
|
|
196
181
|
|
|
197
182
|
// package.json
|
|
198
|
-
var version = "0.200.0-rc.
|
|
183
|
+
var version = "0.200.0-rc.18";
|
|
199
184
|
|
|
200
185
|
// util/stringify.ts
|
|
201
186
|
function coerceErrorString(err) {
|
|
@@ -305,13 +290,11 @@ export {
|
|
|
305
290
|
handshakeRequestMessage,
|
|
306
291
|
handshakeResponseMessage,
|
|
307
292
|
closeStreamMessage,
|
|
308
|
-
|
|
309
|
-
abortMessage,
|
|
293
|
+
cancelMessage,
|
|
310
294
|
isAck,
|
|
311
295
|
isStreamOpen,
|
|
312
296
|
isStreamClose,
|
|
313
|
-
|
|
314
|
-
isStreamAbort,
|
|
297
|
+
isStreamCancel,
|
|
315
298
|
version,
|
|
316
299
|
getPropagationContext,
|
|
317
300
|
createSessionTelemetryInfo,
|
|
@@ -320,4 +303,4 @@ export {
|
|
|
320
303
|
tracing_default,
|
|
321
304
|
coerceErrorString
|
|
322
305
|
};
|
|
323
|
-
//# sourceMappingURL=chunk-
|
|
306
|
+
//# sourceMappingURL=chunk-3TABKMH3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../transport/message.ts","../transport/id.ts","../package.json","../util/stringify.ts","../tracing/index.ts"],"sourcesContent":["import { Type, TSchema, Static } from '@sinclair/typebox';\nimport { PropagationContext } from '../tracing';\nimport { generateId } from './id';\nimport { ErrResult, ReaderErrorSchema } from '../router';\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 writer closes the stream.\n */\n StreamClosedBit = 0b01000,\n /**\n * Used when a stream is cancelled due errors or to explicit cancellation\n */\n StreamCancelBit = 0b00100,\n}\n\n/**\n * Generic Typebox schema for a transport message.\n * @template T The type of the payload.\n * @param {T} t The payload schema.\n * @returns The transport message schema.\n */\nexport const TransportMessageSchema = <T extends TSchema>(t: T) =>\n Type.Object({\n id: Type.String(),\n from: Type.String(),\n to: Type.String(),\n seq: Type.Integer(),\n ack: Type.Integer(),\n serviceName: Type.Optional(Type.String()),\n procedureName: Type.Optional(Type.String()),\n streamId: Type.String(),\n controlFlags: Type.Integer(),\n tracing: Type.Optional(\n Type.Object({\n traceparent: Type.String(),\n tracestate: Type.String(),\n }),\n ),\n payload: t,\n });\n\n/**\n * Defines the schema for a transport acknowledgement message. This is never constructed manually\n * and is only used internally by the library for tracking inflight messages.\n * @returns The transport message schema.\n */\nexport const ControlMessageAckSchema = Type.Object({\n type: Type.Literal('ACK'),\n});\n\n/**\n * Defines the schema for a transport close message. This is never constructed manually and is only\n * used internally by the library for closing and cleaning up streams.\n */\nexport const ControlMessageCloseSchema = Type.Object({\n type: Type.Literal('CLOSE'),\n});\n\nexport const currentProtocolVersion = 'v2.0';\nexport const acceptedProtocolVersions = ['v1.1', currentProtocolVersion];\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<Static<typeof ReaderErrorSchema>>,\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 * 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","{\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.200.0-rc.18\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/router/index.js\",\n \"require\": \"./dist/router/index.cjs\"\n },\n \"./logging\": {\n \"import\": \"./dist/logging/index.js\",\n \"require\": \"./dist/logging/index.cjs\"\n },\n \"./codec\": {\n \"import\": \"./dist/codec/index.js\",\n \"require\": \"./dist/codec/index.cjs\"\n },\n \"./transport\": {\n \"import\": \"./dist/transport/index.js\",\n \"require\": \"./dist/transport/index.cjs\"\n },\n \"./transport/ws/client\": {\n \"import\": \"./dist/transport/impls/ws/client.js\",\n \"require\": \"./dist/transport/impls/ws/client.cjs\"\n },\n \"./transport/ws/server\": {\n \"import\": \"./dist/transport/impls/ws/server.js\",\n \"require\": \"./dist/transport/impls/ws/server.cjs\"\n },\n \"./transport/uds/client\": {\n \"import\": \"./dist/transport/impls/uds/client.js\",\n \"require\": \"./dist/transport/impls/uds/client.cjs\"\n },\n \"./transport/uds/server\": {\n \"import\": \"./dist/transport/impls/uds/server.js\",\n \"require\": \"./dist/transport/impls/uds/server.cjs\"\n },\n \"./test-util\": {\n \"import\": \"./dist/util/testHelpers.js\",\n \"require\": \"./dist/util/testHelpers.cjs\"\n }\n },\n \"sideEffects\": [\n \"./dist/logging/index.js\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@msgpack/msgpack\": \"^3.0.0-beta2\",\n \"nanoid\": \"^4.0.2\",\n \"ws\": \"^8.17.0\"\n },\n \"peerDependencies\": {\n \"@opentelemetry/api\": \"^1.7.0\",\n \"@sinclair/typebox\": \"~0.32.8\"\n },\n \"devDependencies\": {\n \"@opentelemetry/core\": \"^1.7.0\",\n \"@opentelemetry/sdk-trace-base\": \"^1.24.1\",\n \"@opentelemetry/sdk-trace-web\": \"^1.24.1\",\n \"@types/ws\": \"^8.5.5\",\n \"@typescript-eslint/eslint-plugin\": \"^7.8.0\",\n \"@typescript-eslint/parser\": \"^7.8.0\",\n \"@vitest/ui\": \"^2.0.5\",\n \"eslint\": \"^8.57.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-prettier\": \"^5.1.3\",\n \"prettier\": \"^3.0.0\",\n \"tsup\": \"^7.2.0\",\n \"typescript\": \"^5.4.5\",\n \"vitest\": \"^2.0.5\"\n },\n \"scripts\": {\n \"check\": \"tsc --noEmit && npm run format && npm run lint\",\n \"format\": \"npx prettier . --check\",\n \"format:fix\": \"npx prettier . --write\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"fix\": \"npm run format:fix && npm run lint:fix\",\n \"build\": \"rm -rf dist && tsup && du -sh dist\",\n \"prepack\": \"npm run build\",\n \"release\": \"npm publish --access public\",\n \"test:ui\": \"echo \\\"remember to go to /__vitest__ in the webview\\\" && vitest --ui --api.host 0.0.0.0 --api.port 3000\",\n \"test\": \"vitest\",\n \"test:single\": \"vitest run --reporter=dot\",\n \"test:flake\": \"./flake.sh\",\n \"bench\": \"vitest bench\"\n },\n \"engines\": {\n \"node\": \">=16\"\n },\n \"keywords\": [\n \"rpc\",\n \"websockets\",\n \"jsonschema\"\n ],\n \"author\": \"Jacky Zhao\",\n \"license\": \"MIT\"\n}\n","export function coerceErrorString(err: unknown): string {\n if (err instanceof Error) {\n return err.message || 'unknown reason';\n }\n\n return `[coerced to error] ${String(err)}`;\n}\n","import {\n Context,\n Span,\n SpanKind,\n context,\n propagation,\n trace,\n} from '@opentelemetry/api';\nimport { version as RIVER_VERSION } from '../package.json';\nimport { ValidProcType } from '../router';\nimport { ClientTransport, Connection } from '../transport';\n\nexport interface PropagationContext {\n traceparent: string;\n tracestate: string;\n}\n\nexport interface TelemetryInfo {\n span: Span;\n ctx: Context;\n}\n\nexport function getPropagationContext(\n ctx: Context,\n): PropagationContext | undefined {\n const tracing = {\n traceparent: '',\n tracestate: '',\n };\n propagation.inject(ctx, tracing);\n return tracing;\n}\n\nexport function createSessionTelemetryInfo(\n sessionId: string,\n to: string,\n from: string,\n propagationCtx?: PropagationContext,\n): TelemetryInfo {\n const parentCtx = propagationCtx\n ? propagation.extract(context.active(), propagationCtx)\n : context.active();\n\n const span = tracer.startSpan(\n `session ${sessionId}`,\n {\n attributes: {\n component: 'river',\n 'river.session.id': sessionId,\n 'river.session.to': to,\n 'river.session.from': from,\n },\n },\n parentCtx,\n );\n\n const ctx = trace.setSpan(parentCtx, span);\n\n return { span, ctx };\n}\n\nexport function createConnectionTelemetryInfo(\n connection: Connection,\n info: TelemetryInfo,\n): TelemetryInfo {\n const span = tracer.startSpan(\n `connection ${connection.id}`,\n {\n attributes: {\n component: 'river',\n 'river.connection.id': connection.id,\n },\n links: [{ context: info.span.spanContext() }],\n },\n info.ctx,\n );\n\n const ctx = trace.setSpan(info.ctx, span);\n\n return { span, ctx };\n}\n\nexport function createProcTelemetryInfo(\n transport: ClientTransport<Connection>,\n kind: ValidProcType,\n serviceName: string,\n procedureName: string,\n streamId: string,\n): TelemetryInfo {\n const baseCtx = context.active();\n const span = tracer.startSpan(\n `procedure call ${serviceName}.${procedureName}`,\n {\n attributes: {\n component: 'river',\n 'river.method.kind': kind,\n 'river.method.service': serviceName,\n 'river.method.name': procedureName,\n 'river.streamId': streamId,\n 'span.kind': 'client',\n },\n kind: SpanKind.CLIENT,\n },\n baseCtx,\n );\n\n const ctx = trace.setSpan(baseCtx, span);\n\n transport.log?.info(`invoked ${serviceName}.${procedureName}`, {\n clientId: transport.clientId,\n transportMessage: {\n procedureName,\n serviceName,\n },\n telemetry: {\n traceId: span.spanContext().traceId,\n spanId: span.spanContext().spanId,\n },\n });\n return { span, ctx };\n}\n\nexport function createHandlerSpan<Fn extends (span: Span) => unknown>(\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 `procedure handler ${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 kind: SpanKind.SERVER,\n },\n ctx,\n fn,\n );\n}\n\nconst tracer = trace.getTracer('river', RIVER_VERSION);\nexport default tracer;\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Connection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VFIFB24N.js";
|
|
4
4
|
|
|
5
5
|
// transport/impls/ws/connection.ts
|
|
6
6
|
var WS_HEALTHY_CLOSE_CODE = 1e3;
|
|
@@ -57,4 +57,4 @@ var WebSocketConnection = class extends Connection {
|
|
|
57
57
|
export {
|
|
58
58
|
WebSocketConnection
|
|
59
59
|
};
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
60
|
+
//# sourceMappingURL=chunk-5T2KKCF7.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ProtocolError,
|
|
3
3
|
Transport
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VFIFB24N.js";
|
|
5
5
|
import {
|
|
6
6
|
ClientSessionStateGraph,
|
|
7
7
|
defaultClientTransportOptions
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RNVY6YNO.js";
|
|
9
9
|
import {
|
|
10
10
|
ControlMessageHandshakeResponseSchema,
|
|
11
11
|
HandshakeErrorRetriableResponseCodes,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
getPropagationContext,
|
|
15
15
|
handshakeRequestMessage,
|
|
16
16
|
tracing_default
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-3TABKMH3.js";
|
|
18
18
|
|
|
19
19
|
// transport/client.ts
|
|
20
20
|
import { SpanStatusCode } from "@opentelemetry/api";
|
|
@@ -434,4 +434,4 @@ var ClientTransport = class extends Transport {
|
|
|
434
434
|
export {
|
|
435
435
|
ClientTransport
|
|
436
436
|
};
|
|
437
|
-
//# sourceMappingURL=chunk-
|
|
437
|
+
//# sourceMappingURL=chunk-INUAOMRY.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ProtocolError,
|
|
3
3
|
Transport
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VFIFB24N.js";
|
|
5
5
|
import {
|
|
6
6
|
ServerSessionStateGraph,
|
|
7
7
|
defaultServerTransportOptions
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RNVY6YNO.js";
|
|
9
9
|
import {
|
|
10
10
|
ControlMessageHandshakeRequestSchema,
|
|
11
11
|
HandshakeErrorCustomHandlerFatalResponseCodes,
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
coerceErrorString,
|
|
14
14
|
currentProtocolVersion,
|
|
15
15
|
handshakeResponseMessage
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-3TABKMH3.js";
|
|
17
17
|
|
|
18
18
|
// transport/server.ts
|
|
19
19
|
import { SpanStatusCode } from "@opentelemetry/api";
|
|
@@ -388,4 +388,4 @@ var ServerTransport = class extends Transport {
|
|
|
388
388
|
export {
|
|
389
389
|
ServerTransport
|
|
390
390
|
};
|
|
391
|
-
//# sourceMappingURL=chunk-
|
|
391
|
+
//# sourceMappingURL=chunk-L6IIRKIH.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
createSessionTelemetryInfo,
|
|
4
4
|
generateId,
|
|
5
5
|
isAck
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-3TABKMH3.js";
|
|
7
7
|
import {
|
|
8
8
|
NaiveJsonCodec
|
|
9
9
|
} from "./chunk-4PVU7J25.js";
|
|
@@ -857,4 +857,4 @@ export {
|
|
|
857
857
|
ClientSessionStateGraph,
|
|
858
858
|
ServerSessionStateGraph
|
|
859
859
|
};
|
|
860
|
-
//# sourceMappingURL=chunk-
|
|
860
|
+
//# sourceMappingURL=chunk-RNVY6YNO.js.map
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
SessionStateGraph,
|
|
7
7
|
defaultTransportOptions
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RNVY6YNO.js";
|
|
9
9
|
import {
|
|
10
10
|
generateId
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-3TABKMH3.js";
|
|
12
12
|
|
|
13
13
|
// transport/events.ts
|
|
14
14
|
var ProtocolError = {
|
|
@@ -280,4 +280,4 @@ export {
|
|
|
280
280
|
Transport,
|
|
281
281
|
Connection
|
|
282
282
|
};
|
|
283
|
-
//# sourceMappingURL=chunk-
|
|
283
|
+
//# sourceMappingURL=chunk-VFIFB24N.js.map
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
// router/procedures.ts
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
var UNCAUGHT_ERROR_CODE = "UNCAUGHT_ERROR";
|
|
4
|
+
var UNEXPECTED_DISCONNECT_CODE = "UNEXPECTED_DISCONNECT";
|
|
5
|
+
var INVALID_REQUEST_CODE = "INVALID_REQUEST";
|
|
6
|
+
var CANCEL_CODE = "CANCEL";
|
|
7
|
+
var ReaderErrorSchema = Type.Object({
|
|
8
|
+
code: Type.Union([
|
|
9
|
+
Type.Literal(UNCAUGHT_ERROR_CODE),
|
|
10
|
+
Type.Literal(UNEXPECTED_DISCONNECT_CODE),
|
|
11
|
+
Type.Literal(INVALID_REQUEST_CODE),
|
|
12
|
+
Type.Literal(CANCEL_CODE)
|
|
13
|
+
]),
|
|
14
|
+
message: Type.String()
|
|
15
|
+
});
|
|
16
|
+
function rpc({
|
|
17
|
+
requestInit,
|
|
18
|
+
responseData,
|
|
19
|
+
responseError = Type.Never(),
|
|
20
|
+
description,
|
|
21
|
+
handler
|
|
22
|
+
}) {
|
|
23
|
+
return {
|
|
24
|
+
...description ? { description } : {},
|
|
25
|
+
type: "rpc",
|
|
26
|
+
requestInit,
|
|
27
|
+
responseData,
|
|
28
|
+
responseError,
|
|
29
|
+
handler
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function upload({
|
|
33
|
+
requestInit,
|
|
34
|
+
requestData,
|
|
35
|
+
responseData,
|
|
36
|
+
responseError = Type.Never(),
|
|
37
|
+
description,
|
|
38
|
+
handler
|
|
39
|
+
}) {
|
|
40
|
+
return {
|
|
41
|
+
type: "upload",
|
|
42
|
+
...description ? { description } : {},
|
|
43
|
+
requestInit,
|
|
44
|
+
requestData,
|
|
45
|
+
responseData,
|
|
46
|
+
responseError,
|
|
47
|
+
handler
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function subscription({
|
|
51
|
+
requestInit,
|
|
52
|
+
responseData,
|
|
53
|
+
responseError = Type.Never(),
|
|
54
|
+
description,
|
|
55
|
+
handler
|
|
56
|
+
}) {
|
|
57
|
+
return {
|
|
58
|
+
type: "subscription",
|
|
59
|
+
...description ? { description } : {},
|
|
60
|
+
requestInit,
|
|
61
|
+
responseData,
|
|
62
|
+
responseError,
|
|
63
|
+
handler
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function stream({
|
|
67
|
+
requestInit,
|
|
68
|
+
requestData,
|
|
69
|
+
responseData,
|
|
70
|
+
responseError = Type.Never(),
|
|
71
|
+
description,
|
|
72
|
+
handler
|
|
73
|
+
}) {
|
|
74
|
+
return {
|
|
75
|
+
type: "stream",
|
|
76
|
+
...description ? { description } : {},
|
|
77
|
+
requestInit,
|
|
78
|
+
requestData,
|
|
79
|
+
responseData,
|
|
80
|
+
responseError,
|
|
81
|
+
handler
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
var Procedure = {
|
|
85
|
+
rpc,
|
|
86
|
+
upload,
|
|
87
|
+
subscription,
|
|
88
|
+
stream
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// router/result.ts
|
|
92
|
+
import {
|
|
93
|
+
Type as Type2
|
|
94
|
+
} from "@sinclair/typebox";
|
|
95
|
+
var ErrResultSchema = (t) => Type2.Object({
|
|
96
|
+
ok: Type2.Literal(false),
|
|
97
|
+
payload: t
|
|
98
|
+
});
|
|
99
|
+
var AnyResultSchema = Type2.Union([
|
|
100
|
+
Type2.Object({
|
|
101
|
+
ok: Type2.Literal(false),
|
|
102
|
+
payload: Type2.Object({
|
|
103
|
+
code: Type2.String(),
|
|
104
|
+
message: Type2.String(),
|
|
105
|
+
extras: Type2.Optional(Type2.Unknown())
|
|
106
|
+
})
|
|
107
|
+
}),
|
|
108
|
+
Type2.Object({
|
|
109
|
+
ok: Type2.Literal(true),
|
|
110
|
+
payload: Type2.Unknown()
|
|
111
|
+
})
|
|
112
|
+
]);
|
|
113
|
+
function Ok(payload) {
|
|
114
|
+
return {
|
|
115
|
+
ok: true,
|
|
116
|
+
payload
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function Err(error) {
|
|
120
|
+
return {
|
|
121
|
+
ok: false,
|
|
122
|
+
payload: error
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// router/streams.ts
|
|
127
|
+
var ReadableBrokenError = {
|
|
128
|
+
code: "READABLE_BROKEN",
|
|
129
|
+
message: "Readable was broken before it is fully consumed"
|
|
130
|
+
};
|
|
131
|
+
function createPromiseWithResolvers() {
|
|
132
|
+
let resolve;
|
|
133
|
+
let reject;
|
|
134
|
+
const promise = new Promise((res, rej) => {
|
|
135
|
+
resolve = res;
|
|
136
|
+
reject = rej;
|
|
137
|
+
});
|
|
138
|
+
return {
|
|
139
|
+
promise,
|
|
140
|
+
// @ts-expect-error promise callbacks are sync
|
|
141
|
+
resolve,
|
|
142
|
+
// @ts-expect-error promise callbacks are sync
|
|
143
|
+
reject
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
var ReadableImpl = class {
|
|
147
|
+
/**
|
|
148
|
+
* Whether the {@link Readable} is closed.
|
|
149
|
+
*
|
|
150
|
+
* Closed {@link Readable}s are done receiving values, but that doesn't affect
|
|
151
|
+
* any other aspect of the {@link Readable} such as it's consumability.
|
|
152
|
+
*/
|
|
153
|
+
closed = false;
|
|
154
|
+
/**
|
|
155
|
+
* Whether the {@link Readable} is locked.
|
|
156
|
+
*
|
|
157
|
+
* @see {@link Readable}'s typedoc to understand locking
|
|
158
|
+
*/
|
|
159
|
+
locked = false;
|
|
160
|
+
/**
|
|
161
|
+
* Whether {@link break} was called.
|
|
162
|
+
*
|
|
163
|
+
* @see {@link break} for more information
|
|
164
|
+
*/
|
|
165
|
+
broken = false;
|
|
166
|
+
/**
|
|
167
|
+
* This flag allows us to avoid emitting a {@link ReadableBrokenError} after {@link break} was called
|
|
168
|
+
* in cases where the {@link queue} is fully consumed and {@link ReadableImpl} is {@link closed}. This is just an
|
|
169
|
+
* ergonomic feature to avoid emitting an error in our iteration when we don't have to.
|
|
170
|
+
*/
|
|
171
|
+
brokenWithValuesLeftToRead = false;
|
|
172
|
+
/**
|
|
173
|
+
* A list of values that have been pushed to the {@link ReadableImpl} but not yet emitted to the user.
|
|
174
|
+
*/
|
|
175
|
+
queue = [];
|
|
176
|
+
/**
|
|
177
|
+
* Used by methods in the class to signal to the iterator that it
|
|
178
|
+
* should check for the next value.
|
|
179
|
+
*/
|
|
180
|
+
next = null;
|
|
181
|
+
[Symbol.asyncIterator]() {
|
|
182
|
+
if (this.locked) {
|
|
183
|
+
throw new TypeError("Readable is already locked");
|
|
184
|
+
}
|
|
185
|
+
this.locked = true;
|
|
186
|
+
let didSignalBreak = false;
|
|
187
|
+
return {
|
|
188
|
+
next: async () => {
|
|
189
|
+
if (didSignalBreak) {
|
|
190
|
+
return {
|
|
191
|
+
done: true,
|
|
192
|
+
value: void 0
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
while (this.queue.length === 0) {
|
|
196
|
+
if (this.closed && !this.brokenWithValuesLeftToRead) {
|
|
197
|
+
return {
|
|
198
|
+
done: true,
|
|
199
|
+
value: void 0
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (this.broken) {
|
|
203
|
+
didSignalBreak = true;
|
|
204
|
+
return {
|
|
205
|
+
done: false,
|
|
206
|
+
value: Err(ReadableBrokenError)
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
if (!this.next) {
|
|
210
|
+
this.next = createPromiseWithResolvers();
|
|
211
|
+
}
|
|
212
|
+
await this.next.promise;
|
|
213
|
+
this.next = null;
|
|
214
|
+
}
|
|
215
|
+
const value = this.queue.shift();
|
|
216
|
+
return { done: false, value };
|
|
217
|
+
},
|
|
218
|
+
return: () => {
|
|
219
|
+
this.break();
|
|
220
|
+
return { done: true, value: void 0 };
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
async collect() {
|
|
225
|
+
const array = [];
|
|
226
|
+
for await (const value of this) {
|
|
227
|
+
array.push(value);
|
|
228
|
+
}
|
|
229
|
+
return array;
|
|
230
|
+
}
|
|
231
|
+
break() {
|
|
232
|
+
if (this.broken) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
this.locked = true;
|
|
236
|
+
this.broken = true;
|
|
237
|
+
this.brokenWithValuesLeftToRead = this.queue.length > 0;
|
|
238
|
+
this.queue.length = 0;
|
|
239
|
+
this.next?.resolve();
|
|
240
|
+
}
|
|
241
|
+
isReadable() {
|
|
242
|
+
return !this.locked && !this.broken;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* @internal meant for use within river, not exposed as a public API
|
|
246
|
+
*
|
|
247
|
+
* Pushes a value to be read.
|
|
248
|
+
*/
|
|
249
|
+
_pushValue(value) {
|
|
250
|
+
if (this.broken) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (this.closed) {
|
|
254
|
+
throw new Error("Cannot push to closed Readable");
|
|
255
|
+
}
|
|
256
|
+
this.queue.push(value);
|
|
257
|
+
this.next?.resolve();
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* @internal meant for use within river, not exposed as a public API
|
|
261
|
+
*
|
|
262
|
+
* Triggers the close of the {@link Readable}. Make sure to push all remaining
|
|
263
|
+
* values before calling this method.
|
|
264
|
+
*/
|
|
265
|
+
_triggerClose() {
|
|
266
|
+
if (this.closed) {
|
|
267
|
+
throw new Error("Unexpected closing multiple times");
|
|
268
|
+
}
|
|
269
|
+
this.closed = true;
|
|
270
|
+
this.next?.resolve();
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* @internal meant for use within river, not exposed as a public API
|
|
274
|
+
*/
|
|
275
|
+
_hasValuesInQueue() {
|
|
276
|
+
return this.queue.length > 0;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* @internal meant for use within river, not exposed as a public API
|
|
280
|
+
*/
|
|
281
|
+
isClosed() {
|
|
282
|
+
return this.closed;
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
var WritableImpl = class {
|
|
286
|
+
/**
|
|
287
|
+
* Passed via constructor to pass on calls to {@link write}
|
|
288
|
+
*/
|
|
289
|
+
writeCb;
|
|
290
|
+
/**
|
|
291
|
+
* Passed via constructor to pass on calls to {@link close}
|
|
292
|
+
*/
|
|
293
|
+
closeCb;
|
|
294
|
+
/**
|
|
295
|
+
* Whether {@link close} was called, and {@link Writable} is not writable anymore.
|
|
296
|
+
*/
|
|
297
|
+
closed = false;
|
|
298
|
+
constructor(writeCb, closeCb) {
|
|
299
|
+
this.writeCb = writeCb;
|
|
300
|
+
this.closeCb = closeCb;
|
|
301
|
+
}
|
|
302
|
+
write(value) {
|
|
303
|
+
if (this.closed) {
|
|
304
|
+
throw new Error("Cannot write to closed Writable");
|
|
305
|
+
}
|
|
306
|
+
this.writeCb(value);
|
|
307
|
+
}
|
|
308
|
+
isWritable() {
|
|
309
|
+
return !this.closed;
|
|
310
|
+
}
|
|
311
|
+
close() {
|
|
312
|
+
if (this.closed) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
this.closed = true;
|
|
316
|
+
this.writeCb = () => void 0;
|
|
317
|
+
this.closeCb();
|
|
318
|
+
this.closeCb = () => void 0;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* @internal meant for use within river, not exposed as a public API
|
|
322
|
+
*/
|
|
323
|
+
isClosed() {
|
|
324
|
+
return this.closed;
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
export {
|
|
329
|
+
UNCAUGHT_ERROR_CODE,
|
|
330
|
+
UNEXPECTED_DISCONNECT_CODE,
|
|
331
|
+
INVALID_REQUEST_CODE,
|
|
332
|
+
CANCEL_CODE,
|
|
333
|
+
ReaderErrorSchema,
|
|
334
|
+
Procedure,
|
|
335
|
+
ErrResultSchema,
|
|
336
|
+
AnyResultSchema,
|
|
337
|
+
Ok,
|
|
338
|
+
Err,
|
|
339
|
+
ReadableImpl,
|
|
340
|
+
WritableImpl
|
|
341
|
+
};
|
|
342
|
+
//# sourceMappingURL=chunk-VH6UPCRA.js.map
|