extract-base-iterator 3.3.3 → 3.3.5

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 (53) hide show
  1. package/dist/cjs/DirectoryEntry.js.map +1 -1
  2. package/dist/cjs/FileEntry.js.map +1 -1
  3. package/dist/cjs/LinkEntry.js +1 -0
  4. package/dist/cjs/LinkEntry.js.map +1 -1
  5. package/dist/cjs/SymbolicLinkEntry.js.map +1 -1
  6. package/dist/cjs/fs/chmod.js.map +1 -1
  7. package/dist/cjs/fs/chown.js.map +1 -1
  8. package/dist/cjs/fs/lstatReal.js.map +1 -1
  9. package/dist/cjs/fs/lutimes.js.map +1 -1
  10. package/dist/cjs/fs/symlinkWin32.js.map +1 -1
  11. package/dist/cjs/fs/utimes.js.map +1 -1
  12. package/dist/cjs/index.js.map +1 -1
  13. package/dist/cjs/shared/BufferList.js.map +1 -1
  14. package/dist/cjs/shared/EntryStream.js.map +1 -1
  15. package/dist/cjs/shared/Lock.js.map +1 -1
  16. package/dist/cjs/shared/compat.d.cts +5 -2
  17. package/dist/cjs/shared/compat.d.ts +5 -2
  18. package/dist/cjs/shared/compat.js +138 -19
  19. package/dist/cjs/shared/compat.js.map +1 -1
  20. package/dist/cjs/shared/crc32.js.map +1 -1
  21. package/dist/cjs/shared/index.js.map +1 -1
  22. package/dist/cjs/shared/normalizePath.js.map +1 -1
  23. package/dist/cjs/shared/streamToString.js.map +1 -1
  24. package/dist/cjs/shared/stripPath.js.map +1 -1
  25. package/dist/cjs/validateAttributes.js.map +1 -1
  26. package/dist/cjs/waitForAccess.js.map +1 -1
  27. package/dist/esm/DirectoryEntry.js.map +1 -1
  28. package/dist/esm/FileEntry.js.map +1 -1
  29. package/dist/esm/LinkEntry.js +1 -0
  30. package/dist/esm/LinkEntry.js.map +1 -1
  31. package/dist/esm/SymbolicLinkEntry.js.map +1 -1
  32. package/dist/esm/fs/chmod.js.map +1 -1
  33. package/dist/esm/fs/chown.js.map +1 -1
  34. package/dist/esm/fs/lstatReal.js.map +1 -1
  35. package/dist/esm/fs/lutimes.js.map +1 -1
  36. package/dist/esm/fs/symlinkWin32.js.map +1 -1
  37. package/dist/esm/fs/utimes.js.map +1 -1
  38. package/dist/esm/index.js.map +1 -1
  39. package/dist/esm/shared/BufferList.js.map +1 -1
  40. package/dist/esm/shared/EntryStream.js.map +1 -1
  41. package/dist/esm/shared/Lock.js.map +1 -1
  42. package/dist/esm/shared/compat.d.ts +5 -2
  43. package/dist/esm/shared/compat.js +145 -23
  44. package/dist/esm/shared/compat.js.map +1 -1
  45. package/dist/esm/shared/crc32.js.map +1 -1
  46. package/dist/esm/shared/index.js.map +1 -1
  47. package/dist/esm/shared/normalizePath.js.map +1 -1
  48. package/dist/esm/shared/streamToString.js.map +1 -1
  49. package/dist/esm/shared/stripPath.js.map +1 -1
  50. package/dist/esm/types.js.map +1 -1
  51. package/dist/esm/validateAttributes.js.map +1 -1
  52. package/dist/esm/waitForAccess.js.map +1 -1
  53. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/DirectoryEntry.ts"],"sourcesContent":["import mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { DirectoryAttributes, ExtractOptions, NoParamCallback } from './types.ts';\n\nexport default class DirectoryEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: DirectoryAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.type === undefined) this.type = 'directory';\n if (this.basename === undefined) this.basename = path.basename(this.path);\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = path.join(dest, stripPath(normalizedPath, options));\n\n // do not check for the existence of the directory but allow out-of-order calling\n const queue = new Queue(1);\n queue.defer(mkdirp.bind(null, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n return;\n } catch (err) {\n callback(err);\n return;\n }\n }\n\n return new Promise((resolve, reject) => {\n this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done)));\n });\n }\n\n destroy() {}\n}\n"],"names":["DirectoryEntry","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","type","undefined","basename","path","create","dest","options","callback","normalizedPath","normalize","fullPath","join","stripPath","queue","Queue","defer","mkdirp","bind","waitForAccess","chmod","chown","utimes","await","err","Promise","resolve","reject","done","destroy"],"mappings":";;;;;;;eAgBqBA;;;oEAhBF;2DACF;8DACC;8DACA;8DACA;+DACC;uBACU;kEACP;2EACS;sEACL;;;;;;;;;;;AAE1B,IAAMC,uBAAuB;IAAC;IAAQ;IAAS;CAAO;AAKvC,IAAA,AAAMD,+BAAN;;aAAMA,eAOPE,UAA+B;gCAPxBF;QAQjBG,IAAAA,6BAAkB,EAACD,YAAYD;QAC/BG,IAAAA,qBAAY,EAAC,IAAI,EAAEF;QACnB,IAAI,IAAI,CAACG,IAAI,KAAKC,WAAW,IAAI,CAACD,IAAI,GAAG;QACzC,IAAI,IAAI,CAACE,QAAQ,KAAKD,WAAW,IAAI,CAACC,QAAQ,GAAGC,aAAI,CAACD,QAAQ,CAAC,IAAI,CAACC,IAAI;;iBAXvDR;IAiBnBS,OAAAA,MA2BC,GA3BDA,SAAAA,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B;;QACzFA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,IAAI;gBACF,IAAMC,iBAAiBL,aAAI,CAACM,SAAS,CAAC,IAAI,CAACN,IAAI;gBAC/C,IAAMO,WAAWP,aAAI,CAACQ,IAAI,CAACN,MAAMO,IAAAA,oBAAS,EAACJ,gBAAgBF;gBAE3D,iFAAiF;gBACjF,IAAMO,QAAQ,IAAIC,gBAAK,CAAC;gBACxBD,MAAME,KAAK,CAACC,sBAAM,CAACC,IAAI,CAAC,MAAMP;gBAC9BG,MAAME,KAAK,CAACG,wBAAa,CAACD,IAAI,CAAC,MAAMP;gBACrCG,MAAME,KAAK,CAACI,gBAAK,CAACF,IAAI,CAAC,MAAMP,UAAU,IAAI,EAAEJ;gBAC7CO,MAAME,KAAK,CAACK,gBAAK,CAACH,IAAI,CAAC,MAAMP,UAAU,IAAI,EAAEJ;gBAC7CO,MAAME,KAAK,CAACM,iBAAM,CAACJ,IAAI,CAAC,MAAMP,UAAU,IAAI,EAAEJ;gBAC9CO,MAAMS,KAAK,CAACf;gBACZ;YACF,EAAE,OAAOgB,KAAK;gBACZhB,SAASgB;gBACT;YACF;QACF;QAEA,OAAO,IAAIC,QAAQ,SAACC,SAASC;YAC3B,MAAKtB,MAAM,CAACC,MAAMC,SAAS,SAACiB,KAAaI;uBAAoBJ,MAAMG,OAAOH,OAAOE,QAAQE;;QAC3F;IACF;IAEAC,OAAAA,OAAY,GAAZA,SAAAA,WAAW;WA9CQjC"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/DirectoryEntry.ts"],"sourcesContent":["import mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { DirectoryAttributes, ExtractOptions, NoParamCallback } from './types.ts';\n\nexport default class DirectoryEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: DirectoryAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.type === undefined) this.type = 'directory';\n if (this.basename === undefined) this.basename = path.basename(this.path);\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = path.join(dest, stripPath(normalizedPath, options));\n\n // do not check for the existence of the directory but allow out-of-order calling\n const queue = new Queue(1);\n queue.defer(mkdirp.bind(null, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n return;\n } catch (err) {\n callback(err);\n return;\n }\n }\n\n return new Promise((resolve, reject) => {\n this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done)));\n });\n }\n\n destroy() {}\n}\n"],"names":["DirectoryEntry","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","type","undefined","basename","path","create","dest","options","callback","normalizedPath","normalize","fullPath","join","stripPath","queue","Queue","defer","mkdirp","bind","waitForAccess","chmod","chown","utimes","await","err","Promise","resolve","reject","done","destroy"],"mappings":";;;;;;;eAgBqBA;;;oEAhBF;2DACF;8DACC;8DACA;8DACA;+DACC;uBACU;kEACP;2EACS;sEACL;;;;;;;;;;;AAE1B,IAAMC,uBAAuB;IAAC;IAAQ;IAAS;CAAO;AAKvC,IAAA,AAAMD,+BAAN;;aAAMA,eAOPE,UAA+B;gCAPxBF;QAQjBG,IAAAA,6BAAkB,EAACD,YAAYD;QAC/BG,IAAAA,qBAAY,EAAC,IAAI,EAAEF;QACnB,IAAI,IAAI,CAACG,IAAI,KAAKC,WAAW,IAAI,CAACD,IAAI,GAAG;QACzC,IAAI,IAAI,CAACE,QAAQ,KAAKD,WAAW,IAAI,CAACC,QAAQ,GAAGC,aAAI,CAACD,QAAQ,CAAC,IAAI,CAACC,IAAI;;iBAXvDR;IAiBnBS,OAAAA,MA2BC,GA3BDA,SAAAA,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B;;QACzFA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,IAAI;gBACF,IAAMC,iBAAiBL,aAAI,CAACM,SAAS,CAAC,IAAI,CAACN,IAAI;gBAC/C,IAAMO,WAAWP,aAAI,CAACQ,IAAI,CAACN,MAAMO,IAAAA,oBAAS,EAACJ,gBAAgBF;gBAE3D,iFAAiF;gBACjF,IAAMO,QAAQ,IAAIC,gBAAK,CAAC;gBACxBD,MAAME,KAAK,CAACC,sBAAM,CAACC,IAAI,CAAC,MAAMP;gBAC9BG,MAAME,KAAK,CAACG,wBAAa,CAACD,IAAI,CAAC,MAAMP;gBACrCG,MAAME,KAAK,CAACI,gBAAK,CAACF,IAAI,CAAC,MAAMP,UAAU,IAAI,EAAEJ;gBAC7CO,MAAME,KAAK,CAACK,gBAAK,CAACH,IAAI,CAAC,MAAMP,UAAU,IAAI,EAAEJ;gBAC7CO,MAAME,KAAK,CAACM,iBAAM,CAACJ,IAAI,CAAC,MAAMP,UAAU,IAAI,EAAEJ;gBAC9CO,MAAMS,KAAK,CAACf;gBACZ;YACF,EAAE,OAAOgB,KAAK;gBACZhB,SAASgB;gBACT;YACF;QACF;QAEA,OAAO,IAAIC,QAAQ,SAACC,SAASC;YAC3B,MAAKtB,MAAM,CAACC,MAAMC,SAAS,SAACiB,KAAaI;uBAAoBJ,MAAMG,OAAOH,OAAOE,QAAQE;;QAC3F;IACF;IAEAC,OAAAA,OAAY,GAAZA,SAAAA,WAAW;WA9CQjC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/FileEntry.ts"],"sourcesContent":["import { rm } from 'fs-remove-compat';\nimport fs from 'graceful-fs';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, FileAttributes, NoParamCallback, WriteFileFn } from './types.ts';\n\ninterface AbstractFileEntry {\n _writeFile: WriteFileFn;\n}\n\nexport default class FileEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: FileAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'file';\n if ((this as unknown as AbstractFileEntry)._writeFile === undefined) throw new Error('File this missing _writeFile. Please implement this method in your subclass');\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = path.join(dest, stripPath(normalizedPath, options));\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n } else {\n // Check if file exists - throw EEXIST if it does\n queue.defer((callback) => {\n fs.stat(fullPath, (err) => {\n if (!err) {\n const existsErr = new Error(`EEXIST: file already exists, open '${fullPath}'`) as NodeJS.ErrnoException;\n existsErr.code = 'EEXIST';\n existsErr.path = fullPath;\n return callback(existsErr);\n }\n // ENOENT means file doesn't exist - that's what we want\n if (err.code === 'ENOENT') return callback();\n // Other errors should be reported\n callback(err);\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n queue.defer((this as unknown as AbstractFileEntry)._writeFile.bind(this, fullPath, options));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n return;\n } catch (err) {\n callback(err);\n return;\n }\n }\n\n return new Promise((resolve, reject) => {\n this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done)));\n });\n }\n\n destroy() {}\n}\n"],"names":["FileEntry","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","basename","undefined","path","type","_writeFile","Error","create","dest","options","callback","normalizedPath","normalize","fullPath","join","stripPath","queue","Queue","force","defer","rm","err","code","fs","stat","existsErr","mkdirp","bind","dirname","waitForAccess","chmod","chown","utimes","await","Promise","resolve","reject","done","destroy"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/FileEntry.ts"],"sourcesContent":["import { rm } from 'fs-remove-compat';\nimport fs from 'graceful-fs';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, FileAttributes, NoParamCallback, WriteFileFn } from './types.ts';\n\ninterface AbstractFileEntry {\n _writeFile: WriteFileFn;\n}\n\nexport default class FileEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: FileAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'file';\n if ((this as unknown as AbstractFileEntry)._writeFile === undefined) throw new Error('File this missing _writeFile. Please implement this method in your subclass');\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = path.join(dest, stripPath(normalizedPath, options));\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n } else {\n // Check if file exists - throw EEXIST if it does\n queue.defer((callback) => {\n fs.stat(fullPath, (err) => {\n if (!err) {\n const existsErr = new Error(`EEXIST: file already exists, open '${fullPath}'`) as NodeJS.ErrnoException;\n existsErr.code = 'EEXIST';\n existsErr.path = fullPath;\n return callback(existsErr);\n }\n // ENOENT means file doesn't exist - that's what we want\n if (err.code === 'ENOENT') return callback();\n // Other errors should be reported\n callback(err);\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n queue.defer((this as unknown as AbstractFileEntry)._writeFile.bind(this, fullPath, options));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n return;\n } catch (err) {\n callback(err);\n return;\n }\n }\n\n return new Promise((resolve, reject) => {\n this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done)));\n });\n }\n\n destroy() {}\n}\n"],"names":["FileEntry","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","basename","undefined","path","type","_writeFile","Error","create","dest","options","callback","normalizedPath","normalize","fullPath","join","stripPath","queue","Queue","force","defer","rm","err","code","fs","stat","existsErr","mkdirp","bind","dirname","waitForAccess","chmod","chown","utimes","await","Promise","resolve","reject","done","destroy"],"mappings":"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"}
