Files
bare-operating-system/packages/bare-os-booter/test/_helpers.js
T
2026-08-18 16:43:40 -04:00

441 lines
13 KiB
JavaScript

import test from 'brittle'
import b4a from 'b4a'
import Hyperdrive from 'hyperdrive'
import Corestore from 'corestore'
import { mkdirSync, rmSync } from 'node:fs'
import { readFile, readdir } from 'node:fs/promises'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import { createRequire } from 'node:module'
import { PassThrough } from 'node:stream'
import { XTERM_CLEAR_SCROLLBACK_AND_VIEWPORT } from '../lib/terminal-escapes.js'
import { runKernelFromSource, runBinCommand } from '../lib/kernel-runner.js'
import { createGitFsFromVfs } from '../lib/git-fs-adapter.js'
import { runGitCli } from '../lib/git-cli.js'
import {
createStreamLineReader,
sanitizeInteractiveShellLine
} from '../lib/cli-readline.js'
import {
createVfs,
BARE_OS_PROC_FILE_TO_ID_HYPERCORE_PACK_HRPC_LIFECYCLE
} from '../lib/vfs.js'
import { parseHdmsPairArgv } from '../lib/hdms-cli-argv.js'
import hcCrypto from 'hypercore-crypto'
import idEnc from 'hypercore-id-encoding'
import {
decodeRwShareOffer,
decodeShareOffer,
HDMS_AUTOPASS_SHARE_KEY,
HDMS_AUTOPASS_SHARE_RW_KEY,
normalizeWriterSecretHex
} from '../lib/hdms-share-offer.js'
import { buildBareOsHypercorePackHrpcLifecycleProcJson } from '../lib/bare-os-proc-hypercore-pack-hrpc-lifecycle.js'
import { buildBareOsPearCorestoreHrpcProcJson } from '../lib/bare-os-proc-pear-corestore-hrpc.js'
import { buildBareOsPearInspectLoggerTlsProcJson } from '../lib/bare-os-proc-pear-inspect-logger-tls.js'
import { buildBareOsBareRuntimeProtoMuxProcJson } from '../lib/bare-os-proc-bare-runtime-proto-mux.js'
import { buildBareOsBootGraphProcJson } from '../lib/bare-os-boot-graph-proc.js'
import { pathnameExpandShellWord } from '../lib/shell-glob.js'
import { createBareOsIpc } from '../lib/bare-os-ipc.js'
import { BareOsSwarmConnectionManager } from '../lib/bare-os-swarm-connection-manager.js'
import {
createBareOsLifecycleStateMachine,
runTransactionalLifecycleHooks
} from '../lib/bare-os-lifecycle-manager.js'
import {
bareOsRegisterCorestoreSuspendResumeHooks,
bareOsInstallCorestoreSuspendResumeHooks
} from '../lib/corestore-host-lifecycle.js'
import { bareOsFindOrphanProcessRows } from '../lib/bare-os-process-table.js'
import {
topologicalOrderKernelExtensions,
resolveKernelExtensionsFull
} from '../lib/kernel-extension-resolver.js'
import { createBareOsProtomuxAliasRegistry } from '../lib/bare-os-protomux-alias-registry.js'
import { bareOsHttpUrlAllowed } from '../lib/bare-os-http-policy.js'
import {
bareOsParseBareAclText,
bareOsAclDeniesSubject
} from '../lib/bare-os-vfs-acl-enforce.js'
import { raceWithAbortAndTimeout } from '../lib/bare-os-abort.js'
import {
tokenize,
expandWord,
execShellLine,
expandArgvAliases,
defaultShellAliases,
loadBarerc,
BARERC_SKELETON,
splitTokensBySemicolon,
splitTokensByAndOr,
bareOsShellAstSnapshot,
planShellRedirections,
buildShellExecutionGraph,
dispatchShellTrapSignal,
BARE_OS_EXIT_STATUS_ENV,
syncBareOsExitStatusEnv,
getBareOsPipelineLimits,
DEFAULT_PIPELINE_MAX_STAGES,
} from '../lib/shell.js'
import { tokenizeBareShellLineDetailed } from '../lib/shell-tokenizer.js'
import { decodeBareOsDollarQuote } from '../lib/shell-lex.js'
import {
applyBareOsThemeFromEnv,
bareOsListThemeNames
} from '../lib/bare-os-theme-presets.js'
import {
bareParseLsColors,
bareSerializeLsColors,
bareLsColorOpenSgrFromMap,
bareDefaultDircolorsDatabase,
bareParseDircolorsDatabase
} from 'bare-os-lscolors'
import { BARE_OS_CTX_API_VERSION } from '../lib/bare-os-ctx-api.js'
import { buildBareOsRuntimeCaps } from '../lib/bare-os-runtime-caps.js'
import {
bareOsBareModulesEnabled,
bareOsBareModuleManifestEmbeddedRef,
buildBareCtxObjectFromHost,
buildPearCtxObjectFromHost,
loadBareModuleManifest,
maybeMergeBareFromDrive
} from '../lib/bare-os-ctx-bare.js'
import { maybeBareOsBuildBinManifest } from '../lib/bare-os-bin-index.js'
import {
createFishReadLine,
fuzzyMatch,
stripAnsi,
parseHistoryFile,
formatHistoryFile,
dedupeConsecutiveHistory,
searchHistoryEntries,
shouldPersistShellHistoryCommand,
scrubShellHistoryEntries,
SHELL_BUILTINS,
resolveShellPromptHookSegment
} from '../lib/fish-readline.js'
import {
parseCompletionContext,
rankCompletionItems,
suggestGhostFromHistory,
suggestGhostFromFs,
ghostReplaceCurrentWord,
longestCommonCompletionPrefix,
completeLine,
levenshtein
} from '../lib/completion-engine.js'
import {
fieldMatches,
dowFieldMatches,
parseCronLine,
jobMatchesDate
} from '../lib/bare-cron.js'
import '../lib/bare-openssh.js'
import {
bareInitdReadinessSnapshot,
bareInitdShutdownActiveUnitsReverse,
getBareServiceRuntime,
registerBareInitdDisposer,
registerKernelShutdownHook,
runKernelShutdownHooks,
startBareInitd,
stopBareInitd,
getLastBareInitdDagSnapshotJson
} from '../lib/bare-initd.js'
import {
appendVarLog,
ensureBareOsVarLogTree,
KERNEL_CONSOLE_LOG,
BOOT_LOG
} from '../lib/bare-os-var-log.js'
import {
bareOsKernelMetricsReset,
bareOsKernelMetricsSnapshot
} from '../lib/bare-os-kernel-metrics.js'
import { parseUnitDropInText } from '../lib/bare-initd-user.js'
import {
bareOsHyperswarmOptsFromEnv,
bareOsBootJoinPeerHexFromEnv
} from '../lib/swarm-opts.js'
import {
bareOsBootInitPrefetchEnabled,
bareOsBootWarmBinDownloadDiffEnabled
} from '../lib/boot-prefetch.js'
import { bareOsProcessTableSnapshot } from '../lib/bare-os-process-table.js'
import { buildBareOsSyscallsProcJson } from '../lib/bare-os-syscalls-proc-json.js'
import {
bareOsParseSendmsgScmRights,
wantPosixSocketScmRights
} from '../lib/bare-os-socket-scm-rights.js'
import {
parseBareOsHrpcAllowlistJson,
bareOsHrpcAllowlistDeniesRoute
} from '../lib/bare-os-hrpc-allowlist.js'
import { buildBareOsProtomuxExtensionsProcJson } from '../lib/bare-os-protomux-extensions-proc.js'
import { createBareOsDiskOsBridge } from '../lib/bare-os-disk-os-bridge.js'
import { buildBareOsReplicationLiveSketch } from '../lib/bare-os-replication-proc-live.js'
import {
evaluateBareOsPeerAdmission,
bareOsFormatPeerAdmissionAuditEvent,
bareOsPeerAdmissionAuditRateAllow
} from '../lib/bare-os-peer-admission.js'
import {
parseDelegateAllowSet,
isDelegateKindAllowed
} from '../lib/host-delegate-registry.js'
import {
bareOsAuditAppend,
bareOsAuditVerifyRows
} from '../lib/bare-os-audit-chain.js'
import { bareOsDrainFcntlLockWaiters } from '../lib/bare-os-fcntl-cooperative-lock.js'
import { buildBareOsReplicationOperatorSurfaceProcJson } from '../lib/bare-os-proc-replication-operator-surface.js'
import {
DEFAULT_CURL_USER_AGENT,
DEFAULT_WGET_USER_AGENT
} from '../lib/http-fetch-url.js'
import { filenameFromContentDisposition } from '../lib/curl-cli.js'
import { encodeUstarHeader, runTarCli } from '../lib/tar-cli.js'
export {
test,
b4a,
Hyperdrive,
Corestore,
mkdirSync,
rmSync,
readFile,
readdir,
path,
fileURLToPath,
PassThrough,
XTERM_CLEAR_SCROLLBACK_AND_VIEWPORT,
runKernelFromSource,
runBinCommand,
createGitFsFromVfs,
runGitCli,
createStreamLineReader,
sanitizeInteractiveShellLine,
createVfs,
BARE_OS_PROC_FILE_TO_ID_HYPERCORE_PACK_HRPC_LIFECYCLE,
parseHdmsPairArgv,
hcCrypto,
idEnc,
decodeRwShareOffer,
decodeShareOffer,
HDMS_AUTOPASS_SHARE_KEY,
HDMS_AUTOPASS_SHARE_RW_KEY,
normalizeWriterSecretHex,
buildBareOsHypercorePackHrpcLifecycleProcJson,
buildBareOsPearCorestoreHrpcProcJson,
buildBareOsPearInspectLoggerTlsProcJson,
buildBareOsBareRuntimeProtoMuxProcJson,
buildBareOsBootGraphProcJson,
pathnameExpandShellWord,
createBareOsIpc,
BareOsSwarmConnectionManager,
createBareOsLifecycleStateMachine,
runTransactionalLifecycleHooks,
bareOsRegisterCorestoreSuspendResumeHooks,
bareOsInstallCorestoreSuspendResumeHooks,
bareOsFindOrphanProcessRows,
topologicalOrderKernelExtensions,
resolveKernelExtensionsFull,
createBareOsProtomuxAliasRegistry,
bareOsHttpUrlAllowed,
bareOsParseBareAclText,
bareOsAclDeniesSubject,
raceWithAbortAndTimeout,
tokenize,
expandWord,
execShellLine,
expandArgvAliases,
defaultShellAliases,
loadBarerc,
BARERC_SKELETON,
splitTokensBySemicolon,
splitTokensByAndOr,
bareOsShellAstSnapshot,
planShellRedirections,
buildShellExecutionGraph,
dispatchShellTrapSignal,
BARE_OS_EXIT_STATUS_ENV,
syncBareOsExitStatusEnv,
getBareOsPipelineLimits,
DEFAULT_PIPELINE_MAX_STAGES,
tokenizeBareShellLineDetailed,
decodeBareOsDollarQuote,
applyBareOsThemeFromEnv,
bareOsListThemeNames,
bareParseLsColors,
bareSerializeLsColors,
bareLsColorOpenSgrFromMap,
bareDefaultDircolorsDatabase,
bareParseDircolorsDatabase,
BARE_OS_CTX_API_VERSION,
buildBareOsRuntimeCaps,
bareOsBareModulesEnabled,
bareOsBareModuleManifestEmbeddedRef,
buildBareCtxObjectFromHost,
buildPearCtxObjectFromHost,
loadBareModuleManifest,
maybeMergeBareFromDrive,
maybeBareOsBuildBinManifest,
createFishReadLine,
fuzzyMatch,
stripAnsi,
parseHistoryFile,
formatHistoryFile,
dedupeConsecutiveHistory,
searchHistoryEntries,
shouldPersistShellHistoryCommand,
scrubShellHistoryEntries,
SHELL_BUILTINS,
resolveShellPromptHookSegment,
parseCompletionContext,
rankCompletionItems,
suggestGhostFromHistory,
suggestGhostFromFs,
ghostReplaceCurrentWord,
longestCommonCompletionPrefix,
completeLine,
levenshtein,
fieldMatches,
dowFieldMatches,
parseCronLine,
jobMatchesDate,
bareInitdReadinessSnapshot,
bareInitdShutdownActiveUnitsReverse,
getBareServiceRuntime,
registerBareInitdDisposer,
registerKernelShutdownHook,
runKernelShutdownHooks,
startBareInitd,
stopBareInitd,
getLastBareInitdDagSnapshotJson,
appendVarLog,
ensureBareOsVarLogTree,
KERNEL_CONSOLE_LOG,
BOOT_LOG,
bareOsKernelMetricsReset,
bareOsKernelMetricsSnapshot,
parseUnitDropInText,
bareOsHyperswarmOptsFromEnv,
bareOsBootJoinPeerHexFromEnv,
bareOsBootInitPrefetchEnabled,
bareOsBootWarmBinDownloadDiffEnabled,
bareOsProcessTableSnapshot,
buildBareOsSyscallsProcJson,
bareOsParseSendmsgScmRights,
wantPosixSocketScmRights,
parseBareOsHrpcAllowlistJson,
bareOsHrpcAllowlistDeniesRoute,
buildBareOsProtomuxExtensionsProcJson,
createBareOsDiskOsBridge,
buildBareOsReplicationLiveSketch,
evaluateBareOsPeerAdmission,
bareOsFormatPeerAdmissionAuditEvent,
bareOsPeerAdmissionAuditRateAllow,
parseDelegateAllowSet,
isDelegateKindAllowed,
bareOsAuditAppend,
bareOsAuditVerifyRows,
bareOsDrainFcntlLockWaiters,
buildBareOsReplicationOperatorSurfaceProcJson,
DEFAULT_CURL_USER_AGENT,
DEFAULT_WGET_USER_AGENT,
filenameFromContentDisposition,
encodeUstarHeader,
runTarCli
}
/** bare-ssh2 needs Bare `require.addon` (bare-crypto); skip auto-start in brittle-node. */
if (
typeof process !== 'undefined' &&
process.env &&
process.env.BARE_OS_INITD_DISABLED === undefined
) {
process.env.BARE_OS_INITD_DISABLED = 'bare-openssh'
}
export const __dirname = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
export const require = createRequire(path.join(__dirname, 'package.json'))
export const TAR_BLK = 512
/** @param {Uint8Array[]} parts */
export function concatTarParts(parts) {
let n = 0
for (const p of parts) n += p.length
const out = new Uint8Array(n)
let o = 0
for (const p of parts) {
out.set(p, o)
o += p.length
}
return out
}
export function headerFromInit(init, name) {
if (!init?.headers) return undefined
const h = init.headers
if (typeof h.get === 'function') return h.get(name)
return undefined
}
export function testCorestoreDir(name) {
const dir = path.join(
__dirname,
'.test-data',
name + '-' + process.pid + '-' + Math.random().toString(36).slice(2)
)
mkdirSync(path.dirname(dir), { recursive: true })
return dir
}
export function testCtx(drive, personal, env) {
const shellEnv = {
HOME: '/home/user',
PATH: '/bin',
USER: 'user',
UID: '1000',
GID: '1000',
PWD: '/home/user',
BARE_OS_EXIT_STATUS: '0',
BARE_OS_SSH_LISTEN_PORT: '0',
...env
}
const bareOsIpc = createBareOsIpc()
const vfs = createVfs(drive, personal, shellEnv, null, { bareOsIpc })
const ctx = {
drive,
personalDrive: personal,
vfs,
bareOsIpc,
env: shellEnv,
console,
b4a,
async bareOsApplyTheme() {
return applyBareOsThemeFromEnv(this)
},
bareOsListThemes() {
return bareOsListThemeNames()
}
}
return ctx
}
/** Personal-drive path backing logical `/home/<seg>/…` (matches `vfs.js`). */
export function personalHomeBacking(homePath, rel = '') {
const seg = homePath.replace(/^\/home\//, '').split('/')[0] || 'user'
const r = String(rel).replace(/^\//, '')
return r ? `/.bare-os/home/${seg}/${r}` : `/.bare-os/home/${seg}`
}
/** Built `/bin/<name>` body from the repo kernel tree. */
export async function readBuiltBin(name) {
const fs = await import('node:fs/promises')
const p = path.join(__dirname, '../../kernel/bin', name)
return fs.readFile(p, 'utf8')
}