@zuplo/cli 6.73.8 → 6.73.11

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 (229) hide show
  1. package/dist/cli.js +2 -11
  2. package/dist/cli.js.map +1 -1
  3. package/dist/common/cli-dispatcher.d.ts +6 -0
  4. package/dist/common/cli-dispatcher.d.ts.map +1 -0
  5. package/dist/common/cli-dispatcher.js +19 -0
  6. package/dist/common/cli-dispatcher.js.map +1 -0
  7. package/dist/common/cli-dispatcher.test.d.ts +2 -0
  8. package/dist/common/cli-dispatcher.test.d.ts.map +1 -0
  9. package/dist/common/cli-dispatcher.test.js +78 -0
  10. package/dist/common/cli-dispatcher.test.js.map +1 -0
  11. package/dist/tsconfig.tsbuildinfo +1 -1
  12. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/README.md +1 -4
  13. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwks/remote.d.ts +3 -3
  14. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/remote.js +1 -1
  15. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/key_to_jwk.js +4 -1
  16. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/package.json +1 -1
  17. package/node_modules/@posthog/core/dist/posthog-core.d.ts +5 -2
  18. package/node_modules/@posthog/core/dist/posthog-core.d.ts.map +1 -1
  19. package/node_modules/@posthog/core/dist/posthog-core.js +9 -3
  20. package/node_modules/@posthog/core/dist/posthog-core.mjs +9 -3
  21. package/node_modules/@posthog/core/dist/types.d.ts +4 -0
  22. package/node_modules/@posthog/core/dist/types.d.ts.map +1 -1
  23. package/node_modules/@posthog/core/package.json +2 -2
  24. package/node_modules/@posthog/core/src/posthog-core.ts +10 -5
  25. package/node_modules/@posthog/core/src/types.ts +5 -0
  26. package/node_modules/@posthog/types/dist/feature-flags.d.ts +9 -0
  27. package/node_modules/@posthog/types/dist/feature-flags.d.ts.map +1 -1
  28. package/node_modules/@posthog/types/dist/index.d.ts +1 -1
  29. package/node_modules/@posthog/types/dist/index.d.ts.map +1 -1
  30. package/node_modules/@posthog/types/dist/posthog.d.ts +6 -2
  31. package/node_modules/@posthog/types/dist/posthog.d.ts.map +1 -1
  32. package/node_modules/@posthog/types/package.json +1 -1
  33. package/node_modules/@posthog/types/src/feature-flags.ts +10 -0
  34. package/node_modules/@posthog/types/src/index.ts +1 -0
  35. package/node_modules/@posthog/types/src/posthog.ts +4 -1
  36. package/node_modules/@zuplo/core/customer.cli.minified.js +253 -253
  37. package/node_modules/@zuplo/core/index.minified.js +259 -259
  38. package/node_modules/@zuplo/core/package.json +1 -1
  39. package/node_modules/@zuplo/graphql/package.json +1 -1
  40. package/node_modules/@zuplo/openapi-tools/package.json +2 -2
  41. package/node_modules/@zuplo/otel/package.json +1 -1
  42. package/node_modules/@zuplo/runtime/out/esm/{chunk-W5A5ADF4.js → chunk-7Z5GGYF5.js} +4 -4
  43. package/node_modules/@zuplo/runtime/out/esm/chunk-7Z5GGYF5.js.map +1 -0
  44. package/node_modules/@zuplo/runtime/out/esm/index.js +1 -1
  45. package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js +1 -1
  46. package/node_modules/@zuplo/runtime/package.json +1 -1
  47. package/node_modules/js-yaml/README.md +5 -3
  48. package/node_modules/js-yaml/dist/js-yaml.js +3009 -2402
  49. package/node_modules/js-yaml/dist/js-yaml.js.map +1 -1
  50. package/node_modules/js-yaml/dist/js-yaml.min.js +2 -33
  51. package/node_modules/js-yaml/dist/js-yaml.min.js.map +1 -1
  52. package/node_modules/js-yaml/dist/js-yaml.mjs +3073 -2381
  53. package/node_modules/js-yaml/dist/js-yaml.mjs.map +1 -1
  54. package/node_modules/js-yaml/lib/loader.js +7 -11
  55. package/node_modules/js-yaml/lib/type/float.js +1 -1
  56. package/node_modules/js-yaml/lib/type/int.js +4 -4
  57. package/node_modules/js-yaml/package.json +10 -4
  58. package/node_modules/tar/README.md +34 -6
  59. package/node_modules/tar/dist/commonjs/create.d.ts.map +1 -1
  60. package/node_modules/tar/dist/commonjs/create.js +3 -4
  61. package/node_modules/tar/dist/commonjs/create.js.map +1 -1
  62. package/node_modules/tar/dist/commonjs/cwd-error.d.ts +1 -1
  63. package/node_modules/tar/dist/commonjs/cwd-error.d.ts.map +1 -1
  64. package/node_modules/tar/dist/commonjs/cwd-error.js.map +1 -1
  65. package/node_modules/tar/dist/commonjs/extract.js.map +1 -1
  66. package/node_modules/tar/dist/commonjs/get-write-flag.d.ts.map +1 -1
  67. package/node_modules/tar/dist/commonjs/get-write-flag.js +7 -4
  68. package/node_modules/tar/dist/commonjs/get-write-flag.js.map +1 -1
  69. package/node_modules/tar/dist/commonjs/header.d.ts.map +1 -1
  70. package/node_modules/tar/dist/commonjs/header.js +60 -37
  71. package/node_modules/tar/dist/commonjs/header.js.map +1 -1
  72. package/node_modules/tar/dist/commonjs/index.min.js +3 -3
  73. package/node_modules/tar/dist/commonjs/index.min.js.map +3 -3
  74. package/node_modules/tar/dist/commonjs/large-numbers.d.ts.map +1 -1
  75. package/node_modules/tar/dist/commonjs/large-numbers.js.map +1 -1
  76. package/node_modules/tar/dist/commonjs/list.d.ts +1 -1
  77. package/node_modules/tar/dist/commonjs/list.d.ts.map +1 -1
  78. package/node_modules/tar/dist/commonjs/list.js +2 -7
  79. package/node_modules/tar/dist/commonjs/list.js.map +1 -1
  80. package/node_modules/tar/dist/commonjs/make-command.d.ts +2 -2
  81. package/node_modules/tar/dist/commonjs/make-command.d.ts.map +1 -1
  82. package/node_modules/tar/dist/commonjs/make-command.js +3 -12
  83. package/node_modules/tar/dist/commonjs/make-command.js.map +1 -1
  84. package/node_modules/tar/dist/commonjs/mkdir.d.ts.map +1 -1
  85. package/node_modules/tar/dist/commonjs/mkdir.js +5 -6
  86. package/node_modules/tar/dist/commonjs/mkdir.js.map +1 -1
  87. package/node_modules/tar/dist/commonjs/normalize-windows-path.d.ts +1 -1
  88. package/node_modules/tar/dist/commonjs/normalize-windows-path.d.ts.map +1 -1
  89. package/node_modules/tar/dist/commonjs/normalize-windows-path.js +2 -2
  90. package/node_modules/tar/dist/commonjs/normalize-windows-path.js.map +1 -1
  91. package/node_modules/tar/dist/commonjs/options.d.ts +14 -6
  92. package/node_modules/tar/dist/commonjs/options.d.ts.map +1 -1
  93. package/node_modules/tar/dist/commonjs/options.js.map +1 -1
  94. package/node_modules/tar/dist/commonjs/pack.d.ts +8 -4
  95. package/node_modules/tar/dist/commonjs/pack.d.ts.map +1 -1
  96. package/node_modules/tar/dist/commonjs/pack.js +47 -19
  97. package/node_modules/tar/dist/commonjs/pack.js.map +1 -1
  98. package/node_modules/tar/dist/commonjs/parse.d.ts +11 -4
  99. package/node_modules/tar/dist/commonjs/parse.d.ts.map +1 -1
  100. package/node_modules/tar/dist/commonjs/parse.js +61 -26
  101. package/node_modules/tar/dist/commonjs/parse.js.map +1 -1
  102. package/node_modules/tar/dist/commonjs/path-reservations.d.ts.map +1 -1
  103. package/node_modules/tar/dist/commonjs/path-reservations.js +2 -2
  104. package/node_modules/tar/dist/commonjs/path-reservations.js.map +1 -1
  105. package/node_modules/tar/dist/commonjs/pax.d.ts +1 -1
  106. package/node_modules/tar/dist/commonjs/pax.d.ts.map +1 -1
  107. package/node_modules/tar/dist/commonjs/pax.js +30 -6
  108. package/node_modules/tar/dist/commonjs/pax.js.map +1 -1
  109. package/node_modules/tar/dist/commonjs/read-entry.d.ts +3 -3
  110. package/node_modules/tar/dist/commonjs/read-entry.d.ts.map +1 -1
  111. package/node_modules/tar/dist/commonjs/read-entry.js +2 -6
  112. package/node_modules/tar/dist/commonjs/read-entry.js.map +1 -1
  113. package/node_modules/tar/dist/commonjs/replace.d.ts.map +1 -1
  114. package/node_modules/tar/dist/commonjs/replace.js +5 -10
  115. package/node_modules/tar/dist/commonjs/replace.js.map +1 -1
  116. package/node_modules/tar/dist/commonjs/symlink-error.d.ts +2 -2
  117. package/node_modules/tar/dist/commonjs/symlink-error.d.ts.map +1 -1
  118. package/node_modules/tar/dist/commonjs/symlink-error.js.map +1 -1
  119. package/node_modules/tar/dist/commonjs/types.d.ts +9 -0
  120. package/node_modules/tar/dist/commonjs/types.d.ts.map +1 -1
  121. package/node_modules/tar/dist/commonjs/types.js +21 -1
  122. package/node_modules/tar/dist/commonjs/types.js.map +1 -1
  123. package/node_modules/tar/dist/commonjs/unpack.d.ts +4 -4
  124. package/node_modules/tar/dist/commonjs/unpack.d.ts.map +1 -1
  125. package/node_modules/tar/dist/commonjs/unpack.js +39 -64
  126. package/node_modules/tar/dist/commonjs/unpack.js.map +1 -1
  127. package/node_modules/tar/dist/commonjs/warn-method.d.ts +2 -2
  128. package/node_modules/tar/dist/commonjs/warn-method.d.ts.map +1 -1
  129. package/node_modules/tar/dist/commonjs/warn-method.js.map +1 -1
  130. package/node_modules/tar/dist/commonjs/winchars.js +1 -1
  131. package/node_modules/tar/dist/commonjs/winchars.js.map +1 -1
  132. package/node_modules/tar/dist/commonjs/write-entry.d.ts +11 -11
  133. package/node_modules/tar/dist/commonjs/write-entry.d.ts.map +1 -1
  134. package/node_modules/tar/dist/commonjs/write-entry.js +12 -13
  135. package/node_modules/tar/dist/commonjs/write-entry.js.map +1 -1
  136. package/node_modules/tar/dist/esm/create.d.ts.map +1 -1
  137. package/node_modules/tar/dist/esm/create.js +3 -4
  138. package/node_modules/tar/dist/esm/create.js.map +1 -1
  139. package/node_modules/tar/dist/esm/cwd-error.d.ts +1 -1
  140. package/node_modules/tar/dist/esm/cwd-error.d.ts.map +1 -1
  141. package/node_modules/tar/dist/esm/cwd-error.js.map +1 -1
  142. package/node_modules/tar/dist/esm/extract.js.map +1 -1
  143. package/node_modules/tar/dist/esm/get-write-flag.d.ts.map +1 -1
  144. package/node_modules/tar/dist/esm/get-write-flag.js +7 -4
  145. package/node_modules/tar/dist/esm/get-write-flag.js.map +1 -1
  146. package/node_modules/tar/dist/esm/header.d.ts.map +1 -1
  147. package/node_modules/tar/dist/esm/header.js +60 -37
  148. package/node_modules/tar/dist/esm/header.js.map +1 -1
  149. package/node_modules/tar/dist/esm/index.min.js +3 -3
  150. package/node_modules/tar/dist/esm/index.min.js.map +3 -3
  151. package/node_modules/tar/dist/esm/large-numbers.d.ts.map +1 -1
  152. package/node_modules/tar/dist/esm/large-numbers.js.map +1 -1
  153. package/node_modules/tar/dist/esm/list.d.ts +1 -1
  154. package/node_modules/tar/dist/esm/list.d.ts.map +1 -1
  155. package/node_modules/tar/dist/esm/list.js +2 -7
  156. package/node_modules/tar/dist/esm/list.js.map +1 -1
  157. package/node_modules/tar/dist/esm/make-command.d.ts +2 -2
  158. package/node_modules/tar/dist/esm/make-command.d.ts.map +1 -1
  159. package/node_modules/tar/dist/esm/make-command.js +3 -12
  160. package/node_modules/tar/dist/esm/make-command.js.map +1 -1
  161. package/node_modules/tar/dist/esm/mkdir.d.ts.map +1 -1
  162. package/node_modules/tar/dist/esm/mkdir.js +5 -6
  163. package/node_modules/tar/dist/esm/mkdir.js.map +1 -1
  164. package/node_modules/tar/dist/esm/normalize-windows-path.d.ts +1 -1
  165. package/node_modules/tar/dist/esm/normalize-windows-path.d.ts.map +1 -1
  166. package/node_modules/tar/dist/esm/normalize-windows-path.js +2 -2
  167. package/node_modules/tar/dist/esm/normalize-windows-path.js.map +1 -1
  168. package/node_modules/tar/dist/esm/options.d.ts +14 -6
  169. package/node_modules/tar/dist/esm/options.d.ts.map +1 -1
  170. package/node_modules/tar/dist/esm/options.js.map +1 -1
  171. package/node_modules/tar/dist/esm/pack.d.ts +8 -4
  172. package/node_modules/tar/dist/esm/pack.d.ts.map +1 -1
  173. package/node_modules/tar/dist/esm/pack.js +48 -20
  174. package/node_modules/tar/dist/esm/pack.js.map +1 -1
  175. package/node_modules/tar/dist/esm/parse.d.ts +11 -4
  176. package/node_modules/tar/dist/esm/parse.d.ts.map +1 -1
  177. package/node_modules/tar/dist/esm/parse.js +62 -27
  178. package/node_modules/tar/dist/esm/parse.js.map +1 -1
  179. package/node_modules/tar/dist/esm/path-reservations.d.ts.map +1 -1
  180. package/node_modules/tar/dist/esm/path-reservations.js +2 -2
  181. package/node_modules/tar/dist/esm/path-reservations.js.map +1 -1
  182. package/node_modules/tar/dist/esm/pax.d.ts +1 -1
  183. package/node_modules/tar/dist/esm/pax.d.ts.map +1 -1
  184. package/node_modules/tar/dist/esm/pax.js +30 -6
  185. package/node_modules/tar/dist/esm/pax.js.map +1 -1
  186. package/node_modules/tar/dist/esm/read-entry.d.ts +3 -3
  187. package/node_modules/tar/dist/esm/read-entry.d.ts.map +1 -1
  188. package/node_modules/tar/dist/esm/read-entry.js +2 -6
  189. package/node_modules/tar/dist/esm/read-entry.js.map +1 -1
  190. package/node_modules/tar/dist/esm/replace.d.ts.map +1 -1
  191. package/node_modules/tar/dist/esm/replace.js +6 -11
  192. package/node_modules/tar/dist/esm/replace.js.map +1 -1
  193. package/node_modules/tar/dist/esm/symlink-error.d.ts +2 -2
  194. package/node_modules/tar/dist/esm/symlink-error.d.ts.map +1 -1
  195. package/node_modules/tar/dist/esm/symlink-error.js.map +1 -1
  196. package/node_modules/tar/dist/esm/types.d.ts +9 -0
  197. package/node_modules/tar/dist/esm/types.d.ts.map +1 -1
  198. package/node_modules/tar/dist/esm/types.js +20 -0
  199. package/node_modules/tar/dist/esm/types.js.map +1 -1
  200. package/node_modules/tar/dist/esm/unpack.d.ts +4 -4
  201. package/node_modules/tar/dist/esm/unpack.d.ts.map +1 -1
  202. package/node_modules/tar/dist/esm/unpack.js +39 -64
  203. package/node_modules/tar/dist/esm/unpack.js.map +1 -1
  204. package/node_modules/tar/dist/esm/warn-method.d.ts +2 -2
  205. package/node_modules/tar/dist/esm/warn-method.d.ts.map +1 -1
  206. package/node_modules/tar/dist/esm/warn-method.js.map +1 -1
  207. package/node_modules/tar/dist/esm/winchars.js +1 -1
  208. package/node_modules/tar/dist/esm/winchars.js.map +1 -1
  209. package/node_modules/tar/dist/esm/write-entry.d.ts +11 -11
  210. package/node_modules/tar/dist/esm/write-entry.d.ts.map +1 -1
  211. package/node_modules/tar/dist/esm/write-entry.js +14 -15
  212. package/node_modules/tar/dist/esm/write-entry.js.map +1 -1
  213. package/node_modules/tar/package.json +15 -9
  214. package/node_modules/undici/docs/docs/api/Client.md +3 -0
  215. package/node_modules/undici/lib/dispatcher/agent.js +2 -2
  216. package/node_modules/undici/lib/dispatcher/client-h1.js +140 -23
  217. package/node_modules/undici/lib/dispatcher/client.js +3 -2
  218. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +10 -1
  219. package/node_modules/undici/lib/dispatcher/pool-base.js +2 -2
  220. package/node_modules/undici/lib/dispatcher/pool.js +2 -2
  221. package/node_modules/undici/lib/web/cookies/parse.js +16 -23
  222. package/node_modules/undici/lib/web/websocket/permessage-deflate.js +13 -31
  223. package/node_modules/undici/lib/web/websocket/receiver.js +110 -24
  224. package/node_modules/undici/lib/web/websocket/websocket.js +8 -1
  225. package/node_modules/undici/package.json +1 -1
  226. package/node_modules/undici/types/client.d.ts +17 -0
  227. package/package.json +9 -9
  228. package/node_modules/@zuplo/runtime/out/esm/chunk-W5A5ADF4.js.map +0 -1
  229. /package/node_modules/@zuplo/runtime/out/esm/{chunk-W5A5ADF4.js.LEGAL.txt → chunk-7Z5GGYF5.js.LEGAL.txt} +0 -0
