{"version":3,"sources":["../src/model/validation/channel-ti.ts","../src/model/validation/configuration-ti.ts","../src/model/validation/device-ti.ts","../src/model/validation/device-list-ti.ts","../src/model/validation/device-response-ti.ts","../src/model/validation/devices-ti.ts","../src/model/validation/error-ti.ts","../src/model/validation/floors-ti.ts","../src/model/validation/get-data-point-response-ti.ts","../src/model/validation/in-out-put-ti.ts","../src/model/validation/rooms-ti.ts","../src/model/validation/scenes-triggered-ti.ts","../src/model/validation/set-data-point-response-ti.ts","../src/model/validation/sys-ap-ti.ts","../src/model/validation/users-ti.ts","../src/model/validation/virtual-device-ti.ts","../src/model/validation/virtual-device-response-ti.ts","../src/model/validation/websocket-message-ti.ts","../src/model/validator.ts","../src/model/virtual-device.ts","../src/system-access-point.ts"],"sourcesContent":["import { ITypeSuite, iface, indexKey, opt } from \"ts-interface-checker\";\n\nconst Channel = iface([], {\n  displayName: opt(\"string\"),\n  functionID: opt(\"string\"),\n  room: opt(\"string\"),\n  floor: opt(\"string\"),\n  inputs: opt(\n    iface([], {\n      [indexKey]: \"InOutPut\",\n    })\n  ),\n  outputs: opt(\n    iface([], {\n      [indexKey]: \"InOutPut\",\n    })\n  ),\n  parameters: opt(\n    iface([], {\n      [indexKey]: \"string\",\n    })\n  ),\n  type: opt(\"string\"),\n});\n\nexport const ChannelTypeSuite: ITypeSuite = {\n  Channel,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Configuration = iface([], {\n  [indexKey]: \"SysAP\",\n});\n\nexport const ConfigurationTypeSuite: ITypeSuite = {\n  Configuration,\n};\n","import { iface, indexKey, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst Device = iface([], {\n  displayName: opt(\"string\"),\n  room: opt(\"string\"),\n  floor: opt(\"string\"),\n  interface: opt(\"string\"),\n  nativeId: opt(\"string\"),\n  channels: opt(\n    iface([], {\n      [indexKey]: \"Channel\",\n    })\n  ),\n  parameters: opt(\n    iface([], {\n      [indexKey]: \"string\",\n    })\n  ),\n});\n\nexport const DeviceTypeSuite: ITypeSuite = {\n  Device,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst DeviceList = iface([], {\n  [indexKey]: array(\"string\"),\n});\n\nexport const DeviceListTypeSuite: ITypeSuite = {\n  DeviceList,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst DeviceResponse = iface([], {\n  [indexKey]: iface([], {\n    devices: \"Devices\",\n  }),\n});\n\nexport const DeviceResponseTypeSuite: ITypeSuite = {\n  DeviceResponse,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Devices = iface([], {\n  [indexKey]: \"Device\",\n});\n\nexport const DevicesTypeSuite: ITypeSuite = {\n  Devices,\n};\n","import { iface, ITypeSuite } from \"ts-interface-checker\";\n\nconst Error = iface([], {\n  code: \"string\",\n  detail: \"string\",\n  title: \"string\",\n});\n\nexport const ErrorTypeSuite: ITypeSuite = {\n  Error,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Floors = iface([], {\n  [indexKey]: iface([], {\n    name: \"string\",\n    rooms: \"Rooms\",\n  }),\n});\n\nexport const FloorsTypeSuite: ITypeSuite = {\n  Floors,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst GetDataPointResponse = iface([], {\n  [indexKey]: iface([], {\n    values: array(\"string\"),\n  }),\n});\n\nexport const GetDataPointResponseTypeSuite: ITypeSuite = {\n  GetDataPointResponse,\n};\n","import { iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst InOutPut = iface([], {\n  value: opt(\"string\"),\n  pairingID: opt(\"number\"),\n});\n\nexport const InOutPutTypeSuite: ITypeSuite = {\n  InOutPut,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Rooms = iface([], {\n  [indexKey]: iface([], {\n    name: \"string\",\n  }),\n});\n\nexport const RoomsTypeSuite: ITypeSuite = {\n  Rooms,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst ScenesTriggered = iface([], {\n  [indexKey]: iface([], {\n    channels: iface([], {\n      [indexKey]: iface([], {\n        outputs: iface([], {\n          [indexKey]: iface([], {\n            value: \"string\",\n            pairingID: \"number\",\n          }),\n        }),\n      }),\n    }),\n  }),\n});\n\nexport const ScenesTriggeredTypeSuite: ITypeSuite = {\n  ScenesTriggered,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst SetDataPointResponse = iface([], {\n  [indexKey]: iface([], {\n    [indexKey]: \"string\",\n  }),\n});\n\nexport const SetDataPointResponseTypeSuite: ITypeSuite = {\n  SetDataPointResponse,\n};\n","import { iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst SysAP = iface([], {\n  devices: \"Devices\",\n  floorplan: iface([], {\n    floors: \"Floors\",\n  }),\n  sysapName: \"string\",\n  users: \"Users\",\n  error: opt(\"Error\"),\n});\n\nexport const SysApTypeSuite: ITypeSuite = {\n  SysAP,\n};\n","import { array, iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst Users = iface([], {\n  [indexKey]: iface([], {\n    enabled: \"boolean\",\n    flags: array(\"string\"),\n    grantedPermissions: array(\"string\"),\n    jid: \"string\",\n    name: \"string\",\n    requestedPermissions: array(\"string\"),\n    role: \"string\",\n  }),\n});\n\nexport const UsersTypeSuite: ITypeSuite = {\n  Users,\n};\n","import { array, enumtype, iface, opt, ITypeSuite } from \"ts-interface-checker\";\n\nconst VirtualDevice = iface([], {\n  type: \"VirtualDeviceType\",\n  properties: opt(\n    iface([], {\n      ttl: opt(\"string\"),\n      displayname: opt(\"string\"),\n      flavor: opt(\"string\"),\n      capabilities: opt(array(\"number\")),\n    })\n  ),\n});\n\nexport const VirtualDeviceType = enumtype({\n  BinarySensor: \"BinarySensor\",\n  BlindActuator: \"BlindActuator\",\n  SwitchingActuator: \"SwitchingActuator\",\n  CeilingFanActuator: \"CeilingFanActuator\",\n  RTC: \"RTC\",\n  DimActuator: \"DimActuator\",\n  EVCharging: \"evcharging\",\n  WindowSensor: \"WindowSensor\",\n  SimpleDoorlock: \"simple_doorlock\",\n  ShutterActuator: \"ShutterActuator\",\n  WeatherStation: \"WeatherStation\",\n  WeatherTemperatureSensor: \"Weather-TemperatureSensor\",\n  WeatherWindSensor: \"Weather-WindSensor\",\n  WeatherBrightnessSensor: \"Weather-BrightnessSensor\",\n  WeatherRainSensor: \"Weather-RainSensor\",\n  WindowActuator: \"WindowActuator\",\n  CODetector: \"CODetector\",\n  FireDetector: \"FireDetector\",\n  KNXSwitchSensor: \"KNX-SwitchSensor\",\n  MediaPlayer: \"MediaPlayer\",\n  EnergyBattery: \"EnergyBattery\",\n  EnergyInverter: \"EnergyInverter\",\n  EnergyMeter: \"EnergyMeter\",\n  EnergyInverterBattery: \"EnergyInverterBattery\",\n  EnergyInverterMeter: \"EnergyInverterMeter\",\n  EnergyInverterMeterBattery: \"EnergyInverterMeterBattery\",\n  EnergyMeterBattery: \"EnergyMeterBattery\",\n  AirQualityCO2: \"AirQualityCO2\",\n  AirQualityCO: \"AirQualityCO\",\n  AirQualityFull: \"AirQualityFull\",\n  AirQualityHumidity: \"AirQualityHumidity\",\n  AirQualityNO2: \"AirQualityNO2\",\n  AirQualityO3: \"AirQualityO3\",\n  AirQualityPM10: \"AirQualityPM10\",\n  AirQualityPM25: \"AirQualityPM25\",\n  AirQualityPressure: \"AirQualityPressure\",\n  AirQualityTemperature: \"AirQualityTemperature\",\n  AirQualityVOC: \"AirQualityVOC\",\n  EnergyMeterV2: \"EnergyMeterv2\",\n  HomeApplianceLaundry: \"HomeAppliance-Laundry\",\n  HVAC: \"HVAC\",\n  SplitUnit: \"SplitUnit\",\n});\n\nexport const VirtualDeviceTypeSuite: ITypeSuite = {\n  VirtualDevice,\n  VirtualDeviceType,\n};\n","import { iface, indexKey, ITypeSuite } from \"ts-interface-checker\";\n\nconst VirtualDeviceResponse = iface([], {\n  [indexKey]: iface([], {\n    devices: iface([], {\n      [indexKey]: iface([], {\n        serial: \"string\",\n      }),\n    }),\n  }),\n});\n\nexport const VirtualDeviceResponseTypeSuite: ITypeSuite = {\n  VirtualDeviceResponse,\n};\n","import { array, iface, indexKey, ITypeSuite, opt } from \"ts-interface-checker\";\n\nconst WebSocketMessage = iface([], {\n  [indexKey]: iface([], {\n    datapoints: iface([], {\n      [indexKey]: \"string\",\n    }),\n    devices: \"Devices\",\n    devicesAdded: array(\"string\"),\n    devicesRemoved: array(\"string\"),\n    scenesTriggered: \"ScenesTriggered\",\n    parameters: opt(\n      iface([], {\n        [indexKey]: \"string\",\n      })\n    ),\n  }),\n});\n\nexport const WebSocketMessageTypeSuite: ITypeSuite = {\n  WebSocketMessage,\n};\n","import {\n  ChannelTypeSuite,\n  DeviceTypeSuite,\n  DevicesTypeSuite,\n  InOutPutTypeSuite,\n  ScenesTriggeredTypeSuite,\n  WebSocketMessageTypeSuite,\n  DeviceListTypeSuite,\n  SetDataPointResponseTypeSuite,\n  GetDataPointResponseTypeSuite,\n  ConfigurationTypeSuite,\n  FloorsTypeSuite,\n  RoomsTypeSuite,\n  SysApTypeSuite,\n  UsersTypeSuite,\n  ErrorTypeSuite,\n  DeviceResponseTypeSuite,\n  VirtualDeviceTypeSuite,\n  VirtualDeviceResponseTypeSuite,\n} from \"./validation\";\nimport { Checker, createCheckers } from \"ts-interface-checker\";\nimport { WebSocketMessage as Message } from \"./websocket-message\";\nimport { Configuration as Config } from \"./configuration\";\nimport { Channel as Chan } from \"./channel\";\nimport { Device as Dev } from \"./device\";\nimport { DeviceList as DevList } from \"./device-list\";\nimport { DeviceResponse as DevResponse } from \"./device-response\";\nimport { GetDataPointResponse as GetResponse } from \"./get-data-point-response\";\nimport { SetDataPointResponse as SetResponse } from \"./set-data-point-response\";\nimport { VirtualDeviceResponse as VDeviceResponse } from \"./virtual-device-response\";\nimport { VirtualDevice as VDevice } from \"./virtual-device\";\nimport { Logger } from \"./logger\";\n\nconst { Channel } = createCheckers(ChannelTypeSuite, InOutPutTypeSuite);\n\nconst { Configuration } = createCheckers(\n  ConfigurationTypeSuite,\n  DevicesTypeSuite,\n  DeviceTypeSuite,\n  ChannelTypeSuite,\n  InOutPutTypeSuite,\n  FloorsTypeSuite,\n  RoomsTypeSuite,\n  SysApTypeSuite,\n  UsersTypeSuite,\n  ErrorTypeSuite\n);\n\nconst { Device } = createCheckers(\n  DeviceTypeSuite,\n  ChannelTypeSuite,\n  InOutPutTypeSuite\n);\n\nconst { DeviceList } = createCheckers(DeviceListTypeSuite);\n\nconst { DeviceResponse } = createCheckers(\n  DeviceResponseTypeSuite,\n  DevicesTypeSuite,\n  DeviceTypeSuite,\n  ChannelTypeSuite,\n  InOutPutTypeSuite\n);\n\nconst { GetDataPointResponse } = createCheckers(GetDataPointResponseTypeSuite);\n\nconst { SetDataPointResponse } = createCheckers(SetDataPointResponseTypeSuite);\n\nconst { VirtualDevice } = createCheckers(VirtualDeviceTypeSuite);\n\nconst { VirtualDeviceResponse } = createCheckers(\n  VirtualDeviceResponseTypeSuite\n);\n\nconst { WebSocketMessage } = createCheckers(\n  WebSocketMessageTypeSuite,\n  DevicesTypeSuite,\n  DeviceTypeSuite,\n  ChannelTypeSuite,\n  InOutPutTypeSuite,\n  ScenesTriggeredTypeSuite\n);\n\nfunction check(\n  obj: unknown,\n  checker: Checker,\n  logger: Logger,\n  verbose: boolean\n): boolean {\n  if (verbose) {\n    try {\n      checker.check(obj);\n      return true;\n    } catch (error) {\n      logger.error(\"Object validation failed!\", error);\n      return false;\n    }\n  }\n\n  return checker.test(obj);\n}\n\n/**\n * Determines whether the specified object is a web socket message.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a web socket message.\n */\nexport function isWebSocketMessage(\n  obj: unknown,\n  logger: Logger,\n  verbose = false\n): obj is Message {\n  return check(obj, WebSocketMessage, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a configuration.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a configuration.\n */\nexport function isConfiguration(\n  obj: unknown,\n  logger: Logger,\n  verbose = false\n): obj is Config {\n  return check(obj, Configuration, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device list.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device list.\n */\nexport function isDeviceList(\n  obj: unknown,\n  logger: Logger,\n  verbose = false\n): obj is DevList {\n  return check(obj, DeviceList, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device response.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device response.\n */\nexport function isDeviceResponse(\n  obj: unknown,\n  logger: Logger,\n  verbose = false\n): obj is DevResponse {\n  return check(obj, DeviceResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a valid response to a get data point request.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a get data point request.\n */\nexport function isGetDataPointResponse(\n  obj: unknown,\n  logger: Logger,\n  verbose = false\n): obj is GetResponse {\n  return check(obj, GetDataPointResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a valid response to a set data point request.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a set data point request.\n */\nexport function isSetDataPointResponse(\n  obj: unknown,\n  logger: Logger,\n  verbose = false\n): obj is SetResponse {\n  return check(obj, SetDataPointResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a virtual device.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a virtual device.\n */\nexport function isVirtualDevice(\n  obj: unknown,\n  logger: Logger,\n  verbose = false\n): obj is VDevice {\n  return check(obj, VirtualDevice, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a virtual device response.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a response to a virtual device request.\n */\nexport function isVirtualDeviceResponse(\n  obj: unknown,\n  logger: Logger,\n  verbose = false\n): obj is VDeviceResponse {\n  return check(obj, VirtualDeviceResponse, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a channel.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a channel.\n */\nexport function isChannel(\n  obj: unknown,\n  logger: Logger,\n  verbose = false\n): obj is Chan {\n  return check(obj, Channel, logger, verbose);\n}\n\n/**\n * Determines whether the specified object is a device.\n * @param obj {object} The object to be tested\n * @param logger {Logger} The logger instance to be used.\n * @param verbose {boolean} Determines whether validation errors shall be logged. Default value is false.\n * @returns {boolean} A value indicating whether the specified object is a device.\n */\nexport function isDevice(\n  obj: unknown,\n  logger: Logger,\n  verbose = false\n): obj is Dev {\n  return check(obj, Device, logger, verbose);\n}\n","/** Defines a virtual device. */\nexport interface VirtualDevice {\n  /** The virtual device type. */\n  type: VirtualDeviceType;\n  /** The virtual device properties */\n  properties?: {\n    /** The time to live value indicates the number of seconds the system access point will wait for a message before it assumes the device to be unresponsive. */\n    ttl?: string;\n    /** The display name for the virtual device. */\n    displayname?: string;\n    /** The virtual device flavor. */\n    flavor?: string;\n    /** The virtual device capabilities. */\n    capabilities?: Array<number>;\n  };\n}\n\n/** Defines the possible types of virtual devices. */\nexport enum VirtualDeviceType {\n  /** A binary sensor */\n  BinarySensor = \"BinarySensor\",\n  /** A blind actuator */\n  BlindActuator = \"BlindActuator\",\n  /** A switching actuator */\n  SwitchingActuator = \"SwitchingActuator\",\n  /** A ceiling fan actuator */\n  CeilingFanActuator = \"CeilingFanActuator\",\n  /** A real time clock */\n  RTC = \"RTC\",\n  /** A dimmer actuator */\n  DimActuator = \"DimActuator\",\n  /** A charger for an electronic vehicle */\n  EVCharging = \"evcharging\",\n  /** A window sensor */\n  WindowSensor = \"WindowSensor\",\n  /** A simple door lock */\n  SimpleDoorlock = \"simple_doorlock\",\n  /** A shutter actuator */\n  ShutterActuator = \"ShutterActuator\",\n  /** A weather station */\n  WeatherStation = \"WeatherStation\",\n  /** A temperature sensor */\n  WeatherTemperatureSensor = \"Weather-TemperatureSensor\",\n  /** A wind sensor */\n  WeatherWindSensor = \"Weather-WindSensor\",\n  /** A brightness sensor */\n  WeatherBrightnessSensor = \"Weather-BrightnessSensor\",\n  /** A rain sensor */\n  WeatherRainSensor = \"Weather-RainSensor\",\n  /** A window actuator */\n  WindowActuator = \"WindowActuator\",\n  /** A detector for carbon monoxide (CO) */\n  CODetector = \"CODetector\",\n  /** A fire detector */\n  FireDetector = \"FireDetector\",\n  /** A KNX switch sensor */\n  KNXSwitchSensor = \"KNX-SwitchSensor\",\n  /** A media player */\n  MediaPlayer = \"MediaPlayer\",\n  /** A battery */\n  EnergyBattery = \"EnergyBattery\",\n  /** An inverter */\n  EnergyInverter = \"EnergyInverter\",\n  /** An energy meter */\n  EnergyMeter = \"EnergyMeter\",\n  /** A device combining inverter and battery characteristics */\n  EnergyInverterBattery = \"EnergyInverterBattery\",\n  /** A device combining inverter and energy meter characteristics */\n  EnergyInverterMeter = \"EnergyInverterMeter\",\n  /** A device combining inverter, battery and energy meter characteristics */\n  EnergyInverterMeterBattery = \"EnergyInverterMeterBattery\",\n  /** A device combining battery and energy meter characteristics */\n  EnergyMeterBattery = \"EnergyMeterBattery\",\n  /** An air quality sensor measuring carbon dioxide (CO2) */\n  AirQualityCO2 = \"AirQualityCO2\",\n  /** An air quality sensor measuring carbon monoxide (CO) */\n  AirQualityCO = \"AirQualityCO\",\n  /** An full air quality sensor */\n  AirQualityFull = \"AirQualityFull\",\n  /** An air quality sensor measuring humidity */\n  AirQualityHumidity = \"AirQualityHumidity\",\n  /** An air quality sensor measuring nitrogen dioxide (NO2) */\n  AirQualityNO2 = \"AirQualityNO2\",\n  /** An air quality sensor measuring ozone (O3) */\n  AirQualityO3 = \"AirQualityO3\",\n  /** An air quality sensor measuring coarse particulate matter with in the 10 micron scale */\n  AirQualityPM10 = \"AirQualityPM10\",\n  /** An air quality sensor measuring coarse particulate matter with in the 25 micron scale */\n  AirQualityPM25 = \"AirQualityPM25\",\n  /** An air quality sensor measuring barometric pressure */\n  AirQualityPressure = \"AirQualityPressure\",\n  /** An air quality sensor measuring temperature */\n  AirQualityTemperature = \"AirQualityTemperature\",\n  /** An air quality sensor measuring volatile organic compounds */\n  AirQualityVOC = \"AirQualityVOC\",\n  /** A version 2 energy meter */\n  EnergyMeterV2 = \"EnergyMeterv2\",\n  HomeApplianceLaundry = \"HomeAppliance-Laundry\",\n  HVAC = \"HVAC\",\n  SplitUnit = \"SplitUnit\",\n}\n","import { Observable, Subject } from \"rxjs\";\nimport { ClientOptions, RawData, WebSocket } from \"ws\";\nimport { EventEmitter } from \"events\";\nimport {\n  Configuration,\n  DeviceList,\n  DeviceResponse,\n  GetDataPointResponse,\n  isDeviceList,\n  isDeviceResponse,\n  isWebSocketMessage,\n  isGetDataPointResponse,\n  isSetDataPointResponse,\n  isConfiguration,\n  SetDataPointResponse,\n  WebSocketMessage,\n  VirtualDevice,\n  VirtualDeviceResponse,\n  Logger,\n} from \"./model\";\nimport { isVirtualDeviceResponse } from \"./model/validator\";\n\n/** The HTTP request method */\ntype HttpRequestMethod = \"GET\" | \"POST\" | \"DELETE\" | \"PATCH\" | \"PUT\";\n\n/** The class representing a System Access Point. */\nexport class SystemAccessPoint extends EventEmitter {\n  /** The basic authentication key used for requests. */\n  public readonly basicAuthKey: string;\n  /** The host name of the system access point. */\n  public readonly hostName: string;\n  /** Determines whether requests to the system access point will use TLS. */\n  public readonly tlsEnabled: boolean;\n  private readonly logger: Logger;\n  private readonly verboseErrors: boolean;\n  private webSocket?: WebSocket;\n  private readonly webSocketMessageSubject = new Subject<WebSocketMessage>();\n\n  /**\n   * Constructs a new SystemAccessPoint instance\n   *\n   * @constructor\n   * @param hostName {string} The system access point host name.\n   * @param userName {string} The user name that shall be used to authenticate with the system access point.\n   * @param password {string} The password that shall be used to authenticate with the system access point.\n   * @param tlsEnabled {boolean} Determines whether the communication with the system access point shall be protected by TLS.\n   * @param verboseErrors {boolean} Determines whether verbose error messages shall be used, for example for message validation.\n   * @param logger {Logger} The logger instance to be used. If no explicit implementation is provided, the this.logger will be used for logging.\n   */\n  constructor(\n    hostName: string,\n    userName: string,\n    password: string,\n    tlsEnabled = true,\n    verboseErrors = false,\n    logger?: Logger\n  ) {\n    super();\n\n    // Configure logging\n    this.logger = logger ?? console;\n\n    // Create Basic Authentication key\n    this.basicAuthKey = Buffer.from(`${userName}:${password}`, \"utf8\").toString(\n      \"base64\"\n    );\n    this.hostName = hostName;\n    this.tlsEnabled = tlsEnabled;\n    this.verboseErrors = verboseErrors;\n  }\n\n  /**\n   * Connects to the System Access Point web socket.\n   * @param certificateVerification {boolean} Determines whether the TLS certificate presented by the server will be verified.\n   */\n  public connectWebSocket(certificateVerification = true): void {\n    if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\n      throw new Error(\"Web socket is already connected\");\n    }\n\n    this.webSocket = this.createWebSocket(certificateVerification);\n  }\n\n  /**\n   * Creates a new virtual device.\n   * @param sysApUuid {string} The UUID identifying the system access point.\n   * @param deviceSerial {string} The serial number to be assigned to the device.\n   * @param virtualDevice {VirtualDevice} The virtual device to be created.\n   * @returns {Promise.<VirtualDeviceResponse>} The response to the virtual device request.\n   */\n  public async createVirtualDevice(\n    sysApUuid: string,\n    deviceSerial: string,\n    virtualDevice: VirtualDevice\n  ): Promise<VirtualDeviceResponse> {\n    // Get response from system access point\n    const response: Response = await this.fetchDataViaRest(\n      \"PUT\",\n      `virtualdevice/${sysApUuid}/${deviceSerial}`,\n      JSON.stringify(virtualDevice)\n    );\n\n    // Process response\n    return this.processRestResponse(response, isVirtualDeviceResponse);\n  }\n\n  private createWebSocket(certificateVerification: boolean): WebSocket {\n    // Disabling certificate verification is discouraged, issue a warning\n    if (this.tlsEnabled && !certificateVerification) {\n      this.logger.warn(\n        \"TLS certificate verification is disabled! This poses a security risk, activating certificate verification is strictly recommended.\"\n      );\n    }\n\n    const url = `${this.tlsEnabled ? \"wss\" : \"ws\"}://${\n      this.hostName\n    }/fhapi/v1/api/ws`;\n    const options: ClientOptions = {\n      rejectUnauthorized: this.tlsEnabled && certificateVerification,\n      headers: {\n        Authorization: `Basic ${this.basicAuthKey}`,\n      },\n    };\n    const webSocket = new WebSocket(url, options);\n    webSocket.on(\"error\", (error: Error) => {\n      this.emit(\"websocket-error\", error);\n      this.logger.error(\"Error received\", error);\n    });\n    webSocket.on(\"ping\", (data: Buffer) => {\n      this.emit(\"websocket-ping\", data);\n      this.logger.debug(\"Ping received\", data.toString(\"ascii\"));\n    });\n    webSocket.on(\"pong\", (data: Buffer) => {\n      this.emit(\"websocket-pong\", data);\n      this.logger.debug(\"Pong received\", data.toString(\"ascii\"));\n    });\n    webSocket.on(\"unexpected-response\", (request, response) => {\n      this.emit(\"websocket-unexpected-response\", request, response);\n      this.logger.error(\"Unexpected response received\");\n    });\n    webSocket.on(\"upgrade\", (request) => {\n      this.emit(\"websocket-upgrade\", request);\n      this.logger.debug(\"Upgrade request received\");\n    });\n    webSocket.on(\"open\", () => {\n      this.emit(\"websocket-open\");\n      this.logger.log(\"Connection opened\");\n    });\n    webSocket.on(\"close\", (code, reason) => {\n      this.emit(\"websocket-close\", code, reason);\n      this.logger.log(\"Connection closed\");\n    });\n    webSocket.on(\"message\", (data: RawData, isBinary: boolean) => {\n      this.emit(\"websocket-message\", data, isBinary);\n      this.processWebSocketMessage(data, isBinary);\n    });\n    return webSocket;\n  }\n\n  /**\n   * Disconnects from the System Access Point web socket.\n   * @param force {boolean} Determines whether or not the connection will be closed forcibly.\n   */\n  public disconnectWebSocket(force = false): void {\n    if (!this.webSocket || this.webSocket.readyState === WebSocket.CLOSED) {\n      throw new Error(\"Web socket is not open\");\n    }\n\n    if (force) {\n      this.webSocket.terminate();\n    } else {\n      this.webSocket.close();\n    }\n  }\n\n  /**\n   * Gets the configuration from the system access point.\n   * @returns {Promise.<Configuration>} The system access point configuration.\n   */\n  public async getConfiguration(): Promise<Configuration> {\n    // Get response from system access point\n    const response: Response = await this.fetchDataViaRest(\n      \"GET\",\n      \"configuration\"\n    );\n\n    // Process response\n    return this.processRestResponse(response, isConfiguration);\n  }\n\n  /**\n   * Gets the device list from the system access point.\n   * @returns {Promise.<DeviceList>} The requested device list.\n   */\n  public async getDeviceList(): Promise<DeviceList> {\n    // Get response from system access point\n    const response: Response = await this.fetchDataViaRest(\"GET\", \"devicelist\");\n\n    // Process response\n    return this.processRestResponse(response, isDeviceList);\n  }\n\n  /**\n   * Gets the specified device from the system access point.\n   * @param sysApUuid {string} The UUID identifying the system access point.\n   * @param deviceSerial {string} The device serial number.\n   * @returns {Promise.<DeviceResponse>} The response to the device request.\n   */\n  public async getDevice(\n    sysApUuid: string,\n    deviceSerial: string\n  ): Promise<DeviceResponse> {\n    // Get response from system access point\n    const response: Response = await this.fetchDataViaRest(\n      \"GET\",\n      `device/${sysApUuid}/${deviceSerial}`\n    );\n\n    // Process response\n    return this.processRestResponse(response, isDeviceResponse);\n  }\n\n  /**\n   * Gets the specified data point from the system access point.\n   * @param sysApUuid {string} The UUID idenfifying the system access point.\n   * @param deviceSerial {string} The device serial number.\n   * @param channel {string} The channel identifier.\n   * @param dataPoint {string} The datapoint identifier.\n   * @returns {Promise.<GetDataPointResponse>} The response to the get data point request.\n   */\n  public async getDatapoint(\n    sysApUuid: string,\n    deviceSerial: string,\n    channel: string,\n    dataPoint: string\n  ): Promise<GetDataPointResponse> {\n    // Get response from system access point\n    const response: Response = await this.fetchDataViaRest(\n      \"GET\",\n      `datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`\n    );\n\n    // Process response\n    return this.processRestResponse(response, isGetDataPointResponse);\n  }\n\n  /**\n   * Gets the web socket messages.\n   * @returns {Observable.<WebSocketMessage>} An observable that is updated with the messages received from the web socket.\n   */\n  public getWebSocketMessages(): Observable<WebSocketMessage> {\n    return this.webSocketMessageSubject.asObservable();\n  }\n\n  /**\n   * Sets a new value for the specificed data point.\n   * @param sysApUuid {string} The UUID idenfifying the system access point.\n   * @param deviceSerial {string} The device serial number.\n   * @param channel {string} The channel identifier.\n   * @param dataPoint {string} The datapoint identifier.\n   * @param value {string} The new value to be set.\n   * @returns {Promise.<SetDataPointResponse>} The response to the set data point request.\n   */\n  public async setDatapoint(\n    sysApUuid: string,\n    deviceSerial: string,\n    channel: string,\n    dataPoint: string,\n    value: string\n  ): Promise<SetDataPointResponse> {\n    // Get response from system access point\n    const response: Response = await this.fetchDataViaRest(\n      \"PUT\",\n      `datapoint/${sysApUuid}/${deviceSerial}.${channel}.${dataPoint}`,\n      value\n    );\n\n    // Process response\n    return this.processRestResponse(response, isSetDataPointResponse);\n  }\n\n  /**\n   * Triggeres the given action for the specified proxy device. Please note that this method is part of the experimental API!\n   * @param sysApUuid {string} The UUID idenfifying the system access point.\n   * @param deviceClass {string} The device class.\n   * @param deviceSerial {string} The device serial number.\n   * @param action {string} The action to be triggered.\n   * @returns {Promise.<DeviceResponse>} The response to the request.\n   */\n  public async triggerProxyDevice(\n    sysApUuid: string,\n    deviceClass: string,\n    deviceSerial: string,\n    action: string\n  ): Promise<DeviceResponse> {\n    // Get response from system access point\n    const response: Response = await this.fetchDataViaRest(\n      \"GET\",\n      `proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/action/${action}`\n    );\n\n    // Process response\n    return this.processRestResponse(response, isDeviceResponse);\n  }\n\n  /**\n   * Sets the given value for the specified proxy device. Please note that this method is part of the experimental API!\n   * @param sysApUuid {string} The UUID idenfifying the system access point.\n   * @param deviceClass {string} The device class.\n   * @param deviceSerial {string} The device serial number.\n   * @param value {string} The value to be set.\n   * @returns {Promise.<DeviceResponse>} The response to the request.\n   */\n  public async setProxyDeviceValue(\n    sysApUuid: string,\n    deviceClass: string,\n    deviceSerial: string,\n    value: string\n  ): Promise<DeviceResponse> {\n    // Get response from system access point\n    const response: Response = await this.fetchDataViaRest(\n      \"PUT\",\n      `proxydevice/${sysApUuid}/${deviceClass}/${deviceSerial}/value/${value}`\n    );\n\n    // Process response\n    return this.processRestResponse(response, isDeviceResponse);\n  }\n\n  private async fetchDataViaRest(\n    method: HttpRequestMethod,\n    route: string,\n    body: BodyInit | null | undefined = undefined\n  ): Promise<Response> {\n    // Set up request info\n    const info: RequestInfo = `${this.tlsEnabled ? \"https\" : \"http\"}://${\n      this.hostName\n    }/fhapi/v1/api/rest/${route}`;\n\n    // Set up request init\n    const init: RequestInit = {\n      method: method,\n      headers: {\n        Authorization: `Basic ${this.basicAuthKey}`,\n      },\n      body: body,\n    };\n\n    // Get response from system access point\n    return fetch(info, init);\n  }\n\n  private async processRestResponse<TResponse>(\n    response: Response,\n    typeGuard: (\n      obj: unknown,\n      logger: Logger,\n      verbose: boolean\n    ) => obj is TResponse\n  ): Promise<TResponse> {\n    let body: unknown;\n    let message: string;\n\n    // Process response\n    switch (response.status) {\n      case 200:\n        body = await response.json();\n        if (!typeGuard(body, this.logger, this.verboseErrors)) {\n          message = \"Received message has an unexpected type!\";\n          this.logger.error(message, body);\n          throw new Error(message);\n        }\n\n        return body;\n      case 401:\n        message = \"Authentication information is missing or invalid.\";\n        this.logger.error(message);\n        throw new Error(message);\n      case 502:\n        message = await response.text();\n        this.logger.error(message);\n        throw new Error(message);\n      default:\n        message = `Received HTTP ${\n          response.status\n        } status code unexpectedly: ${await response.text()}`;\n        this.logger.error(message);\n        throw new Error(message);\n    }\n  }\n\n  private processWebSocketMessage(data: RawData, isBinary: boolean): void {\n    // Do not process binary messages\n    if (isBinary) {\n      this.logger.warn(\n        \"Binary message received. Binary messages are not processed.\"\n      );\n      return;\n    }\n\n    this.logger.debug(\"Message received\");\n    /*\n     * Deserialize the message.\n     * The message is expected to be deserializable as a web socket message.\n     * If that is not the case, that's an error case.\n     */\n    // eslint-disable-next-line @typescript-eslint/no-base-to-string\n    const serialized = data.toString();\n    const message: unknown = JSON.parse(serialized);\n\n    if (isWebSocketMessage(message, this.logger, this.verboseErrors)) {\n      this.webSocketMessageSubject.next(message);\n      return;\n    }\n\n    this.logger.error(\"Received message has an unexpected type!\", serialized);\n  }\n}\n"],"mappings":"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","names":["iface","indexKey","iface","indexKey","opt","iface","indexKey","iface","indexKey","iface","indexKey","iface","Error","iface","indexKey","array","iface","indexKey","iface","opt","iface","indexKey","iface","indexKey","iface","indexKey","iface","opt","array","iface","indexKey","array","iface","opt","iface","indexKey","array","iface","indexKey","opt","Channel","Configuration","Device","DeviceList","DeviceResponse","GetDataPointResponse","SetDataPointResponse","VirtualDevice","VirtualDeviceResponse","WebSocketMessage","VirtualDeviceType"]}