@saltcorn/admin-models 1.6.3-beta.1 → 1.7.0-alpha.1

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 (99) hide show
  1. package/cjs/index.cjs +18 -0
  2. package/cjs/models/backup-retention.cjs +18 -0
  3. package/cjs/models/backup.cjs +18 -0
  4. package/cjs/models/config-check.cjs +18 -0
  5. package/cjs/models/file-globs.cjs +18 -0
  6. package/cjs/models/pack.cjs +18 -0
  7. package/cjs/models/snapshot.cjs +18 -0
  8. package/cjs/models/tenant.cjs +18 -0
  9. package/cjs/models/zip-extract.cjs +18 -0
  10. package/cjs/models/zip-format.cjs +18 -0
  11. package/cjs/models/zip-worker.cjs +18 -0
  12. package/cjs/models/zip-writer.cjs +18 -0
  13. package/cjs/models/zip.cjs +18 -0
  14. package/dist/index.d.ts +6 -5
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +12 -18
  17. package/dist/index.js.map +1 -1
  18. package/dist/models/backup-retention.d.ts +57 -0
  19. package/dist/models/backup-retention.d.ts.map +1 -0
  20. package/dist/models/backup-retention.js +108 -0
  21. package/dist/models/backup-retention.js.map +1 -0
  22. package/dist/models/backup.d.ts +7 -3
  23. package/dist/models/backup.d.ts.map +1 -1
  24. package/dist/models/backup.js +479 -409
  25. package/dist/models/backup.js.map +1 -1
  26. package/dist/models/config-check.d.ts +2 -1
  27. package/dist/models/config-check.d.ts.map +1 -1
  28. package/dist/models/config-check.js +16 -23
  29. package/dist/models/config-check.js.map +1 -1
  30. package/dist/models/file-globs.d.ts +34 -0
  31. package/dist/models/file-globs.d.ts.map +1 -0
  32. package/dist/models/file-globs.js +47 -0
  33. package/dist/models/file-globs.js.map +1 -0
  34. package/dist/models/pack.d.ts +3 -2
  35. package/dist/models/pack.d.ts.map +1 -1
  36. package/dist/models/pack.js +147 -151
  37. package/dist/models/pack.js.map +1 -1
  38. package/dist/models/snapshot.d.ts +1 -1
  39. package/dist/models/snapshot.d.ts.map +1 -1
  40. package/dist/models/snapshot.js +26 -29
  41. package/dist/models/snapshot.js.map +1 -1
  42. package/dist/models/tenant.d.ts +1 -1
  43. package/dist/models/tenant.d.ts.map +1 -1
  44. package/dist/models/tenant.js +45 -48
  45. package/dist/models/tenant.js.map +1 -1
  46. package/dist/models/zip-extract.d.ts +14 -0
  47. package/dist/models/zip-extract.d.ts.map +1 -0
  48. package/dist/models/zip-extract.js +110 -0
  49. package/dist/models/zip-extract.js.map +1 -0
  50. package/dist/models/zip-format.d.ts +57 -0
  51. package/dist/models/zip-format.d.ts.map +1 -0
  52. package/dist/models/zip-format.js +106 -0
  53. package/dist/models/zip-format.js.map +1 -0
  54. package/dist/models/zip-worker.d.ts +2 -0
  55. package/dist/models/zip-worker.d.ts.map +1 -0
  56. package/dist/models/zip-worker.js +177 -0
  57. package/dist/models/zip-worker.js.map +1 -0
  58. package/dist/models/zip-writer.d.ts +75 -0
  59. package/dist/models/zip-writer.d.ts.map +1 -0
  60. package/dist/models/zip-writer.js +321 -0
  61. package/dist/models/zip-writer.js.map +1 -0
  62. package/dist/models/zip.d.ts +101 -0
  63. package/dist/models/zip.d.ts.map +1 -0
  64. package/dist/models/zip.js +211 -0
  65. package/dist/models/zip.js.map +1 -0
  66. package/dist/tests/backup-retention.test.d.ts +2 -0
  67. package/dist/tests/backup-retention.test.d.ts.map +1 -0
  68. package/dist/tests/backup-retention.test.js +134 -0
  69. package/dist/tests/backup-retention.test.js.map +1 -0
  70. package/dist/tests/backup.test.d.ts +2 -0
  71. package/dist/tests/backup.test.d.ts.map +1 -0
  72. package/dist/tests/backup.test.js +385 -0
  73. package/dist/tests/backup.test.js.map +1 -0
  74. package/dist/tests/cfgcheck.test.d.ts +2 -0
  75. package/dist/tests/cfgcheck.test.d.ts.map +1 -0
  76. package/dist/tests/cfgcheck.test.js +32 -0
  77. package/dist/tests/cfgcheck.test.js.map +1 -0
  78. package/dist/tests/file-globs.test.d.ts +2 -0
  79. package/dist/tests/file-globs.test.d.ts.map +1 -0
  80. package/dist/tests/file-globs.test.js +66 -0
  81. package/dist/tests/file-globs.test.js.map +1 -0
  82. package/dist/tests/pack.test.d.ts +2 -0
  83. package/dist/tests/pack.test.d.ts.map +1 -0
  84. package/dist/tests/pack.test.js +780 -0
  85. package/dist/tests/pack.test.js.map +1 -0
  86. package/dist/tests/random.test.d.ts +2 -0
  87. package/dist/tests/random.test.d.ts.map +1 -0
  88. package/dist/tests/random.test.js +150 -0
  89. package/dist/tests/random.test.js.map +1 -0
  90. package/dist/tests/tenant.test.d.ts +2 -0
  91. package/dist/tests/tenant.test.d.ts.map +1 -0
  92. package/dist/tests/tenant.test.js +106 -0
  93. package/dist/tests/tenant.test.js.map +1 -0
  94. package/dist/tests/zip.test.d.ts +2 -0
  95. package/dist/tests/zip.test.d.ts.map +1 -0
  96. package/dist/tests/zip.test.js +319 -0
  97. package/dist/tests/zip.test.js.map +1 -0
  98. package/gen-cjs-shims.cjs +71 -0
  99. package/package.json +39 -29
