UNPKG

gcl

Version:

码农村nodejs类库,完成解决回调陷阱,配置框架,IOC框架,统一多DB访问框架,可扩展日志框架和io/db/net/thread/pool 克隆表达式,加解密算法等等一系列基础类库和算法的实现

543 lines (535 loc) 17.5 kB
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 ___ = {};