@zwave-js/nvmedit 15.15.3 → 15.16.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 (87) hide show
  1. package/build/cjs/convert.d.ts +6 -5
  2. package/build/cjs/convert.js.map +2 -2
  3. package/build/cjs/lib/NVM3.d.ts +6 -5
  4. package/build/cjs/lib/NVM3.js.map +2 -2
  5. package/build/cjs/lib/NVM500.js.map +2 -2
  6. package/build/cjs/lib/common/definitions.d.ts +5 -5
  7. package/build/cjs/lib/common/definitions.js.map +1 -1
  8. package/build/cjs/lib/common/routeCache.d.ts +2 -2
  9. package/build/cjs/lib/common/routeCache.js.map +2 -2
  10. package/build/cjs/lib/common/sucUpdateEntry.d.ts +2 -2
  11. package/build/cjs/lib/common/sucUpdateEntry.js.map +2 -2
  12. package/build/cjs/lib/common/utils.d.ts +3 -2
  13. package/build/cjs/lib/common/utils.js.map +2 -2
  14. package/build/cjs/lib/io/BufferedNVMReader.d.ts +3 -2
  15. package/build/cjs/lib/io/BufferedNVMReader.js.map +2 -2
  16. package/build/cjs/lib/io/NVMFileIO.d.ts +3 -2
  17. package/build/cjs/lib/io/NVMFileIO.js.map +2 -2
  18. package/build/cjs/lib/io/NVMMemoryIO.d.ts +4 -3
  19. package/build/cjs/lib/io/NVMMemoryIO.js.map +2 -2
  20. package/build/cjs/lib/nvm3/adapter.js.map +2 -2
  21. package/build/cjs/lib/nvm3/files/ControllerInfoFile.d.ts +3 -3
  22. package/build/cjs/lib/nvm3/files/ControllerInfoFile.js.map +2 -2
  23. package/build/cjs/lib/nvm3/files/NVMFile.d.ts +2 -2
  24. package/build/cjs/lib/nvm3/files/NVMFile.js.map +2 -2
  25. package/build/cjs/lib/nvm3/files/NodeInfoFiles.js.map +2 -2
  26. package/build/cjs/lib/nvm3/object.d.ts +3 -2
  27. package/build/cjs/lib/nvm3/object.js.map +2 -2
  28. package/build/cjs/lib/nvm3/page.d.ts +2 -1
  29. package/build/cjs/lib/nvm3/page.js.map +2 -2
  30. package/build/cjs/lib/nvm500/EntryParsers.d.ts +4 -4
  31. package/build/cjs/lib/nvm500/EntryParsers.js.map +2 -2
  32. package/build/cjs/lib/nvm500/adapter.js.map +2 -2
  33. package/build/cjs/lib/nvm500/shared.d.ts +2 -1
  34. package/build/cjs/lib/nvm500/shared.js.map +2 -2
  35. package/build/esm/convert.d.ts +6 -5
  36. package/build/esm/convert.d.ts.map +1 -1
  37. package/build/esm/convert.js +1 -1
  38. package/build/esm/convert.js.map +1 -1
  39. package/build/esm/lib/NVM3.d.ts +6 -5
  40. package/build/esm/lib/NVM3.d.ts.map +1 -1
  41. package/build/esm/lib/NVM3.js +1 -1
  42. package/build/esm/lib/NVM3.js.map +1 -1
  43. package/build/esm/lib/NVM500.js.map +1 -1
  44. package/build/esm/lib/common/definitions.d.ts +5 -5
  45. package/build/esm/lib/common/definitions.d.ts.map +1 -1
  46. package/build/esm/lib/common/routeCache.d.ts +2 -2
  47. package/build/esm/lib/common/routeCache.d.ts.map +1 -1
  48. package/build/esm/lib/common/routeCache.js.map +1 -1
  49. package/build/esm/lib/common/sucUpdateEntry.d.ts +2 -2
  50. package/build/esm/lib/common/sucUpdateEntry.d.ts.map +1 -1
  51. package/build/esm/lib/common/sucUpdateEntry.js.map +1 -1
  52. package/build/esm/lib/common/utils.d.ts +3 -2
  53. package/build/esm/lib/common/utils.d.ts.map +1 -1
  54. package/build/esm/lib/common/utils.js.map +1 -1
  55. package/build/esm/lib/io/BufferedNVMReader.d.ts +3 -2
  56. package/build/esm/lib/io/BufferedNVMReader.d.ts.map +1 -1
  57. package/build/esm/lib/io/BufferedNVMReader.js.map +1 -1
  58. package/build/esm/lib/io/NVMFileIO.d.ts +3 -2
  59. package/build/esm/lib/io/NVMFileIO.d.ts.map +1 -1
  60. package/build/esm/lib/io/NVMFileIO.js.map +1 -1
  61. package/build/esm/lib/io/NVMMemoryIO.d.ts +4 -3
  62. package/build/esm/lib/io/NVMMemoryIO.d.ts.map +1 -1
  63. package/build/esm/lib/io/NVMMemoryIO.js.map +1 -1
  64. package/build/esm/lib/nvm3/adapter.d.ts.map +1 -1
  65. package/build/esm/lib/nvm3/adapter.js.map +1 -1
  66. package/build/esm/lib/nvm3/files/ControllerInfoFile.d.ts +3 -3
  67. package/build/esm/lib/nvm3/files/ControllerInfoFile.d.ts.map +1 -1
  68. package/build/esm/lib/nvm3/files/ControllerInfoFile.js.map +1 -1
  69. package/build/esm/lib/nvm3/files/NVMFile.d.ts +2 -2
  70. package/build/esm/lib/nvm3/files/NVMFile.d.ts.map +1 -1
  71. package/build/esm/lib/nvm3/files/NVMFile.js.map +1 -1
  72. package/build/esm/lib/nvm3/files/NodeInfoFiles.d.ts.map +1 -1
  73. package/build/esm/lib/nvm3/files/NodeInfoFiles.js.map +1 -1
  74. package/build/esm/lib/nvm3/object.d.ts +3 -2
  75. package/build/esm/lib/nvm3/object.d.ts.map +1 -1
  76. package/build/esm/lib/nvm3/object.js.map +1 -1
  77. package/build/esm/lib/nvm3/page.d.ts +2 -1
  78. package/build/esm/lib/nvm3/page.d.ts.map +1 -1
  79. package/build/esm/lib/nvm3/page.js.map +1 -1
  80. package/build/esm/lib/nvm500/EntryParsers.d.ts +4 -4
  81. package/build/esm/lib/nvm500/EntryParsers.d.ts.map +1 -1
  82. package/build/esm/lib/nvm500/EntryParsers.js.map +1 -1
  83. package/build/esm/lib/nvm500/adapter.js.map +1 -1
  84. package/build/esm/lib/nvm500/shared.d.ts +2 -1
  85. package/build/esm/lib/nvm500/shared.d.ts.map +1 -1
  86. package/build/esm/lib/nvm500/shared.js.map +1 -1
  87. package/package.json +6 -6
@@ -1,3 +1,4 @@
1
+ import type { BytesView } from "@zwave-js/shared";
1
2
  import { NVMAccess, type NVMIO } from "../common/definitions.js";
2
3
  /** An implementation of NVMIO for the filesystem */
