import type { Meta } from '../server/actions/Meta'; import { ClientActionBox } from './ClientActionBox'; import { ClientMetaAction } from './ClientMetaAction'; import { AnyAction } from './AnyAction'; import type { Client } from './Client'; import type { FactoryStore } from './ClientConfig'; export class ActionBoxManager { public get meta() { return this.metaInstance; } private metaInstance!: Meta; public readonly actionBoxes: Map; private readonly actionFactories: FactoryStore = { defaultFactory: () => new AnyAction() }; constructor(private client: Client) { const { actionFactories } = client.config; Object.assign(this.actionFactories, actionFactories || {}); this.actionBoxes = new Map( [['#meta', new ClientActionBox('#meta', this.client, () => new ClientMetaAction())]], ); } public getActionBox(actionName: string) { const ab = this.actionBoxes.get(actionName); if (!ab) { throw new Error(`The ${actionName} action is not allow.`); } return ab; } public setMeta(meta: Meta) { this.metaInstance = meta; } public async prepareActionBox(actionName: string) { const existsAction = this.actionBoxes.has(actionName); let ab: ClientActionBox; if (existsAction) { ab = this.getActionBox(actionName); } else { ab = new ClientActionBox(actionName, this.client, this.actionFactories[actionName]); } if (!ab.isReady()) { const { createdOnConnectActions: coca } = this.meta; const { meta, context } = coca[actionName] ? coca[actionName] : await this.meta.getActionMeta(actionName); ab.setContext(context); ab.setConfig(meta); } if (!existsAction) { this.actionBoxes.set(actionName, ab); } } }