@osimatic/helpers-js 1.0.88 → 1.0.89

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.
Files changed (3) hide show
  1. package/http_client.js +349 -0
  2. package/index.js +2 -1
  3. package/package.json +1 -1
package/http_client.js ADDED
@@ -0,0 +1,349 @@
1
+
2
+ class HTTPClient {
3
+ static setRefreshTokenUrl(url) {
4
+ HTTPClient.refreshTokenUrl = url;
5
+ }
6
+
7
+ static setRefreshTokenCallback(callback) {
8
+ HTTPClient.refreshTokenCallback = callback;
9
+ }
10
+
11
+ static getHeaders(asObject) {
12
+ HTTPClient.setAuthorizationToken(JwtSession.getToken());
13
+
14
+ if (typeof HTTPClient.headers == 'undefined') {
15
+ HTTPClient.headers = {};
16
+ }
17
+
18
+ if (typeof asObject != 'undefined' && asObject) {
19
+ return HTTPClient.headers;
20
+ }
21
+
22
+ let httpHeaders = new Headers();
23
+ Object.entries(HTTPClient.headers).forEach(([key, value]) => {
24
+ httpHeaders.append(key, value);
25
+ });
26
+
27
+ return httpHeaders;
28
+ }
29
+
30
+ static getHeader(key) {
31
+ if (typeof HTTPClient.headers == 'undefined') {
32
+ HTTPClient.headers = {};
33
+ }
34
+
35
+ return HTTPClient.headers[key];
36
+ }
37
+
38
+ static setHeader(key, value) {
39
+ if (typeof HTTPClient.headers == 'undefined') {
40
+ HTTPClient.headers = {};
41
+ }
42
+
43
+ HTTPClient.headers[key] = value;
44
+ }
45
+
46
+ static setAuthorizationToken(authorizationToken) {
47
+ if (typeof HTTPClient.headers == 'undefined') {
48
+ HTTPClient.headers = {};
49
+ }
50
+
51
+ HTTPClient.headers['Authorization'] = 'Bearer ' + authorizationToken;
52
+ }
53
+
54
+ static convertObjectToFormData(obj) {
55
+ // 30/05/2022 : ancienne version, qui ne fonctionne pas avec des tableaux
56
+ // let formData = new FormData();
57
+ // Object.entries(data).forEach(([key, value]) => formData.append(key, value));
58
+ // return formData;
59
+
60
+ let formData = new FormData();
61
+
62
+ function appendFormData(data, root) {
63
+ //console.log('appendFormData', data, root);
64
+ root = root || '';
65
+ if (data instanceof File) {
66
+ formData.append(root, data);
67
+ }
68
+ else if (Array.isArray(data)) {
69
+ for (let i = 0; i < data.length; i++) {
70
+ appendFormData(data[i], root + '[' + i + ']');
71
+ }
72
+ }
73
+ else if (typeof data === 'object' && data) {
74
+ for (let key in data) {
75
+ if (data.hasOwnProperty(key)) {
76
+ if (root === '') {
77
+ appendFormData(data[key], key);
78
+ } else {
79
+ appendFormData(data[key], root + '.' + key);
80
+ }
81
+ }
82
+ }
83
+ }
84
+ else {
85
+ if (data !== null && typeof data !== 'undefined') {
86
+ formData.append(root, data);
87
+ }
88
+ }
89
+ }
90
+
91
+ appendFormData(obj);
92
+
93
+ return formData;
94
+ }
95
+
96
+ static formatQueryString(data) {
97
+ if (data == null) {
98
+ return '';
99
+ }
100
+ if (typeof data == 'object') {
101
+ data = UrlAndQueryString.buildQuery(data);
102
+ }
103
+ if (data !== '' && data.substring(0, 1) !== '&') {
104
+ data = '&' + data;
105
+ }
106
+ return data;
107
+ }
108
+
109
+ static formatFormData(data) {
110
+ if (!(data instanceof FormData)) {
111
+ return HTTPClient.convertObjectToFormData(data);
112
+ }
113
+ return data;
114
+ }
115
+
116
+ static logRequestFailure(response, json) {
117
+ console.error('Request failure. Status: '+response.statusText+' ; HTTP Code : '+response.status, json);
118
+ }
119
+
120
+ static isExpiredToken(response, json) {
121
+ if (response.status !== 401) {
122
+ return false;
123
+ }
124
+
125
+ return (
126
+ response.statusText === 'Expired JWT Token'
127
+ || (typeof json['message'] != 'undefined' && json['message'] === 'Expired JWT Token')
128
+ || (typeof json['error'] != 'undefined' && json['error'] === 'expired_token')
129
+ || (typeof json['error'] != 'undefined' && json['error'] === 'authentification_failure')
130
+ || (json === 'expired_token')
131
+ || (json === 'authentification_failure')
132
+ );
133
+ }
134
+
135
+ static async request(method, url, data, successCallback, errorCallback, formErrorCallback) {
136
+ method = method.toUpperCase();
137
+
138
+ if ('POST' !== method) {
139
+ url += (!url.includes('?') ? '?' : '') + HTTPClient.formatQueryString(data);
140
+ data = null;
141
+ }
142
+
143
+ if (!window.fetch) {
144
+ return;
145
+ }
146
+
147
+ console.log(HTTPClient.getHeaders());
148
+ let requestOptions = {
149
+ method: method,
150
+ headers: HTTPClient.getHeaders(),
151
+ mode: 'cors',
152
+ cache: 'no-cache'
153
+ }
154
+
155
+ if ('POST' === method) {
156
+ requestOptions['body'] = HTTPClient.formatFormData(data);
157
+ }
158
+
159
+ const response = await fetch(url, requestOptions);
160
+
161
+ let jsonData = {};
162
+ try {
163
+ if (response.status !== 204 && response.statusText !== 'No Content') {
164
+ jsonData = await response.json();
165
+ }
166
+
167
+ if (HTTPClient.isExpiredToken(response, jsonData)) {
168
+ HTTPClient.refreshToken(() => HTTPClient.request(method, url, data, successCallback, errorCallback, formErrorCallback), errorCallback);
169
+ return;
170
+ }
171
+
172
+ if (response.ok) {
173
+ if (typeof successCallback != 'undefined' && successCallback != null) {
174
+ successCallback(jsonData, response);
175
+ }
176
+ return;
177
+ }
178
+
179
+ if (response.status === 400 && typeof formErrorCallback != 'undefined' && formErrorCallback != null) {
180
+ formErrorCallback(jsonData, response);
181
+ return;
182
+ }
183
+ }
184
+ catch (e) {
185
+ console.error(e);
186
+ if (typeof errorCallback != 'undefined' && errorCallback != null) {
187
+ errorCallback(response);
188
+ }
189
+ return;
190
+ }
191
+
192
+ HTTPClient.logRequestFailure(response, jsonData);
193
+ if (typeof errorCallback != 'undefined' && errorCallback != null) {
194
+ errorCallback(response, jsonData);
195
+ }
196
+ }
197
+
198
+ static async download(method, url, data, errorCallback, completeCallback) {
199
+ method = typeof method == 'undefined' || null == method ? 'GET' : method;
200
+
201
+ if ('POST' !== method) {
202
+ url += (!url.includes('?') ? '?' : '') + HTTPClient.formatQueryString(data);
203
+ data = null;
204
+ }
205
+
206
+ if (!window.fetch) {
207
+ return;
208
+ }
209
+
210
+ let requestOptions = {
211
+ method: method,
212
+ headers: HTTPClient.getHeaders(),
213
+ mode: 'cors',
214
+ cache: 'no-cache'
215
+ }
216
+
217
+ if ('POST' === method) {
218
+ requestOptions['body'] = HTTPClient.formatFormData(data);
219
+ }
220
+
221
+ const response = await fetch(url, requestOptions);
222
+ try {
223
+ if (response.status === 401 && response.statusText === 'Expired JWT Token') {
224
+ HTTPClient.refreshToken(() => HTTPClient.download(method, url, data, errorCallback, completeCallback), errorCallback);
225
+ return;
226
+ }
227
+
228
+ if (response.ok) {
229
+ const blobData = await response.blob();
230
+ File.download(blobData, response.headers.get('content-type'), response.headers.get('content-disposition'));
231
+ }
232
+ else {
233
+ HTTPClient.logRequestFailure(response, null);
234
+ if (typeof errorCallback != 'undefined' && errorCallback != null) {
235
+ errorCallback(response);
236
+ }
237
+ }
238
+ }
239
+ catch (e) {
240
+ console.error(e);
241
+ if (typeof errorCallback != 'undefined' && errorCallback != null) {
242
+ errorCallback(response);
243
+ }
244
+ }
245
+ if (typeof completeCallback != 'undefined' && completeCallback != null) {
246
+ completeCallback(response);
247
+ }
248
+ }
249
+
250
+ static refreshToken(completeCallback, errorCallback) {
251
+ if (typeof HTTPClient.listCompleteCallbackAfterRefreshTokenFinished == 'undefined') {
252
+ HTTPClient.listCompleteCallbackAfterRefreshTokenFinished = [];
253
+ }
254
+ HTTPClient.listCompleteCallbackAfterRefreshTokenFinished.push(completeCallback);
255
+ //HTTPClient.addCompleteCallbackAfterRefreshTokenFinished(completeCallback);
256
+
257
+ // S'il y a déjà un appel à refresh token effectué, on le refait pas (le completeCallback est dans une liste de callback à exécuter apres la fin du refresh token)
258
+ if (typeof HTTPClient.refreshTokenStarted == 'undefined' || HTTPClient.refreshTokenStarted) {
259
+ return;
260
+ }
261
+
262
+ function onRefreshTokenComplete() {
263
+ HTTPClient.refreshTokenStarted = false;
264
+
265
+ // On exécute les completeCallback qui était en attente de la requete refresh token
266
+ if (typeof HTTPClient.listCompleteCallbackAfterRefreshTokenFinished != 'undefined') {
267
+ HTTPClient.listCompleteCallbackAfterRefreshTokenFinished.forEach(callback => typeof callback == 'function' ? callback() : null);
268
+ }
269
+ }
270
+
271
+ HTTPClient.refreshTokenStarted = true;
272
+
273
+ if (typeof HTTPClient.refreshTokenCallback == 'function') {
274
+ HTTPClient.refreshTokenCallback(onRefreshTokenComplete);
275
+ return;
276
+ }
277
+
278
+ if (typeof HTTPClient.refreshTokenUrl == 'undefined') {
279
+ console.error('URL refresh token non définie. Appeler HTTPClient.setRefreshTokenUrl(url)');
280
+ return;
281
+ }
282
+
283
+ let payload = new FormData();
284
+ payload.append('refresh_token', JwtSession.getRefreshToken());
285
+
286
+ HTTPClient.request('POST', HTTPClient.refreshTokenUrl, payload,
287
+ (data) => {
288
+ JwtSession.setToken(data['token']);
289
+ JwtSession.setRefreshToken(data['refresh_token']);
290
+
291
+ HTTPClient.setAuthorizationToken(JwtSession.getToken());
292
+
293
+ onRefreshTokenComplete();
294
+
295
+ },
296
+ () => {
297
+ JwtSession.logout();
298
+ errorCallback();
299
+ }
300
+ );
301
+ }
302
+
303
+ static sendRequest(url, strParam, methode, formatRetour, callback) {
304
+ let xhr = null;
305
+
306
+ if (window.XMLHttpRequest || window.ActiveXObject) {
307
+ if (window.ActiveXObject) {
308
+ try {
309
+ xhr = new ActiveXObject('Msxml2.XMLHTTP');
310
+ } catch (e) {
311
+ xhr = new ActiveXObject('Microsoft.XMLHTTP');
312
+ }
313
+ } else {
314
+ xhr = new XMLHttpRequest();
315
+ }
316
+ } else {
317
+ // Votre navigateur ne supporte pas l'objet XMLHTTPRequest!
318
+ return null;
319
+ }
320
+
321
+ xhr.onreadystatechange = function () {
322
+ if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
323
+ let data;
324
+ if (formatRetour == 'xml') {
325
+ data = xhr.responseXML;
326
+ }
327
+ else {
328
+ data = eval('(' + xhr.responseText + ')');
329
+ }
330
+ callback(data);
331
+ }
332
+ };
333
+
334
+ if (methode === 'POST') {
335
+ xhr.open('POST', url, true);
336
+ xhr.send();
337
+ }
338
+ else {
339
+ xhr.open('GET', url + '?' + strParam, true);
340
+ xhr.send(null);
341
+ }
342
+ return false;
343
+ }
344
+
345
+ }
346
+
347
+ require('whatwg-fetch'); //fetch polyfill loaded in window.fetch
348
+
349
+ module.exports = { HTTPClient };
package/index.js CHANGED
@@ -7,6 +7,7 @@ require('./array');
7
7
  require('./number');
