107 lines
3.3 KiB
TypeScript
107 lines
3.3 KiB
TypeScript
import ProcessImpl from './ProcessImpl.ts'
|
|
import { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts'
|
|
import { BasicSystemProcessInfo } from '@/core/system/BasicSystemProcessInfo.ts'
|
|
import { DesktopProcessInfo } from '@/core/desktop/DesktopProcessInfo.ts'
|
|
import type { IAppProcessInfoParams } from '@/core/process/types/IAppProcessInfoParams.ts'
|
|
import type { IProcessManager } from '@/core/process/IProcessManager.ts'
|
|
import type { IProcess } from '@/core/process/IProcess.ts'
|
|
import type { IProcessInfo } from '@/core/process/IProcessInfo.ts'
|
|
import { processManager } from '@/core/process/ProcessManager.ts'
|
|
import { isUndefined } from 'lodash'
|
|
|
|
/**
|
|
* 进程管理
|
|
*/
|
|
export default class ProcessManagerImpl implements IProcessManager {
|
|
private _processPool: Map<string, IProcess> = new Map<string, IProcess>();
|
|
private _processInfos: IProcessInfo[] = new Array<ProcessInfoImpl>();
|
|
|
|
public get processInfos() {
|
|
return this._processInfos;
|
|
}
|
|
|
|
constructor() {
|
|
console.log('ProcessManageImpl')
|
|
this.loadAppProcessInfos();
|
|
}
|
|
// TODO 加载所有进程信息
|
|
private loadAppProcessInfos() {
|
|
console.log('加载所有进程信息')
|
|
// 添加内置进程
|
|
const apps = import.meta.glob<IAppProcessInfoParams>('../../apps/**/*.json', { eager: true })
|
|
const internalProcessInfos: ProcessInfoImpl[] = Object.values(apps).map(data => new ProcessInfoImpl(data))
|
|
|
|
this._processInfos.push(BasicSystemProcessInfo)
|
|
this._processInfos.push(DesktopProcessInfo)
|
|
|
|
this._processInfos.push(...internalProcessInfos)
|
|
}
|
|
|
|
public async runProcess<T extends IProcess = IProcess, A extends any[] = any[]>(
|
|
proc: string | IProcessInfo,
|
|
constructor?: new (info: IProcessInfo, ...args: A) => T,
|
|
...args: A
|
|
): Promise<T> {
|
|
let info = typeof proc === 'string' ? this.findProcessInfoByName(proc) : proc
|
|
if (isUndefined(info)) {
|
|
throw new Error(`未找到进程信息:${proc}`)
|
|
}
|
|
|
|
// 是单例应用
|
|
if (info.singleton) {
|
|
let process = this.findProcessByName(info.name)
|
|
if (process) {
|
|
return process as T
|
|
}
|
|
}
|
|
|
|
// 创建进程
|
|
let process = isUndefined(constructor) ? new ProcessImpl(info) : new constructor(info, ...args)
|
|
|
|
return process as T
|
|
}
|
|
|
|
// 添加进程
|
|
public registerProcess(process: ProcessImpl) {
|
|
this._processPool.set(process.id, process);
|
|
}
|
|
|
|
/**
|
|
* 通过进程id查找进程
|
|
* @param id 进程id
|
|
*/
|
|
public findProcessById(id: string) {
|
|
return this._processPool.get(id);
|
|
}
|
|
|
|
/**
|
|
* 通过进程名称查找进程
|
|
* @param name 进程名称
|
|
*/
|
|
public findProcessByName<T extends IProcess = IProcess>(name: string) {
|
|
const pools = [...this._processPool.values()];
|
|
return pools.find(proc => proc.processInfo.name === name) as T | undefined;
|
|
}
|
|
|
|
/**
|
|
* 根据进程id删除进程
|
|
* @param id 进程id
|
|
*/
|
|
public removeProcess(id: string): void;
|
|
/**
|
|
* 根据进程删除进程
|
|
* @param process 进程信息
|
|
*/
|
|
public removeProcess(process: IProcess): void;
|
|
public removeProcess(params: string | IProcess) {
|
|
const id = typeof params === 'string' ? params : params.id;
|
|
this._processPool.delete(id);
|
|
}
|
|
|
|
/**
|
|
* 通过进程名称查找进程信息
|
|
*/
|
|
public findProcessInfoByName(name: string) {
|
|
return this._processInfos.find(info => info.name === name);
|
|
}
|
|
} |