{"version":3,"file":"video-encoder-host.mjs","names":[],"sources":["../../src/hosts/video-encoder-host.ts"],"sourcesContent":["/* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD */\n/* SPDX-License-Identifier: Apache-2.0 */\n\n/**\n * In-memory BrookesiaHost for video encoder — Node/vitest only, not used on device.\n * Import: `@brookesia/service/hosts/video-encoder`\n */\n\nimport type { BrookesiaHost } from '../common/brookesia-host.ts';\nimport { serializeRpcError, serializeRpcResult } from '../common/rpc-json.ts';\nimport {\n  VIDEO_ENCODER_DEFAULT_SERVICE_NAME,\n  VIDEO_ENCODER_FUNCTIONS,\n} from '../video/encoder/encoder-client.ts';\nimport type { VideoEncoderConfig, VideoEncoderState } from '../video/encoder/encoder-types.ts';\n\ntype VideoEncoderMockState = {\n  state: VideoEncoderState;\n  config: VideoEncoderConfig | null;\n  lastFetchSinkIndex: number | null;\n};\n\nexport type VideoEncoderHostOptions = {\n  serviceName?: string;\n};\n\nlet nextHandle = 1;\nconst handles = new Map<number, VideoEncoderMockState>();\n\nfunction defaultState(): VideoEncoderMockState {\n  return {\n    state: 'Closed',\n    config: null,\n    lastFetchSinkIndex: null,\n  };\n}\n\nfunction getState(handle: number): VideoEncoderMockState {\n  const state = handles.get(handle);\n  if (!state) {\n    throw new Error(`Video encoder memory host: invalid handle ${handle}`);\n  }\n  return state;\n}\n\nexport function createVideoEncoderHost(options?: VideoEncoderHostOptions): BrookesiaHost {\n  const serviceName = options?.serviceName ?? VIDEO_ENCODER_DEFAULT_SERVICE_NAME;\n\n  return {\n    service_available(name: string): boolean {\n      return name === serviceName;\n    },\n\n    start_service(name: string): number {\n      if (name !== serviceName) {\n        throw new Error(`Video encoder memory host: unknown service ${name}`);\n      }\n      const handle = nextHandle++;\n      handles.set(handle, defaultState());\n      return handle;\n    },\n\n    stop_service(handle: number): void {\n      handles.delete(handle);\n    },\n\n    call_function(handle: number, functionName: string, paramsJson: string): string {\n      const state = getState(handle);\n      const params = JSON.parse(paramsJson) as Record<string, unknown>;\n\n      try {\n        if (functionName === VIDEO_ENCODER_FUNCTIONS.Open) {\n          state.config = params.Config as VideoEncoderConfig;\n          state.state = 'Open';\n          return serializeRpcResult();\n        }\n\n        if (functionName === VIDEO_ENCODER_FUNCTIONS.Close) {\n          Object.assign(state, defaultState());\n          return serializeRpcResult();\n        }\n\n        if (functionName === VIDEO_ENCODER_FUNCTIONS.Start) {\n          if (state.state === 'Open' || state.state === 'Stopped') {\n            state.state = 'Started';\n          }\n          return serializeRpcResult();\n        }\n\n        if (functionName === VIDEO_ENCODER_FUNCTIONS.Stop) {\n          if (state.state === 'Started') {\n            state.state = 'Stopped';\n          }\n          return serializeRpcResult();\n        }\n\n        if (functionName === VIDEO_ENCODER_FUNCTIONS.FetchFrame) {\n          state.lastFetchSinkIndex = Number(params.SinkIndex ?? 0);\n          return serializeRpcResult();\n        }\n\n        return serializeRpcError(`unknown function ${functionName}`);\n      } catch (err) {\n        const message = err instanceof Error ? err.message : String(err);\n        return serializeRpcError(message);\n      }\n    },\n  };\n}\n\nexport function resetVideoEncoderHostState(): void {\n  handles.clear();\n  nextHandle = 1;\n}\n"],"mappings":";;;AA0BA,IAAI,aAAa;AACjB,MAAM,0BAAU,IAAI,IAAmC;AAEvD,SAAS,eAAsC;CAC7C,OAAO;EACL,OAAO;EACP,QAAQ;EACR,oBAAoB;CACtB;AACF;AAEA,SAAS,SAAS,QAAuC;CACvD,MAAM,QAAQ,QAAQ,IAAI,MAAM;CAChC,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,6CAA6C,QAAQ;CAEvE,OAAO;AACT;AAEA,SAAgB,uBAAuB,SAAkD;CACvF,MAAM,cAAc,SAAS,eAAA;CAE7B,OAAO;EACL,kBAAkB,MAAuB;GACvC,OAAO,SAAS;EAClB;EAEA,cAAc,MAAsB;GAClC,IAAI,SAAS,aACX,MAAM,IAAI,MAAM,8CAA8C,MAAM;GAEtE,MAAM,SAAS;GACf,QAAQ,IAAI,QAAQ,aAAa,CAAC;GAClC,OAAO;EACT;EAEA,aAAa,QAAsB;GACjC,QAAQ,OAAO,MAAM;EACvB;EAEA,cAAc,QAAgB,cAAsB,YAA4B;GAC9E,MAAM,QAAQ,SAAS,MAAM;GAC7B,MAAM,SAAS,KAAK,MAAM,UAAU;GAEpC,IAAI;IACF,IAAI,iBAAiB,wBAAwB,MAAM;KACjD,MAAM,SAAS,OAAO;KACtB,MAAM,QAAQ;KACd,OAAO,mBAAmB;IAC5B;IAEA,IAAI,iBAAiB,wBAAwB,OAAO;KAClD,OAAO,OAAO,OAAO,aAAa,CAAC;KACnC,OAAO,mBAAmB;IAC5B;IAEA,IAAI,iBAAiB,wBAAwB,OAAO;KAClD,IAAI,MAAM,UAAU,UAAU,MAAM,UAAU,WAC5C,MAAM,QAAQ;KAEhB,OAAO,mBAAmB;IAC5B;IAEA,IAAI,iBAAiB,wBAAwB,MAAM;KACjD,IAAI,MAAM,UAAU,WAClB,MAAM,QAAQ;KAEhB,OAAO,mBAAmB;IAC5B;IAEA,IAAI,iBAAiB,wBAAwB,YAAY;KACvD,MAAM,qBAAqB,OAAO,OAAO,aAAa,CAAC;KACvD,OAAO,mBAAmB;IAC5B;IAEA,OAAO,kBAAkB,oBAAoB,cAAc;GAC7D,SAAS,KAAK;IAEZ,OAAO,kBADS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAC/B;GAClC;EACF;CACF;AACF;AAEA,SAAgB,6BAAmC;CACjD,QAAQ,MAAM;CACd,aAAa;AACf"}