mirror of
https://github.com/samsonjs/vibetunnel.git
synced 2026-04-27 15:17:38 +00:00
restore working file
This commit is contained in:
parent
35ef2c4e2c
commit
0587057522
1 changed files with 93 additions and 308 deletions
|
|
@ -116,150 +116,73 @@ if (nodeVersion < 20) {
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to check if modules need rebuild
|
|
||||||
function getNodeABI(nodePath) {
|
|
||||||
try {
|
|
||||||
const version = execSync(`"${nodePath}" --version`, { encoding: 'utf8' }).trim();
|
|
||||||
// Extract major version for ABI compatibility check
|
|
||||||
const major = parseInt(version.split('.')[0].substring(1));
|
|
||||||
return { version, major };
|
|
||||||
} catch (e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkNativeModulesExist() {
|
|
||||||
// Check multiple possible locations for native modules
|
|
||||||
const ptyLocations = [
|
|
||||||
'node_modules/@homebridge/node-pty-prebuilt-multiarch/build/Release/pty.node',
|
|
||||||
`node_modules/@homebridge/node-pty-prebuilt-multiarch/prebuilds/${process.platform}-${process.arch}/pty.node`,
|
|
||||||
`node_modules/@homebridge/node-pty-prebuilt-multiarch/prebuilds/${process.platform}-${process.arch}/node-pty.node`
|
|
||||||
];
|
|
||||||
|
|
||||||
const spawnHelperLocations = [
|
|
||||||
'node_modules/@homebridge/node-pty-prebuilt-multiarch/build/Release/spawn-helper',
|
|
||||||
'node_modules/@homebridge/node-pty-prebuilt-multiarch/lib/binding/Release/spawn-helper',
|
|
||||||
'node_modules/@homebridge/node-pty-prebuilt-multiarch/spawn-helper'
|
|
||||||
];
|
|
||||||
|
|
||||||
const pamLocations = [
|
|
||||||
'node_modules/authenticate-pam/build/Release/authenticate_pam.node',
|
|
||||||
'node_modules/authenticate-pam/lib/binding/Release/authenticate_pam.node',
|
|
||||||
`node_modules/authenticate-pam/prebuilds/${process.platform}-${process.arch}/authenticate_pam.node`
|
|
||||||
];
|
|
||||||
|
|
||||||
const ptyExists = ptyLocations.some(loc => fs.existsSync(path.join(__dirname, loc)));
|
|
||||||
const spawnHelperExists = process.platform === 'win32' || spawnHelperLocations.some(loc => fs.existsSync(path.join(__dirname, loc)));
|
|
||||||
const pamExists = pamLocations.some(loc => fs.existsSync(path.join(__dirname, loc)));
|
|
||||||
|
|
||||||
if (!ptyExists) console.log('Missing native module: pty.node');
|
|
||||||
if (!spawnHelperExists) console.log('Missing native module: spawn-helper');
|
|
||||||
if (!pamExists) console.log('Missing native module: authenticate_pam.node');
|
|
||||||
|
|
||||||
return ptyExists && spawnHelperExists && pamExists;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isNodePtyPatched() {
|
|
||||||
const loaderPath = path.join(__dirname, 'node_modules/@homebridge/node-pty-prebuilt-multiarch/lib/prebuild-loader.js');
|
|
||||||
if (!fs.existsSync(loaderPath)) return false;
|
|
||||||
|
|
||||||
const content = fs.readFileSync(loaderPath, 'utf8');
|
|
||||||
return content.includes('Custom loader for SEA');
|
|
||||||
}
|
|
||||||
|
|
||||||
function patchNodePty() {
|
function patchNodePty() {
|
||||||
console.log('Preparing node-pty for SEA build...');
|
console.log('Preparing node-pty for SEA build...');
|
||||||
|
|
||||||
const needsRebuild = customNodePath !== null;
|
// Always reinstall to ensure clean state
|
||||||
const modulesExist = checkNativeModulesExist();
|
console.log('Reinstalling node-pty to ensure clean state...');
|
||||||
const alreadyPatched = isNodePtyPatched();
|
execSync('rm -rf node_modules/@homebridge/node-pty-prebuilt-multiarch', { stdio: 'inherit' });
|
||||||
|
execSync('npm install @homebridge/node-pty-prebuilt-multiarch --silent --no-fund --no-audit', { stdio: 'inherit' });
|
||||||
// Determine if we need to do anything
|
|
||||||
if (!needsRebuild && modulesExist && alreadyPatched) {
|
|
||||||
console.log('✓ Native modules exist and are already patched for SEA, skipping preparation');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check ABI compatibility if using custom Node.js
|
// If using custom Node.js, rebuild native modules
|
||||||
let abiMismatch = false;
|
|
||||||
if (customNodePath) {
|
if (customNodePath) {
|
||||||
const customABI = getNodeABI(customNodePath);
|
console.log('Custom Node.js detected - rebuilding native modules...');
|
||||||
const systemABI = getNodeABI(process.execPath);
|
|
||||||
|
|
||||||
if (customABI && systemABI) {
|
|
||||||
abiMismatch = customABI.major !== systemABI.major;
|
|
||||||
console.log(`Custom Node.js: ${customABI.version} (ABI v${customABI.major})`);
|
|
||||||
console.log(`System Node.js: ${systemABI.version} (ABI v${systemABI.major})`);
|
|
||||||
|
|
||||||
if (!abiMismatch) {
|
|
||||||
console.log('✓ ABI versions match, rebuild may not be necessary');
|
|
||||||
} else {
|
|
||||||
console.log('⚠️ ABI versions differ, rebuild required');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only reinstall/rebuild if necessary
|
// Get versions
|
||||||
if (!modulesExist || (customNodePath && abiMismatch)) {
|
const customVersion = execSync(`"${customNodePath}" --version`, { encoding: 'utf8' }).trim();
|
||||||
if (!modulesExist) {
|
const systemVersion = process.version;
|
||||||
console.log('Native modules missing, installing...');
|
|
||||||
|
console.log(`Custom Node.js: ${customVersion}`);
|
||||||
// Ensure node_modules exists and has proper modules
|
console.log(`System Node.js: ${systemVersion}`);
|
||||||
if (!fs.existsSync('node_modules/@homebridge/node-pty-prebuilt-multiarch') ||
|
|
||||||
!fs.existsSync('node_modules/authenticate-pam')) {
|
// Rebuild node-pty with the custom Node using npm rebuild
|
||||||
console.log('Installing missing native modules...');
|
console.log('Rebuilding @homebridge/node-pty-prebuilt-multiarch with custom Node.js...');
|
||||||
execSync('pnpm install --silent', { stdio: 'inherit' });
|
|
||||||
}
|
try {
|
||||||
|
// Use the custom Node to rebuild native modules
|
||||||
// After install, check if native modules were built
|
execSync(`"${customNodePath}" "$(which npm)" rebuild @homebridge/node-pty-prebuilt-multiarch authenticate-pam`, {
|
||||||
if (!checkNativeModulesExist()) {
|
stdio: 'inherit',
|
||||||
console.log('Native modules need to be built...');
|
env: {
|
||||||
// Force rebuild
|
...process.env,
|
||||||
execSync('pnpm rebuild @homebridge/node-pty-prebuilt-multiarch authenticate-pam', {
|
npm_config_runtime: 'node',
|
||||||
stdio: 'inherit',
|
npm_config_target: customVersion.substring(1), // Remove 'v' prefix
|
||||||
env: {
|
npm_config_arch: process.arch,
|
||||||
...process.env,
|
npm_config_target_arch: process.arch,
|
||||||
npm_config_build_from_source: 'true'
|
npm_config_disturl: 'https://nodejs.org/dist',
|
||||||
}
|
npm_config_build_from_source: 'true',
|
||||||
});
|
CXXFLAGS: '-std=c++20 -stdlib=libc++ -mmacosx-version-min=14.0',
|
||||||
}
|
MACOSX_DEPLOYMENT_TARGET: '14.0'
|
||||||
}
|
}
|
||||||
|
});
|
||||||
if (customNodePath && abiMismatch) {
|
console.log('Native modules rebuilt successfully with custom Node.js');
|
||||||
console.log('Rebuilding native modules for custom Node.js ABI...');
|
} catch (error) {
|
||||||
|
console.error('Failed to rebuild native module:', error.message);
|
||||||
const customVersion = getNodeABI(customNodePath).version;
|
console.error('Trying alternative rebuild method...');
|
||||||
|
|
||||||
|
// Alternative: Force rebuild from source
|
||||||
try {
|
try {
|
||||||
// Rebuild both modules for the custom Node.js version
|
execSync(`rm -rf node_modules/@homebridge/node-pty-prebuilt-multiarch/build`, { stdio: 'inherit' });
|
||||||
execSync(`pnpm rebuild @homebridge/node-pty-prebuilt-multiarch authenticate-pam`, {
|
execSync(`"${customNodePath}" "$(which npm)" install @homebridge/node-pty-prebuilt-multiarch --build-from-source`, {
|
||||||
stdio: 'inherit',
|
stdio: 'inherit',
|
||||||
env: {
|
env: {
|
||||||
...process.env,
|
...process.env,
|
||||||
npm_config_runtime: 'node',
|
npm_config_runtime: 'node',
|
||||||
npm_config_target: customVersion.substring(1), // Remove 'v' prefix
|
npm_config_target: customVersion.substring(1),
|
||||||
npm_config_arch: process.arch,
|
npm_config_arch: process.arch,
|
||||||
npm_config_target_arch: process.arch,
|
npm_config_target_arch: process.arch,
|
||||||
npm_config_disturl: 'https://nodejs.org/dist',
|
npm_config_disturl: 'https://nodejs.org/dist',
|
||||||
npm_config_build_from_source: 'true',
|
|
||||||
CXXFLAGS: '-std=c++20 -stdlib=libc++ -mmacosx-version-min=14.0',
|
CXXFLAGS: '-std=c++20 -stdlib=libc++ -mmacosx-version-min=14.0',
|
||||||
MACOSX_DEPLOYMENT_TARGET: '14.0'
|
MACOSX_DEPLOYMENT_TARGET: '14.0'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
console.log('✓ Native modules rebuilt successfully');
|
console.log('Native module rebuilt from source successfully');
|
||||||
} catch (error) {
|
} catch (error2) {
|
||||||
console.error('Failed to rebuild native modules:', error.message);
|
console.error('Alternative rebuild also failed:', error2.message);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only patch if not already patched - re-patching is causing corruption
|
|
||||||
if (alreadyPatched) {
|
|
||||||
console.log('✓ node-pty already patched for SEA, skipping patch step');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('Patching node-pty for SEA build...');
|
console.log('Patching node-pty for SEA build...');
|
||||||
|
|
||||||
// Patch prebuild-loader.js to use process.dlopen instead of require
|
// Patch prebuild-loader.js to use process.dlopen instead of require
|
||||||
|
|
@ -314,8 +237,7 @@ try {
|
||||||
exports.default = pty;
|
exports.default = pty;
|
||||||
//# sourceMappingURL=prebuild-loader.js.map`;
|
//# sourceMappingURL=prebuild-loader.js.map`;
|
||||||
|
|
||||||
// Ensure proper newline at end of file
|
fs.writeFileSync(prebuildLoaderFile, prebuildLoaderContent);
|
||||||
fs.writeFileSync(prebuildLoaderFile, prebuildLoaderContent.trimEnd() + '\n');
|
|
||||||
|
|
||||||
// Also patch windowsPtyAgent.js if it exists
|
// Also patch windowsPtyAgent.js if it exists
|
||||||
const windowsPtyAgentFile = path.join(__dirname, 'node_modules/@homebridge/node-pty-prebuilt-multiarch/lib/windowsPtyAgent.js');
|
const windowsPtyAgentFile = path.join(__dirname, 'node_modules/@homebridge/node-pty-prebuilt-multiarch/lib/windowsPtyAgent.js');
|
||||||
|
|
@ -326,7 +248,7 @@ exports.default = pty;
|
||||||
/require\(['"]\.\.\/build\/Release\/pty\.node['"]\)/g,
|
/require\(['"]\.\.\/build\/Release\/pty\.node['"]\)/g,
|
||||||
"require('./prebuild-loader').default"
|
"require('./prebuild-loader').default"
|
||||||
);
|
);
|
||||||
fs.writeFileSync(windowsPtyAgentFile, content.trimEnd() + '\n');
|
fs.writeFileSync(windowsPtyAgentFile, content);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Patch index.js exports.native line
|
// Patch index.js exports.native line
|
||||||
|
|
@ -338,50 +260,16 @@ exports.default = pty;
|
||||||
/exports\.native = \(process\.platform !== 'win32' \? require\(prebuild_file_path_1\.ptyPath \|\| '\.\.\/build\/Release\/pty\.node'\) : null\);/,
|
/exports\.native = \(process\.platform !== 'win32' \? require\(prebuild_file_path_1\.ptyPath \|\| '\.\.\/build\/Release\/pty\.node'\) : null\);/,
|
||||||
"exports.native = (process.platform !== 'win32' ? require('./prebuild-loader').default : null);"
|
"exports.native = (process.platform !== 'win32' ? require('./prebuild-loader').default : null);"
|
||||||
);
|
);
|
||||||
fs.writeFileSync(indexFile, content.trimEnd() + '\n');
|
fs.writeFileSync(indexFile, content);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Patch unixTerminal.js to fix spawn-helper path resolution
|
// Patch unixTerminal.js to fix spawn-helper path resolution
|
||||||
const unixTerminalFile = path.join(__dirname, 'node_modules/@homebridge/node-pty-prebuilt-multiarch/lib/unixTerminal.js');
|
const unixTerminalFile = path.join(__dirname, 'node_modules/@homebridge/node-pty-prebuilt-multiarch/lib/unixTerminal.js');
|
||||||
if (fs.existsSync(unixTerminalFile)) {
|
if (fs.existsSync(unixTerminalFile)) {
|
||||||
let content = fs.readFileSync(unixTerminalFile, 'utf8');
|
let content = fs.readFileSync(unixTerminalFile, 'utf8');
|
||||||
|
|
||||||
// Always re-patch to ensure consistency
|
// Replace the helperPath resolution logic
|
||||||
if (content.includes('// For SEA, use spawn-helper from environment')) {
|
const helperPathPatch = `var helperPath;
|
||||||
console.log('Re-patching unixTerminal.js for consistency...');
|
|
||||||
// Find where helperPath is originally declared
|
|
||||||
const helperPathDecl = content.match(/var helperPath[^;]*;/);
|
|
||||||
if (helperPathDecl) {
|
|
||||||
// Replace everything from the declaration to the next var/const/let/function
|
|
||||||
const startPos = content.indexOf(helperPathDecl[0]);
|
|
||||||
const afterDecl = startPos + helperPathDecl[0].length;
|
|
||||||
|
|
||||||
// Find the next major declaration or class definition
|
|
||||||
const nextDeclMatch = content.substring(afterDecl).match(/^(var|const|let|function|class|\nvar|\nconst|\nlet|\nfunction|\nclass)/m);
|
|
||||||
let endPos;
|
|
||||||
if (nextDeclMatch) {
|
|
||||||
endPos = afterDecl + nextDeclMatch.index;
|
|
||||||
} else {
|
|
||||||
// Fallback: just remove up to DEFAULT_FILE declaration which we know exists
|
|
||||||
const defaultFilePos = content.indexOf('var DEFAULT_FILE');
|
|
||||||
endPos = defaultFilePos > startPos ? defaultFilePos : content.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore to just the original declaration
|
|
||||||
content = content.substring(0, afterDecl) + '\n' + content.substring(endPos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find where helperPath is defined
|
|
||||||
const helperPathMatch = content.match(/var helperPath[^;]*;/);
|
|
||||||
if (!helperPathMatch) {
|
|
||||||
console.log('Warning: Could not find helperPath declaration in unixTerminal.js');
|
|
||||||
} else {
|
|
||||||
// Find the position right after var helperPath;
|
|
||||||
const insertPosition = content.indexOf(helperPathMatch[0]) + helperPathMatch[0].length;
|
|
||||||
|
|
||||||
// Insert our patch
|
|
||||||
const helperPathPatch = `
|
|
||||||
// For SEA, use spawn-helper from environment or next to executable
|
// For SEA, use spawn-helper from environment or next to executable
|
||||||
if (process.env.NODE_PTY_SPAWN_HELPER_PATH) {
|
if (process.env.NODE_PTY_SPAWN_HELPER_PATH) {
|
||||||
helperPath = process.env.NODE_PTY_SPAWN_HELPER_PATH;
|
helperPath = process.env.NODE_PTY_SPAWN_HELPER_PATH;
|
||||||
|
|
@ -399,12 +287,14 @@ if (process.env.NODE_PTY_SPAWN_HELPER_PATH) {
|
||||||
helperPath = helperPath.replace('node_modules.asar', 'node_modules.asar.unpacked');
|
helperPath = helperPath.replace('node_modules.asar', 'node_modules.asar.unpacked');
|
||||||
}
|
}
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
// Insert the patch after the helperPath declaration
|
// Find and replace the helperPath section
|
||||||
content = content.substring(0, insertPosition) + helperPathPatch + content.substring(insertPosition);
|
content = content.replace(
|
||||||
|
/var helperPath;[\s\S]*?helperPath = helperPath\.replace\('node_modules\.asar', 'node_modules\.asar\.unpacked'\);/m,
|
||||||
fs.writeFileSync(unixTerminalFile, content.trimEnd() + '\n');
|
helperPathPatch
|
||||||
}
|
);
|
||||||
|
|
||||||
|
fs.writeFileSync(unixTerminalFile, content);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('Patched node-pty to use process.dlopen() instead of require().');
|
console.log('Patched node-pty to use process.dlopen() instead of require().');
|
||||||
|
|
@ -556,152 +446,47 @@ async function main() {
|
||||||
console.log('Copying native modules...');
|
console.log('Copying native modules...');
|
||||||
const nativeModulesDir = 'node_modules/@homebridge/node-pty-prebuilt-multiarch/build/Release';
|
const nativeModulesDir = 'node_modules/@homebridge/node-pty-prebuilt-multiarch/build/Release';
|
||||||
|
|
||||||
// Debug: List what's in the module directory
|
|
||||||
const ptyModuleDir = 'node_modules/@homebridge/node-pty-prebuilt-multiarch';
|
|
||||||
if (fs.existsSync(ptyModuleDir)) {
|
|
||||||
console.log('node-pty module directory structure:');
|
|
||||||
try {
|
|
||||||
execSync(`find ${ptyModuleDir} -name "*.node" -o -name "spawn-helper" | head -20`, { stdio: 'inherit' });
|
|
||||||
} catch (e) {
|
|
||||||
// Fallback for Windows or if find command fails
|
|
||||||
console.log('Could not list directory structure');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if native modules exist
|
// Check if native modules exist
|
||||||
if (!fs.existsSync(nativeModulesDir)) {
|
if (!fs.existsSync(nativeModulesDir)) {
|
||||||
console.error(`Error: Native modules directory not found at ${nativeModulesDir}`);
|
console.error(`Error: Native modules directory not found at ${nativeModulesDir}`);
|
||||||
console.error('Attempting to rebuild native modules...');
|
console.error('This usually means the native module build failed.');
|
||||||
|
|
||||||
// Try to rebuild the native modules
|
|
||||||
try {
|
|
||||||
console.log('Removing and reinstalling @homebridge/node-pty-prebuilt-multiarch...');
|
|
||||||
execSync('rm -rf node_modules/@homebridge/node-pty-prebuilt-multiarch', { stdio: 'inherit' });
|
|
||||||
execSync('pnpm install @homebridge/node-pty-prebuilt-multiarch --force', { stdio: 'inherit' });
|
|
||||||
|
|
||||||
// Check again
|
|
||||||
if (!fs.existsSync(nativeModulesDir)) {
|
|
||||||
console.error('Native module rebuild failed. Checking for prebuilt binaries...');
|
|
||||||
|
|
||||||
// Check for prebuilt binaries in alternative locations
|
|
||||||
const prebuildDir = 'node_modules/@homebridge/node-pty-prebuilt-multiarch/prebuilds';
|
|
||||||
if (fs.existsSync(prebuildDir)) {
|
|
||||||
console.log('Found prebuilds directory, listing contents:');
|
|
||||||
execSync(`ls -la ${prebuildDir}`, { stdio: 'inherit' });
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error('Native modules still not found after rebuild attempt');
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error('Failed to rebuild native modules:', e.message);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Function to find and copy native modules
|
|
||||||
function findAndCopyNativeModules() {
|
|
||||||
// First try the build directory
|
|
||||||
const ptyNodePath = path.join(nativeModulesDir, 'pty.node');
|
|
||||||
const spawnHelperPath = path.join(nativeModulesDir, 'spawn-helper');
|
|
||||||
|
|
||||||
if (fs.existsSync(ptyNodePath)) {
|
|
||||||
fs.copyFileSync(ptyNodePath, 'native/pty.node');
|
|
||||||
console.log(' - Copied pty.node from build directory');
|
|
||||||
} else {
|
|
||||||
// Try to find prebuilt binary
|
|
||||||
const modulePath = 'node_modules/@homebridge/node-pty-prebuilt-multiarch';
|
|
||||||
const platform = process.platform;
|
|
||||||
const arch = process.arch;
|
|
||||||
|
|
||||||
// Common prebuilt locations
|
|
||||||
const prebuiltPaths = [
|
|
||||||
path.join(modulePath, `prebuilds/${platform}-${arch}/pty.node`),
|
|
||||||
path.join(modulePath, `prebuilds/${platform}-${arch}/node-pty.node`),
|
|
||||||
path.join(modulePath, `lib/binding/Release/pty.node`),
|
|
||||||
path.join(modulePath, `lib/binding/Release/node-pty.node`)
|
|
||||||
];
|
|
||||||
|
|
||||||
let found = false;
|
|
||||||
for (const prebuildPath of prebuiltPaths) {
|
|
||||||
if (fs.existsSync(prebuildPath)) {
|
|
||||||
fs.copyFileSync(prebuildPath, 'native/pty.node');
|
|
||||||
console.log(` - Copied pty.node from prebuilt: ${prebuildPath}`);
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
console.error('Error: pty.node not found in any expected location');
|
|
||||||
console.error('Searched locations:', prebuiltPaths);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy spawn-helper (Unix only)
|
|
||||||
if (process.platform !== 'win32') {
|
|
||||||
if (fs.existsSync(spawnHelperPath)) {
|
|
||||||
fs.copyFileSync(spawnHelperPath, 'native/spawn-helper');
|
|
||||||
fs.chmodSync('native/spawn-helper', 0o755);
|
|
||||||
console.log(' - Copied spawn-helper from build directory');
|
|
||||||
} else {
|
|
||||||
// Try to find prebuilt spawn-helper
|
|
||||||
const modulePath = 'node_modules/@homebridge/node-pty-prebuilt-multiarch';
|
|
||||||
const spawnHelperPaths = [
|
|
||||||
path.join(modulePath, 'lib/binding/Release/spawn-helper'),
|
|
||||||
path.join(modulePath, 'prebuilds/spawn-helper'),
|
|
||||||
path.join(modulePath, 'spawn-helper')
|
|
||||||
];
|
|
||||||
|
|
||||||
let found = false;
|
|
||||||
for (const helperPath of spawnHelperPaths) {
|
|
||||||
if (fs.existsSync(helperPath)) {
|
|
||||||
fs.copyFileSync(helperPath, 'native/spawn-helper');
|
|
||||||
fs.chmodSync('native/spawn-helper', 0o755);
|
|
||||||
console.log(` - Copied spawn-helper from: ${helperPath}`);
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
console.error('Error: spawn-helper not found in any expected location');
|
|
||||||
console.error('Searched locations:', spawnHelperPaths);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy native modules
|
|
||||||
findAndCopyNativeModules();
|
|
||||||
|
|
||||||
// Copy authenticate_pam.node (REQUIRED)
|
|
||||||
const authPamPaths = [
|
|
||||||
'node_modules/authenticate-pam/build/Release/authenticate_pam.node',
|
|
||||||
'node_modules/authenticate-pam/lib/binding/Release/authenticate_pam.node',
|
|
||||||
'node_modules/authenticate-pam/prebuilds/darwin-arm64/authenticate_pam.node',
|
|
||||||
'node_modules/authenticate-pam/prebuilds/darwin-x64/authenticate_pam.node'
|
|
||||||
];
|
|
||||||
|
|
||||||
let pamFound = false;
|
|
||||||
for (const authPamPath of authPamPaths) {
|
|
||||||
if (fs.existsSync(authPamPath)) {
|
|
||||||
fs.copyFileSync(authPamPath, 'native/authenticate_pam.node');
|
|
||||||
console.log(` - Copied authenticate_pam.node from: ${authPamPath}`);
|
|
||||||
pamFound = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pamFound) {
|
|
||||||
console.error('Error: authenticate_pam.node not found.');
|
|
||||||
console.error('Searched locations:', authPamPaths);
|
|
||||||
console.error('This should have been built by patchNodePty() function.');
|
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// No need to restore - the patched version works fine for development too
|
// Copy pty.node
|
||||||
|
const ptyNodePath = path.join(nativeModulesDir, 'pty.node');
|
||||||
|
if (!fs.existsSync(ptyNodePath)) {
|
||||||
|
console.error('Error: pty.node not found. Native module build may have failed.');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
fs.copyFileSync(ptyNodePath, 'native/pty.node');
|
||||||
|
console.log(' - Copied pty.node');
|
||||||
|
|
||||||
|
// Copy spawn-helper (Unix only)
|
||||||
|
if (process.platform !== 'win32') {
|
||||||
|
const spawnHelperPath = path.join(nativeModulesDir, 'spawn-helper');
|
||||||
|
if (!fs.existsSync(spawnHelperPath)) {
|
||||||
|
console.error('Error: spawn-helper not found. Native module build may have failed.');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
fs.copyFileSync(spawnHelperPath, 'native/spawn-helper');
|
||||||
|
fs.chmodSync('native/spawn-helper', 0o755);
|
||||||
|
console.log(' - Copied spawn-helper');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy authenticate_pam.node
|
||||||
|
const authPamPath = 'node_modules/authenticate-pam/build/Release/authenticate_pam.node';
|
||||||
|
if (fs.existsSync(authPamPath)) {
|
||||||
|
fs.copyFileSync(authPamPath, 'native/authenticate_pam.node');
|
||||||
|
console.log(' - Copied authenticate_pam.node');
|
||||||
|
} else {
|
||||||
|
console.warn('Warning: authenticate_pam.node not found. PAM authentication may not work.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 9. Restore original node-pty (AFTER copying the custom-built version)
|
||||||
|
console.log('\nRestoring original node-pty for development...');
|
||||||
|
execSync('rm -rf node_modules/@homebridge/node-pty-prebuilt-multiarch', { stdio: 'inherit' });
|
||||||
|
execSync('npm install @homebridge/node-pty-prebuilt-multiarch --silent --no-fund --no-audit', { stdio: 'inherit' });
|
||||||
|
|
||||||
console.log('\n✅ Build complete!');
|
console.log('\n✅ Build complete!');
|
||||||
console.log(`\nPortable executable created in native/ directory:`);
|
console.log(`\nPortable executable created in native/ directory:`);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue