let callModule; let connectModule; let log; let logErr; export class Client { _callModule; get callModule() { return this._callModule; } _connectModule; get connectModule() { return this._connectModule; } async loadLibs(module) { if (this._callModule && this._connectModule) { return; } const moduleBag = await this.loadBound(module); this._callModule = async (...args) => { const ret = await moduleBag.callModule(...args); this.handleError(ret); return ret; }; this._connectModule = moduleBag.connectModule; } async loadBound(module) { return (await load(module)); } handleError(ret) { if (ret[1]) { throw new Error(ret[1]); } } async callModuleReturn(method, data) { const ret = await this.callModule(method, data); return ret[0]; } } export async function load(module) { if (callModule !== null && connectModule !== null) { if (module) { return { callModule: callModule.bind(undefined, module), connectModule: connectModule.bind(undefined, module), log, logErr, }; } return { callModule, connectModule, log, logErr, }; } const pkgName = typeof window !== "undefined" && window?.document ? "libkernel" : "libkmodule"; const pkg = await import(pkgName); callModule = pkg.callModule; connectModule = pkg.connectModule; log = pkg.log; logErr = pkg.logErr; return load(module); } export const factory = function (type, module) { return function (...args) { return new Proxy(new type(...args), { get(target, property) { return async () => { await target.loadLibs(module); return target[property]; }; }, }); }; };