@replit/river 0.200.0-rc.13 → 0.200.0-rc.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-MTCAW5XM.js → chunk-7URZZXRT.js} +14 -4
- package/dist/chunk-7URZZXRT.js.map +1 -0
- package/dist/{chunk-MQ6ANR3H.js → chunk-A2MGUPER.js} +1 -1
- package/dist/chunk-A2MGUPER.js.map +1 -0
- package/dist/{chunk-YBPTJPU5.js → chunk-BAGOAJ3K.js} +1 -1
- package/dist/chunk-BAGOAJ3K.js.map +1 -0
- package/dist/{chunk-JEAAPPOD.js → chunk-DDAGE6MV.js} +4 -4
- package/dist/{chunk-2PUERXLT.js → chunk-DH7WAJZM.js} +4 -4
- package/dist/{chunk-TTIA2KT2.js → chunk-J274XPWD.js} +2 -2
- package/dist/{chunk-K34VQODM.js → chunk-LYIHSVPM.js} +4 -4
- package/dist/{chunk-4CRFHK3A.js → chunk-SKB2I27D.js} +2 -2
- package/dist/{chunk-4CRFHK3A.js.map → chunk-SKB2I27D.js.map} +1 -1
- package/dist/{client-ebba28e8.d.ts → client-86d14d9b.d.ts} +2 -2
- package/dist/connection-306ef0cc.d.ts +32 -0
- package/dist/{context-b3f0eb0e.d.ts → context-00e2b444.d.ts} +3 -1
- package/dist/logging/index.cjs.map +1 -1
- package/dist/logging/index.d.cts +1 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.js +1 -1
- package/dist/{message-34667c7a.d.ts → message-59fe53e1.d.ts} +1 -0
- package/dist/router/index.cjs +1 -1
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +8 -8
- package/dist/router/index.d.ts +8 -8
- package/dist/router/index.js +2 -2
- package/dist/{server-aadb7ad2.d.ts → server-561859e2.d.ts} +3 -2
- package/dist/{services-5f5157e0.d.ts → services-b0927cc0.d.ts} +7 -4
- package/dist/transport/impls/ws/client.cjs +13 -3
- package/dist/transport/impls/ws/client.cjs.map +1 -1
- package/dist/transport/impls/ws/client.d.cts +4 -4
- package/dist/transport/impls/ws/client.d.ts +4 -4
- package/dist/transport/impls/ws/client.js +6 -6
- package/dist/transport/impls/ws/server.cjs +27 -5
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +6 -5
- package/dist/transport/impls/ws/server.d.ts +6 -5
- package/dist/transport/impls/ws/server.js +20 -8
- package/dist/transport/impls/ws/server.js.map +1 -1
- package/dist/transport/index.cjs +1 -1
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +4 -4
- package/dist/transport/index.d.ts +4 -4
- package/dist/transport/index.js +6 -6
- package/dist/util/testHelpers.cjs +1 -1
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +4 -4
- package/dist/util/testHelpers.d.ts +4 -4
- package/dist/util/testHelpers.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-MQ6ANR3H.js.map +0 -1
- package/dist/chunk-MTCAW5XM.js.map +0 -1
- package/dist/chunk-YBPTJPU5.js.map +0 -1
- package/dist/connection-00103cbc.d.ts +0 -11
- /package/dist/{chunk-JEAAPPOD.js.map → chunk-DDAGE6MV.js.map} +0 -0
- /package/dist/{chunk-2PUERXLT.js.map → chunk-DH7WAJZM.js.map} +0 -0
- /package/dist/{chunk-TTIA2KT2.js.map → chunk-J274XPWD.js.map} +0 -0
- /package/dist/{chunk-K34VQODM.js.map → chunk-LYIHSVPM.js.map} +0 -0
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Connection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-LYIHSVPM.js";
|
|
4
4
|
|
|
5
5
|
// transport/impls/ws/connection.ts
|
|
6
|
+
var WS_HEALTHY_CLOSE_CODE = 1e3;
|
|
6
7
|
var WebSocketConnection = class extends Connection {
|
|
7
8
|
ws;
|
|
8
|
-
|
|
9
|
+
extras;
|
|
10
|
+
get loggingMetadata() {
|
|
11
|
+
const metadata = super.loggingMetadata;
|
|
12
|
+
if (this.extras) {
|
|
13
|
+
metadata.extras = this.extras;
|
|
14
|
+
}
|
|
15
|
+
return metadata;
|
|
16
|
+
}
|
|
17
|
+
constructor(ws, extras) {
|
|
9
18
|
super();
|
|
10
19
|
this.ws = ws;
|
|
20
|
+
this.extras = extras;
|
|
11
21
|
this.ws.binaryType = "arraybuffer";
|
|
12
22
|
let didError = false;
|
|
13
23
|
this.ws.onerror = () => {
|
|
@@ -40,11 +50,11 @@ var WebSocketConnection = class extends Connection {
|
|
|
40
50
|
return true;
|
|
41
51
|
}
|
|
42
52
|
close() {
|
|
43
|
-
this.ws.close();
|
|
53
|
+
this.ws.close(WS_HEALTHY_CLOSE_CODE);
|
|
44
54
|
}
|
|
45
55
|
};
|
|
46
56
|
|
|
47
57
|
export {
|
|
48
58
|
WebSocketConnection
|
|
49
59
|
};
|
|
50
|
-
//# sourceMappingURL=chunk-
|
|
60
|
+
//# sourceMappingURL=chunk-7URZZXRT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../transport/impls/ws/connection.ts"],"sourcesContent":["import { Connection } from '../../connection';\nimport { WsLike } from './wslike';\n\ninterface ConnectionInfoExtras {\n headers: Record<string, string>;\n}\n\nconst WS_HEALTHY_CLOSE_CODE = 1000;\n\nexport class WebSocketConnection extends Connection {\n ws: WsLike;\n extras?: ConnectionInfoExtras;\n\n get loggingMetadata() {\n const metadata = super.loggingMetadata;\n if (this.extras) {\n metadata.extras = this.extras;\n }\n\n return metadata;\n }\n\n constructor(ws: WsLike, extras?: ConnectionInfoExtras) {\n super();\n this.ws = ws;\n this.extras = extras;\n this.ws.binaryType = 'arraybuffer';\n\n // Websockets are kinda shitty, they emit error events with no\n // information other than it errored, so we have to do some extra\n // work to figure out what happened.\n let didError = false;\n this.ws.onerror = () => {\n didError = true;\n };\n\n this.ws.onclose = ({ code, reason }) => {\n if (didError) {\n const err = new Error(\n `websocket closed with code and reason: ${code} - ${reason}`,\n );\n\n for (const cb of this.errorListeners) {\n cb(err);\n }\n }\n\n for (const cb of this.closeListeners) {\n cb();\n }\n };\n\n this.ws.onmessage = (msg) => {\n for (const cb of this.dataListeners) {\n cb(msg.data as Uint8Array);\n }\n };\n }\n\n send(payload: Uint8Array) {\n if (this.ws.readyState !== this.ws.OPEN) {\n return false;\n }\n\n this.ws.send(payload);\n return true;\n }\n\n close() {\n // we close with 1000 normal even if its not really healthy at the river level\n // if we don't specify this, it defaults to 1005 which\n // some proxies/loggers detect as an error\n this.ws.close(WS_HEALTHY_CLOSE_CODE);\n }\n}\n"],"mappings":";;;;;AAOA,IAAM,wBAAwB;AAEvB,IAAM,sBAAN,cAAkC,WAAW;AAAA,EAClD;AAAA,EACA;AAAA,EAEA,IAAI,kBAAkB;AACpB,UAAM,WAAW,MAAM;AACvB,QAAI,KAAK,QAAQ;AACf,eAAS,SAAS,KAAK;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,IAAY,QAA+B;AACrD,UAAM;AACN,SAAK,KAAK;AACV,SAAK,SAAS;AACd,SAAK,GAAG,aAAa;AAKrB,QAAI,WAAW;AACf,SAAK,GAAG,UAAU,MAAM;AACtB,iBAAW;AAAA,IACb;AAEA,SAAK,GAAG,UAAU,CAAC,EAAE,MAAM,OAAO,MAAM;AACtC,UAAI,UAAU;AACZ,cAAM,MAAM,IAAI;AAAA,UACd,0CAA0C,IAAI,MAAM,MAAM;AAAA,QAC5D;AAEA,mBAAW,MAAM,KAAK,gBAAgB;AACpC,aAAG,GAAG;AAAA,QACR;AAAA,MACF;AAEA,iBAAW,MAAM,KAAK,gBAAgB;AACpC,WAAG;AAAA,MACL;AAAA,IACF;AAEA,SAAK,GAAG,YAAY,CAAC,QAAQ;AAC3B,iBAAW,MAAM,KAAK,eAAe;AACnC,WAAG,IAAI,IAAkB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAK,SAAqB;AACxB,QAAI,KAAK,GAAG,eAAe,KAAK,GAAG,MAAM;AACvC,aAAO;AAAA,IACT;AAEA,SAAK,GAAG,KAAK,OAAO;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AAIN,SAAK,GAAG,MAAM,qBAAqB;AAAA,EACrC;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../router/procedures.ts","../router/result.ts","../router/streams.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */\nimport { Static, TNever, TSchema, TUnion, Type } from '@sinclair/typebox';\nimport { ProcedureHandlerContext } from './context';\nimport { BaseErrorSchemaType, Result } from './result';\nimport { ReadStream, WriteStream } from './streams';\n\n/**\n * Brands a type to prevent it from being directly constructed.\n */\nexport type Branded<T> = T & { readonly __BRAND_DO_NOT_USE: unique symbol };\n\n/**\n * Unbrands a {@link Branded} type.\n */\nexport type Unbranded<T> = T extends Branded<infer U> ? U : never;\n\n/**\n * The valid {@link Procedure} types. The `stream` and `upload` types can optionally have a\n * different type for the very first initialization message. The suffixless types correspond to\n * gRPC's four combinations of stream / non-stream in each direction.\n */\nexport type ValidProcType =\n // Single message in both directions (1:1).\n | 'rpc'\n // Client-stream single message from server (n:1).\n | 'upload'\n // Single message from client, stream from server (1:n).\n | 'subscription'\n // Bidirectional stream (n:n).\n | 'stream';\n\n/**\n * Represents the payload type for {@link Procedure}s.\n */\nexport type PayloadType = TSchema;\n\n/**\n * INTERNAL_RIVER_ERROR_CODE is the code that is used when an internal error occurs,\n * this means that some invariants expected by the river server implementation have\n * been violated. When encountering this error please report this to river maintainers.\n */\nexport const INTERNAL_RIVER_ERROR_CODE = 'INTERNAL_RIVER_ERROR' as const;\n/**\n * UNCAUGHT_ERROR_CODE is the code that is used when an error is thrown\n * inside a procedure handler that's not required.\n */\nexport const UNCAUGHT_ERROR_CODE = 'UNCAUGHT_ERROR' as const;\n/**\n * UNEXPECTED_DISCONNECT_CODE is the code used the stream's session\n * disconnect unexpetedly.\n */\nexport const UNEXPECTED_DISCONNECT_CODE = 'UNEXPECTED_DISCONNECT' as const;\n/**\n * INVALID_REQUEST_CODE is the code used when a client's request is invalid.\n */\nexport const INVALID_REQUEST_CODE = 'INVALID_REQUEST' as const;\n/**\n * ABORT_CODE is the code used when either server or client aborts the stream.\n */\nexport const ABORT_CODE = 'ABORT' as const;\n\n/**\n * ResponseReaderErrorSchema is the schema for all the errors that can be\n * emitted in the ResponseData ReadStream on the client.\n */\nexport const ResponseReaderErrorSchema = Type.Object({\n code: Type.Union([\n Type.Literal(INTERNAL_RIVER_ERROR_CODE),\n Type.Literal(UNCAUGHT_ERROR_CODE),\n Type.Literal(UNEXPECTED_DISCONNECT_CODE),\n Type.Literal(INVALID_REQUEST_CODE),\n Type.Literal(ABORT_CODE),\n ]),\n message: Type.String(),\n});\n\n/**\n * RequestReaderErrorSchema is the schema for all the errors that can be\n * emitted in the RequestData ReadStream on the server.\n */\nexport const RequestReaderErrorSchema = Type.Object({\n code: Type.Union([\n Type.Literal(UNCAUGHT_ERROR_CODE),\n Type.Literal(UNEXPECTED_DISCONNECT_CODE),\n Type.Literal(INVALID_REQUEST_CODE),\n Type.Literal(ABORT_CODE),\n ]),\n message: Type.String(),\n});\n\n// Allow specific levels of nesting, otherwise typescript shits itself due to recursion\ntype ProcedureErrorUnionSchema0 = TUnion<Array<BaseErrorSchemaType>>;\ntype ProcedureErrorUnionSchema1 = TUnion<\n Array<ProcedureErrorUnionSchema0 | BaseErrorSchemaType>\n>;\ntype ProcedureErrorUnionSchema2 = TUnion<\n Array<\n | ProcedureErrorUnionSchema1\n | ProcedureErrorUnionSchema0\n | BaseErrorSchemaType\n >\n>;\n\n/**\n * Represents an acceptable schema to pass to a procedure.\n * Just a type of a schema, not an actual schema.\n */\nexport type ProcedureErrorSchemaType =\n | ProcedureErrorUnionSchema2\n | BaseErrorSchemaType\n | TNever;\n\n/**\n * Procedure for a single message in both directions (1:1).\n *\n * @template State - The context state object.\n * @template RequestInit - The TypeBox schema of the initialization object.\n * @template ResponseData - The TypeBox schema of the output object.\n * @template ResponseErr - The TypeBox schema of the error object.\n */\nexport interface RpcProcedure<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n> {\n type: 'rpc';\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler({\n ctx,\n reqInit,\n }: {\n ctx: ProcedureHandlerContext<State>;\n reqInit: Static<RequestInit>;\n }): Promise<Result<Static<ResponseData>, Static<ResponseErr>>>;\n}\n\n/**\n * Procedure for a client-stream (potentially preceded by an initialization message),\n * single message from server (n:1).\n *\n * @template State - The context state object.\n * @template RequestInit - The TypeBox schema of the initialization object.\n * @template RequestData - The TypeBox schema of the input object.\n * @template ResponseData - The TypeBox schema of the output object.\n * @template ResponseErr - The TypeBox schema of the error object.\n */\nexport interface UploadProcedure<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n> {\n type: 'upload';\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler({\n ctx,\n reqInit,\n reqReader,\n }: {\n ctx: ProcedureHandlerContext<State>;\n reqInit: Static<RequestInit>;\n reqReader: ReadStream<\n Static<RequestData>,\n Static<typeof RequestReaderErrorSchema>\n >;\n }): Promise<Result<Static<ResponseData>, Static<ResponseErr>>>;\n}\n\n/**\n * Procedure for a single message from client, stream from server (1:n).\n *\n * @template State - The context state object.\n * @template RequestInit - The TypeBox schema of the initialization object.\n * @template ResponseData - The TypeBox schema of the output object.\n * @template ResponseErr - The TypeBox schema of the error object.\n */\nexport interface SubscriptionProcedure<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n> {\n type: 'subscription';\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler({\n ctx,\n reqInit,\n resWriter,\n }: {\n ctx: ProcedureHandlerContext<State>;\n reqInit: Static<RequestInit>;\n resWriter: WriteStream<Result<Static<ResponseData>, Static<ResponseErr>>>;\n }): Promise<void | undefined>;\n}\n\n/**\n * Procedure for a bidirectional stream (potentially preceded by an initialization message),\n * (n:n).\n *\n * @template State - The context state object.\n * @template RequestInit - The TypeBox schema of the initialization object.\n * @template RequestData - The TypeBox schema of the input object.\n * @template ResponseData - The TypeBox schema of the output object.\n * @template ResponseErr - The TypeBox schema of the error object.\n */\nexport interface StreamProcedure<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n> {\n type: 'stream';\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler({\n ctx,\n reqInit,\n reqReader,\n resWriter,\n }: {\n ctx: ProcedureHandlerContext<State>;\n reqInit: Static<RequestInit>;\n reqReader: ReadStream<\n Static<RequestData>,\n Static<typeof RequestReaderErrorSchema>\n >;\n resWriter: WriteStream<Result<Static<ResponseData>, Static<ResponseErr>>>;\n }): Promise<void | undefined>;\n}\n\n/**\n * Defines a Procedure type that can be a:\n * - {@link RpcProcedure} for a single message in both directions (1:1)\n * - {@link UploadProcedure} for a client-stream (potentially preceded by an\n * initialization message)\n * - {@link SubscriptionProcedure} for a single message from client, stream from server (1:n)\n * - {@link StreamProcedure} for a bidirectional stream (potentially preceded by an\n * initialization message)\n *\n * @template State - The TypeBox schema of the state object.\n * @template Ty - The type of the procedure.\n * @template RequestData - The TypeBox schema of the input object.\n * @template RequestInit - The TypeBox schema of the input initialization object, if any.\n * @template ResponseData - The TypeBox schema of the output object.\n */\nexport type Procedure<\n State,\n Ty extends ValidProcType,\n RequestInit extends PayloadType,\n RequestData extends PayloadType | null,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n> = { type: Ty } & (RequestData extends PayloadType\n ? Ty extends 'upload'\n ? UploadProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n ResponseErr\n >\n : Ty extends 'stream'\n ? StreamProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n ResponseErr\n >\n : never\n : Ty extends 'rpc'\n ? RpcProcedure<State, RequestInit, ResponseData, ResponseErr>\n : Ty extends 'subscription'\n ? SubscriptionProcedure<State, RequestInit, ResponseData, ResponseErr>\n : never);\n\n/**\n * Represents any {@link Procedure} type.\n *\n * @template State - The context state object. You can provide this to constrain\n * the type of procedures.\n */\nexport type AnyProcedure<State = object> = Procedure<\n State,\n ValidProcType,\n PayloadType,\n PayloadType | null,\n PayloadType,\n ProcedureErrorSchemaType\n>;\n\n/**\n * Represents a map of {@link Procedure}s.\n *\n * @template State - The context state object. You can provide this to constrain\n * the type of procedures.\n */\nexport type ProcedureMap<State = object> = Record<string, AnyProcedure<State>>;\n\n// typescript is funky so with these upcoming procedure constructors, the overloads\n// which handle the `init` case _must_ come first, otherwise the `init` property\n// is not recognized as optional, for some reason\n\n/**\n * Creates an {@link RpcProcedure}.\n */\n// signature: default errors\nfunction rpc<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n>(def: {\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError?: never;\n description?: string;\n handler: RpcProcedure<State, RequestInit, ResponseData, TNever>['handler'];\n}): Branded<RpcProcedure<State, RequestInit, ResponseData, TNever>>;\n\n// signature: explicit errors\nfunction rpc<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n>(def: {\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler: RpcProcedure<\n State,\n RequestInit,\n ResponseData,\n ResponseErr\n >['handler'];\n}): Branded<RpcProcedure<State, RequestInit, ResponseData, ResponseErr>>;\n\n// implementation\nfunction rpc({\n requestInit,\n responseData,\n responseError = Type.Never(),\n description,\n handler,\n}: {\n requestInit: PayloadType;\n responseData: PayloadType;\n responseError?: ProcedureErrorSchemaType;\n description?: string;\n handler: RpcProcedure<\n object,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n ...(description ? { description } : {}),\n type: 'rpc',\n requestInit,\n responseData,\n responseError,\n handler,\n };\n}\n\n/**\n * Creates an {@link UploadProcedure}, optionally with an initialization message.\n */\n// signature: init with default errors\nfunction upload<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n>(def: {\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError?: never;\n description?: string;\n handler: UploadProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n TNever\n >['handler'];\n}): Branded<\n UploadProcedure<State, RequestInit, RequestData, ResponseData, TNever>\n>;\n\n// signature: init with explicit errors\nfunction upload<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n>(def: {\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler: UploadProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n ResponseErr\n >['handler'];\n}): Branded<\n UploadProcedure<State, RequestInit, RequestData, ResponseData, ResponseErr>\n>;\n\n// implementation\nfunction upload({\n requestInit,\n requestData,\n responseData,\n responseError = Type.Never(),\n description,\n handler,\n}: {\n requestInit: PayloadType;\n requestData: PayloadType;\n responseData: PayloadType;\n responseError?: ProcedureErrorSchemaType;\n description?: string;\n handler: UploadProcedure<\n object,\n PayloadType,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n type: 'upload',\n ...(description ? { description } : {}),\n requestInit,\n requestData,\n responseData,\n responseError,\n handler,\n };\n}\n\n/**\n * Creates a {@link SubscriptionProcedure}.\n */\n// signature: default errors\nfunction subscription<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n>(def: {\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError?: never;\n description?: string;\n handler: SubscriptionProcedure<\n State,\n RequestInit,\n ResponseData,\n TNever\n >['handler'];\n}): Branded<SubscriptionProcedure<State, RequestInit, ResponseData, TNever>>;\n\n// signature: explicit errors\nfunction subscription<\n State,\n RequestInit extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n>(def: {\n requestInit: RequestInit;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler: SubscriptionProcedure<\n State,\n RequestInit,\n ResponseData,\n ResponseErr\n >['handler'];\n}): Branded<\n SubscriptionProcedure<State, RequestInit, ResponseData, ResponseErr>\n>;\n\n// implementation\nfunction subscription({\n requestInit,\n responseData,\n responseError = Type.Never(),\n description,\n handler,\n}: {\n requestInit: PayloadType;\n responseData: PayloadType;\n responseError?: ProcedureErrorSchemaType;\n description?: string;\n handler: SubscriptionProcedure<\n object,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n type: 'subscription',\n ...(description ? { description } : {}),\n requestInit,\n responseData,\n responseError,\n handler,\n };\n}\n\n/**\n * Creates a {@link StreamProcedure}, optionally with an initialization message.\n */\n// signature: with default errors\nfunction stream<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n>(def: {\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError?: never;\n description?: string;\n handler: StreamProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n TNever\n >['handler'];\n}): Branded<\n StreamProcedure<State, RequestInit, RequestData, ResponseData, TNever>\n>;\n\n// signature: explicit errors\nfunction stream<\n State,\n RequestInit extends PayloadType,\n RequestData extends PayloadType,\n ResponseData extends PayloadType,\n ResponseErr extends ProcedureErrorSchemaType,\n>(def: {\n requestInit: RequestInit;\n requestData: RequestData;\n responseData: ResponseData;\n responseError: ResponseErr;\n description?: string;\n handler: StreamProcedure<\n State,\n RequestInit,\n RequestData,\n ResponseData,\n ResponseErr\n >['handler'];\n}): Branded<\n StreamProcedure<State, RequestInit, RequestData, ResponseData, ResponseErr>\n>;\n\n// implementation\nfunction stream({\n requestInit,\n requestData,\n responseData,\n responseError = Type.Never(),\n description,\n handler,\n}: {\n requestInit: PayloadType;\n requestData: PayloadType;\n responseData: PayloadType;\n responseError?: ProcedureErrorSchemaType;\n description?: string;\n handler: StreamProcedure<\n object,\n PayloadType,\n PayloadType,\n PayloadType,\n ProcedureErrorSchemaType\n >['handler'];\n}) {\n return {\n type: 'stream',\n ...(description ? { description } : {}),\n requestInit,\n requestData,\n responseData,\n responseError,\n handler,\n };\n}\n\n/**\n * Holds the {@link Procedure} creation functions. Use these to create\n * procedures for services. You aren't allowed to create procedures directly.\n */\nexport const Procedure = {\n rpc,\n upload,\n subscription,\n stream,\n};\n","import {\n Static,\n TLiteral,\n TObject,\n TSchema,\n TString,\n TUnion,\n Type,\n} from '@sinclair/typebox';\nimport { Client } from './client';\nimport { ReadStream } from './streams';\n\ntype TLiteralString = TLiteral<string>;\n\nexport type BaseErrorSchemaType =\n | TObject<{\n code: TLiteralString | TUnion<Array<TLiteralString>>;\n message: TLiteralString | TString;\n }>\n | TObject<{\n code: TLiteralString | TUnion<Array<TLiteralString>>;\n message: TLiteralString | TString;\n extras: TSchema;\n }>;\n\n/**\n * Takes in a specific error schema and returns a result schema the error\n */\nexport const ErrResultSchema = <T extends BaseErrorSchemaType>(t: T) =>\n Type.Object({\n ok: Type.Literal(false),\n payload: t,\n });\n\n/**\n * AnyResultSchema is a schema to validate any result.\n */\nexport const AnyResultSchema = Type.Union([\n Type.Object({\n ok: Type.Literal(false),\n payload: Type.Object({\n code: Type.String(),\n message: Type.String(),\n extras: Type.Optional(Type.Unknown()),\n }),\n }),\n\n Type.Object({\n ok: Type.Literal(true),\n payload: Type.Unknown(),\n }),\n]);\n\nexport interface OkResult<T> {\n ok: true;\n payload: T;\n}\nexport interface ErrResult<Err extends Static<BaseErrorSchemaType>> {\n ok: false;\n payload: Err;\n}\nexport type Result<T, Err extends Static<BaseErrorSchemaType>> =\n | OkResult<T>\n | ErrResult<Err>;\n\nexport function Ok<const T extends Array<unknown>>(p: T): OkResult<T>;\nexport function Ok<const T extends ReadonlyArray<unknown>>(p: T): OkResult<T>;\nexport function Ok<const T>(payload: T): OkResult<T>;\nexport function Ok<const T>(payload: T): OkResult<T> {\n return {\n ok: true,\n payload,\n };\n}\n\nexport function Err<const Err extends Static<BaseErrorSchemaType>>(\n error: Err,\n): ErrResult<Err> {\n return {\n ok: false,\n payload: error,\n };\n}\n\n/**\n * Refine a {@link Result} type to its returned payload.\n */\nexport type ResultUnwrapOk<R> = R extends Result<infer T, infer __E>\n ? T\n : never;\n\n/**\n * Unwrap a {@link Result} type and return the payload if successful,\n * otherwise throws an error.\n * @param result - The result to unwrap.\n * @throws Will throw an error if the result is not ok.\n */\nexport function unwrap<T, Err extends Static<BaseErrorSchemaType>>(\n result: Result<T, Err>,\n): T {\n if (result.ok) {\n return result.payload;\n }\n\n throw new Error(\n `Cannot non-ok result, got: ${result.payload.code} - ${result.payload.message}`,\n );\n}\n\n/**\n * Refine a {@link Result} type to its error payload.\n */\nexport type ResultUnwrapErr<R> = R extends Result<infer __T, infer Err>\n ? Err\n : never;\n\n/**\n * Retrieve the output type for a procedure, represented as a {@link Result}\n * type.\n * Example:\n * ```\n * type Message = Output<typeof client, 'serviceName', 'procedureName'>\n * ```\n */\nexport type Output<\n RiverClient,\n ServiceName extends keyof RiverClient,\n ProcedureName extends keyof RiverClient[ServiceName],\n Procedure = RiverClient[ServiceName][ProcedureName],\n Fn extends (...args: never) => unknown = (...args: never) => unknown,\n> = RiverClient extends Client<infer __ServiceSchemaMap>\n ? Procedure extends object\n ? Procedure extends object & { rpc: infer 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 resReader: ReadStream<\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 resReader: ReadStream<\n infer SubscriptionOutputMessage,\n Static<BaseErrorSchemaType>\n >;\n }\n ? SubscriptionOutputMessage\n : never\n : never\n : never\n : never;\n","import { Static } from '@sinclair/typebox';\nimport { BaseErrorSchemaType, Err, Result } from './result';\n\nexport const StreamDrainedError = {\n code: 'STREAM_DRAINED',\n message: 'Stream was drained',\n} as const;\n\ntype ReadStreamResult<T, E extends Static<BaseErrorSchemaType>> = Result<\n T,\n E | typeof StreamDrainedError\n>;\n\n/**\n * Using simple iterator here to lock down the iteration and disallow\n * `return` and `throw` to be called from the outside.\n */\nexport interface SimpleIterator<T> {\n next(): Promise<\n | {\n done: false;\n value: T;\n }\n | {\n done: true;\n value: undefined;\n }\n >;\n}\n\n/**\n * A `ReadStream` represents a stream of data.\n *\n * This stream is not closable by the reader, the reader must wait for\n * the writer to close it.\n *\n * The stream can only be locked (aka consumed) once and will remain\n * locked, trying to lock the stream again will throw an TypeError.\n */\nexport interface ReadStream<T, E extends Static<BaseErrorSchemaType>> {\n /**\n * Stream implements AsyncIterator API and can be consumed via\n * for-await-of loops. Iteration locks the stream\n *\n */\n [Symbol.asyncIterator](): SimpleIterator<ReadStreamResult<T, E>>;\n /**\n * `unwrappedIter` returns an AsyncIterator that will unwrap the results coming\n * into the stream, yielding the payload if successful, otherwise throwing.\n * We generally recommend using the normal iterator instead of this method,\n * and handling errors explicitly.\n */\n unwrappedIter(): {\n [Symbol.asyncIterator](): SimpleIterator<T>;\n };\n /**\n * `asArray` locks the stream and returns a promise that resolves\n * with an array of the stream's content when the stream is closed.\n *\n */\n asArray(): Promise<Array<ReadStreamResult<T, E>>>;\n /**\n * `drain` locks the stream and discards any existing or future data.\n *\n * If there is an existing Promise waiting for the next value,\n * `drain` causes it to resolve with a {@link StreamDrainedError} error.\n */\n drain(): undefined;\n /**\n * `isLocked` returns true if the stream is locked.\n */\n isLocked(): boolean;\n /**\n * `onClose` registers a callback that will be called when the stream\n * is closed. Returns a function that can be used to unregister the\n * listener.\n */\n onClose(cb: () => void): () => void;\n /**\n * `isClosed` returns true if the stream was closed by the writer.\n *\n * Note that the stream can still have queued data and can still be\n * consumed.\n */\n isClosed(): boolean;\n /**\n * `requestClose` sends a request to the writer to close the stream,\n * and resolves the writer closes its end of the stream..\n *\n * The stream can still receive more data after the request is sent. If you\n * no longer wish to use the stream, make sure to call `drain`.\n */\n requestClose(): Promise<undefined>;\n /**\n * `isCloseRequested` checks if the reader has requested to close the stream.\n */\n isCloseRequested(): boolean;\n}\n\n/**\n * A `WriteStream` is a streams that can be written to.\n */\nexport interface WriteStream<T> {\n /**\n * `write` writes a value to the stream. An error is thrown if writing to a closed stream.\n */\n write(value: T): undefined;\n /**\n * `close` signals the closure of the write stream, informing the reader that the stream is complete.\n * Calling close multiple times has no effect.\n */\n close(): undefined;\n /**\n * `isCloseRequested` checks if the reader has requested to close the stream.\n */\n isCloseRequested(): boolean;\n /**\n * `onCloseRequest` registers a callback that will be called when the stream's\n * reader requests a close. Returns a function that can be used to unregister the\n * listener.\n */\n onCloseRequest(cb: () => void): () => void;\n /**\n * `isClosed` returns true if the stream was closed by the writer.\n */\n isClosed(): boolean;\n /**\n * `onClose` registers a callback that will be called when the stream\n * is closed. Returns a function that can be used to unregister the\n * listener.\n */\n onClose(cb: () => void): () => void;\n}\n\n/**\n * Internal implementation of a `ReadStream`.\n * This won't be exposed as an interface to river\n * consumers directly, it has internal river methods\n * to pushed data to the stream and close it.\n */\nexport class ReadStreamImpl<T, E extends Static<BaseErrorSchemaType>>\n implements ReadStream<T, E>\n{\n /**\n * Whether the stream is closed.\n */\n private closed = false;\n /**\n * A list of listeners that will be called when the stream is closed.\n */\n private onCloseListeners: Set<() => void>;\n /**\n * Whether the user has requested to close the stream.\n */\n private closeRequested = false;\n /**\n * Used to signal to the outside world that the user has requested to close the stream.\n */\n private closeRequestCallback: () => void;\n /**\n * Whether the stream is locked.\n */\n private locked = false;\n /**\n * Whether drain was called.\n */\n private drained = false;\n /**\n * This flag allows us to avoid cases where drain was called,\n * but the stream is fully consumed and closed. We don't need\n * to signal that drain was called.\n */\n private didDrainDisposeValues = false;\n /**\n * A list of values that have been pushed to the stream but not yet emitted to the user.\n */\n private queue: Array<ReadStreamResult<T, E>> = [];\n /**\n * Used by methods in the class to signal to the iterator that it\n * should check for the next value.\n */\n private nextPromise: Promise<void> | null = null;\n /**\n * Resolves nextPromise\n */\n private resolveNextPromise: null | (() => void) = null;\n\n constructor(closeRequestCallback: () => void) {\n this.closeRequestCallback = closeRequestCallback;\n this.onCloseListeners = new Set();\n }\n\n public [Symbol.asyncIterator]() {\n if (this.isLocked()) {\n throw new TypeError('ReadStream is already locked');\n }\n\n // first iteration with drain signals an error, the following one signals end of iteration.\n let didSignalDrain = false;\n this.locked = true;\n\n return {\n next: async () => {\n if (this.drained && didSignalDrain) {\n return {\n done: true,\n value: undefined,\n } as const;\n }\n\n // Wait until we have something in the queue\n while (this.queue.length === 0) {\n if (this.isClosed() && !this.didDrainDisposeValues) {\n return {\n done: true,\n value: undefined,\n } as const;\n }\n\n if (this.drained) {\n didSignalDrain = true;\n\n return {\n done: false,\n value: Err(StreamDrainedError),\n } as const;\n }\n\n if (!this.nextPromise) {\n this.nextPromise = new Promise<void>((resolve) => {\n this.resolveNextPromise = resolve;\n });\n }\n\n await this.nextPromise;\n this.nextPromise = null;\n this.resolveNextPromise = null;\n }\n\n // Unfortunately we have to use non-null assertion here, because T can be undefined\n // we already check for array length above anyway\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const value = this.queue.shift()!;\n\n return { done: false, value } as const;\n },\n return: () => {\n this.drain();\n return { done: true, value: undefined } as const;\n },\n };\n }\n\n public unwrappedIter() {\n const iterator = this[Symbol.asyncIterator]();\n\n let unwrappedLock = false;\n return {\n [Symbol.asyncIterator]() {\n if (unwrappedLock) {\n throw new TypeError('ReadStream is already locked');\n }\n\n unwrappedLock = true;\n\n return {\n next: async (): ReturnType<SimpleIterator<T>['next']> => {\n const next = await iterator.next();\n\n if (next.done) {\n return next;\n }\n\n if (next.value.ok) {\n return { done: false, value: next.value.payload };\n }\n\n iterator.return();\n\n throw new Error(\n `Got err result in unwrappedIter: ${next.value.payload.code} - ${next.value.payload.message}`,\n );\n },\n return: () => iterator.return(),\n };\n },\n };\n }\n\n public async asArray(): Promise<Array<ReadStreamResult<T, E>>> {\n const array: Array<ReadStreamResult<T, E>> = [];\n for await (const value of this) {\n array.push(value);\n }\n\n return array;\n }\n\n public drain(): undefined {\n if (this.drained) {\n return;\n }\n\n this.locked = true;\n this.drained = true;\n this.didDrainDisposeValues = this.queue.length > 0;\n this.queue.length = 0;\n\n this.resolveNextPromise?.();\n }\n\n public isClosed(): boolean {\n return this.closed;\n }\n\n public isLocked(): boolean {\n return this.locked;\n }\n\n public onClose(cb: () => void): () => void {\n if (this.isClosed()) {\n throw new Error('Stream is already closed');\n }\n\n this.onCloseListeners.add(cb);\n\n return () => {\n this.onCloseListeners.delete(cb);\n };\n }\n\n public requestClose(): Promise<undefined> {\n if (this.isClosed()) {\n throw new Error('Cannot request close after stream already closed');\n }\n\n if (!this.closeRequested) {\n this.closeRequested = true;\n this.closeRequestCallback();\n }\n\n return new Promise<undefined>((resolve) => {\n this.onClose(() => {\n resolve(undefined);\n });\n });\n }\n\n public isCloseRequested(): boolean {\n return this.closeRequested;\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n *\n * Pushes a value to the stream.\n */\n public pushValue(value: Result<T, E>): undefined {\n if (this.drained) {\n return;\n }\n\n if (this.closed) {\n throw new Error('Cannot push to closed stream');\n }\n\n this.queue.push(value);\n this.resolveNextPromise?.();\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n *\n * Triggers the close of the stream. Make sure to push all remaining\n * values before calling this method.\n */\n public triggerClose(): undefined {\n if (this.isClosed()) {\n throw new Error('Unexpected closing multiple times');\n }\n\n this.closed = true;\n this.resolveNextPromise?.();\n this.onCloseListeners.forEach((cb) => cb());\n this.onCloseListeners.clear();\n\n // TODO maybe log a warn if after a certain amount of time\n // the queue was not fully consumed\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n */\n public hasValuesInQueue(): boolean {\n return this.queue.length > 0;\n }\n}\n\n/**\n * Internal implementation of a `WriteStream`.\n * This won't be exposed as an interface to river\n * consumers directly, it has internal river methods\n * to trigger a close request, a way to pass on close\n * signals, and a way to push data to the stream.\n */\nexport class WriteStreamImpl<T> implements WriteStream<T> {\n /**\n * Passed via constructor to pass on write requests\n */\n private writeCb: (value: T) => void;\n /**\n * Whether the stream is closed.\n */\n private closed = false;\n /**\n * A list of listeners that will be called when the stream is closed.\n */\n private onCloseListeners: Set<() => void>;\n /**\n * Whether the reader has requested to close the stream.\n */\n private closeRequested = false;\n /**\n * A list of listeners that will be called when a close request is triggered.\n */\n private onCloseRequestListeners: Set<() => void>;\n\n constructor(writeCb: (value: T) => void) {\n this.writeCb = writeCb;\n this.onCloseListeners = new Set();\n this.onCloseRequestListeners = new Set();\n }\n\n public write(value: T): undefined {\n if (this.isClosed()) {\n throw new Error('Cannot write to closed stream');\n }\n\n this.writeCb(value);\n }\n\n public isClosed(): boolean {\n return this.closed;\n }\n\n onClose(cb: () => void): () => void {\n if (this.isClosed()) {\n cb();\n\n return () => undefined;\n }\n\n this.onCloseListeners.add(cb);\n\n return () => this.onCloseListeners.delete(cb);\n }\n\n public close(): undefined {\n if (this.isClosed()) {\n return;\n }\n\n this.closed = true;\n this.onCloseListeners.forEach((cb) => cb());\n\n // cleanup\n this.onCloseListeners.clear();\n this.onCloseRequestListeners.clear();\n this.writeCb = () => undefined;\n }\n\n public isCloseRequested(): boolean {\n return this.closeRequested;\n }\n\n public onCloseRequest(cb: () => void): () => void {\n if (this.isClosed()) {\n throw new Error('Stream is already closed');\n }\n\n if (this.isCloseRequested()) {\n cb();\n\n return () => undefined;\n }\n\n this.onCloseRequestListeners.add(cb);\n\n return () => this.onCloseRequestListeners.delete(cb);\n }\n\n /**\n * @internal meant for use within river, not exposed as a public API\n *\n * Triggers a close request.\n */\n public triggerCloseRequest(): undefined {\n if (this.isCloseRequested()) {\n throw new Error('Cannot trigger close request multiple times');\n }\n\n if (this.isClosed()) {\n throw new Error('Cannot trigger close request on closed stream');\n }\n\n this.closeRequested = true;\n this.onCloseRequestListeners.forEach((cb) => cb());\n this.onCloseRequestListeners.clear();\n }\n}\n"],"mappings":"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","names":["Type"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../logging/log.ts"],"sourcesContent":["import { ValueError } from '@sinclair/typebox/value';\nimport { OpaqueTransportMessage } from '../transport/message';\n\nconst LoggingLevels = {\n debug: -1,\n info: 0,\n warn: 1,\n error: 2,\n} as const;\nexport type LoggingLevel = keyof typeof LoggingLevels;\n\nexport type LogFn = (\n msg: string,\n ctx?: MessageMetadata,\n level?: LoggingLevel,\n) => void;\nexport type Logger = {\n [key in LoggingLevel]: (msg: string, metadata?: MessageMetadata) => void;\n};\n\nexport type Tags =\n | 'invariant-violation'\n | 'state-transition'\n | 'invalid-request'\n | 'unhealthy-session';\n\nconst cleanedLogFn = (log: LogFn) => {\n return (msg: string, metadata?: MessageMetadata) => {\n // skip cloning object if metadata has no transportMessage\n if (!metadata?.transportMessage) {\n log(msg, metadata);\n return;\n }\n\n // clone metadata and clean transportMessage\n const { payload, ...rest } = metadata.transportMessage;\n metadata.transportMessage = rest;\n log(msg, metadata);\n };\n};\n\nexport type MessageMetadata = Partial<{\n protocolVersion: string;\n clientId: string;\n connectedTo: string;\n sessionId: string;\n connId: string;\n transportMessage: Partial<OpaqueTransportMessage>;\n validationErrors: Array<ValueError>;\n tags: Array<Tags>;\n telemetry: {\n traceId: string;\n spanId: string;\n };\n extras: unknown;\n}>;\n\nexport class BaseLogger implements Logger {\n minLevel: LoggingLevel;\n private output: LogFn;\n\n constructor(output: LogFn, minLevel: LoggingLevel = 'info') {\n this.minLevel = minLevel;\n this.output = output;\n }\n\n debug(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.debug) {\n this.output(msg, metadata ?? {}, 'debug');\n }\n }\n\n info(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.info) {\n this.output(msg, metadata ?? {}, 'info');\n }\n }\n\n warn(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.warn) {\n this.output(msg, metadata ?? {}, 'warn');\n }\n }\n\n error(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.error) {\n this.output(msg, metadata ?? {}, 'error');\n }\n }\n}\n\nexport const stringLogger: LogFn = (msg, ctx, level = 'info') => {\n const from = ctx?.clientId ? `${ctx.clientId} -- ` : '';\n console.log(`[river:${level}] ${from}${msg}`);\n};\n\nconst colorMap = {\n debug: '\\u001b[34m',\n info: '\\u001b[32m',\n warn: '\\u001b[33m',\n error: '\\u001b[31m',\n};\n\nexport const coloredStringLogger: LogFn = (msg, ctx, level = 'info') => {\n const color = colorMap[level];\n const from = ctx?.clientId ? `${ctx.clientId} -- ` : '';\n console.log(`[river:${color}${level}\\u001b[0m] ${from}${msg}`);\n};\n\nexport const jsonLogger: LogFn = (msg, ctx, level) => {\n console.log(JSON.stringify({ msg, ctx, level }));\n};\n\nexport const createLogProxy = (log: Logger) => ({\n debug: cleanedLogFn(log.debug.bind(log)),\n info: cleanedLogFn(log.info.bind(log)),\n warn: cleanedLogFn(log.warn.bind(log)),\n error: cleanedLogFn(log.error.bind(log)),\n});\n"],"mappings":";AAGA,IAAM,gBAAgB;AAAA,EACpB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AAkBA,IAAM,eAAe,CAAC,QAAe;AACnC,SAAO,CAAC,KAAa,aAA+B;AAElD,QAAI,CAAC,UAAU,kBAAkB;AAC/B,UAAI,KAAK,QAAQ;AACjB;AAAA,IACF;AAGA,UAAM,EAAE,SAAS,GAAG,KAAK,IAAI,SAAS;AACtC,aAAS,mBAAmB;AAC5B,QAAI,KAAK,QAAQ;AAAA,EACnB;AACF;AAkBO,IAAM,aAAN,MAAmC;AAAA,EACxC;AAAA,EACQ;AAAA,EAER,YAAY,QAAe,WAAyB,QAAQ;AAC1D,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAa,UAA4B;AAC7C,QAAI,cAAc,KAAK,QAAQ,KAAK,cAAc,OAAO;AACvD,WAAK,OAAO,KAAK,YAAY,CAAC,GAAG,OAAO;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,KAAK,KAAa,UAA4B;AAC5C,QAAI,cAAc,KAAK,QAAQ,KAAK,cAAc,MAAM;AACtD,WAAK,OAAO,KAAK,YAAY,CAAC,GAAG,MAAM;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,KAAK,KAAa,UAA4B;AAC5C,QAAI,cAAc,KAAK,QAAQ,KAAK,cAAc,MAAM;AACtD,WAAK,OAAO,KAAK,YAAY,CAAC,GAAG,MAAM;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,KAAa,UAA4B;AAC7C,QAAI,cAAc,KAAK,QAAQ,KAAK,cAAc,OAAO;AACvD,WAAK,OAAO,KAAK,YAAY,CAAC,GAAG,OAAO;AAAA,IAC1C;AAAA,EACF;AACF;AAEO,IAAM,eAAsB,CAAC,KAAK,KAAK,QAAQ,WAAW;AAC/D,QAAM,OAAO,KAAK,WAAW,GAAG,IAAI,QAAQ,SAAS;AACrD,UAAQ,IAAI,UAAU,KAAK,KAAK,IAAI,GAAG,GAAG,EAAE;AAC9C;AAEA,IAAM,WAAW;AAAA,EACf,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AAEO,IAAM,sBAA6B,CAAC,KAAK,KAAK,QAAQ,WAAW;AACtE,QAAM,QAAQ,SAAS,KAAK;AAC5B,QAAM,OAAO,KAAK,WAAW,GAAG,IAAI,QAAQ,SAAS;AACrD,UAAQ,IAAI,UAAU,KAAK,GAAG,KAAK,YAAc,IAAI,GAAG,GAAG,EAAE;AAC/D;AAEO,IAAM,aAAoB,CAAC,KAAK,KAAK,UAAU;AACpD,UAAQ,IAAI,KAAK,UAAU,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC;AACjD;AAEO,IAAM,iBAAiB,CAAC,SAAiB;AAAA,EAC9C,OAAO,aAAa,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,EACvC,MAAM,aAAa,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,EACrC,MAAM,aAAa,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,EACrC,OAAO,aAAa,IAAI,MAAM,KAAK,GAAG,CAAC;AACzC;","names":[]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ProtocolError,
|
|
3
3
|
Transport
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LYIHSVPM.js";
|
|
5
5
|
import {
|
|
6
6
|
ServerSessionStateGraph,
|
|
7
7
|
defaultServerTransportOptions
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-J274XPWD.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-SKB2I27D.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-DDAGE6MV.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ProtocolError,
|
|
3
3
|
Transport
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LYIHSVPM.js";
|
|
5
5
|
import {
|
|
6
6
|
ClientSessionStateGraph,
|
|
7
7
|
defaultClientTransportOptions
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-J274XPWD.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-SKB2I27D.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-DH7WAJZM.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
createSessionTelemetryInfo,
|
|
4
4
|
generateId,
|
|
5
5
|
isAck
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-SKB2I27D.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-J274XPWD.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseLogger,
|
|
3
3
|
createLogProxy
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-BAGOAJ3K.js";
|
|
5
5
|
import {
|
|
6
6
|
SessionStateGraph,
|
|
7
7
|
defaultTransportOptions
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-J274XPWD.js";
|
|
9
9
|
import {
|
|
10
10
|
generateId
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-SKB2I27D.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-LYIHSVPM.js.map
|
|
@@ -195,7 +195,7 @@ function isStreamAbort(controlFlag) {
|
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
// package.json
|
|
198
|
-
var version = "0.200.0-rc.
|
|
198
|
+
var version = "0.200.0-rc.16";
|
|
199
199
|
|
|
200
200
|
// util/stringify.ts
|
|
201
201
|
function coerceErrorString(err) {
|
|
@@ -320,4 +320,4 @@ export {
|
|
|
320
320
|
tracing_default,
|
|
321
321
|
coerceErrorString
|
|
322
322
|
};
|
|
323
|
-
//# sourceMappingURL=chunk-
|
|
323
|
+
//# sourceMappingURL=chunk-SKB2I27D.js.map
|
|
@@ -1 +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 {\n ErrResult,\n RequestReaderErrorSchema,\n ResponseReaderErrorSchema,\n} 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 readers no longer wish to receive messages.\n */\n StreamCloseRequestBit = 0b10000,\n /**\n * Used when a stream is aborted due to cancellation or errors\n */\n StreamAbortBit = 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 requestCloseStreamMessage(\n streamId: string,\n): PartialTransportMessage {\n return {\n streamId,\n controlFlags: ControlFlags.StreamCloseRequestBit,\n payload: {\n type: 'CLOSE' as const,\n } satisfies Static<typeof ControlMessagePayloadSchema>,\n };\n}\n\nexport function abortMessage(\n streamId: string,\n payload: ErrResult<\n Static<typeof ResponseReaderErrorSchema | typeof RequestReaderErrorSchema>\n >,\n) {\n return {\n streamId,\n controlFlags: ControlFlags.StreamAbortBit,\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 a stream close request message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the StreamCloseBit, false otherwise.\n */\nexport function isStreamCloseRequest(controlFlag: number): boolean {\n return (\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n (controlFlag & ControlFlags.StreamCloseRequestBit) ===\n ControlFlags.StreamCloseRequestBit\n );\n}\n\n/**\n * Checks if the given control flag (usually found in msg.controlFlag) is an abort message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the AbortBit, false otherwise\n */\nexport function isStreamAbort(controlFlag: number): boolean {\n return (\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n (controlFlag & ControlFlags.StreamAbortBit) === ControlFlags.StreamAbortBit\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.13\",\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\": \"^1.3.1\",\n \"eslint\": \"^8.57.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-prettier\": \"^5.1.3\",\n \"prettier\": \"^3.0.0\",\n \"tsup\": \"^7.2.0\",\n \"typescript\": \"^5.4.5\",\n \"vitest\": \"^1.3.1\"\n },\n \"scripts\": {\n \"check\": \"tsc --noEmit && npm run format && npm run lint\",\n \"format\": \"npx prettier . --check\",\n \"format:fix\": \"npx prettier . --write\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"fix\": \"npm run format:fix && npm run lint:fix\",\n \"build\": \"rm -rf dist && tsup && du -sh dist\",\n \"prepack\": \"npm run build\",\n \"release\": \"npm publish --access public\",\n \"test:ui\": \"echo \\\"remember to go to /__vitest__ in the webview\\\" && vitest --ui --api.host 0.0.0.0 --api.port 3000\",\n \"test\": \"vitest\",\n \"test:single\": \"vitest run --reporter=dot\",\n \"test:flake\": \"./flake.sh\",\n \"bench\": \"vitest bench\"\n },\n \"engines\": {\n \"node\": \">=16\"\n },\n \"keywords\": [\n \"rpc\",\n \"websockets\",\n \"jsonschema\"\n ],\n \"author\": \"Jacky Zhao\",\n \"license\": \"MIT\"\n}\n","export function coerceErrorString(err: unknown): string {\n if (err instanceof Error) {\n return err.message || 'unknown reason';\n }\n\n return `[coerced to error] ${String(err)}`;\n}\n","import {\n Context,\n Span,\n SpanKind,\n context,\n propagation,\n trace,\n} from '@opentelemetry/api';\nimport { version as RIVER_VERSION } from '../package.json';\nimport { ValidProcType } from '../router';\nimport { 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
|
+
{"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 {\n ErrResult,\n RequestReaderErrorSchema,\n ResponseReaderErrorSchema,\n} 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 readers no longer wish to receive messages.\n */\n StreamCloseRequestBit = 0b10000,\n /**\n * Used when a stream is aborted due to cancellation or errors\n */\n StreamAbortBit = 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 requestCloseStreamMessage(\n streamId: string,\n): PartialTransportMessage {\n return {\n streamId,\n controlFlags: ControlFlags.StreamCloseRequestBit,\n payload: {\n type: 'CLOSE' as const,\n } satisfies Static<typeof ControlMessagePayloadSchema>,\n };\n}\n\nexport function abortMessage(\n streamId: string,\n payload: ErrResult<\n Static<typeof ResponseReaderErrorSchema | typeof RequestReaderErrorSchema>\n >,\n) {\n return {\n streamId,\n controlFlags: ControlFlags.StreamAbortBit,\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 a stream close request message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the StreamCloseBit, false otherwise.\n */\nexport function isStreamCloseRequest(controlFlag: number): boolean {\n return (\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n (controlFlag & ControlFlags.StreamCloseRequestBit) ===\n ControlFlags.StreamCloseRequestBit\n );\n}\n\n/**\n * Checks if the given control flag (usually found in msg.controlFlag) is an abort message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the AbortBit, false otherwise\n */\nexport function isStreamAbort(controlFlag: number): boolean {\n return (\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n (controlFlag & ControlFlags.StreamAbortBit) === ControlFlags.StreamAbortBit\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.16\",\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\": \"^1.3.1\",\n \"eslint\": \"^8.57.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-prettier\": \"^5.1.3\",\n \"prettier\": \"^3.0.0\",\n \"tsup\": \"^7.2.0\",\n \"typescript\": \"^5.4.5\",\n \"vitest\": \"^1.3.1\"\n },\n \"scripts\": {\n \"check\": \"tsc --noEmit && npm run format && npm run lint\",\n \"format\": \"npx prettier . --check\",\n \"format:fix\": \"npx prettier . --write\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"fix\": \"npm run format:fix && npm run lint:fix\",\n \"build\": \"rm -rf dist && tsup && du -sh dist\",\n \"prepack\": \"npm run build\",\n \"release\": \"npm publish --access public\",\n \"test:ui\": \"echo \\\"remember to go to /__vitest__ in the webview\\\" && vitest --ui --api.host 0.0.0.0 --api.port 3000\",\n \"test\": \"vitest\",\n \"test:single\": \"vitest run --reporter=dot\",\n \"test:flake\": \"./flake.sh\",\n \"bench\": \"vitest bench\"\n },\n \"engines\": {\n \"node\": \">=16\"\n },\n \"keywords\": [\n \"rpc\",\n \"websockets\",\n \"jsonschema\"\n ],\n \"author\": \"Jacky Zhao\",\n \"license\": \"MIT\"\n}\n","export function coerceErrorString(err: unknown): string {\n if (err instanceof Error) {\n return err.message || 'unknown reason';\n }\n\n return `[coerced to error] ${String(err)}`;\n}\n","import {\n Context,\n Span,\n SpanKind,\n context,\n propagation,\n trace,\n} from '@opentelemetry/api';\nimport { version as RIVER_VERSION } from '../package.json';\nimport { ValidProcType } from '../router';\nimport { 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,5 +1,5 @@
|
|
|
1
|
-
import { C as Connection, T as Transport, n as ClientTransportOptions, L as LeakyBucketRateLimit, p as ClientHandshakeOptions, q as ClientSession, b as ProvidedClientTransportOptions, f as SessionConnecting, e as SessionNoConnection, g as SessionHandshaking, h as SessionConnected, r as SessionBackingOff } from './context-
|
|
2
|
-
import { c as TransportClientId, P as PartialTransportMessage, b as OpaqueTransportMessage } from './message-
|
|
1
|
+
import { C as Connection, T as Transport, n as ClientTransportOptions, L as LeakyBucketRateLimit, p as ClientHandshakeOptions, q as ClientSession, b as ProvidedClientTransportOptions, f as SessionConnecting, e as SessionNoConnection, g as SessionHandshaking, h as SessionConnected, r as SessionBackingOff } from './context-00e2b444.js';
|
|
2
|
+
import { c as TransportClientId, P as PartialTransportMessage, b as OpaqueTransportMessage } from './message-59fe53e1.js';
|
|
3
3
|
|
|
4
4
|
declare abstract class ClientTransport<ConnType extends Connection> extends Transport<ConnType> {
|
|
5
5
|
/**
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { b as OpaqueTransportMessage, e as Tags } from './message-59fe53e1.js';
|
|
2
|
+
import * as _sinclair_typebox_errors from '@sinclair/typebox/errors';
|
|
3
|
+
import { C as Connection } from './context-00e2b444.js';
|
|
4
|
+
import { W as WsLike } from './wslike-e0b32dd5.js';
|
|
5
|
+
|
|
6
|
+
interface ConnectionInfoExtras {
|
|
7
|
+
headers: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
declare class WebSocketConnection extends Connection {
|
|
10
|
+
ws: WsLike;
|
|
11
|
+
extras?: ConnectionInfoExtras;
|
|
12
|
+
get loggingMetadata(): Partial<{
|
|
13
|
+
protocolVersion: string;
|
|
14
|
+
clientId: string;
|
|
15
|
+
connectedTo: string;
|
|
16
|
+
sessionId: string;
|
|
17
|
+
connId: string;
|
|
18
|
+
transportMessage: Partial<OpaqueTransportMessage>;
|
|
19
|
+
validationErrors: _sinclair_typebox_errors.ValueError[];
|
|
20
|
+
tags: Tags[];
|
|
21
|
+
telemetry: {
|
|
22
|
+
traceId: string;
|
|
23
|
+
spanId: string;
|
|
24
|
+
};
|
|
25
|
+
extras: unknown;
|
|
26
|
+
}>;
|
|
27
|
+
constructor(ws: WsLike, extras?: ConnectionInfoExtras);
|
|
28
|
+
send(payload: Uint8Array): boolean;
|
|
29
|
+
close(): void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { WebSocketConnection as W };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f as TelemetryInfo, M as MessageMetadata, c as TransportClientId, L as Logger, b as OpaqueTransportMessage, P as PartialTransportMessage, a as TransportMessage, e as Tags, H as HandshakeErrorResponseCodes, g as LogFn, h as LoggingLevel, j as HandshakeErrorCustomHandlerFatalResponseCodes } from './message-
|
|
1
|
+
import { f as TelemetryInfo, M as MessageMetadata, c as TransportClientId, L as Logger, b as OpaqueTransportMessage, P as PartialTransportMessage, a as TransportMessage, e as Tags, H as HandshakeErrorResponseCodes, g as LogFn, h as LoggingLevel, j as HandshakeErrorCustomHandlerFatalResponseCodes } from './message-59fe53e1.js';
|
|
2
2
|
import { Static, TSchema } from '@sinclair/typebox';
|
|
3
3
|
import * as _sinclair_typebox_errors from '@sinclair/typebox/errors';
|
|
4
4
|
import { C as Codec } from './types-3e5768ec.js';
|
|
@@ -226,6 +226,7 @@ declare class SessionHandshaking<ConnType extends Connection> extends Identified
|
|
|
226
226
|
traceId: string;
|
|
227
227
|
spanId: string;
|
|
228
228
|
} | undefined;
|
|
229
|
+
extras?: unknown;
|
|
229
230
|
};
|
|
230
231
|
onHandshakeData: (msg: Uint8Array) => void;
|
|
231
232
|
sendHandshake(msg: TransportMessage): boolean;
|
|
@@ -266,6 +267,7 @@ declare class SessionConnected<ConnType extends Connection> extends IdentifiedSe
|
|
|
266
267
|
traceId: string;
|
|
267
268
|
spanId: string;
|
|
268
269
|
} | undefined;
|
|
270
|
+
extras?: unknown;
|
|
269
271
|
};
|
|
270
272
|
startActiveHeartbeat(): void;
|
|
271
273
|
private sendHeartbeat;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../logging/index.ts","../../logging/log.ts"],"sourcesContent":["export { stringLogger, coloredStringLogger, jsonLogger } from './log';\nexport type { Logger, LogFn, MessageMetadata } from './log';\n","import { ValueError } from '@sinclair/typebox/value';\nimport { OpaqueTransportMessage } from '../transport/message';\n\nconst LoggingLevels = {\n debug: -1,\n info: 0,\n warn: 1,\n error: 2,\n} as const;\nexport type LoggingLevel = keyof typeof LoggingLevels;\n\nexport type LogFn = (\n msg: string,\n ctx?: MessageMetadata,\n level?: LoggingLevel,\n) => void;\nexport type Logger = {\n [key in LoggingLevel]: (msg: string, metadata?: MessageMetadata) => void;\n};\n\nexport type Tags =\n | 'invariant-violation'\n | 'state-transition'\n | 'invalid-request'\n | 'unhealthy-session';\n\nconst cleanedLogFn = (log: LogFn) => {\n return (msg: string, metadata?: MessageMetadata) => {\n // skip cloning object if metadata has no transportMessage\n if (!metadata?.transportMessage) {\n log(msg, metadata);\n return;\n }\n\n // clone metadata and clean transportMessage\n const { payload, ...rest } = metadata.transportMessage;\n metadata.transportMessage = rest;\n log(msg, metadata);\n };\n};\n\nexport type MessageMetadata = Partial<{\n protocolVersion: string;\n clientId: string;\n connectedTo: string;\n sessionId: string;\n connId: string;\n transportMessage: Partial<OpaqueTransportMessage>;\n validationErrors: Array<ValueError>;\n tags: Array<Tags>;\n telemetry: {\n traceId: string;\n spanId: string;\n };\n}>;\n\nexport class BaseLogger implements Logger {\n minLevel: LoggingLevel;\n private output: LogFn;\n\n constructor(output: LogFn, minLevel: LoggingLevel = 'info') {\n this.minLevel = minLevel;\n this.output = output;\n }\n\n debug(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.debug) {\n this.output(msg, metadata ?? {}, 'debug');\n }\n }\n\n info(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.info) {\n this.output(msg, metadata ?? {}, 'info');\n }\n }\n\n warn(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.warn) {\n this.output(msg, metadata ?? {}, 'warn');\n }\n }\n\n error(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.error) {\n this.output(msg, metadata ?? {}, 'error');\n }\n }\n}\n\nexport const stringLogger: LogFn = (msg, ctx, level = 'info') => {\n const from = ctx?.clientId ? `${ctx.clientId} -- ` : '';\n console.log(`[river:${level}] ${from}${msg}`);\n};\n\nconst colorMap = {\n debug: '\\u001b[34m',\n info: '\\u001b[32m',\n warn: '\\u001b[33m',\n error: '\\u001b[31m',\n};\n\nexport const coloredStringLogger: LogFn = (msg, ctx, level = 'info') => {\n const color = colorMap[level];\n const from = ctx?.clientId ? `${ctx.clientId} -- ` : '';\n console.log(`[river:${color}${level}\\u001b[0m] ${from}${msg}`);\n};\n\nexport const jsonLogger: LogFn = (msg, ctx, level) => {\n console.log(JSON.stringify({ msg, ctx, level }));\n};\n\nexport const createLogProxy = (log: Logger) => ({\n debug: cleanedLogFn(log.debug.bind(log)),\n info: cleanedLogFn(log.info.bind(log)),\n warn: cleanedLogFn(log.warn.bind(log)),\n error: cleanedLogFn(log.error.bind(log)),\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;
|
|
1
|
+
{"version":3,"sources":["../../logging/index.ts","../../logging/log.ts"],"sourcesContent":["export { stringLogger, coloredStringLogger, jsonLogger } from './log';\nexport type { Logger, LogFn, MessageMetadata } from './log';\n","import { ValueError } from '@sinclair/typebox/value';\nimport { OpaqueTransportMessage } from '../transport/message';\n\nconst LoggingLevels = {\n debug: -1,\n info: 0,\n warn: 1,\n error: 2,\n} as const;\nexport type LoggingLevel = keyof typeof LoggingLevels;\n\nexport type LogFn = (\n msg: string,\n ctx?: MessageMetadata,\n level?: LoggingLevel,\n) => void;\nexport type Logger = {\n [key in LoggingLevel]: (msg: string, metadata?: MessageMetadata) => void;\n};\n\nexport type Tags =\n | 'invariant-violation'\n | 'state-transition'\n | 'invalid-request'\n | 'unhealthy-session';\n\nconst cleanedLogFn = (log: LogFn) => {\n return (msg: string, metadata?: MessageMetadata) => {\n // skip cloning object if metadata has no transportMessage\n if (!metadata?.transportMessage) {\n log(msg, metadata);\n return;\n }\n\n // clone metadata and clean transportMessage\n const { payload, ...rest } = metadata.transportMessage;\n metadata.transportMessage = rest;\n log(msg, metadata);\n };\n};\n\nexport type MessageMetadata = Partial<{\n protocolVersion: string;\n clientId: string;\n connectedTo: string;\n sessionId: string;\n connId: string;\n transportMessage: Partial<OpaqueTransportMessage>;\n validationErrors: Array<ValueError>;\n tags: Array<Tags>;\n telemetry: {\n traceId: string;\n spanId: string;\n };\n extras: unknown;\n}>;\n\nexport class BaseLogger implements Logger {\n minLevel: LoggingLevel;\n private output: LogFn;\n\n constructor(output: LogFn, minLevel: LoggingLevel = 'info') {\n this.minLevel = minLevel;\n this.output = output;\n }\n\n debug(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.debug) {\n this.output(msg, metadata ?? {}, 'debug');\n }\n }\n\n info(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.info) {\n this.output(msg, metadata ?? {}, 'info');\n }\n }\n\n warn(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.warn) {\n this.output(msg, metadata ?? {}, 'warn');\n }\n }\n\n error(msg: string, metadata?: MessageMetadata) {\n if (LoggingLevels[this.minLevel] <= LoggingLevels.error) {\n this.output(msg, metadata ?? {}, 'error');\n }\n }\n}\n\nexport const stringLogger: LogFn = (msg, ctx, level = 'info') => {\n const from = ctx?.clientId ? `${ctx.clientId} -- ` : '';\n console.log(`[river:${level}] ${from}${msg}`);\n};\n\nconst colorMap = {\n debug: '\\u001b[34m',\n info: '\\u001b[32m',\n warn: '\\u001b[33m',\n error: '\\u001b[31m',\n};\n\nexport const coloredStringLogger: LogFn = (msg, ctx, level = 'info') => {\n const color = colorMap[level];\n const from = ctx?.clientId ? `${ctx.clientId} -- ` : '';\n console.log(`[river:${color}${level}\\u001b[0m] ${from}${msg}`);\n};\n\nexport const jsonLogger: LogFn = (msg, ctx, level) => {\n console.log(JSON.stringify({ msg, ctx, level }));\n};\n\nexport const createLogProxy = (log: Logger) => ({\n debug: cleanedLogFn(log.debug.bind(log)),\n info: cleanedLogFn(log.info.bind(log)),\n warn: cleanedLogFn(log.warn.bind(log)),\n error: cleanedLogFn(log.error.bind(log)),\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC2FO,IAAM,eAAsB,CAAC,KAAK,KAAK,QAAQ,WAAW;AAC/D,QAAM,OAAO,KAAK,WAAW,GAAG,IAAI,QAAQ,SAAS;AACrD,UAAQ,IAAI,UAAU,KAAK,KAAK,IAAI,GAAG,GAAG,EAAE;AAC9C;AAEA,IAAM,WAAW;AAAA,EACf,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AAEO,IAAM,sBAA6B,CAAC,KAAK,KAAK,QAAQ,WAAW;AACtE,QAAM,QAAQ,SAAS,KAAK;AAC5B,QAAM,OAAO,KAAK,WAAW,GAAG,IAAI,QAAQ,SAAS;AACrD,UAAQ,IAAI,UAAU,KAAK,GAAG,KAAK,YAAc,IAAI,GAAG,GAAG,EAAE;AAC/D;AAEO,IAAM,aAAoB,CAAC,KAAK,KAAK,UAAU;AACpD,UAAQ,IAAI,KAAK,UAAU,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC;AACjD;","names":[]}
|
package/dist/logging/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { g as LogFn, L as Logger, M as MessageMetadata, k as coloredStringLogger, l as jsonLogger, s as stringLogger } from '../message-
|
|
1
|
+
export { g as LogFn, L as Logger, M as MessageMetadata, k as coloredStringLogger, l as jsonLogger, s as stringLogger } from '../message-59fe53e1.js';
|
|
2
2
|
import '@sinclair/typebox/value';
|
|
3
3
|
import '@sinclair/typebox';
|
|
4
4
|
import '@opentelemetry/api';
|
package/dist/logging/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { g as LogFn, L as Logger, M as MessageMetadata, k as coloredStringLogger, l as jsonLogger, s as stringLogger } from '../message-
|
|
1
|
+
export { g as LogFn, L as Logger, M as MessageMetadata, k as coloredStringLogger, l as jsonLogger, s as stringLogger } from '../message-59fe53e1.js';
|
|
2
2
|
import '@sinclair/typebox/value';
|
|
3
3
|
import '@sinclair/typebox';
|
|
4
4
|
import '@opentelemetry/api';
|
package/dist/logging/index.js
CHANGED
package/dist/router/index.cjs
CHANGED