This commit is contained in:
Raven Scott
2026-04-22 05:22:21 -04:00
parent 2f53540b1e
commit 0dd2539f66
3 changed files with 53 additions and 4 deletions
@@ -337,8 +337,9 @@ export function bareHolesailManagedDebugEnabled(ctx, env) {
}
/**
* When a managed **server** is live, persist `hs.info.url` into `state.json` as `key` whenever it is
* missing or differs (stale key). Keeps `holesail list`, on-disk state, and the running tunnel aligned.
* When a managed **server** is live, persist `hs.info.url` into `state.json` as `key` **only if** the row
* has no `key` yet (first mint). Never replaces an existing persisted `key` — operators trust `state.json`
* as source of truth; starting the process already used that entry.
* @param {Record<string, unknown>} ctx
* @param {Record<string, string | undefined>} env
* @param {string} id
@@ -353,7 +354,7 @@ export async function bareHolesailManagedSyncPersistedServerKey(ctx, env, id) {
const row = /** @type {Record<string, unknown>} */ (cur)
if (!bareHolesailEnvTruthy(row.server)) return false
const prev = String(row.key ?? '').trim()
if (prev === url) return false
if (prev) return false
row.key = url
state.connections[id] = row
await bareHolesailManagedWriteState(ctx, env, state)
@@ -93,7 +93,13 @@ export async function ensureBareOsWwwHolesailTunnel(ctx, env, port) {
}
}
state.connections[id] = want
/** @type {Record<string, unknown>} */
const next = { ...want }
if (existing && typeof existing === 'object') {
const k = String(/** @type {Record<string, unknown>} */ (existing).key ?? '').trim()
if (k) next.key = k
}
state.connections[id] = next
await bareHolesailManagedWriteState(ctx, gEnv, state)
void path
if (bareHolesailManagedServiceIsRunning()) {
@@ -185,6 +185,48 @@ test('ensureBareOsWwwHolesailTunnel persists managed server entry', async (t) =>
rmSync(dir, { recursive: true, force: true })
})
test('ensureBareOsWwwHolesailTunnel preserves existing hs key when normalizing row', async (t) => {
const dir = testCorestoreDir('wwwhskey')
const store = new Corestore(dir)
const sys = new Hyperdrive(store)
const personal = new Hyperdrive(store.namespace('pwwhsk'))
await sys.ready()
await personal.ready()
const ctx = testCtx(sys, personal, {
USER: 'guest',
HOME: '/home/guest',
UID: '65534',
GID: '65534',
PWD: '/home/guest'
})
const p = 18189
const id = bareOsWwwHolesailConnectionId(p)
const guestEnv = { ...ctx.env, BARE_OS_HOLESAIL_STATE: BARE_HOLESAIL_STATE_GUEST }
const keepKey = 'hs://0000keepthiskey000000000000000000000000000000000000000000'
await bareHolesailManagedWriteState(ctx, guestEnv, {
version: 1,
connections: {
[id]: {
server: true,
port: 19999,
host: '0.0.0.0',
enabled: true,
key: keepKey
}
}
})
await ensureBareOsWwwHolesailTunnel(ctx, ctx.env, p)
const { state } = await bareHolesailManagedReadState(ctx, guestEnv)
const row = /** @type {{ port?: number, host?: string, key?: string }} */ (
state.connections[id]
)
t.is(row.port, p)
t.is(row.host, '127.0.0.1')
t.is(row.key, keepKey)
await store.close()
rmSync(dir, { recursive: true, force: true })
})
test('BARE_OS_WWW_DEFAULT_INDEX is non-trivial HTML', (t) => {
t.ok(BARE_OS_WWW_DEFAULT_INDEX.includes('<!DOCTYPE html>'))
t.ok(BARE_OS_WWW_DEFAULT_INDEX.includes('Bare OS'))