@@ -22,7 +22,7 @@ import { BrotliDecompress, Unzip, ZstdDecompress } from 'minizlib';
22
22
  import { Header } from './header.js';
23
23
  import { Pax } from './pax.js';
24
24
  import { ReadEntry } from './read-entry.js';
25
- import { warnMethod, } from './warn-method.js';
25
+ import { warnMethod } from './warn-method.js';
26
26
  const maxMetaEntrySize = 1024 * 1024;
27
27
  const gzipHeader = Buffer.from([0x1f, 0x8b]);
28
28
  const zstdHeader = Buffer.from([0x28, 0xb5, 0x2f, 0xfd]);
@@ -57,6 +57,10 @@ const SAW_VALID_ENTRY = Symbol('sawValidEntry');
57
57
  const SAW_NULL_BLOCK = Symbol('sawNullBlock');
58
58
  const SAW_EOF = Symbol('sawEOF');
59
59
  const CLOSESTREAM = Symbol('closeStream');
60
+ const MAX_DECOMPRESSION_RATIO = 1000;
61
+ const COMPRESSEDBYTESREAD = Symbol('compressedBytesRead');
62
+ const DECOMPRESSEDBYTESREAD = Symbol('decompressedBytesRead');
63
+ const CHECKDECOMPRESSIONRATIO = Symbol('checkDecompressionRatio');
60
64
  const noop = () => true;
