UNPKG

freeathome-local-api-client

Version:

A client library for the BUSCH-JAEGER free@home local API implemented in TypeScript

1 lines 49.8 kB
{"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"]}