{"version":3,"file":"device-host.mjs","names":[],"sources":["../../src/hosts/device-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 Device — Node/vitest only, not used on device.\n * Import: `@brookesia/service/hosts/device`\n */\n\nimport type { BrookesiaHost } from '../common/brookesia-host.ts';\nimport { serializeRpcError, serializeRpcResult } from '../common/rpc-json.ts';\nimport { DEVICE_FUNCTIONS, DEVICE_SERVICE_NAME } from '../device/device-client.ts';\nimport type {\n  DeviceBoardInfo,\n  DeviceCameraInfo,\n  DeviceCapability,\n  DeviceNetworkConnectivityInfo,\n  DevicePowerBatteryChargeConfig,\n  DevicePowerBatteryInfo,\n  DevicePowerBatteryState,\n} from '../device/device-types.ts';\n\ntype DeviceMockState = {\n  capabilities: DeviceCapability[];\n  boardInfo: DeviceBoardInfo;\n  cameraDeviceInfos: DeviceCameraInfo[];\n  networkConnectivityInfo: DeviceNetworkConnectivityInfo[];\n  powerBatteryInfo: DevicePowerBatteryInfo;\n  powerBatteryState: DevicePowerBatteryState;\n  powerBatteryChargeConfig: DevicePowerBatteryChargeConfig;\n  chargingEnabled: boolean;\n};\n\nlet nextHandle = 1;\nconst handles = new Map<number, DeviceMockState>();\n\nfunction defaultState(): DeviceMockState {\n  return {\n    capabilities: [\n      {\n        name: 'General',\n        interfaces: [{ name: 'System:BoardInfo', instance: 'System:BoardInfo' }],\n      },\n    ],\n    boardInfo: {\n      name: 'mock_board',\n      chip: 'ESP32-S3',\n      version: 'v1.0',\n      description: 'Mock board',\n      manufacturer: 'Espressif',\n    },\n    cameraDeviceInfos: [],\n    networkConnectivityInfo: [\n      {\n        instance_name: 'Network:Connectivity:0',\n        state: 'LocalNetworkReady',\n        network_ready: true,\n        internet_ready: false,\n      },\n    ],\n    powerBatteryInfo: {\n      name: 'MainBattery',\n      chemistry: 'Li-ion',\n      abilities: ['Voltage', 'Percentage', 'ChargeState'],\n    },\n    powerBatteryState: {\n      is_present: true,\n      power_source: 'Battery',\n      charge_state: 'NotCharging',\n      level_source: 'VoltageCurve',\n      voltage_mv: 3920,\n      percentage: 67,\n      is_low: false,\n      is_critical: false,\n    },\n    powerBatteryChargeConfig: {\n      enabled: true,\n      target_voltage_mv: 4200,\n      charge_current_ma: 500,\n      precharge_current_ma: 100,\n      termination_current_ma: 100,\n    },\n    chargingEnabled: true,\n  };\n}\n\nfunction getState(handle: number): DeviceMockState {\n  const state = handles.get(handle);\n  if (!state) {\n    throw new Error(`Device memory host: invalid handle ${handle}`);\n  }\n  return state;\n}\n\nexport type DeviceHostOptions = Partial<DeviceMockState>;\n\nexport function createDeviceHost(initial?: DeviceHostOptions): BrookesiaHost {\n  const seed = { ...defaultState(), ...initial };\n\n  return {\n    service_available(name: string): boolean {\n      return name === DEVICE_SERVICE_NAME;\n    },\n\n    start_service(name: string): number {\n      if (name !== DEVICE_SERVICE_NAME) {\n        throw new Error(`Device memory host: unknown service ${name}`);\n      }\n      const handle = nextHandle++;\n      handles.set(handle, {\n        ...defaultState(),\n        capabilities: [...seed.capabilities],\n        boardInfo: { ...seed.boardInfo },\n        cameraDeviceInfos: [...seed.cameraDeviceInfos],\n        networkConnectivityInfo: seed.networkConnectivityInfo.map((entry) => ({ ...entry })),\n        powerBatteryInfo: { ...seed.powerBatteryInfo },\n        powerBatteryState: { ...seed.powerBatteryState },\n        powerBatteryChargeConfig: { ...seed.powerBatteryChargeConfig },\n        chargingEnabled: seed.chargingEnabled,\n      });\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 === DEVICE_FUNCTIONS.GetCapabilities) {\n          return serializeRpcResult([...state.capabilities]);\n        }\n\n        if (functionName === DEVICE_FUNCTIONS.GetBoardInfo) {\n          return serializeRpcResult({ ...state.boardInfo });\n        }\n\n        if (functionName === DEVICE_FUNCTIONS.GetCameraDeviceInfos) {\n          return serializeRpcResult([...state.cameraDeviceInfos]);\n        }\n\n        if (functionName === DEVICE_FUNCTIONS.GetNetworkConnectivityInfo) {\n          return serializeRpcResult([...state.networkConnectivityInfo]);\n        }\n\n        if (functionName === DEVICE_FUNCTIONS.GetPowerBatteryInfo) {\n          return serializeRpcResult({ ...state.powerBatteryInfo });\n        }\n\n        if (functionName === DEVICE_FUNCTIONS.GetPowerBatteryState) {\n          return serializeRpcResult({ ...state.powerBatteryState });\n        }\n\n        if (functionName === DEVICE_FUNCTIONS.GetPowerBatteryChargeConfig) {\n          return serializeRpcResult({ ...state.powerBatteryChargeConfig });\n        }\n\n        if (functionName === DEVICE_FUNCTIONS.SetPowerBatteryChargeConfig) {\n          state.powerBatteryChargeConfig = {\n            ...(params.Config as DevicePowerBatteryChargeConfig),\n          };\n          return serializeRpcResult();\n        }\n\n        if (functionName === DEVICE_FUNCTIONS.SetPowerBatteryChargingEnabled) {\n          state.chargingEnabled = Boolean(params.Enabled);\n          state.powerBatteryChargeConfig.enabled = state.chargingEnabled;\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 resetDeviceHostState(): void {\n  handles.clear();\n  nextHandle = 1;\n}\n"],"mappings":"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"}