import { AddressInfo } from "../types" import { AddressReceipt } from "./AddressReceipt" import { Host, BindOptions, Scheme } from "./Host" import { ServiceInterfaceBuilder } from "./ServiceInterfaceBuilder" export class Origin { constructor( readonly host: T, readonly internalPort: number, readonly scheme: string | null, readonly sslScheme: string | null, ) {} build({ username, path, search, schemeOverride }: BuildOptions): AddressInfo { const qpEntries = Object.entries(search) .map( ([key, val]) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`, ) .join("&") const qp = qpEntries.length ? `?${qpEntries}` : "" return { hostId: this.host.options.id, internalPort: this.internalPort, scheme: schemeOverride ? schemeOverride.noSsl : this.scheme, sslScheme: schemeOverride ? schemeOverride.ssl : this.sslScheme, suffix: `${path}${qp}`, username, } } /** * A function to register a group of origins ( :// : ) with StartOS * * The returned addressReceipt serves as proof that the addresses were registered * * @param addressInfo * @returns */ async export( serviceInterfaces: ServiceInterfaceBuilder[], ): Promise { const addressesInfo = [] for (let serviceInterface of serviceInterfaces) { const { name, description, hasPrimary, disabled, id, type, username, path, search, schemeOverride, masked, } = serviceInterface.options const addressInfo = this.build({ username, path, search, schemeOverride, }) await serviceInterface.options.effects.exportServiceInterface({ id, name, description, hasPrimary, disabled, addressInfo, type, masked, }) addressesInfo.push(addressInfo) } return addressesInfo as AddressInfo[] & AddressReceipt } } type BuildOptions = { schemeOverride: { ssl: Scheme; noSsl: Scheme } | null username: string | null path: string search: Record }