ee-core 1.2.8-beta.4 → 1.2.9-bate.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +2 -2
  3. package/bin/tools.js +22 -22
  4. package/config/config.default.js +255 -250
  5. package/core/index.js +12 -12
  6. package/core/lib/ee.js +209 -209
  7. package/core/lib/loader/context_loader.js +105 -105
  8. package/core/lib/loader/ee_loader.js +451 -451
  9. package/core/lib/loader/file_loader.js +262 -262
  10. package/core/lib/loader/mixin/config.js +138 -138
  11. package/core/lib/loader/mixin/controller.js +123 -123
  12. package/core/lib/loader/mixin/service.js +29 -29
  13. package/core/lib/utils/base_context_class.js +34 -34
  14. package/core/lib/utils/index.js +100 -100
  15. package/core/lib/utils/sequencify.js +59 -59
  16. package/core/lib/utils/timing.js +77 -77
  17. package/index.js +49 -49
  18. package/lib/appLoader.js +45 -45
  19. package/lib/application.js +79 -80
  20. package/lib/baseApp.js +118 -118
  21. package/lib/constant.js +28 -28
  22. package/lib/eeApp.js +326 -326
  23. package/lib/helper.js +51 -51
  24. package/lib/httpclient.js +136 -136
  25. package/lib/logger.js +46 -46
  26. package/lib/socket/httpServer.js +134 -102
  27. package/lib/socket/io.js +23 -23
  28. package/lib/socket/ipcServer.js +128 -128
  29. package/lib/socket/socketClient.js +50 -50
  30. package/lib/socket/socketServer.js +76 -76
  31. package/lib/socket/start.js +22 -22
  32. package/lib/storage/index.js +33 -33
  33. package/lib/storage/lowdbStorage.js +98 -98
  34. package/lib/storage/sqliteStorage.js +58 -58
  35. package/package.json +45 -45
  36. package/tools/codeCompress.js +204 -204
  37. package/tools/replaceDist.js +76 -76
  38. package/utils/common.js +90 -90
  39. package/utils/index.js +207 -207
  40. package/utils/wrap.js +37 -37
  41. package/resource/images/loding.gif +0 -0
  42. package/resource/images/tray_logo.png +0 -0
  43. package/resource/loading.html +0 -22
  44. package/resource/view_example.html +0 -22
