{"version":3,"file":"sa.mjs","names":["readFile","fsLstatExists","concat","Projector","ProjectorSa","player","movieData","movieFile","constructor","path","movieMagic","write","Error","_checkOutput","_writePlayer","getMovieData","d","Uint8Array","buffer","byteOffset","byteLength","_encodeMovieData","data","format","parts","c","push","b","ArrayBuffer","v","DataView","setUint32","setInt32","length"],"sources":["../../src/projector/sa.ts"],"sourcesContent":["import {readFile} from 'node:fs/promises';\n\nimport {fsLstatExists} from '@shockpkg/archive-files';\n\nimport {concat} from '../util/internal/data.ts';\nimport {Projector} from '../projector.ts';\n\n/**\n * File patch.\n */\nexport interface IFilePatch {\n\t/**\n\t * Check if player file path matches.\n\t *\n\t * @param file File path.\n\t * @returns If matched.\n\t */\n\tmatch: (file: string) => boolean;\n\n\t/**\n\t * Modify data, possibly inplace.\n\t *\n\t * @param data The data to modify.\n\t * @returns Modified data.\n\t */\n\tmodify: (data: Uint8Array) => Promise<Uint8Array> | Uint8Array;\n\n\t/**\n\t * Run after all patches.\n\t */\n\tafter: () => Promise<void> | void;\n}\n\n/**\n * File filter.\n */\nexport interface IFileFilter {\n\t/**\n\t * Check if player file path matches.\n\t *\n\t * @param file File path.\n\t * @returns If excluded.\n\t */\n\tmatch: (file: string) => boolean;\n}\n\n/**\n * ProjectorSa object.\n */\nexport abstract class ProjectorSa extends Projector {\n\t/**\n\t * ProjectorSa Player.\n\t */\n\tpublic player: string | null = null;\n\n\t/**\n\t * Movie data.\n\t */\n\tpublic movieData:\n\t\t| Readonly<Uint8Array>\n\t\t| (() => Readonly<Uint8Array>)\n\t\t| (() => Promise<Readonly<Uint8Array>>)\n\t\t| null = null;\n\n\t/**\n\t * Movie file.\n\t */\n\tpublic movieFile: string | null = null;\n\n\t/**\n\t * ProjectorSa constructor.\n\t *\n\t * @param path Output path.\n\t */\n\tconstructor(path: string) {\n\t\tsuper(path);\n\t}\n\n\t/**\n\t * The movie appended magic.\n\t *\n\t * @returns Magic integer.\n\t */\n\tpublic get movieMagic() {\n\t\treturn 0xfa123456;\n\t}\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic async write() {\n\t\tconst {player} = this;\n\t\tif (!player) {\n\t\t\tthrow new Error('No projector player configured');\n\t\t}\n\n\t\tawait this._checkOutput();\n\t\tawait this._writePlayer(player);\n\t}\n\n\t/**\n\t * Get movie file data.\n\t *\n\t * @returns Movie data or null.\n\t */\n\tpublic async getMovieData() {\n\t\tconst {movieData, movieFile} = this;\n\t\tif (movieData) {\n\t\t\treturn typeof movieData === 'function' ? movieData() : movieData;\n\t\t}\n\t\tif (movieFile) {\n\t\t\tconst d = await readFile(movieFile);\n\t\t\treturn new Uint8Array(d.buffer, d.byteOffset, d.byteLength);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Check that output path is valid, else throws.\n\t */\n\tprotected async _checkOutput() {\n\t\tif (await fsLstatExists(this.path)) {\n\t\t\tthrow new Error(`Output path already exists: ${this.path}`);\n\t\t}\n\t}\n\n\t/**\n\t * Encode movie data for the projector.\n\t * Format string characters:\n\t * - d: Movie data.\n\t * - m: Magic, 32LE.\n\t * - M: Magic, 32BE.\n\t * - i: Magic, 64LE.\n\t * - I: Magic, 64BE.\n\t * - s: Size, 32LE.\n\t * - S: Size, 32BE.\n\t * - l: Size, 64LE.\n\t * - L: Size, 64BE.\n\t *\n\t * @param data Movie data.\n\t * @param format Format string.\n\t * @returns Encoded data.\n\t */\n\tprotected _encodeMovieData(data: Readonly<Uint8Array>, format: string) {\n\t\tconst parts: Readonly<Uint8Array>[] = [];\n\t\tfor (const c of format) {\n\t\t\tswitch (c) {\n\t\t\t\tcase 'd': {\n\t\t\t\t\tparts.push(data);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'm':\n\t\t\t\tcase 'M': {\n\t\t\t\t\tconst b = new ArrayBuffer(4);\n\t\t\t\t\tconst v = new DataView(b);\n\t\t\t\t\tv.setUint32(0, this.movieMagic, c === 'm');\n\t\t\t\t\tparts.push(new Uint8Array(b));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'i':\n\t\t\t\tcase 'I': {\n\t\t\t\t\t// 32-bit integer, sign extended to 64-bit.\n\t\t\t\t\tconst b = new ArrayBuffer(8);\n\t\t\t\t\tconst v = new DataView(b);\n\t\t\t\t\tconst {movieMagic} = this;\n\t\t\t\t\tif (c === 'i') {\n\t\t\t\t\t\t// eslint-disable-next-line no-bitwise, unicorn/prefer-math-trunc\n\t\t\t\t\t\tv.setInt32(0, movieMagic >> 0, true);\n\t\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\t\tv.setInt32(4, movieMagic >> 31, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// eslint-disable-next-line no-bitwise, unicorn/prefer-math-trunc\n\t\t\t\t\t\tv.setInt32(4, movieMagic >> 0, false);\n\t\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\t\tv.setInt32(0, movieMagic >> 31, false);\n\t\t\t\t\t}\n\t\t\t\t\tparts.push(new Uint8Array(b));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 's':\n\t\t\t\tcase 'S': {\n\t\t\t\t\tconst b = new ArrayBuffer(4);\n\t\t\t\t\tconst v = new DataView(b);\n\t\t\t\t\tv.setUint32(0, data.length, c === 's');\n\t\t\t\t\tparts.push(new Uint8Array(b));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'l':\n\t\t\t\tcase 'L': {\n\t\t\t\t\t// 64-bit, just write 32-bit, SWF cannot be larger.\n\t\t\t\t\tconst b = new ArrayBuffer(8);\n\t\t\t\t\tconst v = new DataView(b);\n\t\t\t\t\tif (c === 'l') {\n\t\t\t\t\t\tv.setUint32(0, data.length, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv.setUint32(4, data.length, false);\n\t\t\t\t\t}\n\t\t\t\t\tparts.push(new Uint8Array(b));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error(`Unknown format string character: ${c}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn concat(parts);\n\t}\n\n\t/**\n\t * Projector file extension.\n\t *\n\t * @returns File extension.\n\t */\n\tpublic abstract get extension(): string;\n\n\t/**\n\t * Write the projector player.\n\t *\n\t * @param player Player path.\n\t */\n\tprotected abstract _writePlayer(player: string): Promise<void>;\n}\n"],"mappings":"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","ignoreList":[]}