Files
start-os/sdk/base/lib/util/getServiceInterfaces.ts
Aiden McClelland 29e8210782 enabling support for wireguard and firewall (#2713)
* wip: enabling support for wireguard and firewall

* wip

* wip

* wip

* wip

* wip

* implement some things

* fix warning

* wip

* alpha.23

* misc fixes

* remove ufw since no longer required

* remove debug info

* add cli bindings

* debugging

* fixes

* individualized acme and privacy settings for domains and bindings

* sdk version bump

* migration

* misc fixes

* refactor Host::update

* debug info

* refactor webserver

* misc fixes

* misc fixes

* refactor port forwarding

* recheck interfaces every 5 min if no dbus event

* misc fixes and cleanup

* misc fixes
2025-01-09 16:34:34 -07:00

103 lines
2.5 KiB
TypeScript

import { Effects } from "../Effects"
import {
ServiceInterfaceFilled,
filledAddress,
getHostname,
} from "./getServiceInterface"
const makeManyInterfaceFilled = async ({
effects,
packageId,
callback,
}: {
effects: Effects
packageId?: string
callback?: () => void
}) => {
const serviceInterfaceValues = await effects.listServiceInterfaces({
packageId,
callback,
})
const serviceInterfacesFilled: ServiceInterfaceFilled[] = await Promise.all(
Object.values(serviceInterfaceValues).map(async (serviceInterfaceValue) => {
const hostId = serviceInterfaceValue.addressInfo.hostId
const host = await effects.getHostInfo({
packageId,
hostId,
callback,
})
if (!host) {
throw new Error(`host ${hostId} not found!`)
}
return {
...serviceInterfaceValue,
host,
addressInfo: filledAddress(host, serviceInterfaceValue.addressInfo),
}
}),
)
return serviceInterfacesFilled
}
export class GetServiceInterfaces {
constructor(
readonly effects: Effects,
readonly opts: { packageId?: string },
) {}
/**
* Returns the value of Store at the provided path. Restart the service if the value changes
*/
async const() {
const { packageId } = this.opts
const callback = () => this.effects.constRetry()
const interfaceFilled: ServiceInterfaceFilled[] =
await makeManyInterfaceFilled({
effects: this.effects,
packageId,
callback,
})
return interfaceFilled
}
/**
* Returns the value of ServiceInterfacesFilled at the provided path. Does nothing if the value changes
*/
async once() {
const { packageId } = this.opts
const interfaceFilled: ServiceInterfaceFilled[] =
await makeManyInterfaceFilled({
effects: this.effects,
packageId,
})
return interfaceFilled
}
/**
* Watches the value of ServiceInterfacesFilled at the provided path. Takes a custom callback function to run whenever the value changes
*/
async *watch() {
const { packageId } = this.opts
while (true) {
let callback: () => void = () => {}
const waitForNext = new Promise<void>((resolve) => {
callback = resolve
})
yield await makeManyInterfaceFilled({
effects: this.effects,
packageId,
callback,
})
await waitForNext
}
}
}
export function getServiceInterfaces(
effects: Effects,
opts: { packageId?: string },
) {
return new GetServiceInterfaces(effects, opts)
}