aboutsummaryrefslogtreecommitdiff
path: root/node_modules/nexe/lib/patches/boot-nexe.js
blob: d5aa8db26b3a5d7ea139766567f978351e85ec2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
"use strict";
const fs = require('fs'), fd = fs.openSync(process.execPath, 'r'), stat = fs.statSync(process.execPath), tailSize = Math.min(stat.size, 16000), tailWindow = Buffer.from(Array(tailSize));
fs.readSync(fd, tailWindow, 0, tailSize, stat.size - tailSize);
const footerPosition = tailWindow.indexOf('<nexe~~sentinel>');
if (footerPosition == -1) {
    throw 'Invalid Nexe binary';
}
const footer = tailWindow.slice(footerPosition, footerPosition + 32), contentSize = footer.readDoubleLE(16), resourceSize = footer.readDoubleLE(24), contentStart = stat.size - tailSize + footerPosition - resourceSize - contentSize, resourceStart = contentStart + contentSize;
Object.defineProperty(process, '__nexe', (function () {
    let nexeHeader = null;
    return {
        get: function () {
            return nexeHeader;
        },
        set: function (value) {
            if (nexeHeader) {
                throw new Error('This property is readonly');
            }
            nexeHeader = Object.assign({}, value, {
                blobPath: process.execPath,
                layout: {
                    stat,
                    contentSize,
                    contentStart,
                    resourceSize,
                    resourceStart,
                },
            });
            Object.freeze(nexeHeader);
        },
        enumerable: false,
        configurable: false,
    };
})());
const contentBuffer = Buffer.from(Array(contentSize)), Module = require('module');
fs.readSync(fd, contentBuffer, 0, contentSize, contentStart);
fs.closeSync(fd);
new Module(process.execPath, null)._compile(contentBuffer.toString(), process.execPath);