You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.6 KiB
111 lines
3.6 KiB
"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;
|
|
|