@@ -65,6 +65,7 @@ var LinkEntry = /*#__PURE__*/ function() {
65
65
  });
66
66
  }
67
67
  queue.defer(_mkdirpclassic.default.bind(null, _path.default.dirname(fullPath)));
68
+ queue.defer(_waitForAccessts.default.bind(null, linkFullPath)); // ensure target file is accessible before linking
68
69
  queue.defer(_fs.default.link.bind(_fs.default, linkFullPath, fullPath));
69
70
  queue.defer(_waitForAccessts.default.bind(null, fullPath));
70
71
  queue.defer(_chmodts.default.bind(null, fullPath, this, options));
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/LinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class LinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'link';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = path.join(dest, stripPath(normalizedPath, options));\n const normalizedLinkpath = path.normalize(this.linkpath);\n const linkFullPath = path.join(dest, stripPath(normalizedLinkpath, options));\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n queue.defer(fs.link.bind(fs, linkFullPath, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n return;\n } catch (err) {\n callback(err);\n return;\n }\n }\n\n return new Promise((resolve, reject) => {\n this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done)));\n });\n }\n\n destroy() {}\n}\n"],"names":["LinkEntry","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","basename","undefined","path","type","create","dest","options","callback","normalizedPath","normalize","fullPath","join","stripPath","normalizedLinkpath","linkpath","linkFullPath","queue","Queue","force","defer","rm","err","code","mkdirp","bind","dirname","fs","link","waitForAccess","chmod","chown","utimes","await","Promise","resolve","reject","done","destroy"],"mappings":";;;;;;;eAkBqBA;;;yDAlBN;8BACI;oEACA;2DACF;8DACC;8DACA;8DACA;+DACC;uBACU;kEACP;2EACS;sEACL;;;;;;;;;;;AAE1B,IAAMC,uBAAuB;IAAC;IAAQ;IAAS;IAAQ;CAAW;AAKnD,IAAA,AAAMD,0BAAN;;aAAMA,UAQPE,UAA0B;gCARnBF;QASjBG,IAAAA,6BAAkB,EAACD,YAAYD;QAC/BG,IAAAA,qBAAY,EAAC,IAAI,EAAEF;QACnB,IAAI,IAAI,CAACG,QAAQ,KAAKC,WAAW,IAAI,CAACD,QAAQ,GAAGE,aAAI,CAACF,QAAQ,CAAC,IAAI,CAACE,IAAI;QACxE,IAAI,IAAI,CAACC,IAAI,KAAKF,WAAW,IAAI,CAACE,IAAI,GAAG;;iBAZxBR;IAkBnBS,OAAAA,MAoCC,GApCDA,SAAAA,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B;;QACzFA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,IAAI;gBACF,IAAMC,iBAAiBN,aAAI,CAACO,SAAS,CAAC,IAAI,CAACP,IAAI;gBAC/C,IAAMQ,WAAWR,aAAI,CAACS,IAAI,CAACN,MAAMO,IAAAA,oBAAS,EAACJ,gBAAgBF;gBAC3D,IAAMO,qBAAqBX,aAAI,CAACO,SAAS,CAAC,IAAI,CAACK,QAAQ;gBACvD,IAAMC,eAAeb,aAAI,CAACS,IAAI,CAACN,MAAMO,IAAAA,oBAAS,EAACC,oBAAoBP;gBAEnE,IAAMU,QAAQ,IAAIC,gBAAK,CAAC;gBACxB,IAAIX,QAAQY,KAAK,EAAE;oBACjBF,MAAMG,KAAK,CAAC,SAACZ;wBACXa,IAAAA,kBAAE,EAACV,UAAU,SAACW;4BACZA,OAAOA,IAAIC,IAAI,KAAK,WAAWf,SAASc,OAAOd;wBACjD;oBACF;gBACF;gBACAS,MAAMG,KAAK,CAACI,sBAAM,CAACC,IAAI,CAAC,MAAMtB,aAAI,CAACuB,OAAO,CAACf;gBAC3CM,MAAMG,KAAK,CAACO,WAAE,CAACC,IAAI,CAACH,IAAI,CAACE,WAAE,EAAEX,cAAcL;gBAC3CM,MAAMG,KAAK,CAACS,wBAAa,CAACJ,IAAI,CAAC,MAAMd;gBACrCM,MAAMG,KAAK,CAACU,gBAAK,CAACL,IAAI,CAAC,MAAMd,UAAU,IAAI,EAAEJ;gBAC7CU,MAAMG,KAAK,CAACW,gBAAK,CAACN,IAAI,CAAC,MAAMd,UAAU,IAAI,EAAEJ;gBAC7CU,MAAMG,KAAK,CAACY,iBAAM,CAACP,IAAI,CAAC,MAAMd,UAAU,IAAI,EAAEJ;gBAC9CU,MAAMgB,KAAK,CAACzB;gBACZ;YACF,EAAE,OAAOc,KAAK;gBACZd,SAASc;gBACT;YACF;QACF;QAEA,OAAO,IAAIY,QAAQ,SAACC,SAASC;YAC3B,MAAK/B,MAAM,CAACC,MAAMC,SAAS,SAACe,KAAae;uBAAoBf,MAAMc,OAAOd,OAAOa,QAAQE;;QAC3F;IACF;IAEAC,OAAAA,OAAY,GAAZA,SAAAA,WAAW;WAxDQ1C"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/LinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class LinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'link';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = path.join(dest, stripPath(normalizedPath, options));\n const normalizedLinkpath = path.normalize(this.linkpath);\n const linkFullPath = path.join(dest, stripPath(normalizedLinkpath, options));\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n queue.defer(waitForAccess.bind(null, linkFullPath)); // ensure target file is accessible before linking\n queue.defer(fs.link.bind(fs, linkFullPath, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n return;\n } catch (err) {\n callback(err);\n return;\n }\n }\n\n return new Promise((resolve, reject) => {\n this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done)));\n });\n }\n\n destroy() {}\n}\n"],"names":["LinkEntry","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","basename","undefined","path","type","create","dest","options","callback","normalizedPath","normalize","fullPath","join","stripPath","normalizedLinkpath","linkpath","linkFullPath","queue","Queue","force","defer","rm","err","code","mkdirp","bind","dirname","waitForAccess","fs","link","chmod","chown","utimes","await","Promise","resolve","reject","done","destroy"],"mappings":";;;;;;;eAkBqBA;;;yDAlBN;8BACI;oEACA;2DACF;8DACC;8DACA;8DACA;+DACC;uBACU;kEACP;2EACS;sEACL;;;;;;;;;;;AAE1B,IAAMC,uBAAuB;IAAC;IAAQ;IAAS;IAAQ;CAAW;AAKnD,IAAA,AAAMD,0BAAN;;aAAMA,UAQPE,UAA0B;gCARnBF;QASjBG,IAAAA,6BAAkB,EAACD,YAAYD;QAC/BG,IAAAA,qBAAY,EAAC,IAAI,EAAEF;QACnB,IAAI,IAAI,CAACG,QAAQ,KAAKC,WAAW,IAAI,CAACD,QAAQ,GAAGE,aAAI,CAACF,QAAQ,CAAC,IAAI,CAACE,IAAI;QACxE,IAAI,IAAI,CAACC,IAAI,KAAKF,WAAW,IAAI,CAACE,IAAI,GAAG;;iBAZxBR;IAkBnBS,OAAAA,MAqCC,GArCDA,SAAAA,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B;;QACzFA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,IAAI;gBACF,IAAMC,iBAAiBN,aAAI,CAACO,SAAS,CAAC,IAAI,CAACP,IAAI;gBAC/C,IAAMQ,WAAWR,aAAI,CAACS,IAAI,CAACN,MAAMO,IAAAA,oBAAS,EAACJ,gBAAgBF;gBAC3D,IAAMO,qBAAqBX,aAAI,CAACO,SAAS,CAAC,IAAI,CAACK,QAAQ;gBACvD,IAAMC,eAAeb,aAAI,CAACS,IAAI,CAACN,MAAMO,IAAAA,oBAAS,EAACC,oBAAoBP;gBAEnE,IAAMU,QAAQ,IAAIC,gBAAK,CAAC;gBACxB,IAAIX,QAAQY,KAAK,EAAE;oBACjBF,MAAMG,KAAK,CAAC,SAACZ;wBACXa,IAAAA,kBAAE,EAACV,UAAU,SAACW;4BACZA,OAAOA,IAAIC,IAAI,KAAK,WAAWf,SAASc,OAAOd;wBACjD;oBACF;gBACF;gBACAS,MAAMG,KAAK,CAACI,sBAAM,CAACC,IAAI,CAAC,MAAMtB,aAAI,CAACuB,OAAO,CAACf;gBAC3CM,MAAMG,KAAK,CAACO,wBAAa,CAACF,IAAI,CAAC,MAAMT,gBAAgB,kDAAkD;gBACvGC,MAAMG,KAAK,CAACQ,WAAE,CAACC,IAAI,CAACJ,IAAI,CAACG,WAAE,EAAEZ,cAAcL;gBAC3CM,MAAMG,KAAK,CAACO,wBAAa,CAACF,IAAI,CAAC,MAAMd;gBACrCM,MAAMG,KAAK,CAACU,gBAAK,CAACL,IAAI,CAAC,MAAMd,UAAU,IAAI,EAAEJ;gBAC7CU,MAAMG,KAAK,CAACW,gBAAK,CAACN,IAAI,CAAC,MAAMd,UAAU,IAAI,EAAEJ;gBAC7CU,MAAMG,KAAK,CAACY,iBAAM,CAACP,IAAI,CAAC,MAAMd,UAAU,IAAI,EAAEJ;gBAC9CU,MAAMgB,KAAK,CAACzB;gBACZ;YACF,EAAE,OAAOc,KAAK;gBACZd,SAASc;gBACT;YACF;QACF;QAEA,OAAO,IAAIY,QAAQ,SAACC,SAASC;YAC3B,MAAK/B,MAAM,CAACC,MAAMC,SAAS,SAACe,KAAae;uBAAoBf,MAAMc,OAAOd,OAAOa,QAAQE;;QAC3F;IACF;IAEAC,OAAAA,OAAY,GAAZA,SAAAA,WAAW;WAzDQ1C"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/SymbolicLinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport isAbsolute from 'is-absolute';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport lutimes from './fs/lutimes.ts';\nimport symlinkWin32 from './fs/symlinkWin32.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class SymbolicLinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'symlink';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = path.join(dest, stripPath(normalizedPath, options));\n let normalizedLinkpath = path.normalize(this.linkpath);\n let linkFullPath = path.join(dest, stripPath(normalizedLinkpath, options));\n if (!isAbsolute(normalizedLinkpath)) {\n const linkRelativePath = path.join(path.dirname(normalizedPath), this.linkpath);\n linkFullPath = path.join(dest, stripPath(linkRelativePath, options));\n normalizedLinkpath = path.relative(path.dirname(fullPath), linkFullPath);\n }\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n if (isWindows) queue.defer(symlinkWin32.bind(null, linkFullPath, normalizedLinkpath, fullPath));\n else queue.defer(fs.symlink.bind(fs, normalizedLinkpath, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath, true)); // noFollow=true for symlinks\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(lutimes.bind(null, fullPath, this, options));\n queue.await(callback);\n return;\n } catch (err) {\n callback(err);\n return;\n }\n }\n\n return new Promise((resolve, reject) => {\n this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done)));\n });\n }\n\n destroy() {}\n}\n"],"names":["SymbolicLinkEntry","isWindows","process","platform","test","env","OSTYPE","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","basename","undefined","path","type","create","dest","options","callback","normalizedPath","normalize","fullPath","join","stripPath","normalizedLinkpath","linkpath","linkFullPath","isAbsolute","linkRelativePath","dirname","relative","queue","Queue","force","defer","rm","err","code","mkdirp","bind","symlinkWin32","fs","symlink","waitForAccess","chmod","chown","lutimes","await","Promise","resolve","reject","done","destroy"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/SymbolicLinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport isAbsolute from 'is-absolute';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport lutimes from './fs/lutimes.ts';\nimport symlinkWin32 from './fs/symlinkWin32.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class SymbolicLinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'symlink';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = path.join(dest, stripPath(normalizedPath, options));\n let normalizedLinkpath = path.normalize(this.linkpath);\n let linkFullPath = path.join(dest, stripPath(normalizedLinkpath, options));\n if (!isAbsolute(normalizedLinkpath)) {\n const linkRelativePath = path.join(path.dirname(normalizedPath), this.linkpath);\n linkFullPath = path.join(dest, stripPath(linkRelativePath, options));\n normalizedLinkpath = path.relative(path.dirname(fullPath), linkFullPath);\n }\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n if (isWindows) queue.defer(symlinkWin32.bind(null, linkFullPath, normalizedLinkpath, fullPath));\n else queue.defer(fs.symlink.bind(fs, normalizedLinkpath, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath, true)); // noFollow=true for symlinks\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(lutimes.bind(null, fullPath, this, options));\n queue.await(callback);\n return;\n } catch (err) {\n callback(err);\n return;\n }\n }\n\n return new Promise((resolve, reject) => {\n this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done)));\n });\n }\n\n destroy() {}\n}\n"],"names":["SymbolicLinkEntry","isWindows","process","platform","test","env","OSTYPE","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","basename","undefined","path","type","create","dest","options","callback","normalizedPath","normalize","fullPath","join","stripPath","normalizedLinkpath","linkpath","linkFullPath","isAbsolute","linkRelativePath","dirname","relative","queue","Queue","force","defer","rm","err","code","mkdirp","bind","symlinkWin32","fs","symlink","waitForAccess","chmod","chown","lutimes","await","Promise","resolve","reject","done","destroy"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/fs/chmod.ts"],"sourcesContent":["// adapted from https://github.com/mafintosh/tar-fs\n\nimport fs, { type NoParamCallback } from 'fs';\nimport type { AbstractEntry, ExtractOptions } from '../types.ts';\n\nconst UMASK = process.umask ? process.umask() : null;\nconst DMODE = 0o755;\nconst FMODE = 0o644;\nconst SMODE = 0o755;\nconst LMODE = 0o644;\n\nexport default function chmodFn(fullPath: string, entry: AbstractEntry, _options: ExtractOptions, callback: NoParamCallback) {\n const chmod = entry.type === 'symlink' ? fs.lchmod : fs.chmod;\n if (!chmod || UMASK === null) return callback(null);\n\n let mode = entry.mode;\n if (!mode) {\n switch (entry.type) {\n case 'directory':\n mode = DMODE;\n break;\n case 'file':\n mode = FMODE;\n break;\n case 'symlink':\n mode = SMODE;\n break;\n case 'link':\n mode = LMODE;\n break;\n }\n }\n chmod(fullPath, (mode as number) & ~UMASK, callback);\n}\n"],"names":["chmodFn","UMASK","process","umask","DMODE","FMODE","SMODE","LMODE","fullPath","entry","_options","callback","chmod","type","fs","lchmod","mode"],"mappings":"AAAA,mDAAmD;;;;;+BAWnD;;;eAAwBA;;;yDATiB;;;;;;AAGzC,IAAMC,QAAQC,QAAQC,KAAK,GAAGD,QAAQC,KAAK,KAAK;AAChD,IAAMC,QAAQ;AACd,IAAMC,QAAQ;AACd,IAAMC,QAAQ;AACd,IAAMC,QAAQ;AAEC,SAASP,QAAQQ,QAAgB,EAAEC,KAAoB,EAAEC,QAAwB,EAAEC,QAAyB;IACzH,IAAMC,QAAQH,MAAMI,IAAI,KAAK,YAAYC,WAAE,CAACC,MAAM,GAAGD,WAAE,CAACF,KAAK;IAC7D,IAAI,CAACA,SAASX,UAAU,MAAM,OAAOU,SAAS;IAE9C,IAAIK,OAAOP,MAAMO,IAAI;IACrB,IAAI,CAACA,MAAM;QACT,OAAQP,MAAMI,IAAI;YAChB,KAAK;gBACHG,OAAOZ;gBACP;YACF,KAAK;gBACHY,OAAOX;gBACP;YACF,KAAK;gBACHW,OAAOV;gBACP;YACF,KAAK;gBACHU,OAAOT;gBACP;QACJ;IACF;IACAK,MAAMJ,UAAU,AAACQ,OAAkB,CAACf,OAAOU;AAC7C"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/fs/chmod.ts"],"sourcesContent":["// adapted from https://github.com/mafintosh/tar-fs\n\nimport fs, { type NoParamCallback } from 'fs';\nimport type { AbstractEntry, ExtractOptions } from '../types.ts';\n\nconst UMASK = process.umask ? process.umask() : null;\nconst DMODE = 0o755;\nconst FMODE = 0o644;\nconst SMODE = 0o755;\nconst LMODE = 0o644;\n\nexport default function chmodFn(fullPath: string, entry: AbstractEntry, _options: ExtractOptions, callback: NoParamCallback) {\n const chmod = entry.type === 'symlink' ? fs.lchmod : fs.chmod;\n if (!chmod || UMASK === null) return callback(null);\n\n let mode = entry.mode;\n if (!mode) {\n switch (entry.type) {\n case 'directory':\n mode = DMODE;\n break;\n case 'file':\n mode = FMODE;\n break;\n case 'symlink':\n mode = SMODE;\n break;\n case 'link':\n mode = LMODE;\n break;\n }\n }\n chmod(fullPath, (mode as number) & ~UMASK, callback);\n}\n"],"names":["chmodFn","UMASK","process","umask","DMODE","FMODE","SMODE","LMODE","fullPath","entry","_options","callback","chmod","type","fs","lchmod","mode"],"mappings":"AAAA,mDAAmD;;;;;+BAWnD;;;eAAwBA;;;yDATiB;;;;;;AAGzC,IAAMC,QAAQC,QAAQC,KAAK,GAAGD,QAAQC,KAAK,KAAK;AAChD,IAAMC,QAAQ;AACd,IAAMC,QAAQ;AACd,IAAMC,QAAQ;AACd,IAAMC,QAAQ;AAEC,SAASP,QAAQQ,QAAgB,EAAEC,KAAoB,EAAEC,QAAwB,EAAEC,QAAyB;IACzH,IAAMC,QAAQH,MAAMI,IAAI,KAAK,YAAYC,WAAE,CAACC,MAAM,GAAGD,WAAE,CAACF,KAAK;IAC7D,IAAI,CAACA,SAASX,UAAU,MAAM,OAAOU,SAAS;IAE9C,IAAIK,OAAOP,MAAMO,IAAI;IACrB,IAAI,CAACA,MAAM;QACT,OAAQP,MAAMI,IAAI;YAChB,KAAK;gBACHG,OAAOZ;gBACP;YACF,KAAK;gBACHY,OAAOX;gBACP;YACF,KAAK;gBACHW,OAAOV;gBACP;YACF,KAAK;gBACHU,OAAOT;gBACP;QACJ;IACF;IACAK,MAAMJ,UAAU,AAACQ,OAAkB,CAACf,OAAOU;AAC7C"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/fs/chown.ts"],"sourcesContent":["// adapted from https://github.com/mafintosh/tar-fs\n\nimport fs, { type NoParamCallback } from 'fs';\nimport type { AbstractEntry, ExtractOptions } from '../types.ts';\n\nconst UID = process.getuid ? process.getuid() : -1;\nconst OWN = process.platform !== 'win32' && UID === 0;\n\nexport default function chownFn(fullPath: string, entry: AbstractEntry, _options: ExtractOptions, callback: NoParamCallback) {\n const chown = entry.type === 'symlink' ? fs.lchown : fs.chown;\n if (!chown || !OWN || !entry.uid || !entry.gid) return callback(null);\n chown(fullPath, entry.uid, entry.gid, callback);\n}\n"],"names":["chownFn","UID","process","getuid","OWN","platform","fullPath","entry","_options","callback","chown","type","fs","lchown","uid","gid"],"mappings":"AAAA,mDAAmD;;;;;+BAQnD;;;eAAwBA;;;yDANiB;;;;;;AAGzC,IAAMC,MAAMC,QAAQC,MAAM,GAAGD,QAAQC,MAAM,KAAK,CAAC;AACjD,IAAMC,MAAMF,QAAQG,QAAQ,KAAK,WAAWJ,QAAQ;AAErC,SAASD,QAAQM,QAAgB,EAAEC,KAAoB,EAAEC,QAAwB,EAAEC,QAAyB;IACzH,IAAMC,QAAQH,MAAMI,IAAI,KAAK,YAAYC,WAAE,CAACC,MAAM,GAAGD,WAAE,CAACF,KAAK;IAC7D,IAAI,CAACA,SAAS,CAACN,OAAO,CAACG,MAAMO,GAAG,IAAI,CAACP,MAAMQ,GAAG,EAAE,OAAON,SAAS;IAChEC,MAAMJ,UAAUC,MAAMO,GAAG,EAAEP,MAAMQ,GAAG,EAAEN;AACxC"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/fs/chown.ts"],"sourcesContent":["// adapted from https://github.com/mafintosh/tar-fs\n\nimport fs, { type NoParamCallback } from 'fs';\nimport type { AbstractEntry, ExtractOptions } from '../types.ts';\n\nconst UID = process.getuid ? process.getuid() : -1;\nconst OWN = process.platform !== 'win32' && UID === 0;\n\nexport default function chownFn(fullPath: string, entry: AbstractEntry, _options: ExtractOptions, callback: NoParamCallback) {\n const chown = entry.type === 'symlink' ? fs.lchown : fs.chown;\n if (!chown || !OWN || !entry.uid || !entry.gid) return callback(null);\n chown(fullPath, entry.uid, entry.gid, callback);\n}\n"],"names":["chownFn","UID","process","getuid","OWN","platform","fullPath","entry","_options","callback","chown","type","fs","lchown","uid","gid"],"mappings":"AAAA,mDAAmD;;;;;+BAQnD;;;eAAwBA;;;yDANiB;;;;;;AAGzC,IAAMC,MAAMC,QAAQC,MAAM,GAAGD,QAAQC,MAAM,KAAK,CAAC;AACjD,IAAMC,MAAMF,QAAQG,QAAQ,KAAK,WAAWJ,QAAQ;AAErC,SAASD,QAAQM,QAAgB,EAAEC,KAAoB,EAAEC,QAAwB,EAAEC,QAAyB;IACzH,IAAMC,QAAQH,MAAMI,IAAI,KAAK,YAAYC,WAAE,CAACC,MAAM,GAAGD,WAAE,CAACF,KAAK;IAC7D,IAAI,CAACA,SAAS,CAACN,OAAO,CAACG,MAAMO,GAAG,IAAI,CAACP,MAAMQ,GAAG,EAAE,OAAON,SAAS;IAChEC,MAAMJ,UAAUC,MAAMO,GAAG,EAAEP,MAAMQ,GAAG,EAAEN;AACxC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/fs/lstatReal.ts"],"sourcesContent":["import fs, { type BigIntStats, type Stats } from 'fs';\n\nexport type Callback = (err: NodeJS.ErrnoException | null, stats?: Stats | BigIntStats) => void;\n\nexport default function lstatReal(path: string, callback: Callback): void {\n fs.realpath(path, (err, realpath) => {\n err ? callback(err) : fs.lstat(realpath, callback);\n });\n}\n"],"names":["lstatReal","path","callback","fs","realpath","err","lstat"],"mappings":";;;;+BAIA;;;eAAwBA;;;yDAJyB;;;;;;AAIlC,SAASA,UAAUC,IAAY,EAAEC,QAAkB;IAChEC,WAAE,CAACC,QAAQ,CAACH,MAAM,SAACI,KAAKD;QACtBC,MAAMH,SAASG,OAAOF,WAAE,CAACG,KAAK,CAACF,UAAUF;IAC3C;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/fs/lstatReal.ts"],"sourcesContent":["import fs, { type BigIntStats, type Stats } from 'fs';\n\nexport type Callback = (err: NodeJS.ErrnoException | null, stats?: Stats | BigIntStats) => void;\n\nexport default function lstatReal(path: string, callback: Callback): void {\n fs.realpath(path, (err, realpath) => {\n err ? callback(err) : fs.lstat(realpath, callback);\n });\n}\n"],"names":["lstatReal","path","callback","fs","realpath","err","lstat"],"mappings":";;;;+BAIA;;;eAAwBA;;;yDAJyB;;;;;;AAIlC,SAASA,UAAUC,IAAY,EAAEC,QAAkB;IAChEC,WAAE,CAACC,QAAQ,CAACH,MAAM,SAACI,KAAKD;QACtBC,MAAMH,SAASG,OAAOF,WAAE,CAACG,KAAK,CAACF,UAAUF;IAC3C;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/fs/lutimes.ts"],"sourcesContent":["// lutimes - set times on symlinks without following them\n// fs.lutimes was added in Node.js 14.5.0\n// For older versions, we skip setting times on symlinks (no good alternative)\n\nimport fs, { type NoParamCallback } from 'fs';\nimport type { AbstractEntry, ExtractOptions } from '../types.ts';\n\n// biome-ignore lint/suspicious/noExplicitAny: fs.lutimes not in older @types/node\nconst HAS_LUTIMES = typeof (fs as any).lutimes === 'function';\n\nexport default function lutimes(fullPath: string, entry: AbstractEntry, options: ExtractOptions, callback: NoParamCallback): void {\n if (HAS_LUTIMES) {\n const now = options.now || new Date();\n // biome-ignore lint/suspicious/noExplicitAny: fs.lutimes not in older @types/node\n (fs as any).lutimes(fullPath, now, new Date(entry.mtime), callback);\n } else {\n // On older Node versions, skip setting times on symlinks\n // fs.utimes follows symlinks and will fail with ENOENT if target doesn't exist\n callback(null);\n }\n}\n"],"names":["lutimes","HAS_LUTIMES","fs","fullPath","entry","options","callback","now","Date","mtime"],"mappings":"AAAA,yDAAyD;AACzD,yCAAyC;AACzC,8EAA8E;;;;;+BAQ9E;;;eAAwBA;;;yDANiB;;;;;;AAGzC,kFAAkF;AAClF,IAAMC,cAAc,OAAO,AAACC,WAAE,CAASF,OAAO,KAAK;AAEpC,SAASA,QAAQG,QAAgB,EAAEC,KAAoB,EAAEC,OAAuB,EAAEC,QAAyB;IACxH,IAAIL,aAAa;QACf,IAAMM,MAAMF,QAAQE,GAAG,IAAI,IAAIC;QAC/B,kFAAkF;QACjFN,WAAE,CAASF,OAAO,CAACG,UAAUI,KAAK,IAAIC,KAAKJ,MAAMK,KAAK,GAAGH;IAC5D,OAAO;QACL,yDAAyD;QACzD,+EAA+E;QAC/EA,SAAS;IACX;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/fs/lutimes.ts"],"sourcesContent":["// lutimes - set times on symlinks without following them\n// fs.lutimes was added in Node.js 14.5.0\n// For older versions, we skip setting times on symlinks (no good alternative)\n\nimport fs, { type NoParamCallback } from 'fs';\nimport type { AbstractEntry, ExtractOptions } from '../types.ts';\n\n// biome-ignore lint/suspicious/noExplicitAny: fs.lutimes not in older @types/node\nconst HAS_LUTIMES = typeof (fs as any).lutimes === 'function';\n\nexport default function lutimes(fullPath: string, entry: AbstractEntry, options: ExtractOptions, callback: NoParamCallback): void {\n if (HAS_LUTIMES) {\n const now = options.now || new Date();\n // biome-ignore lint/suspicious/noExplicitAny: fs.lutimes not in older @types/node\n (fs as any).lutimes(fullPath, now, new Date(entry.mtime), callback);\n } else {\n // On older Node versions, skip setting times on symlinks\n // fs.utimes follows symlinks and will fail with ENOENT if target doesn't exist\n callback(null);\n }\n}\n"],"names":["lutimes","HAS_LUTIMES","fs","fullPath","entry","options","callback","now","Date","mtime"],"mappings":"AAAA,yDAAyD;AACzD,yCAAyC;AACzC,8EAA8E;;;;;+BAQ9E;;;eAAwBA;;;yDANiB;;;;;;AAGzC,kFAAkF;AAClF,IAAMC,cAAc,OAAO,AAACC,WAAE,CAASF,OAAO,KAAK;AAEpC,SAASA,QAAQG,QAAgB,EAAEC,KAAoB,EAAEC,OAAuB,EAAEC,QAAyB;IACxH,IAAIL,aAAa;QACf,IAAMM,MAAMF,QAAQE,GAAG,IAAI,IAAIC;QAC/B,kFAAkF;QACjFN,WAAE,CAASF,OAAO,CAACG,UAAUI,KAAK,IAAIC,KAAKJ,MAAMK,KAAK,GAAGH;IAC5D,OAAO;QACL,yDAAyD;QACzD,+EAA+E;QAC/EA,SAAS;IACX;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/fs/symlinkWin32.ts"],"sourcesContent":["import fs, { type NoParamCallback } from 'fs';\nimport lstatReal from './lstatReal.ts';\n\nexport default function symlinkWin32(linkFullPath: string, linkpath: string, fullPath: string, callback: NoParamCallback) {\n lstatReal(linkFullPath, (err, targetStat) => {\n // If target doesn't exist, default to 'file' type (Windows requires a type for symlinks)\n const type = !err && targetStat?.isDirectory() ? 'dir' : 'file';\n fs.symlink(linkpath, fullPath, type, callback);\n });\n}\n"],"names":["symlinkWin32","linkFullPath","linkpath","fullPath","callback","lstatReal","err","targetStat","type","isDirectory","fs","symlink"],"mappings":";;;;+BAGA;;;eAAwBA;;;yDAHiB;kEACnB;;;;;;AAEP,SAASA,aAAaC,YAAoB,EAAEC,QAAgB,EAAEC,QAAgB,EAAEC,QAAyB;IACtHC,IAAAA,oBAAS,EAACJ,cAAc,SAACK,KAAKC;QAC5B,yFAAyF;QACzF,IAAMC,OAAO,CAACF,QAAOC,uBAAAA,iCAAAA,WAAYE,WAAW,MAAK,QAAQ;QACzDC,WAAE,CAACC,OAAO,CAACT,UAAUC,UAAUK,MAAMJ;IACvC;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/fs/symlinkWin32.ts"],"sourcesContent":["import fs, { type NoParamCallback } from 'fs';\nimport lstatReal from './lstatReal.ts';\n\nexport default function symlinkWin32(linkFullPath: string, linkpath: string, fullPath: string, callback: NoParamCallback) {\n lstatReal(linkFullPath, (err, targetStat) => {\n // If target doesn't exist, default to 'file' type (Windows requires a type for symlinks)\n const type = !err && targetStat?.isDirectory() ? 'dir' : 'file';\n fs.symlink(linkpath, fullPath, type, callback);\n });\n}\n"],"names":["symlinkWin32","linkFullPath","linkpath","fullPath","callback","lstatReal","err","targetStat","type","isDirectory","fs","symlink"],"mappings":";;;;+BAGA;;;eAAwBA;;;yDAHiB;kEACnB;;;;;;AAEP,SAASA,aAAaC,YAAoB,EAAEC,QAAgB,EAAEC,QAAgB,EAAEC,QAAyB;IACtHC,IAAAA,oBAAS,EAACJ,cAAc,SAACK,KAAKC;QAC5B,yFAAyF;QACzF,IAAMC,OAAO,CAACF,QAAOC,uBAAAA,iCAAAA,WAAYE,WAAW,MAAK,QAAQ;QACzDC,WAAE,CAACC,OAAO,CAACT,UAAUC,UAAUK,MAAMJ;IACvC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/fs/utimes.ts"],"sourcesContent":["// adapted from https://github.com/mafintosh/tar-fs\n\nimport fs, { type NoParamCallback } from 'fs';\nimport type { AbstractEntry, ExtractOptions } from '../types.ts';\n\nexport default function utimes(fullPath: string, entry: AbstractEntry, options: ExtractOptions, callback: NoParamCallback): void {\n const now = options.now || new Date();\n fs.utimes(fullPath, now, new Date(entry.mtime), callback);\n}\n"],"names":["utimes","fullPath","entry","options","callback","now","Date","fs","mtime"],"mappings":"AAAA,mDAAmD;;;;;+BAKnD;;;eAAwBA;;;yDAHiB;;;;;;AAG1B,SAASA,OAAOC,QAAgB,EAAEC,KAAoB,EAAEC,OAAuB,EAAEC,QAAyB;IACvH,IAAMC,MAAMF,QAAQE,GAAG,IAAI,IAAIC;IAC/BC,WAAE,CAACP,MAAM,CAACC,UAAUI,KAAK,IAAIC,KAAKJ,MAAMM,KAAK,GAAGJ;AAClD"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/fs/utimes.ts"],"sourcesContent":["// adapted from https://github.com/mafintosh/tar-fs\n\nimport fs, { type NoParamCallback } from 'fs';\nimport type { AbstractEntry, ExtractOptions } from '../types.ts';\n\nexport default function utimes(fullPath: string, entry: AbstractEntry, options: ExtractOptions, callback: NoParamCallback): void {\n const now = options.now || new Date();\n fs.utimes(fullPath, now, new Date(entry.mtime), callback);\n}\n"],"names":["utimes","fullPath","entry","options","callback","now","Date","fs","mtime"],"mappings":"AAAA,mDAAmD;;;;;+BAKnD;;;eAAwBA;;;yDAHiB;;;;;;AAG1B,SAASA,OAAOC,QAAgB,EAAEC,KAAoB,EAAEC,OAAuB,EAAEC,QAAyB;IACvH,IAAMC,MAAMF,QAAQE,GAAG,IAAI,IAAIC;IAC/BC,WAAE,CAACP,MAAM,CAACC,UAAUI,KAAK,IAAIC,KAAKJ,MAAMM,KAAK,GAAGJ;AAClD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/index.ts"],"sourcesContent":["import StackBaseIterator from 'stack-base-iterator';\n\nimport type { Entry } from './types.ts';\n\nexport default class ExtractBaseIterator<T = Entry> extends StackBaseIterator<T> {}\n\nexport { default as DirectoryEntry } from './DirectoryEntry.ts';\nexport { default as FileEntry } from './FileEntry.ts';\nexport { default as LinkEntry } from './LinkEntry.ts';\nexport { default as SymbolicLinkEntry } from './SymbolicLinkEntry.ts';\n// Shared utilities for iterator libraries\nexport * from './shared/index.ts';\nexport * from './types.ts';\nexport { default as waitForAccess } from './waitForAccess.ts';\n"],"names":["DirectoryEntry","FileEntry","LinkEntry","SymbolicLinkEntry","ExtractBaseIterator","waitForAccess","StackBaseIterator"],"mappings":";;;;;;;;;;;QAMoBA;eAAAA,yBAAc;;QACdC;eAAAA,oBAAS;;QACTC;eAAAA,oBAAS;;QACTC;eAAAA,4BAAiB;;;eALhBC;;QASDC;eAAAA,wBAAa;;;wEAbH;uEAMY;kEACL;kEACA;0EACQ;qBAE/B;qBACA;sEAC2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAT1B,IAAA,AAAMD,oCAAN;;cAAMA;aAAAA;gCAAAA;QAAN,OAAA,kBAAMA;;WAAAA;EAAuCE,0BAAiB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/index.ts"],"sourcesContent":["import StackBaseIterator from 'stack-base-iterator';\n\nimport type { Entry } from './types.ts';\n\nexport default class ExtractBaseIterator<T = Entry> extends StackBaseIterator<T> {}\n\nexport { default as DirectoryEntry } from './DirectoryEntry.ts';\nexport { default as FileEntry } from './FileEntry.ts';\nexport { default as LinkEntry } from './LinkEntry.ts';\nexport { default as SymbolicLinkEntry } from './SymbolicLinkEntry.ts';\n// Shared utilities for iterator libraries\nexport * from './shared/index.ts';\nexport * from './types.ts';\nexport { default as waitForAccess } from './waitForAccess.ts';\n"],"names":["DirectoryEntry","FileEntry","LinkEntry","SymbolicLinkEntry","ExtractBaseIterator","waitForAccess","StackBaseIterator"],"mappings":";;;;;;;;;;;QAMoBA;eAAAA,yBAAc;;QACdC;eAAAA,oBAAS;;QACTC;eAAAA,oBAAS;;QACTC;eAAAA,4BAAiB;;;eALhBC;;QASDC;eAAAA,wBAAa;;;wEAbH;uEAMY;kEACL;kEACA;0EACQ;qBAE/B;qBACA;sEAC2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAT1B,IAAA,AAAMD,oCAAN;;cAAMA;aAAAA;gCAAAA;QAAN,OAAA,kBAAMA;;WAAAA;EAAuCE,0BAAiB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/shared/BufferList.ts"],"sourcesContent":["/**\n * Buffer List for Streaming\n *\n * Simple linked list for accumulating buffer chunks during streaming.\n * Provides efficient append, consume, and slice operations.\n */\n\nimport { allocBuffer } from 'extract-base-iterator';\n\ninterface BufferNode {\n data: Buffer;\n next: BufferNode | null;\n}\n\nexport default class BufferList {\n private head: BufferNode | null = null;\n private tail: BufferNode | null = null;\n\n /** Total bytes in the buffer list */\n public length = 0;\n\n /**\n * Append a buffer to the end of the list\n */\n append(buf: Buffer): void {\n if (buf.length === 0) return;\n\n const node: BufferNode = { data: buf, next: null };\n\n if (this.tail) {\n this.tail.next = node;\n this.tail = node;\n } else {\n this.head = this.tail = node;\n }\n\n this.length += buf.length;\n }\n\n /**\n * Prepend a buffer to the front of the list\n */\n prepend(buf: Buffer): void {\n if (buf.length === 0) return;\n\n const node: BufferNode = { data: buf, next: this.head };\n\n if (!this.tail) {\n this.tail = node;\n }\n this.head = node;\n\n this.length += buf.length;\n }\n\n /**\n * Consume n bytes from the front of the list\n * Returns a new buffer containing the consumed bytes\n */\n consume(n: number): Buffer {\n if (n <= 0) return allocBuffer(0);\n if (n > this.length) n = this.length;\n\n const result = allocBuffer(n);\n let offset = 0;\n\n while (offset < n && this.head) {\n const chunk = this.head.data;\n const needed = n - offset;\n\n if (chunk.length <= needed) {\n // Use entire chunk\n chunk.copy(result, offset);\n offset += chunk.length;\n this.head = this.head.next;\n if (!this.head) this.tail = null;\n } else {\n // Use partial chunk\n chunk.copy(result, offset, 0, needed);\n this.head.data = chunk.slice(needed);\n offset = n;\n }\n }\n\n this.length -= n;\n return result;\n }\n\n /**\n * Get a slice of the buffer without consuming\n * Returns a new buffer containing the bytes\n */\n slice(start: number, end: number): Buffer {\n const len = end - start;\n if (len <= 0) return allocBuffer(0);\n if (start >= this.length) return allocBuffer(0);\n\n const result = allocBuffer(Math.min(len, this.length - start));\n let resultOffset = 0;\n let bufOffset = 0;\n let node = this.head;\n\n // Skip to start position\n while (node && bufOffset + node.data.length <= start) {\n bufOffset += node.data.length;\n node = node.next;\n }\n\n // Copy data\n while (node && resultOffset < result.length) {\n const chunk = node.data;\n const chunkStart = Math.max(0, start - bufOffset);\n const chunkEnd = Math.min(chunk.length, end - bufOffset);\n const toCopy = chunkEnd - chunkStart;\n\n if (toCopy > 0) {\n chunk.copy(result, resultOffset, chunkStart, chunkEnd);\n resultOffset += toCopy;\n }\n\n bufOffset += chunk.length;\n node = node.next;\n }\n\n return result;\n }\n\n /**\n * Read a single byte at offset without consuming\n */\n readByte(offset: number): number {\n if (offset < 0 || offset >= this.length) return -1;\n\n let bufOffset = 0;\n let node = this.head;\n\n while (node) {\n if (offset < bufOffset + node.data.length) {\n return node.data[offset - bufOffset];\n }\n bufOffset += node.data.length;\n node = node.next;\n }\n\n return -1;\n }\n\n /**\n * Search for a byte sequence in the buffer\n * Returns offset of first match, or -1 if not found\n */\n indexOf(signature: number[], startOffset = 0): number {\n if (signature.length === 0) return startOffset;\n if (startOffset + signature.length > this.length) return -1;\n\n // Simple byte-by-byte search\n // Could be optimized with KMP/Boyer-Moore for larger signatures\n for (let i = startOffset; i <= this.length - signature.length; i++) {\n let match = true;\n for (let j = 0; j < signature.length; j++) {\n if (this.readByte(i + j) !== signature[j]) {\n match = false;\n break;\n }\n }\n if (match) return i;\n }\n\n return -1;\n }\n\n /**\n * Skip (consume) n bytes without returning them\n */\n skip(n: number): void {\n if (n <= 0) return;\n if (n >= this.length) {\n this.clear();\n return;\n }\n\n let remaining = n;\n\n while (remaining > 0 && this.head) {\n const chunk = this.head.data;\n\n if (chunk.length <= remaining) {\n remaining -= chunk.length;\n this.head = this.head.next;\n if (!this.head) this.tail = null;\n } else {\n this.head.data = chunk.slice(remaining);\n remaining = 0;\n }\n }\n\n this.length -= n;\n }\n\n /**\n * Clear all buffers\n */\n clear(): void {\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n /**\n * Check if buffer has at least n bytes available\n */\n has(n: number): boolean {\n return this.length >= n;\n }\n\n /**\n * Check if the buffer starts with a signature at offset 0\n */\n startsWith(signature: number[]): boolean {\n if (signature.length > this.length) return false;\n for (let i = 0; i < signature.length; i++) {\n if (this.readByte(i) !== signature[i]) return false;\n }\n return true;\n }\n\n /**\n * Get a consolidated buffer of the entire contents\n * Note: This creates a copy, so use sparingly for large buffers\n */\n toBuffer(): Buffer {\n if (this.length === 0) return allocBuffer(0);\n return this.slice(0, this.length);\n }\n\n /**\n * Read UInt16 (little-endian) at offset without consuming\n * Returns null if not enough data\n */\n readUInt16LEAt(offset: number): number | null {\n if (offset < 0 || offset + 2 > this.length) return null;\n\n const bytes = this.readBytesAt(offset, 2);\n if (bytes.length < 2) return null;\n\n return bytes.readUInt16LE(0);\n }\n\n /**\n * Read UInt32 (little-endian) at offset without consuming\n * Returns null if not enough data\n */\n readUInt32LEAt(offset: number): number | null {\n if (offset < 0 || offset + 4 > this.length) return null;\n\n const bytes = this.readBytesAt(offset, 4);\n if (bytes.length < 4) return null;\n\n return bytes.readUInt32LE(0);\n }\n\n /**\n * Read bytes at offset without consuming.\n * Returns a slice (zero-copy) when data fits within a single chunk,\n * otherwise allocates and copies from multiple chunks.\n */\n readBytesAt(offset: number, length: number): Buffer {\n if (length <= 0) return allocBuffer(0);\n if (offset < 0 || offset >= this.length) return allocBuffer(0);\n\n // Clamp length to available data\n const available = this.length - offset;\n if (length > available) length = available;\n\n // Find the node containing the offset\n let bufOffset = 0;\n let node = this.head;\n while (node && bufOffset + node.data.length <= offset) {\n bufOffset += node.data.length;\n node = node.next;\n }\n\n if (!node) return allocBuffer(0);\n\n const startInChunk = offset - bufOffset;\n\n // Single-buffer optimization: zero-copy slice\n if (startInChunk + length <= node.data.length) {\n return node.data.slice(startInChunk, startInChunk + length);\n }\n\n // Multi-buffer case: must allocate and copy\n const result = allocBuffer(length);\n let resultOffset = 0;\n\n while (node && resultOffset < length) {\n const chunk = node.data;\n const chunkStart = resultOffset === 0 ? startInChunk : 0;\n const chunkAvailable = chunk.length - chunkStart;\n const toCopy = Math.min(chunkAvailable, length - resultOffset);\n\n chunk.copy(result, resultOffset, chunkStart, chunkStart + toCopy);\n resultOffset += toCopy;\n\n node = node.next;\n }\n\n return result;\n }\n}\n"],"names":["BufferList","head","tail","length","append","buf","node","data","next","prepend","consume","n","allocBuffer","result","offset","chunk","needed","copy","slice","start","end","len","Math","min","resultOffset","bufOffset","chunkStart","max","chunkEnd","toCopy","readByte","indexOf","signature","startOffset","i","match","j","skip","clear","remaining","has","startsWith","toBuffer","readUInt16LEAt","bytes","readBytesAt","readUInt16LE","readUInt32LEAt","readUInt32LE","available","startInChunk","chunkAvailable"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/BufferList.ts"],"sourcesContent":["/**\n * Buffer List for Streaming\n *\n * Simple linked list for accumulating buffer chunks during streaming.\n * Provides efficient append, consume, and slice operations.\n */\n\nimport { allocBuffer } from 'extract-base-iterator';\n\ninterface BufferNode {\n data: Buffer;\n next: BufferNode | null;\n}\n\nexport default class BufferList {\n private head: BufferNode | null = null;\n private tail: BufferNode | null = null;\n\n /** Total bytes in the buffer list */\n public length = 0;\n\n /**\n * Append a buffer to the end of the list\n */\n append(buf: Buffer): void {\n if (buf.length === 0) return;\n\n const node: BufferNode = { data: buf, next: null };\n\n if (this.tail) {\n this.tail.next = node;\n this.tail = node;\n } else {\n this.head = this.tail = node;\n }\n\n this.length += buf.length;\n }\n\n /**\n * Prepend a buffer to the front of the list\n */\n prepend(buf: Buffer): void {\n if (buf.length === 0) return;\n\n const node: BufferNode = { data: buf, next: this.head };\n\n if (!this.tail) {\n this.tail = node;\n }\n this.head = node;\n\n this.length += buf.length;\n }\n\n /**\n * Consume n bytes from the front of the list\n * Returns a new buffer containing the consumed bytes\n */\n consume(n: number): Buffer {\n if (n <= 0) return allocBuffer(0);\n if (n > this.length) n = this.length;\n\n const result = allocBuffer(n);\n let offset = 0;\n\n while (offset < n && this.head) {\n const chunk = this.head.data;\n const needed = n - offset;\n\n if (chunk.length <= needed) {\n // Use entire chunk\n chunk.copy(result, offset);\n offset += chunk.length;\n this.head = this.head.next;\n if (!this.head) this.tail = null;\n } else {\n // Use partial chunk\n chunk.copy(result, offset, 0, needed);\n this.head.data = chunk.slice(needed);\n offset = n;\n }\n }\n\n this.length -= n;\n return result;\n }\n\n /**\n * Get a slice of the buffer without consuming\n * Returns a new buffer containing the bytes\n */\n slice(start: number, end: number): Buffer {\n const len = end - start;\n if (len <= 0) return allocBuffer(0);\n if (start >= this.length) return allocBuffer(0);\n\n const result = allocBuffer(Math.min(len, this.length - start));\n let resultOffset = 0;\n let bufOffset = 0;\n let node = this.head;\n\n // Skip to start position\n while (node && bufOffset + node.data.length <= start) {\n bufOffset += node.data.length;\n node = node.next;\n }\n\n // Copy data\n while (node && resultOffset < result.length) {\n const chunk = node.data;\n const chunkStart = Math.max(0, start - bufOffset);\n const chunkEnd = Math.min(chunk.length, end - bufOffset);\n const toCopy = chunkEnd - chunkStart;\n\n if (toCopy > 0) {\n chunk.copy(result, resultOffset, chunkStart, chunkEnd);\n resultOffset += toCopy;\n }\n\n bufOffset += chunk.length;\n node = node.next;\n }\n\n return result;\n }\n\n /**\n * Read a single byte at offset without consuming\n */\n readByte(offset: number): number {\n if (offset < 0 || offset >= this.length) return -1;\n\n let bufOffset = 0;\n let node = this.head;\n\n while (node) {\n if (offset < bufOffset + node.data.length) {\n return node.data[offset - bufOffset];\n }\n bufOffset += node.data.length;\n node = node.next;\n }\n\n return -1;\n }\n\n /**\n * Search for a byte sequence in the buffer\n * Returns offset of first match, or -1 if not found\n */\n indexOf(signature: number[], startOffset = 0): number {\n if (signature.length === 0) return startOffset;\n if (startOffset + signature.length > this.length) return -1;\n\n // Simple byte-by-byte search\n // Could be optimized with KMP/Boyer-Moore for larger signatures\n for (let i = startOffset; i <= this.length - signature.length; i++) {\n let match = true;\n for (let j = 0; j < signature.length; j++) {\n if (this.readByte(i + j) !== signature[j]) {\n match = false;\n break;\n }\n }\n if (match) return i;\n }\n\n return -1;\n }\n\n /**\n * Skip (consume) n bytes without returning them\n */\n skip(n: number): void {\n if (n <= 0) return;\n if (n >= this.length) {\n this.clear();\n return;\n }\n\n let remaining = n;\n\n while (remaining > 0 && this.head) {\n const chunk = this.head.data;\n\n if (chunk.length <= remaining) {\n remaining -= chunk.length;\n this.head = this.head.next;\n if (!this.head) this.tail = null;\n } else {\n this.head.data = chunk.slice(remaining);\n remaining = 0;\n }\n }\n\n this.length -= n;\n }\n\n /**\n * Clear all buffers\n */\n clear(): void {\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n /**\n * Check if buffer has at least n bytes available\n */\n has(n: number): boolean {\n return this.length >= n;\n }\n\n /**\n * Check if the buffer starts with a signature at offset 0\n */\n startsWith(signature: number[]): boolean {\n if (signature.length > this.length) return false;\n for (let i = 0; i < signature.length; i++) {\n if (this.readByte(i) !== signature[i]) return false;\n }\n return true;\n }\n\n /**\n * Get a consolidated buffer of the entire contents\n * Note: This creates a copy, so use sparingly for large buffers\n */\n toBuffer(): Buffer {\n if (this.length === 0) return allocBuffer(0);\n return this.slice(0, this.length);\n }\n\n /**\n * Read UInt16 (little-endian) at offset without consuming\n * Returns null if not enough data\n */\n readUInt16LEAt(offset: number): number | null {\n if (offset < 0 || offset + 2 > this.length) return null;\n\n const bytes = this.readBytesAt(offset, 2);\n if (bytes.length < 2) return null;\n\n return bytes.readUInt16LE(0);\n }\n\n /**\n * Read UInt32 (little-endian) at offset without consuming\n * Returns null if not enough data\n */\n readUInt32LEAt(offset: number): number | null {\n if (offset < 0 || offset + 4 > this.length) return null;\n\n const bytes = this.readBytesAt(offset, 4);\n if (bytes.length < 4) return null;\n\n return bytes.readUInt32LE(0);\n }\n\n /**\n * Read bytes at offset without consuming.\n * Returns a slice (zero-copy) when data fits within a single chunk,\n * otherwise allocates and copies from multiple chunks.\n */\n readBytesAt(offset: number, length: number): Buffer {\n if (length <= 0) return allocBuffer(0);\n if (offset < 0 || offset >= this.length) return allocBuffer(0);\n\n // Clamp length to available data\n const available = this.length - offset;\n if (length > available) length = available;\n\n // Find the node containing the offset\n let bufOffset = 0;\n let node = this.head;\n while (node && bufOffset + node.data.length <= offset) {\n bufOffset += node.data.length;\n node = node.next;\n }\n\n if (!node) return allocBuffer(0);\n\n const startInChunk = offset - bufOffset;\n\n // Single-buffer optimization: zero-copy slice\n if (startInChunk + length <= node.data.length) {\n return node.data.slice(startInChunk, startInChunk + length);\n }\n\n // Multi-buffer case: must allocate and copy\n const result = allocBuffer(length);\n let resultOffset = 0;\n\n while (node && resultOffset < length) {\n const chunk = node.data;\n const chunkStart = resultOffset === 0 ? startInChunk : 0;\n const chunkAvailable = chunk.length - chunkStart;\n const toCopy = Math.min(chunkAvailable, length - resultOffset);\n\n chunk.copy(result, resultOffset, chunkStart, chunkStart + toCopy);\n resultOffset += toCopy;\n\n node = node.next;\n }\n\n return result;\n }\n}\n"],"names":["BufferList","head","tail","length","append","buf","node","data","next","prepend","consume","n","allocBuffer","result","offset","chunk","needed","copy","slice","start","end","len","Math","min","resultOffset","bufOffset","chunkStart","max","chunkEnd","toCopy","readByte","indexOf","signature","startOffset","i","match","j","skip","clear","remaining","has","startsWith","toBuffer","readUInt16LEAt","bytes","readBytesAt","readUInt16LE","readUInt32LEAt","readUInt32LE","available","startInChunk","chunkAvailable"],"mappings":"AAAA;;;;;CAKC;;;;;;;eASoBA;;;mCAPO;;;;;;AAOb,IAAA,AAAMA,2BAAN;;aAAMA;gCAAAA;aACXC,OAA0B;aAC1BC,OAA0B;QAElC,mCAAmC,QAC5BC,SAAS;;iBALGH;IAOnB;;GAEC,GACDI,OAAAA,MAaC,GAbDA,SAAAA,OAAOC,GAAW;QAChB,IAAIA,IAAIF,MAAM,KAAK,GAAG;QAEtB,IAAMG,OAAmB;YAAEC,MAAMF;YAAKG,MAAM;QAAK;QAEjD,IAAI,IAAI,CAACN,IAAI,EAAE;YACb,IAAI,CAACA,IAAI,CAACM,IAAI,GAAGF;YACjB,IAAI,CAACJ,IAAI,GAAGI;QACd,OAAO;YACL,IAAI,CAACL,IAAI,GAAG,IAAI,CAACC,IAAI,GAAGI;QAC1B;QAEA,IAAI,CAACH,MAAM,IAAIE,IAAIF,MAAM;IAC3B;IAEA;;GAEC,GACDM,OAAAA,OAWC,GAXDA,SAAAA,QAAQJ,GAAW;QACjB,IAAIA,IAAIF,MAAM,KAAK,GAAG;QAEtB,IAAMG,OAAmB;YAAEC,MAAMF;YAAKG,MAAM,IAAI,CAACP,IAAI;QAAC;QAEtD,IAAI,CAAC,IAAI,CAACC,IAAI,EAAE;YACd,IAAI,CAACA,IAAI,GAAGI;QACd;QACA,IAAI,CAACL,IAAI,GAAGK;QAEZ,IAAI,CAACH,MAAM,IAAIE,IAAIF,MAAM;IAC3B;IAEA;;;GAGC,GACDO,OAAAA,OA2BC,GA3BDA,SAAAA,QAAQC,CAAS;QACf,IAAIA,KAAK,GAAG,OAAOC,IAAAA,gCAAW,EAAC;QAC/B,IAAID,IAAI,IAAI,CAACR,MAAM,EAAEQ,IAAI,IAAI,CAACR,MAAM;QAEpC,IAAMU,SAASD,IAAAA,gCAAW,EAACD;QAC3B,IAAIG,SAAS;QAEb,MAAOA,SAASH,KAAK,IAAI,CAACV,IAAI,CAAE;YAC9B,IAAMc,QAAQ,IAAI,CAACd,IAAI,CAACM,IAAI;YAC5B,IAAMS,SAASL,IAAIG;YAEnB,IAAIC,MAAMZ,MAAM,IAAIa,QAAQ;gBAC1B,mBAAmB;gBACnBD,MAAME,IAAI,CAACJ,QAAQC;gBACnBA,UAAUC,MAAMZ,MAAM;gBACtB,IAAI,CAACF,IAAI,GAAG,IAAI,CAACA,IAAI,CAACO,IAAI;gBAC1B,IAAI,CAAC,IAAI,CAACP,IAAI,EAAE,IAAI,CAACC,IAAI,GAAG;YAC9B,OAAO;gBACL,oBAAoB;gBACpBa,MAAME,IAAI,CAACJ,QAAQC,QAAQ,GAAGE;gBAC9B,IAAI,CAACf,IAAI,CAACM,IAAI,GAAGQ,MAAMG,KAAK,CAACF;gBAC7BF,SAASH;YACX;QACF;QAEA,IAAI,CAACR,MAAM,IAAIQ;QACf,OAAOE;IACT;IAEA;;;GAGC,GACDK,OAAAA,KAiCC,GAjCDA,SAAAA,MAAMC,KAAa,EAAEC,GAAW;QAC9B,IAAMC,MAAMD,MAAMD;QAClB,IAAIE,OAAO,GAAG,OAAOT,IAAAA,gCAAW,EAAC;QACjC,IAAIO,SAAS,IAAI,CAAChB,MAAM,EAAE,OAAOS,IAAAA,gCAAW,EAAC;QAE7C,IAAMC,SAASD,IAAAA,gCAAW,EAACU,KAAKC,GAAG,CAACF,KAAK,IAAI,CAAClB,MAAM,GAAGgB;QACvD,IAAIK,eAAe;QACnB,IAAIC,YAAY;QAChB,IAAInB,OAAO,IAAI,CAACL,IAAI;QAEpB,yBAAyB;QACzB,MAAOK,QAAQmB,YAAYnB,KAAKC,IAAI,CAACJ,MAAM,IAAIgB,MAAO;YACpDM,aAAanB,KAAKC,IAAI,CAACJ,MAAM;YAC7BG,OAAOA,KAAKE,IAAI;QAClB;QAEA,YAAY;QACZ,MAAOF,QAAQkB,eAAeX,OAAOV,MAAM,CAAE;YAC3C,IAAMY,QAAQT,KAAKC,IAAI;YACvB,IAAMmB,aAAaJ,KAAKK,GAAG,CAAC,GAAGR,QAAQM;YACvC,IAAMG,WAAWN,KAAKC,GAAG,CAACR,MAAMZ,MAAM,EAAEiB,MAAMK;YAC9C,IAAMI,SAASD,WAAWF;YAE1B,IAAIG,SAAS,GAAG;gBACdd,MAAME,IAAI,CAACJ,QAAQW,cAAcE,YAAYE;gBAC7CJ,gBAAgBK;YAClB;YAEAJ,aAAaV,MAAMZ,MAAM;YACzBG,OAAOA,KAAKE,IAAI;QAClB;QAEA,OAAOK;IACT;IAEA;;GAEC,GACDiB,OAAAA,QAeC,GAfDA,SAAAA,SAAShB,MAAc;QACrB,IAAIA,SAAS,KAAKA,UAAU,IAAI,CAACX,MAAM,EAAE,OAAO,CAAC;QAEjD,IAAIsB,YAAY;QAChB,IAAInB,OAAO,IAAI,CAACL,IAAI;QAEpB,MAAOK,KAAM;YACX,IAAIQ,SAASW,YAAYnB,KAAKC,IAAI,CAACJ,MAAM,EAAE;gBACzC,OAAOG,KAAKC,IAAI,CAACO,SAASW,UAAU;YACtC;YACAA,aAAanB,KAAKC,IAAI,CAACJ,MAAM;YAC7BG,OAAOA,KAAKE,IAAI;QAClB;QAEA,OAAO,CAAC;IACV;IAEA;;;GAGC,GACDuB,OAAAA,OAkBC,GAlBDA,SAAAA,QAAQC,SAAmB;YAAEC,cAAAA,iEAAc;QACzC,IAAID,UAAU7B,MAAM,KAAK,GAAG,OAAO8B;QACnC,IAAIA,cAAcD,UAAU7B,MAAM,GAAG,IAAI,CAACA,MAAM,EAAE,OAAO,CAAC;QAE1D,6BAA6B;QAC7B,gEAAgE;QAChE,IAAK,IAAI+B,IAAID,aAAaC,KAAK,IAAI,CAAC/B,MAAM,GAAG6B,UAAU7B,MAAM,EAAE+B,IAAK;YAClE,IAAIC,QAAQ;YACZ,IAAK,IAAIC,IAAI,GAAGA,IAAIJ,UAAU7B,MAAM,EAAEiC,IAAK;gBACzC,IAAI,IAAI,CAACN,QAAQ,CAACI,IAAIE,OAAOJ,SAAS,CAACI,EAAE,EAAE;oBACzCD,QAAQ;oBACR;gBACF;YACF;YACA,IAAIA,OAAO,OAAOD;QACpB;QAEA,OAAO,CAAC;IACV;IAEA;;GAEC,GACDG,OAAAA,IAuBC,GAvBDA,SAAAA,KAAK1B,CAAS;QACZ,IAAIA,KAAK,GAAG;QACZ,IAAIA,KAAK,IAAI,CAACR,MAAM,EAAE;YACpB,IAAI,CAACmC,KAAK;YACV;QACF;QAEA,IAAIC,YAAY5B;QAEhB,MAAO4B,YAAY,KAAK,IAAI,CAACtC,IAAI,CAAE;YACjC,IAAMc,QAAQ,IAAI,CAACd,IAAI,CAACM,IAAI;YAE5B,IAAIQ,MAAMZ,MAAM,IAAIoC,WAAW;gBAC7BA,aAAaxB,MAAMZ,MAAM;gBACzB,IAAI,CAACF,IAAI,GAAG,IAAI,CAACA,IAAI,CAACO,IAAI;gBAC1B,IAAI,CAAC,IAAI,CAACP,IAAI,EAAE,IAAI,CAACC,IAAI,GAAG;YAC9B,OAAO;gBACL,IAAI,CAACD,IAAI,CAACM,IAAI,GAAGQ,MAAMG,KAAK,CAACqB;gBAC7BA,YAAY;YACd;QACF;QAEA,IAAI,CAACpC,MAAM,IAAIQ;IACjB;IAEA;;GAEC,GACD2B,OAAAA,KAIC,GAJDA,SAAAA;QACE,IAAI,CAACrC,IAAI,GAAG;QACZ,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACC,MAAM,GAAG;IAChB;IAEA;;GAEC,GACDqC,OAAAA,GAEC,GAFDA,SAAAA,IAAI7B,CAAS;QACX,OAAO,IAAI,CAACR,MAAM,IAAIQ;IACxB;IAEA;;GAEC,GACD8B,OAAAA,UAMC,GANDA,SAAAA,WAAWT,SAAmB;QAC5B,IAAIA,UAAU7B,MAAM,GAAG,IAAI,CAACA,MAAM,EAAE,OAAO;QAC3C,IAAK,IAAI+B,IAAI,GAAGA,IAAIF,UAAU7B,MAAM,EAAE+B,IAAK;YACzC,IAAI,IAAI,CAACJ,QAAQ,CAACI,OAAOF,SAAS,CAACE,EAAE,EAAE,OAAO;QAChD;QACA,OAAO;IACT;IAEA;;;GAGC,GACDQ,OAAAA,QAGC,GAHDA,SAAAA;QACE,IAAI,IAAI,CAACvC,MAAM,KAAK,GAAG,OAAOS,IAAAA,gCAAW,EAAC;QAC1C,OAAO,IAAI,CAACM,KAAK,CAAC,GAAG,IAAI,CAACf,MAAM;IAClC;IAEA;;;GAGC,GACDwC,OAAAA,cAOC,GAPDA,SAAAA,eAAe7B,MAAc;QAC3B,IAAIA,SAAS,KAAKA,SAAS,IAAI,IAAI,CAACX,MAAM,EAAE,OAAO;QAEnD,IAAMyC,QAAQ,IAAI,CAACC,WAAW,CAAC/B,QAAQ;QACvC,IAAI8B,MAAMzC,MAAM,GAAG,GAAG,OAAO;QAE7B,OAAOyC,MAAME,YAAY,CAAC;IAC5B;IAEA;;;GAGC,GACDC,OAAAA,cAOC,GAPDA,SAAAA,eAAejC,MAAc;QAC3B,IAAIA,SAAS,KAAKA,SAAS,IAAI,IAAI,CAACX,MAAM,EAAE,OAAO;QAEnD,IAAMyC,QAAQ,IAAI,CAACC,WAAW,CAAC/B,QAAQ;QACvC,IAAI8B,MAAMzC,MAAM,GAAG,GAAG,OAAO;QAE7B,OAAOyC,MAAMI,YAAY,CAAC;IAC5B;IAEA;;;;GAIC,GACDH,OAAAA,WA0CC,GA1CDA,SAAAA,YAAY/B,MAAc,EAAEX,MAAc;QACxC,IAAIA,UAAU,GAAG,OAAOS,IAAAA,gCAAW,EAAC;QACpC,IAAIE,SAAS,KAAKA,UAAU,IAAI,CAACX,MAAM,EAAE,OAAOS,IAAAA,gCAAW,EAAC;QAE5D,iCAAiC;QACjC,IAAMqC,YAAY,IAAI,CAAC9C,MAAM,GAAGW;QAChC,IAAIX,SAAS8C,WAAW9C,SAAS8C;QAEjC,sCAAsC;QACtC,IAAIxB,YAAY;QAChB,IAAInB,OAAO,IAAI,CAACL,IAAI;QACpB,MAAOK,QAAQmB,YAAYnB,KAAKC,IAAI,CAACJ,MAAM,IAAIW,OAAQ;YACrDW,aAAanB,KAAKC,IAAI,CAACJ,MAAM;YAC7BG,OAAOA,KAAKE,IAAI;QAClB;QAEA,IAAI,CAACF,MAAM,OAAOM,IAAAA,gCAAW,EAAC;QAE9B,IAAMsC,eAAepC,SAASW;QAE9B,8CAA8C;QAC9C,IAAIyB,eAAe/C,UAAUG,KAAKC,IAAI,CAACJ,MAAM,EAAE;YAC7C,OAAOG,KAAKC,IAAI,CAACW,KAAK,CAACgC,cAAcA,eAAe/C;QACtD;QAEA,4CAA4C;QAC5C,IAAMU,SAASD,IAAAA,gCAAW,EAACT;QAC3B,IAAIqB,eAAe;QAEnB,MAAOlB,QAAQkB,eAAerB,OAAQ;YACpC,IAAMY,QAAQT,KAAKC,IAAI;YACvB,IAAMmB,aAAaF,iBAAiB,IAAI0B,eAAe;YACvD,IAAMC,iBAAiBpC,MAAMZ,MAAM,GAAGuB;YACtC,IAAMG,SAASP,KAAKC,GAAG,CAAC4B,gBAAgBhD,SAASqB;YAEjDT,MAAME,IAAI,CAACJ,QAAQW,cAAcE,YAAYA,aAAaG;YAC1DL,gBAAgBK;YAEhBvB,OAAOA,KAAKE,IAAI;QAClB;QAEA,OAAOK;IACT;WAtSmBb"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/shared/EntryStream.ts"],"sourcesContent":["/**\n * EntryStream - Simple readable stream for entry content\n *\n * Extends Readable to emit 'data', 'end', 'error' events.\n * Node 0.8 compatible via readable-stream polyfill.\n *\n * This base class is designed to be used by:\n * - zip-iterator\n * - 7z-iterator\n * - tar-iterator\n * - Any other archive iterator library\n */\n\nimport Stream from 'stream';\n\n// Use native streams when available, readable-stream only for Node 0.x\nconst major = +process.versions.node.split('.')[0];\nlet ReadableBase: typeof Stream.Readable;\nif (major > 0) {\n ReadableBase = Stream.Readable;\n} else {\n ReadableBase = require('readable-stream').Readable;\n}\n\n/**\n * Base stream class for archive entry content.\n * Can be extended for special entry types like sparse files.\n */\nexport default class EntryStream extends ReadableBase {\n protected _ended = false;\n\n /**\n * Signal end of stream by pushing null\n */\n end(): void {\n if (this._ended) return;\n this._ended = true;\n this.push(null);\n }\n\n /**\n * Check if stream has ended\n */\n get ended(): boolean {\n return this._ended;\n }\n\n /**\n * Required by Readable - called when consumer wants data.\n * Data is pushed externally via push(), nothing to do here.\n */\n _read(_size: number): void {\n // Data is pushed externally, nothing to do here\n }\n}\n"],"names":["EntryStream","major","process","versions","node","split","ReadableBase","Stream","Readable","require","_ended","end","push","_read","_size","ended"],"mappings":"AAAA;;;;;;;;;;;CAWC;;;;;;;eAiBoBA;;;6DAfF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEnB,uEAAuE;AACvE,IAAMC,QAAQ,CAACC,QAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE;AAClD,IAAIC;AACJ,IAAIL,QAAQ,GAAG;IACbK,eAAeC,eAAM,CAACC,QAAQ;AAChC,OAAO;IACLF,eAAeG,QAAQ,mBAAmBD,QAAQ;AACpD;AAMe,IAAA,AAAMR,4BAAN;;cAAMA;aAAAA;gCAAAA;;gBAAN,kBAAMA,+BACTU,SAAS;;;iBADAV;IAGnB;;GAEC,GACDW,OAAAA,GAIC,GAJDA,SAAAA;QACE,IAAI,IAAI,CAACD,MAAM,EAAE;QACjB,IAAI,CAACA,MAAM,GAAG;QACd,IAAI,CAACE,IAAI,CAAC;IACZ;IASA;;;GAGC,GACDC,OAAAA,KAEC,GAFDA,SAAAA,MAAMC,KAAa;IACjB,gDAAgD;IAClD;kBAzBmBd;;YAefe,KAAAA;iBAAJ,AAHA;;GAEC,GACD;gBACE,OAAO,IAAI,CAACL,MAAM;YACpB;;;WAjBmBV;EAAoBM"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/EntryStream.ts"],"sourcesContent":["/**\n * EntryStream - Simple readable stream for entry content\n *\n * Extends Readable to emit 'data', 'end', 'error' events.\n * Node 0.8 compatible via readable-stream polyfill.\n *\n * This base class is designed to be used by:\n * - zip-iterator\n * - 7z-iterator\n * - tar-iterator\n * - Any other archive iterator library\n */\n\nimport Stream from 'stream';\n\n// Use native streams when available, readable-stream only for Node 0.x\nconst major = +process.versions.node.split('.')[0];\nlet ReadableBase: typeof Stream.Readable;\nif (major > 0) {\n ReadableBase = Stream.Readable;\n} else {\n ReadableBase = require('readable-stream').Readable;\n}\n\n/**\n * Base stream class for archive entry content.\n * Can be extended for special entry types like sparse files.\n */\nexport default class EntryStream extends ReadableBase {\n protected _ended = false;\n\n /**\n * Signal end of stream by pushing null\n */\n end(): void {\n if (this._ended) return;\n this._ended = true;\n this.push(null);\n }\n\n /**\n * Check if stream has ended\n */\n get ended(): boolean {\n return this._ended;\n }\n\n /**\n * Required by Readable - called when consumer wants data.\n * Data is pushed externally via push(), nothing to do here.\n */\n _read(_size: number): void {\n // Data is pushed externally, nothing to do here\n }\n}\n"],"names":["EntryStream","major","process","versions","node","split","ReadableBase","Stream","Readable","require","_ended","end","push","_read","_size","ended"],"mappings":"AAAA;;;;;;;;;;;CAWC;;;;;;;eAiBoBA;;;6DAfF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEnB,uEAAuE;AACvE,IAAMC,QAAQ,CAACC,QAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE;AAClD,IAAIC;AACJ,IAAIL,QAAQ,GAAG;IACbK,eAAeC,eAAM,CAACC,QAAQ;AAChC,OAAO;IACLF,eAAeG,QAAQ,mBAAmBD,QAAQ;AACpD;AAMe,IAAA,AAAMR,4BAAN;;cAAMA;aAAAA;gCAAAA;;gBAAN,kBAAMA,+BACTU,SAAS;;;iBADAV;IAGnB;;GAEC,GACDW,OAAAA,GAIC,GAJDA,SAAAA;QACE,IAAI,IAAI,CAACD,MAAM,EAAE;QACjB,IAAI,CAACA,MAAM,GAAG;QACd,IAAI,CAACE,IAAI,CAAC;IACZ;IASA;;;GAGC,GACDC,OAAAA,KAEC,GAFDA,SAAAA,MAAMC,KAAa;IACjB,gDAAgD;IAClD;kBAzBmBd;;YAefe,KAAAA;iBAAJ,AAHA;;GAEC,GACD;gBACE,OAAO,IAAI,CAACL,MAAM;YACpB;;;WAjBmBV;EAAoBM"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/iterators/extract-base-iterator/src/shared/Lock.ts"],"sourcesContent":["/**\n * Lock - Reference counting for iterator lifecycle\n *\n * Ensures the iterator doesn't complete until all entries have been processed.\n * Uses cleanup registration pattern so each iterator can register its specific\n * cleanup functions (e.g., close file descriptors, delete temp files, end parsers).\n *\n * Usage:\n * const lock = new Lock();\n * lock.onDestroy = (err) => BaseIterator.prototype.end.call(this, err);\n * lock.registerCleanup(() => { this.extract.end(); });\n * lock.registerCleanup(() => { fs.unlinkSync(this.tempPath); });\n *\n * // For each entry:\n * lock.retain();\n * // ... when entry is consumed:\n * lock.release();\n *\n * // When iteration complete:\n * lock.err = err; // optional error\n * lock.release(); // Initial count\n */\n\nexport type CleanupFn = () => void;\n\nexport default class Lock {\n private count = 1;\n private cleanupFns: CleanupFn[] = [];\n\n /** Error to pass to onDestroy callback */\n err: Error | null = null;\n\n /** Called after all cleanups when count reaches 0 */\n onDestroy: ((err: Error | null) => void) | null = null;\n\n /**\n * Register a cleanup function to be called when the lock is destroyed.\n * Cleanup functions are called in registration order, before onDestroy.\n * @param fn Cleanup function (should not throw)\n */\n registerCleanup(fn: CleanupFn): void {\n this.cleanupFns.push(fn);\n }\n\n /**\n * Increment reference count.\n * Call when starting to process a new entry.\n */\n retain(): void {\n this.count++;\n }\n\n /**\n * Decrement reference count.\n * Call when an entry has been fully consumed.\n * When count reaches 0, cleanup is triggered.\n */\n release(): void {\n if (this.count <= 0) {\n throw new Error('Lock count is corrupted');\n }\n this.count--;\n if (this.count === 0) {\n this._destroy();\n }\n }\n\n /**\n * Internal cleanup - called when reference count reaches 0\n */\n private _destroy(): void {\n // Run all registered cleanup functions in order\n // Note: Use traditional for loop for Node 0.8 compatibility (no Symbol.iterator)\n const fns = this.cleanupFns;\n for (let i = 0; i < fns.length; i++) {\n try {\n fns[i]();\n } catch (_e) {\n // Ignore cleanup errors to ensure all cleanup runs\n }\n }\n this.cleanupFns = [];\n\n // Call onDestroy callback LAST (typically calls iterator.end())\n if (this.onDestroy) {\n this.onDestroy(this.err);\n this.onDestroy = null;\n }\n }\n}\n"],"names":["Lock","count","cleanupFns","err","onDestroy","registerCleanup","fn","push","retain","release","Error","_destroy","fns","i","length","_e"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;CAqBC;;;;;;;eAIoBA;;;;;;;;AAAN,IAAA,AAAMA,qBAAN;;aAAMA;gCAAAA;aACXC,QAAQ;aACRC,aAA0B,EAAE;QAEpC,wCAAwC,QACxCC,MAAoB;QAEpB,mDAAmD,QACnDC,YAAkD;;iBAR/BJ;IAUnB;;;;GAIC,GACDK,OAAAA,eAEC,GAFDA,SAAAA,gBAAgBC,EAAa;QAC3B,IAAI,CAACJ,UAAU,CAACK,IAAI,CAACD;IACvB;IAEA;;;GAGC,GACDE,OAAAA,MAEC,GAFDA,SAAAA;QACE,IAAI,CAACP,KAAK;IACZ;IAEA;;;;GAIC,GACDQ,OAAAA,OAQC,GARDA,SAAAA;QACE,IAAI,IAAI,CAACR,KAAK,IAAI,GAAG;YACnB,MAAM,IAAIS,MAAM;QAClB;QACA,IAAI,CAACT,KAAK;QACV,IAAI,IAAI,CAACA,KAAK,KAAK,GAAG;YACpB,IAAI,CAACU,QAAQ;QACf;IACF;IAEA;;GAEC,GACD,OAAQA,QAkBP,GAlBD,SAAQA;QACN,gDAAgD;QAChD,iFAAiF;QACjF,IAAMC,MAAM,IAAI,CAACV,UAAU;QAC3B,IAAK,IAAIW,IAAI,GAAGA,IAAID,IAAIE,MAAM,EAAED,IAAK;YACnC,IAAI;gBACFD,GAAG,CAACC,EAAE;YACR,EAAE,OAAOE,IAAI;YACX,mDAAmD;YACrD;QACF;QACA,IAAI,CAACb,UAAU,GAAG,EAAE;QAEpB,gEAAgE;QAChE,IAAI,IAAI,CAACE,SAAS,EAAE;YAClB,IAAI,CAACA,SAAS,CAAC,IAAI,CAACD,GAAG;YACvB,IAAI,CAACC,SAAS,GAAG;QACnB;IACF;WA/DmBJ"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/Lock.ts"],"sourcesContent":["/**\n * Lock - Reference counting for iterator lifecycle\n *\n * Ensures the iterator doesn't complete until all entries have been processed.\n * Uses cleanup registration pattern so each iterator can register its specific\n * cleanup functions (e.g., close file descriptors, delete temp files, end parsers).\n *\n * Usage:\n * const lock = new Lock();\n * lock.onDestroy = (err) => BaseIterator.prototype.end.call(this, err);\n * lock.registerCleanup(() => { this.extract.end(); });\n * lock.registerCleanup(() => { fs.unlinkSync(this.tempPath); });\n *\n * // For each entry:\n * lock.retain();\n * // ... when entry is consumed:\n * lock.release();\n *\n * // When iteration complete:\n * lock.err = err; // optional error\n * lock.release(); // Initial count\n */\n\nexport type CleanupFn = () => void;\n\nexport default class Lock {\n private count = 1;\n private cleanupFns: CleanupFn[] = [];\n\n /** Error to pass to onDestroy callback */\n err: Error | null = null;\n\n /** Called after all cleanups when count reaches 0 */\n onDestroy: ((err: Error | null) => void) | null = null;\n\n /**\n * Register a cleanup function to be called when the lock is destroyed.\n * Cleanup functions are called in registration order, before onDestroy.\n * @param fn Cleanup function (should not throw)\n */\n registerCleanup(fn: CleanupFn): void {\n this.cleanupFns.push(fn);\n }\n\n /**\n * Increment reference count.\n * Call when starting to process a new entry.\n */\n retain(): void {\n this.count++;\n }\n\n /**\n * Decrement reference count.\n * Call when an entry has been fully consumed.\n * When count reaches 0, cleanup is triggered.\n */\n release(): void {\n if (this.count <= 0) {\n throw new Error('Lock count is corrupted');\n }\n this.count--;\n if (this.count === 0) {\n this._destroy();\n }\n }\n\n /**\n * Internal cleanup - called when reference count reaches 0\n */\n private _destroy(): void {\n // Run all registered cleanup functions in order\n // Note: Use traditional for loop for Node 0.8 compatibility (no Symbol.iterator)\n const fns = this.cleanupFns;\n for (let i = 0; i < fns.length; i++) {\n try {\n fns[i]();\n } catch (_e) {\n // Ignore cleanup errors to ensure all cleanup runs\n }\n }\n this.cleanupFns = [];\n\n // Call onDestroy callback LAST (typically calls iterator.end())\n if (this.onDestroy) {\n this.onDestroy(this.err);\n this.onDestroy = null;\n }\n }\n}\n"],"names":["Lock","count","cleanupFns","err","onDestroy","registerCleanup","fn","push","retain","release","Error","_destroy","fns","i","length","_e"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;CAqBC;;;;;;;eAIoBA;;;;;;;;AAAN,IAAA,AAAMA,qBAAN;;aAAMA;gCAAAA;aACXC,QAAQ;aACRC,aAA0B,EAAE;QAEpC,wCAAwC,QACxCC,MAAoB;QAEpB,mDAAmD,QACnDC,YAAkD;;iBAR/BJ;IAUnB;;;;GAIC,GACDK,OAAAA,eAEC,GAFDA,SAAAA,gBAAgBC,EAAa;QAC3B,IAAI,CAACJ,UAAU,CAACK,IAAI,CAACD;IACvB;IAEA;;;GAGC,GACDE,OAAAA,MAEC,GAFDA,SAAAA;QACE,IAAI,CAACP,KAAK;IACZ;IAEA;;;;GAIC,GACDQ,OAAAA,OAQC,GARDA,SAAAA;QACE,IAAI,IAAI,CAACR,KAAK,IAAI,GAAG;YACnB,MAAM,IAAIS,MAAM;QAClB;QACA,IAAI,CAACT,KAAK;QACV,IAAI,IAAI,CAACA,KAAK,KAAK,GAAG;YACpB,IAAI,CAACU,QAAQ;QACf;IACF;IAEA;;GAEC,GACD,OAAQA,QAkBP,GAlBD,SAAQA;QACN,gDAAgD;QAChD,iFAAiF;QACjF,IAAMC,MAAM,IAAI,CAACV,UAAU;QAC3B,IAAK,IAAIW,IAAI,GAAGA,IAAID,IAAIE,MAAM,EAAED,IAAK;YACnC,IAAI;gBACFD,GAAG,CAACC,EAAE;YACR,EAAE,OAAOE,IAAI;YACX,mDAAmD;YACrD;QACF;QACA,IAAI,CAACb,UAAU,GAAG,EAAE;QAEpB,gEAAgE;QAChE,IAAI,IAAI,CAACE,SAAS,EAAE;YAClB,IAAI,CAACA,SAAS,CAAC,IAAI,CAACD,GAAG;YACvB,IAAI,CAACC,SAAS,GAAG;QACnB;IACF;WA/DmBJ"}
@@ -12,15 +12,17 @@
12
12
  * Solution: Feature detection with graceful fallback in both directions.
