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;
 |