UNPKG

26.4 kBSource Map (JSON)View Raw
1{"version":3,"sources":["bundle.ts"],"names":["Readable","pipeline","join","pathJoin","dirname","basename","resolve","promisify","fse","fsLchmodSupported","fsLchmod","fsLutimesSupported","fsLutimes","fsWalk","fsLstatExists","once","Queue","pipelineP","userExec","Bundle","Object","constructor","path","isOpen","_isOpen","isExcludedFile","name","exclude","excludes","test","openFile","player","movieFile","movieData","readFile","openData","Error","_checkOutput","_closeQueue","clear","_openData","close","_assertIsOpen","_close","withFile","func","withData","call","resourcePath","destination","projector","resourceExists","copyResource","source","options","stat","lstat","isSymbolicLink","copyResourceSymlink","isFile","copyResourceFile","isDirectory","copyResourceDirectory","createResourceDirectory","_expandResourceOptionsCopy","noRecurse","opts","streamResourceFile","createReadStream","createResourceSymlink","readlink","dest","_assertNotResourceExists","merge","ensureDir","atime","mtime","abs","push","_setResourceAttributes","bind","length","createResourceFile","data","read","target","symlink","createWriteStream","p","pathExists","r","st","atimeCopy","mtimeCopy","executable","executableCopy","_getResourceModeExecutable","mode","chmod","_setResourceModeExecutable","utimes","_writeLauncher","run","ignoreDirectory"],"mappings":"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","sourcesContent":["import {\n\tReadable,\n\tpipeline\n} from 'stream';\nimport {\n\tjoin as pathJoin,\n\tdirname,\n\tbasename,\n\tresolve\n} from 'path';\nimport {\n\tpromisify\n} from 'util';\n\nimport fse from 'fs-extra';\nimport {\n\tfsLchmodSupported,\n\tfsLchmod,\n\tfsLutimesSupported,\n\tfsLutimes,\n\tfsWalk,\n\tfsLstatExists\n} from '@shockpkg/archive-files';\n\nimport {once} from './util';\nimport {Queue} from './queue';\nimport {Projector} from './projector';\n\nconst pipelineP = promisify(pipeline);\n\nconst userExec = 0b001000000;\n\n/**\n * Options for adding resources.\n */\nexport interface IBundleResourceOptions {\n\n\t/**\n\t * Access time.\n\t */\n\tatime?: null | Date;\n\n\t/**\n\t * Copy source atime if not set.\n\t */\n\tatimeCopy?: null | boolean;\n\n\t/**\n\t * Modification time.\n\t */\n\tmtime?: null | Date;\n\n\t/**\n\t * Copy source mtime if not set.\n\t */\n\tmtimeCopy?: null | boolean;\n\n\t/**\n\t * Mark files and symlinks as executable.\n\t */\n\texecutable?: null | boolean;\n\n\t/**\n\t * Copy source executable if not set.\n\t */\n\texecutableCopy?: null | boolean;\n\n\t/**\n\t * Optionally merge directory contents.\n\t */\n\tmerge?: null | boolean;\n\n\t/**\n\t * Skip recursive directory copy.\n\t */\n\tnoRecurse?: null | boolean;\n}\n\n/**\n * Bundle constructor.\n *\n * @param path Output path for the main executable.\n */\nexport abstract class Bundle extends Object {\n\t/**\n\t * File and directory names to exclude when adding a directory.\n\t */\n\tpublic excludes = [\n\t\t/^\\./,\n\t\t/^ehthumbs\\.db$/,\n\t\t/^Thumbs\\.db$/\n\t];\n\n\t/**\n\t * Bundle main executable path.\n\t */\n\tpublic readonly path: string;\n\n\t/**\n\t * Projector instance.\n\t */\n\tpublic abstract readonly projector: Projector;\n\n\t/**\n\t * Open flag.\n\t */\n\tprotected _isOpen = false;\n\n\t/**\n\t * Close callbacks priority queue.\n\t */\n\tprotected _closeQueue = new Queue();\n\n\tconstructor(path: string) {\n\t\tsuper();\n\n\t\tthis.path = path;\n\t}\n\n\t/**\n\t * Check if output open.\n\t *\n\t * @returns Returns true if open, else false.\n\t */\n\tpublic get isOpen() {\n\t\treturn this._isOpen;\n\t}\n\n\t/**\n\t * Check if name is excluded file.\n\t *\n\t * @param name File name.\n\t * @returns Returns true if excluded, else false.\n\t */\n\tpublic isExcludedFile(name: string) {\n\t\tfor (const exclude of this.excludes) {\n\t\t\tif (exclude.test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Open output with file.\n\t *\n\t * @param player Player path.\n\t * @param movieFile Movie file.\n\t */\n\tpublic async openFile(player: string, movieFile: string | null) {\n\t\tconst movieData = movieFile ? await fse.readFile(movieFile) : null;\n\t\tawait this.openData(player, movieData);\n\t}\n\n\t/**\n\t * Open output with data.\n\t *\n\t * @param player Player path.\n\t * @param movieData Movie data.\n\t */\n\tpublic async openData(player: string, movieData: Readonly<Buffer> | null) {\n\t\tif (this._isOpen) {\n\t\t\tthrow new Error('Already open');\n\t\t}\n\t\tawait this._checkOutput();\n\n\t\tthis._closeQueue.clear();\n\t\tawait this._openData(player, movieData);\n\n\t\tthis._isOpen = true;\n\t}\n\n\t/**\n\t * Close output.\n\t */\n\tpublic async close() {\n\t\tthis._assertIsOpen();\n\n\t\ttry {\n\t\t\tawait this._close();\n\t\t}\n\t\tfinally {\n\t\t\tthis._closeQueue.clear();\n\t\t}\n\n\t\tthis._isOpen = false;\n\t}\n\n\t/**\n\t * Write out projector with player and file.\n\t * Has a callback to write out the resources.\n\t *\n\t * @param player Player path.\n\t * @param movieFile Movie file.\n\t * @param func Async function.\n\t * @returns Return value of the async function.\n\t */\n\tpublic async withFile<T>(\n\t\tplayer: string,\n\t\tmovieFile: string | null,\n\t\tfunc: ((self: this) => Promise<T>) | null = null\n\t) {\n\t\tconst movieData = movieFile ? await fse.readFile(movieFile) : null;\n\t\treturn this.withData(player, movieData, func);\n\t}\n\n\t/**\n\t * Write out projector with player and data.\n\t * Has a callback to write out the resources.\n\t *\n\t * @param player Player path.\n\t * @param movieData Movie data.\n\t * @param func Async function.\n\t * @returns Return value of the async function.\n\t */\n\tpublic async withData<T>(\n\t\tplayer: string,\n\t\tmovieData: Readonly<Buffer> | null,\n\t\tfunc: ((self: this) => Promise<T>) | null = null\n\t) {\n\t\tawait this.openData(player, movieData);\n\t\ttry {\n\t\t\treturn func ? await func.call(this, this) : null;\n\t\t}\n\t\tfinally {\n\t\t\tawait this.close();\n\t\t}\n\t}\n\n\t/**\n\t * Get path for resource.\n\t *\n\t * @param destination Resource destination.\n\t * @returns Destination path.\n\t */\n\tpublic resourcePath(destination: string) {\n\t\treturn pathJoin(dirname(this.projector.path), destination);\n\t}\n\n\t/**\n\t * Check if path for resource exists.\n\t *\n\t * @param destination Resource destination.\n\t * @returns True if destination exists, else false.\n\t */\n\tpublic async resourceExists(destination: string) {\n\t\treturn !!fsLstatExists(this.resourcePath(destination));\n\t}\n\n\t/**\n\t * Copy resource, detecting source type automatically.\n\t *\n\t * @param destination Resource destination.\n\t * @param source Source directory.\n\t * @param options Resource options.\n\t */\n\tpublic async copyResource(\n\t\tdestination: string,\n\t\tsource: string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tconst stat = await fse.lstat(source);\n\t\tswitch (true) {\n\t\t\tcase stat.isSymbolicLink(): {\n\t\t\t\tawait this.copyResourceSymlink(destination, source, options);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase stat.isFile(): {\n\t\t\t\tawait this.copyResourceFile(destination, source, options);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase stat.isDirectory(): {\n\t\t\t\tawait this.copyResourceDirectory(destination, source, options);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new Error(`Unsupported resource type: ${source}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Copy directory as resource, recursive copy.\n\t *\n\t * @param destination Resource destination.\n\t * @param source Source directory.\n\t * @param options Resource options.\n\t */\n\tpublic async copyResourceDirectory(\n\t\tdestination: string,\n\t\tsource: string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\t// Create directory.\n\t\tawait this.createResourceDirectory(\n\t\t\tdestination,\n\t\t\toptions ? await this._expandResourceOptionsCopy(\n\t\t\t\toptions,\n\t\t\t\tasync () => fse.stat(source)\n\t\t\t) : options\n\t\t);\n\n\t\t// If not recursive do not walk contents.\n\t\tif (options && options.noRecurse) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Any directories we add should not be recursive.\n\t\tconst opts = {\n\t\t\t...(options || {}),\n\t\t\tnoRecurse: true\n\t\t};\n\t\tawait fsWalk(source, async (path, stat) => {\n\t\t\t// If this name is excluded, skip without descending.\n\t\t\tif (this.isExcludedFile(basename(path))) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tawait this.copyResource(\n\t\t\t\tpathJoin(destination, path),\n\t\t\t\tpathJoin(source, path),\n\t\t\t\topts\n\t\t\t);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\t/**\n\t * Copy file as resource.\n\t *\n\t * @param destination Resource destination.\n\t * @param source Source file.\n\t * @param options Resource options.\n\t */\n\tpublic async copyResourceFile(\n\t\tdestination: string,\n\t\tsource: string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tawait this.streamResourceFile(\n\t\t\tdestination,\n\t\t\tfse.createReadStream(source),\n\t\t\toptions ? await this._expandResourceOptionsCopy(\n\t\t\t\toptions,\n\t\t\t\tasync () => fse.stat(source)\n\t\t\t) : options\n\t\t);\n\t}\n\n\t/**\n\t * Copy symlink as resource.\n\t *\n\t * @param destination Resource destination.\n\t * @param source Source symlink.\n\t * @param options Resource options.\n\t */\n\tpublic async copyResourceSymlink(\n\t\tdestination: string,\n\t\tsource: string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tawait this.createResourceSymlink(\n\t\t\tdestination,\n\t\t\tawait fse.readlink(source),\n\t\t\toptions ? await this._expandResourceOptionsCopy(\n\t\t\t\toptions,\n\t\t\t\tasync () => fse.lstat(source)\n\t\t\t) : options\n\t\t);\n\t}\n\n\t/**\n\t * Create a resource directory.\n\t *\n\t * @param destination Resource destination.\n\t * @param options Resource options.\n\t */\n\tpublic async createResourceDirectory(\n\t\tdestination: string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tconst dest = await this._assertNotResourceExists(\n\t\t\tdestination,\n\t\t\t!!(options && options.merge)\n\t\t);\n\t\tawait fse.ensureDir(dest);\n\n\t\t// If either is set, queue up change times when closing.\n\t\tif (options && (options.atime || options.mtime)) {\n\t\t\t// Get absolute path, use length for the priority.\n\t\t\t// Also copy the options object which the owner could change.\n\t\t\tconst abs = resolve(dest);\n\t\t\tthis._closeQueue.push(\n\t\t\t\tthis._setResourceAttributes.bind(this, abs, {...options}),\n\t\t\t\tabs.length\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a resource file.\n\t *\n\t * @param destination Resource destination.\n\t * @param data Resource data.\n\t * @param options Resource options.\n\t */\n\tpublic async createResourceFile(\n\t\tdestination: string,\n\t\tdata: Readonly<Buffer> | string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tawait this.streamResourceFile(destination, new Readable({\n\t\t\tread() {\n\t\t\t\tthis.push(data);\n\t\t\t\tthis.push(null);\n\t\t\t}\n\t\t}), options);\n\t}\n\n\t/**\n\t * Create a resource symlink.\n\t *\n\t * @param destination Resource destination.\n\t * @param target Symlink target.\n\t * @param options Resource options.\n\t */\n\tpublic async createResourceSymlink(\n\t\tdestination: string,\n\t\ttarget: Readonly<Buffer> | string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tconst dest = await this._assertNotResourceExists(destination);\n\t\tawait fse.ensureDir(dirname(dest));\n\t\tawait fse.symlink(target as (string | Buffer), dest);\n\n\t\tif (options) {\n\t\t\tawait this._setResourceAttributes(dest, options);\n\t\t}\n\t}\n\n\t/**\n\t * Stream readable source to resource file.\n\t *\n\t * @param destination Resource destination.\n\t * @param data Resource stream.\n\t * @param options Resource options.\n\t */\n\tpublic async streamResourceFile(\n\t\tdestination: string,\n\t\tdata: Readable,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tconst dest = await this._assertNotResourceExists(destination);\n\t\tawait fse.ensureDir(dirname(dest));\n\t\tawait pipelineP(data, fse.createWriteStream(dest));\n\n\t\tif (options) {\n\t\t\tawait this._setResourceAttributes(dest, options);\n\t\t}\n\t}\n\n\t/**\n\t * Check that output path is valid, else throws.\n\t */\n\tprotected async _checkOutput() {\n\t\tfor (const p of [this.path, this.resourcePath('')]) {\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tif (await fse.pathExists(p)) {\n\t\t\t\tthrow new Error(`Output path already exists: ${p}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Expand resource options copy properties with stat object from source.\n\t *\n\t * @param options Options object.\n\t * @param stat Stat function.\n\t * @returns Options copy with any values populated.\n\t */\n\tprotected async _expandResourceOptionsCopy(\n\t\toptions: Readonly<IBundleResourceOptions>,\n\t\tstat: (() => Promise<{\n\t\t\tatime: Date;\n\t\t\tmtime: Date;\n\t\t\tmode: number;\n\t\t}>)\n\t) {\n\t\tconst r = {...options} as IBundleResourceOptions;\n\t\tconst st = once(stat);\n\t\tif (!r.atime && r.atimeCopy) {\n\t\t\tr.atime = (await st()).atime;\n\t\t}\n\t\tif (!r.mtime && r.mtimeCopy) {\n\t\t\tr.mtime = (await st()).mtime;\n\t\t}\n\t\tif (typeof r.executable !== 'boolean' && r.executableCopy) {\n\t\t\tr.executable = this._getResourceModeExecutable((await st()).mode);\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Set resource attributes from options object.\n\t *\n\t * @param path File path.\n\t * @param options Options object.\n\t */\n\tprotected async _setResourceAttributes(\n\t\tpath: string,\n\t\toptions: Readonly<IBundleResourceOptions>\n\t) {\n\t\tconst {atime, mtime, executable} = options;\n\t\tconst st = await fse.lstat(path);\n\n\t\t// Maybe set executable if not a directory and supported.\n\t\tif (typeof executable === 'boolean' && !st.isDirectory()) {\n\t\t\tif (!st.isSymbolicLink()) {\n\t\t\t\tawait fse.chmod(path, this._setResourceModeExecutable(\n\t\t\t\t\tst.mode,\n\t\t\t\t\texecutable\n\t\t\t\t));\n\t\t\t}\n\t\t\telse if (fsLchmodSupported) {\n\t\t\t\tawait fsLchmod(path, this._setResourceModeExecutable(\n\t\t\t\t\t// Workaround for a legacy Node issue.\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tst.mode & 0b111111111,\n\t\t\t\t\texecutable\n\t\t\t\t));\n\t\t\t}\n\t\t}\n\n\t\t// Maybe change times if either is set and supported.\n\t\tif (atime || mtime) {\n\t\t\tif (!st.isSymbolicLink()) {\n\t\t\t\tawait fse.utimes(path, atime || st.atime, mtime || st.mtime);\n\t\t\t}\n\t\t\telse if (fsLutimesSupported) {\n\t\t\t\tawait fsLutimes(path, atime || st.atime, mtime || st.mtime);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get file mode executable.\n\t *\n\t * @param mode Current mode.\n\t * @returns Is executable.\n\t */\n\tprotected _getResourceModeExecutable(mode: number) {\n\t\t// eslint-disable-next-line no-bitwise\n\t\treturn !!(mode & userExec);\n\t}\n\n\t/**\n\t * Set file mode executable.\n\t *\n\t * @param mode Current mode.\n\t * @param executable Is executable.\n\t * @returns File mode.\n\t */\n\tprotected _setResourceModeExecutable(mode: number, executable: boolean) {\n\t\t// eslint-disable-next-line no-bitwise\n\t\treturn (executable ? (mode | userExec) : (mode & ~userExec)) >>> 0;\n\t}\n\n\t/**\n\t * Open output with data.\n\t *\n\t * @param player Player path.\n\t * @param movieData Movie data.\n\t */\n\tprotected async _openData(\n\t\tplayer: string,\n\t\tmovieData: Readonly<Buffer> | null\n\t) {\n\t\tawait this.projector.withData(player, movieData);\n\t}\n\n\t/**\n\t * Close output.\n\t */\n\tprotected async _close() {\n\t\tawait this._writeLauncher();\n\t\tawait this._closeQueue.run();\n\t}\n\n\t/**\n\t * Assert bundle is open.\n\t */\n\tprotected _assertIsOpen() {\n\t\tif (!this._isOpen) {\n\t\t\tthrow new Error('Not open');\n\t\t}\n\t}\n\n\t/**\n\t * Assert resource does not exist, returning destination path.\n\t *\n\t * @param destination Resource destination.\n\t * @param ignoreDirectory Ignore directories.\n\t * @returns Destination path.\n\t */\n\tprotected async _assertNotResourceExists(\n\t\tdestination: string,\n\t\tignoreDirectory = false\n\t) {\n\t\tconst dest = this.resourcePath(destination);\n\t\tconst st = await fsLstatExists(dest);\n\t\tif (st && (!ignoreDirectory || !st.isDirectory())) {\n\t\t\tthrow new Error(`Resource path exists: ${dest}`);\n\t\t}\n\t\treturn dest;\n\t}\n\n\t/**\n\t * Main application file extension.\n\t *\n\t * @returns File extension.\n\t */\n\tpublic abstract get extension(): string;\n\n\t/**\n\t * Create projector instance for the bundle.\n\t *\n\t * @returns Projector instance.\n\t */\n\tprotected abstract _createProjector(): Projector;\n\n\t/**\n\t * Write the launcher file.\n\t */\n\tprotected abstract _writeLauncher(): Promise<void>;\n}\n"],"file":"bundle.mjs","sourceRoot":"../src"}
\No newline at end of file