bdfde2befd
* feat(plugin): Verify plugin integrity with 'checksum' option * fix(types): Add optional checksum type definition in PluginConfig
44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
import { PluginLoaderManagerProps } from './types';
|
|
import { useEffect } from 'react';
|
|
import logger from '/imports/startup/client/logger';
|
|
|
|
const PluginLoaderManager = (props: PluginLoaderManagerProps) => {
|
|
const {
|
|
uuid,
|
|
containerRef,
|
|
loadedPlugins,
|
|
setLastLoadedPlugin,
|
|
pluginConfig: plugin,
|
|
} = props;
|
|
|
|
useEffect(() => {
|
|
if (!plugin || !containerRef) {
|
|
return;
|
|
}
|
|
|
|
const div = document.createElement('div');
|
|
div.id = uuid;
|
|
containerRef.current?.appendChild(div);
|
|
|
|
const script = document.createElement('script');
|
|
script.onload = () => {
|
|
loadedPlugins.current += 1;
|
|
setLastLoadedPlugin(script);
|
|
logger.info(`Loaded plugin ${plugin.name}`);
|
|
};
|
|
script.onerror = (err) => {
|
|
logger.error(`Error when loading plugin ${plugin.name}, error: `, err);
|
|
};
|
|
script.src = plugin.url;
|
|
script.setAttribute('uuid', div.id);
|
|
script.setAttribute('pluginName', plugin.name);
|
|
if (plugin.checksum) {
|
|
script.setAttribute('integrity', plugin.checksum);
|
|
}
|
|
document.head.appendChild(script);
|
|
}, [plugin, containerRef]);
|
|
return null;
|
|
};
|
|
|
|
export default PluginLoaderManager;
|