This repository has been archived on 2023-04-09. You can view files and clone it, but cannot push or open issues or pull requests.
libkernel-universal/dist/index.js

118 lines
3.2 KiB
JavaScript
Raw Normal View History

2023-04-08 19:37:51 +00:00
import EventEmitter from "eventemitter2";
2023-01-31 10:02:52 +00:00
let callModule;
let connectModule;
let log;
let logErr;
2023-02-01 12:42:32 +00:00
export class Client extends EventEmitter {
2023-01-31 10:02:52 +00:00
_callModule;
get callModule() {
return this._callModule;
}
2023-02-17 02:06:32 +00:00
_log;
get log() {
return this._log;
}
_logErr;
get logErr() {
return this._logErr;
}
2023-01-31 10:02:52 +00:00
_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);
2023-02-01 17:28:30 +00:00
this.handleError(ret);
return ret;
2023-01-31 10:02:52 +00:00
};
this._connectModule = moduleBag.connectModule;
2023-02-17 02:06:32 +00:00
this._log = log;
this._logErr = logErr;
2023-01-31 10:02:52 +00:00
}
async loadBound(module) {
return (await load(module));
}
handleError(ret) {
if (ret[1]) {
throw new Error(ret[1]);
}
}
2023-02-01 12:27:20 +00:00
handleErrorOrReturn(ret) {
this.handleError(ret);
return ret[0];
}
2023-01-31 10:02:52 +00:00
async callModuleReturn(method, data) {
const ret = await this.callModule(method, data);
return ret[0];
}
}
export async function load(module) {
2023-01-31 12:43:04 +00:00
if (callModule && connectModule) {
2023-01-31 10:02:52 +00:00
if (module) {
return {
callModule: callModule.bind(undefined, module),
connectModule: connectModule.bind(undefined, module),
log,
logErr,
};
}
return {
callModule,
connectModule,
log,
logErr,
};
}
2023-01-31 12:49:03 +00:00
const pkg = typeof window !== "undefined" && window?.document
? await import("libkernel")
: await import("libkmodule");
2023-01-31 10:02:52 +00:00
callModule = pkg.callModule;
connectModule = pkg.connectModule;
2023-01-31 12:49:03 +00:00
// @ts-ignore
2023-01-31 10:02:52 +00:00
log = pkg.log;
2023-01-31 12:49:03 +00:00
// @ts-ignore
2023-01-31 10:02:52 +00:00
logErr = pkg.logErr;
return load(module);
}
export const factory = function (type, module) {
return function (...args) {
return new Proxy(new type(...args), {
get(target, property) {
2023-03-24 19:17:16 +00:00
let desc = Object.getOwnPropertyDescriptor(target?.constructor?.prototype, property);
if (!desc?.get) {
const prop = target[property];
if (typeof prop !== "function") {
return prop;
}
2023-03-24 20:47:58 +00:00
}
2023-03-24 20:44:11 +00:00
return async (...args) => {
await target.loadLibs(module);
2023-03-25 13:22:40 +00:00
if (desc?.get) {
return target[property];
}
2023-01-31 13:05:20 +00:00
return target[property](...args);
2023-01-31 10:02:52 +00:00
};
},
});
};
};
2023-04-09 03:41:12 +00:00
export async function maybeGetAsyncProperty(object) {
if (typeof object === "function") {
object = object();
}
if (isPromise(object)) {
object = await object;
}
return object;
}
export function isPromise(obj) {
return (!!obj &&
(typeof obj === "object" || typeof obj === "function") &&
typeof obj.then === "function");
}