xref: /MusicFree/src/core/pluginMeta.ts (revision e08d37a33b6e5f38f39dcb49b2eb1095f0d66a1c)
1*e08d37a3S猫头猫import {StorageKeys} from '@/constants/commonConst';
2*e08d37a3S猫头猫import StateMapper from '@/utils/stateMapper';
3*e08d37a3S猫头猫import {getStorage, setStorage} from '@/utils/storage';
4*e08d37a3S猫头猫import produce from 'immer';
5*e08d37a3S猫头猫import objectPath from 'object-path';
6*e08d37a3S猫头猫import {Plugin} from './pluginManager';
7*e08d37a3S猫头猫
8*e08d37a3S猫头猫/**
9*e08d37a3S猫头猫 * key: platform
10*e08d37a3S猫头猫 * value: Record<string, any>
11*e08d37a3S猫头猫 */
12*e08d37a3S猫头猫let pluginMetaAll: Record<string, IPlugin.IPluginMeta> = {};
13*e08d37a3S猫头猫let getPluginMetaAll = () => pluginMetaAll;
14*e08d37a3S猫头猫let pluginMetaAllStateMapper = new StateMapper(getPluginMetaAll);
15*e08d37a3S猫头猫
16*e08d37a3S猫头猫/** 先初始化meta,再初始化plugins */
17*e08d37a3S猫头猫async function setupMeta(validKeys?: string[]) {
18*e08d37a3S猫头猫    const meta = await getStorage(StorageKeys.PluginMetaKey);
19*e08d37a3S猫头猫    if (meta !== null) {
20*e08d37a3S猫头猫        if (!validKeys) {
21*e08d37a3S猫头猫            pluginMetaAll = meta;
22*e08d37a3S猫头猫        } else {
23*e08d37a3S猫头猫            const newMeta: Record<string, IPlugin.IPluginMeta> = {};
24*e08d37a3S猫头猫            validKeys.forEach(k => {
25*e08d37a3S猫头猫                if (pluginMetaAll[k]) {
26*e08d37a3S猫头猫                    newMeta[k] = pluginMetaAll[k];
27*e08d37a3S猫头猫                }
28*e08d37a3S猫头猫            });
29*e08d37a3S猫头猫            await setStorage(StorageKeys.PluginMetaKey, newMeta);
30*e08d37a3S猫头猫            pluginMetaAll = newMeta;
31*e08d37a3S猫头猫        }
32*e08d37a3S猫头猫        pluginMetaAllStateMapper.notify();
33*e08d37a3S猫头猫    }
34*e08d37a3S猫头猫}
35*e08d37a3S猫头猫
36*e08d37a3S猫头猫async function setPluginMeta(plugin: Plugin, meta: IPlugin.IPluginMeta) {
37*e08d37a3S猫头猫    const newMeta = produce(pluginMetaAll, draft => {
38*e08d37a3S猫头猫        draft[plugin.name] = meta;
39*e08d37a3S猫头猫    });
40*e08d37a3S猫头猫    await setStorage(StorageKeys.PluginMetaKey, newMeta);
41*e08d37a3S猫头猫    pluginMetaAll = newMeta;
42*e08d37a3S猫头猫    pluginMetaAllStateMapper.notify();
43*e08d37a3S猫头猫}
44*e08d37a3S猫头猫
45*e08d37a3S猫头猫async function setPluginMetaProp(plugin: Plugin, prop: string, value: any) {
46*e08d37a3S猫头猫    const newMeta = produce(pluginMetaAll, draft => {
47*e08d37a3S猫头猫        objectPath.set(draft, `${plugin.name}.${prop}`, value);
48*e08d37a3S猫头猫    });
49*e08d37a3S猫头猫    await setStorage(StorageKeys.PluginMetaKey, newMeta);
50*e08d37a3S猫头猫    pluginMetaAll = newMeta;
51*e08d37a3S猫头猫    pluginMetaAllStateMapper.notify();
52*e08d37a3S猫头猫}
53*e08d37a3S猫头猫
54*e08d37a3S猫头猫function getPluginMeta(plugin: Plugin) {
55*e08d37a3S猫头猫    return pluginMetaAll[plugin.name] ?? {};
56*e08d37a3S猫头猫}
57*e08d37a3S猫头猫
58*e08d37a3S猫头猫export const PluginMeta = {
59*e08d37a3S猫头猫    setupMeta,
60*e08d37a3S猫头猫    setPluginMeta,
61*e08d37a3S猫头猫    setPluginMetaProp,
62*e08d37a3S猫头猫    getPluginMeta,
63*e08d37a3S猫头猫    usePluginMetaAll: pluginMetaAllStateMapper.useMappedState,
64*e08d37a3S猫头猫};
65