import * as interfaces from '../ts_interfaces/index.js'; import type { DcRouterApiClient } from './classes.dcrouterapiclient.js'; export class RemoteIngress { private clientRef: DcRouterApiClient; // Data from IRemoteIngress public id: string; public name: string; public secret: string; public listenPorts: number[]; public enabled: boolean; public autoDerivePorts: boolean; public tags?: string[]; public createdAt: number; public updatedAt: number; public effectiveListenPorts?: number[]; public manualPorts?: number[]; public derivedPorts?: number[]; constructor(clientRef: DcRouterApiClient, data: interfaces.data.IRemoteIngress) { this.clientRef = clientRef; this.id = data.id; this.name = data.name; this.secret = data.secret; this.listenPorts = data.listenPorts; this.enabled = data.enabled; this.autoDerivePorts = data.autoDerivePorts; this.tags = data.tags; this.createdAt = data.createdAt; this.updatedAt = data.updatedAt; this.effectiveListenPorts = data.effectiveListenPorts; this.manualPorts = data.manualPorts; this.derivedPorts = data.derivedPorts; } public async update(changes: { name?: string; listenPorts?: number[]; autoDerivePorts?: boolean; enabled?: boolean; tags?: string[]; }): Promise { const response = await this.clientRef.request( 'updateRemoteIngress', this.clientRef.buildRequestPayload({ id: this.id, ...changes }) as any, ); if (!response.success) { throw new Error('Failed to update remote ingress'); } // Update local state from response const edge = response.edge; this.name = edge.name; this.listenPorts = edge.listenPorts; this.enabled = edge.enabled; this.autoDerivePorts = edge.autoDerivePorts; this.tags = edge.tags; this.updatedAt = edge.updatedAt; this.effectiveListenPorts = edge.effectiveListenPorts; this.manualPorts = edge.manualPorts; this.derivedPorts = edge.derivedPorts; } public async delete(): Promise { const response = await this.clientRef.request( 'deleteRemoteIngress', this.clientRef.buildRequestPayload({ id: this.id }) as any, ); if (!response.success) { throw new Error(response.message || 'Failed to delete remote ingress'); } } public async regenerateSecret(): Promise { const response = await this.clientRef.request( 'regenerateRemoteIngressSecret', this.clientRef.buildRequestPayload({ id: this.id }) as any, ); if (!response.success) { throw new Error('Failed to regenerate secret'); } this.secret = response.secret; return response.secret; } public async getConnectionToken(hubHost?: string): Promise { const response = await this.clientRef.request( 'getRemoteIngressConnectionToken', this.clientRef.buildRequestPayload({ edgeId: this.id, hubHost }) as any, ); if (!response.success) { throw new Error(response.message || 'Failed to get connection token'); } return response.token; } } export class RemoteIngressBuilder { private clientRef: DcRouterApiClient; private edgeName: string = ''; private edgeListenPorts?: number[]; private edgeAutoDerivePorts?: boolean; private edgeTags?: string[]; constructor(clientRef: DcRouterApiClient) { this.clientRef = clientRef; } public setName(name: string): this { this.edgeName = name; return this; } public setListenPorts(ports: number[]): this { this.edgeListenPorts = ports; return this; } public setAutoDerivePorts(auto: boolean): this { this.edgeAutoDerivePorts = auto; return this; } public setTags(tags: string[]): this { this.edgeTags = tags; return this; } public async save(): Promise { const response = await this.clientRef.request( 'createRemoteIngress', this.clientRef.buildRequestPayload({ name: this.edgeName, listenPorts: this.edgeListenPorts, autoDerivePorts: this.edgeAutoDerivePorts, tags: this.edgeTags, }) as any, ); if (!response.success) { throw new Error('Failed to create remote ingress'); } return new RemoteIngress(this.clientRef, response.edge); } } export class RemoteIngressManager { private clientRef: DcRouterApiClient; constructor(clientRef: DcRouterApiClient) { this.clientRef = clientRef; } public async list(): Promise { const response = await this.clientRef.request( 'getRemoteIngresses', this.clientRef.buildRequestPayload() as any, ); return response.edges.map((e) => new RemoteIngress(this.clientRef, e)); } public async getStatuses(): Promise { const response = await this.clientRef.request( 'getRemoteIngressStatus', this.clientRef.buildRequestPayload() as any, ); return response.statuses; } public async create(options: { name: string; listenPorts?: number[]; autoDerivePorts?: boolean; tags?: string[]; }): Promise { const builder = this.build().setName(options.name); if (options.listenPorts) builder.setListenPorts(options.listenPorts); if (options.autoDerivePorts !== undefined) builder.setAutoDerivePorts(options.autoDerivePorts); if (options.tags) builder.setTags(options.tags); return builder.save(); } public build(): RemoteIngressBuilder { return new RemoteIngressBuilder(this.clientRef); } }