@camstack/sdk 0.1.35 → 0.1.37
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/__tests__/base-device.spec.d.ts +1 -0
- package/dist/__tests__/race-endpoints.spec.d.ts +1 -0
- package/dist/base-device.d.ts +5 -0
- package/dist/index.cjs +1343 -2264
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.js +1297 -2136
- package/dist/index.js.map +1 -1
- package/dist/nvr.d.ts +4 -17
- package/dist/system.d.ts +297 -0
- package/dist/timeline.d.ts +0 -8
- package/dist/types.d.ts +1 -8
- package/package.json +4 -3
- package/dist/backend-client.d.ts +0 -315
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/typeof.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js","../node_modules/@trpc/server/src/observable/observable.ts","../node_modules/@trpc/server/src/observable/operators.ts","../node_modules/@trpc/server/src/observable/behaviorSubject.ts","../node_modules/@trpc/client/src/links/internals/createChain.ts","../node_modules/@trpc/client/src/links/splitLink.ts","../node_modules/@trpc/server/src/unstable-core-do-not-import/utils.ts","../node_modules/@trpc/server/src/unstable-core-do-not-import/rpc/codes.ts","../node_modules/@trpc/server/src/unstable-core-do-not-import/createProxy.ts","../node_modules/@trpc/server/src/unstable-core-do-not-import/http/getHTTPStatusCode.ts","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/typeof.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js","../node_modules/@trpc/server/src/unstable-core-do-not-import/error/getErrorShape.ts","../node_modules/@trpc/server/src/unstable-core-do-not-import/error/formatter.ts","../node_modules/@trpc/server/src/unstable-core-do-not-import/error/TRPCError.ts","../node_modules/@trpc/server/src/unstable-core-do-not-import/transformer.ts","../node_modules/@trpc/server/src/unstable-core-do-not-import/router.ts","../node_modules/@trpc/server/src/unstable-core-do-not-import/stream/tracked.ts","../node_modules/@trpc/client/src/TRPCClientError.ts","../node_modules/@trpc/client/src/internals/transformer.ts","../node_modules/@trpc/client/src/getFetch.ts","../node_modules/@trpc/client/src/links/internals/httpUtils.ts","../node_modules/@trpc/client/src/links/internals/contentTypes.ts","../node_modules/@trpc/client/src/links/httpLink.ts","../node_modules/@trpc/client/src/links/wsLink/wsClient/encoder.ts","../node_modules/@trpc/client/src/links/wsLink/wsClient/options.ts","../node_modules/@trpc/client/src/links/internals/urlWithConnectionParams.ts","../node_modules/@trpc/client/src/links/wsLink/wsClient/utils.ts","../node_modules/@trpc/client/src/links/wsLink/wsClient/requestManager.ts","../node_modules/@trpc/client/src/links/wsLink/wsClient/wsConnection.ts","../node_modules/@trpc/client/src/links/wsLink/wsClient/wsClient.ts","../node_modules/@trpc/client/src/links/wsLink/createWsClient.ts","../node_modules/@trpc/client/src/links/wsLink/wsLink.ts","../node_modules/@trpc/client/src/internals/TRPCUntypedClient.ts","../node_modules/@trpc/client/src/createTRPCUntypedClient.ts","../node_modules/@trpc/client/src/createTRPCClient.ts","../node_modules/@trpc/client/src/links/httpBatchStreamLink.ts","../node_modules/@trpc/client/src/internals/inputWithTrackedEventId.ts","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncIterator.js","../node_modules/@trpc/client/src/links/httpSubscriptionLink.ts","../node_modules/@trpc/client/src/links/retryLink.ts","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/OverloadYield.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js","../node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js","../node_modules/@trpc/client/src/links/localLink.ts","../src/backend-client.ts","../src/detection.ts","../src/devices.ts","../src/features.ts","../src/adaptive-stream.ts"],"sourcesContent":["function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var defineProperty = require(\"./defineProperty.js\");\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nmodule.exports = _objectSpread2, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import type { Result } from '../unstable-core-do-not-import';\nimport type {\n Observable,\n Observer,\n OperatorFunction,\n TeardownLogic,\n UnaryFunction,\n Unsubscribable,\n} from './types';\n\n/** @public */\nexport type inferObservableValue<TObservable> =\n TObservable extends Observable<infer TValue, unknown> ? TValue : never;\n\n/** @public */\nexport function isObservable(x: unknown): x is Observable<unknown, unknown> {\n return typeof x === 'object' && x !== null && 'subscribe' in x;\n}\n\n/** @public */\nexport function observable<TValue, TError = unknown>(\n subscribe: (observer: Observer<TValue, TError>) => TeardownLogic,\n): Observable<TValue, TError> {\n const self: Observable<TValue, TError> = {\n subscribe(observer) {\n let teardownRef: TeardownLogic | null = null;\n let isDone = false;\n let unsubscribed = false;\n let teardownImmediately = false;\n function unsubscribe() {\n if (teardownRef === null) {\n teardownImmediately = true;\n return;\n }\n if (unsubscribed) {\n return;\n }\n unsubscribed = true;\n\n if (typeof teardownRef === 'function') {\n teardownRef();\n } else if (teardownRef) {\n teardownRef.unsubscribe();\n }\n }\n teardownRef = subscribe({\n next(value) {\n if (isDone) {\n return;\n }\n observer.next?.(value);\n },\n error(err) {\n if (isDone) {\n return;\n }\n isDone = true;\n observer.error?.(err);\n unsubscribe();\n },\n complete() {\n if (isDone) {\n return;\n }\n isDone = true;\n observer.complete?.();\n unsubscribe();\n },\n });\n if (teardownImmediately) {\n unsubscribe();\n }\n return {\n unsubscribe,\n };\n },\n pipe(\n ...operations: OperatorFunction<any, any, any, any>[]\n ): Observable<any, any> {\n return operations.reduce(pipeReducer, self);\n },\n };\n return self;\n}\n\nfunction pipeReducer(prev: any, fn: UnaryFunction<any, any>) {\n return fn(prev);\n}\n\n/** @internal */\nexport function observableToPromise<TValue>(\n observable: Observable<TValue, unknown>,\n) {\n const ac = new AbortController();\n const promise = new Promise<TValue>((resolve, reject) => {\n let isDone = false;\n function onDone() {\n if (isDone) {\n return;\n }\n isDone = true;\n obs$.unsubscribe();\n }\n ac.signal.addEventListener('abort', () => {\n reject(ac.signal.reason);\n });\n const obs$ = observable.subscribe({\n next(data) {\n isDone = true;\n resolve(data);\n onDone();\n },\n error(data) {\n reject(data);\n },\n complete() {\n ac.abort();\n onDone();\n },\n });\n });\n return promise;\n}\n\n/**\n * @internal\n */\nfunction observableToReadableStream<TValue>(\n observable: Observable<TValue, unknown>,\n signal: AbortSignal,\n): ReadableStream<Result<TValue>> {\n let unsub: Unsubscribable | null = null;\n\n const onAbort = () => {\n unsub?.unsubscribe();\n unsub = null;\n signal.removeEventListener('abort', onAbort);\n };\n\n return new ReadableStream<Result<TValue>>({\n start(controller) {\n unsub = observable.subscribe({\n next(data) {\n controller.enqueue({ ok: true, value: data });\n },\n error(error) {\n controller.enqueue({ ok: false, error });\n controller.close();\n },\n complete() {\n controller.close();\n },\n });\n\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n },\n cancel() {\n onAbort();\n },\n });\n}\n\n/** @internal */\nexport function observableToAsyncIterable<TValue>(\n observable: Observable<TValue, unknown>,\n signal: AbortSignal,\n): AsyncIterable<TValue> {\n const stream = observableToReadableStream(observable, signal);\n\n const reader = stream.getReader();\n const iterator: AsyncIterator<TValue> = {\n async next() {\n const value = await reader.read();\n if (value.done) {\n return {\n value: undefined,\n done: true,\n };\n }\n const { value: result } = value;\n if (!result.ok) {\n throw result.error;\n }\n return {\n value: result.value,\n done: false,\n };\n },\n async return() {\n await reader.cancel();\n return {\n value: undefined,\n done: true,\n };\n },\n };\n return {\n [Symbol.asyncIterator]() {\n return iterator;\n },\n };\n}\n","import { observable } from './observable';\nimport type {\n MonoTypeOperatorFunction,\n Observer,\n OperatorFunction,\n Unsubscribable,\n} from './types';\n\nexport function map<TValueBefore, TError, TValueAfter>(\n project: (value: TValueBefore, index: number) => TValueAfter,\n): OperatorFunction<TValueBefore, TError, TValueAfter, TError> {\n return (source) => {\n return observable((destination) => {\n let index = 0;\n const subscription = source.subscribe({\n next(value) {\n destination.next(project(value, index++));\n },\n error(error) {\n destination.error(error);\n },\n complete() {\n destination.complete();\n },\n });\n return subscription;\n });\n };\n}\n\ninterface ShareConfig {}\nexport function share<TValue, TError>(\n _opts?: ShareConfig,\n): MonoTypeOperatorFunction<TValue, TError> {\n return (source) => {\n let refCount = 0;\n\n let subscription: Unsubscribable | null = null;\n const observers: Partial<Observer<TValue, TError>>[] = [];\n\n function startIfNeeded() {\n if (subscription) {\n return;\n }\n subscription = source.subscribe({\n next(value) {\n for (const observer of observers) {\n observer.next?.(value);\n }\n },\n error(error) {\n for (const observer of observers) {\n observer.error?.(error);\n }\n },\n complete() {\n for (const observer of observers) {\n observer.complete?.();\n }\n },\n });\n }\n function resetIfNeeded() {\n // \"resetOnRefCountZero\"\n if (refCount === 0 && subscription) {\n const _sub = subscription;\n subscription = null;\n _sub.unsubscribe();\n }\n }\n\n return observable((subscriber) => {\n refCount++;\n\n observers.push(subscriber);\n startIfNeeded();\n return {\n unsubscribe() {\n refCount--;\n resetIfNeeded();\n\n const index = observers.findIndex((v) => v === subscriber);\n\n if (index > -1) {\n observers.splice(index, 1);\n }\n },\n };\n });\n };\n}\n\nexport function tap<TValue, TError>(\n observer: Partial<Observer<TValue, TError>>,\n): MonoTypeOperatorFunction<TValue, TError> {\n return (source) => {\n return observable((destination) => {\n return source.subscribe({\n next(value) {\n observer.next?.(value);\n destination.next(value);\n },\n error(error) {\n observer.error?.(error);\n destination.error(error);\n },\n complete() {\n observer.complete?.();\n destination.complete();\n },\n });\n });\n };\n}\n\nconst distinctUnsetMarker = Symbol();\nexport function distinctUntilChanged<TValue, TError>(\n compare: (a: TValue, b: TValue) => boolean = (a, b) => a === b,\n): MonoTypeOperatorFunction<TValue, TError> {\n return (source) => {\n return observable((destination) => {\n let lastValue: TValue | typeof distinctUnsetMarker = distinctUnsetMarker;\n\n return source.subscribe({\n next(value) {\n if (lastValue !== distinctUnsetMarker && compare(lastValue, value)) {\n return;\n }\n lastValue = value;\n destination.next(value);\n },\n error(error) {\n destination.error(error);\n },\n complete() {\n destination.complete();\n },\n });\n });\n };\n}\n\nconst isDeepEqual = <T>(a: T, b: T): boolean => {\n if (a === b) {\n return true;\n }\n const bothAreObjects =\n a && b && typeof a === 'object' && typeof b === 'object';\n\n return (\n !!bothAreObjects &&\n Object.keys(a).length === Object.keys(b).length &&\n Object.entries(a).every(([k, v]) => isDeepEqual(v, b[k as keyof T]))\n );\n};\nexport function distinctUntilDeepChanged<\n TValue,\n TError,\n>(): MonoTypeOperatorFunction<TValue, TError> {\n return distinctUntilChanged(isDeepEqual);\n}\n","import { observable } from './observable';\nimport type { Observable, Observer } from './types';\n\nexport interface BehaviorSubject<TValue> extends Observable<TValue, never> {\n observable: Observable<TValue, never>;\n next: (value: TValue) => void;\n get: () => TValue;\n}\n\nexport interface ReadonlyBehaviorSubject<TValue>\n extends Omit<BehaviorSubject<TValue>, 'next'> {}\n\n/**\n * @internal\n * An observable that maintains and provides a \"current value\" to subscribers\n * @see https://www.learnrxjs.io/learn-rxjs/subjects/behaviorsubject\n */\nexport function behaviorSubject<TValue>(\n initialValue: TValue,\n): BehaviorSubject<TValue> {\n let value: TValue = initialValue;\n\n const observerList: Observer<TValue, never>[] = [];\n\n const addObserver = (observer: Observer<TValue, never>) => {\n if (value !== undefined) {\n observer.next(value);\n }\n observerList.push(observer);\n };\n const removeObserver = (observer: Observer<TValue, never>) => {\n observerList.splice(observerList.indexOf(observer), 1);\n };\n\n const obs = observable<TValue, never>((observer) => {\n addObserver(observer);\n return () => {\n removeObserver(observer);\n };\n }) as BehaviorSubject<TValue>;\n\n obs.next = (nextValue: TValue) => {\n if (value === nextValue) {\n return;\n }\n value = nextValue;\n for (const observer of observerList) {\n observer.next(nextValue);\n }\n };\n\n obs.get = () => value;\n\n return obs;\n}\n","import { observable } from '@trpc/server/observable';\nimport type { AnyRouter } from '@trpc/server/unstable-core-do-not-import';\nimport type {\n Operation,\n OperationLink,\n OperationResultObservable,\n} from '../types';\n\n/** @internal */\nexport function createChain<\n TRouter extends AnyRouter,\n TInput = unknown,\n TOutput = unknown,\n>(opts: {\n links: OperationLink<TRouter, TInput, TOutput>[];\n op: Operation<TInput>;\n}): OperationResultObservable<TRouter, TOutput> {\n return observable((observer) => {\n function execute(index = 0, op = opts.op) {\n const next = opts.links[index];\n if (!next) {\n throw new Error(\n 'No more links to execute - did you forget to add an ending link?',\n );\n }\n const subscription = next({\n op,\n next(nextOp) {\n const nextObserver = execute(index + 1, nextOp);\n\n return nextObserver;\n },\n });\n return subscription;\n }\n\n const obs$ = execute();\n return obs$.subscribe(observer);\n });\n}\n","import { observable } from '@trpc/server/observable';\nimport type { AnyRouter } from '@trpc/server/unstable-core-do-not-import';\nimport { createChain } from './internals/createChain';\nimport type { Operation, TRPCLink } from './types';\n\nfunction asArray<TType>(value: TType | TType[]) {\n return Array.isArray(value) ? value : [value];\n}\nexport function splitLink<TRouter extends AnyRouter = AnyRouter>(opts: {\n condition: (op: Operation) => boolean;\n /**\n * The link to execute next if the test function returns `true`.\n */\n true: TRPCLink<TRouter> | TRPCLink<TRouter>[];\n /**\n * The link to execute next if the test function returns `false`.\n */\n false: TRPCLink<TRouter> | TRPCLink<TRouter>[];\n}): TRPCLink<TRouter> {\n return (runtime) => {\n const yes = asArray(opts.true).map((link) => link(runtime));\n const no = asArray(opts.false).map((link) => link(runtime));\n return (props) => {\n return observable((observer) => {\n const links = opts.condition(props.op) ? yes : no;\n return createChain({ op: props.op, links }).subscribe(observer);\n });\n };\n };\n}\n","/** @internal */\nexport type UnsetMarker = 'unsetMarker' & {\n __brand: 'unsetMarker';\n};\n\n/**\n * Ensures there are no duplicate keys when building a procedure.\n * @internal\n */\nexport function mergeWithoutOverrides<TType extends Record<string, unknown>>(\n obj1: TType,\n ...objs: Partial<TType>[]\n): TType {\n const newObj: TType = Object.assign(emptyObject(), obj1);\n\n for (const overrides of objs) {\n for (const key in overrides) {\n if (key in newObj && newObj[key] !== overrides[key]) {\n throw new Error(`Duplicate key ${key}`);\n }\n newObj[key as keyof TType] = overrides[key] as TType[keyof TType];\n }\n }\n return newObj;\n}\n\n/**\n * Check that value is object\n * @internal\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return !!value && !Array.isArray(value) && typeof value === 'object';\n}\n\ntype AnyFn = ((...args: any[]) => unknown) & Record<keyof any, unknown>;\nexport function isFunction(fn: unknown): fn is AnyFn {\n return typeof fn === 'function';\n}\n\n/**\n * Create an object without inheriting anything from `Object.prototype`\n * @internal\n */\nexport function emptyObject<TObj extends Record<string, unknown>>(): TObj {\n return Object.create(null);\n}\n\nconst asyncIteratorsSupported =\n typeof Symbol === 'function' && !!Symbol.asyncIterator;\n\nexport function isAsyncIterable<TValue>(\n value: unknown,\n): value is AsyncIterable<TValue> {\n return (\n asyncIteratorsSupported && isObject(value) && Symbol.asyncIterator in value\n );\n}\n\n/**\n * Run an IIFE\n */\nexport const run = <TValue>(fn: () => TValue): TValue => fn();\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop(): void {}\n\nexport function identity<T>(it: T): T {\n return it;\n}\n\n/**\n * Generic runtime assertion function. Throws, if the condition is not `true`.\n *\n * Can be used as a slightly less dangerous variant of type assertions. Code\n * mistakes would be revealed at runtime then (hopefully during testing).\n */\nexport function assert(\n condition: boolean,\n msg = 'no additional info',\n): asserts condition {\n if (!condition) {\n throw new Error(`AssertionError: ${msg}`);\n }\n}\n\nexport function sleep(ms = 0): Promise<void> {\n return new Promise<void>((res) => setTimeout(res, ms));\n}\n\n/**\n * Ponyfill for\n * [`AbortSignal.any`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/any_static).\n */\nexport function abortSignalsAnyPonyfill(signals: AbortSignal[]): AbortSignal {\n if (typeof AbortSignal.any === 'function') {\n return AbortSignal.any(signals);\n }\n\n const ac = new AbortController();\n\n for (const signal of signals) {\n if (signal.aborted) {\n trigger();\n break;\n }\n signal.addEventListener('abort', trigger, { once: true });\n }\n\n return ac.signal;\n\n function trigger() {\n ac.abort();\n for (const signal of signals) {\n signal.removeEventListener('abort', trigger);\n }\n }\n}\n","import type { InvertKeyValue, ValueOf } from '../types';\n\n// reference: https://www.jsonrpc.org/specification\n\n/**\n * JSON-RPC 2.0 Error codes\n *\n * `-32000` to `-32099` are reserved for implementation-defined server-errors.\n * For tRPC we're copying the last digits of HTTP 4XX errors.\n */\nexport const TRPC_ERROR_CODES_BY_KEY = {\n /**\n * Invalid JSON was received by the server.\n * An error occurred on the server while parsing the JSON text.\n */\n PARSE_ERROR: -32700,\n /**\n * The JSON sent is not a valid Request object.\n */\n BAD_REQUEST: -32600, // 400\n\n // Internal JSON-RPC error\n INTERNAL_SERVER_ERROR: -32603, // 500\n NOT_IMPLEMENTED: -32603, // 501\n BAD_GATEWAY: -32603, // 502\n SERVICE_UNAVAILABLE: -32603, // 503\n GATEWAY_TIMEOUT: -32603, // 504\n\n // Implementation specific errors\n UNAUTHORIZED: -32001, // 401\n PAYMENT_REQUIRED: -32002, // 402\n FORBIDDEN: -32003, // 403\n NOT_FOUND: -32004, // 404\n METHOD_NOT_SUPPORTED: -32005, // 405\n TIMEOUT: -32008, // 408\n CONFLICT: -32009, // 409\n PRECONDITION_FAILED: -32012, // 412\n PAYLOAD_TOO_LARGE: -32013, // 413\n UNSUPPORTED_MEDIA_TYPE: -32015, // 415\n UNPROCESSABLE_CONTENT: -32022, // 422\n PRECONDITION_REQUIRED: -32028, // 428\n TOO_MANY_REQUESTS: -32029, // 429\n CLIENT_CLOSED_REQUEST: -32099, // 499\n} as const;\n\n// pure\nexport const TRPC_ERROR_CODES_BY_NUMBER: InvertKeyValue<\n typeof TRPC_ERROR_CODES_BY_KEY\n> = {\n [-32700]: 'PARSE_ERROR',\n [-32600]: 'BAD_REQUEST',\n [-32603]: 'INTERNAL_SERVER_ERROR',\n [-32001]: 'UNAUTHORIZED',\n [-32002]: 'PAYMENT_REQUIRED',\n [-32003]: 'FORBIDDEN',\n [-32004]: 'NOT_FOUND',\n [-32005]: 'METHOD_NOT_SUPPORTED',\n [-32008]: 'TIMEOUT',\n [-32009]: 'CONFLICT',\n [-32012]: 'PRECONDITION_FAILED',\n [-32013]: 'PAYLOAD_TOO_LARGE',\n [-32015]: 'UNSUPPORTED_MEDIA_TYPE',\n [-32022]: 'UNPROCESSABLE_CONTENT',\n [-32028]: 'PRECONDITION_REQUIRED',\n [-32029]: 'TOO_MANY_REQUESTS',\n [-32099]: 'CLIENT_CLOSED_REQUEST',\n};\n\nexport type TRPC_ERROR_CODE_NUMBER = ValueOf<typeof TRPC_ERROR_CODES_BY_KEY>;\nexport type TRPC_ERROR_CODE_KEY = keyof typeof TRPC_ERROR_CODES_BY_KEY;\n\n/**\n * tRPC error codes that are considered retryable\n * With out of the box SSE, the client will reconnect when these errors are encountered\n */\nexport const retryableRpcCodes: TRPC_ERROR_CODE_NUMBER[] = [\n TRPC_ERROR_CODES_BY_KEY.BAD_GATEWAY,\n TRPC_ERROR_CODES_BY_KEY.SERVICE_UNAVAILABLE,\n TRPC_ERROR_CODES_BY_KEY.GATEWAY_TIMEOUT,\n TRPC_ERROR_CODES_BY_KEY.INTERNAL_SERVER_ERROR,\n];\n","import { emptyObject } from './utils';\n\ninterface ProxyCallbackOptions {\n path: readonly string[];\n args: readonly unknown[];\n}\ntype ProxyCallback = (opts: ProxyCallbackOptions) => unknown;\n\nconst noop = () => {\n // noop\n};\n\nconst freezeIfAvailable = (obj: object) => {\n if (Object.freeze) {\n Object.freeze(obj);\n }\n};\n\nfunction createInnerProxy(\n callback: ProxyCallback,\n path: readonly string[],\n memo: Record<string, unknown>,\n) {\n const cacheKey = path.join('.');\n\n memo[cacheKey] ??= new Proxy(noop, {\n get(_obj, key) {\n if (typeof key !== 'string' || key === 'then') {\n // special case for if the proxy is accidentally treated\n // like a PromiseLike (like in `Promise.resolve(proxy)`)\n return undefined;\n }\n return createInnerProxy(callback, [...path, key], memo);\n },\n apply(_1, _2, args) {\n const lastOfPath = path[path.length - 1];\n\n let opts = { args, path };\n // special handling for e.g. `trpc.hello.call(this, 'there')` and `trpc.hello.apply(this, ['there'])\n if (lastOfPath === 'call') {\n opts = {\n args: args.length >= 2 ? [args[1]] : [],\n path: path.slice(0, -1),\n };\n } else if (lastOfPath === 'apply') {\n opts = {\n args: args.length >= 2 ? args[1] : [],\n path: path.slice(0, -1),\n };\n }\n freezeIfAvailable(opts.args);\n freezeIfAvailable(opts.path);\n return callback(opts);\n },\n });\n\n return memo[cacheKey];\n}\n\n/**\n * Creates a proxy that calls the callback with the path and arguments\n *\n * @internal\n */\nexport const createRecursiveProxy = <TFaux = unknown>(\n callback: ProxyCallback,\n): TFaux => createInnerProxy(callback, [], emptyObject()) as TFaux;\n\n/**\n * Used in place of `new Proxy` where each handler will map 1 level deep to another value.\n *\n * @internal\n */\nexport const createFlatProxy = <TFaux>(\n callback: (path: keyof TFaux) => any,\n): TFaux => {\n return new Proxy(noop, {\n get(_obj, name) {\n if (name === 'then') {\n // special case for if the proxy is accidentally treated\n // like a PromiseLike (like in `Promise.resolve(proxy)`)\n return undefined;\n }\n return callback(name as any);\n },\n }) as TFaux;\n};\n","import type { TRPCError } from '../error/TRPCError';\nimport type { TRPC_ERROR_CODES_BY_KEY, TRPCResponse } from '../rpc';\nimport { TRPC_ERROR_CODES_BY_NUMBER } from '../rpc';\nimport type { InvertKeyValue, ValueOf } from '../types';\nimport { isObject } from '../utils';\n\nexport const JSONRPC2_TO_HTTP_CODE: Record<\n keyof typeof TRPC_ERROR_CODES_BY_KEY,\n number\n> = {\n PARSE_ERROR: 400,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_SUPPORTED: 405,\n TIMEOUT: 408,\n CONFLICT: 409,\n PRECONDITION_FAILED: 412,\n PAYLOAD_TOO_LARGE: 413,\n UNSUPPORTED_MEDIA_TYPE: 415,\n UNPROCESSABLE_CONTENT: 422,\n PRECONDITION_REQUIRED: 428,\n TOO_MANY_REQUESTS: 429,\n CLIENT_CLOSED_REQUEST: 499,\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n};\n\nexport const HTTP_CODE_TO_JSONRPC2: InvertKeyValue<\n typeof JSONRPC2_TO_HTTP_CODE\n> = {\n 400: 'BAD_REQUEST',\n 401: 'UNAUTHORIZED',\n 402: 'PAYMENT_REQUIRED',\n 403: 'FORBIDDEN',\n 404: 'NOT_FOUND',\n 405: 'METHOD_NOT_SUPPORTED',\n 408: 'TIMEOUT',\n 409: 'CONFLICT',\n 412: 'PRECONDITION_FAILED',\n 413: 'PAYLOAD_TOO_LARGE',\n 415: 'UNSUPPORTED_MEDIA_TYPE',\n 422: 'UNPROCESSABLE_CONTENT',\n 428: 'PRECONDITION_REQUIRED',\n 429: 'TOO_MANY_REQUESTS',\n 499: 'CLIENT_CLOSED_REQUEST',\n 500: 'INTERNAL_SERVER_ERROR',\n 501: 'NOT_IMPLEMENTED',\n 502: 'BAD_GATEWAY',\n 503: 'SERVICE_UNAVAILABLE',\n 504: 'GATEWAY_TIMEOUT',\n} as const;\n\nexport function getStatusCodeFromKey(\n code: keyof typeof TRPC_ERROR_CODES_BY_KEY,\n) {\n return JSONRPC2_TO_HTTP_CODE[code] ?? 500;\n}\n\nexport function getStatusKeyFromCode(\n code: keyof typeof HTTP_CODE_TO_JSONRPC2,\n): ValueOf<typeof HTTP_CODE_TO_JSONRPC2> {\n return HTTP_CODE_TO_JSONRPC2[code] ?? 'INTERNAL_SERVER_ERROR';\n}\n\nexport function getHTTPStatusCode(json: TRPCResponse | TRPCResponse[]) {\n const arr = Array.isArray(json) ? json : [json];\n const httpStatuses = new Set<number>(\n arr.map((res) => {\n if ('error' in res && isObject(res.error.data)) {\n if (typeof res.error.data?.['httpStatus'] === 'number') {\n return res.error.data['httpStatus'];\n }\n const code = TRPC_ERROR_CODES_BY_NUMBER[res.error.code];\n return getStatusCodeFromKey(code);\n }\n return 200;\n }),\n );\n\n if (httpStatuses.size !== 1) {\n return 207;\n }\n\n const httpStatus = httpStatuses.values().next().value;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return httpStatus!;\n}\n\nexport function getHTTPStatusCodeFromError(error: TRPCError) {\n return getStatusCodeFromKey(error.code);\n}\n","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var defineProperty = require(\"./defineProperty.js\");\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nmodule.exports = _objectSpread2, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import { getHTTPStatusCodeFromError } from '../http/getHTTPStatusCode';\nimport type { ProcedureType } from '../procedure';\nimport type { AnyRootTypes, RootConfig } from '../rootConfig';\nimport { TRPC_ERROR_CODES_BY_KEY } from '../rpc';\nimport type { DefaultErrorShape } from './formatter';\nimport type { TRPCError } from './TRPCError';\n\n/**\n * @internal\n */\nexport function getErrorShape<TRoot extends AnyRootTypes>(opts: {\n config: RootConfig<TRoot>;\n error: TRPCError;\n type: ProcedureType | 'unknown';\n path: string | undefined;\n input: unknown;\n ctx: TRoot['ctx'] | undefined;\n}): TRoot['errorShape'] {\n const { path, error, config } = opts;\n const { code } = opts.error;\n const shape: DefaultErrorShape = {\n message: error.message,\n code: TRPC_ERROR_CODES_BY_KEY[code],\n data: {\n code,\n httpStatus: getHTTPStatusCodeFromError(error),\n },\n };\n if (config.isDev && typeof opts.error.stack === 'string') {\n shape.data.stack = opts.error.stack;\n }\n if (typeof path === 'string') {\n shape.data.path = path;\n }\n return config.errorFormatter({ ...opts, shape });\n}\n","import type { ProcedureType } from '../procedure';\nimport type {\n TRPC_ERROR_CODE_KEY,\n TRPC_ERROR_CODE_NUMBER,\n TRPCErrorShape,\n} from '../rpc';\nimport type { TRPCError } from './TRPCError';\n\n/**\n * @internal\n */\nexport type ErrorFormatter<TContext, TShape extends TRPCErrorShape> = (opts: {\n error: TRPCError;\n type: ProcedureType | 'unknown';\n path: string | undefined;\n input: unknown;\n ctx: TContext | undefined;\n shape: DefaultErrorShape;\n}) => TShape;\n\n/**\n * @internal\n */\nexport type DefaultErrorData = {\n code: TRPC_ERROR_CODE_KEY;\n httpStatus: number;\n /**\n * Path to the procedure that threw the error\n */\n path?: string;\n /**\n * Stack trace of the error (only in development)\n */\n stack?: string;\n};\n\n/**\n * @internal\n */\nexport interface DefaultErrorShape extends TRPCErrorShape<DefaultErrorData> {\n message: string;\n code: TRPC_ERROR_CODE_NUMBER;\n}\n\nexport const defaultFormatter: ErrorFormatter<any, any> = ({ shape }) => {\n return shape;\n};\n","import type { TRPC_ERROR_CODE_KEY } from '../rpc/codes';\nimport { isObject } from '../utils';\n\nclass UnknownCauseError extends Error {\n [key: string]: unknown;\n\n constructor(cause: object) {\n super(getMessage(cause));\n Object.assign(this, cause);\n }\n}\n\nfunction getMessage(cause: object) {\n if ('message' in cause) return String(cause.message);\n\n return undefined;\n}\n\nexport function getCauseFromUnknown(cause: unknown): Error | undefined {\n if (cause instanceof Error) {\n return cause;\n }\n\n const type = typeof cause;\n if (type === 'undefined' || type === 'function' || cause === null) {\n return undefined;\n }\n\n // Primitive types just get wrapped in an error\n if (type !== 'object') {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return new Error(String(cause));\n }\n\n // If it's an object, we'll create a synthetic error\n if (isObject(cause)) {\n return new UnknownCauseError(cause);\n }\n\n return undefined;\n}\n\nexport function getTRPCErrorFromUnknown(cause: unknown): TRPCError {\n if (cause instanceof TRPCError) {\n return cause;\n }\n if (cause instanceof Error && cause.name === 'TRPCError') {\n // https://github.com/trpc/trpc/pull/4848\n return cause as TRPCError;\n }\n\n const trpcError = new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n cause,\n });\n\n // Inherit stack from error\n if (cause instanceof Error && cause.stack) {\n trpcError.stack = cause.stack;\n }\n\n return trpcError;\n}\n\nexport class TRPCError extends Error {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore override doesn't work in all environments due to \"This member cannot have an 'override' modifier because it is not declared in the base class 'Error'\"\n public override readonly cause?: Error;\n public readonly code;\n\n constructor(opts: {\n message?: string;\n code: TRPC_ERROR_CODE_KEY;\n cause?: unknown;\n }) {\n const cause = getCauseFromUnknown(opts.cause);\n const message = opts.message ?? cause?.message ?? opts.code;\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore https://github.com/tc39/proposal-error-cause\n super(message, { cause });\n\n this.code = opts.code;\n this.name = 'TRPCError';\n this.cause ??= cause;\n }\n}\n","import type { AnyRootTypes, RootConfig } from './rootConfig';\nimport type { AnyRouter, inferRouterError } from './router';\nimport type {\n TRPCResponse,\n TRPCResponseMessage,\n TRPCResultMessage,\n} from './rpc';\nimport { isObject } from './utils';\n\n/**\n * @public\n */\nexport interface DataTransformer {\n serialize(object: any): any;\n deserialize(object: any): any;\n}\n\ninterface InputDataTransformer extends DataTransformer {\n /**\n * This function runs **on the client** before sending the data to the server.\n */\n serialize(object: any): any;\n /**\n * This function runs **on the server** to transform the data before it is passed to the resolver\n */\n deserialize(object: any): any;\n}\n\ninterface OutputDataTransformer extends DataTransformer {\n /**\n * This function runs **on the server** before sending the data to the client.\n */\n serialize(object: any): any;\n /**\n * This function runs **only on the client** to transform the data sent from the server.\n */\n deserialize(object: any): any;\n}\n\n/**\n * @public\n */\nexport interface CombinedDataTransformer {\n /**\n * Specify how the data sent from the client to the server should be transformed.\n */\n input: InputDataTransformer;\n /**\n * Specify how the data sent from the server to the client should be transformed.\n */\n output: OutputDataTransformer;\n}\n\n/**\n * @public\n */\nexport type CombinedDataTransformerClient = {\n input: Pick<CombinedDataTransformer['input'], 'serialize'>;\n output: Pick<CombinedDataTransformer['output'], 'deserialize'>;\n};\n\n/**\n * @public\n */\nexport type DataTransformerOptions = CombinedDataTransformer | DataTransformer;\n\n/**\n * @internal\n */\nexport function getDataTransformer(\n transformer: DataTransformerOptions,\n): CombinedDataTransformer {\n if ('input' in transformer) {\n return transformer;\n }\n return { input: transformer, output: transformer };\n}\n\n/**\n * @internal\n */\nexport const defaultTransformer: CombinedDataTransformer = {\n input: { serialize: (obj) => obj, deserialize: (obj) => obj },\n output: { serialize: (obj) => obj, deserialize: (obj) => obj },\n};\n\nfunction transformTRPCResponseItem<\n TResponseItem extends TRPCResponse | TRPCResponseMessage,\n>(config: RootConfig<AnyRootTypes>, item: TResponseItem): TResponseItem {\n if ('error' in item) {\n return {\n ...item,\n error: config.transformer.output.serialize(item.error),\n };\n }\n\n if ('data' in item.result) {\n return {\n ...item,\n result: {\n ...item.result,\n data: config.transformer.output.serialize(item.result.data),\n },\n };\n }\n\n return item;\n}\n\n/**\n * Takes a unserialized `TRPCResponse` and serializes it with the router's transformers\n **/\nexport function transformTRPCResponse<\n TResponse extends\n | TRPCResponse\n | TRPCResponse[]\n | TRPCResponseMessage\n | TRPCResponseMessage[],\n>(config: RootConfig<AnyRootTypes>, itemOrItems: TResponse) {\n return Array.isArray(itemOrItems)\n ? itemOrItems.map((item) => transformTRPCResponseItem(config, item))\n : transformTRPCResponseItem(config, itemOrItems);\n}\n\n// FIXME:\n// - the generics here are probably unnecessary\n// - the RPC-spec could probably be simplified to combine HTTP + WS\n/** @internal */\nfunction transformResultInner<TRouter extends AnyRouter, TOutput>(\n response:\n | TRPCResponse<TOutput, inferRouterError<TRouter>>\n | TRPCResponseMessage<TOutput, inferRouterError<TRouter>>,\n transformer: DataTransformer,\n) {\n if ('error' in response) {\n const error = transformer.deserialize(\n response.error,\n ) as inferRouterError<TRouter>;\n return {\n ok: false,\n error: {\n ...response,\n error,\n },\n } as const;\n }\n\n const result = {\n ...response.result,\n ...((!response.result.type || response.result.type === 'data') && {\n type: 'data',\n data: transformer.deserialize(response.result.data),\n }),\n } as TRPCResultMessage<TOutput>['result'];\n return { ok: true, result } as const;\n}\n\nclass TransformResultError extends Error {\n constructor() {\n super('Unable to transform response from server');\n }\n}\n\n/**\n * Transforms and validates that the result is a valid TRPCResponse\n * @internal\n */\nexport function transformResult<TRouter extends AnyRouter, TOutput>(\n response:\n | TRPCResponse<TOutput, inferRouterError<TRouter>>\n | TRPCResponseMessage<TOutput, inferRouterError<TRouter>>,\n transformer: DataTransformer,\n): ReturnType<typeof transformResultInner> {\n let result: ReturnType<typeof transformResultInner>;\n try {\n // Use the data transformers on the JSON-response\n result = transformResultInner(response, transformer);\n } catch {\n throw new TransformResultError();\n }\n\n // check that output of the transformers is a valid TRPCResponse\n if (\n !result.ok &&\n (!isObject(result.error.error) ||\n typeof result.error.error['code'] !== 'number')\n ) {\n throw new TransformResultError();\n }\n if (result.ok && !isObject(result.result)) {\n throw new TransformResultError();\n }\n return result;\n}\n","import type { Observable } from '../observable';\nimport { createRecursiveProxy } from './createProxy';\nimport { defaultFormatter } from './error/formatter';\nimport { getTRPCErrorFromUnknown, TRPCError } from './error/TRPCError';\nimport type {\n AnyProcedure,\n ErrorHandlerOptions,\n inferProcedureInput,\n inferProcedureOutput,\n LegacyObservableSubscriptionProcedure,\n} from './procedure';\nimport type { ProcedureCallOptions } from './procedureBuilder';\nimport type { AnyRootTypes, RootConfig } from './rootConfig';\nimport { defaultTransformer } from './transformer';\nimport type { MaybePromise, ValueOf } from './types';\nimport {\n emptyObject,\n isFunction,\n isObject,\n mergeWithoutOverrides,\n} from './utils';\n\nexport interface RouterRecord {\n [key: string]: AnyProcedure | RouterRecord;\n}\n\ntype DecorateProcedure<TProcedure extends AnyProcedure> = (\n input: inferProcedureInput<TProcedure>,\n) => Promise<\n TProcedure['_def']['type'] extends 'subscription'\n ? TProcedure extends LegacyObservableSubscriptionProcedure<any>\n ? Observable<inferProcedureOutput<TProcedure>, TRPCError>\n : inferProcedureOutput<TProcedure>\n : inferProcedureOutput<TProcedure>\n>;\n\n/**\n * @internal\n */\nexport type DecorateRouterRecord<TRecord extends RouterRecord> = {\n [TKey in keyof TRecord]: TRecord[TKey] extends infer $Value\n ? $Value extends AnyProcedure\n ? DecorateProcedure<$Value>\n : $Value extends RouterRecord\n ? DecorateRouterRecord<$Value>\n : never\n : never;\n};\n\n/**\n * @internal\n */\n\nexport type RouterCallerErrorHandler<TContext> = (\n opts: ErrorHandlerOptions<TContext>,\n) => void;\n\n/**\n * @internal\n */\nexport type RouterCaller<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> = (\n /**\n * @note\n * If passing a function, we recommend it's a cached function\n * e.g. wrapped in `React.cache` to avoid unnecessary computations\n */\n ctx: TRoot['ctx'] | (() => MaybePromise<TRoot['ctx']>),\n options?: {\n onError?: RouterCallerErrorHandler<TRoot['ctx']>;\n signal?: AbortSignal;\n },\n) => DecorateRouterRecord<TRecord>;\n\n/**\n * @internal\n */\nconst lazyMarker = 'lazyMarker' as 'lazyMarker' & {\n __brand: 'lazyMarker';\n};\nexport type Lazy<TAny> = (() => Promise<TAny>) & { [lazyMarker]: true };\n\ntype LazyLoader<TAny> = {\n load: () => Promise<void>;\n ref: Lazy<TAny>;\n};\n\nfunction once<T>(fn: () => T): () => T {\n const uncalled = Symbol();\n let result: T | typeof uncalled = uncalled;\n return (): T => {\n if (result === uncalled) {\n result = fn();\n }\n return result;\n };\n}\n\n/**\n * Lazy load a router\n * @see https://trpc.io/docs/server/merging-routers#lazy-load\n */\nexport function lazy<TRouter extends AnyRouter>(\n importRouter: () => Promise<\n | TRouter\n | {\n [key: string]: TRouter;\n }\n >,\n): Lazy<NoInfer<TRouter>> {\n async function resolve(): Promise<TRouter> {\n const mod = await importRouter();\n\n // if the module is a router, return it\n if (isRouter(mod)) {\n return mod;\n }\n\n const routers = Object.values(mod);\n\n if (routers.length !== 1 || !isRouter(routers[0])) {\n throw new Error(\n \"Invalid router module - either define exactly 1 export or return the router directly.\\nExample: `lazy(() => import('./slow.js').then((m) => m.slowRouter))`\",\n );\n }\n\n return routers[0];\n }\n\n (resolve as Lazy<NoInfer<TRouter>>)[lazyMarker] = true as const;\n\n return resolve as Lazy<NoInfer<TRouter>>;\n}\n\nfunction isLazy<TAny>(input: unknown): input is Lazy<TAny> {\n return typeof input === 'function' && lazyMarker in input;\n}\n\n/**\n * @internal\n */\nexport interface RouterDef<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> {\n _config: RootConfig<TRoot>;\n router: true;\n procedure?: never;\n procedures: TRecord;\n record: TRecord;\n lazy: Record<string, LazyLoader<AnyRouter>>;\n}\n\nexport interface Router<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> {\n _def: RouterDef<TRoot, TRecord>;\n /**\n * @see https://trpc.io/docs/v11/server/server-side-calls\n */\n createCaller: RouterCaller<TRoot, TRecord>;\n}\n\nexport type BuiltRouter<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> = Router<TRoot, TRecord> & TRecord;\n\nexport interface RouterBuilder<TRoot extends AnyRootTypes> {\n <TIn extends CreateRouterOptions>(\n _: TIn,\n ): BuiltRouter<TRoot, DecorateCreateRouterOptions<TIn>>;\n}\n\nexport type AnyRouter = Router<any, any>;\n\nexport type inferRouterRootTypes<TRouter extends AnyRouter> =\n TRouter['_def']['_config']['$types'];\n\nexport type inferRouterContext<TRouter extends AnyRouter> =\n inferRouterRootTypes<TRouter>['ctx'];\nexport type inferRouterError<TRouter extends AnyRouter> =\n inferRouterRootTypes<TRouter>['errorShape'];\nexport type inferRouterMeta<TRouter extends AnyRouter> =\n inferRouterRootTypes<TRouter>['meta'];\n\nfunction isRouter(value: unknown): value is AnyRouter {\n return (\n isObject(value) && isObject(value['_def']) && 'router' in value['_def']\n );\n}\n\nconst emptyRouter = {\n _ctx: null as any,\n _errorShape: null as any,\n _meta: null as any,\n queries: {},\n mutations: {},\n subscriptions: {},\n errorFormatter: defaultFormatter,\n transformer: defaultTransformer,\n};\n\n/**\n * Reserved words that can't be used as router or procedure names\n */\nconst reservedWords = [\n /**\n * Then is a reserved word because otherwise we can't return a promise that returns a Proxy\n * since JS will think that `.then` is something that exists\n */\n 'then',\n /**\n * `fn.call()` and `fn.apply()` are reserved words because otherwise we can't call a function using `.call` or `.apply`\n */\n 'call',\n 'apply',\n];\n\n/** @internal */\nexport type CreateRouterOptions = {\n [key: string]:\n | AnyProcedure\n | AnyRouter\n | CreateRouterOptions\n | Lazy<AnyRouter>;\n};\n\n/** @internal */\nexport type DecorateCreateRouterOptions<\n TRouterOptions extends CreateRouterOptions,\n> = {\n [K in keyof TRouterOptions]: TRouterOptions[K] extends infer $Value\n ? $Value extends AnyProcedure\n ? $Value\n : $Value extends Router<any, infer TRecord>\n ? TRecord\n : $Value extends Lazy<Router<any, infer TRecord>>\n ? TRecord\n : $Value extends CreateRouterOptions\n ? DecorateCreateRouterOptions<$Value>\n : never\n : never;\n};\n\n/**\n * @internal\n */\nexport function createRouterFactory<TRoot extends AnyRootTypes>(\n config: RootConfig<TRoot>,\n) {\n function createRouterInner<TInput extends CreateRouterOptions>(\n input: TInput,\n ): BuiltRouter<TRoot, DecorateCreateRouterOptions<TInput>> {\n const reservedWordsUsed = new Set(\n Object.keys(input).filter((v) => reservedWords.includes(v)),\n );\n if (reservedWordsUsed.size > 0) {\n throw new Error(\n 'Reserved words used in `router({})` call: ' +\n Array.from(reservedWordsUsed).join(', '),\n );\n }\n\n const procedures: Record<string, AnyProcedure> = emptyObject();\n const lazy: Record<string, LazyLoader<AnyRouter>> = emptyObject();\n\n function createLazyLoader(opts: {\n ref: Lazy<AnyRouter>;\n path: readonly string[];\n key: string;\n aggregate: RouterRecord;\n }): LazyLoader<AnyRouter> {\n return {\n ref: opts.ref,\n load: once(async () => {\n const router = await opts.ref();\n const lazyPath = [...opts.path, opts.key];\n const lazyKey = lazyPath.join('.');\n\n opts.aggregate[opts.key] = step(router._def.record, lazyPath);\n\n delete lazy[lazyKey];\n\n // add lazy loaders for nested routers\n for (const [nestedKey, nestedItem] of Object.entries(\n router._def.lazy,\n )) {\n const nestedRouterKey = [...lazyPath, nestedKey].join('.');\n\n // console.log('adding lazy', nestedRouterKey);\n lazy[nestedRouterKey] = createLazyLoader({\n ref: nestedItem.ref,\n path: lazyPath,\n key: nestedKey,\n aggregate: opts.aggregate[opts.key] as RouterRecord,\n });\n }\n }),\n };\n }\n\n function step(from: CreateRouterOptions, path: readonly string[] = []) {\n const aggregate: RouterRecord = emptyObject();\n for (const [key, item] of Object.entries(from ?? {})) {\n if (isLazy(item)) {\n lazy[[...path, key].join('.')] = createLazyLoader({\n path,\n ref: item,\n key,\n aggregate,\n });\n continue;\n }\n if (isRouter(item)) {\n aggregate[key] = step(item._def.record, [...path, key]);\n continue;\n }\n if (!isProcedure(item)) {\n // RouterRecord\n aggregate[key] = step(item, [...path, key]);\n continue;\n }\n\n const newPath = [...path, key].join('.');\n\n if (procedures[newPath]) {\n throw new Error(`Duplicate key: ${newPath}`);\n }\n\n procedures[newPath] = item;\n aggregate[key] = item;\n }\n\n return aggregate;\n }\n const record = step(input);\n\n const _def: AnyRouter['_def'] = {\n _config: config,\n router: true,\n procedures,\n lazy,\n ...emptyRouter,\n record,\n };\n\n const router: BuiltRouter<TRoot, {}> = {\n ...(record as {}),\n _def,\n createCaller: createCallerFactory<TRoot>()({\n _def,\n }),\n };\n return router as BuiltRouter<TRoot, DecorateCreateRouterOptions<TInput>>;\n }\n\n return createRouterInner;\n}\n\nfunction isProcedure(\n procedureOrRouter: ValueOf<CreateRouterOptions>,\n): procedureOrRouter is AnyProcedure {\n return typeof procedureOrRouter === 'function';\n}\n\n/**\n * @internal\n */\nexport async function getProcedureAtPath(\n router: Pick<Router<any, any>, '_def'>,\n path: string,\n): Promise<AnyProcedure | null> {\n const { _def } = router;\n let procedure = _def.procedures[path];\n\n while (!procedure) {\n const key = Object.keys(_def.lazy).find((key) => path.startsWith(key));\n // console.log(`found lazy: ${key ?? 'NOPE'} (fullPath: ${fullPath})`);\n\n if (!key) {\n return null;\n }\n // console.log('loading', key, '.......');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const lazyRouter = _def.lazy[key]!;\n await lazyRouter.load();\n\n procedure = _def.procedures[path];\n }\n\n return procedure;\n}\n\n/**\n * @internal\n */\nexport async function callProcedure(\n opts: ProcedureCallOptions<unknown> & {\n router: AnyRouter;\n allowMethodOverride?: boolean;\n },\n) {\n const { type, path } = opts;\n const proc = await getProcedureAtPath(opts.router, path);\n if (\n !proc ||\n !isProcedure(proc) ||\n (proc._def.type !== type && !opts.allowMethodOverride)\n ) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: `No \"${type}\"-procedure on path \"${path}\"`,\n });\n }\n\n /* istanbul ignore if -- @preserve */\n if (\n proc._def.type !== type &&\n opts.allowMethodOverride &&\n proc._def.type === 'subscription'\n ) {\n throw new TRPCError({\n code: 'METHOD_NOT_SUPPORTED',\n message: `Method override is not supported for subscriptions`,\n });\n }\n\n return proc(opts);\n}\n\nexport interface RouterCallerFactory<TRoot extends AnyRootTypes> {\n <TRecord extends RouterRecord>(\n router: Pick<Router<TRoot, TRecord>, '_def'>,\n ): RouterCaller<TRoot, TRecord>;\n}\n\nexport function createCallerFactory<\n TRoot extends AnyRootTypes,\n>(): RouterCallerFactory<TRoot> {\n return function createCallerInner<TRecord extends RouterRecord>(\n router: Pick<Router<TRoot, TRecord>, '_def'>,\n ): RouterCaller<TRoot, TRecord> {\n const { _def } = router;\n type Context = TRoot['ctx'];\n\n return function createCaller(ctxOrCallback, opts) {\n return createRecursiveProxy<ReturnType<RouterCaller<any, any>>>(\n async (innerOpts) => {\n const { path, args } = innerOpts;\n const fullPath = path.join('.');\n\n if (path.length === 1 && path[0] === '_def') {\n return _def;\n }\n\n const procedure = await getProcedureAtPath(router, fullPath);\n\n let ctx: Context | undefined = undefined;\n try {\n if (!procedure) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: `No procedure found on path \"${path}\"`,\n });\n }\n ctx = isFunction(ctxOrCallback)\n ? await Promise.resolve(ctxOrCallback())\n : ctxOrCallback;\n\n return await procedure({\n path: fullPath,\n getRawInput: async () => args[0],\n ctx,\n type: procedure._def.type,\n signal: opts?.signal,\n batchIndex: 0,\n });\n } catch (cause) {\n opts?.onError?.({\n ctx,\n error: getTRPCErrorFromUnknown(cause),\n input: args[0],\n path: fullPath,\n type: procedure?._def.type ?? 'unknown',\n });\n throw cause;\n }\n },\n );\n };\n };\n}\n\n/** @internal */\nexport type MergeRouters<\n TRouters extends AnyRouter[],\n TRoot extends AnyRootTypes = TRouters[0]['_def']['_config']['$types'],\n TRecord extends RouterRecord = {},\n> = TRouters extends [\n infer Head extends AnyRouter,\n ...infer Tail extends AnyRouter[],\n]\n ? MergeRouters<Tail, TRoot, Head['_def']['record'] & TRecord>\n : BuiltRouter<TRoot, TRecord>;\n\nexport function mergeRouters<TRouters extends AnyRouter[]>(\n ...routerList: [...TRouters]\n): MergeRouters<TRouters> {\n const record = mergeWithoutOverrides(\n {},\n ...routerList.map((r) => r._def.record),\n );\n const errorFormatter = routerList.reduce(\n (currentErrorFormatter, nextRouter) => {\n if (\n nextRouter._def._config.errorFormatter &&\n nextRouter._def._config.errorFormatter !== defaultFormatter\n ) {\n if (\n currentErrorFormatter !== defaultFormatter &&\n currentErrorFormatter !== nextRouter._def._config.errorFormatter\n ) {\n throw new Error('You seem to have several error formatters');\n }\n return nextRouter._def._config.errorFormatter;\n }\n return currentErrorFormatter;\n },\n defaultFormatter,\n );\n\n const transformer = routerList.reduce((prev, current) => {\n if (\n current._def._config.transformer &&\n current._def._config.transformer !== defaultTransformer\n ) {\n if (\n prev !== defaultTransformer &&\n prev !== current._def._config.transformer\n ) {\n throw new Error('You seem to have several transformers');\n }\n return current._def._config.transformer;\n }\n return prev;\n }, defaultTransformer);\n\n const router = createRouterFactory({\n errorFormatter,\n transformer,\n isDev: routerList.every((r) => r._def._config.isDev),\n allowOutsideOfServer: routerList.every(\n (r) => r._def._config.allowOutsideOfServer,\n ),\n isServer: routerList.every((r) => r._def._config.isServer),\n $types: routerList[0]?._def._config.$types,\n sse: routerList[0]?._def._config.sse,\n })(record);\n\n return router as MergeRouters<TRouters>;\n}\n","const trackedSymbol = Symbol();\n\ntype TrackedId = string & {\n __brand: 'TrackedId';\n};\nexport type TrackedEnvelope<TData> = [TrackedId, TData, typeof trackedSymbol];\n\nexport interface TrackedData<TData> {\n /**\n * The id of the message to keep track of in case the connection gets lost\n */\n id: string;\n /**\n * The data field of the message\n */\n data: TData;\n}\n/**\n * Produce a typed server-sent event message\n * @deprecated use `tracked(id, data)` instead\n */\nexport function sse<TData>(event: { id: string; data: TData }) {\n return tracked(event.id, event.data);\n}\n\nexport function isTrackedEnvelope<TData>(\n value: unknown,\n): value is TrackedEnvelope<TData> {\n return Array.isArray(value) && value[2] === trackedSymbol;\n}\n\n/**\n * Automatically track an event so that it can be resumed from a given id if the connection is lost\n */\nexport function tracked<TData>(\n id: string,\n data: TData,\n): TrackedEnvelope<TData> {\n if (id === '') {\n // This limitation could be removed by using different SSE event names / channels for tracked event and non-tracked event\n throw new Error(\n '`id` must not be an empty string as empty string is the same as not setting the id at all',\n );\n }\n return [id as TrackedId, data, trackedSymbol];\n}\n\nexport type inferTrackedOutput<TData> =\n TData extends TrackedEnvelope<infer $Data> ? TrackedData<$Data> : TData;\n","import type {\n inferClientTypes,\n InferrableClientTypes,\n Maybe,\n TRPCErrorResponse,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n isObject,\n type DefaultErrorShape,\n} from '@trpc/server/unstable-core-do-not-import';\n\ntype inferErrorShape<TInferrable extends InferrableClientTypes> =\n inferClientTypes<TInferrable>['errorShape'];\nexport interface TRPCClientErrorBase<TShape extends DefaultErrorShape> {\n readonly message: string;\n readonly shape: Maybe<TShape>;\n readonly data: Maybe<TShape['data']>;\n}\nexport type TRPCClientErrorLike<TInferrable extends InferrableClientTypes> =\n TRPCClientErrorBase<inferErrorShape<TInferrable>>;\n\nexport function isTRPCClientError<TInferrable extends InferrableClientTypes>(\n cause: unknown,\n): cause is TRPCClientError<TInferrable> {\n return cause instanceof TRPCClientError;\n}\n\nfunction isTRPCErrorResponse(obj: unknown): obj is TRPCErrorResponse<any> {\n return (\n isObject(obj) &&\n isObject(obj['error']) &&\n typeof obj['error']['code'] === 'number' &&\n typeof obj['error']['message'] === 'string'\n );\n}\n\nfunction getMessageFromUnknownError(err: unknown, fallback: string): string {\n if (typeof err === 'string') {\n return err;\n }\n if (isObject(err) && typeof err['message'] === 'string') {\n return err['message'];\n }\n return fallback;\n}\n\nexport class TRPCClientError<TRouterOrProcedure extends InferrableClientTypes>\n extends Error\n implements TRPCClientErrorBase<inferErrorShape<TRouterOrProcedure>>\n{\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore override doesn't work in all environments due to \"This member cannot have an 'override' modifier because it is not declared in the base class 'Error'\"\n public override readonly cause;\n public readonly shape: Maybe<inferErrorShape<TRouterOrProcedure>>;\n public readonly data: Maybe<inferErrorShape<TRouterOrProcedure>['data']>;\n\n /**\n * Additional meta data about the error\n * In the case of HTTP-errors, we'll have `response` and potentially `responseJSON` here\n */\n public meta;\n\n constructor(\n message: string,\n opts?: {\n result?: Maybe<TRPCErrorResponse<inferErrorShape<TRouterOrProcedure>>>;\n cause?: Error;\n meta?: Record<string, unknown>;\n },\n ) {\n const cause = opts?.cause;\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore https://github.com/tc39/proposal-error-cause\n super(message, { cause });\n\n this.meta = opts?.meta;\n\n this.cause = cause;\n this.shape = opts?.result?.error;\n this.data = opts?.result?.error.data;\n this.name = 'TRPCClientError';\n\n Object.setPrototypeOf(this, TRPCClientError.prototype);\n }\n\n public static from<TRouterOrProcedure extends InferrableClientTypes>(\n _cause: Error | TRPCErrorResponse<any> | object,\n opts: { meta?: Record<string, unknown>; cause?: Error } = {},\n ): TRPCClientError<TRouterOrProcedure> {\n const cause = _cause as unknown;\n\n if (isTRPCClientError(cause)) {\n if (opts.meta) {\n // Decorate with meta error data\n cause.meta = {\n ...cause.meta,\n ...opts.meta,\n };\n }\n return cause;\n }\n if (isTRPCErrorResponse(cause)) {\n return new TRPCClientError(cause.error.message, {\n ...opts,\n result: cause,\n cause: opts.cause,\n });\n }\n return new TRPCClientError(\n getMessageFromUnknownError(cause, 'Unknown error'),\n {\n ...opts,\n cause: cause as any,\n },\n );\n }\n}\n","import type {\n AnyClientTypes,\n CombinedDataTransformer,\n DataTransformerOptions,\n TypeError,\n} from '@trpc/server/unstable-core-do-not-import';\n\n/**\n * @internal\n */\nexport type CoercedTransformerParameters = {\n transformer?: DataTransformerOptions;\n};\n\ntype TransformerOptionYes = {\n /**\n * Data transformer\n *\n * You must use the same transformer on the backend and frontend\n * @see https://trpc.io/docs/v11/data-transformers\n **/\n transformer: DataTransformerOptions;\n};\ntype TransformerOptionNo = {\n /**\n * Data transformer\n *\n * You must use the same transformer on the backend and frontend\n * @see https://trpc.io/docs/v11/data-transformers\n **/\n transformer?: TypeError<'You must define a transformer on your your `initTRPC`-object first'>;\n};\n\n/**\n * @internal\n */\nexport type TransformerOptions<\n TRoot extends Pick<AnyClientTypes, 'transformer'>,\n> = TRoot['transformer'] extends true\n ? TransformerOptionYes\n : TransformerOptionNo;\n/**\n * @internal\n */\n\n/**\n * @internal\n */\nexport function getTransformer(\n transformer:\n | TransformerOptions<{ transformer: false }>['transformer']\n | TransformerOptions<{ transformer: true }>['transformer']\n | undefined,\n): CombinedDataTransformer {\n const _transformer =\n transformer as CoercedTransformerParameters['transformer'];\n if (!_transformer) {\n return {\n input: {\n serialize: (data) => data,\n deserialize: (data) => data,\n },\n output: {\n serialize: (data) => data,\n deserialize: (data) => data,\n },\n };\n }\n if ('input' in _transformer) {\n return _transformer;\n }\n return {\n input: _transformer,\n output: _transformer,\n };\n}\n","import type { FetchEsque, NativeFetchEsque } from './internals/types';\n\ntype AnyFn = (...args: any[]) => unknown;\n\nconst isFunction = (fn: unknown): fn is AnyFn => typeof fn === 'function';\n\nexport function getFetch(\n customFetchImpl?: FetchEsque | NativeFetchEsque,\n): FetchEsque {\n if (customFetchImpl) {\n return customFetchImpl as FetchEsque;\n }\n\n if (typeof window !== 'undefined' && isFunction(window.fetch)) {\n return window.fetch as FetchEsque;\n }\n\n if (typeof globalThis !== 'undefined' && isFunction(globalThis.fetch)) {\n return globalThis.fetch as FetchEsque;\n }\n\n throw new Error('No fetch implementation found');\n}\n","import type {\n AnyClientTypes,\n CombinedDataTransformer,\n Maybe,\n ProcedureType,\n TRPCAcceptHeader,\n TRPCResponse,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { getFetch } from '../../getFetch';\nimport type {\n FetchEsque,\n RequestInitEsque,\n ResponseEsque,\n} from '../../internals/types';\nimport type { TransformerOptions } from '../../unstable-internals';\nimport { getTransformer } from '../../unstable-internals';\nimport type { HTTPHeaders } from '../types';\n\n/**\n * @internal\n */\nexport type HTTPLinkBaseOptions<\n TRoot extends Pick<AnyClientTypes, 'transformer'>,\n> = {\n url: string | URL;\n /**\n * Add ponyfill for fetch\n */\n fetch?: FetchEsque;\n /**\n * Send all requests `as POST`s requests regardless of the procedure type\n * The HTTP handler must separately allow overriding the method. See:\n * @see https://trpc.io/docs/rpc\n */\n methodOverride?: 'POST';\n} & TransformerOptions<TRoot>;\n\nexport interface ResolvedHTTPLinkOptions {\n url: string;\n fetch?: FetchEsque;\n transformer: CombinedDataTransformer;\n methodOverride?: 'POST';\n}\n\nexport function resolveHTTPLinkOptions(\n opts: HTTPLinkBaseOptions<AnyClientTypes>,\n): ResolvedHTTPLinkOptions {\n return {\n url: opts.url.toString(),\n fetch: opts.fetch,\n transformer: getTransformer(opts.transformer),\n methodOverride: opts.methodOverride,\n };\n}\n\n// https://github.com/trpc/trpc/pull/669\nfunction arrayToDict(array: unknown[]) {\n const dict: Record<number, unknown> = {};\n for (let index = 0; index < array.length; index++) {\n const element = array[index];\n dict[index] = element;\n }\n return dict;\n}\n\nconst METHOD = {\n query: 'GET',\n mutation: 'POST',\n subscription: 'PATCH',\n} as const;\n\nexport interface HTTPResult {\n json: TRPCResponse;\n meta: {\n response: ResponseEsque;\n responseJSON?: unknown;\n };\n}\n\ntype GetInputOptions = {\n transformer: CombinedDataTransformer;\n} & ({ input: unknown } | { inputs: unknown[] });\n\nexport function getInput(opts: GetInputOptions) {\n return 'input' in opts\n ? opts.transformer.input.serialize(opts.input)\n : arrayToDict(\n opts.inputs.map((_input) => opts.transformer.input.serialize(_input)),\n );\n}\n\nexport type HTTPBaseRequestOptions = GetInputOptions &\n ResolvedHTTPLinkOptions & {\n type: ProcedureType;\n path: string;\n signal: Maybe<AbortSignal>;\n };\n\ntype GetUrl = (opts: HTTPBaseRequestOptions) => string;\ntype GetBody = (opts: HTTPBaseRequestOptions) => RequestInitEsque['body'];\n\nexport type ContentOptions = {\n trpcAcceptHeader?: TRPCAcceptHeader;\n trpcAcceptHeaderKey?: 'trpc-accept' | 'accept';\n contentTypeHeader?: string;\n getUrl: GetUrl;\n getBody: GetBody;\n};\n\nexport const getUrl: GetUrl = (opts) => {\n const parts = opts.url.split('?') as [string, string?];\n const base = parts[0].replace(/\\/$/, ''); // Remove any trailing slashes\n\n let url = base + '/' + opts.path;\n const queryParts: string[] = [];\n\n if (parts[1]) {\n queryParts.push(parts[1]);\n }\n if ('inputs' in opts) {\n queryParts.push('batch=1');\n }\n if (opts.type === 'query' || opts.type === 'subscription') {\n const input = getInput(opts);\n if (input !== undefined && opts.methodOverride !== 'POST') {\n queryParts.push(`input=${encodeURIComponent(JSON.stringify(input))}`);\n }\n }\n if (queryParts.length) {\n url += '?' + queryParts.join('&');\n }\n return url;\n};\n\nexport const getBody: GetBody = (opts) => {\n if (opts.type === 'query' && opts.methodOverride !== 'POST') {\n return undefined;\n }\n const input = getInput(opts);\n return input !== undefined ? JSON.stringify(input) : undefined;\n};\n\nexport type Requester = (\n opts: HTTPBaseRequestOptions & {\n headers: () => HTTPHeaders | Promise<HTTPHeaders>;\n },\n) => Promise<HTTPResult>;\n\nexport const jsonHttpRequester: Requester = (opts) => {\n return httpRequest({\n ...opts,\n contentTypeHeader: 'application/json',\n getUrl,\n getBody,\n });\n};\n\n/**\n * Polyfill for DOMException with AbortError name\n */\nclass AbortError extends Error {\n constructor() {\n const name = 'AbortError';\n super(name);\n this.name = name;\n this.message = name;\n }\n}\n\nexport type HTTPRequestOptions = ContentOptions &\n HTTPBaseRequestOptions & {\n headers: () => HTTPHeaders | Promise<HTTPHeaders>;\n };\n\n/**\n * Polyfill for `signal.throwIfAborted()`\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/throwIfAborted\n */\nconst throwIfAborted = (signal: Maybe<AbortSignal>) => {\n if (!signal?.aborted) {\n return;\n }\n // If available, use the native implementation\n signal.throwIfAborted?.();\n\n // If we have `DOMException`, use it\n if (typeof DOMException !== 'undefined') {\n throw new DOMException('AbortError', 'AbortError');\n }\n\n // Otherwise, use our own implementation\n throw new AbortError();\n};\n\nexport async function fetchHTTPResponse(opts: HTTPRequestOptions) {\n throwIfAborted(opts.signal);\n\n const url = opts.getUrl(opts);\n const body = opts.getBody(opts);\n const method = opts.methodOverride ?? METHOD[opts.type];\n const resolvedHeaders = await (async () => {\n const heads = await opts.headers();\n if (Symbol.iterator in heads) {\n return Object.fromEntries(heads);\n }\n return heads;\n })();\n const headers = {\n ...(opts.contentTypeHeader && method !== 'GET'\n ? { 'content-type': opts.contentTypeHeader }\n : {}),\n ...(opts.trpcAcceptHeader\n ? { [opts.trpcAcceptHeaderKey ?? 'trpc-accept']: opts.trpcAcceptHeader }\n : undefined),\n ...resolvedHeaders,\n };\n\n return getFetch(opts.fetch)(url, {\n method,\n signal: opts.signal,\n body,\n headers,\n });\n}\n\nexport async function httpRequest(\n opts: HTTPRequestOptions,\n): Promise<HTTPResult> {\n const meta = {} as HTTPResult['meta'];\n\n const res = await fetchHTTPResponse(opts);\n meta.response = res;\n\n const json = await res.json();\n\n meta.responseJSON = json;\n\n return {\n json: json as TRPCResponse,\n meta,\n };\n}\n","export function isOctetType(\n input: unknown,\n): input is Uint8Array<ArrayBuffer> | Blob {\n return (\n input instanceof Uint8Array ||\n // File extends from Blob but is only available in nodejs from v20\n input instanceof Blob\n );\n}\n\nexport function isFormData(input: unknown) {\n return input instanceof FormData;\n}\n\nexport function isNonJsonSerializable(input: unknown) {\n return isOctetType(input) || isFormData(input);\n}\n","import { observable } from '@trpc/server/observable';\nimport type {\n AnyClientTypes,\n AnyRouter,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { transformResult } from '@trpc/server/unstable-core-do-not-import';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type {\n HTTPLinkBaseOptions,\n HTTPResult,\n Requester,\n} from './internals/httpUtils';\nimport {\n getUrl,\n httpRequest,\n jsonHttpRequester,\n resolveHTTPLinkOptions,\n} from './internals/httpUtils';\nimport {\n isFormData,\n isOctetType,\n type HTTPHeaders,\n type Operation,\n type TRPCLink,\n} from './types';\n\nexport type HTTPLinkOptions<TRoot extends AnyClientTypes> =\n HTTPLinkBaseOptions<TRoot> & {\n /**\n * Headers to be set on outgoing requests or a callback that of said headers\n * @see http://trpc.io/docs/client/headers\n */\n headers?:\n | HTTPHeaders\n | ((opts: { op: Operation }) => HTTPHeaders | Promise<HTTPHeaders>);\n };\n\nconst universalRequester: Requester = (opts) => {\n if ('input' in opts) {\n const { input } = opts;\n if (isFormData(input)) {\n if (opts.type !== 'mutation' && opts.methodOverride !== 'POST') {\n throw new Error('FormData is only supported for mutations');\n }\n\n return httpRequest({\n ...opts,\n // The browser will set this automatically and include the boundary= in it\n contentTypeHeader: undefined,\n getUrl,\n getBody: () => input,\n });\n }\n\n if (isOctetType(input)) {\n if (opts.type !== 'mutation' && opts.methodOverride !== 'POST') {\n throw new Error('Octet type input is only supported for mutations');\n }\n\n return httpRequest({\n ...opts,\n contentTypeHeader: 'application/octet-stream',\n getUrl,\n getBody: () => input,\n });\n }\n }\n\n return jsonHttpRequester(opts);\n};\n\n/**\n * @see https://trpc.io/docs/client/links/httpLink\n */\nexport function httpLink<TRouter extends AnyRouter = AnyRouter>(\n opts: HTTPLinkOptions<TRouter['_def']['_config']['$types']>,\n): TRPCLink<TRouter> {\n const resolvedOpts = resolveHTTPLinkOptions(opts);\n return () => {\n return (operationOpts) => {\n const { op } = operationOpts;\n return observable((observer) => {\n const { path, input, type } = op;\n /* istanbul ignore if -- @preserve */\n if (type === 'subscription') {\n throw new Error(\n 'Subscriptions are unsupported by `httpLink` - use `httpSubscriptionLink` or `wsLink`',\n );\n }\n\n const request = universalRequester({\n ...resolvedOpts,\n type,\n path,\n input,\n signal: op.signal,\n headers() {\n if (!opts.headers) {\n return {};\n }\n if (typeof opts.headers === 'function') {\n return opts.headers({\n op,\n });\n }\n return opts.headers;\n },\n });\n let meta: HTTPResult['meta'] | undefined = undefined;\n request\n .then((res) => {\n meta = res.meta;\n const transformed = transformResult(\n res.json,\n resolvedOpts.transformer.output,\n );\n\n if (!transformed.ok) {\n observer.error(\n TRPCClientError.from(transformed.error, {\n meta,\n }),\n );\n return;\n }\n observer.next({\n context: res.meta,\n result: transformed.result,\n });\n observer.complete();\n })\n .catch((cause) => {\n observer.error(TRPCClientError.from(cause, { meta }));\n });\n\n return () => {\n // noop\n };\n });\n };\n };\n}\n","import type { Encoder } from '@trpc/server/adapters/ws';\n\nexport type { Encoder };\n\nexport const jsonEncoder: Encoder = {\n encode: (data) => JSON.stringify(data),\n decode: (data) => {\n if (typeof data !== 'string') {\n throw new Error(\n 'jsonEncoder received binary data. JSON uses text frames. ' +\n 'Use a binary encoder for binary data.',\n );\n }\n return JSON.parse(data);\n },\n};\n","import type { UrlOptionsWithConnectionParams } from '../../internals/urlWithConnectionParams';\nimport type { Encoder } from './encoder';\n\nexport interface WebSocketClientOptions extends UrlOptionsWithConnectionParams {\n /**\n * Ponyfill which WebSocket implementation to use\n */\n WebSocket?: typeof WebSocket;\n /**\n * The number of milliseconds before a reconnect is attempted.\n * @default {@link exponentialBackoff}\n */\n retryDelayMs?: (attemptIndex: number) => number;\n /**\n * Triggered when a WebSocket connection is established\n */\n onOpen?: () => void;\n /**\n * Triggered when a WebSocket connection encounters an error\n */\n onError?: (evt?: Event) => void;\n /**\n * Triggered when a WebSocket connection is closed\n */\n onClose?: (cause?: { code?: number }) => void;\n /**\n * Lazy mode will close the WebSocket automatically after a period of inactivity (no messages sent or received and no pending requests)\n */\n lazy?: {\n /**\n * Enable lazy mode\n * @default false\n */\n enabled: boolean;\n /**\n * Close the WebSocket after this many milliseconds\n * @default 0\n */\n closeMs: number;\n };\n /**\n * Send ping messages to the server and kill the connection if no pong message is returned\n */\n keepAlive?: {\n /**\n * @default false\n */\n enabled: boolean;\n /**\n * Send a ping message every this many milliseconds\n * @default 5_000\n */\n intervalMs?: number;\n /**\n * Close the WebSocket after this many milliseconds if the server does not respond\n * @default 1_000\n */\n pongTimeoutMs?: number;\n };\n /**\n * Custom encoder for wire encoding (e.g. custom binary formats)\n * @default jsonEncoder\n */\n experimental_encoder?: Encoder;\n}\n\n/**\n * Default options for lazy WebSocket connections.\n * Determines whether the connection should be established lazily and defines the delay before closure.\n */\nexport type LazyOptions = Required<NonNullable<WebSocketClientOptions['lazy']>>;\nexport const lazyDefaults: LazyOptions = {\n enabled: false,\n closeMs: 0,\n};\n\n/**\n * Default options for the WebSocket keep-alive mechanism.\n * Configures whether keep-alive is enabled and specifies the timeout and interval for ping-pong messages.\n */\nexport type KeepAliveOptions = Required<\n NonNullable<WebSocketClientOptions['keepAlive']>\n>;\nexport const keepAliveDefaults: KeepAliveOptions = {\n enabled: false,\n pongTimeoutMs: 1_000,\n intervalMs: 5_000,\n};\n\n/**\n * Calculates a delay for exponential backoff based on the retry attempt index.\n * The delay starts at 0 for the first attempt and doubles for each subsequent attempt,\n * capped at 30 seconds.\n */\nexport const exponentialBackoff = (attemptIndex: number) => {\n return attemptIndex === 0 ? 0 : Math.min(1000 * 2 ** attemptIndex, 30000);\n};\n","import { type TRPCRequestInfo } from '@trpc/server/http';\n\n/**\n * Get the result of a value or function that returns a value\n * It also optionally accepts typesafe arguments for the function\n */\nexport const resultOf = <T, TArgs extends any[]>(\n value: T | ((...args: TArgs) => T),\n ...args: TArgs\n): T => {\n return typeof value === 'function'\n ? (value as (...args: TArgs) => T)(...args)\n : value;\n};\n\n/**\n * A value that can be wrapped in callback\n */\nexport type CallbackOrValue<T> = T | (() => T | Promise<T>);\n\nexport interface UrlOptionsWithConnectionParams {\n /**\n * The URL to connect to (can be a function that returns a URL)\n */\n url: CallbackOrValue<string>;\n\n /**\n * Connection params that are available in `createContext()`\n * - For `wsLink`/`wsClient`, these are sent as the first message\n * - For `httpSubscriptionLink`, these are serialized as part of the URL under the `connectionParams` query\n */\n connectionParams?: CallbackOrValue<TRPCRequestInfo['connectionParams']>;\n}\n","import type {\n TRPCConnectionParamsMessage,\n TRPCRequestInfo,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type {\n CallbackOrValue,\n UrlOptionsWithConnectionParams,\n} from '../../internals/urlWithConnectionParams';\nimport { resultOf } from '../../internals/urlWithConnectionParams';\nimport type { Encoder } from './encoder';\n\nexport class TRPCWebSocketClosedError extends Error {\n constructor(opts: { message: string; cause?: unknown }) {\n super(opts.message, {\n cause: opts.cause,\n });\n this.name = 'TRPCWebSocketClosedError';\n Object.setPrototypeOf(this, TRPCWebSocketClosedError.prototype);\n }\n}\n\n/**\n * Utility class for managing a timeout that can be started, stopped, and reset.\n * Useful for scenarios where the timeout duration is reset dynamically based on events.\n */\nexport class ResettableTimeout {\n private timeout: ReturnType<typeof setTimeout> | undefined;\n\n constructor(\n private readonly onTimeout: () => void,\n private readonly timeoutMs: number,\n ) {}\n\n /**\n * Resets the current timeout, restarting it with the same duration.\n * Does nothing if no timeout is active.\n */\n public reset() {\n if (!this.timeout) return;\n\n clearTimeout(this.timeout);\n this.timeout = setTimeout(this.onTimeout, this.timeoutMs);\n }\n\n public start() {\n clearTimeout(this.timeout);\n this.timeout = setTimeout(this.onTimeout, this.timeoutMs);\n }\n\n public stop() {\n clearTimeout(this.timeout);\n this.timeout = undefined;\n }\n}\n\n// Ponyfill for Promise.withResolvers https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers\nexport function withResolvers<T>() {\n let resolve: (value: T | PromiseLike<T>) => void;\n let reject: (reason?: any) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return { promise, resolve: resolve!, reject: reject! };\n}\n\n/**\n * Resolves a WebSocket URL and optionally appends connection parameters.\n *\n * If connectionParams are provided, appends 'connectionParams=1' query parameter.\n */\nexport async function prepareUrl(urlOptions: UrlOptionsWithConnectionParams) {\n const url = await resultOf(urlOptions.url);\n\n if (!urlOptions.connectionParams) return url;\n\n // append `?connectionParams=1` when connection params are used\n const prefix = url.includes('?') ? '&' : '?';\n const connectionParams = `${prefix}connectionParams=1`;\n\n return url + connectionParams;\n}\n\nexport async function buildConnectionMessage(\n connectionParams: CallbackOrValue<TRPCRequestInfo['connectionParams']>,\n encoder: Encoder,\n) {\n const message: TRPCConnectionParamsMessage = {\n method: 'connectionParams',\n data: await resultOf(connectionParams),\n };\n\n return encoder.encode(message);\n}\n","import type { AnyTRPCRouter, inferRouterError } from '@trpc/server';\nimport type { Observer } from '@trpc/server/observable';\nimport type {\n TRPCClientOutgoingMessage,\n TRPCResponseMessage,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type { TRPCClientError } from '../../../TRPCClientError';\nimport { withResolvers } from './utils';\n\nexport type TCallbacks = Observer<\n TRPCResponseMessage<unknown, inferRouterError<AnyTRPCRouter>>,\n TRPCClientError<AnyTRPCRouter>\n>;\n\ntype MessageId = string;\ntype MessageIdLike = string | number | null;\n\n/**\n * Represents a WebSocket request managed by the RequestManager.\n * Combines the network message, a utility promise (`end`) that mirrors the lifecycle\n * handled by `callbacks`, and a set of state monitoring callbacks.\n */\ninterface Request {\n message: TRPCClientOutgoingMessage;\n end: Promise<void>;\n callbacks: TCallbacks;\n}\n\n/**\n * Manages WebSocket requests, tracking their lifecycle and providing utility methods\n * for handling outgoing and pending requests.\n *\n * - **Outgoing requests**: Requests that are queued and waiting to be sent.\n * - **Pending requests**: Requests that have been sent and are in flight awaiting a response.\n * For subscriptions, multiple responses may be received until the subscription is closed.\n */\nexport class RequestManager {\n /**\n * Stores requests that are outgoing, meaning they are registered but not yet sent over the WebSocket.\n */\n private outgoingRequests = new Array<Request & { id: MessageId }>();\n\n /**\n * Stores requests that are pending (in flight), meaning they have been sent over the WebSocket\n * and are awaiting responses. For subscriptions, this includes requests\n * that may receive multiple responses.\n */\n private pendingRequests: Record<MessageId, Request> = {};\n\n /**\n * Registers a new request by adding it to the outgoing queue and setting up\n * callbacks for lifecycle events such as completion or error.\n *\n * @param message - The outgoing message to be sent.\n * @param callbacks - Callback functions to observe the request's state.\n * @returns A cleanup function to manually remove the request.\n */\n public register(message: TRPCClientOutgoingMessage, callbacks: TCallbacks) {\n const { promise: end, resolve } = withResolvers<void>();\n\n this.outgoingRequests.push({\n id: String(message.id),\n message,\n end,\n callbacks: {\n next: callbacks.next,\n complete: () => {\n callbacks.complete();\n resolve();\n },\n error: (e) => {\n callbacks.error(e);\n resolve();\n },\n },\n });\n\n return () => {\n this.delete(message.id);\n callbacks.complete();\n resolve();\n };\n }\n\n /**\n * Deletes a request from both the outgoing and pending collections, if it exists.\n */\n public delete(messageId: MessageIdLike) {\n if (messageId === null) return;\n\n this.outgoingRequests = this.outgoingRequests.filter(\n ({ id }) => id !== String(messageId),\n );\n delete this.pendingRequests[String(messageId)];\n }\n\n /**\n * Moves all outgoing requests to the pending state and clears the outgoing queue.\n *\n * The caller is expected to handle the actual sending of the requests\n * (e.g., sending them over the network) after this method is called.\n *\n * @returns The list of requests that were transitioned to the pending state.\n */\n public flush() {\n const requests = this.outgoingRequests;\n this.outgoingRequests = [];\n\n for (const request of requests) {\n this.pendingRequests[request.id] = request;\n }\n return requests;\n }\n\n /**\n * Retrieves all currently pending requests, which are in flight awaiting responses\n * or handling ongoing subscriptions.\n */\n public getPendingRequests() {\n return Object.values(this.pendingRequests);\n }\n\n /**\n * Retrieves a specific pending request by its message ID.\n */\n public getPendingRequest(messageId: MessageIdLike) {\n if (messageId === null) return null;\n\n return this.pendingRequests[String(messageId)];\n }\n\n /**\n * Retrieves all outgoing requests, which are waiting to be sent.\n */\n public getOutgoingRequests() {\n return this.outgoingRequests;\n }\n\n /**\n * Retrieves all requests, both outgoing and pending, with their respective states.\n *\n * @returns An array of all requests with their state (\"outgoing\" or \"pending\").\n */\n public getRequests() {\n return [\n ...this.getOutgoingRequests().map((request) => ({\n state: 'outgoing' as const,\n message: request.message,\n end: request.end,\n callbacks: request.callbacks,\n })),\n ...this.getPendingRequests().map((request) => ({\n state: 'pending' as const,\n message: request.message,\n end: request.end,\n callbacks: request.callbacks,\n })),\n ];\n }\n\n /**\n * Checks if there are any pending requests, including ongoing subscriptions.\n */\n public hasPendingRequests() {\n return this.getPendingRequests().length > 0;\n }\n\n /**\n * Checks if there are any pending subscriptions\n */\n public hasPendingSubscriptions() {\n return this.getPendingRequests().some(\n (request) => request.message.method === 'subscription',\n );\n }\n\n /**\n * Checks if there are any outgoing requests waiting to be sent.\n */\n public hasOutgoingRequests() {\n return this.outgoingRequests.length > 0;\n }\n}\n","import { behaviorSubject } from '@trpc/server/observable';\nimport type { UrlOptionsWithConnectionParams } from '../../internals/urlWithConnectionParams';\nimport type { Encoder } from './encoder';\nimport { buildConnectionMessage, prepareUrl, withResolvers } from './utils';\n\n/**\n * Opens a WebSocket connection asynchronously and returns a promise\n * that resolves when the connection is successfully established.\n * The promise rejects if an error occurs during the connection attempt.\n */\nfunction asyncWsOpen(ws: WebSocket) {\n const { promise, resolve, reject } = withResolvers<void>();\n\n ws.addEventListener('open', () => {\n ws.removeEventListener('error', reject);\n resolve();\n });\n ws.addEventListener('error', reject);\n\n return promise;\n}\n\ninterface PingPongOptions {\n /**\n * The interval (in milliseconds) between \"PING\" messages.\n */\n intervalMs: number;\n\n /**\n * The timeout (in milliseconds) to wait for a \"PONG\" response before closing the connection.\n */\n pongTimeoutMs: number;\n}\n\n/**\n * Sets up a periodic ping-pong mechanism to keep the WebSocket connection alive.\n *\n * - Sends \"PING\" messages at regular intervals defined by `intervalMs`.\n * - If a \"PONG\" response is not received within the `pongTimeoutMs`, the WebSocket is closed.\n * - The ping timer resets upon receiving any message to maintain activity.\n * - Automatically starts the ping process when the WebSocket connection is opened.\n * - Cleans up timers when the WebSocket is closed.\n *\n * @param ws - The WebSocket instance to manage.\n * @param options - Configuration options for ping-pong intervals and timeouts.\n */\nfunction setupPingInterval(\n ws: WebSocket,\n { intervalMs, pongTimeoutMs }: PingPongOptions,\n) {\n let pingTimeout: ReturnType<typeof setTimeout> | undefined;\n let pongTimeout: ReturnType<typeof setTimeout> | undefined;\n\n function start() {\n pingTimeout = setTimeout(() => {\n ws.send('PING');\n pongTimeout = setTimeout(() => {\n ws.close();\n }, pongTimeoutMs);\n }, intervalMs);\n }\n\n function reset() {\n clearTimeout(pingTimeout);\n start();\n }\n\n function pong() {\n clearTimeout(pongTimeout);\n reset();\n }\n\n ws.addEventListener('open', start);\n ws.addEventListener('message', ({ data }) => {\n clearTimeout(pingTimeout);\n start();\n\n if (data === 'PONG') {\n pong();\n }\n });\n ws.addEventListener('close', () => {\n clearTimeout(pingTimeout);\n clearTimeout(pongTimeout);\n });\n}\n\nexport interface WebSocketConnectionOptions {\n WebSocketPonyfill?: typeof WebSocket;\n urlOptions: UrlOptionsWithConnectionParams;\n keepAlive: PingPongOptions & {\n enabled: boolean;\n };\n encoder: Encoder;\n}\n\n/**\n * Manages a WebSocket connection with support for reconnection, keep-alive mechanisms,\n * and observable state tracking.\n */\nexport class WsConnection {\n static connectCount = 0;\n public id = ++WsConnection.connectCount;\n\n private readonly WebSocketPonyfill: typeof WebSocket;\n private readonly urlOptions: UrlOptionsWithConnectionParams;\n private readonly keepAliveOpts: WebSocketConnectionOptions['keepAlive'];\n private readonly encoder: Encoder;\n public readonly wsObservable = behaviorSubject<WebSocket | null>(null);\n\n constructor(opts: WebSocketConnectionOptions) {\n this.WebSocketPonyfill = opts.WebSocketPonyfill ?? WebSocket;\n if (!this.WebSocketPonyfill) {\n throw new Error(\n \"No WebSocket implementation found - you probably don't want to use this on the server, but if you do you need to pass a `WebSocket`-ponyfill\",\n );\n }\n\n this.urlOptions = opts.urlOptions;\n this.keepAliveOpts = opts.keepAlive;\n this.encoder = opts.encoder;\n }\n\n public get ws() {\n return this.wsObservable.get();\n }\n\n private set ws(ws) {\n this.wsObservable.next(ws);\n }\n\n /**\n * Checks if the WebSocket connection is open and ready to communicate.\n */\n public isOpen(): this is { ws: WebSocket } {\n return (\n !!this.ws &&\n this.ws.readyState === this.WebSocketPonyfill.OPEN &&\n !this.openPromise\n );\n }\n\n /**\n * Checks if the WebSocket connection is closed or in the process of closing.\n */\n public isClosed(): this is { ws: WebSocket } {\n return (\n !!this.ws &&\n (this.ws.readyState === this.WebSocketPonyfill.CLOSING ||\n this.ws.readyState === this.WebSocketPonyfill.CLOSED)\n );\n }\n\n /**\n * Manages the WebSocket opening process, ensuring that only one open operation\n * occurs at a time. Tracks the ongoing operation with `openPromise` to avoid\n * redundant calls and ensure proper synchronization.\n *\n * Sets up the keep-alive mechanism and necessary event listeners for the connection.\n *\n * @returns A promise that resolves once the WebSocket connection is successfully opened.\n */\n private openPromise: Promise<void> | null = null;\n public async open() {\n if (this.openPromise) return this.openPromise;\n\n this.id = ++WsConnection.connectCount;\n const wsPromise = prepareUrl(this.urlOptions).then(\n (url) => new this.WebSocketPonyfill(url),\n );\n this.openPromise = wsPromise.then(async (ws) => {\n this.ws = ws;\n\n // Set binaryType to handle both text and binary messages consistently\n ws.binaryType = 'arraybuffer';\n\n // Setup ping listener\n ws.addEventListener('message', function ({ data }) {\n if (data === 'PING') {\n this.send('PONG');\n }\n });\n\n if (this.keepAliveOpts.enabled) {\n setupPingInterval(ws, this.keepAliveOpts);\n }\n\n ws.addEventListener('close', () => {\n if (this.ws === ws) {\n this.ws = null;\n }\n });\n\n await asyncWsOpen(ws);\n\n if (this.urlOptions.connectionParams) {\n ws.send(\n await buildConnectionMessage(\n this.urlOptions.connectionParams,\n this.encoder,\n ),\n );\n }\n });\n\n try {\n await this.openPromise;\n } finally {\n this.openPromise = null;\n }\n }\n\n /**\n * Closes the WebSocket connection gracefully.\n * Waits for any ongoing open operation to complete before closing.\n */\n public async close() {\n try {\n await this.openPromise;\n } finally {\n this.ws?.close();\n }\n }\n}\n\n/**\n * Provides a backward-compatible representation of the connection state.\n */\nexport function backwardCompatibility(connection: WsConnection) {\n if (connection.isOpen()) {\n return {\n id: connection.id,\n state: 'open',\n ws: connection.ws,\n } as const;\n }\n\n if (connection.isClosed()) {\n return {\n id: connection.id,\n state: 'closed',\n ws: connection.ws,\n } as const;\n }\n\n if (!connection.ws) {\n return null;\n }\n\n return {\n id: connection.id,\n state: 'connecting',\n ws: connection.ws,\n } as const;\n}\n","import type { AnyTRPCRouter } from '@trpc/server';\nimport type { BehaviorSubject } from '@trpc/server/observable';\nimport { behaviorSubject, observable } from '@trpc/server/observable';\nimport type {\n CombinedDataTransformer,\n TRPCClientIncomingMessage,\n TRPCClientIncomingRequest,\n TRPCClientOutgoingMessage,\n TRPCResponseMessage,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n run,\n sleep,\n transformResult,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { TRPCClientError } from '../../../TRPCClientError';\nimport type { TRPCConnectionState } from '../../internals/subscriptions';\nimport type { Operation, OperationResultEnvelope } from '../../types';\nimport type { Encoder } from './encoder';\nimport { jsonEncoder } from './encoder';\nimport type { WebSocketClientOptions } from './options';\nimport { exponentialBackoff, keepAliveDefaults, lazyDefaults } from './options';\nimport type { TCallbacks } from './requestManager';\nimport { RequestManager } from './requestManager';\nimport { ResettableTimeout, TRPCWebSocketClosedError } from './utils';\nimport { backwardCompatibility, WsConnection } from './wsConnection';\n\n/**\n * A WebSocket client for managing TRPC operations, supporting lazy initialization,\n * reconnection, keep-alive, and request management.\n */\nexport class WsClient {\n /**\n * Observable tracking the current connection state, including errors.\n */\n public readonly connectionState: BehaviorSubject<\n TRPCConnectionState<TRPCClientError<AnyTRPCRouter>>\n >;\n\n private allowReconnect = false;\n private requestManager = new RequestManager();\n private readonly activeConnection: WsConnection;\n private readonly reconnectRetryDelay: (attemptIndex: number) => number;\n private inactivityTimeout: ResettableTimeout;\n private readonly callbacks: Pick<\n WebSocketClientOptions,\n 'onOpen' | 'onClose' | 'onError'\n >;\n private readonly lazyMode: boolean;\n private readonly encoder: Encoder;\n\n constructor(opts: WebSocketClientOptions) {\n this.encoder = opts.experimental_encoder ?? jsonEncoder;\n // Initialize callbacks, connection parameters, and options.\n this.callbacks = {\n onOpen: opts.onOpen,\n onClose: opts.onClose,\n onError: opts.onError,\n };\n\n const lazyOptions = {\n ...lazyDefaults,\n ...opts.lazy,\n };\n\n // Set up inactivity timeout for lazy connections.\n this.inactivityTimeout = new ResettableTimeout(() => {\n if (\n this.requestManager.hasOutgoingRequests() ||\n this.requestManager.hasPendingRequests()\n ) {\n this.inactivityTimeout.reset();\n return;\n }\n\n this.close().catch(() => null);\n }, lazyOptions.closeMs);\n\n // Initialize the WebSocket connection.\n this.activeConnection = new WsConnection({\n WebSocketPonyfill: opts.WebSocket,\n urlOptions: opts,\n keepAlive: {\n ...keepAliveDefaults,\n ...opts.keepAlive,\n },\n encoder: this.encoder,\n });\n this.activeConnection.wsObservable.subscribe({\n next: (ws) => {\n if (!ws) return;\n this.setupWebSocketListeners(ws);\n },\n });\n this.reconnectRetryDelay = opts.retryDelayMs ?? exponentialBackoff;\n\n this.lazyMode = lazyOptions.enabled;\n\n this.connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<AnyTRPCRouter>>\n >({\n type: 'state',\n state: lazyOptions.enabled ? 'idle' : 'connecting',\n error: null,\n });\n\n // Automatically open the connection if lazy mode is disabled.\n if (!this.lazyMode) {\n this.open().catch(() => null);\n }\n }\n\n /**\n * Opens the WebSocket connection. Handles reconnection attempts and updates\n * the connection state accordingly.\n */\n private async open() {\n this.allowReconnect = true;\n if (this.connectionState.get().state === 'idle') {\n this.connectionState.next({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n }\n\n try {\n await this.activeConnection.open();\n } catch (error) {\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'Initialization error',\n cause: error,\n }),\n );\n return this.reconnecting;\n }\n }\n\n /**\n * Closes the WebSocket connection and stops managing requests.\n * Ensures all outgoing and pending requests are properly finalized.\n */\n public async close() {\n this.allowReconnect = false;\n this.inactivityTimeout.stop();\n\n const requestsToAwait: Promise<void>[] = [];\n for (const request of this.requestManager.getRequests()) {\n if (request.message.method === 'subscription') {\n request.callbacks.complete();\n } else if (request.state === 'outgoing') {\n request.callbacks.error(\n TRPCClientError.from(\n new TRPCWebSocketClosedError({\n message: 'Closed before connection was established',\n }),\n ),\n );\n } else {\n requestsToAwait.push(request.end);\n }\n }\n\n await Promise.all(requestsToAwait).catch(() => null);\n await this.activeConnection.close().catch(() => null);\n\n this.connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n }\n\n /**\n * Method to request the server.\n * Handles data transformation, batching of requests, and subscription lifecycle.\n *\n * @param op - The operation details including id, type, path, input and signal\n * @param transformer - Data transformer for serializing requests and deserializing responses\n * @param lastEventId - Optional ID of the last received event for subscriptions\n *\n * @returns An observable that emits operation results and handles cleanup\n */\n public request({\n op: { id, type, path, input, signal },\n transformer,\n lastEventId,\n }: {\n op: Pick<Operation, 'id' | 'type' | 'path' | 'input' | 'signal'>;\n transformer: CombinedDataTransformer;\n lastEventId?: string;\n }) {\n return observable<\n OperationResultEnvelope<unknown, TRPCClientError<AnyTRPCRouter>>,\n TRPCClientError<AnyTRPCRouter>\n >((observer) => {\n const abort = this.batchSend(\n {\n id,\n method: type,\n params: {\n input: transformer.input.serialize(input),\n path,\n lastEventId,\n },\n },\n {\n ...observer,\n next(event) {\n const transformed = transformResult(event, transformer.output);\n\n if (!transformed.ok) {\n observer.error(TRPCClientError.from(transformed.error));\n return;\n }\n\n observer.next({\n result: transformed.result,\n });\n },\n },\n );\n\n return () => {\n abort();\n\n if (type === 'subscription' && this.activeConnection.isOpen()) {\n this.send({\n id,\n method: 'subscription.stop',\n });\n }\n\n signal?.removeEventListener('abort', abort);\n };\n });\n }\n\n public get connection() {\n return backwardCompatibility(this.activeConnection);\n }\n\n /**\n * Manages the reconnection process for the WebSocket using retry logic.\n * Ensures that only one reconnection attempt is active at a time by tracking the current\n * reconnection state in the `reconnecting` promise.\n */\n private reconnecting: Promise<void> | null = null;\n private reconnect(closedError: TRPCWebSocketClosedError) {\n this.connectionState.next({\n type: 'state',\n state: 'connecting',\n error: TRPCClientError.from(closedError),\n });\n if (this.reconnecting) return;\n\n const tryReconnect = async (attemptIndex: number) => {\n try {\n await sleep(this.reconnectRetryDelay(attemptIndex));\n if (this.allowReconnect) {\n await this.activeConnection.close();\n await this.activeConnection.open();\n\n if (this.requestManager.hasPendingRequests()) {\n this.send(\n this.requestManager\n .getPendingRequests()\n .map(({ message }) => message),\n );\n }\n }\n this.reconnecting = null;\n } catch {\n await tryReconnect(attemptIndex + 1);\n }\n };\n\n this.reconnecting = tryReconnect(0);\n }\n\n private setupWebSocketListeners(ws: WebSocket) {\n const handleCloseOrError = (cause: unknown) => {\n const reqs = this.requestManager.getPendingRequests();\n for (const { message, callbacks } of reqs) {\n if (message.method === 'subscription') continue;\n\n callbacks.error(\n TRPCClientError.from(\n cause ??\n new TRPCWebSocketClosedError({\n message: 'WebSocket closed',\n cause,\n }),\n ),\n );\n this.requestManager.delete(message.id);\n }\n };\n\n ws.addEventListener('open', () => {\n run(async () => {\n if (this.lazyMode) {\n this.inactivityTimeout.start();\n }\n\n this.callbacks.onOpen?.();\n\n this.connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n }).catch((error) => {\n ws.close(3000);\n handleCloseOrError(error);\n });\n });\n\n ws.addEventListener('message', ({ data }) => {\n this.inactivityTimeout.reset();\n\n // Handle PING/PONG as text regardless of encoder\n if (['PING', 'PONG'].includes(data)) return;\n\n const incomingMessage = this.encoder.decode(\n data,\n ) as TRPCClientIncomingMessage;\n if ('method' in incomingMessage) {\n this.handleIncomingRequest(incomingMessage);\n return;\n }\n\n this.handleResponseMessage(incomingMessage);\n });\n\n ws.addEventListener('close', (event) => {\n handleCloseOrError(event);\n this.callbacks.onClose?.(event);\n\n if (!this.lazyMode || this.requestManager.hasPendingSubscriptions()) {\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'WebSocket closed',\n cause: event,\n }),\n );\n }\n });\n\n ws.addEventListener('error', (event) => {\n handleCloseOrError(event);\n this.callbacks.onError?.(event);\n\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'WebSocket closed',\n cause: event,\n }),\n );\n });\n }\n\n private handleResponseMessage(message: TRPCResponseMessage) {\n const request = this.requestManager.getPendingRequest(message.id);\n if (!request) return;\n\n request.callbacks.next(message);\n\n let completed = true;\n if ('result' in message && request.message.method === 'subscription') {\n if (message.result.type === 'data') {\n request.message.params.lastEventId = message.result.id;\n }\n\n if (message.result.type !== 'stopped') {\n completed = false;\n }\n }\n\n if (completed) {\n request.callbacks.complete();\n this.requestManager.delete(message.id);\n }\n }\n\n private handleIncomingRequest(message: TRPCClientIncomingRequest) {\n if (message.method === 'reconnect') {\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'Server requested reconnect',\n }),\n );\n }\n }\n\n /**\n * Sends a message or batch of messages directly to the server.\n */\n private send(\n messageOrMessages: TRPCClientOutgoingMessage | TRPCClientOutgoingMessage[],\n ) {\n if (!this.activeConnection.isOpen()) {\n throw new Error('Active connection is not open');\n }\n\n const messages =\n messageOrMessages instanceof Array\n ? messageOrMessages\n : [messageOrMessages];\n this.activeConnection.ws.send(\n this.encoder.encode(messages.length === 1 ? messages[0] : messages),\n );\n }\n\n /**\n * Groups requests for batch sending.\n *\n * @returns A function to abort the batched request.\n */\n private batchSend(message: TRPCClientOutgoingMessage, callbacks: TCallbacks) {\n this.inactivityTimeout.reset();\n\n run(async () => {\n if (!this.activeConnection.isOpen()) {\n await this.open();\n }\n await sleep(0);\n\n if (!this.requestManager.hasOutgoingRequests()) return;\n\n this.send(this.requestManager.flush().map(({ message }) => message));\n }).catch((err) => {\n this.requestManager.delete(message.id);\n callbacks.error(TRPCClientError.from(err));\n });\n\n return this.requestManager.register(message, callbacks);\n }\n}\n","import type { Encoder } from './wsClient/encoder';\nimport { jsonEncoder } from './wsClient/encoder';\nimport type { WebSocketClientOptions } from './wsClient/options';\nimport { WsClient } from './wsClient/wsClient';\n\nexport function createWSClient(opts: WebSocketClientOptions) {\n return new WsClient(opts);\n}\n\nexport type TRPCWebSocketClient = ReturnType<typeof createWSClient>;\n\nexport { jsonEncoder, type Encoder, type WebSocketClientOptions };\n","import { observable } from '@trpc/server/observable';\nimport type {\n AnyRouter,\n inferClientTypes,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type { TransformerOptions } from '../../unstable-internals';\nimport { getTransformer } from '../../unstable-internals';\nimport type { TRPCLink } from '../types';\nimport type {\n Encoder,\n TRPCWebSocketClient,\n WebSocketClientOptions,\n} from './createWsClient';\nimport { createWSClient, jsonEncoder } from './createWsClient';\n\nexport type WebSocketLinkOptions<TRouter extends AnyRouter> = {\n client: TRPCWebSocketClient;\n} & TransformerOptions<inferClientTypes<TRouter>>;\n\nexport function wsLink<TRouter extends AnyRouter>(\n opts: WebSocketLinkOptions<TRouter>,\n): TRPCLink<TRouter> {\n const { client } = opts;\n const transformer = getTransformer(opts.transformer);\n return () => {\n return ({ op }) => {\n return observable((observer) => {\n const connStateSubscription =\n op.type === 'subscription'\n ? client.connectionState.subscribe({\n next(result) {\n observer.next({\n result,\n context: op.context,\n });\n },\n })\n : null;\n\n const requestSubscription = client\n .request({\n op,\n transformer,\n })\n .subscribe(observer);\n\n return () => {\n requestSubscription.unsubscribe();\n connStateSubscription?.unsubscribe();\n };\n });\n };\n };\n}\n\nexport {\n createWSClient,\n jsonEncoder,\n type Encoder,\n type TRPCWebSocketClient,\n type WebSocketClientOptions,\n};\n","import type {\n inferObservableValue,\n Unsubscribable,\n} from '@trpc/server/observable';\nimport { observableToPromise, share } from '@trpc/server/observable';\nimport type {\n AnyRouter,\n inferAsyncIterableYield,\n InferrableClientTypes,\n Maybe,\n TypeError,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { createChain } from '../links/internals/createChain';\nimport type { TRPCConnectionState } from '../links/internals/subscriptions';\nimport type {\n OperationContext,\n OperationLink,\n TRPCClientRuntime,\n TRPCLink,\n} from '../links/types';\nimport { TRPCClientError } from '../TRPCClientError';\n\ntype TRPCType = 'mutation' | 'query' | 'subscription';\nexport interface TRPCRequestOptions {\n /**\n * Pass additional context to links\n */\n context?: OperationContext;\n signal?: AbortSignal;\n}\n\nexport interface TRPCSubscriptionObserver<TValue, TError> {\n onStarted: (opts: { context: OperationContext | undefined }) => void;\n onData: (value: inferAsyncIterableYield<TValue>) => void;\n onError: (err: TError) => void;\n onStopped: () => void;\n onComplete: () => void;\n onConnectionStateChange: (state: TRPCConnectionState<TError>) => void;\n}\n\n/** @internal */\nexport type CreateTRPCClientOptions<TRouter extends InferrableClientTypes> = {\n links: TRPCLink<TRouter>[];\n transformer?: TypeError<'The transformer property has moved to httpLink/httpBatchLink/wsLink'>;\n};\n\nexport class TRPCUntypedClient<TInferrable extends InferrableClientTypes> {\n private readonly links: OperationLink<TInferrable>[];\n public readonly runtime: TRPCClientRuntime;\n private requestId: number;\n\n constructor(opts: CreateTRPCClientOptions<TInferrable>) {\n this.requestId = 0;\n\n this.runtime = {};\n\n // Initialize the links\n this.links = opts.links.map((link) => link(this.runtime));\n }\n\n private $request<TInput = unknown, TOutput = unknown>(opts: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n signal: Maybe<AbortSignal>;\n }) {\n const chain$ = createChain<AnyRouter, TInput, TOutput>({\n links: this.links as OperationLink<any, any, any>[],\n op: {\n ...opts,\n context: opts.context ?? {},\n id: ++this.requestId,\n },\n });\n return chain$.pipe(share());\n }\n\n private async requestAsPromise<TInput = unknown, TOutput = unknown>(opts: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n signal: Maybe<AbortSignal>;\n }): Promise<TOutput> {\n try {\n const req$ = this.$request<TInput, TOutput>(opts);\n type TValue = inferObservableValue<typeof req$>;\n\n const envelope = await observableToPromise<TValue>(req$);\n const data = (envelope.result as any).data;\n return data;\n } catch (err) {\n throw TRPCClientError.from(err as Error);\n }\n }\n public query(path: string, input?: unknown, opts?: TRPCRequestOptions) {\n return this.requestAsPromise<unknown, unknown>({\n type: 'query',\n path,\n input,\n context: opts?.context,\n signal: opts?.signal,\n });\n }\n public mutation(path: string, input?: unknown, opts?: TRPCRequestOptions) {\n return this.requestAsPromise<unknown, unknown>({\n type: 'mutation',\n path,\n input,\n context: opts?.context,\n signal: opts?.signal,\n });\n }\n public subscription(\n path: string,\n input: unknown,\n opts: Partial<\n TRPCSubscriptionObserver<unknown, TRPCClientError<AnyRouter>>\n > &\n TRPCRequestOptions,\n ): Unsubscribable {\n const observable$ = this.$request({\n type: 'subscription',\n path,\n input,\n context: opts.context,\n signal: opts.signal,\n });\n return observable$.subscribe({\n next(envelope) {\n switch (envelope.result.type) {\n case 'state': {\n opts.onConnectionStateChange?.(envelope.result);\n break;\n }\n case 'started': {\n opts.onStarted?.({\n context: envelope.context,\n });\n break;\n }\n case 'stopped': {\n opts.onStopped?.();\n break;\n }\n case 'data':\n case undefined: {\n opts.onData?.(envelope.result.data);\n break;\n }\n }\n },\n error(err) {\n opts.onError?.(err);\n },\n complete() {\n opts.onComplete?.();\n },\n });\n }\n}\n","import type { AnyRouter } from '@trpc/server/unstable-core-do-not-import';\nimport type { CreateTRPCClientOptions } from './internals/TRPCUntypedClient';\nimport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\n\nexport function createTRPCUntypedClient<TRouter extends AnyRouter>(\n opts: CreateTRPCClientOptions<TRouter>,\n): TRPCUntypedClient<TRouter> {\n return new TRPCUntypedClient(opts);\n}\n\nexport type {\n CreateTRPCClientOptions,\n TRPCRequestOptions,\n} from './internals/TRPCUntypedClient';\nexport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport type { Unsubscribable } from '@trpc/server/observable';\nimport type {\n AnyProcedure,\n AnyRouter,\n inferClientTypes,\n inferProcedureInput,\n InferrableClientTypes,\n inferTransformedProcedureOutput,\n ProcedureType,\n RouterRecord,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n createFlatProxy,\n createRecursiveProxy,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type { CreateTRPCClientOptions } from './createTRPCUntypedClient';\nimport type { TRPCSubscriptionObserver } from './internals/TRPCUntypedClient';\nimport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\nimport type { TRPCProcedureOptions } from './internals/types';\nimport type { TRPCClientError } from './TRPCClientError';\n\n/**\n * @public\n * @deprecated use {@link TRPCClient} instead, will be removed in v12\n **/\nexport type inferRouterClient<TRouter extends AnyRouter> = TRPCClient<TRouter>;\n\n/**\n * @public\n * @deprecated use {@link TRPCClient} instead, will be removed in v12\n **/\nexport type CreateTRPCClient<TRouter extends AnyRouter> = TRPCClient<TRouter>;\n\nconst untypedClientSymbol = Symbol.for('trpc_untypedClient');\n\n/**\n * @public\n **/\nexport type TRPCClient<TRouter extends AnyRouter> = DecoratedProcedureRecord<\n {\n transformer: TRouter['_def']['_config']['$types']['transformer'];\n errorShape: TRouter['_def']['_config']['$types']['errorShape'];\n },\n TRouter['_def']['record']\n> & {\n [untypedClientSymbol]: TRPCUntypedClient<TRouter>;\n};\n\n/** @internal */\nexport type TRPCResolverDef = {\n input: any;\n output: any;\n transformer: boolean;\n errorShape: any;\n};\n\ntype coerceAsyncGeneratorToIterable<T> =\n T extends AsyncGenerator<infer $T, infer $Return, infer $Next>\n ? AsyncIterable<$T, $Return, $Next>\n : T;\n\n/** @internal */\nexport type Resolver<TDef extends TRPCResolverDef> = (\n input: TDef['input'],\n opts?: TRPCProcedureOptions,\n) => Promise<coerceAsyncGeneratorToIterable<TDef['output']>>;\n\n/** @internal */\nexport type SubscriptionResolver<TDef extends TRPCResolverDef> = (\n input: TDef['input'],\n opts: Partial<\n TRPCSubscriptionObserver<TDef['output'], TRPCClientError<TDef>>\n > &\n TRPCProcedureOptions,\n) => Unsubscribable;\n\ntype DecorateProcedure<\n TType extends ProcedureType,\n TDef extends TRPCResolverDef,\n> = TType extends 'query'\n ? {\n query: Resolver<TDef>;\n }\n : TType extends 'mutation'\n ? {\n mutate: Resolver<TDef>;\n }\n : TType extends 'subscription'\n ? {\n subscribe: SubscriptionResolver<TDef>;\n }\n : never;\n\n/**\n * @internal\n */\ntype DecoratedProcedureRecord<\n TRoot extends InferrableClientTypes,\n TRecord extends RouterRecord,\n> = {\n [TKey in keyof TRecord]: TRecord[TKey] extends infer $Value\n ? $Value extends AnyProcedure\n ? DecorateProcedure<\n $Value['_def']['type'],\n {\n input: inferProcedureInput<$Value>;\n output: inferTransformedProcedureOutput<\n inferClientTypes<TRoot>,\n $Value\n >;\n errorShape: inferClientTypes<TRoot>['errorShape'];\n transformer: inferClientTypes<TRoot>['transformer'];\n }\n >\n : $Value extends RouterRecord\n ? DecoratedProcedureRecord<TRoot, $Value>\n : never\n : never;\n};\n\nconst clientCallTypeMap: Record<\n keyof DecorateProcedure<any, any>,\n ProcedureType\n> = {\n query: 'query',\n mutate: 'mutation',\n subscribe: 'subscription',\n};\n\n/** @internal */\nexport const clientCallTypeToProcedureType = (\n clientCallType: string,\n): ProcedureType => {\n return clientCallTypeMap[clientCallType as keyof typeof clientCallTypeMap];\n};\n\n/**\n * @internal\n */\nexport function createTRPCClientProxy<TRouter extends AnyRouter>(\n client: TRPCUntypedClient<TRouter>,\n): TRPCClient<TRouter> {\n const proxy = createRecursiveProxy<TRPCClient<TRouter>>(({ path, args }) => {\n const pathCopy = [...path];\n const procedureType = clientCallTypeToProcedureType(pathCopy.pop()!);\n\n const fullPath = pathCopy.join('.');\n\n return (client[procedureType] as any)(fullPath, ...(args as any));\n });\n return createFlatProxy<TRPCClient<TRouter>>((key) => {\n if (key === untypedClientSymbol) {\n return client;\n }\n return proxy[key];\n });\n}\n\nexport function createTRPCClient<TRouter extends AnyRouter>(\n opts: CreateTRPCClientOptions<TRouter>,\n): TRPCClient<TRouter> {\n const client = new TRPCUntypedClient(opts);\n const proxy = createTRPCClientProxy<TRouter>(client);\n return proxy;\n}\n\n/**\n * Get an untyped client from a proxy client\n * @internal\n */\nexport function getUntypedClient<TRouter extends AnyRouter>(\n client: TRPCClient<TRouter>,\n): TRPCUntypedClient<TRouter> {\n return client[untypedClientSymbol];\n}\n","import type { AnyRouter, ProcedureType } from '@trpc/server';\nimport { observable } from '@trpc/server/observable';\nimport type { TRPCErrorShape, TRPCResponse } from '@trpc/server/rpc';\nimport type { AnyClientTypes } from '@trpc/server/unstable-core-do-not-import';\nimport { jsonlStreamConsumer } from '@trpc/server/unstable-core-do-not-import';\nimport type { BatchLoader } from '../internals/dataLoader';\nimport { dataLoader } from '../internals/dataLoader';\nimport { allAbortSignals, raceAbortSignals } from '../internals/signals';\nimport type { NonEmptyArray } from '../internals/types';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { HTTPBatchLinkOptions } from './HTTPBatchLinkOptions';\nimport type { HTTPResult } from './internals/httpUtils';\nimport {\n fetchHTTPResponse,\n getBody,\n getUrl,\n resolveHTTPLinkOptions,\n} from './internals/httpUtils';\nimport type { Operation, TRPCLink } from './types';\n\nexport type HTTPBatchStreamLinkOptions<TRoot extends AnyClientTypes> =\n HTTPBatchLinkOptions<TRoot> & {\n /**\n * Which header to use to signal the server that the client wants a streaming response.\n * - `'trpc-accept'` (default): sends `trpc-accept: application/jsonl` header\n * - `'accept'`: sends `Accept: application/jsonl` header, which can avoid CORS preflight for cross-origin streaming queries. Be aware that `application/jsonl` is not an official MIME type and so this is not completely spec-compliant - you should test that your infrastructure supports this value.\n * @default 'trpc-accept'\n */\n streamHeader?: 'trpc-accept' | 'accept';\n };\n\n/**\n * @see https://trpc.io/docs/client/links/httpBatchStreamLink\n */\nexport function httpBatchStreamLink<TRouter extends AnyRouter>(\n opts: HTTPBatchStreamLinkOptions<TRouter['_def']['_config']['$types']>,\n): TRPCLink<TRouter> {\n const resolvedOpts = resolveHTTPLinkOptions(opts);\n const maxURLLength = opts.maxURLLength ?? Infinity;\n const maxItems = opts.maxItems ?? Infinity;\n\n return () => {\n const batchLoader = (\n type: ProcedureType,\n ): BatchLoader<Operation, HTTPResult> => {\n return {\n validate(batchOps) {\n if (maxURLLength === Infinity && maxItems === Infinity) {\n // escape hatch for quick calcs\n return true;\n }\n if (batchOps.length > maxItems) {\n return false;\n }\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const url = getUrl({\n ...resolvedOpts,\n type,\n path,\n inputs,\n signal: null,\n });\n\n return url.length <= maxURLLength;\n },\n async fetch(batchOps) {\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const batchSignals = allAbortSignals(\n ...batchOps.map((op) => op.signal),\n );\n const abortController = new AbortController();\n\n const responsePromise = fetchHTTPResponse({\n ...resolvedOpts,\n signal: raceAbortSignals(batchSignals, abortController.signal),\n type,\n contentTypeHeader: 'application/json',\n trpcAcceptHeader: 'application/jsonl',\n trpcAcceptHeaderKey: opts.streamHeader ?? 'trpc-accept',\n getUrl,\n getBody,\n inputs,\n path,\n headers() {\n if (!opts.headers) {\n return {};\n }\n if (typeof opts.headers === 'function') {\n return opts.headers({\n opList: batchOps as NonEmptyArray<Operation>,\n });\n }\n return opts.headers;\n },\n });\n\n const res = await responsePromise;\n\n if (!res.ok) {\n // Server returned a non-2xx response (e.g. batching disabled).\n // The body is plain JSON, not JSONL, so parse it directly and\n // propagate the same error to every operation in the batch.\n const json = (await res.json()) as TRPCResponse;\n if ('error' in json) {\n json.error = resolvedOpts.transformer.output.deserialize(\n json.error,\n );\n }\n\n return batchOps.map(\n (): Promise<HTTPResult> =>\n Promise.resolve({\n json,\n meta: {\n response: res,\n },\n }),\n );\n }\n\n const [head] = await jsonlStreamConsumer<\n Record<string, Promise<any>>\n >({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n from: res.body!,\n deserialize: (data) =>\n resolvedOpts.transformer.output.deserialize(data),\n // onError: console.error,\n formatError(opts) {\n const error = opts.error as TRPCErrorShape;\n return TRPCClientError.from({\n error,\n });\n },\n abortController,\n });\n const promises = Object.keys(batchOps).map(\n async (key): Promise<HTTPResult> => {\n let json: TRPCResponse = await Promise.resolve(head[key]);\n\n if ('result' in json) {\n /**\n * Not very pretty, but we need to unwrap nested data as promises\n * Our stream producer will only resolve top-level async values or async values that are directly nested in another async value\n */\n const result = await Promise.resolve(json.result);\n json = {\n result: {\n data: await Promise.resolve(result.data),\n },\n };\n }\n\n return {\n json,\n meta: {\n response: res,\n },\n };\n },\n );\n return promises;\n },\n };\n };\n\n const query = dataLoader(batchLoader('query'));\n const mutation = dataLoader(batchLoader('mutation'));\n\n const loaders = { query, mutation };\n return ({ op }) => {\n return observable((observer) => {\n /* istanbul ignore if -- @preserve */\n if (op.type === 'subscription') {\n throw new Error(\n 'Subscriptions are unsupported by `httpBatchStreamLink` - use `httpSubscriptionLink` or `wsLink`',\n );\n }\n const loader = loaders[op.type];\n const promise = loader.load(op);\n\n let _res = undefined as HTTPResult | undefined;\n promise\n .then((res) => {\n _res = res;\n if ('error' in res.json) {\n observer.error(\n TRPCClientError.from(res.json, {\n meta: res.meta,\n }),\n );\n return;\n } else if ('result' in res.json) {\n observer.next({\n context: res.meta,\n result: res.json.result,\n });\n observer.complete();\n return;\n }\n\n observer.complete();\n })\n .catch((err) => {\n observer.error(\n TRPCClientError.from(err, {\n meta: _res?.meta,\n }),\n );\n });\n\n return () => {\n // noop\n };\n });\n };\n };\n}\n\n/**\n * @deprecated use {@link httpBatchStreamLink} instead\n */\nexport const unstable_httpBatchStreamLink = httpBatchStreamLink;\n","export function inputWithTrackedEventId(\n input: unknown,\n lastEventId: string | undefined,\n) {\n if (!lastEventId) {\n return input;\n }\n if (input != null && typeof input !== 'object') {\n return input;\n }\n return {\n ...(input ?? {}),\n lastEventId,\n };\n}\n","function _asyncIterator(r) {\n var n,\n t,\n o,\n e = 2;\n for (\"undefined\" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) {\n if (t && null != (n = r[t])) return n.call(r);\n if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r));\n t = \"@@asyncIterator\", o = \"@@iterator\";\n }\n throw new TypeError(\"Object is not async iterable\");\n}\nfunction AsyncFromSyncIterator(r) {\n function AsyncFromSyncIteratorContinuation(r) {\n if (Object(r) !== r) return Promise.reject(new TypeError(r + \" is not an object.\"));\n var n = r.done;\n return Promise.resolve(r.value).then(function (r) {\n return {\n value: r,\n done: n\n };\n });\n }\n return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) {\n this.s = r, this.n = r.next;\n }, AsyncFromSyncIterator.prototype = {\n s: null,\n n: null,\n next: function next() {\n return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));\n },\n \"return\": function _return(r) {\n var n = this.s[\"return\"];\n return void 0 === n ? Promise.resolve({\n value: r,\n done: !0\n }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));\n },\n \"throw\": function _throw(r) {\n var n = this.s[\"return\"];\n return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));\n }\n }, new AsyncFromSyncIterator(r);\n}\nmodule.exports = _asyncIterator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import { behaviorSubject, observable } from '@trpc/server/observable';\nimport type { TRPCErrorShape, TRPCResult } from '@trpc/server/rpc';\nimport type {\n AnyClientTypes,\n EventSourceLike,\n inferClientTypes,\n InferrableClientTypes,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n retryableRpcCodes,\n run,\n sseStreamConsumer,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport { raceAbortSignals } from '../internals/signals';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { TRPCConnectionState } from '../unstable-internals';\nimport { getTransformer, type TransformerOptions } from '../unstable-internals';\nimport { getUrl } from './internals/httpUtils';\nimport {\n resultOf,\n type UrlOptionsWithConnectionParams,\n} from './internals/urlWithConnectionParams';\nimport type { Operation, TRPCLink } from './types';\n\nasync function urlWithConnectionParams(\n opts: UrlOptionsWithConnectionParams,\n): Promise<string> {\n let url = await resultOf(opts.url);\n if (opts.connectionParams) {\n const params = await resultOf(opts.connectionParams);\n\n const prefix = url.includes('?') ? '&' : '?';\n url +=\n prefix + 'connectionParams=' + encodeURIComponent(JSON.stringify(params));\n }\n\n return url;\n}\n\ntype HTTPSubscriptionLinkOptions<\n TRoot extends AnyClientTypes,\n TEventSource extends EventSourceLike.AnyConstructor = typeof EventSource,\n> = {\n /**\n * EventSource ponyfill\n */\n EventSource?: TEventSource;\n /**\n * EventSource options or a callback that returns them\n */\n eventSourceOptions?:\n | EventSourceLike.InitDictOf<TEventSource>\n | ((opts: {\n op: Operation;\n }) =>\n | EventSourceLike.InitDictOf<TEventSource>\n | Promise<EventSourceLike.InitDictOf<TEventSource>>);\n} & TransformerOptions<TRoot> &\n UrlOptionsWithConnectionParams;\n\n/**\n * @see https://trpc.io/docs/client/links/httpSubscriptionLink\n */\nexport function httpSubscriptionLink<\n TInferrable extends InferrableClientTypes,\n TEventSource extends EventSourceLike.AnyConstructor,\n>(\n opts: HTTPSubscriptionLinkOptions<\n inferClientTypes<TInferrable>,\n TEventSource\n >,\n): TRPCLink<TInferrable> {\n const transformer = getTransformer(opts.transformer);\n\n return () => {\n return ({ op }) => {\n return observable((observer) => {\n const { type, path, input } = op;\n\n /* istanbul ignore if -- @preserve */\n if (type !== 'subscription') {\n throw new Error('httpSubscriptionLink only supports subscriptions');\n }\n\n let lastEventId: string | undefined = undefined;\n const ac = new AbortController();\n const signal = raceAbortSignals(op.signal, ac.signal);\n const eventSourceStream = sseStreamConsumer<{\n EventSource: TEventSource;\n data: Partial<{\n id?: string;\n data: unknown;\n }>;\n error: TRPCErrorShape;\n }>({\n url: async () =>\n getUrl({\n transformer,\n url: await urlWithConnectionParams(opts),\n input: inputWithTrackedEventId(input, lastEventId),\n path,\n type,\n signal: null,\n }),\n init: () => resultOf(opts.eventSourceOptions, { op }),\n signal,\n deserialize: (data) => transformer.output.deserialize(data),\n EventSource:\n opts.EventSource ??\n (globalThis.EventSource as never as TEventSource),\n });\n\n const connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<any>>\n >({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n\n const connectionSub = connectionState.subscribe({\n next(state) {\n observer.next({\n result: state,\n });\n },\n });\n run(async () => {\n for await (const chunk of eventSourceStream) {\n switch (chunk.type) {\n case 'ping':\n // do nothing\n break;\n case 'data':\n const chunkData = chunk.data;\n\n let result: TRPCResult<unknown>;\n if (chunkData.id) {\n // if the `tracked()`-helper is used, we always have an `id` field\n lastEventId = chunkData.id;\n result = {\n id: chunkData.id,\n data: chunkData,\n };\n } else {\n result = {\n data: chunkData.data,\n };\n }\n\n observer.next({\n result,\n context: {\n eventSource: chunk.eventSource,\n },\n });\n break;\n case 'connected': {\n observer.next({\n result: {\n type: 'started',\n },\n context: {\n eventSource: chunk.eventSource,\n },\n });\n connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n break;\n }\n case 'serialized-error': {\n const error = TRPCClientError.from({ error: chunk.error });\n\n if (retryableRpcCodes.includes(chunk.error.code)) {\n //\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error,\n });\n break;\n }\n //\n // non-retryable error, cancel the subscription\n throw error;\n }\n case 'connecting': {\n const lastState = connectionState.get();\n\n const error = chunk.event && TRPCClientError.from(chunk.event);\n if (!error && lastState.state === 'connecting') {\n break;\n }\n\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error,\n });\n break;\n }\n case 'timeout': {\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error: new TRPCClientError(\n `Timeout of ${chunk.ms}ms reached while waiting for a response`,\n ),\n });\n }\n }\n }\n observer.next({\n result: {\n type: 'stopped',\n },\n });\n connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n observer.complete();\n }).catch((error) => {\n observer.error(TRPCClientError.from(error));\n });\n\n return () => {\n observer.complete();\n ac.abort();\n connectionSub.unsubscribe();\n };\n });\n };\n };\n}\n\n/**\n * @deprecated use {@link httpSubscriptionLink} instead\n */\nexport const unstable_httpSubscriptionLink = httpSubscriptionLink;\n","/* istanbul ignore file -- @preserve */\n// We're not actually exporting this link\nimport type { Unsubscribable } from '@trpc/server/observable';\nimport { observable } from '@trpc/server/observable';\nimport type { InferrableClientTypes } from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport type { TRPCClientError } from '../TRPCClientError';\nimport type { Operation, TRPCLink } from './types';\n\ninterface RetryLinkOptions<TInferrable extends InferrableClientTypes> {\n /**\n * The retry function\n */\n retry: (opts: RetryFnOptions<TInferrable>) => boolean;\n /**\n * The delay between retries in ms (defaults to 0)\n */\n retryDelayMs?: (attempt: number) => number;\n}\n\ninterface RetryFnOptions<TInferrable extends InferrableClientTypes> {\n /**\n * The operation that failed\n */\n op: Operation;\n /**\n * The error that occurred\n */\n error: TRPCClientError<TInferrable>;\n /**\n * The number of attempts that have been made (including the first call)\n */\n attempts: number;\n}\n\n/**\n * @see https://trpc.io/docs/v11/client/links/retryLink\n */\nexport function retryLink<TInferrable extends InferrableClientTypes>(\n opts: RetryLinkOptions<TInferrable>,\n): TRPCLink<TInferrable> {\n // initialized config\n return () => {\n // initialized in app\n return (callOpts) => {\n // initialized for request\n return observable((observer) => {\n let next$: Unsubscribable;\n let callNextTimeout: ReturnType<typeof setTimeout> | undefined =\n undefined;\n\n let lastEventId: string | undefined = undefined;\n\n attempt(1);\n\n function opWithLastEventId() {\n const op = callOpts.op;\n if (!lastEventId) {\n return op;\n }\n\n return {\n ...op,\n input: inputWithTrackedEventId(op.input, lastEventId),\n };\n }\n\n function attempt(attempts: number) {\n const op = opWithLastEventId();\n\n next$ = callOpts.next(op).subscribe({\n error(error) {\n const shouldRetry = opts.retry({\n op,\n attempts,\n error,\n });\n if (!shouldRetry) {\n observer.error(error);\n return;\n }\n const delayMs = opts.retryDelayMs?.(attempts) ?? 0;\n\n if (delayMs <= 0) {\n attempt(attempts + 1);\n return;\n }\n callNextTimeout = setTimeout(\n () => attempt(attempts + 1),\n delayMs,\n );\n },\n next(envelope) {\n //\n if (\n (!envelope.result.type || envelope.result.type === 'data') &&\n envelope.result.id\n ) {\n //\n lastEventId = envelope.result.id;\n }\n\n observer.next(envelope);\n },\n complete() {\n observer.complete();\n },\n });\n }\n return () => {\n next$.unsubscribe();\n clearTimeout(callNextTimeout);\n };\n });\n };\n };\n}\n","function _usingCtx() {\n var r = \"function\" == typeof SuppressedError ? SuppressedError : function (r, e) {\n var n = Error();\n return n.name = \"SuppressedError\", n.error = r, n.suppressed = e, n;\n },\n e = {},\n n = [];\n function using(r, e) {\n if (null != e) {\n if (Object(e) !== e) throw new TypeError(\"using declarations can only be used with objects, functions, null, or undefined.\");\n if (r) var o = e[Symbol.asyncDispose || Symbol[\"for\"](\"Symbol.asyncDispose\")];\n if (void 0 === o && (o = e[Symbol.dispose || Symbol[\"for\"](\"Symbol.dispose\")], r)) var t = o;\n if (\"function\" != typeof o) throw new TypeError(\"Object is not disposable.\");\n t && (o = function o() {\n try {\n t.call(e);\n } catch (r) {\n return Promise.reject(r);\n }\n }), n.push({\n v: e,\n d: o,\n a: r\n });\n } else r && n.push({\n d: e,\n a: r\n });\n return e;\n }\n return {\n e: e,\n u: using.bind(null, !1),\n a: using.bind(null, !0),\n d: function d() {\n var o,\n t = this.e,\n s = 0;\n function next() {\n for (; o = n.pop();) try {\n if (!o.a && 1 === s) return s = 0, n.push(o), Promise.resolve().then(next);\n if (o.d) {\n var r = o.d.call(o.v);\n if (o.a) return s |= 2, Promise.resolve(r).then(next, err);\n } else s |= 1;\n } catch (r) {\n return err(r);\n }\n if (1 === s) return t !== e ? Promise.reject(t) : Promise.resolve();\n if (t !== e) throw t;\n }\n function err(n) {\n return t = t !== e ? new r(n, t) : n, next();\n }\n return next();\n }\n };\n}\nmodule.exports = _usingCtx, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _OverloadYield(e, d) {\n this.v = e, this.k = d;\n}\nmodule.exports = _OverloadYield, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var OverloadYield = require(\"./OverloadYield.js\");\nfunction _awaitAsyncGenerator(e) {\n return new OverloadYield(e, 0);\n}\nmodule.exports = _awaitAsyncGenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var OverloadYield = require(\"./OverloadYield.js\");\nfunction _wrapAsyncGenerator(e) {\n return function () {\n return new AsyncGenerator(e.apply(this, arguments));\n };\n}\nfunction AsyncGenerator(e) {\n var r, t;\n function resume(r, t) {\n try {\n var n = e[r](t),\n o = n.value,\n u = o instanceof OverloadYield;\n Promise.resolve(u ? o.v : o).then(function (t) {\n if (u) {\n var i = \"return\" === r ? \"return\" : \"next\";\n if (!o.k || t.done) return resume(i, t);\n t = e[i](t).value;\n }\n settle(n.done ? \"return\" : \"normal\", t);\n }, function (e) {\n resume(\"throw\", e);\n });\n } catch (e) {\n settle(\"throw\", e);\n }\n }\n function settle(e, n) {\n switch (e) {\n case \"return\":\n r.resolve({\n value: n,\n done: !0\n });\n break;\n case \"throw\":\n r.reject(n);\n break;\n default:\n r.resolve({\n value: n,\n done: !1\n });\n }\n (r = r.next) ? resume(r.key, r.arg) : t = null;\n }\n this._invoke = function (e, n) {\n return new Promise(function (o, u) {\n var i = {\n key: e,\n arg: n,\n resolve: o,\n reject: u,\n next: null\n };\n t ? t = t.next = i : (r = t = i, resume(e, n));\n });\n }, \"function\" != typeof e[\"return\"] && (this[\"return\"] = void 0);\n}\nAsyncGenerator.prototype[\"function\" == typeof Symbol && Symbol.asyncIterator || \"@@asyncIterator\"] = function () {\n return this;\n}, AsyncGenerator.prototype.next = function (e) {\n return this._invoke(\"next\", e);\n}, AsyncGenerator.prototype[\"throw\"] = function (e) {\n return this._invoke(\"throw\", e);\n}, AsyncGenerator.prototype[\"return\"] = function (e) {\n return this._invoke(\"return\", e);\n};\nmodule.exports = _wrapAsyncGenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import {\n getTRPCErrorFromUnknown,\n getTRPCErrorShape,\n isTrackedEnvelope,\n} from '@trpc/server';\nimport { behaviorSubject, observable } from '@trpc/server/observable';\nimport { TRPC_ERROR_CODES_BY_KEY, type TRPCResult } from '@trpc/server/rpc';\nimport {\n callProcedure,\n isAbortError,\n isAsyncIterable,\n iteratorResource,\n makeResource,\n retryableRpcCodes,\n run,\n type AnyRouter,\n type ErrorHandlerOptions,\n type inferClientTypes,\n type inferRouterContext,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport { abortSignalToPromise, raceAbortSignals } from '../internals/signals';\nimport { getTransformer } from '../internals/transformer';\nimport type { TransformerOptions } from '../internals/transformer';\nimport { isTRPCClientError, TRPCClientError } from '../TRPCClientError';\nimport type { TRPCConnectionState } from './internals/subscriptions';\nimport type { TRPCLink } from './types';\n\nexport type LocalLinkOptions<TRouter extends AnyRouter> = {\n router: TRouter;\n createContext: () => Promise<inferRouterContext<TRouter>>;\n onError?: (opts: ErrorHandlerOptions<inferRouterContext<TRouter>>) => void;\n} & TransformerOptions<inferClientTypes<TRouter>>;\n\n/**\n * localLink is a terminating link that allows you to make tRPC procedure calls directly in your application without going through HTTP.\n *\n * @see https://trpc.io/docs/links/localLink\n */\nexport function unstable_localLink<TRouter extends AnyRouter>(\n opts: LocalLinkOptions<TRouter>,\n): TRPCLink<TRouter> {\n const transformer = getTransformer(opts.transformer);\n\n const transformChunk = (chunk: unknown) => {\n if (opts.transformer) {\n // assume transformer will do the right thing\n return chunk;\n }\n // Special case for undefined, because `JSON.stringify(undefined)` throws\n if (chunk === undefined) {\n return chunk;\n }\n const serialized = JSON.stringify(transformer.input.serialize(chunk));\n const deserialized = JSON.parse(transformer.output.deserialize(serialized));\n return deserialized;\n };\n\n return () =>\n ({ op }) =>\n observable((observer) => {\n let ctx: inferRouterContext<TRouter> | undefined = undefined;\n const ac = new AbortController();\n\n const signal = raceAbortSignals(op.signal, ac.signal);\n const signalPromise = abortSignalToPromise(signal);\n\n signalPromise.catch(() => {\n // prevent unhandled rejection\n });\n\n let input = op.input;\n async function runProcedure(newInput: unknown): Promise<unknown> {\n input = newInput;\n\n ctx = await opts.createContext();\n\n return callProcedure({\n router: opts.router,\n path: op.path,\n getRawInput: async () => newInput,\n ctx,\n type: op.type,\n signal,\n batchIndex: 0,\n });\n }\n\n function onErrorCallback(cause: unknown) {\n if (isAbortError(cause)) {\n return;\n }\n opts.onError?.({\n error: getTRPCErrorFromUnknown(cause),\n type: op.type,\n path: op.path,\n input,\n ctx,\n });\n }\n\n function coerceToTRPCClientError(cause: unknown) {\n if (isTRPCClientError<TRouter>(cause)) {\n return cause;\n }\n const error = getTRPCErrorFromUnknown(cause);\n\n const shape = getTRPCErrorShape({\n config: opts.router._def._config,\n ctx,\n error,\n input,\n path: op.path,\n type: op.type,\n });\n return TRPCClientError.from(\n { error: transformChunk(shape) },\n { cause: cause instanceof Error ? cause : undefined },\n );\n }\n\n run(async () => {\n switch (op.type) {\n case 'query':\n case 'mutation': {\n const result = await runProcedure(op.input);\n if (!isAsyncIterable(result)) {\n observer.next({\n result: { data: transformChunk(result) },\n });\n observer.complete();\n break;\n }\n\n observer.next({\n result: {\n data: (async function* () {\n await using iterator = iteratorResource(result);\n using _finally = makeResource({}, () => {\n observer.complete();\n });\n try {\n while (true) {\n const res = await Promise.race([\n iterator.next(),\n signalPromise,\n ]);\n if (res.done) {\n return transformChunk(res.value);\n }\n yield transformChunk(res.value);\n }\n } catch (cause) {\n onErrorCallback(cause);\n throw coerceToTRPCClientError(cause);\n }\n })(),\n },\n });\n break;\n }\n case 'subscription': {\n const connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<any>>\n >({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n\n const connectionSub = connectionState.subscribe({\n next(state) {\n observer.next({\n result: state,\n });\n },\n });\n let lastEventId: string | undefined = undefined;\n\n using _finally = makeResource({}, async () => {\n observer.complete();\n\n connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n connectionSub.unsubscribe();\n });\n while (true) {\n const result = await runProcedure(\n inputWithTrackedEventId(op.input, lastEventId),\n );\n if (!isAsyncIterable(result)) {\n throw new Error('Expected an async iterable');\n }\n await using iterator = iteratorResource(result);\n\n observer.next({\n result: {\n type: 'started',\n },\n });\n connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n\n // Use a while loop to handle errors and reconnects\n while (true) {\n let res;\n try {\n res = await Promise.race([iterator.next(), signalPromise]);\n } catch (cause) {\n if (isAbortError(cause)) {\n return;\n }\n const error = getTRPCErrorFromUnknown(cause);\n\n if (\n !retryableRpcCodes.includes(\n TRPC_ERROR_CODES_BY_KEY[error.code],\n )\n ) {\n throw coerceToTRPCClientError(error);\n }\n\n onErrorCallback(error);\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error: coerceToTRPCClientError(error),\n });\n\n break;\n }\n\n if (res.done) {\n return;\n }\n let chunk: TRPCResult<unknown>;\n if (isTrackedEnvelope(res.value)) {\n lastEventId = res.value[0];\n\n chunk = {\n id: res.value[0],\n data: {\n id: res.value[0],\n data: res.value[1],\n },\n };\n } else {\n chunk = {\n data: res.value,\n };\n }\n\n observer.next({\n result: {\n ...chunk,\n data: transformChunk(chunk.data),\n },\n });\n }\n }\n break;\n }\n }\n }).catch((cause) => {\n onErrorCallback(cause);\n observer.error(coerceToTRPCClientError(cause));\n });\n\n return () => {\n ac.abort();\n };\n });\n}\n/**\n * @deprecated Renamed to `unstable_localLink`. This alias will be removed in a future major release.\n */\nexport const experimental_localLink: typeof unstable_localLink =\n unstable_localLink;\n","/**\n * Backend client — connects directly to the CamStack NestJS backend via tRPC.\n *\n * Use this when the client needs to talk to the backend server directly\n * (admin UI, local agent, embedded mode) rather than going through the proxy.\n *\n * Features: full typed access to all backend tRPC routes (auth, devices, providers,\n * pipeline, agents, addons, bridge pipeline, recording, events, live subscriptions).\n */\n\nimport { createTRPCClient, createWSClient, wsLink, httpLink, splitLink } from \"@trpc/client\";\nimport superjson from \"superjson\";\nimport type { BackendAppRouter } from \"./backend-router.js\";\n\n// ---------------------------------------------------------------------------\n// Settings section union — must match the backend settings.router sectionSchema\n// ---------------------------------------------------------------------------\n\nexport type SettingsSection =\n | 'server' | 'auth' | 'features' | 'storage' | 'logging' | 'addons'\n | 'recording' | 'streaming' | 'ffmpeg' | 'detection' | 'backup' | 'retention'\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface BackendClientConfig {\n /** Backend server URL (e.g. \"http://localhost:4443\") */\n readonly serverUrl: string;\n /** JWT token for authentication */\n readonly token?: string;\n /** Connection timeout in ms (default: 10000) */\n readonly connectTimeoutMs?: number;\n /** Use WebSocket for all queries/mutations (default: true in browser, false in Node) */\n readonly useWebSocket?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Client\n// ---------------------------------------------------------------------------\n\nexport class BackendClient {\n /** Raw tRPC client — for advanced usage / direct path access */\n readonly trpc: ReturnType<typeof createTRPCClient<BackendAppRouter>>;\n readonly serverUrl: string;\n private token: string | undefined;\n private wsClient: ReturnType<typeof createWSClient> | null = null;\n\n constructor(config: BackendClientConfig) {\n this.serverUrl = config.serverUrl.replace(/\\/+$/, \"\");\n this.token = config.token;\n\n const isBrowser = typeof window !== 'undefined';\n const useWs = config.useWebSocket ?? isBrowser;\n\n const headers = (): Record<string, string> => {\n const h: Record<string, string> = {};\n if (this.token) {\n h[\"Authorization\"] = `Bearer ${this.token}`;\n }\n return h;\n };\n\n if (useWs) {\n // WebSocket: single persistent connection for all queries/mutations/subscriptions\n const wsUrl = this.serverUrl.replace(/^http/, 'ws') + '/trpc';\n this.wsClient = createWSClient({\n url: wsUrl,\n connectionParams: () => ({\n token: this.token,\n }),\n retryDelayMs: () => 2000,\n });\n\n this.trpc = createTRPCClient<BackendAppRouter>({\n links: [\n wsLink({\n client: this.wsClient,\n transformer: superjson,\n }),\n ],\n });\n } else {\n // HTTP: for Node.js environments (agents, CLI, scripts)\n this.trpc = createTRPCClient<BackendAppRouter>({\n links: [\n httpLink({\n url: `${this.serverUrl}/trpc`,\n headers,\n transformer: superjson,\n }),\n ],\n });\n }\n }\n\n /** Update the auth token (e.g. after login) */\n setToken(token: string): void {\n this.token = token;\n }\n\n /** Close the WebSocket connection (if using WS transport) */\n close(): void {\n this.wsClient?.close();\n }\n\n // ─── Auth ──────────────────────────────────────────────────────────\n\n async login(username: string, password: string) {\n return this.trpc.auth.login.mutate({ username, password });\n }\n\n async getMe() {\n return this.trpc.auth.me.query();\n }\n\n async logout() {\n return this.trpc.auth.logout.mutate();\n }\n\n // ─── System ────────────────────────────────────────────────────────\n\n async getSystemInfo() {\n return this.trpc.system.info.query();\n }\n\n async getFeatureFlags() {\n return this.trpc.system.featureFlags.query();\n }\n\n // ─── Providers ─────────────────────────────────────────────────────\n\n async listProviders() {\n return this.trpc.providers.list.query();\n }\n\n async getProvider(providerId: string) {\n return this.trpc.providers.get.query({ id: providerId });\n }\n\n async startProvider(providerId: string) {\n return this.trpc.providers.start.mutate({ id: providerId });\n }\n\n async stopProvider(providerId: string) {\n return this.trpc.providers.stop.mutate({ id: providerId });\n }\n\n async listProviderTypes() {\n return this.trpc.providerConfig.getAvailableTypes.query();\n }\n\n // ─── Devices ───────────────────────────────────────────────────────\n\n async listDevices() {\n return this.trpc.devices.list.query();\n }\n\n async getDevice(deviceId: string) {\n return this.trpc.devices.get.query({ id: deviceId });\n }\n\n async discoverDevices(providerId: string) {\n return this.trpc.devices.discoverDevices.query({ providerId });\n }\n\n async adoptDevice(providerId: string, externalId: string) {\n return this.trpc.devices.adoptDevice.mutate({ providerId, externalId });\n }\n\n async createDevice(providerId: string, config: Record<string, unknown>) {\n return this.trpc.devices.createDevice.mutate({ providerId, config });\n }\n\n /** Returns the URL path for a static asset served by an addon. */\n getAddonAssetUrl(addonId: string, assetPath: string): string {\n return `/api/addon-assets/${addonId}/${assetPath}`;\n }\n\n // ─── Addons ────────────────────────────────────────────────────────\n\n async listAddons() {\n return this.trpc.addons.list.query();\n }\n\n async getAddonConfigSchema(addonId: string) {\n return this.trpc.addons.getConfigSchema.query({ addonId });\n }\n\n async getAddonConfig(addonId: string) {\n return this.trpc.addons.getConfig.query({ addonId });\n }\n\n async updateAddonConfig(addonId: string, config: Record<string, unknown>) {\n return this.trpc.addons.updateConfig.mutate({ addonId, config });\n }\n\n async getAddonLogs(addonId: string, options?: { limit?: number; level?: 'debug' | 'info' | 'warn' | 'error' }) {\n return this.trpc.addons.getLogs.query({ addonId, ...options });\n }\n\n // ─── Known Faces ───────────────────────────────────────────────────\n\n async listKnownFaces() {\n return this.trpc.knownFaces.list.query();\n }\n\n async registerFace(label: string, cropBase64: string, group?: string) {\n return this.trpc.knownFaces.register.mutate({ label, cropBase64, group });\n }\n\n // ─── Pipeline ──────────────────────────────────────────────────────\n\n async listPipelines() {\n return this.trpc.bridgePipeline.listAddons.query();\n }\n\n async getPipelineStatus(deviceId: string) {\n return this.trpc.bridgePipeline.getPipeline.query({ deviceId });\n }\n\n // ─── Agents ────────────────────────────────────────────────────────\n\n async listAgents() {\n return this.trpc.agents.listAgents.query();\n }\n\n async dispatchTask(agentId: string, task: Record<string, unknown>) {\n return this.trpc.agents.dispatchTask.mutate({ capability: agentId, input: task });\n }\n\n async getProcessTree() {\n return this.trpc.agent.processTree.query();\n }\n\n // ─── Bridge Pipeline ───────────────────────────────────────────────\n\n async bridgeListAddons() {\n return this.trpc.bridgePipeline.listAddons.query();\n }\n\n async bridgeGetPipeline(deviceId: string) {\n return this.trpc.bridgePipeline.getPipeline.query({ deviceId });\n }\n\n async bridgeSetPipeline(deviceId: string, config: { video: unknown[]; audio?: unknown }) {\n return this.trpc.bridgePipeline.setPipeline.mutate({ deviceId, config: config as any });\n }\n\n async bridgeValidatePipeline(config: { video: unknown[]; audio?: unknown }) {\n return this.trpc.bridgePipeline.validatePipeline.query(config as any);\n }\n\n async bridgeGetAddonConfig(addonId: string) {\n return this.trpc.bridgePipeline.getAddonConfig.query({ addonId });\n }\n\n async bridgeSetAddonConfig(addonId: string, config: Record<string, unknown>) {\n return this.trpc.bridgePipeline.setAddonConfig.mutate({ addonId, config });\n }\n\n // ─── Addon Packages ────────────────────────────────────────────────\n\n async bridgeListPackages() {\n return this.trpc.addons.listPackages.query();\n }\n\n async bridgeListAddonsPackages() {\n return this.trpc.addons.list.query();\n }\n\n async bridgeInstallPackage(packageName: string, version?: string) {\n return this.trpc.addons.installPackage.mutate({ packageName, version });\n }\n\n async bridgeUninstallPackage(packageName: string) {\n return this.trpc.addons.uninstallPackage.mutate({ packageName });\n }\n\n // ─── Recording ─────────────────────────────────────────────────────\n\n async getRecordingConfig(deviceId: string) {\n return this.trpc.recording.getConfig.query({ deviceId });\n }\n\n async getRecordingPolicy(deviceId: string) {\n return this.trpc.recording.getPolicy.query({ deviceId });\n }\n\n async getRecordingPolicyStatus(deviceId: string) {\n return this.trpc.recording.getPolicyStatus.query({ deviceId });\n }\n\n async getRecordingSegments(deviceId: string, streamId: string, startTime: number, endTime: number) {\n return this.trpc.recording.getSegments.query({ deviceId, streamId, startTime, endTime });\n }\n\n // ─── Events ────────────────────────────────────────────────────────\n\n async getEvents(deviceId: string, options?: { limit?: number; offset?: number }) {\n return this.trpc.events.query.query({ deviceId, ...options });\n }\n\n // ─── Logs ──────────────────────────────────────────────────────────\n\n async getLogs(options?: { level?: 'debug' | 'info' | 'warn' | 'error'; limit?: number; since?: number; until?: number; scope?: string[] }) {\n return this.trpc.logs.query.query(options ?? {});\n }\n\n // ─── REPL ──────────────────────────────────────────────────────────\n\n async replEval(code: string, scope?: { type: 'system' } | { type: 'device'; deviceId: string } | { type: 'provider'; providerId: string } | { type: 'addon'; addonId: string }) {\n return this.trpc.repl.execute.mutate({ code, scope: scope ?? { type: 'system' as const } });\n }\n\n // ─── Users ─────────────────────────────────────────────────────────\n\n async listUsers() {\n return this.trpc.users.list.query();\n }\n\n async createUser(username: string, password: string, role: 'super_admin' | 'admin' | 'viewer') {\n return this.trpc.users.create.mutate({ username, password, role });\n }\n\n // ─── Session Tracker ───────────────────────────────────────────────\n\n async getTrackingSessions(deviceId?: string) {\n return this.trpc.session.getActiveTracks.query({ deviceId });\n }\n\n // ─── Processes ─────────────────────────────────────────────────────\n\n async listProcesses() {\n return this.trpc.processes.listProcesses.query();\n }\n\n async enableProvider(providerId: string) {\n return this.trpc.processes.enableProvider.mutate({ id: providerId });\n }\n\n async disableProvider(providerId: string) {\n return this.trpc.processes.disableProvider.mutate({ id: providerId });\n }\n\n // ─── Settings ──────────────────────────────────────────────────────\n\n /** Fetch the UI schema for a single section, or all sections if omitted. */\n async getSettingsSchema(section?: SettingsSection) {\n return this.trpc.settings.getSchema.query({ section });\n }\n\n async getSettings(section: SettingsSection) {\n return this.trpc.settings.get.query({ section });\n }\n\n async updateSettings(section: SettingsSection, data: Record<string, unknown>) {\n return this.trpc.settings.update.mutate({ section, data });\n }\n}\n\n/**\n * Create a BackendClient instance with the given config.\n * Convenience factory function.\n */\nexport function createBackendClient(config: BackendClientConfig): BackendClient {\n return new BackendClient(config);\n}\n","/**\n * Detection classes — shared between CamStack app and proxy.\n * Aligned with scrypted-advanced-notifier/src/detectionClasses.ts.\n */\n\n// ---------------------------------------------------------------------------\n// Enum — matches the plugin enum exactly\n// ---------------------------------------------------------------------------\n\nexport enum DetectionClass {\n Motion = \"motion\",\n Person = \"person\",\n Vehicle = \"vehicle\",\n Animal = \"animal\",\n Audio = \"audio\",\n Face = \"face\",\n Plate = \"plate\",\n Package = \"package\",\n Doorbell = \"doorbell\",\n Sensor = \"sensor\",\n}\n\n// ---------------------------------------------------------------------------\n// Sub-class arrays (for classname → parent mapping)\n// ---------------------------------------------------------------------------\n\nexport const animalClasses = [\n DetectionClass.Animal,\n \"dog_cat\", \"dog\", \"cat\", \"horse\", \"sheep\", \"cow\", \"elephant\", \"bear\",\n \"zebra\", \"giraffe\", \"mouse\", \"rabbit\", \"deer\", \"lion\", \"tiger\",\n \"bird\", \"eagle\", \"owl\", \"pigeon\",\n \"fish\", \"whale\", \"dolphin\",\n \"snake\", \"turtle\", \"lizard\",\n];\n\nexport const personClasses = [\n DetectionClass.Person,\n \"people\", \"pedestrian\", \"rider\", \"driver\", \"cyclist\", \"skier\", \"skateboarder\",\n \"face\", \"hand\", \"head\", \"body\",\n];\n\nexport const vehicleClasses = [\n DetectionClass.Vehicle,\n \"car\", \"truck\", \"bus\", \"motorcycle\", \"bicycle\", \"van\",\n \"ambulance\", \"police_car\", \"fire_truck\",\n \"train\", \"subway\", \"tram\",\n \"airplane\", \"boat\", \"ship\", \"helicopter\",\n];\n\nexport const faceClasses = [\n DetectionClass.Face,\n \"eyes\", \"nose\", \"mouth\", \"ears\", \"eyebrows\",\n \"left_eye\", \"right_eye\", \"pupil\", \"iris\", \"eyelid\", \"eye_corner\",\n \"upper_lip\", \"lower_lip\", \"teeth\",\n \"chin\", \"cheek\", \"forehead\", \"jaw\",\n \"glasses\", \"sunglasses\", \"facial_hair\", \"beard\", \"mustache\",\n \"facial_landmark\", \"facial_keypoint\",\n];\n\nexport const licensePlateClasses = [\n DetectionClass.Plate,\n \"license_plate\", \"front_plate\", \"rear_plate\", \"motorcycle_plate\",\n \"temporary_plate\", \"dealer_plate\", \"licensePlate\",\n \"plate_number\", \"plate_character\", \"plate_digit\", \"plate_letter\",\n \"plate_symbol\", \"plate_region\", \"plate_country_identifier\",\n \"plate_frame\", \"plate_bolt\", \"plate_sticker\", \"plate_validation_tag\",\n \"damaged_plate\", \"obscured_plate\", \"dirty_plate\",\n];\n\nexport const motionClasses = [DetectionClass.Motion, \"movement\", \"other\"];\n\nexport const packageClasses = [DetectionClass.Package, \"packet\"];\n\nexport const audioClasses: string[] = [DetectionClass.Audio];\n\n/** Common YAMNet audio labels (advanced-notifier). Parent: Audio. */\nexport const audioLabelClasses = [\n \"speech\", \"scream\", \"babbling\", \"yell\", \"bellow\", \"whoop\", \"whispering\", \"laughter\", \"snicker\",\n \"crying\", \"cry\", \"sigh\", \"singing\", \"choir\", \"chant\", \"mantra\", \"child_singing\", \"rapping\", \"humming\",\n \"groan\", \"grunt\", \"whistling\", \"breathing\", \"wheeze\", \"snoring\", \"gasp\", \"pant\", \"snort\", \"cough\",\n \"throat_clearing\", \"sneeze\", \"sniff\", \"cheering\", \"applause\", \"chatter\", \"crowd\", \"children_playing\",\n \"bark\", \"yip\", \"howl\", \"bow-wow\", \"growling\", \"whimper_dog\", \"purr\", \"meow\", \"hiss\", \"caterwaul\",\n \"pets\", \"livestock\", \"doorbell\", \"ding-dong\", \"door\", \"slam\", \"knock\", \"alarm\", \"telephone\",\n \"music\", \"dog\", \"dogs\",\n];\n\nexport const doorbellClasses = [DetectionClass.Doorbell, \"ring\"];\n\n/** Sensor types (advanced-notifier SupportedSensorType). Parent: Sensor. */\nexport const sensorLabelClasses = [\n \"lock\", \"binary\", \"flood\", \"entry\",\n \"door\", \"leak\", \"door_open\", \"flooded\", \"entry_open\",\n];\n\n// ---------------------------------------------------------------------------\n// Classname → parent DetectionClass map\n// ---------------------------------------------------------------------------\n\nexport const detectionClassesDefaultMap: Record<string, DetectionClass> = {\n ...animalClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Animal }), {} as Record<string, DetectionClass>),\n ...personClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Person }), {} as Record<string, DetectionClass>),\n ...vehicleClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Vehicle }), {} as Record<string, DetectionClass>),\n ...motionClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Motion }), {} as Record<string, DetectionClass>),\n ...packageClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Package }), {} as Record<string, DetectionClass>),\n ...faceClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Face }), {} as Record<string, DetectionClass>),\n ...licensePlateClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Plate }), {} as Record<string, DetectionClass>),\n ...audioClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Audio }), {} as Record<string, DetectionClass>),\n ...audioLabelClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Audio }), {} as Record<string, DetectionClass>),\n ...doorbellClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Doorbell }), {} as Record<string, DetectionClass>),\n ...sensorLabelClasses.reduce((tot, curr) => ({ ...tot, [curr]: DetectionClass.Sensor }), {} as Record<string, DetectionClass>),\n};\n\n// ---------------------------------------------------------------------------\n// Classifier helpers\n// ---------------------------------------------------------------------------\n\nexport const isFaceClassname = (c: string) => faceClasses.includes(c);\nexport const isPlateClassname = (c: string) => licensePlateClasses.includes(c);\nexport const isAnimalClassname = (c: string) => animalClasses.includes(c);\nexport const isPersonClassname = (c: string) => personClasses.includes(c);\nexport const isVehicleClassname = (c: string) => vehicleClasses.includes(c);\nexport const isMotionClassname = (c: string) => motionClasses.includes(c);\nexport const isDoorbellClassname = (c: string) => doorbellClasses.includes(c);\nexport const isPackageClassname = (c: string) => packageClasses.includes(c);\nexport const isAudioClassname = (c: string) =>\n audioClasses.includes(c) || audioLabelClasses.includes(c);\nexport const isSensorLabelClassname = (c: string) => sensorLabelClasses.includes(c);\nexport const isLabelDetection = (c: string) => isFaceClassname(c) || isPlateClassname(c);\n\nexport const getParentClass = (className: string): DetectionClass | undefined =>\n detectionClassesDefaultMap[className];\n\nexport const getParentDetectionClass = (det: { label?: string; className: string }) => {\n const { className } = det;\n const baseMap: Record<string, DetectionClass> = {\n [DetectionClass.Face]: DetectionClass.Person,\n [DetectionClass.Plate]: DetectionClass.Vehicle,\n };\n const parentGroup = detectionClassesDefaultMap[className];\n if (parentGroup && parentGroup !== className) return parentGroup;\n return baseMap[className];\n};\n\n// ---------------------------------------------------------------------------\n// All detection classes (enum values) used in filter UI\n// ---------------------------------------------------------------------------\n\nexport const defaultDetectionClasses = Object.values(DetectionClass);\n\n/** Default enabled classes: all except Motion. */\nexport const DEFAULT_ENABLED_CLASSES = defaultDetectionClasses.filter(\n (c) => c !== DetectionClass.Motion,\n);\n\n// ---------------------------------------------------------------------------\n// Timeline event presets (by severity)\n// ---------------------------------------------------------------------------\n\nexport type TimelineEventPreset = \"all\" | \"important\" | \"critical\" | \"custom\";\n\n/** Classes for \"critical\" preset: security-relevant only (person, doorbell, package). */\nexport const TIMELINE_PRESET_CRITICAL: string[] = [\n DetectionClass.Person,\n DetectionClass.Doorbell,\n DetectionClass.Package,\n];\n\n/** Classes for \"important\" preset: critical + vehicle, animal, audio, face, plate. */\nexport const TIMELINE_PRESET_IMPORTANT: string[] = [\n ...TIMELINE_PRESET_CRITICAL,\n DetectionClass.Vehicle,\n DetectionClass.Animal,\n DetectionClass.Audio,\n DetectionClass.Face,\n DetectionClass.Plate,\n];\n\n/** Classes for \"all\" preset: same as DEFAULT_ENABLED_CLASSES. */\nexport const TIMELINE_PRESET_ALL: string[] = [...DEFAULT_ENABLED_CLASSES];\n\n/** Get enabled classes for a preset. For \"custom\", pass customClasses. */\nexport function getClassesForTimelinePreset(\n preset: TimelineEventPreset,\n customClasses?: string[]\n): string[] {\n switch (preset) {\n case \"critical\":\n return TIMELINE_PRESET_CRITICAL;\n case \"important\":\n return TIMELINE_PRESET_IMPORTANT;\n case \"all\":\n return TIMELINE_PRESET_ALL;\n case \"custom\":\n return customClasses?.length ? customClasses : DEFAULT_ENABLED_CLASSES;\n default:\n return DEFAULT_ENABLED_CLASSES;\n }\n}\n","/**\n * Device types, mappings, and filtering constants — shared between CamStack app and proxy.\n *\n * Covers:\n * - Canonical device type normalization (Scrypted PascalCase + HA domains → canonical)\n * - Eligible device type lists for Scrypted and Home Assistant\n * - Unified Device / DeviceCommand / CommandResult interfaces\n * - AssociatedDeviceState shape\n */\n\n// ---------------------------------------------------------------------------\n// Canonical device type\n// ---------------------------------------------------------------------------\n\nexport type CanonicalDeviceType =\n | \"light\"\n | \"switch\"\n | \"cover\"\n | \"lock\"\n | \"alarm\"\n | \"button\"\n | \"select\"\n | \"siren\"\n | \"sensor\"\n | \"entry\"\n | \"media_player\"\n | \"script\";\n\n// ---------------------------------------------------------------------------\n// Raw type → canonical mapping (Scrypted + Home Assistant)\n// ---------------------------------------------------------------------------\n\n/**\n * Maps raw device types from Scrypted (PascalCase) and Home Assistant (lowercase domains)\n * to canonical CamStack device types.\n */\nexport const RAW_TO_CANONICAL: Record<string, CanonicalDeviceType> = {\n // Scrypted PascalCase\n Light: \"light\",\n Switch: \"switch\",\n WindowCovering: \"cover\",\n Lock: \"lock\",\n SecuritySystem: \"alarm\",\n Buttons: \"button\",\n Select: \"select\",\n Siren: \"siren\",\n Sensor: \"sensor\",\n Entry: \"entry\",\n Program: \"script\",\n MediaPlayer: \"media_player\",\n Outlet: \"switch\",\n // Home Assistant lowercase domains\n light: \"light\",\n switch: \"switch\",\n input_boolean: \"switch\",\n cover: \"cover\",\n lock: \"lock\",\n alarm_control_panel: \"alarm\",\n input_button: \"button\",\n button: \"button\",\n input_select: \"select\",\n select: \"select\",\n siren: \"siren\",\n sensor: \"sensor\",\n media_player: \"media_player\",\n script: \"script\",\n};\n\n/**\n * Extended HA domain → type map (includes non-eligible domains for display/categorization).\n * Superset of RAW_TO_CANONICAL for HA-specific domains.\n */\nexport const HA_DOMAIN_TYPE_MAP: Record<string, string> = {\n light: \"light\",\n switch: \"switch\",\n input_boolean: \"switch\",\n cover: \"cover\",\n lock: \"lock\",\n alarm_control_panel: \"alarm\",\n input_button: \"button\",\n button: \"button\",\n input_select: \"select\",\n select: \"select\",\n siren: \"siren\",\n sensor: \"sensor\",\n binary_sensor: \"sensor\",\n media_player: \"media_player\",\n script: \"script\",\n climate: \"climate\",\n camera: \"camera\",\n fan: \"fan\",\n vacuum: \"vacuum\",\n automation: \"automation\",\n scene: \"scene\",\n input_number: \"sensor\",\n person: \"person\",\n device_tracker: \"tracker\",\n weather: \"weather\",\n water_heater: \"climate\",\n};\n\n/**\n * Extended Scrypted type → canonical map (includes non-eligible types for display).\n * Superset of RAW_TO_CANONICAL for Scrypted-specific types.\n */\nexport const SCRYPTED_TYPE_TO_CANONICAL: Record<string, string> = {\n Light: \"light\",\n Switch: \"switch\",\n WindowCovering: \"cover\",\n Lock: \"lock\",\n SecuritySystem: \"alarm\",\n Buttons: \"button\",\n Select: \"select\",\n Siren: \"siren\",\n Sensor: \"sensor\",\n Entry: \"entry\",\n Program: \"script\",\n MediaPlayer: \"media_player\",\n Camera: \"camera\",\n Doorbell: \"doorbell\",\n Fan: \"fan\",\n Outlet: \"switch\",\n};\n\n/** Normalize raw type (Scrypted or HA) to canonical key for filtering and display. */\nexport function getCanonicalDeviceType(rawType: string): CanonicalDeviceType | null {\n const canonical = RAW_TO_CANONICAL[rawType];\n if (canonical) return canonical;\n const lower = rawType.toLowerCase();\n return RAW_TO_CANONICAL[lower] ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Eligible device types (filter lists)\n// ---------------------------------------------------------------------------\n\n/** Scrypted device types eligible for device control in CamStack. PascalCase. */\nexport const ELIGIBLE_SCRYPTED_DEVICE_TYPES = [\n \"Entry\",\n \"Light\",\n \"Switch\",\n \"Lock\",\n \"SecuritySystem\",\n \"Buttons\",\n \"WindowCovering\",\n \"Siren\",\n \"Sensor\",\n \"Select\",\n \"Program\",\n] as const;\n\n/** Set version for O(1) lookup. */\nexport const ELIGIBLE_SCRYPTED_DEVICE_TYPES_SET = new Set<string>(ELIGIBLE_SCRYPTED_DEVICE_TYPES);\n\n/** Home Assistant domains eligible for device control in CamStack. */\nexport const ELIGIBLE_HA_DOMAINS = [\n \"light\",\n \"switch\",\n \"input_boolean\",\n \"cover\",\n \"lock\",\n \"alarm_control_panel\",\n \"input_button\",\n \"button\",\n \"input_select\",\n \"select\",\n \"siren\",\n \"media_player\",\n \"script\",\n] as const;\n\n/** Set version for O(1) lookup. */\nexport const ELIGIBLE_HA_DOMAINS_SET = new Set<string>(ELIGIBLE_HA_DOMAINS);\n\n// ---------------------------------------------------------------------------\n// Device command action type\n// ---------------------------------------------------------------------------\n\n/** All device command actions supported by CamStack. */\nexport type DeviceCommandAction =\n | \"turnOn\"\n | \"turnOff\"\n | \"openEntry\"\n | \"closeEntry\"\n | \"stopEntry\"\n | \"lock\"\n | \"unlock\"\n | \"disarm\"\n | \"arm\"\n | \"pressButton\"\n | \"selectOption\"\n | \"volumeUp\"\n | \"volumeDown\"\n | \"volumeMute\";\n\n// ---------------------------------------------------------------------------\n// Associated device state (unified shape)\n// ---------------------------------------------------------------------------\n\n/**\n * State snapshot shape for an associated device.\n * Used by both app (AssociatedDeviceStateSnapshot) and proxy (Device.state).\n */\nexport interface AssociatedDeviceState {\n name?: string;\n type?: string;\n interfaces?: string[];\n on?: boolean;\n hasBrightnessControl?: boolean;\n brightness?: number;\n lockState?: string;\n securitySystemState?: { mode?: string; supportedModes?: string[] };\n buttons?: string[];\n entryOpen?: boolean | \"jammed\";\n value?: string;\n options?: string[];\n volumeLevel?: number;\n isVolumeMuted?: boolean;\n coverSupportsStop?: boolean;\n coverPosition?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Device interfaces (from proxy integrations/types.ts)\n// ---------------------------------------------------------------------------\n\n/** A device from an automation system (Scrypted, Home Assistant, etc.). */\nexport interface Device {\n id: string;\n name: string;\n /**\n * Canonical device type (lowercase): \"light\", \"switch\", \"cover\", \"lock\",\n * \"alarm\", \"button\", \"select\", \"siren\", \"sensor\", \"entry\", \"media_player\",\n * \"script\", \"camera\", \"nvr\".\n */\n type: string;\n /** Original type from the source system (e.g. Scrypted \"WindowCovering\", HA domain \"cover\"). */\n rawType?: string;\n /** Provider that owns this device. */\n providerId?: string;\n model?: string;\n manufacturer?: string;\n firmware?: string;\n online: boolean;\n interfaces: string[];\n /** Current state (key-value pairs, device-type-dependent). See AssociatedDeviceState. */\n state: Record<string, unknown>;\n /** Available actions for this device (defined by the provider). */\n actions?: DeviceAction[];\n /** Child devices (e.g. NVR → camera channels). */\n children?: Device[];\n}\n\n/** A command to send to a device. */\nexport interface DeviceCommand {\n deviceId: string;\n command: string;\n params?: Record<string, unknown>;\n}\n\n/** Result of a command execution. */\nexport interface CommandResult {\n success: boolean;\n error?: string;\n state?: Record<string, unknown>;\n}\n\n/** Device source type (integration that provides the device). */\nexport type AssociatedDeviceSource = \"scrypted\" | \"ha\";\n\n/** Eligible device summary (for device picker UI). */\nexport interface EligibleDevice {\n id: string;\n name: string;\n type: string;\n source: AssociatedDeviceSource;\n}\n\n// ─── Device Actions (provider-defined) ──────────────────────────\n\n/**\n * An action that can be performed on a device.\n * Actions are declared by the provider and rendered dynamically in the UI.\n */\nexport interface DeviceAction {\n /** Unique action ID (e.g. \"toggle\", \"setBrightness\", \"ptzMove\", \"reboot\"). */\n id: string;\n /** Display label (e.g. \"Toggle\", \"Set Brightness\", \"Move Camera\"). */\n label: string;\n /** Action category for UI grouping. */\n category?: \"power\" | \"control\" | \"ptz\" | \"media\" | \"system\" | \"custom\";\n /** Icon hint (lucide icon name or emoji). */\n icon?: string;\n /** Parameters this action accepts. */\n params?: DeviceActionParam[];\n /** Whether this action is destructive (shown with warning). */\n destructive?: boolean;\n}\n\n/** A parameter for a device action. */\nexport interface DeviceActionParam {\n /** Parameter key. */\n key: string;\n /** Display label. */\n label: string;\n /** Type for UI rendering. */\n type: \"boolean\" | \"number\" | \"string\" | \"select\" | \"slider\";\n /** Default value. */\n default?: unknown;\n /** For select type: available options. */\n options?: { value: string; label: string }[];\n /** For slider/number: min/max/step. */\n min?: number;\n max?: number;\n step?: number;\n}\n","/**\n * Feature capability matrix — shared between CamStack app and proxy.\n *\n * Maps each app feature to:\n * - Which source types (Frigate, Scrypted, RTSP) support it\n * - Which platforms (iOS, Android, Web, Scrypted embed) it works on\n * - Whether the camstack-server backend is required\n * - The ICameraSource method that enables the feature\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type FeatureId =\n | \"liveStream\"\n | \"multiResolution\"\n | \"motion\"\n | \"objectDetection\"\n | \"audioVolume\"\n | \"audioVolumes\"\n | \"ptz\"\n | \"intercom\"\n | \"deviceStatus\"\n | \"timeline\"\n | \"clusteredTimeline\"\n | \"detectionClasses\"\n | \"videoClips\"\n | \"nvrPlayback\"\n | \"nvrScrub\"\n | \"recordingThumbnail\"\n | \"nvrSeekToLive\";\n\nexport type PlatformId = \"ios\" | \"android\" | \"web\" | \"scryptedEmbed\";\n\nexport type SourceType = \"frigate\" | \"scrypted\" | \"rtsp\";\n\nexport interface FeatureEntry {\n id: FeatureId;\n label: string;\n /** Which source types support this feature. */\n sources: Partial<Record<SourceType, boolean>>;\n /** Platform availability overrides. When omitted, all platforms are supported. */\n platforms?: Partial<Record<PlatformId, boolean>>;\n /** True when this feature needs the camstack-server backend. */\n requiresBackend?: boolean;\n /** The ICameraSource method name that enables this feature at runtime. */\n adapterMethod?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Matrix\n// ---------------------------------------------------------------------------\n\nexport const FEATURE_MATRIX: FeatureEntry[] = [\n {\n id: \"liveStream\",\n label: \"Live Stream\",\n sources: { frigate: true, scrypted: true, rtsp: true },\n adapterMethod: \"getLiveStream\",\n },\n {\n id: \"multiResolution\",\n label: \"Multi-Resolution\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getResolutions\",\n },\n {\n id: \"motion\",\n label: \"Motion Detection\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getMotion\",\n },\n {\n id: \"objectDetection\",\n label: \"Object Detection\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getObjectDetections\",\n },\n {\n id: \"audioVolume\",\n label: \"Audio Level\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getAudioVolume\",\n },\n {\n id: \"audioVolumes\",\n label: \"Audio Volumes (dBFS)\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getAudioVolumes\",\n },\n {\n id: \"ptz\",\n label: \"PTZ Control\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getPTZ\",\n },\n {\n id: \"intercom\",\n label: \"Intercom (Mic)\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getIntercomSupport\",\n },\n {\n id: \"deviceStatus\",\n label: \"Device Status\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getStatus\",\n },\n {\n id: \"timeline\",\n label: \"Detection Timeline\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getCameraDayData\",\n },\n {\n id: \"clusteredTimeline\",\n label: \"Clustered Timeline\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n requiresBackend: true,\n adapterMethod: \"getClusteredDayData\",\n },\n {\n id: \"detectionClasses\",\n label: \"Detection Classes\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getDetectionClasses\",\n },\n {\n id: \"videoClips\",\n label: \"Video Clips\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getVideoClips\",\n },\n {\n id: \"nvrPlayback\",\n label: \"NVR Playback\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getNvrPlaybackSupported\",\n },\n {\n id: \"nvrScrub\",\n label: \"NVR Scrub/Seek\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"seekRecordingStream\",\n },\n {\n id: \"recordingThumbnail\",\n label: \"Recording Thumbnails\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getRecordingStreamThumbnail\",\n },\n {\n id: \"nvrSeekToLive\",\n label: \"Seek to Live\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"seekNvrToLive\",\n },\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Check if a feature is available for a given source type and platform. */\nexport function isFeatureAvailable(\n featureId: FeatureId,\n source: SourceType,\n platform: PlatformId,\n): boolean {\n const entry = FEATURE_MATRIX.find((f) => f.id === featureId);\n if (!entry) return false;\n if (!entry.sources[source]) return false;\n if (entry.platforms && entry.platforms[platform] === false) return false;\n return true;\n}\n\n/** Get all features supported by a source type. */\nexport function getSourceFeatures(source: SourceType): FeatureEntry[] {\n return FEATURE_MATRIX.filter((f) => f.sources[source]);\n}\n\n/** Get all features that require the backend proxy. */\nexport function getBackendRequiredFeatures(): FeatureEntry[] {\n return FEATURE_MATRIX.filter((f) => f.requiresBackend);\n}\n","/**\n * Adaptive Stream Session — negotiates optimal stream quality with the proxy.\n *\n * The client reports viewport size and network conditions periodically.\n * The proxy selects the best stream from the provider's available streams\n * and instructs the client to switch via go2rtc stream renegotiation.\n *\n * Flow:\n * 1. Client opens session → sends initial constraints (viewport, network)\n * 2. Server evaluates available streams → picks optimal → responds with stream assignment\n * 3. Client connects to assigned go2rtc stream via WebRTC WHEP\n * 4. Periodically, client reports updated stats → server may switch stream\n * 5. On switch: client tears down old PC, creates new PC to new go2rtc stream\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Client-reported constraints for stream selection. */\nexport interface StreamConstraints {\n /** Viewport width in CSS pixels. */\n viewportWidth: number;\n /** Viewport height in CSS pixels. */\n viewportHeight: number;\n /** Device pixel ratio (retina = 2+). */\n pixelRatio?: number;\n /** Estimated downlink bandwidth in Mbps (from navigator.connection or WebRTC stats). */\n bandwidthMbps?: number;\n /** Round-trip time in ms (from WebRTC stats). */\n rttMs?: number;\n /** Packet loss ratio 0-1 (from WebRTC stats). */\n packetLoss?: number;\n /** Whether the client is on a cellular network. */\n isCellular?: boolean;\n /** Whether the client prefers low latency over quality. */\n preferLowLatency?: boolean;\n /** Maximum resolution the client wants (e.g., from a user setting). */\n maxResolution?: \"auto\" | \"high\" | \"medium\" | \"low\";\n}\n\n/** Server-assigned stream for the client. */\nexport interface StreamAssignment {\n /** go2rtc stream name to connect to. */\n streamName: string;\n /** Stream profile (main/sub/ext). */\n profile: string;\n /** Transport type (native/rtsp/rtmp). */\n transport: string;\n /** Human-readable label. */\n label: string;\n /** Stream metadata (if known). */\n metadata?: {\n width?: number;\n height?: number;\n fps?: number;\n bitrate?: number;\n codec?: string;\n };\n /** Reason for this selection. */\n reason: string;\n}\n\n/** Stream selection request from client → server. */\nexport interface StreamSelectionRequest {\n providerId: string;\n camera: string;\n constraints: StreamConstraints;\n /** Current stream (for comparison — only switch if significantly better). */\n currentStreamName?: string;\n}\n\n/** Stream selection response from server → client. */\nexport interface StreamSelectionResponse {\n assignment: StreamAssignment;\n /** Available alternatives the client can manually pick. */\n alternatives: StreamAssignment[];\n /** Seconds until next automatic re-evaluation. */\n nextEvalSeconds: number;\n}\n\n// ---------------------------------------------------------------------------\n// Stream selection algorithm (can run on server or client)\n// ---------------------------------------------------------------------------\n\n/**\n * Select the optimal stream from available options based on client constraints.\n * This is a pure function — no side effects.\n */\nexport function selectOptimalStream(\n streams: Array<{\n streamName: string;\n profile: string;\n transport: string;\n label: string;\n metadata?: { width?: number; height?: number; fps?: number; bitrate?: number; codec?: string };\n }>,\n constraints: StreamConstraints,\n defaultTransport?: string,\n): StreamAssignment | null {\n if (streams.length === 0) return null;\n\n const viewportPixels = constraints.viewportWidth * constraints.viewportHeight * (constraints.pixelRatio ?? 1);\n const bw = constraints.bandwidthMbps ?? 100; // Assume good bandwidth if unknown\n const loss = constraints.packetLoss ?? 0;\n const rtt = constraints.rttMs ?? 50;\n\n // Determine target quality tier\n let targetTier: \"high\" | \"medium\" | \"low\" = \"high\";\n\n if (constraints.maxResolution === \"low\" || constraints.isCellular || bw < 1 || loss > 0.05) {\n targetTier = \"low\";\n } else if (constraints.maxResolution === \"medium\" || bw < 5 || viewportPixels < 500_000 || rtt > 200) {\n targetTier = \"medium\";\n } else if (constraints.maxResolution === \"high\" || viewportPixels > 2_000_000) {\n targetTier = \"high\";\n }\n\n // Map profile to tier\n const PROFILE_TIER: Record<string, \"high\" | \"medium\" | \"low\"> = {\n main: \"high\",\n sub: \"medium\",\n ext: \"low\",\n };\n\n // Prefer the default transport, fallback to any\n const preferTransport = defaultTransport ?? \"native\";\n\n // Score each stream\n const scored = streams.map((s) => {\n let score = 0;\n const streamTier = PROFILE_TIER[s.profile] ?? \"medium\";\n\n // Profile match: exact tier match is best\n if (streamTier === targetTier) score += 100;\n else if (\n (targetTier === \"high\" && streamTier === \"medium\") ||\n (targetTier === \"medium\" && streamTier === \"high\") ||\n (targetTier === \"medium\" && streamTier === \"low\") ||\n (targetTier === \"low\" && streamTier === \"medium\")\n ) score += 50; // Adjacent tier\n // else: 0 (far tier)\n\n // Transport preference\n if (s.transport === preferTransport) score += 30;\n else if (s.transport === \"native\") score += 20; // Native always good\n else if (s.transport === \"rtsp\") score += 15;\n else if (s.transport === \"rtmp\") score += 10;\n\n // Resolution match (if metadata available)\n if (s.metadata?.width && s.metadata?.height) {\n const streamPixels = s.metadata.width * s.metadata.height;\n const ratio = streamPixels / Math.max(viewportPixels, 1);\n // Ideal: stream slightly larger than viewport (1.0-1.5x)\n if (ratio >= 0.8 && ratio <= 2.0) score += 25;\n else if (ratio >= 0.5 && ratio <= 3.0) score += 15;\n // Penalize very oversized streams on low bandwidth\n if (ratio > 4 && bw < 10) score -= 20;\n }\n\n // Codec preference: H.264 better for compatibility, H.265 better for bandwidth\n if (s.metadata?.codec) {\n if (bw < 5 && s.metadata.codec.includes(\"265\")) score += 10; // H.265 saves bandwidth\n if (bw >= 10 && s.metadata.codec.includes(\"264\")) score += 5; // H.264 more compatible\n }\n\n return { ...s, score, targetTier };\n });\n\n // Sort by score descending\n scored.sort((a, b) => b.score - a.score);\n const best = scored[0]!;\n\n const tierNames: Record<string, string> = { high: \"main\", medium: \"sub\", low: \"ext\" };\n\n return {\n streamName: best.streamName,\n profile: best.profile,\n transport: best.transport,\n label: best.label,\n metadata: best.metadata,\n reason: `${best.targetTier} quality → ${best.profile}/${best.transport} (score: ${best.score})`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Re-evaluation interval logic\n// ---------------------------------------------------------------------------\n\n/** Determine seconds until next re-evaluation based on stability. */\nexport function getNextEvalInterval(\n constraints: StreamConstraints,\n wasSwitch: boolean,\n): number {\n if (wasSwitch) return 10; // Re-check soon after a switch\n if (constraints.isCellular) return 15; // Cellular: check frequently\n if ((constraints.packetLoss ?? 0) > 0.02) return 15; // Lossy: check frequently\n return 30; // Stable: check every 30s\n}\n"],"mappings":"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","names":["_typeof","o","toPrimitive","toPropertyKey","r","subscribe: (observer: Observer<TValue, TError>) => TeardownLogic","self: Observable<TValue, TError>","teardownRef: TeardownLogic | null","prev: any","fn: UnaryFunction<any, any>","observable: Observable<TValue, unknown>","_opts?: ShareConfig","subscription: Unsubscribable | null","observers: Partial<Observer<TValue, TError>>[]","initialValue: TValue","value: TValue","observerList: Observer<TValue, never>[]","observer: Observer<TValue, never>","nextValue: TValue","opts: {\n links: OperationLink<TRouter, TInput, TOutput>[];\n op: Operation<TInput>;\n}","value: unknown","fn: () => TValue","retryableRpcCodes: TRPC_ERROR_CODE_NUMBER[]","obj: object","callback: ProxyCallback","path: readonly string[]","memo: Record<string, unknown>","callback: (path: keyof TFaux) => any","_typeof","o","toPrimitive","require_typeof","require_toPrimitive","toPropertyKey","require_toPropertyKey","require_defineProperty","r","response:\n | TRPCResponse<TOutput, inferRouterError<TRouter>>\n | TRPCResponseMessage<TOutput, inferRouterError<TRouter>>","transformer: DataTransformer","result: ReturnType<typeof transformResultInner>","cause: unknown","obj: unknown","err: unknown","fallback: string","TRPCClientError","message: string","opts?: {\n result?: Maybe<TRPCErrorResponse<inferErrorShape<TRouterOrProcedure>>>;\n cause?: Error;\n meta?: Record<string, unknown>;\n }","_cause: Error | TRPCErrorResponse<any> | object","opts: { meta?: Record<string, unknown>; cause?: Error }","import_objectSpread2","transformer:\n | TransformerOptions<{ transformer: false }>['transformer']\n | TransformerOptions<{ transformer: true }>['transformer']\n | undefined","isFunction","fn: unknown","customFetchImpl?: FetchEsque | NativeFetchEsque","opts: HTTPLinkBaseOptions<AnyClientTypes>","array: unknown[]","dict: Record<number, unknown>","opts: GetInputOptions","getUrl: GetUrl","queryParts: string[]","getBody: GetBody","jsonHttpRequester: Requester","import_objectSpread2","signal: Maybe<AbortSignal>","opts: HTTPRequestOptions","input: unknown","universalRequester: Requester","import_objectSpread2","opts: HTTPLinkOptions<TRouter['_def']['_config']['$types']>","meta: HTTPResult['meta'] | undefined","jsonEncoder: Encoder","lazyDefaults: LazyOptions","keepAliveDefaults: KeepAliveOptions","attemptIndex: number","value: T | ((...args: TArgs) => T)","TRPCWebSocketClosedError","opts: { message: string; cause?: unknown }","onTimeout: () => void","timeoutMs: number","resolve: (value: T | PromiseLike<T>) => void","reject: (reason?: any) => void","urlOptions: UrlOptionsWithConnectionParams","connectionParams: CallbackOrValue<TRPCRequestInfo['connectionParams']>","encoder: Encoder","message: TRPCConnectionParamsMessage","message: TRPCClientOutgoingMessage","callbacks: TCallbacks","messageId: MessageIdLike","ws: WebSocket","pingTimeout: ReturnType<typeof setTimeout> | undefined","pongTimeout: ReturnType<typeof setTimeout> | undefined","WsConnection","opts: WebSocketConnectionOptions","this","connection: WsConnection","opts: WebSocketClientOptions","import_objectSpread2","requestsToAwait: Promise<void>[]","closedError: TRPCWebSocketClosedError","cause: unknown","message: TRPCResponseMessage","message: TRPCClientIncomingRequest","messageOrMessages: TRPCClientOutgoingMessage | TRPCClientOutgoingMessage[]","message","opts: WebSocketLinkOptions<TRouter>","opts: CreateTRPCClientOptions<TInferrable>","opts: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n signal: Maybe<AbortSignal>;\n }","path: string","input?: unknown","opts?: TRPCRequestOptions","input: unknown","opts: Partial<\n TRPCSubscriptionObserver<unknown, TRPCClientError<AnyRouter>>\n > &\n TRPCRequestOptions","clientCallTypeMap: Record<\n keyof DecorateProcedure<any, any>,\n ProcedureType\n>","clientCallType: string","client: TRPCUntypedClient<TRouter>","opts: CreateTRPCClientOptions<TRouter>","_asyncIterator","r","AsyncFromSyncIterator","r","e","n","o","OverloadYield","_awaitAsyncGenerator","_wrapAsyncGenerator","t","superjson","BackendClient","trpc","serverUrl","token","wsClient","config","replace","isBrowser","window","useWs","useWebSocket","headers","h","wsUrl","createWSClient","url","connectionParams","retryDelayMs","createTRPCClient","links","wsLink","client","transformer","superjson","httpLink","setToken","close","login","username","password","auth","mutate","getMe","me","query","logout","getSystemInfo","system","info","getFeatureFlags","featureFlags","listProviders","providers","list","getProvider","providerId","get","id","startProvider","start","stopProvider","stop","listProviderTypes","providerConfig","getAvailableTypes","listDevices","devices","getDevice","deviceId","discoverDevices","adoptDevice","externalId","createDevice","getAddonAssetUrl","addonId","assetPath","listAddons","addons","getAddonConfigSchema","getConfigSchema","getAddonConfig","getConfig","updateAddonConfig","updateConfig","getAddonLogs","options","getLogs","listKnownFaces","knownFaces","registerFace","label","cropBase64","group","register","listPipelines","bridgePipeline","getPipelineStatus","getPipeline","listAgents","agents","dispatchTask","agentId","task","capability","input","getProcessTree","agent","processTree","bridgeListAddons","bridgeGetPipeline","bridgeSetPipeline","setPipeline","bridgeValidatePipeline","validatePipeline","bridgeGetAddonConfig","bridgeSetAddonConfig","setAddonConfig","bridgeListPackages","listPackages","bridgeListAddonsPackages","bridgeInstallPackage","packageName","version","installPackage","bridgeUninstallPackage","uninstallPackage","getRecordingConfig","recording","getRecordingPolicy","getPolicy","getRecordingPolicyStatus","getPolicyStatus","getRecordingSegments","streamId","startTime","endTime","getSegments","getEvents","events","logs","replEval","code","scope","repl","execute","type","listUsers","users","createUser","role","create","getTrackingSessions","session","getActiveTracks","listProcesses","processes","enableProvider","disableProvider","getSettingsSchema","section","settings","getSchema","getSettings","updateSettings","data","update","createBackendClient","DetectionClass","animalClasses","personClasses","vehicleClasses","faceClasses","licensePlateClasses","motionClasses","packageClasses","audioClasses","audioLabelClasses","doorbellClasses","sensorLabelClasses","detectionClassesDefaultMap","reduce","tot","curr","isFaceClassname","c","includes","isPlateClassname","isAnimalClassname","isPersonClassname","isVehicleClassname","isMotionClassname","isDoorbellClassname","isPackageClassname","isAudioClassname","isSensorLabelClassname","isLabelDetection","getParentClass","className","getParentDetectionClass","det","baseMap","parentGroup","defaultDetectionClasses","Object","values","DEFAULT_ENABLED_CLASSES","filter","TIMELINE_PRESET_CRITICAL","TIMELINE_PRESET_IMPORTANT","TIMELINE_PRESET_ALL","getClassesForTimelinePreset","preset","customClasses","length","RAW_TO_CANONICAL","Light","Switch","WindowCovering","Lock","SecuritySystem","Buttons","Select","Siren","Sensor","Entry","Program","MediaPlayer","Outlet","light","switch","input_boolean","cover","lock","alarm_control_panel","input_button","button","input_select","select","siren","sensor","media_player","script","HA_DOMAIN_TYPE_MAP","binary_sensor","climate","camera","fan","vacuum","automation","scene","input_number","person","device_tracker","weather","water_heater","SCRYPTED_TYPE_TO_CANONICAL","Camera","Doorbell","Fan","getCanonicalDeviceType","rawType","canonical","lower","toLowerCase","ELIGIBLE_SCRYPTED_DEVICE_TYPES","ELIGIBLE_SCRYPTED_DEVICE_TYPES_SET","Set","ELIGIBLE_HA_DOMAINS","ELIGIBLE_HA_DOMAINS_SET","FEATURE_MATRIX","id","label","sources","frigate","scrypted","rtsp","adapterMethod","requiresBackend","isFeatureAvailable","featureId","source","platform","entry","find","f","platforms","getSourceFeatures","filter","getBackendRequiredFeatures","selectOptimalStream","streams","constraints","defaultTransport","length","viewportPixels","viewportWidth","viewportHeight","pixelRatio","bw","bandwidthMbps","loss","packetLoss","rtt","rttMs","targetTier","maxResolution","isCellular","PROFILE_TIER","main","sub","ext","preferTransport","scored","map","s","score","streamTier","profile","transport","metadata","width","height","streamPixels","ratio","Math","max","codec","includes","sort","a","b","best","tierNames","high","medium","low","streamName","label","reason","getNextEvalInterval","wasSwitch"]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../node_modules/superjson/dist/double-indexed-kv.js","../../../node_modules/superjson/dist/registry.js","../../../node_modules/superjson/dist/class-registry.js","../../../node_modules/superjson/dist/util.js","../../../node_modules/superjson/dist/custom-transformer-registry.js","../../../node_modules/superjson/dist/is.js","../../../node_modules/superjson/dist/pathstringifier.js","../../../node_modules/superjson/dist/transformer.js","../../../node_modules/superjson/dist/accessDeep.js","../../../node_modules/superjson/dist/plainer.js","../../../node_modules/is-what/dist/getType.js","../../../node_modules/is-what/dist/isArray.js","../../../node_modules/is-what/dist/isPlainObject.js","../../../node_modules/copy-anything/dist/index.js","../../../node_modules/superjson/dist/index.js","../src/system.ts","../src/detection.ts","../src/devices.ts","../src/features.ts","../src/adaptive-stream.ts"],"sourcesContent":["export class DoubleIndexedKV {\n constructor() {\n this.keyToValue = new Map();\n this.valueToKey = new Map();\n }\n set(key, value) {\n this.keyToValue.set(key, value);\n this.valueToKey.set(value, key);\n }\n getByKey(key) {\n return this.keyToValue.get(key);\n }\n getByValue(value) {\n return this.valueToKey.get(value);\n }\n clear() {\n this.keyToValue.clear();\n this.valueToKey.clear();\n }\n}\n//# sourceMappingURL=double-indexed-kv.js.map","import { DoubleIndexedKV } from './double-indexed-kv.js';\nexport class Registry {\n constructor(generateIdentifier) {\n this.generateIdentifier = generateIdentifier;\n this.kv = new DoubleIndexedKV();\n }\n register(value, identifier) {\n if (this.kv.getByValue(value)) {\n return;\n }\n if (!identifier) {\n identifier = this.generateIdentifier(value);\n }\n this.kv.set(identifier, value);\n }\n clear() {\n this.kv.clear();\n }\n getIdentifier(value) {\n return this.kv.getByValue(value);\n }\n getValue(identifier) {\n return this.kv.getByKey(identifier);\n }\n}\n//# sourceMappingURL=registry.js.map","import { Registry } from './registry.js';\nexport class ClassRegistry extends Registry {\n constructor() {\n super(c => c.name);\n this.classToAllowedProps = new Map();\n }\n register(value, options) {\n if (typeof options === 'object') {\n if (options.allowProps) {\n this.classToAllowedProps.set(value, options.allowProps);\n }\n super.register(value, options.identifier);\n }\n else {\n super.register(value, options);\n }\n }\n getAllowedProps(value) {\n return this.classToAllowedProps.get(value);\n }\n}\n//# sourceMappingURL=class-registry.js.map","function valuesOfObj(record) {\n if ('values' in Object) {\n // eslint-disable-next-line es5/no-es6-methods\n return Object.values(record);\n }\n const values = [];\n // eslint-disable-next-line no-restricted-syntax\n for (const key in record) {\n if (record.hasOwnProperty(key)) {\n values.push(record[key]);\n }\n }\n return values;\n}\nexport function find(record, predicate) {\n const values = valuesOfObj(record);\n if ('find' in values) {\n // eslint-disable-next-line es5/no-es6-methods\n return values.find(predicate);\n }\n const valuesNotNever = values;\n for (let i = 0; i < valuesNotNever.length; i++) {\n const value = valuesNotNever[i];\n if (predicate(value)) {\n return value;\n }\n }\n return undefined;\n}\nexport function forEach(record, run) {\n Object.entries(record).forEach(([key, value]) => run(value, key));\n}\nexport function includes(arr, value) {\n return arr.indexOf(value) !== -1;\n}\nexport function findArr(record, predicate) {\n for (let i = 0; i < record.length; i++) {\n const value = record[i];\n if (predicate(value)) {\n return value;\n }\n }\n return undefined;\n}\n//# sourceMappingURL=util.js.map","import { find } from './util.js';\nexport class CustomTransformerRegistry {\n constructor() {\n this.transfomers = {};\n }\n register(transformer) {\n this.transfomers[transformer.name] = transformer;\n }\n findApplicable(v) {\n return find(this.transfomers, transformer => transformer.isApplicable(v));\n }\n findByName(name) {\n return this.transfomers[name];\n }\n}\n//# sourceMappingURL=custom-transformer-registry.js.map","const getType = (payload) => Object.prototype.toString.call(payload).slice(8, -1);\nexport const isUndefined = (payload) => typeof payload === 'undefined';\nexport const isNull = (payload) => payload === null;\nexport const isPlainObject = (payload) => {\n if (typeof payload !== 'object' || payload === null)\n return false;\n if (payload === Object.prototype)\n return false;\n if (Object.getPrototypeOf(payload) === null)\n return true;\n return Object.getPrototypeOf(payload) === Object.prototype;\n};\nexport const isEmptyObject = (payload) => isPlainObject(payload) && Object.keys(payload).length === 0;\nexport const isArray = (payload) => Array.isArray(payload);\nexport const isString = (payload) => typeof payload === 'string';\nexport const isNumber = (payload) => typeof payload === 'number' && !isNaN(payload);\nexport const isBoolean = (payload) => typeof payload === 'boolean';\nexport const isRegExp = (payload) => payload instanceof RegExp;\nexport const isMap = (payload) => payload instanceof Map;\nexport const isSet = (payload) => payload instanceof Set;\nexport const isSymbol = (payload) => getType(payload) === 'Symbol';\nexport const isDate = (payload) => payload instanceof Date && !isNaN(payload.valueOf());\nexport const isError = (payload) => payload instanceof Error;\nexport const isNaNValue = (payload) => typeof payload === 'number' && isNaN(payload);\nexport const isPrimitive = (payload) => isBoolean(payload) ||\n isNull(payload) ||\n isUndefined(payload) ||\n isNumber(payload) ||\n isString(payload) ||\n isSymbol(payload);\nexport const isBigint = (payload) => typeof payload === 'bigint';\nexport const isInfinite = (payload) => payload === Infinity || payload === -Infinity;\nexport const isTypedArray = (payload) => ArrayBuffer.isView(payload) && !(payload instanceof DataView);\nexport const isURL = (payload) => payload instanceof URL;\n//# sourceMappingURL=is.js.map","export const escapeKey = (key) => key.replace(/\\\\/g, '\\\\\\\\').replace(/\\./g, '\\\\.');\nexport const stringifyPath = (path) => path\n .map(String)\n .map(escapeKey)\n .join('.');\nexport const parsePath = (string, legacyPaths) => {\n const result = [];\n let segment = '';\n for (let i = 0; i < string.length; i++) {\n let char = string.charAt(i);\n if (!legacyPaths && char === '\\\\') {\n const escaped = string.charAt(i + 1);\n if (escaped === '\\\\') {\n segment += '\\\\';\n i++;\n continue;\n }\n else if (escaped !== '.') {\n throw Error('invalid path');\n }\n }\n const isEscapedDot = char === '\\\\' && string.charAt(i + 1) === '.';\n if (isEscapedDot) {\n segment += '.';\n i++;\n continue;\n }\n const isEndOfSegment = char === '.';\n if (isEndOfSegment) {\n result.push(segment);\n segment = '';\n continue;\n }\n segment += char;\n }\n const lastSegment = segment;\n result.push(lastSegment);\n return result;\n};\n//# sourceMappingURL=pathstringifier.js.map","import { isBigint, isDate, isInfinite, isMap, isNaNValue, isRegExp, isSet, isUndefined, isSymbol, isArray, isError, isTypedArray, isURL, } from './is.js';\nimport { findArr } from './util.js';\nfunction simpleTransformation(isApplicable, annotation, transform, untransform) {\n return {\n isApplicable,\n annotation,\n transform,\n untransform,\n };\n}\nconst simpleRules = [\n simpleTransformation(isUndefined, 'undefined', () => null, () => undefined),\n simpleTransformation(isBigint, 'bigint', v => v.toString(), v => {\n if (typeof BigInt !== 'undefined') {\n return BigInt(v);\n }\n console.error('Please add a BigInt polyfill.');\n return v;\n }),\n simpleTransformation(isDate, 'Date', v => v.toISOString(), v => new Date(v)),\n simpleTransformation(isError, 'Error', (v, superJson) => {\n const baseError = {\n name: v.name,\n message: v.message,\n };\n if ('cause' in v) {\n baseError.cause = v.cause;\n }\n superJson.allowedErrorProps.forEach(prop => {\n baseError[prop] = v[prop];\n });\n return baseError;\n }, (v, superJson) => {\n const e = new Error(v.message, { cause: v.cause });\n e.name = v.name;\n e.stack = v.stack;\n superJson.allowedErrorProps.forEach(prop => {\n e[prop] = v[prop];\n });\n return e;\n }),\n simpleTransformation(isRegExp, 'regexp', v => '' + v, regex => {\n const body = regex.slice(1, regex.lastIndexOf('/'));\n const flags = regex.slice(regex.lastIndexOf('/') + 1);\n return new RegExp(body, flags);\n }),\n simpleTransformation(isSet, 'set', \n // (sets only exist in es6+)\n // eslint-disable-next-line es5/no-es6-methods\n v => [...v.values()], v => new Set(v)),\n simpleTransformation(isMap, 'map', v => [...v.entries()], v => new Map(v)),\n simpleTransformation((v) => isNaNValue(v) || isInfinite(v), 'number', v => {\n if (isNaNValue(v)) {\n return 'NaN';\n }\n if (v > 0) {\n return 'Infinity';\n }\n else {\n return '-Infinity';\n }\n }, Number),\n simpleTransformation((v) => v === 0 && 1 / v === -Infinity, 'number', () => {\n return '-0';\n }, Number),\n simpleTransformation(isURL, 'URL', v => v.toString(), v => new URL(v)),\n];\nfunction compositeTransformation(isApplicable, annotation, transform, untransform) {\n return {\n isApplicable,\n annotation,\n transform,\n untransform,\n };\n}\nconst symbolRule = compositeTransformation((s, superJson) => {\n if (isSymbol(s)) {\n const isRegistered = !!superJson.symbolRegistry.getIdentifier(s);\n return isRegistered;\n }\n return false;\n}, (s, superJson) => {\n const identifier = superJson.symbolRegistry.getIdentifier(s);\n return ['symbol', identifier];\n}, v => v.description, (_, a, superJson) => {\n const value = superJson.symbolRegistry.getValue(a[1]);\n if (!value) {\n throw new Error('Trying to deserialize unknown symbol');\n }\n return value;\n});\nconst constructorToName = [\n Int8Array,\n Uint8Array,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n Float32Array,\n Float64Array,\n Uint8ClampedArray,\n].reduce((obj, ctor) => {\n obj[ctor.name] = ctor;\n return obj;\n}, {});\nconst typedArrayRule = compositeTransformation(isTypedArray, v => ['typed-array', v.constructor.name], v => [...v], (v, a) => {\n const ctor = constructorToName[a[1]];\n if (!ctor) {\n throw new Error('Trying to deserialize unknown typed array');\n }\n return new ctor(v);\n});\nexport function isInstanceOfRegisteredClass(potentialClass, superJson) {\n if (potentialClass?.constructor) {\n const isRegistered = !!superJson.classRegistry.getIdentifier(potentialClass.constructor);\n return isRegistered;\n }\n return false;\n}\nconst classRule = compositeTransformation(isInstanceOfRegisteredClass, (clazz, superJson) => {\n const identifier = superJson.classRegistry.getIdentifier(clazz.constructor);\n return ['class', identifier];\n}, (clazz, superJson) => {\n const allowedProps = superJson.classRegistry.getAllowedProps(clazz.constructor);\n if (!allowedProps) {\n return { ...clazz };\n }\n const result = {};\n allowedProps.forEach(prop => {\n result[prop] = clazz[prop];\n });\n return result;\n}, (v, a, superJson) => {\n const clazz = superJson.classRegistry.getValue(a[1]);\n if (!clazz) {\n throw new Error(`Trying to deserialize unknown class '${a[1]}' - check https://github.com/blitz-js/superjson/issues/116#issuecomment-773996564`);\n }\n return Object.assign(Object.create(clazz.prototype), v);\n});\nconst customRule = compositeTransformation((value, superJson) => {\n return !!superJson.customTransformerRegistry.findApplicable(value);\n}, (value, superJson) => {\n const transformer = superJson.customTransformerRegistry.findApplicable(value);\n return ['custom', transformer.name];\n}, (value, superJson) => {\n const transformer = superJson.customTransformerRegistry.findApplicable(value);\n return transformer.serialize(value);\n}, (v, a, superJson) => {\n const transformer = superJson.customTransformerRegistry.findByName(a[1]);\n if (!transformer) {\n throw new Error('Trying to deserialize unknown custom value');\n }\n return transformer.deserialize(v);\n});\nconst compositeRules = [classRule, symbolRule, customRule, typedArrayRule];\nexport const transformValue = (value, superJson) => {\n const applicableCompositeRule = findArr(compositeRules, rule => rule.isApplicable(value, superJson));\n if (applicableCompositeRule) {\n return {\n value: applicableCompositeRule.transform(value, superJson),\n type: applicableCompositeRule.annotation(value, superJson),\n };\n }\n const applicableSimpleRule = findArr(simpleRules, rule => rule.isApplicable(value, superJson));\n if (applicableSimpleRule) {\n return {\n value: applicableSimpleRule.transform(value, superJson),\n type: applicableSimpleRule.annotation,\n };\n }\n return undefined;\n};\nconst simpleRulesByAnnotation = {};\nsimpleRules.forEach(rule => {\n simpleRulesByAnnotation[rule.annotation] = rule;\n});\nexport const untransformValue = (json, type, superJson) => {\n if (isArray(type)) {\n switch (type[0]) {\n case 'symbol':\n return symbolRule.untransform(json, type, superJson);\n case 'class':\n return classRule.untransform(json, type, superJson);\n case 'custom':\n return customRule.untransform(json, type, superJson);\n case 'typed-array':\n return typedArrayRule.untransform(json, type, superJson);\n default:\n throw new Error('Unknown transformation: ' + type);\n }\n }\n else {\n const transformation = simpleRulesByAnnotation[type];\n if (!transformation) {\n throw new Error('Unknown transformation: ' + type);\n }\n return transformation.untransform(json, superJson);\n }\n};\n//# sourceMappingURL=transformer.js.map","import { isMap, isArray, isPlainObject, isSet } from './is.js';\nimport { includes } from './util.js';\nconst getNthKey = (value, n) => {\n if (n > value.size)\n throw new Error('index out of bounds');\n const keys = value.keys();\n while (n > 0) {\n keys.next();\n n--;\n }\n return keys.next().value;\n};\nfunction validatePath(path) {\n if (includes(path, '__proto__')) {\n throw new Error('__proto__ is not allowed as a property');\n }\n if (includes(path, 'prototype')) {\n throw new Error('prototype is not allowed as a property');\n }\n if (includes(path, 'constructor')) {\n throw new Error('constructor is not allowed as a property');\n }\n}\nexport const getDeep = (object, path) => {\n validatePath(path);\n for (let i = 0; i < path.length; i++) {\n const key = path[i];\n if (isSet(object)) {\n object = getNthKey(object, +key);\n }\n else if (isMap(object)) {\n const row = +key;\n const type = +path[++i] === 0 ? 'key' : 'value';\n const keyOfRow = getNthKey(object, row);\n switch (type) {\n case 'key':\n object = keyOfRow;\n break;\n case 'value':\n object = object.get(keyOfRow);\n break;\n }\n }\n else {\n object = object[key];\n }\n }\n return object;\n};\nexport const setDeep = (object, path, mapper) => {\n validatePath(path);\n if (path.length === 0) {\n return mapper(object);\n }\n let parent = object;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (isArray(parent)) {\n const index = +key;\n parent = parent[index];\n }\n else if (isPlainObject(parent)) {\n parent = parent[key];\n }\n else if (isSet(parent)) {\n const row = +key;\n parent = getNthKey(parent, row);\n }\n else if (isMap(parent)) {\n const isEnd = i === path.length - 2;\n if (isEnd) {\n break;\n }\n const row = +key;\n const type = +path[++i] === 0 ? 'key' : 'value';\n const keyOfRow = getNthKey(parent, row);\n switch (type) {\n case 'key':\n parent = keyOfRow;\n break;\n case 'value':\n parent = parent.get(keyOfRow);\n break;\n }\n }\n }\n const lastKey = path[path.length - 1];\n if (isArray(parent)) {\n parent[+lastKey] = mapper(parent[+lastKey]);\n }\n else if (isPlainObject(parent)) {\n parent[lastKey] = mapper(parent[lastKey]);\n }\n if (isSet(parent)) {\n const oldValue = getNthKey(parent, +lastKey);\n const newValue = mapper(oldValue);\n if (oldValue !== newValue) {\n parent.delete(oldValue);\n parent.add(newValue);\n }\n }\n if (isMap(parent)) {\n const row = +path[path.length - 2];\n const keyToRow = getNthKey(parent, row);\n const type = +lastKey === 0 ? 'key' : 'value';\n switch (type) {\n case 'key': {\n const newKey = mapper(keyToRow);\n parent.set(newKey, parent.get(keyToRow));\n if (newKey !== keyToRow) {\n parent.delete(keyToRow);\n }\n break;\n }\n case 'value': {\n parent.set(keyToRow, mapper(parent.get(keyToRow)));\n break;\n }\n }\n }\n return object;\n};\n//# sourceMappingURL=accessDeep.js.map","import { isArray, isEmptyObject, isError, isMap, isPlainObject, isPrimitive, isSet, } from './is.js';\nimport { escapeKey, stringifyPath } from './pathstringifier.js';\nimport { isInstanceOfRegisteredClass, transformValue, untransformValue, } from './transformer.js';\nimport { includes, forEach } from './util.js';\nimport { parsePath } from './pathstringifier.js';\nimport { getDeep, setDeep } from './accessDeep.js';\nconst enableLegacyPaths = (version) => version < 1;\nfunction traverse(tree, walker, version, origin = []) {\n if (!tree) {\n return;\n }\n const legacyPaths = enableLegacyPaths(version);\n if (!isArray(tree)) {\n forEach(tree, (subtree, key) => traverse(subtree, walker, version, [\n ...origin,\n ...parsePath(key, legacyPaths),\n ]));\n return;\n }\n const [nodeValue, children] = tree;\n if (children) {\n forEach(children, (child, key) => {\n traverse(child, walker, version, [\n ...origin,\n ...parsePath(key, legacyPaths),\n ]);\n });\n }\n walker(nodeValue, origin);\n}\nexport function applyValueAnnotations(plain, annotations, version, superJson) {\n traverse(annotations, (type, path) => {\n plain = setDeep(plain, path, v => untransformValue(v, type, superJson));\n }, version);\n return plain;\n}\nexport function applyReferentialEqualityAnnotations(plain, annotations, version) {\n const legacyPaths = enableLegacyPaths(version);\n function apply(identicalPaths, path) {\n const object = getDeep(plain, parsePath(path, legacyPaths));\n identicalPaths\n .map(path => parsePath(path, legacyPaths))\n .forEach(identicalObjectPath => {\n plain = setDeep(plain, identicalObjectPath, () => object);\n });\n }\n if (isArray(annotations)) {\n const [root, other] = annotations;\n root.forEach(identicalPath => {\n plain = setDeep(plain, parsePath(identicalPath, legacyPaths), () => plain);\n });\n if (other) {\n forEach(other, apply);\n }\n }\n else {\n forEach(annotations, apply);\n }\n return plain;\n}\nconst isDeep = (object, superJson) => isPlainObject(object) ||\n isArray(object) ||\n isMap(object) ||\n isSet(object) ||\n isError(object) ||\n isInstanceOfRegisteredClass(object, superJson);\nfunction addIdentity(object, path, identities) {\n const existingSet = identities.get(object);\n if (existingSet) {\n existingSet.push(path);\n }\n else {\n identities.set(object, [path]);\n }\n}\nexport function generateReferentialEqualityAnnotations(identitites, dedupe) {\n const result = {};\n let rootEqualityPaths = undefined;\n identitites.forEach(paths => {\n if (paths.length <= 1) {\n return;\n }\n // if we're not deduping, all of these objects continue existing.\n // putting the shortest path first makes it easier to parse for humans\n // if we're deduping though, only the first entry will still exist, so we can't do this optimisation.\n if (!dedupe) {\n paths = paths\n .map(path => path.map(String))\n .sort((a, b) => a.length - b.length);\n }\n const [representativePath, ...identicalPaths] = paths;\n if (representativePath.length === 0) {\n rootEqualityPaths = identicalPaths.map(stringifyPath);\n }\n else {\n result[stringifyPath(representativePath)] = identicalPaths.map(stringifyPath);\n }\n });\n if (rootEqualityPaths) {\n if (isEmptyObject(result)) {\n return [rootEqualityPaths];\n }\n else {\n return [rootEqualityPaths, result];\n }\n }\n else {\n return isEmptyObject(result) ? undefined : result;\n }\n}\nexport const walker = (object, identities, superJson, dedupe, path = [], objectsInThisPath = [], seenObjects = new Map()) => {\n const primitive = isPrimitive(object);\n if (!primitive) {\n addIdentity(object, path, identities);\n const seen = seenObjects.get(object);\n if (seen) {\n // short-circuit result if we've seen this object before\n return dedupe\n ? {\n transformedValue: null,\n }\n : seen;\n }\n }\n if (!isDeep(object, superJson)) {\n const transformed = transformValue(object, superJson);\n const result = transformed\n ? {\n transformedValue: transformed.value,\n annotations: [transformed.type],\n }\n : {\n transformedValue: object,\n };\n if (!primitive) {\n seenObjects.set(object, result);\n }\n return result;\n }\n if (includes(objectsInThisPath, object)) {\n // prevent circular references\n return {\n transformedValue: null,\n };\n }\n const transformationResult = transformValue(object, superJson);\n const transformed = transformationResult?.value ?? object;\n const transformedValue = isArray(transformed) ? [] : {};\n const innerAnnotations = {};\n forEach(transformed, (value, index) => {\n if (index === '__proto__' ||\n index === 'constructor' ||\n index === 'prototype') {\n throw new Error(`Detected property ${index}. This is a prototype pollution risk, please remove it from your object.`);\n }\n const recursiveResult = walker(value, identities, superJson, dedupe, [...path, index], [...objectsInThisPath, object], seenObjects);\n transformedValue[index] = recursiveResult.transformedValue;\n if (isArray(recursiveResult.annotations)) {\n innerAnnotations[escapeKey(index)] = recursiveResult.annotations;\n }\n else if (isPlainObject(recursiveResult.annotations)) {\n forEach(recursiveResult.annotations, (tree, key) => {\n innerAnnotations[escapeKey(index) + '.' + key] = tree;\n });\n }\n });\n const result = isEmptyObject(innerAnnotations)\n ? {\n transformedValue,\n annotations: !!transformationResult\n ? [transformationResult.type]\n : undefined,\n }\n : {\n transformedValue,\n annotations: !!transformationResult\n ? [transformationResult.type, innerAnnotations]\n : innerAnnotations,\n };\n if (!primitive) {\n seenObjects.set(object, result);\n }\n return result;\n};\n//# sourceMappingURL=plainer.js.map","/** Returns the object type of the given payload */\nexport function getType(payload) {\n return Object.prototype.toString.call(payload).slice(8, -1);\n}\n","import { getType } from './getType.js';\n/** Returns whether the payload is an array */\nexport function isArray(payload) {\n return getType(payload) === 'Array';\n}\n","import { getType } from './getType.js';\n/**\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects\n * with other prototypes)\n */\nexport function isPlainObject(payload) {\n if (getType(payload) !== 'Object')\n return false;\n const prototype = Object.getPrototypeOf(payload);\n return !!prototype && prototype.constructor === Object && prototype === Object.prototype;\n}\n","import { isArray, isPlainObject } from 'is-what';\nfunction assignProp(carry, key, newVal, originalObject, includeNonenumerable) {\n const propType = {}.propertyIsEnumerable.call(originalObject, key)\n ? 'enumerable'\n : 'nonenumerable';\n if (propType === 'enumerable')\n carry[key] = newVal;\n if (includeNonenumerable && propType === 'nonenumerable') {\n Object.defineProperty(carry, key, {\n value: newVal,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n}\n/**\n * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the\n * original object. Arrays are also cloned, however objects inside arrays are still linked.\n *\n * @param target Target can be anything\n * @param [options={}] See type {@link Options} for more details.\n *\n * - `{ props: ['key1'] }` will only copy the `key1` property. When using this you will need to cast\n * the return type manually (in order to keep the TS implementation in here simple I didn't\n * built a complex auto resolved type for those few cases people want to use this option)\n * - `{ nonenumerable: true }` will copy all non-enumerable properties. Default is `{}`\n *\n * @returns The target with replaced values\n */\nexport function copy(target, options = {}) {\n if (isArray(target)) {\n return target.map((item) => copy(item, options));\n }\n if (!isPlainObject(target)) {\n return target;\n }\n const props = Object.getOwnPropertyNames(target);\n const symbols = Object.getOwnPropertySymbols(target);\n return [...props, ...symbols].reduce((carry, key) => {\n // Skip __proto__ properties to prevent prototype pollution\n if (key === '__proto__')\n return carry;\n if (isArray(options.props) && !options.props.includes(key)) {\n return carry;\n }\n const val = target[key];\n const newVal = copy(val, options);\n assignProp(carry, key, newVal, target, options.nonenumerable);\n return carry;\n }, {});\n}\n","import { ClassRegistry } from './class-registry.js';\nimport { Registry } from './registry.js';\nimport { CustomTransformerRegistry, } from './custom-transformer-registry.js';\nimport { applyReferentialEqualityAnnotations, applyValueAnnotations, generateReferentialEqualityAnnotations, walker, } from './plainer.js';\nimport { copy } from 'copy-anything';\nclass SuperJSON {\n /**\n * @param dedupeReferentialEqualities If true, SuperJSON will make sure only one instance of referentially equal objects are serialized and the rest are replaced with `null`.\n */\n constructor({ dedupe = false, } = {}) {\n this.classRegistry = new ClassRegistry();\n this.symbolRegistry = new Registry(s => s.description ?? '');\n this.customTransformerRegistry = new CustomTransformerRegistry();\n this.allowedErrorProps = [];\n this.dedupe = dedupe;\n }\n serialize(object) {\n const identities = new Map();\n const output = walker(object, identities, this, this.dedupe);\n const res = {\n json: output.transformedValue,\n };\n if (output.annotations) {\n res.meta = {\n ...res.meta,\n values: output.annotations,\n };\n }\n const equalityAnnotations = generateReferentialEqualityAnnotations(identities, this.dedupe);\n if (equalityAnnotations) {\n res.meta = {\n ...res.meta,\n referentialEqualities: equalityAnnotations,\n };\n }\n if (res.meta)\n res.meta.v = 1;\n return res;\n }\n deserialize(payload, options) {\n const { json, meta } = payload;\n let result = options?.inPlace ? json : copy(json);\n if (meta?.values) {\n result = applyValueAnnotations(result, meta.values, meta.v ?? 0, this);\n }\n if (meta?.referentialEqualities) {\n result = applyReferentialEqualityAnnotations(result, meta.referentialEqualities, meta.v ?? 0);\n }\n return result;\n }\n stringify(object) {\n return JSON.stringify(this.serialize(object));\n }\n parse(string) {\n return this.deserialize(JSON.parse(string), { inPlace: true });\n }\n registerClass(v, options) {\n this.classRegistry.register(v, options);\n }\n registerSymbol(v, identifier) {\n this.symbolRegistry.register(v, identifier);\n }\n registerCustom(transformer, name) {\n this.customTransformerRegistry.register({\n name,\n ...transformer,\n });\n }\n allowErrorProps(...props) {\n this.allowedErrorProps.push(...props);\n }\n}\nSuperJSON.defaultInstance = new SuperJSON();\nSuperJSON.serialize = SuperJSON.defaultInstance.serialize.bind(SuperJSON.defaultInstance);\nSuperJSON.deserialize = SuperJSON.defaultInstance.deserialize.bind(SuperJSON.defaultInstance);\nSuperJSON.stringify = SuperJSON.defaultInstance.stringify.bind(SuperJSON.defaultInstance);\nSuperJSON.parse = SuperJSON.defaultInstance.parse.bind(SuperJSON.defaultInstance);\nSuperJSON.registerClass = SuperJSON.defaultInstance.registerClass.bind(SuperJSON.defaultInstance);\nSuperJSON.registerSymbol = SuperJSON.defaultInstance.registerSymbol.bind(SuperJSON.defaultInstance);\nSuperJSON.registerCustom = SuperJSON.defaultInstance.registerCustom.bind(SuperJSON.defaultInstance);\nSuperJSON.allowErrorProps = SuperJSON.defaultInstance.allowErrorProps.bind(SuperJSON.defaultInstance);\nexport default SuperJSON;\nexport { SuperJSON };\nexport const serialize = SuperJSON.serialize;\nexport const deserialize = SuperJSON.deserialize;\nexport const stringify = SuperJSON.stringify;\nexport const parse = SuperJSON.parse;\nexport const registerClass = SuperJSON.registerClass;\nexport const registerCustom = SuperJSON.registerCustom;\nexport const registerSymbol = SuperJSON.registerSymbol;\nexport const allowErrorProps = SuperJSON.allowErrorProps;\n//# sourceMappingURL=index.js.map","/**\n * System — single, unified entry point for the camstack client API.\n *\n * Devices are returned as typed `DeviceProxy` objects (auto-injecting\n * `deviceId` + `nodeId`), system caps are exposed as typed namespaces\n * (`system.userManagement`, `system.storage`, etc.), and live events\n * flow through a single `subscribeEvent` helper.\n *\n * The escape hatches (`trpcClient`, `wsClient`) are still public so the\n * ui-library Provider can seed React Query with the same WS connection\n * — a future phase will narrow the surface further.\n */\n\nimport {\n createTRPCClient,\n createWSClient,\n wsLink,\n httpLink,\n type TRPCClient,\n} from '@trpc/client'\nimport superjson from 'superjson'\nimport {\n SystemMirror,\n createSystemProxy,\n} from '@camstack/types'\nimport type {\n DeviceBinding,\n DeviceProxy,\n DeviceQueryFilters,\n DeviceLifecycleListener,\n SystemMirrorApi,\n SystemProxy,\n AddonApi,\n} from '@camstack/types'\nimport type { BackendAppRouter } from './backend-router.js'\nimport type { BackendConnectionState } from './types.js'\n\n// ─── Types ──────────────────────────────────────────────────────────\n\n/**\n * Canonical user-info shape returned by `getMe()`. Mirrors the server's\n * `auth.me` output — kept narrow so SDK consumers don't need the full\n * tRPC inference chain to type a login flow.\n */\nexport interface UserInfo {\n readonly id: string\n readonly username: string\n readonly role: string\n readonly permissions?: {\n readonly allowedAddons?: ReadonlyArray<string> | '*'\n readonly allowedDevices?: Readonly<Record<string, ReadonlyArray<string> | '*'>>\n }\n}\n\nexport interface SystemConfig {\n /** Backend server URL (e.g. \"http://localhost:4443\"). */\n readonly serverUrl: string\n /** JWT token for authentication. */\n readonly token?: string\n /** Use WebSocket transport (default: true in browser, false in Node). */\n readonly useWebSocket?: boolean\n /** Optional per-event connection-state callback. */\n readonly onConnectionChange?: (state: BackendConnectionState) => void\n /** Initial WS reconnect delay in ms (default 2000, capped via maxRetryDelayMs). */\n readonly retryDelayMs?: number\n /** Max WS reconnect delay in ms (default 30_000). */\n readonly maxRetryDelayMs?: number\n}\n\ntype ConnectionListener = (state: BackendConnectionState, version: number) => void\n\n// Dispatch shape for the live.onEvent subscription callback. The\n// underlying tRPC procedure pushes `{ id, timestamp, source, category,\n// data }` per event. Consumers usually only care about `data` typed\n// per-category; the SDK exposes the raw envelope so categories with\n// custom routing fields stay accessible.\nexport interface SystemLiveEvent<TData = unknown> {\n readonly id: string\n readonly timestamp: Date | string\n readonly source: { readonly type: string; readonly id: string | number }\n readonly category: string\n readonly data: TData\n}\n\nexport type SystemLiveEventListener<TData = unknown> = (event: SystemLiveEvent<TData>) => void\n\n// ─── Constants ──────────────────────────────────────────────────────\n\nconst WS_KEEP_ALIVE_INTERVAL_MS = 10_000\nconst WS_KEEP_ALIVE_PONG_TIMEOUT_MS = 3_000\nconst WS_RECONNECT_RETRY_DELAY_MS = 2_000\nconst WS_RECONNECT_MAX_RETRY_DELAY_MS = 30_000\n\n// ─── Class ──────────────────────────────────────────────────────────\n\ntype TrpcClient = TRPCClient<BackendAppRouter>\ntype TrpcWsClient = ReturnType<typeof createWSClient>\n\nexport class System {\n /** Active server base URL. Mutable via `switchServerUrl()` so the\n * endpoint-race helper can pivot the transport onto a LAN candidate\n * after the initial public-URL bootstrap. */\n private _serverUrl: string\n private readonly useWs: boolean\n private readonly baseRetryMs: number\n private readonly maxRetryMs: number\n private readonly onConnectionChange: ((state: BackendConnectionState) => void) | undefined\n\n private token: string | undefined\n private _trpcClient: TrpcClient\n private _wsClient: TrpcWsClient | null = null\n\n // Mirror — owns binding cache + state mirror + lifecycle listeners.\n // Lazily initialised on `init()`. Subsequent `reconnect()` disposes\n // the old mirror and rebuilds against the new tRPC client.\n private mirror: SystemMirror | null = null\n private mirrorInit: Promise<void> | null = null\n\n // Transport-readiness probe state. `connected` flips true the first\n // time `auth.me` succeeds against the current tRPC client; resets\n // on every `reconnect()` / `close()` so the next consumer waits for\n // a fresh handshake before issuing queries.\n private connected = false\n private connectedPromise: Promise<void> | null = null\n\n // System-cap namespaces — populated in the constructor from\n // `createSystemProxy(api)`. Each namespace is a `Pick<InferProvider<typeof cap>, …>`\n // shape generated by `scripts/generate-system-proxy.ts`.\n private _systemProxy: SystemProxy\n\n // Connection-version + listener bookkeeping for the admin UI's\n // reconnect watchdog.\n private _connectionVersion = 0\n private readonly connectionListeners = new Set<ConnectionListener>()\n\n constructor(config: SystemConfig) {\n this._serverUrl = config.serverUrl.replace(/\\/+$/, '')\n this.token = config.token\n\n const isBrowser = typeof window !== 'undefined'\n this.useWs = config.useWebSocket ?? isBrowser\n this.onConnectionChange = config.onConnectionChange\n this.baseRetryMs = config.retryDelayMs ?? WS_RECONNECT_RETRY_DELAY_MS\n this.maxRetryMs = config.maxRetryDelayMs ?? WS_RECONNECT_MAX_RETRY_DELAY_MS\n\n this._trpcClient = this.buildTrpcClient()\n this._systemProxy = createSystemProxy(this._trpcClient as unknown as AddonApi)\n }\n\n // ── Connection state ─────────────────────────────────────────────\n\n /** Active server base URL (no trailing slash). */\n get serverUrl(): string {\n return this._serverUrl\n }\n\n get connectionVersion(): number {\n return this._connectionVersion\n }\n\n /**\n * Subscribe to connection-state transitions. Called with `('connected'\n * | 'disconnected' | 'connecting', version)` whenever the SDK opens,\n * closes, or starts a manual reconnect. Listener errors are swallowed\n * so a misbehaving consumer cannot break the SDK's event loop.\n */\n subscribeConnectionEvents(cb: ConnectionListener): () => void {\n this.connectionListeners.add(cb)\n return () => {\n this.connectionListeners.delete(cb)\n }\n }\n\n private emitConnectionEvent(state: BackendConnectionState): void {\n try {\n this.onConnectionChange?.(state)\n } catch {\n /* swallow caller errors */\n }\n for (const l of this.connectionListeners) {\n try {\n l(state, this._connectionVersion)\n } catch {\n /* swallow listener errors */\n }\n }\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────\n\n /**\n * Wait until the underlying tRPC transport is connected AND the\n * server has responded to a cheap auth round-trip (`auth.me`). This\n * is the canonical \"ready to issue queries\" gate.\n *\n * Why a probe, not just `ws.readyState === OPEN`?\n * The WS handshake completes asynchronously: tRPC's `wsLink`\n * queues outgoing messages and only flushes them after `open()`\n * resolves (post `connectionParams` send). On the server, the\n * tRPC context is created lazily once the connectionParams\n * message is received. A query fired between WS-open and\n * connection-params-processed is technically queued by tRPC, but\n * the auth context for that query is only resolved once the\n * handshake message is decoded server-side. A probe round-trip is\n * the safest way to confirm both sides have agreed on the auth\n * identity before the React tree starts firing parallel queries\n * (which can otherwise land before any addon-side service\n * discovery has settled, returning empty results that get cached).\n *\n * Idempotent — concurrent callers await the same in-flight Promise.\n * Bounded by `timeoutMs` (default 15s) — beyond which a\n * `Error('System.awaitConnected: probe timed out after Xms')` is\n * thrown so the host can render a clear error state instead of\n * hanging on a bricked socket.\n */\n async awaitConnected(timeoutMs?: number): Promise<void> {\n if (this.connected) return\n if (this.connectedPromise) return this.connectedPromise\n const effectiveTimeoutMs = timeoutMs ?? 15_000\n this.connectedPromise = (async () => {\n const probe = this._trpcClient.auth.me.query()\n if (!Number.isFinite(effectiveTimeoutMs)) {\n await probe\n } else {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error(`System.awaitConnected: probe timed out after ${effectiveTimeoutMs}ms`)),\n effectiveTimeoutMs,\n )\n probe.then(\n () => { clearTimeout(timer); resolve() },\n (err: unknown) => { clearTimeout(timer); reject(err instanceof Error ? err : new Error(String(err))) },\n )\n })\n }\n this.connected = true\n })()\n try {\n await this.connectedPromise\n } finally {\n this.connectedPromise = null\n }\n }\n\n /**\n * Warm-boot the device mirror. Awaits the transport probe first\n * (`awaitConnected`) so the three mirror round-trips\n * (`getAllBindings` + `getAllSnapshots` + `listAll`) cannot race\n * against the WS auth handshake. Subsequent `getDevice(id)` calls\n * are sync; live `device.*` event subscriptions keep the caches\n * fresh.\n *\n * Idempotent — concurrent callers await the same in-flight Promise.\n */\n async init(timeoutMs?: number): Promise<void> {\n if (this.mirror?.isReady()) return\n if (this.mirrorInit) return this.mirrorInit\n const m = new SystemMirror(this._trpcClient as unknown as SystemMirrorApi)\n this.mirror = m\n this.mirrorInit = (async () => {\n await this.awaitConnected(timeoutMs)\n await m.init(timeoutMs)\n })().finally(() => {\n this.mirrorInit = null\n })\n return this.mirrorInit\n }\n\n /** Promise that resolves once `init()` has completed. */\n async awaitReady(): Promise<void> {\n if (this.mirror?.isReady()) return\n if (this.mirrorInit) return this.mirrorInit\n return this.init()\n }\n\n /** True after `init()` resolves. */\n isReady(): boolean {\n return this.mirror?.isReady() ?? false\n }\n\n /** True after the transport probe has succeeded at least once. */\n isConnected(): boolean {\n return this.connected\n }\n\n /**\n * Force a fresh WebSocket handshake. Tears down the wsClient + tRPC\n * client + mirror (the mirror captures the tRPC reference at\n * construction time and would otherwise dispatch through a closed\n * client) and rebuilds them. No-op for HTTP transport.\n */\n reconnect(): void {\n if (!this.useWs) return\n this.emitConnectionEvent('connecting')\n this._wsClient?.close()\n this.disposeMirror()\n this.connected = false\n this.connectedPromise = null\n this._trpcClient = this.buildTrpcClient()\n this._systemProxy = createSystemProxy(this._trpcClient as unknown as AddonApi)\n }\n\n /**\n * Pivot the underlying tRPC transport onto a different base URL.\n * Used by the endpoint-race flow: the SDK opens against the public\n * URL the operator provided, calls `localNetwork.getConnectionEndpoints`\n * to discover LAN candidates, races them, and (when a faster one wins)\n * calls `switchServerUrl(winner)` to migrate every subsequent query\n * onto the LAN path without losing auth state.\n *\n * Keeps the auth token. Tears down the WS + mirror and rebuilds them\n * against the new URL — same machinery as `reconnect()` but with a\n * different target.\n */\n switchServerUrl(nextUrl: string): void {\n const normalized = nextUrl.replace(/\\/+$/, '')\n if (normalized === this._serverUrl) return\n this._serverUrl = normalized\n this.reconnect()\n }\n\n /**\n * Race the candidate base URLs reported by the hub's `local-network`\n * cap, pick the fastest one that responds, and (if it's different\n * from the current URL) pivot the transport onto it.\n *\n * Flow:\n * 1. Query `localNetwork.getConnectionEndpoints({ port })` over the\n * already-authenticated tRPC channel — the cap is auth-gated,\n * so the LAN IPs never leak to anonymous callers.\n * 2. For each candidate, fire a HEAD on `{baseUrl}/trpc/health`\n * with a short timeout (default 1500ms). The first 2xx wins.\n * 3. If the winner differs from `this.serverUrl`, call\n * `switchServerUrl(winner)` and return it. Otherwise return\n * the current URL unchanged.\n *\n * Bounded — if every candidate times out we keep the current URL.\n * Idempotent — safe to call on every connect / reconnect / network\n * change event.\n */\n async raceConnectionEndpoints(options?: {\n /** Per-candidate probe timeout. Default 1500ms. */\n readonly perCandidateTimeoutMs?: number\n /** Skip IPv6 candidates. Default `false`. */\n readonly ipv4Only?: boolean\n }): Promise<{ winner: string; switched: boolean }> {\n const timeoutMs = options?.perCandidateTimeoutMs ?? 1500\n // Derive the port + scheme the SDK is currently using. Passing the\n // scheme to the cap means LAN URLs come back in the same scheme as\n // the page, sidestepping browser mixed-content blocks (HTTPS page\n // can't probe `http://` URLs).\n const url = (() => {\n try { return new URL(this._serverUrl) } catch { return null }\n })()\n const port = url?.port\n ? Number(url.port)\n : url?.protocol === 'https:' ? 443 : 80\n const scheme: 'http' | 'https' = url?.protocol === 'https:' ? 'https' : 'http'\n\n const proxy = this._trpcClient as unknown as {\n localNetwork?: { getConnectionEndpoints: { query: (input: { port: number; ipv4Only?: boolean; scheme?: 'http' | 'https' }) => Promise<{ endpoints: ReadonlyArray<{ baseUrl: string; priority: number; kind: string; label: string }> }> } }\n }\n const cap = proxy.localNetwork?.getConnectionEndpoints\n if (!cap) {\n return { winner: this._serverUrl, switched: false }\n }\n\n let endpoints: ReadonlyArray<{ baseUrl: string; priority: number; kind: string; label: string }> = []\n try {\n const res = await cap.query({ port, ipv4Only: options?.ipv4Only, scheme })\n endpoints = res.endpoints\n } catch {\n // Cap unavailable (older hub, network blip) — keep current URL.\n return { winner: this._serverUrl, switched: false }\n }\n\n if (endpoints.length === 0) {\n return { winner: this._serverUrl, switched: false }\n }\n\n const winner = await raceFastestEndpoint(endpoints.map((e) => e.baseUrl), timeoutMs)\n if (!winner || winner === this._serverUrl) {\n return { winner: winner ?? this._serverUrl, switched: false }\n }\n this.switchServerUrl(winner)\n return { winner, switched: true }\n }\n\n /** Tear down WS connection + mirror. The instance is unusable afterwards. */\n close(): void {\n this.disposeMirror()\n this.connected = false\n this.connectedPromise = null\n this._wsClient?.close()\n }\n\n private disposeMirror(): void {\n this.mirror?.dispose()\n this.mirror = null\n this.mirrorInit = null\n }\n\n // ── Auth ──────────────────────────────────────────────────────────\n\n async login(username: string, password: string): Promise<{ token: string }> {\n const result = await this._trpcClient.auth.login.mutate({ username, password })\n if (typeof result === 'object' && result !== null && 'token' in result) {\n const token = (result as { token?: unknown }).token\n if (typeof token === 'string') this.setToken(token)\n }\n return result as { token: string }\n }\n\n async logout(): Promise<void> {\n await this._trpcClient.auth.logout.mutate()\n }\n\n async getMe(): Promise<UserInfo> {\n const me = await this._trpcClient.auth.me.query()\n return me as UserInfo\n }\n\n /** Update the auth token (e.g. after login or token refresh). */\n setToken(token: string): void {\n this.token = token\n }\n\n // ── Devices ──────────────────────────────────────────────────────\n\n /**\n * Synchronous snapshot of every device matching the optional filters.\n * Backed by the `SystemMirror` warm-boot cache — call `init()` first\n * (or `awaitReady()`) before invoking. Returns an empty array if the\n * mirror has not yet been booted.\n *\n * Each returned proxy has `binding` populated from the mirror's\n * binding cache (Phase 5 dedup), so consumers no longer need to\n * make a separate `deviceManager.getBindings` round-trip.\n */\n listDevices(filters?: DeviceQueryFilters): readonly DeviceProxy[] {\n if (!this.mirror) return []\n const proxies = filters ? this.mirror.query(filters) : this.mirror.getAllDevices()\n return proxies.map((p) => this.attachBinding(p))\n }\n\n /**\n * Sync lookup by numeric id. `null` if the mirror has not been booted\n * or the device is unknown.\n */\n getDevice(deviceId: number): DeviceProxy | null {\n const proxy = this.mirror?.getDeviceById(deviceId) ?? null\n return proxy ? this.attachBinding(proxy) : null\n }\n\n /** Sync lookup by display name (exact match). */\n getDeviceByName(name: string): DeviceProxy | null {\n const proxy = this.mirror?.getDeviceByName(name) ?? null\n return proxy ? this.attachBinding(proxy) : null\n }\n\n /** Sync lookup by stableId. */\n getDeviceByStableId(stableId: string): DeviceProxy | null {\n const proxy = this.mirror?.getDeviceByStableId(stableId) ?? null\n return proxy ? this.attachBinding(proxy) : null\n }\n\n /**\n * Resolve when a device with `deviceId` becomes available. Resolves\n * immediately if already known; rejects with a timeout error\n * otherwise (default 30s).\n */\n async waitForDevice(deviceId: number, timeoutMs?: number): Promise<DeviceProxy> {\n if (!this.mirror) await this.init()\n const proxy = await this.mirror!.waitForDevice(deviceId, timeoutMs ?? 30_000)\n return this.attachBinding(proxy)\n }\n\n /** Subscribe to `device.registered` events. */\n onDeviceAdded(cb: DeviceLifecycleListener): () => void {\n if (!this.mirror) {\n // Mirror not ready yet — buffer the listener until init() runs.\n // The cleanest path is to require init() first; throw a clear\n // error so callers don't silently miss the first events.\n throw new Error('System.onDeviceAdded: call init() before subscribing')\n }\n return this.mirror.onDeviceAdded(cb)\n }\n\n /** Subscribe to `device.unregistered` events. */\n onDeviceRemoved(cb: DeviceLifecycleListener): () => void {\n if (!this.mirror) {\n throw new Error('System.onDeviceRemoved: call init() before subscribing')\n }\n return this.mirror.onDeviceRemoved(cb)\n }\n\n /**\n * Patch the proxy's `binding` field from the mirror's cache. The\n * generated `createDeviceProxy()` already sets `binding` to the\n * binding it was constructed with — this is a defensive overwrite\n * that uses the latest cached entry in case a `binding-changed`\n * event landed between proxy creation and access.\n */\n private attachBinding(proxy: DeviceProxy): DeviceProxy {\n const binding = this.lookupBinding(proxy.deviceId)\n if (binding === proxy.binding) return proxy\n const writable = proxy as { binding: DeviceBinding | null }\n writable.binding = binding\n return proxy\n }\n\n /** Fetch the latest cached binding from the mirror, or `null`. */\n private lookupBinding(deviceId: number): DeviceBinding | null {\n if (!this.mirror) return null\n // Mirror exposes bindings via the proxy itself — read it back\n // through `getDeviceById` so we don't have to widen the public\n // SystemMirror surface just for the cache lookup.\n const proxy = this.mirror.getDeviceById(deviceId)\n return proxy?.binding ?? null\n }\n\n // ── System caps ──────────────────────────────────────────────────\n //\n // One getter per `scope: 'system'` capability. The actual surface\n // comes from `createSystemProxy(api)` (codegen). Adding a new\n // system cap regenerates the proxy and the new namespace surfaces\n // automatically via `system.<newCap>.<method>(input)`.\n\n get addonPages(): SystemProxy['addonPages'] { return this._systemProxy.addonPages }\n get addonSettings(): SystemProxy['addonSettings'] { return this._systemProxy.addonSettings }\n get alerts(): SystemProxy['alerts'] { return this._systemProxy.alerts }\n get audioAnalyzer(): SystemProxy['audioAnalyzer'] { return this._systemProxy.audioAnalyzer }\n get audioCodec(): SystemProxy['audioCodec'] { return this._systemProxy.audioCodec }\n get backup(): SystemProxy['backup'] { return this._systemProxy.backup }\n get decoder(): SystemProxy['decoder'] { return this._systemProxy.decoder }\n get deviceManager(): SystemProxy['deviceManager'] { return this._systemProxy.deviceManager }\n get deviceProvider(): SystemProxy['deviceProvider'] { return this._systemProxy.deviceProvider }\n get deviceState(): SystemProxy['deviceState'] { return this._systemProxy.deviceState }\n get metricsProvider(): SystemProxy['metricsProvider'] { return this._systemProxy.metricsProvider }\n get notificationOutput(): SystemProxy['notificationOutput'] { return this._systemProxy.notificationOutput }\n get pipelineExecutor(): SystemProxy['pipelineExecutor'] { return this._systemProxy.pipelineExecutor }\n get pipelineOrchestrator(): SystemProxy['pipelineOrchestrator'] { return this._systemProxy.pipelineOrchestrator }\n get pipelineRunner(): SystemProxy['pipelineRunner'] { return this._systemProxy.pipelineRunner }\n get platformProbe(): SystemProxy['platformProbe'] { return this._systemProxy.platformProbe }\n get recordingEngine(): SystemProxy['recordingEngine'] { return this._systemProxy.recordingEngine }\n get settingsStore(): SystemProxy['settingsStore'] { return this._systemProxy.settingsStore }\n get storage(): SystemProxy['storage'] { return this._systemProxy.storage }\n get streamBroker(): SystemProxy['streamBroker'] { return this._systemProxy.streamBroker }\n get turnProvider(): SystemProxy['turnProvider'] { return this._systemProxy.turnProvider }\n get userManagement(): SystemProxy['userManagement'] { return this._systemProxy.userManagement }\n\n // ── Live events ──────────────────────────────────────────────────\n\n /**\n * Subscribe to a single event category. Returns an unsubscribe\n * handle. Errors thrown by the listener are swallowed so a single\n * misbehaving consumer cannot tear down the WS subscription.\n *\n * Categories should be values from the `EventCategory` enum\n * (`@camstack/types`) — passing a raw string works for forward-compat\n * but loses type safety. The SDK forwards the value verbatim to the\n * server's `live.onEvent` subscription.\n */\n subscribeEvent<TData = unknown>(\n category: string,\n cb: SystemLiveEventListener<TData>,\n ): () => void {\n const sub = this._trpcClient.live.onEvent.subscribe(\n { category },\n {\n onData: (event) => {\n try {\n cb(event as unknown as SystemLiveEvent<TData>)\n } catch {\n /* swallow listener errors */\n }\n },\n },\n )\n return () => {\n try {\n sub.unsubscribe()\n } catch {\n /* swallow — already unsubscribed */\n }\n }\n }\n\n // ── Escape hatches ───────────────────────────────────────────────\n //\n // Kept public so the ui-library `<TrpcProvider>` can seed React\n // Query with the same WebSocket connection during Phase 2. Phase 4\n // is expected to revisit whether either field can be hidden.\n\n /** Direct tRPC client. Read once per call; rebuilt on `reconnect()`. */\n get trpcClient(): TrpcClient {\n return this._trpcClient\n }\n\n /**\n * Underlying WSClient (or `null` for HTTP transport). Used by\n * advanced consumers that need direct access to the WebSocket\n * (e.g. for keep-alive metrics). Rebuilt on `reconnect()`.\n */\n get wsClient(): TrpcWsClient | null {\n return this._wsClient\n }\n\n // ── Internals ────────────────────────────────────────────────────\n\n private buildTrpcClient(): TrpcClient {\n const headers = (): Record<string, string> => {\n const h: Record<string, string> = {}\n if (this.token) h['Authorization'] = `Bearer ${this.token}`\n return h\n }\n\n if (this.useWs) {\n const wsUrl = this._serverUrl.replace(/^http/, 'ws') + '/trpc'\n const baseRetryMs = this.baseRetryMs\n const maxRetryMs = this.maxRetryMs\n this._wsClient = createWSClient({\n url: wsUrl,\n connectionParams: () => ({ token: this.token }),\n retryDelayMs: (attemptIndex: number) =>\n Math.min(baseRetryMs * Math.pow(2, attemptIndex), maxRetryMs),\n keepAlive: {\n enabled: true,\n intervalMs: WS_KEEP_ALIVE_INTERVAL_MS,\n pongTimeoutMs: WS_KEEP_ALIVE_PONG_TIMEOUT_MS,\n },\n onOpen: () => {\n this._connectionVersion += 1\n this.emitConnectionEvent('connected')\n },\n onClose: () => {\n this.emitConnectionEvent('disconnected')\n },\n })\n\n return createTRPCClient<BackendAppRouter>({\n links: [wsLink({ client: this._wsClient, transformer: superjson })],\n })\n }\n\n this._wsClient = null\n return createTRPCClient<BackendAppRouter>({\n links: [httpLink({ url: `${this._serverUrl}/trpc`, headers, transformer: superjson })],\n })\n }\n}\n\n/** Create a `System` instance. Convenience factory. */\nexport function createSystem(config: SystemConfig): System {\n return new System(config)\n}\n\n/**\n * Race a list of candidate base URLs and return the first one that\n * responds to `GET {baseUrl}/trpc/health` with a 2xx within\n * `timeoutMs`. Returns `null` if every candidate fails / times out.\n *\n * Implementation notes:\n * - Uses `fetch` with `AbortController` for per-candidate cutoff so a\n * stalled candidate doesn't pin the wallclock for the whole race.\n * - Cancels every still-pending probe as soon as the first one\n * succeeds — no wasted bandwidth on the loser candidates.\n * - `/trpc/health` is the only endpoint guaranteed to respond on every\n * CamStack deployment (registered alongside the tRPC plugin). It is\n * intentionally NOT auth-gated since it's used by load balancers /\n * uptime probes — same surface every reverse proxy already monitors.\n * - HEAD would be nicer but Cloudflare Tunnel + some browsers\n * mishandle HEAD on the ingress path; GET is safer.\n *\n * Exported so non-System callers (CLI helpers, tests) can race their\n * own candidate lists without instantiating a full System.\n */\nexport async function raceFastestEndpoint(\n candidates: ReadonlyArray<string>,\n timeoutMs: number,\n): Promise<string | null> {\n if (candidates.length === 0) return null\n if (typeof fetch !== 'function') return candidates[0] ?? null\n\n // Defense in depth: when running in a browser loaded over HTTPS, the\n // browser blocks every `http://` request as mixed content. Filter\n // those out before probing so we don't waste timeouts on candidates\n // that would have been rejected anyway. The cap is supposed to emit\n // matching-scheme URLs given `scheme: 'https'` — this guard catches\n // any leftover http candidates from older hubs / misconfigured\n // proxies.\n const pageIsHttps = typeof window !== 'undefined'\n && typeof window.location !== 'undefined'\n && window.location.protocol === 'https:'\n const reachable = pageIsHttps\n ? candidates.filter((u) => u.toLowerCase().startsWith('https://'))\n : candidates\n if (reachable.length === 0) return null\n\n const controllers = reachable.map(() => new AbortController())\n const probes = reachable.map(async (baseUrl, i) => {\n const ctrl = controllers[i]!\n const timer = setTimeout(() => ctrl.abort(), timeoutMs)\n try {\n const res = await fetch(`${baseUrl.replace(/\\/+$/, '')}/trpc/health`, {\n method: 'GET',\n signal: ctrl.signal,\n // Cross-origin probes from a browser sandbox are fine — the\n // /trpc/health response is open-CORS by the Fastify default.\n // No credentials needed (this is a transport-quality probe,\n // not an auth round-trip).\n credentials: 'omit',\n })\n if (!res.ok) throw new Error(`${res.status}`)\n return baseUrl\n } finally {\n clearTimeout(timer)\n }\n })\n\n // `Promise.any` returns the first fulfilled — exactly what we want.\n try {\n const winner = await Promise.any(probes)\n // Cancel every other in-flight probe.\n for (const c of controllers) {\n try { c.abort() } catch { /* already settled */ }\n }\n return winner\n } catch {\n return null\n }\n}\n","/**\n * Detection classes — shared between CamStack app and proxy.\n * Aligned with scrypted-advanced-notifier/src/detectionClasses.ts.\n */\n\n// ---------------------------------------------------------------------------\n// Enum — matches the plugin enum exactly\n// ---------------------------------------------------------------------------\n\nexport enum DetectionClass {\n Motion = \"motion\",\n Person = \"person\",\n Vehicle = \"vehicle\",\n Animal = \"animal\",\n Audio = \"audio\",\n Face = \"face\",\n Plate = \"plate\",\n Package = \"package\",\n Doorbell = \"doorbell\",\n Sensor = \"sensor\",\n}\n\n// ---------------------------------------------------------------------------\n// Sub-class arrays (for classname → parent mapping)\n// ---------------------------------------------------------------------------\n\nexport const animalClasses = [\n DetectionClass.Animal,\n \"dog_cat\", \"dog\", \"cat\", \"horse\", \"sheep\", \"cow\", \"elephant\", \"bear\",\n \"zebra\", \"giraffe\", \"mouse\", \"rabbit\", \"deer\", \"lion\", \"tiger\",\n \"bird\", \"eagle\", \"owl\", \"pigeon\",\n \"fish\", \"whale\", \"dolphin\",\n \"snake\", \"turtle\", \"lizard\",\n];\n\nexport const personClasses = [\n DetectionClass.Person,\n \"people\", \"pedestrian\", \"rider\", \"driver\", \"cyclist\", \"skier\", \"skateboarder\",\n \"face\", \"hand\", \"head\", \"body\",\n];\n\nexport const vehicleClasses = [\n DetectionClass.Vehicle,\n \"car\", \"truck\", \"bus\", \"motorcycle\", \"bicycle\", \"van\",\n \"ambulance\", \"police_car\", \"fire_truck\",\n \"train\", \"subway\", \"tram\",\n \"airplane\", \"boat\", \"ship\", \"helicopter\",\n];\n\nexport const faceClasses = [\n DetectionClass.Face,\n \"eyes\", \"nose\", \"mouth\", \"ears\", \"eyebrows\",\n \"left_eye\", \"right_eye\", \"pupil\", \"iris\", \"eyelid\", \"eye_corner\",\n \"upper_lip\", \"lower_lip\", \"teeth\",\n \"chin\", \"cheek\", \"forehead\", \"jaw\",\n \"glasses\", \"sunglasses\", \"facial_hair\", \"beard\", \"mustache\",\n \"facial_landmark\", \"facial_keypoint\",\n];\n\nexport const licensePlateClasses = [\n DetectionClass.Plate,\n \"license_plate\", \"front_plate\", \"rear_plate\", \"motorcycle_plate\",\n \"temporary_plate\", \"dealer_plate\", \"licensePlate\",\n \"plate_number\", \"plate_character\", \"plate_digit\", \"plate_letter\",\n \"plate_symbol\", \"plate_region\", \"plate_country_identifier\",\n \"plate_frame\", \"plate_bolt\", \"plate_sticker\", \"plate_validation_tag\",\n \"damaged_plate\", \"obscured_plate\", \"dirty_plate\",\n];\n\nexport const motionClasses = [DetectionClass.Motion, \"movement\", \"other\"];\n\nexport const packageClasses = [DetectionClass.Package, \"packet\"];\n\nexport const audioClasses: string[] = [DetectionClass.Audio];\n\n/** Common YAMNet audio labels (advanced-notifier). Parent: Audio. */\nexport const audioLabelClasses = [\n \"speech\", \"scream\", \"babbling\", \"yell\", \"bellow\", \"whoop\", \"whispering\", \"laughter\", \"snicker\",\n \"crying\", \"cry\", \"sigh\", \"singing\", \"choir\", \"chant\", \"mantra\", \"child_singing\", \"rapping\", \"humming\",\n \"groan\", \"grunt\", \"whistling\", \"breathing\", \"wheeze\", \"snoring\", \"gasp\", \"pant\", \"snort\", \"cough\",\n \"throat_clearing\", \"sneeze\", \"sniff\", \"cheering\", \"applause\", \"chatter\", \"crowd\", \"children_playing\",\n \"bark\", \"yip\", \"howl\", \"bow-wow\", \"growling\", \"whimper_dog\", \"purr\", \"meow\", \"hiss\", \"caterwaul\",\n \"pets\", \"livestock\", \"doorbell\", \"ding-dong\", \"door\", \"slam\", \"knock\", \"alarm\", \"telephone\",\n \"music\", \"dog\", \"dogs\",\n];\n\nexport const doorbellClasses = [DetectionClass.Doorbell, \"ring\"];\n\n/** Sensor types (advanced-notifier SupportedSensorType). Parent: Sensor. */\nexport const sensorLabelClasses = [\n \"lock\", \"binary\", \"flood\", \"entry\",\n \"door\", \"leak\", \"door_open\", \"flooded\", \"entry_open\",\n];\n\n// ---------------------------------------------------------------------------\n// Classname → parent DetectionClass map\n// ---------------------------------------------------------------------------\n\nexport const detectionClassesDefaultMap: Record<string, DetectionClass> = {\n ...animalClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Animal }), {}),\n ...personClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Person }), {}),\n ...vehicleClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Vehicle }), {}),\n ...motionClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Motion }), {}),\n ...packageClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Package }), {}),\n ...faceClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Face }), {}),\n ...licensePlateClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Plate }), {}),\n ...audioClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Audio }), {}),\n ...audioLabelClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Audio }), {}),\n ...doorbellClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Doorbell }), {}),\n ...sensorLabelClasses.reduce<Record<string, DetectionClass>>((tot, curr) => ({ ...tot, [curr]: DetectionClass.Sensor }), {}),\n};\n\n// ---------------------------------------------------------------------------\n// Classifier helpers\n// ---------------------------------------------------------------------------\n\nexport const isFaceClassname = (c: string) => faceClasses.includes(c);\nexport const isPlateClassname = (c: string) => licensePlateClasses.includes(c);\nexport const isAnimalClassname = (c: string) => animalClasses.includes(c);\nexport const isPersonClassname = (c: string) => personClasses.includes(c);\nexport const isVehicleClassname = (c: string) => vehicleClasses.includes(c);\nexport const isMotionClassname = (c: string) => motionClasses.includes(c);\nexport const isDoorbellClassname = (c: string) => doorbellClasses.includes(c);\nexport const isPackageClassname = (c: string) => packageClasses.includes(c);\nexport const isAudioClassname = (c: string) =>\n audioClasses.includes(c) || audioLabelClasses.includes(c);\nexport const isSensorLabelClassname = (c: string) => sensorLabelClasses.includes(c);\nexport const isLabelDetection = (c: string) => isFaceClassname(c) || isPlateClassname(c);\n\nexport const getParentClass = (className: string): DetectionClass | undefined =>\n detectionClassesDefaultMap[className];\n\nexport const getParentDetectionClass = (det: { label?: string; className: string }) => {\n const { className } = det;\n const baseMap: Record<string, DetectionClass> = {\n [DetectionClass.Face]: DetectionClass.Person,\n [DetectionClass.Plate]: DetectionClass.Vehicle,\n };\n const parentGroup = detectionClassesDefaultMap[className];\n if (parentGroup && parentGroup !== className) return parentGroup;\n return baseMap[className];\n};\n\n// ---------------------------------------------------------------------------\n// All detection classes (enum values) used in filter UI\n// ---------------------------------------------------------------------------\n\nexport const defaultDetectionClasses = Object.values(DetectionClass);\n\n/** Default enabled classes: all except Motion. */\nexport const DEFAULT_ENABLED_CLASSES = defaultDetectionClasses.filter(\n (c) => c !== DetectionClass.Motion,\n);\n\n// ---------------------------------------------------------------------------\n// Timeline event presets (by severity)\n// ---------------------------------------------------------------------------\n\nexport type TimelineEventPreset = \"all\" | \"important\" | \"critical\" | \"custom\";\n\n/** Classes for \"critical\" preset: security-relevant only (person, doorbell, package). */\nexport const TIMELINE_PRESET_CRITICAL: string[] = [\n DetectionClass.Person,\n DetectionClass.Doorbell,\n DetectionClass.Package,\n];\n\n/** Classes for \"important\" preset: critical + vehicle, animal, audio, face, plate. */\nexport const TIMELINE_PRESET_IMPORTANT: string[] = [\n ...TIMELINE_PRESET_CRITICAL,\n DetectionClass.Vehicle,\n DetectionClass.Animal,\n DetectionClass.Audio,\n DetectionClass.Face,\n DetectionClass.Plate,\n];\n\n/** Classes for \"all\" preset: same as DEFAULT_ENABLED_CLASSES. */\nexport const TIMELINE_PRESET_ALL: string[] = [...DEFAULT_ENABLED_CLASSES];\n\n/** Get enabled classes for a preset. For \"custom\", pass customClasses. */\nexport function getClassesForTimelinePreset(\n preset: TimelineEventPreset,\n customClasses?: string[]\n): string[] {\n switch (preset) {\n case \"critical\":\n return TIMELINE_PRESET_CRITICAL;\n case \"important\":\n return TIMELINE_PRESET_IMPORTANT;\n case \"all\":\n return TIMELINE_PRESET_ALL;\n case \"custom\":\n return customClasses?.length ? customClasses : DEFAULT_ENABLED_CLASSES;\n default:\n return DEFAULT_ENABLED_CLASSES;\n }\n}\n","/**\n * Device types, mappings, and filtering constants — shared between CamStack app and proxy.\n *\n * Covers:\n * - Canonical device type normalization (Scrypted PascalCase + HA domains → canonical)\n * - Eligible device type lists for Scrypted and Home Assistant\n * - Unified Device / DeviceCommand / CommandResult interfaces\n * - AssociatedDeviceState shape\n */\n\n// ---------------------------------------------------------------------------\n// Canonical device type\n// ---------------------------------------------------------------------------\n\nexport type CanonicalDeviceType =\n | \"light\"\n | \"switch\"\n | \"cover\"\n | \"lock\"\n | \"alarm\"\n | \"button\"\n | \"select\"\n | \"siren\"\n | \"sensor\"\n | \"entry\"\n | \"media_player\"\n | \"script\";\n\n// ---------------------------------------------------------------------------\n// Raw type → canonical mapping (Scrypted + Home Assistant)\n// ---------------------------------------------------------------------------\n\n/**\n * Maps raw device types from Scrypted (PascalCase) and Home Assistant (lowercase domains)\n * to canonical CamStack device types.\n */\nexport const RAW_TO_CANONICAL: Record<string, CanonicalDeviceType> = {\n // Scrypted PascalCase\n Light: \"light\",\n Switch: \"switch\",\n WindowCovering: \"cover\",\n Lock: \"lock\",\n SecuritySystem: \"alarm\",\n Buttons: \"button\",\n Select: \"select\",\n Siren: \"siren\",\n Sensor: \"sensor\",\n Entry: \"entry\",\n Program: \"script\",\n MediaPlayer: \"media_player\",\n Outlet: \"switch\",\n // Home Assistant lowercase domains\n light: \"light\",\n switch: \"switch\",\n input_boolean: \"switch\",\n cover: \"cover\",\n lock: \"lock\",\n alarm_control_panel: \"alarm\",\n input_button: \"button\",\n button: \"button\",\n input_select: \"select\",\n select: \"select\",\n siren: \"siren\",\n sensor: \"sensor\",\n media_player: \"media_player\",\n script: \"script\",\n};\n\n/**\n * Extended HA domain → type map (includes non-eligible domains for display/categorization).\n * Superset of RAW_TO_CANONICAL for HA-specific domains.\n */\nexport const HA_DOMAIN_TYPE_MAP: Record<string, string> = {\n light: \"light\",\n switch: \"switch\",\n input_boolean: \"switch\",\n cover: \"cover\",\n lock: \"lock\",\n alarm_control_panel: \"alarm\",\n input_button: \"button\",\n button: \"button\",\n input_select: \"select\",\n select: \"select\",\n siren: \"siren\",\n sensor: \"sensor\",\n binary_sensor: \"sensor\",\n media_player: \"media_player\",\n script: \"script\",\n climate: \"climate\",\n camera: \"camera\",\n fan: \"fan\",\n vacuum: \"vacuum\",\n automation: \"automation\",\n scene: \"scene\",\n input_number: \"sensor\",\n person: \"person\",\n device_tracker: \"tracker\",\n weather: \"weather\",\n water_heater: \"climate\",\n};\n\n/**\n * Extended Scrypted type → canonical map (includes non-eligible types for display).\n * Superset of RAW_TO_CANONICAL for Scrypted-specific types.\n */\nexport const SCRYPTED_TYPE_TO_CANONICAL: Record<string, string> = {\n Light: \"light\",\n Switch: \"switch\",\n WindowCovering: \"cover\",\n Lock: \"lock\",\n SecuritySystem: \"alarm\",\n Buttons: \"button\",\n Select: \"select\",\n Siren: \"siren\",\n Sensor: \"sensor\",\n Entry: \"entry\",\n Program: \"script\",\n MediaPlayer: \"media_player\",\n Camera: \"camera\",\n Doorbell: \"doorbell\",\n Fan: \"fan\",\n Outlet: \"switch\",\n};\n\n/** Normalize raw type (Scrypted or HA) to canonical key for filtering and display. */\nexport function getCanonicalDeviceType(rawType: string): CanonicalDeviceType | null {\n const canonical = RAW_TO_CANONICAL[rawType];\n if (canonical) return canonical;\n const lower = rawType.toLowerCase();\n return RAW_TO_CANONICAL[lower] ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Eligible device types (filter lists)\n// ---------------------------------------------------------------------------\n\n/** Scrypted device types eligible for device control in CamStack. PascalCase. */\nexport const ELIGIBLE_SCRYPTED_DEVICE_TYPES = [\n \"Entry\",\n \"Light\",\n \"Switch\",\n \"Lock\",\n \"SecuritySystem\",\n \"Buttons\",\n \"WindowCovering\",\n \"Siren\",\n \"Sensor\",\n \"Select\",\n \"Program\",\n] as const;\n\n/** Set version for O(1) lookup. */\nexport const ELIGIBLE_SCRYPTED_DEVICE_TYPES_SET = new Set<string>(ELIGIBLE_SCRYPTED_DEVICE_TYPES);\n\n/** Home Assistant domains eligible for device control in CamStack. */\nexport const ELIGIBLE_HA_DOMAINS = [\n \"light\",\n \"switch\",\n \"input_boolean\",\n \"cover\",\n \"lock\",\n \"alarm_control_panel\",\n \"input_button\",\n \"button\",\n \"input_select\",\n \"select\",\n \"siren\",\n \"media_player\",\n \"script\",\n] as const;\n\n/** Set version for O(1) lookup. */\nexport const ELIGIBLE_HA_DOMAINS_SET = new Set<string>(ELIGIBLE_HA_DOMAINS);\n\n// ---------------------------------------------------------------------------\n// Device command action type\n// ---------------------------------------------------------------------------\n\n/** All device command actions supported by CamStack. */\nexport type DeviceCommandAction =\n | \"turnOn\"\n | \"turnOff\"\n | \"openEntry\"\n | \"closeEntry\"\n | \"stopEntry\"\n | \"lock\"\n | \"unlock\"\n | \"disarm\"\n | \"arm\"\n | \"pressButton\"\n | \"selectOption\"\n | \"volumeUp\"\n | \"volumeDown\"\n | \"volumeMute\";\n\n// ---------------------------------------------------------------------------\n// Associated device state (unified shape)\n// ---------------------------------------------------------------------------\n\n/**\n * State snapshot shape for an associated device.\n * Used by both app (AssociatedDeviceStateSnapshot) and proxy (Device.state).\n */\nexport interface AssociatedDeviceState {\n name?: string;\n type?: string;\n interfaces?: string[];\n on?: boolean;\n hasBrightnessControl?: boolean;\n brightness?: number;\n lockState?: string;\n securitySystemState?: { mode?: string; supportedModes?: string[] };\n buttons?: string[];\n entryOpen?: boolean | \"jammed\";\n value?: string;\n options?: string[];\n volumeLevel?: number;\n isVolumeMuted?: boolean;\n coverSupportsStop?: boolean;\n coverPosition?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Device interfaces (from proxy integrations/types.ts)\n// ---------------------------------------------------------------------------\n\n/** A device from an automation system (Scrypted, Home Assistant, etc.). */\nexport interface Device {\n id: string;\n name: string;\n /**\n * Canonical device type (lowercase): \"light\", \"switch\", \"cover\", \"lock\",\n * \"alarm\", \"button\", \"select\", \"siren\", \"sensor\", \"entry\", \"media_player\",\n * \"script\", \"camera\", \"nvr\".\n */\n type: string;\n /** Original type from the source system (e.g. Scrypted \"WindowCovering\", HA domain \"cover\"). */\n rawType?: string;\n /** Provider that owns this device. */\n providerId?: string;\n model?: string;\n manufacturer?: string;\n firmware?: string;\n online: boolean;\n interfaces: string[];\n /** Current state (key-value pairs, device-type-dependent). See AssociatedDeviceState. */\n state: Record<string, unknown>;\n /** Available actions for this device (defined by the provider). */\n actions?: DeviceAction[];\n /** Child devices (e.g. NVR → camera channels). */\n children?: Device[];\n}\n\n/** A command to send to a device. */\nexport interface DeviceCommand {\n deviceId: string;\n command: string;\n params?: Record<string, unknown>;\n}\n\n/** Result of a command execution. */\nexport interface CommandResult {\n success: boolean;\n error?: string;\n state?: Record<string, unknown>;\n}\n\n/** Device source type (integration that provides the device). */\nexport type AssociatedDeviceSource = \"scrypted\" | \"ha\";\n\n/** Eligible device summary (for device picker UI). */\nexport interface EligibleDevice {\n id: string;\n name: string;\n type: string;\n source: AssociatedDeviceSource;\n}\n\n// ─── Device Actions (provider-defined) ──────────────────────────\n\n/**\n * An action that can be performed on a device.\n * Actions are declared by the provider and rendered dynamically in the UI.\n */\nexport interface DeviceAction {\n /** Unique action ID (e.g. \"toggle\", \"setBrightness\", \"ptzMove\", \"reboot\"). */\n id: string;\n /** Display label (e.g. \"Toggle\", \"Set Brightness\", \"Move Camera\"). */\n label: string;\n /** Action category for UI grouping. */\n category?: \"power\" | \"control\" | \"ptz\" | \"media\" | \"system\" | \"custom\";\n /** Icon hint (lucide icon name or emoji). */\n icon?: string;\n /** Parameters this action accepts. */\n params?: DeviceActionParam[];\n /** Whether this action is destructive (shown with warning). */\n destructive?: boolean;\n}\n\n/** A parameter for a device action. */\nexport interface DeviceActionParam {\n /** Parameter key. */\n key: string;\n /** Display label. */\n label: string;\n /** Type for UI rendering. */\n type: \"boolean\" | \"number\" | \"string\" | \"select\" | \"slider\";\n /** Default value. */\n default?: unknown;\n /** For select type: available options. */\n options?: { value: string; label: string }[];\n /** For slider/number: min/max/step. */\n min?: number;\n max?: number;\n step?: number;\n}\n","/**\n * Feature capability matrix — shared between CamStack app and proxy.\n *\n * Maps each app feature to:\n * - Which source types (Frigate, Scrypted, RTSP) support it\n * - Which platforms (iOS, Android, Web, Scrypted embed) it works on\n * - Whether the camstack-server backend is required\n * - The ICameraSource method that enables the feature\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type FeatureId =\n | \"liveStream\"\n | \"multiResolution\"\n | \"motion\"\n | \"objectDetection\"\n | \"audioVolume\"\n | \"audioVolumes\"\n | \"ptz\"\n | \"intercom\"\n | \"deviceStatus\"\n | \"timeline\"\n | \"clusteredTimeline\"\n | \"detectionClasses\"\n | \"videoClips\"\n | \"nvrPlayback\"\n | \"nvrScrub\"\n | \"recordingThumbnail\"\n | \"nvrSeekToLive\";\n\nexport type PlatformId = \"ios\" | \"android\" | \"web\" | \"scryptedEmbed\";\n\nexport type SourceType = \"frigate\" | \"scrypted\" | \"rtsp\";\n\nexport interface FeatureEntry {\n id: FeatureId;\n label: string;\n /** Which source types support this feature. */\n sources: Partial<Record<SourceType, boolean>>;\n /** Platform availability overrides. When omitted, all platforms are supported. */\n platforms?: Partial<Record<PlatformId, boolean>>;\n /** True when this feature needs the camstack-server backend. */\n requiresBackend?: boolean;\n /** The ICameraSource method name that enables this feature at runtime. */\n adapterMethod?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Matrix\n// ---------------------------------------------------------------------------\n\nexport const FEATURE_MATRIX: FeatureEntry[] = [\n {\n id: \"liveStream\",\n label: \"Live Stream\",\n sources: { frigate: true, scrypted: true, rtsp: true },\n adapterMethod: \"getLiveStream\",\n },\n {\n id: \"multiResolution\",\n label: \"Multi-Resolution\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getResolutions\",\n },\n {\n id: \"motion\",\n label: \"Motion Detection\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getMotion\",\n },\n {\n id: \"objectDetection\",\n label: \"Object Detection\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getObjectDetections\",\n },\n {\n id: \"audioVolume\",\n label: \"Audio Level\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getAudioVolume\",\n },\n {\n id: \"audioVolumes\",\n label: \"Audio Volumes (dBFS)\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getAudioVolumes\",\n },\n {\n id: \"ptz\",\n label: \"PTZ Control\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getPTZ\",\n },\n {\n id: \"intercom\",\n label: \"Intercom (Mic)\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getIntercomSupport\",\n },\n {\n id: \"deviceStatus\",\n label: \"Device Status\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"getStatus\",\n },\n {\n id: \"timeline\",\n label: \"Detection Timeline\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getCameraDayData\",\n },\n {\n id: \"clusteredTimeline\",\n label: \"Clustered Timeline\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n requiresBackend: true,\n adapterMethod: \"getClusteredDayData\",\n },\n {\n id: \"detectionClasses\",\n label: \"Detection Classes\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getDetectionClasses\",\n },\n {\n id: \"videoClips\",\n label: \"Video Clips\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getVideoClips\",\n },\n {\n id: \"nvrPlayback\",\n label: \"NVR Playback\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getNvrPlaybackSupported\",\n },\n {\n id: \"nvrScrub\",\n label: \"NVR Scrub/Seek\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"seekRecordingStream\",\n },\n {\n id: \"recordingThumbnail\",\n label: \"Recording Thumbnails\",\n sources: { frigate: true, scrypted: true, rtsp: false },\n adapterMethod: \"getRecordingStreamThumbnail\",\n },\n {\n id: \"nvrSeekToLive\",\n label: \"Seek to Live\",\n sources: { frigate: false, scrypted: true, rtsp: false },\n adapterMethod: \"seekNvrToLive\",\n },\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Check if a feature is available for a given source type and platform. */\nexport function isFeatureAvailable(\n featureId: FeatureId,\n source: SourceType,\n platform: PlatformId,\n): boolean {\n const entry = FEATURE_MATRIX.find((f) => f.id === featureId);\n if (!entry) return false;\n if (!entry.sources[source]) return false;\n if (entry.platforms && entry.platforms[platform] === false) return false;\n return true;\n}\n\n/** Get all features supported by a source type. */\nexport function getSourceFeatures(source: SourceType): FeatureEntry[] {\n return FEATURE_MATRIX.filter((f) => f.sources[source]);\n}\n\n/** Get all features that require the backend proxy. */\nexport function getBackendRequiredFeatures(): FeatureEntry[] {\n return FEATURE_MATRIX.filter((f) => f.requiresBackend);\n}\n","/**\n * Adaptive Stream Session — negotiates optimal stream quality with the proxy.\n *\n * The client reports viewport size and network conditions periodically.\n * The proxy selects the best stream from the provider's available streams\n * and instructs the client to switch via go2rtc stream renegotiation.\n *\n * Flow:\n * 1. Client opens session → sends initial constraints (viewport, network)\n * 2. Server evaluates available streams → picks optimal → responds with stream assignment\n * 3. Client connects to assigned go2rtc stream via WebRTC WHEP\n * 4. Periodically, client reports updated stats → server may switch stream\n * 5. On switch: client tears down old PC, creates new PC to new go2rtc stream\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Client-reported constraints for stream selection. */\nexport interface StreamConstraints {\n /** Viewport width in CSS pixels. */\n viewportWidth: number;\n /** Viewport height in CSS pixels. */\n viewportHeight: number;\n /** Device pixel ratio (retina = 2+). */\n pixelRatio?: number;\n /** Estimated downlink bandwidth in Mbps (from navigator.connection or WebRTC stats). */\n bandwidthMbps?: number;\n /** Round-trip time in ms (from WebRTC stats). */\n rttMs?: number;\n /** Packet loss ratio 0-1 (from WebRTC stats). */\n packetLoss?: number;\n /** Whether the client is on a cellular network. */\n isCellular?: boolean;\n /** Whether the client prefers low latency over quality. */\n preferLowLatency?: boolean;\n /** Maximum resolution the client wants (e.g., from a user setting). */\n maxResolution?: \"auto\" | \"high\" | \"medium\" | \"low\";\n}\n\n/** Server-assigned stream for the client. */\nexport interface StreamAssignment {\n /** go2rtc stream name to connect to. */\n streamName: string;\n /** Stream profile (main/sub/ext). */\n profile: string;\n /** Transport type (native/rtsp/rtmp). */\n transport: string;\n /** Human-readable label. */\n label: string;\n /** Stream metadata (if known). */\n metadata?: {\n width?: number;\n height?: number;\n fps?: number;\n bitrate?: number;\n codec?: string;\n };\n /** Reason for this selection. */\n reason: string;\n}\n\n/** Stream selection request from client → server. */\nexport interface StreamSelectionRequest {\n providerId: string;\n camera: string;\n constraints: StreamConstraints;\n /** Current stream (for comparison — only switch if significantly better). */\n currentStreamName?: string;\n}\n\n/** Stream selection response from server → client. */\nexport interface StreamSelectionResponse {\n assignment: StreamAssignment;\n /** Available alternatives the client can manually pick. */\n alternatives: StreamAssignment[];\n /** Seconds until next automatic re-evaluation. */\n nextEvalSeconds: number;\n}\n\n// ---------------------------------------------------------------------------\n// Stream selection algorithm (can run on server or client)\n// ---------------------------------------------------------------------------\n\n/**\n * Select the optimal stream from available options based on client constraints.\n * This is a pure function — no side effects.\n */\nexport function selectOptimalStream(\n streams: Array<{\n streamName: string;\n profile: string;\n transport: string;\n label: string;\n metadata?: { width?: number; height?: number; fps?: number; bitrate?: number; codec?: string };\n }>,\n constraints: StreamConstraints,\n defaultTransport?: string,\n): StreamAssignment | null {\n if (streams.length === 0) return null;\n\n const viewportPixels = constraints.viewportWidth * constraints.viewportHeight * (constraints.pixelRatio ?? 1);\n const bw = constraints.bandwidthMbps ?? 100; // Assume good bandwidth if unknown\n const loss = constraints.packetLoss ?? 0;\n const rtt = constraints.rttMs ?? 50;\n\n // Determine target quality tier\n let targetTier: \"high\" | \"medium\" | \"low\" = \"high\";\n\n if (constraints.maxResolution === \"low\" || constraints.isCellular || bw < 1 || loss > 0.05) {\n targetTier = \"low\";\n } else if (constraints.maxResolution === \"medium\" || bw < 5 || viewportPixels < 500_000 || rtt > 200) {\n targetTier = \"medium\";\n } else if (constraints.maxResolution === \"high\" || viewportPixels > 2_000_000) {\n targetTier = \"high\";\n }\n\n // Map profile to tier\n const PROFILE_TIER: Record<string, \"high\" | \"medium\" | \"low\"> = {\n main: \"high\",\n sub: \"medium\",\n ext: \"low\",\n };\n\n // Prefer the default transport, fallback to any\n const preferTransport = defaultTransport ?? \"native\";\n\n // Score each stream\n const scored = streams.map((s) => {\n let score = 0;\n const streamTier = PROFILE_TIER[s.profile] ?? \"medium\";\n\n // Profile match: exact tier match is best\n if (streamTier === targetTier) score += 100;\n else if (\n (targetTier === \"high\" && streamTier === \"medium\") ||\n (targetTier === \"medium\" && streamTier === \"high\") ||\n (targetTier === \"medium\" && streamTier === \"low\") ||\n (targetTier === \"low\" && streamTier === \"medium\")\n ) score += 50; // Adjacent tier\n // else: 0 (far tier)\n\n // Transport preference\n if (s.transport === preferTransport) score += 30;\n else if (s.transport === \"native\") score += 20; // Native always good\n else if (s.transport === \"rtsp\") score += 15;\n else if (s.transport === \"rtmp\") score += 10;\n\n // Resolution match (if metadata available)\n if (s.metadata?.width && s.metadata?.height) {\n const streamPixels = s.metadata.width * s.metadata.height;\n const ratio = streamPixels / Math.max(viewportPixels, 1);\n // Ideal: stream slightly larger than viewport (1.0-1.5x)\n if (ratio >= 0.8 && ratio <= 2.0) score += 25;\n else if (ratio >= 0.5 && ratio <= 3.0) score += 15;\n // Penalize very oversized streams on low bandwidth\n if (ratio > 4 && bw < 10) score -= 20;\n }\n\n // Codec preference: H.264 better for compatibility, H.265 better for bandwidth\n if (s.metadata?.codec) {\n if (bw < 5 && s.metadata.codec.includes(\"265\")) score += 10; // H.265 saves bandwidth\n if (bw >= 10 && s.metadata.codec.includes(\"264\")) score += 5; // H.264 more compatible\n }\n\n return { ...s, score, targetTier };\n });\n\n // Sort by score descending\n scored.sort((a, b) => b.score - a.score);\n const best = scored[0]!;\n\n return {\n streamName: best.streamName,\n profile: best.profile,\n transport: best.transport,\n label: best.label,\n metadata: best.metadata,\n reason: `${best.targetTier} quality → ${best.profile}/${best.transport} (score: ${best.score})`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Re-evaluation interval logic\n// ---------------------------------------------------------------------------\n\n/** Determine seconds until next re-evaluation based on stability. */\nexport function getNextEvalInterval(\n constraints: StreamConstraints,\n wasSwitch: boolean,\n): number {\n if (wasSwitch) return 10; // Re-check soon after a switch\n if (constraints.isCellular) return 15; // Cellular: check frequently\n if ((constraints.packetLoss ?? 0) > 0.02) return 15; // Lossy: check frequently\n return 30; // Stable: check every 30s\n}\n"],"names":["getType","isPlainObject","isArray","walker","path","transformed","result","superjson","DetectionClass"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]}
|