sunuid-sdk 1.0.54 → 1.0.56

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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # 🔒 SunuID JavaScript SDK - Version 1.0.52
1
+ # 🔒 SunuID JavaScript SDK - Version 1.0.54
2
2
 
3
3
  SDK JavaScript sécurisé pour l'intégration des QR codes d'authentification et KYC SunuID.
4
4
 
@@ -17,7 +17,7 @@ npm install sunuid-sdk
17
17
  <script src="https://cdn.socket.io/4.7.4/socket.io.min.js"></script>
18
18
 
19
19
  <!-- SunuID SDK -->
20
- <script src="https://unpkg.com/sunuid-sdk@1.0.52/dist/sunuid-sdk.min.js"></script>
20
+ <script src="https://unpkg.com/sunuid-sdk@1.0.54/dist/sunuid-sdk.min.js"></script>
21
21
  ```
22
22
 
23
23
  ### Via Yarn
@@ -439,6 +439,24 @@ npm run test:coverage
439
439
  npm run security-check
440
440
  ```
441
441
 
442
+ ## 🆕 Dernières Améliorations (v1.0.54)
443
+
444
+ ### 🔄 Dépendances Mises à Jour
445
+ - **Rollup** : 3.x → 4.x (performance améliorée)
446
+ - **ESLint** : 8.x → 9.x (nouvelles règles de sécurité)
447
+ - **Jest** : 29.x → 30.x (tests modernisés)
448
+ - **Plugins Rollup** : Versions les plus récentes
449
+
450
+ ### 🚀 Améliorations de Performance
451
+ - Build plus rapide avec Rollup 4.x
452
+ - Meilleure optimisation du code
453
+ - Support amélioré des navigateurs modernes
454
+
455
+ ### 🛡️ Sécurité Renforcée
456
+ - ESLint 9.x avec nouvelles règles de sécurité
457
+ - Validation des entrées améliorée
458
+ - Logs de sécurité plus détaillés
459
+
442
460
  ## 📚 Documentation
443
461
 
444
462
  - [Guide de Sécurisation](docs/SECURITY_GUIDE.md)
