{"version":3,"file":"hdi.mjs","names":["createReadStream","basename","join","pathJoin","Mounter","Archive","Entry","PathType","fsLstatExists","fsReadlinkRaw","fsWalk","pathNormalize","pathResourceFork","statToPathType","walkOpts","ignoreUnreadableDirectories","ejectOptions","force","EntryHdi","sizeComp","uname","gname","constructor","info","archive","size","mode","uid","gid","atime","mtime","rsrcPathRaw","pathRaw","rsrcPath","path","ArchiveHdi","FILE_EXTENSIONS","HAS_NAMED_VOLUMES","mounterMac","nobrowse","read","itter","_read","each","pathFull","stat","type","readData","FILE","readSymlink","SYMLINK","entry","ret","trigger","rsrcPathFull","rsrcStat","sizeRsrc","readRsrc","entryRsrc","RESOURCE_FORK","attach","readonly","device","devices","mountPoint","volumeName","pathRel","eject"],"sources":["../../src/archive/hdi.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\nimport {Stats, createReadStream} from 'node:fs';\nimport {basename, join as pathJoin} from 'node:path';\n\nimport {Mounter} from '@shockpkg/hdi-mac';\n\nimport {Archive, Entry, IEntryInfo} from '../archive.ts';\nimport {PathType} from '../types.ts';\nimport {\n\tfsLstatExists,\n\tfsReadlinkRaw,\n\tfsWalk,\n\tpathNormalize,\n\tpathResourceFork,\n\tstatToPathType\n} from '../util.ts';\n\nconst walkOpts = {\n\tignoreUnreadableDirectories: true\n};\n\nconst ejectOptions = {\n\tforce: true\n};\n\nexport interface IEntryInfoHdi extends IEntryInfo {\n\t/**\n\t * @inheritdoc\n\t */\n\tarchive: ArchiveHdi;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tsize: number;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tsizeComp?: null;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tmode: number;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tuid: number;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tgid: number;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tuname?: null;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tgname?: null;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tatime: Date;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tmtime: Date;\n}\n\n/**\n * EntryHdi object.\n */\nexport class EntryHdi extends Entry {\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly archive: ArchiveHdi;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly size: number;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly sizeComp: null = null;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly mode: number;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly uid: number;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly gid: number;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly uname: null = null;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly gname: null = null;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly atime: Date;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly mtime: Date;\n\n\t/**\n\t * EntryHdi constructor.\n\t *\n\t * @param info Info object.\n\t */\n\tconstructor(info: Readonly<IEntryInfoHdi>) {\n\t\tsuper(info);\n\n\t\tthis.archive = info.archive;\n\t\tthis.size = info.size;\n\t\tthis.mode = info.mode;\n\t\tthis.uid = info.uid;\n\t\tthis.gid = info.gid;\n\t\tthis.atime = info.atime;\n\t\tthis.mtime = info.mtime;\n\t}\n\n\t/**\n\t * Get the path of resource psuedo-file, raw.\n\t *\n\t * @returns Path string.\n\t */\n\tpublic get rsrcPathRaw() {\n\t\treturn pathResourceFork(this.pathRaw);\n\t}\n\n\t/**\n\t * Get the path of resource psuedo-file, normalized.\n\t *\n\t * @returns Path string.\n\t */\n\tpublic get rsrcPath() {\n\t\treturn pathNormalize(pathResourceFork(this.path));\n\t}\n}\n\n/**\n * ArchiveHdi object.\n */\nexport class ArchiveHdi extends Archive {\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic static readonly FILE_EXTENSIONS: readonly string[] | null = [\n\t\t'.dmg',\n\t\t'.iso',\n\t\t'.cdr'\n\t];\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic static readonly HAS_NAMED_VOLUMES: boolean = true;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly Entry = EntryHdi;\n\n\t/**\n\t * Mounter, Mac.\n\t */\n\tpublic mounterMac = new Mounter();\n\n\t/**\n\t * Hide mounted disk image from the file explorers.\n\t */\n\tpublic nobrowse = false;\n\n\t/**\n\t * ArchiveHdi constructor.\n\t *\n\t * @param path File path.\n\t */\n\tconstructor(path: string) {\n\t\tsuper(path);\n\t}\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic async read(itter: (entry: EntryHdi) => Promise<unknown>) {\n\t\tawait super.read(itter as Parameters<Archive['read']>[0]);\n\t}\n\n\t/**\n\t * @inheritdoc\n\t */\n\tprotected async _read(itter: (entry: EntryHdi) => Promise<unknown>) {\n\t\tconst {mounterMac, nobrowse} = this;\n\n\t\t/**\n\t\t * Each itterator.\n\t\t *\n\t\t * @param pathFull Full path.\n\t\t * @param pathRaw Raw path.\n\t\t * @param stat Stat object.\n\t\t * @returns Recursion hint.\n\t\t */\n\t\tconst each = async (pathFull: string, pathRaw: string, stat: Stats) => {\n\t\t\tconst type = statToPathType(stat);\n\t\t\tif (type === null) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst {size, mode, uid, gid, atime, mtime} = stat;\n\n\t\t\tconst readData =\n\t\t\t\ttype === PathType.FILE\n\t\t\t\t\t? async () => createReadStream(pathFull)\n\t\t\t\t\t: null;\n\n\t\t\tconst readSymlink =\n\t\t\t\ttype === PathType.SYMLINK\n\t\t\t\t\t? async () => fsReadlinkRaw(pathFull)\n\t\t\t\t\t: null;\n\n\t\t\tconst entry = new this.Entry({\n\t\t\t\tarchive: this,\n\t\t\t\ttype,\n\t\t\t\tpathRaw,\n\t\t\t\tsize,\n\t\t\t\tmode,\n\t\t\t\tuid,\n\t\t\t\tgid,\n\t\t\t\tatime,\n\t\t\t\tmtime,\n\t\t\t\treadData,\n\t\t\t\treadSymlink\n\t\t\t});\n\n\t\t\tconst ret = await entry.trigger(itter);\n\t\t\tif (ret === false) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (ret === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (type === PathType.FILE) {\n\t\t\t\tconst rsrcPathFull = pathResourceFork(pathFull);\n\t\t\t\tconst rsrcStat = await fsLstatExists(rsrcPathFull);\n\n\t\t\t\tif (rsrcStat) {\n\t\t\t\t\tconst sizeRsrc = rsrcStat.size;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Read RSRC.\n\t\t\t\t\t *\n\t\t\t\t\t * @returns Read stream.\n\t\t\t\t\t */\n\t\t\t\t\tconst readRsrc = async () => createReadStream(rsrcPathFull);\n\n\t\t\t\t\tconst entryRsrc = new this.Entry({\n\t\t\t\t\t\tarchive: this,\n\t\t\t\t\t\ttype: PathType.RESOURCE_FORK,\n\t\t\t\t\t\tpathRaw,\n\t\t\t\t\t\tsize: sizeRsrc,\n\t\t\t\t\t\tmode,\n\t\t\t\t\t\tuid,\n\t\t\t\t\t\tgid,\n\t\t\t\t\t\tatime,\n\t\t\t\t\t\tmtime,\n\t\t\t\t\t\treadRsrc\n\t\t\t\t\t});\n\n\t\t\t\t\tconst ret = await entryRsrc.trigger(itter);\n\t\t\t\t\tif (ret === false) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tif (ret === null) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\n\t\t// Using auto-eject on normal exit option.\n\t\tconst info = await mounterMac.attach(\n\t\t\tthis.path,\n\t\t\t{\n\t\t\t\tnobrowse,\n\t\t\t\treadonly: true\n\t\t\t},\n\t\t\tejectOptions\n\t\t);\n\n\t\t// Eject device when done.\n\t\ttry {\n\t\t\tfor (const device of info.devices) {\n\t\t\t\tconst {mountPoint} = device;\n\t\t\t\tif (!mountPoint) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst volumeName = basename(mountPoint);\n\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\tawait fsWalk(\n\t\t\t\t\tmountPoint,\n\t\t\t\t\tasync (pathRel, stat) => {\n\t\t\t\t\t\tconst pathFull = pathJoin(mountPoint, pathRel);\n\t\t\t\t\t\tconst pathRaw = pathJoin(volumeName, pathRel);\n\t\t\t\t\t\treturn each(pathFull, pathRaw, stat);\n\t\t\t\t\t},\n\t\t\t\t\twalkOpts\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tawait info.eject(ejectOptions);\n\t\t}\n\t}\n}\n"],"mappings":"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","ignoreList":[]}