@napp/dti-server 3.0.8 → 4.0.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.
package/action.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { DtiAction } from "@napp/dti-core";
2
+ import { IContext, IMiddleware } from "./common";
3
+ export interface ODtiServerAction<RESULT, PARAM> {
4
+ action: (param: PARAM, ctx: IContext) => Promise<RESULT>;
5
+ before?: Array<IMiddleware>;
6
+ }
7
+ export declare class DtiServerAction<RESULT, PARAM> {
8
+ meta: DtiAction<RESULT, PARAM>;
9
+ private opt;
10
+ private constructor();
11
+ action(param: PARAM, ctx: IContext): Promise<RESULT>;
12
+ before(): Array<IMiddleware>;
13
+ validation(param: PARAM): void;
14
+ static factory<RESULT, PARAM>(meta: DtiAction<RESULT, PARAM>, opt: ODtiServerAction<RESULT, PARAM>): DtiServerAction<RESULT, PARAM>;
15
+ }
package/action.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DtiServerAction = void 0;
4
+ class DtiServerAction {
5
+ constructor(meta, opt) {
6
+ this.meta = meta;
7
+ this.opt = opt;
8
+ }
9
+ action(param, ctx) {
10
+ return this.opt.action(param, ctx);
11
+ }
12
+ before() {
13
+ return this.opt.before || [];
14
+ }
15
+ validation(param) {
16
+ this.meta.validate(param);
17
+ }
18
+ static factory(meta, opt) {
19
+ return new DtiServerAction(meta, opt);
20
+ }
21
+ }
22
+ exports.DtiServerAction = DtiServerAction;
package/common.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { DtiAction, 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 IExpressRoute {
10
+ get(path: string, handlers: IMiddleware[]): void;
11
+ post(path: string, handlers: IMiddleware[]): void;
12
+ use(path: string, route: IExpressRoute): void;
13
+ }
14
+ export interface Logger {
15
+ (level: string, message: string): void;
16
+ }
17
+ export interface OSetupParam {
18
+ factoryExpressRouter(dtiRouter: DtiRoute): any;
19
+ factoryBodyparseJson(action: DtiAction<any, any>): IMiddleware;
20
+ factoryBodyparseUrlencode(action: DtiAction<any, any>): IMiddleware;
21
+ }
package/common.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/index.d.ts CHANGED
@@ -1,2 +1,5 @@
1
- export * from './response';
2
- export * from './adapter';
1
+ export * from './action';
2
+ export * from './common';
3
+ export * from './response';
4
+ export * from './route';
5
+ export * from './server';
package/index.js CHANGED
@@ -1,14 +1,21 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
- };
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- __exportStar(require("./response"), exports);
14
- __exportStar(require("./adapter"), exports);
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./action"), exports);
18
+ __exportStar(require("./common"), exports);
19
+ __exportStar(require("./response"), exports);
20
+ __exportStar(require("./route"), exports);
21
+ __exportStar(require("./server"), exports);
package/package.json CHANGED
@@ -1,17 +1,22 @@
1
1
  {
2
2
  "name": "@napp/dti-server",
3
- "version": "3.0.8",
3
+ "version": "4.0.2",
4
4
  "description": "data transaction interface server library",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/napp-core/dti.git"
8
+ },
5
9
  "types": "index.d.ts",
6
10
  "main": "index.js",
7
11
  "keywords": [
8
12
  "napp",
9
13
  "Rest API",
10
- "API framework"
14
+ "Rest API framework"
11
15
  ],
12
16
  "author": "Farcek <farcek@gmail.com>",
13
17
  "license": "ISC",
14
18
  "dependencies": {
15
- "@napp/dti-core": "3.0.8"
19
+ "@napp/dti-core": "4.0.2",
20
+ "base64url": "latest"
16
21
  }
17
22
  }
