@mattrglobal/verifier-sdk-web 1.1.1-unstable.16 → 1.1.1-unstable.161

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.
@@ -7,7 +7,7 @@
7
7
  * Do Not Translate or Localize
8
8
  *
9
9
  * Bundle of @mattrglobal/verifier-sdk-web
10
- * Generated: 2025-01-15
10
+ * Generated: 2025-05-20
11
11
  * Version: 1.1.0
12
12
  * Dependencies:
13
13
  *
@@ -446,148 +446,137 @@ ResultAsync.fromPromise;
446
446
 
447
447
  ResultAsync.fromSafePromise;
448
448
 
449
- function ownKeys(e, r) {
450
- var t = Object.keys(e);
451
- if (Object.getOwnPropertySymbols) {
452
- var o = Object.getOwnPropertySymbols(e);
453
- r && (o = o.filter((function(r) {
454
- return Object.getOwnPropertyDescriptor(e, r).enumerable;
455
- }))), t.push.apply(t, o);
456
- }
457
- return t;
458
- }
459
-
460
- function _objectSpread2(e) {
461
- for (var r = 1; r < arguments.length; r++) {
462
- var t = null != arguments[r] ? arguments[r] : {};
463
- r % 2 ? ownKeys(Object(t), !0).forEach((function(r) {
464
- _defineProperty(e, r, t[r]);
465
- })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach((function(r) {
466
- Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
467
- }));
468
- }
469
- return e;
470
- }
471
-
472
- function _typeof(o) {
473
- "@babel/helpers - typeof";
474
- return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
475
- return typeof o;
476
- } : function(o) {
477
- return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
478
- }, _typeof(o);
479
- }
480
-
481
- function _defineProperty(obj, key, value) {
482
- key = _toPropertyKey(key);
483
- if (key in obj) {
484
- Object.defineProperty(obj, key, {
485
- value: value,
486
- enumerable: true,
487
- configurable: true,
488
- writable: true
489
- });
490
- } else {
491
- obj[key] = value;
492
- }
493
- return obj;
494
- }
495
-
496
- function _toConsumableArray(arr) {
497
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
498
- }
499
-
500
- function _arrayWithoutHoles(arr) {
501
- if (Array.isArray(arr)) return _arrayLikeToArray(arr);
449
+ function _arrayLikeToArray(r, a) {
450
+ (null == a || a > r.length) && (a = r.length);
451
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
452
+ return n;
502
453
  }
503
454
 
504
- function _iterableToArray(iter) {
505
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
455
+ function _arrayWithoutHoles(r) {
456
+ if (Array.isArray(r)) return _arrayLikeToArray(r);
506
457
  }
507
458
 
508
- function _unsupportedIterableToArray(o, minLen) {
509
- if (!o) return;
510
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
511
- var n = Object.prototype.toString.call(o).slice(8, -1);
512
- if (n === "Object" && o.constructor) n = o.constructor.name;
513
- if (n === "Map" || n === "Set") return Array.from(o);
514
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
515
- }
516
-
517
- function _arrayLikeToArray(arr, len) {
518
- if (len == null || len > arr.length) len = arr.length;
519
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
520
- return arr2;
521
- }
522
-
523
- function _nonIterableSpread() {
524
- throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
525
- }
526
-
527
- function _createForOfIteratorHelper(o, allowArrayLike) {
528
- var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
529
- if (!it) {
530
- if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
531
- if (it) o = it;
532
- var i = 0;
533
- var F = function() {};
459
+ function _createForOfIteratorHelper(r, e) {
460
+ var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
461
+ if (!t) {
462
+ if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
463
+ t && (r = t);
464
+ var n = 0, F = function() {};
534
465
  return {
535
466
  s: F,
536
467
  n: function() {
537
- if (i >= o.length) return {
538
- done: true
539
- };
540
- return {
541
- done: false,
542
- value: o[i++]
468
+ return n >= r.length ? {
469
+ done: !0
470
+ } : {
471
+ done: !1,
472
+ value: r[n++]
543
473
  };
544
474
  },
545
- e: function(e) {
546
- throw e;
475
+ e: function(r) {
476
+ throw r;
547
477
  },
548
478
  f: F
549
479
  };
550
480
  }
551
481
  throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
552
482
  }
553
- var normalCompletion = true, didErr = false, err;
483
+ var o, a = !0, u = !1;
554
484
  return {
555
485
  s: function() {
556
- it = it.call(o);
486
+ t = t.call(r);
557
487
  },
558
488
  n: function() {
559
- var step = it.next();
560
- normalCompletion = step.done;
561
- return step;
489
+ var r = t.next();
490
+ return a = r.done, r;
562
491
  },
563
- e: function(e) {
564
- didErr = true;
565
- err = e;
492
+ e: function(r) {
493
+ u = !0, o = r;
566
494
  },
567
495
  f: function() {
568
496
  try {
569
- if (!normalCompletion && it.return != null) it.return();
497
+ a || null == t.return || t.return();
570
498
  } finally {
571
- if (didErr) throw err;
499
+ if (u) throw o;
572
500
  }
573
501
  }
574
502
  };
575
503
  }
576
504
 
577
- function _toPrimitive(input, hint) {
578
- if (typeof input !== "object" || input === null) return input;
579
- var prim = input[Symbol.toPrimitive];
580
- if (prim !== undefined) {
581
- var res = prim.call(input, hint || "default");
582
- if (typeof res !== "object") return res;
505
+ function _defineProperty(e, r, t) {
506
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
507
+ value: t,
508
+ enumerable: !0,
509
+ configurable: !0,
510
+ writable: !0
511
+ }) : e[r] = t, e;
512
+ }
513
+
514
+ function _iterableToArray(r) {
515
+ if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
516
+ }
517
+
518
+ function _nonIterableSpread() {
519
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
520
+ }
521
+
522
+ function ownKeys(e, r) {
523
+ var t = Object.keys(e);
524
+ if (Object.getOwnPropertySymbols) {
525
+ var o = Object.getOwnPropertySymbols(e);
526
+ r && (o = o.filter((function(r) {
527
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
528
+ }))), t.push.apply(t, o);
529
+ }
530
+ return t;
531
+ }
532
+
533
+ function _objectSpread2(e) {
534
+ for (var r = 1; r < arguments.length; r++) {
535
+ var t = null != arguments[r] ? arguments[r] : {};
536
+ r % 2 ? ownKeys(Object(t), !0).forEach((function(r) {
537
+ _defineProperty(e, r, t[r]);
538
+ })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach((function(r) {
539
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
540
+ }));
541
+ }
542
+ return e;
543
+ }
544
+
545
+ function _toConsumableArray(r) {
546
+ return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
547
+ }
548
+
549
+ function _toPrimitive(t, r) {
550
+ if ("object" != typeof t || !t) return t;
551
+ var e = t[Symbol.toPrimitive];
552
+ if (void 0 !== e) {
553
+ var i = e.call(t, r || "default");
554
+ if ("object" != typeof i) return i;
583
555
  throw new TypeError("@@toPrimitive must return a primitive value.");
584
556
  }
585
- return (hint === "string" ? String : Number)(input);
557
+ return ("string" === r ? String : Number)(t);
586
558
  }
587
559
 
588
- function _toPropertyKey(arg) {
589
- var key = _toPrimitive(arg, "string");
590
- return typeof key === "symbol" ? key : String(key);
560
+ function _toPropertyKey(t) {
561
+ var i = _toPrimitive(t, "string");
562
+ return "symbol" == typeof i ? i : i + "";
563
+ }
564
+
565
+ function _typeof(o) {
566
+ "@babel/helpers - typeof";
567
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
568
+ return typeof o;
569
+ } : function(o) {
570
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
571
+ }, _typeof(o);
572
+ }
573
+
574
+ function _unsupportedIterableToArray(r, a) {
575
+ if (r) {
576
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
577
+ var t = {}.toString.call(r).slice(8, -1);
578
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
579
+ }
591
580
  }
592
581
 
593
582
  var store;
@@ -708,6 +697,20 @@ function getDefault(schema, dataset, config2) {
708
697
  return typeof schema["default"] === "function" ? schema["default"](dataset, config2) : schema["default"];
709
698
  }
710
699
 
700
+ function any() {
701
+ return {
702
+ kind: "schema",
703
+ type: "any",
704
+ reference: any,
705
+ expects: "any",
706
+ async: false,
707
+ _run: function _run(dataset) {
708
+ dataset.typed = true;
709
+ return dataset;
710
+ }
711
+ };
712
+ }
713
+
711
714
  function array(item, message) {
712
715
  return {
713
716
  kind: "schema",
@@ -793,16 +796,36 @@ function _boolean(message) {
793
796
  };
794
797
  }
795
798
 
796
- function function_(message) {
799
+ function literal(literal_, message) {
797
800
  return {
798
801
  kind: "schema",
799
- type: "function",
800
- reference: function_,
801
- expects: "Function",
802
+ type: "literal",
803
+ reference: literal,
804
+ expects: _stringify(literal_),
802
805
  async: false,
806
+ literal: literal_,
803
807
  message: message,
804
808
  _run: function _run(dataset, config2) {
805
- if (typeof dataset.value === "function") {
809
+ if (dataset.value === this.literal) {
810
+ dataset.typed = true;
811
+ } else {
812
+ _addIssue(this, "type", dataset, config2);
813
+ }
814
+ return dataset;
815
+ }
816
+ };
817
+ }
818
+
819
+ function number(message) {
820
+ return {
821
+ kind: "schema",
822
+ type: "number",
823
+ reference: number,
824
+ expects: "number",
825
+ async: false,
826
+ message: message,
827
+ _run: function _run(dataset, config2) {
828
+ if (typeof dataset.value === "number" && !isNaN(dataset.value)) {
806
829
  dataset.typed = true;
807
830
  } else {
808
831
  _addIssue(this, "type", dataset, config2);
@@ -1307,47 +1330,21 @@ const assertType = (validator, message) => data => {
1307
1330
  }
1308
1331
  };
1309
1332
 
1310
- var SafeFetchCommonRespondErrorType;
1311
-
1312
- (function(SafeFetchCommonRespondErrorType) {
1313
- SafeFetchCommonRespondErrorType["UnexpectedRespond"] = "UnexpectedRespond";
1314
- })(SafeFetchCommonRespondErrorType || (SafeFetchCommonRespondErrorType = {}));
1315
-
1316
- var SafeFetchErrorType;
1317
-
1318
- (function(SafeFetchErrorType) {
1319
- SafeFetchErrorType["HttpError"] = "HttpError";
1320
- SafeFetchErrorType["UnknownError"] = "UnknownError";
1321
- })(SafeFetchErrorType || (SafeFetchErrorType = {}));
1322
-
1323
- const safeFetch = async (input, init) => {
1324
- try {
1325
- const response = await fetch(input, init);
1326
- if (response.status > 299 || response.status < 200) {
1327
- return err({
1328
- type: SafeFetchErrorType.HttpError,
1329
- message: `HTTP error, status = ${response.status}`,
1330
- status: response.status
1331
- });
1332
- }
1333
- return ok(response);
1334
- } catch (error) {
1335
- return err({
1336
- type: SafeFetchErrorType.UnknownError,
1337
- message: "Unknown error",
1338
- cause: error
1339
- });
1340
- }
1341
- };
1342
-
1343
1333
  exports.MobileCredentialVerificationReasonType = void 0;
1344
1334
 
1345
1335
  (function(MobileCredentialVerificationReasonType) {
1346
- MobileCredentialVerificationReasonType["Expired"] = "expired";
1347
- MobileCredentialVerificationReasonType["Inactive"] = "inactive";
1348
- MobileCredentialVerificationReasonType["StatusRevoked"] = "invalid";
1349
- MobileCredentialVerificationReasonType["StatusSuspended"] = "suspended";
1350
- MobileCredentialVerificationReasonType["StatusUnknown"] = "unknown";
1336
+ MobileCredentialVerificationReasonType["TrustedIssuerCertificateExpired"] = "TrustedIssuerCertificateExpired";
1337
+ MobileCredentialVerificationReasonType["TrustedIssuerCertificateNotYetValid"] = "TrustedIssuerCertificateNotYetValid";
1338
+ MobileCredentialVerificationReasonType["IssuerNotTrusted"] = "IssuerNotTrusted";
1339
+ MobileCredentialVerificationReasonType["MobileCredentialInvalid"] = "MobileCredentialInvalid";
1340
+ MobileCredentialVerificationReasonType["MobileCredentialExpired"] = "MobileCredentialExpired";
1341
+ MobileCredentialVerificationReasonType["MobileCredentialNotYetValid"] = "MobileCredentialNotYetValid";
1342
+ MobileCredentialVerificationReasonType["InvalidSignerCertificate"] = "InvalidSignerCertificate";
1343
+ MobileCredentialVerificationReasonType["DeviceKeyInvalid"] = "DeviceKeyInvalid";
1344
+ MobileCredentialVerificationReasonType["UnsupportedCurve"] = "UnsupportedCurve";
1345
+ MobileCredentialVerificationReasonType["StatusRevoked"] = "StatusRevoked";
1346
+ MobileCredentialVerificationReasonType["StatusSuspended"] = "StatusSuspended";
1347
+ MobileCredentialVerificationReasonType["StatusUnknown"] = "StatusUnknown";
1351
1348
  })(exports.MobileCredentialVerificationReasonType || (exports.MobileCredentialVerificationReasonType = {}));
1352
1349
 
1353
1350
  exports.ClaimType = void 0;
@@ -1382,6 +1379,15 @@ exports.OpenidPresentationCredentialProfileSupported = void 0;
1382
1379
  OpenidPresentationCredentialProfileSupported["MOBILE"] = "mobile";
1383
1380
  })(exports.OpenidPresentationCredentialProfileSupported || (exports.OpenidPresentationCredentialProfileSupported = {}));
1384
1381
 
1382
+ var PresentationStatusCode;
1383
+
1384
+ (function(PresentationStatusCode) {
1385
+ PresentationStatusCode["AwaitingRequestRetrieval"] = "AwaitingRequestRetrieval";
1386
+ PresentationStatusCode["AwaitingResponse"] = "AwaitingResponse";
1387
+ PresentationStatusCode["ResponseSubmitted"] = "ResponseSubmitted";
1388
+ PresentationStatusCode["ResultReady"] = "ResultReady";
1389
+ })(PresentationStatusCode || (PresentationStatusCode = {}));
1390
+
1385
1391
  const CredentialQueryValidator = object({
1386
1392
  profile: picklist([ exports.OpenidPresentationCredentialProfileSupported.MOBILE ]),
1387
1393
  docType: string(),
@@ -1409,18 +1415,52 @@ const PresentationResultRelaxValidator = object({
1409
1415
  error: optional(unknown())
1410
1416
  });
1411
1417
 
1418
+ exports.Mode = void 0;
1419
+
1420
+ (function(Mode) {
1421
+ Mode["SameDevice"] = "sameDevice";
1422
+ Mode["CrossDevice"] = "crossDevice";
1423
+ })(exports.Mode || (exports.Mode = {}));
1424
+
1425
+ var SessionType;
1426
+
1427
+ (function(SessionType) {
1428
+ SessionType["DigitalCredentialsApi"] = "digital-credentials-api";
1429
+ SessionType["Openid4vp"] = "openid4vp";
1430
+ })(SessionType || (SessionType = {}));
1431
+
1412
1432
  object({
1413
1433
  credentialQuery: array(CredentialQueryValidator),
1414
1434
  challenge: string(),
1415
1435
  redirectUri: optional(string()),
1416
- walletProviderId: optional(string())
1436
+ walletProviderId: optional(string()),
1437
+ dcApiSupported: optional(_boolean())
1417
1438
  });
1418
1439
 
1419
- const CreateSessionResponseValidator = object({
1440
+ const CreateSessionDigitalCredentialsValidator = object({
1441
+ type: literal(SessionType.DigitalCredentialsApi),
1420
1442
  sessionId: string(),
1443
+ sessionKey: string(),
1444
+ sessionTtl: number(),
1445
+ request: record(string(), any())
1446
+ });
1447
+
1448
+ const CreateSessionOpenId4vpResponseValidator = object({
1449
+ type: optional(literal(SessionType.Openid4vp)),
1450
+ sessionId: string(),
1451
+ sessionKey: string(),
1421
1452
  sessionUrl: string()
1422
1453
  });
1423
1454
 
1455
+ const CreateSessionResponseValidator = union([ CreateSessionDigitalCredentialsValidator, CreateSessionOpenId4vpResponseValidator ]);
1456
+
1457
+ const GetSessionStatusResponseValidator = union([ object({
1458
+ status: picklist([ PresentationStatusCode.ResultReady ]),
1459
+ responseCode: optional(string())
1460
+ }), object({
1461
+ status: string()
1462
+ }) ]);
1463
+
1424
1464
  var LocalStorageKey;
1425
1465
 
1426
1466
  (function(LocalStorageKey) {
@@ -1428,12 +1468,9 @@ var LocalStorageKey;
1428
1468
  LocalStorageKey["sessionId"] = "mattr_sid";
1429
1469
  })(LocalStorageKey || (LocalStorageKey = {}));
1430
1470
 
1431
- exports.Mode = void 0;
1471
+ const MATTR_SDK_VERSION_HEADER = "x-mattr-sdk-version";
1432
1472
 
1433
- (function(Mode) {
1434
- Mode["sameDevice"] = "sameDevice";
1435
- Mode["crossDevice"] = "crossDevice";
1436
- })(exports.Mode || (exports.Mode = {}));
1473
+ const MATTR_SDK_VERSION_VALUE = "2.0.0";
1437
1474
 
1438
1475
  var MessageEventDataType;
1439
1476
 
@@ -1443,64 +1480,163 @@ var MessageEventDataType;
1443
1480
  MessageEventDataType["PresentationAbort"] = "PresentationAbort";
1444
1481
  })(MessageEventDataType || (MessageEventDataType = {}));
1445
1482
 
1446
- const RequestCredentialsSameDeviceOptionsValidator = object({
1447
- credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1448
- redirectUri: string(),
1449
- challenge: optional(string()),
1483
+ const OpenId4vpConfigSameDeviceOptionsValidator = object({
1450
1484
  walletProviderId: optional(string()),
1451
- mode: picklist([ exports.Mode.sameDevice ])
1485
+ mode: literal(exports.Mode.SameDevice),
1486
+ redirectUri: string()
1452
1487
  });
1453
1488
 
1454
- const RequestCredentialsCrossDeviceOptionsValidator = object({
1455
- credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1456
- crossDeviceCallback: object({
1457
- onComplete: function_(),
1458
- onFailure: function_()
1459
- }),
1460
- challenge: optional(string()),
1489
+ const OpenId4vpConfigCrossDeviceOptionsValidator = object({
1461
1490
  walletProviderId: optional(string()),
1462
- mode: picklist([ exports.Mode.crossDevice ])
1491
+ mode: literal(exports.Mode.CrossDevice)
1463
1492
  });
1464
1493
 
1465
- const RequestCredentialsAutoDetectDeviceOptionsValidator = object({
1466
- credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1467
- crossDeviceCallback: object({
1468
- onComplete: function_(),
1469
- onFailure: function_()
1470
- }),
1471
- redirectUri: string(),
1472
- challenge: optional(string()),
1494
+ const OpenId4vpConfigAutoDetectOptionsValidator = object({
1473
1495
  walletProviderId: optional(string()),
1474
- mode: optional(picklist([ exports.Mode.crossDevice, exports.Mode.sameDevice ]))
1496
+ redirectUri: string(),
1497
+ mode: optional(picklist([ exports.Mode.CrossDevice, exports.Mode.SameDevice ]))
1475
1498
  });
1476
1499
 
1477
- const RequestCredentialsOptionsValidator = union([ RequestCredentialsSameDeviceOptionsValidator, RequestCredentialsCrossDeviceOptionsValidator, RequestCredentialsAutoDetectDeviceOptionsValidator ]);
1500
+ const RequestCredentialsOptionsValidator = object({
1501
+ credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1502
+ challenge: optional(string()),
1503
+ openid4vpConfiguration: optional(union([ OpenId4vpConfigSameDeviceOptionsValidator, OpenId4vpConfigCrossDeviceOptionsValidator, OpenId4vpConfigAutoDetectOptionsValidator ]))
1504
+ });
1478
1505
 
1479
1506
  exports.RequestCredentialsErrorType = void 0;
1480
1507
 
1481
1508
  (function(RequestCredentialsErrorType) {
1482
1509
  RequestCredentialsErrorType["RequestCredentialsFailed"] = "RequestCredentialsFailed";
1510
+ RequestCredentialsErrorType["Timeout"] = "Timeout";
1511
+ RequestCredentialsErrorType["Abort"] = "Abort";
1483
1512
  })(exports.RequestCredentialsErrorType || (exports.RequestCredentialsErrorType = {}));
1484
1513
 
1485
- const InitialiseOptionsValidator = object({
1486
- apiBaseUrl: string(),
1487
- applicationId: optional(string())
1514
+ var RequestCredentialsErrorMessage;
1515
+
1516
+ (function(RequestCredentialsErrorMessage) {
1517
+ RequestCredentialsErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
1518
+ RequestCredentialsErrorMessage["FailedToGetSessionStatus"] = "Failed to get session status";
1519
+ RequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
1520
+ RequestCredentialsErrorMessage["FailedToVerifyCredentialResponse"] = "Failed to verify credential response";
1521
+ RequestCredentialsErrorMessage["MissingOpenId4vpConfig"] = "Identified openid4vp session, but missing openId4vpConfiguration on `requestCredentials`";
1522
+ RequestCredentialsErrorMessage["DcApiError"] = "Failed to request credentials with Digital Credentials API";
1523
+ RequestCredentialsErrorMessage["DcApiResponseParseError"] = "Failed to parse response from Digital Credentials API";
1524
+ RequestCredentialsErrorMessage["Abort"] = "User aborted the session";
1525
+ RequestCredentialsErrorMessage["Timeout"] = "User session timeout";
1526
+ })(RequestCredentialsErrorMessage || (RequestCredentialsErrorMessage = {}));
1527
+
1528
+ exports.AbortSessionErrorType = void 0;
1529
+
1530
+ (function(AbortSessionErrorType) {
1531
+ AbortSessionErrorType["AbortSessionFailed"] = "AbortSessionFailed";
1532
+ })(exports.AbortSessionErrorType || (exports.AbortSessionErrorType = {}));
1533
+
1534
+ var AbortSessionErrorMessage;
1535
+
1536
+ (function(AbortSessionErrorMessage) {
1537
+ AbortSessionErrorMessage["FailedToAbortSession"] = "Failed to abort session";
1538
+ })(AbortSessionErrorMessage || (AbortSessionErrorMessage = {}));
1539
+
1540
+ const InitializeOptionsValidator = object({
1541
+ apiBaseUrl: pipe(string(), nonEmpty("Must not be empty")),
1542
+ applicationId: pipe(string(), nonEmpty("Must not be empty"))
1488
1543
  });
1489
1544
 
1490
- let initialiseOptions = undefined;
1545
+ var SafeFetchCommonResponseErrorType;
1491
1546
 
1492
- var InitialiseErrorMessage;
1547
+ (function(SafeFetchCommonResponseErrorType) {
1548
+ SafeFetchCommonResponseErrorType["UnexpectedResponse"] = "UnexpectedResponse";
1549
+ })(SafeFetchCommonResponseErrorType || (SafeFetchCommonResponseErrorType = {}));
1493
1550
 
1494
- (function(InitialiseErrorMessage) {
1495
- InitialiseErrorMessage["SdkNotInitialised"] = "SDK not initialised";
1496
- })(InitialiseErrorMessage || (InitialiseErrorMessage = {}));
1551
+ var SafeFetchErrorType;
1497
1552
 
1498
- const initialise = options => {
1499
- assertType(InitialiseOptionsValidator, "Invalid initialise options")(options);
1500
- initialiseOptions = options;
1553
+ (function(SafeFetchErrorType) {
1554
+ SafeFetchErrorType["HttpError"] = "HttpError";
1555
+ SafeFetchErrorType["UnknownError"] = "UnknownError";
1556
+ })(SafeFetchErrorType || (SafeFetchErrorType = {}));
1557
+
1558
+ const safeFetch = async (input, init) => {
1559
+ try {
1560
+ const headers = Object.assign(Object.assign({}, init === null || init === void 0 ? void 0 : init.headers), {
1561
+ [MATTR_SDK_VERSION_HEADER]: `verifier-sdk-web/${MATTR_SDK_VERSION_VALUE}`
1562
+ });
1563
+ const response = await fetch(input, Object.assign(Object.assign({}, init), {
1564
+ headers: headers
1565
+ }));
1566
+ if (response.status > 299 || response.status < 200) {
1567
+ return err({
1568
+ type: SafeFetchErrorType.HttpError,
1569
+ message: `HTTP error, status = ${response.status}`,
1570
+ status: response.status
1571
+ });
1572
+ }
1573
+ return ok(response);
1574
+ } catch (error) {
1575
+ return err({
1576
+ type: SafeFetchErrorType.UnknownError,
1577
+ message: "Unknown error",
1578
+ cause: error
1579
+ });
1580
+ }
1501
1581
  };
1502
1582
 
1503
- const getInitialiseOptions = () => initialiseOptions;
1583
+ let initializeOptions = undefined;
1584
+
1585
+ var InitializeErrorMessage;
1586
+
1587
+ (function(InitializeErrorMessage) {
1588
+ InitializeErrorMessage["SdkNotInitialized"] = "SDK not initialized";
1589
+ })(InitializeErrorMessage || (InitializeErrorMessage = {}));
1590
+
1591
+ const initialize = options => {
1592
+ assertType(InitializeOptionsValidator, "Invalid initialize options")(options);
1593
+ initializeOptions = options;
1594
+ };
1595
+
1596
+ const getInitializeOptions = () => initializeOptions;
1597
+
1598
+ let sessionAbortController = undefined;
1599
+
1600
+ let _sessionId = undefined;
1601
+
1602
+ let _sessionKey = undefined;
1603
+
1604
+ let _sessionTimeoutId = undefined;
1605
+
1606
+ const getActiveSession = () => {
1607
+ const sessionId = _sessionId;
1608
+ const sessionKey = _sessionKey;
1609
+ const sessionTimeoutId = _sessionTimeoutId;
1610
+ if (sessionId) {
1611
+ return {
1612
+ sessionId: sessionId,
1613
+ sessionKey: sessionKey,
1614
+ sessionTimeoutId: sessionTimeoutId
1615
+ };
1616
+ }
1617
+ return undefined;
1618
+ };
1619
+
1620
+ const setActiveSession = session => {
1621
+ const {sessionId: sessionId, sessionKey: sessionKey, sessionTimeoutId: sessionTimeoutId} = session;
1622
+ _sessionId = sessionId;
1623
+ _sessionKey = sessionKey;
1624
+ _sessionTimeoutId = sessionTimeoutId;
1625
+ const abortController = new AbortController;
1626
+ sessionAbortController = abortController;
1627
+ return abortController;
1628
+ };
1629
+
1630
+ const removeActiveSession = () => {
1631
+ sessionAbortController === null || sessionAbortController === void 0 ? void 0 : sessionAbortController.abort();
1632
+ if (_sessionTimeoutId) {
1633
+ window.clearTimeout(_sessionTimeoutId);
1634
+ }
1635
+ sessionAbortController = undefined;
1636
+ _sessionKey = undefined;
1637
+ _sessionId = undefined;
1638
+ _sessionTimeoutId = undefined;
1639
+ };
1504
1640
 
1505
1641
  var isMobile_1 = isMobile;
1506
1642
 
@@ -1537,6 +1673,24 @@ const defaultRetryDelay = attempt => Math.pow(2, attempt) * 1e3;
1537
1673
 
1538
1674
  const defaultRetry = 2;
1539
1675
 
1676
+ const withRetry = async (fn, options) => {
1677
+ const {retries: retries = defaultRetry, retryDelay: retryDelay = defaultRetryDelay, attempt: attempt = 0} = options;
1678
+ try {
1679
+ return await fn();
1680
+ } catch (err) {
1681
+ if (retries > 0) {
1682
+ const delay = typeof retryDelay === "function" ? retryDelay(attempt) : retryDelay;
1683
+ await new Promise((resolve => setTimeout(resolve, delay)));
1684
+ return await withRetry(fn, Object.assign(Object.assign({}, options), {
1685
+ retries: retries - 1,
1686
+ retryDelay: retryDelay,
1687
+ attempt: attempt + 1
1688
+ }));
1689
+ }
1690
+ throw err;
1691
+ }
1692
+ };
1693
+
1540
1694
  const withRetrySafeFetch = async (fn, options) => {
1541
1695
  const {retries: retries = defaultRetry, retryDelay: retryDelay = defaultRetryDelay, attempt: attempt = 0, retryHttpStatus: retryHttpStatus} = options;
1542
1696
  const result = await fn();
@@ -1565,17 +1719,15 @@ const getHashParamValue = (hash, param) => {
1565
1719
  return urlParams.get(param);
1566
1720
  };
1567
1721
 
1568
- const createSession = async ({credentialQuery: credentialQuery, challenge: challenge, redirectUri: redirectUri, apiBaseUrl: apiBaseUrl, applicationId: applicationId, walletProviderId: walletProviderId}) => {
1569
- const postData = Object.assign(Object.assign(Object.assign({
1722
+ const createSession = async ({credentialQuery: credentialQuery, challenge: challenge, redirectUri: redirectUri, apiBaseUrl: apiBaseUrl, walletProviderId: walletProviderId, dcApiSupported: dcApiSupported, applicationId: applicationId}) => {
1723
+ const postData = {
1570
1724
  credentialQuery: credentialQuery,
1571
- challenge: challenge
1572
- }, redirectUri ? {
1573
- redirectUri: redirectUri
1574
- } : {}), applicationId ? {
1575
- applicationId: applicationId
1576
- } : {}), walletProviderId ? {
1577
- walletProviderId: walletProviderId
1578
- } : {});
1725
+ challenge: challenge,
1726
+ applicationId: applicationId,
1727
+ redirectUri: redirectUri,
1728
+ walletProviderId: walletProviderId,
1729
+ dcApiSupported: dcApiSupported
1730
+ };
1579
1731
  const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions`, {
1580
1732
  method: "POST",
1581
1733
  headers: {
@@ -1589,8 +1741,42 @@ const createSession = async ({credentialQuery: credentialQuery, challenge: chall
1589
1741
  const data = await responseResult.value.json();
1590
1742
  if (!isType(CreateSessionResponseValidator)(data)) {
1591
1743
  return err({
1592
- type: SafeFetchCommonRespondErrorType.UnexpectedRespond,
1593
- message: "Create session return unsupported response"
1744
+ type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
1745
+ message: "Create session returned unsupported response"
1746
+ });
1747
+ }
1748
+ return ok(data);
1749
+ };
1750
+
1751
+ const abortSession = async ({apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey}) => {
1752
+ const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/abort`, {
1753
+ method: "POST",
1754
+ headers: {
1755
+ "Content-Type": "application/json",
1756
+ Authorization: `Bearer ${sessionKey}`
1757
+ }
1758
+ });
1759
+ if (responseResult.isErr()) {
1760
+ return err(responseResult.error);
1761
+ }
1762
+ return ok(undefined);
1763
+ };
1764
+
1765
+ const getSessionStatus = async ({apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey}) => {
1766
+ const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/status`, {
1767
+ method: "GET",
1768
+ headers: {
1769
+ Authorization: `Bearer ${sessionKey}`
1770
+ }
1771
+ });
1772
+ if (responseResult.isErr()) {
1773
+ return err(responseResult.error);
1774
+ }
1775
+ const data = await responseResult.value.json();
1776
+ if (!isType(GetSessionStatusResponseValidator)(data)) {
1777
+ return err({
1778
+ type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
1779
+ message: "Get session status return unsupported response"
1594
1780
  });
1595
1781
  }
1596
1782
  return ok(data);
@@ -1618,7 +1804,7 @@ const exchangeSessionResult = async ({challenge: challenge, responseCode: respon
1618
1804
  const data = await responseResult.value.json();
1619
1805
  if (!isType(PresentationResultRelaxValidator)(data)) {
1620
1806
  return err({
1621
- type: SafeFetchCommonRespondErrorType.UnexpectedRespond,
1807
+ type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
1622
1808
  message: "Exchange session result return unsupported response",
1623
1809
  details: {
1624
1810
  data: data
@@ -1633,22 +1819,7 @@ const isMobileDetect = userAgent => isMobile_2({
1633
1819
  tablet: false
1634
1820
  });
1635
1821
 
1636
- exports.CrossDeviceCallbackErrorType = void 0;
1637
-
1638
- (function(CrossDeviceCallbackErrorType) {
1639
- CrossDeviceCallbackErrorType["Timeout"] = "Timeout";
1640
- CrossDeviceCallbackErrorType["Abort"] = "Abort";
1641
- CrossDeviceCallbackErrorType["RequestCredentialsFailed"] = "RequestCredentialsFailed";
1642
- })(exports.CrossDeviceCallbackErrorType || (exports.CrossDeviceCallbackErrorType = {}));
1643
-
1644
- var CrossDeviceRequestCredentialsErrorMessage;
1645
-
1646
- (function(CrossDeviceRequestCredentialsErrorMessage) {
1647
- CrossDeviceRequestCredentialsErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
1648
- CrossDeviceRequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
1649
- CrossDeviceRequestCredentialsErrorMessage["Abort"] = "User aborted the session";
1650
- CrossDeviceRequestCredentialsErrorMessage["Timeout"] = "User session timeout";
1651
- })(CrossDeviceRequestCredentialsErrorMessage || (CrossDeviceRequestCredentialsErrorMessage = {}));
1822
+ const getVersion = () => MATTR_SDK_VERSION_VALUE;
1652
1823
 
1653
1824
  var WindowEventListenerType;
1654
1825
 
@@ -1656,10 +1827,13 @@ var WindowEventListenerType;
1656
1827
  WindowEventListenerType["message"] = "message";
1657
1828
  })(WindowEventListenerType || (WindowEventListenerType = {}));
1658
1829
 
1659
- let listener;
1830
+ let listener = undefined;
1660
1831
 
1661
1832
  const removeWindowMessageEventListener = () => {
1662
- window.removeEventListener(WindowEventListenerType.message, listener, false);
1833
+ if (listener) {
1834
+ window.removeEventListener(WindowEventListenerType.message, listener, false);
1835
+ }
1836
+ listener = undefined;
1663
1837
  };
1664
1838
 
1665
1839
  const closeCrossDeviceModal = options => {
@@ -1671,8 +1845,7 @@ const closeCrossDeviceModal = options => {
1671
1845
  };
1672
1846
 
1673
1847
  const receiveMessageHandler = options => async event => {
1674
- const {crossDeviceCallback: crossDeviceCallback, container: container, sessionId: sessionId, apiBaseUrl: apiBaseUrl, challenge: challenge} = options;
1675
- const {onComplete: onComplete, onFailure: onFailure} = crossDeviceCallback;
1848
+ const {onComplete: onComplete, onFailure: onFailure, container: container, sessionId: sessionId, apiBaseUrl: apiBaseUrl, challenge: challenge} = options;
1676
1849
  if (event.origin !== apiBaseUrl) {
1677
1850
  return;
1678
1851
  }
@@ -1686,8 +1859,8 @@ const receiveMessageHandler = options => async event => {
1686
1859
  });
1687
1860
  if (result.isErr()) {
1688
1861
  onFailure({
1689
- type: exports.CrossDeviceCallbackErrorType.RequestCredentialsFailed,
1690
- message: CrossDeviceRequestCredentialsErrorMessage.FailedToGetSessionResult
1862
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1863
+ message: RequestCredentialsErrorMessage.FailedToGetSessionResult
1691
1864
  });
1692
1865
  closeCrossDeviceModal({
1693
1866
  container: container
@@ -1695,8 +1868,9 @@ const receiveMessageHandler = options => async event => {
1695
1868
  return;
1696
1869
  }
1697
1870
  onComplete({
1698
- result: result.value,
1699
- sessionId: result.value.sessionId
1871
+ result: "challenge" in result.value ? result.value : undefined,
1872
+ sessionId: result.value.sessionId,
1873
+ sessionCompletedInRedirect: false
1700
1874
  });
1701
1875
  closeCrossDeviceModal({
1702
1876
  container: container
@@ -1705,8 +1879,8 @@ const receiveMessageHandler = options => async event => {
1705
1879
  }
1706
1880
  if (event.data.type === MessageEventDataType.PresentationTimeout) {
1707
1881
  onFailure({
1708
- type: exports.CrossDeviceCallbackErrorType.Timeout,
1709
- message: CrossDeviceRequestCredentialsErrorMessage.Timeout
1882
+ type: exports.RequestCredentialsErrorType.Timeout,
1883
+ message: RequestCredentialsErrorMessage.Timeout
1710
1884
  });
1711
1885
  closeCrossDeviceModal({
1712
1886
  container: container
@@ -1715,8 +1889,8 @@ const receiveMessageHandler = options => async event => {
1715
1889
  }
1716
1890
  if (event.data.type === MessageEventDataType.PresentationAbort) {
1717
1891
  onFailure({
1718
- type: exports.CrossDeviceCallbackErrorType.Abort,
1719
- message: CrossDeviceRequestCredentialsErrorMessage.Abort
1892
+ type: exports.RequestCredentialsErrorType.Abort,
1893
+ message: RequestCredentialsErrorMessage.Abort
1720
1894
  });
1721
1895
  closeCrossDeviceModal({
1722
1896
  container: container
@@ -1741,41 +1915,202 @@ const openCrossDeviceModal = options => {
1741
1915
  return modalContainer;
1742
1916
  };
1743
1917
 
1744
- const requestCredentialsCrossDevice = async options => {
1745
- const {challenge: challenge, walletProviderId: walletProviderId, credentialQuery: credentialQuery, crossDeviceCallback: crossDeviceCallback, initialiseOptions: initialiseOptions} = options;
1746
- const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
1747
- const createSessionResult = await createSession({
1748
- credentialQuery: credentialQuery,
1749
- challenge: challenge,
1918
+ const requestCredentialsWithCrossDevice = async options => {
1919
+ const {challenge: challenge, apiBaseUrl: apiBaseUrl, sessionUrl: sessionUrl, sessionId: sessionId, sessionKey: sessionKey} = options;
1920
+ const container = openCrossDeviceModal({
1921
+ sessionUrl: sessionUrl
1922
+ });
1923
+ return await new Promise((resolve => {
1924
+ const abortController = setActiveSession({
1925
+ sessionId: sessionId,
1926
+ sessionKey: sessionKey
1927
+ });
1928
+ abortController.signal.addEventListener("abort", (() => {
1929
+ closeCrossDeviceModal({
1930
+ container: container
1931
+ });
1932
+ resolve(err({
1933
+ type: exports.RequestCredentialsErrorType.Abort,
1934
+ message: RequestCredentialsErrorMessage.Abort
1935
+ }));
1936
+ }));
1937
+ removeWindowMessageEventListener();
1938
+ listener = receiveMessageHandler({
1939
+ container: container,
1940
+ sessionId: sessionId,
1941
+ apiBaseUrl: apiBaseUrl,
1942
+ challenge: challenge,
1943
+ onComplete: data => resolve(ok(data)),
1944
+ onFailure: error => resolve(err(error))
1945
+ });
1946
+ window.addEventListener(WindowEventListenerType.message, listener, false);
1947
+ }));
1948
+ };
1949
+
1950
+ const abortCredentialRequest = async () => {
1951
+ const initializeOptions = getInitializeOptions();
1952
+ if (!initializeOptions) {
1953
+ throw new Exception(InitializeErrorMessage.SdkNotInitialized);
1954
+ }
1955
+ const {apiBaseUrl: apiBaseUrl} = initializeOptions;
1956
+ const session = getActiveSession();
1957
+ if (!session || !session.sessionKey) {
1958
+ return ok(undefined);
1959
+ }
1960
+ const {sessionId: sessionId, sessionKey: sessionKey} = session;
1961
+ removeActiveSession();
1962
+ const abortSessionResult = await abortSession({
1750
1963
  apiBaseUrl: apiBaseUrl,
1751
- applicationId: applicationId,
1752
- walletProviderId: walletProviderId
1964
+ sessionId: sessionId,
1965
+ sessionKey: sessionKey
1753
1966
  });
1754
- if (createSessionResult.isErr()) {
1967
+ if (abortSessionResult.isErr()) {
1755
1968
  return err({
1756
- type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1757
- message: CrossDeviceRequestCredentialsErrorMessage.FailedToCreateSession,
1758
- cause: createSessionResult.error
1969
+ type: exports.AbortSessionErrorType.AbortSessionFailed,
1970
+ message: AbortSessionErrorMessage.FailedToAbortSession,
1971
+ cause: abortSessionResult.error
1759
1972
  });
1760
1973
  }
1761
- const {sessionUrl: sessionUrl, sessionId: sessionId} = createSessionResult.value;
1762
- const container = openCrossDeviceModal({
1763
- sessionUrl: sessionUrl,
1764
- crossDeviceCallback: crossDeviceCallback
1765
- });
1766
- listener = receiveMessageHandler({
1767
- crossDeviceCallback: crossDeviceCallback,
1768
- container: container,
1974
+ return ok(undefined);
1975
+ };
1976
+
1977
+ const requestCredentialsWithDigitalCredentialsApi = async options => {
1978
+ const {apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey, challenge: challenge, request: request, sessionTtl: sessionTtl} = options;
1979
+ const sessionTimeoutId = window.setTimeout((() => removeActiveSession()), sessionTtl * 1e3);
1980
+ const abortController = setActiveSession({
1769
1981
  sessionId: sessionId,
1982
+ sessionKey: sessionKey,
1983
+ sessionTimeoutId: sessionTimeoutId
1984
+ });
1985
+ const credentialResponseResult = await getCredentials(request, abortController);
1986
+ if (credentialResponseResult.isErr()) {
1987
+ await abortCredentialRequest();
1988
+ return err(credentialResponseResult.error);
1989
+ }
1990
+ const credentialResponse = credentialResponseResult.value;
1991
+ const parsedCredentialResponseResult = parseCredentialResponse(credentialResponse);
1992
+ if (parsedCredentialResponseResult.isErr()) {
1993
+ await abortCredentialRequest();
1994
+ return err(parsedCredentialResponseResult.error);
1995
+ }
1996
+ const parsedCredentialResponse = parsedCredentialResponseResult.value;
1997
+ const credentialVerificationResult = await verifyCredentialResponse({
1770
1998
  apiBaseUrl: apiBaseUrl,
1771
- challenge: challenge
1999
+ sessionId: sessionId,
2000
+ sessionKey: sessionKey,
2001
+ challenge: challenge,
2002
+ protocol: parsedCredentialResponse.protocol,
2003
+ data: parsedCredentialResponse.data
1772
2004
  });
1773
- window.addEventListener(WindowEventListenerType.message, listener, false);
2005
+ if (credentialVerificationResult.isErr()) {
2006
+ return err({
2007
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
2008
+ message: RequestCredentialsErrorMessage.FailedToVerifyCredentialResponse,
2009
+ cause: credentialVerificationResult.error
2010
+ });
2011
+ }
2012
+ const verificationResult = credentialVerificationResult.value;
1774
2013
  return ok({
2014
+ result: "challenge" in verificationResult ? verificationResult : undefined,
1775
2015
  sessionId: sessionId
1776
2016
  });
1777
2017
  };
1778
2018
 
2019
+ const getCredentials = async (request, abortController) => {
2020
+ try {
2021
+ const credentialResponse = await navigator.credentials.get(Object.assign(Object.assign({}, request), {
2022
+ signal: abortController.signal
2023
+ }));
2024
+ return ok(credentialResponse);
2025
+ } catch (exception) {
2026
+ return err({
2027
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
2028
+ message: RequestCredentialsErrorMessage.DcApiError,
2029
+ cause: exception
2030
+ });
2031
+ }
2032
+ };
2033
+
2034
+ const parseCredentialResponse = credentialResponse => {
2035
+ if (!credentialResponse) {
2036
+ return err({
2037
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
2038
+ message: RequestCredentialsErrorMessage.DcApiResponseParseError,
2039
+ details: {
2040
+ response: credentialResponse
2041
+ }
2042
+ });
2043
+ }
2044
+ if (typeof credentialResponse === "object") {
2045
+ return ok(credentialResponse);
2046
+ }
2047
+ if (typeof credentialResponse === "string") {
2048
+ try {
2049
+ const parsed = JSON.parse(credentialResponse);
2050
+ return ok(parsed);
2051
+ } catch (_a) {
2052
+ return err({
2053
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
2054
+ message: RequestCredentialsErrorMessage.DcApiResponseParseError,
2055
+ details: {
2056
+ response: credentialResponse
2057
+ }
2058
+ });
2059
+ }
2060
+ }
2061
+ return err({
2062
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
2063
+ message: RequestCredentialsErrorMessage.DcApiResponseParseError,
2064
+ details: {
2065
+ response: credentialResponse
2066
+ }
2067
+ });
2068
+ };
2069
+
2070
+ const verifyCredentialResponse = async options => {
2071
+ const {apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey, challenge: challenge, protocol: protocol, data: data} = options;
2072
+ const requestBody = {
2073
+ protocol: protocol,
2074
+ data: data,
2075
+ challenge: challenge
2076
+ };
2077
+ const credentialVerificationResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/dc-api/response`, {
2078
+ method: "POST",
2079
+ headers: {
2080
+ "Content-Type": "application/json",
2081
+ Authorization: `Bearer ${sessionKey}`
2082
+ },
2083
+ body: JSON.stringify(requestBody)
2084
+ });
2085
+ if (credentialVerificationResult.isErr()) {
2086
+ return err(credentialVerificationResult.error);
2087
+ }
2088
+ const credentialVerificationResponse = await credentialVerificationResult.value.json();
2089
+ if (!isType(PresentationResultRelaxValidator)(credentialVerificationResponse)) {
2090
+ return err({
2091
+ type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
2092
+ message: "Verify credential returned unsupported response",
2093
+ details: {
2094
+ response: credentialVerificationResponse
2095
+ }
2096
+ });
2097
+ }
2098
+ return ok(credentialVerificationResponse);
2099
+ };
2100
+
2101
+ const isDigitalCredentialsApiSupported = () => {
2102
+ var _a;
2103
+ return "DigitalCredential" in window && typeof window.DigitalCredential === "function" && typeof ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.credentials) === null || _a === void 0 ? void 0 : _a.get) === "function";
2104
+ };
2105
+
2106
+ const sleep = ms => new Promise((resolve => setTimeout(resolve, ms)));
2107
+
2108
+ const SESSION_STATUS_POLLING_MAX_RETRY = 1e3;
2109
+
2110
+ const SESSION_STATUS_POLLING_INTERVAL_MS = 3e3;
2111
+
2112
+ const SESSION_STATUS_POLLING_INITIAL_DELAY_MS = 3e3;
2113
+
1779
2114
  var SameDeviceRequestCredentialsErrorMessage;
1780
2115
 
1781
2116
  (function(SameDeviceRequestCredentialsErrorMessage) {
@@ -1784,65 +2119,135 @@ var SameDeviceRequestCredentialsErrorMessage;
1784
2119
  })(SameDeviceRequestCredentialsErrorMessage || (SameDeviceRequestCredentialsErrorMessage = {}));
1785
2120
 
1786
2121
  const requestCredentialsSameDevice = async options => {
1787
- const {challenge: challenge, credentialQuery: credentialQuery, redirectUri: redirectUri, walletProviderId: walletProviderId, initialiseOptions: initialiseOptions} = options;
1788
- const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
2122
+ const {challenge: challenge, apiBaseUrl: apiBaseUrl, applicationId: applicationId, sessionUrl: sessionUrl, sessionKey: sessionKey, sessionId: sessionId} = options;
2123
+ const abortController = setActiveSession({
2124
+ sessionId: sessionId,
2125
+ sessionKey: sessionKey
2126
+ });
2127
+ window.localStorage.setItem(LocalStorageKey.sessionId, sessionId);
1789
2128
  window.localStorage.setItem(LocalStorageKey.challenge, challenge);
1790
- const storedChallenge = window.localStorage.getItem(LocalStorageKey.challenge);
1791
- if (!storedChallenge) {
1792
- return err({
1793
- type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1794
- message: SameDeviceRequestCredentialsErrorMessage.FailedToStoreChallenge
2129
+ window.location.assign(sessionUrl);
2130
+ await sleep(SESSION_STATUS_POLLING_INITIAL_DELAY_MS);
2131
+ const checkResult = await withRetry((async () => {
2132
+ const statusResult = await getSessionStatus({
2133
+ apiBaseUrl: apiBaseUrl,
2134
+ applicationId: applicationId,
2135
+ sessionId: sessionId,
2136
+ sessionKey: sessionKey
1795
2137
  });
2138
+ if (abortController.signal.aborted) {
2139
+ return err({
2140
+ type: exports.RequestCredentialsErrorType.Abort,
2141
+ message: RequestCredentialsErrorMessage.Abort
2142
+ });
2143
+ }
2144
+ if (statusResult.isErr()) {
2145
+ if (statusResult.error.status === 404) {
2146
+ return err({
2147
+ type: exports.RequestCredentialsErrorType.Timeout,
2148
+ message: RequestCredentialsErrorMessage.Timeout
2149
+ });
2150
+ }
2151
+ throw Error("Unexpected status response. Retry");
2152
+ }
2153
+ if (statusResult.value.status !== PresentationStatusCode.ResultReady) {
2154
+ throw Error("Result is not ready. Retry");
2155
+ }
2156
+ return ok(undefined);
2157
+ }), {
2158
+ retries: SESSION_STATUS_POLLING_MAX_RETRY,
2159
+ retryDelay: SESSION_STATUS_POLLING_INTERVAL_MS
2160
+ });
2161
+ if (checkResult.isErr()) {
2162
+ return err(checkResult.error);
2163
+ }
2164
+ window.close();
2165
+ return ok({
2166
+ sessionId: sessionId,
2167
+ sessionCompletedInRedirect: true
2168
+ });
2169
+ };
2170
+
2171
+ const requestCredentials = async options => {
2172
+ var _a;
2173
+ const initializeOptions = getInitializeOptions();
2174
+ if (!initializeOptions) {
2175
+ throw new Exception(InitializeErrorMessage.SdkNotInitialized);
1796
2176
  }
2177
+ assertType(RequestCredentialsOptionsValidator, "Invalid request credential options")(options);
2178
+ const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initializeOptions;
2179
+ const {challenge: challenge = generateChallenge(), credentialQuery: credentialQuery, openid4vpConfiguration: openid4vpConfiguration} = options;
2180
+ const dcApiSupported = isDigitalCredentialsApiSupported();
2181
+ const openId4VpRedirectUri = deriveOpenId4vpRedirectUri(openid4vpConfiguration);
1797
2182
  const createSessionResult = await createSession({
1798
2183
  credentialQuery: credentialQuery,
1799
- challenge: storedChallenge,
1800
- redirectUri: redirectUri,
2184
+ challenge: challenge,
2185
+ redirectUri: openId4VpRedirectUri,
2186
+ walletProviderId: (_a = openid4vpConfiguration === null || openid4vpConfiguration === void 0 ? void 0 : openid4vpConfiguration.walletProviderId) !== null && _a !== void 0 ? _a : undefined,
1801
2187
  apiBaseUrl: apiBaseUrl,
1802
2188
  applicationId: applicationId,
1803
- walletProviderId: walletProviderId
2189
+ dcApiSupported: dcApiSupported
1804
2190
  });
1805
2191
  if (createSessionResult.isErr()) {
1806
2192
  return err({
1807
2193
  type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1808
- message: SameDeviceRequestCredentialsErrorMessage.FailedToCreateSession,
2194
+ message: RequestCredentialsErrorMessage.FailedToCreateSession,
1809
2195
  cause: createSessionResult.error
1810
2196
  });
1811
2197
  }
1812
- const {sessionUrl: sessionUrl, sessionId: sessionId} = createSessionResult.value;
1813
- window.localStorage.setItem(LocalStorageKey.sessionId, sessionId);
1814
- window.location.assign(sessionUrl);
1815
- return ok({
2198
+ const session = createSessionResult.value;
2199
+ const {sessionKey: sessionKey, sessionId: sessionId} = session;
2200
+ if (session.type === SessionType.DigitalCredentialsApi) {
2201
+ const {request: request, sessionTtl: sessionTtl} = session;
2202
+ return await requestCredentialsWithDigitalCredentialsApi({
2203
+ apiBaseUrl: apiBaseUrl,
2204
+ request: request,
2205
+ sessionId: sessionId,
2206
+ sessionKey: sessionKey,
2207
+ challenge: challenge,
2208
+ sessionTtl: sessionTtl
2209
+ });
2210
+ }
2211
+ if (!openid4vpConfiguration) {
2212
+ return err({
2213
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
2214
+ message: RequestCredentialsErrorMessage.MissingOpenId4vpConfig
2215
+ });
2216
+ }
2217
+ const {sessionUrl: sessionUrl} = session;
2218
+ if (openId4VpRedirectUri) {
2219
+ return await requestCredentialsSameDevice({
2220
+ challenge: challenge,
2221
+ apiBaseUrl: apiBaseUrl,
2222
+ applicationId: applicationId,
2223
+ sessionUrl: sessionUrl,
2224
+ sessionKey: sessionKey,
2225
+ sessionId: sessionId
2226
+ });
2227
+ }
2228
+ return await requestCredentialsWithCrossDevice({
2229
+ challenge: challenge,
2230
+ apiBaseUrl: apiBaseUrl,
2231
+ sessionUrl: sessionUrl,
2232
+ sessionKey: sessionKey,
1816
2233
  sessionId: sessionId
1817
2234
  });
1818
2235
  };
1819
2236
 
1820
- const requestCredentials = async options => {
1821
- var _a;
1822
- const initialiseOptions = getInitialiseOptions();
1823
- if (!initialiseOptions) {
1824
- throw new Exception(InitialiseErrorMessage.SdkNotInitialised);
2237
+ const deriveOpenId4vpRedirectUri = openid4vpConfiguration => {
2238
+ if (!openid4vpConfiguration) {
2239
+ return undefined;
1825
2240
  }
1826
- assertType(RequestCredentialsOptionsValidator, "Invalid request credential options")(options);
1827
- const {challenge: challenge = generateChallenge()} = options;
1828
- const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : isMobileDetect(navigator.userAgent) ? exports.Mode.sameDevice : exports.Mode.crossDevice;
1829
- if (mode === exports.Mode.sameDevice && "redirectUri" in options) {
1830
- return await requestCredentialsSameDevice(Object.assign(Object.assign({}, options), {
1831
- initialiseOptions: initialiseOptions,
1832
- challenge: challenge,
1833
- mode: mode
1834
- }));
2241
+ let detectedMode;
2242
+ if (openid4vpConfiguration && openid4vpConfiguration.mode) {
2243
+ detectedMode = openid4vpConfiguration.mode;
2244
+ } else {
2245
+ detectedMode = isMobileDetect(navigator.userAgent) ? exports.Mode.SameDevice : exports.Mode.CrossDevice;
1835
2246
  }
1836
- if (mode === exports.Mode.crossDevice && "crossDeviceCallback" in options) {
1837
- return await requestCredentialsCrossDevice(Object.assign(Object.assign({}, options), {
1838
- initialiseOptions: initialiseOptions,
1839
- challenge: challenge,
1840
- mode: mode
1841
- }));
2247
+ if (detectedMode === exports.Mode.SameDevice && !isType(OpenId4vpConfigCrossDeviceOptionsValidator)(openid4vpConfiguration) && openid4vpConfiguration.redirectUri) {
2248
+ return openid4vpConfiguration.redirectUri;
1842
2249
  }
1843
- throw new Exception("Invalid request credential options", {
1844
- data: options
1845
- });
2250
+ return undefined;
1846
2251
  };
1847
2252
 
1848
2253
  exports.HandleRedirectCallbackErrorType = void 0;
@@ -1856,16 +2261,16 @@ var HandleRedirectCallbackErrorMessage;
1856
2261
  (function(HandleRedirectCallbackErrorMessage) {
1857
2262
  HandleRedirectCallbackErrorMessage["FailedToFindResponseCode"] = "Failed to find response code";
1858
2263
  HandleRedirectCallbackErrorMessage["FailedToFindChallenge"] = "Failed to find challenge";
1859
- HandleRedirectCallbackErrorMessage["FailedToFindSessionId"] = "Failed to find sessionId";
2264
+ HandleRedirectCallbackErrorMessage["FailedToFindActiveSession"] = "Failed to find active session";
1860
2265
  HandleRedirectCallbackErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
1861
2266
  })(HandleRedirectCallbackErrorMessage || (HandleRedirectCallbackErrorMessage = {}));
1862
2267
 
1863
2268
  const handleRedirectCallback = async () => {
1864
- const initialiseOptions = getInitialiseOptions();
1865
- if (!initialiseOptions) {
1866
- throw new Exception(InitialiseErrorMessage.SdkNotInitialised);
2269
+ const initializeOptions = getInitializeOptions();
2270
+ if (!initializeOptions) {
2271
+ throw new Exception(InitializeErrorMessage.SdkNotInitialized);
1867
2272
  }
1868
- const {apiBaseUrl: apiBaseUrl} = initialiseOptions;
2273
+ const {apiBaseUrl: apiBaseUrl} = initializeOptions;
1869
2274
  const responseCode = getHashParamValue(window.location.hash, "response_code");
1870
2275
  if (!responseCode) {
1871
2276
  return err({
@@ -1873,18 +2278,12 @@ const handleRedirectCallback = async () => {
1873
2278
  message: HandleRedirectCallbackErrorMessage.FailedToFindResponseCode
1874
2279
  });
1875
2280
  }
1876
- const challenge = window.localStorage.getItem(LocalStorageKey.challenge);
1877
- if (!challenge) {
1878
- return err({
1879
- type: exports.HandleRedirectCallbackErrorType.HandleRedirectCallbackFailed,
1880
- message: HandleRedirectCallbackErrorMessage.FailedToFindChallenge
1881
- });
1882
- }
1883
2281
  const sessionId = window.localStorage.getItem(LocalStorageKey.sessionId);
1884
- if (!sessionId) {
2282
+ const challenge = window.localStorage.getItem(LocalStorageKey.challenge);
2283
+ if (!sessionId || !challenge) {
1885
2284
  return err({
1886
2285
  type: exports.HandleRedirectCallbackErrorType.HandleRedirectCallbackFailed,
1887
- message: HandleRedirectCallbackErrorMessage.FailedToFindSessionId
2286
+ message: HandleRedirectCallbackErrorMessage.FailedToFindActiveSession
1888
2287
  });
1889
2288
  }
1890
2289
  const result = await exchangeSessionResult({
@@ -1901,19 +2300,24 @@ const handleRedirectCallback = async () => {
1901
2300
  });
1902
2301
  }
1903
2302
  return ok({
1904
- result: result.value,
2303
+ result: "challenge" in result.value ? result.value : undefined,
1905
2304
  sessionId: result.value.sessionId
1906
2305
  });
1907
2306
  };
1908
2307
 
1909
2308
  const utils = {
1910
2309
  generateChallenge: generateChallenge,
2310
+ getVersion: getVersion,
1911
2311
  unwrap: unwrap
1912
2312
  };
1913
2313
 
2314
+ exports.abortCredentialRequest = abortCredentialRequest;
2315
+
1914
2316
  exports.handleRedirectCallback = handleRedirectCallback;
1915
2317
 
1916
- exports.initialise = initialise;
2318
+ exports.initialize = initialize;
2319
+
2320
+ exports.isDigitalCredentialsApiSupported = isDigitalCredentialsApiSupported;
1917
2321
 
1918
2322
  exports.requestCredentials = requestCredentials;
1919
2323