@napp/dti-server 4.4.4 → 4.4.5
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/esm/action.d.ts +13 -0
- package/esm/action.js +15 -0
- package/esm/bundler.d.ts +14 -0
- package/esm/bundler.js +56 -0
- package/esm/common.d.ts +22 -0
- package/esm/common.js +1 -0
- package/esm/index.d.ts +4 -0
- package/esm/index.js +4 -0
- package/esm/route.d.ts +15 -0
- package/esm/route.js +107 -0
- package/esm/server.d.ts +17 -0
- package/esm/server.js +45 -0
- package/package.json +10 -2
package/esm/action.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DtiAction } from "@napp/dti-core";
|
|
2
|
+
import { IContext } from "./common";
|
|
3
|
+
export interface ODtiServerAction<RESULT, PARAM> {
|
|
4
|
+
action: (param: PARAM, ctx: IContext) => Promise<RESULT>;
|
|
5
|
+
}
|
|
6
|
+
export declare class DtiServerAction<RESULT, PARAM> {
|
|
7
|
+
meta: DtiAction<RESULT, PARAM>;
|
|
8
|
+
private opt;
|
|
9
|
+
private constructor();
|
|
10
|
+
action(param: PARAM, ctx: IContext): Promise<RESULT>;
|
|
11
|
+
validation(param: PARAM): void;
|
|
12
|
+
static factory<RESULT, PARAM>(meta: DtiAction<RESULT, PARAM>, opt: ODtiServerAction<RESULT, PARAM>): DtiServerAction<RESULT, PARAM>;
|
|
13
|
+
}
|
package/esm/action.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class DtiServerAction {
|
|
2
|
+
constructor(meta, opt) {
|
|
3
|
+
this.meta = meta;
|
|
4
|
+
this.opt = opt;
|
|
5
|
+
}
|
|
6
|
+
action(param, ctx) {
|
|
7
|
+
return this.opt.action(param, ctx);
|
|
8
|
+
}
|
|
9
|
+
validation(param) {
|
|
10
|
+
this.meta.validate(param);
|
|
11
|
+
}
|
|
12
|
+
static factory(meta, opt) {
|
|
13
|
+
return new DtiServerAction(meta, opt);
|
|
14
|
+
}
|
|
15
|
+
}
|
package/esm/bundler.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IContext, OSetupParam } from "./common";
|
|
2
|
+
import { DtiServer } from "./server";
|
|
3
|
+
interface IMeteParam {
|
|
4
|
+
name: string;
|
|
5
|
+
param: any;
|
|
6
|
+
}
|
|
7
|
+
export declare class BundlerServer {
|
|
8
|
+
private server;
|
|
9
|
+
private base62;
|
|
10
|
+
constructor(server: DtiServer);
|
|
11
|
+
action(meta: Array<IMeteParam>, ctx: IContext): Promise<any[]>;
|
|
12
|
+
setup(expressRoute: any, setuper: OSetupParam): void;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
package/esm/bundler.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Base62 } from "@napp/dti-core";
|
|
2
|
+
export class BundlerServer {
|
|
3
|
+
constructor(server) {
|
|
4
|
+
this.server = server;
|
|
5
|
+
this.base62 = new Base62();
|
|
6
|
+
}
|
|
7
|
+
async action(meta, ctx) {
|
|
8
|
+
let actions = [];
|
|
9
|
+
for (let it of meta) {
|
|
10
|
+
let action = this.server.getActionByName(it.name);
|
|
11
|
+
if (action) {
|
|
12
|
+
action.validation(it.param);
|
|
13
|
+
// console.log('call', it.name, it.param, await action?.action(it.param, ctx))
|
|
14
|
+
actions.push(async () => await action?.action(it.param, ctx));
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
throw new Error('not defined action. name=' + it.name);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return await Promise.all(actions.map(it => it()));
|
|
21
|
+
}
|
|
22
|
+
setup(expressRoute, setuper) {
|
|
23
|
+
if (setuper.factoryBodyparseJson) {
|
|
24
|
+
expressRoute.post('/__bundler_post__', setuper.factoryBodyparseJson(), async (req, res, next) => {
|
|
25
|
+
try {
|
|
26
|
+
let meta = req.body || [];
|
|
27
|
+
let result = await this.action(meta, { req, res });
|
|
28
|
+
res.json(result);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
next(error);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
expressRoute.get('/__bundler_get__', async (req, res, next) => {
|
|
35
|
+
try {
|
|
36
|
+
let p = req.query?.p;
|
|
37
|
+
if (p) {
|
|
38
|
+
let json = this.base62.decode(p);
|
|
39
|
+
let meta = JSON.parse(json);
|
|
40
|
+
let result = await this.action(meta, { req, res });
|
|
41
|
+
res.json(result);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
res.json([]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
next(error);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
throw new Error('not defined server.factoryBodyparseJson');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
package/esm/common.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DtiRoute } from "@napp/dti-core";
|
|
2
|
+
export interface IContext {
|
|
3
|
+
req: any;
|
|
4
|
+
res: any;
|
|
5
|
+
}
|
|
6
|
+
export interface IMiddleware {
|
|
7
|
+
(req: any, res: any, next: any): void;
|
|
8
|
+
}
|
|
9
|
+
export interface IErrorHandle {
|
|
10
|
+
(req: any, res: any, next: any): void;
|
|
11
|
+
}
|
|
12
|
+
export interface IExpressRoute {
|
|
13
|
+
get(path: string, handlers: IMiddleware[]): void;
|
|
14
|
+
post(path: string, handlers: IMiddleware[]): void;
|
|
15
|
+
use(path: string, route: IExpressRoute): void;
|
|
16
|
+
}
|
|
17
|
+
export interface OSetupParam {
|
|
18
|
+
factoryExpressRouter(dtiRouter: DtiRoute): any;
|
|
19
|
+
factoryBodyparseJson?: () => IMiddleware;
|
|
20
|
+
factoryBodyparseUrlencode?: () => IMiddleware;
|
|
21
|
+
errorHandle?: IErrorHandle;
|
|
22
|
+
}
|
package/esm/common.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/esm/index.d.ts
ADDED
package/esm/index.js
ADDED
package/esm/route.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DtiRoute } from "@napp/dti-core";
|
|
2
|
+
import { OSetupParam } from "./common";
|
|
3
|
+
import { DtiServer } from "./server";
|
|
4
|
+
export declare class DtiServerRoute {
|
|
5
|
+
private meta;
|
|
6
|
+
private server;
|
|
7
|
+
private base62;
|
|
8
|
+
constructor(meta: DtiRoute, server: DtiServer);
|
|
9
|
+
private param;
|
|
10
|
+
private callAction;
|
|
11
|
+
private setupAction;
|
|
12
|
+
private setupActions;
|
|
13
|
+
private setupRaws;
|
|
14
|
+
setup(setuper: OSetupParam): any;
|
|
15
|
+
}
|
package/esm/route.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { DtiMode, Base62, DtiRawResponse } from "@napp/dti-core";
|
|
2
|
+
export class DtiServerRoute {
|
|
3
|
+
constructor(meta, server) {
|
|
4
|
+
this.meta = meta;
|
|
5
|
+
this.server = server;
|
|
6
|
+
this.base62 = new Base62();
|
|
7
|
+
}
|
|
8
|
+
param(action, req) {
|
|
9
|
+
let mode = action.meta.getMode();
|
|
10
|
+
if (mode === DtiMode.QString) {
|
|
11
|
+
return req.query;
|
|
12
|
+
}
|
|
13
|
+
else if (mode === DtiMode.QJson) {
|
|
14
|
+
try {
|
|
15
|
+
let p = req.query?.p;
|
|
16
|
+
if (p) {
|
|
17
|
+
let json = this.base62.decode(p);
|
|
18
|
+
return JSON.parse(json);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
}
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
else if (mode === DtiMode.BJson || mode === DtiMode.BFrom) {
|
|
26
|
+
return req.body;
|
|
27
|
+
}
|
|
28
|
+
throw new Error('not supported mode');
|
|
29
|
+
}
|
|
30
|
+
callAction(sa, req, res, next) {
|
|
31
|
+
try {
|
|
32
|
+
let param = this.param(sa, req);
|
|
33
|
+
sa.validation(param);
|
|
34
|
+
return sa.action(param, { req, res })
|
|
35
|
+
.then(rsu => {
|
|
36
|
+
if (DtiRawResponse.is(rsu) === false) {
|
|
37
|
+
return res.json(rsu);
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
.catch(err => next(err));
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
return next(error);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
setupAction(expressRoute, action, setuper) {
|
|
47
|
+
let mode = action.meta.getMode();
|
|
48
|
+
let path = action.meta.getPath();
|
|
49
|
+
let endpoint = (req, res, next) => {
|
|
50
|
+
this.callAction(action, req, res, next);
|
|
51
|
+
};
|
|
52
|
+
if (mode === DtiMode.QString || mode === DtiMode.QJson) {
|
|
53
|
+
expressRoute.get(path, endpoint);
|
|
54
|
+
}
|
|
55
|
+
else if (mode === DtiMode.BJson) {
|
|
56
|
+
if (setuper.factoryBodyparseJson) {
|
|
57
|
+
expressRoute.post(path, [setuper.factoryBodyparseJson(), endpoint]);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
throw new Error('not define server.factoryBodyparseJson');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else if (mode === DtiMode.BFrom) {
|
|
64
|
+
if (setuper.factoryBodyparseUrlencode) {
|
|
65
|
+
expressRoute.post(path, [setuper.factoryBodyparseUrlencode(), endpoint]);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
throw new Error('not define server.factoryBodyparseUrlencode');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
throw new Error("not support methid. logic error");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
setupActions(expressRoute, setuper) {
|
|
76
|
+
let actions = this.meta.getActions();
|
|
77
|
+
for (let a of actions) {
|
|
78
|
+
let name = a.getFullname();
|
|
79
|
+
let action = this.server.getActionByName(name);
|
|
80
|
+
if (action) {
|
|
81
|
+
this.setupAction(expressRoute, action, setuper);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.warn(`not registered server action. action(${name})`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
setupRaws(expressRoute, setuper) {
|
|
89
|
+
let name = this.meta.getFullname();
|
|
90
|
+
let handles = this.server.getRawByName(name);
|
|
91
|
+
if (Array.isArray(handles)) {
|
|
92
|
+
for (let handle of handles) {
|
|
93
|
+
handle(expressRoute);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
setup(setuper) {
|
|
98
|
+
let pRoute = setuper.factoryExpressRouter(this.meta);
|
|
99
|
+
this.setupActions(pRoute, setuper);
|
|
100
|
+
this.setupRaws(pRoute, setuper);
|
|
101
|
+
for (let dtiRoute of this.meta.getChildroutes()) {
|
|
102
|
+
let lRoute = new DtiServerRoute(dtiRoute, this.server).setup(setuper);
|
|
103
|
+
pRoute.use(dtiRoute.getLocalPath(), lRoute);
|
|
104
|
+
}
|
|
105
|
+
return pRoute;
|
|
106
|
+
}
|
|
107
|
+
}
|
package/esm/server.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DtiRoute } from "@napp/dti-core";
|
|
2
|
+
import { DtiServerAction } from "./action";
|
|
3
|
+
import { OSetupParam } from "./common";
|
|
4
|
+
export interface IRawActionBuilder {
|
|
5
|
+
(expressRoute: any): void;
|
|
6
|
+
}
|
|
7
|
+
export declare class DtiServer {
|
|
8
|
+
private root;
|
|
9
|
+
constructor(root: DtiRoute);
|
|
10
|
+
private _actions;
|
|
11
|
+
private _raws;
|
|
12
|
+
register(...actions: DtiServerAction<any, any>[]): this;
|
|
13
|
+
rawRegister(route: DtiRoute, ...handlers: IRawActionBuilder[]): this;
|
|
14
|
+
getActionByName(name: string): DtiServerAction<any, any> | undefined;
|
|
15
|
+
getRawByName(name: string): IRawActionBuilder[] | undefined;
|
|
16
|
+
static setup(server: DtiServer, setuper: OSetupParam): any;
|
|
17
|
+
}
|
package/esm/server.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { DtiServerRoute } from "./route";
|
|
2
|
+
import { BundlerServer } from "./bundler";
|
|
3
|
+
export class DtiServer {
|
|
4
|
+
constructor(root) {
|
|
5
|
+
this.root = root;
|
|
6
|
+
this._actions = new Map();
|
|
7
|
+
this._raws = new Map();
|
|
8
|
+
}
|
|
9
|
+
register(...actions) {
|
|
10
|
+
for (let action of actions) {
|
|
11
|
+
let name = action.meta.getFullname();
|
|
12
|
+
if (this._actions.has(name)) {
|
|
13
|
+
throw new Error(`already registed(${name})`);
|
|
14
|
+
}
|
|
15
|
+
this._actions.set(name, action);
|
|
16
|
+
}
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
rawRegister(route, ...handlers) {
|
|
20
|
+
let name = route.getFullname();
|
|
21
|
+
if (this._raws.has(name)) {
|
|
22
|
+
let olds = this._raws.get(name) || [];
|
|
23
|
+
this._raws.set(name, [...olds, ...handlers]);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
this._raws.set(name, [...handlers]);
|
|
27
|
+
}
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
getActionByName(name) {
|
|
31
|
+
return this._actions.get(name);
|
|
32
|
+
}
|
|
33
|
+
getRawByName(name) {
|
|
34
|
+
return this._raws.get(name);
|
|
35
|
+
}
|
|
36
|
+
static setup(server, setuper) {
|
|
37
|
+
let route = setuper.factoryExpressRouter(server.root);
|
|
38
|
+
new BundlerServer(server).setup(route, setuper);
|
|
39
|
+
route.use(server.root.getLocalPath(), new DtiServerRoute(server.root, server).setup(setuper));
|
|
40
|
+
if (setuper.errorHandle) {
|
|
41
|
+
route.use(setuper.errorHandle);
|
|
42
|
+
}
|
|
43
|
+
return route;
|
|
44
|
+
}
|
|
45
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@napp/dti-server",
|
|
3
|
-
"version": "4.4.
|
|
3
|
+
"version": "4.4.5",
|
|
4
4
|
"description": "data transaction interface server library",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -8,6 +8,14 @@
|
|
|
8
8
|
},
|
|
9
9
|
"types": "index.d.ts",
|
|
10
10
|
"main": "index.js",
|
|
11
|
+
"module": "esm/index.js",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"require": "./index.js",
|
|
15
|
+
"import": "./esm/index.js",
|
|
16
|
+
"types": "./index.d.ts"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
11
19
|
"keywords": [
|
|
12
20
|
"napp",
|
|
13
21
|
"Rest API",
|
|
@@ -19,6 +27,6 @@
|
|
|
19
27
|
"@napp/exception": "^9.1.4"
|
|
20
28
|
},
|
|
21
29
|
"dependencies": {
|
|
22
|
-
"@napp/dti-core": "4.4.
|
|
30
|
+
"@napp/dti-core": "4.4.5"
|
|
23
31
|
}
|
|
24
32
|
}
|