cgserver 6.0.7 → 6.1.0
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.
- package/dist/lib/AI/AiObject.js +10 -0
- package/dist/lib/AI/Astar.js +133 -0
- package/dist/lib/AI/BehaviorAI.js +307 -0
- package/dist/lib/AI/Entity.js +33 -0
- package/dist/lib/AI/Point.js +68 -0
- package/dist/lib/AI/TriggerMgr.js +201 -0
- package/dist/lib/Config/Config.js +37 -0
- package/dist/lib/Config/FrameworkConfig.js +234 -0
- package/dist/lib/Config/ServerConfig.js +18 -0
- package/dist/lib/Config/_error_.js +35 -0
- package/dist/lib/Core/Core.js +561 -0
- package/dist/lib/Core/Timer.js +116 -0
- package/dist/lib/Database/BaseMongoService.js +79 -0
- package/dist/lib/Database/BaseService.js +281 -0
- package/dist/lib/Database/Decorator/AutoIncrement.js +11 -0
- package/dist/lib/Database/Decorator/DBCache.js +64 -0
- package/dist/lib/Database/Decorator/NotNull.js +11 -0
- package/dist/lib/Database/Decorator/PrimaryKey.js +11 -0
- package/dist/lib/Database/Decorator/Property.js +61 -0
- package/dist/lib/Database/Decorator/Table.js +15 -0
- package/dist/lib/Database/Decorator/Type.js +20 -0
- package/dist/lib/Database/MSSqlManager.js +43 -0
- package/dist/lib/Database/MongoManager.js +401 -0
- package/dist/lib/Database/MysqlManager.js +180 -0
- package/dist/lib/Database/RedisManager.js +408 -0
- package/dist/lib/Logic/CacheTool.js +73 -0
- package/dist/lib/Logic/HttpTool.js +58 -0
- package/dist/lib/Logic/Log.js +77 -0
- package/dist/lib/Service/AccountService.js +473 -0
- package/dist/lib/Service/MongoAccountService.js +396 -0
- package/dist/lib/Service/MongoCacheService.js +27 -0
- package/dist/lib/Service/MongoUserService.js +93 -0
- package/dist/lib/Service/UserService.js +184 -0
- package/dist/lib/Service/ini.js +35 -0
- package/dist/lib/SocketServer/IClientWebSocket.js +71 -0
- package/dist/lib/SocketServer/IServerWebSocket.js +41 -0
- package/dist/lib/SocketServer/ISocketServer.js +190 -0
- package/dist/lib/SocketServer/IWebSocket.js +223 -0
- package/dist/lib/SocketServer/ProtoFilter/GoogleProtoFilter.js +57 -0
- package/dist/lib/SocketServer/ProtoFilter/IProtoFilter.js +8 -0
- package/dist/lib/SocketServer/ProtoFilter/JsonProtoFilter.js +29 -0
- package/dist/lib/SocketServer/ProtoFilter/ProtoFactory.js +31 -0
- package/dist/lib/ThirdParty/AlipayTool.js +122 -0
- package/dist/lib/ThirdParty/Alisms.js +46 -0
- package/dist/lib/ThirdParty/AppleTool.js +234 -0
- package/dist/lib/ThirdParty/EmailTool.js +33 -0
- package/dist/lib/ThirdParty/OpenSocial.js +32 -0
- package/dist/lib/ThirdParty/QQTool.js +115 -0
- package/dist/lib/ThirdParty/QiniuTool.js +21 -0
- package/dist/lib/ThirdParty/WechatOATool.js +61 -0
- package/dist/lib/ThirdParty/WechatTool.js +74 -0
- package/dist/lib/WebServer/Controller/BaseController.js +112 -0
- package/dist/lib/WebServer/Controller/BaseUserController.js +168 -0
- package/dist/lib/WebServer/Controller/MongoBaseUserController.js +168 -0
- package/dist/lib/WebServer/Decorator/AdminValidate.js +19 -0
- package/dist/lib/WebServer/Decorator/AuthorityValidate.js +22 -0
- package/dist/lib/WebServer/Decorator/CreatorValidate.js +19 -0
- package/dist/lib/WebServer/Decorator/JsonAdminValidate.js +15 -0
- package/dist/lib/WebServer/Decorator/JsonAuthorityValidate.js +20 -0
- package/dist/lib/WebServer/Decorator/JsonCreatorValidate.js +19 -0
- package/dist/lib/WebServer/Engine/ControllerManager.js +112 -0
- package/dist/lib/WebServer/Engine/Engine.js +135 -0
- package/dist/lib/WebServer/Engine/RazorJs.js +544 -0
- package/dist/lib/WebServer/Engine/Request.js +214 -0
- package/dist/lib/WebServer/Engine/Response.js +94 -0
- package/dist/lib/WebServer/IWebServer.js +49 -0
- package/dist/lib/cgserver.js +153 -0
- package/dist/{AI → types/AI}/AiObject.d.ts +0 -0
- package/dist/{AI → types/AI}/Astar.d.ts +0 -0
- package/dist/{AI → types/AI}/BehaviorAI.d.ts +0 -0
- package/dist/{AI → types/AI}/Entity.d.ts +0 -0
- package/dist/{AI → types/AI}/Point.d.ts +0 -0
- package/dist/{AI → types/AI}/TriggerMgr.d.ts +0 -0
- package/dist/{Config → types/Config}/Config.d.ts +0 -0
- package/dist/{Config → types/Config}/FrameworkConfig.d.ts +0 -0
- package/dist/{Config → types/Config}/ServerConfig.d.ts +0 -0
- package/dist/{Config → types/Config}/_error_.d.ts +0 -0
- package/dist/{Core → types/Core}/Core.d.ts +0 -0
- package/dist/{Core → types/Core}/Timer.d.ts +0 -0
- package/dist/{Database → types/Database}/BaseMongoService.d.ts +1 -1
- package/dist/{Database → types/Database}/BaseService.d.ts +0 -0
- package/dist/{Database → types/Database}/Decorator/AutoIncrement.d.ts +0 -0
- package/dist/{Database → types/Database}/Decorator/DBCache.d.ts +0 -0
- package/dist/{Database → types/Database}/Decorator/NotNull.d.ts +0 -0
- package/dist/{Database → types/Database}/Decorator/PrimaryKey.d.ts +0 -0
- package/dist/{Database → types/Database}/Decorator/Property.d.ts +0 -0
- package/dist/{Database → types/Database}/Decorator/Table.d.ts +0 -0
- package/dist/{Database → types/Database}/Decorator/Type.d.ts +0 -0
- package/dist/{Database → types/Database}/MSSqlManager.d.ts +0 -0
- package/dist/{Database → types/Database}/MongoManager.d.ts +1 -1
- package/dist/{Database → types/Database}/MysqlManager.d.ts +0 -0
- package/dist/{Database → types/Database}/RedisManager.d.ts +0 -0
- package/dist/{Logic → types/Logic}/CacheTool.d.ts +0 -0
- package/dist/{Logic → types/Logic}/HttpTool.d.ts +0 -0
- package/dist/{Logic → types/Logic}/Log.d.ts +0 -0
- package/dist/{Service → types/Service}/AccountService.d.ts +0 -0
- package/dist/{Service → types/Service}/MongoAccountService.d.ts +0 -0
- package/dist/{Service → types/Service}/MongoCacheService.d.ts +0 -0
- package/dist/{Service → types/Service}/MongoUserService.d.ts +0 -0
- package/dist/{Service → types/Service}/UserService.d.ts +0 -0
- package/dist/{Service → types/Service}/ini.d.ts +0 -0
- package/dist/{SocketServer → types/SocketServer}/IClientWebSocket.d.ts +0 -0
- package/dist/{SocketServer → types/SocketServer}/IServerWebSocket.d.ts +0 -0
- package/dist/{SocketServer → types/SocketServer}/ISocketServer.d.ts +0 -0
- package/dist/{SocketServer → types/SocketServer}/IWebSocket.d.ts +0 -0
- package/dist/{SocketServer → types/SocketServer}/ProtoFilter/GoogleProtoFilter.d.ts +0 -0
- package/dist/{SocketServer → types/SocketServer}/ProtoFilter/IProtoFilter.d.ts +0 -0
- package/dist/{SocketServer → types/SocketServer}/ProtoFilter/JsonProtoFilter.d.ts +0 -0
- package/dist/{SocketServer → types/SocketServer}/ProtoFilter/ProtoFactory.d.ts +0 -0
- package/dist/{ThirdParty → types/ThirdParty}/AlipayTool.d.ts +0 -0
- package/dist/{ThirdParty → types/ThirdParty}/Alisms.d.ts +0 -0
- package/dist/{ThirdParty → types/ThirdParty}/AppleTool.d.ts +0 -0
- package/dist/{ThirdParty → types/ThirdParty}/EmailTool.d.ts +0 -0
- package/dist/{ThirdParty → types/ThirdParty}/OpenSocial.d.ts +0 -0
- package/dist/{ThirdParty → types/ThirdParty}/QQTool.d.ts +0 -0
- package/dist/{ThirdParty → types/ThirdParty}/QiniuTool.d.ts +0 -0
- package/dist/{ThirdParty → types/ThirdParty}/WechatOATool.d.ts +0 -0
- package/dist/{ThirdParty → types/ThirdParty}/WechatTool.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Controller/BaseController.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Controller/BaseUserController.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Controller/MongoBaseUserController.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Decorator/AdminValidate.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Decorator/AuthorityValidate.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Decorator/CreatorValidate.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Decorator/JsonAdminValidate.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Decorator/JsonAuthorityValidate.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Decorator/JsonCreatorValidate.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Engine/ControllerManager.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Engine/Engine.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Engine/RazorJs.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Engine/Request.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/Engine/Response.d.ts +0 -0
- package/dist/{WebServer → types/WebServer}/IWebServer.d.ts +0 -0
- package/dist/{cgserver.d.ts → types/cgserver.d.ts} +0 -0
- package/package.json +3 -3
- package/dist/Index.d.ts +0 -73
- package/dist/cgserver.js +0 -1037
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GCtrMgr = void 0;
|
|
4
|
+
exports.GCtrMgr = null;
|
|
5
|
+
class ControllerManager {
|
|
6
|
+
_ctrs = new Map();
|
|
7
|
+
_ctr_cls = new Map();
|
|
8
|
+
//module ctrname lower normal
|
|
9
|
+
_cache_action_names = new Map();
|
|
10
|
+
registerController(module_name, ctr_name, cls) {
|
|
11
|
+
module_name = module_name.toLowerCase();
|
|
12
|
+
ctr_name = ctr_name.toLowerCase();
|
|
13
|
+
if (module_name == ctr_name) {
|
|
14
|
+
throw ("模块名称不能和控制器名称相同:" + module_name);
|
|
15
|
+
}
|
|
16
|
+
this._ctr_cls[module_name] = this._ctr_cls[module_name] || {};
|
|
17
|
+
this._ctr_cls[module_name][ctr_name] = cls;
|
|
18
|
+
this._cacheActionName(module_name, ctr_name, cls);
|
|
19
|
+
}
|
|
20
|
+
_cacheActionName(module_name, ctr_name, cls) {
|
|
21
|
+
module_name = module_name.toLowerCase();
|
|
22
|
+
ctr_name = ctr_name.toLowerCase();
|
|
23
|
+
//不能通过cls.name来获取ctr名称,因为混淆之后类名会变化
|
|
24
|
+
let prototype = cls.prototype;
|
|
25
|
+
let map_names = new Map();
|
|
26
|
+
while (prototype && prototype.constructor.name != "BaseController") {
|
|
27
|
+
let names = Object.getOwnPropertyNames(prototype);
|
|
28
|
+
for (let action_name of names) {
|
|
29
|
+
if (action_name.indexOf("on") != 0
|
|
30
|
+
&& action_name.indexOf("show") != 0) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (map_names[action_name.toLowerCase()]) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
map_names[action_name.toLowerCase()] = action_name;
|
|
37
|
+
}
|
|
38
|
+
prototype = Object.getPrototypeOf(prototype);
|
|
39
|
+
}
|
|
40
|
+
this._cache_action_names[module_name] = this._cache_action_names[module_name] || {};
|
|
41
|
+
this._cache_action_names[module_name][ctr_name] = map_names;
|
|
42
|
+
}
|
|
43
|
+
getActionName(module_name, ctr_name, action_name) {
|
|
44
|
+
module_name = module_name.toLowerCase();
|
|
45
|
+
ctr_name = ctr_name.toLowerCase();
|
|
46
|
+
action_name = action_name.toLowerCase();
|
|
47
|
+
if (!this._cache_action_names[module_name]) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
if (!this._cache_action_names[module_name][ctr_name]) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return this._cache_action_names[module_name][ctr_name][action_name];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 静态ctr,这样,ctr就不会被多次创建
|
|
57
|
+
* @param module_name
|
|
58
|
+
* @param ctr_name
|
|
59
|
+
* @param obj
|
|
60
|
+
*/
|
|
61
|
+
registerStaticController(module_name, ctr_name, obj) {
|
|
62
|
+
module_name = module_name.toLowerCase();
|
|
63
|
+
ctr_name = ctr_name.toLowerCase();
|
|
64
|
+
this._ctrs[module_name] = this._ctrs[module_name] || {};
|
|
65
|
+
this._ctrs[module_name][ctr_name] = obj;
|
|
66
|
+
this._cacheActionNameForStatic(module_name, ctr_name, obj);
|
|
67
|
+
}
|
|
68
|
+
_cacheActionNameForStatic(module_name, ctr_name, obj) {
|
|
69
|
+
module_name = module_name.toLowerCase();
|
|
70
|
+
ctr_name = ctr_name.toLowerCase();
|
|
71
|
+
let prototype = Object.getPrototypeOf(obj);
|
|
72
|
+
let map_names = new Map();
|
|
73
|
+
while (prototype && prototype.constructor.name != "BaseController") {
|
|
74
|
+
let names = Object.getOwnPropertyNames(prototype);
|
|
75
|
+
for (let func_name of names) {
|
|
76
|
+
let low_name = func_name.toLowerCase();
|
|
77
|
+
if (!map_names[low_name]) //有可能遭遇重载
|
|
78
|
+
{
|
|
79
|
+
map_names[low_name] = func_name;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
prototype = Object.getPrototypeOf(prototype);
|
|
83
|
+
}
|
|
84
|
+
this._cache_action_names[module_name] = this._cache_action_names[module_name] || {};
|
|
85
|
+
this._cache_action_names[module_name][ctr_name] = map_names;
|
|
86
|
+
}
|
|
87
|
+
getStaticCtr(module_name, controller_name) {
|
|
88
|
+
if (module_name) {
|
|
89
|
+
module_name = module_name.toLowerCase();
|
|
90
|
+
}
|
|
91
|
+
if (controller_name) {
|
|
92
|
+
controller_name = controller_name.toLowerCase();
|
|
93
|
+
}
|
|
94
|
+
if (!this._ctrs[module_name]) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
return this._ctrs[module_name][controller_name];
|
|
98
|
+
}
|
|
99
|
+
getClass(module_name, controller_name) {
|
|
100
|
+
if (module_name) {
|
|
101
|
+
module_name = module_name.toLowerCase();
|
|
102
|
+
}
|
|
103
|
+
if (controller_name) {
|
|
104
|
+
controller_name = controller_name.toLowerCase();
|
|
105
|
+
}
|
|
106
|
+
if (!this._ctr_cls[module_name]) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
return this._ctr_cls[module_name][controller_name];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.GCtrMgr = new ControllerManager();
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Engine = void 0;
|
|
4
|
+
const Response_1 = require("./Response");
|
|
5
|
+
const Request_1 = require("./Request");
|
|
6
|
+
const ControllerManager_1 = require("./ControllerManager");
|
|
7
|
+
const http = require("http");
|
|
8
|
+
const Log_1 = require("../../Logic/Log");
|
|
9
|
+
const cors = require("cors");
|
|
10
|
+
const Express = require("express");
|
|
11
|
+
const bodyParser = require("body-parser");
|
|
12
|
+
const cookieParser = require("cookie-parser");
|
|
13
|
+
class Engine {
|
|
14
|
+
_app = Express();
|
|
15
|
+
_cfg = null;
|
|
16
|
+
get cfg() {
|
|
17
|
+
return this._cfg;
|
|
18
|
+
}
|
|
19
|
+
_server = null;
|
|
20
|
+
_razorJs = null;
|
|
21
|
+
_root_path = process.cwd();
|
|
22
|
+
constructor(cfg, razorJs) {
|
|
23
|
+
this._cfg = cfg;
|
|
24
|
+
this._razorJs = razorJs;
|
|
25
|
+
}
|
|
26
|
+
start() {
|
|
27
|
+
let port = this._cfg.port;
|
|
28
|
+
let https = require("https");
|
|
29
|
+
let fs = require("fs");
|
|
30
|
+
if (!port) {
|
|
31
|
+
Log_1.GLog.error(this._cfg);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
http.createServer(this._app).listen(port, () => {
|
|
35
|
+
Log_1.GLog.info("Server(" + this._cfg.web_name + ") running at http://127.0.0.1:" + port + "/", true);
|
|
36
|
+
});
|
|
37
|
+
if (this._cfg.ssl) {
|
|
38
|
+
const httpsOption = {
|
|
39
|
+
key: fs.readFileSync(this._cfg.ssl.key),
|
|
40
|
+
cert: fs.readFileSync(this._cfg.ssl.crt)
|
|
41
|
+
};
|
|
42
|
+
https.createServer(httpsOption, this._app).listen(port + 1);
|
|
43
|
+
Log_1.GLog.info("Server(" + this._cfg.web_name + ") running at https://127.0.0.1:" + (port + 1) + "/", true);
|
|
44
|
+
}
|
|
45
|
+
this._app.use(cookieParser());
|
|
46
|
+
this._app.use(bodyParser.json({ limit: '10mb' }));
|
|
47
|
+
this._app.use(bodyParser.urlencoded({ limit: '10mb', extended: true }));
|
|
48
|
+
//处理跨域
|
|
49
|
+
if (this._cfg.cors) {
|
|
50
|
+
let origin = this._cfg.cors.origin || "*";
|
|
51
|
+
if (this._cfg.cors.credentials == true && origin == "*") {
|
|
52
|
+
origin = (origin, callback) => {
|
|
53
|
+
callback(null, true);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
this._app.use(cors({
|
|
57
|
+
origin: origin,
|
|
58
|
+
methods: this._cfg.cors.methods || 'GET,HEAD,PUT,PATCH,POST,DELETE',
|
|
59
|
+
allowedHeaders: this._cfg.cors.allowedHeaders || ['Content-Type'],
|
|
60
|
+
credentials: this._cfg.cors.credentials || false
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
this._app.all("/*", this._all.bind(this));
|
|
64
|
+
}
|
|
65
|
+
async _all(_req, _res) {
|
|
66
|
+
let req = new Request_1.Request(_req, this._cfg);
|
|
67
|
+
let res = new Response_1.Response(_res, this._cfg);
|
|
68
|
+
if (req.fileUrl) {
|
|
69
|
+
res.renderFile(this._root_path + req.fileUrl);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
let method = req.method.toLowerCase();
|
|
73
|
+
if (method != "get" && method != "post") {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
let pre_action = "show";
|
|
77
|
+
let action_name = "";
|
|
78
|
+
if (method == "post") {
|
|
79
|
+
pre_action = "on";
|
|
80
|
+
}
|
|
81
|
+
//大小写还原
|
|
82
|
+
action_name = ControllerManager_1.GCtrMgr.getActionName(req.module, req.controller, pre_action + req.action);
|
|
83
|
+
//尝试一次on,变态支持
|
|
84
|
+
if (!action_name && method == "get") {
|
|
85
|
+
pre_action = "on";
|
|
86
|
+
action_name = ControllerManager_1.GCtrMgr.getActionName(req.module, req.controller, pre_action + req.action);
|
|
87
|
+
}
|
|
88
|
+
if (!action_name) {
|
|
89
|
+
if (method == "get") {
|
|
90
|
+
res.render404();
|
|
91
|
+
}
|
|
92
|
+
else if (method == "post") {
|
|
93
|
+
res.renderJson404();
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
let ctr = ControllerManager_1.GCtrMgr.getStaticCtr(req.module, req.controller);
|
|
98
|
+
let cls_ctr = null;
|
|
99
|
+
if (!ctr) {
|
|
100
|
+
cls_ctr = ControllerManager_1.GCtrMgr.getClass(req.module, req.controller);
|
|
101
|
+
}
|
|
102
|
+
if (!ctr) {
|
|
103
|
+
ctr = new cls_ctr(req, res, this);
|
|
104
|
+
await ctr.init();
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
ctr.initStatic(req, res, this);
|
|
108
|
+
}
|
|
109
|
+
ctr[action_name].call(ctr);
|
|
110
|
+
}
|
|
111
|
+
stop() {
|
|
112
|
+
}
|
|
113
|
+
getRenderHtml(req, res, datas) {
|
|
114
|
+
let tmpl = "view/" + req.controller.toLowerCase() + "/" + req.action.toLowerCase();
|
|
115
|
+
//if(!this._cfg.routs.onlyModule)
|
|
116
|
+
{
|
|
117
|
+
tmpl = "modules/" + req.module.toLowerCase() + "/" + tmpl;
|
|
118
|
+
}
|
|
119
|
+
let html = this._getRenderHtml(req, res, tmpl, datas);
|
|
120
|
+
return html;
|
|
121
|
+
}
|
|
122
|
+
_getRenderHtml(req, res, tmpl, params) {
|
|
123
|
+
let html = null;
|
|
124
|
+
try {
|
|
125
|
+
html = this._razorJs.render(req, res, tmpl, params, { compileDebug: true });
|
|
126
|
+
html = html.replace(/\"~/g, "\"" + req.root);
|
|
127
|
+
html = html.replace(/\'~/g, "\'" + req.root);
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
html = "error!" + e;
|
|
131
|
+
}
|
|
132
|
+
return html;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.Engine = Engine;
|