8
8
 
9
9
  // exports d'ojets non natif
10
+ const { HTTPClient } = require('./http_client');
10
11
  const { HTTPRequest, Cookie, UrlAndQueryString } = require('./network');
11
12
  const { IBAN, BankCard } = require('./bank');
12
13
  const { AudioMedia, UserMedia } = require('./media');
@@ -47,7 +48,7 @@ const { WebSocket } = require('./web_socket');
47
48
 
48
49
  module.exports = {
49
50
  Array, Object, Number, String,
50
- HTTPRequest, Cookie, UrlAndQueryString, IBAN, BankCard, AudioMedia, UserMedia, PersonName, Email, TelephoneNumber, DateTime, TimestampUnix, SqlDate, SqlTime, SqlDateTime, Duration, File, CSV, Img, FormHelper, Country, PostalAddress, GeographicCoordinates, HexColor, RgbColor, SocialNetwork,
51
+ HTTPClient, HTTPRequest, Cookie, UrlAndQueryString, IBAN, BankCard, AudioMedia, UserMedia, PersonName, Email, TelephoneNumber, DateTime, TimestampUnix, SqlDate, SqlTime, SqlDateTime, Duration, File, CSV, Img, FormHelper, Country, PostalAddress, GeographicCoordinates, HexColor, RgbColor, SocialNetwork,
51
52
  Browser, DataTable, Pagination, Navigation, DetailsSubArray, SelectAll, MultipleActionInTable, MultipleActionInDivList, EditValue, FormDate, InputPeriod, ShoppingCart, FlashMessage, CountDown, ImportFromCsv, JwtToken, JwtSession, ApiTokenSession, ListBox, WebRTC, WebSocket, EventBus,
52
53
  sleep, refresh, chr, ord, trim, empty,
53
54
  GoogleCharts, GoogleRecaptcha, GoogleMap, OpenStreetMap
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@osimatic/helpers-js",
3
- "version": "1.0.88",
3
+ "version": "1.0.89",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"