HS Fixes
This commit is contained in:
@@ -149,6 +149,48 @@ export function bareHolesailManagedNormalizeEntry(raw) {
|
|||||||
return { ok: true, entry }
|
return { ok: true, entry }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strip Bare-managed fields (e.g. `enabled`) and pass only upstream holesail constructor options.
|
||||||
|
* @param {Record<string, unknown>} entry normalized row from {@link bareHolesailManagedNormalizeEntry}
|
||||||
|
* @returns {Record<string, unknown>}
|
||||||
|
*/
|
||||||
|
export function bareHolesailManagedEntryToOpts(entry) {
|
||||||
|
const e = /** @type {Record<string, unknown>} */ (entry)
|
||||||
|
/** @type {Record<string, unknown>} */
|
||||||
|
const opts = {
|
||||||
|
server: !!e.server,
|
||||||
|
client: !!e.client
|
||||||
|
}
|
||||||
|
if (e.port != null && e.port !== '') opts.port = e.port
|
||||||
|
const host = String(e.host ?? '').trim()
|
||||||
|
if (host) opts.host = host
|
||||||
|
const key = String(e.key ?? '').trim()
|
||||||
|
if (key) opts.key = key
|
||||||
|
if (e.secure !== undefined && e.secure !== null && String(e.secure) !== '')
|
||||||
|
opts.secure = bareHolesailEnvTruthy(e.secure)
|
||||||
|
if (e.udp !== undefined && e.udp !== null && String(e.udp) !== '')
|
||||||
|
opts.udp = bareHolesailEnvTruthy(e.udp)
|
||||||
|
if (e.log !== undefined && e.log !== null && e.log !== '') {
|
||||||
|
if (typeof e.log === 'number') opts.log = e.log
|
||||||
|
else if (/^\d+$/.test(String(e.log)))
|
||||||
|
opts.log = Number.parseInt(String(e.log), 10)
|
||||||
|
else opts.log = bareHolesailEnvTruthy(e.log)
|
||||||
|
}
|
||||||
|
return opts
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare persisted shareable URL / key string to live `hs.info.url` (case-insensitive trim).
|
||||||
|
* @param {string} persisted
|
||||||
|
* @param {string} live
|
||||||
|
*/
|
||||||
|
export function bareHolesailManagedPersistedUrlMatchesLive(persisted, live) {
|
||||||
|
const p = String(persisted ?? '').trim().toLowerCase()
|
||||||
|
const l = String(live ?? '').trim().toLowerCase()
|
||||||
|
if (!p || !l) return false
|
||||||
|
return p === l
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {unknown} parsed
|
* @param {unknown} parsed
|
||||||
*/
|
*/
|
||||||
@@ -333,13 +375,23 @@ export async function bareHolesailManagedSyncPersistedServerKey(ctx, env, id) {
|
|||||||
* @param {Record<string, unknown>} entry
|
* @param {Record<string, unknown>} entry
|
||||||
*/
|
*/
|
||||||
async function startManagedInstance(ctx, env, id, entry) {
|
async function startManagedInstance(ctx, env, id, entry) {
|
||||||
if (managedInstances.has(id)) return
|
|
||||||
const norm = bareHolesailManagedNormalizeEntry(entry)
|
const norm = bareHolesailManagedNormalizeEntry(entry)
|
||||||
if (!norm.ok) throw new Error(norm.err)
|
if (!norm.ok) throw new Error(norm.err)
|
||||||
if (!norm.entry.enabled) return
|
if (!norm.entry.enabled) return
|
||||||
|
|
||||||
|
if (managedInstances.has(id)) {
|
||||||
|
const persisted = String(norm.entry.key ?? '').trim()
|
||||||
|
if (norm.entry.server && persisted) {
|
||||||
|
const live = bareHolesailManagedRuntimeUrl(id).trim()
|
||||||
|
if (bareHolesailManagedPersistedUrlMatchesLive(persisted, live)) return
|
||||||
|
await stopManagedInstance(ctx, id)
|
||||||
|
} else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const Holesail = await loadHolesailConstructor(ctx)
|
const Holesail = await loadHolesailConstructor(ctx)
|
||||||
const hs = new Holesail(norm.entry)
|
const hs = new Holesail(bareHolesailManagedEntryToOpts(norm.entry))
|
||||||
await hs.ready()
|
await hs.ready()
|
||||||
managedInstances.set(id, { hs, entry: norm.entry })
|
managedInstances.set(id, { hs, entry: norm.entry })
|
||||||
if (norm.entry.server) {
|
if (norm.entry.server) {
|
||||||
|
|||||||
@@ -176,7 +176,8 @@ export async function runHolesailCli(ctx, argv) {
|
|||||||
const norm = bareHolesailManagedNormalizeEntry(raw)
|
const norm = bareHolesailManagedNormalizeEntry(raw)
|
||||||
const en = norm.ok ? String(!!norm.entry.enabled) : '?'
|
const en = norm.ok ? String(!!norm.entry.enabled) : '?'
|
||||||
const live = bareHolesailManagedRuntimeRunning(id)
|
const live = bareHolesailManagedRuntimeRunning(id)
|
||||||
const url = live ? bareHolesailManagedRuntimeUrl(id) : ''
|
const persistedUrl = norm.ok ? String(norm.entry.key ?? '').trim() : ''
|
||||||
|
const url = persistedUrl || (live ? bareHolesailManagedRuntimeUrl(id) : '')
|
||||||
const mode =
|
const mode =
|
||||||
norm.ok && norm.entry.server ? 'server' : norm.ok && norm.entry.client ? 'client' : '?'
|
norm.ok && norm.entry.server ? 'server' : norm.ok && norm.entry.client ? 'client' : '?'
|
||||||
const err = norm.ok ? '' : ` INVALID: ${norm.err}`
|
const err = norm.ok ? '' : ` INVALID: ${norm.err}`
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import test from 'brittle'
|
import test from 'brittle'
|
||||||
import {
|
import {
|
||||||
BARE_HOLESAIL_STATE_USER,
|
BARE_HOLESAIL_STATE_USER,
|
||||||
|
bareHolesailManagedEntryToOpts,
|
||||||
bareHolesailManagedEnvForConnectionId,
|
bareHolesailManagedEnvForConnectionId,
|
||||||
bareHolesailManagedNormalizeEntry,
|
bareHolesailManagedNormalizeEntry,
|
||||||
|
bareHolesailManagedPersistedUrlMatchesLive,
|
||||||
bareHolesailManagedStatePath,
|
bareHolesailManagedStatePath,
|
||||||
bareHolesailManagedValidateId
|
bareHolesailManagedValidateId
|
||||||
} from './lib/bare-holesail-managed.js'
|
} from './lib/bare-holesail-managed.js'
|
||||||
@@ -62,6 +64,39 @@ test('bareHolesailManagedNormalizeEntry client needs key', (t) => {
|
|||||||
t.absent(r.ok)
|
t.absent(r.ok)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('bareHolesailManagedEntryToOpts strips enabled and passes holesail fields', (t) => {
|
||||||
|
const r = bareHolesailManagedNormalizeEntry({
|
||||||
|
server: true,
|
||||||
|
port: 8088,
|
||||||
|
host: '127.0.0.1',
|
||||||
|
key: 'hs://0000abc',
|
||||||
|
secure: true,
|
||||||
|
udp: true,
|
||||||
|
log: 0,
|
||||||
|
enabled: false
|
||||||
|
})
|
||||||
|
t.ok(r.ok)
|
||||||
|
const o = bareHolesailManagedEntryToOpts(r.entry)
|
||||||
|
t.is(o.server, true)
|
||||||
|
t.is(o.client, false)
|
||||||
|
t.is(o.port, 8088)
|
||||||
|
t.is(o.host, '127.0.0.1')
|
||||||
|
t.is(o.key, 'hs://0000abc')
|
||||||
|
t.is(o.secure, true)
|
||||||
|
t.is(o.udp, true)
|
||||||
|
t.is(o.log, 0)
|
||||||
|
t.absent(Object.prototype.hasOwnProperty.call(o, 'enabled'))
|
||||||
|
})
|
||||||
|
|
||||||
|
test('bareHolesailManagedPersistedUrlMatchesLive', (t) => {
|
||||||
|
const u = 'hs://0000aaaabbbbccccddddeeeeffffgggg'
|
||||||
|
t.ok(bareHolesailManagedPersistedUrlMatchesLive(u, u))
|
||||||
|
t.ok(bareHolesailManagedPersistedUrlMatchesLive(` ${u} `, u.toUpperCase()))
|
||||||
|
t.absent(bareHolesailManagedPersistedUrlMatchesLive(u, 'hs://0000other'))
|
||||||
|
t.absent(bareHolesailManagedPersistedUrlMatchesLive(u, ''))
|
||||||
|
t.absent(bareHolesailManagedPersistedUrlMatchesLive('', u))
|
||||||
|
})
|
||||||
|
|
||||||
test('holesailCliParseAdd', (t) => {
|
test('holesailCliParseAdd', (t) => {
|
||||||
const r = holesailCliParseAdd(['t', '--server', '--port', '9000'])
|
const r = holesailCliParseAdd(['t', '--server', '--port', '9000'])
|
||||||
t.ok(r.ok)
|
t.ok(r.ok)
|
||||||
|
|||||||
Reference in New Issue
Block a user