{"version":3,"sources":["../node_modules/retry/lib/retry_operation.js","../node_modules/retry/lib/retry.js","../node_modules/retry/index.js","../src/index.ts","../src/utilities/Enums.ts","../src/utilities/MessageID.ts","../src/utilities/Events.ts","../src/core/DataGram.ts","../src/core/BaseRequest.ts","../src/core/BaseResponse.ts","../src/core/ConsoleLogger.ts","../src/core/NullLogger.ts","../src/exceptions/index.ts","../src/exceptions/ConnectionExistsException.ts","../src/exceptions/NoConnectionException.ts","../src/requests/index.ts","../src/requests/AcknowledgeRequest.ts","../src/requests/Heartbeat.ts","../src/types/CommandID.ts","../src/types/ProtocolVersion.ts","../src/requests/InternalUnitStatuses.ts","../src/requests/KeyParameters.ts","../src/requests/KeyStatus.ts","../src/requests/Login.ts","../src/requests/NodeCount.ts","../src/requests/NodeMetaData.ts","../src/requests/NodeStatus.ts","../src/requests/RoomCount.ts","../src/requests/RoomMetaData.ts","../src/requests/ToggleHeartbeat.ts","../src/requests/ToggleKeyStatus.ts","../src/requests/ToggleNodeStatus.ts","../src/responses/index.ts","../src/responses/Acknowledgement.ts","../src/responses/GenericUnusedResponse.ts","../src/responses/InternalUnitStatuses.ts","../src/responses/KeyParameters.ts","../src/responses/KeyParametersV2.ts","../src/responses/KeyStatus.ts","../src/responses/NodeCount.ts","../src/responses/NodeMetaData.ts","../src/responses/NodeMetaDataV2.ts","../src/responses/RoomCount.ts","../src/responses/RoomMetaData.ts","../node_modules/p-timeout/index.js","../node_modules/p-event/index.js","../src/configs/AbstractConfigParser.ts","../src/configs/ConnectionConfigParser.ts","../src/configs/SocketConfigParser.ts","../src/responses/helpers/ResponseLookup.ts","../src/responses/helpers/ResponseFactory.ts","../src/socket/AbstractSocket.ts","../node_modules/p-retry/index.js","../node_modules/is-network-error/index.js","../node_modules/yocto-queue/index.js","../node_modules/p-limit/index.js","../src/socket/LinearJitter.ts","../src/socket/RequestThrottler.ts","../src/socket/RequestRetryHandler.ts","../src/socket/AbstractHeartbeatHandler.ts","../src/socket/VitreaHeartbeatHandler.ts","../src/utilities/SplitMultipleBuffers.ts","../src/VitreaClient.ts"],"sourcesContent":["function RetryOperation(timeouts, options) {\n  // Compatibility for the old (timeouts, retryForever) signature\n  if (typeof options === 'boolean') {\n    options = { forever: options };\n  }\n\n  this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));\n  this._timeouts = timeouts;\n  this._options = options || {};\n  this._maxRetryTime = options && options.maxRetryTime || Infinity;\n  this._fn = null;\n  this._errors = [];\n  this._attempts = 1;\n  this._operationTimeout = null;\n  this._operationTimeoutCb = null;\n  this._timeout = null;\n  this._operationStart = null;\n  this._timer = null;\n\n  if (this._options.forever) {\n    this._cachedTimeouts = this._timeouts.slice(0);\n  }\n}\nmodule.exports = RetryOperation;\n\nRetryOperation.prototype.reset = function() {\n  this._attempts = 1;\n  this._timeouts = this._originalTimeouts.slice(0);\n}\n\nRetryOperation.prototype.stop = function() {\n  if (this._timeout) {\n    clearTimeout(this._timeout);\n  }\n  if (this._timer) {\n    clearTimeout(this._timer);\n  }\n\n  this._timeouts       = [];\n  this._cachedTimeouts = null;\n};\n\nRetryOperation.prototype.retry = function(err) {\n  if (this._timeout) {\n    clearTimeout(this._timeout);\n  }\n\n  if (!err) {\n    return false;\n  }\n  var currentTime = new Date().getTime();\n  if (err && currentTime - this._operationStart >= this._maxRetryTime) {\n    this._errors.push(err);\n    this._errors.unshift(new Error('RetryOperation timeout occurred'));\n    return false;\n  }\n\n  this._errors.push(err);\n\n  var timeout = this._timeouts.shift();\n  if (timeout === undefined) {\n    if (this._cachedTimeouts) {\n      // retry forever, only keep last error\n      this._errors.splice(0, this._errors.length - 1);\n      timeout = this._cachedTimeouts.slice(-1);\n    } else {\n      return false;\n    }\n  }\n\n  var self = this;\n  this._timer = setTimeout(function() {\n    self._attempts++;\n\n    if (self._operationTimeoutCb) {\n      self._timeout = setTimeout(function() {\n        self._operationTimeoutCb(self._attempts);\n      }, self._operationTimeout);\n\n      if (self._options.unref) {\n          self._timeout.unref();\n      }\n    }\n\n    self._fn(self._attempts);\n  }, timeout);\n\n  if (this._options.unref) {\n      this._timer.unref();\n  }\n\n  return true;\n};\n\nRetryOperation.prototype.attempt = function(fn, timeoutOps) {\n  this._fn = fn;\n\n  if (timeoutOps) {\n    if (timeoutOps.timeout) {\n      this._operationTimeout = timeoutOps.timeout;\n    }\n    if (timeoutOps.cb) {\n      this._operationTimeoutCb = timeoutOps.cb;\n    }\n  }\n\n  var self = this;\n  if (this._operationTimeoutCb) {\n    this._timeout = setTimeout(function() {\n      self._operationTimeoutCb();\n    }, self._operationTimeout);\n  }\n\n  this._operationStart = new Date().getTime();\n\n  this._fn(this._attempts);\n};\n\nRetryOperation.prototype.try = function(fn) {\n  console.log('Using RetryOperation.try() is deprecated');\n  this.attempt(fn);\n};\n\nRetryOperation.prototype.start = function(fn) {\n  console.log('Using RetryOperation.start() is deprecated');\n  this.attempt(fn);\n};\n\nRetryOperation.prototype.start = RetryOperation.prototype.try;\n\nRetryOperation.prototype.errors = function() {\n  return this._errors;\n};\n\nRetryOperation.prototype.attempts = function() {\n  return this._attempts;\n};\n\nRetryOperation.prototype.mainError = function() {\n  if (this._errors.length === 0) {\n    return null;\n  }\n\n  var counts = {};\n  var mainError = null;\n  var mainErrorCount = 0;\n\n  for (var i = 0; i < this._errors.length; i++) {\n    var error = this._errors[i];\n    var message = error.message;\n    var count = (counts[message] || 0) + 1;\n\n    counts[message] = count;\n\n    if (count >= mainErrorCount) {\n      mainError = error;\n      mainErrorCount = count;\n    }\n  }\n\n  return mainError;\n};\n","var RetryOperation = require('./retry_operation');\n\nexports.operation = function(options) {\n  var timeouts = exports.timeouts(options);\n  return new RetryOperation(timeouts, {\n      forever: options && (options.forever || options.retries === Infinity),\n      unref: options && options.unref,\n      maxRetryTime: options && options.maxRetryTime\n  });\n};\n\nexports.timeouts = function(options) {\n  if (options instanceof Array) {\n    return [].concat(options);\n  }\n\n  var opts = {\n    retries: 10,\n    factor: 2,\n    minTimeout: 1 * 1000,\n    maxTimeout: Infinity,\n    randomize: false\n  };\n  for (var key in options) {\n    opts[key] = options[key];\n  }\n\n  if (opts.minTimeout > opts.maxTimeout) {\n    throw new Error('minTimeout is greater than maxTimeout');\n  }\n\n  var timeouts = [];\n  for (var i = 0; i < opts.retries; i++) {\n    timeouts.push(this.createTimeout(i, opts));\n  }\n\n  if (options && options.forever && !timeouts.length) {\n    timeouts.push(this.createTimeout(i, opts));\n  }\n\n  // sort the array numerically ascending\n  timeouts.sort(function(a,b) {\n    return a - b;\n  });\n\n  return timeouts;\n};\n\nexports.createTimeout = function(attempt, opts) {\n  var random = (opts.randomize)\n    ? (Math.random() + 1)\n    : 1;\n\n  var timeout = Math.round(random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt));\n  timeout = Math.min(timeout, opts.maxTimeout);\n\n  return timeout;\n};\n\nexports.wrap = function(obj, options, methods) {\n  if (options instanceof Array) {\n    methods = options;\n    options = null;\n  }\n\n  if (!methods) {\n    methods = [];\n    for (var key in obj) {\n      if (typeof obj[key] === 'function') {\n        methods.push(key);\n      }\n    }\n  }\n\n  for (var i = 0; i < methods.length; i++) {\n    var method   = methods[i];\n    var original = obj[method];\n\n    obj[method] = function retryWrapper(original) {\n      var op       = exports.operation(options);\n      var args     = Array.prototype.slice.call(arguments, 1);\n      var callback = args.pop();\n\n      args.push(function(err) {\n        if (op.retry(err)) {\n          return;\n        }\n        if (err) {\n          arguments[0] = op.mainError();\n        }\n        callback.apply(this, arguments);\n      });\n\n      op.attempt(function() {\n        original.apply(obj, args);\n      });\n    }.bind(obj, original);\n    obj[method].options = options;\n  }\n};\n","module.exports = require('./lib/retry');","export { ConsoleLogger } from './core'\nexport * as Exceptions from './exceptions'\nexport * as Requests from './requests'\nexport * as Responses from './responses'\nexport { ProtocolVersion } from './types'\nexport {\n    DataGramDirection,\n    KeyCategory,\n    KeyPowerStatus,\n    KeyType,\n    LEDBackgroundBrightness,\n    LockStatus,\n    NodeType,\n} from './utilities/Enums'\nexport { VitreaClient } from './VitreaClient'\n","export const KeyPowerStatus = {\n    ON: 0x4f,\n    OFF: 0x46,\n    LONG: 0x4c,\n    SHORT: 0x53,\n    RELEASED: 0x52,\n} as const\n\nexport const LEDBackgroundBrightness = {\n    OFF: 0,\n    LOW: 1,\n    NORMAL: 2,\n    HIGH: 3,\n    MAX: 4,\n} as const\n\nexport const LockStatus = {\n    UNLOCKED: 0,\n    LOCKED: 1,\n} as const\n\nexport const DataGramDirection = {\n    OUTGOING: 0x3e,\n    INCOMING: 0x3c,\n} as const\n\nexport const KeyType = {\n    NOT_EXIST: 0,\n    NOT_ACTIVE: 1,\n    TOGGLE: 2,\n    BLIND: 3,\n    PUSH_BUTTON: 4,\n    DIMMER: 5,\n    DIMMER_MW: 10,\n    BLIND_MW: 11,\n    SATELLITE: 12,\n    TOGGLE_SCENE: 13,\n    DUAL_POLE: 14,\n    BOILER: 15,\n    REPEATER: 16,\n    THERMOSTAT: 17,\n    ALL_NODES: 101,\n} as const\n\nexport const KeyCategory = {\n    UNDEFINED: 0,\n    LIGHT: 1,\n    FAN: 6,\n    BOILER: 7,\n    AUDIO: 8,\n    SCENARIO: 11,\n} as const\n\nexport const NodeType = {\n    VT_MW3_SR1_10A: 1,\n    VT_MW3_SR2_10A: 2,\n    VT_MW3_SR3_10A: 3,\n    Module2Toggle2: 4,\n    VT_MW4_SR4_10A: 5,\n    VT_MW3_UD1_6A: 6,\n    VT_MW3_UD2_6A: 7,\n    VT_MW3_UD3_6A: 8,\n    Module4Buttons4Blinds: 9,\n    VT_MW4_UD4_6A: 10,\n    VT_MW3_ST3_01: 11,\n    VT_MW3_ST6_02: 12,\n    VT_MW3_ST8_02: 13,\n    VT_MW4_ST4_01: 14,\n    VT_MW4_ST8_02: 15,\n    VT_MW3_VEN3_24V_01: 16,\n    VT_MW4_VEN4_24V_01: 17,\n    VT_MW3_UD1_SR2_10A: 18,\n    VT_MW3_UD2_SR1_10A: 19,\n    VT_MW3_SR3_ST3_10A: 20,\n    VT_MW4_SR4_ST4_10A: 21,\n    VT_MW3_T6_6A: 22,\n    VT_MW4_T8_6A: 23,\n    VT_MW4_UD1_SR3_10A: 24,\n    VT_MW4_UD2_SR2_10A: 25,\n    VT_MW3_NO3_10A: 26,\n    VT_MW4_NO4_10A: 27,\n    VT_MW3_NO6_6A: 28,\n    VT_MW4_NO8_6A: 29,\n    VT_MW3_DP1_16A: 30,\n    VT_MW3_NO1_10A: 31,\n    VT_MW3_DM1_400W: 32,\n    VT_MW3_DM1_M2_400W: 33,\n    VT_MW3_DM3_ST3_400W: 34,\n    VT_MW3_DM3_ST3_0_10V: 35,\n    VT_MW4_DM4_ST4_0_10V: 36,\n    VT_MW3_DM3_400W: 37,\n    Module3Dimmers2Option64: 38,\n    Module3Dimmers2Option64Satellite2: 39,\n    VT_MW3_DM3_0_10V: 40,\n    VT_MW4_DM4_0_10V: 41,\n    VT_MW4_DM4_400W: 42,\n    VT_MW4_DM4_ST4_400W: 43,\n    VT_MW3_DPS_16A: 49,\n    TemperatureSensor: 50,\n    MovementSensor: 51,\n    MotionDetector: 52,\n    HumiditySensor: 53,\n    FloodDetector: 54,\n    RainDetector: 55,\n    SmokeDetector: 56,\n    NormallyOpenInput: 57,\n    GardenFaucet: 60,\n    VT_MWR_RPT_A_2: 61,\n    VT_DIN6_IN08_W_01: 63,\n    VT_DIN6_DM4_H_W_01: 64,\n    VT_DIN6_DM2_H_W_01: 65,\n    VT_DIN6_DM4_A_W_01: 66,\n    VT_DIN6_DM4_U_W_01: 67,\n    VT_DIN6_DM2_A_W_01: 68,\n    VT_DIN6_DM2_U_W_01: 69,\n    VT_MW3_DM1_500W_LT: 70,\n    VT_MW3_DM1_M2_500W_LT: 71,\n    VT_MW3_DM3_800W_LT: 72,\n    VT_MW3_DM3_ST3_800W_LT: 73,\n    VT_MW4_DM4_800W_LT: 74,\n    VT_MW4_DM4_ST4_800W_LT: 75,\n    VT_MW3_DM3_010V_R: 76,\n    VT_MW3_DM3_ST3_010V_R: 77,\n    VT_MW4_DM4_010V_R: 78,\n    VT_MW4_DM4_ST4_010V_R: 79,\n    VT_MW3_TMST_H_01: 80,\n    VT_MW3_TMST_V_01: 81,\n    VT_MW4_TMST_ST3_H_01: 82,\n    VT_MW3_TMSF_H_02: 83,\n    VT_MW3_TMSF_V_02: 84,\n    VT_MW3_DM1_ST2_500W_LT: 85,\n    VT_MW3_TMST_H_02: 86,\n    VT_MW3_TMST_V_02: 87,\n    VT_MW4_TMST_ST3_H_02: 88,\n    VT_DIN6_NO08_W_01: 90,\n    VT_MW3_DM1_01: 91,\n    VT_MW3_DM1_ST2_01: 92,\n    VT_MW3_DM2_SR1_01: 93,\n    VT_MW3_DM2_SR1_ST3_1: 94,\n    VT_MW4_DM2_SR2_01: 95,\n    VT_MW4_DM2_SR2_ST4_01: 96,\n    VT_AW1_11003_T1B0S0_01: 101,\n    VT_AW1_11003_T1B0S2_01: 102,\n    VT_AW2_22006_T2B0S0_01: 103,\n    VT_AW2_22006_T2B0S2_01: 104,\n    VT_AW1_10003_T1B0S0_01: 105,\n    VT_AW1_10003_T1B0S2_01: 106,\n    VT_AW2_20006_T2B0S0_01: 107,\n    VT_AW2_20006_T2B0S2_01: 108,\n    VT_AW1_21003_T2B1S0_01: 120,\n    VT_AW1_21003_T2B1S1_01: 121,\n    VT_AW2_44006_T4B2S0_01: 122,\n    VT_AW2_44006_T4B2S2_01: 123,\n    VT_AW2_44008_T4B2S4_01: 124,\n    VT_AW1_20003_T2B1S0_01: 125,\n    VT_AW1_20003_T2B1S1_01: 126,\n    VT_AW2_40006_T4B2S0_01: 127,\n    VT_AW2_40006_T4B2S2_01: 128,\n    VT_AW2_40008_T4B2S4_01: 129,\n    VT_AW1_00003_T0B0S3_01: 130,\n    VT_AW1_00008_T0B0S8_01: 131,\n    VT_AW2_00006_T0B0S6_01: 132,\n    VT_AW2_00008_T0B0S8_01: 133,\n    VT_UW1_01103_D1B0S0_01: 141,\n    VT_UW1_01103_F1B0S0_01: 142,\n    VT_UW1_01103_D1B0S2_01: 143,\n    VT_UW2_02206_D2B0S0_01: 144,\n    VT_UW2_02206_D2B0S2_01: 146,\n    VT_UW2_02206_D2B0S4_01: 147,\n    VT_UW2_02208_D2B0S6_01: 148,\n    VT_AW1_01103_D1B0S0_01: 161,\n    VT_AW1_01103_F1B0S0_01: 162,\n    VT_AW1_01103_D1B0S2_01: 163,\n    VT_AW2_02206_D2B0S0_01: 164,\n    VT_AW2_02206_D2B0S2_01: 165,\n    VT_AW2_02206_D2B0S4_01: 166,\n    VT_AW2_02208_D2B0S6_01: 167,\n    VT_AW1_00013_T0C1S0_01: 180,\n    VT_AW1_00013_T0C1S2_01: 181,\n    VT_AW1_00023_T0C2S0_01: 182,\n    VT_AW1_00023_T0C2S1_01: 183,\n    VT_AW2_00046_T0C4S0_01: 184,\n    VT_AW2_00046_T0C4S2_01: 185,\n    VT_AW2_00048_T0C4S4_01: 186,\n    VT_G2_TMS_485_GEN_01: 190,\n    VT_G2_TMS_485_GNR_01: 191,\n    VT_G2_TMS_485_CT4_01: 192,\n    VT_G2_TMSF_485_GNR_01: 193,\n    VT_BW1_11003_T1B0S0_01: 200,\n    VT_BW1_11003_T1B0S2_01: 201,\n    VT_BW1_21003_T2B0S0_01: 202,\n    VT_BW1_21003_T2B0S1_01: 203,\n    VT_BW1_31003_T3B0S0_01: 204,\n    VT_BW1_31006_T3B0S3_01: 205,\n    VT_BW1_30006_T0B1S0_01: 206,\n    VT_BW1_40006_T0B2S0_01: 207,\n    VT_BW1_40006_T0B2S2_01: 208,\n    VT_BW1_00003_T0B0S3_01: 209,\n    VT_BW1_00006_T0B0S6_01: 210,\n    VT_BW1_00008_T0B0S8_01: 211,\n    VT_BW1_01103_D1B0S0_01: 212,\n    VT_BW1_01103_D1B0S2_01: 213,\n    VT_BW1_02203_D2B0S0_01: 214,\n    VT_BW1_02206_D2B0S2_01: 215,\n    VT_BW1_20013_T1C1S0_01: 216,\n    VT_BW1_20013_T2C1S1_01: 217,\n    VT_BW1_2000B_DP0000_01: 218,\n    VT_BW1_20003_DP0000_01: 219,\n    VT_BW1_0000T_TM0000_01: 220,\n    VT_BW1_4000T_TMC0P0_01: 221,\n    VT_BW1_2000T_THC0P1_01: 222,\n    VT_BW1_20003_NOC0P0_01: 223,\n    VT_BW1_12103_D1T1S0_01: 225,\n    VT_BW1_12106_D1T1S2_01: 226,\n    VT_BW1_02203_D2B0S0_02: 227,\n    VT_BW1_02206_D2B0S2_02: 228,\n} as const\n\nexport type KeyPowerStatus =\n    (typeof KeyPowerStatus)[keyof typeof KeyPowerStatus]\nexport type LEDBackgroundBrightness =\n    (typeof LEDBackgroundBrightness)[keyof typeof LEDBackgroundBrightness]\nexport type LockStatus = (typeof LockStatus)[keyof typeof LockStatus]\nexport type DataGramDirection =\n    (typeof DataGramDirection)[keyof typeof DataGramDirection]\nexport type KeyType = (typeof KeyType)[keyof typeof KeyType]\nexport type KeyCategory = (typeof KeyCategory)[keyof typeof KeyCategory]\nexport type NodeType = (typeof NodeType)[keyof typeof NodeType]\n","// biome-ignore lint/complexity/noStaticOnlyClass: Static utility class pattern is intentional\nexport class MessageID {\n    static messageIDIndex = 0\n\n    static resetID(baseID = 0x00): void {\n        MessageID.messageIDIndex = baseID\n    }\n\n    static getNextID(): number {\n        MessageID.messageIDIndex++\n\n        if (MessageID.messageIDIndex > 0xff) {\n            MessageID.messageIDIndex = 0x01\n        }\n\n        return MessageID.messageIDIndex\n    }\n\n    static setNextID(nextID: number) {\n        MessageID.resetID(nextID - 1)\n    }\n}\n","// biome-ignore lint/complexity/noStaticOnlyClass: Static utility class pattern is intentional\nexport class Events {\n    public static readonly STATUS_UPDATE: string = 'vitrea::status::update'\n    public static readonly UNKNOWN_DATA: string = 'vitrea::data::unknown'\n\n    public static acknowledgement(messageID: number): string {\n        return Events.generate(0x00, messageID)\n    }\n\n    public static generate(...keys: string[] | number[]): string {\n        const toJoin = keys.map(key => key.toString(16).padStart(2, '0'))\n\n        return `data::${toJoin.join('-')}`\n    }\n}\n","import type { LogMeta } from '../types'\nimport { DataGramDirection } from '../utilities/Enums'\nimport { Events } from '../utilities/Events'\n\nexport abstract class DataGram {\n    /**\n     * The index of the datagram that contains the direction of the transmission.\n     */\n    static readonly directionIndex = 3\n\n    /**\n     * The index of the datagram that contains the command ID.\n     */\n    static readonly commandIDIndex = 4\n\n    /**\n     * The index of the datagram that contains the data's length.\n     */\n    static readonly dataLengthIndex = 5\n\n    /**\n     * The index of the datagram that contains the message ID.\n     */\n    static readonly messageIDIndex = 7\n\n    /**\n     * The index of the datagram that contains the message data.\n     */\n    static readonly dataIndex = 8\n\n    /**\n     * The first 3 bytes of every `DataGram`.\n     */\n    protected static readonly prefix = [0x56, 0x54, 0x55]\n\n    protected readonly buffer: number[]\n\n    public constructor(rawBuffer?: Buffer | number[]) {\n        this.buffer = rawBuffer ? [...rawBuffer] : [...this.$self.prefix]\n    }\n\n    public get(index: number) {\n        return this.buffer[index]\n    }\n\n    public getData(): number[] {\n        return [...this.data]\n    }\n\n    // biome-ignore lint/suspicious/noExplicitAny: Magic\n    protected get $self(): Record<string, any> {\n        return this.constructor\n    }\n\n    protected toHex(number: number): string {\n        const formatted = number.toString(16).padStart(2, '0').toUpperCase()\n\n        return ['0x', formatted].join('')\n    }\n\n    protected toHexString(buffer?: number[]): string {\n        buffer = buffer ?? this.buffer\n\n        return buffer\n            .map(entry => this.toHex(entry).replace('0x', ''))\n            .join(':')\n    }\n\n    protected bufferToString(offset: number): string {\n        const slice = this.buffer.slice(offset)\n\n        return Buffer.from(slice).toString('utf16le')\n    }\n\n    protected get length() {\n        return this.buffer.length\n    }\n\n    get direction(): DataGramDirection {\n        return this.get(this.$self.directionIndex) as DataGramDirection\n    }\n\n    /**\n     * The checksum for the datagram.\n     */\n    get checksum() {\n        return this.buffer.reduce((sum, curr) => (sum + curr) & 0xff)\n    }\n\n    /**\n     * The command ID for the datagram.\n     */\n    get commandID() {\n        return this.get(this.$self.commandIDIndex)\n    }\n\n    /**\n     * The message ID for the datagram.\n     */\n    get messageID() {\n        return this.get(this.$self.messageIDIndex)\n    }\n\n    protected get data() {\n        if (this.hasData) {\n            return this.buffer.slice(this.$self.dataIndex)\n        }\n\n        return []\n    }\n\n    public get hasData() {\n        return this.length > this.$self.dataIndex\n    }\n\n    public get dataLength(): [number, number] {\n        const length = this.data.length + 2\n\n        return [(length >> 8) & 0xff, length & 0xff]\n    }\n\n    public get eventName() {\n        return Events.generate(this.commandID, this.messageID)\n    }\n\n    public get commandName() {\n        return this.$self.name\n    }\n\n    protected get toLog() {\n        return {}\n    }\n\n    public get logData(): LogMeta {\n        return {\n            command: this.commandName,\n            direction:\n                DataGramDirection.INCOMING === this.direction\n                    ? 'Incoming'\n                    : 'Outgoing',\n            commandID: this.toHex(this.commandID),\n            messageID: this.toHex(this.messageID),\n            ...this.toLog,\n            raw: this.toHexString(),\n        }\n    }\n}\n","import { DataGramDirection } from '../utilities/Enums'\nimport { MessageID } from '../utilities/MessageID'\nimport { DataGram } from './DataGram'\n\nexport abstract class BaseRequest extends DataGram {\n    constructor(commandID = 0x00, data?: number[]) {\n        super()\n\n        this.buffer.push(DataGramDirection.OUTGOING, commandID)\n\n        this.buffer[this.$self.messageIDIndex] = MessageID.getNextID()\n\n        if (Array.isArray(data)) {\n            this.buffer.push(...data)\n        }\n\n        this.setDataLength()\n    }\n\n    protected setDataLength() {\n        this.buffer.splice(this.$self.dataLengthIndex, 2, ...this.dataLength)\n    }\n\n    public build() {\n        return Buffer.from(this.buffer.concat(this.checksum))\n    }\n\n    public clone(): this {\n        const builder = this.constructor as new (\n            ...args: ConstructorParameters<typeof BaseRequest>\n        ) => this\n\n        return new builder(this.commandID, this.getData())\n    }\n\n    protected override get toLog() {\n        return { data: this.toHexString(this.data) }\n    }\n}\n","import { DataGram } from './DataGram'\n\nexport abstract class BaseResponse extends DataGram {\n    protected readonly rawChecksum: number\n\n    constructor(rawBuffer: Buffer | number[]) {\n        super(Array.from(rawBuffer))\n        this.rawChecksum = this.buffer.pop() as number\n    }\n\n    public override get dataLength(): [number, number] {\n        const start = this.$self.dataLengthIndex\n\n        return [this.get(start), this.get(start + 1)]\n    }\n\n    public get hasValidChecksum() {\n        return this.checksum === this.rawChecksum\n    }\n\n    protected override get toLog() {\n        return { hasValidChecksum: this.hasValidChecksum }\n    }\n}\n","import type { LogMeta, LoggerContract } from '../types'\n\nexport class ConsoleLogger implements LoggerContract<LogMeta> {\n    public log(message: string, level: string) {\n        console.log(message, { level })\n    }\n\n    public error(message: string, ...args: LogMeta[]) {\n        console.error(message, ...args)\n    }\n\n    public warn(message: string, ...args: LogMeta[]) {\n        console.warn(message, ...args)\n    }\n\n    public info(message: string, ...args: LogMeta[]) {\n        console.info(message, ...args)\n    }\n\n    public debug(message: string, ...args: LogMeta[]) {\n        console.debug(message, ...args)\n    }\n}\n","import type { LogMeta, LoggerContract } from '../types'\n\nexport class NullLogger implements LoggerContract<LogMeta> {\n    public log(_message: string, _level: string) {}\n\n    public error(_message: string, ..._args: LogMeta[]) {}\n\n    public warn(_message: string, ..._args: LogMeta[]) {}\n\n    public info(_message: string, ..._args: LogMeta[]) {}\n\n    public debug(_message: string, ..._args: LogMeta[]) {}\n}\n","export { ConnectionExistsException } from './ConnectionExistsException'\nexport { NoConnectionException } from './NoConnectionException'\n","export class ConnectionExistsException extends Error {\n    public constructor(message = 'No socket connection established') {\n        super(message)\n    }\n}\n","export class NoConnectionException extends Error {\n    public constructor(message = 'Socket connection already exists') {\n        super(message)\n    }\n}\n","import { Heartbeat } from './Heartbeat'\nimport { InternalUnitStatuses } from './InternalUnitStatuses'\nimport { KeyParameters } from './KeyParameters'\nimport { KeyStatus } from './KeyStatus'\nimport { Login } from './Login'\nimport { NodeCount } from './NodeCount'\nimport { NodeMetaData } from './NodeMetaData'\nimport { NodeStatus } from './NodeStatus'\nimport { RoomCount } from './RoomCount'\nimport { RoomMetaData } from './RoomMetaData'\nimport { ToggleHeartbeat } from './ToggleHeartbeat'\nimport { ToggleKeyStatus } from './ToggleKeyStatus'\nimport { ToggleNodeStatus } from './ToggleNodeStatus'\n\nexport {\n    Heartbeat,\n    InternalUnitStatuses,\n    KeyParameters,\n    KeyStatus,\n    Login,\n    NodeCount,\n    NodeMetaData,\n    NodeStatus,\n    RoomCount,\n    RoomMetaData,\n    ToggleNodeStatus,\n    ToggleKeyStatus,\n    ToggleHeartbeat,\n}\n","import { BaseRequest } from '../core'\nimport { Events } from '../utilities/Events'\n\nexport class AcknowledgeRequest extends BaseRequest {\n    public override get eventName(): string {\n        return Events.acknowledgement(this.messageID)\n    }\n}\n","import { AcknowledgeRequest } from './AcknowledgeRequest'\n\nexport class Heartbeat extends AcknowledgeRequest {\n    constructor() {\n        super(0x07)\n    }\n}\n","export const CommandID = {\n    Login: 0x01,\n    RoomMetaData: 0x1a,\n    RoomCount: 0x1d,\n    ToggleNodeStatus: 0x1e,\n    NodeMetaData: 0x1f,\n    NodeCount: 0x24,\n    KeyStatus: 0x29,\n    KeyParameters: 0x2b,\n    Acknowledgement: 0x00,\n    NodeExistenceStatus: 0xc8,\n    InternalUnitStatuses: 0x60,\n} as const\n\nexport type CommandID = (typeof CommandID)[keyof typeof CommandID]\n","export const ProtocolVersion = {\n    V1: 'v1',\n    V2: 'v2',\n} as const\n\nexport type ProtocolVersion =\n    (typeof ProtocolVersion)[keyof typeof ProtocolVersion]\n","import { BaseRequest } from '../core'\nimport { CommandID } from '../types'\n\nexport class InternalUnitStatuses extends BaseRequest {\n    constructor() {\n        super(CommandID.InternalUnitStatuses)\n    }\n}\n","import { BaseRequest } from '../core'\nimport { CommandID } from '../types'\n\nexport class KeyParameters extends BaseRequest {\n    constructor(nodeID: number, keyID: number) {\n        super(CommandID.KeyParameters, [nodeID, keyID])\n    }\n}\n","import { BaseRequest } from '../core'\nimport { CommandID } from '../types'\nimport { Events } from '../utilities/Events'\n\nexport class KeyStatus extends BaseRequest {\n    constructor(nodeID: number, keyID: number) {\n        super(CommandID.KeyStatus, [nodeID, keyID])\n    }\n\n    public override get eventName(): string {\n        return Events.STATUS_UPDATE\n    }\n}\n","import { CommandID } from '../types'\nimport { AcknowledgeRequest } from './AcknowledgeRequest'\n\nexport class Login extends AcknowledgeRequest {\n    constructor(username: string, password: string) {\n        super(CommandID.Login, [\n            Buffer.from(username, 'utf16le').length,\n            ...Buffer.from(username, 'utf16le'),\n            Buffer.from(password, 'utf16le').length,\n            ...Buffer.from(password, 'utf16le'),\n        ])\n    }\n}\n","import { BaseRequest } from '../core'\nimport { CommandID } from '../types'\n\nexport class NodeCount extends BaseRequest {\n    constructor() {\n        super(CommandID.NodeCount)\n    }\n}\n","import { BaseRequest } from '../core'\nimport { CommandID } from '../types'\n\nexport class NodeMetaData extends BaseRequest {\n    constructor(nodeID: number) {\n        super(CommandID.NodeMetaData, [nodeID])\n    }\n}\n","import { BaseRequest } from '../core'\n\nexport class NodeStatus extends BaseRequest {\n    constructor(nodeID: number) {\n        super(0x23, [nodeID, 0x00])\n    }\n}\n","import { BaseRequest } from '../core'\nimport { CommandID } from '../types'\n\nexport class RoomCount extends BaseRequest {\n    constructor() {\n        super(CommandID.RoomCount)\n    }\n}\n","import { BaseRequest } from '../core'\nimport { CommandID } from '../types'\n\nexport class RoomMetaData extends BaseRequest {\n    constructor(roomID: number) {\n        super(CommandID.RoomMetaData, [roomID])\n    }\n}\n","import { AcknowledgeRequest } from './AcknowledgeRequest'\n\nexport class ToggleHeartbeat extends AcknowledgeRequest {\n    constructor(enable = true, unsolicited = true) {\n        super(0x08, [Number(enable), Number(unsolicited)])\n    }\n}\n","import { BaseRequest } from '../core'\nimport type { Ratio } from '../types'\nimport type { KeyPowerStatus } from '../utilities/Enums'\nimport { Events } from '../utilities/Events'\n\nconst toByteArray = (seconds: number) => [(seconds >> 8) & 0xff, seconds & 0xff]\n\nexport class ToggleKeyStatus extends BaseRequest {\n    constructor(\n        nodeID: number,\n        keyID: number,\n        status: KeyPowerStatus,\n        options: Partial<{ dimmerRatio: Ratio<101>; timer: number }> = {\n            dimmerRatio: 0,\n            timer: 0,\n        },\n    ) {\n        super(0x28, [\n            nodeID,\n            keyID,\n            status,\n            options.dimmerRatio,\n            ...toByteArray(options.timer),\n        ])\n    }\n\n    public override get eventName(): string {\n        return Events.acknowledgement(this.messageID)\n    }\n}\n","import { CommandID } from '../types'\nimport type { LEDBackgroundBrightness, LockStatus } from '../utilities/Enums'\nimport { AcknowledgeRequest } from './AcknowledgeRequest'\n\nexport class ToggleNodeStatus extends AcknowledgeRequest {\n    constructor(\n        nodeNo: number,\n        lockStatus: LockStatus,\n        ledLevel: LEDBackgroundBrightness,\n    ) {\n        super(CommandID.ToggleNodeStatus, [nodeNo, lockStatus, ledLevel])\n    }\n}\n","import { Acknowledgement } from './Acknowledgement'\nimport { GenericUnusedResponse } from './GenericUnusedResponse'\nimport { InternalUnitStatuses } from './InternalUnitStatuses'\nimport { KeyParameters } from './KeyParameters'\nimport { KeyParametersV2 } from './KeyParametersV2'\nimport { KeyStatus } from './KeyStatus'\nimport { NodeCount } from './NodeCount'\nimport { NodeMetaData } from './NodeMetaData'\nimport { NodeMetaDataV2 } from './NodeMetaDataV2'\nimport { RoomCount } from './RoomCount'\nimport { RoomMetaData } from './RoomMetaData'\n\nexport {\n    Acknowledgement,\n    GenericUnusedResponse,\n    InternalUnitStatuses,\n    KeyParameters,\n    KeyParametersV2,\n    KeyStatus,\n    NodeCount,\n    NodeMetaData,\n    NodeMetaDataV2,\n    RoomCount,\n    RoomMetaData,\n}\n","import { BaseResponse } from '../core'\n\nexport class Acknowledgement extends BaseResponse {}\n","import { BaseResponse } from '../core'\n\nexport class GenericUnusedResponse extends BaseResponse {}\n","import { BaseResponse } from '../core'\n\nexport class InternalUnitStatuses extends BaseResponse {}\n","import { BaseResponse } from '../core'\nimport type { KeyCategory } from '../utilities/Enums'\n\nexport class KeyParameters extends BaseResponse {\n    protected static readonly nodeIDIndex = 8\n    protected static readonly keyIDIndex = 9\n    protected static readonly categoryIndex = 11\n    protected static readonly nameIndex: number = 20\n\n    public get name() {\n        return this.bufferToString(this.$self.nameIndex)\n    }\n\n    public get nodeID(): number {\n        return this.get(this.$self.nodeIDIndex)\n    }\n\n    public get keyID() {\n        return this.get(this.$self.keyIDIndex)\n    }\n\n    public get category(): KeyCategory {\n        return this.get(this.$self.categoryIndex) as KeyCategory\n    }\n\n    protected override get toLog() {\n        return {\n            ...super.toLog,\n            name: this.name,\n            nodeID: this.nodeID,\n            keyID: this.keyID,\n            category: this.category,\n        }\n    }\n}\n","import { KeyParameters } from './KeyParameters'\n\nexport class KeyParametersV2 extends KeyParameters {\n    protected static readonly nameIndex = 21\n}\n","import { BaseResponse } from '../core'\nimport { KeyPowerStatus } from '../utilities/Enums'\nimport { Events } from '../utilities/Events'\n\nexport class KeyStatus extends BaseResponse {\n    protected static readonly nodeIDIndex = 8\n    protected static readonly keyIDIndex = 9\n    protected static readonly powerIndex = 10\n\n    get nodeID() {\n        return this.get(this.$self.nodeIDIndex)\n    }\n\n    get keyID() {\n        return this.get(this.$self.keyIDIndex)\n    }\n\n    get power(): KeyPowerStatus {\n        return this.get(this.$self.powerIndex) as KeyPowerStatus\n    }\n\n    get isOn() {\n        return this.power === KeyPowerStatus.ON\n    }\n\n    get isOff() {\n        return this.power === KeyPowerStatus.OFF\n    }\n\n    get isReleased() {\n        return this.power === KeyPowerStatus.RELEASED\n    }\n\n    public override get eventName(): string {\n        return Events.STATUS_UPDATE\n    }\n}\n","import { BaseResponse } from '../core'\n\nexport class NodeCount extends BaseResponse {\n    get total() {\n        return this.list.length\n    }\n\n    get list() {\n        return this.data.slice(1)\n    }\n\n    protected override get toLog() {\n        return {\n            ...super.toLog,\n            total: this.total,\n            list: this.list,\n        }\n    }\n}\n","import { BaseResponse } from '../core'\nimport {\n    type KeyType,\n    type LEDBackgroundBrightness,\n    LockStatus,\n    NodeType,\n} from '../utilities/Enums'\n\nexport class NodeMetaData extends BaseResponse {\n    protected static readonly idIndex = 8\n    protected static readonly macAddressIndex = 9\n    protected static readonly typeIndex: number = 17\n    protected static readonly totalKeysIndex: number = 18\n    protected static readonly offsetStartIndex: number = 19\n    protected static readonly rawLockedStateIndex = 0\n    protected static readonly rawLEDLevelIndex = 1\n    protected static readonly rawVersionIndex = 3\n    protected static readonly rawRoomIDIndex = 7\n\n    protected offset(byIndex: number) {\n        return this.$self.offsetStartIndex + this.totalKeys + byIndex\n    }\n\n    protected atOffset(byIndex: number) {\n        return this.get(this.offset(byIndex))\n    }\n\n    get id() {\n        return this.get(this.$self.idIndex)\n    }\n\n    get roomID() {\n        return this.atOffset(this.$self.rawRoomIDIndex)\n    }\n\n    get type(): NodeType {\n        return this.get(this.$self.typeIndex) as NodeType\n    }\n\n    get model(): string {\n        const modelEntry = Object.entries(NodeType).find(\n            ([, value]) => value === this.type,\n        )\n\n        return modelEntry\n            ? modelEntry[0].replace(/_/g, '-')\n            : `Unknown-${this.type}`\n    }\n\n    get version() {\n        const offset = this.offset(this.$self.rawVersionIndex)\n        const [version, subversion, patch] = this.buffer.slice(\n            offset,\n            offset + 3,\n        )\n\n        return `${version}.${subversion}${patch}`\n    }\n\n    get macAddress() {\n        const start = this.$self.macAddressIndex\n\n        return this.toHexString(this.buffer.slice(start, start + 8))\n    }\n\n    get totalKeys() {\n        return this.get(this.$self.totalKeysIndex)\n    }\n\n    get keysList() {\n        return Array.from({ length: this.totalKeys }, (_, i) => ({\n            id: i,\n            type: this.atOffset(i) as KeyType,\n        }))\n    }\n\n    get isLocked() {\n        const byIndex = this.$self.rawLockedStateIndex\n\n        return this.atOffset(byIndex) === LockStatus.LOCKED\n    }\n\n    get ledLevel(): LEDBackgroundBrightness {\n        return this.atOffset(\n            this.$self.rawLEDLevelIndex,\n        ) as LEDBackgroundBrightness\n    }\n\n    protected override get toLog() {\n        return {\n            ...super.toLog,\n            nodeID: this.id,\n            totalKeys: this.totalKeys,\n            isLocked: this.isLocked,\n            keysList: this.keysList,\n            type: this.type,\n            model: this.model,\n            version: this.version,\n            macAddress: this.macAddress,\n            ledLevel: this.ledLevel,\n        }\n    }\n}\n","import type { KeyType } from '../utilities/Enums'\nimport { NodeMetaData } from './NodeMetaData'\n\nexport class NodeMetaDataV2 extends NodeMetaData {\n    protected static readonly typeIndex = 18\n    protected static readonly totalKeysIndex = 19\n    protected static readonly offsetStartIndex = 20\n\n    get keysList() {\n        return Array.from({ length: this.totalKeys }, (_, i) => ({\n            id: i,\n            type: this.get(this.$self.offsetStartIndex + i) as KeyType,\n        }))\n    }\n}\n","import { BaseResponse } from '../core'\n\nexport class RoomCount extends BaseResponse {\n    public get total() {\n        return this.list.length\n    }\n\n    public get list() {\n        return this.data.slice(1)\n    }\n}\n","import { BaseResponse } from '../core'\n\nexport class RoomMetaData extends BaseResponse {\n    protected static readonly idIndex = 8\n    protected static readonly nameIndex: number = 11\n\n    get name() {\n        return this.bufferToString(this.$self.nameIndex)\n    }\n\n    get id() {\n        return this.get(this.$self.idIndex)\n    }\n}\n","export class TimeoutError extends Error {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tthis.name = 'TimeoutError';\n\t}\n}\n\n/**\nAn error to be thrown when the request is aborted by AbortController.\nDOMException is thrown instead of this Error when DOMException is available.\n*/\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\n/**\nTODO: Remove AbortError and just throw DOMException when targeting Node 18.\n*/\nconst getDOMException = errorMessage => globalThis.DOMException === undefined\n\t? new AbortError(errorMessage)\n\t: new DOMException(errorMessage);\n\n/**\nTODO: Remove below function and just 'reject(signal.reason)' when targeting Node 18.\n*/\nconst getAbortedReason = signal => {\n\tconst reason = signal.reason === undefined\n\t\t? getDOMException('This operation was aborted.')\n\t\t: signal.reason;\n\n\treturn reason instanceof Error ? reason : getDOMException(reason);\n};\n\nexport default function pTimeout(promise, options) {\n\tconst {\n\t\tmilliseconds,\n\t\tfallback,\n\t\tmessage,\n\t\tcustomTimers = {setTimeout, clearTimeout},\n\t} = options;\n\n\tlet timer;\n\tlet abortHandler;\n\n\tconst wrappedPromise = new Promise((resolve, reject) => {\n\t\tif (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {\n\t\t\tthrow new TypeError(`Expected \\`milliseconds\\` to be a positive number, got \\`${milliseconds}\\``);\n\t\t}\n\n\t\tif (options.signal) {\n\t\t\tconst {signal} = options;\n\t\t\tif (signal.aborted) {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t}\n\n\t\t\tabortHandler = () => {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t};\n\n\t\t\tsignal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\tif (milliseconds === Number.POSITIVE_INFINITY) {\n\t\t\tpromise.then(resolve, reject);\n\t\t\treturn;\n\t\t}\n\n\t\t// We create the error outside of `setTimeout` to preserve the stack trace.\n\t\tconst timeoutError = new TimeoutError();\n\n\t\ttimer = customTimers.setTimeout.call(undefined, () => {\n\t\t\tif (fallback) {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(fallback());\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof promise.cancel === 'function') {\n\t\t\t\tpromise.cancel();\n\t\t\t}\n\n\t\t\tif (message === false) {\n\t\t\t\tresolve();\n\t\t\t} else if (message instanceof Error) {\n\t\t\t\treject(message);\n\t\t\t} else {\n\t\t\t\ttimeoutError.message = message ?? `Promise timed out after ${milliseconds} milliseconds`;\n\t\t\t\treject(timeoutError);\n\t\t\t}\n\t\t}, milliseconds);\n\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tresolve(await promise);\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\t\t})();\n\t});\n\n\tconst cancelablePromise = wrappedPromise.finally(() => {\n\t\tcancelablePromise.clear();\n\t\tif (abortHandler && options.signal) {\n\t\t\toptions.signal.removeEventListener('abort', abortHandler);\n\t\t}\n\t});\n\n\tcancelablePromise.clear = () => {\n\t\tcustomTimers.clearTimeout.call(undefined, timer);\n\t\ttimer = undefined;\n\t};\n\n\treturn cancelablePromise;\n}\n","import pTimeout from 'p-timeout';\n\nconst normalizeEmitter = emitter => {\n\tconst addListener = emitter.addEventListener || emitter.on || emitter.addListener;\n\tconst removeListener = emitter.removeEventListener || emitter.off || emitter.removeListener;\n\n\tif (!addListener || !removeListener) {\n\t\tthrow new TypeError('Emitter is not compatible');\n\t}\n\n\treturn {\n\t\taddListener: addListener.bind(emitter),\n\t\tremoveListener: removeListener.bind(emitter),\n\t};\n};\n\nexport function pEventMultiple(emitter, event, options) {\n\tlet cancel;\n\tconst returnValue = new Promise((resolve, reject) => {\n\t\toptions = {\n\t\t\trejectionEvents: ['error'],\n\t\t\tmultiArgs: false,\n\t\t\trejectionMultiArgs: false,\n\t\t\tresolveImmediately: false,\n\t\t\t...options,\n\t\t};\n\n\t\tif (!(options.count >= 0 && (options.count === Number.POSITIVE_INFINITY || Number.isInteger(options.count)))) {\n\t\t\tthrow new TypeError('The `count` option should be at least 0 or more');\n\t\t}\n\n\t\toptions.signal?.throwIfAborted();\n\n\t\t// Allow multiple events\n\t\tconst events = [event].flat();\n\n\t\tconst items = [];\n\t\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\t\tconst onItem = async (...arguments_) => {\n\t\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\t\tif (options.filter) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(await options.filter(value))) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titems.push(value);\n\n\t\t\tif (options.count === items.length) {\n\t\t\t\tcancel();\n\t\t\t\tresolve(items);\n\t\t\t}\n\t\t};\n\n\t\tconst rejectHandler = (...arguments_) => {\n\t\t\tcancel();\n\t\t\treject(options.rejectionMultiArgs ? arguments_ : arguments_[0]);\n\t\t};\n\n\t\tcancel = () => {\n\t\t\tfor (const event of events) {\n\t\t\t\tremoveListener(event, onItem);\n\t\t\t}\n\n\t\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t\t// Only remove rejection handler if we actually registered it\n\t\t\t\tif (!events.includes(rejectionEvent)) {\n\t\t\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfor (const event of events) {\n\t\t\taddListener(event, onItem);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t// Skip registering rejection handler if we're already listening to this event\n\t\t\t// as the main event takes priority (as documented)\n\t\t\tif (!events.includes(rejectionEvent)) {\n\t\t\t\taddListener(rejectionEvent, rejectHandler);\n\t\t\t}\n\t\t}\n\n\t\tif (options.signal) {\n\t\t\toptions.signal.addEventListener('abort', () => {\n\t\t\t\trejectHandler(options.signal.reason);\n\t\t\t}, {once: true});\n\t\t}\n\n\t\tif (options.resolveImmediately) {\n\t\t\tresolve(items);\n\t\t}\n\t});\n\n\treturnValue.cancel = cancel;\n\n\tif (typeof options.timeout === 'number') {\n\t\tconst timeout = pTimeout(returnValue, {milliseconds: options.timeout});\n\t\t// When cancelling, also clear the timeout timer\n\t\ttimeout.cancel = () => {\n\t\t\tcancel();\n\t\t\ttimeout.clear();\n\t\t};\n\n\t\treturn timeout;\n\t}\n\n\treturn returnValue;\n}\n\nexport function pEvent(emitter, event, options) {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\toptions = {\n\t\t...options,\n\t\tcount: 1,\n\t\tresolveImmediately: false,\n\t};\n\n\tconst arrayPromise = pEventMultiple(emitter, event, options);\n\tconst promise = arrayPromise.then(array => array[0]); // eslint-disable-line promise/prefer-await-to-then\n\tpromise.cancel = arrayPromise.cancel;\n\n\treturn promise;\n}\n\nexport function pEventIterator(emitter, event, options) {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\t// Allow multiple events\n\tconst events = [event].flat();\n\n\toptions = {\n\t\trejectionEvents: ['error'],\n\t\tresolutionEvents: [],\n\t\tlimit: Number.POSITIVE_INFINITY,\n\t\tmultiArgs: false,\n\t\trejectionMultiArgs: false,\n\t\t...options,\n\t};\n\n\tconst {limit} = options;\n\tconst isValidLimit = limit >= 0 && (limit === Number.POSITIVE_INFINITY || Number.isInteger(limit));\n\tif (!isValidLimit) {\n\t\tthrow new TypeError('The `limit` option should be a non-negative integer or Infinity');\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\tif (limit === 0) {\n\t\t// Return an empty async iterator to avoid any further cost\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tasync next() {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t}\n\n\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\tlet isDone = false;\n\tlet error;\n\tlet hasPendingError = false;\n\tconst nextQueue = [];\n\tconst valueQueue = [];\n\tlet eventCount = 0;\n\tlet isLimitReached = false;\n\n\tconst valueHandler = (...arguments_) => {\n\t\teventCount++;\n\t\tisLimitReached = eventCount === limit;\n\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\n\t\t\tresolve({done: false, value});\n\n\t\t\tif (isLimitReached) {\n\t\t\t\tcancel();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueQueue.push(value);\n\n\t\tif (isLimitReached) {\n\t\t\tcancel();\n\t\t}\n\t};\n\n\tconst cancel = () => {\n\t\tisDone = true;\n\n\t\tfor (const event of events) {\n\t\t\tremoveListener(event, valueHandler);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t}\n\n\t\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\t\tremoveListener(resolutionEvent, resolveHandler);\n\t\t}\n\n\t\twhile (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value: undefined});\n\t\t}\n\t};\n\n\tconst rejectHandler = (...arguments_) => {\n\t\terror = options.rejectionMultiArgs ? arguments_ : arguments_[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {reject} = nextQueue.shift();\n\t\t\treject(error);\n\t\t} else {\n\t\t\thasPendingError = true;\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tconst resolveHandler = async (...arguments_) => {\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tif (options.filter) {\n\t\t\ttry {\n\t\t\t\tif (!(await options.filter(value))) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (filterError) {\n\t\t\t\tcancel();\n\t\t\t\tif (nextQueue.length > 0) {\n\t\t\t\t\tconst {reject} = nextQueue.shift();\n\t\t\t\t\treject(filterError);\n\t\t\t\t} else {\n\t\t\t\t\t// Store error for next iterator call\n\t\t\t\t\thasPendingError = true;\n\t\t\t\t\terror = filterError;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value});\n\t\t} else {\n\t\t\tvalueQueue.push(value);\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tfor (const event of events) {\n\t\taddListener(event, valueHandler);\n\t}\n\n\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\taddListener(rejectionEvent, rejectHandler);\n\t}\n\n\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\taddListener(resolutionEvent, resolveHandler);\n\t}\n\n\tif (options.signal) {\n\t\toptions.signal.addEventListener('abort', () => {\n\t\t\trejectHandler(options.signal.reason);\n\t\t}, {once: true});\n\t}\n\n\treturn {\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t\tasync next() {\n\t\t\tif (valueQueue.length > 0) {\n\t\t\t\tconst value = valueQueue.shift();\n\t\t\t\treturn {\n\t\t\t\t\tdone: isDone && valueQueue.length === 0 && !isLimitReached,\n\t\t\t\t\tvalue,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (hasPendingError) {\n\t\t\t\thasPendingError = false;\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tif (isDone) {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tnextQueue.push({resolve, reject});\n\t\t\t});\n\t\t},\n\t\tasync return(value) {\n\t\t\tcancel();\n\t\t\treturn {\n\t\t\t\tdone: isDone,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport {TimeoutError} from 'p-timeout';\n","export abstract class AbstractConfigParser<R> {\n    protected constructor(protected readonly configs: Partial<R>) {}\n\n    protected validate<T extends keyof R>(\n        lookup: string,\n        found: string | R[T],\n    ) {\n        if (!found && found !== false) {\n            throw TypeError(`A value for [${lookup}] is required`)\n        }\n\n        return found\n    }\n\n    protected get<T extends keyof R>(key: T, fallback: R[T] = undefined) {\n        const lookup: string = key as string\n\n        const envLookup = lookup\n            .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n            .toUpperCase()\n\n        const found =\n            this.configs[key]\n            ?? process.env[`VITREA_VBOX_${envLookup}`]\n            ?? fallback\n\n        return this.validate(lookup, found)\n    }\n}\n","import { type ConnectionConfigs, ProtocolVersion } from '../types'\nimport { AbstractConfigParser } from './AbstractConfigParser'\n\nexport class ConnectionConfigParser extends AbstractConfigParser<ConnectionConfigs> {\n    public static create(\n        configs: Partial<ConnectionConfigs> = {},\n    ): ConnectionConfigs {\n        const instance = new ConnectionConfigParser(configs)\n\n        return {\n            host: instance.get('host', '192.168.1.23'),\n            port: Number(instance.get('port', 11501)),\n            username: instance.get('username'),\n            password: instance.get('password'),\n            version: instance.get(\n                'version',\n                ProtocolVersion.V2,\n            ) as ProtocolVersion,\n        }\n    }\n}\n","import * as Net from 'node:net'\nimport { NullLogger } from '../core'\nimport type { SocketConfigs } from '../types'\nimport { AbstractConfigParser } from './AbstractConfigParser'\n\nexport class SocketConfigParser extends AbstractConfigParser<SocketConfigs> {\n    public toBoolean(value: string | boolean): boolean {\n        return ['1', 'true', 'TRUE', true].includes(value)\n    }\n\n    public static create(\n        configs: Partial<SocketConfigs> = {},\n    ): Required<SocketConfigs> {\n        const instance = new SocketConfigParser(configs)\n\n        return {\n            log: instance.configs.log ?? new NullLogger(),\n            socketSupplier:\n                instance.configs.socketSupplier ?? (() => new Net.Socket()),\n            ignoreAckLogs: instance.toBoolean(\n                instance.get('ignoreAckLogs', false),\n            ),\n            shouldReconnect: instance.toBoolean(\n                instance.get('shouldReconnect', true),\n            ),\n            heartbeatInterval: Number(instance.get('heartbeatInterval', 3000)),\n            maxRetries: Number(instance.get('maxRetries', 3)),\n            requestBuffer: Number(instance.get('requestBuffer', 250)),\n            requestBufferVariance: Number(\n                instance.get('requestBufferVariance', 0.15),\n            ),\n            requestTimeout: Number(instance.get('requestTimeout', 1000)),\n        }\n    }\n}\n","import { CommandID } from '../../types'\nimport * as Responses from '..'\n\nexport const ResponseLookupV1 = {\n    [CommandID.Login]: Responses.Acknowledgement,\n    [CommandID.Acknowledgement]: Responses.Acknowledgement,\n    [CommandID.ToggleNodeStatus]: Responses.Acknowledgement,\n    [CommandID.InternalUnitStatuses]: Responses.InternalUnitStatuses,\n    [CommandID.KeyParameters]: Responses.KeyParameters,\n    [CommandID.KeyStatus]: Responses.KeyStatus,\n    [CommandID.NodeCount]: Responses.NodeCount,\n    [CommandID.NodeMetaData]: Responses.NodeMetaData,\n    [CommandID.RoomCount]: Responses.RoomCount,\n    [CommandID.RoomMetaData]: Responses.RoomMetaData,\n    [CommandID.NodeExistenceStatus]: Responses.GenericUnusedResponse,\n} as const\n\nexport const ResponseLookupV2 = {\n    ...ResponseLookupV1,\n    [CommandID.NodeMetaData]: Responses.NodeMetaDataV2,\n    [CommandID.KeyParameters]: Responses.KeyParametersV2,\n} as const\n","import { type BaseResponse, DataGram } from '../../core'\nimport { type CommandID, ProtocolVersion } from '../../types'\nimport { DataGramDirection } from '../../utilities/Enums'\nimport { ResponseLookupV1, ResponseLookupV2 } from './ResponseLookup'\n\n// biome-ignore lint/complexity/noStaticOnlyClass: Static utility class pattern is intentional\nexport class ResponseFactory {\n    protected static readonly lookupTable = {\n        [ProtocolVersion.V1]: ResponseLookupV1,\n        [ProtocolVersion.V2]: ResponseLookupV2,\n    }\n\n    protected static isIncoming(rawBuffer: Buffer): boolean {\n        return rawBuffer[DataGram.directionIndex] === DataGramDirection.INCOMING\n    }\n\n    protected static lookup(rawBuffer: Buffer, version: ProtocolVersion) {\n        const commandID = rawBuffer[DataGram.commandIDIndex] as CommandID\n\n        return ResponseFactory.lookupTable[version][commandID]\n    }\n\n    static find<T extends BaseResponse>(\n        rawBuffer: Buffer,\n        version: ProtocolVersion,\n    ): T | undefined {\n        if (!ResponseFactory.isIncoming(rawBuffer)) {\n            return undefined\n        }\n\n        const supplier = ResponseFactory.lookup(rawBuffer, version)\n\n        if (supplier) {\n            const instance = new supplier(rawBuffer)\n\n            return instance.hasValidChecksum ? (instance as T) : undefined\n        }\n\n        return undefined\n    }\n}\n","import { EventEmitter } from 'node:events'\nimport pTimeout from 'p-timeout'\nimport type { BaseRequest, BaseResponse } from '../core'\nimport * as Exceptions from '../exceptions'\nimport type {\n    LoggerContract,\n    RequestSenderContract,\n    SocketConfigs,\n} from '../types'\nimport type { AbstractHeartbeatHandler } from './AbstractHeartbeatHandler'\n\nexport abstract class AbstractSocket\n    extends EventEmitter\n    implements RequestSenderContract\n{\n    protected socket?: ReturnType<SocketConfigs['socketSupplier']>\n    protected heartbeat?: AbstractHeartbeatHandler\n    protected readonly log: LoggerContract\n\n    protected constructor(\n        protected readonly host: string,\n        protected readonly port: number,\n        protected readonly socketConfigs: SocketConfigs,\n    ) {\n        super()\n        this.log = socketConfigs.log\n        this.setMaxListeners(60)\n    }\n\n    protected createNewSocket(): ReturnType<SocketConfigs['socketSupplier']> {\n        this.socket = this.socketConfigs.socketSupplier()\n\n        return this.socket\n            .setNoDelay(true)\n            .on('connect', this.handleConnect.bind(this))\n            .on('data', this.handleData.bind(this))\n            .on('end', this.handleDisconnect.bind(this))\n            .on('error', this.handleError.bind(this))\n    }\n\n    public async connect(): Promise<void> {\n        this.log.debug('Attempting to make a connection')\n\n        if (this.socket) {\n            const error = new Exceptions.ConnectionExistsException()\n\n            this.log.error(error.message)\n\n            throw error\n        }\n\n        return await pTimeout(\n            new Promise<void>(res => {\n                this.createNewSocket()\n                    .on('connect', () => res(null))\n                    .connect({\n                        port: this.port,\n                        host: this.host,\n                    })\n            }),\n            { milliseconds: this.socketConfigs.requestTimeout },\n        )\n    }\n\n    public disconnect() {\n        if (this.socket) {\n            this.log.info('Forced a disconnection')\n            this.heartbeat?.pause()\n            this.socketConfigs.shouldReconnect = false\n            this.socket.end()\n            this.socket = undefined\n        }\n    }\n\n    public async write(data: Buffer): Promise<void> {\n        if (!this.socket || this.socket.destroyed) {\n            throw new Exceptions.NoConnectionException()\n        }\n\n        return new Promise((res, rej) => {\n            this.socket.write(data, (error?: Error) => {\n                this.restartHeartbeat()\n\n                if (error) {\n                    this.log.error(\n                        `Data written with an error - ${error.message}`,\n                    )\n\n                    return rej(error)\n                }\n\n                res()\n            })\n        })\n    }\n\n    protected async handleDisconnect() {\n        this.log.debug('Connection closed')\n\n        this.socket = undefined\n\n        if (this.socketConfigs.shouldReconnect) {\n            this.log.info('Automatically reconnecting', {\n                shouldReconnect: this.socketConfigs.shouldReconnect,\n            })\n\n            return await this.connect()\n        }\n\n        this.log.info('Not reconnecting', {\n            shouldReconnect: this.socketConfigs.shouldReconnect,\n        })\n    }\n\n    protected handleError(error: Error) {\n        this.socketConfigs.shouldReconnect = false\n\n        this.log.error(`An error occurred - ${error.message}`)\n    }\n\n    protected async handleConnect() {\n        this.log.debug('Connection established')\n\n        this.socketConfigs.shouldReconnect = true\n\n        this.restartHeartbeat()\n    }\n\n    protected restartHeartbeat() {\n        this.heartbeat?.restart()\n    }\n\n    protected abstract handleData(data: Buffer): void\n\n    protected abstract handleUnknownData(data: Buffer): void\n\n    public abstract send<T extends BaseRequest>(\n        request: T,\n    ): Promise<BaseResponse>\n}\n","import retry from 'retry';\nimport isNetworkError from 'is-network-error';\n\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\n\t\tif (message instanceof Error) {\n\t\t\tthis.originalError = message;\n\t\t\t({message} = message);\n\t\t} else {\n\t\t\tthis.originalError = new Error(message);\n\t\t\tthis.originalError.stack = this.stack;\n\t\t}\n\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\nconst decorateErrorWithCounts = (error, attemptNumber, options) => {\n\t// Minus 1 from attemptNumber because the first attempt does not count as a retry\n\tconst retriesLeft = options.retries - (attemptNumber - 1);\n\n\terror.attemptNumber = attemptNumber;\n\terror.retriesLeft = retriesLeft;\n\treturn error;\n};\n\nexport default async function pRetry(input, options) {\n\treturn new Promise((resolve, reject) => {\n\t\toptions = {...options};\n\t\toptions.onFailedAttempt ??= () => {};\n\t\toptions.shouldRetry ??= () => true;\n\t\toptions.retries ??= 10;\n\n\t\tconst operation = retry.operation(options);\n\n\t\tconst abortHandler = () => {\n\t\t\toperation.stop();\n\t\t\treject(options.signal?.reason);\n\t\t};\n\n\t\tif (options.signal && !options.signal.aborted) {\n\t\t\toptions.signal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\tconst cleanUp = () => {\n\t\t\toptions.signal?.removeEventListener('abort', abortHandler);\n\t\t\toperation.stop();\n\t\t};\n\n\t\toperation.attempt(async attemptNumber => {\n\t\t\ttry {\n\t\t\t\tconst result = await input(attemptNumber);\n\t\t\t\tcleanUp();\n\t\t\t\tresolve(result);\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(error instanceof Error)) {\n\t\t\t\t\t\tthrow new TypeError(`Non-error was thrown: \"${error}\". You should only throw errors.`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (error instanceof AbortError) {\n\t\t\t\t\t\tthrow error.originalError;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (error instanceof TypeError && !isNetworkError(error)) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\tdecorateErrorWithCounts(error, attemptNumber, options);\n\n\t\t\t\t\tif (!(await options.shouldRetry(error))) {\n\t\t\t\t\t\toperation.stop();\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait options.onFailedAttempt(error);\n\n\t\t\t\t\tif (!operation.retry(error)) {\n\t\t\t\t\t\tthrow operation.mainError();\n\t\t\t\t\t}\n\t\t\t\t} catch (finalError) {\n\t\t\t\t\tdecorateErrorWithCounts(finalError, attemptNumber, options);\n\t\t\t\t\tcleanUp();\n\t\t\t\t\treject(finalError);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n","const objectToString = Object.prototype.toString;\n\nconst isError = value => objectToString.call(value) === '[object Error]';\n\nconst errorMessages = new Set([\n\t'network error', // Chrome\n\t'Failed to fetch', // Chrome\n\t'NetworkError when attempting to fetch resource.', // Firefox\n\t'The Internet connection appears to be offline.', // Safari 16\n\t'Load failed', // Safari 17+\n\t'Network request failed', // `cross-fetch`\n\t'fetch failed', // Undici (Node.js)\n\t'terminated', // Undici (Node.js)\n]);\n\nexport default function isNetworkError(error) {\n\tconst isValid = error\n\t\t&& isError(error)\n\t\t&& error.name === 'TypeError'\n\t\t&& typeof error.message === 'string';\n\n\tif (!isValid) {\n\t\treturn false;\n\t}\n\n\t// We do an extra check for Safari 17+ as it has a very generic error message.\n\t// Network errors in Safari have no stack.\n\tif (error.message === 'Load failed') {\n\t\treturn error.stack === undefined;\n\t}\n\n\treturn errorMessages.has(error.message);\n}\n","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\t// Process the next queued function if we're under the concurrency limit\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tactiveCount++;\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\t// Execute the function and capture the result promise\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\t// Resolve immediately with the promise (don't wait for completion)\n\t\tresolve(result);\n\n\t\t// Wait for the function to complete (success or failure)\n\t\t// We catch errors here to prevent unhandled rejections,\n\t\t// but the original promise rejection is preserved for the caller\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\t// Decrement active count and process next queued function\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue the internal resolve function instead of the run function\n\t\t// to preserve the asynchronous execution context.\n\t\tnew Promise(internalResolve => { // eslint-disable-line promise/param-names\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(run.bind(undefined, function_, resolve, arguments_)); // eslint-disable-line promise/prefer-await-to-then\n\n\t\t// Start processing immediately if we haven't reached the concurrency limit\n\t\tif (activeCount < concurrency) {\n\t\t\tresumeNext();\n\t\t}\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\tmap: {\n\t\t\tasync value(array, function_) {\n\t\t\t\tconst promises = array.map((value, index) => this(function_, value, index));\n\t\t\t\treturn Promise.all(promises);\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, options) {\n\tconst {concurrency} = options;\n\tconst limit = pLimit(concurrency);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","export class LinearJitter {\n    constructor(\n        protected readonly base: number,\n        protected readonly variance: number,\n    ) {}\n\n    public calculate(): number {\n        if (this.variance === 0) {\n            return this.base\n        }\n\n        const flexRange = this.base * this.variance\n        const randomFlex = (Math.random() * 2 - 1) * flexRange\n        return Math.max(0, this.base + randomFlex)\n    }\n}\n","import pLimit from 'p-limit'\nimport type { PromiseExecutor, SocketConfigs } from '../types'\nimport { LinearJitter } from './LinearJitter'\n\nexport class RequestThrottler {\n    protected readonly jitter: LinearJitter\n    protected readonly log: SocketConfigs['log']\n    protected readonly limit = pLimit(1)\n\n    constructor(\n        configs: Pick<\n            SocketConfigs,\n            'log' | 'requestBuffer' | 'requestBufferVariance'\n        >,\n    ) {\n        this.jitter = new LinearJitter(\n            configs.requestBuffer,\n            configs.requestBufferVariance,\n        )\n        this.log = configs.log\n    }\n\n    protected delay(ms: number) {\n        return new Promise<void>(resolve => setTimeout(resolve, ms))\n    }\n\n    async process<T>(label: string, executor: PromiseExecutor<T>): Promise<T> {\n        return this.limit(async () => {\n            this.log.debug('Acquired mutex', { label })\n\n            try {\n                return await new Promise<T>((resolve, reject) => {\n                    try {\n                        executor(resolve, reject)\n                    } catch (err) {\n                        reject(err)\n                    }\n                })\n            } finally {\n                await this.delay(this.jitter.calculate())\n\n                this.log.debug('Releasing mutex', { label })\n            }\n        })\n    }\n}\n","import pRetry, { AbortError, type FailedAttemptError } from 'p-retry'\nimport { TimeoutError } from 'p-timeout'\nimport type { PromiseExecutor, SocketConfigs } from '../types'\nimport { RequestThrottler } from './RequestThrottler'\n\nexport class RequestRetryHandler {\n    protected throttler: RequestThrottler\n    protected maxRetries: number\n    protected log: SocketConfigs['log']\n\n    constructor(socketConfigs: SocketConfigs) {\n        this.throttler = new RequestThrottler(socketConfigs)\n        this.maxRetries = socketConfigs.maxRetries\n        this.log = socketConfigs.log\n    }\n\n    protected onFailedAttempt(label: string) {\n        return (error: FailedAttemptError) => {\n            this.log.warn('Retry attempt', {\n                label,\n                attempt: error.attemptNumber,\n                retriesLeft: error.retriesLeft,\n                error: error.message,\n            })\n\n            if (!(error instanceof TimeoutError)) {\n                throw new AbortError(error.message)\n            }\n        }\n    }\n\n    public async processWithRetry<T>(\n        label: string,\n        callback: PromiseExecutor<T>,\n    ): Promise<T> {\n        return pRetry(() => this.throttler.process(label, callback), {\n            retries: this.maxRetries,\n            minTimeout: 50,\n            maxTimeout: 250,\n            onFailedAttempt: this.onFailedAttempt(label),\n        })\n    }\n}\n","import type { BaseRequest } from '../core'\nimport type { RequestSenderContract } from '../types'\n\nexport abstract class AbstractHeartbeatHandler {\n    protected interval: number\n    protected timer?: NodeJS.Timeout\n    protected socket: RequestSenderContract\n\n    public constructor(interval: number, socket: RequestSenderContract) {\n        this.interval = interval\n        this.socket = socket\n    }\n\n    public get isPaused(): boolean {\n        return !this.timer\n    }\n\n    public pause() {\n        if (!this.isPaused) {\n            clearTimeout(this.timer)\n            this.timer = null\n        }\n    }\n\n    public restart() {\n        this.pause()\n\n        this.timer = setTimeout(this.handleHeartbeat.bind(this), this.interval)\n    }\n\n    protected async handleHeartbeat() {\n        await this.socket.send(this.getHeartbeatRequest())\n\n        this.restart()\n    }\n\n    protected abstract getHeartbeatRequest<T extends BaseRequest>(): T\n}\n","import type { BaseRequest } from '../core'\nimport { Heartbeat } from '../requests'\nimport { AbstractHeartbeatHandler } from './AbstractHeartbeatHandler'\nimport type { RequestSenderContract } from './RequestSenderContract'\n\nexport class VitreaHeartbeatHandler extends AbstractHeartbeatHandler {\n    protected getHeartbeatRequest<T extends BaseRequest>(): T {\n        return new Heartbeat() as T\n    }\n\n    public static create(interval: number, socket: RequestSenderContract) {\n        const instance = new VitreaHeartbeatHandler(interval, socket)\n\n        instance.restart()\n\n        return instance\n    }\n}\n","// biome-ignore lint/complexity/noStaticOnlyClass: Static utility class pattern is intentional\nexport class SplitMultipleBuffers {\n    public static handle(buffer: Buffer): Buffer[] {\n        return buffer\n            .toString('hex')\n            .replace(/5654553c/g, ';;;5654553c')\n            .split(';;;')\n            .filter(Boolean)\n            .map(string => Buffer.from(string, 'hex'))\n    }\n}\n","import { pEvent } from 'p-event'\nimport pTimeout from 'p-timeout'\nimport { ConnectionConfigParser, SocketConfigParser } from './configs'\nimport type * as Core from './core'\nimport { Login, ToggleHeartbeat } from './requests'\nimport {\n    Acknowledgement,\n    GenericUnusedResponse,\n    type KeyStatus,\n} from './responses'\nimport { ResponseFactory } from './responses/helpers'\nimport { AbstractSocket } from './socket/AbstractSocket'\nimport { RequestRetryHandler } from './socket/RequestRetryHandler'\nimport { VitreaHeartbeatHandler } from './socket/VitreaHeartbeatHandler'\nimport type {\n    ConnectionConfigs,\n    ProtocolVersion,\n    RequestToResponse,\n    SocketConfigs,\n} from './types'\nimport { Events } from './utilities/Events'\nimport { SplitMultipleBuffers } from './utilities/SplitMultipleBuffers'\n\nexport class VitreaClient<\n    V extends ProtocolVersion = ProtocolVersion,\n> extends AbstractSocket {\n    protected readonly retryHandler: RequestRetryHandler\n    protected readonly configs: ConnectionConfigs & { version: V }\n\n    protected constructor(\n        configs: ConnectionConfigs & { version: V },\n        socketConfigs: SocketConfigs,\n    ) {\n        super(configs.host, configs.port, socketConfigs)\n        this.configs = configs\n        this.retryHandler = new RequestRetryHandler(socketConfigs)\n        this.heartbeat = new VitreaHeartbeatHandler(\n            socketConfigs.heartbeatInterval,\n            this,\n        )\n    }\n\n    public override async send<T extends Core.BaseRequest>(\n        request: T,\n    ): Promise<RequestToResponse<T, V>> {\n        const eventName = { eventName: request.eventName }\n\n        return this.retryHandler.processWithRetry<RequestToResponse<T, V>>(\n            eventName.eventName,\n            async (resolve, reject) => {\n                this.log.info('Sending data', request.logData)\n\n                try {\n                    this.write(request.build())\n\n                    const result = await pTimeout(\n                        pEvent(this, request.eventName) as Promise<\n                            RequestToResponse<T, V>\n                        >,\n                        { milliseconds: this.socketConfigs.requestTimeout },\n                    )\n\n                    resolve(result)\n                } catch (error) {\n                    reject(error)\n                }\n            },\n        )\n    }\n\n    protected shouldLogResponse(response: Core.BaseResponse): boolean {\n        return (\n            !this.socketConfigs.ignoreAckLogs\n            || !(\n                response instanceof Acknowledgement\n                || response instanceof GenericUnusedResponse\n            )\n        )\n    }\n\n    protected async handleConnect() {\n        await super.handleConnect()\n\n        await this.send(new ToggleHeartbeat())\n\n        await this.send(new Login(this.configs.username, this.configs.password))\n    }\n\n    protected override handleData(data: Buffer): void {\n        const split = SplitMultipleBuffers.handle(data)\n\n        if (split.length > 1) {\n            split.forEach(buffer => {\n                this.handleData(buffer)\n            })\n            return\n        }\n\n        data = split[0]\n\n        const response = ResponseFactory.find(data, this.configs.version)\n\n        if (!response) {\n            this.emit(Events.UNKNOWN_DATA, data)\n\n            this.handleUnknownData(data)\n\n            return\n        }\n\n        if (this.shouldLogResponse(response)) {\n            this.log.info('Data Received', response.logData)\n        }\n\n        this.emit(response.eventName, response)\n    }\n\n    protected override handleUnknownData(data: Buffer): void {\n        this.log.warn('Ignoring unrecognized received data', {\n            raw: data.toString('hex'),\n        })\n    }\n\n    public onKeyStatus(listener: (status: KeyStatus) => void): void {\n        this.on(Events.STATUS_UPDATE, listener)\n    }\n\n    public static create<V extends ProtocolVersion = typeof ProtocolVersion.V2>(\n        configs: Partial<ConnectionConfigs> & { version?: V } = {},\n        socketConfigs: Partial<SocketConfigs> = {},\n    ): VitreaClient<V> {\n        const parsedConnectionConfigs = ConnectionConfigParser.create(\n            configs,\n        ) as ConnectionConfigs & { version: V }\n        const parsedSocketConfigs = SocketConfigParser.create(socketConfigs)\n        const redact = (str: string) => `${str[0]}***${str[str.length - 1]}`\n\n        const instance = new VitreaClient(\n            parsedConnectionConfigs,\n            parsedSocketConfigs,\n        )\n\n        instance.log.debug('VitreaClient instance created', {\n            connection: {\n                ...parsedConnectionConfigs,\n                username: redact(parsedConnectionConfigs.username),\n                password: redact(parsedConnectionConfigs.password),\n            },\n            socket: parsedSocketConfigs,\n        })\n\n        return instance\n    }\n}\n"],"mappings":"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","names":["require_retry_operation","__commonJSMin","exports","module","RetryOperation","timeouts","options","__name","err","currentTime","timeout","self","fn","timeoutOps","counts","mainError","mainErrorCount","i","error","message","count","require_retry","__commonJSMin","exports","RetryOperation","options","timeouts","opts","key","i","a","b","attempt","random","timeout","obj","methods","method","original","__name","op","args","callback","err","require_retry","__commonJSMin","exports","module","index_exports","__export","ConsoleLogger","DataGramDirection","exceptions_exports","KeyCategory","KeyPowerStatus","KeyType","LEDBackgroundBrightness","LockStatus","NodeType","ProtocolVersion","requests_exports","responses_exports","VitreaClient","__toCommonJS","KeyPowerStatus","LEDBackgroundBrightness","LockStatus","DataGramDirection","KeyType","KeyCategory","NodeType","_MessageID","baseID","nextID","__name","MessageID","_Events","messageID","keys","key","__name","Events","_DataGram","rawBuffer","index","number","buffer","entry","offset","slice","sum","curr","length","Events","DataGramDirection","__name","DataGram","_BaseRequest","DataGram","commandID","data","DataGramDirection","MessageID","builder","__name","BaseRequest","_BaseResponse","DataGram","rawBuffer","start","__name","BaseResponse","_ConsoleLogger","message","level","args","__name","ConsoleLogger","_NullLogger","_message","_level","_args","__name","NullLogger","exceptions_exports","__export","ConnectionExistsException","NoConnectionException","_ConnectionExistsException","message","__name","ConnectionExistsException","_NoConnectionException","message","__name","NoConnectionException","requests_exports","__export","Heartbeat","InternalUnitStatuses","KeyParameters","KeyStatus","Login","NodeCount","NodeMetaData","NodeStatus","RoomCount","RoomMetaData","ToggleHeartbeat","ToggleKeyStatus","ToggleNodeStatus","_AcknowledgeRequest","BaseRequest","Events","__name","AcknowledgeRequest","_Heartbeat","AcknowledgeRequest","__name","Heartbeat","CommandID","ProtocolVersion","_InternalUnitStatuses","BaseRequest","CommandID","__name","InternalUnitStatuses","_KeyParameters","BaseRequest","nodeID","keyID","CommandID","__name","KeyParameters","_KeyStatus","BaseRequest","nodeID","keyID","CommandID","Events","__name","KeyStatus","_Login","AcknowledgeRequest","username","password","CommandID","__name","Login","_NodeCount","BaseRequest","CommandID","__name","NodeCount","_NodeMetaData","BaseRequest","nodeID","CommandID","__name","NodeMetaData","_NodeStatus","BaseRequest","nodeID","__name","NodeStatus","_RoomCount","BaseRequest","CommandID","__name","RoomCount","_RoomMetaData","BaseRequest","roomID","CommandID","__name","RoomMetaData","_ToggleHeartbeat","AcknowledgeRequest","enable","unsolicited","__name","ToggleHeartbeat","toByteArray","__name","seconds","_ToggleKeyStatus","BaseRequest","nodeID","keyID","status","options","Events","ToggleKeyStatus","_ToggleNodeStatus","AcknowledgeRequest","nodeNo","lockStatus","ledLevel","CommandID","__name","ToggleNodeStatus","responses_exports","__export","Acknowledgement","GenericUnusedResponse","InternalUnitStatuses","KeyParameters","KeyParametersV2","KeyStatus","NodeCount","NodeMetaData","NodeMetaDataV2","RoomCount","RoomMetaData","_Acknowledgement","BaseResponse","__name","Acknowledgement","_GenericUnusedResponse","BaseResponse","__name","GenericUnusedResponse","_InternalUnitStatuses","BaseResponse","__name","InternalUnitStatuses","_KeyParameters","BaseResponse","__name","KeyParameters","_KeyParametersV2","KeyParameters","__name","KeyParametersV2","_KeyStatus","BaseResponse","KeyPowerStatus","Events","__name","KeyStatus","_NodeCount","BaseResponse","__name","NodeCount","_NodeMetaData","BaseResponse","byIndex","modelEntry","NodeType","value","offset","version","subversion","patch","start","_","i","LockStatus","__name","NodeMetaData","_NodeMetaDataV2","NodeMetaData","_","i","__name","NodeMetaDataV2","_RoomCount","BaseResponse","__name","RoomCount","_RoomMetaData","BaseResponse","__name","RoomMetaData","_TimeoutError","message","__name","TimeoutError","_AbortError","AbortError","getDOMException","errorMessage","getAbortedReason","signal","reason","pTimeout","promise","options","milliseconds","fallback","customTimers","timer","abortHandler","cancelablePromise","resolve","reject","timeoutError","error","normalizeEmitter","__name","emitter","addListener","removeListener","pEventMultiple","event","options","cancel","returnValue","resolve","reject","events","items","onItem","arguments_","value","error","rejectHandler","rejectionEvent","timeout","pTimeout","pEvent","arrayPromise","promise","array","_AbstractConfigParser","configs","lookup","found","key","fallback","envLookup","__name","AbstractConfigParser","_ConnectionConfigParser","AbstractConfigParser","configs","instance","ProtocolVersion","__name","ConnectionConfigParser","Net","_SocketConfigParser","AbstractConfigParser","value","configs","instance","NullLogger","__name","SocketConfigParser","ResponseLookupV1","CommandID","Acknowledgement","InternalUnitStatuses","KeyParameters","KeyStatus","NodeCount","NodeMetaData","RoomCount","RoomMetaData","GenericUnusedResponse","ResponseLookupV2","NodeMetaDataV2","KeyParametersV2","_ResponseFactory","rawBuffer","DataGram","DataGramDirection","version","commandID","supplier","instance","__name","ProtocolVersion","ResponseLookupV1","ResponseLookupV2","ResponseFactory","import_node_events","_AbstractSocket","host","port","socketConfigs","error","ConnectionExistsException","pTimeout","res","data","NoConnectionException","rej","__name","AbstractSocket","import_retry","objectToString","isError","__name","value","errorMessages","isNetworkError","error","_AbortError","message","__name","AbortError","decorateErrorWithCounts","error","attemptNumber","options","retriesLeft","pRetry","input","resolve","reject","operation","retry","abortHandler","cleanUp","result","isNetworkError","finalError","_Node","value","__publicField","__name","Node","_head","_tail","_size","_Queue","__privateAdd","node","__privateGet","__privateSet","__privateWrapper","current","Queue","pLimit","concurrency","validateConcurrency","queue","Queue","activeCount","resumeNext","__name","next","run","function_","resolve","arguments_","result","enqueue","internalResolve","generator","newConcurrency","array","promises","value","index","validateConcurrency","concurrency","__name","_LinearJitter","base","variance","flexRange","randomFlex","__name","LinearJitter","_RequestThrottler","configs","pLimit","LinearJitter","ms","resolve","label","executor","reject","err","__name","RequestThrottler","_RequestRetryHandler","socketConfigs","RequestThrottler","label","error","TimeoutError","AbortError","callback","pRetry","__name","RequestRetryHandler","_AbstractHeartbeatHandler","interval","socket","__name","AbstractHeartbeatHandler","_VitreaHeartbeatHandler","AbstractHeartbeatHandler","Heartbeat","interval","socket","instance","__name","VitreaHeartbeatHandler","_SplitMultipleBuffers","buffer","string","__name","SplitMultipleBuffers","_VitreaClient","AbstractSocket","configs","socketConfigs","RequestRetryHandler","VitreaHeartbeatHandler","request","eventName","resolve","reject","result","pTimeout","pEvent","error","response","Acknowledgement","GenericUnusedResponse","ToggleHeartbeat","Login","data","split","SplitMultipleBuffers","buffer","ResponseFactory","Events","listener","parsedConnectionConfigs","ConnectionConfigParser","parsedSocketConfigs","SocketConfigParser","redact","__name","str","instance","VitreaClient"]}