This commit is contained in:
+79
-34
@@ -33,6 +33,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
SPACED_BITCOIN_RPC_URL: `http://${BITCOIND_RPC_HOSTNAME}:${BITCOIND_RPC_PORT}`,
|
||||
SPACED_BITCOIN_RPC_USER: btcAuth.username,
|
||||
SPACED_BITCOIN_RPC_PASSWORD: btcAuth.password,
|
||||
SPACED_RPC_COOKIE: `/data/mainnet/.cookie`,
|
||||
// legacy aliases for `bitcoin-cli` / shell helpers that read these names
|
||||
BTC_RPC_HOST: BITCOIND_RPC_HOSTNAME,
|
||||
BTC_RPC_PORT: String(BITCOIND_RPC_PORT),
|
||||
@@ -136,51 +137,95 @@ SPACES_BASHRC_EOF`],
|
||||
ready: {
|
||||
display: i18n('Spaced Sync'),
|
||||
fn: async () => {
|
||||
const probe = await spacedSub.exec(
|
||||
[
|
||||
'bash',
|
||||
'-c',
|
||||
`/root/.cargo/bin/space-cli --chain ${SPACED_CHAIN} --rpc-cookie ${dataDir}/${SPACED_CHAIN}/.cookie getserverinfo`,
|
||||
],
|
||||
{},
|
||||
)
|
||||
|
||||
if (probe.exitCode !== 0) {
|
||||
return {
|
||||
result: 'starting',
|
||||
message: i18n(
|
||||
'spaced is querying Bitcoin and indexing — this can take a while on first run.',
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
const stdout = (probe.stdout ?? '').toString()
|
||||
let progress = 0
|
||||
try {
|
||||
const parsed = JSON.parse(stdout) as {
|
||||
const probe = await spacedSub.exec(
|
||||
[
|
||||
'/root/.cargo/bin/space-cli',
|
||||
'--chain',
|
||||
SPACED_CHAIN,
|
||||
'--rpc-cookie',
|
||||
`${dataDir}/${SPACED_CHAIN}/.cookie`,
|
||||
'--output-format',
|
||||
'json',
|
||||
'getserverinfo',
|
||||
],
|
||||
{},
|
||||
)
|
||||
|
||||
const stderr = (probe.stderr ?? '').toString().trim()
|
||||
const stdoutText = (probe.stdout ?? '').toString()
|
||||
const stdoutTrimmed = stdoutText.trim()
|
||||
|
||||
if (probe.exitCode !== 0) {
|
||||
return {
|
||||
result: 'failure',
|
||||
message: i18n('space-cli exited ${code}: ${error}', {
|
||||
code: String(probe.exitCode),
|
||||
error: (stderr || stdoutTrimmed || '<no output>').slice(0, 200),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
let parsed: {
|
||||
ready?: boolean
|
||||
progress?: number
|
||||
chain?: { blocks?: number; headers?: number }
|
||||
}
|
||||
if (parsed.ready === true) {
|
||||
try {
|
||||
parsed = JSON.parse(stdoutText)
|
||||
} catch {
|
||||
return {
|
||||
result: 'success',
|
||||
message: i18n('spaced is fully synced.'),
|
||||
result: 'failure',
|
||||
message: i18n(
|
||||
'getserverinfo non-JSON. stdout=${stdout} stderr=${stderr}',
|
||||
{
|
||||
stdout: (stdoutTrimmed || '<empty>').slice(0, 160),
|
||||
stderr: (stderr || '<empty>').slice(0, 160),
|
||||
},
|
||||
),
|
||||
}
|
||||
}
|
||||
progress = Math.floor((parsed.progress ?? 0) * 100)
|
||||
} catch {
|
||||
// fall through to loading
|
||||
}
|
||||
|
||||
return {
|
||||
result: 'loading',
|
||||
message: i18n('spaced is indexing. Progress: ${pct}%', {
|
||||
pct: String(progress),
|
||||
}),
|
||||
const progress = Math.min(
|
||||
100,
|
||||
Math.max(0, Math.round((parsed.progress ?? 0) * 100)),
|
||||
)
|
||||
const blocks = parsed.chain?.blocks ?? 0
|
||||
const headers = parsed.chain?.headers ?? 0
|
||||
|
||||
if (parsed.ready === true && progress >= 100) {
|
||||
return {
|
||||
result: 'success',
|
||||
message: i18n(
|
||||
'spaced is fully synced (blocks ${blocks} / headers ${headers}).',
|
||||
{ blocks: String(blocks), headers: String(headers) },
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
result: 'loading',
|
||||
message: i18n(
|
||||
'spaced is indexing: ${pct}% (blocks ${blocks} / headers ${headers}).',
|
||||
{
|
||||
pct: String(progress),
|
||||
blocks: String(blocks),
|
||||
headers: String(headers),
|
||||
},
|
||||
),
|
||||
}
|
||||
} catch (e) {
|
||||
return {
|
||||
result: 'failure',
|
||||
message: i18n(
|
||||
'Spaced Sync health check crashed: ${error}',
|
||||
{ error: (e as Error)?.message ?? String(e) },
|
||||
),
|
||||
}
|
||||
}
|
||||
},
|
||||
gracePeriod: 300_000,
|
||||
gracePeriod: 30_000,
|
||||
trigger: sdk.trigger.cooldownTrigger(30_000),
|
||||
},
|
||||
requires: ['spaced'],
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user