@shockpkg/dir-projector
Version:
Package for creating Shockwave Director projectors
1 lines • 11.4 kB
Source Map (JSON)
{"version":3,"file":"mac.mjs","names":["open","launcher","FAT_MAGIC","MH_MAGIC","MH_CIGAM","MH_MAGIC_64","MH_CIGAM_64","CPU_TYPE_POWERPC","CPU_TYPE_I386","machoTypesData","data","le","dv","DataView","buffer","byteOffset","byteLength","type","offset","cpuType","getUint32","cpuSubtype","magic","r","count","i","push","Error","toString","machoTypesFile","path","f","m","h","Uint8Array","bytesRead","read","subarray","v","n","d","set","close","machoAppLauncherThin","id","machoAppLauncherFat","types","align","alignSize","headD","headV","setUint32","length","pieces","total","add","pad","over","parts","body","Promise","all","map","then","piece","machoAppLauncher","Array","isArray"],"sources":["../../src/util/mac.ts"],"sourcesContent":["import {open} from 'node:fs/promises';\n\nimport {launcher} from '../util.ts';\n\nconst FAT_MAGIC = 0xcafebabe;\nconst MH_MAGIC = 0xfeedface;\nconst MH_CIGAM = 0xcefaedfe;\nconst MH_MAGIC_64 = 0xfeedfacf;\nconst MH_CIGAM_64 = 0xcffaedfe;\n\nconst CPU_TYPE_POWERPC = 0x00000012;\nconst CPU_TYPE_I386 = 0x00000007;\n\n/**\n * Mach-O type.\n */\nexport interface IMachoType {\n\t/**\n\t * CPU type.\n\t */\n\tcpuType: number;\n\n\t/**\n\t * CPU subtype.\n\t */\n\tcpuSubtype: number;\n}\n\n/**\n * Get types of Mach-O data, array if FAT binary, else a single object.\n *\n * @param data Mach-O data.\n * @returns Mach-O types.\n */\nexport function machoTypesData(data: Readonly<Uint8Array>) {\n\tlet le = false;\n\tconst dv = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n\t/**\n\t * Read type at offset.\n\t *\n\t * @param offset File offset.\n\t * @returns Type object.\n\t */\n\tconst type = (offset: number): IMachoType => ({\n\t\tcpuType: dv.getUint32(offset, le),\n\t\tcpuSubtype: dv.getUint32(offset + 4, le)\n\t});\n\n\tconst magic = dv.getUint32(0, le);\n\tswitch (magic) {\n\t\tcase FAT_MAGIC: {\n\t\t\tconst r = [];\n\t\t\tconst count = dv.getUint32(4, le);\n\t\t\tlet offset = 8;\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tr.push(type(offset));\n\t\t\t\toffset += 20;\n\t\t\t}\n\t\t\treturn r;\n\t\t}\n\t\tcase MH_MAGIC:\n\t\tcase MH_MAGIC_64: {\n\t\t\treturn type(4);\n\t\t}\n\t\tcase MH_CIGAM:\n\t\tcase MH_CIGAM_64: {\n\t\t\tle = true;\n\t\t\treturn type(4);\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Unknown header magic: 0x${magic.toString(16)}`);\n\t\t}\n\t}\n}\n\n/**\n * Get types of Mach-O file, array if FAT binary, else a single object.\n *\n * @param path Mach-O file.\n * @returns Mach-O types.\n */\nexport async function machoTypesFile(path: string) {\n\tlet data;\n\tconst f = await open(path, 'r');\n\ttry {\n\t\tconst m = 8;\n\t\tconst h = new Uint8Array(m);\n\t\tconst {bytesRead} = await f.read(h, 0, m, 0);\n\t\tif (bytesRead < m) {\n\t\t\tdata = h.subarray(0, bytesRead);\n\t\t} else {\n\t\t\tconst v = new DataView(h.buffer, h.byteOffset, h.byteLength);\n\t\t\tconst n =\n\t\t\t\tv.getUint32(0, false) === FAT_MAGIC\n\t\t\t\t\t? v.getUint32(4, false) * 20\n\t\t\t\t\t: 4;\n\t\t\tconst d = new Uint8Array(m + n);\n\t\t\td.set(h);\n\t\t\tconst {bytesRead} = await f.read(d, m, n, m);\n\t\t\tdata = d.subarray(0, m + bytesRead);\n\t\t}\n\t} finally {\n\t\tawait f.close();\n\t}\n\treturn machoTypesData(data);\n}\n\n/**\n * Get Mach-O app launcher for a single type.\n *\n * @param type Mach-O type.\n * @returns Launcher data.\n */\nexport async function machoAppLauncherThin(type: Readonly<IMachoType>) {\n\tconst {cpuType} = type;\n\tlet id = '';\n\tswitch (cpuType) {\n\t\tcase CPU_TYPE_POWERPC: {\n\t\t\tid = 'mac-app-ppc';\n\t\t\tbreak;\n\t\t}\n\t\tcase CPU_TYPE_I386: {\n\t\t\tid = 'mac-app-i386';\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Unknown CPU type: 0x${cpuType.toString(16)}`);\n\t\t}\n\t}\n\treturn launcher(id);\n}\n\n/**\n * Get Mach-O app launcher for a type list.\n *\n * @param types Mach-O types.\n * @returns Launcher data.\n */\nexport async function machoAppLauncherFat(\n\ttypes: readonly Readonly<IMachoType>[]\n) {\n\t// The lipo utility always uses 12/4096 for ppc, ppc64, i386, and x86_64.\n\tconst align = 12;\n\t// eslint-disable-next-line no-bitwise\n\tconst alignSize = (1 << align) >>> 0;\n\n\t// Create the FAT header.\n\tconst headD = new Uint8Array(8);\n\tconst headV = new DataView(\n\t\theadD.buffer,\n\t\theadD.byteOffset,\n\t\theadD.byteLength\n\t);\n\theadV.setUint32(0, FAT_MAGIC, false);\n\theadV.setUint32(4, types.length, false);\n\n\t// The pieces and their total length.\n\tconst pieces: Uint8Array[] = [headD];\n\tlet total = headD.length;\n\n\t/**\n\t * Helper to add pieces and update total length.\n\t *\n\t * @param data Data.\n\t */\n\tconst add = (data: Uint8Array) => {\n\t\tpieces.push(data);\n\t\ttotal += data.length;\n\t};\n\n\t/**\n\t * Helper to pad pieces.\n\t */\n\tconst pad = () => {\n\t\tconst over = total % alignSize;\n\t\tif (over) {\n\t\t\tadd(new Uint8Array(alignSize - over));\n\t\t}\n\t};\n\n\t// Create a head and get the body for each type.\n\tconst parts = [];\n\tfor (const {type, body} of await Promise.all(\n\t\ttypes.map(async type =>\n\t\t\tmachoAppLauncherThin(type).then(body => ({\n\t\t\t\ttype,\n\t\t\t\tbody\n\t\t\t}))\n\t\t)\n\t)) {\n\t\tconst headD = new Uint8Array(20);\n\t\tconst headV = new DataView(\n\t\t\theadD.buffer,\n\t\t\theadD.byteOffset,\n\t\t\theadD.byteLength\n\t\t);\n\t\theadV.setUint32(0, type.cpuType, false);\n\t\theadV.setUint32(4, type.cpuSubtype, false);\n\t\theadV.setUint32(16, align, false);\n\t\tparts.push({\n\t\t\theadV,\n\t\t\tbody\n\t\t});\n\t\tadd(headD);\n\t}\n\n\t// Add binaries aligned, updating their headers.\n\tfor (const {headV, body} of parts) {\n\t\tpad();\n\t\theadV.setUint32(8, total, false);\n\t\theadV.setUint32(12, body.length, false);\n\t\tadd(body);\n\t}\n\n\t// Merge all the pieces.\n\tconst r = new Uint8Array(total);\n\tlet i = 0;\n\tfor (const piece of pieces) {\n\t\tr.set(piece, i);\n\t\ti += piece.length;\n\t}\n\treturn r;\n}\n\n/**\n * Get Mach-O app launcher for a single or multiple types.\n *\n * @param types Mach-O types.\n * @returns Launcher data.\n */\nexport async function machoAppLauncher(\n\ttypes: Readonly<IMachoType> | readonly Readonly<IMachoType>[]\n) {\n\treturn Array.isArray(types)\n\t\t? machoAppLauncherFat(types)\n\t\t: machoAppLauncherThin(types as IMachoType);\n}\n"],"mappings":"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","ignoreList":[]}