3
4
  export declare class NVMFileIO implements NVMIO {
@@ -12,10 +13,10 @@ export declare class NVMFileIO implements NVMIO {
12
13
  get accessMode(): NVMAccess;
13
14
  determineChunkSize(): Promise<number>;
14
15
  read(offset: number, length: number): Promise<{
15
- buffer: Uint8Array;
16
+ buffer: BytesView;
16
17
  endOfFile: boolean;
17
18
  }>;
18
- write(offset: number, data: Uint8Array): Promise<{
19
+ write(offset: number, data: BytesView): Promise<{
19
20
  bytesWritten: number;
20
21
  endOfFile: boolean;
21
22
  }>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/io/NVMFileIO.ts"],
4
- "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport fs, { type FileHandle } from \"node:fs/promises\";\nimport { NVMAccess, type NVMIO } from \"../common/definitions.js\";\n\n/** An implementation of NVMIO for the filesystem */\nexport class NVMFileIO implements NVMIO {\n\tpublic constructor(path: string) {\n\t\tthis._path = path;\n\t\tthis._accessMode = NVMAccess.None;\n\t}\n\n\tprivate _path: string;\n\tprivate _handle: FileHandle | undefined;\n\tprivate _chunkSize = 16 * 1024; // We could read more, but 16 KB chunks are more than enough for reading NVM contents\n\n\tasync open(access: NVMAccess): Promise<NVMAccess> {\n\t\tlet flags: string;\n\t\tswitch (access) {\n\t\t\tcase NVMAccess.Read:\n\t\t\t\tflags = \"r\";\n\t\t\t\tbreak;\n\t\t\tcase NVMAccess.Write:\n\t\t\tcase NVMAccess.ReadWrite:\n\t\t\t\t// Read/Write, don't create, don't truncate\n\t\t\t\tflags = \"r+\";\n\t\t\t\taccess = NVMAccess.ReadWrite;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Invalid access mode\");\n\t\t}\n\t\tthis._handle = await fs.open(this._path, flags);\n\t\tthis._size = (await this._handle.stat()).size;\n\n\t\tthis._accessMode = access;\n\t\treturn access;\n\t}\n\n\tprivate _size: number | undefined;\n\tget size(): number {\n\t\tif (this._size == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The NVM file is not open\",\n\t\t\t\tZWaveErrorCodes.NVM_NotOpen,\n\t\t\t);\n\t\t}\n\t\treturn this._size;\n\t}\n\n\tprivate _accessMode: NVMAccess;\n\tget accessMode(): NVMAccess {\n\t\treturn this._accessMode;\n\t}\n\n\tdetermineChunkSize(): Promise<number> {\n\t\treturn Promise.resolve(this._chunkSize);\n\t}\n\n\tasync read(\n\t\toffset: number,\n\t\tlength: number,\n\t): Promise<{ buffer: Uint8Array; endOfFile: boolean }> {\n\t\tif (this._handle == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The NVM file is not open\",\n\t\t\t\tZWaveErrorCodes.NVM_NotOpen,\n\t\t\t);\n\t\t}\n\t\tconst readResult = await this._handle.read({\n\t\t\tbuffer: new Uint8Array(length),\n\t\t\tposition: offset,\n\t\t});\n\n\t\tconst endOfFile = offset + readResult.bytesRead >= this.size;\n\t\treturn {\n\t\t\tbuffer: readResult.buffer.subarray(0, readResult.bytesRead),\n\t\t\tendOfFile,\n\t\t};\n\t}\n\n\tasync write(\n\t\toffset: number,\n\t\tdata: Uint8Array,\n\t): Promise<{ bytesWritten: number; endOfFile: boolean }> {\n\t\tif (this._handle == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The NVM file is not open\",\n\t\t\t\tZWaveErrorCodes.NVM_NotOpen,\n\t\t\t);\n\t\t}\n\t\tif (offset + data.length > this.size) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Write would exceed the NVM size\",\n\t\t\t\tZWaveErrorCodes.NVM_NoSpace,\n\t\t\t);\n\t\t}\n\t\tconst writeResult = await this._handle.write(\n\t\t\tdata,\n\t\t\t0,\n\t\t\tdata.length,\n\t\t\toffset,\n\t\t);\n\t\tconst endOfFile = offset + writeResult.bytesWritten >= this.size;\n\t\treturn { bytesWritten: writeResult.bytesWritten, endOfFile };\n\t}\n\n\tasync close(): Promise<void> {\n\t\tawait this._handle?.close();\n\t\tthis._handle = undefined;\n\t\tthis._accessMode = NVMAccess.None;\n\t\tthis._size = undefined;\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,kBAA4C;AAC5C,sBAAoC;AACpC,yBAAsC;AAGhC,MAAO,UAAS;EALtB,OAKsB;;;EACrB,YAAmB,MAAY;AAC9B,SAAK,QAAQ;AACb,SAAK,cAAc,6BAAU;EAC9B;EAEQ;EACA;EACA,aAAa,KAAK;;EAE1B,MAAM,KAAK,QAAiB;AAC3B,QAAI;AACJ,YAAQ,QAAQ;MACf,KAAK,6BAAU;AACd,gBAAQ;AACR;MACD,KAAK,6BAAU;MACf,KAAK,6BAAU;AAEd,gBAAQ;AACR,iBAAS,6BAAU;AACnB;MACD;AACC,cAAM,IAAI,MAAM,qBAAqB;IACvC;AACA,SAAK,UAAU,MAAM,gBAAAA,QAAG,KAAK,KAAK,OAAO,KAAK;AAC9C,SAAK,SAAS,MAAM,KAAK,QAAQ,KAAI,GAAI;AAEzC,SAAK,cAAc;AACnB,WAAO;EACR;EAEQ;EACR,IAAI,OAAI;AACP,QAAI,KAAK,SAAS,QAAW;AAC5B,YAAM,IAAI,uBACT,4BACA,4BAAgB,WAAW;IAE7B;AACA,WAAO,KAAK;EACb;EAEQ;EACR,IAAI,aAAU;AACb,WAAO,KAAK;EACb;EAEA,qBAAkB;AACjB,WAAO,QAAQ,QAAQ,KAAK,UAAU;EACvC;EAEA,MAAM,KACL,QACA,QAAc;AAEd,QAAI,KAAK,WAAW,QAAW;AAC9B,YAAM,IAAI,uBACT,4BACA,4BAAgB,WAAW;IAE7B;AACA,UAAM,aAAa,MAAM,KAAK,QAAQ,KAAK;MAC1C,QAAQ,IAAI,WAAW,MAAM;MAC7B,UAAU;KACV;AAED,UAAM,YAAY,SAAS,WAAW,aAAa,KAAK;AACxD,WAAO;MACN,QAAQ,WAAW,OAAO,SAAS,GAAG,WAAW,SAAS;MAC1D;;EAEF;EAEA,MAAM,MACL,QACA,MAAgB;AAEhB,QAAI,KAAK,WAAW,QAAW;AAC9B,YAAM,IAAI,uBACT,4BACA,4BAAgB,WAAW;IAE7B;AACA,QAAI,SAAS,KAAK,SAAS,KAAK,MAAM;AACrC,YAAM,IAAI,uBACT,mCACA,4BAAgB,WAAW;IAE7B;AACA,UAAM,cAAc,MAAM,KAAK,QAAQ,MACtC,MACA,GACA,KAAK,QACL,MAAM;AAEP,UAAM,YAAY,SAAS,YAAY,gBAAgB,KAAK;AAC5D,WAAO,EAAE,cAAc,YAAY,cAAc,UAAS;EAC3D;EAEA,MAAM,QAAK;AACV,UAAM,KAAK,SAAS,MAAK;AACzB,SAAK,UAAU;AACf,SAAK,cAAc,6BAAU;AAC7B,SAAK,QAAQ;EACd;;",
4
+ "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport type { BytesView } from \"@zwave-js/shared\";\nimport fs, { type FileHandle } from \"node:fs/promises\";\nimport { NVMAccess, type NVMIO } from \"../common/definitions.js\";\n\n/** An implementation of NVMIO for the filesystem */\nexport class NVMFileIO implements NVMIO {\n\tpublic constructor(path: string) {\n\t\tthis._path = path;\n\t\tthis._accessMode = NVMAccess.None;\n\t}\n\n\tprivate _path: string;\n\tprivate _handle: FileHandle | undefined;\n\tprivate _chunkSize = 16 * 1024; // We could read more, but 16 KB chunks are more than enough for reading NVM contents\n\n\tasync open(access: NVMAccess): Promise<NVMAccess> {\n\t\tlet flags: string;\n\t\tswitch (access) {\n\t\t\tcase NVMAccess.Read:\n\t\t\t\tflags = \"r\";\n\t\t\t\tbreak;\n\t\t\tcase NVMAccess.Write:\n\t\t\tcase NVMAccess.ReadWrite:\n\t\t\t\t// Read/Write, don't create, don't truncate\n\t\t\t\tflags = \"r+\";\n\t\t\t\taccess = NVMAccess.ReadWrite;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Invalid access mode\");\n\t\t}\n\t\tthis._handle = await fs.open(this._path, flags);\n\t\tthis._size = (await this._handle.stat()).size;\n\n\t\tthis._accessMode = access;\n\t\treturn access;\n\t}\n\n\tprivate _size: number | undefined;\n\tget size(): number {\n\t\tif (this._size == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The NVM file is not open\",\n\t\t\t\tZWaveErrorCodes.NVM_NotOpen,\n\t\t\t);\n\t\t}\n\t\treturn this._size;\n\t}\n\n\tprivate _accessMode: NVMAccess;\n\tget accessMode(): NVMAccess {\n\t\treturn this._accessMode;\n\t}\n\n\tdetermineChunkSize(): Promise<number> {\n\t\treturn Promise.resolve(this._chunkSize);\n\t}\n\n\tasync read(\n\t\toffset: number,\n\t\tlength: number,\n\t): Promise<{ buffer: BytesView; endOfFile: boolean }> {\n\t\tif (this._handle == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The NVM file is not open\",\n\t\t\t\tZWaveErrorCodes.NVM_NotOpen,\n\t\t\t);\n\t\t}\n\t\tconst readResult = await this._handle.read({\n\t\t\tbuffer: new Uint8Array(length),\n\t\t\tposition: offset,\n\t\t});\n\n\t\tconst endOfFile = offset + readResult.bytesRead >= this.size;\n\t\treturn {\n\t\t\tbuffer: readResult.buffer.subarray(0, readResult.bytesRead),\n\t\t\tendOfFile,\n\t\t};\n\t}\n\n\tasync write(\n\t\toffset: number,\n\t\tdata: BytesView,\n\t): Promise<{ bytesWritten: number; endOfFile: boolean }> {\n\t\tif (this._handle == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The NVM file is not open\",\n\t\t\t\tZWaveErrorCodes.NVM_NotOpen,\n\t\t\t);\n\t\t}\n\t\tif (offset + data.length > this.size) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Write would exceed the NVM size\",\n\t\t\t\tZWaveErrorCodes.NVM_NoSpace,\n\t\t\t);\n\t\t}\n\t\tconst writeResult = await this._handle.write(\n\t\t\tdata,\n\t\t\t0,\n\t\t\tdata.length,\n\t\t\toffset,\n\t\t);\n\t\tconst endOfFile = offset + writeResult.bytesWritten >= this.size;\n\t\treturn { bytesWritten: writeResult.bytesWritten, endOfFile };\n\t}\n\n\tasync close(): Promise<void> {\n\t\tawait this._handle?.close();\n\t\tthis._handle = undefined;\n\t\tthis._accessMode = NVMAccess.None;\n\t\tthis._size = undefined;\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,kBAA4C;AAE5C,sBAAoC;AACpC,yBAAsC;AAGhC,MAAO,UAAS;EANtB,OAMsB;;;EACrB,YAAmB,MAAY;AAC9B,SAAK,QAAQ;AACb,SAAK,cAAc,6BAAU;EAC9B;EAEQ;EACA;EACA,aAAa,KAAK;;EAE1B,MAAM,KAAK,QAAiB;AAC3B,QAAI;AACJ,YAAQ,QAAQ;MACf,KAAK,6BAAU;AACd,gBAAQ;AACR;MACD,KAAK,6BAAU;MACf,KAAK,6BAAU;AAEd,gBAAQ;AACR,iBAAS,6BAAU;AACnB;MACD;AACC,cAAM,IAAI,MAAM,qBAAqB;IACvC;AACA,SAAK,UAAU,MAAM,gBAAAA,QAAG,KAAK,KAAK,OAAO,KAAK;AAC9C,SAAK,SAAS,MAAM,KAAK,QAAQ,KAAI,GAAI;AAEzC,SAAK,cAAc;AACnB,WAAO;EACR;EAEQ;EACR,IAAI,OAAI;AACP,QAAI,KAAK,SAAS,QAAW;AAC5B,YAAM,IAAI,uBACT,4BACA,4BAAgB,WAAW;IAE7B;AACA,WAAO,KAAK;EACb;EAEQ;EACR,IAAI,aAAU;AACb,WAAO,KAAK;EACb;EAEA,qBAAkB;AACjB,WAAO,QAAQ,QAAQ,KAAK,UAAU;EACvC;EAEA,MAAM,KACL,QACA,QAAc;AAEd,QAAI,KAAK,WAAW,QAAW;AAC9B,YAAM,IAAI,uBACT,4BACA,4BAAgB,WAAW;IAE7B;AACA,UAAM,aAAa,MAAM,KAAK,QAAQ,KAAK;MAC1C,QAAQ,IAAI,WAAW,MAAM;MAC7B,UAAU;KACV;AAED,UAAM,YAAY,SAAS,WAAW,aAAa,KAAK;AACxD,WAAO;MACN,QAAQ,WAAW,OAAO,SAAS,GAAG,WAAW,SAAS;MAC1D;;EAEF;EAEA,MAAM,MACL,QACA,MAAe;AAEf,QAAI,KAAK,WAAW,QAAW;AAC9B,YAAM,IAAI,uBACT,4BACA,4BAAgB,WAAW;IAE7B;AACA,QAAI,SAAS,KAAK,SAAS,KAAK,MAAM;AACrC,YAAM,IAAI,uBACT,mCACA,4BAAgB,WAAW;IAE7B;AACA,UAAM,cAAc,MAAM,KAAK,QAAQ,MACtC,MACA,GACA,KAAK,QACL,MAAM;AAEP,UAAM,YAAY,SAAS,YAAY,gBAAgB,KAAK;AAC5D,WAAO,EAAE,cAAc,YAAY,cAAc,UAAS;EAC3D;EAEA,MAAM,QAAK;AACV,UAAM,KAAK,SAAS,MAAK;AACzB,SAAK,UAAU;AACf,SAAK,cAAc,6BAAU;AAC7B,SAAK,QAAQ;EACd;;",
6
6
  "names": ["fs"]
7
7
  }
@@ -1,17 +1,18 @@
1
+ import type { BytesView } from "@zwave-js/shared";
1
2
  import { NVMAccess, type NVMIO } from "../common/definitions.js";
2
3
  /** An im-memory implementation of NVMIO */
3
4
  export declare class NVMMemoryIO implements NVMIO {
4
- constructor(buffer: Uint8Array);
5
+ constructor(buffer: BytesView);
5
6
  private _buffer;
6
7
  open(_access: NVMAccess.Read | NVMAccess.Write): Promise<NVMAccess>;
7
8
  get size(): number;
8
9
  get accessMode(): NVMAccess;
9
10
  determineChunkSize(): Promise<number>;
10
11
  read(offset: number, length: number): Promise<{
11
- buffer: Uint8Array;
12
+ buffer: BytesView;
12
13
  endOfFile: boolean;
13
14
  }>;
14
- write(offset: number, data: Uint8Array): Promise<{
15
+ write(offset: number, data: BytesView): Promise<{
15
16
  bytesWritten: number;
16
17
  endOfFile: boolean;
17
18
  }>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/io/NVMMemoryIO.ts"],
4
- "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport { NVMAccess, type NVMIO } from \"../common/definitions.js\";\n\n/** An im-memory implementation of NVMIO */\nexport class NVMMemoryIO implements NVMIO {\n\tpublic constructor(buffer: Uint8Array) {\n\t\tthis._buffer = buffer;\n\t}\n\n\tprivate _buffer: Uint8Array;\n\n\topen(_access: NVMAccess.Read | NVMAccess.Write): Promise<NVMAccess> {\n\t\t// Nothing to do\n\t\treturn Promise.resolve(NVMAccess.ReadWrite);\n\t}\n\n\tget size(): number {\n\t\treturn this._buffer.length;\n\t}\n\n\tget accessMode(): NVMAccess {\n\t\treturn NVMAccess.ReadWrite;\n\t}\n\n\tdetermineChunkSize(): Promise<number> {\n\t\t// We can read the entire buffer at once\n\t\treturn Promise.resolve(this._buffer.length);\n\t}\n\n\tread(\n\t\toffset: number,\n\t\tlength: number,\n\t): Promise<{ buffer: Uint8Array; endOfFile: boolean }> {\n\t\treturn Promise.resolve({\n\t\t\tbuffer: this._buffer.subarray(offset, offset + length),\n\t\t\tendOfFile: offset + length >= this._buffer.length,\n\t\t});\n\t}\n\n\twrite(\n\t\toffset: number,\n\t\tdata: Uint8Array,\n\t): Promise<{ bytesWritten: number; endOfFile: boolean }> {\n\t\tif (offset + data.length > this.size) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Write would exceed the NVM size\",\n\t\t\t\tZWaveErrorCodes.NVM_NoSpace,\n\t\t\t);\n\t\t}\n\n\t\tthis._buffer.set(data, offset);\n\t\treturn Promise.resolve({\n\t\t\tbytesWritten: data.length,\n\t\t\tendOfFile: offset + data.length >= this._buffer.length,\n\t\t});\n\t}\n\n\tclose(): Promise<void> {\n\t\t// Nothing to do\n\t\treturn Promise.resolve();\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,kBAA4C;AAC5C,yBAAsC;AAGhC,MAAO,YAAW;EAJxB,OAIwB;;;EACvB,YAAmB,QAAkB;AACpC,SAAK,UAAU;EAChB;EAEQ;EAER,KAAK,SAAyC;AAE7C,WAAO,QAAQ,QAAQ,6BAAU,SAAS;EAC3C;EAEA,IAAI,OAAI;AACP,WAAO,KAAK,QAAQ;EACrB;EAEA,IAAI,aAAU;AACb,WAAO,6BAAU;EAClB;EAEA,qBAAkB;AAEjB,WAAO,QAAQ,QAAQ,KAAK,QAAQ,MAAM;EAC3C;EAEA,KACC,QACA,QAAc;AAEd,WAAO,QAAQ,QAAQ;MACtB,QAAQ,KAAK,QAAQ,SAAS,QAAQ,SAAS,MAAM;MACrD,WAAW,SAAS,UAAU,KAAK,QAAQ;KAC3C;EACF;EAEA,MACC,QACA,MAAgB;AAEhB,QAAI,SAAS,KAAK,SAAS,KAAK,MAAM;AACrC,YAAM,IAAI,uBACT,mCACA,4BAAgB,WAAW;IAE7B;AAEA,SAAK,QAAQ,IAAI,MAAM,MAAM;AAC7B,WAAO,QAAQ,QAAQ;MACtB,cAAc,KAAK;MACnB,WAAW,SAAS,KAAK,UAAU,KAAK,QAAQ;KAChD;EACF;EAEA,QAAK;AAEJ,WAAO,QAAQ,QAAO;EACvB;;",
4
+ "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport type { BytesView } from \"@zwave-js/shared\";\nimport { NVMAccess, type NVMIO } from \"../common/definitions.js\";\n\n/** An im-memory implementation of NVMIO */\nexport class NVMMemoryIO implements NVMIO {\n\tpublic constructor(buffer: BytesView) {\n\t\tthis._buffer = buffer;\n\t}\n\n\tprivate _buffer: BytesView;\n\n\topen(_access: NVMAccess.Read | NVMAccess.Write): Promise<NVMAccess> {\n\t\t// Nothing to do\n\t\treturn Promise.resolve(NVMAccess.ReadWrite);\n\t}\n\n\tget size(): number {\n\t\treturn this._buffer.length;\n\t}\n\n\tget accessMode(): NVMAccess {\n\t\treturn NVMAccess.ReadWrite;\n\t}\n\n\tdetermineChunkSize(): Promise<number> {\n\t\t// We can read the entire buffer at once\n\t\treturn Promise.resolve(this._buffer.length);\n\t}\n\n\tread(\n\t\toffset: number,\n\t\tlength: number,\n\t): Promise<{ buffer: BytesView; endOfFile: boolean }> {\n\t\treturn Promise.resolve({\n\t\t\tbuffer: this._buffer.subarray(offset, offset + length),\n\t\t\tendOfFile: offset + length >= this._buffer.length,\n\t\t});\n\t}\n\n\twrite(\n\t\toffset: number,\n\t\tdata: BytesView,\n\t): Promise<{ bytesWritten: number; endOfFile: boolean }> {\n\t\tif (offset + data.length > this.size) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Write would exceed the NVM size\",\n\t\t\t\tZWaveErrorCodes.NVM_NoSpace,\n\t\t\t);\n\t\t}\n\n\t\tthis._buffer.set(data, offset);\n\t\treturn Promise.resolve({\n\t\t\tbytesWritten: data.length,\n\t\t\tendOfFile: offset + data.length >= this._buffer.length,\n\t\t});\n\t}\n\n\tclose(): Promise<void> {\n\t\t// Nothing to do\n\t\treturn Promise.resolve();\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,kBAA4C;AAE5C,yBAAsC;AAGhC,MAAO,YAAW;EALxB,OAKwB;;;EACvB,YAAmB,QAAiB;AACnC,SAAK,UAAU;EAChB;EAEQ;EAER,KAAK,SAAyC;AAE7C,WAAO,QAAQ,QAAQ,6BAAU,SAAS;EAC3C;EAEA,IAAI,OAAI;AACP,WAAO,KAAK,QAAQ;EACrB;EAEA,IAAI,aAAU;AACb,WAAO,6BAAU;EAClB;EAEA,qBAAkB;AAEjB,WAAO,QAAQ,QAAQ,KAAK,QAAQ,MAAM;EAC3C;EAEA,KACC,QACA,QAAc;AAEd,WAAO,QAAQ,QAAQ;MACtB,QAAQ,KAAK,QAAQ,SAAS,QAAQ,SAAS,MAAM;MACrD,WAAW,SAAS,UAAU,KAAK,QAAQ;KAC3C;EACF;EAEA,MACC,QACA,MAAe;AAEf,QAAI,SAAS,KAAK,SAAS,KAAK,MAAM;AACrC,YAAM,IAAI,uBACT,mCACA,4BAAgB,WAAW;IAE7B;AAEA,SAAK,QAAQ,IAAI,MAAM,MAAM;AAC7B,WAAO,QAAQ,QAAQ;MACtB,cAAc,KAAK;MACnB,WAAW,SAAS,KAAK,UAAU,KAAK,QAAQ;KAChD;EACF;EAEA,QAAK;AAEJ,WAAO,QAAQ,QAAO;EACvB;;",
6
6
  "names": []
7
7
  }
@@ -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 { 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, Uint8Array | 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: Uint8Array | 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\";\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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",
6
6
  "names": []
7
7
  }
@@ -1,8 +1,8 @@
1
- import { Bytes } from "@zwave-js/shared";
1
+ import { Bytes, type BytesView } from "@zwave-js/shared";
2
2
  import type { NVM3Object } from "../object.js";
3
3
  import { NVMFile, type NVMFileCreationOptions, type NVMFileDeserializationOptions } from "./NVMFile.js";
4
4
  export type ControllerInfoFileOptions = NVMFileCreationOptions & {
5
- homeId: Uint8Array;
5
+ homeId: BytesView;
6
6
  nodeId: number;
7
7
  lastNodeId: number;
8
8
  staticControllerNodeId: number;
@@ -23,7 +23,7 @@ export type ControllerInfoFileOptions = NVMFileCreationOptions & {
23
23
  export declare const ControllerInfoFileID = 327684;
24
24
  export declare class ControllerInfoFile extends NVMFile {
25
25
  constructor(options: NVMFileDeserializationOptions | ControllerInfoFileOptions);
26
- homeId: Uint8Array;
26
+ homeId: BytesView;
27
27
  nodeId: number;
28
28
  lastNodeId: number;
29
29
  staticControllerNodeId: number;
@@ -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, 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: Uint8Array;\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: Uint8Array;\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\tBytes.from([\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// eslint-disable-next-line @typescript-eslint/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": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kBAA4D;AAC5D,oBAAkC;AAElC,qBAOO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,uBAAuB;IAIvB,sBAAkB,MAAA;8BAF9B,0BAAU,oBAAoB,OAC9B,2BAAW,UAAU,CAAC;;;;oBACiB;0CAAA,YAAO;WAAA;;;;;;;;AAA/C,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IACZ,YACC,SAAkE;AAElE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,aAAK,SAAS,KAAK,QAAQ,SAAS,GAAG,CAAC;AACxC,YAAI,KAAK,QAAQ,WAAW,IAAI;AAC/B,eAAK,SAAS,KAAK,QAAQ,CAAC;AAC5B,eAAK,aAAa,KAAK,QAAQ,CAAC;AAChC,eAAK,yBAAyB,KAAK,QAAQ,CAAC;AAC5C,eAAK,eAAe,KAAK,QAAQ,CAAC;AAClC,eAAK,0BAA0B,KAAK,QAAQ,CAAC;AAC7C,eAAK,yBAAyB,KAAK,QAAQ,CAAC;AAC5C,eAAK,YAAY,KAAK,QAAQ,EAAE;AAChC,eAAK,aAAa,KAAK,QAAQ,EAAE;AACjC,eAAK,cAAc,KAAK,QAAQ,EAAE;QACnC,WAAW,KAAK,QAAQ,WAAW,IAAI;AACtC,eAAK,SAAS,KAAK,QAAQ,aAAa,CAAC;AACzC,eAAK,yBAAyB,KAAK,QAAQ,aAAa,CAAC;AACzD,eAAK,eAAe,KAAK,QAAQ,aAAa,CAAC;AAC/C,eAAK,aAAa,KAAK,QAAQ,EAAE;AACjC,eAAK,eAAe,KAAK,QAAQ,EAAE;AACnC,eAAK,cAAc,KAAK,QAAQ,aAAa,EAAE;AAC/C,eAAK,YAAY,KAAK,QAAQ,EAAE;AAChC,eAAK,0BAA0B,KAAK,QAAQ,EAAE;AAC9C,eAAK,eAAe,KAAK,QAAQ,aAAa,EAAE;AAChD,eAAK,aAAa,KAAK,QAAQ,EAAE;AACjC,eAAK,cAAc,KAAK,QAAQ,EAAE;AAClC,eAAK,4BAA4B,KAAK,QAAQ,EAAE;AAChD,eAAK,aAAa,KAAK,QAAQ,EAAE;QAClC,OAAO;AACN,gBAAM,IAAI,uBACT,8BACA,4BAAgB,iBAAiB;QAEnC;MACD,OAAO;AACN,aAAK,SAAS,oBAAM,KAAK,QAAQ,MAAM;AACvC,aAAK,SAAS,QAAQ;AACtB,aAAK,aAAa,QAAQ;AAC1B,aAAK,yBAAyB,QAAQ;AACtC,aAAK,eAAe,QAAQ;AAC5B,aAAK,0BAA0B,QAAQ;AACvC,aAAK,YAAY,QAAQ;AACzB,aAAK,aAAa,QAAQ;AAC1B,aAAK,cAAc,QAAQ;AAC3B,YAAI,kBAAkB,SAAS;AAC9B,eAAK,eAAe,QAAQ;AAC5B,eAAK,cAAc,QAAQ;AAC3B,eAAK,eAAe,QAAQ;AAC5B,eAAK,4BACJ,QAAQ;AACT,eAAK,aAAa,QAAQ;QAC3B,OAAO;AACN,eAAK,yBAAyB,QAAQ;QACvC;MACD;IACD;IAEO;IACA;IACA;IACA;IACA;IACA;;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA,YAAS;AACf,UAAI,KAAK,gBAAgB,QAAW;AACnC,aAAK,UAAU,IAAI,oBAAM,EAAE;AAC3B,aAAK,QAAQ,IAAI,KAAK,QAAQ,CAAC;AAC/B,aAAK,QAAQ,cAAc,KAAK,QAAQ,CAAC;AACzC,aAAK,QAAQ,cAAc,KAAK,wBAAwB,CAAC;AACzD,aAAK,QAAQ,cAAc,KAAK,cAAc,CAAC;AAC/C,aAAK,QAAQ,EAAE,IAAI,KAAK;AACxB,aAAK,QAAQ,EAAE,IAAI,KAAK;AACxB,aAAK,QAAQ,cAAc,KAAK,aAAc,EAAE;AAChD,aAAK,QAAQ,EAAE,IAAI,KAAK;AACxB,aAAK,QAAQ,EAAE,IAAI,KAAK;AACxB,aAAK,QAAQ,cAAc,KAAK,cAAe,EAAE;AACjD,aAAK,QAAQ,EAAE,IAAI,KAAK;AACxB,aAAK,QAAQ,EAAE,IAAI,KAAK;AACxB,aAAK,QAAQ,EAAE,IAAI,KAAK;AACxB,aAAK,QAAQ,EAAE,IAAI,KAAK;MACzB,OAAO;AAEN,aAAK,UAAU,oBAAM,OAAO;UAC3B,KAAK;UACL,oBAAM,KAAK;YACV,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK,0BAA0B;YAC/B,KAAK;YACL,KAAK;YACL,KAAK;WACL;SACD;MACF;AACA,aAAO,MAAM,UAAS;IACvB;;IAGO,SAAM;AACZ,iBAAO,4BAAe;QACrB,GAAG,MAAM,OAAM;QACf,YAAQ,0BAAW,KAAK,MAAM;QAC9B,QAAQ,KAAK;QACb,YAAY,KAAK;QACjB,wBAAwB,KAAK;QAC7B,cAAc,KAAK;QACnB,yBAAyB,KAAK;QAC9B,wBAAwB,KAAK;QAC7B,WAAW,KAAK;QAChB,YAAY,KAAK;QACjB,aAAa,KAAK;QAClB,cAAc,KAAK;QACnB,aAAa,KAAK;QAClB,cAAc,KAAK;QACnB,2BAA2B,KAAK;QAChC,YAAY,KAAK;OACjB;IACF;;;;",
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\tBytes.from([\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// eslint-disable-next-line @typescript-eslint/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,4 +1,4 @@
1
- import { Bytes, type TypedClassDecorator } from "@zwave-js/shared";
1
+ import { Bytes, type BytesView, type TypedClassDecorator } from "@zwave-js/shared";
2
2
  import type { NVM3Object } from "../object.js";
3
3
  export interface NVMFileBaseOptions {
4
4
  fileId?: number;
@@ -20,7 +20,7 @@ export declare class NVMFile {
20
20
  /**
21
21
  * Creates an instance of the NVM file that is contained in the given NVM object
22
22
  */
23
- static from(fileId: number, data: Uint8Array, fileVersion: string): NVMFile;
23
+ static from(fileId: number, data: BytesView, fileVersion: string): NVMFile;
24
24
  /**
25
25
  * Serializes this NVMFile into an NVM Object
26
26
  */
@@ -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 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\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\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: Uint8Array,\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<T extends NVMFile>(\n\tid: T,\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<T extends NVMFileConstructor<NVMFile>>(\n\tclassConstructor: T,\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": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;AAAA,kBAA4C;AAC5C,wBAAgD;AAChD,oBAKO;AACP,oBAIO;AAYD,SAAU,0BACf,SAAuB;AAEvB,SAAO,UAAU,eAAW,4BAAa,QAAQ,IAAI;AACtD;AAJgB;AAaV,MAAO,QAAO;EArCpB,OAqCoB;;;EACnB,YAAmB,SAAuB;AACzC,SAAK,cAAc,QAAQ;AAE3B,QAAI,0BAA0B,OAAO,GAAG;AACvC,WAAK,SAAS,QAAQ;AACtB,WAAK,UAAU,QAAQ;IACxB,OAAO;AACN,YAAM,SAAS,QAAQ,UAAU,aAAa,IAAI;AAClD,UAAI,OAAO,WAAW,UAAU;AAC/B,aAAK,SAAS;MACf;AACA,WAAK,UAAU,IAAI,oBAAK;IACzB;EACD;EAEU;EACH,SAAiB;EACjB;;;;EAKA,OAAO,KACb,QACA,MACA,aAAmB;AAEnB,UAAM,cAAc,sBAAsB,MAAM;AAChD,WAAO,IAAI,YAAY;MACtB;MACA;MACA;KACA;EACF;;;;EAKO,YAAS;AACf,QAAI,CAAC,KAAK,QAAQ;AACjB,YAAM,IAAI,MAAM,gDAAgD;IACjE;AACA,WAAO;MACN,KAAK,KAAK;MACV,MAAM,KAAK;;MAEX,MAAM,KAAK,QAAQ,UAAU,wCAC1B,yBAAW,YACX,yBAAW;;MAEd,cAAc,2BAAa;;EAE7B;EAEO,SAAM;AACZ,WAAO;MACN,WAAW,KACV,KAAK,OAAO,SAAS,EAAE,CACxB,KAAK,KAAK,YAAY,IAAI;;EAE5B;;AAGD,MAAM,qBAAqB,OAAO,WAAW;AAC7C,MAAM,wBAAwB,OAAO,cAAc;AAc7C,SAAU,UACf,IAAsC;AAEtC,SAAO,CAAC,iBAAgB;AACvB,YAAQ,eAAe,oBAAoB,IAAI,YAAY;AAG3D,UAAM,MACL,QAAQ,YAAY,uBAAuB,OAAO,KAAK,oBAAI,IAAG;AAC/D,QAAI,IAAI,IAAI,YAAsD;AAClE,YAAQ,eAAe,uBAAuB,KAAK,OAAO;EAC3D;AACD;AAZgB;AAiBV,SAAU,aACf,IAAK;AAGL,QAAM,SAAS,GAAG;AAElB,QAAM,MAA0B,cAAc,UAC3C,QAAQ,YAAY,oBAAoB,MAAM,IAC9C;AACH,MAAI,OAAO,QAAW;AACrB,UAAM,IAAI,uBACT,8BAA8B,OAAO,IAAI,KACzC,4BAAgB,UAAU;EAE5B;AACA,SAAO;AACR;AAhBgB;AAqBV,SAAU,sBACf,IAAU;AAGV,QAAM,MAAM,QAAQ,YAAY,uBAAuB,OAAO;AAG9D,MAAI,OAAO,QAAW;AACrB,QAAI,IAAI,IAAI,EAAE;AAAG,aAAO,IAAI,IAAI,EAAE;AAElC,eAAW,CAAC,KAAK,KAAK,KAAK,IAAI,QAAO,GAAI;AACzC,UAAI,OAAO,QAAQ,cAAc,IAAI,EAAE;AAAG,eAAO;IAClD;EACD;AACD;AAdgB;AAmBV,SAAU,mBACf,kBAAmB;AAGnB,QAAM,MAAM,QAAQ,YAAY,oBAAoB,gBAAgB;AACpE,MAAI,OAAO,QAAW;AACrB,UAAM,IAAI,uBACT,8BAA8B,iBAAiB,IAAI,KACnD,4BAAgB,UAAU;EAE5B;AACA,SAAO;AACR;AAZgB;AAgBhB,MAAM,0BAAsB,mDAG1B;EACD,MAAM;CACN;AAGM,MAAM,aAAa,oBAAoB;AAGvC,MAAM,gBAAgB,oBAAoB;AAG1C,MAAM,sBAAsB,oBAAoB;AAGjD,SAAU,sBAAsB,QAAc;AACnD,QAAM,OAAO,sBAAsB,MAAM;AACzC,MAAI;AACJ,MAAI,MAAM;AACT,UAAM,oBAAoB,IAAI;EAC/B;AACA,MAAI;AAAK,WAAO;AAEhB,QAAM,IAAI,uBACT,oCACC,uBAAQ,MAAM,CACf,4BACA,4BAAgB,gBAAgB;AAElC;AAdgB;",
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\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\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<T extends NVMFile>(\n\tid: T,\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<T extends NVMFileConstructor<NVMFile>>(\n\tclassConstructor: T,\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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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/nvm3/files/NodeInfoFiles.ts"],
4
- "sourcesContent": ["import {\n\ttype DataRate,\n\ttype FLiRS,\n\tMAX_NODES,\n\tMAX_NODES_LR,\n\tNUM_NODEMASK_BYTES,\n\ttype NodeProtocolInfo,\n\tNodeType,\n\tencodeBitMask,\n\tencodeNodeProtocolInfo,\n\tparseBitMask,\n\tparseNodeProtocolInfo,\n} from \"@zwave-js/core\";\nimport { Bytes, pick } 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 const NODEINFOS_PER_FILE_V1 = 4;\nexport const LR_NODEINFOS_PER_FILE_V5 = 50;\nconst NODEINFO_SIZE = 1 + 5 + NUM_NODEMASK_BYTES;\nconst LR_NODEINFO_SIZE = 3;\nconst EMPTY_NODEINFO_FILL = 0xff;\nconst emptyNodeInfo = new Uint8Array(NODEINFO_SIZE).fill(EMPTY_NODEINFO_FILL);\n\nexport interface NodeInfo\n\textends Omit<NodeProtocolInfo, \"hasSpecificDeviceClass\">\n{\n\tnodeId: number;\n\tgenericDeviceClass: number;\n\tspecificDeviceClass?: number | null;\n\tneighbors: number[];\n\tsucUpdateIndex: number;\n}\n\nfunction parseNodeInfo(\n\tnodeId: number,\n\tbuffer: Uint8Array,\n\toffset: number,\n): NodeInfo {\n\tconst { hasSpecificDeviceClass, ...protocolInfo } = parseNodeProtocolInfo(\n\t\tbuffer,\n\t\toffset,\n\t);\n\tconst genericDeviceClass = buffer[offset + 3];\n\tconst specificDeviceClass = hasSpecificDeviceClass\n\t\t? buffer[offset + 4]\n\t\t: null;\n\tconst neighbors = parseBitMask(\n\t\tbuffer.subarray(offset + 5, offset + 5 + NUM_NODEMASK_BYTES),\n\t);\n\tconst sucUpdateIndex = buffer[offset + 5 + NUM_NODEMASK_BYTES];\n\treturn {\n\t\tnodeId,\n\t\t...protocolInfo,\n\t\tgenericDeviceClass,\n\t\tspecificDeviceClass,\n\t\tneighbors,\n\t\tsucUpdateIndex,\n\t};\n}\n\nfunction encodeNodeInfo(nodeInfo: NodeInfo): Bytes {\n\tconst ret = new Bytes(NODEINFO_SIZE);\n\n\tconst hasSpecificDeviceClass = nodeInfo.specificDeviceClass != null;\n\tconst protocolInfo: NodeProtocolInfo = {\n\t\t...pick(nodeInfo, [\n\t\t\t\"isListening\",\n\t\t\t\"isFrequentListening\",\n\t\t\t\"isRouting\",\n\t\t\t\"supportedDataRates\",\n\t\t\t\"protocolVersion\",\n\t\t\t\"optionalFunctionality\",\n\t\t\t\"nodeType\",\n\t\t\t\"supportsSecurity\",\n\t\t\t\"supportsBeaming\",\n\t\t]),\n\t\thasSpecificDeviceClass,\n\t};\n\tret.set(encodeNodeProtocolInfo(protocolInfo), 0);\n\n\tret[3] = nodeInfo.genericDeviceClass;\n\tif (hasSpecificDeviceClass) ret[4] = nodeInfo.specificDeviceClass!;\n\tret.set(encodeBitMask(nodeInfo.neighbors, MAX_NODES), 5);\n\tret[5 + NUM_NODEMASK_BYTES] = nodeInfo.sucUpdateIndex;\n\n\treturn ret;\n}\n\nexport interface LRNodeInfo\n\textends Omit<NodeProtocolInfo, \"hasSpecificDeviceClass\">\n{\n\tnodeId: number;\n\tgenericDeviceClass: number;\n\tspecificDeviceClass?: number | null;\n}\n\nfunction parseLRNodeInfo(\n\tnodeId: number,\n\tbuffer: Uint8Array,\n\toffset: number,\n): LRNodeInfo {\n\t// The node info in LR NVM files is packed:\n\t// Byte 0 CAPABILITY:\n\t// Bit 0: Routing (?)\n\t// Bit 1: Listening\n\t// Bit 2: has specific device class (?)\n\t// Bit 3: Beam capability\n\t// Bit 4: Optional functionality\n\t// Bits 5-6: FLiRS\n\t// Bit 7: Unused (?)\n\t// Byte 1: Generic device class\n\t// Byte 2: Specific device class\n\n\t// Protocol version is always 3\n\t// Security is always true\n\t// Supported speed is always 100kbps (speed = 0, speed ext = 2)\n\t// Never: routing end node, controller\n\n\tconst capability = buffer[offset];\n\tconst isRouting = !!(capability & 0b0000_0001); // ZWLR Mesh??\n\tconst isListening = !!(capability & 0b0000_0010);\n\tconst hasSpecificDeviceClass = !!(capability & 0b0000_0100);\n\tconst supportsBeaming = !!(capability & 0b0000_1000);\n\tconst optionalFunctionality = !!(capability & 0b0001_0000);\n\tlet isFrequentListening: FLiRS;\n\tswitch (capability & 0b0110_0000) {\n\t\tcase 0b0100_0000:\n\t\t\tisFrequentListening = \"1000ms\";\n\t\t\tbreak;\n\t\tcase 0b0010_0000:\n\t\t\tisFrequentListening = \"250ms\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tisFrequentListening = false;\n\t}\n\tconst nodeType = NodeType[\"End Node\"];\n\tconst supportsSecurity = true;\n\tconst protocolVersion = 3;\n\tconst supportedDataRates: DataRate[] = [100000];\n\n\treturn {\n\t\tnodeId,\n\t\tisRouting,\n\t\tisListening,\n\t\tsupportsBeaming,\n\t\tisFrequentListening,\n\t\toptionalFunctionality,\n\t\tnodeType,\n\t\tsupportsSecurity,\n\t\tprotocolVersion,\n\t\tsupportedDataRates,\n\t\tgenericDeviceClass: buffer[offset + 1],\n\t\tspecificDeviceClass: hasSpecificDeviceClass ? buffer[offset + 2] : null,\n\t};\n}\n\nfunction encodeLRNodeInfo(nodeInfo: LRNodeInfo): Uint8Array {\n\tconst ret = new Bytes(LR_NODEINFO_SIZE);\n\n\tlet capability = 0;\n\tif (nodeInfo.isRouting) capability |= 0b0000_0001;\n\tif (nodeInfo.isListening) capability |= 0b0000_0010;\n\tif (nodeInfo.specificDeviceClass != null) capability |= 0b0000_0100;\n\tif (nodeInfo.supportsBeaming) capability |= 0b0000_1000;\n\tif (nodeInfo.optionalFunctionality) capability |= 0b0001_0000;\n\tif (nodeInfo.isFrequentListening === \"1000ms\") {\n\t\tcapability |= 0b0100_0000;\n\t} else if (nodeInfo.isFrequentListening === \"250ms\") {\n\t\tcapability |= 0b0010_0000;\n\t}\n\n\tret[0] = capability;\n\tret[1] = nodeInfo.genericDeviceClass;\n\tret[2] = nodeInfo.specificDeviceClass ?? 0;\n\n\treturn ret;\n}\n\nexport interface NodeInfoFileV0Options extends NVMFileCreationOptions {\n\tnodeInfo: NodeInfo;\n}\n\nexport const NodeInfoFileV0IDBase = 0x50100;\nexport function nodeIdToNodeInfoFileIDV0(nodeId: number): number {\n\treturn NodeInfoFileV0IDBase + nodeId - 1;\n}\n\n@nvmFileID(\n\t(id) => id >= NodeInfoFileV0IDBase && id < NodeInfoFileV0IDBase + MAX_NODES,\n)\n@nvmSection(\"protocol\")\nexport class NodeInfoFileV0 extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | NodeInfoFileV0Options,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.nodeInfo = parseNodeInfo(\n\t\t\t\tthis.fileId - NodeInfoFileV0IDBase + 1,\n\t\t\t\tthis.payload,\n\t\t\t\t0,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.nodeInfo = options.nodeInfo;\n\t\t}\n\t}\n\n\tpublic nodeInfo: NodeInfo;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tthis.fileId = nodeIdToNodeInfoFileIDV0(this.nodeInfo.nodeId);\n\t\tthis.payload = encodeNodeInfo(this.nodeInfo);\n\t\treturn super.serialize();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\tnodeInfo: this.nodeInfo,\n\t\t};\n\t}\n}\n\nexport interface NodeInfoFileV1Options extends NVMFileCreationOptions {\n\tnodeInfos: NodeInfo[];\n}\n\nexport const NodeInfoFileV1IDBase = 0x50200;\nexport function nodeIdToNodeInfoFileIDV1(nodeId: number): number {\n\treturn (\n\t\tNodeInfoFileV1IDBase + Math.floor((nodeId - 1) / NODEINFOS_PER_FILE_V1)\n\t);\n}\n\n@nvmFileID(\n\t(id) =>\n\t\tid >= NodeInfoFileV1IDBase\n\t\t&& id < NodeInfoFileV1IDBase + MAX_NODES / NODEINFOS_PER_FILE_V1,\n)\n@nvmSection(\"protocol\")\nexport class NodeInfoFileV1 extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | NodeInfoFileV1Options,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.nodeInfos = [];\n\t\t\tfor (let i = 0; i < NODEINFOS_PER_FILE_V1; i++) {\n\t\t\t\tconst nodeId = (this.fileId - NodeInfoFileV1IDBase)\n\t\t\t\t\t\t* NODEINFOS_PER_FILE_V1\n\t\t\t\t\t+ 1\n\t\t\t\t\t+ i;\n\t\t\t\tconst offset = i * NODEINFO_SIZE;\n\t\t\t\tconst entry = this.payload.subarray(\n\t\t\t\t\toffset,\n\t\t\t\t\toffset + NODEINFO_SIZE,\n\t\t\t\t);\n\t\t\t\tif (entry.equals(emptyNodeInfo)) continue;\n\n\t\t\t\tconst nodeInfo = parseNodeInfo(\n\t\t\t\t\tnodeId,\n\t\t\t\t\tentry,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tthis.nodeInfos.push(nodeInfo);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.nodeInfos = options.nodeInfos;\n\t\t}\n\t}\n\n\tpublic nodeInfos: NodeInfo[];\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\t// The infos must be sorted by node ID\n\t\tthis.nodeInfos.sort((a, b) => a.nodeId - b.nodeId);\n\t\tconst minNodeId = this.nodeInfos[0].nodeId;\n\t\tthis.fileId = nodeIdToNodeInfoFileIDV1(minNodeId);\n\n\t\tthis.payload = new Bytes(NODEINFO_SIZE * NODEINFOS_PER_FILE_V1).fill(\n\t\t\tEMPTY_NODEINFO_FILL,\n\t\t);\n\n\t\tconst minFileNodeId =\n\t\t\tMath.floor((minNodeId - 1) / NODEINFOS_PER_FILE_V1)\n\t\t\t\t* NODEINFOS_PER_FILE_V1\n\t\t\t+ 1;\n\n\t\tfor (const nodeInfo of this.nodeInfos) {\n\t\t\tconst offset = (nodeInfo.nodeId - minFileNodeId) * NODEINFO_SIZE;\n\t\t\tthis.payload.set(encodeNodeInfo(nodeInfo), offset);\n\t\t}\n\n\t\treturn super.serialize();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\t\"node infos\": this.nodeInfos,\n\t\t};\n\t}\n}\n\nexport interface LRNodeInfoFileV5Options extends NVMFileCreationOptions {\n\tnodeInfos: LRNodeInfo[];\n}\n\nexport const LRNodeInfoFileV5IDBase = 0x50800;\nexport function nodeIdToLRNodeInfoFileIDV5(nodeId: number): number {\n\treturn (\n\t\tLRNodeInfoFileV5IDBase\n\t\t+ Math.floor((nodeId - 256) / LR_NODEINFOS_PER_FILE_V5)\n\t);\n}\n\n// Counting starts with 5, because we only implemented this after reaching protocol file format 5\n@nvmFileID(\n\t(id) =>\n\t\tid >= LRNodeInfoFileV5IDBase\n\t\t&& id\n\t\t\t< LRNodeInfoFileV5IDBase + MAX_NODES_LR / LR_NODEINFOS_PER_FILE_V5,\n)\n@nvmSection(\"protocol\")\nexport class LRNodeInfoFileV5 extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | LRNodeInfoFileV5Options,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.nodeInfos = [];\n\t\t\tfor (let i = 0; i < LR_NODEINFOS_PER_FILE_V5; i++) {\n\t\t\t\tconst nodeId = (this.fileId - LRNodeInfoFileV5IDBase)\n\t\t\t\t\t\t* LR_NODEINFOS_PER_FILE_V5\n\t\t\t\t\t+ 256\n\t\t\t\t\t+ i;\n\t\t\t\tconst offset = i * LR_NODEINFO_SIZE;\n\t\t\t\tconst entry = this.payload.subarray(\n\t\t\t\t\toffset,\n\t\t\t\t\toffset + LR_NODEINFO_SIZE,\n\t\t\t\t);\n\t\t\t\tif (entry.equals(emptyNodeInfo)) continue;\n\n\t\t\t\tconst nodeInfo = parseLRNodeInfo(\n\t\t\t\t\tnodeId,\n\t\t\t\t\tentry,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tthis.nodeInfos.push(nodeInfo);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.nodeInfos = options.nodeInfos;\n\t\t}\n\t}\n\n\tpublic nodeInfos: LRNodeInfo[];\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\t// The infos must be sorted by node ID\n\t\tthis.nodeInfos.sort((a, b) => a.nodeId - b.nodeId);\n\t\tconst minNodeId = this.nodeInfos[0].nodeId;\n\t\tthis.fileId = nodeIdToLRNodeInfoFileIDV5(minNodeId);\n\n\t\tthis.payload = new Bytes(LR_NODEINFO_SIZE * LR_NODEINFOS_PER_FILE_V5)\n\t\t\t.fill(EMPTY_NODEINFO_FILL);\n\n\t\tconst minFileNodeId =\n\t\t\tMath.floor((minNodeId - 256) / LR_NODEINFOS_PER_FILE_V5)\n\t\t\t\t* LR_NODEINFOS_PER_FILE_V5\n\t\t\t+ 256;\n\n\t\tfor (const nodeInfo of this.nodeInfos) {\n\t\t\tconst offset = (nodeInfo.nodeId - minFileNodeId) * LR_NODEINFO_SIZE;\n\t\t\tthis.payload.set(encodeLRNodeInfo(nodeInfo), offset);\n\t\t}\n\n\t\treturn super.serialize();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\t\"node infos\": this.nodeInfos,\n\t\t};\n\t}\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\ttype DataRate,\n\ttype FLiRS,\n\tMAX_NODES,\n\tMAX_NODES_LR,\n\tNUM_NODEMASK_BYTES,\n\ttype NodeProtocolInfo,\n\tNodeType,\n\tencodeBitMask,\n\tencodeNodeProtocolInfo,\n\tparseBitMask,\n\tparseNodeProtocolInfo,\n} from \"@zwave-js/core\";\nimport { Bytes, type BytesView, pick } 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 const NODEINFOS_PER_FILE_V1 = 4;\nexport const LR_NODEINFOS_PER_FILE_V5 = 50;\nconst NODEINFO_SIZE = 1 + 5 + NUM_NODEMASK_BYTES;\nconst LR_NODEINFO_SIZE = 3;\nconst EMPTY_NODEINFO_FILL = 0xff;\nconst emptyNodeInfo = new Uint8Array(NODEINFO_SIZE).fill(EMPTY_NODEINFO_FILL);\n\nexport interface NodeInfo\n\textends Omit<NodeProtocolInfo, \"hasSpecificDeviceClass\">\n{\n\tnodeId: number;\n\tgenericDeviceClass: number;\n\tspecificDeviceClass?: number | null;\n\tneighbors: number[];\n\tsucUpdateIndex: number;\n}\n\nfunction parseNodeInfo(\n\tnodeId: number,\n\tbuffer: BytesView,\n\toffset: number,\n): NodeInfo {\n\tconst { hasSpecificDeviceClass, ...protocolInfo } = parseNodeProtocolInfo(\n\t\tbuffer,\n\t\toffset,\n\t);\n\tconst genericDeviceClass = buffer[offset + 3];\n\tconst specificDeviceClass = hasSpecificDeviceClass\n\t\t? buffer[offset + 4]\n\t\t: null;\n\tconst neighbors = parseBitMask(\n\t\tbuffer.subarray(offset + 5, offset + 5 + NUM_NODEMASK_BYTES),\n\t);\n\tconst sucUpdateIndex = buffer[offset + 5 + NUM_NODEMASK_BYTES];\n\treturn {\n\t\tnodeId,\n\t\t...protocolInfo,\n\t\tgenericDeviceClass,\n\t\tspecificDeviceClass,\n\t\tneighbors,\n\t\tsucUpdateIndex,\n\t};\n}\n\nfunction encodeNodeInfo(nodeInfo: NodeInfo): Bytes {\n\tconst ret = new Bytes(NODEINFO_SIZE);\n\n\tconst hasSpecificDeviceClass = nodeInfo.specificDeviceClass != null;\n\tconst protocolInfo: NodeProtocolInfo = {\n\t\t...pick(nodeInfo, [\n\t\t\t\"isListening\",\n\t\t\t\"isFrequentListening\",\n\t\t\t\"isRouting\",\n\t\t\t\"supportedDataRates\",\n\t\t\t\"protocolVersion\",\n\t\t\t\"optionalFunctionality\",\n\t\t\t\"nodeType\",\n\t\t\t\"supportsSecurity\",\n\t\t\t\"supportsBeaming\",\n\t\t]),\n\t\thasSpecificDeviceClass,\n\t};\n\tret.set(encodeNodeProtocolInfo(protocolInfo), 0);\n\n\tret[3] = nodeInfo.genericDeviceClass;\n\tif (hasSpecificDeviceClass) ret[4] = nodeInfo.specificDeviceClass!;\n\tret.set(encodeBitMask(nodeInfo.neighbors, MAX_NODES), 5);\n\tret[5 + NUM_NODEMASK_BYTES] = nodeInfo.sucUpdateIndex;\n\n\treturn ret;\n}\n\nexport interface LRNodeInfo\n\textends Omit<NodeProtocolInfo, \"hasSpecificDeviceClass\">\n{\n\tnodeId: number;\n\tgenericDeviceClass: number;\n\tspecificDeviceClass?: number | null;\n}\n\nfunction parseLRNodeInfo(\n\tnodeId: number,\n\tbuffer: BytesView,\n\toffset: number,\n): LRNodeInfo {\n\t// The node info in LR NVM files is packed:\n\t// Byte 0 CAPABILITY:\n\t// Bit 0: Routing (?)\n\t// Bit 1: Listening\n\t// Bit 2: has specific device class (?)\n\t// Bit 3: Beam capability\n\t// Bit 4: Optional functionality\n\t// Bits 5-6: FLiRS\n\t// Bit 7: Unused (?)\n\t// Byte 1: Generic device class\n\t// Byte 2: Specific device class\n\n\t// Protocol version is always 3\n\t// Security is always true\n\t// Supported speed is always 100kbps (speed = 0, speed ext = 2)\n\t// Never: routing end node, controller\n\n\tconst capability = buffer[offset];\n\tconst isRouting = !!(capability & 0b0000_0001); // ZWLR Mesh??\n\tconst isListening = !!(capability & 0b0000_0010);\n\tconst hasSpecificDeviceClass = !!(capability & 0b0000_0100);\n\tconst supportsBeaming = !!(capability & 0b0000_1000);\n\tconst optionalFunctionality = !!(capability & 0b0001_0000);\n\tlet isFrequentListening: FLiRS;\n\tswitch (capability & 0b0110_0000) {\n\t\tcase 0b0100_0000:\n\t\t\tisFrequentListening = \"1000ms\";\n\t\t\tbreak;\n\t\tcase 0b0010_0000:\n\t\t\tisFrequentListening = \"250ms\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tisFrequentListening = false;\n\t}\n\tconst nodeType = NodeType[\"End Node\"];\n\tconst supportsSecurity = true;\n\tconst protocolVersion = 3;\n\tconst supportedDataRates: DataRate[] = [100000];\n\n\treturn {\n\t\tnodeId,\n\t\tisRouting,\n\t\tisListening,\n\t\tsupportsBeaming,\n\t\tisFrequentListening,\n\t\toptionalFunctionality,\n\t\tnodeType,\n\t\tsupportsSecurity,\n\t\tprotocolVersion,\n\t\tsupportedDataRates,\n\t\tgenericDeviceClass: buffer[offset + 1],\n\t\tspecificDeviceClass: hasSpecificDeviceClass ? buffer[offset + 2] : null,\n\t};\n}\n\nfunction encodeLRNodeInfo(nodeInfo: LRNodeInfo): BytesView {\n\tconst ret = new Bytes(LR_NODEINFO_SIZE);\n\n\tlet capability = 0;\n\tif (nodeInfo.isRouting) capability |= 0b0000_0001;\n\tif (nodeInfo.isListening) capability |= 0b0000_0010;\n\tif (nodeInfo.specificDeviceClass != null) capability |= 0b0000_0100;\n\tif (nodeInfo.supportsBeaming) capability |= 0b0000_1000;\n\tif (nodeInfo.optionalFunctionality) capability |= 0b0001_0000;\n\tif (nodeInfo.isFrequentListening === \"1000ms\") {\n\t\tcapability |= 0b0100_0000;\n\t} else if (nodeInfo.isFrequentListening === \"250ms\") {\n\t\tcapability |= 0b0010_0000;\n\t}\n\n\tret[0] = capability;\n\tret[1] = nodeInfo.genericDeviceClass;\n\tret[2] = nodeInfo.specificDeviceClass ?? 0;\n\n\treturn ret;\n}\n\nexport interface NodeInfoFileV0Options extends NVMFileCreationOptions {\n\tnodeInfo: NodeInfo;\n}\n\nexport const NodeInfoFileV0IDBase = 0x50100;\nexport function nodeIdToNodeInfoFileIDV0(nodeId: number): number {\n\treturn NodeInfoFileV0IDBase + nodeId - 1;\n}\n\n@nvmFileID(\n\t(id) => id >= NodeInfoFileV0IDBase && id < NodeInfoFileV0IDBase + MAX_NODES,\n)\n@nvmSection(\"protocol\")\nexport class NodeInfoFileV0 extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | NodeInfoFileV0Options,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.nodeInfo = parseNodeInfo(\n\t\t\t\tthis.fileId - NodeInfoFileV0IDBase + 1,\n\t\t\t\tthis.payload,\n\t\t\t\t0,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.nodeInfo = options.nodeInfo;\n\t\t}\n\t}\n\n\tpublic nodeInfo: NodeInfo;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tthis.fileId = nodeIdToNodeInfoFileIDV0(this.nodeInfo.nodeId);\n\t\tthis.payload = encodeNodeInfo(this.nodeInfo);\n\t\treturn super.serialize();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\tnodeInfo: this.nodeInfo,\n\t\t};\n\t}\n}\n\nexport interface NodeInfoFileV1Options extends NVMFileCreationOptions {\n\tnodeInfos: NodeInfo[];\n}\n\nexport const NodeInfoFileV1IDBase = 0x50200;\nexport function nodeIdToNodeInfoFileIDV1(nodeId: number): number {\n\treturn (\n\t\tNodeInfoFileV1IDBase + Math.floor((nodeId - 1) / NODEINFOS_PER_FILE_V1)\n\t);\n}\n\n@nvmFileID(\n\t(id) =>\n\t\tid >= NodeInfoFileV1IDBase\n\t\t&& id < NodeInfoFileV1IDBase + MAX_NODES / NODEINFOS_PER_FILE_V1,\n)\n@nvmSection(\"protocol\")\nexport class NodeInfoFileV1 extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | NodeInfoFileV1Options,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.nodeInfos = [];\n\t\t\tfor (let i = 0; i < NODEINFOS_PER_FILE_V1; i++) {\n\t\t\t\tconst nodeId = (this.fileId - NodeInfoFileV1IDBase)\n\t\t\t\t\t\t* NODEINFOS_PER_FILE_V1\n\t\t\t\t\t+ 1\n\t\t\t\t\t+ i;\n\t\t\t\tconst offset = i * NODEINFO_SIZE;\n\t\t\t\tconst entry = this.payload.subarray(\n\t\t\t\t\toffset,\n\t\t\t\t\toffset + NODEINFO_SIZE,\n\t\t\t\t);\n\t\t\t\tif (entry.equals(emptyNodeInfo)) continue;\n\n\t\t\t\tconst nodeInfo = parseNodeInfo(\n\t\t\t\t\tnodeId,\n\t\t\t\t\tentry,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tthis.nodeInfos.push(nodeInfo);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.nodeInfos = options.nodeInfos;\n\t\t}\n\t}\n\n\tpublic nodeInfos: NodeInfo[];\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\t// The infos must be sorted by node ID\n\t\tthis.nodeInfos.sort((a, b) => a.nodeId - b.nodeId);\n\t\tconst minNodeId = this.nodeInfos[0].nodeId;\n\t\tthis.fileId = nodeIdToNodeInfoFileIDV1(minNodeId);\n\n\t\tthis.payload = new Bytes(NODEINFO_SIZE * NODEINFOS_PER_FILE_V1).fill(\n\t\t\tEMPTY_NODEINFO_FILL,\n\t\t);\n\n\t\tconst minFileNodeId =\n\t\t\tMath.floor((minNodeId - 1) / NODEINFOS_PER_FILE_V1)\n\t\t\t\t* NODEINFOS_PER_FILE_V1\n\t\t\t+ 1;\n\n\t\tfor (const nodeInfo of this.nodeInfos) {\n\t\t\tconst offset = (nodeInfo.nodeId - minFileNodeId) * NODEINFO_SIZE;\n\t\t\tthis.payload.set(encodeNodeInfo(nodeInfo), offset);\n\t\t}\n\n\t\treturn super.serialize();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\t\"node infos\": this.nodeInfos,\n\t\t};\n\t}\n}\n\nexport interface LRNodeInfoFileV5Options extends NVMFileCreationOptions {\n\tnodeInfos: LRNodeInfo[];\n}\n\nexport const LRNodeInfoFileV5IDBase = 0x50800;\nexport function nodeIdToLRNodeInfoFileIDV5(nodeId: number): number {\n\treturn (\n\t\tLRNodeInfoFileV5IDBase\n\t\t+ Math.floor((nodeId - 256) / LR_NODEINFOS_PER_FILE_V5)\n\t);\n}\n\n// Counting starts with 5, because we only implemented this after reaching protocol file format 5\n@nvmFileID(\n\t(id) =>\n\t\tid >= LRNodeInfoFileV5IDBase\n\t\t&& id\n\t\t\t< LRNodeInfoFileV5IDBase + MAX_NODES_LR / LR_NODEINFOS_PER_FILE_V5,\n)\n@nvmSection(\"protocol\")\nexport class LRNodeInfoFileV5 extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | LRNodeInfoFileV5Options,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.nodeInfos = [];\n\t\t\tfor (let i = 0; i < LR_NODEINFOS_PER_FILE_V5; i++) {\n\t\t\t\tconst nodeId = (this.fileId - LRNodeInfoFileV5IDBase)\n\t\t\t\t\t\t* LR_NODEINFOS_PER_FILE_V5\n\t\t\t\t\t+ 256\n\t\t\t\t\t+ i;\n\t\t\t\tconst offset = i * LR_NODEINFO_SIZE;\n\t\t\t\tconst entry = this.payload.subarray(\n\t\t\t\t\toffset,\n\t\t\t\t\toffset + LR_NODEINFO_SIZE,\n\t\t\t\t);\n\t\t\t\tif (entry.equals(emptyNodeInfo)) continue;\n\n\t\t\t\tconst nodeInfo = parseLRNodeInfo(\n\t\t\t\t\tnodeId,\n\t\t\t\t\tentry,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tthis.nodeInfos.push(nodeInfo);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.nodeInfos = options.nodeInfos;\n\t\t}\n\t}\n\n\tpublic nodeInfos: LRNodeInfo[];\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\t// The infos must be sorted by node ID\n\t\tthis.nodeInfos.sort((a, b) => a.nodeId - b.nodeId);\n\t\tconst minNodeId = this.nodeInfos[0].nodeId;\n\t\tthis.fileId = nodeIdToLRNodeInfoFileIDV5(minNodeId);\n\n\t\tthis.payload = new Bytes(LR_NODEINFO_SIZE * LR_NODEINFOS_PER_FILE_V5)\n\t\t\t.fill(EMPTY_NODEINFO_FILL);\n\n\t\tconst minFileNodeId =\n\t\t\tMath.floor((minNodeId - 256) / LR_NODEINFOS_PER_FILE_V5)\n\t\t\t\t* LR_NODEINFOS_PER_FILE_V5\n\t\t\t+ 256;\n\n\t\tfor (const nodeInfo of this.nodeInfos) {\n\t\t\tconst offset = (nodeInfo.nodeId - minFileNodeId) * LR_NODEINFO_SIZE;\n\t\t\tthis.payload.set(encodeLRNodeInfo(nodeInfo), offset);\n\t\t}\n\n\t\treturn super.serialize();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\t\"node infos\": this.nodeInfos,\n\t\t};\n\t}\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }