@ofidj/node 1.0.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/CHANGELOG.md +60 -0
- package/QUICKSTART.md +224 -0
- package/README.md +72 -0
- package/api/FidjApiAppsCreateRequest.d.ts +20 -0
- package/api/FidjApiAppsCreateRequest.js +3 -0
- package/api/FidjApiAppsCreateResponse.d.ts +8 -0
- package/api/FidjApiAppsCreateResponse.js +3 -0
- package/api/FidjApiAppsDetailsResponse.d.ts +18 -0
- package/api/FidjApiAppsDetailsResponse.js +3 -0
- package/api/FidjApiAppsMeDetailsResponse.d.ts +6 -0
- package/api/FidjApiAppsMeDetailsResponse.js +3 -0
- package/api/FidjApiAppsOAuthStatusResponse.d.ts +5 -0
- package/api/FidjApiAppsOAuthStatusResponse.js +3 -0
- package/api/FidjApiAppsPublicResponse.d.ts +7 -0
- package/api/FidjApiAppsPublicResponse.js +3 -0
- package/api/FidjApiAppsUpdateRequest.d.ts +2 -0
- package/api/FidjApiAppsUpdateRequest.js +3 -0
- package/api/FidjApiAppsUsersResponse.d.ts +7 -0
- package/api/FidjApiAppsUsersResponse.js +3 -0
- package/api/FidjApiConsentsHistoryResponse.d.ts +10 -0
- package/api/FidjApiConsentsHistoryResponse.js +3 -0
- package/api/FidjApiConsentsResponse.d.ts +9 -0
- package/api/FidjApiConsentsResponse.js +3 -0
- package/api/FidjApiConsentsUpdateRequest.d.ts +8 -0
- package/api/FidjApiConsentsUpdateRequest.js +3 -0
- package/api/FidjApiContractsCreateRequest.d.ts +5 -0
- package/api/FidjApiContractsCreateRequest.js +3 -0
- package/api/FidjApiContractsListResponse.d.ts +10 -0
- package/api/FidjApiContractsListResponse.js +3 -0
- package/api/FidjApiContractsUpdateRequest.d.ts +3 -0
- package/api/FidjApiContractsUpdateRequest.js +3 -0
- package/api/FidjApiErrorResponse.d.ts +3 -0
- package/api/FidjApiErrorResponse.js +3 -0
- package/api/FidjApiOAuthTokenRequest.d.ts +8 -0
- package/api/FidjApiOAuthTokenRequest.js +3 -0
- package/api/FidjApiOAuthTokenResponse.d.ts +6 -0
- package/api/FidjApiOAuthTokenResponse.js +3 -0
- package/api/FidjApiStatusResponse.d.ts +8 -0
- package/api/FidjApiStatusResponse.js +3 -0
- package/api/FidjApiTokensCreateRequest.d.ts +8 -0
- package/api/FidjApiTokensCreateRequest.js +3 -0
- package/api/FidjApiTokensCreateResponse.d.ts +7 -0
- package/api/FidjApiTokensCreateResponse.js +3 -0
- package/api/FidjApiUsersCreateRequest.d.ts +7 -0
- package/api/FidjApiUsersCreateRequest.js +3 -0
- package/api/FidjApiUsersCreateResponse.d.ts +13 -0
- package/api/FidjApiUsersCreateResponse.js +3 -0
- package/api/FidjApiUsersForgotRequest.d.ts +3 -0
- package/api/FidjApiUsersForgotRequest.js +3 -0
- package/api/FidjApiUsersMeDetailsResponse.d.ts +13 -0
- package/api/FidjApiUsersMeDetailsResponse.js +3 -0
- package/api/FidjApiUsersMeResponse.d.ts +6 -0
- package/api/FidjApiUsersMeResponse.js +3 -0
- package/api/FidjApiUsersMeUpdateRequest.d.ts +4 -0
- package/api/FidjApiUsersMeUpdateRequest.js +3 -0
- package/api/index.d.ts +26 -0
- package/api/index.js +50 -0
- package/bpInfo.d.ts +3 -0
- package/bpInfo.js +5 -0
- package/connection/Ajax.d.ts +65 -0
- package/connection/Ajax.js +230 -0
- package/connection/Client.d.ts +38 -0
- package/connection/Client.js +278 -0
- package/connection/ClientToken.d.ts +6 -0
- package/connection/ClientToken.js +12 -0
- package/connection/ClientTokens.d.ts +8 -0
- package/connection/ClientTokens.js +13 -0
- package/connection/ClientUser.d.ts +6 -0
- package/connection/ClientUser.js +12 -0
- package/connection/Connection.d.ts +65 -0
- package/connection/Connection.js +613 -0
- package/connection/Interfaces.d.ts +3 -0
- package/connection/Interfaces.js +3 -0
- package/connection/OwnerUser.d.ts +9 -0
- package/connection/OwnerUser.js +60 -0
- package/connection/index.d.ts +8 -0
- package/connection/index.js +25 -0
- package/index.d.ts +5 -0
- package/index.js +23 -0
- package/package.json +71 -0
- package/sdk/FidjError.d.ts +8 -0
- package/sdk/FidjError.js +18 -0
- package/sdk/FidjNodeService.d.ts +77 -0
- package/sdk/FidjNodeService.js +682 -0
- package/sdk/IService.d.ts +38 -0
- package/sdk/IService.js +3 -0
- package/sdk/Interfaces.d.ts +67 -0
- package/sdk/Interfaces.js +11 -0
- package/sdk/LoggerService.d.ts +9 -0
- package/sdk/LoggerService.js +37 -0
- package/sdk/index.d.ts +6 -0
- package/sdk/index.js +25 -0
- package/session/Session.d.ts +28 -0
- package/session/Session.js +398 -0
- package/session/index.d.ts +1 -0
- package/session/index.js +18 -0
- package/tools/Base64.d.ts +7 -0
- package/tools/Base64.js +50 -0
- package/tools/Storage.d.ts +32 -0
- package/tools/Storage.js +132 -0
- package/tools/Xor.d.ts +7 -0
- package/tools/Xor.js +36 -0
- package/tools/index.d.ts +3 -0
- package/tools/index.js +20 -0
|
@@ -0,0 +1,613 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.Connection = void 0;
|
|
13
|
+
const sdk_1 = require("../sdk");
|
|
14
|
+
const tools_1 = require("../tools");
|
|
15
|
+
const Ajax_1 = require("./Ajax");
|
|
16
|
+
const ClientUser_1 = require("./ClientUser");
|
|
17
|
+
const ClientTokens_1 = require("./ClientTokens");
|
|
18
|
+
const ClientToken_1 = require("./ClientToken");
|
|
19
|
+
class Connection {
|
|
20
|
+
constructor(_sdk, _storage, _logger) {
|
|
21
|
+
this._sdk = _sdk;
|
|
22
|
+
this._storage = _storage;
|
|
23
|
+
this._logger = _logger;
|
|
24
|
+
this.client = null;
|
|
25
|
+
this.user = null;
|
|
26
|
+
}
|
|
27
|
+
isReady() {
|
|
28
|
+
return !!this.client && this.client.isReady();
|
|
29
|
+
}
|
|
30
|
+
init(fidjVersion, fidjId, fidjCrypto, apiEndpoint) {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
this.fidjId = fidjId;
|
|
33
|
+
this.fidjVersion = fidjVersion;
|
|
34
|
+
this.fidjCrypto = fidjCrypto;
|
|
35
|
+
this.apiEndpoint = apiEndpoint;
|
|
36
|
+
this._accessToken = 'v2.accessToken.' + this.fidjId;
|
|
37
|
+
this._accessTokenPrevious = 'v2.accessTokenPrevious.' + this.fidjId;
|
|
38
|
+
this._idToken = 'v2.idToken.' + this.fidjId;
|
|
39
|
+
this._refreshToken = 'v2.refreshToken.' + this.fidjId;
|
|
40
|
+
this._states = 'v2.states.' + this.fidjId;
|
|
41
|
+
this._cryptoSalt = 'v2.cryptoSalt.' + this.fidjId;
|
|
42
|
+
this._cryptoSaltNext = 'v2.cryptoSalt.next.' + this.fidjId;
|
|
43
|
+
this.cryptoSalt = this._storage.get(this._cryptoSalt) || null;
|
|
44
|
+
this.cryptoSaltNext = this._storage.get(this._cryptoSaltNext) || null;
|
|
45
|
+
this.accessToken = this._storage.get(this._accessToken) || null;
|
|
46
|
+
this.accessTokenPrevious = this._storage.get(this._accessTokenPrevious) || null;
|
|
47
|
+
this.idToken = this._storage.get(this._idToken) || null;
|
|
48
|
+
this.refreshToken = this._storage.get(this._refreshToken) || null;
|
|
49
|
+
this.states = this._storage.get(this._states) || {};
|
|
50
|
+
this.apis = [];
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
destroy(force) {
|
|
54
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
55
|
+
this._storage.remove(this._accessToken);
|
|
56
|
+
this._storage.remove(this._idToken);
|
|
57
|
+
this._storage.remove(this._refreshToken);
|
|
58
|
+
this._storage.remove(this._states);
|
|
59
|
+
if (this.accessToken) {
|
|
60
|
+
this.accessTokenPrevious = this.accessToken;
|
|
61
|
+
this._storage.set(this._accessTokenPrevious, this.accessTokenPrevious);
|
|
62
|
+
}
|
|
63
|
+
if (force) {
|
|
64
|
+
this._storage.remove(this._cryptoSalt);
|
|
65
|
+
this._storage.remove(this._cryptoSaltNext);
|
|
66
|
+
this._storage.remove(this._accessTokenPrevious);
|
|
67
|
+
}
|
|
68
|
+
this.user = null;
|
|
69
|
+
if (this.client) {
|
|
70
|
+
// this.client.setClientId(null);
|
|
71
|
+
yield this.client.logout();
|
|
72
|
+
}
|
|
73
|
+
this.accessToken = null;
|
|
74
|
+
this.idToken = null;
|
|
75
|
+
this.refreshToken = null;
|
|
76
|
+
this.states = {}; // new Map<string, boolean>();
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
setClient(client) {
|
|
80
|
+
this.client = client;
|
|
81
|
+
// if (!this.user) {
|
|
82
|
+
// this.user = new ClientUser();
|
|
83
|
+
// }
|
|
84
|
+
// this._user._id = this._client.clientId;
|
|
85
|
+
// this.user._name = JSON.parse(this.getIdPayload({name: ''})).name;
|
|
86
|
+
}
|
|
87
|
+
setUser(user) {
|
|
88
|
+
this.user = user;
|
|
89
|
+
if (this.client && this.user.id) {
|
|
90
|
+
this.client.setClientId(this.user.id);
|
|
91
|
+
// store only clientId
|
|
92
|
+
// delete this.user._id;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
getUser() {
|
|
96
|
+
return this.user;
|
|
97
|
+
}
|
|
98
|
+
getClient() {
|
|
99
|
+
return this.client;
|
|
100
|
+
}
|
|
101
|
+
setCryptoSalt(value) {
|
|
102
|
+
if (this.cryptoSalt !== value && this.cryptoSaltNext !== value) {
|
|
103
|
+
this.cryptoSaltNext = value;
|
|
104
|
+
this._storage.set(this._cryptoSaltNext, this.cryptoSaltNext);
|
|
105
|
+
}
|
|
106
|
+
if (!this.cryptoSalt) {
|
|
107
|
+
this.setCryptoSaltAsVerified();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
setCryptoSaltAsVerified() {
|
|
111
|
+
if (this.cryptoSaltNext) {
|
|
112
|
+
this.cryptoSalt = this.cryptoSaltNext;
|
|
113
|
+
this._storage.set(this._cryptoSalt, this.cryptoSalt);
|
|
114
|
+
}
|
|
115
|
+
this.cryptoSaltNext = null;
|
|
116
|
+
this._storage.remove(this._cryptoSaltNext);
|
|
117
|
+
}
|
|
118
|
+
encrypt(data) {
|
|
119
|
+
if (typeof data !== 'string') {
|
|
120
|
+
data = JSON.stringify(data);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const dataAsObj = { string: data };
|
|
124
|
+
data = JSON.stringify(dataAsObj);
|
|
125
|
+
}
|
|
126
|
+
if (this.fidjCrypto && this.cryptoSalt) {
|
|
127
|
+
const key = this.cryptoSalt;
|
|
128
|
+
return tools_1.Xor.encrypt(data, key);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
return data;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
decrypt(data) {
|
|
135
|
+
let decrypted = null;
|
|
136
|
+
try {
|
|
137
|
+
if (this.fidjCrypto && this.cryptoSaltNext) {
|
|
138
|
+
const key = this.cryptoSaltNext;
|
|
139
|
+
decrypted = tools_1.Xor.decrypt(data, key);
|
|
140
|
+
decrypted = JSON.parse(decrypted);
|
|
141
|
+
// if (decrypted) {
|
|
142
|
+
// this.setCryptoSaltAsVerified();
|
|
143
|
+
// }
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
decrypted = null;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
if (!decrypted && this.fidjCrypto && this.cryptoSalt) {
|
|
151
|
+
const key = this.cryptoSalt;
|
|
152
|
+
decrypted = tools_1.Xor.decrypt(data, key);
|
|
153
|
+
decrypted = JSON.parse(decrypted);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
decrypted = null;
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
if (!decrypted && this.fidjCrypto && this.cryptoSalt) {
|
|
161
|
+
const key = this.cryptoSalt;
|
|
162
|
+
decrypted = tools_1.Xor.decrypt(data, key, true);
|
|
163
|
+
decrypted = JSON.parse(decrypted);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
decrypted = null;
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
if (!decrypted) {
|
|
171
|
+
decrypted = JSON.parse(data);
|
|
172
|
+
}
|
|
173
|
+
if (decrypted && decrypted.string) {
|
|
174
|
+
decrypted = decrypted.string;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
decrypted = null;
|
|
179
|
+
}
|
|
180
|
+
return decrypted;
|
|
181
|
+
}
|
|
182
|
+
isLogin() {
|
|
183
|
+
let exp = true;
|
|
184
|
+
try {
|
|
185
|
+
const payload = this.refreshToken.split('.')[1];
|
|
186
|
+
const decoded = JSON.parse(tools_1.Base64.decode(payload));
|
|
187
|
+
exp = new Date().getTime() / 1000 >= decoded.exp;
|
|
188
|
+
}
|
|
189
|
+
catch (e) {
|
|
190
|
+
// If there's an error parsing the token, keep exp as true (not logged in)
|
|
191
|
+
}
|
|
192
|
+
return !exp;
|
|
193
|
+
}
|
|
194
|
+
isConnected() {
|
|
195
|
+
var _a;
|
|
196
|
+
return (_a = this.client) === null || _a === void 0 ? void 0 : _a.status();
|
|
197
|
+
}
|
|
198
|
+
// todo reintegrate client.login()
|
|
199
|
+
logout() {
|
|
200
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
201
|
+
return this.getClient().logout(this.refreshToken);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
getClientId() {
|
|
205
|
+
if (!this.client) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
return this.client.clientId;
|
|
209
|
+
}
|
|
210
|
+
getIdToken() {
|
|
211
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
212
|
+
return this.idToken;
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
getIdPayload(def) {
|
|
216
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
217
|
+
const idToken = yield this.getIdToken();
|
|
218
|
+
try {
|
|
219
|
+
let payload;
|
|
220
|
+
if (idToken) {
|
|
221
|
+
payload = idToken.split('.')[1];
|
|
222
|
+
}
|
|
223
|
+
if (payload) {
|
|
224
|
+
return tools_1.Base64.decode(payload);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (e) {
|
|
228
|
+
this._logger.log('fidj.connection.getIdPayload pb: ', def, e);
|
|
229
|
+
}
|
|
230
|
+
if (def) {
|
|
231
|
+
if (typeof def !== 'string') {
|
|
232
|
+
def = JSON.stringify(def);
|
|
233
|
+
}
|
|
234
|
+
return def;
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
getAccessPayload(def) {
|
|
240
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
241
|
+
if (def && typeof def !== 'string') {
|
|
242
|
+
def = JSON.stringify(def);
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
const payload = this.accessToken.split('.')[1];
|
|
246
|
+
if (payload) {
|
|
247
|
+
return tools_1.Base64.decode(payload);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch (e) {
|
|
251
|
+
// If there's an error parsing the token, return the default value
|
|
252
|
+
}
|
|
253
|
+
return def ? def : null;
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
getPreviousAccessPayload(def) {
|
|
257
|
+
if (def && typeof def !== 'string') {
|
|
258
|
+
def = JSON.stringify(def);
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
const payload = this.accessTokenPrevious.split('.')[1];
|
|
262
|
+
if (payload) {
|
|
263
|
+
return tools_1.Base64.decode(payload);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
// If there's an error parsing the previous token, return the default value
|
|
268
|
+
}
|
|
269
|
+
return def ? def : null;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* @throws ErrorInterface
|
|
273
|
+
*/
|
|
274
|
+
refreshConnection() {
|
|
275
|
+
return __awaiter(this, arguments, void 0, function* (force = false) {
|
|
276
|
+
if (force) {
|
|
277
|
+
this.removingCurrentTokens();
|
|
278
|
+
}
|
|
279
|
+
// token not expired : ok
|
|
280
|
+
if (this.accessToken) {
|
|
281
|
+
const payload = this.accessToken.split('.')[1];
|
|
282
|
+
const decoded = tools_1.Base64.decode(payload);
|
|
283
|
+
const notExpired = new Date().getTime() / 1000 < JSON.parse(decoded).exp;
|
|
284
|
+
// console.log('new Date().getTime() < JSON.parse(decoded).exp :', (new Date().getTime() / 1000), JSON.parse(decoded).exp);
|
|
285
|
+
this._logger.log('fidj.connection.connection.refreshConnection : token not expired ? ', notExpired);
|
|
286
|
+
if (notExpired) {
|
|
287
|
+
return this.updatedClientTokens();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// remove expired refreshToken
|
|
291
|
+
if (this.refreshToken) {
|
|
292
|
+
const payload = this.refreshToken.split('.')[1];
|
|
293
|
+
const decoded = tools_1.Base64.decode(payload);
|
|
294
|
+
const expired = new Date().getTime() / 1000 >= JSON.parse(decoded).exp;
|
|
295
|
+
this._logger.log('fidj.connection.connection.refreshConnection : refreshToken not expired ? ', expired);
|
|
296
|
+
if (expired) {
|
|
297
|
+
this._storage.remove(this._refreshToken);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// remove expired accessToken & idToken & store it as Previous one
|
|
301
|
+
this.removingCurrentTokens();
|
|
302
|
+
// refresh authentication
|
|
303
|
+
this._logger.log('fidj.connection.connection.refreshConnection : refresh authentication.');
|
|
304
|
+
const client = this.getClient();
|
|
305
|
+
if (!client) {
|
|
306
|
+
throw new sdk_1.FidjError(400, 'Need an initialized client.');
|
|
307
|
+
}
|
|
308
|
+
const { createdAccessToken, createdIdToken } = yield this.client.reAuthenticate(this.refreshToken);
|
|
309
|
+
this.accessToken = createdAccessToken.data;
|
|
310
|
+
this.idToken = createdIdToken.data;
|
|
311
|
+
return this.updatedClientTokens();
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
setConnection(clientTokens) {
|
|
315
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
316
|
+
if (!clientTokens) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
// only in private storage
|
|
320
|
+
if (clientTokens.accessToken) {
|
|
321
|
+
this.accessToken = clientTokens.accessToken.data;
|
|
322
|
+
this._storage.set(this._accessToken, this.accessToken);
|
|
323
|
+
const salt = JSON.parse(yield this.getAccessPayload({ salt: '' })).salt;
|
|
324
|
+
if (salt) {
|
|
325
|
+
this.setCryptoSalt(salt);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (clientTokens.idToken) {
|
|
329
|
+
this.idToken = clientTokens.idToken.data;
|
|
330
|
+
this._storage.set(this._idToken, this.idToken);
|
|
331
|
+
}
|
|
332
|
+
if (clientTokens.refreshToken) {
|
|
333
|
+
this.refreshToken = clientTokens.refreshToken.data;
|
|
334
|
+
this._storage.set(this._refreshToken, this.refreshToken);
|
|
335
|
+
}
|
|
336
|
+
// store changed states
|
|
337
|
+
this._storage.set(this._states, this.states);
|
|
338
|
+
// expose roles, message
|
|
339
|
+
const clientUser = new ClientUser_1.ClientUser(clientTokens.username, clientTokens.username, JSON.parse(yield this.getIdPayload({ roles: [] })).roles);
|
|
340
|
+
this.setUser(clientUser);
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
setConnectionOffline(options) {
|
|
344
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
345
|
+
if (options.accessToken) {
|
|
346
|
+
this.accessToken = options.accessToken;
|
|
347
|
+
this._storage.set(this._accessToken, this.accessToken);
|
|
348
|
+
}
|
|
349
|
+
if (options.idToken) {
|
|
350
|
+
this.idToken = options.idToken;
|
|
351
|
+
this._storage.set(this._idToken, this.idToken);
|
|
352
|
+
}
|
|
353
|
+
if (options.refreshToken) {
|
|
354
|
+
this.refreshToken = options.refreshToken;
|
|
355
|
+
this._storage.set(this._refreshToken, this.refreshToken);
|
|
356
|
+
}
|
|
357
|
+
this.setUser(new ClientUser_1.ClientUser('demo', 'demo', JSON.parse(yield this.getIdPayload({ roles: [] })).roles));
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
getApiEndpoints(options) {
|
|
361
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
362
|
+
if (this.apiEndpoint) {
|
|
363
|
+
return [{ key: 'fidj.override', url: this.apiEndpoint, blocked: false }];
|
|
364
|
+
}
|
|
365
|
+
let ea = [
|
|
366
|
+
{ key: 'fidj.default', url: 'https://api.fidj.ovh/v3', blocked: false },
|
|
367
|
+
];
|
|
368
|
+
let filteredEa = [];
|
|
369
|
+
if (!this._sdk.prod) {
|
|
370
|
+
ea = [
|
|
371
|
+
{ key: 'fidj.default', url: 'http://localhost:3201/v3', blocked: false },
|
|
372
|
+
{ key: 'fidj.default', url: 'https://api.sandbox.fidj.ovh/v3', blocked: false },
|
|
373
|
+
];
|
|
374
|
+
}
|
|
375
|
+
if (this.accessToken) {
|
|
376
|
+
const val = yield this.getAccessPayload({ apis: [] });
|
|
377
|
+
const apiEndpoints = JSON.parse(val).apis;
|
|
378
|
+
if (apiEndpoints && apiEndpoints.length) {
|
|
379
|
+
ea = [];
|
|
380
|
+
apiEndpoints.forEach((endpoint) => {
|
|
381
|
+
if (endpoint.url) {
|
|
382
|
+
ea.push(endpoint);
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
if (this.accessTokenPrevious) {
|
|
388
|
+
const apiEndpoints = JSON.parse(this.getPreviousAccessPayload({ apis: [] })).apis;
|
|
389
|
+
if (apiEndpoints && apiEndpoints.length) {
|
|
390
|
+
apiEndpoints.forEach((endpoint) => {
|
|
391
|
+
if (endpoint.url && ea.filter((r) => r.url === endpoint.url).length === 0) {
|
|
392
|
+
ea.push(endpoint);
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
this._logger.log('fidj.sdk.connection.getApiEndpoints : ', ea, this.states);
|
|
398
|
+
let couldCheckStates = true;
|
|
399
|
+
if (this.states && Object.keys(this.states).length) {
|
|
400
|
+
for (let i = 0; i < ea.length && couldCheckStates; i++) {
|
|
401
|
+
if (!this.states[ea[i].url]) {
|
|
402
|
+
couldCheckStates = false;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
couldCheckStates = false;
|
|
408
|
+
}
|
|
409
|
+
if (options === null || options === void 0 ? void 0 : options.filter) {
|
|
410
|
+
if (couldCheckStates && options.filter === 'theBestOne') {
|
|
411
|
+
for (let i = 0; i < ea.length && filteredEa.length === 0; i++) {
|
|
412
|
+
const endpoint = ea[i];
|
|
413
|
+
if (this.states[endpoint.url] && this.states[endpoint.url].state) {
|
|
414
|
+
filteredEa.push(endpoint);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
else if (couldCheckStates && options.filter === 'theBestOldOne') {
|
|
419
|
+
let bestOldOne;
|
|
420
|
+
for (let i = 0; i < ea.length; i++) {
|
|
421
|
+
const endpoint = ea[i];
|
|
422
|
+
if (this.states[endpoint.url] &&
|
|
423
|
+
this.states[endpoint.url].lastTimeWasOk &&
|
|
424
|
+
(!bestOldOne ||
|
|
425
|
+
this.states[endpoint.url].lastTimeWasOk >
|
|
426
|
+
this.states[bestOldOne.url].lastTimeWasOk)) {
|
|
427
|
+
bestOldOne = endpoint;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
if (bestOldOne) {
|
|
431
|
+
filteredEa.push(bestOldOne);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
else if (ea.length) {
|
|
435
|
+
filteredEa.push(ea[0]);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
filteredEa = ea;
|
|
440
|
+
}
|
|
441
|
+
return filteredEa;
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
getDBs(options) {
|
|
445
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
446
|
+
if (!this.accessToken) {
|
|
447
|
+
return [];
|
|
448
|
+
}
|
|
449
|
+
// todo test random DB connection
|
|
450
|
+
const random = Math.random() % 2;
|
|
451
|
+
let dbs = JSON.parse(yield this.getAccessPayload({ dbs: [] })).dbs || [];
|
|
452
|
+
// need to synchronize db
|
|
453
|
+
if (random === 0) {
|
|
454
|
+
dbs = dbs.sort();
|
|
455
|
+
}
|
|
456
|
+
else if (random === 1) {
|
|
457
|
+
dbs = dbs.reverse();
|
|
458
|
+
}
|
|
459
|
+
let filteredDBs = [];
|
|
460
|
+
let couldCheckStates = true;
|
|
461
|
+
if (this.states && Object.keys(this.states).length) {
|
|
462
|
+
for (let i = 0; i < dbs.length && couldCheckStates; i++) {
|
|
463
|
+
if (!this.states[dbs[i].url]) {
|
|
464
|
+
couldCheckStates = false;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
couldCheckStates = false;
|
|
470
|
+
}
|
|
471
|
+
if (couldCheckStates && options && options.filter === 'theBestOne') {
|
|
472
|
+
for (let i = 0; i < dbs.length && filteredDBs.length === 0; i++) {
|
|
473
|
+
const endpoint = dbs[i];
|
|
474
|
+
if (this.states[endpoint.url] && this.states[endpoint.url].state) {
|
|
475
|
+
filteredDBs.push(endpoint);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
else if (couldCheckStates && options && options.filter === 'theBestOnes') {
|
|
480
|
+
for (let i = 0; i < dbs.length; i++) {
|
|
481
|
+
const endpoint = dbs[i];
|
|
482
|
+
if (this.states[endpoint.url] && this.states[endpoint.url].state) {
|
|
483
|
+
filteredDBs.push(endpoint);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
else if (options && options.filter === 'theBestOne' && dbs.length) {
|
|
488
|
+
filteredDBs.push(dbs[0]);
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
filteredDBs = dbs;
|
|
492
|
+
}
|
|
493
|
+
return filteredDBs;
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
verifyConnectionStates() {
|
|
497
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
498
|
+
const currentTime = new Date().getTime();
|
|
499
|
+
// todo need verification ? not yet (cache)
|
|
500
|
+
// if (Object.keys(this.states).length > 0) {
|
|
501
|
+
// const time = this.states[Object.keys(this.states)[0]].time;
|
|
502
|
+
// if (currentTime < time) {
|
|
503
|
+
// return Promise.resolve();
|
|
504
|
+
// }
|
|
505
|
+
// }
|
|
506
|
+
// verify via GET status on Endpoints & DBs
|
|
507
|
+
this.states = {};
|
|
508
|
+
this.apis = yield this.getApiEndpoints();
|
|
509
|
+
for (const api of this.apis) {
|
|
510
|
+
let endpointUrl = api.url;
|
|
511
|
+
if (!endpointUrl) {
|
|
512
|
+
endpointUrl = api.toString();
|
|
513
|
+
}
|
|
514
|
+
const verified = yield this.verifyApiState(currentTime, endpointUrl);
|
|
515
|
+
}
|
|
516
|
+
const dbs = yield this.getDBs();
|
|
517
|
+
for (const db of dbs) {
|
|
518
|
+
let dbEndpoint = db.url;
|
|
519
|
+
if (!dbEndpoint) {
|
|
520
|
+
dbEndpoint = db.toString();
|
|
521
|
+
}
|
|
522
|
+
const verified = yield this.verifyDbState(currentTime, dbEndpoint);
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
updatedClientTokens() {
|
|
527
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
528
|
+
const accessToken = new ClientToken_1.ClientToken(this.getClientId(), 'accessToken', this.accessToken);
|
|
529
|
+
const idToken = new ClientToken_1.ClientToken(this.getClientId(), 'idToken', this.idToken);
|
|
530
|
+
const refreshToken = new ClientToken_1.ClientToken(this.getClientId(), 'refreshToken', this.refreshToken);
|
|
531
|
+
const clientTokens = new ClientTokens_1.ClientTokens(this.getClientId(), accessToken, idToken, refreshToken);
|
|
532
|
+
yield this.setConnection(clientTokens);
|
|
533
|
+
return clientTokens;
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
removingCurrentTokens() {
|
|
537
|
+
if (this.accessToken) {
|
|
538
|
+
this.accessTokenPrevious = this.accessToken;
|
|
539
|
+
this._storage.set(this._accessTokenPrevious, this.accessTokenPrevious);
|
|
540
|
+
}
|
|
541
|
+
this._storage.remove(this._accessToken);
|
|
542
|
+
this._storage.remove(this._idToken);
|
|
543
|
+
this.accessToken = null;
|
|
544
|
+
this.idToken = null;
|
|
545
|
+
}
|
|
546
|
+
verifyApiState(currentTime, endpointUrl) {
|
|
547
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
548
|
+
try {
|
|
549
|
+
this._logger.log('fidj.sdk.connection.verifyApiState : ', currentTime, endpointUrl);
|
|
550
|
+
const data = (yield new Ajax_1.Ajax().get({
|
|
551
|
+
url: endpointUrl + '/status?isOk=' + this._sdk.version,
|
|
552
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
553
|
+
timeout: sdk_1.FidjNodeService.DEFAULT_TIMEOUT_MS,
|
|
554
|
+
})).data;
|
|
555
|
+
let state = false;
|
|
556
|
+
if (data && data.isOk) {
|
|
557
|
+
state = true;
|
|
558
|
+
}
|
|
559
|
+
this.states[endpointUrl] = {
|
|
560
|
+
state: state,
|
|
561
|
+
time: currentTime,
|
|
562
|
+
lastTimeWasOk: currentTime,
|
|
563
|
+
};
|
|
564
|
+
this._logger.log('fidj.sdk.connection.verifyApiState > states : ', this.states);
|
|
565
|
+
}
|
|
566
|
+
catch (err) {
|
|
567
|
+
this._logger.log('fidj.sdk.connection.verifyApiState > catch pb - states : ', endpointUrl);
|
|
568
|
+
let lastTimeWasOk = 0;
|
|
569
|
+
if (this.states[endpointUrl]) {
|
|
570
|
+
lastTimeWasOk = this.states[endpointUrl].lastTimeWasOk;
|
|
571
|
+
}
|
|
572
|
+
this.states[endpointUrl] = {
|
|
573
|
+
state: false,
|
|
574
|
+
time: currentTime,
|
|
575
|
+
lastTimeWasOk: lastTimeWasOk,
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
// store states
|
|
579
|
+
this._storage.set(this._states, this.states);
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
verifyDbState(currentTime, dbEndpoint) {
|
|
583
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
584
|
+
try {
|
|
585
|
+
// console.log('verifyDbState: ', dbEndpoint);
|
|
586
|
+
yield new Ajax_1.Ajax().get({
|
|
587
|
+
url: dbEndpoint,
|
|
588
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
589
|
+
timeout: sdk_1.FidjNodeService.DEFAULT_TIMEOUT_MS,
|
|
590
|
+
});
|
|
591
|
+
this.states[dbEndpoint] = { state: true, time: currentTime, lastTimeWasOk: currentTime };
|
|
592
|
+
// resolve();
|
|
593
|
+
// console.log('verifyDbState: state', dbEndpoint, true);
|
|
594
|
+
}
|
|
595
|
+
catch (err) {
|
|
596
|
+
let lastTimeWasOk = 0;
|
|
597
|
+
if (this.states[dbEndpoint]) {
|
|
598
|
+
lastTimeWasOk = this.states[dbEndpoint].lastTimeWasOk;
|
|
599
|
+
}
|
|
600
|
+
this.states[dbEndpoint] = {
|
|
601
|
+
state: false,
|
|
602
|
+
time: currentTime,
|
|
603
|
+
lastTimeWasOk: lastTimeWasOk,
|
|
604
|
+
};
|
|
605
|
+
// resolve();
|
|
606
|
+
}
|
|
607
|
+
// store states
|
|
608
|
+
this._storage.set(this._states, this.states);
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
exports.Connection = Connection;
|
|
613
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25uZWN0aW9uL0Nvbm5lY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQ0EsZ0NBUWdCO0FBQ2hCLG9DQUFtRDtBQUNuRCxpQ0FBNEI7QUFFNUIsNkNBQXdDO0FBQ3hDLGlEQUE0QztBQUM1QywrQ0FBMEM7QUFFMUMsTUFBYSxVQUFVO0lBdUJuQixZQUNZLElBQWtCLEVBQ2xCLFFBQXNCLEVBQ3RCLE9BQXdCO1FBRnhCLFNBQUksR0FBSixJQUFJLENBQWM7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBYztRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUVoQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsT0FBTztRQUNILE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUssSUFBSSxDQUFDLFdBQW1CLEVBQUUsTUFBYyxFQUFFLFVBQW1CLEVBQUUsV0FBb0I7O1lBQ3JGLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBRS9CLElBQUksQ0FBQyxZQUFZLEdBQUcsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNwRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcseUJBQXlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNwRSxJQUFJLENBQUMsUUFBUSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFD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
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25uZWN0aW9uL0ludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|