@zwave-js/nvmedit 15.28.0 → 15.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/build/cjs/cli.js.map +2 -2
  2. package/build/cjs/convert.js +36 -12
  3. package/build/cjs/convert.js.map +2 -2
  4. package/build/cjs/lib/NVM3.js +16 -12
  5. package/build/cjs/lib/NVM3.js.map +2 -2
  6. package/build/cjs/lib/NVM500.js.map +2 -2
  7. package/build/cjs/lib/common/definitions.d.ts +1 -1
  8. package/build/cjs/lib/common/definitions.js.map +2 -2
  9. package/build/cjs/lib/common/routeCache.js.map +2 -2
  10. package/build/cjs/lib/common/sucUpdateEntry.js.map +2 -2
  11. package/build/cjs/lib/common/utils.js.map +2 -2
  12. package/build/cjs/lib/io/BufferedNVMReader.js.map +2 -2
  13. package/build/cjs/lib/io/NVMFileIO.js +1 -1
  14. package/build/cjs/lib/io/NVMFileIO.js.map +2 -2
  15. package/build/cjs/lib/io/NVMMemoryIO.js.map +2 -2
  16. package/build/cjs/lib/nvm3/adapter.d.ts +1 -1
  17. package/build/cjs/lib/nvm3/adapter.js.map +2 -2
  18. package/build/cjs/lib/nvm3/consts.js.map +1 -1
  19. package/build/cjs/lib/nvm3/files/ApplicationCCsFile.js.map +2 -2
  20. package/build/cjs/lib/nvm3/files/ApplicationDataFile.js.map +2 -2
  21. package/build/cjs/lib/nvm3/files/ApplicationNameFile.js.map +2 -2
  22. package/build/cjs/lib/nvm3/files/ApplicationRFConfigFile.js.map +2 -2
  23. package/build/cjs/lib/nvm3/files/ApplicationTypeFile.js.map +2 -2
  24. package/build/cjs/lib/nvm3/files/ControllerInfoFile.js.map +2 -2
  25. package/build/cjs/lib/nvm3/files/NVMFile.js.map +2 -2
  26. package/build/cjs/lib/nvm3/files/NodeInfoFiles.js.map +2 -2
  27. package/build/cjs/lib/nvm3/files/ProtocolNodeMaskFiles.js.map +2 -2
  28. package/build/cjs/lib/nvm3/files/RouteCacheFiles.js.map +2 -2
  29. package/build/cjs/lib/nvm3/files/SUCUpdateEntriesFile.js.map +2 -2
  30. package/build/cjs/lib/nvm3/files/VersionFiles.js.map +2 -2
  31. package/build/cjs/lib/nvm3/object.js.map +2 -2
  32. package/build/cjs/lib/nvm3/page.js.map +2 -2
  33. package/build/cjs/lib/nvm3/utils.js.map +2 -2
  34. package/build/cjs/lib/nvm500/EntryParsers.js +1 -4
  35. package/build/cjs/lib/nvm500/EntryParsers.js.map +2 -2
  36. package/build/cjs/lib/nvm500/adapter.d.ts +1 -1
  37. package/build/cjs/lib/nvm500/adapter.js +3 -1
  38. package/build/cjs/lib/nvm500/adapter.js.map +2 -2
  39. package/build/cjs/lib/nvm500/impls/Bridge_6_6x.js.map +2 -2
  40. package/build/cjs/lib/nvm500/impls/Bridge_6_7x.js.map +2 -2
  41. package/build/cjs/lib/nvm500/impls/Bridge_6_8x.js.map +2 -2
  42. package/build/cjs/lib/nvm500/impls/Static_6_6x.js.map +2 -2
  43. package/build/cjs/lib/nvm500/impls/Static_6_7x.js.map +2 -2
  44. package/build/cjs/lib/nvm500/impls/Static_6_8x.js.map +2 -2
  45. package/build/cjs/lib/nvm500/shared.js.map +2 -2
  46. package/build/esm/cli.js.map +1 -1
  47. package/build/esm/convert.d.ts.map +1 -1
  48. package/build/esm/convert.js +49 -28
  49. package/build/esm/convert.js.map +1 -1
  50. package/build/esm/lib/NVM3.d.ts.map +1 -1
  51. package/build/esm/lib/NVM3.js +22 -21
  52. package/build/esm/lib/NVM3.js.map +1 -1
  53. package/build/esm/lib/NVM500.d.ts.map +1 -1
  54. package/build/esm/lib/NVM500.js +4 -5
  55. package/build/esm/lib/NVM500.js.map +1 -1
  56. package/build/esm/lib/common/definitions.d.ts +1 -1
  57. package/build/esm/lib/common/definitions.d.ts.map +1 -1
  58. package/build/esm/lib/common/definitions.js.map +1 -1
  59. package/build/esm/lib/common/routeCache.d.ts.map +1 -1
  60. package/build/esm/lib/common/routeCache.js +1 -2
  61. package/build/esm/lib/common/routeCache.js.map +1 -1
  62. package/build/esm/lib/common/sucUpdateEntry.d.ts.map +1 -1
  63. package/build/esm/lib/common/sucUpdateEntry.js.map +1 -1
  64. package/build/esm/lib/common/utils.d.ts.map +1 -1
  65. package/build/esm/lib/common/utils.js.map +1 -1
  66. package/build/esm/lib/io/BufferedNVMReader.d.ts.map +1 -1
  67. package/build/esm/lib/io/BufferedNVMReader.js +6 -6
  68. package/build/esm/lib/io/BufferedNVMReader.js.map +1 -1
  69. package/build/esm/lib/io/NVMFileIO.d.ts.map +1 -1
  70. package/build/esm/lib/io/NVMFileIO.js +1 -1
  71. package/build/esm/lib/io/NVMFileIO.js.map +1 -1
  72. package/build/esm/lib/io/NVMMemoryIO.d.ts.map +1 -1
  73. package/build/esm/lib/io/NVMMemoryIO.js.map +1 -1
  74. package/build/esm/lib/nvm3/adapter.d.ts +1 -1
  75. package/build/esm/lib/nvm3/adapter.d.ts.map +1 -1
  76. package/build/esm/lib/nvm3/adapter.js +28 -22
  77. package/build/esm/lib/nvm3/adapter.js.map +1 -1
  78. package/build/esm/lib/nvm3/consts.js +1 -1
  79. package/build/esm/lib/nvm3/files/ApplicationCCsFile.d.ts.map +1 -1
  80. package/build/esm/lib/nvm3/files/ApplicationCCsFile.js.map +1 -1
  81. package/build/esm/lib/nvm3/files/ApplicationDataFile.d.ts.map +1 -1
  82. package/build/esm/lib/nvm3/files/ApplicationDataFile.js.map +1 -1
  83. package/build/esm/lib/nvm3/files/ApplicationNameFile.d.ts.map +1 -1
  84. package/build/esm/lib/nvm3/files/ApplicationNameFile.js.map +1 -1
  85. package/build/esm/lib/nvm3/files/ApplicationRFConfigFile.d.ts.map +1 -1
  86. package/build/esm/lib/nvm3/files/ApplicationRFConfigFile.js.map +1 -1
  87. package/build/esm/lib/nvm3/files/ApplicationTypeFile.d.ts.map +1 -1
  88. package/build/esm/lib/nvm3/files/ApplicationTypeFile.js.map +1 -1
  89. package/build/esm/lib/nvm3/files/ControllerInfoFile.d.ts.map +1 -1
  90. package/build/esm/lib/nvm3/files/ControllerInfoFile.js.map +1 -1
  91. package/build/esm/lib/nvm3/files/NVMFile.d.ts.map +1 -1
  92. package/build/esm/lib/nvm3/files/NVMFile.js.map +1 -1
  93. package/build/esm/lib/nvm3/files/NodeInfoFiles.d.ts.map +1 -1
  94. package/build/esm/lib/nvm3/files/NodeInfoFiles.js +2 -4
  95. package/build/esm/lib/nvm3/files/NodeInfoFiles.js.map +1 -1
  96. package/build/esm/lib/nvm3/files/ProtocolNodeMaskFiles.d.ts.map +1 -1
  97. package/build/esm/lib/nvm3/files/ProtocolNodeMaskFiles.js.map +1 -1
  98. package/build/esm/lib/nvm3/files/RouteCacheFiles.d.ts.map +1 -1
  99. package/build/esm/lib/nvm3/files/RouteCacheFiles.js +2 -4
  100. package/build/esm/lib/nvm3/files/RouteCacheFiles.js.map +1 -1
  101. package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.d.ts.map +1 -1
  102. package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.js +1 -2
  103. package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.js.map +1 -1
  104. package/build/esm/lib/nvm3/files/VersionFiles.d.ts.map +1 -1
  105. package/build/esm/lib/nvm3/files/VersionFiles.js.map +1 -1
  106. package/build/esm/lib/nvm3/object.d.ts.map +1 -1
  107. package/build/esm/lib/nvm3/object.js.map +1 -1
  108. package/build/esm/lib/nvm3/page.d.ts.map +1 -1
  109. package/build/esm/lib/nvm3/page.js.map +1 -1
  110. package/build/esm/lib/nvm3/utils.d.ts.map +1 -1
  111. package/build/esm/lib/nvm3/utils.js.map +1 -1
  112. package/build/esm/lib/nvm500/EntryParsers.d.ts.map +1 -1
  113. package/build/esm/lib/nvm500/EntryParsers.js +4 -5
  114. package/build/esm/lib/nvm500/EntryParsers.js.map +1 -1
  115. package/build/esm/lib/nvm500/adapter.d.ts +1 -1
  116. package/build/esm/lib/nvm500/adapter.d.ts.map +1 -1
  117. package/build/esm/lib/nvm500/adapter.js +10 -12
  118. package/build/esm/lib/nvm500/adapter.js.map +1 -1
  119. package/build/esm/lib/nvm500/impls/Bridge_6_6x.d.ts.map +1 -1
  120. package/build/esm/lib/nvm500/impls/Bridge_6_6x.js.map +1 -1
  121. package/build/esm/lib/nvm500/impls/Bridge_6_7x.d.ts.map +1 -1
  122. package/build/esm/lib/nvm500/impls/Bridge_6_7x.js.map +1 -1
  123. package/build/esm/lib/nvm500/impls/Bridge_6_8x.d.ts.map +1 -1
  124. package/build/esm/lib/nvm500/impls/Bridge_6_8x.js.map +1 -1
  125. package/build/esm/lib/nvm500/impls/Static_6_6x.d.ts.map +1 -1
  126. package/build/esm/lib/nvm500/impls/Static_6_6x.js.map +1 -1
  127. package/build/esm/lib/nvm500/impls/Static_6_7x.d.ts.map +1 -1
  128. package/build/esm/lib/nvm500/impls/Static_6_7x.js.map +1 -1
  129. package/build/esm/lib/nvm500/impls/Static_6_8x.d.ts.map +1 -1
  130. package/build/esm/lib/nvm500/impls/Static_6_8x.js.map +1 -1
  131. package/build/esm/lib/nvm500/shared.d.ts.map +1 -1
  132. package/build/esm/lib/nvm500/shared.js.map +1 -1
  133. package/build/esm/nvm500/NVMParser.d.ts.map +1 -1
  134. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/nvm3/adapter.ts"],
