112 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.ApiProxy = void 0;
 | |
| const const_js_1 = require("./const.js");
 | |
| const time_js_1 = require("./time.js");
 | |
| class ApiProxy {
 | |
|     constructor(plugin, hook) {
 | |
|         this.target = null;
 | |
|         this.targetQueue = [];
 | |
|         this.onQueue = [];
 | |
|         this.plugin = plugin;
 | |
|         this.hook = hook;
 | |
|         const defaultSettings = {};
 | |
|         if (plugin.settings) {
 | |
|             for (const id in plugin.settings) {
 | |
|                 const item = plugin.settings[id];
 | |
|                 defaultSettings[id] = item.defaultValue;
 | |
|             }
 | |
|         }
 | |
|         const localSettingsSaveId = `__vue-devtools-plugin-settings__${plugin.id}`;
 | |
|         let currentSettings = Object.assign({}, defaultSettings);
 | |
|         try {
 | |
|             const raw = localStorage.getItem(localSettingsSaveId);
 | |
|             const data = JSON.parse(raw);
 | |
|             Object.assign(currentSettings, data);
 | |
|         }
 | |
|         catch (e) {
 | |
|             // noop
 | |
|         }
 | |
|         this.fallbacks = {
 | |
|             getSettings() {
 | |
|                 return currentSettings;
 | |
|             },
 | |
|             setSettings(value) {
 | |
|                 try {
 | |
|                     localStorage.setItem(localSettingsSaveId, JSON.stringify(value));
 | |
|                 }
 | |
|                 catch (e) {
 | |
|                     // noop
 | |
|                 }
 | |
|                 currentSettings = value;
 | |
|             },
 | |
|             now() {
 | |
|                 return (0, time_js_1.now)();
 | |
|             },
 | |
|         };
 | |
|         if (hook) {
 | |
|             hook.on(const_js_1.HOOK_PLUGIN_SETTINGS_SET, (pluginId, value) => {
 | |
|                 if (pluginId === this.plugin.id) {
 | |
|                     this.fallbacks.setSettings(value);
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
|         this.proxiedOn = new Proxy({}, {
 | |
|             get: (_target, prop) => {
 | |
|                 if (this.target) {
 | |
|                     return this.target.on[prop];
 | |
|                 }
 | |
|                 else {
 | |
|                     return (...args) => {
 | |
|                         this.onQueue.push({
 | |
|                             method: prop,
 | |
|                             args,
 | |
|                         });
 | |
|                     };
 | |
|                 }
 | |
|             },
 | |
|         });
 | |
|         this.proxiedTarget = new Proxy({}, {
 | |
|             get: (_target, prop) => {
 | |
|                 if (this.target) {
 | |
|                     return this.target[prop];
 | |
|                 }
 | |
|                 else if (prop === 'on') {
 | |
|                     return this.proxiedOn;
 | |
|                 }
 | |
|                 else if (Object.keys(this.fallbacks).includes(prop)) {
 | |
|                     return (...args) => {
 | |
|                         this.targetQueue.push({
 | |
|                             method: prop,
 | |
|                             args,
 | |
|                             resolve: () => { },
 | |
|                         });
 | |
|                         return this.fallbacks[prop](...args);
 | |
|                     };
 | |
|                 }
 | |
|                 else {
 | |
|                     return (...args) => {
 | |
|                         return new Promise((resolve) => {
 | |
|                             this.targetQueue.push({
 | |
|                                 method: prop,
 | |
|                                 args,
 | |
|                                 resolve,
 | |
|                             });
 | |
|                         });
 | |
|                     };
 | |
|                 }
 | |
|             },
 | |
|         });
 | |
|     }
 | |
|     async setRealTarget(target) {
 | |
|         this.target = target;
 | |
|         for (const item of this.onQueue) {
 | |
|             this.target.on[item.method](...item.args);
 | |
|         }
 | |
|         for (const item of this.targetQueue) {
 | |
|             item.resolve(await this.target[item.method](...item.args));
 | |
|         }
 | |
|     }
 | |
| }
 | |
| exports.ApiProxy = ApiProxy;
 |