13
13
  */
14
14
  /**
15
- * Allocate a zero-filled buffer (safe)
15
+ * Allocate a zero-filled buffer (safe) - handles very large allocations
16
16
  * - Uses Buffer.alloc() on Node 4.5+
17
17
  * - Falls back to new Buffer() + fill on Node 0.8-4.4
18
+ * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks and copies
18
19
  */
19
20
  export declare function allocBuffer(size: number): Buffer;
20
21
  /**
21
22
  * Allocate a buffer without initialization (unsafe but faster)
22
23
  * - Uses Buffer.allocUnsafe() on Node 4.5+
23
24
  * - Falls back to new Buffer() on Node 0.8-4.4
25
+ * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks without zeroing
24
26
  *
25
27
  * WARNING: Buffer contents are uninitialized and may contain sensitive data.
26
28
  * Only use when you will immediately overwrite all bytes.
@@ -63,8 +65,9 @@ export declare function readUInt64LE(buf: Buffer, offset: number): number;
63
65
  */
64
66
  export declare function writeUInt64LE(buf: Buffer, value: number, offset: number): void;
65
67
  /**
66
- * Concatenate buffers - compatible with Node 0.8
68
+ * Concatenate buffers - compatible with Node 0.8+
67
69
  * Handles crypto output which may not be proper Buffer instances in old Node.
70
+ * Also handles very large concatenations that would exceed buffer limits.
68
71
  *
69
72
  * NOTE: This function is primarily needed for AES decryption compatibility
70
73
  * in Node 0.8 where crypto output may not be proper Buffer instances.
@@ -12,15 +12,17 @@
12
12
  * Solution: Feature detection with graceful fallback in both directions.
13
13
  */
