UNPKG

@shockpkg/ria-packager

Version:

Package for creating Adobe AIR packages

1 lines 23.7 kB
{"version":3,"sources":["packager.ts"],"names":["join","pathJoin","basename","fse","ArchiveDir","ArchiveHdi","createArchiveByFileExtension","fsWalk","pathNormalize","Signature","HasherSha256","Packager","Object","constructor","path","_hasher","_createHasher","isOpen","_isOpen","open","applicationData","Error","_applicationInfoInit","_open","reset","_signature","signed","_createSignature","timestampUrl","keystore","_getKeystore","certificate","getCertificate","keyPrivate","getKeyPrivate","_addMetaResourcesStart","openFile","descriptorFile","readFile","close","_addMetaResourcesEnd","_close","_applicationInfoClear","with","func","r","call","withFile","isExcludedFile","name","exclude","excludes","test","addResourceFile","source","destination","options","opts","dest","stat","lstat","isSymbolicLink","isFile","executable","mode","data","addResource","mtime","addResourceDirectory","isDirectory","_isAddingResource","_addResource","_metaResourceMimetypePath","_metaResourceApplicationPath","_metaResourceHashPath","_metaResourceDebugPath","_metaResourceSignaturesPath","_getMimetypeData","Buffer","from","mimetype","hashed","update","signature","addFile","_writeResource","_addMetaResourceMimetype","_addMetaResourceApplication","_addMetaResourceHash","debug","_addMetaResourceDebug","_addMetaResourceSignatures","alloc","bytes","digest","sign","timestamp","encode","_openArchive","archive","nobrowse"],"mappings":"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","sourcesContent":["import {\n\tjoin as pathJoin,\n\tbasename\n} from 'path';\n\nimport fse from 'fs-extra';\nimport {\n\tArchiveDir,\n\tArchiveHdi,\n\tcreateArchiveByFileExtension,\n\tfsWalk,\n\tpathNormalize\n} from '@shockpkg/archive-files';\n\nimport {SecurityKeystore} from './security/keystore';\nimport {Signature} from './signature';\nimport {Hasher} from './hasher';\nimport {HasherSha256} from './hasher/sha256';\n\n/**\n * Options for adding resources.\n */\nexport interface IPackagerResourceOptions {\n\n\t/**\n\t * Mark file as executable.\n\t */\n\texecutable?: boolean | null;\n\n\t/**\n\t * Specific file modification time.\n\t */\n\tmtime?: Date | null;\n}\n\n/**\n * Packager constructor.\n *\n * @param path Output path.\n */\nexport abstract class Packager extends Object {\n\t/**\n\t * Make a debug build.\n\t */\n\tpublic debug = false;\n\n\t/**\n\t * Keystore object to use for signing.\n\t */\n\tpublic keystore: Readonly<SecurityKeystore> | null = null;\n\n\t/**\n\t * Timestamp URL.\n\t */\n\tpublic timestampUrl: string | null = null;\n\n\t/**\n\t * File and directory names to exclude when added 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 * Output path.\n\t */\n\tpublic readonly path: string;\n\n\t/**\n\t * Open flag.\n\t */\n\tprotected _isOpen = false;\n\n\t/**\n\t * Adding a resource flag.\n\t */\n\tprotected _isAddingResource = false;\n\n\t/**\n\t * Hasher object.\n\t */\n\tprotected _hasher: Hasher;\n\n\t/**\n\t * Signature object.\n\t */\n\tprotected _signature: Signature | null = null;\n\n\tconstructor(path: string) {\n\t\tsuper();\n\n\t\tthis._hasher = this._createHasher();\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 * Open with application descriptor XML data.\n\t *\n\t * @param applicationData XML data.\n\t */\n\tpublic async open(applicationData: Readonly<Buffer>) {\n\t\tif (this._isOpen) {\n\t\t\tthrow new Error('Already open');\n\t\t}\n\t\tthis._applicationInfoInit(applicationData);\n\t\tawait this._open(applicationData);\n\t\tthis._isOpen = true;\n\n\t\tthis._hasher.reset();\n\n\t\tthis._signature = null;\n\t\tif (this.signed) {\n\t\t\tthis._signature = this._createSignature();\n\t\t\tthis._signature.timestampUrl = this.timestampUrl;\n\n\t\t\tconst keystore = this._getKeystore();\n\t\t\tthis._signature.certificate = keystore.getCertificate();\n\t\t\tthis._signature.keyPrivate = keystore.getKeyPrivate();\n\t\t}\n\n\t\tawait this._addMetaResourcesStart(applicationData);\n\t}\n\n\t/**\n\t * Open with application descriptor file.\n\t *\n\t * @param descriptorFile Application descriptor file.\n\t */\n\tpublic async openFile(descriptorFile: string) {\n\t\tconst applicationData = await fse.readFile(descriptorFile);\n\t\tawait this.open(applicationData);\n\t}\n\n\t/**\n\t * Close output.\n\t */\n\tpublic async close() {\n\t\tif (!this._isOpen) {\n\t\t\tthrow new Error('Not open');\n\t\t}\n\t\tawait this._addMetaResourcesEnd();\n\t\tawait this._close();\n\t\tthis._isOpen = false;\n\t\tthis._applicationInfoClear();\n\n\t\tthis._hasher.reset();\n\t\tthis._signature = null;\n\t}\n\n\t/**\n\t * Run asyncronous function with automatic open and close.\n\t *\n\t * @param applicationData XML data.\n\t * @param func Async function.\n\t * @returns Return value of the async function.\n\t */\n\tpublic async with<T>(\n\t\tapplicationData: Readonly<Buffer>,\n\t\tfunc: (self: this) => Promise<T>\n\t): Promise<T> {\n\t\tawait this.open(applicationData);\n\t\tlet r: T;\n\t\ttry {\n\t\t\tr = await func.call(this, this);\n\t\t}\n\t\tfinally {\n\t\t\tawait this.close();\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Run asyncronous function with automatic open and close.\n\t *\n\t * @param descriptorFile Application descriptor 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\tdescriptorFile: string,\n\t\tfunc: (self: this) => Promise<T>\n\t): Promise<T> {\n\t\tawait this.openFile(descriptorFile);\n\t\tlet r: T;\n\t\ttry {\n\t\t\tr = await func.call(this, this);\n\t\t}\n\t\tfinally {\n\t\t\tawait this.close();\n\t\t}\n\t\treturn r;\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 * Add resource with file.\n\t *\n\t * @param source File path.\n\t * @param destination Packaged file relative destination.\n\t * @param options Resource options.\n\t */\n\tpublic async addResourceFile(\n\t\tsource: string,\n\t\tdestination: string | null = null,\n\t\toptions: Readonly<IPackagerResourceOptions> | null = null\n\t) {\n\t\tconst opts = options || {};\n\t\tconst dest = destination === null ? source : destination;\n\t\tconst stat = await fse.lstat(source);\n\n\t\t// Symlinks would only be allowed in a macOS native extension.\n\t\t// Throw an error like the official packager does.\n\t\tif (stat.isSymbolicLink()) {\n\t\t\tthrow new Error(`Cannot add symlink: ${source}`);\n\t\t}\n\n\t\t// Throw if not a regular file.\n\t\tif (!stat.isFile()) {\n\t\t\tthrow new Error(`Unsupported file type: ${source}`);\n\t\t}\n\n\t\tlet {executable} = opts;\n\t\tif (executable !== true && executable !== false) {\n\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\texecutable = !!(stat.mode & 0b001000000);\n\t\t}\n\n\t\tconst data = await fse.readFile(source);\n\t\tawait this.addResource(dest, data, {\n\t\t\texecutable,\n\t\t\tmtime: opts.mtime || stat.mtime\n\t\t});\n\t}\n\n\t/**\n\t * Add resource with directory.\n\t * Walks the directory looking for files to add, skips excluded file names.\n\t *\n\t * @param source Directory path.\n\t * @param destination Packaged directory relative destination.\n\t * @param options Resource options.\n\t */\n\tpublic async addResourceDirectory(\n\t\tsource: string,\n\t\tdestination: string | null = null,\n\t\toptions: Readonly<IPackagerResourceOptions> | null = null\n\t) {\n\t\tconst dest = destination === null ? source : destination;\n\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\t// Ignore directories, but descend into them.\n\t\t\t// Only files are listed in the ZIP packages.\n\t\t\t// Created automatically for files in any other package.\n\t\t\tif (stat.isDirectory()) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Anything else assume file.\n\t\t\tawait this.addResourceFile(\n\t\t\t\tpathJoin(source, path),\n\t\t\t\tpathJoin(dest, path),\n\t\t\t\toptions\n\t\t\t);\n\n\t\t\treturn true;\n\t\t});\n\t}\n\n\t/**\n\t * Add resource with data.\n\t *\n\t * @param destination Packaged file relative destination.\n\t * @param data Resource data.\n\t * @param options Resource options.\n\t */\n\tpublic async addResource(\n\t\tdestination: string,\n\t\tdata: Readonly<Buffer>,\n\t\toptions: Readonly<IPackagerResourceOptions> | null = null\n\t) {\n\t\tif (!this._isOpen) {\n\t\t\tthrow new Error('Not open');\n\t\t}\n\t\tif (this._isAddingResource) {\n\t\t\tthrow new Error('Resources must be added sequentially');\n\t\t}\n\t\tthis._isAddingResource = true;\n\t\tawait this._addResource(\n\t\t\tpathNormalize(destination),\n\t\t\tdata,\n\t\t\toptions || {},\n\t\t\ttrue,\n\t\t\ttrue\n\t\t);\n\t\tthis._isAddingResource = false;\n\t}\n\n\t/**\n\t * Create Hasher object.\n\t *\n\t * @returns Hasher object.\n\t */\n\tprotected _createHasher(): Hasher {\n\t\treturn new HasherSha256();\n\t}\n\n\t/**\n\t * Create Signature object.\n\t *\n\t * @returns Hasher object.\n\t */\n\tprotected _createSignature() {\n\t\treturn new Signature();\n\t}\n\n\t/**\n\t * Path of the mimetype meta resource.\n\t *\n\t * @returns Resource path.\n\t */\n\tprotected get _metaResourceMimetypePath() {\n\t\treturn 'mimetype';\n\t}\n\n\t/**\n\t * Path of the application meta resource.\n\t *\n\t * @returns Resource path.\n\t */\n\tprotected get _metaResourceApplicationPath() {\n\t\treturn 'META-INF/AIR/application.xml';\n\t}\n\n\t/**\n\t * Path of the hash meta resource.\n\t *\n\t * @returns Resource path.\n\t */\n\tprotected get _metaResourceHashPath() {\n\t\treturn 'META-INF/AIR/hash';\n\t}\n\n\t/**\n\t * Path of the debug meta resource.\n\t *\n\t * @returns Resource path.\n\t */\n\tprotected get _metaResourceDebugPath() {\n\t\treturn 'META-INF/AIR/debug';\n\t}\n\n\t/**\n\t * Path of the signatures meta resource.\n\t *\n\t * @returns Resource path.\n\t */\n\tprotected get _metaResourceSignaturesPath() {\n\t\treturn 'META-INF/signatures.xml';\n\t}\n\n\t/**\n\t * Get encoded mimetype data.\n\t *\n\t * @returns Mimetype buffer.\n\t */\n\tprotected _getMimetypeData() {\n\t\t// The mimetype if UTF-8.\n\t\treturn Buffer.from(this.mimetype, 'utf8');\n\t}\n\n\t/**\n\t * Get the keystore object.\n\t *\n\t * @returns Keystore object.\n\t */\n\tprotected _getKeystore() {\n\t\tconst r = this.keystore;\n\t\tif (!r) {\n\t\t\tthrow new Error('A keystore not set');\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Add resource with data, with options controlling hashing and signing.\n\t *\n\t * @param destination Packaged file relative destination.\n\t * @param data Resource data.\n\t * @param options Resource options.\n\t * @param hashed This file is hashed.\n\t * @param signed This file is signed.\n\t */\n\tprotected async _addResource(\n\t\tdestination: string,\n\t\tdata: Readonly<Buffer>,\n\t\toptions: Readonly<IPackagerResourceOptions>,\n\t\thashed: boolean,\n\t\tsigned: boolean\n\t) {\n\t\tif (hashed) {\n\t\t\tthis._hasher.update(data);\n\t\t}\n\t\tif (signed) {\n\t\t\tconst signature = this._signature;\n\t\t\tif (signature) {\n\t\t\t\tsignature.addFile(destination, data);\n\t\t\t}\n\t\t}\n\t\tawait this._writeResource(destination, data, options);\n\t}\n\n\t/**\n\t * Add meta resources start.\n\t *\n\t * @param applicationData XML data.\n\t */\n\tprotected async _addMetaResourcesStart(applicationData: Readonly<Buffer>) {\n\t\tawait this._addMetaResourceMimetype();\n\t\tawait this._addMetaResourceApplication(applicationData);\n\t\tawait this._addMetaResourceHash();\n\t\tif (this.debug) {\n\t\t\tawait this._addMetaResourceDebug();\n\t\t}\n\t}\n\n\t/**\n\t * Add meta resources end.\n\t */\n\tprotected async _addMetaResourcesEnd() {\n\t\tif (this.signed) {\n\t\t\tawait this._addMetaResourceSignatures();\n\t\t}\n\t}\n\n\t/**\n\t * Add meta resource for the mimetype.\n\t */\n\tprotected async _addMetaResourceMimetype() {\n\t\tconst path = this._metaResourceMimetypePath;\n\t\tconst data = this._getMimetypeData();\n\t\tawait this._addResource(path, data, {}, true, true);\n\t}\n\n\t/**\n\t * Add meta resource for the application descriptor.\n\t *\n\t * @param applicationData The application descriptor data.\n\t */\n\tprotected async _addMetaResourceApplication(\n\t\tapplicationData: Readonly<Buffer>\n\t) {\n\t\tconst path = this._metaResourceApplicationPath;\n\t\tawait this._addResource(path, applicationData, {}, true, true);\n\t}\n\n\t/**\n\t * Add meta resource for the hash (needs updating on close).\n\t */\n\tprotected async _addMetaResourceHash() {\n\t\tconst path = this._metaResourceHashPath;\n\t\tconst data = Buffer.alloc(this._hasher.bytes);\n\t\tawait this._addResource(path, data, {}, false, false);\n\t}\n\n\t/**\n\t * Add meta resource for debug.\n\t */\n\tprotected async _addMetaResourceDebug() {\n\t\tconst path = this._metaResourceDebugPath;\n\t\tconst data = Buffer.alloc(0);\n\t\tawait this._addResource(path, data, {}, true, true);\n\t}\n\n\t/**\n\t * Add resource for signatures.\n\t */\n\tprotected async _addMetaResourceSignatures() {\n\t\tconst path = this._metaResourceSignaturesPath;\n\t\tconst signature = this._signature;\n\t\tif (!signature) {\n\t\t\tthrow new Error('Internal error');\n\t\t}\n\n\t\tsignature.digest();\n\t\tsignature.sign();\n\t\tif (signature.timestampUrl) {\n\t\t\tawait signature.timestamp();\n\t\t}\n\n\t\tconst data = signature.encode();\n\t\tawait this._addResource(path, data, {}, false, false);\n\t}\n\n\t/**\n\t * Init application info from descriptor data.\n\t *\n\t * @param applicationData The application descriptor data.\n\t */\n\tprotected _applicationInfoInit(applicationData: Readonly<Buffer>) {\n\t\t// Do nothing.\n\t}\n\n\t/**\n\t * Clear application info from descriptor data.\n\t */\n\tprotected _applicationInfoClear() {\n\t\t// Do nothing.\n\t}\n\n\t/**\n\t * Open path as archive.\n\t *\n\t * @param path Archive path.\n\t * @returns Archive instance.\n\t */\n\tprotected async _openArchive(path: string) {\n\t\tconst stat = await fse.stat(path);\n\t\tif (stat.isDirectory()) {\n\t\t\treturn new ArchiveDir(path);\n\t\t}\n\t\tconst archive = createArchiveByFileExtension(path);\n\t\tif (!archive) {\n\t\t\tthrow new Error(`Unrecognized archive format: ${path}`);\n\t\t}\n\t\tif (archive instanceof ArchiveHdi) {\n\t\t\tarchive.nobrowse = true;\n\t\t}\n\t\treturn archive;\n\t}\n\n\t/**\n\t * Package mimetype.\n\t *\n\t * @returns Mimetype string.\n\t */\n\tpublic abstract get mimetype(): string;\n\n\t/**\n\t * Package signed.\n\t *\n\t * @returns Boolean for if package is signed or not.\n\t */\n\tpublic abstract get signed(): boolean;\n\n\t/**\n\t * Open implementation.\n\t *\n\t * @param applicationData The application descriptor data.\n\t */\n\tprotected abstract _open(applicationData: Readonly<Buffer>): Promise<void>;\n\n\t/**\n\t * Close implementation.\n\t */\n\tprotected abstract _close(): Promise<void>;\n\n\t/**\n\t * Write resource with data implementation.\n\t *\n\t * @param destination Packaged file relative destination.\n\t * @param data Resource data.\n\t * @param options Resource options.\n\t */\n\tprotected abstract _writeResource(\n\t\tdestination: string,\n\t\tdata: Readonly<Buffer>,\n\t\toptions: Readonly<IPackagerResourceOptions>\n\t): Promise<void>;\n}\n"],"file":"packager.mjs","sourceRoot":"../src"}