2019-11-28 03:56:44 +00:00
|
|
|
import RealmExecutor from "./RealmExecutor";
|
2019-12-17 12:37:12 +00:00
|
|
|
import moment from "moment-timezone";
|
2019-11-28 03:56:44 +00:00
|
|
|
|
|
|
|
|
export type JSExecutorGlobal = Record<string, object>;
|
|
|
|
|
export interface JSExecutor {
|
2020-01-01 07:53:03 +00:00
|
|
|
execute: (src: string, data: JSExecutorGlobal) => any;
|
2019-11-28 03:56:44 +00:00
|
|
|
registerLibrary: (accessor: string, lib: any) => void;
|
|
|
|
|
unRegisterLibrary: (accessor: string) => void;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum JSExecutorType {
|
|
|
|
|
REALM,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class JSExecutionManager {
|
|
|
|
|
currentExecutor: JSExecutor;
|
|
|
|
|
executors: Record<JSExecutorType, JSExecutor>;
|
|
|
|
|
registerLibrary(accessor: string, lib: any) {
|
|
|
|
|
Object.keys(this.executors).forEach(type => {
|
|
|
|
|
const executor = this.executors[(type as any) as JSExecutorType];
|
|
|
|
|
executor.registerLibrary(accessor, lib);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
unRegisterLibrary(accessor: string) {
|
|
|
|
|
Object.keys(this.executors).forEach(type => {
|
|
|
|
|
const executor = this.executors[(type as any) as JSExecutorType];
|
|
|
|
|
executor.unRegisterLibrary(accessor);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
switchExecutor(type: JSExecutorType) {
|
|
|
|
|
const executor = this.executors[type];
|
|
|
|
|
if (!executor) {
|
|
|
|
|
throw new Error("Executor does not exist");
|
|
|
|
|
}
|
|
|
|
|
this.currentExecutor = executor;
|
|
|
|
|
}
|
|
|
|
|
constructor() {
|
|
|
|
|
const realmExecutor = new RealmExecutor();
|
|
|
|
|
this.executors = {
|
|
|
|
|
[JSExecutorType.REALM]: realmExecutor,
|
|
|
|
|
};
|
|
|
|
|
this.currentExecutor = realmExecutor;
|
|
|
|
|
|
|
|
|
|
this.registerLibrary("_", window._);
|
2019-12-17 12:37:12 +00:00
|
|
|
this.registerLibrary("moment", moment);
|
2019-11-28 03:56:44 +00:00
|
|
|
}
|
|
|
|
|
evaluateSync(jsSrc: string, data: JSExecutorGlobal) {
|
|
|
|
|
return this.currentExecutor.execute(jsSrc, data);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const JSExecutionManagerSingleton = new JSExecutionManager();
|
|
|
|
|
|
|
|
|
|
export default JSExecutionManagerSingleton;
|