Files
Netcatty/scripts/ensure-node-pty-linux.sh
bincxz dfc9a4efdd fix: use electron-rebuild CLI directly instead of install-app-deps
electron-builder install-app-deps forks a child process via
remote-rebuild.js to run @electron/rebuild. The child's main()
has no .catch() handler, causing unhandled promise rejections
that exit with code 1 even after successful rebuilds.

Replace with direct `npx electron-rebuild` which runs in-process
and avoids the broken fork layer entirely.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 04:07:39 +08:00

134 lines
3.5 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
usage() {
echo "Usage: $0 <prepare|verify> <x64|arm64>" >&2
exit 1
}
checksum() {
if command -v sha256sum >/dev/null 2>&1; then
sha256sum "$@"
else
shasum -a 256 "$@"
fi
}
electron_bin() {
echo "./node_modules/.bin/electron"
}
log_file_info() {
local file="$1"
echo "[node-pty] file: ${file}"
ls -lh "${file}"
checksum "${file}"
}
log_electron_runtime_info() {
ELECTRON_RUN_AS_NODE=1 "$(electron_bin)" -e '
console.log(`[node-pty] electron=${process.versions.electron || "unknown"} node=${process.versions.node} modules=${process.versions.modules}`);
'
}
assert_loadable_native_module() {
local file="$1"
echo "[node-pty] loading native module with Electron runtime: ${file}"
ELECTRON_RUN_AS_NODE=1 "$(electron_bin)" -e '
require(process.argv[1]);
console.log("[node-pty] native module loaded successfully");
' "${file}"
}
prepare() {
local arch="$1"
local root="node_modules/node-pty"
local release_dir="${root}/build/Release"
local prebuild_dir="${root}/prebuilds/linux-${arch}"
echo "[node-pty] rebuilding native modules for Electron on linux-${arch}"
log_electron_runtime_info
npx electron-rebuild
test -f "${release_dir}/pty.node"
test -f "${release_dir}/spawn-helper"
test -x "${release_dir}/spawn-helper"
echo "[node-pty] built Linux runtime artifacts:"
log_file_info "${release_dir}/pty.node"
log_file_info "${release_dir}/spawn-helper"
assert_loadable_native_module "${release_dir}/pty.node"
mkdir -p "${prebuild_dir}"
cp "${release_dir}/pty.node" "${prebuild_dir}/pty.node"
cp "${release_dir}/spawn-helper" "${prebuild_dir}/spawn-helper"
echo "[node-pty] mirrored Linux runtime artifacts into ${prebuild_dir}:"
log_file_info "${prebuild_dir}/pty.node"
log_file_info "${prebuild_dir}/spawn-helper"
}
verify() {
local arch="$1"
local release_dir
local prebuild_dir
log_electron_runtime_info
release_dir="$(find release -type d -path "*/resources/app.asar.unpacked/node_modules/node-pty/build/Release" -print -quit)"
prebuild_dir="$(find release -type d -path "*/resources/app.asar.unpacked/node_modules/node-pty/prebuilds/linux-${arch}" -print -quit)"
if [[ -z "${release_dir}" ]]; then
echo "[node-pty] packaged build/Release directory not found under release/" >&2
exit 1
fi
if [[ -z "${prebuild_dir}" ]]; then
echo "[node-pty] packaged prebuild directory not found for linux-${arch} under release/" >&2
exit 1
fi
test -f "${release_dir}/pty.node"
test -f "${release_dir}/spawn-helper"
test -f "${prebuild_dir}/pty.node"
test -f "${prebuild_dir}/spawn-helper"
test -x "${release_dir}/spawn-helper"
test -x "${prebuild_dir}/spawn-helper"
echo "[node-pty] packaged build/Release artifacts:"
log_file_info "${release_dir}/pty.node"
log_file_info "${release_dir}/spawn-helper"
assert_loadable_native_module "${release_dir}/pty.node"
echo "[node-pty] packaged prebuild artifacts:"
log_file_info "${prebuild_dir}/pty.node"
log_file_info "${prebuild_dir}/spawn-helper"
assert_loadable_native_module "${prebuild_dir}/pty.node"
echo "[node-pty] packaged artifact locations:"
find release -path "*/resources/app.asar.unpacked/node_modules/node-pty/*" \
\( -name 'pty.node' -o -name 'spawn-helper' \) \
-print | sort
}
main() {
if [[ $# -ne 2 ]]; then
usage
fi
case "$1" in
prepare)
prepare "$2"
;;
verify)
verify "$2"
;;
*)
usage
;;
esac
}
main "$@"