@@ -1,103 +1,135 @@
1
- 'use strict';
2
-
3
- const assert = require('assert');
4
- const is = require('is-type-of');
5
- const Koa = require('koa');
6
- const cors = require('koa2-cors');
7
- const koaBody = require('koa-body');
8
-
9
- /**
10
- * http server
11
- */
12
- class HttpServer {
13
- constructor (app) {
14
- this.app = app;
15
- this.options = this.app.config.httpServer;
16
-
17
- if (!this.options.enable) {
18
- return;
19
- }
20
-
21
- let port = process.env.EE_HTTP_PORT ? parseInt(process.env.EE_HTTP_PORT) : parseInt(this.getHttpPort());
22
- assert(typeof port === 'number', 'http port required, and must be a number');
23
-
24
- this.create();
25
- }
26
-
27
- /**
28
- * 创建服务
29
- */
30
- create () {
31
- const self = this;
32
- const httpServer = this.options;
33
- const url = httpServer.protocol + httpServer.host + ':' + httpServer.port;
34
- const corsOptions = httpServer.cors;
35
-
36
- const koaApp = new Koa();
37
- koaApp
38
- .use(cors(corsOptions))
39
- .use(koaBody(httpServer.body))
40
- .use(async (ctx, next) => {
41
- ctx.eeApp = self.app;
42
- await next();
43
- })
44
- .use(this.dispatch);
45
-
46
- koaApp.listen(httpServer.port, () => {
47
- self.app.coreLogger.info('[ee-core:http:server] http server is:', url);
48
- });
49
- }
50
-
51
- /**
52
- * 路由分发
53
- */
54
- async dispatch (ctx, next) {
55
- let uriPath = ctx.request.path;
56
- const method = ctx.request.method;
57
- let params = ctx.request.query;
58
- params = is.object(params) ? JSON.parse(JSON.stringify(params)) : {};
59
- const body = ctx.request.body;
60
- // 添加到全局属性
61
- ctx.eeApp.request = ctx.request;
62
- ctx.eeApp.response = ctx.response;
63
-
64
- try {
65
- // 找函数
66
- if (uriPath.indexOf('/') !== -1) {
67
- uriPath = uriPath.substring(1);
68
- }
69
- const cmd = uriPath.split('/').join('.');
70
- const args = (method == 'POST') ? body : params;
71
- let fn = null;
72
- if (is.string(cmd)) {
73
- const actions = cmd.split('.');
74
- let obj = ctx.eeApp;
75
- actions.forEach(key => {
76
- obj = obj[key];
77
- if (!obj) throw new Error(`class or function '${key}' not exists`);
78
- });
79
- fn = obj;
80
- }
81
- if (!fn) throw new Error('function not exists');
82
-
83
- const result = await fn.call(ctx.eeApp, args);
84
- ctx.response.status = 200;
85
- ctx.response.body = result;
86
- } catch (err) {
87
- ctx.eeApp.console.error('[ee-core:http:server] throw error:', err);
88
- }
89
-
90
- await next();
91
- }
92
-
93
- /**
94
- * 获取http端口
95
- */
96
- getHttpPort () {
97
- const cdb = this.getCoreDB();
98
- const port = cdb.getItem('config').httpServer.port;
99
- return parseInt(port);
100
- }
101
- }
102
-
1
+ 'use strict';
2
+
3
+ const assert = require('assert');
4
+ const is = require('is-type-of');
5
+ const Koa = require('koa');
6
+ const cors = require('koa2-cors');
7
+ const koaBody = require('koa-body');
8
+ const https = require('https');
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+
12
+ /**
13
+ * http server
14
+ */
15
+ class HttpServer {
16
+ constructor (app) {
17
+ this.app = app;
18
+ this.options = this.app.config.httpServer;
19
+
20
+ if (!this.options.enable) {
21
+ return;
22
+ }
23
+
24
+ let port = process.env.EE_HTTP_PORT ? parseInt(process.env.EE_HTTP_PORT) : parseInt(this.getHttpPort());
25
+ assert(typeof port === 'number', 'http port required, and must be a number');
26
+
27
+ this.create();
28
+ }
29
+
30
+ /**
31
+ * 创建服务
32
+ */
33
+ create () {
34
+ const self = this;
35
+ const httpServer = this.options;
36
+ const isHttps = httpServer?.https?.enable ?? false;
37
+ let sslOptions = {};
38
+
39
+ if (isHttps === true) {
40
+ httpServer.protocol = 'https://';
41
+ const keyFile = path.join(this.app.config.homeDir, httpServer.https.key);
42
+ const certFile = path.join(this.app.config.homeDir, httpServer.https.cert);
43
+ assert(fs.existsSync(keyFile), 'ssl key file is required');
44
+ assert(fs.existsSync(certFile), 'ssl cert file is required');
45
+
46
+ sslOptions.key = fs.readFileSync(keyFile);
47
+ sslOptions.cert = fs.readFileSync(certFile);
48
+ }
49
+ const url = httpServer.protocol + httpServer.host + ':' + httpServer.port;
50
+ const corsOptions = httpServer.cors;
51
+
52
+ const koaApp = new Koa();
53
+ koaApp
54
+ .use(cors(corsOptions))
55
+ .use(koaBody(httpServer.body))
56
+ .use(async (ctx, next) => {
57
+ ctx.eeApp = self.app;
58
+ await next();
59
+ })
60
+ .use(this.dispatch);
61
+
62
+ let msg = '[ee-core:http:server] server is: ' + url;
63
+ if (isHttps) {
64
+ https.createServer(sslOptions, koaApp.callback()).listen(httpServer.port, (err) => {
65
+ msg = err ? err : msg;
66
+ self.app.coreLogger.info(msg);
67
+ });
68
+ } else {
69
+ koaApp.listen(httpServer.port, (e) => {
70
+ msg = e ? e : msg;
71
+ self.app.coreLogger.info(msg);
72
+ });
73
+ }
74
+ }
75
+
76
+ /**
77
+ * 路由分发
78
+ */
79
+ async dispatch (ctx, next) {
80
+ let uriPath = ctx.request.path;
81
+ const method = ctx.request.method;
82
+ let params = ctx.request.query;
83
+ params = is.object(params) ? JSON.parse(JSON.stringify(params)) : {};
84
+ const body = ctx.request.body;
85
+
86
+ // 默认
87
+ ctx.response.status = 200;
88
+
89
+ // 添加到全局属性
90
+ ctx.eeApp.request = ctx.request;
91
+ ctx.eeApp.response = ctx.response;
92
+
93
+ try {
94
+ // 找函数
95
+ // 去除开头的 '/'
96
+ if (uriPath.indexOf('/') == 0) {
97
+ uriPath = uriPath.substring(1);
98
+ }
99
+ if (uriPath.slice(0, 10) != 'controller') {
100
+ uriPath = 'controller/' + uriPath;
101
+ }
102
+ const cmd = uriPath.split('/').join('.');
103
+ const args = (method == 'POST') ? body : params;
104
+ let fn = null;
105
+ if (is.string(cmd)) {
106
+ const actions = cmd.split('.');
107
+ let obj = ctx.eeApp;
108
+ actions.forEach(key => {
109
+ obj = obj[key];
110
+ if (!obj) throw new Error(`class or function '${key}' not exists`);
111
+ });
112
+ fn = obj;
113
+ }
114
+ if (!fn) throw new Error('function not exists');
115
+
116
+ const result = await fn.call(ctx.eeApp, args);
117
+ ctx.response.body = result;
118
+ } catch (err) {
119
+ ctx.eeApp.console.error('[ee-core:http:server] throw error:', err);
120
+ }
121
+
122
+ await next();
123
+ }
124
+
125
+ /**
126
+ * 获取http端口
127
+ */
128
+ getHttpPort () {
129
+ const cdb = this.getCoreDB();
130
+ const port = cdb.getItem('config').httpServer.port;
131
+ return parseInt(port);
132
+ }
133
+ }
134
+
103
135
  module.exports = HttpServer;
package/lib/socket/io.js CHANGED
@@ -1,24 +1,24 @@
1
- 'use strict';
2
-
3
- const IoServer = require('socket.io');
4
- const IoClient = require('socket.io-client');
5
- //const socketServer = require('./socketServer');
6
- const socketClient = require('./socketClient');
7
- const Koa = require('koa');
8
-
9
- const EeSocket = {
10
- getServer: () => {
11
- //return socketServer.getInstance();
12
- },
13
- getClient: () => {
14
- return socketClient.getInstance();
15
- }
16
- }
17
-
18
-
19
- module.exports = {
20
- IoServer,
21
- IoClient,
22
- EeSocket,
23
- Koa
1
+ 'use strict';
2
+
3
+ const IoServer = require('socket.io');
4
+ const IoClient = require('socket.io-client');
5
+ //const socketServer = require('./socketServer');
6
+ const socketClient = require('./socketClient');
7
+ const Koa = require('koa');
8
+
9
+ const EeSocket = {
10
+ getServer: () => {
11
+ //return socketServer.getInstance();
12
+ },
13
+ getClient: () => {
14
+ return socketClient.getInstance();
15
+ }
16
+ }
17
+
18
+
19
+ module.exports = {
20
+ IoServer,
21
+ IoClient,
22
+ EeSocket,
23
+ Koa
24
24
  };
@@ -1,129 +1,129 @@
1
- 'use strict';
2
-
3
- const debug = require('debug')('ee-core:ipcServer');
4
- const EggConsoleLogger = require('egg-logger').EggConsoleLogger;
5
- const is = require('is-type-of');
6
- const { ipcMain } = require('electron');
7
- const path = require('path');
8
- const fs = require('fs');
9
- const globby = require('globby');
10
- const utils = require('../../core/lib/utils');
11
- const wrap = require('../../utils/wrap');
12
- const utility = require('utility');
13
-
14
- class IpcServer {
15
- constructor (app) {
16
-
17
- this.app = app;
18
- this.consoleLogger = new EggConsoleLogger();
19
- this.consoleLogger.info('[ee-core:socket:ipcMain] start ipcMain');
20
- this.register();
21
- }
22
-
23
- register () {
24
- this.consoleLogger.info('[ee-core:socket:ipcMain] register channels');
25
-
26
- const self = this;
27
- // 遍历方法
28
- const files = (process.env.EE_TYPESCRIPT === 'true' && utils.extensions['.ts'])
29
- ? [ '**/*.(js|ts)', '!**/*.d.ts' ]
30
- : [ '**/*.js' ];
31
- const directory = path.join(this.app.config.baseDir, 'controller');
32
- const filepaths = globby.sync(files, { cwd: directory });
33
- for (const filepath of filepaths) {
34
- const fullpath = path.join(directory, filepath);
35
- if (!fs.statSync(fullpath).isFile()) continue;
36
-
37
- const properties = wrap.getProperties(filepath, {caseStyle: 'lower'});
38
- const pathName = directory.split(/[/\\]/).slice(-1) + '.' + properties.join('.');
39
-
40
- let fileObj = utils.loadFile(fullpath);
41
- const fns = {};
42
- if (is.function(fileObj) && !is.generatorFunction(fileObj) && !is.class(fileObj) && !is.asyncFunction(fileObj)) {
43
- //obj = obj(this.app);
44
- }
45
- if (is.class(fileObj)) {
46
- let proto = fileObj.prototype;
47
- //while (proto !== Object.prototype) {
48
- const keys = Object.getOwnPropertyNames(proto);
49
- for (const key of keys) {
50
- if (key === 'constructor') {
51
- continue;
52
- }
53
- const d = Object.getOwnPropertyDescriptor(proto, key);
54
- if (is.function(d.value) && !fns.hasOwnProperty(key)) {
55
- fns[key] = 1;
56
- }
57
- }
58
- //proto = Object.getPrototypeOf(proto);
59
- //}
60
- }
61
- if (is.object(fileObj)) {
62
- const keys = Object.keys(fileObj);
63
- for (const key of keys) {
64
- if (is.function(fileObj[key])) {
65
- const names = utility.getParamNames(fileObj[key]);
66
- if (names[0] === 'next') {
67
- throw new Error(`controller \`${prefix || ''}${key}\` should not use next as argument from file ${path}`);
68
- }
69
- fns[key] = 1;
70
- }
71
- // else if (is.object(fileObj[key])) {
72
- // ret[key] = wrapObject(obj[key], path, `${prefix || ''}${key}.`);
73
- // }
74
- }
75
- }
76
- // if (is.generatorFunction(obj) || is.asyncFunction(obj)) {
77
- // }
78
-
79
- debug('register class %s fns %j', pathName, fns);
80
-
81
- for (const key in fns) {
82
- let channel = pathName + '.' + key;
83
- debug('register channel %s', channel);
84
-
85
- function findFn (app, c) {
86
- try {
87
- // 找函数
88
- const cmd = c;
89
- let fn = null;
90
- if (is.string(cmd)) {
91
- const actions = cmd.split('.');
92
- let obj = app;
93
- actions.forEach(key => {
94
- obj = obj[key];
95
- if (!obj) throw new Error(`class or function '${key}' not exists`);
96
- });
97
- fn = obj;
98
- }
99
- if (!fn) throw new Error('function not exists');
100
-
101
- return fn;
102
- } catch (err) {
103
- app.logger.error('[ee:socket:ipcMain] throw error:', err);
104
- }
105
- return null;
106
- }
107
-
108
- // send/on 模型
109
- ipcMain.on(channel, async (event, params) => {
110
- const fn = findFn(self.app, channel);
111
- const result = await fn.call(self.app, params, event);
112
-
113
- event.returnValue = result;
114
- event.reply(`${channel}`, result);
115
- });
116
-
117
- // invoke/handle 模型
118
- ipcMain.handle(channel, async (event, params) => {
119
- const fn = findFn(self.app, channel);
120
- const result = await fn.call(self.app, params, event);
121
-
122
- return result;
123
- });
124
- }
125
- }
126
- }
127
- }
128
-
1
+ 'use strict';
2
+
3
+ const debug = require('debug')('ee-core:ipcServer');
4
+ const EggConsoleLogger = require('egg-logger').EggConsoleLogger;
5
+ const is = require('is-type-of');
6
+ const { ipcMain } = require('electron');
7
+ const path = require('path');
8
+ const fs = require('fs');
9
+ const globby = require('globby');
10
+ const utils = require('../../core/lib/utils');
11
+ const wrap = require('../../utils/wrap');
12
+ const utility = require('utility');
13
+
14
+ class IpcServer {
15
+ constructor (app) {
16
+
17
+ this.app = app;
18
+ this.consoleLogger = new EggConsoleLogger();
19
+ this.consoleLogger.info('[ee-core:socket:ipcMain] start ipcMain');
20
+ this.register();
21
+ }
22
+
23
+ register () {
24
+ this.consoleLogger.info('[ee-core:socket:ipcMain] register channels');
25
+
26
+ const self = this;
27
+ // 遍历方法
28
+ const files = (process.env.EE_TYPESCRIPT === 'true' && utils.extensions['.ts'])
29
+ ? [ '**/*.(js|ts)', '!**/*.d.ts' ]
30
+ : [ '**/*.js' ];
31
+ const directory = path.join(this.app.config.baseDir, 'controller');
32
+ const filepaths = globby.sync(files, { cwd: directory });
33
+ for (const filepath of filepaths) {
34
+ const fullpath = path.join(directory, filepath);
35
+ if (!fs.statSync(fullpath).isFile()) continue;
36
+
37
+ const properties = wrap.getProperties(filepath, {caseStyle: 'lower'});
38
+ const pathName = directory.split(/[/\\]/).slice(-1) + '.' + properties.join('.');
39
+
40
+ let fileObj = utils.loadFile(fullpath);
41
+ const fns = {};
42
+ if (is.function(fileObj) && !is.generatorFunction(fileObj) && !is.class(fileObj) && !is.asyncFunction(fileObj)) {
43
+ //obj = obj(this.app);
44
+ }
45
+ if (is.class(fileObj)) {
46
+ let proto = fileObj.prototype;
47
+ //while (proto !== Object.prototype) {
48
+ const keys = Object.getOwnPropertyNames(proto);
49
+ for (const key of keys) {
50
+ if (key === 'constructor') {
51
+ continue;
52
+ }
53
+ const d = Object.getOwnPropertyDescriptor(proto, key);
54
+ if (is.function(d.value) && !fns.hasOwnProperty(key)) {
55
+ fns[key] = 1;
56
+ }
57
+ }
58
+ //proto = Object.getPrototypeOf(proto);
59
+ //}
60
+ }
61
+ if (is.object(fileObj)) {
62
+ const keys = Object.keys(fileObj);
63
+ for (const key of keys) {
64
+ if (is.function(fileObj[key])) {
65
+ const names = utility.getParamNames(fileObj[key]);
66
+ if (names[0] === 'next') {
67
+ throw new Error(`controller \`${prefix || ''}${key}\` should not use next as argument from file ${path}`);
68
+ }
69
+ fns[key] = 1;
70
+ }
71
+ // else if (is.object(fileObj[key])) {
72
+ // ret[key] = wrapObject(obj[key], path, `${prefix || ''}${key}.`);
73
+ // }
74
+ }
75
+ }
76
+ // if (is.generatorFunction(obj) || is.asyncFunction(obj)) {
77
+ // }
78
+
79
+ debug('register class %s fns %j', pathName, fns);
80
+
81
+ for (const key in fns) {
82
+ let channel = pathName + '.' + key;
83
+ debug('register channel %s', channel);
84
+
85
+ function findFn (app, c) {
86
+ try {
87
+ // 找函数
88
+ const cmd = c;
89
+ let fn = null;
90
+ if (is.string(cmd)) {
91
+ const actions = cmd.split('.');
92
+ let obj = app;
93
+ actions.forEach(key => {
94
+ obj = obj[key];
95
+ if (!obj) throw new Error(`class or function '${key}' not exists`);
96
+ });
97
+ fn = obj;
98
+ }
99
+ if (!fn) throw new Error('function not exists');
100
+
101
+ return fn;
102
+ } catch (err) {
103
+ app.logger.error('[ee:socket:ipcMain] throw error:', err);
104
+ }
105
+ return null;
106
+ }
107
+
108
+ // send/on 模型
109
+ ipcMain.on(channel, async (event, params) => {
110
+ const fn = findFn(self.app, channel);
111
+ const result = await fn.call(self.app, params, event);
112
+
113
+ event.returnValue = result;
114
+ event.reply(`${channel}`, result);
115
+ });
116
+
117
+ // invoke/handle 模型
118
+ ipcMain.handle(channel, async (event, params) => {
119
+ const fn = findFn(self.app, channel);
120
+ const result = await fn.call(self.app, params, event);
121
+
122
+ return result;
123
+ });
124
+ }
125
+ }
126
+ }
127
+ }
128
+
129
129
  module.exports = IpcServer;
@@ -1,51 +1,51 @@
1
- 'use strict';
2
-
3
- const assert = require('assert');
4
- const IoClient = require('socket.io-client');
5
- const constant = require('../constant');
6
- const EggConsoleLogger = require('egg-logger').EggConsoleLogger;
7
-
8
- class SocketClient {
9
- constructor (port) {
10
- this.consoleLogger = new EggConsoleLogger();
11
- port = port ? parseInt(port) : this.getSocketcPort();
12
-
13
- assert(typeof port === 'number', 'port required, and must be a number');
14
- this.consoleLogger.info('[ee-core:socket:client] start client');
15
-
16
- const url = 'http://127.0.0.1:' + port;
17
- this.consoleLogger.info('[ee-core:socket:client] url:', url);
18
- this.client = IoClient(url);
19
- }
20
-
21
- static getInstance (port) {
22
- if (typeof this.instance === 'object') {
23
- return this.instance;
24
- }
25
- this.instance = new SocketClient(port);
26
- return this.instance;
27
- }
28
-
29
- call (method = '', ...params) {
30
- return new Promise((resolve, reject) => {
31
- // 获取通信频道
32
- const channel = constant.socketIo.channel.partySoftware;
33
- this.client.emit(channel, { cmd: method, params: params }, (response) => {
34
- resolve(response);
35
- });
36
- });
37
- }
38
-
39
- getCoreDB () {
40
- const coreDB = require('../storage/index').JsonDB.connection('system');
41
- return coreDB;
42
- }
43
-
44
- getSocketcPort () {
45
- const cdb = this.getCoreDB();
46
- const port = cdb.getItem('config').socketServer.port;
47
- return parseInt(port);
48
- }
49
- }
50
-
1
+ 'use strict';
2
+
3
+ const assert = require('assert');
4
+ const IoClient = require('socket.io-client');
5
+ const constant = require('../constant');
6
+ const EggConsoleLogger = require('egg-logger').EggConsoleLogger;
7
+
8
+ class SocketClient {
9
+ constructor (port) {
10
+ this.consoleLogger = new EggConsoleLogger();
11
+ port = port ? parseInt(port) : this.getSocketcPort();
12
+
13
+ assert(typeof port === 'number', 'port required, and must be a number');
14
+ this.consoleLogger.info('[ee-core:socket:client] start client');
15
+
16
+ const url = 'http://127.0.0.1:' + port;
17
+ this.consoleLogger.info('[ee-core:socket:client] url:', url);
18
+ this.client = IoClient(url);
19
+ }
20
+
21
+ static getInstance (port) {
22
+ if (typeof this.instance === 'object') {
23
+ return this.instance;
24
+ }
25
+ this.instance = new SocketClient(port);
26
+ return this.instance;
27
+ }
28
+
29
+ call (method = '', ...params) {
30
+ return new Promise((resolve, reject) => {
31
+ // 获取通信频道
32
+ const channel = constant.socketIo.channel.partySoftware;
33
+ this.client.emit(channel, { cmd: method, params: params }, (response) => {
34
+ resolve(response);
35
+ });
36
+ });
37
+ }
38
+
39
+ getCoreDB () {
40
+ const coreDB = require('../storage/index').JsonDB.connection('system');
41
+ return coreDB;
42
+ }
43
+
44
+ getSocketcPort () {
45
+ const cdb = this.getCoreDB();
46
+ const port = cdb.getItem('config').socketServer.port;
47
+ return parseInt(port);
48
+ }
49
+ }
50
+
51
51
  module.exports = SocketClient;