package/response.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare class DtiResponse {
2
- handle?: ((res: any) => void) | undefined;
3
- constructor(handle?: ((res: any) => void) | undefined);
4
- }
1
+ export declare class DtiResponse {
2
+ handle?: ((res: any) => void) | undefined;
3
+ constructor(handle?: ((res: any) => void) | undefined);
4
+ }
package/response.js CHANGED
@@ -1,10 +1,9 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DtiResponse = void 0;
4
- var DtiResponse = /** @class */ (function () {
5
- function DtiResponse(handle) {
6
- this.handle = handle;
7
- }
8
- return DtiResponse;
9
- }());
10
- exports.DtiResponse = DtiResponse;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DtiResponse = void 0;
4
+ class DtiResponse {
5
+ constructor(handle) {
6
+ this.handle = handle;
7
+ }
8
+ }
9
+ exports.DtiResponse = DtiResponse;
package/route.d.ts ADDED
@@ -0,0 +1,14 @@
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
+ constructor(meta: DtiRoute, server: DtiServer);
8
+ private param;
9
+ private callAction;
10
+ private setupAction;
11
+ private setupActions;
12
+ private setupRaws;
13
+ setup(setuper: OSetupParam): any;
14
+ }
package/route.js ADDED
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DtiServerRoute = void 0;
7
+ const dti_core_1 = require("@napp/dti-core");
8
+ const response_1 = require("./response");
9
+ const base64url_1 = __importDefault(require("base64url"));
10
+ class DtiServerRoute {
11
+ constructor(meta, server) {
12
+ this.meta = meta;
13
+ this.server = server;
14
+ }
15
+ param(action, req) {
16
+ let mode = action.meta.getMode();
17
+ if (mode === dti_core_1.DtiMode.QString) {
18
+ return req.query;
19
+ }
20
+ else if (mode === dti_core_1.DtiMode.QJson) {
21
+ try {
22
+ let p = req.query.p;
23
+ if (p) {
24
+ let json = base64url_1.default.decode(p);
25
+ return JSON.parse(json);
26
+ }
27
+ }
28
+ catch (error) {
29
+ }
30
+ return {};
31
+ }
32
+ else if (mode === dti_core_1.DtiMode.BJson || mode === dti_core_1.DtiMode.BFrom) {
33
+ return req.body;
34
+ }
35
+ throw new Error('not supported mode');
36
+ }
37
+ callAction(sa, req, res, next) {
38
+ try {
39
+ let param = this.param(sa, req);
40
+ sa.validation(param);
41
+ return sa.action(param, { req, res })
42
+ .then(rsu => {
43
+ if (rsu instanceof response_1.DtiResponse) {
44
+ if (rsu.handle) {
45
+ return rsu.handle(res);
46
+ }
47
+ return res.end();
48
+ }
49
+ return res.json(rsu);
50
+ })
51
+ .catch(err => next(err));
52
+ }
53
+ catch (error) {
54
+ return next(error);
55
+ }
56
+ }
57
+ setupAction(expressRoute, action, setuper) {
58
+ let befores = action.before();
59
+ let mode = action.meta.getMode();
60
+ let path = action.meta.getPath();
61
+ let endpoint = (req, res, next) => {
62
+ this.callAction(action, req, res, next);
63
+ };
64
+ if (mode === dti_core_1.DtiMode.QString || mode === dti_core_1.DtiMode.QJson) {
65
+ expressRoute.get(path, [...befores, endpoint]);
66
+ }
67
+ else if (mode === dti_core_1.DtiMode.BJson) {
68
+ expressRoute.post(path, [setuper.factoryBodyparseJson(action.meta), ...befores, endpoint]);
69
+ }
70
+ else if (mode === dti_core_1.DtiMode.BFrom) {
71
+ expressRoute.post(path, [setuper.factoryBodyparseUrlencode(action.meta), ...befores, endpoint]);
72
+ }
73
+ else {
74
+ throw new Error("not support methid. logic error");
75
+ }
76
+ }
77
+ setupActions(expressRoute, setuper) {
78
+ let actions = this.meta.getActions();
79
+ for (let a of actions) {
80
+ let name = a.getFullname();
81
+ let action = this.server.getActionByName(name);
82
+ if (action) {
83
+ this.setupAction(expressRoute, action, setuper);
84
+ }
85
+ else {
86
+ console.warn(`not registered server action. action(${name})`);
87
+ }
88
+ }
89
+ }
90
+ setupRaws(expressRoute, setuper) {
91
+ let name = this.meta.getFullname();
92
+ let handles = this.server.getRawByName(name);
93
+ if (Array.isArray(handles)) {
94
+ for (let handle of handles) {
95
+ handle(expressRoute);
96
+ }
97
+ }
98
+ }
99
+ setup(setuper) {
100
+ let pRoute = setuper.factoryExpressRouter(this.meta);
101
+ this.setupActions(pRoute, setuper);
102
+ this.setupRaws(pRoute, setuper);
103
+ for (let dtiRoute of this.meta.getChildroutes()) {
104
+ let lRoute = new DtiServerRoute(dtiRoute, this.server).setup(setuper);
105
+ pRoute.use(dtiRoute.getLocalPath(), lRoute);
106
+ }
107
+ return pRoute;
108
+ }
109
+ }
110
+ exports.DtiServerRoute = DtiServerRoute;
package/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[]): void;
14
+ getActionByName(name: string): DtiServerAction<any, any> | undefined;
15
+ getRawByName(name: string): IRawActionBuilder[] | undefined;
16
+ static setup(server: DtiServer, setuper: OSetupParam): any;
17
+ }
package/server.js ADDED
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DtiServer = void 0;
4
+ const dti_core_1 = require("@napp/dti-core");
5
+ const route_1 = require("./route");
6
+ class DtiServer {
7
+ constructor(root) {
8
+ this.root = root;
9
+ this._actions = new Map();
10
+ this._raws = new Map();
11
+ }
12
+ register(...actions) {
13
+ for (let action of actions) {
14
+ let name = action.meta.getFullname();
15
+ if (this._actions.has(name)) {
16
+ throw new Error(`already registed(${name})`);
17
+ }
18
+ this._actions.set(name, action);
19
+ }
20
+ return this;
21
+ }
22
+ rawRegister(route, ...handlers) {
23
+ let name = route.getFullname();
24
+ if (this._raws.has(name)) {
25
+ let olds = this._raws.get(name) || [];
26
+ this._raws.set(name, [...olds, ...handlers]);
27
+ }
28
+ else {
29
+ this._raws.set(name, [...handlers]);
30
+ }
31
+ }
32
+ getActionByName(name) {
33
+ return this._actions.get(name);
34
+ }
35
+ getRawByName(name) {
36
+ return this._raws.get(name);
37
+ }
38
+ static setup(server, setuper) {
39
+ let route = setuper.factoryExpressRouter(server.root);
40
+ route.use(server.root.getLocalPath(), new route_1.DtiServerRoute(server.root, server).setup(setuper));
41
+ route.use((err, req, res, next) => {
42
+ res.status(500).json(dti_core_1.DtiError.from(err).toPlanObject());
43
+ });
44
+ return route;
45
+ }
46
+ }
47
+ exports.DtiServer = DtiServer;
package/adapter.d.ts DELETED
@@ -1,49 +0,0 @@
1
- import { Dti } from "@napp/dti-core";
2
- interface IAction<RES, PQ, PB> {
3
- (param: {
4
- q: PQ;
5
- b: PB;
6
- }, ctx: {
7
- req: any;
8
- res: any;
9
- }): Promise<RES>;
10
- }
11
- interface IMiddleware {
12
- (req: any, res: any, next: any): void;
13
- }
14
- interface QParser<T> {
15
- (req: any): T;
16
- }
17
- export interface Logger {
18
- (level: string, message: string): void;
19
- }
20
- export declare class ServerInstance<RES, PQ, PB> {
21
- private meta;
22
- beforeFuncs?: Array<IMiddleware>;
23
- actionFunc?: IAction<RES, PQ, PB>;
24
- constructor(meta: Dti<RES, PQ, PB>);
25
- get name(): string;
26
- get method(): "get" | "post";
27
- get path(): string;
28
- get queryMode(): string;
29
- get bodyMode(): string;
30
- check(q: PQ, b: PB): void;
31
- before(funcs: Array<IMiddleware>): this;
32
- handle(action: IAction<RES, PQ, PB>): this;
33
- }
34
- export declare class ServerAdapter {
35
- actions: ServerInstance<any, any, any>[];
36
- private logger;
37
- constructor(logger: Logger);
38
- register<RES, PQ, PB>(...act: ServerInstance<RES, PQ, PB>[]): this;
39
- private bodyParser?;
40
- installBodyParser(parser: (bodyMode: string) => IMiddleware): this;
41
- private queryParser?;
42
- installQueryParser(parser: (queryMode: string) => QParser<any>): this;
43
- static dti<RES, PQ, PB>(meta: Dti<RES, PQ, PB>): ServerInstance<RES, PQ, PB>;
44
- private qParam;
45
- private callAction;
46
- private getBodyParser;
47
- setup<R>(route: R): R;
48
- }
49
- export {};
package/adapter.js DELETED
@@ -1,173 +0,0 @@
1
- "use strict";
2
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
- if (ar || !(i in from)) {
5
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
- ar[i] = from[i];
7
- }
8
- }
9
- return to.concat(ar || Array.prototype.slice.call(from));
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.ServerAdapter = exports.ServerInstance = void 0;
13
- var response_1 = require("./response");
14
- var ServerInstance = /** @class */ (function () {
15
- function ServerInstance(meta) {
16
- this.meta = meta;
17
- }
18
- Object.defineProperty(ServerInstance.prototype, "name", {
19
- get: function () {
20
- return this.meta.name;
21
- },
22
- enumerable: false,
23
- configurable: true
24
- });
25
- Object.defineProperty(ServerInstance.prototype, "method", {
26
- get: function () {
27
- return this.meta.method;
28
- },
29
- enumerable: false,
30
- configurable: true
31
- });
32
- Object.defineProperty(ServerInstance.prototype, "path", {
33
- get: function () {
34
- return this.meta.path;
35
- },
36
- enumerable: false,
37
- configurable: true
38
- });
39
- Object.defineProperty(ServerInstance.prototype, "queryMode", {
40
- get: function () {
41
- return this.meta.queryMode;
42
- },
43
- enumerable: false,
44
- configurable: true
45
- });
46
- Object.defineProperty(ServerInstance.prototype, "bodyMode", {
47
- get: function () {
48
- return this.meta.bodyMode;
49
- },
50
- enumerable: false,
51
- configurable: true
52
- });
53
- ServerInstance.prototype.check = function (q, b) {
54
- this.meta.checkQ(q);
55
- this.meta.checkB(b);
56
- };
57
- ServerInstance.prototype.before = function (funcs) {
58
- this.beforeFuncs = funcs;
59
- return this;
60
- };
61
- ServerInstance.prototype.handle = function (action) {
62
- this.actionFunc = action;
63
- return this;
64
- };
65
- return ServerInstance;
66
- }());
67
- exports.ServerInstance = ServerInstance;
68
- var ServerAdapter = /** @class */ (function () {
69
- function ServerAdapter(logger) {
70
- this.actions = [];
71
- this.logger = logger;
72
- }
73
- ServerAdapter.prototype.register = function () {
74
- var _a;
75
- var act = [];
76
- for (var _i = 0; _i < arguments.length; _i++) {
77
- act[_i] = arguments[_i];
78
- }
79
- (_a = this.actions).push.apply(_a, act);
80
- return this;
81
- };
82
- ServerAdapter.prototype.installBodyParser = function (parser) {
83
- this.bodyParser = parser;
84
- return this;
85
- };
86
- ServerAdapter.prototype.installQueryParser = function (parser) {
87
- this.queryParser = parser;
88
- return this;
89
- };
90
- ServerAdapter.dti = function (meta) {
91
- return new ServerInstance(meta);
92
- };
93
- ServerAdapter.prototype.qParam = function (it, req) {
94
- if (this.queryParser) {
95
- var parser = this.queryParser(it.queryMode);
96
- if (parser) {
97
- var q = parser(req);
98
- return q;
99
- }
100
- }
101
- return req.query;
102
- };
103
- ServerAdapter.prototype.callAction = function (it, req, res, next) {
104
- try {
105
- if (it.actionFunc) {
106
- var q = this.qParam(it, req);
107
- var b = req.body;
108
- it.check(q || {}, b || {});
109
- return it.actionFunc({ q: q, b: b }, { req: req, res: res })
110
- .then(function (rsu) {
111
- if (rsu instanceof response_1.DtiResponse) {
112
- if (rsu.handle) {
113
- return rsu.handle(res);
114
- }
115
- return res.end();
116
- }
117
- return res.json(rsu);
118
- })
119
- .catch(function (err) { return next(err); });
120
- }
121
- throw new Error('not found action handle');
122
- }
123
- catch (error) {
124
- return next(error);
125
- }
126
- };
127
- ServerAdapter.prototype.getBodyParser = function (it) {
128
- if (this.bodyParser) {
129
- var p = this.bodyParser(it.bodyMode);
130
- if (p) {
131
- return [p];
132
- }
133
- }
134
- return [];
135
- };
136
- ServerAdapter.prototype.setup = function (route) {
137
- var _this = this;
138
- var _route = route;
139
- var _loop_1 = function (it) {
140
- var befores = it.beforeFuncs || [];
141
- if (it.method === 'get') {
142
- _route.get(it.path, __spreadArray(__spreadArray([], befores, true), [function (req, res, next) {
143
- _this.callAction(it, req, res, next);
144
- }], false));
145
- }
146
- else if (it.method === 'post') {
147
- var bodyparser = this_1.getBodyParser(it);
148
- if (bodyparser.length === 0) {
149
- this_1.logger('warn', "not found body parser. name=\"".concat(it.name, "\"; bodyMode=\"").concat(it.bodyMode, "\""));
150
- }
151
- _route.post(it.path, __spreadArray(__spreadArray(__spreadArray([], bodyparser, true), befores, true), [function (req, res, next) {
152
- _this.callAction(it, req, res, next);
153
- }], false));
154
- }
155
- else {
156
- this_1.logger('warn', "not supored method. \"".concat(it.method, "\""));
157
- }
158
- this_1.logger('info', "[".concat(it.method, "] ").concat(it.path));
159
- };
160
- var this_1 = this;
161
- for (var _i = 0, _a = this.actions; _i < _a.length; _i++) {
162
- var it = _a[_i];
163
- _loop_1(it);
164
- }
165
- // for (let it of this.routes) {
166
- // let { name } = it(_route);
167
- // this.logger('info', `register native route "${name}"`)
168
- // }
169
- return route;
170
- };
171
- return ServerAdapter;
172
- }());
173
- exports.ServerAdapter = ServerAdapter;