Bare Caps
CI / Build & Test (push) Successful in 3m7s

This commit is contained in:
Raven Scott
2026-07-26 23:09:00 -04:00
parent f4569b765e
commit 631f9c4023
19 changed files with 1412 additions and 108 deletions
+32 -9
View File
@@ -10,10 +10,12 @@
* node scripts/build-distributable.js --all # all platforms
* node scripts/build-distributable.js --host darwin-arm64 --host linux-x64
* node scripts/build-distributable.js --package # also create .zip archives
* node scripts/build-distributable.js --media --package # media capability host (ffmpeg)
*
* Output under releases/:
* bridge-swarm-host-darwin-arm64.zip, …-darwin-x64.zip,
* …-linux-arm64.zip, …-linux-x64.zip, …-win32-x64.zip
* bridge-swarm-host-media-<platform>-<arch>.zip (with --media)
*/
const path = require('path');
@@ -25,8 +27,8 @@ const { pathToFileURL } = require('url');
const ROOT = path.join(__dirname, '..');
const NATIVE_HOST_DIR = path.join(ROOT, 'native-host');
const RELEASES_DIR = path.join(ROOT, 'releases');
const ENTRY = path.join(NATIVE_HOST_DIR, 'index.mjs');
const HOST_NAME = 'bridge-swarm-host';
let ENTRY = path.join(NATIVE_HOST_DIR, 'index.mjs');
let HOST_NAME = 'bridge-swarm-host';
const ALL_HOSTS = [
'darwin-arm64',
@@ -49,16 +51,31 @@ function parseArgs() {
const hosts = [];
let all = false;
let doPackage = false;
let media = false;
for (let i = 0; i < args.length; i++) {
if (args[i] === '--all') all = true;
else if (args[i] === '--package') doPackage = true;
else if (args[i] === '--media') media = true;
else if (args[i] === '--host' && args[i + 1]) hosts.push(args[++i]);
}
if (all) return { hosts: ALL_HOSTS, doPackage };
if (hosts.length > 0) return { hosts, doPackage };
return { hosts: [getCurrentHost()], doPackage };
if (all) return { hosts: ALL_HOSTS, doPackage, media };
if (hosts.length > 0) return { hosts, doPackage, media };
return { hosts: [getCurrentHost()], doPackage, media };
}
function ensureMediaDeps() {
const mediaPkg = path.join(NATIVE_HOST_DIR, 'node_modules', 'bare-media', 'package.json');
if (fs.existsSync(mediaPkg)) {
console.log('Media deps already present (bare-media).');
return;
}
console.log('Installing media capability deps (bare-media + bare-ffmpeg)...');
execSync('npm install --no-save bare-media@^2.10.1', {
cwd: NATIVE_HOST_DIR,
stdio: 'inherit',
});
}
function getPlatformModule(host) {
@@ -303,7 +320,7 @@ async function createZipArchives(builtEntries) {
}
}
async function build(hosts, doPackage) {
async function build(hosts, doPackage, media) {
patchBareBuildSignForLinux();
// Ensure HRPC spec is mirrored into native-host before packing
@@ -320,6 +337,12 @@ async function build(hosts, doPackage) {
execSync('npm install', { cwd: NATIVE_HOST_DIR, stdio: 'inherit' });
}
if (media) {
ensureMediaDeps();
ENTRY = path.join(NATIVE_HOST_DIR, 'index-media.mjs');
HOST_NAME = 'bridge-swarm-host-media';
}
if (!fs.existsSync(path.join(NATIVE_HOST_DIR, 'spec', 'hrpc', 'index.js'))) {
throw new Error('native-host/spec/hrpc missing after build:hrpc');
}
@@ -333,7 +356,7 @@ async function build(hosts, doPackage) {
const pkg = require(path.join(NATIVE_HOST_DIR, 'package.json'));
console.log(`\nBuilding ${HOST_NAME} v${pkg.version}`);
console.log(`\nBuilding ${HOST_NAME} v${pkg.version}${media ? ' (media capability)' : ''}`);
console.log(`Targets: ${hosts.join(', ')}`);
console.log(`Entry: ${ENTRY}`);
console.log(`Output: ${RELEASES_DIR}\n`);
@@ -417,9 +440,9 @@ async function build(hosts, doPackage) {
return built;
}
const { hosts, doPackage } = parseArgs();
const { hosts, doPackage, media } = parseArgs();
build(hosts, doPackage).catch((err) => {
build(hosts, doPackage, media).catch((err) => {
console.error('\nBuild failed:', err.message || err);
if (err.cause) console.error('Cause:', err.cause);
process.exitCode = 1;
+123
View File
@@ -0,0 +1,123 @@
#!/usr/bin/env bash
# Install the optional media capability host (bare-media + bare-ffmpeg) into
# ~/.bridgeswarm, replacing the lean host binary while keeping the same
# launcher / native messaging registration.
#
# Sources (first match wins):
# 1. Local releases/bridge-swarm-host-media-<platform>-<arch>.zip
# 2. BRIDGE_SWARM_MEDIA_URL env override
# 3. Gitea latest-main release asset
#
# After install on macOS: extracts + codesigns new .bare addons (ffmpeg, codecs).
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
INSTALL_DIR="${BRIDGE_SWARM_HOME:-$HOME/.bridgeswarm}"
HOST_BIN="$INSTALL_DIR/bridge-swarm-host"
MEDIA_BIN_NAME="bridge-swarm-host-media"
LAUNCHER="$INSTALL_DIR/run-bridge-swarm-host.sh"
uname_s="$(uname -s | tr '[:upper:]' '[:lower:]')"
uname_m="$(uname -m)"
case "$uname_s" in
darwin) platform=darwin ;;
linux) platform=linux ;;
mingw*|msys*|cygwin*) platform=win32 ;;
*) echo "Unsupported OS: $uname_s" >&2; exit 1 ;;
esac
case "$uname_m" in
arm64|aarch64) arch=arm64 ;;
x86_64|amd64) arch=x64 ;;
*) echo "Unsupported arch: $uname_m" >&2; exit 1 ;;
esac
ZIP_NAME="bridge-swarm-host-media-${platform}-${arch}.zip"
LOCAL_ZIP="$REPO_ROOT/releases/$ZIP_NAME"
TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/bridgeswarm-media.XXXXXX")"
cleanup() { rm -rf "$TMP_DIR"; }
trap cleanup EXIT
echo "Installing BridgeSwarm media capability → $INSTALL_DIR"
mkdir -p "$INSTALL_DIR"
if [[ -f "$LOCAL_ZIP" ]]; then
echo "Using local artifact: $LOCAL_ZIP"
cp "$LOCAL_ZIP" "$TMP_DIR/$ZIP_NAME"
elif [[ -n "${BRIDGE_SWARM_MEDIA_URL:-}" ]]; then
echo "Downloading: $BRIDGE_SWARM_MEDIA_URL"
curl -fsSL "$BRIDGE_SWARM_MEDIA_URL" -o "$TMP_DIR/$ZIP_NAME"
else
BASE="${BRIDGE_SWARM_RELEASE_BASE:-https://git.ssh.surf/snxraven/BridgeSwarm/releases/download/latest-main}"
URL="$BASE/$ZIP_NAME"
echo "Downloading: $URL"
if ! curl -fsSL "$URL" -o "$TMP_DIR/$ZIP_NAME"; then
echo "Failed to download $ZIP_NAME." >&2
echo "Build locally with: npm run build:dist:media" >&2
echo "Or set BRIDGE_SWARM_MEDIA_URL to a zip URL." >&2
exit 1
fi
fi
echo "Extracting..."
unzip -qo "$TMP_DIR/$ZIP_NAME" -d "$TMP_DIR/out"
# Find the media host binary inside the zip (layout may be flat or nested)
FOUND=""
if [[ -f "$TMP_DIR/out/$MEDIA_BIN_NAME" ]]; then
FOUND="$TMP_DIR/out/$MEDIA_BIN_NAME"
elif [[ -f "$TMP_DIR/out/${MEDIA_BIN_NAME}-${platform}-${arch}/$MEDIA_BIN_NAME" ]]; then
FOUND="$TMP_DIR/out/${MEDIA_BIN_NAME}-${platform}-${arch}/$MEDIA_BIN_NAME"
else
FOUND="$(find "$TMP_DIR/out" -type f -name "$MEDIA_BIN_NAME" | head -n 1 || true)"
fi
if [[ -z "$FOUND" || ! -f "$FOUND" ]]; then
# bare-build may emit bridge-swarm-host-media as the file name already;
# also accept a single executable in the archive.
FOUND="$(find "$TMP_DIR/out" -type f \( -name 'bridge-swarm-host-media*' -o -name 'bridge-swarm-host' \) ! -name '*.zip' | head -n 1 || true)"
fi
if [[ -z "$FOUND" || ! -f "$FOUND" ]]; then
echo "Could not find media host binary in archive." >&2
ls -laR "$TMP_DIR/out" >&2 || true
exit 1
fi
# Keep a backup of the lean host if present and not already media-backed up
if [[ -x "$HOST_BIN" && ! -f "$INSTALL_DIR/bridge-swarm-host.lean.bak" ]]; then
cp "$HOST_BIN" "$INSTALL_DIR/bridge-swarm-host.lean.bak"
echo "Backed up lean host → bridge-swarm-host.lean.bak"
fi
cp "$FOUND" "$HOST_BIN"
chmod +x "$HOST_BIN"
echo "Installed media host as $HOST_BIN"
# Ensure launcher exports TMPDIR (required on macOS for .bare extract)
if [[ ! -x "$LAUNCHER" ]]; then
printf '%s\n' '#!/bin/bash' 'DIR="$(cd "$(dirname "$0")" && pwd)"' 'export TMPDIR="${DIR}/tmp"' 'export BRIDGE_SWARM_STORAGE="${BRIDGE_SWARM_STORAGE:-${DIR}/bridge-swarm-storage}"' 'exec "${DIR}/bridge-swarm-host" "$@"' > "$LAUNCHER"
chmod +x "$LAUNCHER"
fi
mkdir -p "$INSTALL_DIR/tmp"
if [[ "$platform" == "darwin" ]]; then
echo "macOS: extracting and codesigning media addons..."
/usr/bin/xattr -rd com.apple.quarantine "$INSTALL_DIR" 2>/dev/null || true
ENTITLEMENTS_PLIST="$INSTALL_DIR/entitlements.plist"
printf '%s\n' '<?xml version="1.0" encoding="UTF-8"?>' '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' '<plist version="1.0"><dict><key>com.apple.security.cs.disable-library-validation</key><true/></dict></plist>' > "$ENTITLEMENTS_PLIST"
codesign --force --sign - --entitlements "$ENTITLEMENTS_PLIST" "$HOST_BIN" || true
"$LAUNCHER" --extract-addons 2>/dev/null || true
sleep 2
/usr/bin/xattr -rd com.apple.quarantine "$INSTALL_DIR/tmp" 2>/dev/null || true
SIGNED=0
while IFS= read -r -d '' f; do
codesign --force --sign - "$f" 2>/dev/null && SIGNED=$((SIGNED + 1)) || true
done < <(find "$INSTALL_DIR/tmp" \( -name '*.bare' -o -name '*.dylib' \) -print0 2>/dev/null)
echo "Signed $SIGNED native addons (including media codecs / ffmpeg)"
else
"$LAUNCHER" --extract-addons 2>/dev/null || true
fi
# Marker so capabilities.list can also be inferred offline (host still authoritative)
echo "media" > "$INSTALL_DIR/capabilities.txt"
echo "Done. Restart Chrome fully (Cmd+Q / quit), then BridgeSwarm.capabilities.has('media') should be true."