@replit/river 0.19.3 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +2 -0
  2. package/dist/{chunk-XAG3SC7R.js → chunk-3AW3IXVD.js} +4 -2
  3. package/dist/chunk-3AW3IXVD.js.map +1 -0
  4. package/dist/{chunk-2Z2NE47H.js → chunk-5WFL722S.js} +15 -2
  5. package/dist/chunk-5WFL722S.js.map +1 -0
  6. package/dist/{chunk-SLYSDRLE.js → chunk-DP5X7CCT.js} +517 -260
  7. package/dist/chunk-DP5X7CCT.js.map +1 -0
  8. package/dist/{chunk-YHKIWQOC.js → chunk-FNK44ZN3.js} +2 -2
  9. package/dist/{chunk-LDCCELCJ.js → chunk-MJR36SUY.js} +8 -3
  10. package/dist/{chunk-LDCCELCJ.js.map → chunk-MJR36SUY.js.map} +1 -1
  11. package/dist/{chunk-QZD2UTDJ.js → chunk-QU2EE6YU.js} +384 -246
  12. package/dist/chunk-QU2EE6YU.js.map +1 -0
  13. package/dist/codec/index.cjs +3 -1
  14. package/dist/codec/index.cjs.map +1 -1
  15. package/dist/codec/index.js +1 -1
  16. package/dist/{connection-cfec12e6.d.ts → connection-d49d5d56.d.ts} +1 -1
  17. package/dist/{connection-aa0ea000.d.ts → connection-dba95bc8.d.ts} +1 -1
  18. package/dist/{index-e2513701.d.ts → index-3ac92295.d.ts} +12 -0
  19. package/dist/logging/index.d.cts +1 -1
  20. package/dist/logging/index.d.ts +1 -1
  21. package/dist/router/index.cjs +514 -257
  22. package/dist/router/index.cjs.map +1 -1
  23. package/dist/router/index.d.cts +4 -4
  24. package/dist/router/index.d.ts +4 -4
  25. package/dist/router/index.js +2 -2
  26. package/dist/{services-5fc5712d.d.ts → services-8496d6e8.d.ts} +1 -1
  27. package/dist/{services-4bba42d8.d.ts → services-abc077db.d.ts} +1 -1
  28. package/dist/transport/impls/uds/client.cjs +156 -75
  29. package/dist/transport/impls/uds/client.cjs.map +1 -1
  30. package/dist/transport/impls/uds/client.d.cts +2 -2
  31. package/dist/transport/impls/uds/client.d.ts +2 -2
  32. package/dist/transport/impls/uds/client.js +4 -4
  33. package/dist/transport/impls/uds/server.cjs +255 -170
  34. package/dist/transport/impls/uds/server.cjs.map +1 -1
  35. package/dist/transport/impls/uds/server.d.cts +2 -2
  36. package/dist/transport/impls/uds/server.d.ts +2 -2
  37. package/dist/transport/impls/uds/server.js +4 -4
  38. package/dist/transport/impls/ws/client.cjs +150 -74
  39. package/dist/transport/impls/ws/client.cjs.map +1 -1
  40. package/dist/transport/impls/ws/client.d.cts +2 -2
  41. package/dist/transport/impls/ws/client.d.ts +2 -2
  42. package/dist/transport/impls/ws/client.js +4 -4
  43. package/dist/transport/impls/ws/server.cjs +249 -169
  44. package/dist/transport/impls/ws/server.cjs.map +1 -1
  45. package/dist/transport/impls/ws/server.d.cts +2 -2
  46. package/dist/transport/impls/ws/server.d.ts +2 -2
  47. package/dist/transport/impls/ws/server.js +4 -4
  48. package/dist/transport/index.cjs +387 -243
  49. package/dist/transport/index.cjs.map +1 -1
  50. package/dist/transport/index.d.cts +3 -2
  51. package/dist/transport/index.d.ts +3 -2
  52. package/dist/transport/index.js +3 -3
  53. package/dist/util/testHelpers.cjs +1 -0
  54. package/dist/util/testHelpers.cjs.map +1 -1
  55. package/dist/util/testHelpers.d.cts +2 -2
  56. package/dist/util/testHelpers.d.ts +2 -2
  57. package/dist/util/testHelpers.js +4 -4
  58. package/package.json +2 -1
  59. package/dist/chunk-2Z2NE47H.js.map +0 -1
  60. package/dist/chunk-QZD2UTDJ.js.map +0 -1
  61. package/dist/chunk-SLYSDRLE.js.map +0 -1
  62. package/dist/chunk-XAG3SC7R.js.map +0 -1
  63. /package/dist/{chunk-YHKIWQOC.js.map → chunk-FNK44ZN3.js.map} +0 -0
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # River
2
2
 
