{"version":3,"file":"custom-host.mjs","names":[],"sources":["../../src/hosts/custom-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 CustomService — Node/vitest only.\n * Import: `@brookesia/service/hosts/custom`\n */\n\nimport type { BrookesiaHost } from '../common/brookesia-host.ts';\nimport { serializeRpcError, serializeRpcResult } from '../common/rpc-json.ts';\nimport { CUSTOM_SERVICE_NAME } from '../custom/custom-client.ts';\n\ntype CustomHandler = (params: Record<string, unknown>) => unknown;\n\ntype CustomMockState = {\n  handlers: Map<string, CustomHandler>;\n};\n\nlet nextHandle = 1;\nconst handles = new Map<number, CustomMockState>();\n\nfunction defaultHandlers(): Map<string, CustomHandler> {\n  return new Map<string, CustomHandler>([\n    ['func_no_params', () => 'ok'],\n    ['func_multi', (params) => `${params.s}:${params.n}:${params.b}`],\n    ['add', (params) => Number(params.a) + Number(params.b)],\n    ['echo', (params) => params.message],\n  ]);\n}\n\nexport function resetCustomHostState(): void {\n  handles.clear();\n  nextHandle = 1;\n}\n\nexport function createCustomHost(): BrookesiaHost {\n  return {\n    service_available(name: string): boolean {\n      return name === CUSTOM_SERVICE_NAME;\n    },\n\n    start_service(name: string): number {\n      if (name !== CUSTOM_SERVICE_NAME) {\n        throw new Error(`Unknown service: ${name}`);\n      }\n      const handle = nextHandle++;\n      handles.set(handle, { handlers: defaultHandlers() });\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 = handles.get(handle);\n      if (!state) {\n        return serializeRpcError(`Invalid service handle: ${handle}`);\n      }\n\n      const handler = state.handlers.get(functionName);\n      if (!handler) {\n        return serializeRpcError(`Function not found: ${functionName}`);\n      }\n\n      try {\n        const params = JSON.parse(paramsJson) as Record<string, unknown>;\n        return serializeRpcResult(handler(params));\n      } catch (e) {\n        return serializeRpcError(e instanceof Error ? e.message : String(e));\n      }\n    },\n  };\n}\n"],"mappings":";;;AAkBA,IAAI,aAAa;AACjB,MAAM,0BAAU,IAAI,IAA6B;AAEjD,SAAS,kBAA8C;CACrD,OAAO,IAAI,IAA2B;EACpC,CAAC,wBAAwB,IAAI;EAC7B,CAAC,eAAe,WAAW,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,GAAG;EAChE,CAAC,QAAQ,WAAW,OAAO,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,CAAC;EACvD,CAAC,SAAS,WAAW,OAAO,OAAO;CACrC,CAAC;AACH;AAEA,SAAgB,uBAA6B;CAC3C,QAAQ,MAAM;CACd,aAAa;AACf;AAEA,SAAgB,mBAAkC;CAChD,OAAO;EACL,kBAAkB,MAAuB;GACvC,OAAO,SAAS;EAClB;EAEA,cAAc,MAAsB;GAClC,IAAI,SAAA,iBACF,MAAM,IAAI,MAAM,oBAAoB,MAAM;GAE5C,MAAM,SAAS;GACf,QAAQ,IAAI,QAAQ,EAAE,UAAU,gBAAgB,EAAE,CAAC;GACnD,OAAO;EACT;EAEA,aAAa,QAAsB;GACjC,QAAQ,OAAO,MAAM;EACvB;EAEA,cAAc,QAAgB,cAAsB,YAA4B;GAC9E,MAAM,QAAQ,QAAQ,IAAI,MAAM;GAChC,IAAI,CAAC,OACH,OAAO,kBAAkB,2BAA2B,QAAQ;GAG9D,MAAM,UAAU,MAAM,SAAS,IAAI,YAAY;GAC/C,IAAI,CAAC,SACH,OAAO,kBAAkB,uBAAuB,cAAc;GAGhE,IAAI;IAEF,OAAO,mBAAmB,QADX,KAAK,MAAM,UACa,CAAC,CAAC;GAC3C,SAAS,GAAG;IACV,OAAO,kBAAkB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;GACrE;EACF;CACF;AACF"}