@@ -0,0 +1,101 @@
|
||||
import { storeJson } from '../fileModels/storeJson'
|
||||
import { i18n } from '../i18n'
|
||||
import { sdk } from '../sdk'
|
||||
import {
|
||||
CERTRELAY_DEFAULT_BOOTSTRAP,
|
||||
CERTRELAY_DEFAULT_HEALTHCHECK_HANDLE,
|
||||
CERTRELAY_DEFAULT_SELF_URL,
|
||||
} from '../utils'
|
||||
|
||||
const { InputSpec, Value } = sdk
|
||||
|
||||
const inputSpec = InputSpec.of({
|
||||
certrelaySelfUrl: Value.text({
|
||||
name: i18n('Certrelay Self URL'),
|
||||
description: i18n(
|
||||
'The publicly visible URL clients use to reach this certrelay (CERTRELAY_SELF_URL). Set this to match the external address StartOS exposes for the Certrelay interface (e.g. your .onion or clearnet domain).',
|
||||
),
|
||||
warning: null,
|
||||
footnote: null,
|
||||
default: CERTRELAY_DEFAULT_SELF_URL,
|
||||
required: true,
|
||||
masked: false,
|
||||
placeholder: 'https://certrelay.example.com',
|
||||
minLength: 1,
|
||||
maxLength: null,
|
||||
}),
|
||||
certrelayBootstrap: Value.toggle({
|
||||
name: i18n('Certrelay Bootstrap'),
|
||||
description: i18n(
|
||||
'Whether this relay bootstraps from peer relays on startup (CERTRELAY_BOOTSTRAP).',
|
||||
),
|
||||
warning: null,
|
||||
footnote: null,
|
||||
default: CERTRELAY_DEFAULT_BOOTSTRAP,
|
||||
}),
|
||||
certrelayHealthcheckHandle: Value.text({
|
||||
name: i18n('Certrelay Healthcheck Handle'),
|
||||
description: i18n(
|
||||
'A handle the bundled fabric CLI resolves against this relay to verify end-to-end health (CERTRELAY_HEALTHCHECK_HANDLE).',
|
||||
),
|
||||
warning: null,
|
||||
footnote: null,
|
||||
default: CERTRELAY_DEFAULT_HEALTHCHECK_HANDLE,
|
||||
required: true,
|
||||
masked: false,
|
||||
placeholder: 'account-digital-useful.genesis@key',
|
||||
minLength: 1,
|
||||
maxLength: null,
|
||||
}),
|
||||
})
|
||||
|
||||
export const configureCertrelay = sdk.Action.withInput(
|
||||
// id
|
||||
'configure-certrelay',
|
||||
|
||||
// metadata
|
||||
async ({ effects }) => ({
|
||||
name: i18n('Configure Certrelay'),
|
||||
description: i18n(
|
||||
'Set the certrelay self URL, bootstrap toggle, and healthcheck handle. Saving restarts the service so certrelay picks up the new values.',
|
||||
),
|
||||
warning: null,
|
||||
allowedStatuses: 'any',
|
||||
group: null,
|
||||
visibility: 'enabled',
|
||||
}),
|
||||
|
||||
// input
|
||||
inputSpec,
|
||||
|
||||
// prefill — load current values from store
|
||||
async ({ effects }) => {
|
||||
const store = await storeJson.read().once()
|
||||
return {
|
||||
certrelaySelfUrl: store?.certrelaySelfUrl ?? CERTRELAY_DEFAULT_SELF_URL,
|
||||
certrelayBootstrap:
|
||||
store?.certrelayBootstrap ?? CERTRELAY_DEFAULT_BOOTSTRAP,
|
||||
certrelayHealthcheckHandle:
|
||||
store?.certrelayHealthcheckHandle ??
|
||||
CERTRELAY_DEFAULT_HEALTHCHECK_HANDLE,
|
||||
}
|
||||
},
|
||||
|
||||
// run
|
||||
async ({ effects, input }) => {
|
||||
await storeJson.merge(effects, {
|
||||
certrelaySelfUrl: input.certrelaySelfUrl,
|
||||
certrelayBootstrap: input.certrelayBootstrap,
|
||||
certrelayHealthcheckHandle: input.certrelayHealthcheckHandle,
|
||||
})
|
||||
|
||||
return {
|
||||
version: '1',
|
||||
title: i18n('Success'),
|
||||
message: i18n(
|
||||
'Certrelay configuration saved. The service is restarting to apply the new settings.',
|
||||
),
|
||||
result: null,
|
||||
}
|
||||
},
|
||||
)
|
||||
Reference in New Issue
Block a user