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