chatbot-nc 2.2.23 → 2.2.25
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/cjs/enum/index.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/type/index.d.ts +4 -0
- package/dist/cjs/type/index.js +3 -0
- package/dist/cjs/type/index.js.map +1 -0
- package/dist/cjs/utils/auth.d.ts +16 -0
- package/dist/cjs/utils/auth.js +186 -0
- package/dist/cjs/utils/auth.js.map +1 -0
- package/dist/cjs/utils/index.d.ts +16 -0
- package/dist/cjs/utils/index.js +28 -1
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/webbookEvent/index.d.ts +0 -8
- package/dist/cjs/webbookEvent/index.js +8 -165
- package/dist/cjs/webbookEvent/index.js.map +1 -1
- package/dist/esm/enum/index.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/type/index.d.ts +4 -0
- package/dist/esm/type/index.js +2 -0
- package/dist/esm/type/index.js.map +1 -0
- package/dist/esm/utils/auth.d.ts +16 -0
- package/dist/esm/utils/auth.js +191 -0
- package/dist/esm/utils/auth.js.map +1 -0
- package/dist/esm/utils/index.d.ts +16 -0
- package/dist/esm/utils/index.js +5 -1
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/webbookEvent/index.d.ts +0 -8
- package/dist/esm/webbookEvent/index.js +9 -184
- package/dist/esm/webbookEvent/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,7 +8,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import axios from "axios";
|
|
11
|
-
import { AuthType,
|
|
11
|
+
import { AuthType, HttpMethod } from "../enum";
|
|
12
|
+
import { Utils } from "../utils";
|
|
12
13
|
export default class WebHookEvent {
|
|
13
14
|
constructor() {
|
|
14
15
|
}
|
|
@@ -26,7 +27,7 @@ export default class WebHookEvent {
|
|
|
26
27
|
processResponse(data, url, httpMethod, contentType, authType, headers, authValue) {
|
|
27
28
|
return __awaiter(this, void 0, void 0, function* () {
|
|
28
29
|
try {
|
|
29
|
-
let strContentType = yield
|
|
30
|
+
let strContentType = yield Utils.Auth.GetContentType(contentType);
|
|
30
31
|
let config = {
|
|
31
32
|
headers: { "Content-Type": strContentType }
|
|
32
33
|
};
|
|
@@ -55,6 +56,7 @@ export default class WebHookEvent {
|
|
|
55
56
|
}
|
|
56
57
|
AttachHeader(headers, authType, authValue, config) {
|
|
57
58
|
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
var _a;
|
|
58
60
|
{
|
|
59
61
|
try {
|
|
60
62
|
config = yield this.AttachClientHeaders(headers, config);
|
|
@@ -62,21 +64,21 @@ export default class WebHookEvent {
|
|
|
62
64
|
case AuthType.NoAuth:
|
|
63
65
|
break;
|
|
64
66
|
case AuthType.ApiKey:
|
|
65
|
-
var apikeyInfo = yield
|
|
67
|
+
var apikeyInfo = yield Utils.Auth.GetApiKey(authValue);
|
|
66
68
|
config.headers[apikeyInfo === null || apikeyInfo === void 0 ? void 0 : apikeyInfo.Key] = apikeyInfo === null || apikeyInfo === void 0 ? void 0 : apikeyInfo.Value;
|
|
67
69
|
break;
|
|
68
70
|
case AuthType.BearerToken:
|
|
69
|
-
var token = yield
|
|
71
|
+
var token = yield Utils.Auth.GetBearerToken(authValue);
|
|
70
72
|
config.headers.Authorization = `Bearer ${token}`;
|
|
71
73
|
break;
|
|
72
74
|
case AuthType.BasicAuth:
|
|
73
|
-
var authInfo = yield
|
|
75
|
+
var authInfo = yield Utils.Auth.GetAuthInfo(authValue);
|
|
74
76
|
config.auth.username = authInfo.userName;
|
|
75
77
|
config.auth.password = authInfo.password;
|
|
76
78
|
break;
|
|
77
79
|
case AuthType.OAuth:
|
|
78
|
-
var OAuthToken = yield
|
|
79
|
-
config.headers.Authorization =
|
|
80
|
+
var OAuthToken = yield Utils.Auth.GetOAuthToken(authValue);
|
|
81
|
+
config.headers.Authorization = `${(_a = OAuthToken.HeaderPrefix) !== null && _a !== void 0 ? _a : "Bearer"} ${OAuthToken.Token}`;
|
|
80
82
|
break;
|
|
81
83
|
}
|
|
82
84
|
return config;
|
|
@@ -107,182 +109,5 @@ export default class WebHookEvent {
|
|
|
107
109
|
}
|
|
108
110
|
});
|
|
109
111
|
}
|
|
110
|
-
GetApiKey(authType, authValue) {
|
|
111
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
-
var provisionList = authValue ? JSON.parse(authValue) : null;
|
|
113
|
-
if (!Array.isArray(provisionList))
|
|
114
|
-
return null;
|
|
115
|
-
const providerInfo = Object.fromEntries(provisionList.map((item) => [item.Key, item.Value]));
|
|
116
|
-
if (provisionList != null) {
|
|
117
|
-
// let Key = provisionList.find((x: any) => x.Key == 'AuthApiHeader').Value;
|
|
118
|
-
// let Value = provisionList.find((x: any) => x.Key == 'AuthApiValue').Value;
|
|
119
|
-
// return { Key, Value };
|
|
120
|
-
return { Key: providerInfo === null || providerInfo === void 0 ? void 0 : providerInfo.AuthApiHeader, Value: providerInfo === null || providerInfo === void 0 ? void 0 : providerInfo.AuthApiValue };
|
|
121
|
-
}
|
|
122
|
-
return null;
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
GetAuthInfo(authType, authValue) {
|
|
126
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
127
|
-
let data = Object.assign({});
|
|
128
|
-
var provisionList = authValue ? JSON.parse(authValue) : null;
|
|
129
|
-
if (!Array.isArray(provisionList))
|
|
130
|
-
return data;
|
|
131
|
-
const providerInfo = Object.fromEntries(provisionList.map((item) => [item.Key, item.Value]));
|
|
132
|
-
if (provisionList != null) {
|
|
133
|
-
// let userName = provisionList.find((x: any) => x.Key == 'AuthBasicUsername')?.Value;
|
|
134
|
-
// let password = provisionList.find((x: any) => x.Key == 'AuthBasicPassword')?.Value;
|
|
135
|
-
data = { userName: providerInfo === null || providerInfo === void 0 ? void 0 : providerInfo.AuthBasicUsername, password: providerInfo === null || providerInfo === void 0 ? void 0 : providerInfo.AuthBasicPassword };
|
|
136
|
-
}
|
|
137
|
-
return data;
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
GetBearerToken(authType, authValue) {
|
|
141
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
-
let token = "";
|
|
143
|
-
var provisionList = authValue ? JSON.parse(authValue) : null;
|
|
144
|
-
if (!Array.isArray(provisionList))
|
|
145
|
-
return "";
|
|
146
|
-
const providerInfo = Object.fromEntries(provisionList.map((item) => [item.Key, item.Value]));
|
|
147
|
-
// if (provisionList != null) {
|
|
148
|
-
// let userName = provisionList.find((x: any) => x.Key == 'AuthBearerUsername')?.Value;
|
|
149
|
-
// let password = provisionList.find((x: any) => x.Key == 'AuthBearerPassword')?.Value;
|
|
150
|
-
// let payload = { userName, username: userName, password };
|
|
151
|
-
// let strContentType = await this.GetContentType(ContentType.applicationJson);
|
|
152
|
-
// let url = provisionList.find((x: any) => x.Key == 'AuthBearerURL')?.Value;
|
|
153
|
-
// let config: AxiosRequestConfig<any> = {
|
|
154
|
-
// headers: {
|
|
155
|
-
// "Content-Type": strContentType
|
|
156
|
-
// }
|
|
157
|
-
// }
|
|
158
|
-
// let response = await axios.post(url, payload, config);
|
|
159
|
-
// if (response.status == 200) {
|
|
160
|
-
// let tokenName = provisionList.find((x: any) => x.Key == 'AuthBearerToken')?.Value;
|
|
161
|
-
// let provisionData = response.data;
|
|
162
|
-
// token = provisionData[tokenName];
|
|
163
|
-
// }
|
|
164
|
-
// }
|
|
165
|
-
if (provisionList != null) {
|
|
166
|
-
let payload = { userName: providerInfo === null || providerInfo === void 0 ? void 0 : providerInfo.AuthBearerUsername, username: providerInfo === null || providerInfo === void 0 ? void 0 : providerInfo.AuthBearerUsername, password: providerInfo === null || providerInfo === void 0 ? void 0 : providerInfo.AuthBearerPassword };
|
|
167
|
-
let strContentType = yield this.GetContentType(ContentType.applicationJson);
|
|
168
|
-
let config = {
|
|
169
|
-
headers: {
|
|
170
|
-
"Content-Type": strContentType
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
let response = yield axios.post(providerInfo.AuthBearerURL, payload, config);
|
|
174
|
-
if (response.status == 200) {
|
|
175
|
-
let tokenName = providerInfo === null || providerInfo === void 0 ? void 0 : providerInfo.AuthBearerToken;
|
|
176
|
-
let provisionData = response.data;
|
|
177
|
-
token = provisionData[tokenName];
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return token;
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
GetContentType(contentType) {
|
|
184
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
185
|
-
let responeValue = "";
|
|
186
|
-
switch (contentType) {
|
|
187
|
-
case ContentType.applicationJson:
|
|
188
|
-
responeValue = "application/json";
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
return responeValue;
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
GetOAuthToken(authValue) {
|
|
195
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
196
|
-
if (!authValue)
|
|
197
|
-
return "";
|
|
198
|
-
const provisionList = JSON.parse(authValue);
|
|
199
|
-
if (!Array.isArray(provisionList))
|
|
200
|
-
return "";
|
|
201
|
-
const providerInfo = Object.fromEntries(provisionList.map((item) => [item.Key, item.Value]));
|
|
202
|
-
// 🔹 Step 1: If no token → fetch new one
|
|
203
|
-
if (!providerInfo.Token) {
|
|
204
|
-
const tokenInfo = yield this.GetOAuthAccessToken(providerInfo);
|
|
205
|
-
providerInfo.Token = tokenInfo.access_token || tokenInfo.accessToken;
|
|
206
|
-
providerInfo.RefreshToken = tokenInfo.refresh_token || tokenInfo.refreshToken;
|
|
207
|
-
providerInfo.Expire = yield this.SetTokenExpiry(tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.expires_in);
|
|
208
|
-
}
|
|
209
|
-
// 🔹 Step 2: Check expiry
|
|
210
|
-
const isExpired = !providerInfo.Expire || Number(providerInfo.Expire) <= Date.now();
|
|
211
|
-
if (isExpired && providerInfo.RefreshToken) {
|
|
212
|
-
const refreshTokenInfo = yield this.GetOAuthRefreshToken(providerInfo);
|
|
213
|
-
providerInfo.Token = refreshTokenInfo.access_token || refreshTokenInfo.accessToken;
|
|
214
|
-
providerInfo.Expire = yield this.SetTokenExpiry(refreshTokenInfo === null || refreshTokenInfo === void 0 ? void 0 : refreshTokenInfo.expires_in);
|
|
215
|
-
}
|
|
216
|
-
// 🔹 Final return (FIXED)
|
|
217
|
-
return providerInfo.Token || "";
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
// private async GetOAuthURL(providerInfo: Record<OAuthKeys, string>) {
|
|
221
|
-
// try {
|
|
222
|
-
// const scope = providerInfo?.Scope;
|
|
223
|
-
// const tokenKey = providerInfo.CodeVerifier || await this.ssmService.getParameterValue('SIGNING_KEY');
|
|
224
|
-
// const code_verifier = (await this._hashService.getHashedDataString(`${tokenKey}${userId}`)).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
|
225
|
-
// const code_challenge = (await this._hashService.getHashedDataString(code_verifier)).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
|
226
|
-
// let code_challenge_method = providerInfo.CodeChallangeMethod || "S256";
|
|
227
|
-
// return `${providerInfo.AuthURL}?client_id=${providerInfo.ClientId}&redirect_uri=${encodeURIComponent(providerInfo.CallBackURL)}&scope=${scope}&code_challenge=${code_challenge}&code_challenge_method=${code_challenge_method}&state=${userId}`;
|
|
228
|
-
// } catch (error) {
|
|
229
|
-
// console.error("Error in generating OAuth URL");
|
|
230
|
-
// throw error;
|
|
231
|
-
// }
|
|
232
|
-
// }
|
|
233
|
-
GetOAuthAccessToken(providerInfo) {
|
|
234
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
235
|
-
try {
|
|
236
|
-
const formUrlEncoded = (x) => __awaiter(this, void 0, void 0, function* () {
|
|
237
|
-
return yield Object.keys(x).reduce((acc, c) => __awaiter(this, void 0, void 0, function* () {
|
|
238
|
-
let p = yield acc;
|
|
239
|
-
return p + `&${c}=${encodeURIComponent(x[c])}`;
|
|
240
|
-
}), Promise.resolve(''));
|
|
241
|
-
});
|
|
242
|
-
let url = providerInfo.AccessTokenURL; //oauth/v3/token if not work
|
|
243
|
-
const formData = yield formUrlEncoded({
|
|
244
|
-
grant_type: "authorization_code",
|
|
245
|
-
client_id: providerInfo.ClientId,
|
|
246
|
-
client_secret: providerInfo.ClientSecret,
|
|
247
|
-
redirect_uri: providerInfo.CallBackURL,
|
|
248
|
-
// code: queryParam.code,
|
|
249
|
-
// code_verifier: codeVerifier
|
|
250
|
-
});
|
|
251
|
-
const tokenInfo = yield axios.post(url, formData, { headers: { "Content-Type": 'application/x-www-form-urlencoded' } }).then((res) => {
|
|
252
|
-
return res.data;
|
|
253
|
-
}).catch((err) => {
|
|
254
|
-
console.error(JSON.stringify(err));
|
|
255
|
-
console.error("Error in Axios call of Token Validation" + err);
|
|
256
|
-
throw err;
|
|
257
|
-
});
|
|
258
|
-
return tokenInfo;
|
|
259
|
-
}
|
|
260
|
-
catch (error) {
|
|
261
|
-
throw error;
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
GetOAuthRefreshToken(providerInfo) {
|
|
266
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
267
|
-
try {
|
|
268
|
-
let url = `${providerInfo.AuthURL}?refresh_token=${providerInfo.RefreshToken}&client_id=${providerInfo.ClientId}&client_secret=${providerInfo.ClientSecret}&grant_type=refresh_token`;
|
|
269
|
-
const tokenInfo = yield axios.post(url).then((res) => {
|
|
270
|
-
return res.data;
|
|
271
|
-
}).catch((err) => {
|
|
272
|
-
console.error("Error in axios call of refresh Token");
|
|
273
|
-
throw err;
|
|
274
|
-
});
|
|
275
|
-
return tokenInfo;
|
|
276
|
-
}
|
|
277
|
-
catch (error) {
|
|
278
|
-
throw error;
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
SetTokenExpiry() {
|
|
283
|
-
return __awaiter(this, arguments, void 0, function* (expiresIn = 1800) {
|
|
284
|
-
return (Date.now() + ((expiresIn - 60) * 1000)).toString();
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
112
|
}
|
|
288
113
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../webbookEvent/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../webbookEvent/index.ts"],"names":[],"mappings":"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"}
|