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