@difizen/magent-au
Version:
53 lines (44 loc) • 1.47 kB
text/typescript
import { Fetcher } from '@difizen/magent-core';
import type { FecterResponse } from '@difizen/magent-core';
import { inject, prop, singleton } from '@difizen/mana-app';
import type { PluginModel } from './plugin-model.js';
import type { PluginMeta } from './protocol.js';
import { PluginFactory } from './protocol.js';
export class PluginManager {
factory: PluginFactory;
fetcher: Fetcher;
cache: Map<string, PluginModel> = new Map();
publicList: PluginModel[] = [];
loading = false;
getAll = async (): Promise<PluginMeta[]> => {
const defaultValue: PluginMeta[] = [];
const res = await this.fetcher.get<PluginMeta[]>(`/api/v1/plugins`);
if (res.status === 200) {
return res.data;
}
return defaultValue;
};
updatePublic = async () => {
this.loading = true;
const options = await this.getAll();
this.publicList = options.map(this.getOrCreate);
this.loading = false;
};
getOrCreate = (option: PluginMeta): PluginModel => {
const exist = this.cache.get(option.id);
if (exist) {
exist.updateOption(option);
return exist;
}
const plugin = this.factory(option);
this.cache.set(plugin.id, plugin);
return plugin;
};
create = async (option: PluginMeta): Promise<FecterResponse<string>> => {
const res = await this.fetcher.post<string>(`/api/v1/plugins/openapi`, option);
return res;
};
}