1
This commit is contained in:
parent
d6f330ae79
commit
dabf86d6b7
16
server/web3service/app.js
Normal file
16
server/web3service/app.js
Normal file
@ -0,0 +1,16 @@
|
||||
const app = require('j7/app');
|
||||
const event = require('j7/event');
|
||||
const config = require('j7/config');
|
||||
const metaFactory = require('./metadata/factory');
|
||||
|
||||
event.addListener(event.APP_INITIALIZED_EVENT, async () => {
|
||||
await require('./metadata/factory').init();
|
||||
await require('./middlewares/factory').init();
|
||||
await require('./controllers/factory').init();
|
||||
await require('./models/factory').init();
|
||||
await require('./services/factory').init();
|
||||
app.injectionSession(require('./session'));
|
||||
console.log(metaFactory.getWeb3ServiceConf()['listen_port']);
|
||||
app.listen(metaFactory.getWeb3ServiceConf()['listen_port']);
|
||||
});
|
||||
app.init();
|
11
server/web3service/controllers/factory.js
Normal file
11
server/web3service/controllers/factory.js
Normal file
@ -0,0 +1,11 @@
|
||||
const controllers = {};
|
||||
|
||||
function add(name) {
|
||||
controllers[name] = require(`./${name}`);
|
||||
controllers[name].init();
|
||||
}
|
||||
|
||||
async function init() {
|
||||
}
|
||||
|
||||
exports.init = init;
|
8
server/web3service/metadata/Config.js
Normal file
8
server/web3service/metadata/Config.js
Normal file
@ -0,0 +1,8 @@
|
||||
const utils = require('j7/utils');
|
||||
const basewrap = require('./basewrap');
|
||||
|
||||
class Config extends basewrap.BaseWrap {
|
||||
|
||||
}
|
||||
|
||||
module.exports = Config;
|
8
server/web3service/metadata/Web3Service.js
Normal file
8
server/web3service/metadata/Web3Service.js
Normal file
@ -0,0 +1,8 @@
|
||||
const utils = require('j7/utils');
|
||||
const basewrap = require('./basewrap');
|
||||
|
||||
class Web3Service extends basewrap.BaseWrap {
|
||||
|
||||
}
|
||||
|
||||
module.exports = Web3Service;
|
57
server/web3service/metadata/basewrap.js
Normal file
57
server/web3service/metadata/basewrap.js
Normal file
@ -0,0 +1,57 @@
|
||||
const utils = require('j7/utils');
|
||||
|
||||
class BaseWrap {
|
||||
|
||||
#writeLock = false;
|
||||
|
||||
constructor(json, metaClass) {
|
||||
this._json = json;
|
||||
//this._metaClass = metaClass;
|
||||
this._metaName = metaClass['wrapClassName'];
|
||||
}
|
||||
|
||||
lock() {
|
||||
//this.#writeLock = true;
|
||||
}
|
||||
|
||||
_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: (obj, prop, val) => {
|
||||
if (this.#writeLock) {
|
||||
console.log(111111);
|
||||
} else {
|
||||
Reflect.set(obj, prop, val);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
getMetaName() {
|
||||
return this._metaName;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
exports.BaseWrap = BaseWrap;
|
146
server/web3service/metadata/factory.js
Normal file
146
server/web3service/metadata/factory.js
Normal file
@ -0,0 +1,146 @@
|
||||
const app = require('j7/app');
|
||||
const utils = require('j7/utils');
|
||||
const log = require('j7/log');
|
||||
|
||||
const metaClassList = [];
|
||||
const metaClasses = {};
|
||||
let web3ServiceConf = null;
|
||||
let configDir = './config/';
|
||||
|
||||
function registerMetaClass(fileName, primKey, wrapClass) {
|
||||
const metaClass = {
|
||||
'fileName' : fileName,
|
||||
'primKey' : primKey,
|
||||
'wrapClassName': wrapClass,
|
||||
'wrapClass': require('./' + wrapClass),
|
||||
'rawList' : [],
|
||||
'rawHash' : {},
|
||||
'wrapList' : [],
|
||||
'wrapHash' : {},
|
||||
};
|
||||
metaClassList.push(metaClass);
|
||||
metaClasses[wrapClass] = metaClass;
|
||||
}
|
||||
|
||||
function load() {
|
||||
metaClassList.forEach((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 metaClass['wrapClass'](item, metaClass);
|
||||
const wrapProxy = new Proxy(wrapOjb, wrapOjb._getHandler());
|
||||
metaClass['wrapList'].push(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));
|
||||
});
|
||||
{
|
||||
for (let i = 0; i < 3; ++i) {
|
||||
metaClassList.forEach((metaClass) => {
|
||||
metaClass['wrapList'].forEach((item) => {
|
||||
if (item['_init' + i]) {
|
||||
item['_init' + i](exports);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
metaClassList.forEach((metaClass) => {
|
||||
metaClass['wrapList'].forEach((item) => {
|
||||
item.lock();
|
||||
});
|
||||
});
|
||||
}
|
||||
{
|
||||
traverseMetaList('Web3Service', (item, idx) => {
|
||||
if (item['instance_id'] == app.getInstanceId()) {
|
||||
web3ServiceConf = item;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function init() {
|
||||
configDir = './config/';
|
||||
if (utils.isOnlineEnv()) {
|
||||
configDir = '../config/';
|
||||
} else if (utils.getArgv('env') == 'dev'){
|
||||
configDir = './config_dev/';
|
||||
}
|
||||
console.log(configDir, utils.getArgv('env'));
|
||||
|
||||
let resDir = './res/';
|
||||
if (utils.isOnlineEnv()) {
|
||||
resDir = '../res/';
|
||||
} else if (utils.getArgv('env') == 'dev'){
|
||||
resDir = './res_dev/';
|
||||
}
|
||||
console.log(resDir);
|
||||
|
||||
registerMetaClass(configDir + 'config.json',
|
||||
'',
|
||||
'Config'
|
||||
);
|
||||
registerMetaClass(configDir + 'web3service.cluster.json',
|
||||
'',
|
||||
'Web3Service'
|
||||
);
|
||||
load();
|
||||
}
|
||||
|
||||
function getMetaClass(name) {
|
||||
return utils.hasKey(metaClasses, name) ? metaClasses[name] : null;
|
||||
}
|
||||
|
||||
function getMetaByKey(name, key) {
|
||||
const metaClass = getMetaClass(name);
|
||||
return metaClass && key in metaClass['wrapHash'] ? metaClass['wrapHash'][key] : null;
|
||||
}
|
||||
|
||||
function getMetaList(name) {
|
||||
const metaClass = getMetaClass(name);
|
||||
return metaClass ? metaClass['wrapList'] : null;
|
||||
}
|
||||
|
||||
function callMetaStatic(name, method, ...args) {
|
||||
const metaClass = getMetaClass(name);
|
||||
return metaClass['wrapClass'][method](...args);
|
||||
}
|
||||
|
||||
function traverseMetaList(name, cb) {
|
||||
const metaList = getMetaList(name);
|
||||
if (metaList) {
|
||||
for (let i = 0; i < metaList.length; ++i) {
|
||||
if (!cb(metaList[i], i, metaList.length)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getWeb3ServiceConf() {
|
||||
return web3ServiceConf;
|
||||
}
|
||||
|
||||
exports.init = init;
|
||||
|
||||
exports.getMetaByKey = getMetaByKey;
|
||||
exports.traverseMetaList = traverseMetaList;
|
||||
exports.callMetaStatic = callMetaStatic;
|
||||
|
||||
exports.getWeb3ServiceConf = getWeb3ServiceConf;
|
5
server/web3service/middlewares/factory.js
Normal file
5
server/web3service/middlewares/factory.js
Normal file
@ -0,0 +1,5 @@
|
||||
async function init() {
|
||||
|
||||
}
|
||||
|
||||
exports.init = init;
|
17
server/web3service/models/basemodel.js
Normal file
17
server/web3service/models/basemodel.js
Normal file
@ -0,0 +1,17 @@
|
||||
class BaseModel {
|
||||
|
||||
constructor(session) {
|
||||
this.session = session;
|
||||
}
|
||||
|
||||
getSession() {
|
||||
return this.session;
|
||||
}
|
||||
|
||||
getUser() {
|
||||
return this.session.user;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = BaseModel;
|
21
server/web3service/models/factory.js
Normal file
21
server/web3service/models/factory.js
Normal file
@ -0,0 +1,21 @@
|
||||
const models = {};
|
||||
|
||||
function add(clsName, modName) {
|
||||
const modClass = require('./' + modName);
|
||||
models[clsName] = {
|
||||
'clsName': clsName,
|
||||
'modName': modName,
|
||||
'class': modClass
|
||||
};
|
||||
}
|
||||
|
||||
async function init() {
|
||||
}
|
||||
|
||||
function create(name, session) {
|
||||
const module = models[name];
|
||||
return new module['class'](session);
|
||||
}
|
||||
|
||||
exports.init = init;
|
||||
exports.create = create;
|
6922
server/web3service/package-lock.json
generated
Normal file
6922
server/web3service/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
16
server/web3service/package.json
Normal file
16
server/web3service/package.json
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "web3sign",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"private": true,
|
||||
"scripts": {},
|
||||
"dependencies": {
|
||||
"j7": "file:../../third_party/j7",
|
||||
"common": "file:../common",
|
||||
"@metamask/eth-sig-util": "^4.0.0",
|
||||
"express": "^4.17.2",
|
||||
"log4js": "~6.3.0",
|
||||
"mysql": "~2.18.1",
|
||||
"web3": "^1.6.1"
|
||||
}
|
||||
}
|
17
server/web3service/services/baseservice.js
Normal file
17
server/web3service/services/baseservice.js
Normal file
@ -0,0 +1,17 @@
|
||||
class BaseService {
|
||||
|
||||
constructor(session) {
|
||||
this.session = session;
|
||||
}
|
||||
|
||||
getSession() {
|
||||
return this.session;
|
||||
}
|
||||
|
||||
getUser() {
|
||||
return this.session.user;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = BaseService;
|
33
server/web3service/services/factory.js
Normal file
33
server/web3service/services/factory.js
Normal file
@ -0,0 +1,33 @@
|
||||
const services = {};
|
||||
|
||||
async function internalAdd(clsName, modName, isSingle) {
|
||||
const modClass = require('./' + modName);
|
||||
services[clsName] = {
|
||||
'clsName': clsName,
|
||||
'modName': modName,
|
||||
'class': modClass,
|
||||
'isSingle': isSingle
|
||||
};
|
||||
if (modClass.staticInit) {
|
||||
await modClass.staticInit();
|
||||
}
|
||||
}
|
||||
|
||||
async function add(clsName, modName) {
|
||||
await internalAdd(clsName, modName, false);
|
||||
}
|
||||
|
||||
async function addSingle(clsName, modName) {
|
||||
await internalAdd(clsName, modName, true);
|
||||
}
|
||||
|
||||
async function init() {
|
||||
}
|
||||
|
||||
function create(name, session = null) {
|
||||
const service = services[name];
|
||||
return new service['class'](session);
|
||||
}
|
||||
|
||||
exports.init = init;
|
||||
exports.create = create;
|
130
server/web3service/session.js
Normal file
130
server/web3service/session.js
Normal file
@ -0,0 +1,130 @@
|
||||
const utils = require('j7/utils');
|
||||
const app = require('j7/app');
|
||||
const error = require('j7/error');
|
||||
const modelsFactory = require('./models/factory');
|
||||
const serviceFactory = require('./services/factory');
|
||||
const metaFactory = require('./metadata/factory');
|
||||
|
||||
class Session {
|
||||
|
||||
constructor(req, rsp) {
|
||||
this.req = req;
|
||||
this.rsp = rsp;
|
||||
this.nowTime = utils.getUtcTime();
|
||||
this.useConns = {};
|
||||
}
|
||||
|
||||
async destory() {
|
||||
if (this.user) {
|
||||
await this.user.destory();
|
||||
}
|
||||
for (let key in this.useConns) {
|
||||
this.useConns[key].release();
|
||||
}
|
||||
//console.log(new Error().stack);
|
||||
this.useConns = null;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
throwError(errCode, errMsg) {
|
||||
throw new error.InternalError(errCode, errMsg);
|
||||
}
|
||||
|
||||
request(name, defVal = null) {
|
||||
return name in this.req.query ? this.req.query[name] : defVal;
|
||||
}
|
||||
|
||||
requestToJson() {
|
||||
return utils.jsonEncode(this.req.query);
|
||||
}
|
||||
|
||||
async getBcEventDb() {
|
||||
const idx = 0;
|
||||
const dbKey = 'BcEventDb' + idx;
|
||||
if (this.useConns[dbKey]) {
|
||||
return this.useConns[dbKey];
|
||||
}
|
||||
const {err, conn} = await app.getDbConn(dbKey);
|
||||
if (err) {
|
||||
console.log(err);
|
||||
}
|
||||
//console.log(new Error().stack);
|
||||
if (!err && conn) {
|
||||
this.useConns[dbKey] = conn;
|
||||
}
|
||||
return conn;
|
||||
}
|
||||
|
||||
createModel(name) {
|
||||
return modelsFactory.create(name, this);
|
||||
}
|
||||
|
||||
createService(name) {
|
||||
return serviceFactory.create(name, this);
|
||||
}
|
||||
|
||||
getMeta(name, key) {
|
||||
return metaFactory.getMetaByKey(name, key);
|
||||
}
|
||||
|
||||
callMetaStatic(name, method, ...args) {
|
||||
return metaFactory.callMetaStatic(name, method, this, ...args);
|
||||
}
|
||||
|
||||
traverseMetaList(name, cb) {
|
||||
return metaFactory.traverseMetaList(name, cb);
|
||||
}
|
||||
|
||||
callMetaFactory(name, ...args) {
|
||||
return metaFactory[name](this, ...args);
|
||||
}
|
||||
|
||||
async bcEventConn(method, ...args) {
|
||||
const conn = await this.getBcEventDb();
|
||||
const ret = await conn[method](...args);
|
||||
if (ret.err){
|
||||
this.throwError(500, 'internal error');
|
||||
log.error(ret.err);
|
||||
return null;
|
||||
}
|
||||
if (utils.hasKey(ret, 'row')) {
|
||||
return ret['row'];
|
||||
} else if (utils.hasKey(ret, 'lastId')) {
|
||||
return ret['lastId'];
|
||||
} else if (utils.hasKey(ret, 'rows')) {
|
||||
return ret['rows'];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = Session;
|
41
server/web3service/user.js
Normal file
41
server/web3service/user.js
Normal file
@ -0,0 +1,41 @@
|
||||
const utils = require('j7/utils');
|
||||
const app = require('j7/app');
|
||||
const db = require('j7/db');
|
||||
const log = require('j7/log');
|
||||
|
||||
class User {
|
||||
|
||||
constructor(session) {
|
||||
this.session = session;
|
||||
this.accountId = session.request('account_id');
|
||||
this.sessionId = session.request('session_id');
|
||||
this.useConns = {};
|
||||
this.selfDb = null;
|
||||
}
|
||||
|
||||
async destory() {
|
||||
for (let key in this.useConns) {
|
||||
this.useConns[key].release();
|
||||
}
|
||||
this.useConns = null;
|
||||
}
|
||||
|
||||
getAccountId() {
|
||||
return this.accountId;
|
||||
}
|
||||
|
||||
getChannel() {
|
||||
return utils.extractChannel(this.getAccountId());
|
||||
}
|
||||
|
||||
getSessionId() {
|
||||
return this.sessionId;
|
||||
}
|
||||
|
||||
getRegisterTime() {
|
||||
return utils.extractRegisterTime(this.getAccountId(), this.getSessionId());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
exports.User = User;
|
Loading…
x
Reference in New Issue
Block a user