gcl
Version:
码农村nodejs类库,完成解决回调陷阱,配置框架,IOC框架,统一多DB访问框架,可扩展日志框架和io/db/net/thread/pool 克隆表达式,加解密算法等等一系列基础类库和算法的实现
456 lines (452 loc) • 20.2 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 = path => new Middler(C.getApplicationConfigManagerFromJS(path));
export const getMiddlerFromObj = obj => new Middler(C.getApplicationConfigManagerFromObj(obj));
export const getMiddlerFromFile = path => new Middler(C.getApplicationConfigManagerFromFile(path));
export const getMiddlerFromDir = path => new Middler(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 ___ = {};