*Initial version
This commit is contained in:
commit
fb8abc6ad6
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"name": "@lumeweb/libkernel-universal",
|
||||||
|
"type": "module",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "rimraf dist && tsc"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@siaweb/libweb": "git+https://git.lumeweb.com/LumeWeb/libsiaweb.git",
|
||||||
|
"libkernel": "^0.1.48",
|
||||||
|
"libkmodule": "^0.2.53"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"prettier": "^2.8.3",
|
||||||
|
"typescript": "^4.9.4"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
lockfileVersion: 5.4
|
||||||
|
|
||||||
|
specifiers:
|
||||||
|
'@siaweb/libweb': git+https://git.lumeweb.com/LumeWeb/libsiaweb.git
|
||||||
|
libkernel: ^0.1.48
|
||||||
|
libkmodule: ^0.2.53
|
||||||
|
prettier: ^2.8.3
|
||||||
|
typescript: ^4.9.4
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
'@siaweb/libweb': git.lumeweb.com/LumeWeb/libsiaweb/5e6cdba3e7d9a4b94e21ddcd5f2b5138fb440ee8
|
||||||
|
libkernel: 0.1.48
|
||||||
|
libkmodule: 0.2.53
|
||||||
|
|
||||||
|
devDependencies:
|
||||||
|
prettier: 2.8.3
|
||||||
|
typescript: 4.9.4
|
||||||
|
|
||||||
|
packages:
|
||||||
|
|
||||||
|
/@skynetlabs/libskynet/0.0.48:
|
||||||
|
resolution: {integrity: sha512-wFqPLVuGyfuEU1PsE7AMC+ANcoJiz7iruJPUrNZC0riDv1qMrZw+tx44HlBXLJ1H50JZiGtRPr9zLgkPFhf9OA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/libkernel/0.1.48:
|
||||||
|
resolution: {integrity: sha512-h86j/D+5gnpw/h8DTQE1C9hWFRmQnw5ZU9L3fYTZIPqPEIIU40z+tnDp66Zbb6mcfYCr8+SGkhcCy3XsyHOvyQ==}
|
||||||
|
dependencies:
|
||||||
|
'@skynetlabs/libskynet': 0.0.48
|
||||||
|
libskynet: 0.0.64
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/libkmodule/0.2.53:
|
||||||
|
resolution: {integrity: sha512-fwMcssu6mwH+xeuUwUFdGDYQgGvwuVs0RMtbBPEYHvPPOBDNbdesPmlax/+XwDn6XiGggg+wSvq7st2m4VbwEw==}
|
||||||
|
dependencies:
|
||||||
|
libskynet: 0.1.9
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/libskynet/0.0.64:
|
||||||
|
resolution: {integrity: sha512-OPIxvxNTbo7H6KWU1YgQkfksNGTSQYVDsmGTji05/Gv2ZpwTOVJF4AMvggCHyLije8fNe4ZXRrBEtLQI3kpAaQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/libskynet/0.1.9:
|
||||||
|
resolution: {integrity: sha512-lYP4GUbDZXUd0PyTyHz7RBPXGSBFmFZrc2JirnV7tlL4ii3Zi6m79z73zGWoiDBrHI25RR9s9gdm/LdBeXz9nQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/prettier/2.8.3:
|
||||||
|
resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==}
|
||||||
|
engines: {node: '>=10.13.0'}
|
||||||
|
hasBin: true
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/typescript/4.9.4:
|
||||||
|
resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==}
|
||||||
|
engines: {node: '>=4.2.0'}
|
||||||
|
hasBin: true
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
git.lumeweb.com/LumeWeb/libsiaweb/5e6cdba3e7d9a4b94e21ddcd5f2b5138fb440ee8:
|
||||||
|
resolution: {commit: 5e6cdba3e7d9a4b94e21ddcd5f2b5138fb440ee8, repo: https://git.lumeweb.com/LumeWeb/libsiaweb.git, type: git}
|
||||||
|
name: '@siaweb/libweb'
|
||||||
|
version: 0.1.0
|
||||||
|
dev: false
|
|
@ -0,0 +1,127 @@
|
||||||
|
type callModule = typeof import("libkmodule").callModule;
|
||||||
|
type connectModule = typeof import("libkmodule").connectModule;
|
||||||
|
type logErr = typeof import("libkmodule").logErr;
|
||||||
|
type log = typeof import("libkmodule").log;
|
||||||
|
|
||||||
|
import type { ErrTuple, DataFn } from "@siaweb/libweb";
|
||||||
|
|
||||||
|
type callModuleBound = (method: string, data?: any) => Promise<ErrTuple>;
|
||||||
|
type connectModuleBound = (
|
||||||
|
method: string,
|
||||||
|
data: any,
|
||||||
|
receiveUpdate: DataFn
|
||||||
|
) => [sendUpdate: DataFn, response: Promise<ErrTuple>];
|
||||||
|
|
||||||
|
let callModule: callModule;
|
||||||
|
let connectModule: connectModule;
|
||||||
|
let log: log;
|
||||||
|
let logErr: logErr;
|
||||||
|
|
||||||
|
export interface ModuleBag {
|
||||||
|
callModule: callModule;
|
||||||
|
connectModule: connectModule;
|
||||||
|
log: log;
|
||||||
|
logErr: logErr;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ModuleBagBound extends ModuleBag {
|
||||||
|
callModule: callModuleBound;
|
||||||
|
connectModule: connectModuleBound;
|
||||||
|
}
|
||||||
|
|
||||||
|
export abstract class Client {
|
||||||
|
private _callModule?: callModuleBound;
|
||||||
|
|
||||||
|
get callModule(): callModuleBound {
|
||||||
|
return this._callModule as callModuleBound;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _connectModule?: connectModuleBound;
|
||||||
|
|
||||||
|
get connectModule(): connectModuleBound {
|
||||||
|
return this._connectModule as connectModuleBound;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async loadLibs(module: string): Promise<void> {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async loadBound(module: string): Promise<ModuleBagBound> {
|
||||||
|
return (await load(module)) as ModuleBagBound;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected handleError(ret: ErrTuple): void {
|
||||||
|
if (ret[1]) {
|
||||||
|
throw new Error(ret[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected async callModuleReturn(method: string, data?: any): Promise<any> {
|
||||||
|
const ret = await this.callModule(method, data);
|
||||||
|
|
||||||
|
return ret[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function load(
|
||||||
|
module?: string
|
||||||
|
): Promise<ModuleBag | ModuleBagBound> {
|
||||||
|
if (callModule !== null && connectModule !== null) {
|
||||||
|
if (module) {
|
||||||
|
return {
|
||||||
|
callModule: callModule.bind(undefined, module),
|
||||||
|
connectModule: connectModule.bind(undefined, module),
|
||||||
|
log,
|
||||||
|
logErr,
|
||||||
|
} as ModuleBagBound;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
callModule,
|
||||||
|
connectModule,
|
||||||
|
log,
|
||||||
|
logErr,
|
||||||
|
} as ModuleBag;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
type ClientConstructor<U> = new (...args: any[]) => U;
|
||||||
|
|
||||||
|
export const factory = function <T extends Client = Client>(
|
||||||
|
type: ClientConstructor<T>,
|
||||||
|
module: string
|
||||||
|
) {
|
||||||
|
return function (...args: any): T {
|
||||||
|
return new Proxy<T>(new type(...args), {
|
||||||
|
get(target: T, property: string) {
|
||||||
|
return async (): Promise<any> => {
|
||||||
|
await target.loadLibs(module);
|
||||||
|
|
||||||
|
return target[property as keyof T];
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"declaration": true,
|
||||||
|
"strict": true,
|
||||||
|
"module": "esnext",
|
||||||
|
"target": "esnext",
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"sourceMap": false,
|
||||||
|
"rootDir": "src",
|
||||||
|
"outDir": "dist",
|
||||||
|
"typeRoots": [
|
||||||
|
"node_modules/@types",
|
||||||
|
],
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"declarationMap": true,
|
||||||
|
"declarationDir": "dist",
|
||||||
|
"emitDeclarationOnly": false,
|
||||||
|
"allowJs": true
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"src"
|
||||||
|
]
|
||||||
|
}
|
Reference in New Issue