@napp/dti-client 4.4.4 → 4.5.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/builder.d.ts CHANGED
@@ -10,5 +10,10 @@ export declare class DtiClientBuilder {
10
10
  getBaseUrl(name: string): string | undefined;
11
11
  header(route: DtiRoute, builder: ODtiClientHeaderBuilder): this;
12
12
  getHeader(name: string): ODtiClientHeaderBuilder | undefined;
13
+ private signatureSecretResolver;
14
+ signatureSecret(resolver: {
15
+ (): Promise<string>;
16
+ } | undefined): this;
17
+ getSignatureResolver(): (() => Promise<string>) | undefined;
13
18
  build(): DtiClient;
14
19
  }
package/builder.js CHANGED
@@ -4,10 +4,8 @@ exports.DtiClientBuilder = void 0;
4
4
  const tree_1 = require("./tree");
5
5
  const client_1 = require("./client");
6
6
  class DtiClientBuilder {
7
- constructor() {
8
- this._baseUrls = new tree_1.TreeNamer("root");
9
- this._headers = new tree_1.TreeNamer("root");
10
- }
7
+ _baseUrls = new tree_1.TreeNamer("root");
8
+ _headers = new tree_1.TreeNamer("root");
11
9
  baseUrl(route, url) {
12
10
  this._baseUrls.set(route.getFullname(), url);
13
11
  return this;
@@ -30,6 +28,14 @@ class DtiClientBuilder {
30
28
  }
31
29
  return undefined;
32
30
  }
31
+ signatureSecretResolver = undefined;
32
+ signatureSecret(resolver) {
33
+ this.signatureSecretResolver = resolver;
34
+ return this;
35
+ }
36
+ getSignatureResolver() {
37
+ return this.signatureSecretResolver;
38
+ }
33
39
  build() {
34
40
  return new client_1.DtiClient(this);
35
41
  }
package/bundler.js CHANGED
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.DtiClientBandler = void 0;
13
4
  const dti_core_1 = require("@napp/dti-core");
@@ -15,10 +6,12 @@ const exception_1 = require("@napp/exception");
15
6
  const cross_fetch_1 = require("cross-fetch");
16
7
  const errorhandle_1 = require("./errorhandle");
17
8
  class DtiClientBandler {
9
+ bundleMetas;
10
+ builder;
11
+ base62 = new dti_core_1.Base62();
18
12
  constructor(bundleMetas, builder) {
19
13
  this.bundleMetas = bundleMetas;
20
14
  this.builder = builder;
21
- this.base62 = new dti_core_1.Base62();
22
15
  }
23
16
  validate() {
24
17
  for (let it of this.bundleMetas) {
@@ -58,55 +51,49 @@ class DtiClientBandler {
58
51
  for (let it of this.bundleMetas) {
59
52
  let _headers = this.builder.getHeader(it.meta.getRoute().getFullname());
60
53
  if (_headers) {
61
- headers = Object.assign(Object.assign({}, headers), _headers);
54
+ headers = { ...headers, ..._headers };
62
55
  }
63
56
  }
64
57
  headers["Content-Type"] = "application/json";
65
58
  return headers;
66
59
  }
67
- call() {
68
- return __awaiter(this, void 0, void 0, function* () {
69
- this.validate();
70
- let method = this.getMethod();
71
- if (method === 'get') {
72
- return yield this.callGet();
73
- }
74
- return yield this.callPost();
75
- });
60
+ async call() {
61
+ this.validate();
62
+ let method = this.getMethod();
63
+ if (method === 'get') {
64
+ return await this.callGet();
65
+ }
66
+ return await this.callPost();
76
67
  }
77
- callGet() {
78
- return __awaiter(this, void 0, void 0, function* () {
79
- try {
80
- let baseUrl = this.getBase();
81
- let param = this.getParam();
82
- let headers = this.getHeaders();
83
- let p = this.base62.encode(JSON.stringify(param));
84
- let q = new URLSearchParams({ p }).toString();
85
- let resp = yield (0, cross_fetch_1.fetch)(`${baseUrl}/__bundler_get__?${q}`, {
86
- method: 'get', headers
87
- });
88
- return yield (0, errorhandle_1.responseHandle)(resp);
89
- }
90
- catch (error) {
91
- throw exception_1.Exception.from(error);
92
- }
93
- });
68
+ async callGet() {
69
+ try {
70
+ let baseUrl = this.getBase();
71
+ let param = this.getParam();
72
+ let headers = this.getHeaders();
73
+ let p = this.base62.encode(JSON.stringify(param));
74
+ let q = new URLSearchParams({ p }).toString();
75
+ let resp = await (0, cross_fetch_1.fetch)(`${baseUrl}/__bundler_get__?${q}`, {
76
+ method: 'get', headers
77
+ });
78
+ return await (0, errorhandle_1.responseHandle)(resp);
79
+ }
80
+ catch (error) {
81
+ throw exception_1.Exception.from(error);
82
+ }
94
83
  }
95
- callPost() {
96
- return __awaiter(this, void 0, void 0, function* () {
97
- try {
98
- let baseUrl = this.getBase();
99
- let param = this.getParam();
100
- let headers = this.getHeaders();
101
- let resp = yield (0, cross_fetch_1.fetch)(`${baseUrl}/__bundler_post__`, {
102
- method: 'post', headers, body: JSON.stringify(param)
103
- });
104
- return yield (0, errorhandle_1.responseHandle)(resp);
105
- }
106
- catch (error) {
107
- throw exception_1.Exception.from(error);
108
- }
109
- });
84
+ async callPost() {
85
+ try {
86
+ let baseUrl = this.getBase();
87
+ let param = this.getParam();
88
+ let headers = this.getHeaders();
89
+ let resp = await (0, cross_fetch_1.fetch)(`${baseUrl}/__bundler_post__`, {
90
+ method: 'post', headers, body: JSON.stringify(param)
91
+ });
92
+ return await (0, errorhandle_1.responseHandle)(resp);
93
+ }
94
+ catch (error) {
95
+ throw exception_1.Exception.from(error);
96
+ }
110
97
  }
111
98
  }
112
99
  exports.DtiClientBandler = DtiClientBandler;
package/caller.d.ts CHANGED
@@ -12,6 +12,7 @@ export declare class DtiClientCaller<RESULT, PARAM> {
12
12
  private getBody;
13
13
  private getQeury;
14
14
  private getHeaders;
15
+ private signature;
15
16
  private getUrl;
16
17
  bundler(param: PARAM): BundleMeta<RESULT, PARAM>;
17
18
  call(param: PARAM): Promise<RESULT>;
package/caller.js CHANGED
@@ -1,24 +1,34 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.DtiClientCaller = void 0;
13
4
  const dti_core_1 = require("@napp/dti-core");
14
5
  const cross_fetch_1 = require("cross-fetch");
15
6
  const route_1 = require("./route");
16
7
  const errorhandle_1 = require("./errorhandle");
8
+ function getRandomInt(min, max) {
9
+ const minCeiled = Math.ceil(min);
10
+ const maxFloored = Math.floor(max);
11
+ // The maximum is exclusive and the minimum is inclusive
12
+ return Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled);
13
+ }
14
+ async function hmacSignBase64(secret, data) {
15
+ const enc = new TextEncoder();
16
+ const key = await crypto.subtle.importKey("raw", enc.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
17
+ const sigBuf = await crypto.subtle.sign("HMAC", key, enc.encode(data));
18
+ const sigBytes = new Uint8Array(sigBuf);
19
+ // base64 encode
20
+ let bin = "";
21
+ sigBytes.forEach(b => (bin += String.fromCharCode(b)));
22
+ return btoa(bin);
23
+ }
17
24
  class DtiClientCaller {
25
+ meta;
26
+ builder;
27
+ base62 = new dti_core_1.Base62();
28
+ routeClient;
18
29
  constructor(meta, builder) {
19
30
  this.meta = meta;
20
31
  this.builder = builder;
21
- this.base62 = new dti_core_1.Base62();
22
32
  this.routeClient = new route_1.DtiClientRoute(meta.getRoute(), builder);
23
33
  }
24
34
  validate(param) {
@@ -70,7 +80,7 @@ class DtiClientCaller {
70
80
  let confHeaderBuilder = this.builder.getHeader(this.meta.getRoute().getFullname());
71
81
  if (confHeaderBuilder) {
72
82
  let confHeaders = confHeaderBuilder(this.meta);
73
- headers = Object.assign(Object.assign({}, headers), confHeaders);
83
+ headers = { ...headers, ...confHeaders };
74
84
  }
75
85
  if (m === dti_core_1.DtiMode.BFrom) {
76
86
  headers["Content-Type"] = "application/x-www-form-urlencoded";
@@ -80,29 +90,57 @@ class DtiClientCaller {
80
90
  }
81
91
  return headers;
82
92
  }
93
+ async signature(data) {
94
+ const nonce = '' + getRandomInt(10000, 99999);
95
+ const timestamp = '' + Math.round(Date.now() / 1000);
96
+ const secretResolver = this.builder.getSignatureResolver();
97
+ if (secretResolver) {
98
+ const secret = await secretResolver();
99
+ if (secret) {
100
+ const signature = await hmacSignBase64(secret, `${timestamp}.${nonce}.${data}`);
101
+ return {
102
+ nonce, timestamp, signature
103
+ };
104
+ }
105
+ }
106
+ return {
107
+ nonce, timestamp,
108
+ signature: ''
109
+ };
110
+ }
83
111
  getUrl() {
84
112
  return this.routeClient.buildUrl(this.meta.getPath());
85
113
  }
86
114
  bundler(param) {
87
115
  return { meta: this.meta, param };
88
116
  }
89
- call(param) {
90
- return __awaiter(this, void 0, void 0, function* () {
91
- let resp = yield this.callRaw(param);
92
- return yield (0, errorhandle_1.responseHandle)(resp);
93
- });
117
+ async call(param) {
118
+ let resp = await this.callRaw(param);
119
+ return await (0, errorhandle_1.responseHandle)(resp);
94
120
  }
95
- callRaw(param) {
96
- return __awaiter(this, void 0, void 0, function* () {
97
- this.validate(param);
98
- let url = this.getUrl();
99
- let query = this.getQeury(param);
100
- let method = this.getMethod();
101
- let headers = this.getHeaders(param);
102
- let body = this.getBody(param);
103
- return yield (0, cross_fetch_1.fetch)(url + (query ? `?${query}` : ''), {
104
- method, headers, body
105
- });
121
+ async callRaw(param) {
122
+ this.validate(param);
123
+ let url = this.getUrl();
124
+ let query = this.getQeury(param);
125
+ let method = this.getMethod();
126
+ let headers = this.getHeaders(param);
127
+ let body = this.getBody(param);
128
+ const signData = this.meta.sign(param);
129
+ if (signData) {
130
+ const { nonce, signature, timestamp } = await this.signature(signData);
131
+ if (signature) {
132
+ // console.log('method', method)
133
+ // console.log('------------method', method, this.meta.getFullname())
134
+ // console.log('timestamp', timestamp)
135
+ // console.log('nonce', nonce)
136
+ // console.log('signature', signature)
137
+ headers["X-DTI-Timestamp"] = timestamp;
138
+ headers["X-DTI-Nonce"] = nonce;
139
+ headers["X-DTI-Signature"] = signature;
140
+ }
141
+ }
142
+ return await (0, cross_fetch_1.fetch)(url + (query ? `?${query}` : ''), {
143
+ method, headers, body
106
144
  });
107
145
  }
108
146
  }
package/client.js CHANGED
@@ -1,19 +1,11 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.DtiClient = void 0;
13
4
  const route_1 = require("./route");
14
5
  const caller_1 = require("./caller");
15
6
  const bundler_1 = require("./bundler");
16
7
  class DtiClient {
8
+ builder;
17
9
  constructor(builder) {
18
10
  this.builder = builder;
19
11
  }
@@ -23,26 +15,24 @@ class DtiClient {
23
15
  buildUrl(route, actionPath) {
24
16
  return new route_1.DtiClientRoute(route, this.builder).buildUrl(actionPath);
25
17
  }
26
- bundle(m1, m2, m3, m4, m5, m6) {
27
- return __awaiter(this, void 0, void 0, function* () {
28
- let bundleMetas = [m1];
29
- if (m2) {
30
- bundleMetas.push(m2);
31
- }
32
- if (m3) {
33
- bundleMetas.push(m3);
34
- }
35
- if (m4) {
36
- bundleMetas.push(m4);
37
- }
38
- if (m5) {
39
- bundleMetas.push(m5);
40
- }
41
- if (m6) {
42
- bundleMetas.push(m6);
43
- }
44
- return yield new bundler_1.DtiClientBandler(bundleMetas, this.builder).call();
45
- });
18
+ async bundle(m1, m2, m3, m4, m5, m6) {
19
+ let bundleMetas = [m1];
20
+ if (m2) {
21
+ bundleMetas.push(m2);
22
+ }
23
+ if (m3) {
24
+ bundleMetas.push(m3);
25
+ }
26
+ if (m4) {
27
+ bundleMetas.push(m4);
28
+ }
29
+ if (m5) {
30
+ bundleMetas.push(m5);
31
+ }
32
+ if (m6) {
33
+ bundleMetas.push(m6);
34
+ }
35
+ return await new bundler_1.DtiClientBandler(bundleMetas, this.builder).call();
46
36
  }
47
37
  }
48
38
  exports.DtiClient = DtiClient;
package/errorhandle.js CHANGED
@@ -1,65 +1,54 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.responseHandle = void 0;
13
4
  const exception_1 = require("@napp/exception");
14
- function responseHandle(resp, parser) {
15
- return __awaiter(this, void 0, void 0, function* () {
16
- try {
17
- let rsu = yield resp.text();
18
- if (resp.ok) {
19
- if (rsu) {
20
- try {
21
- let value = JSON.parse(rsu);
22
- return value;
23
- }
24
- catch (error) {
25
- throw new exception_1.Exception(rsu, {
26
- kind: 'serviceunavailable',
27
- });
28
- }
29
- }
30
- return void 0;
31
- }
5
+ async function responseHandle(resp, parser) {
6
+ try {
7
+ let rsu = await resp.text();
8
+ if (resp.ok) {
32
9
  if (rsu) {
33
- let err;
34
10
  try {
35
- let errObject = JSON.parse(rsu);
36
- if (parser) {
37
- let e1 = parser(errObject);
38
- if (e1) {
39
- err = e1;
40
- }
41
- else {
42
- err = exception_1.Exception.from(errObject);
43
- }
44
- }
45
- else {
46
- err = exception_1.Exception.from(errObject);
47
- }
11
+ let value = JSON.parse(rsu);
12
+ return value;
48
13
  }
49
14
  catch (error) {
50
- err = new exception_1.Exception(rsu, {
15
+ throw new exception_1.Exception(rsu, {
51
16
  kind: 'serviceunavailable',
52
17
  });
53
18
  }
54
- throw err;
55
19
  }
56
- throw new exception_1.Exception(`status=${resp.status}. ${resp.statusText}`, {
57
- kind: 'serviceunavailable',
58
- });
20
+ return void 0;
59
21
  }
60
- catch (error) {
61
- throw exception_1.Exception.from(error);
22
+ if (rsu) {
23
+ let err;
24
+ try {
25
+ let errObject = JSON.parse(rsu);
26
+ if (parser) {
27
+ let e1 = parser(errObject);
28
+ if (e1) {
29
+ err = e1;
30
+ }
31
+ else {
32
+ err = exception_1.Exception.from(errObject);
33
+ }
34
+ }
35
+ else {
36
+ err = exception_1.Exception.from(errObject);
37
+ }
38
+ }
39
+ catch (error) {
40
+ err = new exception_1.Exception(rsu, {
41
+ kind: 'serviceunavailable',
42
+ });
43
+ }
44
+ throw err;
62
45
  }
63
- });
46
+ throw new exception_1.Exception(`status=${resp.status}. ${resp.statusText}`, {
47
+ kind: 'serviceunavailable',
48
+ });
49
+ }
50
+ catch (error) {
51
+ throw exception_1.Exception.from(error);
52
+ }
64
53
  }
65
54
  exports.responseHandle = responseHandle;
@@ -0,0 +1,19 @@
1
+ import { DtiAction, DtiRoute } from "@napp/dti-core";
2
+ import { DtiClient } from "./client";
3
+ export interface ODtiClientHeaderBuilder {
4
+ (action: DtiAction<any, any>): Record<string, string>;
5
+ }
6
+ export declare class DtiClientBuilder {
7
+ private _baseUrls;
8
+ private _headers;
9
+ baseUrl(route: DtiRoute, url: string): this;
10
+ getBaseUrl(name: string): string | undefined;
11
+ header(route: DtiRoute, builder: ODtiClientHeaderBuilder): this;
12
+ getHeader(name: string): ODtiClientHeaderBuilder | undefined;
13
+ private signatureSecretResolver;
14
+ signatureSecret(resolver: {
15
+ (): Promise<string>;
16
+ } | undefined): this;
17
+ getSignatureResolver(): (() => Promise<string>) | undefined;
18
+ build(): DtiClient;
19
+ }
package/esm/builder.js ADDED
@@ -0,0 +1,39 @@
1
+ import { TreeNamer } from "./tree";
2
+ import { DtiClient } from "./client";
3
+ export class DtiClientBuilder {
4
+ _baseUrls = new TreeNamer("root");
5
+ _headers = new TreeNamer("root");
6
+ baseUrl(route, url) {
7
+ this._baseUrls.set(route.getFullname(), url);
8
+ return this;
9
+ }
10
+ getBaseUrl(name) {
11
+ let note = this._baseUrls.findParent(name);
12
+ if (note) {
13
+ return note.getValue();
14
+ }
15
+ return undefined;
16
+ }
17
+ header(route, builder) {
18
+ this._headers.set(route.getFullname(), builder);
19
+ return this;
20
+ }
21
+ getHeader(name) {
22
+ let note = this._headers.findParent(name);
23
+ if (note) {
24
+ return note.getValue();
25
+ }
26
+ return undefined;
27
+ }
28
+ signatureSecretResolver = undefined;
29
+ signatureSecret(resolver) {
30
+ this.signatureSecretResolver = resolver;
31
+ return this;
32
+ }
33
+ getSignatureResolver() {
34
+ return this.signatureSecretResolver;
35
+ }
36
+ build() {
37
+ return new DtiClient(this);
38
+ }
39
+ }
@@ -0,0 +1,23 @@
1
+ import { DtiAction } from "@napp/dti-core";
2
+ import { DtiClientBuilder } from "./builder";
3
+ export interface BundleMeta<RESULT, PARAM> {
4
+ meta: DtiAction<RESULT, PARAM>;
5
+ param: PARAM;
6
+ }
7
+ export declare class DtiClientBandler {
8
+ private bundleMetas;
9
+ private builder;
10
+ private base62;
11
+ constructor(bundleMetas: Array<BundleMeta<any, any>>, builder: DtiClientBuilder);
12
+ validate(): void;
13
+ private getMethod;
14
+ private getBase;
15
+ getParam(): {
16
+ name: string;
17
+ param: any;
18
+ }[];
19
+ private getHeaders;
20
+ call(): Promise<any>;
21
+ private callGet;
22
+ private callPost;
23
+ }
package/esm/bundler.js ADDED
@@ -0,0 +1,95 @@
1
+ import { DtiMode, Base62 } from "@napp/dti-core";
2
+ import { Exception } from "@napp/exception";
3
+ import { fetch } from "cross-fetch";
4
+ import { responseHandle } from "./errorhandle";
5
+ export class DtiClientBandler {
6
+ bundleMetas;
7
+ builder;
8
+ base62 = new Base62();
9
+ constructor(bundleMetas, builder) {
10
+ this.bundleMetas = bundleMetas;
11
+ this.builder = builder;
12
+ }
13
+ validate() {
14
+ for (let it of this.bundleMetas) {
15
+ it.meta.validate(it.param);
16
+ }
17
+ }
18
+ getMethod() {
19
+ for (let it of this.bundleMetas) {
20
+ let m = it.meta.getMode();
21
+ if (m === DtiMode.BFrom || m === DtiMode.BJson) {
22
+ return 'post';
23
+ }
24
+ }
25
+ return 'get';
26
+ }
27
+ getBase() {
28
+ for (let it of this.bundleMetas) {
29
+ let base = this.builder.getBaseUrl(it.meta.getFullname());
30
+ if (base) {
31
+ return base;
32
+ }
33
+ }
34
+ return '';
35
+ }
36
+ getParam() {
37
+ let param = [];
38
+ for (let it of this.bundleMetas) {
39
+ param.push({
40
+ name: it.meta.getFullname(),
41
+ param: it.param
42
+ });
43
+ }
44
+ return param;
45
+ }
46
+ getHeaders() {
47
+ let headers = {};
48
+ for (let it of this.bundleMetas) {
49
+ let _headers = this.builder.getHeader(it.meta.getRoute().getFullname());
50
+ if (_headers) {
51
+ headers = { ...headers, ..._headers };
52
+ }
53
+ }
54
+ headers["Content-Type"] = "application/json";
55
+ return headers;
56
+ }
57
+ async call() {
58
+ this.validate();
59
+ let method = this.getMethod();
60
+ if (method === 'get') {
61
+ return await this.callGet();
62
+ }
63
+ return await this.callPost();
64
+ }
65
+ async callGet() {
66
+ try {
67
+ let baseUrl = this.getBase();
68
+ let param = this.getParam();
69
+ let headers = this.getHeaders();
70
+ let p = this.base62.encode(JSON.stringify(param));
71
+ let q = new URLSearchParams({ p }).toString();
72
+ let resp = await fetch(`${baseUrl}/__bundler_get__?${q}`, {
73
+ method: 'get', headers
74
+ });
75
+ return await responseHandle(resp);
76
+ }
77
+ catch (error) {
78
+ throw Exception.from(error);
79
+ }
80
+ }
81
+ async callPost() {
82
+ try {
83
+ let baseUrl = this.getBase();
84
+ let param = this.getParam();
85
+ let headers = this.getHeaders();
86
+ let resp = await fetch(`${baseUrl}/__bundler_post__`, {
87
+ method: 'post', headers, body: JSON.stringify(param)
88
+ });
89
+ return await responseHandle(resp);
90
+ }
91
+ catch (error) {
92
+ throw Exception.from(error);
93
+ }
94
+ }
95
+ }
@@ -0,0 +1,20 @@
1
+ import { DtiAction } from "@napp/dti-core";
2
+ import { DtiClientBuilder } from "./builder";
3
+ import { BundleMeta } from "./bundler";
4
+ export declare class DtiClientCaller<RESULT, PARAM> {
5
+ private meta;
6
+ private builder;
7
+ private base62;
8
+ private routeClient;
9
+ constructor(meta: DtiAction<RESULT, PARAM>, builder: DtiClientBuilder);
10
+ validate(param: PARAM): void;
11
+ private getMethod;
12
+ private getBody;
13
+ private getQeury;
14
+ private getHeaders;
15
+ private signature;
16
+ private getUrl;
17
+ bundler(param: PARAM): BundleMeta<RESULT, PARAM>;
18
+ call(param: PARAM): Promise<RESULT>;
19
+ callRaw(param: PARAM): Promise<Response>;
20
+ }
package/esm/caller.js ADDED
@@ -0,0 +1,143 @@
1
+ import { DtiMode, Base62 } from "@napp/dti-core";
2
+ import { fetch } from "cross-fetch";
3
+ import { DtiClientRoute } from "./route";
4
+ import { responseHandle } from "./errorhandle";
5
+ function getRandomInt(min, max) {
6
+ const minCeiled = Math.ceil(min);
7
+ const maxFloored = Math.floor(max);
8
+ // The maximum is exclusive and the minimum is inclusive
9
+ return Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled);
10
+ }
11
+ async function hmacSignBase64(secret, data) {
12
+ const enc = new TextEncoder();
13
+ const key = await crypto.subtle.importKey("raw", enc.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
14
+ const sigBuf = await crypto.subtle.sign("HMAC", key, enc.encode(data));
15
+ const sigBytes = new Uint8Array(sigBuf);
16
+ // base64 encode
17
+ let bin = "";
18
+ sigBytes.forEach(b => (bin += String.fromCharCode(b)));
19
+ return btoa(bin);
20
+ }
21
+ export class DtiClientCaller {
22
+ meta;
23
+ builder;
24
+ base62 = new Base62();
25
+ routeClient;
26
+ constructor(meta, builder) {
27
+ this.meta = meta;
28
+ this.builder = builder;
29
+ this.routeClient = new DtiClientRoute(meta.getRoute(), builder);
30
+ }
31
+ validate(param) {
32
+ this.meta.validate(param);
33
+ }
34
+ getMethod() {
35
+ let m = this.meta.getMode();
36
+ if (m === DtiMode.QString || m === DtiMode.QJson) {
37
+ return 'get';
38
+ }
39
+ return 'post';
40
+ }
41
+ getBody(param) {
42
+ let m = this.meta.getMode();
43
+ if (m === DtiMode.BJson) {
44
+ if (param) {
45
+ return JSON.stringify(param);
46
+ }
47
+ }
48
+ if (m === DtiMode.BFrom) {
49
+ // const formData = new FormData();
50
+ // Object.keys(param as any).forEach(key => formData.append(key, (param as any)[key]));
51
+ if (param) {
52
+ return new URLSearchParams(param).toString();
53
+ }
54
+ }
55
+ return undefined;
56
+ }
57
+ getQeury(param) {
58
+ let m = this.meta.getMode();
59
+ if (m === DtiMode.QJson) {
60
+ if (param) {
61
+ let p = this.base62.encode(JSON.stringify(param));
62
+ return new URLSearchParams({ p }).toString();
63
+ }
64
+ }
65
+ else if (m === DtiMode.QString) {
66
+ if (param) {
67
+ let json = JSON.stringify(param);
68
+ let obj = JSON.parse(json);
69
+ return new URLSearchParams(obj).toString();
70
+ }
71
+ }
72
+ return undefined;
73
+ }
74
+ getHeaders(param) {
75
+ let m = this.meta.getMode();
76
+ let headers = {};
77
+ let confHeaderBuilder = this.builder.getHeader(this.meta.getRoute().getFullname());
78
+ if (confHeaderBuilder) {
79
+ let confHeaders = confHeaderBuilder(this.meta);
80
+ headers = { ...headers, ...confHeaders };
81
+ }
82
+ if (m === DtiMode.BFrom) {
83
+ headers["Content-Type"] = "application/x-www-form-urlencoded";
84
+ }
85
+ else {
86
+ headers["Content-Type"] = "application/json";
87
+ }
88
+ return headers;
89
+ }
90
+ async signature(data) {
91
+ const nonce = '' + getRandomInt(10000, 99999);
92
+ const timestamp = '' + Math.round(Date.now() / 1000);
93
+ const secretResolver = this.builder.getSignatureResolver();
94
+ if (secretResolver) {
95
+ const secret = await secretResolver();
96
+ if (secret) {
97
+ const signature = await hmacSignBase64(secret, `${timestamp}.${nonce}.${data}`);
98
+ return {
99
+ nonce, timestamp, signature
100
+ };
101
+ }
102
+ }
103
+ return {
104
+ nonce, timestamp,
105
+ signature: ''
106
+ };
107
+ }
108
+ getUrl() {
109
+ return this.routeClient.buildUrl(this.meta.getPath());
110
+ }
111
+ bundler(param) {
112
+ return { meta: this.meta, param };
113
+ }
114
+ async call(param) {
115
+ let resp = await this.callRaw(param);
116
+ return await responseHandle(resp);
117
+ }
118
+ async callRaw(param) {
119
+ this.validate(param);
120
+ let url = this.getUrl();
121
+ let query = this.getQeury(param);
122
+ let method = this.getMethod();
123
+ let headers = this.getHeaders(param);
124
+ let body = this.getBody(param);
125
+ const signData = this.meta.sign(param);
126
+ if (signData) {
127
+ const { nonce, signature, timestamp } = await this.signature(signData);
128
+ if (signature) {
129
+ // console.log('method', method)
130
+ // console.log('------------method', method, this.meta.getFullname())
131
+ // console.log('timestamp', timestamp)
132
+ // console.log('nonce', nonce)
133
+ // console.log('signature', signature)
134
+ headers["X-DTI-Timestamp"] = timestamp;
135
+ headers["X-DTI-Nonce"] = nonce;
136
+ headers["X-DTI-Signature"] = signature;
137
+ }
138
+ }
139
+ return await fetch(url + (query ? `?${query}` : ''), {
140
+ method, headers, body
141
+ });
142
+ }
143
+ }
@@ -0,0 +1,11 @@
1
+ import { DtiAction, DtiRoute } from "@napp/dti-core";
2
+ import { DtiClientBuilder } from "./builder";
3
+ import { DtiClientCaller } from "./caller";
4
+ import { BundleMeta } from "./bundler";
5
+ export declare class DtiClient {
6
+ private builder;
7
+ constructor(builder: DtiClientBuilder);
8
+ dti<RESULT, PARAM>(meta: DtiAction<RESULT, PARAM>): DtiClientCaller<RESULT, PARAM>;
9
+ buildUrl(route: DtiRoute, actionPath: string): string;
10
+ bundle<R1, P1, R2, P2, R3, P3, R4, P4, R5, P5, R6, P6>(m1: BundleMeta<R1, P1>, m2?: BundleMeta<R2, P2>, m3?: BundleMeta<R3, P3>, m4?: BundleMeta<R4, P4>, m5?: BundleMeta<R5, P5>, m6?: BundleMeta<R6, P6>): Promise<[R1, R2, R3, R4, R5, R6]>;
11
+ }
package/esm/client.js ADDED
@@ -0,0 +1,34 @@
1
+ import { DtiClientRoute } from "./route";
2
+ import { DtiClientCaller } from "./caller";
3
+ import { DtiClientBandler } from "./bundler";
4
+ export class DtiClient {
5
+ builder;
6
+ constructor(builder) {
7
+ this.builder = builder;
8
+ }
9
+ dti(meta) {
10
+ return new DtiClientCaller(meta, this.builder);
11
+ }
12
+ buildUrl(route, actionPath) {
13
+ return new DtiClientRoute(route, this.builder).buildUrl(actionPath);
14
+ }
15
+ async bundle(m1, m2, m3, m4, m5, m6) {
16
+ let bundleMetas = [m1];
17
+ if (m2) {
18
+ bundleMetas.push(m2);
19
+ }
20
+ if (m3) {
21
+ bundleMetas.push(m3);
22
+ }
23
+ if (m4) {
24
+ bundleMetas.push(m4);
25
+ }
26
+ if (m5) {
27
+ bundleMetas.push(m5);
28
+ }
29
+ if (m6) {
30
+ bundleMetas.push(m6);
31
+ }
32
+ return await new DtiClientBandler(bundleMetas, this.builder).call();
33
+ }
34
+ }
@@ -0,0 +1,2 @@
1
+ import { Exception } from "@napp/exception";
2
+ export declare function responseHandle<T>(resp: Response, parser?: (errObject: any) => Exception | undefined): Promise<T>;
@@ -0,0 +1,50 @@
1
+ import { Exception } from "@napp/exception";
2
+ export async function responseHandle(resp, parser) {
3
+ try {
4
+ let rsu = await resp.text();
5
+ if (resp.ok) {
6
+ if (rsu) {
7
+ try {
8
+ let value = JSON.parse(rsu);
9
+ return value;
10
+ }
11
+ catch (error) {
12
+ throw new Exception(rsu, {
13
+ kind: 'serviceunavailable',
14
+ });
15
+ }
16
+ }
17
+ return void 0;
18
+ }
19
+ if (rsu) {
20
+ let err;
21
+ try {
22
+ let errObject = JSON.parse(rsu);
23
+ if (parser) {
24
+ let e1 = parser(errObject);
25
+ if (e1) {
26
+ err = e1;
27
+ }
28
+ else {
29
+ err = Exception.from(errObject);
30
+ }
31
+ }
32
+ else {
33
+ err = Exception.from(errObject);
34
+ }
35
+ }
36
+ catch (error) {
37
+ err = new Exception(rsu, {
38
+ kind: 'serviceunavailable',
39
+ });
40
+ }
41
+ throw err;
42
+ }
43
+ throw new Exception(`status=${resp.status}. ${resp.statusText}`, {
44
+ kind: 'serviceunavailable',
45
+ });
46
+ }
47
+ catch (error) {
48
+ throw Exception.from(error);
49
+ }
50
+ }
package/esm/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export * from './builder';
2
+ export * from './caller';
3
+ export * from './client';
4
+ export * from './route';
5
+ export * from './tree';
6
+ export * from './errorhandle';
package/esm/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from './builder';
2
+ export * from './caller';
3
+ export * from './client';
4
+ export * from './route';
5
+ export * from './tree';
6
+ export * from './errorhandle';
package/esm/route.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { DtiRoute } from "@napp/dti-core";
2
+ import { DtiClientBuilder } from "./builder";
3
+ export declare class DtiClientRoute {
4
+ private meta;
5
+ private builder;
6
+ constructor(meta: DtiRoute, builder: DtiClientBuilder);
7
+ buildUrl(action: string): string;
8
+ }
package/esm/route.js ADDED
@@ -0,0 +1,12 @@
1
+ export class DtiClientRoute {
2
+ meta;
3
+ builder;
4
+ constructor(meta, builder) {
5
+ this.meta = meta;
6
+ this.builder = builder;
7
+ }
8
+ buildUrl(action) {
9
+ let base = this.builder.getBaseUrl(this.meta.getFullname()) || '';
10
+ return base + this.meta.getPaths().join('') + action;
11
+ }
12
+ }
package/esm/tree.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ export interface ITreeNamer<T> {
2
+ name: string;
3
+ parent?: string;
4
+ value?: T;
5
+ childs?: ITreeNamer<T>[];
6
+ }
7
+ export declare class TreeNamer<T> {
8
+ private name;
9
+ private parent?;
10
+ constructor(name: string, parent?: TreeNamer<T> | undefined);
11
+ private value?;
12
+ private childs?;
13
+ set(name: string, value: T): this;
14
+ findEqual(name: string): TreeNamer<T> | undefined;
15
+ findParent(name: string): TreeNamer<T>;
16
+ getValue(): T | undefined;
17
+ private getOrCreate;
18
+ private toObj;
19
+ print(): string;
20
+ }
package/esm/tree.js ADDED
@@ -0,0 +1,88 @@
1
+ export class TreeNamer {
2
+ name;
3
+ parent;
4
+ constructor(name, parent) {
5
+ this.name = name;
6
+ this.parent = parent;
7
+ }
8
+ value;
9
+ childs;
10
+ set(name, value) {
11
+ let names = (name || '').split('.').filter(it => !!it);
12
+ let curr = this;
13
+ while (names.length > 0) {
14
+ let name = names.shift() || '';
15
+ curr = curr.getOrCreate(name);
16
+ }
17
+ curr.value = value;
18
+ return this;
19
+ }
20
+ findEqual(name) {
21
+ let names = (name || '').split('.').filter(it => !!it);
22
+ let curr = this;
23
+ while (names.length > 0) {
24
+ let name = names.shift() || '';
25
+ if (curr.childs) {
26
+ if (name in curr.childs) {
27
+ curr = curr.childs[name];
28
+ }
29
+ else {
30
+ return undefined;
31
+ }
32
+ }
33
+ }
34
+ return curr;
35
+ }
36
+ findParent(name) {
37
+ let names = (name || '').split('.').filter(it => !!it);
38
+ let curr = this;
39
+ while (names.length > 0) {
40
+ let name = names.shift() || '';
41
+ if (curr.childs) {
42
+ if (name in curr.childs) {
43
+ curr = curr.childs[name];
44
+ }
45
+ else {
46
+ return curr;
47
+ }
48
+ }
49
+ }
50
+ return curr;
51
+ }
52
+ getValue() {
53
+ if (this.value) {
54
+ return this.value;
55
+ }
56
+ if (this.parent) {
57
+ return this.parent.getValue();
58
+ }
59
+ return undefined;
60
+ }
61
+ getOrCreate(name) {
62
+ this.childs = this.childs || {};
63
+ if (name in this.childs) {
64
+ return this.childs[name];
65
+ }
66
+ return this.childs[name] = new TreeNamer(name, this);
67
+ }
68
+ toObj() {
69
+ let obj = {
70
+ name: this.name,
71
+ parent: this.parent?.name,
72
+ value: this.value
73
+ };
74
+ if (this.childs) {
75
+ obj.childs = [];
76
+ for (let p of Object.keys(this.childs)) {
77
+ let it = this.childs[p];
78
+ if (it && it.name && typeof it.toObj === 'function' && typeof it.getOrCreate === 'function') {
79
+ obj.childs.push(it.toObj());
80
+ }
81
+ }
82
+ }
83
+ return obj;
84
+ }
85
+ print() {
86
+ return JSON.stringify(this.toObj(), null, 4);
87
+ }
88
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@napp/dti-client",
3
- "version": "4.4.4",
3
+ "version": "4.5.2",
4
4
  "description": "data transaction interface client 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",
@@ -16,7 +24,7 @@
16
24
  "author": "Farcek <farcek@gmail.com>",
17
25
  "license": "ISC",
18
26
  "dependencies": {
19
- "@napp/dti-core": "4.4.4"
27
+ "@napp/dti-core": "4.5.2"
20
28
  },
21
29
  "peerDependencies": {
22
30
  "@napp/exception": "^9.1.4",
package/route.js CHANGED
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DtiClientRoute = void 0;
4
4
  class DtiClientRoute {
5
+ meta;
6
+ builder;
5
7
  constructor(meta, builder) {
6
8
  this.meta = meta;
7
9
  this.builder = builder;
package/tree.js CHANGED
@@ -2,10 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TreeNamer = void 0;
4
4
  class TreeNamer {
5
+ name;
6
+ parent;
5
7
  constructor(name, parent) {
6
8
  this.name = name;
7
9
  this.parent = parent;
8
10
  }
11
+ value;
12
+ childs;
9
13
  set(name, value) {
10
14
  let names = (name || '').split('.').filter(it => !!it);
11
15
  let curr = this;
@@ -65,10 +69,9 @@ class TreeNamer {
65
69
  return this.childs[name] = new TreeNamer(name, this);
66
70
  }
67
71
  toObj() {
68
- var _a;
69
72
  let obj = {
70
73
  name: this.name,
71
- parent: (_a = this.parent) === null || _a === void 0 ? void 0 : _a.name,
74
+ parent: this.parent?.name,
72
75
  value: this.value
73
76
  };
74
77
  if (this.childs) {