feat: add getOutboundGateway effect and simplify VersionGraph init/uninit

Add getOutboundGateway effect across core, container-runtime, and SDK
to let services query their effective outbound gateway with callback
support. Remove preInstall/uninstall hooks from VersionGraph as they
are no longer needed.
This commit is contained in:
Aiden McClelland
2026-02-20 13:26:45 -07:00
parent 8c1a452742
commit 80cb2d9ba5
12 changed files with 327 additions and 46 deletions

View File

@@ -23,7 +23,7 @@ import { setupExportedUrls } from '../../base/lib/interfaces/setupExportedUrls'
import { successFailure } from './trigger/successFailure'
import { MultiHost, Scheme } from '../../base/lib/interfaces/Host'
import { ServiceInterfaceBuilder } from '../../base/lib/interfaces/ServiceInterfaceBuilder'
import { GetSystemSmtp } from './util'
import { GetOutboundGateway, GetSystemSmtp } from './util'
import { nullIfEmpty } from './util'
import { getServiceInterface, getServiceInterfaces } from './util'
import {
@@ -107,6 +107,7 @@ export class StartSdk<Manifest extends T.SDKManifest> {
type AlreadyExposed =
| 'getSslCertificate'
| 'getSystemSmtp'
| 'getOutboundGateway'
| 'getContainerIp'
| 'getDataVersion'
| 'setDataVersion'
@@ -445,6 +446,8 @@ export class StartSdk<Manifest extends T.SDKManifest> {
) => new ServiceInterfaceBuilder({ ...options, effects }),
getSystemSmtp: <E extends Effects>(effects: E) =>
new GetSystemSmtp(effects),
getOutboundGateway: <E extends Effects>(effects: E) =>
new GetOutboundGateway(effects),
getSslCertificate: <E extends Effects>(
effects: E,
hostnames: string[],

View File

@@ -64,8 +64,6 @@ export class VersionGraph<CurrentVersion extends string>
private constructor(
readonly current: VersionInfo<CurrentVersion>,
versions: Array<VersionInfo<any>>,
private readonly preInstall?: InitScriptOrFn<'install'>,
private readonly uninstall?: UninitScript | UninitFn,
) {
this.graph = once(() => {
const graph = new Graph<
@@ -167,24 +165,8 @@ export class VersionGraph<CurrentVersion extends string>
static of<
CurrentVersion extends string,
OtherVersions extends Array<VersionInfo<any>>,
>(options: {
current: VersionInfo<CurrentVersion>
other: OtherVersions
/**
* A script to run only on fresh install
*/
preInstall?: InitScriptOrFn<'install'>
/**
* A script to run only on uninstall
*/
uninstall?: UninitScriptOrFn
}) {
return new VersionGraph(
options.current,
options.other,
options.preInstall,
options.uninstall,
)
>(options: { current: VersionInfo<CurrentVersion>; other: OtherVersions }) {
return new VersionGraph(options.current, options.other)
}
async migrate({
effects,
@@ -270,7 +252,7 @@ export class VersionGraph<CurrentVersion extends string>
.normalize(),
)
async init(effects: T.Effects, kind: InitKind): Promise<void> {
async init(effects: T.Effects): Promise<void> {
const from = await getDataVersion(effects)
if (from) {
await this.migrate({
@@ -279,10 +261,6 @@ export class VersionGraph<CurrentVersion extends string>
to: this.currentVersion(),
})
} else {
kind = 'install' // implied by !dataVersion
if (this.preInstall)
if ('init' in this.preInstall) await this.preInstall.init(effects, kind)
else await this.preInstall(effects, kind)
await effects.setDataVersion({ version: this.current.options.version })
}
}
@@ -300,11 +278,6 @@ export class VersionGraph<CurrentVersion extends string>
to: target,
})
}
} else {
if (this.uninstall)
if ('uninit' in this.uninstall)
await this.uninstall.uninit(effects, target)
else await this.uninstall(effects, target)
}
await setDataVersion(effects, target)
}