node-liblzma 2.0.3 → 2.2.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 (46) hide show
  1. package/README.md +263 -67
  2. package/index.d.ts +60 -3
  3. package/lib/cli/nxz.d.ts +7 -0
  4. package/lib/cli/nxz.d.ts.map +1 -0
  5. package/lib/cli/nxz.js +486 -0
  6. package/lib/cli/nxz.js.map +1 -0
  7. package/lib/errors.d.ts.map +1 -1
  8. package/lib/errors.js +26 -15
  9. package/lib/errors.js.map +1 -1
  10. package/lib/lzma.d.ts +319 -2
  11. package/lib/lzma.d.ts.map +1 -1
  12. package/lib/lzma.js +303 -39
  13. package/lib/lzma.js.map +1 -1
  14. package/lib/pool.d.ts.map +1 -1
  15. package/lib/pool.js +9 -3
  16. package/lib/pool.js.map +1 -1
  17. package/lib/types.d.ts +68 -1
  18. package/lib/types.d.ts.map +1 -1
  19. package/package.json +32 -12
  20. package/scripts/build_xz_with_cmake.py +23 -26
  21. package/src/bindings/module.cpp +196 -0
  22. package/src/bindings/node-liblzma.cpp +40 -4
  23. package/src/bindings/node-liblzma.hpp +2 -1
  24. package/xz-version.json +3 -3
  25. package/.gitattributes +0 -3
  26. package/.release-it.json +0 -7
  27. package/.release-it.manual.json +0 -7
  28. package/.release-it.retry.json +0 -3
  29. package/CHANGELOG.md +0 -271
  30. package/History.md +0 -79
  31. package/RELEASING.md +0 -131
  32. package/biome.json +0 -81
  33. package/pnpm-workspace.yaml +0 -3
  34. package/prebuilds/darwin-x64/node-liblzma.node +0 -0
  35. package/prebuilds/linux-x64/node-liblzma.node +0 -0
  36. package/prebuilds/win32-x64/node-liblzma.node +0 -0
  37. package/scripts/analyze-coverage.js +0 -132
  38. package/scripts/compare-coverage-tools.js +0 -93
  39. package/src/errors.ts +0 -167
  40. package/src/lzma.ts +0 -839
  41. package/src/pool.ts +0 -228
  42. package/src/types.ts +0 -30
  43. package/tsconfig.json +0 -50
  44. package/vitest.config.istanbul.ts +0 -29
  45. package/vitest.config.monocart.ts +0 -44
  46. package/vitest.config.ts +0 -52
package/lib/pool.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
package/lib/types.d.ts CHANGED
@@ -17,11 +17,78 @@ export interface LZMAOptions {
17
17
  /** Flush flag to use */
18
18
  flushFlag?: number;
19
19
  }
20
+ /**
21
+ * Callback function for asynchronous compression/decompression operations.
22
+ * @param error - Error object if operation failed, null otherwise
23
+ * @param result - Compressed or decompressed data buffer
24
+ */
20
25
  export type CompressionCallback = (error: Error | null, result?: Buffer) => void;
26
+ /**
27
+ * LZMA action type for stream operations.
28
+ * - `0` (RUN): Normal processing
29
+ * - `1` (SYNC_FLUSH): Flush pending output
30
+ * - `2` (FULL_FLUSH): Flush and reset encoder state
31
+ * - `3` (FINISH): Finish the stream
32
+ */
21
33
  export type LZMAActionType = 0 | 1 | 2 | 3;
34
+ /**
35
+ * LZMA status codes returned by operations.
36
+ * - `0` (OK): Operation completed successfully
37
+ * - `1` (STREAM_END): End of stream reached
38
+ * - `2` (NO_CHECK): Input has no integrity check
39
+ * - `3` (UNSUPPORTED_CHECK): Cannot calculate integrity check
40
+ * - `4` (GET_CHECK): Integrity check available
41
+ * - `5` (MEM_ERROR): Memory allocation failed
42
+ * - `6` (MEMLIMIT_ERROR): Memory limit reached
43
+ * - `7` (FORMAT_ERROR): File format not recognized
44
+ * - `8` (OPTIONS_ERROR): Invalid options
45
+ * - `9` (DATA_ERROR): Data is corrupt
46
+ * - `10` (BUF_ERROR): No progress possible
47
+ * - `11` (PROG_ERROR): Programming error
48
+ */
22
49
  export type LZMAStatusType = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;
50
+ /**
51
+ * Integrity check type for XZ streams.
52
+ * - `0` (NONE): No integrity check
53
+ * - `1` (CRC32): 32-bit CRC
54
+ * - `4` (CRC64): 64-bit CRC (recommended)
55
+ * - `10` (SHA256): SHA-256 hash
56
+ */
23
57
  export type CheckType = 0 | 1 | 4 | 10;
24
- export type PresetType = 6 | 9;
58
+ /**
59
+ * Compression preset level (0-9), optionally combined with EXTREME flag.
60
+ * Higher values = better compression but slower.
61
+ * @example
62
+ * ```ts
63
+ * const preset = 6; // Default compression
64
+ * const extreme = 6 | 0x80000000; // Default with extreme flag
65
+ * ```
66
+ */
67
+ export type PresetType = number;
68
+ /**
69
+ * Filter type for LZMA2 compression chain.
70
+ * - `0x21` (LZMA2): Main compression filter
71
+ * - `0x03` (X86): BCJ filter for x86 executables
72
+ * - `0x04` (POWERPC): BCJ filter for PowerPC
73
+ * - `0x06` (IA64): BCJ filter for IA-64
74
+ * - `0x07` (ARM): BCJ filter for ARM
75
+ * - `0x08` (ARMTHUMB): BCJ filter for ARM-Thumb
76
+ * - `0x09` (SPARC): BCJ filter for SPARC
77
+ */
25
78
  export type FilterType = 0x21 | 0x03 | 0x04 | 0x06 | 0x07 | 0x08 | 0x09;
79
+ /**
80
+ * Compression mode.
81
+ * - `1` (FAST): Faster compression, less memory
82
+ * - `2` (NORMAL): Better compression ratio
83
+ */
26
84
  export type ModeType = 1 | 2;
85
+ /**
86
+ * Progress event data emitted during compression/decompression
87
+ */
88
+ export interface ProgressInfo {
89
+ /** Total bytes read from input so far */
90
+ bytesRead: number;
91
+ /** Total bytes written to output so far */
92
+ bytesWritten: number;
93
+ }
27
94
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,uBAAuB;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAGjF,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3C,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AAC7E,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AACvC,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/B,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACxE,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,uBAAuB;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE3C;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AAE7E;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AAEvC;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC;;;;;;;;;GASG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAExE;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;CACtB"}
package/package.json CHANGED
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "name": "node-liblzma",
3
- "version": "2.0.3",
3
+ "version": "2.2.0",
4
4
  "description": "NodeJS wrapper for liblzma",
5
5
  "type": "module",
6
6
  "main": "./lib/lzma.js",
7
+ "bin": {
8
+ "nxz": "./lib/cli/nxz.js"
9
+ },
7
10
  "exports": {
8
11
  ".": {
9
12
  "import": "./lib/lzma.js",
10
- "types": "./index.d.ts"
13
+ "types": "./index.d.ts",
14
+ "default": "./lib/lzma.js"
11
15
  }
12
16
  },
13
17
  "scripts": {
@@ -21,6 +25,7 @@
21
25
  "test:watch": "vitest",
22
26
  "test:coverage": "vitest run --config vitest.config.monocart.ts --coverage",
23
27
  "test:coverage-v8": "vitest run --coverage",
28
+ "test:ui": "vitest --ui",
24
29
  "type-check": "tsc --noEmit",
25
30
  "clean": "rm -rf lib",
26
31
  "lint": "biome lint",
@@ -32,28 +37,43 @@
32
37
  "release": "release-it-preset default",
33
38
  "release:manual": "release-it-preset --config .release-it.manual.json",
34
39
  "release:hotfix": "release-it-preset hotfix",
35
- "changelog:update": "release-it-preset changelog-only"
40
+ "changelog:update": "release-it-preset changelog-only",
41
+ "typedoc": "typedoc",
42
+ "typedoc:watch": "typedoc --watch"
36
43
  },
37
44
  "dependencies": {
38
45
  "node-addon-api": "^8.5.0",
39
46
  "node-gyp-build": "^4.8.4"
40
47
  },
41
48
  "devDependencies": {
42
- "@biomejs/biome": "^2.2.3",
49
+ "@biomejs/biome": "^2.3.12",
43
50
  "@oorabona/release-it-preset": "^0.9.0",
44
51
  "@oorabona/vitest-monocart-coverage": "^2.0.1",
45
- "@types/node": "^24.3.1",
46
- "@vitest/coverage-istanbul": "^3.2.4",
47
- "@vitest/coverage-v8": "^3.2.4",
48
- "@vitest/ui": "3.2.4",
49
- "nano-staged": "^0.8.0",
50
- "release-it": "^19.0.5",
52
+ "@types/node": "^25.0.10",
53
+ "@vitest/coverage-istanbul": "^4.0.18",
54
+ "@vitest/coverage-v8": "^4.0.18",
55
+ "@vitest/ui": "4.0.18",
56
+ "nano-staged": "^0.9.0",
57
+ "release-it": "^19.2.4",
51
58
  "simple-git-hooks": "^2.13.1",
52
59
  "tsd": "^0.33.0",
53
- "typescript": "^5.9.2",
54
- "vitest": "^3.2.4"
60
+ "typedoc": "^0.28.16",
61
+ "typedoc-material-theme": "^1.4.1",
62
+ "typescript": "^5.9.3",
63
+ "vitest": "^4.0.18"
55
64
  },
56
65
  "types": "index.d.ts",
66
+ "files": [
67
+ "lib/",
68
+ "src/bindings/",
69
+ "scripts/build_xz_with_cmake.py",
70
+ "scripts/download_xz_from_github.py",
71
+ "scripts/copy_dll.py",
72
+ "scripts/walk_sources.py",
73
+ "binding.gyp",
74
+ "index.d.ts",
75
+ "xz-version.json"
76
+ ],
57
77
  "engines": {
58
78
  "node": ">=16.0.0"
59
79
  },
@@ -282,16 +282,20 @@ def main():
282
282
  parser = argparse.ArgumentParser(
283
283
  description='Build XZ Utils using CMake',
284
284
  epilog='''
285
- Required environment variables (strict validation):
286
- RUNTIME_LINK: 'static' or 'shared' (REQUIRED)
287
- ENABLE_THREAD_SUPPORT: 'yes' or 'no' (REQUIRED)
288
- USE_GLOBAL: 'true' or 'false' (REQUIRED)
285
+ Optional environment variables (with sensible defaults matching binding.gyp):
286
+ RUNTIME_LINK: 'static' or 'shared'
287
+ Default: 'static' on Windows, 'shared' on Linux/macOS
288
+ ENABLE_THREAD_SUPPORT: 'yes' or 'no'
289
+ Default: 'yes'
290
+ USE_GLOBAL: 'true' or 'false'
291
+ Default: 'false' on Windows, 'true' on Linux/macOS
289
292
 
290
293
  Examples:
291
- RUNTIME_LINK=static ENABLE_THREAD_SUPPORT=yes USE_GLOBAL=false \\
292
- python3 build_xz_with_cmake.py deps/xz build/liblzma
293
-
294
- RUNTIME_LINK=shared ENABLE_THREAD_SUPPORT=no USE_GLOBAL=true \\
294
+ # Use defaults (recommended)
295
+ python3 build_xz_with_cmake.py deps/xz build/liblzma
296
+
297
+ # Override specific values
298
+ RUNTIME_LINK=static USE_GLOBAL=false \\
295
299
  python3 build_xz_with_cmake.py deps/xz build/liblzma
296
300
  ''',
297
301
  formatter_class=argparse.RawDescriptionHelpFormatter
@@ -304,24 +308,17 @@ Examples:
304
308
 
305
309
  args = parser.parse_args()
306
310
 
307
- # Get configuration from environment variables with strict validation
308
- runtime_link = os.environ.get('RUNTIME_LINK')
309
- enable_threads = os.environ.get('ENABLE_THREAD_SUPPORT')
310
- use_global = os.environ.get('USE_GLOBAL')
311
-
312
- # Strict validation - fail if critical variables are not explicitly set
313
- if runtime_link is None:
314
- print("[ERROR] RUNTIME_LINK environment variable must be explicitly set ('static' or 'shared')")
315
- return 1
316
-
317
- if enable_threads is None:
318
- print("[ERROR] ENABLE_THREAD_SUPPORT environment variable must be explicitly set ('yes' or 'no')")
319
- return 1
320
-
321
- if use_global is None:
322
- print("[ERROR] USE_GLOBAL environment variable must be explicitly set ('true' or 'false')")
323
- return 1
324
-
311
+ # Get configuration from environment variables with sensible defaults
312
+ # Defaults match binding.gyp for consistency
313
+ is_windows = sys.platform == 'win32'
314
+
315
+ # Default: 'shared' on Linux/macOS, 'static' on Windows
316
+ runtime_link = os.environ.get('RUNTIME_LINK') or ('static' if is_windows else 'shared')
317
+ # Default: 'yes' (threading enabled)
318
+ enable_threads = os.environ.get('ENABLE_THREAD_SUPPORT') or 'yes'
319
+ # Default: 'false' on Windows, 'true' on Linux/macOS (use system library)
320
+ use_global = os.environ.get('USE_GLOBAL') or ('false' if is_windows else 'true')
321
+
325
322
  # Validate values
326
323
  if runtime_link not in ['static', 'shared']:
327
324
  print(f"[ERROR] Invalid RUNTIME_LINK: {runtime_link}. Must be 'static' or 'shared'")
@@ -17,6 +17,193 @@
17
17
  **/
18
18
 
19
19
  #include "node-liblzma.hpp"
20
+ #include <cstring>
21
+
22
+ // XZ magic bytes: 0xFD + "7zXZ" + 0x00
23
+ static const uint8_t XZ_MAGIC[6] = {0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00};
24
+
25
+ /**
26
+ * Check if a buffer starts with the XZ magic bytes.
27
+ * @param info[0] Buffer to check
28
+ * @returns true if the buffer is an XZ stream, false otherwise
29
+ */
30
+ Napi::Value IsXZ(const Napi::CallbackInfo &info)
31
+ {
32
+ Napi::Env env = info.Env();
33
+
34
+ if (info.Length() < 1 || !info[0].IsBuffer())
35
+ {
36
+ Napi::TypeError::New(env, "Expected a Buffer argument").ThrowAsJavaScriptException();
37
+ return env.Null();
38
+ }
39
+
40
+ Napi::Buffer<uint8_t> buf = info[0].As<Napi::Buffer<uint8_t>>();
41
+
42
+ // Need at least 6 bytes for XZ magic
43
+ if (buf.Length() < 6)
44
+ {
45
+ return Napi::Boolean::New(env, false);
46
+ }
47
+
48
+ bool isXz = std::memcmp(buf.Data(), XZ_MAGIC, 6) == 0;
49
+ return Napi::Boolean::New(env, isXz);
50
+ }
51
+
52
+ /**
53
+ * Get liblzma version string (runtime).
54
+ * @returns Version string like "5.4.1"
55
+ */
56
+ Napi::Value VersionString(const Napi::CallbackInfo &info)
57
+ {
58
+ Napi::Env env = info.Env();
59
+ return Napi::String::New(env, lzma_version_string());
60
+ }
61
+
62
+ /**
63
+ * Get liblzma version number (runtime).
64
+ * @returns Version as integer (e.g., 50040010 for 5.4.1)
65
+ */
66
+ Napi::Value VersionNumber(const Napi::CallbackInfo &info)
67
+ {
68
+ Napi::Env env = info.Env();
69
+ return Napi::Number::New(env, static_cast<double>(lzma_version_number()));
70
+ }
71
+
72
+ /**
73
+ * Get memory usage for easy encoder with given preset.
74
+ * @param info[0] Preset level (0-9, optionally OR'd with LZMA_PRESET_EXTREME)
75
+ * @returns Memory usage in bytes, or 0 if preset is invalid
76
+ */
77
+ Napi::Value EasyEncoderMemusage(const Napi::CallbackInfo &info)
78
+ {
79
+ Napi::Env env = info.Env();
80
+
81
+ if (info.Length() < 1 || !info[0].IsNumber())
82
+ {
83
+ Napi::TypeError::New(env, "Expected a preset number argument").ThrowAsJavaScriptException();
84
+ return env.Null();
85
+ }
86
+
87
+ uint32_t preset = info[0].As<Napi::Number>().Uint32Value();
88
+ uint64_t memusage = lzma_easy_encoder_memusage(preset);
89
+
90
+ return Napi::Number::New(env, static_cast<double>(memusage));
91
+ }
92
+
93
+ /**
94
+ * Get memory usage for easy decoder.
95
+ * @returns Memory usage in bytes
96
+ */
97
+ Napi::Value EasyDecoderMemusage(const Napi::CallbackInfo &info)
98
+ {
99
+ Napi::Env env = info.Env();
100
+
101
+ // lzma_easy_decoder_memusage takes a preset for memlimit estimation
102
+ // but the actual decoder doesn't need a preset. Use default preset.
103
+ uint64_t memusage = lzma_easy_decoder_memusage(LZMA_PRESET_DEFAULT);
104
+
105
+ return Napi::Number::New(env, static_cast<double>(memusage));
106
+ }
107
+
108
+ /**
109
+ * Parse the Stream Footer and Index from an XZ file to get metadata.
110
+ * @param info[0] Buffer containing the XZ file (must be complete)
111
+ * @returns Object with uncompressed_size, compressed_size, stream_count, block_count, check
112
+ */
113
+ Napi::Value ParseFileIndex(const Napi::CallbackInfo &info)
114
+ {
115
+ Napi::Env env = info.Env();
116
+
117
+ if (info.Length() < 1 || !info[0].IsBuffer())
118
+ {
119
+ Napi::TypeError::New(env, "Expected a Buffer argument").ThrowAsJavaScriptException();
120
+ return env.Null();
121
+ }
122
+
123
+ Napi::Buffer<uint8_t> buf = info[0].As<Napi::Buffer<uint8_t>>();
124
+ const uint8_t *data = buf.Data();
125
+ size_t size = buf.Length();
126
+
127
+ // Minimum XZ file: header (12) + block (varies) + index (varies) + footer (12)
128
+ // Stream header is 12 bytes, footer is 12 bytes
129
+ if (size < LZMA_STREAM_HEADER_SIZE * 2)
130
+ {
131
+ Napi::Error::New(env, "Buffer too small for XZ stream").ThrowAsJavaScriptException();
132
+ return env.Null();
133
+ }
134
+
135
+ // Verify XZ magic
136
+ if (std::memcmp(data, XZ_MAGIC, 6) != 0)
137
+ {
138
+ Napi::Error::New(env, "Not an XZ stream (invalid magic)").ThrowAsJavaScriptException();
139
+ return env.Null();
140
+ }
141
+
142
+ // Parse stream header
143
+ lzma_stream_flags header_flags;
144
+ lzma_ret ret = lzma_stream_header_decode(&header_flags, data);
145
+ if (ret != LZMA_OK)
146
+ {
147
+ Napi::Error::New(env, "Failed to decode stream header").ThrowAsJavaScriptException();
148
+ return env.Null();
149
+ }
150
+
151
+ // Parse stream footer (last 12 bytes)
152
+ lzma_stream_flags footer_flags;
153
+ ret = lzma_stream_footer_decode(&footer_flags, data + size - LZMA_STREAM_HEADER_SIZE);
154
+ if (ret != LZMA_OK)
155
+ {
156
+ Napi::Error::New(env, "Failed to decode stream footer").ThrowAsJavaScriptException();
157
+ return env.Null();
158
+ }
159
+
160
+ // Verify header and footer match
161
+ ret = lzma_stream_flags_compare(&header_flags, &footer_flags);
162
+ if (ret != LZMA_OK)
163
+ {
164
+ Napi::Error::New(env, "Stream header and footer do not match").ThrowAsJavaScriptException();
165
+ return env.Null();
166
+ }
167
+
168
+ // Calculate index position: footer starts at (size - 12), index is backward_size bytes before that
169
+ size_t footer_pos = size - LZMA_STREAM_HEADER_SIZE;
170
+ size_t index_size = footer_flags.backward_size;
171
+
172
+ if (index_size > footer_pos - LZMA_STREAM_HEADER_SIZE)
173
+ {
174
+ Napi::Error::New(env, "Invalid index size in footer").ThrowAsJavaScriptException();
175
+ return env.Null();
176
+ }
177
+
178
+ size_t index_pos = footer_pos - index_size;
179
+
180
+ // Decode the index
181
+ lzma_index *index = nullptr;
182
+ uint64_t memlimit = UINT64_MAX;
183
+ size_t in_pos = 0;
184
+
185
+ ret = lzma_index_buffer_decode(&index, &memlimit, nullptr,
186
+ data + index_pos, &in_pos, index_size);
187
+ if (ret != LZMA_OK || index == nullptr)
188
+ {
189
+ Napi::Error::New(env, "Failed to decode index").ThrowAsJavaScriptException();
190
+ return env.Null();
191
+ }
192
+
193
+ // Extract metadata from index
194
+ Napi::Object result = Napi::Object::New(env);
195
+ result.Set("uncompressedSize", Napi::Number::New(env, static_cast<double>(lzma_index_uncompressed_size(index))));
196
+ result.Set("compressedSize", Napi::Number::New(env, static_cast<double>(lzma_index_total_size(index))));
197
+ result.Set("streamCount", Napi::Number::New(env, static_cast<double>(lzma_index_stream_count(index))));
198
+ result.Set("blockCount", Napi::Number::New(env, static_cast<double>(lzma_index_block_count(index))));
199
+ result.Set("check", Napi::Number::New(env, static_cast<double>(footer_flags.check)));
200
+ result.Set("memoryUsage", Napi::Number::New(env, static_cast<double>(lzma_index_memused(index))));
201
+
202
+ // Clean up
203
+ lzma_index_end(index, nullptr);
204
+
205
+ return result;
206
+ }
20
207
 
21
208
  Napi::Object Init(Napi::Env env, Napi::Object exports)
22
209
  {
@@ -101,6 +288,15 @@ Napi::Object Init(Napi::Env env, Napi::Object exports)
101
288
 
102
289
  // Tell companion script if we are thread-able or not
103
290
  exports.Set(Napi::String::New(env, "HAS_THREADS_SUPPORT"), Napi::Boolean::New(env, HAS_THREADS_SUPPORT));
291
+
292
+ // Utility functions
293
+ exports.Set(Napi::String::New(env, "isXZ"), Napi::Function::New(env, IsXZ));
294
+ exports.Set(Napi::String::New(env, "versionString"), Napi::Function::New(env, VersionString));
295
+ exports.Set(Napi::String::New(env, "versionNumber"), Napi::Function::New(env, VersionNumber));
296
+ exports.Set(Napi::String::New(env, "easyEncoderMemusage"), Napi::Function::New(env, EasyEncoderMemusage));
297
+ exports.Set(Napi::String::New(env, "easyDecoderMemusage"), Napi::Function::New(env, EasyDecoderMemusage));
298
+ exports.Set(Napi::String::New(env, "parseFileIndex"), Napi::Function::New(env, ParseFileIndex));
299
+
104
300
  return exports;
105
301
  }
106
302
 
@@ -29,6 +29,12 @@ Napi::Value LZMA::Close(const Napi::CallbackInfo &info)
29
29
 
30
30
  Napi::Value LZMA::Close(const Napi::Env &env)
31
31
  {
32
+ // F-006: Idempotency guard - prevent double-subtract of external memory
33
+ if (_closed)
34
+ {
35
+ return env.Undefined();
36
+ }
37
+ _closed = true;
32
38
  Napi::MemoryManagement::AdjustExternalMemory(env, -int64_t(sizeof(LZMA)));
33
39
 
34
40
  if (_wip)
@@ -63,7 +69,7 @@ void LZMA::Init(Napi::Env env, Napi::Object exports)
63
69
  }
64
70
 
65
71
  LZMA::LZMA(const Napi::CallbackInfo &info) : Napi::ObjectWrap<LZMA>(info), _stream(LZMA_STREAM_INIT),
66
- _wip(false), _pending_close(false), _worker(nullptr)
72
+ _wip(false), _pending_close(false), _closed(false), _worker(nullptr)
67
73
  {
68
74
  Napi::Env env = info.Env();
69
75
 
@@ -103,7 +109,7 @@ LZMA::LZMA(const Napi::CallbackInfo &info) : Napi::ObjectWrap<LZMA>(info), _stre
103
109
  switch (mode)
104
110
  {
105
111
  case STREAM_DECODE:
106
- success = InitializeDecoder();
112
+ success = InitializeDecoder(env);
107
113
  break;
108
114
  case STREAM_ENCODE:
109
115
  success = InitializeEncoder(opts, preset, check);
@@ -163,6 +169,13 @@ LZMA::~LZMA()
163
169
  template <bool async>
164
170
  Napi::Value LZMA::Code(const Napi::CallbackInfo &info)
165
171
  {
172
+ // F-001: Guard against concurrent calls - liblzma is not thread-safe per stream
173
+ if (this->_wip)
174
+ {
175
+ Napi::Error::New(info.Env(), "Stream is busy - concurrent operations not allowed").ThrowAsJavaScriptException();
176
+ return info.Env().Undefined();
177
+ }
178
+
166
179
  // Setup with manual guard (safer than RAII for JS exceptions)
167
180
  this->_wip = true;
168
181
  this->Ref();
@@ -285,6 +298,14 @@ bool LZMA::ValidateAndPrepareBuffers(const Napi::CallbackInfo &info, BufferConte
285
298
  }
286
299
 
287
300
  ctx.out_off = info[5].ToNumber().Uint32Value();
301
+
302
+ // F-002: Validate output offset bounds to prevent underflow in out_len calculation
303
+ if (ctx.out_off > out_max)
304
+ {
305
+ Napi::RangeError::New(env, "Output offset exceeds buffer length").ThrowAsJavaScriptException();
306
+ return false;
307
+ }
308
+
288
309
  ctx.out_len = out_max - ctx.out_off;
289
310
  ctx.out = out_buf + ctx.out_off;
290
311
 
@@ -461,10 +482,18 @@ bool LZMA::InitializeEncoder(const Napi::Object &opts, uint32_t preset, lzma_che
461
482
  return true;
462
483
  }
463
484
 
464
- bool LZMA::InitializeDecoder()
485
+ bool LZMA::InitializeDecoder(const Napi::Env &env)
465
486
  {
466
487
  lzma_ret ret = lzma_stream_decoder(&this->_stream, UINT64_MAX, LZMA_CONCATENATED);
467
- return ret == LZMA_OK;
488
+
489
+ // F-005: Throw exception on decoder init failure (consistent with InitializeEncoder)
490
+ if (ret != LZMA_OK)
491
+ {
492
+ Napi::Error::New(env, "LZMA decoder failure, returned " + std::to_string(ret)).ThrowAsJavaScriptException();
493
+ return false;
494
+ }
495
+
496
+ return true;
468
497
  }
469
498
 
470
499
  void LZMA::AfterCommon(const Napi::Env &env)
@@ -515,8 +544,15 @@ void LZMA::After(const Napi::Env &env, const Napi::Function &cb)
515
544
  Napi::Number avail_in = Napi::Number::New(env, this->_stream.avail_in);
516
545
  Napi::Number avail_out = Napi::Number::New(env, this->_stream.avail_out);
517
546
 
547
+ // F-001: Clear _wip BEFORE callback so callback can call code() again for iterative processing
548
+ // Note: Buffer refs are released after callback in case callback needs to access them
549
+ this->_wip = false;
550
+
518
551
  // Call the provided JS callback with the three numeric results
552
+ // The callback may call code() again for iterative processing (this is the normal pattern)
519
553
  cb.Call({ret, avail_in, avail_out});
520
554
 
555
+ // F-004: Ensure cleanup runs even if callback threw an exception
556
+ // With NAPI_DISABLE_CPP_EXCEPTIONS, exceptions are pending rather than thrown
521
557
  AfterCommon(env);
522
558
  }
@@ -81,7 +81,7 @@ private:
81
81
  bool ValidateConstructorArgs(const Napi::CallbackInfo &info, uint32_t &mode, Napi::Object &opts);
82
82
  bool InitializeFilters(const Napi::Object &opts, uint32_t preset);
83
83
  bool InitializeEncoder(const Napi::Object &opts, uint32_t preset, lzma_check check);
84
- bool InitializeDecoder();
84
+ bool InitializeDecoder(const Napi::Env &env);
85
85
 
86
86
  // Common cleanup operations for both sync and async completion
87
87
  void AfterCommon(const Napi::Env &env);
@@ -95,6 +95,7 @@ private:
95
95
  lzma_stream _stream;
96
96
  bool _wip;
97
97
  bool _pending_close;
98
+ bool _closed; // F-006: Prevent double-subtract in AdjustExternalMemory
98
99
 
99
100
  LZMAWorker *_worker;
100
101
 
package/xz-version.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "v5.8.1",
3
- "comment": "Latest version with full XZ_THREADS support and modern CMake. XZ 5.8+ includes the complete threading API with XZ_THREADS variable.",
4
- "last_checked": "2025-09-02",
2
+ "version": "v5.8.2",
3
+ "comment": "Stable version tested and validated for production. Auto-updated by GitHub Actions.",
4
+ "last_checked": "2026-01-25",
5
5
  "allow_override": true,
6
6
  "repository": "tukaani-project/xz",
7
7
  "changelog": "https://github.com/tukaani-project/xz/releases/tag/v5.8.1"
package/.gitattributes DELETED
@@ -1,3 +0,0 @@
1
- * text=auto eol=lf
2
- *.{cmd,[cC][mM][dD]} text eol=crlf
3
- *.{bat,[bB][aA][tT]} text eol=crlf
package/.release-it.json DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "@oorabona/release-it-preset/config/default",
3
- "git": {
4
- "requireBranch": "master",
5
- "requireCleanWorkingDir": true
6
- }
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "@oorabona/release-it-preset/config/manual-changelog",
3
- "git": {
4
- "requireBranch": "master",
5
- "requireCleanWorkingDir": true
6
- }
7
- }
@@ -1,3 +0,0 @@
1
- {
2
- "extends": "@oorabona/release-it-preset/config/retry-publish"
3
- }