14
14
  /**
15
- * Allocate a zero-filled buffer (safe)
15
+ * Allocate a zero-filled buffer (safe) - handles very large allocations
16
16
  * - Uses Buffer.alloc() on Node 4.5+
17
17
  * - Falls back to new Buffer() + fill on Node 0.8-4.4
18
+ * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks and copies
18
19
  */
19
20
  export declare function allocBuffer(size: number): Buffer;
20
21
  /**
21
22
  * Allocate a buffer without initialization (unsafe but faster)
22
23
  * - Uses Buffer.allocUnsafe() on Node 4.5+
23
24
  * - Falls back to new Buffer() on Node 0.8-4.4
25
+ * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks without zeroing
24
26
  *
25
27
  * WARNING: Buffer contents are uninitialized and may contain sensitive data.
26
28
  * Only use when you will immediately overwrite all bytes.
@@ -63,8 +65,9 @@ export declare function readUInt64LE(buf: Buffer, offset: number): number;
63
65
  */
64
66
  export declare function writeUInt64LE(buf: Buffer, value: number, offset: number): void;
65
67
  /**
66
- * Concatenate buffers - compatible with Node 0.8
68
+ * Concatenate buffers - compatible with Node 0.8+
67
69
  * Handles crypto output which may not be proper Buffer instances in old Node.
70
+ * Also handles very large concatenations that would exceed buffer limits.
68
71
  *
69
72
  * NOTE: This function is primarily needed for AES decryption compatibility
70
73
  * in Node 0.8 where crypto output may not be proper Buffer instances.
@@ -92,20 +92,123 @@ var _require = typeof require === 'undefined' ? _module.default.createRequire(re
92
92
  var hasBufferAlloc = typeof Buffer.alloc === 'function';
93
93
  var hasBufferAllocUnsafe = typeof Buffer.allocUnsafe === 'function';
94
94
  var hasBufferFrom = typeof Buffer.from === 'function' && Buffer.from !== Uint8Array.from;
95
- function allocBuffer(size) {
95
+ // Maximum buffer size that works across all Node.js versions
96
+ // Node 0.8-4.x: kMaxLength = 0x3fffffff (~1073MB) but actual limit may be lower
97
+ // Node 6-7.x: ~1073MB for Uint8Array
98
+ // Node 8+: ~2GB for Buffer
99
+ // Node 10+: 2^31-1 (~2147MB) for Buffer.allocUnsafe
100
+ // Use 128MB as a conservative limit for buffer operations
101
+ var MAX_SAFE_BUFFER_LENGTH = 128 * 1024 * 1024; // 128MB
102
+ // Try to detect the actual kMaxLength for this Node version
103
+ // If we can't detect it (older Node), assume conservative limit
104
+ var DETECTED_MAX_LENGTH = null;
105
+ function _getMaxBufferLength() {
106
+ if (DETECTED_MAX_LENGTH !== null) return DETECTED_MAX_LENGTH;
107
+ // Try to detect the actual limit
108
+ // kMaxLength exists on BufferConstructor in newer TypeScript definitions
109
+ // but may not exist at runtime on very old Node
110
+ var maxLen = Buffer.kMaxLength;
111
+ if (maxLen !== undefined) {
112
+ DETECTED_MAX_LENGTH = maxLen;
113
+ } else {
114
+ // Older Node - use conservative estimate
115
+ DETECTED_MAX_LENGTH = 0x3fffffff; // ~1073MB
116
+ }
117
+ return DETECTED_MAX_LENGTH;
118
+ }
119
+ /**
120
+ * Check if a buffer size can be safely allocated on this Node version
121
+ * Uses conservative limit to work across all versions
122
+ */ function canAllocateBufferSize(size) {
123
+ return size >= 0 && size <= MAX_SAFE_BUFFER_LENGTH;
124
+ }
125
+ /**
126
+ * Create a single chunk of the specified size
127
+ */ function createChunk(size, zeroFill) {
96
128
  if (hasBufferAlloc) {
97
129
  return Buffer.alloc(size);
98
130
  }
99
- // Legacy fallback: new Buffer() is uninitialized, must zero-fill
100
131
  var buf = new Buffer(size);
101
- buf.fill(0);
132
+ if (zeroFill) buf.fill(0);
102
133
  return buf;
103
134
  }
