@hediet/linkrpc 0.0.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 (39) hide show
  1. package/README.md +383 -0
  2. package/dist/chunks/_empty-crypto-Bi0tGx5K.js +8 -0
  3. package/dist/chunks/boundedTrafficSubscription-1L592xc7.js +1126 -0
  4. package/dist/chunks/boundedTrafficSubscription-1L592xc7.js.map +1 -0
  5. package/dist/chunks/hub.interfaces-BzWfsVT2.js +526 -0
  6. package/dist/chunks/hub.interfaces-BzWfsVT2.js.map +1 -0
  7. package/dist/chunks/hubAccess-DwTZPiI8.d.ts +79 -0
  8. package/dist/chunks/hubAccess-DwTZPiI8.d.ts.map +1 -0
  9. package/dist/chunks/hubFacade-CQflVkVC.js +85 -0
  10. package/dist/chunks/hubFacade-CQflVkVC.js.map +1 -0
  11. package/dist/chunks/hubFacade-Dkgw2pTi.d.ts +101 -0
  12. package/dist/chunks/hubFacade-Dkgw2pTi.d.ts.map +1 -0
  13. package/dist/chunks/linkRpcConnection-CtlQmetO.d.ts +3623 -0
  14. package/dist/chunks/linkRpcConnection-CtlQmetO.d.ts.map +1 -0
  15. package/dist/chunks/rolldown-runtime-4LSo1kEK.js +17 -0
  16. package/dist/chunks/src-D3NUIwyo.js +7795 -0
  17. package/dist/chunks/src-D3NUIwyo.js.map +1 -0
  18. package/dist/hub/client/index.d.ts +50 -0
  19. package/dist/hub/client/index.d.ts.map +1 -0
  20. package/dist/hub/client/index.js +97 -0
  21. package/dist/hub/client/index.js.map +1 -0
  22. package/dist/hub/common/index.d.ts +1189 -0
  23. package/dist/hub/common/index.d.ts.map +1 -0
  24. package/dist/hub/common/index.js +267 -0
  25. package/dist/hub/common/index.js.map +1 -0
  26. package/dist/index.d.ts +6 -0
  27. package/dist/index.js +7 -0
  28. package/dist/inspection/index.d.ts +66 -0
  29. package/dist/inspection/index.d.ts.map +1 -0
  30. package/dist/inspection/index.js +6 -0
  31. package/dist/node.d.ts +548 -0
  32. package/dist/node.d.ts.map +1 -0
  33. package/dist/node.js +1087 -0
  34. package/dist/node.js.map +1 -0
  35. package/dist/web.d.ts +44 -0
  36. package/dist/web.d.ts.map +1 -0
  37. package/dist/web.js +58 -0
  38. package/dist/web.js.map +1 -0
  39. package/package.json +59 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundedTrafficSubscription-1L592xc7.js","names":["zVoid","zAny","zVoid","zEnum"],"sources":["../../src/schema/normalize.ts","../../src/schema/memberTypes.ts","../../src/protocol/jcs.ts","../../src/crypto/sha256.ts","../../src/schema/hash.ts","../../src/connection/interfaceDefinition.ts","../../src/inspection/inspection.interfaces.ts","../../src/inspection/node.interfaces.ts","../../src/inspection/trafficFlowFilter.ts","../../src/inspection/boundedTrafficSubscription.ts"],"sourcesContent":["import type { LinkRpcJsonSchema, DiscriminatorSchema } from \"./linkRpcJsonSchema\";\n\n/**\n * Keys that describe structural shape and are part of the decidable subset.\n * Everything else gets stripped during normalization.\n *\n * Note: `not` is intentionally NOT in this list. The special case `{\"not\":{}}`\n * (i.e. matches-nothing) is mapped to the literal `false` bottom; any other\n * `not` is dropped.\n */\nconst KEPT_KEYS = new Set([\n \"type\", \"format\",\n \"properties\", \"required\", \"additionalProperties\",\n \"items\", \"prefixItems\",\n \"const\", \"enum\",\n \"anyOf\", \"oneOf\", \"discriminator\",\n \"$ref\",\n \"title\", \"description\",\n]);\n\n/**\n * Normalize raw JSON Schema output (e.g. from `z.toJSONSchema`) into the\n * SvcJsonSchema subset:\n *\n * - drop annotation keys (`examples`, `default`, `$comment`, `readOnly`, ...)\n * - drop out-of-subset refinements (`pattern`, `minimum`, `multipleOf`,\n * `allOf`, `oneOf`, `if/then/else`, `patternProperties`, ...)\n * - empty schema `{}` ⇒ `true` (top)\n * - `{\"not\":{}}` ⇒ `false` (bottom); any other `not` is stripped\n * - `type:\"object\"` without `additionalProperties` ⇒ closed (`false`),\n * matching linkrpc's stricter contract\n *\n * The output is canonical: structurally equal inputs produce structurally\n * equal outputs, which is what `computeInterfaceHash` relies on.\n */\nexport function normalizeJsonSchema(raw: unknown): LinkRpcJsonSchema {\n if (raw === true || raw === false) return raw;\n if (raw === null || typeof raw !== \"object\") {\n throw new Error(`normalizeJsonSchema: expected object, got ${typeof raw}`);\n }\n if (Array.isArray(raw)) {\n throw new Error(\"normalizeJsonSchema: expected object, got array\");\n }\n\n const r = raw as Record<string, unknown>;\n\n // {\"not\": {}} => false (bottom). Handle before generic descent.\n if (\"not\" in r && isEmptyObject(r[\"not\"])) return false;\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(r)) {\n if (!KEPT_KEYS.has(k)) continue;\n const normalized = normalizeChild(k, v);\n if (normalized === undefined) continue;\n out[k] = normalized;\n }\n\n // Object: linkrpc requires `additionalProperties` to be set. Default to\n // closed, matching what zod typically emits for `z.object`.\n if (out[\"type\"] === \"object\" && !(\"additionalProperties\" in out)) {\n out[\"additionalProperties\"] = false;\n }\n\n // `oneOf`: if no explicit `discriminator` survived, try to synthesize\n // one from the branches. Zod's `z.discriminatedUnion` lowers via\n // `z.toJSONSchema` to `oneOf` without a `discriminator` keyword, so\n // without this auto-detection the tag information is invisible to\n // consumers (codegen, consent UIs).\n if (Array.isArray(out[\"oneOf\"]) && !(\"discriminator\" in out)) {\n const detected = _detectDiscriminator(out[\"oneOf\"] as LinkRpcJsonSchema[]);\n if (detected !== undefined) out[\"discriminator\"] = detected;\n }\n\n // Drop a `discriminator` that has no `oneOf` to attach to — it would be\n // meaningless and would just bloat the hash.\n if (\"discriminator\" in out && !Array.isArray(out[\"oneOf\"])) {\n delete out[\"discriminator\"];\n }\n\n // Collapse empty into `true` (top).\n if (Object.keys(out).length === 0) return true;\n\n return out as unknown as LinkRpcJsonSchema;\n}\n\nfunction normalizeChild(key: string, v: unknown): unknown {\n switch (key) {\n case \"properties\": {\n if (!isPlainObject(v)) return {};\n const out: Record<string, LinkRpcJsonSchema> = {};\n for (const [pk, pv] of Object.entries(v)) {\n out[pk] = normalizeJsonSchema(pv);\n }\n return out;\n }\n case \"items\":\n case \"additionalProperties\": {\n if (v === false) return false;\n return normalizeJsonSchema(v);\n }\n case \"prefixItems\":\n case \"anyOf\":\n case \"oneOf\": {\n if (!Array.isArray(v)) return [];\n return v.map((s) => normalizeJsonSchema(s));\n }\n case \"discriminator\": {\n // Only `propertyName` is part of the subset. OpenAPI's `mapping`\n // (and anything else) is dropped — we have no use for it and it\n // would complicate hashing.\n if (!isPlainObject(v)) return undefined;\n const name = (v as Record<string, unknown>)[\"propertyName\"];\n if (typeof name !== \"string\" || name.length === 0) return undefined;\n return { propertyName: name };\n }\n case \"enum\": {\n if (!Array.isArray(v)) return [];\n return v.slice();\n }\n case \"required\": {\n if (!Array.isArray(v)) return [];\n return v.slice().sort();\n }\n default:\n return v;\n }\n}\n\nfunction isEmptyObject(v: unknown): boolean {\n return isPlainObject(v) && Object.keys(v).length === 0;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === \"object\" && !Array.isArray(v);\n}\n\n/**\n * Inspect a `oneOf` branch list and return a `discriminator` hint when\n * every branch is an object schema and there is exactly one property name\n * that appears in every branch with a distinct `const`-valued schema.\n *\n * This is the canonical JSON-Schema-only encoding of a tagged union, and\n * the shape `z.toJSONSchema(z.discriminatedUnion(...))` emits.\n */\nfunction _detectDiscriminator(branches: LinkRpcJsonSchema[]): DiscriminatorSchema | undefined {\n if (branches.length < 2) return undefined;\n // Each branch must be an object schema with `properties`.\n const branchPropsList: Record<string, LinkRpcJsonSchema>[] = [];\n for (const b of branches) {\n if (b === true || b === false) return undefined;\n if ((b as { type?: string }).type !== \"object\") return undefined;\n const props = (b as { properties?: Record<string, LinkRpcJsonSchema> }).properties;\n if (!props) return undefined;\n branchPropsList.push(props);\n }\n // Property names present (with a `const`-valued schema) on every branch.\n const firstConstProps = _constPropNames(branchPropsList[0]);\n let candidates = firstConstProps;\n for (let i = 1; i < branchPropsList.length; i++) {\n candidates = candidates.filter((n) => _constPropNames(branchPropsList[i]).includes(n));\n if (candidates.length === 0) return undefined;\n }\n // Of the surviving candidates, keep those whose const values are\n // pairwise distinct across all branches (a real discriminator).\n for (const name of candidates) {\n const seen = new Set<string>();\n let allDistinct = true;\n for (const props of branchPropsList) {\n const s = props[name] as { const?: unknown };\n const key = JSON.stringify(s.const);\n if (seen.has(key)) { allDistinct = false; break; }\n seen.add(key);\n }\n if (allDistinct) return { propertyName: name };\n }\n return undefined;\n}\n\nfunction _constPropNames(props: Record<string, LinkRpcJsonSchema>): string[] {\n const out: string[] = [];\n for (const [k, v] of Object.entries(props)) {\n if (v === true || v === false) continue;\n if (\"const\" in (v as object)) out.push(k);\n }\n return out;\n}\n","import { void as zVoid } from 'zod/mini';\nimport { toJSONSchema, type $ZodType } from 'zod/v4/core';\nimport { normalizeJsonSchema } from './normalize';\nimport type { MemberAnnotations } from './linkRpcInterfaceSchema';\nimport type { LinkRpcJsonSchema } from './linkRpcJsonSchema';\n\n/**\n * The schema type linkrpc accepts everywhere: the zod *core* base shared by\n * both classic `zod` and `zod/mini`. Typing against it (instead of classic\n * `z.ZodType`) lets callers author interfaces with either flavour — classic\n * for ergonomics, mini for minimal bundle size — while linkrpc's own internal\n * interfaces use mini. `O` is the validated output type.\n */\nexport type Schema<O = unknown> = $ZodType<O>;\n\n/**\n * Marker base for a typed method member. Carries enough metadata to:\n * - validate / parse params at runtime (via the zod schemas),\n * - emit a JSON schema for reflection,\n * - propagate TS types up to the interface definition.\n */\nexport type MemberType = RequestType<any, any, any, any, any> | NotificationType<any>;\n\n/**\n * Optional documentation for a method member.\n *\n * - `description` is the **normative** contract of the method (included in the\n * interface hash — changing it changes `schemaHash`).\n * - `comment` is non-normative implementation notes (stripped from the hash).\n * - `annotations` are normative behavioral claims (e.g. `readOnly`,\n * `idempotent`); included in the hash.\n */\nexport interface MemberDocs {\n description?: string;\n comment?: string;\n annotations?: MemberAnnotations;\n}\n\nexport class RequestType<\n TParams = unknown,\n TResult = void,\n TError = void,\n TClientStream = never,\n TServerStream = never,\n> {\n public readonly kind = 'request' as const;\n\n constructor(\n public readonly paramsSchema: Schema<TParams>,\n public readonly resultSchema: Schema<TResult>,\n public readonly errorSchema: Schema<TError>,\n public readonly docs: MemberDocs = {},\n /**\n * Schema for stream messages the **client** may emit on an\n * in-flight call (e.g. cancellation, input). `undefined` means\n * the client may not stream on this method.\n */\n public readonly clientStreamSchema?: Schema<TClientStream>,\n /**\n * Schema for stream messages the **server** may emit while\n * handling an in-flight call (e.g. progress, partial results).\n * `undefined` means the server may not stream on this method.\n */\n public readonly serverStreamSchema?: Schema<TServerStream>,\n ) { }\n\n /** Phantom field — typed-only, do not access at runtime. */\n declare readonly _params: TParams;\n declare readonly _result: TResult;\n declare readonly _error: TError;\n declare readonly _clientStream: TClientStream;\n declare readonly _serverStream: TServerStream;\n\n /**\n * Return a copy of this request type with stream payload schemas\n * attached. Pass `undefined` for either direction to leave it\n * closed.\n */\n public withStream<TClient = TClientStream, TServer = TServerStream>(\n opts: {\n client?: Schema<TClient>;\n server?: Schema<TServer>;\n },\n ): RequestType<TParams, TResult, TError, TClient, TServer> {\n return new RequestType<TParams, TResult, TError, TClient, TServer>(\n this.paramsSchema,\n this.resultSchema,\n this.errorSchema,\n this.docs,\n opts.client,\n opts.server,\n );\n }\n}\n\nexport class NotificationType<TParams = unknown> {\n public readonly kind = 'notification' as const;\n\n constructor(\n public readonly paramsSchema: Schema<TParams>,\n public readonly docs: MemberDocs = {},\n ) { }\n\n declare readonly _params: TParams;\n}\n\n/**\n * Define a request method.\n *\n * @example\n * bar: requestType(z.object({ to: z.string() }), z.string(), {\n * description: \"MUST resolve before the next call from the same caller.\",\n * })\n */\nexport function requestType<\n TParams,\n TResult = void,\n TError = void,\n>(\n params: Schema<TParams>,\n result?: Schema<TResult>,\n docsOrError?: MemberDocs | Schema<TError>,\n maybeDocs?: MemberDocs,\n): RequestType<TParams, TResult, TError> {\n // A zod schema (params/result/error) vs. a `MemberDocs` object: every\n // Zod 4 schema carries the `_zod` marker (the library-author–blessed way\n // to detect one — see zod's \"For library authors\" guide), which plain\n // docs objects never have. Works for both classic and mini schemas.\n const isErrorSchema = (v: unknown): v is Schema<TError> =>\n typeof v === 'object' && v !== null && '_zod' in v;\n\n const error = isErrorSchema(docsOrError) ? docsOrError : undefined;\n const docs = (!isErrorSchema(docsOrError) ? docsOrError : maybeDocs) ?? {};\n\n return new RequestType(\n params,\n result ?? (zVoid() as unknown as Schema<TResult>),\n error ?? (zVoid() as unknown as Schema<TError>),\n docs,\n );\n}\n\n/**\n * Define a notification method.\n *\n * @example\n * foo: notificationType(z.object({ message: z.string() }))\n */\nexport function notificationType<TParams>(\n params: Schema<TParams>,\n docs: MemberDocs = {},\n): NotificationType<TParams> {\n return new NotificationType(params, docs);\n}\n\nexport interface ZodToSvcJsonSchemaOptions {\n readonly methodName: string;\n readonly schemaPosition: string;\n readonly components: Record<string, LinkRpcJsonSchema>;\n}\n\n/** Convert a zod schema to our restricted SvcJsonSchema subset. */\nexport function zodToSvcJsonSchema(\n schema: Schema,\n options?: ZodToSvcJsonSchemaOptions,\n): LinkRpcJsonSchema {\n // `z.void()` / `z.undefined()` have no JSON-Schema representation —\n // `toJSONSchema` throws on them. Treat them as the trivially-true\n // schema (matches anything); JSON-RPC drops `undefined` from the wire\n // anyway, so this is the right structural answer for \"no value\".\n const type = (schema as { _zod?: { def?: { type?: string; }; }; })._zod?.def?.type;\n if (type === 'void' || type === 'undefined') return true;\n return normalizeZodJsonSchema(toJSONSchema(schema), options);\n}\n\nfunction normalizeZodJsonSchema(\n raw: unknown,\n options: ZodToSvcJsonSchemaOptions | undefined,\n): LinkRpcJsonSchema {\n if (!isRecord(raw)) return normalizeJsonSchema(raw);\n\n const definitions = isRecord(raw.$defs) ? raw.$defs : {};\n const localRefs = collectLocalRefs(raw);\n if (Object.keys(definitions).length === 0 && localRefs.size === 0) {\n return normalizeJsonSchema(raw);\n }\n if (options === undefined) {\n throw new Error(\n 'zodToSvcJsonSchema: local references require a component destination',\n );\n }\n\n const componentNamePrefix =\n `method=${encodeComponentNamePart(options.methodName)}` +\n `&schema=${encodeComponentNamePart(options.schemaPosition)}`;\n const definitionComponents = new Map<string, string>();\n for (const definitionName of Object.keys(definitions)) {\n definitionComponents.set(\n definitionName,\n `${componentNamePrefix}&def=${encodeComponentNamePart(definitionName)}`,\n );\n }\n const rootComponent = localRefs.has('#')\n ? `${componentNamePrefix}&root`\n : undefined;\n const rewrite = (value: unknown): unknown =>\n rewriteLocalRefs(value, definitionComponents, rootComponent);\n\n for (const [definitionName, definition] of Object.entries(definitions)) {\n const componentName = definitionComponents.get(definitionName);\n if (componentName === undefined) {\n throw new Error(`zodToSvcJsonSchema: missing component for \"${definitionName}\"`);\n }\n addComponent(\n options.components,\n componentName,\n normalizeJsonSchema(rewrite(definition)),\n );\n }\n\n const root = rewrite(raw);\n if (rootComponent !== undefined) {\n addComponent(options.components, rootComponent, normalizeJsonSchema(root));\n return { $ref: componentRef(rootComponent) };\n }\n return normalizeJsonSchema(root);\n}\n\nfunction collectLocalRefs(value: unknown, refs = new Set<string>()): ReadonlySet<string> {\n if (Array.isArray(value)) {\n for (const child of value) collectLocalRefs(child, refs);\n return refs;\n }\n if (!isRecord(value)) return refs;\n if (typeof value.$ref === 'string' && value.$ref.startsWith('#')) {\n refs.add(value.$ref);\n }\n for (const child of Object.values(value)) collectLocalRefs(child, refs);\n return refs;\n}\n\nfunction rewriteLocalRefs(\n value: unknown,\n definitionComponents: ReadonlyMap<string, string>,\n rootComponent: string | undefined,\n): unknown {\n if (Array.isArray(value)) {\n return value.map((child) =>\n rewriteLocalRefs(child, definitionComponents, rootComponent));\n }\n if (!isRecord(value)) return value;\n\n const result: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n if (key === '$defs') continue;\n if (key === '$ref' && typeof child === 'string') {\n result[key] = rewriteLocalRef(child, definitionComponents, rootComponent);\n } else {\n result[key] = rewriteLocalRefs(child, definitionComponents, rootComponent);\n }\n }\n return result;\n}\n\nfunction rewriteLocalRef(\n ref: string,\n definitionComponents: ReadonlyMap<string, string>,\n rootComponent: string | undefined,\n): string {\n if (ref === '#') {\n if (rootComponent === undefined) {\n throw new Error('zodToSvcJsonSchema: root reference has no component destination');\n }\n return componentRef(rootComponent);\n }\n\n const definitionPrefix = '#/$defs/';\n if (ref.startsWith(definitionPrefix)) {\n const encodedName = ref.slice(definitionPrefix.length);\n const definitionName = [...definitionComponents.keys()]\n .find((name) => encodeJsonPointerSegment(name) === encodedName);\n const componentName = definitionName === undefined\n ? undefined\n : definitionComponents.get(definitionName);\n if (componentName === undefined) {\n throw new Error(`zodToSvcJsonSchema: dangling local reference \"${ref}\"`);\n }\n return componentRef(componentName);\n }\n\n if (ref.startsWith('#') && !ref.startsWith('#/components/schemas/')) {\n throw new Error(`zodToSvcJsonSchema: unsupported local reference \"${ref}\"`);\n }\n return ref;\n}\n\nfunction addComponent(\n components: Record<string, LinkRpcJsonSchema>,\n name: string,\n schema: LinkRpcJsonSchema,\n): void {\n if (Object.hasOwn(components, name)) {\n throw new Error(`zodToSvcJsonSchema: duplicate component name \"${name}\"`);\n }\n components[name] = schema;\n}\n\nfunction componentRef(name: string): string {\n return `#/components/schemas/${encodeJsonPointerSegment(name)}`;\n}\n\nfunction encodeJsonPointerSegment(value: string): string {\n return value.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n\nfunction encodeComponentNamePart(value: string): string {\n return encodeURIComponent(value).replace(/~/g, '%7E');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n","/**\n * RFC 8785 JSON Canonicalization Scheme (JCS).\n *\n * Used as the byte-deterministic encoding under every linkrpc signature\n * (RPC calls, capabilities, hub-signed previews). Both signer and verifier\n * canonicalize the same value object and obtain byte-identical UTF-8 bytes.\n *\n * Implementation inlined from the `canonicalize` npm package (Apache-2.0,\n * https://github.com/erdtman/canonicalize) so this module stays\n * zero-dependency for browser bundlers that don't resolve transitive\n * npm specifiers (e.g. the in-house app-bundler).\n */\n\n\n/** RFC 8785 canonical JSON string for `value`. */\nexport function jcsCanonicalize(value: unknown): string {\n const out = _canonicalize(value);\n if (out === undefined) {\n throw new Error(\"jcsCanonicalize: value is not JSON-representable\");\n }\n return out;\n}\n\nconst _encoder = new TextEncoder();\n\n/** UTF-8 bytes of the RFC 8785 canonical JSON for `value`. The thing actually signed / hashed. */\nexport function jcsCanonicalizeBytes(value: unknown): Uint8Array {\n return _encoder.encode(jcsCanonicalize(value));\n}\n\nfunction _canonicalize(object: unknown, seen: Set<object> = new Set()): string | undefined {\n if (typeof object === \"number\" && Number.isNaN(object)) {\n throw new Error(\"NaN is not allowed\");\n }\n if (typeof object === \"number\" && !Number.isFinite(object)) {\n throw new Error(\"Infinity is not allowed\");\n }\n if (object === null || typeof object !== \"object\") {\n return JSON.stringify(object);\n }\n\n const obj = object as { toJSON?: () => unknown } & Record<string, unknown>;\n\n if (typeof obj.toJSON === \"function\") {\n if (seen.has(obj)) throw new Error(\"Circular reference detected\");\n seen.add(obj);\n const result = _canonicalize(obj.toJSON(), seen);\n seen.delete(obj);\n return result;\n }\n\n if (seen.has(obj)) throw new Error(\"Circular reference detected\");\n seen.add(obj);\n\n let result: string;\n if (Array.isArray(obj)) {\n const values = obj.map((cv) => {\n const value = cv === undefined || typeof cv === \"symbol\" ? null : cv;\n return _canonicalize(value, seen);\n });\n result = `[${values.join(\",\")}]`;\n } else {\n const parts: string[] = [];\n for (const key of Object.keys(obj).sort()) {\n const v = obj[key];\n if (v === undefined || typeof v === \"symbol\") continue;\n parts.push(`${JSON.stringify(key)}:${_canonicalize(v, seen)}`);\n }\n result = `{${parts.join(\",\")}}`;\n }\n\n seen.delete(obj);\n return result;\n}\n","/**\n * Pure-JS SHA-256 (RFC 6234 / FIPS 180-4). Synchronous, dependency-free,\n * isomorphic. Used internally by linkrpc for content-hashing interface\n * schemas and deriving identity slot names; also surfaced through the\n * `crypto` API as `crypto.sha256`. For signature work we go through the\n * `crypto` module (`./identity/crypto`).\n *\n * Replaces the previous `@noble/hashes/sha2` import so the bundle has\n * no runtime npm dependencies. Trades the well-vetted dep for ~80 lines\n * of straight-line code that has no branching on input contents and is\n * exercised by the existing test vectors plus `sha256.test.ts`.\n */\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nfunction _rotr(x: number, n: number): number {\n return (x >>> n) | (x << (32 - n));\n}\n\nexport function sha256(data: Uint8Array): Uint8Array {\n const inputLen = data.length;\n const bitLen = inputLen * 8;\n // Round up to next 64-byte block leaving room for 0x80 marker + 8-byte length.\n const paddedLen = (inputLen + 9 + 63) & ~63;\n const padded = new Uint8Array(paddedLen);\n padded.set(data);\n padded[inputLen] = 0x80;\n\n const view = new DataView(padded.buffer);\n // Big-endian 64-bit bit length. Bottom 32 bits hold values < 2^32 bits = 2^29 bytes (~512 MiB).\n view.setUint32(paddedLen - 8, Math.floor(bitLen / 0x1_0000_0000), false);\n view.setUint32(paddedLen - 4, bitLen >>> 0, false);\n\n const H = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n ]);\n const W = new Uint32Array(64);\n\n for (let block = 0; block < paddedLen; block += 64) {\n for (let t = 0; t < 16; t++) {\n W[t] = view.getUint32(block + t * 4, false);\n }\n for (let t = 16; t < 64; t++) {\n const w15 = W[t - 15];\n const w2 = W[t - 2];\n const s0 = _rotr(w15, 7) ^ _rotr(w15, 18) ^ (w15 >>> 3);\n const s1 = _rotr(w2, 17) ^ _rotr(w2, 19) ^ (w2 >>> 10);\n W[t] = (W[t - 16] + s0 + W[t - 7] + s1) >>> 0;\n }\n\n let a = H[0], b = H[1], c = H[2], d = H[3];\n let e = H[4], f = H[5], g = H[6], h = H[7];\n for (let t = 0; t < 64; t++) {\n const S1 = _rotr(e, 6) ^ _rotr(e, 11) ^ _rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + S1 + ch + K[t] + W[t]) >>> 0;\n const S0 = _rotr(a, 2) ^ _rotr(a, 13) ^ _rotr(a, 22);\n const mj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (S0 + mj) >>> 0;\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n H[0] = (H[0] + a) >>> 0;\n H[1] = (H[1] + b) >>> 0;\n H[2] = (H[2] + c) >>> 0;\n H[3] = (H[3] + d) >>> 0;\n H[4] = (H[4] + e) >>> 0;\n H[5] = (H[5] + f) >>> 0;\n H[6] = (H[6] + g) >>> 0;\n H[7] = (H[7] + h) >>> 0;\n }\n\n const out = new Uint8Array(32);\n const outView = new DataView(out.buffer);\n for (let i = 0; i < 8; i++) outView.setUint32(i * 4, H[i], false);\n return out;\n}\n","import { jcsCanonicalize } from \"../protocol/jcs\";\nimport { sha256 } from \"../crypto/sha256\";\nimport type { LinkRpcInterfaceSchema, MethodSchema } from \"./linkRpcInterfaceSchema\";\nimport { normalizeJsonSchema } from \"./normalize\";\n\nconst methodSchemaFields = [\n \"params\",\n \"result\",\n \"clientStream\",\n \"serverStream\",\n] as const;\n\n/**\n * Compute the interface hash: SHA-256 of the canonicalized schema, truncated\n * to 16 hex chars (64 bits of collision budget per id).\n *\n * Canonicalization strips the schema down to its **normative wire-contract\n * projection** before hashing, so a single interface document can carry richer\n * non-normative material (codegen hints, safety expressions, notes) without\n * changing identity:\n *\n * 1. Normalize every JSON-Schema position (`params`, `result`, streams, and\n * `components.schemas`) onto the decidable linkrpc subset.\n * 2. Strip every `comment` field (non-normative — must not affect identity).\n * `description` is NORMATIVE and kept in the hash.\n * 3. Strip every **specification-extension** field — any object key whose name\n * begins with `x-` — at every level of the document (see\n * {@link EXTENSION_PREFIX}). This is the minimal, explicit \"one document,\n * two views\" mechanism: the stored document keeps the rich `x-…`\n * expressions; identity hashes only the simple contract. It mirrors\n * OpenRPC/OpenAPI specification extensions (this schema format is a subset\n * of OpenRPC 1.x). Editing an `x-…` value never changes the hash; changing\n * a wire field (`params`, `result`, member names, `type`, `required`,\n * `description`, `annotations`, …) does.\n * 4. Omit the top-level `hash` field itself.\n * 5. RFC 8785 JCS encode (recursive key sort, no whitespace) via {@link jcsCanonicalize}.\n *\n * Because no interface schema uses `x-…` keys today, this preserves every\n * existing hash: stripping a set of keys that are always absent is a no-op.\n *\n * > Reservation. `x-…` is reserved for non-normative extensions at every level.\n * > Member names cannot collide (they are alphanumeric per chapter 01 §2), and\n * > object property names in the JSON Schema subset MUST NOT begin with `x-`.\n */\nexport function computeInterfaceHash(schema: LinkRpcInterfaceSchema): string {\n const normalized = normalizeSchemaPositions(schema);\n const json = jcsCanonicalize(stripNonNormative(normalized, /* isRoot */ true));\n const digest = sha256(new TextEncoder().encode(json));\n const result = Array.from(digest.subarray(0, 8), (b) =>\n b.toString(16).padStart(2, \"0\")\n ).join(\"\");\n return result;\n}\n\nfunction normalizeSchemaPositions(schema: LinkRpcInterfaceSchema): LinkRpcInterfaceSchema {\n const methods: LinkRpcInterfaceSchema[\"methods\"] = Object.fromEntries(\n Object.entries(schema.methods).map(([name, method]) => {\n const normalized: MethodSchema = { ...method };\n for (const field of methodSchemaFields) {\n const value = normalized[field];\n if (value !== undefined) {\n normalized[field] = normalizeJsonSchema(value);\n }\n }\n return [name, normalized];\n }),\n );\n const componentSchemas = schema.components?.schemas;\n const components = componentSchemas === undefined\n ? schema.components\n : {\n ...schema.components,\n schemas: Object.fromEntries(\n Object.entries(componentSchemas).map(([name, value]) => [\n name,\n normalizeJsonSchema(value),\n ]),\n ),\n };\n return {\n ...schema,\n methods,\n ...(components === undefined ? {} : { components }),\n };\n}\n\n/**\n * Prefix marking a non-normative **specification-extension** key. Any object\n * key beginning with this prefix is stripped before hashing (at every level),\n * exactly like `comment`. Reserved for rich, identity-neutral material such as\n * codegen directives, richer validation/safety expressions, or tooling hints.\n */\nexport const EXTENSION_PREFIX = \"x-\";\n\n/** True for a key that must not contribute to the interface hash. */\nfunction isNonNormativeKey(key: string, isRoot: boolean): boolean {\n return (\n key === \"comment\" ||\n key.startsWith(EXTENSION_PREFIX) ||\n (isRoot && key === \"hash\")\n );\n}\n\nfunction stripNonNormative(value: unknown, isRoot = false): unknown {\n if (value === null || typeof value !== \"object\") return value;\n if (Array.isArray(value)) return value.map((v) => stripNonNormative(v));\n\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(value as Record<string, unknown>)) {\n if (isNonNormativeKey(k, isRoot)) continue;\n const v = (value as Record<string, unknown>)[k];\n if (v === undefined) continue;\n out[k] = stripNonNormative(v);\n }\n return out;\n}\n","import { any as zAny, void as zVoid } from 'zod/mini';\nimport type { RequestId } from '../protocol/jsonRpc';\nimport { computeInterfaceHash } from '../schema/hash';\nimport {\n type MemberType,\n NotificationType,\n RequestType,\n type Schema,\n zodToSvcJsonSchema,\n} from '../schema/memberTypes';\nimport type { MethodSchema, LinkRpcInterfaceSchema } from '../schema/linkRpcInterfaceSchema';\nimport type { LinkRpcJsonSchema } from '../schema/linkRpcJsonSchema';\n\n/**\n * Per-call stream API handed to a request handler as its third argument.\n * Allows the handler to consume {@link STREAM_METHOD} notifications\n * emitted by the caller (`onMessage`) and emit stream notifications to\n * the caller (`send`) while the request is in flight.\n *\n * Members are typed by the originating method's\n * {@link RequestType.clientStreamSchema} / `serverStreamSchema`.\n * Streams whose schema is `undefined` make the corresponding member\n * effectively unusable: `send` is typed `(payload: never) => void` and\n * the registered `onMessage` listener can never fire because the\n * receiver-side validator rejects the wire payload.\n */\nexport interface StreamApi<TClient = unknown, TServer = unknown> {\n /** Emit a server→client stream message. */\n send(payload: TServer): Promise<void>;\n /**\n * Register a listener for client→server stream messages on this\n * request. Calling twice replaces the previous listener.\n */\n onMessage(listener: (payload: TClient) => void): void;\n /**\n * Liveness probe toward the caller: resolves once the caller\n * acknowledges with a matching pong, rejects if the call settles\n * first. Independent of the channel's automatic keepalive ping.\n */\n ping(): Promise<void>;\n /**\n * Aborts when the caller cancels this in-flight request, or when the\n * hub cancels it on the caller's behalf (caller disconnect / idle\n * timeout). Observe it to stop work early and settle the request\n * (e.g. `signal.throwIfAborted()`), which surfaces as a `cancelled`\n * error to the caller.\n */\n readonly signal: AbortSignal;\n}\n\nexport interface InterfaceInfo {\n id: string;\n /**\n * Normative description of the interface (markdown). Part of the\n * interface hash — changing it is a contract change.\n */\n description?: string;\n /** Non-normative implementation notes. Stripped from the hash. */\n comment?: string;\n /**\n * Optional expected content hash (see `computeInterfaceHash`). When\n * set, {@link InterfaceDefinition}'s constructor verifies that the\n * computed {@link InterfaceDefinition.schemaHash} matches and throws\n * otherwise — a guard against silent contract drift when the wire\n * shape changes but a pinned hash was not updated.\n */\n hash?: string;\n}\n\n\nexport type MemberMap = Record<string, MemberType>;\n\n/** Stable wire identity of one member in an interface definition. */\nexport interface InterfaceMemberRef<TName extends string = string> {\n readonly interfaceId: string;\n readonly interfaceHash: string;\n readonly member: TName;\n}\n\nexport type InterfaceMemberRefMap<TMembers extends MemberMap> = {\n readonly [K in keyof TMembers & string]: InterfaceMemberRef<K>;\n};\n\n/**\n * Per-call options accepted by a streaming-enabled client method. Currently\n * only `onMessage` for consuming server→client stream notifications; the\n * caller addresses client→server stream messages via the returned\n * {@link StreamingCall}.\n */\nexport interface StreamCallOptions<TServer> {\n /** Listener for server→client stream messages on this in-flight call. */\n onMessage?: (payload: TServer) => void;\n}\n\n/**\n * Return shape of a streaming-enabled client method. Behaves as a\n * `Promise<TResult>` for the final response, and exposes `send` for\n * emitting client→server stream messages on the in-flight call. The\n * wire request id is also exposed (resolved once the request has\n * been allocated).\n *\n * For methods whose interface schema declares no client stream\n * (`TClient = never`), `send` is typed `(payload: never) => Promise<void>`\n * and is effectively uncallable — matching the runtime behavior, where\n * the receiver would drop client-emitted stream messages anyway.\n */\nexport interface StreamingCall<TResult, TClient> extends Promise<TResult> {\n /** Resolves to the wire request id once the call has been sent. */\n readonly requestId: Promise<RequestId>;\n /** Emit a client→server stream message on this in-flight call. */\n send(payload: TClient): Promise<void>;\n /**\n * Ask the callee to abort this in-flight call. Advisory: the call\n * settles via its normal response (typically a `cancelled` error).\n * `reason` is an open-set diagnostic string (see `StreamControlReason`).\n */\n cancel(reason?: string): Promise<void>;\n /**\n * Stop tracking this call locally. This does not notify the callee; call\n * {@link cancel} first when remote work should also be cancelled.\n */\n dispose?(reason?: string): void;\n /**\n * Liveness probe toward the callee: resolves once the callee\n * acknowledges with a matching pong, rejects if the call settles\n * first. Independent of the channel's automatic keepalive ping.\n */\n ping(): Promise<void>;\n}\n\n/**\n * `true` iff at least one stream direction is declared (either client or\n * server stream schema present). Used by {@link InterfaceClient} to pick\n * between the plain `Promise<R>` shape and the {@link StreamingCall}\n * shape per method.\n */\ntype _HasStream<TClient, TServer> = [TClient] extends [never] ? ([TServer] extends [never] ? false : true) :\n true;\n\n/**\n * Compile-time TypeScript shape of an interface — useful for typed\n * client/server implementations on top of the runtime definition.\n *\n * Methods whose `RequestType` declares stream payloads via\n * `.withStream({ client, server })` return a {@link StreamingCall}\n * augmented with `send`; all others return a plain `Promise<TResult>`.\n *\n * @example\n * type Client = InterfaceClient<typeof myInterface>;\n * // => { bar(p: {...}): Promise<string>; foo(p: {...}): void; }\n */\ntype InterfaceClientMember<TMember> =\n TMember extends RequestType<infer P, infer R, any, infer TC, infer TS> ? (\n _HasStream<TC, TS> extends true ? (params: P, opts?: StreamCallOptions<TS>) => StreamingCall<R, TC> :\n (params: P) => Promise<R>\n ) :\n TMember extends NotificationType<infer P> ? (params: P) => void :\n never;\n\nexport type InterfaceClient<TDef extends InterfaceDefinition<any>> = {\n [K in keyof TDef['members']]: InterfaceClientMember<TDef['members'][K]>;\n};\n\n/**\n * Compile-time shape of a server implementation for an interface — used by\n * `LinkRpcConnection.register`. Request handlers may return synchronously or\n * via a promise; notification handlers return void.\n *\n * `TCtx` is the call-context type carried by the hosting connection — see\n * `LinkRpcConnection<TCtx>`. For the default connection (`TCtx = undefined`)\n * handlers may take a single params arg; for ctx-aware connections (e.g.\n * the hub's self connection) they may take a second `ctx` arg of the\n * concrete type. A 1-arg handler remains assignable where a 2-arg handler\n * is expected, so existing handlers compile unchanged.\n */\ntype InterfaceHandler<TMember, TCtx> =\n TMember extends RequestType<infer P, infer R, any, infer TC, infer TS> ?\n (params: P, ctx: TCtx, stream: StreamApi<TC, TS>) => R | Promise<R> :\n TMember extends NotificationType<infer P> ? (params: P, ctx: TCtx) => void | Promise<void> :\n never;\n\nexport type InterfaceHandlers<\n TDef extends InterfaceDefinition<any>,\n TCtx = undefined,\n> = {\n [K in keyof TDef['members']]: InterfaceHandler<TDef['members'][K], TCtx>;\n };\n\n/**\n * Options accepted by {@link InterfaceDefinition}'s constructor.\n *\n * `frozenSchema` lets callers supply an externally-authored\n * `LinkRpcInterfaceSchema` (e.g. produced by codegen or, in the faker, by an\n * LLM at runtime) verbatim. When set, `toSchema()` returns that document\n * (with `hash` overlaid) and `schemaHash` is computed from it — the\n * `members` map is used only for runtime dispatch (param/result\n * validation, stream routing) and is no longer the source of truth for\n * the wire shape.\n */\nexport interface InterfaceDefinitionOpts {\n frozenSchema?: LinkRpcInterfaceSchema;\n}\n\ninterface InterfaceDefinitionState {\n readonly frozenSchema: LinkRpcInterfaceSchema | undefined;\n schemaCache: LinkRpcInterfaceSchema | undefined;\n hashCache: string | undefined;\n}\n\nconst interfaceDefinitionState = new WeakMap<object, InterfaceDefinitionState>();\n\nexport class InterfaceDefinition<TMembers extends MemberMap> {\n /** Typed wire references for capability and access-request construction. */\n public readonly ref: InterfaceMemberRefMap<TMembers>;\n\n constructor(\n public readonly info: InterfaceInfo,\n public readonly members: TMembers,\n opts: InterfaceDefinitionOpts = {},\n ) {\n interfaceDefinitionState.set(this, {\n frozenSchema: opts.frozenSchema,\n schemaCache: undefined,\n hashCache: undefined,\n });\n this.ref = Object.fromEntries(\n Object.keys(members).map((member) => [\n member,\n {\n interfaceId: this.info.id,\n interfaceHash: this.schemaHash,\n member,\n },\n ]),\n ) as InterfaceMemberRefMap<TMembers>;\n if (info.hash !== undefined && this.schemaHash !== info.hash) {\n throw new Error(\n `Interface hash mismatch for \"${info.id}\": expected \"${info.hash}\", got \"${this.schemaHash}\". `\n + `The interface's wire contract changed — update the pinned hash to \"${this.schemaHash}\" after reviewing the change.`,\n );\n }\n }\n\n /** Content hash of this interface (see `computeInterfaceHash`). */\n public get schemaHash(): string {\n const state = interfaceDefinitionState.get(this)!;\n if (state.hashCache === undefined) {\n const base = state.frozenSchema ?? buildSchema(this.info, this.members, '');\n state.hashCache = computeInterfaceHash(base);\n }\n return state.hashCache;\n }\n\n /** Lower the definition to a wire-format `LinkRpcInterfaceSchema`, hash filled in. */\n public toSchema(): LinkRpcInterfaceSchema {\n const state = interfaceDefinitionState.get(this)!;\n if (state.schemaCache === undefined) {\n state.schemaCache = state.frozenSchema !== undefined ?\n { ...state.frozenSchema, hash: this.schemaHash } :\n buildSchema(this.info, this.members, this.schemaHash);\n }\n return state.schemaCache;\n }\n}\n\nfunction buildSchema(\n info: InterfaceInfo,\n members: MemberMap,\n hash: string,\n): LinkRpcInterfaceSchema {\n const methods: Record<string, MethodSchema> = {};\n const components: Record<string, LinkRpcJsonSchema> = {};\n for (const [name, member] of Object.entries(members)) {\n methods[name] = toMethodSchema(name, member, components);\n }\n const schema: LinkRpcInterfaceSchema = {\n id: info.id,\n hash,\n methods,\n };\n if (Object.keys(components).length > 0) schema.components = { schemas: components };\n if (info.description !== undefined) schema.description = info.description;\n if (info.comment !== undefined) schema.comment = info.comment;\n return schema;\n}\n\nfunction toMethodSchema(\n name: string,\n member: MemberType,\n components: Record<string, LinkRpcJsonSchema>,\n): MethodSchema {\n const docs = member.docs;\n\n if (member.kind === 'request') {\n const m: MethodSchema = {\n params: convertMemberSchema(name, 'params', member.paramsSchema, components),\n result: convertMemberSchema(name, 'result', member.resultSchema, components),\n };\n if (member.clientStreamSchema !== undefined) {\n m.clientStream = convertMemberSchema(\n name,\n 'clientStream',\n member.clientStreamSchema,\n components,\n );\n }\n if (member.serverStreamSchema !== undefined) {\n m.serverStream = convertMemberSchema(\n name,\n 'serverStream',\n member.serverStreamSchema,\n components,\n );\n }\n if (docs.description !== undefined) m.description = docs.description;\n if (docs.comment !== undefined) m.comment = docs.comment;\n if (docs.annotations !== undefined) m.annotations = docs.annotations;\n return m;\n }\n\n const m: MethodSchema = {\n params: convertMemberSchema(name, 'params', member.paramsSchema, components),\n };\n if (docs.description !== undefined) m.description = docs.description;\n if (docs.comment !== undefined) m.comment = docs.comment;\n if (docs.annotations !== undefined) m.annotations = docs.annotations;\n return m;\n}\n\nfunction convertMemberSchema(\n methodName: string,\n position: string,\n schema: Schema,\n components: Record<string, LinkRpcJsonSchema>,\n): LinkRpcJsonSchema {\n return zodToSvcJsonSchema(schema, {\n methodName,\n schemaPosition: position,\n components,\n });\n}\n\n/**\n * Convenient builder for an interface definition. Tracks TypeScript types\n * through `requestType` / `notificationType` so client and server code can\n * derive their shapes from the definition.\n *\n * @example\n * const myInterface = defineInterface(\n * { id: \"de.hediet.notification-target\" },\n * {\n * send: requestType(z.object({ to: z.string() }), z.string()),\n * notify: notificationType(z.object({ message: z.string() })),\n * },\n * );\n */\nexport function defineInterface<TMembers extends MemberMap>(\n info: InterfaceInfo,\n members: TMembers,\n): InterfaceDefinition<TMembers> {\n return new InterfaceDefinition(info, members);\n}\n\n/**\n * Build a runtime {@link InterfaceDefinition} from a previously-published\n * {@link LinkRpcInterfaceSchema} — typically one received over the wire (e.g.\n * from `hubrpc.schemas::get`) or generated at runtime by tooling that does\n * not have the original zod sources at hand (codegen, faker / mock\n * services, dynamic gateways).\n *\n * The original schema is kept verbatim: `toSchema()` returns it (with\n * `hash` overlaid) and `schemaHash` is computed from it, so reflection\n * consumers see the real wire contract. Member-level params / results /\n * streams use `z.any()` because no zod source is available — call-site\n * validation is therefore a no-op and the caller is responsible for\n * shape-checking inputs and outputs.\n *\n * Methods with no `result` descriptor become notifications; methods with\n * `clientStream` / `serverStream` get pass-through stream payload\n * schemas attached.\n */\nexport function interfaceFromSchema(schema: LinkRpcInterfaceSchema): InterfaceDefinition<MemberMap> {\n const members: MemberMap = {};\n for (const [name, method] of Object.entries(schema.methods)) {\n if (method.result === undefined) {\n members[name] = new NotificationType(zAny());\n continue;\n }\n const base = new RequestType<unknown, unknown, void>(zAny(), zAny(), zVoid());\n members[name] = method.clientStream !== undefined || method.serverStream !== undefined ?\n base.withStream({\n client: method.clientStream !== undefined ? zAny() : undefined,\n server: method.serverStream !== undefined ? zAny() : undefined,\n }) :\n base;\n }\n const info: InterfaceInfo = { id: schema.id };\n if (schema.description !== undefined) info.description = schema.description;\n if (schema.comment !== undefined) info.comment = schema.comment;\n return new InterfaceDefinition(info, members, { frozenSchema: schema });\n}\n","import {\n array,\n boolean,\n enum as zEnum,\n int,\n literal,\n nonnegative,\n number,\n object,\n optional,\n record,\n string,\n union,\n unknown,\n} from \"zod/mini\";\nimport type { output as zInfer } from \"zod/v4/core\";\nimport { defineInterface } from \"../connection/interfaceDefinition\";\nimport { requestType } from \"../schema/memberTypes\";\n\nexport const zTopologyPort = object({\n portId: string(),\n label: optional(string()),\n});\n\nexport const zParticipantDescriptor = object({\n type: optional(string()),\n label: optional(string()),\n processId: optional(number()),\n processType: optional(string()),\n nodeStatusServiceId: optional(string()),\n metadata: optional(record(string(), union([string(), number(), boolean()]))),\n});\n\nexport const zParticipantDescriptorSource = object({\n source: zEnum([\"self\", \"attacher\"]),\n descriptor: zParticipantDescriptor,\n});\n\nexport const zTopologyNode = object({\n nodeId: string(),\n kind: optional(zEnum([\"endpoint\", \"hub\"])),\n label: optional(string()),\n descriptors: optional(array(zParticipantDescriptorSource)),\n ports: array(zTopologyPort),\n});\n\nexport const zTopologyLinkEndpoint = object({\n nodeId: string(),\n portId: string(),\n});\n\nexport const zTopologyTransportEndpoint = object({\n address: optional(string()),\n port: optional(number().check(int(), nonnegative())),\n});\n\n/**\n * Transport details as observed at a topology link. `local` corresponds to the\n * link's `from` endpoint and `remote` to its `to` endpoint.\n */\nexport const zTopologyTransportInfo = object({\n type: string(),\n local: optional(zTopologyTransportEndpoint),\n remote: optional(zTopologyTransportEndpoint),\n path: optional(string()),\n metadata: optional(record(string(), union([string(), number(), boolean()]))),\n});\n\nexport const zTopologyLink = object({\n from: zTopologyLinkEndpoint,\n to: zTopologyLinkEndpoint,\n label: optional(string()),\n peerState: optional(zEnum([\"identified\", \"pending\", \"unsupported\", \"error\"])),\n transport: optional(zTopologyTransportInfo),\n});\n\nexport const zRouteClaim = object({\n serviceId: string(),\n nodeId: string(),\n portId: string(),\n match: zEnum([\"exact\", \"prefix\"]),\n});\n\nexport const zTopologyGraph = object({\n observerServiceId: string(),\n entryNodeId: string(),\n nodes: array(zTopologyNode),\n links: array(zTopologyLink),\n routes: array(zRouteClaim),\n});\n\nexport type TopologyPort = zInfer<typeof zTopologyPort>;\nexport type ParticipantDescriptor = zInfer<typeof zParticipantDescriptor>;\nexport type ParticipantDescriptorSource = zInfer<typeof zParticipantDescriptorSource>;\nexport type TopologyNode = zInfer<typeof zTopologyNode>;\nexport type TopologyLinkEndpoint = zInfer<typeof zTopologyLinkEndpoint>;\nexport type TopologyTransportEndpoint = zInfer<typeof zTopologyTransportEndpoint>;\nexport type TopologyTransportInfo = zInfer<typeof zTopologyTransportInfo>;\nexport type TopologyLink = zInfer<typeof zTopologyLink>;\nexport type RouteClaim = zInfer<typeof zRouteClaim>;\nexport type TopologyGraph = zInfer<typeof zTopologyGraph>;\n\nexport const topologyInterface = defineInterface(\n {\n id: \"hubrpc.topology\",\n description:\n \"Inspect the transport graph visible from a service. A watch emits invalidation \"\n + \"ticks; consumers re-fetch getGraph after each tick.\",\n },\n {\n getGraph: requestType(object({}), zTopologyGraph).withStream({ client: object({}) }),\n watchGraph: requestType(object({}), object({})).withStream({\n server: object({}),\n }),\n },\n);\n\nexport const zTrafficTransitEndpoint = object({\n edgeId: string(),\n portId: string(),\n requestId: optional(union([number(), string()])),\n});\n\nexport const zTrafficTransitEvent = object({\n type: literal(\"transit\"),\n timeMs: number(),\n nodeId: string(),\n in: optional(zTrafficTransitEndpoint),\n out: optional(zTrafficTransitEndpoint),\n disposition: zEnum([\"forwarded\", \"consumed\", \"dropped\", \"unroutable\"]),\n kind: zEnum([\"request\", \"notification\", \"response\", \"stream\"]),\n method: optional(string()),\n params: optional(unknown()),\n result: optional(unknown()),\n error: optional(object({\n code: number(),\n message: string(),\n data: optional(unknown()),\n })),\n});\n\nexport const zTrafficOverflowEvent = object({\n type: literal(\"overflow\"),\n dropped: number().check(int(), nonnegative()),\n});\n\nexport const zTrafficEvent = union([zTrafficTransitEvent, zTrafficOverflowEvent]);\n\nexport type TrafficTransitEndpoint = zInfer<typeof zTrafficTransitEndpoint>;\nexport type TrafficTransitEvent = zInfer<typeof zTrafficTransitEvent>;\nexport type TrafficOverflowEvent = zInfer<typeof zTrafficOverflowEvent>;\nexport type TrafficEvent = zInfer<typeof zTrafficEvent>;\n\nexport const zTrafficWatchResult = object({\n delivered: number().check(int(), nonnegative()),\n dropped: number().check(int(), nonnegative()),\n});\n\nexport type TrafficWatchResult = zInfer<typeof zTrafficWatchResult>;\n\nconst zTrafficWatchParams = object({\n methodPrefix: optional(string()),\n trafficIgnoreKey: optional(string()),\n focusRequest: optional(object({\n portId: string(),\n requestId: union([number(), string()]),\n })),\n});\n\nconst zTrafficWatchWithPayloadsParams = object({\n methodPrefix: optional(string()),\n trafficIgnoreKey: optional(string()),\n focusRequest: optional(object({\n portId: string(),\n requestId: union([number(), string()]),\n })),\n maxPayloadBytes: number().check(int(), nonnegative()),\n});\n\n/**\n * Observe raw message transits at the node hosting the addressed service.\n * Consumers may correlate adjacent transits by shared `(portId, requestId)`.\n */\nexport const trafficInterface = defineInterface(\n {\n id: \"hubrpc.traffic\",\n description:\n \"Stream raw message transits for the entire node hosting the addressed service. \"\n + \"Payload-free and explicitly payload-bearing variants keep disclosure opt-in.\",\n },\n {\n watch: requestType(zTrafficWatchParams, zTrafficWatchResult).withStream({\n server: zTrafficEvent,\n }),\n watchWithPayloads: requestType(\n zTrafficWatchWithPayloadsParams,\n zTrafficWatchResult,\n ).withStream({\n server: zTrafficEvent,\n }),\n },\n);\n","import { array, object, optional, string } from \"zod/mini\";\nimport type { output as zInfer } from \"zod/v4/core\";\nimport { defineInterface } from \"../connection/interfaceDefinition\";\nimport { requestType } from \"../schema/memberTypes\";\nimport { zParticipantDescriptorSource } from \"./inspection.interfaces\";\nimport type { ParticipantDescriptorSource } from \"./inspection.interfaces\";\n\nconst zNodeInfo = object({\n /**\n * Random identity of this connection's node. It is a topology-correlation\n * label only and must not be used for authentication or authorization.\n */\n nodeId: string(),\n /** Random identity of this connection's port on its node. */\n portId: string(),\n /** Optional diagnostic descriptors; never used for authorization. */\n descriptors: optional(array(zParticipantDescriptorSource)),\n});\n\nexport type NodeInfo = zInfer<typeof zNodeInfo>;\nexport type { ParticipantDescriptorSource };\n\n/**\n * Generates unique topology-correlation labels, not security identities.\n * Custom generators must avoid collisions across nodes and ports. Tests can\n * supply an independent deterministic sequence for each participant.\n */\nexport type TopologyIdGenerator = (kind: 'node' | 'port') => string;\n\n/**\n * Minimal root service for aligning the independently observed topologies at\n * both ends of a connection.\n */\nexport const nodeInterface = defineInterface(\n {\n id: \"hubrpc.node\",\n description:\n \"Topology bootstrap: identify the node and port at this end of the direct connection.\",\n },\n {\n getNodeId: requestType(object({}), zNodeInfo),\n },\n);\n","import type {\n TrafficTransitEndpoint,\n TrafficTransitEvent,\n} from './inspection.interfaces';\n\nexport interface TrafficRequestRef {\n readonly portId: string;\n readonly requestId: string | number;\n}\n\nexport interface TrafficFlowFilterOptions {\n readonly focus?: TrafficRequestRef;\n}\n\nexport class TrafficFlowFilter {\n private readonly _focused: CorrelatedFlow | undefined;\n\n constructor(options: TrafficFlowFilterOptions) {\n this._focused = options.focus !== undefined\n ? new CorrelatedFlow([options.focus])\n : undefined;\n }\n\n public shouldInclude(transit: TrafficTransitEvent): boolean {\n const focused = this._focused?.accept(transit).matches ?? true;\n return focused;\n }\n}\n\nexport class TrafficWatchFlowTracker {\n private readonly _active = new Set<CorrelatedFlow>();\n private readonly _unclaimed = new Map<string, CorrelatedFlow>();\n\n public accept(transit: TrafficTransitEvent): boolean {\n if (transit.kind === 'request' && isTrafficWatchMethod(transit.method)) {\n const trafficIgnoreKey = readTrafficIgnoreKey(transit.params);\n let flow = this._findFlow(transit);\n if (flow === undefined) {\n flow = new CorrelatedFlow(\n requestRefsOf(transit),\n completionRefOf(transit),\n );\n if (!isTerminal(transit)) this._active.add(flow);\n } else {\n flow.accept(transit);\n }\n if (isTerminal(transit)) {\n this._removeFlow(flow);\n return true;\n }\n if (trafficIgnoreKey !== undefined) {\n this._unclaimed.set(trafficIgnoreKey, flow);\n }\n return true;\n }\n for (const flow of this._active) {\n const match = flow.accept(transit);\n if (!match.matches) continue;\n if (match.completed) this._removeFlow(flow);\n return true;\n }\n return false;\n }\n\n private _findFlow(transit: TrafficTransitEvent): CorrelatedFlow | undefined {\n for (const flow of this._active) {\n if (flow.matches(transit)) return flow;\n }\n return undefined;\n }\n\n private _removeFlow(flow: CorrelatedFlow): void {\n this._active.delete(flow);\n for (const [key, pending] of this._unclaimed) {\n if (pending === flow) this._unclaimed.delete(key);\n }\n }\n\n public claim(trafficIgnoreKey: string): boolean {\n return this._unclaimed.delete(trafficIgnoreKey);\n }\n\n public clear(): void {\n this._active.clear();\n this._unclaimed.clear();\n }\n}\n\nclass CorrelatedFlow {\n private readonly _endpoints = new Set<string>();\n private readonly _completionEndpoint: string | undefined;\n\n constructor(\n endpoints: readonly TrafficRequestRef[],\n completionEndpoint: TrafficRequestRef | undefined = endpoints[0],\n ) {\n for (const endpoint of endpoints) this._endpoints.add(endpointKey(endpoint));\n this._completionEndpoint = completionEndpoint === undefined\n ? undefined\n : endpointKey(completionEndpoint);\n }\n\n public matches(transit: TrafficTransitEvent): boolean {\n return requestRefsOf(transit)\n .some((endpoint) => this._endpoints.has(endpointKey(endpoint)));\n }\n\n public accept(transit: TrafficTransitEvent): {\n readonly matches: boolean;\n readonly completed: boolean;\n } {\n const endpoints = requestRefsOf(transit);\n if (!this.matches(transit)) {\n return { matches: false, completed: false };\n }\n for (const endpoint of endpoints) this._endpoints.add(endpointKey(endpoint));\n const completed = transit.kind === 'response'\n && (\n isTerminal(transit)\n || (\n this._completionEndpoint !== undefined\n && endpoints.some((endpoint) =>\n endpointKey(endpoint) === this._completionEndpoint)\n )\n );\n if (completed) this._endpoints.clear();\n return { matches: true, completed };\n }\n\n}\n\nfunction isTerminal(transit: TrafficTransitEvent): boolean {\n return transit.disposition === 'dropped'\n || transit.disposition === 'unroutable';\n}\n\nfunction requestRefsOf(transit: TrafficTransitEvent): TrafficRequestRef[] {\n const result: TrafficRequestRef[] = [];\n if (transit.in?.requestId !== undefined) result.push(requestRef(transit.in));\n if (transit.out?.requestId !== undefined) result.push(requestRef(transit.out));\n return result;\n}\n\nfunction requestRef(endpoint: TrafficTransitEndpoint): TrafficRequestRef {\n return {\n portId: endpoint.portId,\n requestId: endpoint.requestId!,\n };\n}\n\nfunction completionRefOf(transit: TrafficTransitEvent): TrafficRequestRef | undefined {\n if (transit.in?.requestId !== undefined) return requestRef(transit.in);\n if (transit.out?.requestId !== undefined) return requestRef(transit.out);\n return undefined;\n}\n\nfunction endpointKey(endpoint: TrafficRequestRef): string {\n return JSON.stringify([\n endpoint.portId,\n typeof endpoint.requestId,\n endpoint.requestId,\n ]);\n}\n\nfunction isTrafficWatchMethod(method: string | undefined): boolean {\n return method?.endsWith('::hubrpc.traffic::watch') === true\n || method?.endsWith('::hubrpc.traffic::watchWithPayloads') === true\n || method === 'hubrpc.traffic::watch'\n || method === 'hubrpc.traffic::watchWithPayloads';\n}\n\nfunction readTrafficIgnoreKey(params: unknown): string | undefined {\n if (params === null || Array.isArray(params) || typeof params !== 'object' || !('trafficIgnoreKey' in params)) {\n return undefined;\n }\n const value = params.trafficIgnoreKey;\n return typeof value === 'string' ? value : undefined;\n}\n","import type {\n TrafficEvent,\n TrafficTransitEvent,\n TrafficWatchResult,\n} from './inspection.interfaces';\nimport type { JsonValue } from '../protocol/jsonRpc';\nimport {\n TrafficFlowFilter,\n} from './trafficFlowFilter';\nimport type { TrafficRequestRef } from './trafficFlowFilter';\n\nconst DEFAULT_QUEUE_LIMIT = 256;\n\nexport interface TrafficSubscriptionOptions {\n readonly methodPrefix?: string;\n readonly maxPayloadBytes?: number;\n readonly trafficIgnoreKey?: string;\n readonly focusRequest?: TrafficRequestRef;\n}\n\nexport interface TrafficSubscription {\n readonly closed: Promise<TrafficWatchResult>;\n dispose(): void;\n}\n\n/**\n * Applies per-subscriber filtering and payload policy while isolating traffic\n * producers from slow or failed stream consumers.\n */\nexport class BoundedTrafficSubscription implements TrafficSubscription {\n private readonly _queue: TrafficTransitEvent[] = [];\n private _active = true;\n private _pumping = false;\n private _overflowPending = 0;\n private _delivered = 0;\n private _dropped = 0;\n private readonly _resolveClosed: (result: TrafficWatchResult) => void;\n private readonly _filter: TrafficFlowFilter;\n public readonly closed: Promise<TrafficWatchResult>;\n\n constructor(\n private readonly _options: TrafficSubscriptionOptions,\n private readonly _send: (event: TrafficEvent) => Promise<void>,\n private readonly _onDispose: () => void,\n private readonly _queueLimit = DEFAULT_QUEUE_LIMIT,\n ) {\n let resolve!: (result: TrafficWatchResult) => void;\n this.closed = new Promise<TrafficWatchResult>((r) => resolve = r);\n this._resolveClosed = resolve;\n this._filter = new TrafficFlowFilter({\n focus: _options.focusRequest,\n });\n }\n\n public enqueue(transit: TrafficTransitEvent): void {\n if (!this._active) return;\n if (!this._filter.shouldInclude(transit)) return;\n if (\n this._options.methodPrefix !== undefined\n && !transit.method?.startsWith(this._options.methodPrefix)\n ) {\n return;\n }\n\n const event = this._options.maxPayloadBytes === undefined\n ? withoutPayloads(transit)\n : withCappedPayloads(transit, this._options.maxPayloadBytes);\n if (this._queue.length >= this._queueLimit) {\n this._queue.shift();\n this._dropped++;\n this._overflowPending++;\n }\n this._queue.push(event);\n if (!this._pumping) {\n this._pumping = true;\n queueMicrotask(() => void this._pump());\n }\n }\n\n public dispose(): void {\n if (!this._active) return;\n this._active = false;\n this._dropped += this._queue.length;\n this._queue.length = 0;\n this._overflowPending = 0;\n this._onDispose();\n if (!this._pumping) this._complete();\n }\n\n private async _pump(): Promise<void> {\n try {\n while (this._active) {\n if (this._overflowPending > 0) {\n const dropped = this._overflowPending;\n this._overflowPending = 0;\n await this._send({ type: 'overflow', dropped });\n continue;\n }\n const event = this._queue.shift();\n if (event === undefined) break;\n await this._send(event);\n this._delivered++;\n }\n } catch {\n this.dispose();\n } finally {\n this._pumping = false;\n if (!this._active) {\n this._complete();\n } else if (this._queue.length > 0 || this._overflowPending > 0) {\n this._pumping = true;\n queueMicrotask(() => void this._pump());\n }\n }\n }\n\n private _complete(): void {\n this._resolveClosed({\n delivered: this._delivered,\n dropped: this._dropped,\n });\n }\n}\n\nfunction withoutPayloads(transit: TrafficTransitEvent): TrafficTransitEvent {\n const { params: _params, result: _result, error, ...rest } = transit;\n if (error === undefined) return rest;\n return {\n ...rest,\n error: { code: error.code, message: error.message },\n };\n}\n\nfunction withCappedPayloads(\n transit: TrafficTransitEvent,\n maxPayloadBytes: number,\n): TrafficTransitEvent {\n return {\n ...transit,\n params: capPayload(transit.params, maxPayloadBytes),\n result: capPayload(transit.result, maxPayloadBytes),\n error: transit.error === undefined ? undefined : {\n ...transit.error,\n data: capPayload(transit.error.data, maxPayloadBytes),\n },\n };\n}\n\nfunction capPayload(value: unknown, maxBytes: number): JsonValue | undefined {\n if (value === undefined) return undefined;\n if (maxBytes === Number.POSITIVE_INFINITY) return value as JsonValue;\n const json = JSON.stringify(value);\n if (json === undefined) return undefined;\n const encoded = new TextEncoder().encode(json);\n if (encoded.byteLength <= maxBytes) return value as JsonValue;\n const encoder = new TextEncoder();\n let preview = new TextDecoder().decode(encoded.slice(0, maxBytes));\n while (encoder.encode(preview).byteLength > maxBytes) {\n preview = preview.slice(0, -1);\n }\n return preview;\n}\n"],"mappings":"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"}