@@ -1 +1 @@
1
- {"version":3,"file":"tenant.js","sourceRoot":"","sources":["../../models/tenant.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tenant.js","sourceRoot":"","sources":["../../models/tenant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Extract a zip file to a directory.
3
+ *
4
+ * Entry names are confined to that directory: a name climbing out of it
5
+ * (".." or an absolute path) is an attempt at a zip slip and is refused.
6
+ *
7
+ * @param fnm path of the zip file
8
+ * @param dir directory to extract into
9
+ * @param password password for encrypted archives. If the archive is
10
+ * encrypted and this is missing or wrong, the thrown error carries
11
+ * `requiresPassword: true`.
12
+ */
13
+ export declare const extractZip: (fnm: string, dir: string, password?: string) => Promise<void>;
14
+ //# sourceMappingURL=zip-extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-extract.d.ts","sourceRoot":"","sources":["../../models/zip-extract.ts"],"names":[],"mappings":"AA4FA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,GACrB,KAAK,MAAM,EACX,KAAK,MAAM,EACX,WAAW,MAAM,KAChB,OAAO,CAAC,IAAI,CAqBd,CAAC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Extracting a zip archive.
3
+ *
4
+ * The reading side is unzipper's: it reads the central directory up front and
5
+ * then streams each entry from the file, through decryption and inflation, to
6
+ * its destination, so nothing larger than a few buffers is ever held in
7
+ * memory and inflation runs on libuv's thread pool. That is why this does not
8
+ * need the worker thread the writing side uses - the CPU work is already off
9
+ * the event loop.
10
+ *
11
+ * What is added here is what unzipper leaves to its caller: entries are
12
+ * checked against the CRC and length the archive claims for them, names that
13
+ * would escape the target directory are refused rather than quietly skipped,
14
+ * and the password errors are turned into something the admin UI can prompt
15
+ * on.
16
+ *
17
+ * @category saltcorn-admin-models
18
+ * @module models/zip-extract
19
+ */
20
+ import { Open } from "unzipper";
21
+ import { createWriteStream } from "fs";
22
+ import { mkdir } from "fs/promises";
23
+ import { dirname, join, resolve, sep } from "path";
24
+ import { Transform } from "stream";
25
+ import { pipeline } from "stream/promises";
26
+ import { crc32 } from "./zip-format.js";
27
+ /** An error the caller can turn into a "this backup needs a password" prompt */
28
+ const passwordError = (message) => {
29
+ const e = new Error(message);
30
+ e.requiresPassword = true;
31
+ return e;
32
+ };
33
+ /**
34
+ * unzipper reports a missing or wrong password by throwing these; everything
35
+ * else it throws is a genuinely broken archive.
36
+ */
37
+ const asPasswordError = (e, name) => {
38
+ if (e?.message === "MISSING_PASSWORD")
39
+ return passwordError(`Zip entry ${name} is encrypted`);
40
+ if (e?.message === "BAD_PASSWORD")
41
+ return passwordError(`Wrong password for zip entry ${name}`);
42
+ return undefined;
43
+ };
44
+ /** Runs the CRC and length of the data flowing through it */
45
+ const checksumStream = (report) => {
46
+ let crc = 0;
47
+ let size = 0;
48
+ return new Transform({
49
+ transform(chunk, _encoding, callback) {
50
+ crc = crc32(chunk, crc);
51
+ size += chunk.length;
52
+ callback(null, chunk);
53
+ },
54
+ flush(callback) {
55
+ report(crc, size);
56
+ callback();
57
+ },
58
+ });
59
+ };
60
+ /** The mode to create an entry with, from its unix permissions if it has any */
61
+ const entryMode = (entry) => (entry.externalFileAttributes >>> 16) & 0o7777 ||
62
+ (entry.type === "Directory" ? 0o755 : 0o644);
63
+ const extractEntry = async (entry, target, password) => {
64
+ let crc = 0;
65
+ let size = 0;
66
+ try {
67
+ await pipeline(entry.stream(password), checksumStream((c, s) => {
68
+ crc = c;
69
+ size = s;
70
+ }), createWriteStream(target, { mode: entryMode(entry) }));
71
+ }
72
+ catch (e) {
73
+ throw asPasswordError(e, entry.path) || e;
74
+ }
75
+ if (size !== entry.uncompressedSize || crc !== entry.crc32)
76
+ throw new Error(`Zip entry ${entry.path} is corrupted`);
77
+ };
78
+ /**
79
+ * Extract a zip file to a directory.
80
+ *
81
+ * Entry names are confined to that directory: a name climbing out of it
82
+ * (".." or an absolute path) is an attempt at a zip slip and is refused.
83
+ *
84
+ * @param fnm path of the zip file
85
+ * @param dir directory to extract into
86
+ * @param password password for encrypted archives. If the archive is
87
+ * encrypted and this is missing or wrong, the thrown error carries
88
+ * `requiresPassword: true`.
89
+ */
90
+ export const extractZip = async (fnm, dir, password) => {
91
+ const root = resolve(dir);
92
+ await mkdir(root, { recursive: true });
93
+ const safeTarget = (name) => {
94
+ const target = resolve(join(root, name));
95
+ if (target !== root && !target.startsWith(root + sep))
96
+ throw new Error(`Refusing to extract ${name} outside the target`);
97
+ return target;
98
+ };
99
+ const archive = await Open.file(fnm);
100
+ for (const entry of archive.files) {
101
+ const target = safeTarget(entry.path);
102
+ if (entry.type === "Directory") {
103
+ await mkdir(target, { recursive: true });
104
+ continue;
105
+ }
106
+ await mkdir(dirname(target), { recursive: true });
107
+ await extractEntry(entry, target, password || undefined);
108
+ }
109
+ };
110
+ //# sourceMappingURL=zip-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-extract.js","sourceRoot":"","sources":["../../models/zip-extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export declare const LOCAL_SIG = 67324752;
2
+ export declare const CENTRAL_SIG = 33639248;
3
+ export declare const DESCRIPTOR_SIG = 134695760;
4
+ export declare const EOCD_SIG = 101010256;
5
+ export declare const ZIP64_EOCD_SIG = 101075792;
6
+ export declare const ZIP64_LOCATOR_SIG = 117853008;
7
+ export declare const LOCAL_HEADER_SIZE = 30;
8
+ export declare const CENTRAL_HEADER_SIZE = 46;
9
+ export declare const EOCD_SIZE = 22;
10
+ export declare const ZIP64_EOCD_SIZE = 56;
11
+ export declare const ZIP64_LOCATOR_SIZE = 20;
12
+ /** general purpose bit flags */
13
+ export declare const FLAG_ENCRYPTED = 1;
14
+ export declare const FLAG_DESCRIPTOR = 8;
15
+ export declare const FLAG_UTF8 = 2048;
16
+ export declare const METHOD_STORED = 0;
17
+ export declare const METHOD_DEFLATED = 8;
18
+ export declare const UINT16_MAX = 65535;
19
+ export declare const UINT32_MAX = 4294967295;
20
+ /** extra field header id of the zip64 extended information field */
21
+ export declare const ZIP64_EXTRA_ID = 1;
22
+ /**
23
+ * Entries at least this large are written in zip64 format. The threshold is
24
+ * below the 4 GiB limit of the 32-bit size fields because the writer has to
25
+ * commit to a format before it knows the exact sizes: it only knows how big
26
+ * the source was when it started, and deflate can add a little.
27
+ */
28
+ export declare const ZIP64_THRESHOLD = 4026531840;
29
+ /**
30
+ * CRC-32 of a chunk, continuing from the value of the previous chunk.
31
+ * zlib's native implementation is used where available (node 20.15+).
32
+ */
33
+ export declare const crc32: (data: Buffer, previous?: number) => number;
34
+ /**
35
+ * The traditional PKWARE ("ZipCrypto") stream cipher, as produced by
36
+ * `zip -P` and understood by every zip reader. It is weak by modern
37
+ * standards, but it is what the zip format offers without going outside the
38
+ * standard, and what Saltcorn backups have always used.
39
+ *
40
+ * The cipher is stateful across the whole entry, so one instance encrypts one
41
+ * entry, chunk by chunk.
42
+ */
43
+ export declare class ZipCrypto {
44
+ private keys;
45
+ constructor(password: string);
46
+ private updateKeys;
47
+ private nextKeyByte;
48
+ encrypt(data: Buffer): Buffer;
49
+ }
50
+ /** MS-DOS date and time fields for a timestamp */
51
+ export declare const dosDateTime: (d: Date) => {
52
+ time: number;
53
+ date: number;
54
+ };
55
+ /** Write a 64-bit unsigned integer */
56
+ export declare const writeUInt64: (buf: Buffer, value: number, offset: number) => void;
57
+ //# sourceMappingURL=zip-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-format.d.ts","sourceRoot":"","sources":["../../models/zip-format.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,SAAS,WAAa,CAAC;AACpC,eAAO,MAAM,WAAW,WAAa,CAAC;AACtC,eAAO,MAAM,cAAc,YAAa,CAAC;AACzC,eAAO,MAAM,QAAQ,YAAa,CAAC;AACnC,eAAO,MAAM,cAAc,YAAa,CAAC;AACzC,eAAO,MAAM,iBAAiB,YAAa,CAAC;AAE5C,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,gCAAgC;AAChC,eAAO,MAAM,cAAc,IAAM,CAAC;AAClC,eAAO,MAAM,eAAe,IAAM,CAAC;AACnC,eAAO,MAAM,SAAS,OAAQ,CAAC;AAE/B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC,eAAO,MAAM,UAAU,QAAS,CAAC;AACjC,eAAO,MAAM,UAAU,aAAa,CAAC;AAErC,oEAAoE;AACpE,eAAO,MAAM,cAAc,IAAS,CAAC;AAErC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,aAAa,CAAC;AAgB1C;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MACkB,CAAC;AAM5E;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAc;gBAEd,QAAQ,EAAE,MAAM;IAK5B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAQ9B;AAED,kDAAkD;AAClD,eAAO,MAAM,WAAW,GAAI,GAAG,IAAI,KAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAOjE,CAAC;AAEF,sCAAsC;AACtC,eAAO,MAAM,WAAW,GACtB,KAAK,MAAM,EACX,OAAO,MAAM,EACb,QAAQ,MAAM,KACb,IAEF,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Constants and primitives of the ZIP file format, used by the streaming
3
+ * writer (zip-writer.ts). The CRC is also used on the reading side, to check
4
+ * what unzipper hands back (zip-extract.ts).
5
+ *
6
+ * @category saltcorn-admin-models
7
+ * @module models/zip-format
8
+ */
9
+ import zlib from "zlib";
10
+ export const LOCAL_SIG = 0x04034b50;
11
+ export const CENTRAL_SIG = 0x02014b50;
12
+ export const DESCRIPTOR_SIG = 0x08074b50;
13
+ export const EOCD_SIG = 0x06054b50;
14
+ export const ZIP64_EOCD_SIG = 0x06064b50;
15
+ export const ZIP64_LOCATOR_SIG = 0x07064b50;
16
+ export const LOCAL_HEADER_SIZE = 30;
17
+ export const CENTRAL_HEADER_SIZE = 46;
18
+ export const EOCD_SIZE = 22;
19
+ export const ZIP64_EOCD_SIZE = 56;
20
+ export const ZIP64_LOCATOR_SIZE = 20;
21
+ /** general purpose bit flags */
22
+ export const FLAG_ENCRYPTED = 0x1;
23
+ export const FLAG_DESCRIPTOR = 0x8;
24
+ export const FLAG_UTF8 = 0x800;
25
+ export const METHOD_STORED = 0;
26
+ export const METHOD_DEFLATED = 8;
27
+ export const UINT16_MAX = 0xffff;
28
+ export const UINT32_MAX = 0xffffffff;
29
+ /** extra field header id of the zip64 extended information field */
30
+ export const ZIP64_EXTRA_ID = 0x0001;
31
+ /**
32
+ * Entries at least this large are written in zip64 format. The threshold is
33
+ * below the 4 GiB limit of the 32-bit size fields because the writer has to
34
+ * commit to a format before it knows the exact sizes: it only knows how big
35
+ * the source was when it started, and deflate can add a little.
36
+ */
37
+ export const ZIP64_THRESHOLD = 0xf0000000; // 3.75 GiB
38
+ /** the CRC-32 lookup table, also used to derive the ZipCrypto keys */
39
+ const crcTable = new Uint32Array(256).map((_, n) => {
40
+ let c = n;
41
+ for (let k = 0; k < 8; k++)
42
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
43
+ return c >>> 0;
44
+ });
45
+ const jsCrc32 = (data, previous = 0) => {
46
+ let c = ~previous >>> 0;
47
+ for (let i = 0; i < data.length; i++)
48
+ c = crcTable[(c ^ data[i]) & 0xff] ^ (c >>> 8);
49
+ return (c ^ 0xffffffff) >>> 0;
50
+ };
51
+ /**
52
+ * CRC-32 of a chunk, continuing from the value of the previous chunk.
53
+ * zlib's native implementation is used where available (node 20.15+).
54
+ */
55
+ export const crc32 = typeof zlib.crc32 === "function" ? zlib.crc32 : jsCrc32;
56
+ /** single-byte CRC-32 update, as ZipCrypto's key schedule uses it */
57
+ const crc32update = (crc, byte) => crcTable[(crc ^ byte) & 0xff] ^ (crc >>> 8);
58
+ /**
59
+ * The traditional PKWARE ("ZipCrypto") stream cipher, as produced by
60
+ * `zip -P` and understood by every zip reader. It is weak by modern
61
+ * standards, but it is what the zip format offers without going outside the
62
+ * standard, and what Saltcorn backups have always used.
63
+ *
64
+ * The cipher is stateful across the whole entry, so one instance encrypts one
65
+ * entry, chunk by chunk.
66
+ */
67
+ export class ZipCrypto {
68
+ constructor(password) {
69
+ this.keys = new Uint32Array([0x12345678, 0x23456789, 0x34567890]);
70
+ for (const byte of Buffer.from(password))
71
+ this.updateKeys(byte);
72
+ }
73
+ updateKeys(byte) {
74
+ const keys = this.keys;
75
+ keys[0] = crc32update(keys[0], byte);
76
+ keys[1] += keys[0] & 0xff;
77
+ keys[1] = Math.imul(keys[1], 134775813) + 1;
78
+ keys[2] = crc32update(keys[2], keys[1] >>> 24);
79
+ }
80
+ nextKeyByte() {
81
+ const k = (this.keys[2] | 2) >>> 0;
82
+ return ((Math.imul(k, k ^ 1) >>> 0) >> 8) & 0xff;
83
+ }
84
+ encrypt(data) {
85
+ const out = Buffer.alloc(data.length);
86
+ for (let i = 0; i < data.length; i++) {
87
+ out[i] = data[i] ^ this.nextKeyByte();
88
+ this.updateKeys(data[i]);
89
+ }
90
+ return out;
91
+ }
92
+ }
93
+ /** MS-DOS date and time fields for a timestamp */
94
+ export const dosDateTime = (d) => {
95
+ // MS-DOS timestamps start in 1980 and have two second resolution
96
+ const year = Math.max(d.getFullYear(), 1980);
97
+ return {
98
+ time: (d.getHours() << 11) | (d.getMinutes() << 5) | (d.getSeconds() >> 1),
99
+ date: ((year - 1980) << 9) | ((d.getMonth() + 1) << 5) | d.getDate(),
100
+ };
101
+ };
102
+ /** Write a 64-bit unsigned integer */
103
+ export const writeUInt64 = (buf, value, offset) => {
104
+ buf.writeBigUInt64LE(BigInt(value), offset);
105
+ };
106
+ //# sourceMappingURL=zip-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-format.js","sourceRoot":"","sources":["../../models/zip-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=zip-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-worker.d.ts","sourceRoot":"","sources":["../../models/zip-worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Worker-thread side of models/zip.ts - see there for why this runs off the
3
+ * main thread. Handles one archive at a time, driven by ZipRequest messages.
4
+ *
5
+ * @category saltcorn-admin-models
6
+ * @module models/zip-worker
7
+ */
8
+ import { parentPort } from "worker_threads";
9
+ import { createWriteStream } from "fs";
10
+ import { mkdir } from "fs/promises";
11
+ import { dirname } from "path";
12
+ import { PassThrough, Writable } from "stream";
13
+ import { once } from "events";
14
+ import { ZipStreamWriter } from "./zip-writer.js";
15
+ /** archive bytes are shipped to the main thread in batches of at least this */
16
+ const CHUNK_SIZE = 256 * 1024;
17
+ let writer = null;
18
+ let output = null;
19
+ /** the entry currently being fed chunk by chunk from the main thread */
20
+ let entrySource = null;
21
+ let entryDone = null;
22
+ /** resolves when the output stream has been fully flushed and closed */
23
+ let outputClosed = Promise.resolve();
24
+ /** set while a shipped chunk is waiting to be acknowledged */
25
+ let chunkAck = null;
26
+ /**
27
+ * Transfer a buffer rather than copying it. Safe in this direction because
28
+ * the buffer shipped out is the Buffer.concat below, which nothing else
29
+ * holds; only transfer it when it owns its whole ArrayBuffer, since node
30
+ * pools small allocations and transferring a pooled buffer would detach the
31
+ * pool out from under everything else in it.
32
+ */
33
+ const transferable = (data) => data.byteOffset === 0 && data.byteLength === data.buffer.byteLength
34
+ ? [data.buffer]
35
+ : undefined;
36
+ /**
37
+ * An output that ships the archive to the main thread instead of writing it
38
+ * to disk, for destinations that are uploaded rather than stored locally.
39
+ *
40
+ * Chunks are coalesced to keep the message count down, and only one is in
41
+ * flight at a time: the main thread acknowledges each one once it has taken
42
+ * it, which is what applies backpressure all the way back to the file being
43
+ * read.
44
+ */
45
+ const messageOutput = () => {
46
+ let pending = [];
47
+ let pendingSize = 0;
48
+ const ship = () => {
49
+ const data = Buffer.concat(pending);
50
+ pending = [];
51
+ pendingSize = 0;
52
+ return new Promise((resolve) => {
53
+ chunkAck = resolve;
54
+ parentPort.postMessage({ type: "chunk", data }, transferable(data));
55
+ });
56
+ };
57
+ return new Writable({
58
+ write(chunk, _encoding, callback) {
59
+ pending.push(chunk);
60
+ pendingSize += chunk.length;
61
+ if (pendingSize < CHUNK_SIZE)
62
+ return callback();
63
+ ship().then(() => callback(), callback);
64
+ },
65
+ final(callback) {
66
+ const done = () => {
67
+ parentPort.postMessage({ type: "chunkEnd" });
68
+ callback();
69
+ };
70
+ if (pendingSize)
71
+ ship().then(done, callback);
72
+ else
73
+ done();
74
+ },
75
+ });
76
+ };
77
+ /** wait for a stream to finish, or reject with its error */
78
+ const finished = (stream) => new Promise((resolve, reject) => {
79
+ stream.on("finish", () => resolve());
80
+ stream.on("error", reject);
81
+ });
82
+ const startWriting = (out, password) => {
83
+ output = out;
84
+ outputClosed = finished(out);
85
+ writer = new ZipStreamWriter(out, { password });
86
+ };
87
+ const handle = async (req) => {
88
+ switch (req.cmd) {
89
+ case "beginFile": {
90
+ const dir = dirname(req.path);
91
+ if (dir && dir !== ".")
92
+ await mkdir(dir, { recursive: true });
93
+ startWriting(createWriteStream(req.path), req.password);
94
+ return;
95
+ }
96
+ case "beginStream":
97
+ startWriting(messageOutput(), req.password);
98
+ return;
99
+ case "addBuffer":
100
+ await writer.addBuffer(req.entryName, Buffer.from(req.data));
101
+ return;
102
+ case "addLocalFile":
103
+ await writer.addFile(req.entryName, req.localPath);
104
+ return;
105
+ case "addDirectory":
106
+ await writer.addDirectory(req.entryName);
107
+ return;
108
+ case "beginEntry": {
109
+ // the entry is written as its chunks arrive, so this resolves right
110
+ // away and the work goes on in the background until endEntry
111
+ const source = new PassThrough();
112
+ // failures are reported by endEntry; this keeps the destroy below from
113
+ // becoming an unhandled error event
114
+ source.on("error", () => { });
115
+ entrySource = source;
116
+ entryDone = writer.addStream(req.entryName, source).catch((e) => {
117
+ // stop the main thread waiting for room in a stream that is done
118
+ source.destroy(e);
119
+ throw e;
120
+ });
121
+ entryDone.catch(() => { });
122
+ return;
123
+ }
124
+ case "entryChunk": {
125
+ const chunk = Buffer.from(req.data);
126
+ if (!entrySource.write(chunk))
127
+ await once(entrySource, "drain");
128
+ return;
129
+ }
130
+ case "endEntry": {
131
+ entrySource.end();
132
+ const done = entryDone;
133
+ entrySource = null;
134
+ entryDone = null;
135
+ await done;
136
+ return;
137
+ }
138
+ case "finish": {
139
+ await writer.finalize();
140
+ // finalize only hands the trailing records to the output; the archive
141
+ // is not complete until the output has taken and flushed them
142
+ output.end();
143
+ await outputClosed;
144
+ writer = null;
145
+ output = null;
146
+ return;
147
+ }
148
+ default:
149
+ throw new Error(`Unknown zip worker command`);
150
+ }
151
+ };
152
+ /** requests are handled one at a time, in the order they arrive */
153
+ let queue = Promise.resolve();
154
+ parentPort?.on("message", (msg) => {
155
+ if (msg.cmd === "chunkAck") {
156
+ // not a request: the main thread reporting it has room for more output
157
+ const ack = chunkAck;
158
+ chunkAck = null;
159
+ ack?.();
160
+ return;
161
+ }
162
+ const req = msg;
163
+ queue = queue.then(async () => {
164
+ try {
165
+ await handle(req);
166
+ parentPort.postMessage({ id: req.id, ok: true });
167
+ }
168
+ catch (e) {
169
+ parentPort.postMessage({
170
+ id: req.id,
171
+ ok: false,
172
+ error: e?.message || String(e),
173
+ });
174
+ }
175
+ });
176
+ });
177
+ //# sourceMappingURL=zip-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-worker.js","sourceRoot":"","sources":["../../models/zip-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { Readable, Writable } from "stream";
2
+ export type ZipWriterOptions = {
3
+ /** encrypt entries with the traditional zip password scheme */
4
+ password?: string;
5
+ /** deflate level, 0-9. 5 trades a little size for a lot of speed */
6
+ level?: number;
7
+ /** size at which an entry is written in zip64 format. Tests lower it */
8
+ zip64Threshold?: number;
9
+ /**
10
+ * How much of an entry of unknown size is read before committing to a
11
+ * format. Entries that end within this are written in the classic format,
12
+ * which every reader understands; longer ones get zip64.
13
+ */
14
+ probeLimit?: number;
15
+ };
16
+ export declare class ZipStreamWriter {
17
+ private out;
18
+ private password?;
19
+ private level;
20
+ private zip64Threshold;
21
+ private probeLimit;
22
+ private offset;
23
+ private entries;
24
+ private names;
25
+ constructor(out: Writable, options?: ZipWriterOptions);
26
+ /** Write to the output, respecting its backpressure */
27
+ private put;
28
+ /**
29
+ * Zip entry names are always forward-slash separated and never absolute.
30
+ * A duplicate name would make the archive ambiguous, so it is an error.
31
+ */
32
+ private entryName;
33
+ /**
34
+ * The local file header. When an entry is zip64 the header carries a
35
+ * zip64 extra field with placeholder sizes, which is what tells a reader
36
+ * that the trailing data descriptor has 8-byte sizes.
37
+ */
38
+ private localHeader;
39
+ /** The data descriptor written after an entry's data */
40
+ private dataDescriptor;
41
+ /**
42
+ * Add an entry whose contents come from a stream.
43
+ *
44
+ * Whether an entry is zip64 has to be settled before any of its data is
45
+ * written, so a source of unknown length is read ahead of up to
46
+ * `probeLimit` bytes to find out which it is.
47
+ *
48
+ * @param options.sizeHint how large the source is known to be, if it is
49
+ */
50
+ addStream(name: string, source: Readable, options?: {
51
+ sizeHint?: number;
52
+ mode?: number;
53
+ mtime?: Date;
54
+ }): Promise<void>;
55
+ /** Add an entry from content held in memory */
56
+ addBuffer(name: string, data: Buffer, options?: {
57
+ mode?: number;
58
+ mtime?: Date;
59
+ }): Promise<void>;
60
+ /** Add an entry read from a file on disk. The file is streamed. */
61
+ addFile(name: string, localPath: string): Promise<void>;
62
+ /** Add a directory entry */
63
+ addDirectory(name: string, options?: {
64
+ mode?: number;
65
+ mtime?: Date;
66
+ }): Promise<void>;
67
+ /** The central directory record of one entry */
68
+ private centralHeader;
69
+ /**
70
+ * Write the central directory and the end of central directory records.
71
+ * The writer cannot be used afterwards.
72
+ */
73
+ finalize(): Promise<void>;
74
+ }
75
+ //# sourceMappingURL=zip-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-writer.d.ts","sourceRoot":"","sources":["../../models/zip-writer.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AA4C5C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,KAAK,CAA0B;gBAE3B,GAAG,EAAE,QAAQ,EAAE,OAAO,GAAE,gBAAqB;IAQzD,uDAAuD;YACzC,GAAG;IAKjB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAQjB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA2BnB,wDAAwD;IACxD,OAAO,CAAC,cAAc;IActB;;;;;;;;OAQG;IACG,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,EAChB,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,IAAI,CAAA;KAAO,GAC/D,OAAO,CAAC,IAAI,CAAC;IAiGhB,+CAA+C;IACzC,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,IAAI,CAAA;KAAO,GAC5C,OAAO,CAAC,IAAI,CAAC;IAOhB,mEAAmE;IAC7D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7D,4BAA4B;IACtB,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,IAAI,CAAA;KAAO,GAC5C,OAAO,CAAC,IAAI,CAAC;IAoBhB,gDAAgD;IAChD,OAAO,CAAC,aAAa;IA4CrB;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CA4ChC"}