135
+ /**
136
+ * Combine an array of buffers into one by pairwise concatenation
137
+ * Each combination produces a buffer at most 2x MAX_SAFE_BUFFER_LENGTH (256MB)
138
+ * which is within kMaxLength for all Node versions
139
+ */ function combineBuffersPairwise(buffers) {
140
+ while(buffers.length > 1){
141
+ var newBuffers = [];
142
+ for(var i = 0; i < buffers.length; i += 2){
143
+ if (i + 1 < buffers.length) {
144
+ var size1 = buffers[i].length;
145
+ var size2 = buffers[i + 1].length;
146
+ var combinedSize = size1 + size2;
147
+ // Safe: combinedSize <= 2 * MAX_SAFE_BUFFER_LENGTH = 256MB
148
+ var combined = createChunk(combinedSize, false);
149
+ buffers[i].copy(combined, 0);
150
+ buffers[i + 1].copy(combined, size1);
151
+ newBuffers.push(combined);
152
+ } else {
153
+ newBuffers.push(buffers[i]);
154
+ }
155
+ }
156
+ // Clear old references to help GC and use traditional for loop for Node 0.8 compatibility
157
+ for(var j = 0; j < buffers.length; j++){
158
+ buffers[j] = undefined;
159
+ }
160
+ buffers.length = 0;
161
+ for(var j1 = 0; j1 < newBuffers.length; j1++){
162
+ buffers.push(newBuffers[j1]);
163
+ }
164
+ }
165
+ return buffers[0];
166
+ }
167
+ /**
168
+ * Allocate a large buffer by allocating in chunks and combining them
169
+ * Handles both zero-filled (safe) and uninitialized (unsafe) variants
170
+ */ function allocBufferLarge(size, zeroFill) {
171
+ // For large sizes, allocate smaller chunks and combine them
172
+ var numChunks = Math.ceil(size / MAX_SAFE_BUFFER_LENGTH);
173
+ var chunks = [];
174
+ // Allocate individual chunks (each <= MAX_SAFE_BUFFER_LENGTH)
175
+ for(var i = 0; i < numChunks; i++){
176
+ var chunkSize = Math.min(MAX_SAFE_BUFFER_LENGTH, size - i * MAX_SAFE_BUFFER_LENGTH);
177
+ chunks.push(createChunk(chunkSize, zeroFill));
178
+ }
179
+ // Combine chunks iteratively using pairwise combination
180
+ return combineBuffersPairwise(chunks);
181
+ }
182
+ function allocBuffer(size) {
183
+ if (size === 0) {
184
+ return new Buffer(0);
185
+ }
186
+ // Use native allocation for sizes within safe limits
187
+ if (canAllocateBufferSize(size)) {
188
+ if (hasBufferAlloc) {
189
+ return Buffer.alloc(size);
190
+ }
191
+ // Legacy fallback: new Buffer() is uninitialized, must zero-fill
192
+ var buf = new Buffer(size);
193
+ buf.fill(0);
194
+ return buf;
195
+ }
196
+ // For large sizes, allocate in chunks with zero-filling
197
+ return allocBufferLarge(size, true);
198
+ }
104
199
  function allocBufferUnsafe(size) {
105
- if (hasBufferAllocUnsafe) {
106
- return Buffer.allocUnsafe(size);
200
+ if (size === 0) {
201
+ return new Buffer(0);
107
202
  }
108
- return new Buffer(size);
203
+ // Use native allocation for sizes within safe limits
204
+ if (canAllocateBufferSize(size)) {
205
+ if (hasBufferAllocUnsafe) {
206
+ return Buffer.allocUnsafe(size);
207
+ }
208
+ return new Buffer(size);
209
+ }
210
+ // For large sizes, allocate in chunks without zero-filling
211
+ return allocBufferLarge(size, false);
109
212
  }
110
213
  function bufferFrom(data, encoding) {
111
214
  if (hasBufferFrom) {
@@ -176,26 +279,42 @@ function bufferConcat(list, totalLength) {
176
279
  }
177
280
  // Use specified totalLength or actual length
178
281
  var targetLength = totalLength !== undefined ? totalLength : actualLength;
179
- // Check if all items are proper Buffers AND no truncation needed
180
- // (Node 0.8's Buffer.concat doesn't handle truncation well)
181
- var allBuffers = true;
182
- for(var j = 0; j < list.length; j++){
183
- if (!_instanceof(list[j], Buffer)) {
184
- allBuffers = false;
185
- break;
186
- }
282
+ // Handle empty list
283
+ if (list.length === 0) {
284
+ return new Buffer(0);
187
285
  }
188
- if (allBuffers && targetLength >= actualLength) {
189
- return Buffer.concat(list, targetLength);
286
+ // Handle very large concatenations that would exceed buffer limits
287
+ // Use native Buffer.concat for smaller sizes (faster)
288
+ if (targetLength <= MAX_SAFE_BUFFER_LENGTH) {
289
+ // Check if all items are proper Buffers AND no truncation needed
290
+ // (Node 0.8's Buffer.concat doesn't handle truncation well)
291
+ var allBuffers = true;
292
+ for(var j = 0; j < list.length; j++){
293
+ if (!_instanceof(list[j], Buffer)) {
294
+ allBuffers = false;
295
+ break;
296
+ }
297
+ }
298
+ if (allBuffers && targetLength >= actualLength) {
299
+ return Buffer.concat(list, targetLength);
300
+ }
190
301
  }
191
- // Manual concat for mixed types or when truncation is needed
302
+ // For large or complex concatenations, use chunked approach
303
+ // This will use allocBuffer which handles large sizes via chunking
192
304
  var result = allocBuffer(targetLength);
193
305
  var offset = 0;
194
306
  for(var k = 0; k < list.length && offset < targetLength; k++){
195
307
  var buf = list[k];
196
- for(var l = 0; l < buf.length && offset < targetLength; l++){
197
- result[offset++] = buf[l];
308
+ var toCopy = Math.min(buf.length, targetLength - offset);
309
+ if (_instanceof(buf, Buffer)) {
310
+ buf.copy(result, offset, 0, toCopy);
311
+ } else {
312
+ // Uint8Array - need to copy byte by byte
313
+ for(var l = 0; l < toCopy; l++){
314
+ result[offset + l] = buf[l];
315
+ }
198
316
  }
317
+ offset += toCopy;
199
318
  }
200
319
  return result;
201
320
  }