gcl
Version:
码农村nodejs类库,完成解决回调陷阱,配置框架,IOC框架,统一多DB访问框架,可扩展日志框架和io/db/net/thread/pool 克隆表达式,加解密算法等等一系列基础类库和算法的实现
543 lines (535 loc) • 17.5 kB
JavaScript
import V from "../common/tool";
import C from "../io/config";
import { Pool } from "../collection/pool";
/**
* C.Configs = V.merge(C.Configs,{ConfigConverts:{Middler:{type:'MiddlerConfigConvert',path:'/com/coooders/bean/middler'}}});
Middler通过包装getConfigValue中的Key值实际调用MiddlerConfig特别定义的GetValueByAppName方法
*/
export const Middler = class {
constructor(cm) {
const { _, __ } = pri(this, { cm: cm, KEY: "Middler" });
}
getObjectByAppName(app, name) {
const { _, __ } = pri(this);
try {
return __.cm.getConfigValue(__.KEY, new ValueConfig(app, name));
} catch (e) {
V.showException(app + ":" + name, e);
}
}
setObjectByAppName(app, name, val) {
const { _, __ } = pri(this);
try {
return __.cm.setConfigValue(__.KEY, new ValueConfig(app, name), val);
} catch (e) {
V.showException(app + ":" + name, e);
}
}
getTypeByAppName(app, name) {
const { _, __ } = pri(this);
try {
return __.cm.getConfigValue(__.KEY, new TypeConfig(app, name));
} catch (e) {
V.showException(app + ":" + name, e);
}
}
};
export const MiddlerConfig = class extends C.Config {
constructor() {
super();
pri(this);
}
getValue(key) {
return key.getValue(this);
}
setValue(key, val) {
return key.setValue(this, val);
}
merge(config) {
const { _ } = pri(this);
if (config.data) {
let { ...data } = config.data;
_.data = data;
}
}
getValueByName(app, name) {
const { _ } = pri(this);
if (_.data[app] && _.data[app][name]) {
return _.data[app][name].getValue();
} else return null;
}
setValueByName(app, name, val) {
const { _ } = pri(this);
if (_.data[app] && _.data[app][name]) {
return _.data[app][name].setValue(val);
} else return null;
}
getTypeByName(app, name) {
const { _ } = pri(this);
if (_.data[app] && _.data[app][name]) {
return _.data[app][name].getType();
} else return null;
}
};
/*
Middler:{
appName:{
method:'',
mode:'',
path:'',
host:'',
pack:'',
ObjectName:{type:'',path:'',method:'',mode:'',constractparalength:'',params:[
{type:'',path:'',method:'',mode:'',constractparalength:''},
{ref:''},
{a:1,b:2},
{a:1},
{b:2},
'',
1,
{middler:true},
{self:true},
{appsetting:'settingname'}
]},
ObjectsName:{path:'',method:'',mode:'',constractparalength:'',params:[
{type:'',path:'',method:'',mode:'',constractparalength:''},
{ref:''},
]}
}
}
*/
export const MiddlerConfigConvert = class extends C.ConfigConvert {
constructor() {
super();
const that = this;
const { _, __ } = pri(that, {
scripts: {},
getScript: (path) => {
const { _, __ } = pri(that);
__.scripts[path] = __.scripts[path] || V.include(path, C.Configs.base);
return __.scripts[path];
},
clearScript: () => {
const { _, __ } = pri(that);
delete __.scripts;
__.scripts = {};
},
getType: (path, type) => {
const { _, __ } = pri(that);
let assem = __.getScript(path);
return type ? assem[type] : assem;
},
convertParas: (config, params = [], defParam, app, pcm) => {
const { _, __ } = pri(that);
let paras = [];
for (let i in params) {
let val = params[i];
if (val && typeof val == "object") {
if (val.ref) {
let index =
val.ref.indexOf("/") >= 0
? val.ref.indexOf("/")
: val.ref.indexOf("\\") >= 0
? val.ref.indexOf("\\")
: -1;
let appName =
index >= 0 ? val.ref.substr(0, index) : defParam.app;
let name = appName ? val.ref.substr(index + 1) : val.ref;
//paras.push(config.getValueByName(appName,name));
paras.push({ ref: appName, name: name });
} else if (val.type || val.path) {
let name = V.random() + "";
app[name] = __.convertContainer(config, val, defParam, app, pcm);
paras.push({ ref: defParam.app, name: name });
} else if (val.self) {
paras.push(pcm);
} else if (val.appsetting) {
paras.push(C.AppSettings(pcm, val.appsetting));
} else if (val.middler) {
paras.push(new Middler(pcm));
} else if (val.params && val.param) {
let name = V.random() + "";
app[name] = __.convertContainer(config, val, defParam, app, pcm);
paras.push({ ref: defParam.app, name: name, param: val.param });
} else if (V.isArray(val)) {
//objects
let name = V.random() + "";
app[name] = __.convertContainer(
config,
{ params: val },
defParam,
app,
pcm,
);
paras.push({ ref: defParam.app, name: name });
} else {
//普通JSON
paras.push(val);
}
} else {
paras.push(val);
}
}
return new (class {
constructor() {}
getParas() {
let ret = [];
for (let i in paras) {
let val = paras[i];
if (val && val.ref) {
val = config.getValueByName(val.ref, val.name);
}
ret.push(val);
}
return ret;
}
})();
},
convertCreater: (config, v, defParam, app, pcm) => {
const { _, __ } = pri(that);
let method = V.getValue(v.method, defParam.method);
let path = V.getValue(v.path, defParam.path);
//todo spapath暂时不明
let spapath = V.getValue(v.spapath, false);
let host = V.getValue(v.host, defParam.host);
let type =
(V.isValid(v.type) && v.type.indexOf("\.") == 0
? defParam.pack
: "") + v.type;
path =
(V.isValid(path) && path.indexOf("~") == 0
? defParam.path + "/"
: "") + path.trim("~");
if (type == "undefined" && !V.isValid(v.ref)) {
if (V.isValid(v.path) || V.isValid(v.spapath)) {
type = v.type = ""; //type就是类本身 + V.random();
} else if (V.isValid(v.params)) {
method = "objects";
} else {
method = "self";
}
}
let constructorparalength = V.getValue(
v.constructorparalength,
defParam.constructorparalength,
);
//使用Objects的默认配置对下传递 仅仅传递 path 和 pack
let para = __.convertParas(
config,
v.params,
V.merge(defParam, { path: path, pack: defParam.pack, host: host }),
app,
pcm,
);
return new (class {
constructor() {}
getType() {
let paras = para.getParas();
return __.getType(path, type);
}
getValue() {
let paras = para.getParas();
switch (method) {
case "self":
return v;
case "objects":
return paras;
default:
case "constructor":
//严重问题 不能create
let cls1 = __.getType(path, type);
return cls1 ? V.create2(cls1, paras) : null;
case "bean":
//严重问题 不能create
let cls2 = __.getType(path, type);
let val2 = cls2 ? V.create2(cls2, []) : null;
//bean设置出错
if (val2 && paras) {
for (let i in paras) {
if (typeof paras[i] === "object") {
if (v.params[i].name && val2["set" + v.params[i].name]) {
val2["set" + v.params[i].name].apply(val2, [paras[i]]);
} else if (
v.params[i].param &&
val2["set" + v.params[i].param]
) {
val2["set" + v.params[i].param].apply(val2, paras[i]);
} else {
val2 = V.merge(val2, paras[i]);
}
}
}
}
return val2;
case "factory":
//严重问题 不能create 回调
let cls3 = __.getType(path, type);
return cls3
? cls3.apply(cls3, paras)
: eval("(" + type + ".apply(" + type + ",paras))");
case "factorycallback":
let cls4 = __.getType(path, type);
let callback = new (class {
constructor() {
pri(this, { argument: null, hasset: false });
}
getValue(func) {
const { _, __ } = pri(this);
if (__.hasset) func.apply(null, argument);
else __.func = func;
}
call(...args) {
const { _, __ } = pri(this);
V.merge(
__,
{
argument: args,
hasset: true,
},
true,
);
if (__.func) func.apply(null, arguments);
}
})();
paras.push(callback.call);
cls4
? cls4.apply(cls4, paras)
: eval("(" + type + ".apply(" + type + ",paras))");
return callback;
case "factorybean":
let cls5 = __.getType(path, type);
let val5 = cls5
? cls5.apply(cls5, paras)
: eval("(" + type + ".apply(" + type + ",paras))");
if (paras && val5) {
for (let i in paras) {
if (
(typeof constructorparalength == "undefined" ||
i >= constructorparalength) &&
typeof paras[i] === "object"
) {
if (v.params[i].name && val5["set" + v.params[i].name]) {
val5["set" + v.params[i].name].apply(val5, [paras[i]]);
} else if (
v.params[i].param &&
val5["set" + v.params[i].param]
) {
val5["set" + v.params[i].param].apply(val5, paras[i]);
} else {
val5 = V.merge(val5, paras[i]);
}
}
}
}
return val5;
case "constructorbean":
let cls6 = __.getType(path, type);
let val6 = cls6 ? V.create2(cls6, paras) : null;
if (paras && val6) {
for (let i in paras) {
if (
(typeof constructorparalength == "undefined" ||
i >= constructorparalength) &&
typeof paras[i] === "object"
) {
if (v.params[i].name && val6["set" + v.params[i].name]) {
val6["set" + v.params[i].name].apply(val6, [paras[i]]);
} else if (
v.params[i].param &&
val6["set" + v.params[i].param]
) {
val6["set" + v.params[i].param].apply(val6, paras[i]);
} else {
val6 = V.merge(val6, paras[i]);
}
}
}
}
return val6;
}
}
})();
},
convertContainer: (config, v, defParam, app, pcm) => {
const { _, __ } = pri(that);
let mode = V.getValue(v.mode, defParam.mode);
let size = V.getValue(v.size, defParam.size);
//创建生成器
let creater = __.convertCreater(config, v, defParam, app, pcm);
let getType = function () {
return creater.getType();
};
//生成保持器
switch (mode) {
default:
case "static":
return new (class {
constructor() {
this.obj = null;
}
getType(...args) {
return Reflect.apply(getType, this, args);
}
getValue() {
if (this.obj == null) {
this.obj = creater.getValue();
}
return this.obj;
}
setValue(val) {
if (this.obj === val) {
} else {
//todo 彻底删除变量
val = null;
}
}
})();
case "instance":
return new (class {
getType(...args) {
return Reflect.apply(getType, this, args);
}
getValue() {
return creater.getValue();
}
setValue(val) {
if (v.dispose) {
V.tryC(v.dispose);
}
}
})();
case "pool":
return new (class {
constructor() {
this.pool = new Pool(size, function () {
return creater.getValue();
});
}
getType(...args) {
return Reflect.apply(getType, this, args);
}
getValue() {
return this.pool.getValue();
}
setValue(val) {
this.pool.setValue(val);
}
})();
}
},
convertApp: (config, v, app, pcm) => {
const { _, __ } = pri(that);
const keys = {
method: "constructor",
mode: "static",
path: false,
pack: false,
constructorparalength: false,
size: 50,
app: app,
host: "",
};
return new (class {
constructor() {
let defParam = {};
for (let i in keys) {
defParam[i] = v[i] || keys[i];
defParam["app"] = app;
}
for (let i in v) {
if (keys[i] || keys[i] == false) {
//console.log('过滤的'+i);
} else {
//转换object定义成Container对象
this[i] = __.convertContainer(
config,
v[i],
defParam,
this,
pcm,
);
}
//设置合并后的默认值
}
}
})();
},
});
//后门获取父configmanager
_.needConfig = true;
}
toConfig(val, pcm) {
const { _, __ } = pri(this);
const config = new MiddlerConfig();
for (let i in val) {
//处理app
config.data[i] = __.convertApp(config, val[i], i, pcm);
}
return config;
}
toString(val) {
V.showException("Middler 不支持此操作");
return "";
}
};
export const getMiddlerFromJS = async (path) =>
new Middler(await C.getApplicationConfigManagerFromJS(path));
export const getMiddlerFromObj = async (obj) =>
new Middler(await C.getApplicationConfigManagerFromObj(obj));
export const getMiddlerFromFile = async (path) =>
new Middler(await C.getApplicationConfigManagerFromFile(path));
export const getMiddlerFromDir = async (path) =>
new Middler(await C.getApplicationConfigManagerFromDir(path));
export const getObjectByAppName = (cm, app, name) => {
if (!___.middler) ___.middler = {};
if (!cm.randomid) {
cm.randomid = V.random();
___.middler[cm.randomid] = new Middler(cm);
}
return ___.middler[cm.randomid].getObjectByAppName(app, name);
};
export const getTypeByAppName = (cm, app, name) => {
if (!___.middler) ___.middler = {};
if (!cm.randomid) {
cm.randomid = V.random();
___.middler[cm.randomid] = new Middler(cm);
}
return ___.middler[cm.randomid].getTypeByAppName(app, name);
};
export default { Middler, MiddlerConfig, MiddlerConfigConvert };
const pri = V.pris();
const ValueConfig = class {
constructor(app, name) {
pri(this, { app: app, name: name });
}
getValue(config) {
const { _, __ } = pri(this);
try {
return config.getValueByName(__.app, __.name);
} catch (e) {
V.showException(__.app + ":" + __.name, e);
}
}
setValue(config, val) {
const { _, __ } = pri(this);
try {
return config.setValueByName(__.app, __.name, val);
} catch (e) {
V.showException(__.app + ":" + __.name, e);
}
}
};
const TypeConfig = class {
constructor(app, name) {
pri(this, { app: app, name: name });
}
getValue(config) {
const { _, __ } = pri(this);
try {
return config.getTypeByName(__.app, __.name);
} catch (e) {
V.showException(__.app + ":" + __.name, e);
}
}
};
const ___ = {};