122 lines
4.1 KiB
TypeScript
122 lines
4.1 KiB
TypeScript
import { storeJson } from './fileModels/store.json'
|
|
import { i18n } from './i18n'
|
|
import { sdk } from './sdk'
|
|
import {
|
|
defaultStratumPort,
|
|
defaultStratumTlsPort,
|
|
stratumHostId,
|
|
stratumTlsHostId,
|
|
uiHostId,
|
|
uiPort,
|
|
} from './utils'
|
|
|
|
export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => {
|
|
// Stratum ports are user config. Read reactively so changing them in the
|
|
// Configure action re-runs this and rebinds the interfaces — the same
|
|
// mechanism that adds/removes the TLS interface when TLS is toggled.
|
|
const ports = await storeJson
|
|
.read((s) => ({
|
|
stratum: s.stratumPort,
|
|
stratumTls: s.stratumTlsPort,
|
|
tlsEnabled: s.tlsEnabled,
|
|
}))
|
|
.const(effects)
|
|
|
|
const stratumPort = ports?.stratum ?? defaultStratumPort
|
|
const stratumTlsPort = ports?.stratumTls ?? defaultStratumTlsPort
|
|
|
|
// Web dashboard
|
|
const uiMulti = sdk.MultiHost.of(effects, uiHostId)
|
|
const uiMultiOrigin = await uiMulti.bindPort(uiPort, {
|
|
protocol: 'http',
|
|
})
|
|
const ui = sdk.createInterface(effects, {
|
|
name: i18n('Web Dashboard'),
|
|
id: 'ui',
|
|
description: i18n(
|
|
'Real-time Kamado Pool dashboard (hashrate, miners, blocks, best shares)',
|
|
),
|
|
type: 'ui',
|
|
masked: false,
|
|
schemeOverride: null,
|
|
username: null,
|
|
path: '',
|
|
query: {},
|
|
})
|
|
const uiReceipt = await uiMultiOrigin.export([ui])
|
|
const receipts = [uiReceipt]
|
|
|
|
// Plaintext stratum — a raw TCP interface. Unlike StartOS 0.3.x, 0.4.0
|
|
// forwards raw TCP on the LAN, so miners connect directly to the host at
|
|
// the assigned external port; no router forward or simpleproxy needed.
|
|
const stratumMulti = sdk.MultiHost.of(effects, stratumHostId)
|
|
const stratumOrigin = await stratumMulti.bindPort(stratumPort, {
|
|
protocol: null,
|
|
preferredExternalPort: stratumPort,
|
|
addSsl: null,
|
|
secure: { ssl: false },
|
|
})
|
|
const stratum = sdk.createInterface(effects, {
|
|
name: i18n('Stratum'),
|
|
id: 'stratum',
|
|
description: i18n(
|
|
'Plaintext stratum endpoint. Point miners here with their Bitcoin payout address as the username',
|
|
),
|
|
type: 'api',
|
|
masked: false,
|
|
schemeOverride: { ssl: 'stratum+ssl', noSsl: 'stratum+tcp' },
|
|
username: null,
|
|
path: '',
|
|
query: {},
|
|
})
|
|
receipts.push(await stratumOrigin.export([stratum]))
|
|
|
|
// TLS stratum (conditional) — stunnel terminates TLS with the persisted
|
|
// package-managed certificate and forwards to ckpool's loopback-only
|
|
// second bind. The OS sees a raw TCP port; TLS lives at the app layer, so
|
|
// the noSsl scheme is deliberately stratum+ssl.
|
|
if (ports?.tlsEnabled) {
|
|
const tlsMulti = sdk.MultiHost.of(effects, stratumTlsHostId)
|
|
const tlsOrigin = await tlsMulti.bindPort(stratumTlsPort, {
|
|
protocol: null,
|
|
preferredExternalPort: stratumTlsPort,
|
|
addSsl: null,
|
|
secure: { ssl: false },
|
|
})
|
|
const stratumTls = sdk.createInterface(effects, {
|
|
name: i18n('Stratum (TLS)'),
|
|
id: 'stratum-tls',
|
|
description: i18n(
|
|
'TLS-encrypted stratum endpoint (self-signed certificate — see the Stratum TLS Certificate action)',
|
|
),
|
|
type: 'api',
|
|
masked: false,
|
|
schemeOverride: { ssl: 'stratum+ssl', noSsl: 'stratum+ssl' },
|
|
username: null,
|
|
path: '',
|
|
query: {},
|
|
})
|
|
receipts.push(await tlsOrigin.export([stratumTls]))
|
|
}
|
|
|
|
// Drop bindings we no longer use. `bindPort` registers a binding per
|
|
// (hostId, internalPort) and nothing removes the old one when the user
|
|
// changes a port in Configure — the stale binding lingers and the OS lists
|
|
// its interface again, so the UI shows two identical "Stratum" entries (and
|
|
// keeps a forward open on the abandoned port). Packages with fixed ports
|
|
// never hit this; ours has user-configurable ports, so it must clean up
|
|
// after itself. Runs last, after the current bindings exist, so the `except`
|
|
// list is exactly what we just bound.
|
|
await sdk.clearBindings(effects, {
|
|
except: [
|
|
{ id: uiHostId, internalPort: uiPort },
|
|
{ id: stratumHostId, internalPort: stratumPort },
|
|
...(ports?.tlsEnabled
|
|
? [{ id: stratumTlsHostId, internalPort: stratumTlsPort }]
|
|
: []),
|
|
],
|
|
})
|
|
|
|
return receipts
|
|
})
|