diff --git a/server/httpgate/server/app.js b/server/httpgate/server/app.js new file mode 100644 index 0000000..316600b --- /dev/null +++ b/server/httpgate/server/app.js @@ -0,0 +1,14 @@ +const app = require('j7/app'); +const event = require('j7/event'); +const config = require('j7/config'); + +event.addListener(event.APP_INITIALIZED_EVENT, () => { + require('./metamgr').init(); + require('./middlewares/factory').init(); + require('./controllers/factory').init(); + require('./models/factory').init(); + require('./services/factory').init(); + app.injectionSession(require('./session')); + app.listen(config('listen_port')); +}); +app.init(); diff --git a/server/httpgate/server/constant.js b/server/httpgate/server/constant.js new file mode 100644 index 0000000..e69de29 diff --git a/server/httpgate/server/controllers/factory.js b/server/httpgate/server/controllers/factory.js new file mode 100644 index 0000000..fde6436 --- /dev/null +++ b/server/httpgate/server/controllers/factory.js @@ -0,0 +1,17 @@ +const controllers = {}; + +function add(name) { + controllers[name] = require('./' + name); + controllers[name].init(); +} + +function init() { + add('proxy'); +} + +function create(name) { + +} + +exports.init = init; +exports.create = create; diff --git a/server/httpgate/server/controllers/proxy.js b/server/httpgate/server/controllers/proxy.js new file mode 100644 index 0000000..7789fe2 --- /dev/null +++ b/server/httpgate/server/controllers/proxy.js @@ -0,0 +1,41 @@ +const https = require('https'); +const app = require('j7/app'); +const utils = require('j7/utils'); +const http = require('j7/http'); +const serviceFactory = require('../services/factory'); + +async function get(session) { + const seqId = session.request('seq_id'); + const targetUrl = session.request('target_url'); + const cbUrl = session.request('cb_url'); + const reqJson = session.requestToJson(); + new Promise(async (resolve) => { + const params = utils.jsonDecode(session.request('params')); + const {err, data} = await http.get(targetUrl, params); + const rspJson = { + 'errcode': 0, + 'errmsg': '', + 'seq_id': seqId, + 'req_json': reqJson, + 'data': data + }; + if (err) { + rspJson['errcode'] = 1; + rspJson['errmsg'] = '' + err; + } + console.log('data', data); + console.log('rspJson:' + utils.jsonEncode(rspJson)); + await http.get(cbUrl, rspJson); + }); + session.rspOk(); +}; + +async function post(session) { +} + +function init() { + app.registerHandler('Proxy', 'get', get); + app.registerHandler('Proxy', 'post', post); +} + +exports.init = init; diff --git a/server/httpgate/server/metamgr.js b/server/httpgate/server/metamgr.js new file mode 100644 index 0000000..80c0551 --- /dev/null +++ b/server/httpgate/server/metamgr.js @@ -0,0 +1,80 @@ +const app = require('j7/app'); +const utils = require('j7/utils'); +const log = require('j7/log'); +const metawrap = require('./metawrap'); + +const metaClasses = []; + +const MT_CONFIG = 0; + +function registerMetaClass(fileName, idx, primKey, wrapClass) { + metaClasses.push({ + 'fileName' : fileName, + 'idx' : idx, + 'primKey' : primKey, + 'wrapClass': wrapClass, + 'rawList' : [], + 'rawHash' : {}, + 'wrapList' : [], + 'wrapHash' : {}, + }); +} + +function load() { + metaClasses.forEach(function (metaClass) { + const json = utils.readJsonFromFile(metaClass['fileName']); + if (!json) { + throw new Error('读取配置' + metaClass['fileName'] + '失败'); + } + if (Array.isArray(json)) { + metaClass['rawList'] = json; + + } else { + metaClass['rawList'].push(json); + } + let idx = 0; + metaClass['rawList'].forEach(function (item) { + const wrapOjb = new metawrap[metaClass['wrapClass']](item); + const wrapProxy = new Proxy(wrapOjb, wrapOjb._getHandler()); + metaClass['wrapList'] = wrapProxy; + if (metaClass['primKey'] == '') { + metaClass['rawHash'][idx] = item; + metaClass['wrapHash'][idx] = wrapProxy; + } else { + metaClass['rawHash'][item[metaClass['primKey']]] = item; + metaClass['wrapHash'][item[metaClass['primKey']]] = wrapProxy; + } + ++idx; + }); + //log.debug(utils.jsonEncode(metaClass)); + }); +} + +function init() { + let configDir = './config/'; + if (utils.isOnlineEnv()) { + configDir = '../config/'; + } + registerMetaClass(configDir + 'config.json', + MT_CONFIG, + '', + 'Config' + ); + load(); +} + +function getMetaClass(metaIdx) { + return metaIdx >= 0 && metaIdx < metaClasses.length ? metaClasses[metaIdx] : null; +} + +function getMetaByKey(metaIdx, key) { + const metaClass = getMetaClass(metaIdx); + return metaClass && key in metaClass['wrapHash'] ? metaClass['wrapHash'][key] : null; +} + +function getMetaList(metaIdx) { + const metaClass = getMetaClass(metaIdx); + return metaClass ? metaClass['rawList'] : null; +} + +exports.init = init; diff --git a/server/httpgate/server/metawrap.js b/server/httpgate/server/metawrap.js new file mode 100644 index 0000000..20c8aa1 --- /dev/null +++ b/server/httpgate/server/metawrap.js @@ -0,0 +1,44 @@ +const utils = require('j7/utils'); + +class BaseWrap { + + constructor(json) { + this._json = json; + } + + _getHandler() { + return { + get: (obj, prop) => { + if (prop in obj._json) { + let val = obj._json[prop]; + if (utils.isArray(val)) { + return new Proxy(val, { + set: () => { + console.log(33333); + } + }); + } else if (utils.isObject(val)) { + return new Proxy(val, { + set: () => { + console.log(33333); + } + }); + } else { + return val; + } + } + return prop in obj ? obj[prop] : null; + }, + set: () => { + console.log(111111); + } + }; + } + +} + +class Config extends BaseWrap { + +} + +exports.Config = Config; diff --git a/server/httpgate/server/middlewares/authenticate.js b/server/httpgate/server/middlewares/authenticate.js new file mode 100644 index 0000000..7dff072 --- /dev/null +++ b/server/httpgate/server/middlewares/authenticate.js @@ -0,0 +1,10 @@ +const app = require('j7/app'); + +async function authenticate(session) { +} + +function init() { + app.addMiddleware('authenticate', authenticate); +} + +exports.init = init; diff --git a/server/httpgate/server/middlewares/factory.js b/server/httpgate/server/middlewares/factory.js new file mode 100644 index 0000000..aed5580 --- /dev/null +++ b/server/httpgate/server/middlewares/factory.js @@ -0,0 +1,12 @@ +const middlewares = {}; + +function add(name) { + middlewares[name] = require('./' + name); + middlewares[name].init(); +} + +function init() { + add('authenticate'); +} + +exports.init = init; diff --git a/server/httpgate/server/models/factory.js b/server/httpgate/server/models/factory.js new file mode 100644 index 0000000..adf60be --- /dev/null +++ b/server/httpgate/server/models/factory.js @@ -0,0 +1,5 @@ +function init() { + +} + +exports.init = init; diff --git a/server/httpgate/server/package-lock.json b/server/httpgate/server/package-lock.json new file mode 100644 index 0000000..1cda0ec --- /dev/null +++ b/server/httpgate/server/package-lock.json @@ -0,0 +1,43 @@ +{ + "name": "httpproxy", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "httpproxy", + "version": "1.0.0", + "dependencies": { + "j7": "file:../../third_party/j7" + } + }, + "../../third_party/j7": { + "version": "1.0.0", + "dependencies": { + "axios": "^0.26.1", + "crc-32": "^1.2.1", + "express": "^4.17.2", + "mysql": "~2.18.1", + "querystring": "^0.2.1", + "urlencode": "^1.1.0" + } + }, + "node_modules/j7": { + "resolved": "../../third_party/j7", + "link": true + } + }, + "dependencies": { + "j7": { + "version": "file:../../third_party/j7", + "requires": { + "axios": "^0.26.1", + "crc-32": "^1.2.1", + "express": "^4.17.2", + "mysql": "~2.18.1", + "querystring": "^0.2.1", + "urlencode": "^1.1.0" + } + } + } +} diff --git a/server/httpgate/server/package.json b/server/httpgate/server/package.json new file mode 100644 index 0000000..a73215e --- /dev/null +++ b/server/httpgate/server/package.json @@ -0,0 +1,10 @@ +{ + "name": "httpgate_svr", + "version": "1.0.0", + "description": "", + "private": true, + "scripts": {}, + "dependencies": { + "j7": "file:../../third_party/j7" + } +} diff --git a/server/httpgate/server/services/baseservice.js b/server/httpgate/server/services/baseservice.js new file mode 100644 index 0000000..d1eca1f --- /dev/null +++ b/server/httpgate/server/services/baseservice.js @@ -0,0 +1,13 @@ +class BaseService { + + constructor(session) { + this.session = session; + } + + getSession() { + return this.session; + } + +} + +module.exports = BaseService; diff --git a/server/httpgate/server/services/factory.js b/server/httpgate/server/services/factory.js new file mode 100644 index 0000000..18cf487 --- /dev/null +++ b/server/httpgate/server/services/factory.js @@ -0,0 +1,24 @@ +const channelDef = require('j7/channel') +const services = {}; + +function add(clsNames, modName) { + const modClass = require('./' + modName); + clsNames.forEach((clsName) => { + services[clsName] = { + 'clsName': clsName, + 'modName': modName, + 'class': modClass + }; + }); +} + +function init() { +} + +function create(name, session) { + const module = services[name]; + return new module['class'](session); +} + +exports.init = init; +exports.create = create; diff --git a/server/httpgate/server/session.js b/server/httpgate/server/session.js new file mode 100644 index 0000000..6c88322 --- /dev/null +++ b/server/httpgate/server/session.js @@ -0,0 +1,50 @@ +const utils = require('j7/utils'); +const app = require('j7/app'); + +class Session { + + constructor(req, rsp) { + this.req = req; + this.rsp = rsp; + this.nowTime = utils.getUtcTime(); + } + + getNowTime() { + return this.nowTime; + } + + getNowDaySeconds() { + return this.getNowDaySeconds(this.getNowTime()); + } + + getDaySeconds(utcTime) { + + } + + rspErr(errCode, errMsg) { + utils.rspErr(this.rsp, errCode, errMsg); + } + + rspOk() { + utils.rspOk(this.rsp); + } + + rspData(data) { + utils.rspData(this.rsp, data); + } + + dieErr(errCode, errMsg) { + this.rspErr(errCode, errMsg); + } + + request(name, defVal = null) { + return name in this.req.query ? this.req.query[name] : defVal; + } + + requestToJson() { + return utils.jsonEncode(this.req.query); + } + +} + +module.exports = Session;