4
- "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport { type BytesView, num2hex } from \"@zwave-js/shared\";\nimport { assertNever } from \"alcalzone-shared/helpers\";\nimport { SUC_MAX_UPDATES } from \"../../consts.js\";\nimport type { NVM3 } from \"../NVM3.js\";\nimport type {\n\tControllerNVMProperty,\n\tLRNodeNVMProperty,\n\tNVMAdapter,\n\tNVMProperty,\n\tNVMPropertyToDataType,\n\tNodeNVMProperty,\n} from \"../common/definitions.js\";\nimport type { RouteCache } from \"../common/routeCache.js\";\nimport {\n\ttype ApplicationCCsFile,\n\tApplicationCCsFileID,\n\tApplicationDataFile,\n\tApplicationDataFileID,\n\tApplicationNameFile,\n\tApplicationNameFileID,\n\ttype ApplicationRFConfigFile,\n\tApplicationRFConfigFileID,\n\ttype ApplicationTypeFile,\n\tApplicationTypeFileID,\n\ttype ApplicationVersionFile,\n\ttype ApplicationVersionFile800,\n\tApplicationVersionFile800ID,\n\tApplicationVersionFileID,\n\ttype ControllerInfoFile,\n\tControllerInfoFileID,\n\tLRNodeInfoFileV5,\n\tNVMFile,\n\tNodeInfoFileV0,\n\tNodeInfoFileV1,\n\tProtocolAppRouteLockNodeMaskFile,\n\tProtocolAppRouteLockNodeMaskFileID,\n\tProtocolLRNodeListFile,\n\tProtocolLRNodeListFileID,\n\tProtocolNodeListFile,\n\tProtocolNodeListFileID,\n\tProtocolPendingDiscoveryNodeMaskFile,\n\tProtocolPendingDiscoveryNodeMaskFileID,\n\tProtocolPreferredRepeatersFile,\n\tProtocolPreferredRepeatersFileID,\n\tProtocolRouteCacheExistsNodeMaskFile,\n\tProtocolRouteCacheExistsNodeMaskFileID,\n\tProtocolRouteSlaveSUCNodeMaskFile,\n\tProtocolRouteSlaveSUCNodeMaskFileID,\n\tProtocolSUCPendingUpdateNodeMaskFile,\n\tProtocolSUCPendingUpdateNodeMaskFileID,\n\ttype ProtocolVersionFile,\n\tProtocolVersionFileID,\n\tProtocolVirtualNodeMaskFile,\n\tProtocolVirtualNodeMaskFileID,\n\tRouteCacheFileV0,\n\tRouteCacheFileV1,\n\tSUCUpdateEntriesFileIDV0,\n\tSUCUpdateEntriesFileV0,\n\tSUCUpdateEntriesFileV5,\n\tSUCUpdateEntriesFileV5IDBase,\n\tSUCUpdateEntriesFileV5IDMax,\n\tSUC_UPDATES_PER_FILE_V5,\n\tgetNVMSectionByFileID,\n\tnodeIdToLRNodeInfoFileIDV5,\n\tnodeIdToNodeInfoFileIDV0,\n\tnodeIdToNodeInfoFileIDV1,\n\tnodeIdToRouteCacheFileIDV0,\n\tnodeIdToRouteCacheFileIDV1,\n\tsucUpdateIndexToSUCUpdateEntriesFileIDV5,\n} from \"./files/index.js\";\n\nconst DEFAULT_FILE_VERSION = \"7.0.0\";\n\nexport class NVM3Adapter implements NVMAdapter {\n\tpublic constructor(nvm: NVM3) {\n\t\tthis._nvm = nvm;\n\t}\n\n\tprivate _nvm: NVM3;\n\tprivate _initialized: boolean = false;\n\n\tprivate _protocolInfo: {\n\t\tversion: string;\n\t\tformat: number;\n\t} | undefined;\n\tprivate _applicationInfo: {\n\t\tversion: string;\n\t\tformat: number;\n\t} | undefined;\n\n\t/** A list of pending changes that haven't been written to the NVM yet. `null` indicates a deleted entry. */\n\tprivate _pendingChanges: Map<number, BytesView | null> = new Map();\n\n\tprivate getFileVersion(fileId: number): string {\n\t\tif (\n\t\t\tfileId === ProtocolVersionFileID\n\t\t\t|| fileId === ApplicationVersionFileID\n\t\t\t|| fileId === ApplicationVersionFile800ID\n\t\t) {\n\t\t\treturn DEFAULT_FILE_VERSION;\n\t\t}\n\t\tconst section = getNVMSectionByFileID(fileId);\n\t\tif (section === \"application\") {\n\t\t\treturn this._applicationInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t} else if (section === \"protocol\") {\n\t\t\treturn this._protocolInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t}\n\n\t\treturn DEFAULT_FILE_VERSION;\n\t}\n\n\tprivate async init(): Promise<void> {\n\t\tif (!this._protocolInfo) {\n\t\t\tconst protocolVersionFile = await this._getFile<\n\t\t\t\tProtocolVersionFile\n\t\t\t>(\n\t\t\t\tProtocolVersionFileID,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tif (protocolVersionFile) {\n\t\t\t\tconst version =\n\t\t\t\t\t`${protocolVersionFile.major}.${protocolVersionFile.minor}.${protocolVersionFile.patch}`;\n\t\t\t\tthis._protocolInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: protocolVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (!this._applicationInfo) {\n\t\t\tconst applicationVersionFile700 = await this._getFile<\n\t\t\t\tApplicationVersionFile\n\t\t\t>(ApplicationVersionFileID, true);\n\t\t\tconst applicationVersionFile800 = await this._getFile<\n\t\t\t\tApplicationVersionFile800\n\t\t\t>(ApplicationVersionFile800ID, true);\n\t\t\tconst applicationVersionFile = applicationVersionFile700\n\t\t\t\t?? applicationVersionFile800;\n\n\t\t\tif (applicationVersionFile) {\n\t\t\t\tconst version =\n\t\t\t\t\t`${applicationVersionFile.major}.${applicationVersionFile.minor}.${applicationVersionFile.patch}`;\n\t\t\t\tthis._applicationInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: applicationVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tthis._initialized = true;\n\t}\n\n\t/** Adds a complete file to the list of pending changes */\n\tpublic setFile(file: NVMFile): void {\n\t\tconst { key, data } = file.serialize();\n\t\tthis._pendingChanges.set(key, data);\n\t}\n\n\tpublic async hasFile(fileId: number): Promise<boolean> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\treturn this._pendingChanges.get(fileId) !== null;\n\t\t} else {\n\t\t\treturn this._nvm.has(fileId);\n\t\t}\n\t}\n\n\tprivate async _getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T | undefined> {\n\t\tif (!skipInit && !this._initialized) await this.init();\n\n\t\t// Prefer pending changes over the actual NVM, so changes can be composed\n\t\tlet data: BytesView | null | undefined;\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\tdata = this._pendingChanges.get(fileId);\n\t\t} else {\n\t\t\tdata = await this._nvm.get(fileId);\n\t\t}\n\t\tif (!data) return;\n\n\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\treturn NVMFile.from(fileId, data, fileVersion) as T;\n\t}\n\n\tprivate async _expectFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T> {\n\t\tconst file = await this._getFile<T>(fileId, skipInit);\n\t\tif (!file) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`NVM file ${num2hex(fileId)} not found`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\t\treturn file;\n\t}\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired: true,\n\t): Promise<T>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: false,\n\t): Promise<T | undefined>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: boolean,\n\t): Promise<unknown> {\n\t\tif (required) {\n\t\t\treturn this._expectFile<T>(fileId) as any;\n\t\t} else {\n\t\t\treturn this._getFile<T>(fileId) as any;\n\t\t}\n\t}\n\n\tpublic get<T extends NVMProperty, R extends boolean = boolean>(\n\t\tproperty: T,\n\t\trequired?: R,\n\t): Promise<\n\t\tR extends true ? NVMPropertyToDataType<T>\n\t\t\t: (NVMPropertyToDataType<T> | undefined)\n\t> {\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.getControllerNVMProperty(property, !!required) as any;\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.getLRNodeNVMProperty(property, !!required) as any;\n\t\t} else {\n\t\t\treturn this.getNodeNVMProperty(property, !!required) as any;\n\t\t}\n\t}\n\n\tprivate async getControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tif (!file) return;\n\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.format;\n\t\t\t}\n\t\t\tcase \"applicationVersion\":\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\n\t\t\t\tif (!file) {\n\t\t\t\t\tif (required) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (property.type === \"applicationVersion\") {\n\t\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t\t} else if (property.type === \"applicationFileFormat\") {\n\t\t\t\t\treturn file?.format;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = await getFile<ApplicationDataFile>(\n\t\t\t\t\tApplicationDataFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.applicationData;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = await getFile<ApplicationNameFile>(\n\t\t\t\t\tApplicationNameFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.name;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file = await getFile<ControllerInfoFile>(\n\t\t\t\t\tControllerInfoFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file = await getFile<ApplicationCCsFile>(\n\t\t\t\t\tApplicationCCsFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await getFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await getFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = await getFile<ProtocolPreferredRepeatersFile>(\n\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = await getFile<SUCUpdateEntriesFileV0>(\n\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.updateEntries;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tconst updateEntries = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\t// None of the files are required\n\t\t\t\t\t\tconst file = await this._getFile<\n\t\t\t\t\t\t\tSUCUpdateEntriesFileV5\n\t\t\t\t\t\t>(\n\t\t\t\t\t\t\tsucUpdateIndexToSUCUpdateEntriesFileIDV5(index),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!file) break;\n\t\t\t\t\t\tupdateEntries.push(...file.updateEntries);\n\t\t\t\t\t}\n\t\t\t\t\treturn updateEntries;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV0>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV0(\n\t\t\t\t\t\t\tproperty.nodeId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfo;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV1(\n\t\t\t\t\t\t\tproperty.nodeId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfos.find((info) =>\n\t\t\t\t\t\tinfo.nodeId === property.nodeId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile = await this.getFile<\n\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFile\n\t\t\t\t>(ProtocolRouteCacheExistsNodeMaskFileID);\n\n\t\t\t\t// If the node is not marked as having routes, don't try to read them\n\t\t\t\tif (!nodeMaskFile) return;\n\t\t\t\tif (!nodeMaskFile.nodeIdSet.has(property.nodeId)) return;\n\n\t\t\t\tlet routeCache: RouteCache | undefined;\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV0>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV0(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCache;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV1(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCaches.find((route) =>\n\t\t\t\t\t\troute.nodeId === property.nodeId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!routeCache) return;\n\t\t\t\treturn {\n\t\t\t\t\tlwr: routeCache.lwr,\n\t\t\t\t\tnlwr: routeCache.nlwr,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst file = await getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tnodeIdToLRNodeInfoFileIDV5(property.nodeId),\n\t\t\t\t);\n\t\t\t\treturn file?.nodeInfos.find((info) =>\n\t\t\t\t\tinfo.nodeId === property.nodeId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tpublic async set<T extends NVMProperty>(\n\t\tproperty: T,\n\t\tvalue: NVMPropertyToDataType<T>,\n\t): Promise<void> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.setControllerNVMProperty(property, value);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.setLRNodeNVMProperty(property, value);\n\t\t} else {\n\t\t\treturn this.setNodeNVMProperty(property, value);\n\t\t}\n\t}\n\n\tprivate async setControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tfunction failFileMissing(): never {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot set property in NVM for non-existing file\",\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\n\t\tconst expectFile = async <T extends NVMFile>(\n\t\t\tfileId: number,\n\t\t): Promise<T> => {\n\t\t\tconst file = await this._getFile<T>(fileId);\n\t\t\tif (!file) failFileMissing();\n\t\t\treturn file;\n\t\t};\n\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst [major, minor, patch] = (value as string).split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationVersion\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\t\t\t\tif (!file) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst [major, minor, patch] = (value as string).split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file = await expectFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = new ApplicationDataFile({\n\t\t\t\t\tapplicationData: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationDataFileID),\n\t\t\t\t});\n\t\t\t\tfile.applicationData = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = new ApplicationNameFile({\n\t\t\t\t\tname: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationNameFileID),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file = await expectFile<ControllerInfoFile>(\n\t\t\t\t\tControllerInfoFileID,\n\t\t\t\t);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file = await expectFile<ApplicationCCsFile>(\n\t\t\t\t\tApplicationCCsFileID,\n\t\t\t\t);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await expectFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await expectFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t) ?? new ProtocolNodeListFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(ProtocolNodeListFileID),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t) ?? new ProtocolLRNodeListFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(ProtocolLRNodeListFileID),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t) ?? new ProtocolVirtualNodeMaskFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = new ProtocolPreferredRepeatersFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = new ProtocolAppRouteLockNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = new ProtocolRouteSlaveSUCNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = new ProtocolSUCPendingUpdateNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = new ProtocolPendingDiscoveryNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = new SUCUpdateEntriesFileV0({\n\t\t\t\t\t\tupdateEntries: value,\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst fileId = sucUpdateIndexToSUCUpdateEntriesFileIDV5(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst fileExists = await this.hasFile(fileId);\n\t\t\t\t\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\t\t\t\t\tconst slice = value.slice(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tindex + SUC_UPDATES_PER_FILE_V5,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (slice.length > 0) {\n\t\t\t\t\t\t\tconst file = new SUCUpdateEntriesFileV5({\n\t\t\t\t\t\t\t\tupdateEntries: slice,\n\t\t\t\t\t\t\t\tfileId,\n\t\t\t\t\t\t\t\tfileVersion,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t} else if (fileExists) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst fileId = nodeIdToLRNodeInfoFileIDV5(property.nodeId);\n\t\t\t\tlet file = await this._getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tfileId,\n\t\t\t\t);\n\t\t\t\tif (value) {\n\t\t\t\t\t// Info added or modified\n\t\t\t\t\tfile ??= new LRNodeInfoFileV5({\n\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t} else if (file) {\n\t\t\t\t\t// info deleted\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single node info per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV0({\n\t\t\t\t\t\t\tnodeInfo: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.nodeInfo = value;\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple node infos per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV1(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tfileId,\n\t\t\t\t\t);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV1({\n\t\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single route per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<RouteCacheFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Route added or modified\n\t\t\t\t\t\tfile ??= new RouteCacheFileV0({\n\t\t\t\t\t\t\trouteCache: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.routeCache = {\n\t\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// Route deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple routes per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV1(property.nodeId);\n\t\t\t\t\tconst file = await this._getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tfileId,\n\t\t\t\t\t) ?? new RouteCacheFileV1({\n\t\t\t\t\t\trouteCaches: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.routeCaches.findIndex(\n\t\t\t\t\t\t(route) => route.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tconst newRoute: RouteCache = {\n\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t};\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.routeCaches[existingIndex] = newRoute;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.routeCaches.push(newRoute);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t}\n\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile = await this._getFile<\n\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFile\n\t\t\t\t>(ProtocolRouteCacheExistsNodeMaskFileID)\n\t\t\t\t\t?? new ProtocolRouteCacheExistsNodeMaskFile({\n\t\t\t\t\t\tnodeIds: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFileID,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\n\t\t\t\tif (!value && nodeMaskFile.nodeIdSet.has(property.nodeId)) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.delete(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t} else if (\n\t\t\t\t\tvalue && !nodeMaskFile.nodeIdSet.has(property.nodeId)\n\t\t\t\t) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.add(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tpublic async delete(\n\t\tproperty: NVMProperty,\n\t): Promise<void> {\n\t\tif (property.domain === \"controller\") {\n\t\t\tswitch (property.type) {\n\t\t\t\tcase \"protocolVersion\":\n\t\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\t\tthis._pendingChanges.set(ProtocolVersionFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationVersion\":\n\t\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFileID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFile800ID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationData\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationDataFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationName\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationNameFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"homeId\":\n\t\t\t\tcase \"nodeId\":\n\t\t\t\tcase \"lastNodeId\":\n\t\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\tcase \"sucLastIndex\":\n\t\t\t\tcase \"controllerConfiguration\":\n\t\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\t\tcase \"maxNodeId\":\n\t\t\t\tcase \"reservedId\":\n\t\t\t\tcase \"systemState\":\n\t\t\t\tcase \"lastNodeIdLR\":\n\t\t\t\tcase \"maxNodeIdLR\":\n\t\t\t\tcase \"reservedIdLR\":\n\t\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\t\tcase \"dcdcConfig\": {\n\t\t\t\t\tthis._pendingChanges.set(ControllerInfoFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"includedInsecurely\":\n\t\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationCCsFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"rfRegion\":\n\t\t\t\tcase \"txPower\":\n\t\t\t\tcase \"measured0dBm\":\n\t\t\t\tcase \"enablePTI\":\n\t\t\t\tcase \"maxTXPower\":\n\t\t\t\tcase \"nodeIdType\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationRFConfigFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"isListening\":\n\t\t\t\tcase \"optionalFunctionality\":\n\t\t\t\tcase \"genericDeviceClass\":\n\t\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationTypeFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"nodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"lrNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"appRouteLock\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tlet id = SUCUpdateEntriesFileV5IDBase;\n\t\t\t\t\t\t\tid <= SUCUpdateEntriesFileV5IDMax;\n\t\t\t\t\t\t\tid++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (await this.hasFile(id)) {\n\t\t\t\t\t\t\t\tthis._pendingChanges.set(id, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"learnedHomeId\":\n\t\t\t\tcase \"commandClasses\":\n\t\t\t\tcase \"watchdogStarted\":\n\t\t\t\tcase \"powerLevelNormal\":\n\t\t\t\tcase \"powerLevelLow\":\n\t\t\t\tcase \"powerMode\":\n\t\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\t\treturn;\n\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(property);\n\t\t\t}\n\t\t} else if (\n\t\t\tproperty.domain === \"lrnode\"\n\t\t) {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setLRNodeNVMProperty(property, undefined);\n\t\t} else if (\n\t\t\tproperty.domain === \"node\"\n\t\t) {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setNodeNVMProperty(property, undefined);\n\t\t}\n\t}\n\n\tpublic hasPendingChanges(): boolean {\n\t\treturn this._pendingChanges.size > 0;\n\t}\n\n\tpublic async commit(): Promise<void> {\n\t\tawait this._nvm.setMany([...this._pendingChanges]);\n\t}\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport { type BytesView, num2hex } from \"@zwave-js/shared\";\nimport { assertNever } from \"alcalzone-shared/helpers\";\n\nimport { SUC_MAX_UPDATES } from \"../../consts.js\";\nimport type { NVM3 } from \"../NVM3.js\";\nimport type {\n\tControllerNVMProperty,\n\tLRNodeNVMProperty,\n\tNVMAdapter,\n\tNVMProperty,\n\tNVMPropertyToDataType,\n\tNodeNVMProperty,\n} from \"../common/definitions.js\";\nimport type { RouteCache } from \"../common/routeCache.js\";\n\nimport {\n\ttype ApplicationCCsFile,\n\tApplicationCCsFileID,\n\tApplicationDataFile,\n\tApplicationDataFileID,\n\tApplicationNameFile,\n\tApplicationNameFileID,\n\ttype ApplicationRFConfigFile,\n\tApplicationRFConfigFileID,\n\ttype ApplicationTypeFile,\n\tApplicationTypeFileID,\n\ttype ApplicationVersionFile,\n\ttype ApplicationVersionFile800,\n\tApplicationVersionFile800ID,\n\tApplicationVersionFileID,\n\ttype ControllerInfoFile,\n\tControllerInfoFileID,\n\tLRNodeInfoFileV5,\n\tNVMFile,\n\tNodeInfoFileV0,\n\tNodeInfoFileV1,\n\tProtocolAppRouteLockNodeMaskFile,\n\tProtocolAppRouteLockNodeMaskFileID,\n\tProtocolLRNodeListFile,\n\tProtocolLRNodeListFileID,\n\tProtocolNodeListFile,\n\tProtocolNodeListFileID,\n\tProtocolPendingDiscoveryNodeMaskFile,\n\tProtocolPendingDiscoveryNodeMaskFileID,\n\tProtocolPreferredRepeatersFile,\n\tProtocolPreferredRepeatersFileID,\n\tProtocolRouteCacheExistsNodeMaskFile,\n\tProtocolRouteCacheExistsNodeMaskFileID,\n\tProtocolRouteSlaveSUCNodeMaskFile,\n\tProtocolRouteSlaveSUCNodeMaskFileID,\n\tProtocolSUCPendingUpdateNodeMaskFile,\n\tProtocolSUCPendingUpdateNodeMaskFileID,\n\ttype ProtocolVersionFile,\n\tProtocolVersionFileID,\n\tProtocolVirtualNodeMaskFile,\n\tProtocolVirtualNodeMaskFileID,\n\tRouteCacheFileV0,\n\tRouteCacheFileV1,\n\tSUCUpdateEntriesFileIDV0,\n\tSUCUpdateEntriesFileV0,\n\tSUCUpdateEntriesFileV5,\n\tSUCUpdateEntriesFileV5IDBase,\n\tSUCUpdateEntriesFileV5IDMax,\n\tSUC_UPDATES_PER_FILE_V5,\n\tgetNVMSectionByFileID,\n\tnodeIdToLRNodeInfoFileIDV5,\n\tnodeIdToNodeInfoFileIDV0,\n\tnodeIdToNodeInfoFileIDV1,\n\tnodeIdToRouteCacheFileIDV0,\n\tnodeIdToRouteCacheFileIDV1,\n\tsucUpdateIndexToSUCUpdateEntriesFileIDV5,\n} from \"./files/index.js\";\n\nconst DEFAULT_FILE_VERSION = \"7.0.0\";\n\nexport class NVM3Adapter implements NVMAdapter {\n\tpublic constructor(nvm: NVM3) {\n\t\tthis._nvm = nvm;\n\t}\n\n\tprivate _nvm: NVM3;\n\tprivate _initialized: boolean = false;\n\n\tprivate _protocolInfo:\n\t\t| {\n\t\t\t\tversion: string;\n\t\t\t\tformat: number;\n\t\t }\n\t\t| undefined;\n\tprivate _applicationInfo:\n\t\t| {\n\t\t\t\tversion: string;\n\t\t\t\tformat: number;\n\t\t }\n\t\t| undefined;\n\n\t/** A list of pending changes that haven't been written to the NVM yet. `null` indicates a deleted entry. */\n\tprivate _pendingChanges: Map<number, BytesView | null> = new Map();\n\n\tprivate getFileVersion(fileId: number): string {\n\t\tif (\n\t\t\tfileId === ProtocolVersionFileID\n\t\t\t|| fileId === ApplicationVersionFileID\n\t\t\t|| fileId === ApplicationVersionFile800ID\n\t\t) {\n\t\t\treturn DEFAULT_FILE_VERSION;\n\t\t}\n\t\tconst section = getNVMSectionByFileID(fileId);\n\t\tif (section === \"application\") {\n\t\t\treturn this._applicationInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t} else if (section === \"protocol\") {\n\t\t\treturn this._protocolInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t}\n\n\t\treturn DEFAULT_FILE_VERSION;\n\t}\n\n\tprivate async init(): Promise<void> {\n\t\tif (!this._protocolInfo) {\n\t\t\tconst protocolVersionFile =\n\t\t\t\tawait this._getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\tif (protocolVersionFile) {\n\t\t\t\tconst version = `${protocolVersionFile.major}.${protocolVersionFile.minor}.${protocolVersionFile.patch}`;\n\t\t\t\tthis._protocolInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: protocolVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (!this._applicationInfo) {\n\t\t\tconst applicationVersionFile700 =\n\t\t\t\tawait this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\tconst applicationVersionFile800 =\n\t\t\t\tawait this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\tconst applicationVersionFile =\n\t\t\t\tapplicationVersionFile700 ?? applicationVersionFile800;\n\n\t\t\tif (applicationVersionFile) {\n\t\t\t\tconst version = `${applicationVersionFile.major}.${applicationVersionFile.minor}.${applicationVersionFile.patch}`;\n\t\t\t\tthis._applicationInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: applicationVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tthis._initialized = true;\n\t}\n\n\t/** Adds a complete file to the list of pending changes */\n\tpublic setFile(file: NVMFile): void {\n\t\tconst { key, data } = file.serialize();\n\t\tthis._pendingChanges.set(key, data);\n\t}\n\n\tpublic async hasFile(fileId: number): Promise<boolean> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\treturn this._pendingChanges.get(fileId) !== null;\n\t\t} else {\n\t\t\treturn this._nvm.has(fileId);\n\t\t}\n\t}\n\n\tprivate async _getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T | undefined> {\n\t\tif (!skipInit && !this._initialized) await this.init();\n\n\t\t// Prefer pending changes over the actual NVM, so changes can be composed\n\t\tlet data: BytesView | null | undefined;\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\tdata = this._pendingChanges.get(fileId);\n\t\t} else {\n\t\t\tdata = await this._nvm.get(fileId);\n\t\t}\n\t\tif (!data) return;\n\n\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\treturn NVMFile.from(fileId, data, fileVersion) as T;\n\t}\n\n\tprivate async _expectFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T> {\n\t\tconst file = await this._getFile<T>(fileId, skipInit);\n\t\tif (!file) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`NVM file ${num2hex(fileId)} not found`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\t\treturn file;\n\t}\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired: true,\n\t): Promise<T>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: false,\n\t): Promise<T | undefined>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: boolean,\n\t): Promise<unknown> {\n\t\tif (required) {\n\t\t\treturn this._expectFile<T>(fileId) as any;\n\t\t} else {\n\t\t\treturn this._getFile<T>(fileId) as any;\n\t\t}\n\t}\n\n\tpublic get<T extends NVMProperty, R extends boolean = boolean>(\n\t\tproperty: T,\n\t\trequired?: R,\n\t): Promise<\n\t\tR extends true\n\t\t\t? NVMPropertyToDataType<T>\n\t\t\t: NVMPropertyToDataType<T> | undefined\n\t> {\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.getControllerNVMProperty(property, !!required) as any;\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.getLRNodeNVMProperty(property, !!required) as any;\n\t\t} else {\n\t\t\treturn this.getNodeNVMProperty(property, !!required) as any;\n\t\t}\n\t}\n\n\tprivate async getControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tif (!file) return;\n\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.format;\n\t\t\t}\n\t\t\tcase \"applicationVersion\":\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\n\t\t\t\tif (!file) {\n\t\t\t\t\tif (required) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (property.type === \"applicationVersion\") {\n\t\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t\t} else if (property.type === \"applicationFileFormat\") {\n\t\t\t\t\treturn file?.format;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = await getFile<ApplicationDataFile>(\n\t\t\t\t\tApplicationDataFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.applicationData;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = await getFile<ApplicationNameFile>(\n\t\t\t\t\tApplicationNameFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.name;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file =\n\t\t\t\t\tawait getFile<ControllerInfoFile>(ControllerInfoFileID);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file =\n\t\t\t\t\tawait getFile<ApplicationCCsFile>(ApplicationCCsFileID);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await getFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await getFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = await getFile<ProtocolPreferredRepeatersFile>(\n\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = await getFile<ProtocolAppRouteLockNodeMaskFile>(\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = await getFile<ProtocolRouteSlaveSUCNodeMaskFile>(\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file =\n\t\t\t\t\tawait getFile<ProtocolSUCPendingUpdateNodeMaskFile>(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file =\n\t\t\t\t\tawait getFile<ProtocolPendingDiscoveryNodeMaskFile>(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = await getFile<SUCUpdateEntriesFileV0>(\n\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.updateEntries;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tconst updateEntries = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\t// None of the files are required\n\t\t\t\t\t\tconst file =\n\t\t\t\t\t\t\tawait this._getFile<SUCUpdateEntriesFileV5>(\n\t\t\t\t\t\t\t\tsucUpdateIndexToSUCUpdateEntriesFileIDV5(index),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!file) break;\n\t\t\t\t\t\tupdateEntries.push(...file.updateEntries);\n\t\t\t\t\t}\n\t\t\t\t\treturn updateEntries;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV0>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV0(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfo;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV1(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfos.find(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile =\n\t\t\t\t\tawait this.getFile<ProtocolRouteCacheExistsNodeMaskFile>(\n\t\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFileID,\n\t\t\t\t\t);\n\n\t\t\t\t// If the node is not marked as having routes, don't try to read them\n\t\t\t\tif (!nodeMaskFile) return;\n\t\t\t\tif (!nodeMaskFile.nodeIdSet.has(property.nodeId)) return;\n\n\t\t\t\tlet routeCache: RouteCache | undefined;\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV0>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV0(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCache;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV1(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCaches.find(\n\t\t\t\t\t\t(route) => route.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!routeCache) return;\n\t\t\t\treturn {\n\t\t\t\t\tlwr: routeCache.lwr,\n\t\t\t\t\tnlwr: routeCache.nlwr,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst file = await getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tnodeIdToLRNodeInfoFileIDV5(property.nodeId),\n\t\t\t\t);\n\t\t\t\treturn file?.nodeInfos.find(\n\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tpublic async set<T extends NVMProperty>(\n\t\tproperty: T,\n\t\tvalue: NVMPropertyToDataType<T>,\n\t): Promise<void> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.setControllerNVMProperty(property, value);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.setLRNodeNVMProperty(property, value);\n\t\t} else {\n\t\t\treturn this.setNodeNVMProperty(property, value);\n\t\t}\n\t}\n\n\tprivate async setControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tfunction failFileMissing(): never {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot set property in NVM for non-existing file\",\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\n\t\tconst expectFile = async <T extends NVMFile>(\n\t\t\tfileId: number,\n\t\t): Promise<T> => {\n\t\t\tconst file = await this._getFile<T>(fileId);\n\t\t\tif (!file) failFileMissing();\n\t\t\treturn file;\n\t\t};\n\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst [major, minor, patch] = (value as string)\n\t\t\t\t\t.split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationVersion\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\t\t\t\tif (!file) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst [major, minor, patch] = (value as string)\n\t\t\t\t\t.split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file = await expectFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = new ApplicationDataFile({\n\t\t\t\t\tapplicationData: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationDataFileID),\n\t\t\t\t});\n\t\t\t\tfile.applicationData = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = new ApplicationNameFile({\n\t\t\t\t\tname: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationNameFileID),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file =\n\t\t\t\t\tawait expectFile<ControllerInfoFile>(ControllerInfoFileID);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file =\n\t\t\t\t\tawait expectFile<ApplicationCCsFile>(ApplicationCCsFileID);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await expectFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await expectFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file =\n\t\t\t\t\t(await this._getFile<ProtocolNodeListFile>(\n\t\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t\t))\n\t\t\t\t\t?? new ProtocolNodeListFile({\n\t\t\t\t\t\tnodeIds: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file =\n\t\t\t\t\t(await this._getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t\t))\n\t\t\t\t\t?? new ProtocolLRNodeListFile({\n\t\t\t\t\t\tnodeIds: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file =\n\t\t\t\t\t(await this._getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t))\n\t\t\t\t\t?? new ProtocolVirtualNodeMaskFile({\n\t\t\t\t\t\tnodeIds: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = new ProtocolPreferredRepeatersFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = new ProtocolAppRouteLockNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = new ProtocolRouteSlaveSUCNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = new ProtocolSUCPendingUpdateNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = new ProtocolPendingDiscoveryNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = new SUCUpdateEntriesFileV0({\n\t\t\t\t\t\tupdateEntries: value,\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst fileId =\n\t\t\t\t\t\t\tsucUpdateIndexToSUCUpdateEntriesFileIDV5(index);\n\t\t\t\t\t\tconst fileExists = await this.hasFile(fileId);\n\t\t\t\t\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\t\t\t\t\tconst slice = value.slice(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tindex + SUC_UPDATES_PER_FILE_V5,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (slice.length > 0) {\n\t\t\t\t\t\t\tconst file = new SUCUpdateEntriesFileV5({\n\t\t\t\t\t\t\t\tupdateEntries: slice,\n\t\t\t\t\t\t\t\tfileId,\n\t\t\t\t\t\t\t\tfileVersion,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t} else if (fileExists) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst fileId = nodeIdToLRNodeInfoFileIDV5(property.nodeId);\n\t\t\t\tlet file = await this._getFile<LRNodeInfoFileV5>(fileId);\n\t\t\t\tif (value) {\n\t\t\t\t\t// Info added or modified\n\t\t\t\t\tfile ??= new LRNodeInfoFileV5({\n\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t} else if (file) {\n\t\t\t\t\t// info deleted\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single node info per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV0({\n\t\t\t\t\t\t\tnodeInfo: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.nodeInfo = value;\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple node infos per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV1(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV1>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV1({\n\t\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single route per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<RouteCacheFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Route added or modified\n\t\t\t\t\t\tfile ??= new RouteCacheFileV0({\n\t\t\t\t\t\t\trouteCache: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.routeCache = {\n\t\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// Route deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple routes per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV1(property.nodeId);\n\t\t\t\t\tconst file =\n\t\t\t\t\t\t(await this._getFile<RouteCacheFileV1>(fileId))\n\t\t\t\t\t\t?? new RouteCacheFileV1({\n\t\t\t\t\t\t\trouteCaches: [],\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.routeCaches.findIndex(\n\t\t\t\t\t\t(route) => route.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tconst newRoute: RouteCache = {\n\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t};\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.routeCaches[existingIndex] = newRoute;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.routeCaches.push(newRoute);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t}\n\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile =\n\t\t\t\t\t(await this._getFile<ProtocolRouteCacheExistsNodeMaskFile>(\n\t\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFileID,\n\t\t\t\t\t))\n\t\t\t\t\t?? new ProtocolRouteCacheExistsNodeMaskFile({\n\t\t\t\t\t\tnodeIds: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFileID,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\n\t\t\t\tif (!value && nodeMaskFile.nodeIdSet.has(property.nodeId)) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.delete(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t} else if (\n\t\t\t\t\tvalue\n\t\t\t\t\t&& !nodeMaskFile.nodeIdSet.has(property.nodeId)\n\t\t\t\t) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.add(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tpublic async delete(property: NVMProperty): Promise<void> {\n\t\tif (property.domain === \"controller\") {\n\t\t\tswitch (property.type) {\n\t\t\t\tcase \"protocolVersion\":\n\t\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\t\tthis._pendingChanges.set(ProtocolVersionFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationVersion\":\n\t\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFileID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFile800ID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationData\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationDataFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationName\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationNameFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"homeId\":\n\t\t\t\tcase \"nodeId\":\n\t\t\t\tcase \"lastNodeId\":\n\t\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\tcase \"sucLastIndex\":\n\t\t\t\tcase \"controllerConfiguration\":\n\t\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\t\tcase \"maxNodeId\":\n\t\t\t\tcase \"reservedId\":\n\t\t\t\tcase \"systemState\":\n\t\t\t\tcase \"lastNodeIdLR\":\n\t\t\t\tcase \"maxNodeIdLR\":\n\t\t\t\tcase \"reservedIdLR\":\n\t\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\t\tcase \"dcdcConfig\": {\n\t\t\t\t\tthis._pendingChanges.set(ControllerInfoFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"includedInsecurely\":\n\t\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationCCsFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"rfRegion\":\n\t\t\t\tcase \"txPower\":\n\t\t\t\tcase \"measured0dBm\":\n\t\t\t\tcase \"enablePTI\":\n\t\t\t\tcase \"maxTXPower\":\n\t\t\t\tcase \"nodeIdType\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationRFConfigFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"isListening\":\n\t\t\t\tcase \"optionalFunctionality\":\n\t\t\t\tcase \"genericDeviceClass\":\n\t\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationTypeFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"nodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(ProtocolNodeListFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"lrNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(ProtocolLRNodeListFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"appRouteLock\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tlet id = SUCUpdateEntriesFileV5IDBase;\n\t\t\t\t\t\t\tid <= SUCUpdateEntriesFileV5IDMax;\n\t\t\t\t\t\t\tid++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (await this.hasFile(id)) {\n\t\t\t\t\t\t\t\tthis._pendingChanges.set(id, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"learnedHomeId\":\n\t\t\t\tcase \"commandClasses\":\n\t\t\t\tcase \"watchdogStarted\":\n\t\t\t\tcase \"powerLevelNormal\":\n\t\t\t\tcase \"powerLevelLow\":\n\t\t\t\tcase \"powerMode\":\n\t\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\t\treturn;\n\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(property);\n\t\t\t}\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setLRNodeNVMProperty(property, undefined);\n\t\t} else if (property.domain === \"node\") {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setNodeNVMProperty(property, undefined);\n\t\t}\n\t}\n\n\tpublic hasPendingChanges(): boolean {\n\t\treturn this._pendingChanges.size > 0;\n\t}\n\n\tpublic async commit(): Promise<void> {\n\t\tawait this._nvm.setMany([...this._pendingChanges]);\n\t}\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/nvm3/consts.ts"],
4
- "sourcesContent": ["// NVM area sizes\nexport const ZWAVE_APPLICATION_NVM_SIZE = 0x3000;\nexport const ZWAVE_PROTOCOL_NVM_SIZE = 0xc000 - ZWAVE_APPLICATION_NVM_SIZE;\n// The 800 series has a shared application/protocol NVM, which is 8 KB smaller\n// than the 700 series\nexport const ZWAVE_SHARED_NVM_SIZE = 0xA000;\n\n// Everything must be word-aligned\nexport const NVM3_WORD_SIZE = 4;\n\n// Definitions for NVM3 pages\nexport const NVM3_MIN_PAGE_SIZE = 512;\nexport const NVM3_PAGE_HEADER_SIZE = 20;\nexport const NVM3_PAGE_COUNTER_SIZE = 27;\nexport const NVM3_PAGE_COUNTER_MASK = (1 << NVM3_PAGE_COUNTER_SIZE) - 1;\nexport const NVM3_PAGE_MAGIC = 0xb29a;\n\nexport const FLASH_MAX_PAGE_SIZE_700 = 2048; // not sure if this is true for all 700 series chips\nexport const FLASH_MAX_PAGE_SIZE_800 = 8192;\n\nexport enum PageStatus {\n\tOK = 0xffffffff,\n\tOK_ErasePending = 0xffffa5a5,\n\tBad = 0x0000ffff,\n\tBad_ErasePending = 0x0000a5a5,\n}\n\nexport enum PageWriteSize {\n\tWRITE_SIZE_32 = 0, // Only single writes are allowed\n\tWRITE_SIZE_16 = 1, // Two writes are allowed\n}\n\n// Definitions for NVM3 objects\nexport const NVM3_OBJ_KEY_SHIFT = 7;\nexport const NVM3_OBJ_KEY_SIZE = 20;\nexport const NVM3_OBJ_KEY_MASK = (1 << NVM3_OBJ_KEY_SIZE) - 1;\nexport const NVM3_OBJ_TYPE_MASK = 0b111_1111;\nexport const NVM3_OBJ_LARGE_LEN_SIZE = 26;\nexport const NVM3_OBJ_LARGE_LEN_MASK = (1 << NVM3_OBJ_LARGE_LEN_SIZE) - 1;\nexport const NVM3_OBJ_FRAGTYPE_SHIFT = 27;\nexport const NVM3_OBJ_FRAGTYPE_MASK = 0b11;\nexport const NVM3_CODE_SMALL_SHIFT = 27;\nexport const NVM3_CODE_LARGE_SHIFT = 26;\n\nexport const NVM3_OBJ_HEADER_SIZE_SMALL = 4;\nexport const NVM3_OBJ_HEADER_SIZE_LARGE = 8;\n\nexport const NVM3_MAX_OBJ_SIZE_SMALL = 120;\nexport const NVM3_MAX_OBJ_SIZE_LARGE = 1900; // 204..4096, see nvm3.h in zw_nvm_converter\nexport const NVM3_COUNTER_SIZE = 204;\n\nexport enum ObjectType {\n\tDataLarge = 0,\n\tCounterLarge = 1,\n\tCounterSmall = 2,\n\tDeleted = 3,\n\tDataSmall = 7,\n}\n\nexport enum FragmentType {\n\tNone = 0,\n\tFirst = 1,\n\tNext = 2,\n\tLast = 3,\n}\n"],
4
+ "sourcesContent": ["// NVM area sizes\nexport const ZWAVE_APPLICATION_NVM_SIZE = 0x3000;\nexport const ZWAVE_PROTOCOL_NVM_SIZE = 0xc000 - ZWAVE_APPLICATION_NVM_SIZE;\n// The 800 series has a shared application/protocol NVM, which is 8 KB smaller\n// than the 700 series\nexport const ZWAVE_SHARED_NVM_SIZE = 0xa000;\n\n// Everything must be word-aligned\nexport const NVM3_WORD_SIZE = 4;\n\n// Definitions for NVM3 pages\nexport const NVM3_MIN_PAGE_SIZE = 512;\nexport const NVM3_PAGE_HEADER_SIZE = 20;\nexport const NVM3_PAGE_COUNTER_SIZE = 27;\nexport const NVM3_PAGE_COUNTER_MASK = (1 << NVM3_PAGE_COUNTER_SIZE) - 1;\nexport const NVM3_PAGE_MAGIC = 0xb29a;\n\nexport const FLASH_MAX_PAGE_SIZE_700 = 2048; // not sure if this is true for all 700 series chips\nexport const FLASH_MAX_PAGE_SIZE_800 = 8192;\n\nexport enum PageStatus {\n\tOK = 0xffffffff,\n\tOK_ErasePending = 0xffffa5a5,\n\tBad = 0x0000ffff,\n\tBad_ErasePending = 0x0000a5a5,\n}\n\nexport enum PageWriteSize {\n\tWRITE_SIZE_32 = 0, // Only single writes are allowed\n\tWRITE_SIZE_16 = 1, // Two writes are allowed\n}\n\n// Definitions for NVM3 objects\nexport const NVM3_OBJ_KEY_SHIFT = 7;\nexport const NVM3_OBJ_KEY_SIZE = 20;\nexport const NVM3_OBJ_KEY_MASK = (1 << NVM3_OBJ_KEY_SIZE) - 1;\nexport const NVM3_OBJ_TYPE_MASK = 0b111_1111;\nexport const NVM3_OBJ_LARGE_LEN_SIZE = 26;\nexport const NVM3_OBJ_LARGE_LEN_MASK = (1 << NVM3_OBJ_LARGE_LEN_SIZE) - 1;\nexport const NVM3_OBJ_FRAGTYPE_SHIFT = 27;\nexport const NVM3_OBJ_FRAGTYPE_MASK = 0b11;\nexport const NVM3_CODE_SMALL_SHIFT = 27;\nexport const NVM3_CODE_LARGE_SHIFT = 26;\n\nexport const NVM3_OBJ_HEADER_SIZE_SMALL = 4;\nexport const NVM3_OBJ_HEADER_SIZE_LARGE = 8;\n\nexport const NVM3_MAX_OBJ_SIZE_SMALL = 120;\nexport const NVM3_MAX_OBJ_SIZE_LARGE = 1900; // 204..4096, see nvm3.h in zw_nvm_converter\nexport const NVM3_COUNTER_SIZE = 204;\n\nexport enum ObjectType {\n\tDataLarge = 0,\n\tCounterLarge = 1,\n\tCounterSmall = 2,\n\tDeleted = 3,\n\tDataSmall = 7,\n}\n\nexport enum FragmentType {\n\tNone = 0,\n\tFirst = 1,\n\tNext = 2,\n\tLast = 3,\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACO,MAAM,6BAA6B;AACnC,MAAM,0BAA0B,QAAS;AAGzC,MAAM,wBAAwB;AAG9B,MAAM,iBAAiB;AAGvB,MAAM,qBAAqB;AAC3B,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,0BAA0B,KAAK,0BAA0B;AAC/D,MAAM,kBAAkB;AAExB,MAAM,0BAA0B;AAChC,MAAM,0BAA0B;AAEvC,IAAY;CAAZ,SAAYA,aAAU;AACrB,EAAAA,YAAAA,YAAA,IAAA,IAAA,UAAA,IAAA;AACA,EAAAA,YAAAA,YAAA,iBAAA,IAAA,UAAA,IAAA;AACA,EAAAA,YAAAA,YAAA,KAAA,IAAA,KAAA,IAAA;AACA,EAAAA,YAAAA,YAAA,kBAAA,IAAA,KAAA,IAAA;AACD,GALY,eAAA,aAAU,CAAA,EAAA;AAOtB,IAAY;CAAZ,SAAYC,gBAAa;AACxB,EAAAA,eAAAA,eAAA,eAAA,IAAA,CAAA,IAAA;AACA,EAAAA,eAAAA,eAAA,eAAA,IAAA,CAAA,IAAA;AACD,GAHY,kBAAA,gBAAa,CAAA,EAAA;AAMlB,MAAM,qBAAqB;AAC3B,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB,KAAK,qBAAqB;AACrD,MAAM,qBAAqB;AAC3B,MAAM,0BAA0B;AAChC,MAAM,2BAA2B,KAAK,2BAA2B;AACjE,MAAM,0BAA0B;AAChC,MAAM,yBAAyB;AAC/B,MAAM,wBAAwB;AAC9B,MAAM,wBAAwB;AAE9B,MAAM,6BAA6B;AACnC,MAAM,6BAA6B;AAEnC,MAAM,0BAA0B;AAChC,MAAM,0BAA0B;AAChC,MAAM,oBAAoB;AAEjC,IAAY;CAAZ,SAAYC,aAAU;AACrB,EAAAA,YAAAA,YAAA,WAAA,IAAA,CAAA,IAAA;AACA,EAAAA,YAAAA,YAAA,cAAA,IAAA,CAAA,IAAA;AACA,EAAAA,YAAAA,YAAA,cAAA,IAAA,CAAA,IAAA;AACA,EAAAA,YAAAA,YAAA,SAAA,IAAA,CAAA,IAAA;AACA,EAAAA,YAAAA,YAAA,WAAA,IAAA,CAAA,IAAA;AACD,GANY,eAAA,aAAU,CAAA,EAAA;AAQtB,IAAY;CAAZ,SAAYC,eAAY;AACvB,EAAAA,cAAAA,cAAA,MAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,OAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,MAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,MAAA,IAAA,CAAA,IAAA;AACD,GALY,iBAAA,eAAY,CAAA,EAAA;",
6
6
  "names": ["PageStatus", "PageWriteSize", "ObjectType", "FragmentType"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/nvm3/files/ApplicationCCsFile.ts"],
4
- "sourcesContent": ["import { CommandClasses } from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport type { NVM3Object } from \"../object.js\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationCCsFileOptions extends NVMFileCreationOptions {\n\tincludedInsecurely: CommandClasses[];\n\tincludedSecurelyInsecureCCs: CommandClasses[];\n\tincludedSecurelySecureCCs: CommandClasses[];\n}\n\nconst MAX_CCs = 35;\n\nexport const ApplicationCCsFileID = 103;\n\n@nvmFileID(ApplicationCCsFileID)\n@nvmSection(\"application\")\nexport class ApplicationCCsFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationCCsFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tlet offset = 0;\n\t\t\tlet numCCs = this.payload[offset];\n\t\t\tthis.includedInsecurely = [\n\t\t\t\t...this.payload.subarray(offset + 1, offset + 1 + numCCs),\n\t\t\t];\n\t\t\toffset += 1 + MAX_CCs;\n\n\t\t\tnumCCs = this.payload[offset];\n\t\t\tthis.includedSecurelyInsecureCCs = [\n\t\t\t\t...this.payload.subarray(offset + 1, offset + 1 + numCCs),\n\t\t\t];\n\t\t\toffset += 1 + MAX_CCs;\n\t\t\tnumCCs = this.payload[offset];\n\t\t\tthis.includedSecurelySecureCCs = [\n\t\t\t\t...this.payload.subarray(offset + 1, offset + 1 + numCCs),\n\t\t\t];\n\t\t} else {\n\t\t\tthis.includedInsecurely = options.includedInsecurely;\n\t\t\tthis.includedSecurelyInsecureCCs =\n\t\t\t\toptions.includedSecurelyInsecureCCs;\n\t\t\tthis.includedSecurelySecureCCs = options.includedSecurelySecureCCs;\n\t\t}\n\t}\n\n\tpublic includedInsecurely: CommandClasses[];\n\tpublic includedSecurelyInsecureCCs: CommandClasses[];\n\tpublic includedSecurelySecureCCs: CommandClasses[];\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tthis.payload = new Bytes((1 + MAX_CCs) * 3);\n\t\tlet offset = 0;\n\t\tfor (\n\t\t\tconst array of [\n\t\t\t\tthis.includedInsecurely,\n\t\t\t\tthis.includedSecurelyInsecureCCs,\n\t\t\t\tthis.includedSecurelySecureCCs,\n\t\t\t]\n\t\t) {\n\t\t\tthis.payload[offset] = array.length;\n\t\t\tthis.payload.set(array, offset + 1);\n\t\t\toffset += 1 + MAX_CCs;\n\t\t}\n\t\treturn super.serialize();\n\t}\n\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\t\"included insecurely\": this.includedInsecurely\n\t\t\t\t.map((cc) => CommandClasses[cc])\n\t\t\t\t.join(\", \"),\n\t\t\t\"included securely (insecure)\": this.includedSecurelyInsecureCCs\n\t\t\t\t.map((cc) => CommandClasses[cc])\n\t\t\t\t.join(\", \"),\n\t\t\t\"included securely (secure)\": this.includedSecurelySecureCCs\n\t\t\t\t.map((cc) => CommandClasses[cc])\n\t\t\t\t.join(\", \"),\n\t\t};\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kBAA+B;AAC/B,oBAAsB;AAEtB,qBAOO;AAQP,MAAM,UAAU;AAET,MAAM,uBAAuB;IAIvB,sBAAkB,MAAA;8BAF9B,0BAAU,oBAAoB,OAC9B,2BAAW,aAAa,CAAC;;;;oBACc;0CAAA,YAAO;WAAA;;;;;;;;AAA/C,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACZ,YACC,SAAkE;AAElE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,YAAI,SAAS;AACb,YAAI,SAAS,KAAK,QAAQ,MAAM;AAChC,aAAK,qBAAqB;UACzB,GAAG,KAAK,QAAQ,SAAS,SAAS,GAAG,SAAS,IAAI,MAAM;;AAEzD,kBAAU,IAAI;AAEd,iBAAS,KAAK,QAAQ,MAAM;AAC5B,aAAK,8BAA8B;UAClC,GAAG,KAAK,QAAQ,SAAS,SAAS,GAAG,SAAS,IAAI,MAAM;;AAEzD,kBAAU,IAAI;AACd,iBAAS,KAAK,QAAQ,MAAM;AAC5B,aAAK,4BAA4B;UAChC,GAAG,KAAK,QAAQ,SAAS,SAAS,GAAG,SAAS,IAAI,MAAM;;MAE1D,OAAO;AACN,aAAK,qBAAqB,QAAQ;AAClC,aAAK,8BACJ,QAAQ;AACT,aAAK,4BAA4B,QAAQ;MAC1C;IACD;IAEO;IACA;IACA;IAEA,YAAS;AACf,WAAK,UAAU,IAAI,qBAAO,IAAI,WAAW,CAAC;AAC1C,UAAI,SAAS;AACb,iBACO,SAAS;QACd,KAAK;QACL,KAAK;QACL,KAAK;SAEL;AACD,aAAK,QAAQ,MAAM,IAAI,MAAM;AAC7B,aAAK,QAAQ,IAAI,OAAO,SAAS,CAAC;AAClC,kBAAU,IAAI;MACf;AACA,aAAO,MAAM,UAAS;IACvB;;IAGO,SAAM;AACZ,aAAO;QACN,GAAG,MAAM,OAAM;QACf,uBAAuB,KAAK,mBAC1B,IAAI,CAAC,OAAO,2BAAe,EAAE,CAAC,EAC9B,KAAK,IAAI;QACX,gCAAgC,KAAK,4BACnC,IAAI,CAAC,OAAO,2BAAe,EAAE,CAAC,EAC9B,KAAK,IAAI;QACX,8BAA8B,KAAK,0BACjC,IAAI,CAAC,OAAO,2BAAe,EAAE,CAAC,EAC9B,KAAK,IAAI;;IAEb;;;;",
4
+ "sourcesContent": ["import { CommandClasses } from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\n\nimport type { NVM3Object } from \"../object.js\";\n\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationCCsFileOptions extends NVMFileCreationOptions {\n\tincludedInsecurely: CommandClasses[];\n\tincludedSecurelyInsecureCCs: CommandClasses[];\n\tincludedSecurelySecureCCs: CommandClasses[];\n}\n\nconst MAX_CCs = 35;\n\nexport const ApplicationCCsFileID = 103;\n\n@nvmFileID(ApplicationCCsFileID)\n@nvmSection(\"application\")\nexport class ApplicationCCsFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationCCsFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tlet offset = 0;\n\t\t\tlet numCCs = this.payload[offset];\n\t\t\tthis.includedInsecurely = [\n\t\t\t\t...this.payload.subarray(offset + 1, offset + 1 + numCCs),\n\t\t\t];\n\t\t\toffset += 1 + MAX_CCs;\n\n\t\t\tnumCCs = this.payload[offset];\n\t\t\tthis.includedSecurelyInsecureCCs = [\n\t\t\t\t...this.payload.subarray(offset + 1, offset + 1 + numCCs),\n\t\t\t];\n\t\t\toffset += 1 + MAX_CCs;\n\t\t\tnumCCs = this.payload[offset];\n\t\t\tthis.includedSecurelySecureCCs = [\n\t\t\t\t...this.payload.subarray(offset + 1, offset + 1 + numCCs),\n\t\t\t];\n\t\t} else {\n\t\t\tthis.includedInsecurely = options.includedInsecurely;\n\t\t\tthis.includedSecurelyInsecureCCs =\n\t\t\t\toptions.includedSecurelyInsecureCCs;\n\t\t\tthis.includedSecurelySecureCCs = options.includedSecurelySecureCCs;\n\t\t}\n\t}\n\n\tpublic includedInsecurely: CommandClasses[];\n\tpublic includedSecurelyInsecureCCs: CommandClasses[];\n\tpublic includedSecurelySecureCCs: CommandClasses[];\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tthis.payload = new Bytes((1 + MAX_CCs) * 3);\n\t\tlet offset = 0;\n\t\tfor (const array of [\n\t\t\tthis.includedInsecurely,\n\t\t\tthis.includedSecurelyInsecureCCs,\n\t\t\tthis.includedSecurelySecureCCs,\n\t\t]) {\n\t\t\tthis.payload[offset] = array.length;\n\t\t\tthis.payload.set(array, offset + 1);\n\t\t\toffset += 1 + MAX_CCs;\n\t\t}\n\t\treturn super.serialize();\n\t}\n\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\t\"included insecurely\": this.includedInsecurely\n\t\t\t\t.map((cc) => CommandClasses[cc])\n\t\t\t\t.join(\", \"),\n\t\t\t\"included securely (insecure)\": this.includedSecurelyInsecureCCs\n\t\t\t\t.map((cc) => CommandClasses[cc])\n\t\t\t\t.join(\", \"),\n\t\t\t\"included securely (secure)\": this.includedSecurelySecureCCs\n\t\t\t\t.map((cc) => CommandClasses[cc])\n\t\t\t\t.join(\", \"),\n\t\t};\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kBAA+B;AAC/B,oBAAsB;AAItB,qBAOO;AAQP,MAAM,UAAU;AAET,MAAM,uBAAuB;IAIvB,sBAAkB,MAAA;8BAF9B,0BAAU,oBAAoB,OAC9B,2BAAW,aAAa,CAAC;;;;oBACc;0CAAA,YAAO;WAAA;;;;;;;;AAA/C,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACZ,YACC,SAAkE;AAElE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,YAAI,SAAS;AACb,YAAI,SAAS,KAAK,QAAQ,MAAM;AAChC,aAAK,qBAAqB;UACzB,GAAG,KAAK,QAAQ,SAAS,SAAS,GAAG,SAAS,IAAI,MAAM;;AAEzD,kBAAU,IAAI;AAEd,iBAAS,KAAK,QAAQ,MAAM;AAC5B,aAAK,8BAA8B;UAClC,GAAG,KAAK,QAAQ,SAAS,SAAS,GAAG,SAAS,IAAI,MAAM;;AAEzD,kBAAU,IAAI;AACd,iBAAS,KAAK,QAAQ,MAAM;AAC5B,aAAK,4BAA4B;UAChC,GAAG,KAAK,QAAQ,SAAS,SAAS,GAAG,SAAS,IAAI,MAAM;;MAE1D,OAAO;AACN,aAAK,qBAAqB,QAAQ;AAClC,aAAK,8BACJ,QAAQ;AACT,aAAK,4BAA4B,QAAQ;MAC1C;IACD;IAEO;IACA;IACA;IAEA,YAAS;AACf,WAAK,UAAU,IAAI,qBAAO,IAAI,WAAW,CAAC;AAC1C,UAAI,SAAS;AACb,iBAAW,SAAS;QACnB,KAAK;QACL,KAAK;QACL,KAAK;SACH;AACF,aAAK,QAAQ,MAAM,IAAI,MAAM;AAC7B,aAAK,QAAQ,IAAI,OAAO,SAAS,CAAC;AAClC,kBAAU,IAAI;MACf;AACA,aAAO,MAAM,UAAS;IACvB;;IAGO,SAAM;AACZ,aAAO;QACN,GAAG,MAAM,OAAM;QACf,uBAAuB,KAAK,mBAC1B,IAAI,CAAC,OAAO,2BAAe,EAAE,CAAC,EAC9B,KAAK,IAAI;QACX,gCAAgC,KAAK,4BACnC,IAAI,CAAC,OAAO,2BAAe,EAAE,CAAC,EAC9B,KAAK,IAAI;QACX,8BAA8B,KAAK,0BACjC,IAAI,CAAC,OAAO,2BAAe,EAAE,CAAC,EAC9B,KAAK,IAAI;;IAEb;;;;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/nvm3/files/ApplicationDataFile.ts"],
4
- "sourcesContent": ["import type { Bytes } from \"@zwave-js/shared\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationDataFileOptions extends NVMFileCreationOptions {\n\tapplicationData: Bytes;\n}\n\nexport const ApplicationDataFileID = 200;\n\n@nvmFileID(ApplicationDataFileID)\n@nvmSection(\"application\")\nexport class ApplicationDataFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationDataFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (!gotDeserializationOptions(options)) {\n\t\t\tthis.payload = options.applicationData;\n\t\t}\n\t}\n\n\t// Just binary data\n\tpublic get applicationData(): Bytes {\n\t\treturn this.payload;\n\t}\n\tpublic set applicationData(value: Bytes) {\n\t\tthis.payload = value;\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,qBAOO;AAMA,MAAM,wBAAwB;IAIxB,uBAAmB,MAAA;8BAF/B,0BAAU,qBAAqB,OAC/B,2BAAW,aAAa,CAAC;;;;oBACe;2CAAA,YAAO;WAAA;;;;;;;;AAAhD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACZ,YACC,SAAmE;AAEnE,YAAM,OAAO;AACb,UAAI,KAAC,0CAA0B,OAAO,GAAG;AACxC,aAAK,UAAU,QAAQ;MACxB;IACD;;IAGA,IAAW,kBAAe;AACzB,aAAO,KAAK;IACb;IACA,IAAW,gBAAgB,OAAY;AACtC,WAAK,UAAU;IAChB;;;;",
4
+ "sourcesContent": ["import type { Bytes } from \"@zwave-js/shared\";\n\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationDataFileOptions extends NVMFileCreationOptions {\n\tapplicationData: Bytes;\n}\n\nexport const ApplicationDataFileID = 200;\n\n@nvmFileID(ApplicationDataFileID)\n@nvmSection(\"application\")\nexport class ApplicationDataFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationDataFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (!gotDeserializationOptions(options)) {\n\t\t\tthis.payload = options.applicationData;\n\t\t}\n\t}\n\n\t// Just binary data\n\tpublic get applicationData(): Bytes {\n\t\treturn this.payload;\n\t}\n\tpublic set applicationData(value: Bytes) {\n\t\tthis.payload = value;\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,qBAOO;AAMA,MAAM,wBAAwB;IAIxB,uBAAmB,MAAA;8BAF/B,0BAAU,qBAAqB,OAC/B,2BAAW,aAAa,CAAC;;;;oBACe;2CAAA,YAAO;WAAA;;;;;;;;AAAhD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACZ,YACC,SAAmE;AAEnE,YAAM,OAAO;AACb,UAAI,KAAC,0CAA0B,OAAO,GAAG;AACxC,aAAK,UAAU,QAAQ;MACxB;IACD;;IAGA,IAAW,kBAAe;AACzB,aAAO,KAAK;IACb;IACA,IAAW,gBAAgB,OAAY;AACtC,WAAK,UAAU;IAChB;;;;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/nvm3/files/ApplicationNameFile.ts"],
4
- "sourcesContent": ["import { Bytes, cpp2js } from \"@zwave-js/shared\";\nimport type { NVM3Object } from \"../object.js\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationNameFileOptions extends NVMFileCreationOptions {\n\tname: string;\n}\n\nexport const ApplicationNameFileID = 0x4100c;\n\n@nvmFileID(ApplicationNameFileID)\n@nvmSection(\"application\")\nexport class ApplicationNameFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationNameFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.name = cpp2js(this.payload.toString(\"utf8\"));\n\t\t} else {\n\t\t\tthis.name = options.name;\n\t\t}\n\t}\n\n\tpublic name: string;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\t// Return a zero-terminated string with a fixed length of 30 bytes\n\t\tconst nameAsString = Bytes.from(this.name, \"utf8\");\n\t\tthis.payload = new Bytes(30).fill(0);\n\t\tthis.payload.set(nameAsString.subarray(0, this.payload.length), 0);\n\t\treturn super.serialize();\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oBAA8B;AAE9B,qBAOO;AAMA,MAAM,wBAAwB;IAIxB,uBAAmB,MAAA;8BAF/B,0BAAU,qBAAqB,OAC/B,2BAAW,aAAa,CAAC;;;;oBACe;2CAAA,YAAO;WAAA;;;;;;;;AAAhD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACZ,YACC,SAAmE;AAEnE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,aAAK,WAAO,sBAAO,KAAK,QAAQ,SAAS,MAAM,CAAC;MACjD,OAAO;AACN,aAAK,OAAO,QAAQ;MACrB;IACD;IAEO;IAEA,YAAS;AAEf,YAAM,eAAe,oBAAM,KAAK,KAAK,MAAM,MAAM;AACjD,WAAK,UAAU,IAAI,oBAAM,EAAE,EAAE,KAAK,CAAC;AACnC,WAAK,QAAQ,IAAI,aAAa,SAAS,GAAG,KAAK,QAAQ,MAAM,GAAG,CAAC;AACjE,aAAO,MAAM,UAAS;IACvB;;;;",
4
+ "sourcesContent": ["import { Bytes, cpp2js } from \"@zwave-js/shared\";\n\nimport type { NVM3Object } from \"../object.js\";\n\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationNameFileOptions extends NVMFileCreationOptions {\n\tname: string;\n}\n\nexport const ApplicationNameFileID = 0x4100c;\n\n@nvmFileID(ApplicationNameFileID)\n@nvmSection(\"application\")\nexport class ApplicationNameFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationNameFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.name = cpp2js(this.payload.toString(\"utf8\"));\n\t\t} else {\n\t\t\tthis.name = options.name;\n\t\t}\n\t}\n\n\tpublic name: string;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\t// Return a zero-terminated string with a fixed length of 30 bytes\n\t\tconst nameAsString = Bytes.from(this.name, \"utf8\");\n\t\tthis.payload = new Bytes(30).fill(0);\n\t\tthis.payload.set(nameAsString.subarray(0, this.payload.length), 0);\n\t\treturn super.serialize();\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oBAA8B;AAI9B,qBAOO;AAMA,MAAM,wBAAwB;IAIxB,uBAAmB,MAAA;8BAF/B,0BAAU,qBAAqB,OAC/B,2BAAW,aAAa,CAAC;;;;oBACe;2CAAA,YAAO;WAAA;;;;;;;;AAAhD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACZ,YACC,SAAmE;AAEnE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,aAAK,WAAO,sBAAO,KAAK,QAAQ,SAAS,MAAM,CAAC;MACjD,OAAO;AACN,aAAK,OAAO,QAAQ;MACrB;IACD;IAEO;IAEA,YAAS;AAEf,YAAM,eAAe,oBAAM,KAAK,KAAK,MAAM,MAAM;AACjD,WAAK,UAAU,IAAI,oBAAM,EAAE,EAAE,KAAK,CAAC;AACnC,WAAK,QAAQ,IAAI,aAAa,SAAS,GAAG,KAAK,QAAQ,MAAM,GAAG,CAAC;AACjE,aAAO,MAAM,UAAS;IACvB;;;;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/nvm3/files/ApplicationRFConfigFile.ts"],
4
- "sourcesContent": ["import {\n\tNodeIDType,\n\tRFRegion,\n\tZWaveError,\n\tZWaveErrorCodes,\n} from \"@zwave-js/core\";\nimport { type AllOrNone, Bytes, getEnumMemberName } from \"@zwave-js/shared\";\nimport semverGte from \"semver/functions/gte.js\";\nimport semverLt from \"semver/functions/lt.js\";\nimport type { NVM3Object } from \"../object.js\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport type ApplicationRFConfigFileOptions =\n\t& NVMFileCreationOptions\n\t& {\n\t\trfRegion: RFRegion;\n\t\ttxPower: number;\n\t\tmeasured0dBm: number;\n\t}\n\t& AllOrNone<{\n\t\tenablePTI?: number;\n\t\tmaxTXPower?: number;\n\t}>\n\t& {\n\t\tnodeIdType?: number;\n\t};\n\nexport const ApplicationRFConfigFileID = 104;\n\n@nvmFileID(ApplicationRFConfigFileID)\n@nvmSection(\"application\")\nexport class ApplicationRFConfigFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationRFConfigFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tif (this.payload.length === 3 || this.payload.length === 6) {\n\t\t\t\tthis.rfRegion = this.payload[0];\n\t\t\t\tthis.txPower = this.payload.readInt8(1) / 10;\n\t\t\t\tthis.measured0dBm = this.payload.readInt8(2) / 10;\n\t\t\t\tif (this.payload.length === 6) {\n\t\t\t\t\tthis.enablePTI = this.payload[3];\n\t\t\t\t\tthis.maxTXPower = this.payload.readInt16LE(4) / 10;\n\t\t\t\t}\n\t\t\t} else if (this.payload.length === 8) {\n\t\t\t\tthis.rfRegion = this.payload[0];\n\t\t\t\tthis.txPower = this.payload.readInt16LE(1) / 10;\n\t\t\t\tthis.measured0dBm = this.payload.readInt16LE(3) / 10;\n\t\t\t\tthis.enablePTI = this.payload[5];\n\t\t\t\tthis.maxTXPower = this.payload.readInt16LE(6) / 10;\n\t\t\t} else if (this.payload.length === 9) {\n\t\t\t\tthis.rfRegion = this.payload[0];\n\t\t\t\tthis.txPower = this.payload.readInt16LE(1) / 10;\n\t\t\t\tthis.measured0dBm = this.payload.readInt16LE(3) / 10;\n\t\t\t\tthis.enablePTI = this.payload[5];\n\t\t\t\tthis.maxTXPower = this.payload.readInt16LE(6) / 10;\n\t\t\t\tthis.nodeIdType = this.payload[8];\n\t\t\t} else {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`ApplicationRFConfigFile has unsupported length ${this.payload.length}`,\n\t\t\t\t\tZWaveErrorCodes.NVM_NotSupported,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.rfRegion = options.rfRegion;\n\t\t\tthis.txPower = options.txPower;\n\t\t\tthis.measured0dBm = options.measured0dBm;\n\t\t\tthis.enablePTI = options.enablePTI;\n\t\t\tthis.maxTXPower = options.maxTXPower;\n\t\t\tthis.nodeIdType = options.nodeIdType;\n\t\t}\n\t}\n\n\tpublic rfRegion: RFRegion;\n\tpublic txPower: number;\n\tpublic measured0dBm: number;\n\tpublic enablePTI?: number;\n\tpublic maxTXPower?: number;\n\tpublic nodeIdType?: NodeIDType;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tif (semverLt(this.fileVersion, \"7.18.1\")) {\n\t\t\tthis.payload = new Bytes(\n\t\t\t\tsemverGte(this.fileVersion, \"7.15.3\") ? 6 : 3,\n\t\t\t).fill(0);\n\t\t\tthis.payload[0] = this.rfRegion;\n\t\t\tthis.payload.writeIntLE(this.txPower * 10, 1, 1);\n\t\t\tthis.payload.writeIntLE(this.measured0dBm * 10, 2, 1);\n\t\t\tif (semverGte(this.fileVersion, \"7.15.3\")) {\n\t\t\t\tthis.payload[3] = this.enablePTI ?? 0;\n\t\t\t\tthis.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 4);\n\t\t\t}\n\t\t} else if (semverLt(this.fileVersion, \"7.21.0\")) {\n\t\t\tthis.payload = new Bytes(8).fill(0);\n\t\t\tthis.payload[0] = this.rfRegion;\n\t\t\tthis.payload.writeInt16LE(this.txPower * 10, 1);\n\t\t\tthis.payload.writeInt16LE(this.measured0dBm * 10, 3);\n\t\t\tthis.payload[5] = this.enablePTI ?? 0;\n\t\t\tthis.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 6);\n\t\t} else {\n\t\t\tthis.payload = new Bytes(9).fill(0);\n\t\t\tthis.payload[0] = this.rfRegion;\n\t\t\tthis.payload.writeInt16LE(this.txPower * 10, 1);\n\t\t\tthis.payload.writeInt16LE(this.measured0dBm * 10, 3);\n\t\t\tthis.payload[5] = this.enablePTI ?? 0;\n\t\t\tthis.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 6);\n\t\t\tthis.payload[8] = this.nodeIdType ?? NodeIDType.Short;\n\t\t}\n\t\treturn super.serialize();\n\t}\n\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\tconst ret: Record<string, any> = {\n\t\t\t...super.toJSON(),\n\t\t\t\"RF Region\": getEnumMemberName(RFRegion, this.rfRegion),\n\t\t\t\"TX Power\": `${this.txPower.toFixed(1)} dBm`,\n\t\t\t\"Power @ 0dBm\": `${this.measured0dBm.toFixed(1)} dBm`,\n\t\t};\n\t\tif (this.enablePTI != undefined) {\n\t\t\tret[\"enable PTI\"] = this.enablePTI;\n\t\t}\n\t\tif (this.maxTXPower != undefined) {\n\t\t\tret[\"max TX power\"] = `${this.maxTXPower.toFixed(1)} dBm`;\n\t\t}\n\t\tif (this.nodeIdType != undefined) {\n\t\t\tret[\"node ID type\"] = getEnumMemberName(\n\t\t\t\tNodeIDType,\n\t\t\t\tthis.nodeIdType,\n\t\t\t);\n\t\t}\n\t\treturn ret;\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kBAKO;AACP,oBAAyD;AACzD,iBAAsB;AACtB,gBAAqB;AAErB,qBAOO;AAiBA,MAAM,4BAA4B;IAI5B,2BAAuB,MAAA;8BAFnC,0BAAU,yBAAyB,OACnC,2BAAW,aAAa,CAAC;;;;oBACmB;+CAAA,YAAO;WAAA;;;;;;;;AAApD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACZ,YACC,SAAuE;AAEvE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,YAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,WAAW,GAAG;AAC3D,eAAK,WAAW,KAAK,QAAQ,CAAC;AAC9B,eAAK,UAAU,KAAK,QAAQ,SAAS,CAAC,IAAI;AAC1C,eAAK,eAAe,KAAK,QAAQ,SAAS,CAAC,IAAI;AAC/C,cAAI,KAAK,QAAQ,WAAW,GAAG;AAC9B,iBAAK,YAAY,KAAK,QAAQ,CAAC;AAC/B,iBAAK,aAAa,KAAK,QAAQ,YAAY,CAAC,IAAI;UACjD;QACD,WAAW,KAAK,QAAQ,WAAW,GAAG;AACrC,eAAK,WAAW,KAAK,QAAQ,CAAC;AAC9B,eAAK,UAAU,KAAK,QAAQ,YAAY,CAAC,IAAI;AAC7C,eAAK,eAAe,KAAK,QAAQ,YAAY,CAAC,IAAI;AAClD,eAAK,YAAY,KAAK,QAAQ,CAAC;AAC/B,eAAK,aAAa,KAAK,QAAQ,YAAY,CAAC,IAAI;QACjD,WAAW,KAAK,QAAQ,WAAW,GAAG;AACrC,eAAK,WAAW,KAAK,QAAQ,CAAC;AAC9B,eAAK,UAAU,KAAK,QAAQ,YAAY,CAAC,IAAI;AAC7C,eAAK,eAAe,KAAK,QAAQ,YAAY,CAAC,IAAI;AAClD,eAAK,YAAY,KAAK,QAAQ,CAAC;AAC/B,eAAK,aAAa,KAAK,QAAQ,YAAY,CAAC,IAAI;AAChD,eAAK,aAAa,KAAK,QAAQ,CAAC;QACjC,OAAO;AACN,gBAAM,IAAI,uBACT,kDAAkD,KAAK,QAAQ,MAAM,IACrE,4BAAgB,gBAAgB;QAElC;MACD,OAAO;AACN,aAAK,WAAW,QAAQ;AACxB,aAAK,UAAU,QAAQ;AACvB,aAAK,eAAe,QAAQ;AAC5B,aAAK,YAAY,QAAQ;AACzB,aAAK,aAAa,QAAQ;AAC1B,aAAK,aAAa,QAAQ;MAC3B;IACD;IAEO;IACA;IACA;IACA;IACA;IACA;IAEA,YAAS;AACf,cAAI,UAAAA,SAAS,KAAK,aAAa,QAAQ,GAAG;AACzC,aAAK,UAAU,IAAI,wBAClB,WAAAC,SAAU,KAAK,aAAa,QAAQ,IAAI,IAAI,CAAC,EAC5C,KAAK,CAAC;AACR,aAAK,QAAQ,CAAC,IAAI,KAAK;AACvB,aAAK,QAAQ,WAAW,KAAK,UAAU,IAAI,GAAG,CAAC;AAC/C,aAAK,QAAQ,WAAW,KAAK,eAAe,IAAI,GAAG,CAAC;AACpD,gBAAI,WAAAA,SAAU,KAAK,aAAa,QAAQ,GAAG;AAC1C,eAAK,QAAQ,CAAC,IAAI,KAAK,aAAa;AACpC,eAAK,QAAQ,cAAc,KAAK,cAAc,KAAK,IAAI,CAAC;QACzD;MACD,eAAW,UAAAD,SAAS,KAAK,aAAa,QAAQ,GAAG;AAChD,aAAK,UAAU,IAAI,oBAAM,CAAC,EAAE,KAAK,CAAC;AAClC,aAAK,QAAQ,CAAC,IAAI,KAAK;AACvB,aAAK,QAAQ,aAAa,KAAK,UAAU,IAAI,CAAC;AAC9C,aAAK,QAAQ,aAAa,KAAK,eAAe,IAAI,CAAC;AACnD,aAAK,QAAQ,CAAC,IAAI,KAAK,aAAa;AACpC,aAAK,QAAQ,cAAc,KAAK,cAAc,KAAK,IAAI,CAAC;MACzD,OAAO;AACN,aAAK,UAAU,IAAI,oBAAM,CAAC,EAAE,KAAK,CAAC;AAClC,aAAK,QAAQ,CAAC,IAAI,KAAK;AACvB,aAAK,QAAQ,aAAa,KAAK,UAAU,IAAI,CAAC;AAC9C,aAAK,QAAQ,aAAa,KAAK,eAAe,IAAI,CAAC;AACnD,aAAK,QAAQ,CAAC,IAAI,KAAK,aAAa;AACpC,aAAK,QAAQ,cAAc,KAAK,cAAc,KAAK,IAAI,CAAC;AACxD,aAAK,QAAQ,CAAC,IAAI,KAAK,cAAc,uBAAW;MACjD;AACA,aAAO,MAAM,UAAS;IACvB;;IAGO,SAAM;AACZ,YAAM,MAA2B;QAChC,GAAG,MAAM,OAAM;QACf,iBAAa,iCAAkB,sBAAU,KAAK,QAAQ;QACtD,YAAY,GAAG,KAAK,QAAQ,QAAQ,CAAC,CAAC;QACtC,gBAAgB,GAAG,KAAK,aAAa,QAAQ,CAAC,CAAC;;AAEhD,UAAI,KAAK,aAAa,QAAW;AAChC,YAAI,YAAY,IAAI,KAAK;MAC1B;AACA,UAAI,KAAK,cAAc,QAAW;AACjC,YAAI,cAAc,IAAI,GAAG,KAAK,WAAW,QAAQ,CAAC,CAAC;MACpD;AACA,UAAI,KAAK,cAAc,QAAW;AACjC,YAAI,cAAc,QAAI,iCACrB,wBACA,KAAK,UAAU;MAEjB;AACA,aAAO;IACR;;;;",
4
+ "sourcesContent": ["import {\n\tNodeIDType,\n\tRFRegion,\n\tZWaveError,\n\tZWaveErrorCodes,\n} from \"@zwave-js/core\";\nimport { type AllOrNone, Bytes, getEnumMemberName } from \"@zwave-js/shared\";\nimport semverGte from \"semver/functions/gte.js\";\nimport semverLt from \"semver/functions/lt.js\";\n\nimport type { NVM3Object } from \"../object.js\";\n\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport type ApplicationRFConfigFileOptions = NVMFileCreationOptions & {\n\trfRegion: RFRegion;\n\ttxPower: number;\n\tmeasured0dBm: number;\n} & AllOrNone<{\n\t\tenablePTI?: number;\n\t\tmaxTXPower?: number;\n\t}> & {\n\t\tnodeIdType?: number;\n\t};\n\nexport const ApplicationRFConfigFileID = 104;\n\n@nvmFileID(ApplicationRFConfigFileID)\n@nvmSection(\"application\")\nexport class ApplicationRFConfigFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationRFConfigFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tif (this.payload.length === 3 || this.payload.length === 6) {\n\t\t\t\tthis.rfRegion = this.payload[0];\n\t\t\t\tthis.txPower = this.payload.readInt8(1) / 10;\n\t\t\t\tthis.measured0dBm = this.payload.readInt8(2) / 10;\n\t\t\t\tif (this.payload.length === 6) {\n\t\t\t\t\tthis.enablePTI = this.payload[3];\n\t\t\t\t\tthis.maxTXPower = this.payload.readInt16LE(4) / 10;\n\t\t\t\t}\n\t\t\t} else if (this.payload.length === 8) {\n\t\t\t\tthis.rfRegion = this.payload[0];\n\t\t\t\tthis.txPower = this.payload.readInt16LE(1) / 10;\n\t\t\t\tthis.measured0dBm = this.payload.readInt16LE(3) / 10;\n\t\t\t\tthis.enablePTI = this.payload[5];\n\t\t\t\tthis.maxTXPower = this.payload.readInt16LE(6) / 10;\n\t\t\t} else if (this.payload.length === 9) {\n\t\t\t\tthis.rfRegion = this.payload[0];\n\t\t\t\tthis.txPower = this.payload.readInt16LE(1) / 10;\n\t\t\t\tthis.measured0dBm = this.payload.readInt16LE(3) / 10;\n\t\t\t\tthis.enablePTI = this.payload[5];\n\t\t\t\tthis.maxTXPower = this.payload.readInt16LE(6) / 10;\n\t\t\t\tthis.nodeIdType = this.payload[8];\n\t\t\t} else {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`ApplicationRFConfigFile has unsupported length ${this.payload.length}`,\n\t\t\t\t\tZWaveErrorCodes.NVM_NotSupported,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.rfRegion = options.rfRegion;\n\t\t\tthis.txPower = options.txPower;\n\t\t\tthis.measured0dBm = options.measured0dBm;\n\t\t\tthis.enablePTI = options.enablePTI;\n\t\t\tthis.maxTXPower = options.maxTXPower;\n\t\t\tthis.nodeIdType = options.nodeIdType;\n\t\t}\n\t}\n\n\tpublic rfRegion: RFRegion;\n\tpublic txPower: number;\n\tpublic measured0dBm: number;\n\tpublic enablePTI?: number;\n\tpublic maxTXPower?: number;\n\tpublic nodeIdType?: NodeIDType;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tif (semverLt(this.fileVersion, \"7.18.1\")) {\n\t\t\tthis.payload = new Bytes(\n\t\t\t\tsemverGte(this.fileVersion, \"7.15.3\") ? 6 : 3,\n\t\t\t).fill(0);\n\t\t\tthis.payload[0] = this.rfRegion;\n\t\t\tthis.payload.writeIntLE(this.txPower * 10, 1, 1);\n\t\t\tthis.payload.writeIntLE(this.measured0dBm * 10, 2, 1);\n\t\t\tif (semverGte(this.fileVersion, \"7.15.3\")) {\n\t\t\t\tthis.payload[3] = this.enablePTI ?? 0;\n\t\t\t\tthis.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 4);\n\t\t\t}\n\t\t} else if (semverLt(this.fileVersion, \"7.21.0\")) {\n\t\t\tthis.payload = new Bytes(8).fill(0);\n\t\t\tthis.payload[0] = this.rfRegion;\n\t\t\tthis.payload.writeInt16LE(this.txPower * 10, 1);\n\t\t\tthis.payload.writeInt16LE(this.measured0dBm * 10, 3);\n\t\t\tthis.payload[5] = this.enablePTI ?? 0;\n\t\t\tthis.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 6);\n\t\t} else {\n\t\t\tthis.payload = new Bytes(9).fill(0);\n\t\t\tthis.payload[0] = this.rfRegion;\n\t\t\tthis.payload.writeInt16LE(this.txPower * 10, 1);\n\t\t\tthis.payload.writeInt16LE(this.measured0dBm * 10, 3);\n\t\t\tthis.payload[5] = this.enablePTI ?? 0;\n\t\t\tthis.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 6);\n\t\t\tthis.payload[8] = this.nodeIdType ?? NodeIDType.Short;\n\t\t}\n\t\treturn super.serialize();\n\t}\n\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\tconst ret: Record<string, any> = {\n\t\t\t...super.toJSON(),\n\t\t\t\"RF Region\": getEnumMemberName(RFRegion, this.rfRegion),\n\t\t\t\"TX Power\": `${this.txPower.toFixed(1)} dBm`,\n\t\t\t\"Power @ 0dBm\": `${this.measured0dBm.toFixed(1)} dBm`,\n\t\t};\n\t\tif (this.enablePTI != undefined) {\n\t\t\tret[\"enable PTI\"] = this.enablePTI;\n\t\t}\n\t\tif (this.maxTXPower != undefined) {\n\t\t\tret[\"max TX power\"] = `${this.maxTXPower.toFixed(1)} dBm`;\n\t\t}\n\t\tif (this.nodeIdType != undefined) {\n\t\t\tret[\"node ID type\"] = getEnumMemberName(\n\t\t\t\tNodeIDType,\n\t\t\t\tthis.nodeIdType,\n\t\t\t);\n\t\t}\n\t\treturn ret;\n\t}\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["semverLt", "semverGte"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/nvm3/files/ApplicationTypeFile.ts"],
4
- "sourcesContent": ["import { Bytes } from \"@zwave-js/shared\";\nimport type { NVM3Object } from \"../object.js\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationTypeFileOptions extends NVMFileCreationOptions {\n\tisListening: boolean;\n\toptionalFunctionality: boolean;\n\tgenericDeviceClass: number;\n\tspecificDeviceClass: number;\n}\n\nexport const ApplicationTypeFileID = 102;\n\n@nvmFileID(ApplicationTypeFileID)\n@nvmSection(\"application\")\nexport class ApplicationTypeFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationTypeFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.isListening = !!(this.payload[0] & 0b1);\n\t\t\tthis.optionalFunctionality = !!(this.payload[0] & 0b10);\n\t\t\tthis.genericDeviceClass = this.payload[1];\n\t\t\tthis.specificDeviceClass = this.payload[2];\n\t\t} else {\n\t\t\tthis.isListening = options.isListening;\n\t\t\tthis.optionalFunctionality = options.optionalFunctionality;\n\t\t\tthis.genericDeviceClass = options.genericDeviceClass;\n\t\t\tthis.specificDeviceClass = options.specificDeviceClass;\n\t\t}\n\t}\n\n\tpublic isListening: boolean;\n\tpublic optionalFunctionality: boolean;\n\tpublic genericDeviceClass: number;\n\tpublic specificDeviceClass: number;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tthis.payload = Bytes.from([\n\t\t\t(this.isListening ? 0b1 : 0)\n\t\t\t| (this.optionalFunctionality ? 0b10 : 0),\n\t\t\tthis.genericDeviceClass,\n\t\t\tthis.specificDeviceClass,\n\t\t]);\n\t\treturn super.serialize();\n\t}\n\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\tlistening: this.isListening,\n\t\t\t\"opt. functionality\": this.optionalFunctionality,\n\t\t\tgenericDeviceClass: this.genericDeviceClass,\n\t\t\tspecificDeviceClass: this.specificDeviceClass,\n\t\t};\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAsB;AAEtB,qBAOO;AASA,MAAM,wBAAwB;IAIxB,uBAAmB,MAAA;8BAF/B,0BAAU,qBAAqB,OAC/B,2BAAW,aAAa,CAAC;;;;oBACe;2CAAA,YAAO;WAAA;;;;;;;;AAAhD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACZ,YACC,SAAmE;AAEnE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,aAAK,cAAc,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI;AACxC,aAAK,wBAAwB,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI;AAClD,aAAK,qBAAqB,KAAK,QAAQ,CAAC;AACxC,aAAK,sBAAsB,KAAK,QAAQ,CAAC;MAC1C,OAAO;AACN,aAAK,cAAc,QAAQ;AAC3B,aAAK,wBAAwB,QAAQ;AACrC,aAAK,qBAAqB,QAAQ;AAClC,aAAK,sBAAsB,QAAQ;MACpC;IACD;IAEO;IACA;IACA;IACA;IAEA,YAAS;AACf,WAAK,UAAU,oBAAM,KAAK;SACxB,KAAK,cAAc,IAAM,MACvB,KAAK,wBAAwB,IAAO;QACvC,KAAK;QACL,KAAK;OACL;AACD,aAAO,MAAM,UAAS;IACvB;;IAGO,SAAM;AACZ,aAAO;QACN,GAAG,MAAM,OAAM;QACf,WAAW,KAAK;QAChB,sBAAsB,KAAK;QAC3B,oBAAoB,KAAK;QACzB,qBAAqB,KAAK;;IAE5B;;;;",
4
+ "sourcesContent": ["import { Bytes } from \"@zwave-js/shared\";\n\nimport type { NVM3Object } from \"../object.js\";\n\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationTypeFileOptions extends NVMFileCreationOptions {\n\tisListening: boolean;\n\toptionalFunctionality: boolean;\n\tgenericDeviceClass: number;\n\tspecificDeviceClass: number;\n}\n\nexport const ApplicationTypeFileID = 102;\n\n@nvmFileID(ApplicationTypeFileID)\n@nvmSection(\"application\")\nexport class ApplicationTypeFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationTypeFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.isListening = !!(this.payload[0] & 0b1);\n\t\t\tthis.optionalFunctionality = !!(this.payload[0] & 0b10);\n\t\t\tthis.genericDeviceClass = this.payload[1];\n\t\t\tthis.specificDeviceClass = this.payload[2];\n\t\t} else {\n\t\t\tthis.isListening = options.isListening;\n\t\t\tthis.optionalFunctionality = options.optionalFunctionality;\n\t\t\tthis.genericDeviceClass = options.genericDeviceClass;\n\t\t\tthis.specificDeviceClass = options.specificDeviceClass;\n\t\t}\n\t}\n\n\tpublic isListening: boolean;\n\tpublic optionalFunctionality: boolean;\n\tpublic genericDeviceClass: number;\n\tpublic specificDeviceClass: number;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tthis.payload = Bytes.from([\n\t\t\t(this.isListening ? 0b1 : 0)\n\t\t\t\t| (this.optionalFunctionality ? 0b10 : 0),\n\t\t\tthis.genericDeviceClass,\n\t\t\tthis.specificDeviceClass,\n\t\t]);\n\t\treturn super.serialize();\n\t}\n\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\tlistening: this.isListening,\n\t\t\t\"opt. functionality\": this.optionalFunctionality,\n\t\t\tgenericDeviceClass: this.genericDeviceClass,\n\t\t\tspecificDeviceClass: this.specificDeviceClass,\n\t\t};\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAsB;AAItB,qBAOO;AASA,MAAM,wBAAwB;IAIxB,uBAAmB,MAAA;8BAF/B,0BAAU,qBAAqB,OAC/B,2BAAW,aAAa,CAAC;;;;oBACe;2CAAA,YAAO;WAAA;;;;;;;;AAAhD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACZ,YACC,SAAmE;AAEnE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,aAAK,cAAc,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI;AACxC,aAAK,wBAAwB,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI;AAClD,aAAK,qBAAqB,KAAK,QAAQ,CAAC;AACxC,aAAK,sBAAsB,KAAK,QAAQ,CAAC;MAC1C,OAAO;AACN,aAAK,cAAc,QAAQ;AAC3B,aAAK,wBAAwB,QAAQ;AACrC,aAAK,qBAAqB,QAAQ;AAClC,aAAK,sBAAsB,QAAQ;MACpC;IACD;IAEO;IACA;IACA;IACA;IAEA,YAAS;AACf,WAAK,UAAU,oBAAM,KAAK;SACxB,KAAK,cAAc,IAAM,MACtB,KAAK,wBAAwB,IAAO;QACxC,KAAK;QACL,KAAK;OACL;AACD,aAAO,MAAM,UAAS;IACvB;;IAGO,SAAM;AACZ,aAAO;QACN,GAAG,MAAM,OAAM;QACf,WAAW,KAAK;QAChB,sBAAsB,KAAK;QAC3B,oBAAoB,KAAK;QACzB,qBAAqB,KAAK;;IAE5B;;;;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/nvm3/files/ControllerInfoFile.ts"],
4
- "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes, stripUndefined } from \"@zwave-js/core\";\nimport { Bytes, type BytesView, buffer2hex } from \"@zwave-js/shared\";\nimport type { NVM3Object } from \"../object.js\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport type ControllerInfoFileOptions =\n\t& NVMFileCreationOptions\n\t& {\n\t\thomeId: BytesView;\n\t\tnodeId: number;\n\t\tlastNodeId: number;\n\t\tstaticControllerNodeId: number;\n\t\tsucLastIndex: number;\n\t\tcontrollerConfiguration: number;\n\t\tmaxNodeId: number;\n\t\treservedId: number;\n\t\tsystemState: number;\n\t}\n\t& (\n\t\t| {\n\t\t\tsucAwarenessPushNeeded: number;\n\t\t}\n\t\t| {\n\t\t\tlastNodeIdLR: number;\n\t\t\tmaxNodeIdLR: number;\n\t\t\treservedIdLR: number;\n\t\t\tprimaryLongRangeChannelId: number;\n\t\t\tdcdcConfig: number;\n\t\t}\n\t);\n\nexport const ControllerInfoFileID = 0x50004;\n\n@nvmFileID(ControllerInfoFileID)\n@nvmSection(\"protocol\")\nexport class ControllerInfoFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ControllerInfoFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.homeId = this.payload.subarray(0, 4);\n\t\t\tif (this.payload.length === 13) {\n\t\t\t\tthis.nodeId = this.payload[4];\n\t\t\t\tthis.lastNodeId = this.payload[5];\n\t\t\t\tthis.staticControllerNodeId = this.payload[6];\n\t\t\t\tthis.sucLastIndex = this.payload[7];\n\t\t\t\tthis.controllerConfiguration = this.payload[8];\n\t\t\t\tthis.sucAwarenessPushNeeded = this.payload[9];\n\t\t\t\tthis.maxNodeId = this.payload[10];\n\t\t\t\tthis.reservedId = this.payload[11];\n\t\t\t\tthis.systemState = this.payload[12];\n\t\t\t} else if (this.payload.length === 22) {\n\t\t\t\tthis.nodeId = this.payload.readUInt16LE(4);\n\t\t\t\tthis.staticControllerNodeId = this.payload.readUInt16LE(6);\n\t\t\t\tthis.lastNodeIdLR = this.payload.readUInt16LE(8);\n\t\t\t\tthis.lastNodeId = this.payload[10];\n\t\t\t\tthis.sucLastIndex = this.payload[11];\n\t\t\t\tthis.maxNodeIdLR = this.payload.readUInt16LE(12);\n\t\t\t\tthis.maxNodeId = this.payload[14];\n\t\t\t\tthis.controllerConfiguration = this.payload[15];\n\t\t\t\tthis.reservedIdLR = this.payload.readUInt16LE(16);\n\t\t\t\tthis.reservedId = this.payload[18];\n\t\t\t\tthis.systemState = this.payload[19];\n\t\t\t\tthis.primaryLongRangeChannelId = this.payload[20];\n\t\t\t\tthis.dcdcConfig = this.payload[21];\n\t\t\t} else {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Unsupported payload length`,\n\t\t\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.homeId = Bytes.view(options.homeId);\n\t\t\tthis.nodeId = options.nodeId;\n\t\t\tthis.lastNodeId = options.lastNodeId;\n\t\t\tthis.staticControllerNodeId = options.staticControllerNodeId;\n\t\t\tthis.sucLastIndex = options.sucLastIndex;\n\t\t\tthis.controllerConfiguration = options.controllerConfiguration;\n\t\t\tthis.maxNodeId = options.maxNodeId;\n\t\t\tthis.reservedId = options.reservedId;\n\t\t\tthis.systemState = options.systemState;\n\t\t\tif (\"lastNodeIdLR\" in options) {\n\t\t\t\tthis.lastNodeIdLR = options.lastNodeIdLR;\n\t\t\t\tthis.maxNodeIdLR = options.maxNodeIdLR;\n\t\t\t\tthis.reservedIdLR = options.reservedIdLR;\n\t\t\t\tthis.primaryLongRangeChannelId =\n\t\t\t\t\toptions.primaryLongRangeChannelId;\n\t\t\t\tthis.dcdcConfig = options.dcdcConfig;\n\t\t\t} else {\n\t\t\t\tthis.sucAwarenessPushNeeded = options.sucAwarenessPushNeeded;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic homeId: BytesView;\n\tpublic nodeId: number;\n\tpublic lastNodeId: number;\n\tpublic staticControllerNodeId: number;\n\tpublic sucLastIndex: number;\n\tpublic controllerConfiguration: number; // TODO: Figure out what this is\n\tpublic sucAwarenessPushNeeded?: number;\n\tpublic maxNodeId: number;\n\tpublic reservedId: number;\n\tpublic systemState: number;\n\tpublic lastNodeIdLR?: number;\n\tpublic maxNodeIdLR?: number;\n\tpublic reservedIdLR?: number;\n\tpublic primaryLongRangeChannelId?: number;\n\tpublic dcdcConfig?: number;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tif (this.lastNodeIdLR != undefined) {\n\t\t\tthis.payload = new Bytes(22);\n\t\t\tthis.payload.set(this.homeId, 0);\n\t\t\tthis.payload.writeUInt16LE(this.nodeId, 4);\n\t\t\tthis.payload.writeUInt16LE(this.staticControllerNodeId, 6);\n\t\t\tthis.payload.writeUInt16LE(this.lastNodeIdLR, 8);\n\t\t\tthis.payload[10] = this.lastNodeId;\n\t\t\tthis.payload[11] = this.sucLastIndex;\n\t\t\tthis.payload.writeUInt16LE(this.maxNodeIdLR!, 12);\n\t\t\tthis.payload[14] = this.maxNodeId;\n\t\t\tthis.payload[15] = this.controllerConfiguration;\n\t\t\tthis.payload.writeUInt16LE(this.reservedIdLR!, 16);\n\t\t\tthis.payload[18] = this.reservedId;\n\t\t\tthis.payload[19] = this.systemState;\n\t\t\tthis.payload[20] = this.primaryLongRangeChannelId!;\n\t\t\tthis.payload[21] = this.dcdcConfig!;\n\t\t} else {\n\t\t\t// V0\n\t\t\tthis.payload = Bytes.concat([\n\t\t\t\tthis.homeId,\n\t\t\t\t[\n\t\t\t\t\tthis.nodeId,\n\t\t\t\t\tthis.lastNodeId,\n\t\t\t\t\tthis.staticControllerNodeId,\n\t\t\t\t\tthis.sucLastIndex,\n\t\t\t\t\tthis.controllerConfiguration,\n\t\t\t\t\tthis.sucAwarenessPushNeeded ?? 0,\n\t\t\t\t\tthis.maxNodeId,\n\t\t\t\t\tthis.reservedId,\n\t\t\t\t\tthis.systemState,\n\t\t\t\t],\n\t\t\t]);\n\t\t}\n\t\treturn super.serialize();\n\t}\n\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn stripUndefined({\n\t\t\t...super.toJSON(),\n\t\t\thomeId: buffer2hex(this.homeId),\n\t\t\tnodeId: this.nodeId,\n\t\t\tlastNodeId: this.lastNodeId,\n\t\t\tstaticControllerNodeId: this.staticControllerNodeId,\n\t\t\tsucLastIndex: this.sucLastIndex,\n\t\t\tcontrollerConfiguration: this.controllerConfiguration,\n\t\t\tsucAwarenessPushNeeded: this.sucAwarenessPushNeeded,\n\t\t\tmaxNodeId: this.maxNodeId,\n\t\t\treservedId: this.reservedId,\n\t\t\tsystemState: this.systemState,\n\t\t\tlastNodeIdLR: this.lastNodeIdLR,\n\t\t\tmaxNodeIdLR: this.maxNodeIdLR,\n\t\t\treservedIdLR: this.reservedIdLR,\n\t\t\tprimaryLongRangeChannelId: this.primaryLongRangeChannelId,\n\t\t\tdcdcConfig: this.dcdcConfig,\n\t\t});\n\t}\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes, stripUndefined } from \"@zwave-js/core\";\nimport { Bytes, type BytesView, buffer2hex } from \"@zwave-js/shared\";\n\nimport type { NVM3Object } from \"../object.js\";\n\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport type ControllerInfoFileOptions = NVMFileCreationOptions & {\n\thomeId: BytesView;\n\tnodeId: number;\n\tlastNodeId: number;\n\tstaticControllerNodeId: number;\n\tsucLastIndex: number;\n\tcontrollerConfiguration: number;\n\tmaxNodeId: number;\n\treservedId: number;\n\tsystemState: number;\n} & (\n\t\t| {\n\t\t\t\tsucAwarenessPushNeeded: number;\n\t\t }\n\t\t| {\n\t\t\t\tlastNodeIdLR: number;\n\t\t\t\tmaxNodeIdLR: number;\n\t\t\t\treservedIdLR: number;\n\t\t\t\tprimaryLongRangeChannelId: number;\n\t\t\t\tdcdcConfig: number;\n\t\t }\n\t);\n\nexport const ControllerInfoFileID = 0x50004;\n\n@nvmFileID(ControllerInfoFileID)\n@nvmSection(\"protocol\")\nexport class ControllerInfoFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ControllerInfoFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.homeId = this.payload.subarray(0, 4);\n\t\t\tif (this.payload.length === 13) {\n\t\t\t\tthis.nodeId = this.payload[4];\n\t\t\t\tthis.lastNodeId = this.payload[5];\n\t\t\t\tthis.staticControllerNodeId = this.payload[6];\n\t\t\t\tthis.sucLastIndex = this.payload[7];\n\t\t\t\tthis.controllerConfiguration = this.payload[8];\n\t\t\t\tthis.sucAwarenessPushNeeded = this.payload[9];\n\t\t\t\tthis.maxNodeId = this.payload[10];\n\t\t\t\tthis.reservedId = this.payload[11];\n\t\t\t\tthis.systemState = this.payload[12];\n\t\t\t} else if (this.payload.length === 22) {\n\t\t\t\tthis.nodeId = this.payload.readUInt16LE(4);\n\t\t\t\tthis.staticControllerNodeId = this.payload.readUInt16LE(6);\n\t\t\t\tthis.lastNodeIdLR = this.payload.readUInt16LE(8);\n\t\t\t\tthis.lastNodeId = this.payload[10];\n\t\t\t\tthis.sucLastIndex = this.payload[11];\n\t\t\t\tthis.maxNodeIdLR = this.payload.readUInt16LE(12);\n\t\t\t\tthis.maxNodeId = this.payload[14];\n\t\t\t\tthis.controllerConfiguration = this.payload[15];\n\t\t\t\tthis.reservedIdLR = this.payload.readUInt16LE(16);\n\t\t\t\tthis.reservedId = this.payload[18];\n\t\t\t\tthis.systemState = this.payload[19];\n\t\t\t\tthis.primaryLongRangeChannelId = this.payload[20];\n\t\t\t\tthis.dcdcConfig = this.payload[21];\n\t\t\t} else {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Unsupported payload length`,\n\t\t\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.homeId = Bytes.view(options.homeId);\n\t\t\tthis.nodeId = options.nodeId;\n\t\t\tthis.lastNodeId = options.lastNodeId;\n\t\t\tthis.staticControllerNodeId = options.staticControllerNodeId;\n\t\t\tthis.sucLastIndex = options.sucLastIndex;\n\t\t\tthis.controllerConfiguration = options.controllerConfiguration;\n\t\t\tthis.maxNodeId = options.maxNodeId;\n\t\t\tthis.reservedId = options.reservedId;\n\t\t\tthis.systemState = options.systemState;\n\t\t\tif (\"lastNodeIdLR\" in options) {\n\t\t\t\tthis.lastNodeIdLR = options.lastNodeIdLR;\n\t\t\t\tthis.maxNodeIdLR = options.maxNodeIdLR;\n\t\t\t\tthis.reservedIdLR = options.reservedIdLR;\n\t\t\t\tthis.primaryLongRangeChannelId =\n\t\t\t\t\toptions.primaryLongRangeChannelId;\n\t\t\t\tthis.dcdcConfig = options.dcdcConfig;\n\t\t\t} else {\n\t\t\t\tthis.sucAwarenessPushNeeded = options.sucAwarenessPushNeeded;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic homeId: BytesView;\n\tpublic nodeId: number;\n\tpublic lastNodeId: number;\n\tpublic staticControllerNodeId: number;\n\tpublic sucLastIndex: number;\n\tpublic controllerConfiguration: number; // TODO: Figure out what this is\n\tpublic sucAwarenessPushNeeded?: number;\n\tpublic maxNodeId: number;\n\tpublic reservedId: number;\n\tpublic systemState: number;\n\tpublic lastNodeIdLR?: number;\n\tpublic maxNodeIdLR?: number;\n\tpublic reservedIdLR?: number;\n\tpublic primaryLongRangeChannelId?: number;\n\tpublic dcdcConfig?: number;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tif (this.lastNodeIdLR != undefined) {\n\t\t\tthis.payload = new Bytes(22);\n\t\t\tthis.payload.set(this.homeId, 0);\n\t\t\tthis.payload.writeUInt16LE(this.nodeId, 4);\n\t\t\tthis.payload.writeUInt16LE(this.staticControllerNodeId, 6);\n\t\t\tthis.payload.writeUInt16LE(this.lastNodeIdLR, 8);\n\t\t\tthis.payload[10] = this.lastNodeId;\n\t\t\tthis.payload[11] = this.sucLastIndex;\n\t\t\tthis.payload.writeUInt16LE(this.maxNodeIdLR!, 12);\n\t\t\tthis.payload[14] = this.maxNodeId;\n\t\t\tthis.payload[15] = this.controllerConfiguration;\n\t\t\tthis.payload.writeUInt16LE(this.reservedIdLR!, 16);\n\t\t\tthis.payload[18] = this.reservedId;\n\t\t\tthis.payload[19] = this.systemState;\n\t\t\tthis.payload[20] = this.primaryLongRangeChannelId!;\n\t\t\tthis.payload[21] = this.dcdcConfig!;\n\t\t} else {\n\t\t\t// V0\n\t\t\tthis.payload = Bytes.concat([\n\t\t\t\tthis.homeId,\n\t\t\t\t[\n\t\t\t\t\tthis.nodeId,\n\t\t\t\t\tthis.lastNodeId,\n\t\t\t\t\tthis.staticControllerNodeId,\n\t\t\t\t\tthis.sucLastIndex,\n\t\t\t\t\tthis.controllerConfiguration,\n\t\t\t\t\tthis.sucAwarenessPushNeeded ?? 0,\n\t\t\t\t\tthis.maxNodeId,\n\t\t\t\t\tthis.reservedId,\n\t\t\t\t\tthis.systemState,\n\t\t\t\t],\n\t\t\t]);\n\t\t}\n\t\treturn super.serialize();\n\t}\n\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn stripUndefined({\n\t\t\t...super.toJSON(),\n\t\t\thomeId: buffer2hex(this.homeId),\n\t\t\tnodeId: this.nodeId,\n\t\t\tlastNodeId: this.lastNodeId,\n\t\t\tstaticControllerNodeId: this.staticControllerNodeId,\n\t\t\tsucLastIndex: this.sucLastIndex,\n\t\t\tcontrollerConfiguration: this.controllerConfiguration,\n\t\t\tsucAwarenessPushNeeded: this.sucAwarenessPushNeeded,\n\t\t\tmaxNodeId: this.maxNodeId,\n\t\t\treservedId: this.reservedId,\n\t\t\tsystemState: this.systemState,\n\t\t\tlastNodeIdLR: this.lastNodeIdLR,\n\t\t\tmaxNodeIdLR: this.maxNodeIdLR,\n\t\t\treservedIdLR: this.reservedIdLR,\n\t\t\tprimaryLongRangeChannelId: this.primaryLongRangeChannelId,\n\t\t\tdcdcConfig: this.dcdcConfig,\n\t\t});\n\t}\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/nvm3/files/NVMFile.ts"],
4
- "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport { createSimpleReflectionDecorator } from \"@zwave-js/core/reflection\";\nimport {\n\tBytes,\n\ttype BytesView,\n\ttype TypedClassDecorator,\n\tisUint8Array,\n\tnum2hex,\n} from \"@zwave-js/shared\";\nimport {\n\tFragmentType,\n\tNVM3_MAX_OBJ_SIZE_SMALL,\n\tObjectType,\n} from \"../consts.js\";\nimport type { NVM3Object } from \"../object.js\";\n\nexport interface NVMFileBaseOptions {\n\tfileId?: number;\n\tfileVersion: string;\n}\nexport interface NVMFileDeserializationOptions extends NVMFileBaseOptions {\n\tfileId: number;\n\tdata: Bytes;\n}\n\nexport function gotDeserializationOptions(\n\toptions: NVMFileOptions,\n): options is NVMFileDeserializationOptions {\n\treturn \"data\" in options && isUint8Array(options.data);\n}\n\nexport interface NVMFileCreationOptions extends NVMFileBaseOptions {}\n\nexport type NVMFileOptions =\n\t| NVMFileCreationOptions\n\t| NVMFileDeserializationOptions;\n\nexport class NVMFile {\n\tpublic constructor(options: NVMFileOptions) {\n\t\tthis.fileVersion = options.fileVersion;\n\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.fileId = options.fileId;\n\t\t\tthis.payload = options.data;\n\t\t} else {\n\t\t\tconst fileId = options.fileId ?? getNVMFileID(this);\n\t\t\tif (typeof fileId === \"number\") {\n\t\t\t\tthis.fileId = fileId;\n\t\t\t}\n\t\t\tthis.payload = new Bytes();\n\t\t}\n\t}\n\n\tprotected payload: Bytes;\n\tpublic fileId: number = 0;\n\tpublic fileVersion: string;\n\n\t/**\n\t * Creates an instance of the NVM file that is contained in the given NVM object\n\t */\n\tpublic static from(\n\t\tfileId: number,\n\t\tdata: BytesView,\n\t\tfileVersion: string,\n\t): NVMFile {\n\t\tconst Constructor = getNVMFileConstructor(fileId)!;\n\t\treturn new Constructor({\n\t\t\tfileId,\n\t\t\tfileVersion,\n\t\t\tdata,\n\t\t});\n\t}\n\n\t/**\n\t * Serializes this NVMFile into an NVM Object\n\t */\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tif (!this.fileId) {\n\t\t\tthrow new Error(\"The NVM file ID must be set before serializing\");\n\t\t}\n\t\treturn {\n\t\t\tkey: this.fileId,\n\t\t\tdata: this.payload,\n\t\t\t// We only support large and small data objects for now\n\t\t\ttype: this.payload.length <= NVM3_MAX_OBJ_SIZE_SMALL\n\t\t\t\t? ObjectType.DataSmall\n\t\t\t\t: ObjectType.DataLarge,\n\t\t\t// By default output unfragmented objects, they will be split later\n\t\t\tfragmentType: FragmentType.None,\n\t\t};\n\t}\n\n\tpublic toJSON(): Record<string, any> {\n\t\treturn {\n\t\t\t\"file ID\": `0x${\n\t\t\t\tthis.fileId.toString(16)\n\t\t\t} (${this.constructor.name})`,\n\t\t};\n\t}\n}\n\nconst METADATA_nvmFileID = Symbol(\"nvmFileID\");\nconst METADATA_nvmFileIDMap = Symbol(\"nvmFileIDMap\");\n\ntype NVMFileIDMap = Map<\n\tnumber | ((id: number) => boolean),\n\tNVMFileConstructor<NVMFile>\n>;\n\nexport type NVMFileConstructor<T extends NVMFile> = typeof NVMFile & {\n\tnew (options: any): T;\n};\n\n/**\n * Defines the ID associated with a NVM file class\n */\nexport function nvmFileID<Class extends typeof NVMFile>(\n\tid: number | ((id: number) => boolean),\n): TypedClassDecorator<Class> {\n\treturn (messageClass) => {\n\t\tReflect.defineMetadata(METADATA_nvmFileID, id, messageClass);\n\n\t\t// also store a map in the NVMFile metadata for lookup.\n\t\tconst map: NVMFileIDMap =\n\t\t\tReflect.getMetadata(METADATA_nvmFileIDMap, NVMFile) || new Map();\n\t\tmap.set(id, messageClass as unknown as NVMFileConstructor<NVMFile>);\n\t\tReflect.defineMetadata(METADATA_nvmFileIDMap, map, NVMFile);\n\t};\n}\n\n/**\n * Retrieves the file ID defined for a NVM file class\n */\nexport function getNVMFileID(\n\tid: NVMFile,\n): number | ((id: number) => boolean) {\n\t// get the class constructor\n\tconst constr = id.constructor;\n\t// retrieve the current metadata\n\tconst ret: number | undefined = id instanceof NVMFile\n\t\t? Reflect.getMetadata(METADATA_nvmFileID, constr)\n\t\t: undefined;\n\tif (ret == undefined) {\n\t\tthrow new ZWaveError(\n\t\t\t`No NVM file ID defined for ${constr.name}!`,\n\t\t\tZWaveErrorCodes.CC_Invalid,\n\t\t);\n\t}\n\treturn ret;\n}\n\n/**\n * Looks up the NVM file constructor for a given file ID\n */\nexport function getNVMFileConstructor(\n\tid: number,\n): NVMFileConstructor<NVMFile> | undefined {\n\t// Retrieve the constructor map from the NVMFile class\n\tconst map = Reflect.getMetadata(METADATA_nvmFileIDMap, NVMFile) as\n\t\t| NVMFileIDMap\n\t\t| undefined;\n\tif (map != undefined) {\n\t\tif (map.has(id)) return map.get(id);\n\t\t// Otherwise loop through predicates\n\t\tfor (const [key, value] of map.entries()) {\n\t\t\tif (typeof key === \"function\" && key(id)) return value;\n\t\t}\n\t}\n}\n\n/**\n * Retrieves the file ID defined for a NVM file class\n */\nexport function getNVMFileIDStatic(\n\tclassConstructor: NVMFileConstructor<NVMFile>,\n): number | ((id: number) => boolean) {\n\t// retrieve the current metadata\n\tconst ret = Reflect.getMetadata(METADATA_nvmFileID, classConstructor);\n\tif (ret == undefined) {\n\t\tthrow new ZWaveError(\n\t\t\t`No NVM file ID defined for ${classConstructor.name}!`,\n\t\t\tZWaveErrorCodes.CC_Invalid,\n\t\t);\n\t}\n\treturn ret;\n}\n\nexport type NVMSection = \"application\" | \"protocol\";\n\nconst nvmSectionDecorator = createSimpleReflectionDecorator<\n\ttypeof NVMFile,\n\t[section: NVMSection]\n>({\n\tname: \"nvmSection\",\n});\n\n/** Defines in which section an NVM file is stored */\nexport const nvmSection = nvmSectionDecorator.decorator;\n\n/** Returns in which section an NVM file is stored (using an instance of the file) */\nexport const getNVMSection = nvmSectionDecorator.lookupValue;\n\n/** Returns in which section an NVM file is stored (using the constructor of the file) */\nexport const getNVMSectionStatic = nvmSectionDecorator.lookupValueStatic;\n\n/** Returns in which NVM section the file with the given ID resides in */\nexport function getNVMSectionByFileID(fileId: number): NVMSection {\n\tconst File = getNVMFileConstructor(fileId);\n\tlet ret: NVMSection | undefined;\n\tif (File) {\n\t\tret = getNVMSectionStatic(File);\n\t}\n\tif (ret) return ret;\n\n\tthrow new ZWaveError(\n\t\t`NVM section for file with ID ${\n\t\t\tnum2hex(fileId)\n\t\t} could not be determined`,\n\t\tZWaveErrorCodes.Argument_Invalid,\n\t);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport { createSimpleReflectionDecorator } from \"@zwave-js/core/reflection\";\nimport {\n\tBytes,\n\ttype BytesView,\n\ttype TypedClassDecorator,\n\tisUint8Array,\n\tnum2hex,\n} from \"@zwave-js/shared\";\n\nimport {\n\tFragmentType,\n\tNVM3_MAX_OBJ_SIZE_SMALL,\n\tObjectType,\n} from \"../consts.js\";\nimport type { NVM3Object } from \"../object.js\";\n\nexport interface NVMFileBaseOptions {\n\tfileId?: number;\n\tfileVersion: string;\n}\nexport interface NVMFileDeserializationOptions extends NVMFileBaseOptions {\n\tfileId: number;\n\tdata: Bytes;\n}\n\nexport function gotDeserializationOptions(\n\toptions: NVMFileOptions,\n): options is NVMFileDeserializationOptions {\n\treturn \"data\" in options && isUint8Array(options.data);\n}\n\nexport interface NVMFileCreationOptions extends NVMFileBaseOptions {}\n\nexport type NVMFileOptions =\n\t| NVMFileCreationOptions\n\t| NVMFileDeserializationOptions;\n\nexport class NVMFile {\n\tpublic constructor(options: NVMFileOptions) {\n\t\tthis.fileVersion = options.fileVersion;\n\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.fileId = options.fileId;\n\t\t\tthis.payload = options.data;\n\t\t} else {\n\t\t\tconst fileId = options.fileId ?? getNVMFileID(this);\n\t\t\tif (typeof fileId === \"number\") {\n\t\t\t\tthis.fileId = fileId;\n\t\t\t}\n\t\t\tthis.payload = new Bytes();\n\t\t}\n\t}\n\n\tprotected payload: Bytes;\n\tpublic fileId: number = 0;\n\tpublic fileVersion: string;\n\n\t/**\n\t * Creates an instance of the NVM file that is contained in the given NVM object\n\t */\n\tpublic static from(\n\t\tfileId: number,\n\t\tdata: BytesView,\n\t\tfileVersion: string,\n\t): NVMFile {\n\t\tconst Constructor = getNVMFileConstructor(fileId)!;\n\t\treturn new Constructor({\n\t\t\tfileId,\n\t\t\tfileVersion,\n\t\t\tdata,\n\t\t});\n\t}\n\n\t/**\n\t * Serializes this NVMFile into an NVM Object\n\t */\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tif (!this.fileId) {\n\t\t\tthrow new Error(\"The NVM file ID must be set before serializing\");\n\t\t}\n\t\treturn {\n\t\t\tkey: this.fileId,\n\t\t\tdata: this.payload,\n\t\t\t// We only support large and small data objects for now\n\t\t\ttype:\n\t\t\t\tthis.payload.length <= NVM3_MAX_OBJ_SIZE_SMALL\n\t\t\t\t\t? ObjectType.DataSmall\n\t\t\t\t\t: ObjectType.DataLarge,\n\t\t\t// By default output unfragmented objects, they will be split later\n\t\t\tfragmentType: FragmentType.None,\n\t\t};\n\t}\n\n\tpublic toJSON(): Record<string, any> {\n\t\treturn {\n\t\t\t\"file ID\": `0x${this.fileId.toString(\n\t\t\t\t16,\n\t\t\t)} (${this.constructor.name})`,\n\t\t};\n\t}\n}\n\nconst METADATA_nvmFileID = Symbol(\"nvmFileID\");\nconst METADATA_nvmFileIDMap = Symbol(\"nvmFileIDMap\");\n\ntype NVMFileIDMap = Map<\n\tnumber | ((id: number) => boolean),\n\tNVMFileConstructor<NVMFile>\n>;\n\nexport type NVMFileConstructor<T extends NVMFile> = typeof NVMFile & {\n\tnew (options: any): T;\n};\n\n/**\n * Defines the ID associated with a NVM file class\n */\nexport function nvmFileID<Class extends typeof NVMFile>(\n\tid: number | ((id: number) => boolean),\n): TypedClassDecorator<Class> {\n\treturn (messageClass) => {\n\t\tReflect.defineMetadata(METADATA_nvmFileID, id, messageClass);\n\n\t\t// also store a map in the NVMFile metadata for lookup.\n\t\tconst map: NVMFileIDMap =\n\t\t\tReflect.getMetadata(METADATA_nvmFileIDMap, NVMFile) || new Map();\n\t\tmap.set(id, messageClass as unknown as NVMFileConstructor<NVMFile>);\n\t\tReflect.defineMetadata(METADATA_nvmFileIDMap, map, NVMFile);\n\t};\n}\n\n/**\n * Retrieves the file ID defined for a NVM file class\n */\nexport function getNVMFileID(id: NVMFile): number | ((id: number) => boolean) {\n\t// get the class constructor\n\tconst constr = id.constructor;\n\t// retrieve the current metadata\n\tconst ret: number | undefined =\n\t\tid instanceof NVMFile\n\t\t\t? Reflect.getMetadata(METADATA_nvmFileID, constr)\n\t\t\t: undefined;\n\tif (ret == undefined) {\n\t\tthrow new ZWaveError(\n\t\t\t`No NVM file ID defined for ${constr.name}!`,\n\t\t\tZWaveErrorCodes.CC_Invalid,\n\t\t);\n\t}\n\treturn ret;\n}\n\n/**\n * Looks up the NVM file constructor for a given file ID\n */\nexport function getNVMFileConstructor(\n\tid: number,\n): NVMFileConstructor<NVMFile> | undefined {\n\t// Retrieve the constructor map from the NVMFile class\n\tconst map = Reflect.getMetadata(METADATA_nvmFileIDMap, NVMFile) as\n\t\t| NVMFileIDMap\n\t\t| undefined;\n\tif (map != undefined) {\n\t\tif (map.has(id)) return map.get(id);\n\t\t// Otherwise loop through predicates\n\t\tfor (const [key, value] of map.entries()) {\n\t\t\tif (typeof key === \"function\" && key(id)) return value;\n\t\t}\n\t}\n}\n\n/**\n * Retrieves the file ID defined for a NVM file class\n */\nexport function getNVMFileIDStatic(\n\tclassConstructor: NVMFileConstructor<NVMFile>,\n): number | ((id: number) => boolean) {\n\t// retrieve the current metadata\n\tconst ret = Reflect.getMetadata(METADATA_nvmFileID, classConstructor);\n\tif (ret == undefined) {\n\t\tthrow new ZWaveError(\n\t\t\t`No NVM file ID defined for ${classConstructor.name}!`,\n\t\t\tZWaveErrorCodes.CC_Invalid,\n\t\t);\n\t}\n\treturn ret;\n}\n\nexport type NVMSection = \"application\" | \"protocol\";\n\nconst nvmSectionDecorator = createSimpleReflectionDecorator<\n\ttypeof NVMFile,\n\t[section: NVMSection]\n>({\n\tname: \"nvmSection\",\n});\n\n/** Defines in which section an NVM file is stored */\nexport const nvmSection = nvmSectionDecorator.decorator;\n\n/** Returns in which section an NVM file is stored (using an instance of the file) */\nexport const getNVMSection = nvmSectionDecorator.lookupValue;\n\n/** Returns in which section an NVM file is stored (using the constructor of the file) */\nexport const getNVMSectionStatic = nvmSectionDecorator.lookupValueStatic;\n\n/** Returns in which NVM section the file with the given ID resides in */\nexport function getNVMSectionByFileID(fileId: number): NVMSection {\n\tconst File = getNVMFileConstructor(fileId);\n\tlet ret: NVMSection | undefined;\n\tif (File) {\n\t\tret = getNVMSectionStatic(File);\n\t}\n\tif (ret) return ret;\n\n\tthrow new ZWaveError(\n\t\t`NVM section for file with ID ${num2hex(\n\t\t\tfileId,\n\t\t)} could not be determined`,\n\t\tZWaveErrorCodes.Argument_Invalid,\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }