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.
- package/README.md +263 -67
- package/index.d.ts +60 -3
- package/lib/cli/nxz.d.ts +7 -0
- package/lib/cli/nxz.d.ts.map +1 -0
- package/lib/cli/nxz.js +486 -0
- package/lib/cli/nxz.js.map +1 -0
- package/lib/errors.d.ts.map +1 -1
- package/lib/errors.js +26 -15
- package/lib/errors.js.map +1 -1
- package/lib/lzma.d.ts +319 -2
- package/lib/lzma.d.ts.map +1 -1
- package/lib/lzma.js +303 -39
- package/lib/lzma.js.map +1 -1
- package/lib/pool.d.ts.map +1 -1
- package/lib/pool.js +9 -3
- package/lib/pool.js.map +1 -1
- package/lib/types.d.ts +68 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +32 -12
- package/scripts/build_xz_with_cmake.py +23 -26
- package/src/bindings/module.cpp +196 -0
- package/src/bindings/node-liblzma.cpp +40 -4
- package/src/bindings/node-liblzma.hpp +2 -1
- package/xz-version.json +3 -3
- package/.gitattributes +0 -3
- package/.release-it.json +0 -7
- package/.release-it.manual.json +0 -7
- package/.release-it.retry.json +0 -3
- package/CHANGELOG.md +0 -271
- package/History.md +0 -79
- package/RELEASING.md +0 -131
- package/biome.json +0 -81
- package/pnpm-workspace.yaml +0 -3
- package/prebuilds/darwin-x64/node-liblzma.node +0 -0
- package/prebuilds/linux-x64/node-liblzma.node +0 -0
- package/prebuilds/win32-x64/node-liblzma.node +0 -0
- package/scripts/analyze-coverage.js +0 -132
- package/scripts/compare-coverage-tools.js +0 -93
- package/src/errors.ts +0 -167
- package/src/lzma.ts +0 -839
- package/src/pool.ts +0 -228
- package/src/types.ts +0 -30
- package/tsconfig.json +0 -50
- package/vitest.config.istanbul.ts +0 -29
- package/vitest.config.monocart.ts +0 -44
- 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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAoB,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBjE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,QAAS,SAAQ,YAAY;IAUxC;;;OAGG;IACH,YAAoB,gBAAgB,EAAE;QACpC,KAAK,EAAE,CAAC;QADU,kBAAa,GAAb,aAAa,CAAK;QAb9B,UAAK,GAAiB,EAAE,CAAC;QAEzB,YAAO,GAAgB;YAC7B,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,CAAC;SACV,CAAC;QASA,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,UAAU,CAAC,kCAAkC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAAkB;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,IAAkB;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,OAAO,CAAC,EAAyB;QAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,sDAAsD;QACtD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzE,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAExC,
|
|
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
|
-
|
|
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
|
package/lib/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
+
"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.
|
|
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": "^
|
|
46
|
-
"@vitest/coverage-istanbul": "^
|
|
47
|
-
"@vitest/coverage-v8": "^
|
|
48
|
-
"@vitest/ui": "
|
|
49
|
-
"nano-staged": "^0.
|
|
50
|
-
"release-it": "^19.
|
|
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
|
-
"
|
|
54
|
-
"
|
|
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
|
-
|
|
286
|
-
RUNTIME_LINK: 'static' or 'shared'
|
|
287
|
-
|
|
288
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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'")
|
package/src/bindings/module.cpp
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
3
|
-
"comment": "
|
|
4
|
-
"last_checked": "
|
|
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
package/.release-it.json
DELETED
package/.release-it.manual.json
DELETED
package/.release-it.retry.json
DELETED