/** * This file is part of the NocoBase (R) project. * Copyright (c) 2020-2024 NocoBase Co., Ltd. * Authors: NocoBase Team. * * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. * For more information, please refer to: https://www.nocobase.com/agreement. */ /// /// /// import { IncomingMessage, ServerResponse } from 'http'; import { AsyncEmitter } from '@nocobase/utils'; import { EventEmitter } from 'events'; import Application, { ApplicationOptions } from '../application'; import type { AppDiscoveryAdapter, AppProcessAdapter, AppStatus, EnvironmentInfo, GetAppOptions, ProcessCommand, AppDbCreator, AppOptionsFactory, AppDbCreatorOptions, AppCommandAdapter, AppModel, BootstrapLock } from './types'; import { Predicate } from './condition-registry'; import { PubSubManagerPublishOptions } from '../pub-sub-manager'; import { Transaction, Transactionable } from '@nocobase/database'; import { SystemLogger } from '@nocobase/logger'; import AesEncryptor from '../aes-encryptor'; export type AppDiscoveryAdapterFactory = (context: { supervisor: AppSupervisor; }) => AppDiscoveryAdapter; export type AppProcessAdapterFactory = (context: { supervisor: AppSupervisor; }) => AppProcessAdapter; export type AppCommandAdapterFactory = (context: { supervisor: AppSupervisor; }) => AppCommandAdapter; export declare class AppSupervisor extends EventEmitter implements AsyncEmitter { private static instance; private static discoveryAdapterFactories; private static processAdapterFactories; private static commandAdapterFactories; private static defaultDiscoveryAdapterName; private static defaultProcessAdapterName; private static defaultCommandAdapterName; runningMode: 'single' | 'multiple'; singleAppName: string | null; logger: SystemLogger; aesEncryptor?: AesEncryptor; emitAsync: (event: string | symbol, ...args: any[]) => Promise; private discoveryAdapter; private processAdapter; private commandAdapter; private discoveryAdapterName; private processAdapterName; private commandAdapterName; private appDbCreator; appOptionsFactory: AppOptionsFactory; private environmentHeartbeatInterval; private environmentHeartbeatTimer; private constructor(); private resolveDiscoveryAdapterName; private resolveProcessAdapterName; private resolveCommandAdapterName; private createDiscoveryAdapter; private isProcessCapableAdapter; private createProcessAdapter; private createCommandAdapter; static registerDiscoveryAdapter(name: string, factory: AppDiscoveryAdapterFactory): void; static registerProcessAdapter(name: string, factory: AppProcessAdapterFactory): void; static registerCommandAdapter(name: string, factory: AppCommandAdapterFactory): void; static setDefaultDiscoveryAdapter(name: string): void; static setDefaultProcessAdapter(name: string): void; static setDefaultCommandAdapter(name: string): void; static getInstance(): AppSupervisor; get apps(): Record; get appStatus(): Record; get appErrors(): Record; get lastSeenAt(): Map; get lastMaintainingMessage(): Record; get statusBeforeCommanding(): Record; get environmentName(): string; get environmentUrl(): string; get environmentProxyUrl(): string; getProcessAdapter(): AppProcessAdapter; getDiscoveryAdapter(): AppDiscoveryAdapter; registerAppDbCreator(condition: Predicate, creator: AppDbCreator, priority?: number): void; createDatabase(options: AppDbCreatorOptions): Promise; setAppOptionsFactory(factory: AppOptionsFactory): void; bootstrapApp(appName: string): Promise; initApp({ appName, options }: { appName: string; options?: { upgrading?: boolean; }; }): Promise; setAppError(appName: string, error: Error): void; hasAppError(appName: string): boolean; clearAppError(appName: string): void; reset(): Promise; destroy(): Promise; getAppStatus(appName: string, defaultStatus?: AppStatus): Promise; setAppStatus(appName: string, status: AppStatus, options?: {}): Promise; clearAppStatus(appName: string): Promise; getAppsStatuses(appNames?: string[]): Promise; getBootstrapLock(appName: string): Promise; registerApp({ appModel, mainApp, hook }: { appModel: AppModel; mainApp?: Application; hook?: boolean; }): Application; bootMainApp(options: ApplicationOptions): Application; setAppLastSeenAt(appName: string): Promise; getAppLastSeenAt(appName: string): Promise; addAppModel(appModel: AppModel): Promise; getAppModel(appName: string): Promise; removeAppModel(appName: string): Promise; getAppNameByCName(cname: string): Promise; addAutoStartApps(environmentName: string, appNames: string[]): Promise; getAutoStartApps(): Promise; removeAutoStartApps(environmentName: string, appNames: string[]): Promise; addApp(app: Application): Application; getApp(appName: string, options?: GetAppOptions): Promise>; hasApp(appName: string): boolean; createApp(options: { appModel: AppModel; mainApp?: Application; transaction?: Transaction; }, context?: { requestId: string; }): Promise; startApp(appName: string, context?: { requestId: string; }): Promise; stopApp(appName: string, context?: { requestId: string; }): Promise; removeApp(appName: string, context?: { requestId: string; }): Promise; upgradeApp(appName: string, context?: { requestId: string; }): Promise; /** * @deprecated * use {#getApps} instead */ subApps(): Application[]; getApps(): Application[]; proxyWeb(appName: string, req: IncomingMessage, res: ServerResponse): Promise; proxyWs(req: IncomingMessage, socket: any, head: Buffer): Promise; registerEnvironment(mainApp: Application): Promise; unregisterEnvironment(): Promise; private normalizeEnvInfo; listEnvironments(): Promise; getEnvironment(environmentName: string): Promise; heartbeatEnvironment(): Promise; dispatchCommand(command: ProcessCommand): Promise; registerCommandHandler(mainApp: Application): void; sendSyncMessage(mainApp: Application, message: { type: string; appName: string; }, options?: PubSubManagerPublishOptions & Transactionable): Promise; on(eventName: string | symbol, listener: (...args: any[]) => void): this; private bindAppEvents; } export type { AppDiscoveryAdapter, AppProcessAdapter, AppCommandAdapter, AppStatus, ProcessCommand, EnvironmentInfo, GetAppOptions, AppDbCreator, AppOptionsFactory, AppModel, AppModelOptions, BootstrapLock, } from './types'; export { MainOnlyAdapter } from './main-only-adapter';