/**
* 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';