61
65
  export class Parser extends EE {
62
66
  file;
@@ -65,6 +69,7 @@ export class Parser extends EE {
65
69
  filter;
66
70
  brotli;
67
71
  zstd;
72
+ maxDecompressionRatio;
68
73
  writable = true;
69
74
  readable = false;
70
75
  [QUEUE] = [];
@@ -84,13 +89,14 @@ export class Parser extends EE {
84
89
  [WRITING] = false;
85
90
  [CONSUMING] = false;
86
91
  [EMITTEDEND] = false;
92
+ [COMPRESSEDBYTESREAD] = 0;
93
+ [DECOMPRESSEDBYTESREAD] = 0;
87
94
  constructor(opt = {}) {
88
95
  super();
89
96
  this.file = opt.file || '';
90
97
  // these BADARCHIVE errors can't be detected early. listen on DONE.
91
98
  this.on(DONE, () => {
92
- if (this[STATE] === 'begin' ||
93
- this[SAW_VALID_ENTRY] === false) {
99
+ if (this[STATE] === 'begin' || this[SAW_VALID_ENTRY] === false) {
94
100
  // either less than 1 block of data, or all entries were invalid.
95
101
  // Either way, probably not even a tarball.
96
102
  this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format');
@@ -107,6 +113,10 @@ export class Parser extends EE {
107
113
  });
108
114
  }
109
115
  this.strict = !!opt.strict;
116
+ this.maxDecompressionRatio =
117
+ typeof opt.maxDecompressionRatio === 'number' ?
118
+ opt.maxDecompressionRatio
119
+ : MAX_DECOMPRESSION_RATIO;
110
120
  this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize;
111
121
  this.filter = typeof opt.filter === 'function' ? opt.filter : noop;
112
122
  // Unlike gzip, brotli doesn't have any magic bytes to identify it
@@ -220,8 +230,7 @@ export class Parser extends EE {
220
230
  }
221
231
  else {
222
232
  this[EX] = undefined;
223
- entry.ignore =
224
- entry.ignore || !this.filter(entry.path, entry);
233
+ entry.ignore = entry.ignore || !this.filter(entry.path, entry);
225
234
  if (entry.ignore) {
226
235
  // probably valid, just not something we care about
227
236
  this[EMIT]('ignoredEntry', entry);
@@ -274,7 +283,7 @@ export class Parser extends EE {
274
283
  }
275
284
  [NEXTENTRY]() {
276
285
  do { } while (this[PROCESSENTRY](this[QUEUE].shift()));
277
- if (!this[QUEUE].length) {
286
+ if (this[QUEUE].length === 0) {
278
287
  // At this point, there's nothing in the queue, but we may have an
279
288
  // entry which is being consumed (readEntry).
280
289
  // If we don't, then we definitely can handle more data.
@@ -324,7 +333,7 @@ export class Parser extends EE {
324
333
  return ret;
325
334
  }
326
335
  [EMIT](ev, data, extra) {
327
- if (!this[QUEUE].length && !this[READENTRY]) {
336
+ if (this[QUEUE].length === 0 && !this[READENTRY]) {
328
337
  this.emit(ev, data, extra);
329
338
  }
330
339
  else {
@@ -361,11 +370,33 @@ export class Parser extends EE {
361
370
  }
362
371
  }
363
372
  abort(error) {
373
+ if (this[ABORTED]) {
374
+ return;
375
+ }
376
+ if (this[UNZIP]) {
377
+ // fully nerf the decompressor and close its underlying binding
378
+ const u = this[UNZIP];
379
+ /* c8 ignore start */
380
+ u.write = () => true;
381
+ u.end = () => u;
382
+ u.emit = () => false;
383
+ /* c8 ignore stop */
384
+ u.destroy?.();
385
+ }
364
386
  this[ABORTED] = true;
365
387
  this.emit('abort', error);
366
388
  // always throws, even in non-strict mode
367
389
  this.warn('TAR_ABORT', error, { recoverable: false });
368
390
  }
391
+ [CHECKDECOMPRESSIONRATIO](chunk) {
392
+ this[DECOMPRESSEDBYTESREAD] += chunk.length;
393
+ const ratio = this[DECOMPRESSEDBYTESREAD] / this[COMPRESSEDBYTESREAD];
394
+ if (ratio > this.maxDecompressionRatio) {
395
+ this.abort(new Error(`max decompression ratio exceeded: ${ratio.toFixed(2)} > ${this.maxDecompressionRatio}`));
396
+ return false;
397
+ }
398
+ return true;
399
+ }
369
400
  write(chunk, encoding, cb) {
370
401
  if (typeof encoding === 'function') {
371
402
  cb = encoding;
@@ -449,13 +480,22 @@ export class Parser extends EE {
449
480
  this[UNZIP] === undefined ? new Unzip({})
450
481
  : isZstd ? new ZstdDecompress({})
451
482
  : new BrotliDecompress({});
452
- this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk));
453
- this[UNZIP].on('error', er => this.abort(er));
483
+ this[UNZIP].on('data', chunk => {
484
+ if (this[CHECKDECOMPRESSIONRATIO](chunk)) {
485
+ this[CONSUMECHUNK](chunk);
486
+ }
487
+ });
488
+ this[UNZIP].on('error', er => {
489
+ if (!this[ABORTED]) {
490
+ this.abort(er);
491
+ }
492
+ });
454
493
  this[UNZIP].on('end', () => {
455
494
  this[ENDED] = true;
456
495
  this[CONSUMECHUNK]();
457
496
  });
458
497
  this[WRITING] = true;
498
+ this[COMPRESSEDBYTESREAD] += chunk.length;
459
499
  const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk);
460
500
  this[WRITING] = false;
461
501
  cb?.();
@@ -464,6 +504,7 @@ export class Parser extends EE {
464
504
  }
465
505
  this[WRITING] = true;
466
506
  if (this[UNZIP]) {
507
+ this[COMPRESSEDBYTESREAD] += chunk.length;
467
508
  this[UNZIP].write(chunk);
468
509
  }
469
510
  else {
@@ -471,11 +512,11 @@ export class Parser extends EE {
471
512
  }
472
513
  this[WRITING] = false;
473
514
  // return false if there's a queue, or if the current entry isn't flowing
474
- const ret = this[QUEUE].length ? false
515
+ const ret = this[QUEUE].length > 0 ? false
475
516
  : this[READENTRY] ? this[READENTRY].flowing
476
517
  : true;
477
518
  // if we have no queue, then that means a clogged READENTRY
478
- if (!ret && !this[QUEUE].length) {
519
+ if (!ret && this[QUEUE].length === 0) {
479
520
  this[READENTRY]?.once('drain', () => this.emit('drain'));
480
521
  }
481
522
  /* c8 ignore next */
@@ -484,8 +525,7 @@ export class Parser extends EE {
484
525
  }
485
526
  [BUFFERCONCAT](c) {
486
527
  if (c && !this[ABORTED]) {
487
- this[BUFFER] =
488
- this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c;
528
+ this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c;
489
529
  }
490
530
  }
491
531
  [MAYBEEND]() {
@@ -495,7 +535,7 @@ export class Parser extends EE {
495
535
  !this[CONSUMING]) {
496
536
  this[EMITTEDEND] = true;
497
537
  const entry = this[WRITEENTRY];
498
- if (entry && entry.blockRemain) {
538
+ if (entry?.blockRemain) {
499
539
  // truncated, likely a damaged file
500
540
  const have = this[BUFFER] ? this[BUFFER].length : 0;
501
541
  this.warn('TAR_BAD_ARCHIVE', `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry });
@@ -544,9 +584,7 @@ export class Parser extends EE {
544
584
  // the buffer. Advance the position and put any remainder in the buffer.
545
585
  let position = 0;
546
586
  const length = chunk.length;
547
- while (position + 512 <= length &&
548
- !this[ABORTED] &&
549
- !this[SAW_EOF]) {
587
+ while (position + 512 <= length && !this[ABORTED] && !this[SAW_EOF]) {
550
588
  switch (this[STATE]) {
551
589
  case 'begin':
552
590
  case 'header':
@@ -567,15 +605,10 @@ export class Parser extends EE {
567
605
  }
568
606
  }
569
607
  if (position < length) {
570
- if (this[BUFFER]) {
571
- this[BUFFER] = Buffer.concat([
572
- chunk.subarray(position),
573
- this[BUFFER],
574
- ]);
575
- }
576
- else {
577
- this[BUFFER] = chunk.subarray(position);
578
- }
608
+ this[BUFFER] =
609
+ this[BUFFER] ?
610
+ Buffer.concat([chunk.subarray(position), this[BUFFER]])
611
+ : chunk.subarray(position);
579
612
  }
580
613
  }
581
614
  end(chunk, encoding, cb) {
@@ -596,8 +629,10 @@ export class Parser extends EE {
596
629
  if (!this[ABORTED]) {
597
630
  if (this[UNZIP]) {
598
631
  /* c8 ignore start */
599
- if (chunk)
632
+ if (chunk) {
633
+ this[COMPRESSEDBYTESREAD] += chunk.length;
600
634
  this[UNZIP].write(chunk);
635
+ }
601
636
  /* c8 ignore stop */
602
637
  this[UNZIP].end();
603
638
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parse.ts"],"names":[],"mappings":"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","sourcesContent":["// this[BUFFER] is the remainder of a chunk if we're waiting for\n// the full 512 bytes of a header to come in. We will Buffer.concat()\n// it to the next write(), which is a mem copy, but a small one.\n//\n// this[QUEUE] is a list of entries that haven't been emitted\n// yet this can only get filled up if the user keeps write()ing after\n// a write() returns false, or does a write() with more than one entry\n//\n// We don't buffer chunks, we always parse them and either create an\n// entry, or push it into the active entry. The ReadEntry class knows\n// to throw data away if .ignore=true\n//\n// Shift entry off the buffer when it emits 'end', and emit 'entry' for\n// the next one in the list.\n//\n// At any time, we're pushing body chunks into the entry at WRITEENTRY,\n// and waiting for 'end' on the entry at READENTRY\n//\n// ignored entries get .resume() called on them straight away\n\nimport { EventEmitter as EE } from 'events'\nimport { BrotliDecompress, Unzip, ZstdDecompress } from 'minizlib'\nimport { Header } from './header.js'\nimport { TarOptions } from './options.js'\nimport { Pax } from './pax.js'\nimport { ReadEntry } from './read-entry.js'\nimport {\n warnMethod,\n type WarnData,\n type Warner,\n} from './warn-method.js'\n\nconst maxMetaEntrySize = 1024 * 1024\nconst gzipHeader = Buffer.from([0x1f, 0x8b])\nconst zstdHeader = Buffer.from([0x28, 0xb5, 0x2f, 0xfd])\nconst ZIP_HEADER_LEN = Math.max(gzipHeader.length, zstdHeader.length)\n\nconst STATE = Symbol('state')\nconst WRITEENTRY = Symbol('writeEntry')\nconst READENTRY = Symbol('readEntry')\nconst NEXTENTRY = Symbol('nextEntry')\nconst PROCESSENTRY = Symbol('processEntry')\nconst EX = Symbol('extendedHeader')\nconst GEX = Symbol('globalExtendedHeader')\nconst META = Symbol('meta')\nconst EMITMETA = Symbol('emitMeta')\nconst BUFFER = Symbol('buffer')\nconst QUEUE = Symbol('queue')\nconst ENDED = Symbol('ended')\nconst EMITTEDEND = Symbol('emittedEnd')\nconst EMIT = Symbol('emit')\nconst UNZIP = Symbol('unzip')\nconst CONSUMECHUNK = Symbol('consumeChunk')\nconst CONSUMECHUNKSUB = Symbol('consumeChunkSub')\nconst CONSUMEBODY = Symbol('consumeBody')\nconst CONSUMEMETA = Symbol('consumeMeta')\nconst CONSUMEHEADER = Symbol('consumeHeader')\nconst CONSUMING = Symbol('consuming')\nconst BUFFERCONCAT = Symbol('bufferConcat')\nconst MAYBEEND = Symbol('maybeEnd')\nconst WRITING = Symbol('writing')\nconst ABORTED = Symbol('aborted')\nconst DONE = Symbol('onDone')\nconst SAW_VALID_ENTRY = Symbol('sawValidEntry')\nconst SAW_NULL_BLOCK = Symbol('sawNullBlock')\nconst SAW_EOF = Symbol('sawEOF')\nconst CLOSESTREAM = Symbol('closeStream')\n\nconst noop = () => true\n\nexport type State = 'begin' | 'header' | 'ignore' | 'meta' | 'body'\n\nexport class Parser extends EE implements Warner {\n file: string\n strict: boolean\n maxMetaEntrySize: number\n filter: Exclude<TarOptions['filter'], undefined>\n brotli?: TarOptions['brotli']\n zstd?: TarOptions['zstd']\n\n writable: true = true\n readable: false = false;\n\n [QUEUE]: (ReadEntry | [string | symbol, any, any])[] = [];\n [BUFFER]?: Buffer;\n [READENTRY]?: ReadEntry;\n [WRITEENTRY]?: ReadEntry;\n [STATE]: State = 'begin';\n [META]: string = '';\n [EX]?: Pax;\n [GEX]?: Pax;\n [ENDED]: boolean = false;\n [UNZIP]?: false | Unzip | BrotliDecompress | ZstdDecompress;\n [ABORTED]: boolean = false;\n [SAW_VALID_ENTRY]?: boolean;\n [SAW_NULL_BLOCK]: boolean = false;\n [SAW_EOF]: boolean = false;\n [WRITING]: boolean = false;\n [CONSUMING]: boolean = false;\n [EMITTEDEND]: boolean = false\n\n constructor(opt: TarOptions = {}) {\n super()\n\n this.file = opt.file || ''\n\n // these BADARCHIVE errors can't be detected early. listen on DONE.\n this.on(DONE, () => {\n if (\n this[STATE] === 'begin' ||\n this[SAW_VALID_ENTRY] === false\n ) {\n // either less than 1 block of data, or all entries were invalid.\n // Either way, probably not even a tarball.\n this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format')\n }\n })\n\n if (opt.ondone) {\n this.on(DONE, opt.ondone)\n } else {\n this.on(DONE, () => {\n this.emit('prefinish')\n this.emit('finish')\n this.emit('end')\n })\n }\n\n this.strict = !!opt.strict\n this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize\n this.filter = typeof opt.filter === 'function' ? opt.filter : noop\n // Unlike gzip, brotli doesn't have any magic bytes to identify it\n // Users need to explicitly tell us they're extracting a brotli file\n // Or we infer from the file extension\n const isTBR =\n opt.file &&\n (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr'))\n // if it's a tbr file it MIGHT be brotli, but we don't know until\n // we look at it and verify it's not a valid tar file.\n this.brotli =\n !(opt.gzip || opt.zstd) && opt.brotli !== undefined ? opt.brotli\n : isTBR ? undefined\n : false\n\n // zstd has magic bytes to identify it, but we also support explicit options\n // and file extension detection\n const isTZST =\n opt.file &&\n (opt.file.endsWith('.tar.zst') || opt.file.endsWith('.tzst'))\n this.zstd =\n !(opt.gzip || opt.brotli) && opt.zstd !== undefined ? opt.zstd\n : isTZST ? true\n : undefined\n\n // have to set this so that streams are ok piping into it\n this.on('end', () => this[CLOSESTREAM]())\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n if (typeof opt.onReadEntry === 'function') {\n this.on('entry', opt.onReadEntry)\n }\n }\n\n warn(\n code: string,\n message: string | Error,\n data: WarnData = {},\n ): void {\n warnMethod(this, code, message, data)\n }\n\n [CONSUMEHEADER](chunk: Buffer, position: number) {\n if (this[SAW_VALID_ENTRY] === undefined) {\n this[SAW_VALID_ENTRY] = false\n }\n let header\n try {\n header = new Header(chunk, position, this[EX], this[GEX])\n } catch (er) {\n return this.warn('TAR_ENTRY_INVALID', er as Error)\n }\n\n if (header.nullBlock) {\n if (this[SAW_NULL_BLOCK]) {\n this[SAW_EOF] = true\n // ending an archive with no entries. pointless, but legal.\n if (this[STATE] === 'begin') {\n this[STATE] = 'header'\n }\n this[EMIT]('eof')\n } else {\n this[SAW_NULL_BLOCK] = true\n this[EMIT]('nullBlock')\n }\n } else {\n this[SAW_NULL_BLOCK] = false\n if (!header.cksumValid) {\n this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header })\n } else if (!header.path) {\n this.warn('TAR_ENTRY_INVALID', 'path is required', { header })\n } else {\n const type = header.type\n if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) {\n this.warn('TAR_ENTRY_INVALID', 'linkpath required', {\n header,\n })\n } else if (\n !/^(Symbolic)?Link$/.test(type) &&\n !/^(Global)?ExtendedHeader$/.test(type) &&\n header.linkpath\n ) {\n this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', {\n header,\n })\n } else {\n const entry = (this[WRITEENTRY] = new ReadEntry(\n header,\n this[EX],\n this[GEX],\n ))\n\n // we do this for meta & ignored entries as well, because they\n // are still valid tar, or else we wouldn't know to ignore them\n if (!this[SAW_VALID_ENTRY]) {\n if (entry.remain) {\n // this might be the one!\n const onend = () => {\n if (!entry.invalid) {\n this[SAW_VALID_ENTRY] = true\n }\n }\n entry.on('end', onend)\n } else {\n this[SAW_VALID_ENTRY] = true\n }\n }\n\n if (entry.meta) {\n if (entry.size > this.maxMetaEntrySize) {\n entry.ignore = true\n this[EMIT]('ignoredEntry', entry)\n this[STATE] = 'ignore'\n entry.resume()\n } else if (entry.size > 0) {\n this[META] = ''\n entry.on('data', c => (this[META] += c))\n this[STATE] = 'meta'\n }\n } else {\n this[EX] = undefined\n entry.ignore =\n entry.ignore || !this.filter(entry.path, entry)\n\n if (entry.ignore) {\n // probably valid, just not something we care about\n this[EMIT]('ignoredEntry', entry)\n this[STATE] = entry.remain ? 'ignore' : 'header'\n entry.resume()\n } else {\n if (entry.remain) {\n this[STATE] = 'body'\n } else {\n this[STATE] = 'header'\n entry.end()\n }\n\n if (!this[READENTRY]) {\n this[QUEUE].push(entry)\n this[NEXTENTRY]()\n } else {\n this[QUEUE].push(entry)\n }\n }\n }\n }\n }\n }\n }\n\n [CLOSESTREAM]() {\n queueMicrotask(() => this.emit('close'))\n }\n\n [PROCESSENTRY](entry?: ReadEntry | [string | symbol, any, any]) {\n let go = true\n\n if (!entry) {\n this[READENTRY] = undefined\n go = false\n } else if (Array.isArray(entry)) {\n const [ev, ...args]: [string | symbol, any, any] = entry\n this.emit(ev, ...args)\n } else {\n this[READENTRY] = entry\n this.emit('entry', entry)\n if (!entry.emittedEnd) {\n entry.on('end', () => this[NEXTENTRY]())\n go = false\n }\n }\n\n return go\n }\n\n [NEXTENTRY]() {\n do {} while (this[PROCESSENTRY](this[QUEUE].shift()))\n\n if (!this[QUEUE].length) {\n // At this point, there's nothing in the queue, but we may have an\n // entry which is being consumed (readEntry).\n // If we don't, then we definitely can handle more data.\n // If we do, and either it's flowing, or it has never had any data\n // written to it, then it needs more.\n // The only other possibility is that it has returned false from a\n // write() call, so we wait for the next drain to continue.\n const re = this[READENTRY]\n const drainNow = !re || re.flowing || re.size === re.remain\n if (drainNow) {\n if (!this[WRITING]) {\n this.emit('drain')\n }\n } else {\n re.once('drain', () => this.emit('drain'))\n }\n }\n }\n\n [CONSUMEBODY](chunk: Buffer, position: number) {\n // write up to but no more than writeEntry.blockRemain\n const entry = this[WRITEENTRY]\n /* c8 ignore start */\n if (!entry) {\n throw new Error('attempt to consume body without entry??')\n }\n const br = entry.blockRemain ?? 0\n /* c8 ignore stop */\n const c =\n br >= chunk.length && position === 0 ?\n chunk\n : chunk.subarray(position, position + br)\n\n entry.write(c)\n\n if (!entry.blockRemain) {\n this[STATE] = 'header'\n this[WRITEENTRY] = undefined\n entry.end()\n }\n\n return c.length\n }\n\n [CONSUMEMETA](chunk: Buffer, position: number) {\n const entry = this[WRITEENTRY]\n const ret = this[CONSUMEBODY](chunk, position)\n\n // if we finished, then the entry is reset\n if (!this[WRITEENTRY] && entry) {\n this[EMITMETA](entry)\n }\n\n return ret\n }\n\n [EMIT](ev: string | symbol, data?: any, extra?: any) {\n if (!this[QUEUE].length && !this[READENTRY]) {\n this.emit(ev, data, extra)\n } else {\n this[QUEUE].push([ev, data, extra])\n }\n }\n\n [EMITMETA](entry: ReadEntry) {\n this[EMIT]('meta', this[META])\n switch (entry.type) {\n case 'ExtendedHeader':\n case 'OldExtendedHeader':\n this[EX] = Pax.parse(this[META], this[EX], false)\n break\n\n case 'GlobalExtendedHeader':\n this[GEX] = Pax.parse(this[META], this[GEX], true)\n break\n\n case 'NextFileHasLongPath':\n case 'OldGnuLongPath': {\n const ex = this[EX] ?? Object.create(null)\n this[EX] = ex\n ex.path = this[META].replace(/\\0.*/, '')\n break\n }\n\n case 'NextFileHasLongLinkpath': {\n const ex = this[EX] || Object.create(null)\n this[EX] = ex\n ex.linkpath = this[META].replace(/\\0.*/, '')\n break\n }\n\n /* c8 ignore start */\n default:\n throw new Error('unknown meta: ' + entry.type)\n /* c8 ignore stop */\n }\n }\n\n abort(error: Error) {\n this[ABORTED] = true\n this.emit('abort', error)\n // always throws, even in non-strict mode\n this.warn('TAR_ABORT', error, { recoverable: false })\n }\n\n write(\n buffer: Uint8Array | string,\n cb?: (err?: Error | null) => void,\n ): boolean\n write(\n str: string,\n encoding?: BufferEncoding,\n cb?: (err?: Error | null) => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => any),\n cb?: () => any,\n ): boolean {\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n /* c8 ignore next */\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n if (this[ABORTED]) {\n /* c8 ignore next */\n cb?.()\n return false\n }\n\n // first write, might be gzipped, zstd, or brotli compressed\n const needSniff =\n this[UNZIP] === undefined ||\n (this.brotli === undefined && this[UNZIP] === false)\n if (needSniff && chunk) {\n if (this[BUFFER]) {\n chunk = Buffer.concat([this[BUFFER], chunk])\n this[BUFFER] = undefined\n }\n if (chunk.length < ZIP_HEADER_LEN) {\n this[BUFFER] = chunk\n /* c8 ignore next */\n cb?.()\n return true\n }\n\n // look for gzip header\n for (\n let i = 0;\n this[UNZIP] === undefined && i < gzipHeader.length;\n i++\n ) {\n if (chunk[i] !== gzipHeader[i]) {\n this[UNZIP] = false\n }\n }\n\n // look for zstd header if gzip header not found\n let isZstd = false\n if (this[UNZIP] === false && this.zstd !== false) {\n isZstd = true\n for (let i = 0; i < zstdHeader.length; i++) {\n if (chunk[i] !== zstdHeader[i]) {\n isZstd = false\n break\n }\n }\n }\n\n const maybeBrotli = this.brotli === undefined && !isZstd\n if (this[UNZIP] === false && maybeBrotli) {\n // read the first header to see if it's a valid tar file. If so,\n // we can safely assume that it's not actually brotli, despite the\n // .tbr or .tar.br file extension.\n // if we ended before getting a full chunk, yes, def brotli\n if (chunk.length < 512) {\n if (this[ENDED]) {\n this.brotli = true\n } else {\n this[BUFFER] = chunk\n /* c8 ignore next */\n cb?.()\n return true\n }\n } else {\n // if it's tar, it's pretty reliably not brotli, chances of\n // that happening are astronomical.\n try {\n new Header(chunk.subarray(0, 512))\n this.brotli = false\n } catch (_) {\n this.brotli = true\n }\n }\n }\n\n if (\n this[UNZIP] === undefined ||\n (this[UNZIP] === false && (this.brotli || isZstd))\n ) {\n const ended = this[ENDED]\n this[ENDED] = false\n this[UNZIP] =\n this[UNZIP] === undefined ? new Unzip({})\n : isZstd ? new ZstdDecompress({})\n : new BrotliDecompress({})\n this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk))\n this[UNZIP].on('error', er => this.abort(er as Error))\n this[UNZIP].on('end', () => {\n this[ENDED] = true\n this[CONSUMECHUNK]()\n })\n this[WRITING] = true\n const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk)\n this[WRITING] = false\n cb?.()\n return ret\n }\n }\n\n this[WRITING] = true\n if (this[UNZIP]) {\n this[UNZIP].write(chunk)\n } else {\n this[CONSUMECHUNK](chunk)\n }\n this[WRITING] = false\n\n // return false if there's a queue, or if the current entry isn't flowing\n const ret =\n this[QUEUE].length ? false\n : this[READENTRY] ? this[READENTRY].flowing\n : true\n\n // if we have no queue, then that means a clogged READENTRY\n if (!ret && !this[QUEUE].length) {\n this[READENTRY]?.once('drain', () => this.emit('drain'))\n }\n\n /* c8 ignore next */\n cb?.()\n return ret\n }\n\n [BUFFERCONCAT](c: Buffer) {\n if (c && !this[ABORTED]) {\n this[BUFFER] =\n this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c\n }\n }\n\n [MAYBEEND]() {\n if (\n this[ENDED] &&\n !this[EMITTEDEND] &&\n !this[ABORTED] &&\n !this[CONSUMING]\n ) {\n this[EMITTEDEND] = true\n const entry = this[WRITEENTRY]\n if (entry && entry.blockRemain) {\n // truncated, likely a damaged file\n const have = this[BUFFER] ? this[BUFFER].length : 0\n this.warn(\n 'TAR_BAD_ARCHIVE',\n `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`,\n { entry },\n )\n if (this[BUFFER]) {\n entry.write(this[BUFFER])\n }\n entry.end()\n }\n this[EMIT](DONE)\n }\n }\n\n [CONSUMECHUNK](chunk?: Buffer) {\n if (this[CONSUMING] && chunk) {\n this[BUFFERCONCAT](chunk)\n } else if (!chunk && !this[BUFFER]) {\n this[MAYBEEND]()\n } else if (chunk) {\n this[CONSUMING] = true\n if (this[BUFFER]) {\n this[BUFFERCONCAT](chunk)\n const c = this[BUFFER]\n this[BUFFER] = undefined\n this[CONSUMECHUNKSUB](c)\n } else {\n this[CONSUMECHUNKSUB](chunk)\n }\n\n while (\n this[BUFFER] &&\n (this[BUFFER] as Buffer)?.length >= 512 &&\n !this[ABORTED] &&\n !this[SAW_EOF]\n ) {\n const c = this[BUFFER]\n this[BUFFER] = undefined\n this[CONSUMECHUNKSUB](c)\n }\n this[CONSUMING] = false\n }\n\n if (!this[BUFFER] || this[ENDED]) {\n this[MAYBEEND]()\n }\n }\n\n [CONSUMECHUNKSUB](chunk: Buffer) {\n // we know that we are in CONSUMING mode, so anything written goes into\n // the buffer. Advance the position and put any remainder in the buffer.\n let position = 0\n const length = chunk.length\n while (\n position + 512 <= length &&\n !this[ABORTED] &&\n !this[SAW_EOF]\n ) {\n switch (this[STATE]) {\n case 'begin':\n case 'header':\n this[CONSUMEHEADER](chunk, position)\n position += 512\n break\n\n case 'ignore':\n case 'body':\n position += this[CONSUMEBODY](chunk, position)\n break\n\n case 'meta':\n position += this[CONSUMEMETA](chunk, position)\n break\n\n /* c8 ignore start */\n default:\n throw new Error('invalid state: ' + this[STATE])\n /* c8 ignore stop */\n }\n }\n\n if (position < length) {\n if (this[BUFFER]) {\n this[BUFFER] = Buffer.concat([\n chunk.subarray(position),\n this[BUFFER],\n ])\n } else {\n this[BUFFER] = chunk.subarray(position)\n }\n }\n }\n\n end(cb?: () => void): this\n end(data: string | Buffer, cb?: () => void): this\n end(str: string, encoding?: BufferEncoding, cb?: () => void): this\n end(\n chunk?: string | Buffer | (() => void),\n encoding?: BufferEncoding | (() => void),\n cb?: () => void,\n ) {\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding)\n }\n if (cb) this.once('finish', cb)\n if (!this[ABORTED]) {\n if (this[UNZIP]) {\n /* c8 ignore start */\n if (chunk) this[UNZIP].write(chunk)\n /* c8 ignore stop */\n this[UNZIP].end()\n } else {\n this[ENDED] = true\n if (this.brotli === undefined || this.zstd === undefined)\n chunk = chunk || Buffer.alloc(0)\n if (chunk) this.write(chunk)\n this[MAYBEEND]()\n }\n }\n return this\n }\n}\n"]}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parse.ts"],"names":[],"mappings":"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","sourcesContent":["// this[BUFFER] is the remainder of a chunk if we're waiting for\n// the full 512 bytes of a header to come in. We will Buffer.concat()\n// it to the next write(), which is a mem copy, but a small one.\n//\n// this[QUEUE] is a list of entries that haven't been emitted\n// yet this can only get filled up if the user keeps write()ing after\n// a write() returns false, or does a write() with more than one entry\n//\n// We don't buffer chunks, we always parse them and either create an\n// entry, or push it into the active entry. The ReadEntry class knows\n// to throw data away if .ignore=true\n//\n// Shift entry off the buffer when it emits 'end', and emit 'entry' for\n// the next one in the list.\n//\n// At any time, we're pushing body chunks into the entry at WRITEENTRY,\n// and waiting for 'end' on the entry at READENTRY\n//\n// ignored entries get .resume() called on them straight away\n\nimport { EventEmitter as EE } from 'events'\nimport { BrotliDecompress, Unzip, ZstdDecompress } from 'minizlib'\nimport { Header } from './header.js'\nimport type { TarOptions } from './options.js'\nimport { Pax } from './pax.js'\nimport { ReadEntry } from './read-entry.js'\nimport { warnMethod, type WarnData, type Warner } from './warn-method.js'\n\nconst maxMetaEntrySize = 1024 * 1024\nconst gzipHeader = Buffer.from([0x1f, 0x8b])\nconst zstdHeader = Buffer.from([0x28, 0xb5, 0x2f, 0xfd])\nconst ZIP_HEADER_LEN = Math.max(gzipHeader.length, zstdHeader.length)\n\nconst STATE = Symbol('state')\nconst WRITEENTRY = Symbol('writeEntry')\nconst READENTRY = Symbol('readEntry')\nconst NEXTENTRY = Symbol('nextEntry')\nconst PROCESSENTRY = Symbol('processEntry')\nconst EX = Symbol('extendedHeader')\nconst GEX = Symbol('globalExtendedHeader')\nconst META = Symbol('meta')\nconst EMITMETA = Symbol('emitMeta')\nconst BUFFER = Symbol('buffer')\nconst QUEUE = Symbol('queue')\nconst ENDED = Symbol('ended')\nconst EMITTEDEND = Symbol('emittedEnd')\nconst EMIT = Symbol('emit')\nconst UNZIP = Symbol('unzip')\nconst CONSUMECHUNK = Symbol('consumeChunk')\nconst CONSUMECHUNKSUB = Symbol('consumeChunkSub')\nconst CONSUMEBODY = Symbol('consumeBody')\nconst CONSUMEMETA = Symbol('consumeMeta')\nconst CONSUMEHEADER = Symbol('consumeHeader')\nconst CONSUMING = Symbol('consuming')\nconst BUFFERCONCAT = Symbol('bufferConcat')\nconst MAYBEEND = Symbol('maybeEnd')\nconst WRITING = Symbol('writing')\nconst ABORTED = Symbol('aborted')\nconst DONE = Symbol('onDone')\nconst SAW_VALID_ENTRY = Symbol('sawValidEntry')\nconst SAW_NULL_BLOCK = Symbol('sawNullBlock')\nconst SAW_EOF = Symbol('sawEOF')\nconst CLOSESTREAM = Symbol('closeStream')\nconst MAX_DECOMPRESSION_RATIO = 1000\nconst COMPRESSEDBYTESREAD = Symbol('compressedBytesRead')\nconst DECOMPRESSEDBYTESREAD = Symbol('decompressedBytesRead')\nconst CHECKDECOMPRESSIONRATIO = Symbol('checkDecompressionRatio')\n\nconst noop = () => true\n\nexport type State = 'begin' | 'header' | 'ignore' | 'meta' | 'body'\n\nexport class Parser extends EE implements Warner {\n file: string\n strict: boolean\n maxMetaEntrySize: number\n filter: Exclude<TarOptions['filter'], undefined>\n brotli?: TarOptions['brotli']\n zstd?: TarOptions['zstd']\n maxDecompressionRatio: number\n\n writable: true = true\n readable: false = false;\n\n [QUEUE]: (ReadEntry | [string | symbol, unknown, unknown])[] = [];\n [BUFFER]?: Buffer;\n [READENTRY]?: ReadEntry;\n [WRITEENTRY]?: ReadEntry;\n [STATE]: State = 'begin';\n [META]: string = '';\n [EX]?: Pax;\n [GEX]?: Pax;\n [ENDED]: boolean = false;\n [UNZIP]?: false | Unzip | BrotliDecompress | ZstdDecompress;\n [ABORTED]: boolean = false;\n [SAW_VALID_ENTRY]?: boolean;\n [SAW_NULL_BLOCK]: boolean = false;\n [SAW_EOF]: boolean = false;\n [WRITING]: boolean = false;\n [CONSUMING]: boolean = false;\n [EMITTEDEND]: boolean = false;\n [COMPRESSEDBYTESREAD]: number = 0;\n [DECOMPRESSEDBYTESREAD]: number = 0\n\n constructor(opt: TarOptions = {}) {\n super()\n\n this.file = opt.file || ''\n\n // these BADARCHIVE errors can't be detected early. listen on DONE.\n this.on(DONE, () => {\n if (this[STATE] === 'begin' || this[SAW_VALID_ENTRY] === false) {\n // either less than 1 block of data, or all entries were invalid.\n // Either way, probably not even a tarball.\n this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format')\n }\n })\n\n if (opt.ondone) {\n this.on(DONE, opt.ondone)\n } else {\n this.on(DONE, () => {\n this.emit('prefinish')\n this.emit('finish')\n this.emit('end')\n })\n }\n\n this.strict = !!opt.strict\n this.maxDecompressionRatio =\n typeof opt.maxDecompressionRatio === 'number' ?\n opt.maxDecompressionRatio\n : MAX_DECOMPRESSION_RATIO\n this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize\n this.filter = typeof opt.filter === 'function' ? opt.filter : noop\n // Unlike gzip, brotli doesn't have any magic bytes to identify it\n // Users need to explicitly tell us they're extracting a brotli file\n // Or we infer from the file extension\n const isTBR =\n opt.file &&\n (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr'))\n // if it's a tbr file it MIGHT be brotli, but we don't know until\n // we look at it and verify it's not a valid tar file.\n this.brotli =\n !(opt.gzip || opt.zstd) && opt.brotli !== undefined ? opt.brotli\n : isTBR ? undefined\n : false\n\n // zstd has magic bytes to identify it, but we also support explicit options\n // and file extension detection\n const isTZST =\n opt.file &&\n (opt.file.endsWith('.tar.zst') || opt.file.endsWith('.tzst'))\n this.zstd =\n !(opt.gzip || opt.brotli) && opt.zstd !== undefined ? opt.zstd\n : isTZST ? true\n : undefined\n\n // have to set this so that streams are ok piping into it\n this.on('end', () => this[CLOSESTREAM]())\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n if (typeof opt.onReadEntry === 'function') {\n this.on('entry', opt.onReadEntry)\n }\n }\n\n warn(code: string, message: string | Error, data: WarnData = {}): void {\n warnMethod(this, code, message, data)\n }\n\n [CONSUMEHEADER](chunk: Buffer, position: number) {\n if (this[SAW_VALID_ENTRY] === undefined) {\n this[SAW_VALID_ENTRY] = false\n }\n let header\n try {\n header = new Header(chunk, position, this[EX], this[GEX])\n } catch (er) {\n return this.warn('TAR_ENTRY_INVALID', er as Error)\n }\n\n if (header.nullBlock) {\n if (this[SAW_NULL_BLOCK]) {\n this[SAW_EOF] = true\n // ending an archive with no entries. pointless, but legal.\n if (this[STATE] === 'begin') {\n this[STATE] = 'header'\n }\n this[EMIT]('eof')\n } else {\n this[SAW_NULL_BLOCK] = true\n this[EMIT]('nullBlock')\n }\n } else {\n this[SAW_NULL_BLOCK] = false\n if (!header.cksumValid) {\n this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header })\n } else if (!header.path) {\n this.warn('TAR_ENTRY_INVALID', 'path is required', { header })\n } else {\n const type = header.type\n if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) {\n this.warn('TAR_ENTRY_INVALID', 'linkpath required', {\n header,\n })\n } else if (\n !/^(Symbolic)?Link$/.test(type) &&\n !/^(Global)?ExtendedHeader$/.test(type) &&\n header.linkpath\n ) {\n this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', {\n header,\n })\n } else {\n const entry = (this[WRITEENTRY] = new ReadEntry(\n header,\n this[EX],\n this[GEX],\n ))\n\n // we do this for meta & ignored entries as well, because they\n // are still valid tar, or else we wouldn't know to ignore them\n if (!this[SAW_VALID_ENTRY]) {\n if (entry.remain) {\n // this might be the one!\n const onend = () => {\n if (!entry.invalid) {\n this[SAW_VALID_ENTRY] = true\n }\n }\n entry.on('end', onend)\n } else {\n this[SAW_VALID_ENTRY] = true\n }\n }\n\n if (entry.meta) {\n if (entry.size > this.maxMetaEntrySize) {\n entry.ignore = true\n this[EMIT]('ignoredEntry', entry)\n this[STATE] = 'ignore'\n entry.resume()\n } else if (entry.size > 0) {\n this[META] = ''\n entry.on('data', c => (this[META] += c))\n this[STATE] = 'meta'\n }\n } else {\n this[EX] = undefined\n entry.ignore = entry.ignore || !this.filter(entry.path, entry)\n\n if (entry.ignore) {\n // probably valid, just not something we care about\n this[EMIT]('ignoredEntry', entry)\n this[STATE] = entry.remain ? 'ignore' : 'header'\n entry.resume()\n } else {\n if (entry.remain) {\n this[STATE] = 'body'\n } else {\n this[STATE] = 'header'\n entry.end()\n }\n\n if (!this[READENTRY]) {\n this[QUEUE].push(entry)\n this[NEXTENTRY]()\n } else {\n this[QUEUE].push(entry)\n }\n }\n }\n }\n }\n }\n }\n\n [CLOSESTREAM]() {\n queueMicrotask(() => this.emit('close'))\n }\n\n [PROCESSENTRY](entry?: ReadEntry | [string | symbol, unknown, unknown]) {\n let go = true\n\n if (!entry) {\n this[READENTRY] = undefined\n go = false\n } else if (Array.isArray(entry)) {\n const [ev, ...args]: [string | symbol, unknown, unknown] = entry\n this.emit(ev, ...args)\n } else {\n this[READENTRY] = entry\n this.emit('entry', entry)\n if (!entry.emittedEnd) {\n entry.on('end', () => this[NEXTENTRY]())\n go = false\n }\n }\n\n return go\n }\n\n [NEXTENTRY]() {\n do {} while (this[PROCESSENTRY](this[QUEUE].shift()))\n\n if (this[QUEUE].length === 0) {\n // At this point, there's nothing in the queue, but we may have an\n // entry which is being consumed (readEntry).\n // If we don't, then we definitely can handle more data.\n // If we do, and either it's flowing, or it has never had any data\n // written to it, then it needs more.\n // The only other possibility is that it has returned false from a\n // write() call, so we wait for the next drain to continue.\n const re = this[READENTRY]\n const drainNow = !re || re.flowing || re.size === re.remain\n if (drainNow) {\n if (!this[WRITING]) {\n this.emit('drain')\n }\n } else {\n re.once('drain', () => this.emit('drain'))\n }\n }\n }\n\n [CONSUMEBODY](chunk: Buffer, position: number) {\n // write up to but no more than writeEntry.blockRemain\n const entry = this[WRITEENTRY]\n /* c8 ignore start */\n if (!entry) {\n throw new Error('attempt to consume body without entry??')\n }\n const br = entry.blockRemain ?? 0\n /* c8 ignore stop */\n const c =\n br >= chunk.length && position === 0 ?\n chunk\n : chunk.subarray(position, position + br)\n\n entry.write(c)\n\n if (!entry.blockRemain) {\n this[STATE] = 'header'\n this[WRITEENTRY] = undefined\n entry.end()\n }\n\n return c.length\n }\n\n [CONSUMEMETA](chunk: Buffer, position: number) {\n const entry = this[WRITEENTRY]\n const ret = this[CONSUMEBODY](chunk, position)\n\n // if we finished, then the entry is reset\n if (!this[WRITEENTRY] && entry) {\n this[EMITMETA](entry)\n }\n\n return ret\n }\n\n [EMIT](ev: string | symbol, data?: unknown, extra?: unknown) {\n if (this[QUEUE].length === 0 && !this[READENTRY]) {\n this.emit(ev, data, extra)\n } else {\n this[QUEUE].push([ev, data, extra])\n }\n }\n\n [EMITMETA](entry: ReadEntry) {\n this[EMIT]('meta', this[META])\n switch (entry.type) {\n case 'ExtendedHeader':\n case 'OldExtendedHeader':\n this[EX] = Pax.parse(this[META], this[EX], false)\n break\n\n case 'GlobalExtendedHeader':\n this[GEX] = Pax.parse(this[META], this[GEX], true)\n break\n\n case 'NextFileHasLongPath':\n case 'OldGnuLongPath': {\n const ex: Pax = this[EX] ?? Object.create(null)\n this[EX] = ex\n ex.path = this[META].replace(/\\0.*/, '')\n break\n }\n\n case 'NextFileHasLongLinkpath': {\n const ex: Pax = this[EX] || Object.create(null)\n this[EX] = ex\n ex.linkpath = this[META].replace(/\\0.*/, '')\n break\n }\n\n /* c8 ignore start */\n default:\n throw new Error('unknown meta: ' + entry.type)\n /* c8 ignore stop */\n }\n }\n\n abort(error: Error) {\n if (this[ABORTED]) {\n return\n }\n if (this[UNZIP]) {\n // fully nerf the decompressor and close its underlying binding\n const u = this[UNZIP]\n /* c8 ignore start */\n u.write = () => true\n u.end = () => u\n u.emit = () => false\n /* c8 ignore stop */\n u.destroy?.()\n }\n this[ABORTED] = true\n this.emit('abort', error)\n // always throws, even in non-strict mode\n this.warn('TAR_ABORT', error, { recoverable: false })\n }\n\n [CHECKDECOMPRESSIONRATIO](chunk: Buffer) {\n this[DECOMPRESSEDBYTESREAD] += chunk.length\n const ratio = this[DECOMPRESSEDBYTESREAD] / this[COMPRESSEDBYTESREAD]\n if (ratio > this.maxDecompressionRatio) {\n this.abort(\n new Error(\n `max decompression ratio exceeded: ${ratio.toFixed(2)} > ${\n this.maxDecompressionRatio\n }`,\n ),\n )\n return false\n }\n return true\n }\n\n write(\n buffer: Uint8Array | string,\n cb?: (err?: Error | null) => void,\n ): boolean\n write(\n str: string,\n encoding?: BufferEncoding,\n cb?: (err?: Error | null) => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => unknown),\n cb?: () => unknown,\n ): boolean {\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n /* c8 ignore next */\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n if (this[ABORTED]) {\n /* c8 ignore next */\n cb?.()\n return false\n }\n\n // first write, might be gzipped, zstd, or brotli compressed\n const needSniff =\n this[UNZIP] === undefined ||\n (this.brotli === undefined && this[UNZIP] === false)\n if (needSniff && chunk) {\n if (this[BUFFER]) {\n chunk = Buffer.concat([this[BUFFER], chunk])\n this[BUFFER] = undefined\n }\n if (chunk.length < ZIP_HEADER_LEN) {\n this[BUFFER] = chunk\n /* c8 ignore next */\n cb?.()\n return true\n }\n\n // look for gzip header\n for (\n let i = 0;\n this[UNZIP] === undefined && i < gzipHeader.length;\n i++\n ) {\n if (chunk[i] !== gzipHeader[i]) {\n this[UNZIP] = false\n }\n }\n\n // look for zstd header if gzip header not found\n let isZstd = false\n if (this[UNZIP] === false && this.zstd !== false) {\n isZstd = true\n for (let i = 0; i < zstdHeader.length; i++) {\n if (chunk[i] !== zstdHeader[i]) {\n isZstd = false\n break\n }\n }\n }\n\n const maybeBrotli = this.brotli === undefined && !isZstd\n if (this[UNZIP] === false && maybeBrotli) {\n // read the first header to see if it's a valid tar file. If so,\n // we can safely assume that it's not actually brotli, despite the\n // .tbr or .tar.br file extension.\n // if we ended before getting a full chunk, yes, def brotli\n if (chunk.length < 512) {\n if (this[ENDED]) {\n this.brotli = true\n } else {\n this[BUFFER] = chunk\n /* c8 ignore next */\n cb?.()\n return true\n }\n } else {\n // if it's tar, it's pretty reliably not brotli, chances of\n // that happening are astronomical.\n try {\n new Header(chunk.subarray(0, 512))\n this.brotli = false\n } catch (_) {\n this.brotli = true\n }\n }\n }\n\n if (\n this[UNZIP] === undefined ||\n (this[UNZIP] === false && (this.brotli || isZstd))\n ) {\n const ended = this[ENDED]\n this[ENDED] = false\n this[UNZIP] =\n this[UNZIP] === undefined ? new Unzip({})\n : isZstd ? new ZstdDecompress({})\n : new BrotliDecompress({})\n this[UNZIP].on('data', chunk => {\n if (this[CHECKDECOMPRESSIONRATIO](chunk)) {\n this[CONSUMECHUNK](chunk)\n }\n })\n this[UNZIP].on('error', er => {\n if (!this[ABORTED]) {\n this.abort(er as Error)\n }\n })\n this[UNZIP].on('end', () => {\n this[ENDED] = true\n this[CONSUMECHUNK]()\n })\n this[WRITING] = true\n this[COMPRESSEDBYTESREAD] += chunk.length\n const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk)\n this[WRITING] = false\n cb?.()\n return ret\n }\n }\n\n this[WRITING] = true\n if (this[UNZIP]) {\n this[COMPRESSEDBYTESREAD] += chunk.length\n this[UNZIP].write(chunk)\n } else {\n this[CONSUMECHUNK](chunk)\n }\n this[WRITING] = false\n\n // return false if there's a queue, or if the current entry isn't flowing\n const ret =\n this[QUEUE].length > 0 ? false\n : this[READENTRY] ? this[READENTRY].flowing\n : true\n\n // if we have no queue, then that means a clogged READENTRY\n if (!ret && this[QUEUE].length === 0) {\n this[READENTRY]?.once('drain', () => this.emit('drain'))\n }\n\n /* c8 ignore next */\n cb?.()\n return ret\n }\n\n [BUFFERCONCAT](c: Buffer) {\n if (c && !this[ABORTED]) {\n this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c\n }\n }\n\n [MAYBEEND]() {\n if (\n this[ENDED] &&\n !this[EMITTEDEND] &&\n !this[ABORTED] &&\n !this[CONSUMING]\n ) {\n this[EMITTEDEND] = true\n const entry = this[WRITEENTRY]\n if (entry?.blockRemain) {\n // truncated, likely a damaged file\n const have = this[BUFFER] ? this[BUFFER].length : 0\n this.warn(\n 'TAR_BAD_ARCHIVE',\n `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`,\n { entry },\n )\n if (this[BUFFER]) {\n entry.write(this[BUFFER])\n }\n entry.end()\n }\n this[EMIT](DONE)\n }\n }\n\n [CONSUMECHUNK](chunk?: Buffer) {\n if (this[CONSUMING] && chunk) {\n this[BUFFERCONCAT](chunk)\n } else if (!chunk && !this[BUFFER]) {\n this[MAYBEEND]()\n } else if (chunk) {\n this[CONSUMING] = true\n if (this[BUFFER]) {\n this[BUFFERCONCAT](chunk)\n const c = this[BUFFER]\n this[BUFFER] = undefined\n this[CONSUMECHUNKSUB](c)\n } else {\n this[CONSUMECHUNKSUB](chunk)\n }\n\n while (\n this[BUFFER] &&\n (this[BUFFER] as Buffer)?.length >= 512 &&\n !this[ABORTED] &&\n !this[SAW_EOF]\n ) {\n const c = this[BUFFER]\n this[BUFFER] = undefined\n this[CONSUMECHUNKSUB](c)\n }\n this[CONSUMING] = false\n }\n\n if (!this[BUFFER] || this[ENDED]) {\n this[MAYBEEND]()\n }\n }\n\n [CONSUMECHUNKSUB](chunk: Buffer) {\n // we know that we are in CONSUMING mode, so anything written goes into\n // the buffer. Advance the position and put any remainder in the buffer.\n let position = 0\n const length = chunk.length\n while (position + 512 <= length && !this[ABORTED] && !this[SAW_EOF]) {\n switch (this[STATE]) {\n case 'begin':\n case 'header':\n this[CONSUMEHEADER](chunk, position)\n position += 512\n break\n\n case 'ignore':\n case 'body':\n position += this[CONSUMEBODY](chunk, position)\n break\n\n case 'meta':\n position += this[CONSUMEMETA](chunk, position)\n break\n\n /* c8 ignore start */\n default:\n throw new Error('invalid state: ' + this[STATE])\n /* c8 ignore stop */\n }\n }\n\n if (position < length) {\n this[BUFFER] =\n this[BUFFER] ?\n Buffer.concat([chunk.subarray(position), this[BUFFER]])\n : chunk.subarray(position)\n }\n }\n\n end(cb?: () => void): this\n end(data: string | Buffer, cb?: () => void): this\n end(str: string, encoding?: BufferEncoding, cb?: () => void): this\n end(\n chunk?: string | Buffer | (() => void),\n encoding?: BufferEncoding | (() => void),\n cb?: () => void,\n ) {\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding)\n }\n if (cb) this.once('finish', cb)\n if (!this[ABORTED]) {\n if (this[UNZIP]) {\n /* c8 ignore start */\n if (chunk) {\n this[COMPRESSEDBYTESREAD] += chunk.length\n this[UNZIP].write(chunk)\n }\n /* c8 ignore stop */\n this[UNZIP].end()\n } else {\n this[ENDED] = true\n if (this.brotli === undefined || this.zstd === undefined)\n chunk = chunk || Buffer.alloc(0)\n if (chunk) this.write(chunk)\n this[MAYBEEND]()\n }\n }\n return this\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"path-reservations.d.ts","sourceRoot":"","sources":["../../src/path-reservations.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;AAmBjD,qBAAa,gBAAgB;;IAY3B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO;IA8DpC,KAAK,CAAC,EAAE,EAAE,OAAO;CA8ElB"}
1
+ {"version":3,"file":"path-reservations.d.ts","sourceRoot":"","sources":["../../src/path-reservations.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;AAmBjD,qBAAa,gBAAgB;;IAY3B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO;IA8DpC,KAAK,CAAC,EAAE,EAAE,OAAO;CA8ElB"}
@@ -17,7 +17,7 @@ const getDirs = (path) => {
17
17
  .split('/')
18
18
  .slice(0, -1)
19
19
  .reduce((set, path) => {
20
- const s = set[set.length - 1];
20
+ const s = set.at(-1);
21
21
  if (s !== undefined) {
22
22
  path = join(s, path);
23
23
  }
@@ -60,7 +60,7 @@ export class PathReservations {
60
60
  this.#queues.set(dir, [new Set([fn])]);
61
61
  }
62
62
  else {
63
- const l = q[q.length - 1];
63
+ const l = q.at(-1);
64
64
  if (l instanceof Set) {
65
65
  l.add(fn);
66
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"path-reservations.js","sourceRoot":"","sources":["../../src/path-reservations.ts"],"names":[],"mappings":"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","sourcesContent":["// A path exclusive reservation system\n// reserve([list, of, paths], fn)\n// When the fn is first in line for all its paths, it\n// is called with a cb that clears the reservation.\n//\n// Used by async unpack to avoid clobbering paths in use,\n// while still allowing maximal safe parallelization.\n\nimport { join } from 'node:path'\nimport { normalizeUnicode } from './normalize-unicode.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\n\nconst platform =\n process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\nconst isWindows = platform === 'win32'\n\nexport type Reservation = {\n paths: string[]\n dirs: Set<string>\n}\n\nexport type Handler = (clear: () => void) => void\n\n// return a set of parent dirs for a given path\n// '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d']\nconst getDirs = (path: string) => {\n const dirs = path\n .split('/')\n .slice(0, -1)\n .reduce((set: string[], path) => {\n const s = set[set.length - 1]\n if (s !== undefined) {\n path = join(s, path)\n }\n set.push(path || '/')\n return set\n }, [])\n return dirs\n}\n\nexport class PathReservations {\n // path => [function or Set]\n // A Set object means a directory reservation\n // A fn is a direct reservation on that path\n #queues = new Map<string, (Handler | Set<Handler>)[]>()\n\n // fn => {paths:[path,...], dirs:[path, ...]}\n #reservations = new Map<Handler, Reservation>()\n\n // functions currently running\n #running = new Set<Handler>()\n\n reserve(paths: string[], fn: Handler) {\n paths =\n isWindows ?\n ['win32 parallelization disabled']\n : paths.map(p => {\n // don't need normPath, because we skip this entirely for windows\n return stripTrailingSlashes(join(normalizeUnicode(p)))\n })\n\n const dirs = new Set<string>(\n paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)),\n )\n this.#reservations.set(fn, { dirs, paths })\n for (const p of paths) {\n const q = this.#queues.get(p)\n if (!q) {\n this.#queues.set(p, [fn])\n } else {\n q.push(fn)\n }\n }\n for (const dir of dirs) {\n const q = this.#queues.get(dir)\n if (!q) {\n this.#queues.set(dir, [new Set([fn])])\n } else {\n const l = q[q.length - 1]\n if (l instanceof Set) {\n l.add(fn)\n } else {\n q.push(new Set([fn]))\n }\n }\n }\n return this.#run(fn)\n }\n\n // return the queues for each path the function cares about\n // fn => {paths, dirs}\n #getQueues(fn: Handler): {\n paths: Handler[][]\n dirs: (Handler | Set<Handler>)[][]\n } {\n const res = this.#reservations.get(fn)\n /* c8 ignore start */\n if (!res) {\n throw new Error('function does not have any path reservations')\n }\n /* c8 ignore stop */\n return {\n paths: res.paths.map((path: string) =>\n this.#queues.get(path),\n ) as Handler[][],\n dirs: [...res.dirs].map(path => this.#queues.get(path)) as (\n | Handler\n | Set<Handler>\n )[][],\n }\n }\n\n // check if fn is first in line for all its paths, and is\n // included in the first set for all its dir queues\n check(fn: Handler) {\n const { paths, dirs } = this.#getQueues(fn)\n return (\n paths.every(q => q && q[0] === fn) &&\n dirs.every(q => q && q[0] instanceof Set && q[0].has(fn))\n )\n }\n\n // run the function if it's first in line and not already running\n #run(fn: Handler) {\n if (this.#running.has(fn) || !this.check(fn)) {\n return false\n }\n this.#running.add(fn)\n fn(() => this.#clear(fn))\n return true\n }\n\n #clear(fn: Handler) {\n if (!this.#running.has(fn)) {\n return false\n }\n const res = this.#reservations.get(fn)\n /* c8 ignore start */\n if (!res) {\n throw new Error('invalid reservation')\n }\n /* c8 ignore stop */\n const { paths, dirs } = res\n\n const next = new Set<Handler>()\n for (const path of paths) {\n const q = this.#queues.get(path)\n /* c8 ignore start */\n if (!q || q?.[0] !== fn) {\n continue\n }\n /* c8 ignore stop */\n const q0 = q[1]\n if (!q0) {\n this.#queues.delete(path)\n continue\n }\n q.shift()\n if (typeof q0 === 'function') {\n next.add(q0)\n } else {\n for (const f of q0) {\n next.add(f)\n }\n }\n }\n\n for (const dir of dirs) {\n const q = this.#queues.get(dir)\n const q0 = q?.[0]\n /* c8 ignore next - type safety only */\n if (!q || !(q0 instanceof Set)) continue\n if (q0.size === 1 && q.length === 1) {\n this.#queues.delete(dir)\n continue\n } else if (q0.size === 1) {\n q.shift()\n // next one must be a function,\n // or else the Set would've been reused\n const n = q[0]\n if (typeof n === 'function') {\n next.add(n)\n }\n } else {\n q0.delete(fn)\n }\n }\n\n this.#running.delete(fn)\n next.forEach(fn => this.#run(fn))\n return true\n }\n}\n"]}
1
+ {"version":3,"file":"path-reservations.js","sourceRoot":"","sources":["../../src/path-reservations.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AACjC,qDAAqD;AACrD,mDAAmD;AACnD,EAAE;AACF,yDAAyD;AACzD,qDAAqD;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAElE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,QAAQ,CAAA;AAC1E,MAAM,SAAS,GAAG,QAAQ,KAAK,OAAO,CAAA;AAStC,+CAA+C;AAC/C,0DAA0D;AAC1D,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;IAC/B,MAAM,IAAI,GAAG,IAAI;SACd,KAAK,CAAC,GAAG,CAAC;SACV,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACZ,MAAM,CAAC,CAAC,GAAa,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACpB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACtB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAA;QACrB,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,OAAO,gBAAgB;IAC3B,4BAA4B;IAC5B,6CAA6C;IAC7C,4CAA4C;IAC5C,OAAO,GAAG,IAAI,GAAG,EAAsC,CAAA;IAEvD,6CAA6C;IAC7C,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAA;IAE/C,8BAA8B;IAC9B,QAAQ,GAAG,IAAI,GAAG,EAAW,CAAA;IAE7B,OAAO,CAAC,KAAe,EAAE,EAAW;QAClC,KAAK;YACH,SAAS,CAAC,CAAC;gBACT,CAAC,gCAAgC,CAAC;gBACpC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBACZ,iEAAiE;oBACjE,OAAO,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACxD,CAAC,CAAC,CAAA;QAEN,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAC/D,CAAA;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAC7B,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAC3B,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACZ,CAAC;QACH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACxC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;gBAClB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;oBACrB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACX,CAAC;qBAAM,CAAC;oBACN,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACtB,CAAC;IAED,2DAA2D;IAC3D,sBAAsB;IACtB,UAAU,CAAC,EAAW;QAIpB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACtC,qBAAqB;QACrB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QACjE,CAAC;QACD,oBAAoB;QACpB,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CACR;YAChB,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAGjD;SACN,CAAA;IACH,CAAC;IAED,yDAAyD;IACzD,mDAAmD;IACnD,KAAK,CAAC,EAAW;QACf,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QAC3C,OAAO,CACL,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAC1D,CAAA;IACH,CAAC;IAED,iEAAiE;IACjE,IAAI,CAAC,EAAW;QACd,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACrB,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAC,EAAW;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAA;QACd,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACtC,qBAAqB;QACrB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACxC,CAAC;QACD,oBAAoB;QACpB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;QAE3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAA;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAChC,qBAAqB;YACrB,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBACxB,SAAQ;YACV,CAAC;YACD,oBAAoB;YACpB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACf,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACzB,SAAQ;YACV,CAAC;YACD,CAAC,CAAC,KAAK,EAAE,CAAA;YACT,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACd,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBACnB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC/B,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACjB,uCAAuC;YACvC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC;gBAAE,SAAQ;YACxC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACxB,SAAQ;YACV,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACzB,CAAC,CAAC,KAAK,EAAE,CAAA;gBACT,+BAA+B;gBAC/B,uCAAuC;gBACvC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;gBACd,IAAI,OAAO,CAAC,KAAK,UAAU,EAAE,CAAC;oBAC5B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACb,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACf,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACxB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QACjC,OAAO,IAAI,CAAA;IACb,CAAC;CACF","sourcesContent":["// A path exclusive reservation system\n// reserve([list, of, paths], fn)\n// When the fn is first in line for all its paths, it\n// is called with a cb that clears the reservation.\n//\n// Used by async unpack to avoid clobbering paths in use,\n// while still allowing maximal safe parallelization.\n\nimport { join } from 'node:path'\nimport { normalizeUnicode } from './normalize-unicode.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\n\nconst platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\nconst isWindows = platform === 'win32'\n\nexport type Reservation = {\n paths: string[]\n dirs: Set<string>\n}\n\nexport type Handler = (clear: () => void) => void\n\n// return a set of parent dirs for a given path\n// '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d']\nconst getDirs = (path: string) => {\n const dirs = path\n .split('/')\n .slice(0, -1)\n .reduce((set: string[], path) => {\n const s = set.at(-1)\n if (s !== undefined) {\n path = join(s, path)\n }\n set.push(path || '/')\n return set\n }, [])\n return dirs\n}\n\nexport class PathReservations {\n // path => [function or Set]\n // A Set object means a directory reservation\n // A fn is a direct reservation on that path\n #queues = new Map<string, (Handler | Set<Handler>)[]>()\n\n // fn => {paths:[path,...], dirs:[path, ...]}\n #reservations = new Map<Handler, Reservation>()\n\n // functions currently running\n #running = new Set<Handler>()\n\n reserve(paths: string[], fn: Handler) {\n paths =\n isWindows ?\n ['win32 parallelization disabled']\n : paths.map(p => {\n // don't need normPath, because we skip this entirely for windows\n return stripTrailingSlashes(join(normalizeUnicode(p)))\n })\n\n const dirs = new Set<string>(\n paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)),\n )\n this.#reservations.set(fn, { dirs, paths })\n for (const p of paths) {\n const q = this.#queues.get(p)\n if (!q) {\n this.#queues.set(p, [fn])\n } else {\n q.push(fn)\n }\n }\n for (const dir of dirs) {\n const q = this.#queues.get(dir)\n if (!q) {\n this.#queues.set(dir, [new Set([fn])])\n } else {\n const l = q.at(-1)\n if (l instanceof Set) {\n l.add(fn)\n } else {\n q.push(new Set([fn]))\n }\n }\n }\n return this.#run(fn)\n }\n\n // return the queues for each path the function cares about\n // fn => {paths, dirs}\n #getQueues(fn: Handler): {\n paths: Handler[][]\n dirs: (Handler | Set<Handler>)[][]\n } {\n const res = this.#reservations.get(fn)\n /* c8 ignore start */\n if (!res) {\n throw new Error('function does not have any path reservations')\n }\n /* c8 ignore stop */\n return {\n paths: res.paths.map((path: string) =>\n this.#queues.get(path),\n ) as Handler[][],\n dirs: [...res.dirs].map(path => this.#queues.get(path)) as (\n | Handler\n | Set<Handler>\n )[][],\n }\n }\n\n // check if fn is first in line for all its paths, and is\n // included in the first set for all its dir queues\n check(fn: Handler) {\n const { paths, dirs } = this.#getQueues(fn)\n return (\n paths.every(q => q && q[0] === fn) &&\n dirs.every(q => q && q[0] instanceof Set && q[0].has(fn))\n )\n }\n\n // run the function if it's first in line and not already running\n #run(fn: Handler) {\n if (this.#running.has(fn) || !this.check(fn)) {\n return false\n }\n this.#running.add(fn)\n fn(() => this.#clear(fn))\n return true\n }\n\n #clear(fn: Handler) {\n if (!this.#running.has(fn)) {\n return false\n }\n const res = this.#reservations.get(fn)\n /* c8 ignore start */\n if (!res) {\n throw new Error('invalid reservation')\n }\n /* c8 ignore stop */\n const { paths, dirs } = res\n\n const next = new Set<Handler>()\n for (const path of paths) {\n const q = this.#queues.get(path)\n /* c8 ignore start */\n if (!q || q?.[0] !== fn) {\n continue\n }\n /* c8 ignore stop */\n const q0 = q[1]\n if (!q0) {\n this.#queues.delete(path)\n continue\n }\n q.shift()\n if (typeof q0 === 'function') {\n next.add(q0)\n } else {\n for (const f of q0) {\n next.add(f)\n }\n }\n }\n\n for (const dir of dirs) {\n const q = this.#queues.get(dir)\n const q0 = q?.[0]\n /* c8 ignore next - type safety only */\n if (!q || !(q0 instanceof Set)) continue\n if (q0.size === 1 && q.length === 1) {\n this.#queues.delete(dir)\n continue\n } else if (q0.size === 1) {\n q.shift()\n // next one must be a function,\n // or else the Set would've been reused\n const n = q[0]\n if (typeof n === 'function') {\n next.add(n)\n }\n } else {\n q0.delete(fn)\n }\n }\n\n this.#running.delete(fn)\n next.forEach(fn => this.#run(fn))\n return true\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { HeaderData } from './header.js';
1
+ import type { HeaderData } from './header.js';
2
2
  export declare class Pax implements HeaderData {
3
3
  atime?: Date;
4
4
  mtime?: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"pax.d.ts","sourceRoot":"","sources":["../../src/pax.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,UAAU,EAAE,MAAM,aAAa,CAAA;AAEhD,qBAAa,GAAI,YAAW,UAAU;IACpC,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,KAAK,CAAC,EAAE,IAAI,CAAA;IAEZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,MAAM,EAAE,OAAO,CAAA;gBAEH,GAAG,EAAE,UAAU,EAAE,MAAM,GAAE,OAAe;IAmBpD,MAAM;IAiDN,UAAU;IAoBV,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,MAAM;IA2BrC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,GAAE,OAAe;CAG9D"}
1
+ {"version":3,"file":"pax.d.ts","sourceRoot":"","sources":["../../src/pax.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,qBAAa,GAAI,YAAW,UAAU;IACpC,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,KAAK,CAAC,EAAE,IAAI,CAAA;IAEZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,MAAM,EAAE,OAAO,CAAA;gBAEH,GAAG,EAAE,UAAU,EAAE,MAAM,GAAE,OAAe;IAmBpD,MAAM;IAiDN,UAAU;IAoBV,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,MAAM;IA2BrC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,GAAE,OAAe;CAG9D"}
@@ -143,12 +143,36 @@ const parseKVLine = (set, line) => {
143
143
  return set;
144
144
  }
145
145
  const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, '$1');
146
- const v = kv.join('=');
147
- set[k] =
148
- /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ?
149
- new Date(Number(v) * 1000)
150
- : /^[0-9]+$/.test(v) ? +v
151
- : v;
146
+ const v = kv.join('=').replace(/\0.*/, '');
147
+ switch (k) {
148
+ case 'path':
149
+ case 'linkpath':
150
+ case 'type':
151
+ case 'charset':
152
+ case 'comment':
153
+ case 'gname':
154
+ case 'uname':
155
+ set[k] = v;
156
+ break;
157
+ case 'ctime':
158
+ case 'atime':
159
+ case 'mtime':
160
+ set[k] = new Date(Number(v) * 1000);
161
+ break;
162
+ case 'size':
163
+ const s = +v;
164
+ if (s >= 0)
165
+ set[k] = s;
166
+ break;
167
+ case 'gid':
168
+ case 'uid':
169
+ case 'dev':
170
+ case 'ino':
171
+ case 'nlink':
172
+ case 'mode':
173
+ set[k] = +v;
174
+ break;
175
+ }
152
176
  return set;
153
177
  };
154
178
  //# sourceMappingURL=pax.js.map