3
+ ⚠️ Not production ready, while Replit is using parts of river in production, we are still going through rapid breaking changes. First production ready version will be 1.x.x ⚠️
4
+
3
5
  River allows multiple clients to connect to and make remote procedure calls to a remote server as if they were local procedures.
4
6
 
5
7
  ## Long-lived streaming remote procedure calls
@@ -1,7 +1,9 @@
1
1
  // codec/binary.ts
2
2
  import { decode, encode } from "@msgpack/msgpack";
3
3
  var BinaryCodec = {
4
- toBuffer: encode,
4
+ toBuffer(obj) {
5
+ return encode(obj, { ignoreUndefined: true });
6
+ },
5
7
  fromBuffer: (buff) => {
6
8
  try {
7
9
  const res = decode(buff);
@@ -71,4 +73,4 @@ export {
71
73
  BinaryCodec,
72
74
  NaiveJsonCodec
73
75
  };
74
- //# sourceMappingURL=chunk-XAG3SC7R.js.map
76
+ //# sourceMappingURL=chunk-3AW3IXVD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../codec/binary.ts","../codec/json.ts"],"sourcesContent":["import { decode, encode } from '@msgpack/msgpack';\nimport { Codec } from './types';\n\n/**\n * Binary codec, uses [msgpack](https://www.npmjs.com/package/@msgpack/msgpack) under the hood\n * @type {Codec}\n */\nexport const BinaryCodec: Codec = {\n toBuffer(obj) {\n return encode(obj, { ignoreUndefined: true });\n },\n fromBuffer: (buff: Uint8Array) => {\n try {\n const res = decode(buff);\n if (typeof res !== 'object') {\n return null;\n }\n\n return res;\n } catch {\n return null;\n }\n },\n};\n","import { Codec } from './types';\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\n// Convert Uint8Array to base64\nfunction uint8ArrayToBase64(uint8Array: Uint8Array) {\n let binary = '';\n uint8Array.forEach((byte) => {\n binary += String.fromCharCode(byte);\n });\n return btoa(binary);\n}\n\n// Convert base64 to Uint8Array\nfunction base64ToUint8Array(base64: string) {\n const binaryString = atob(base64);\n const uint8Array = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n uint8Array[i] = binaryString.charCodeAt(i);\n }\n return uint8Array;\n}\n\ninterface Base64EncodedValue {\n $t: string;\n}\n\n/**\n * Naive JSON codec implementation using JSON.stringify and JSON.parse.\n * @type {Codec}\n */\nexport const NaiveJsonCodec: Codec = {\n toBuffer: (obj: object) => {\n return encoder.encode(\n JSON.stringify(obj, function replacer<\n T extends object,\n >(this: T, key: keyof T) {\n const val = this[key];\n if (val instanceof Uint8Array) {\n return { $t: uint8ArrayToBase64(val) } satisfies Base64EncodedValue;\n } else {\n return val;\n }\n }),\n );\n },\n fromBuffer: (buff: Uint8Array) => {\n try {\n const parsed = JSON.parse(\n decoder.decode(buff),\n function reviver(_key, val: unknown) {\n if ((val as Base64EncodedValue | undefined)?.$t) {\n return base64ToUint8Array((val as Base64EncodedValue).$t);\n } else {\n return val;\n }\n },\n ) as unknown;\n\n if (typeof parsed === 'object') return parsed;\n return null;\n } catch {\n return null;\n }\n },\n};\n"],"mappings":";AAAA,SAAS,QAAQ,cAAc;AAOxB,IAAM,cAAqB;AAAA,EAChC,SAAS,KAAK;AACZ,WAAO,OAAO,KAAK,EAAE,iBAAiB,KAAK,CAAC;AAAA,EAC9C;AAAA,EACA,YAAY,CAAC,SAAqB;AAChC,QAAI;AACF,YAAM,MAAM,OAAO,IAAI;AACvB,UAAI,OAAO,QAAQ,UAAU;AAC3B,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACrBA,IAAM,UAAU,IAAI,YAAY;AAChC,IAAM,UAAU,IAAI,YAAY;AAGhC,SAAS,mBAAmB,YAAwB;AAClD,MAAI,SAAS;AACb,aAAW,QAAQ,CAAC,SAAS;AAC3B,cAAU,OAAO,aAAa,IAAI;AAAA,EACpC,CAAC;AACD,SAAO,KAAK,MAAM;AACpB;AAGA,SAAS,mBAAmB,QAAgB;AAC1C,QAAM,eAAe,KAAK,MAAM;AAChC,QAAM,aAAa,IAAI,WAAW,aAAa,MAAM;AACrD,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,eAAW,CAAC,IAAI,aAAa,WAAW,CAAC;AAAA,EAC3C;AACA,SAAO;AACT;AAUO,IAAM,iBAAwB;AAAA,EACnC,UAAU,CAAC,QAAgB;AACzB,WAAO,QAAQ;AAAA,MACb,KAAK,UAAU,KAAK,SAAS,SAElB,KAAc;AACvB,cAAM,MAAM,KAAK,GAAG;AACpB,YAAI,eAAe,YAAY;AAC7B,iBAAO,EAAE,IAAI,mBAAmB,GAAG,EAAE;AAAA,QACvC,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,YAAY,CAAC,SAAqB;AAChC,QAAI;AACF,YAAM,SAAS,KAAK;AAAA,QAClB,QAAQ,OAAO,IAAI;AAAA,QACnB,SAAS,QAAQ,MAAM,KAAc;AACnC,cAAK,KAAwC,IAAI;AAC/C,mBAAO,mBAAoB,IAA2B,EAAE;AAAA,UAC1D,OAAO;AACL,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO,WAAW;AAAU,eAAO;AACvC,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -11,6 +11,12 @@ var TransportMessageSchema = (t) => Type.Object({
11
11
  procedureName: Type.Optional(Type.String()),
12
12
  streamId: Type.String(),
13
13
  controlFlags: Type.Integer(),
14
+ tracing: Type.Optional(
15
+ Type.Object({
16
+ traceparent: Type.String(),
17
+ tracestate: Type.String()
18
+ })
19
+ ),
14
20
  payload: t
15
21
  });
16
22
  var ControlMessageAckSchema = Type.Object({
@@ -48,7 +54,7 @@ var ControlMessagePayloadSchema = Type.Union([
48
54
  var OpaqueTransportMessageSchema = TransportMessageSchema(
49
55
  Type.Unknown()
50
56
  );
51
- function handshakeRequestMessage(from, to, sessionId, metadata) {
57
+ function handshakeRequestMessage(from, to, sessionId, metadata, tracing) {
52
58
  return {
53
59
  id: nanoid(),
54
60
  from,
@@ -57,6 +63,7 @@ function handshakeRequestMessage(from, to, sessionId, metadata) {
57
63
  ack: 0,
58
64
  streamId: nanoid(),
59
65
  controlFlags: 0,
66
+ tracing,
60
67
  payload: {
61
68
  type: "HANDSHAKE_REQ",
62
69
  protocolVersion: PROTOCOL_VERSION,
@@ -104,6 +111,11 @@ function coerceErrorString(err) {
104
111
  return `[coerced to error] ${String(err)}`;
105
112
  }
106
113
 
114
+ // tracing/index.ts
115
+ import { trace } from "@opentelemetry/api";
116
+ var tracer = trace.getTracer("river");
117
+ var tracing_default = tracer;
118
+
107
119
  export {
108
120
  TransportMessageSchema,
109
121
  PROTOCOL_VERSION,
@@ -116,6 +128,7 @@ export {
116
128
  isAck,
117
129
  isStreamOpen,
118
130
  isStreamClose,
131
+ tracing_default,
119
132
  coerceErrorString
120
133
  };
121
- //# sourceMappingURL=chunk-2Z2NE47H.js.map
134
+ //# sourceMappingURL=chunk-5WFL722S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../transport/message.ts","../util/stringify.ts","../tracing/index.ts"],"sourcesContent":["import { Type, TSchema, Static } from '@sinclair/typebox';\nimport { nanoid } from 'nanoid';\nimport { Connection, Session } from './session';\n\n/**\n * Control flags for transport messages.\n * An RPC message is coded with StreamOpenBit | StreamClosedBit.\n * Streams are expected to start with StreamOpenBit sent and the client SHOULD send an empty\n * message with StreamClosedBit to close the stream handler on the server, indicating that\n * it will not be using the stream anymore.\n */\nexport const enum ControlFlags {\n AckBit = 0b0001,\n StreamOpenBit = 0b0010,\n StreamClosedBit = 0b0100,\n}\n\n/**\n * Metadata associated with a handshake request, as sent by the client.\n *\n * You should use declaration merging to extend this interface\n * with whatever you need. For example, if you need to store an\n * identifier for the client, you could do:\n * ```\n * declare module '@replit/river' {\n * interface HandshakeMetadataClient {\n * id: string;\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface HandshakeRequestMetadata {}\n\n/**\n * Metadata associated with a handshake response, after the server\n * has processed the data in {@link HandshakeRequestMetadata}. This\n * is a separate interface for multiple reasons, but one of the main\n * ones is that the server should remove any sensitive data from the\n * client's request metadata before storing it in the session, that\n * way no secrets are persisted in memory.\n *\n * You should use declaration merging to extend this interface\n * with whatever you need. For example, if you need to store an\n * identifier for the client, you could do:\n * ```\n * declare module '@replit/river' {\n * interface HandshakeMetadataServer {\n * id: string;\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ParsedHandshakeMetadata {}\n\n/**\n * Options for extending the client handshake process.\n */\nexport interface ClientHandshakeOptions {\n /**\n * Schema for the metadata that the client sends to the server\n * during the handshake.\n *\n * Needs to match {@link HandshakeRequestMetadata}.\n */\n schema: TSchema;\n\n /**\n * Gets the {@link HandshakeRequestMetadata} to send to the server.\n */\n get: () => HandshakeRequestMetadata | Promise<HandshakeRequestMetadata>;\n}\n\n/**\n * Options for extending the server handshake process.\n */\nexport interface ServerHandshakeOptions {\n /**\n * Schema for the metadata that the server receives from the client\n * during the handshake.\n *\n * Needs to match {@link HandshakeRequestMetadata}.\n */\n requestSchema: TSchema;\n\n /**\n * Schema for the transformed metadata that is then associated with the\n * client's session.\n *\n * Needs to match {@link ParsedHandshakeMetadata}.\n */\n parsedSchema: TSchema;\n\n /**\n * Parses the {@link HandshakeRequestMetadata} sent by the client, transforming\n * it into {@link ParsedHandshakeMetadata}.\n *\n * May return `false` if the client should be rejected.\n *\n * @param metadata - The metadata sent by the client.\n * @param session - The session that the client would be associated with.\n * @param isReconnect - Whether the client is reconnecting to the session,\n * or if this is a new session.\n */\n parse: (\n metadata: HandshakeRequestMetadata,\n session: Session<Connection>,\n isReconnect: boolean,\n ) =>\n | false\n | ParsedHandshakeMetadata\n | Promise<false | ParsedHandshakeMetadata>;\n}\n\n/**\n * Generic Typebox schema for a transport message.\n * @template T The type of the payload.\n * @param {T} t The payload schema.\n * @returns The transport message schema.\n */\nexport const TransportMessageSchema = <T extends TSchema>(t: T) =>\n Type.Object({\n id: Type.String(),\n from: Type.String(),\n to: Type.String(),\n seq: Type.Integer(),\n ack: Type.Integer(),\n serviceName: Type.Optional(Type.String()),\n procedureName: Type.Optional(Type.String()),\n streamId: Type.String(),\n controlFlags: Type.Integer(),\n tracing: Type.Optional(\n Type.Object({\n traceparent: Type.String(),\n tracestate: Type.String(),\n }),\n ),\n payload: t,\n });\n\n/**\n * Defines the schema for a transport acknowledgement message. This is never constructed manually\n * and is only used internally by the library for tracking inflight messages.\n * @returns The transport message schema.\n */\nexport const ControlMessageAckSchema = Type.Object({\n type: Type.Literal('ACK'),\n});\n\n/**\n * Defines the schema for a transport close message. This is never constructed manually and is only\n * used internally by the library for closing and cleaning up streams.\n */\nexport const ControlMessageCloseSchema = Type.Object({\n type: Type.Literal('CLOSE'),\n});\n\nexport const PROTOCOL_VERSION = 'v1.1';\nexport const ControlMessageHandshakeRequestSchema = Type.Object({\n type: Type.Literal('HANDSHAKE_REQ'),\n protocolVersion: Type.String(),\n sessionId: Type.String(),\n metadata: Type.Optional(Type.Unknown()),\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 }),\n ]),\n});\n\nexport const ControlMessagePayloadSchema = Type.Union([\n ControlMessageCloseSchema,\n ControlMessageAckSchema,\n ControlMessageHandshakeRequestSchema,\n ControlMessageHandshakeResponseSchema,\n]);\n\n/**\n * Defines the schema for an opaque transport message that is agnostic to any\n * procedure/service.\n * @returns The transport message schema.\n */\nexport const OpaqueTransportMessageSchema = TransportMessageSchema(\n Type.Unknown(),\n);\n\n/**\n * Represents a transport message. This is the same type as {@link TransportMessageSchema} but\n * we can't statically infer generics from generic Typebox schemas so we have to define it again here.\n *\n * TypeScript can't enforce types when a bitmask is involved, so these are the semantics of\n * `controlFlags`:\n * * If `controlFlags & StreamOpenBit == StreamOpenBit`, `streamId` must be set to a unique value\n * (suggestion: use `nanoid`).\n * * If `controlFlags & StreamOpenBit == StreamOpenBit`, `serviceName` and `procedureName` must be set.\n * * If `controlFlags & StreamClosedBit == StreamClosedBit` and the kind is `stream` or `subscription`,\n * `payload` should be discarded (usually contains a control message).\n * * If `controlFlags & AckBit == AckBit`, the message is an explicit acknowledgement message and doesn't\n * contain any payload that is relevant to the application so should not be delivered.\n * @template Payload The type of the payload.\n */\nexport interface TransportMessage<Payload = unknown> {\n id: string;\n from: string;\n to: string;\n seq: number;\n ack: number;\n serviceName?: string;\n procedureName?: string;\n streamId: string;\n controlFlags: number;\n tracing?: { traceparent: string; tracestate: string };\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: TransportClientId,\n to: TransportClientId,\n sessionId: string,\n metadata?: HandshakeRequestMetadata,\n tracing?: { traceparent: string; tracestate: string },\n): TransportMessage<Static<typeof ControlMessageHandshakeRequestSchema>> {\n return {\n id: nanoid(),\n from,\n to,\n seq: 0,\n ack: 0,\n streamId: nanoid(),\n controlFlags: 0,\n tracing,\n payload: {\n type: 'HANDSHAKE_REQ',\n protocolVersion: PROTOCOL_VERSION,\n sessionId,\n metadata,\n } satisfies Static<typeof ControlMessageHandshakeRequestSchema>,\n };\n}\n\nexport function handshakeResponseMessage(\n from: TransportClientId,\n to: TransportClientId,\n status: Static<typeof ControlMessageHandshakeResponseSchema>['status'],\n): TransportMessage<Static<typeof ControlMessageHandshakeResponseSchema>> {\n return {\n id: nanoid(),\n from,\n to,\n seq: 0,\n ack: 0,\n streamId: nanoid(),\n controlFlags: 0,\n payload: {\n type: 'HANDSHAKE_RESP',\n status,\n } satisfies Static<typeof ControlMessageHandshakeResponseSchema>,\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","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 { trace } from '@opentelemetry/api';\n\nconst tracer = trace.getTracer('river');\nexport default tracer;\n"],"mappings":"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","names":[]}