@@ -478,7 +478,7 @@ function _unsupportedIterableToArray(r, a) {
478
478
  key: "secureInit",
479
479
  value: (function () {
480
480
  var _secureInit = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
481
- var initData, response, result, decodedToken, _t2;
481
+ var _result$response, _result$response2, _result$data, _result$response3, _result$data2, _result$response4, _result$data3, initData, response, result, token, decodedToken, clientId, secretId, apiUrl, _t2;
482
482
  return _regenerator().w(function (_context3) {
483
483
  while (1) switch (_context3.p = _context3.n) {
484
484
  case 0:
@@ -517,44 +517,56 @@ function _unsupportedIterableToArray(r, a) {
517
517
  }
518
518
  throw new Error(result.error || 'Erreur lors de l\'initialisation sécurisée');
519
519
  case 4:
520
- // Stocker le token et les données sécurisées
521
- this.config.token = result.data.token;
522
- this.config.apiUrl = result.data.api_url;
520
+ // Extraire le token depuis différents chemins possibles
521
+ token = (result === null || result === void 0 || (_result$response = result.response) === null || _result$response === void 0 || (_result$response = _result$response.response) === null || _result$response === void 0 ? void 0 : _result$response.token) || (result === null || result === void 0 || (_result$response2 = result.response) === null || _result$response2 === void 0 ? void 0 : _result$response2.token) || (result === null || result === void 0 || (_result$data = result.data) === null || _result$data === void 0 ? void 0 : _result$data.token) || (result === null || result === void 0 ? void 0 : result.token);
522
+ if (!(!token || typeof token !== 'string')) {
523
+ _context3.n = 5;
524
+ break;
525
+ }
526
+ throw new Error('Token non trouvé dans la réponse');
527
+ case 5:
528
+ // Stocker le token
529
+ this.config.token = token;
523
530
 
524
531
  // Décoder le token pour récupérer les credentials
525
- decodedToken = this.decodeSecureToken(result.data.token);
532
+ decodedToken = this.decodeSecureToken(token);
526
533
  if (!decodedToken) {
527
- _context3.n = 5;
534
+ _context3.n = 6;
528
535
  break;
529
536
  }
530
- this.config.clientId = decodedToken.client_id;
531
- this.config.secretId = decodedToken.secret_id;
532
- _context3.n = 6;
537
+ clientId = decodedToken.clientId || decodedToken.client_id;
538
+ secretId = decodedToken.secretId || decodedToken.secret_id;
539
+ apiUrl = decodedToken.apiUrl || decodedToken.api_url;
540
+ if (clientId) this.config.clientId = clientId;
541
+ if (secretId) this.config.secretId = secretId;
542
+ if (apiUrl) this.config.apiUrl = apiUrl;
543
+ _context3.n = 7;
533
544
  break;
534
- case 5:
535
- throw new Error('Impossible de décoder le token sécurisé');
536
545
  case 6:
537
- this.config.expiresIn = result.data.expires_in;
538
- this.config.maxRequests = result.data.max_requests;
546
+ throw new Error('Impossible de décoder le token sécurisé');
547
+ case 7:
548
+ // Récupérer expiration et limites depuis la réponse si présentes
549
+ this.config.expiresIn = (result === null || result === void 0 || (_result$response3 = result.response) === null || _result$response3 === void 0 ? void 0 : _result$response3.expires_in) || (result === null || result === void 0 || (_result$data2 = result.data) === null || _result$data2 === void 0 ? void 0 : _result$data2.expires_in) || (result === null || result === void 0 ? void 0 : result.expires_in) || this.config.expiresIn;
550
+ this.config.maxRequests = (result === null || result === void 0 || (_result$response4 = result.response) === null || _result$response4 === void 0 ? void 0 : _result$response4.max_requests) || (result === null || result === void 0 || (_result$data3 = result.data) === null || _result$data3 === void 0 ? void 0 : _result$data3.max_requests) || (result === null || result === void 0 ? void 0 : result.max_requests) || this.config.maxRequests;
539
551
  this.config.requestCount = 0;
540
552
  this.logSecurityEvent('SECURE_INIT_SUCCESS', {
541
- expiresIn: result.data.expires_in,
542
- maxRequests: result.data.max_requests
553
+ expiresIn: this.config.expiresIn,
554
+ maxRequests: this.config.maxRequests
543
555
  });
544
556
  console.log('✅ Initialisation sécurisée réussie');
545
- _context3.n = 8;
557
+ _context3.n = 9;
546
558
  break;
547
- case 7:
548
- _context3.p = 7;
559
+ case 8:
560
+ _context3.p = 8;
549
561
  _t2 = _context3.v;
550
562
  this.logSecurityEvent('SECURE_INIT_ERROR', {
551
563
  error: _t2.message
552
564
  });
553
565
  throw new Error("\xC9chec de l'initialisation s\xE9curis\xE9e: ".concat(_t2.message));
554
- case 8:
566
+ case 9:
555
567
  return _context3.a(2);
556
568
  }
557
- }, _callee3, this, [[0, 7]]);
569
+ }, _callee3, this, [[0, 8]]);
558
570
  }));
559
571
  function secureInit() {
560
572
  return _secureInit.apply(this, arguments);
@@ -569,21 +581,29 @@ function _unsupportedIterableToArray(r, a) {
569
581
  key: "decodeSecureToken",
570
582
  value: function decodeSecureToken(token) {
571
583
  try {
572
- var parts = token.split('.');
573
- if (parts.length !== 2) {
574
- console.error('❌ Format de token invalide');
575
- return null;
576
- }
577
- var _parts = _slicedToArray(parts, 2),
578
- payload = _parts[0],
579
- signature = _parts[1];
584
+ if (!token || typeof token !== 'string') return null;
580
585
 
581
- // Décoder le payload (base64)
582
- var decodedPayload = atob(payload);
583
- var tokenData = JSON.parse(decodedPayload);
586
+ // Helper: décodage base64/base64url avec padding
587
+ var decodeBase64Any = function decodeBase64Any(str) {
588
+ var s = String(str).replace(/-/g, '+').replace(/_/g, '/');
589
+ while (s.length % 4 !== 0) s += '=';
590
+ return atob(s);
591
+ };
592
+ var tokenData = null;
593
+ if (token.includes('.')) {
594
+ // JWT-like: header.payload.signature ou header.payload
595
+ var parts = token.split('.');
596
+ var payloadPart = parts.length >= 2 ? parts[1] : parts[0];
597
+ var json = decodeBase64Any(payloadPart);
598
+ tokenData = JSON.parse(json);
599
+ } else {
600
+ // Base64("{json}") simple
601
+ var _json = decodeBase64Any(token);
602
+ tokenData = JSON.parse(_json);
603
+ }
584
604
 
585
- // Vérifier l'expiration
586
- if (tokenData.exp && tokenData.exp < Date.now() / 1000) {
605
+ // Vérifier l'expiration (en secondes)
606
+ if (tokenData && tokenData.exp && Number(tokenData.exp) < Math.floor(Date.now() / 1000)) {
587
607
  console.error('❌ Token expiré');
588
608
  return null;
589
609
  }