@mattrglobal/verifier-sdk-web 1.1.1-unstable.15 → 1.1.1-unstable.153

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-14
10
+ * Generated: 2025-05-16
11
11
  * Version: 1.1.0
12
12
  * Dependencies:
13
13
  *
@@ -426,6 +426,73 @@
426
426
  };
427
427
  ResultAsync.fromPromise;
428
428
  ResultAsync.fromSafePromise;
429
+ function _arrayLikeToArray(r, a) {
430
+ (null == a || a > r.length) && (a = r.length);
431
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
432
+ return n;
433
+ }
434
+ function _arrayWithoutHoles(r) {
435
+ if (Array.isArray(r)) return _arrayLikeToArray(r);
436
+ }
437
+ function _createForOfIteratorHelper(r, e) {
438
+ var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
439
+ if (!t) {
440
+ if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
441
+ t && (r = t);
442
+ var n = 0, F = function() {};
443
+ return {
444
+ s: F,
445
+ n: function() {
446
+ return n >= r.length ? {
447
+ done: !0
448
+ } : {
449
+ done: !1,
450
+ value: r[n++]
451
+ };
452
+ },
453
+ e: function(r) {
454
+ throw r;
455
+ },
456
+ f: F
457
+ };
458
+ }
459
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
460
+ }
461
+ var o, a = !0, u = !1;
462
+ return {
463
+ s: function() {
464
+ t = t.call(r);
465
+ },
466
+ n: function() {
467
+ var r = t.next();
468
+ return a = r.done, r;
469
+ },
470
+ e: function(r) {
471
+ u = !0, o = r;
472
+ },
473
+ f: function() {
474
+ try {
475
+ a || null == t.return || t.return();
476
+ } finally {
477
+ if (u) throw o;
478
+ }
479
+ }
480
+ };
481
+ }
482
+ function _defineProperty(e, r, t) {
483
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
484
+ value: t,
485
+ enumerable: !0,
486
+ configurable: !0,
487
+ writable: !0
488
+ }) : e[r] = t, e;
489
+ }
490
+ function _iterableToArray(r) {
491
+ if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
492
+ }
493
+ function _nonIterableSpread() {
494
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
495
+ }
429
496
  function ownKeys(e, r) {
430
497
  var t = Object.keys(e);
431
498
  if (Object.getOwnPropertySymbols) {
@@ -447,6 +514,23 @@
447
514
  }
448
515
  return e;
449
516
  }
517
+ function _toConsumableArray(r) {
518
+ return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
519
+ }
520
+ function _toPrimitive(t, r) {
521
+ if ("object" != typeof t || !t) return t;
522
+ var e = t[Symbol.toPrimitive];
523
+ if (void 0 !== e) {
524
+ var i = e.call(t, r || "default");
525
+ if ("object" != typeof i) return i;
526
+ throw new TypeError("@@toPrimitive must return a primitive value.");
527
+ }
528
+ return ("string" === r ? String : Number)(t);
529
+ }
530
+ function _toPropertyKey(t) {
531
+ var i = _toPrimitive(t, "string");
532
+ return "symbol" == typeof i ? i : i + "";
533
+ }
450
534
  function _typeof(o) {
451
535
  "@babel/helpers - typeof";
452
536
  return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
@@ -455,107 +539,12 @@
455
539
  return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
456
540
  }, _typeof(o);
457
541
  }
458
- function _defineProperty(obj, key, value) {
459
- key = _toPropertyKey(key);
460
- if (key in obj) {
461
- Object.defineProperty(obj, key, {
462
- value: value,
463
- enumerable: true,
464
- configurable: true,
465
- writable: true
466
- });
467
- } else {
468
- obj[key] = value;
469
- }
470
- return obj;
471
- }
472
- function _toConsumableArray(arr) {
473
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
474
- }
475
- function _arrayWithoutHoles(arr) {
476
- if (Array.isArray(arr)) return _arrayLikeToArray(arr);
477
- }
478
- function _iterableToArray(iter) {
479
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
480
- }
481
- function _unsupportedIterableToArray(o, minLen) {
482
- if (!o) return;
483
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
484
- var n = Object.prototype.toString.call(o).slice(8, -1);
485
- if (n === "Object" && o.constructor) n = o.constructor.name;
486
- if (n === "Map" || n === "Set") return Array.from(o);
487
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
488
- }
489
- function _arrayLikeToArray(arr, len) {
490
- if (len == null || len > arr.length) len = arr.length;
491
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
492
- return arr2;
493
- }
494
- function _nonIterableSpread() {
495
- throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
496
- }
497
- function _createForOfIteratorHelper(o, allowArrayLike) {
498
- var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
499
- if (!it) {
500
- if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
501
- if (it) o = it;
502
- var i = 0;
503
- var F = function() {};
504
- return {
505
- s: F,
506
- n: function() {
507
- if (i >= o.length) return {
508
- done: true
509
- };
510
- return {
511
- done: false,
512
- value: o[i++]
513
- };
514
- },
515
- e: function(e) {
516
- throw e;
517
- },
518
- f: F
519
- };
520
- }
521
- throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
522
- }
523
- var normalCompletion = true, didErr = false, err;
524
- return {
525
- s: function() {
526
- it = it.call(o);
527
- },
528
- n: function() {
529
- var step = it.next();
530
- normalCompletion = step.done;
531
- return step;
532
- },
533
- e: function(e) {
534
- didErr = true;
535
- err = e;
536
- },
537
- f: function() {
538
- try {
539
- if (!normalCompletion && it.return != null) it.return();
540
- } finally {
541
- if (didErr) throw err;
542
- }
543
- }
544
- };
545
- }
546
- function _toPrimitive(input, hint) {
547
- if (typeof input !== "object" || input === null) return input;
548
- var prim = input[Symbol.toPrimitive];
549
- if (prim !== undefined) {
550
- var res = prim.call(input, hint || "default");
551
- if (typeof res !== "object") return res;
552
- throw new TypeError("@@toPrimitive must return a primitive value.");
542
+ function _unsupportedIterableToArray(r, a) {
543
+ if (r) {
544
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
545
+ var t = {}.toString.call(r).slice(8, -1);
546
+ 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;
553
547
  }
554
- return (hint === "string" ? String : Number)(input);
555
- }
556
- function _toPropertyKey(arg) {
557
- var key = _toPrimitive(arg, "string");
558
- return typeof key === "symbol" ? key : String(key);
559
548
  }
560
549
  var store;
561
550
  function getGlobalConfig(config2) {
@@ -661,6 +650,19 @@
661
650
  function getDefault(schema, dataset, config2) {
662
651
  return typeof schema["default"] === "function" ? schema["default"](dataset, config2) : schema["default"];
663
652
  }
653
+ function any() {
654
+ return {
655
+ kind: "schema",
656
+ type: "any",
657
+ reference: any,
658
+ expects: "any",
659
+ async: false,
660
+ _run: function _run(dataset) {
661
+ dataset.typed = true;
662
+ return dataset;
663
+ }
664
+ };
665
+ }
664
666
  function array(item, message) {
665
667
  return {
666
668
  kind: "schema",
@@ -744,16 +746,35 @@
744
746
  }
745
747
  };
746
748
  }
747
- function function_(message) {
749
+ function literal(literal_, message) {
750
+ return {
751
+ kind: "schema",
752
+ type: "literal",
753
+ reference: literal,
754
+ expects: _stringify(literal_),
755
+ async: false,
756
+ literal: literal_,
757
+ message: message,
758
+ _run: function _run(dataset, config2) {
759
+ if (dataset.value === this.literal) {
760
+ dataset.typed = true;
761
+ } else {
762
+ _addIssue(this, "type", dataset, config2);
763
+ }
764
+ return dataset;
765
+ }
766
+ };
767
+ }
768
+ function number(message) {
748
769
  return {
749
770
  kind: "schema",
750
- type: "function",
751
- reference: function_,
752
- expects: "Function",
771
+ type: "number",
772
+ reference: number,
773
+ expects: "number",
753
774
  async: false,
754
775
  message: message,
755
776
  _run: function _run(dataset, config2) {
756
- if (typeof dataset.value === "function") {
777
+ if (typeof dataset.value === "number" && !isNaN(dataset.value)) {
757
778
  dataset.typed = true;
758
779
  } else {
759
780
  _addIssue(this, "type", dataset, config2);
@@ -1242,41 +1263,20 @@
1242
1263
  });
1243
1264
  }
1244
1265
  };
1245
- var SafeFetchCommonRespondErrorType;
1246
- (function(SafeFetchCommonRespondErrorType) {
1247
- SafeFetchCommonRespondErrorType["UnexpectedRespond"] = "UnexpectedRespond";
1248
- })(SafeFetchCommonRespondErrorType || (SafeFetchCommonRespondErrorType = {}));
1249
- var SafeFetchErrorType;
1250
- (function(SafeFetchErrorType) {
1251
- SafeFetchErrorType["HttpError"] = "HttpError";
1252
- SafeFetchErrorType["UnknownError"] = "UnknownError";
1253
- })(SafeFetchErrorType || (SafeFetchErrorType = {}));
1254
- const safeFetch = async (input, init) => {
1255
- try {
1256
- const response = await fetch(input, init);
1257
- if (response.status > 299 || response.status < 200) {
1258
- return err({
1259
- type: SafeFetchErrorType.HttpError,
1260
- message: `HTTP error, status = ${response.status}`,
1261
- status: response.status
1262
- });
1263
- }
1264
- return ok(response);
1265
- } catch (error) {
1266
- return err({
1267
- type: SafeFetchErrorType.UnknownError,
1268
- message: "Unknown error",
1269
- cause: error
1270
- });
1271
- }
1272
- };
1273
1266
  exports.MobileCredentialVerificationReasonType = void 0;
1274
1267
  (function(MobileCredentialVerificationReasonType) {
1275
- MobileCredentialVerificationReasonType["Expired"] = "expired";
1276
- MobileCredentialVerificationReasonType["Inactive"] = "inactive";
1277
- MobileCredentialVerificationReasonType["StatusRevoked"] = "invalid";
1278
- MobileCredentialVerificationReasonType["StatusSuspended"] = "suspended";
1279
- MobileCredentialVerificationReasonType["StatusUnknown"] = "unknown";
1268
+ MobileCredentialVerificationReasonType["TrustedIssuerCertificateExpired"] = "TrustedIssuerCertificateExpired";
1269
+ MobileCredentialVerificationReasonType["TrustedIssuerCertificateNotYetValid"] = "TrustedIssuerCertificateNotYetValid";
1270
+ MobileCredentialVerificationReasonType["IssuerNotTrusted"] = "IssuerNotTrusted";
1271
+ MobileCredentialVerificationReasonType["MobileCredentialInvalid"] = "MobileCredentialInvalid";
1272
+ MobileCredentialVerificationReasonType["MobileCredentialExpired"] = "MobileCredentialExpired";
1273
+ MobileCredentialVerificationReasonType["MobileCredentialNotYetValid"] = "MobileCredentialNotYetValid";
1274
+ MobileCredentialVerificationReasonType["InvalidSignerCertificate"] = "InvalidSignerCertificate";
1275
+ MobileCredentialVerificationReasonType["DeviceKeyInvalid"] = "DeviceKeyInvalid";
1276
+ MobileCredentialVerificationReasonType["UnsupportedCurve"] = "UnsupportedCurve";
1277
+ MobileCredentialVerificationReasonType["StatusRevoked"] = "StatusRevoked";
1278
+ MobileCredentialVerificationReasonType["StatusSuspended"] = "StatusSuspended";
1279
+ MobileCredentialVerificationReasonType["StatusUnknown"] = "StatusUnknown";
1280
1280
  })(exports.MobileCredentialVerificationReasonType || (exports.MobileCredentialVerificationReasonType = {}));
1281
1281
  exports.ClaimType = void 0;
1282
1282
  (function(ClaimType) {
@@ -1302,6 +1302,13 @@
1302
1302
  (function(OpenidPresentationCredentialProfileSupported) {
1303
1303
  OpenidPresentationCredentialProfileSupported["MOBILE"] = "mobile";
1304
1304
  })(exports.OpenidPresentationCredentialProfileSupported || (exports.OpenidPresentationCredentialProfileSupported = {}));
1305
+ var PresentationStatusCode;
1306
+ (function(PresentationStatusCode) {
1307
+ PresentationStatusCode["AwaitingRequestRetrieval"] = "AwaitingRequestRetrieval";
1308
+ PresentationStatusCode["AwaitingResponse"] = "AwaitingResponse";
1309
+ PresentationStatusCode["ResponseSubmitted"] = "ResponseSubmitted";
1310
+ PresentationStatusCode["ResultReady"] = "ResultReady";
1311
+ })(PresentationStatusCode || (PresentationStatusCode = {}));
1305
1312
  const CredentialQueryValidator = object({
1306
1313
  profile: picklist([ exports.OpenidPresentationCredentialProfileSupported.MOBILE ]),
1307
1314
  docType: string(),
@@ -1325,69 +1332,138 @@
1325
1332
  credentialErrors: optional(unknown()),
1326
1333
  error: optional(unknown())
1327
1334
  });
1335
+ exports.Mode = void 0;
1336
+ (function(Mode) {
1337
+ Mode["SameDevice"] = "sameDevice";
1338
+ Mode["CrossDevice"] = "crossDevice";
1339
+ })(exports.Mode || (exports.Mode = {}));
1340
+ var SessionType;
1341
+ (function(SessionType) {
1342
+ SessionType["DigitalCredentialsApi"] = "digital-credentials-api";
1343
+ SessionType["Openid4vp"] = "openid4vp";
1344
+ })(SessionType || (SessionType = {}));
1328
1345
  object({
1329
1346
  credentialQuery: array(CredentialQueryValidator),
1330
1347
  challenge: string(),
1331
1348
  redirectUri: optional(string()),
1332
- walletProviderId: optional(string())
1349
+ walletProviderId: optional(string()),
1350
+ dcApiSupported: optional(_boolean())
1333
1351
  });
1334
- const CreateSessionResponseValidator = object({
1352
+ const CreateSessionDigitalCredentialsValidator = object({
1353
+ type: literal(SessionType.DigitalCredentialsApi),
1335
1354
  sessionId: string(),
1355
+ sessionKey: string(),
1356
+ sessionTtl: number(),
1357
+ request: record(string(), any())
1358
+ });
1359
+ const CreateSessionOpenId4vpResponseValidator = object({
1360
+ type: optional(literal(SessionType.Openid4vp)),
1361
+ sessionId: string(),
1362
+ sessionKey: string(),
1336
1363
  sessionUrl: string()
1337
1364
  });
1365
+ const CreateSessionResponseValidator = union([ CreateSessionDigitalCredentialsValidator, CreateSessionOpenId4vpResponseValidator ]);
1366
+ const GetSessionStatusResponseValidator = union([ object({
1367
+ status: picklist([ PresentationStatusCode.ResultReady ]),
1368
+ responseCode: optional(string())
1369
+ }), object({
1370
+ status: string()
1371
+ }) ]);
1338
1372
  var LocalStorageKey;
1339
1373
  (function(LocalStorageKey) {
1340
1374
  LocalStorageKey["challenge"] = "mattr_chg";
1341
1375
  LocalStorageKey["sessionId"] = "mattr_sid";
1342
1376
  })(LocalStorageKey || (LocalStorageKey = {}));
1343
- exports.Mode = void 0;
1344
- (function(Mode) {
1345
- Mode["sameDevice"] = "sameDevice";
1346
- Mode["crossDevice"] = "crossDevice";
1347
- })(exports.Mode || (exports.Mode = {}));
1377
+ const MATTR_SDK_VERSION_HEADER = "x-mattr-sdk-version";
1378
+ const MATTR_SDK_VERSION_VALUE = "2.0.0";
1348
1379
  var MessageEventDataType;
1349
1380
  (function(MessageEventDataType) {
1350
1381
  MessageEventDataType["PresentationCompleted"] = "PresentationCompleted";
1351
1382
  MessageEventDataType["PresentationTimeout"] = "PresentationTimeout";
1352
1383
  MessageEventDataType["PresentationAbort"] = "PresentationAbort";
1353
1384
  })(MessageEventDataType || (MessageEventDataType = {}));
1354
- const RequestCredentialsSameDeviceOptionsValidator = object({
1355
- credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1356
- redirectUri: string(),
1357
- challenge: optional(string()),
1385
+ const OpenId4vpConfigSameDeviceOptionsValidator = object({
1358
1386
  walletProviderId: optional(string()),
1359
- mode: picklist([ exports.Mode.sameDevice ])
1387
+ mode: literal(exports.Mode.SameDevice),
1388
+ redirectUri: string()
1360
1389
  });
1361
- const RequestCredentialsCrossDeviceOptionsValidator = object({
1362
- credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1363
- crossDeviceCallback: object({
1364
- onComplete: function_(),
1365
- onFailure: function_()
1366
- }),
1367
- challenge: optional(string()),
1390
+ const OpenId4vpConfigCrossDeviceOptionsValidator = object({
1368
1391
  walletProviderId: optional(string()),
1369
- mode: picklist([ exports.Mode.crossDevice ])
1392
+ mode: literal(exports.Mode.CrossDevice)
1370
1393
  });
1371
- const RequestCredentialsAutoDetectDeviceOptionsValidator = object({
1372
- credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1373
- crossDeviceCallback: object({
1374
- onComplete: function_(),
1375
- onFailure: function_()
1376
- }),
1394
+ const OpenId4vpConfigAutoDetectOptionsValidator = object({
1395
+ walletProviderId: optional(string()),
1377
1396
  redirectUri: string(),
1397
+ mode: optional(picklist([ exports.Mode.CrossDevice, exports.Mode.SameDevice ]))
1398
+ });
1399
+ const RequestCredentialsOptionsValidator = object({
1400
+ credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1378
1401
  challenge: optional(string()),
1379
- walletProviderId: optional(string()),
1380
- mode: optional(picklist([ exports.Mode.crossDevice, exports.Mode.sameDevice ]))
1402
+ openid4vpConfiguration: optional(union([ OpenId4vpConfigSameDeviceOptionsValidator, OpenId4vpConfigCrossDeviceOptionsValidator, OpenId4vpConfigAutoDetectOptionsValidator ]))
1381
1403
  });
1382
- const RequestCredentialsOptionsValidator = union([ RequestCredentialsSameDeviceOptionsValidator, RequestCredentialsCrossDeviceOptionsValidator, RequestCredentialsAutoDetectDeviceOptionsValidator ]);
1383
1404
  exports.RequestCredentialsErrorType = void 0;
1384
1405
  (function(RequestCredentialsErrorType) {
1385
1406
  RequestCredentialsErrorType["RequestCredentialsFailed"] = "RequestCredentialsFailed";
1407
+ RequestCredentialsErrorType["Timeout"] = "Timeout";
1408
+ RequestCredentialsErrorType["Abort"] = "Abort";
1386
1409
  })(exports.RequestCredentialsErrorType || (exports.RequestCredentialsErrorType = {}));
1410
+ var RequestCredentialsErrorMessage;
1411
+ (function(RequestCredentialsErrorMessage) {
1412
+ RequestCredentialsErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
1413
+ RequestCredentialsErrorMessage["FailedToGetSessionStatus"] = "Failed to get session status";
1414
+ RequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
1415
+ RequestCredentialsErrorMessage["FailedToVerifyCredentialResponse"] = "Failed to verify credential response";
1416
+ RequestCredentialsErrorMessage["MissingOpenId4vpConfig"] = "Identified openid4vp session, but missing openId4vpConfiguration on `requestCredentials`";
1417
+ RequestCredentialsErrorMessage["DcApiError"] = "Failed to request credentials with Digital Credentials API";
1418
+ RequestCredentialsErrorMessage["DcApiResponseParseError"] = "Failed to parse response from Digital Credentials API";
1419
+ RequestCredentialsErrorMessage["Abort"] = "User aborted the session";
1420
+ RequestCredentialsErrorMessage["Timeout"] = "User session timeout";
1421
+ })(RequestCredentialsErrorMessage || (RequestCredentialsErrorMessage = {}));
1422
+ exports.AbortSessionErrorType = void 0;
1423
+ (function(AbortSessionErrorType) {
1424
+ AbortSessionErrorType["AbortSessionFailed"] = "AbortSessionFailed";
1425
+ })(exports.AbortSessionErrorType || (exports.AbortSessionErrorType = {}));
1426
+ var AbortSessionErrorMessage;
1427
+ (function(AbortSessionErrorMessage) {
1428
+ AbortSessionErrorMessage["FailedToAbortSession"] = "Failed to abort session";
1429
+ })(AbortSessionErrorMessage || (AbortSessionErrorMessage = {}));
1387
1430
  const InitialiseOptionsValidator = object({
1388
- apiBaseUrl: string(),
1389
- applicationId: optional(string())
1431
+ apiBaseUrl: pipe(string(), nonEmpty("Must not be empty")),
1432
+ applicationId: pipe(string(), nonEmpty("Must not be empty"))
1390
1433
  });
1434
+ var SafeFetchCommonResponseErrorType;
1435
+ (function(SafeFetchCommonResponseErrorType) {
1436
+ SafeFetchCommonResponseErrorType["UnexpectedResponse"] = "UnexpectedResponse";
1437
+ })(SafeFetchCommonResponseErrorType || (SafeFetchCommonResponseErrorType = {}));
1438
+ var SafeFetchErrorType;
1439
+ (function(SafeFetchErrorType) {
1440
+ SafeFetchErrorType["HttpError"] = "HttpError";
1441
+ SafeFetchErrorType["UnknownError"] = "UnknownError";
1442
+ })(SafeFetchErrorType || (SafeFetchErrorType = {}));
1443
+ const safeFetch = async (input, init) => {
1444
+ try {
1445
+ const headers = Object.assign(Object.assign({}, init === null || init === void 0 ? void 0 : init.headers), {
1446
+ [MATTR_SDK_VERSION_HEADER]: `verifier-sdk-web/${MATTR_SDK_VERSION_VALUE}`
1447
+ });
1448
+ const response = await fetch(input, Object.assign(Object.assign({}, init), {
1449
+ headers: headers
1450
+ }));
1451
+ if (response.status > 299 || response.status < 200) {
1452
+ return err({
1453
+ type: SafeFetchErrorType.HttpError,
1454
+ message: `HTTP error, status = ${response.status}`,
1455
+ status: response.status
1456
+ });
1457
+ }
1458
+ return ok(response);
1459
+ } catch (error) {
1460
+ return err({
1461
+ type: SafeFetchErrorType.UnknownError,
1462
+ message: "Unknown error",
1463
+ cause: error
1464
+ });
1465
+ }
1466
+ };
1391
1467
  let initialiseOptions = undefined;
1392
1468
  var InitialiseErrorMessage;
1393
1469
  (function(InitialiseErrorMessage) {
@@ -1398,6 +1474,34 @@
1398
1474
  initialiseOptions = options;
1399
1475
  };
1400
1476
  const getInitialiseOptions = () => initialiseOptions;
1477
+ let sessionAbortController = undefined;
1478
+ let _sessionId = undefined;
1479
+ let _sessionKey = undefined;
1480
+ const getActiveSession = () => {
1481
+ const sessionId = _sessionId;
1482
+ const sessionKey = _sessionKey;
1483
+ if (sessionId) {
1484
+ return {
1485
+ sessionId: sessionId,
1486
+ sessionKey: sessionKey
1487
+ };
1488
+ }
1489
+ return undefined;
1490
+ };
1491
+ const setActiveSession = session => {
1492
+ const {sessionId: sessionId, sessionKey: sessionKey} = session;
1493
+ _sessionId = sessionId;
1494
+ _sessionKey = sessionKey;
1495
+ const abortController = new AbortController;
1496
+ sessionAbortController = abortController;
1497
+ return abortController;
1498
+ };
1499
+ const removeActiveSession = () => {
1500
+ sessionAbortController === null || sessionAbortController === void 0 ? void 0 : sessionAbortController.abort();
1501
+ sessionAbortController = undefined;
1502
+ _sessionKey = undefined;
1503
+ _sessionId = undefined;
1504
+ };
1401
1505
  var isMobile_1 = isMobile;
1402
1506
  var isMobile_2 = isMobile;
1403
1507
  var default_1 = isMobile;
@@ -1422,6 +1526,23 @@
1422
1526
  isMobile_1["default"] = default_1;
1423
1527
  const defaultRetryDelay = attempt => Math.pow(2, attempt) * 1e3;
1424
1528
  const defaultRetry = 2;
1529
+ const withRetry = async (fn, options) => {
1530
+ const {retries: retries = defaultRetry, retryDelay: retryDelay = defaultRetryDelay, attempt: attempt = 0} = options;
1531
+ try {
1532
+ return await fn();
1533
+ } catch (err) {
1534
+ if (retries > 0) {
1535
+ const delay = typeof retryDelay === "function" ? retryDelay(attempt) : retryDelay;
1536
+ await new Promise((resolve => setTimeout(resolve, delay)));
1537
+ return await withRetry(fn, Object.assign(Object.assign({}, options), {
1538
+ retries: retries - 1,
1539
+ retryDelay: retryDelay,
1540
+ attempt: attempt + 1
1541
+ }));
1542
+ }
1543
+ throw err;
1544
+ }
1545
+ };
1425
1546
  const withRetrySafeFetch = async (fn, options) => {
1426
1547
  const {retries: retries = defaultRetry, retryDelay: retryDelay = defaultRetryDelay, attempt: attempt = 0, retryHttpStatus: retryHttpStatus} = options;
1427
1548
  const result = await fn();
@@ -1447,17 +1568,15 @@
1447
1568
  const urlParams = new URLSearchParams(hash.split("#")[1]);
1448
1569
  return urlParams.get(param);
1449
1570
  };
1450
- const createSession = async ({credentialQuery: credentialQuery, challenge: challenge, redirectUri: redirectUri, apiBaseUrl: apiBaseUrl, applicationId: applicationId, walletProviderId: walletProviderId}) => {
1451
- const postData = Object.assign(Object.assign(Object.assign({
1571
+ const createSession = async ({credentialQuery: credentialQuery, challenge: challenge, redirectUri: redirectUri, apiBaseUrl: apiBaseUrl, walletProviderId: walletProviderId, dcApiSupported: dcApiSupported, applicationId: applicationId}) => {
1572
+ const postData = {
1452
1573
  credentialQuery: credentialQuery,
1453
- challenge: challenge
1454
- }, redirectUri ? {
1455
- redirectUri: redirectUri
1456
- } : {}), applicationId ? {
1457
- applicationId: applicationId
1458
- } : {}), walletProviderId ? {
1459
- walletProviderId: walletProviderId
1460
- } : {});
1574
+ challenge: challenge,
1575
+ applicationId: applicationId,
1576
+ redirectUri: redirectUri,
1577
+ walletProviderId: walletProviderId,
1578
+ dcApiSupported: dcApiSupported
1579
+ };
1461
1580
  const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions`, {
1462
1581
  method: "POST",
1463
1582
  headers: {
@@ -1471,8 +1590,40 @@
1471
1590
  const data = await responseResult.value.json();
1472
1591
  if (!isType(CreateSessionResponseValidator)(data)) {
1473
1592
  return err({
1474
- type: SafeFetchCommonRespondErrorType.UnexpectedRespond,
1475
- message: "Create session return unsupported response"
1593
+ type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
1594
+ message: "Create session returned unsupported response"
1595
+ });
1596
+ }
1597
+ return ok(data);
1598
+ };
1599
+ const abortSession = async ({apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey}) => {
1600
+ const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/abort`, {
1601
+ method: "POST",
1602
+ headers: {
1603
+ "Content-Type": "application/json",
1604
+ Authorization: `Bearer ${sessionKey}`
1605
+ }
1606
+ });
1607
+ if (responseResult.isErr()) {
1608
+ return err(responseResult.error);
1609
+ }
1610
+ return ok(undefined);
1611
+ };
1612
+ const getSessionStatus = async ({apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey}) => {
1613
+ const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/status`, {
1614
+ method: "GET",
1615
+ headers: {
1616
+ Authorization: `Bearer ${sessionKey}`
1617
+ }
1618
+ });
1619
+ if (responseResult.isErr()) {
1620
+ return err(responseResult.error);
1621
+ }
1622
+ const data = await responseResult.value.json();
1623
+ if (!isType(GetSessionStatusResponseValidator)(data)) {
1624
+ return err({
1625
+ type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
1626
+ message: "Get session status return unsupported response"
1476
1627
  });
1477
1628
  }
1478
1629
  return ok(data);
@@ -1499,7 +1650,7 @@
1499
1650
  const data = await responseResult.value.json();
1500
1651
  if (!isType(PresentationResultRelaxValidator)(data)) {
1501
1652
  return err({
1502
- type: SafeFetchCommonRespondErrorType.UnexpectedRespond,
1653
+ type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
1503
1654
  message: "Exchange session result return unsupported response",
1504
1655
  details: {
1505
1656
  data: data
@@ -1512,26 +1663,17 @@
1512
1663
  ua: userAgent,
1513
1664
  tablet: false
1514
1665
  });
1515
- exports.CrossDeviceCallbackErrorType = void 0;
1516
- (function(CrossDeviceCallbackErrorType) {
1517
- CrossDeviceCallbackErrorType["Timeout"] = "Timeout";
1518
- CrossDeviceCallbackErrorType["Abort"] = "Abort";
1519
- CrossDeviceCallbackErrorType["RequestCredentialsFailed"] = "RequestCredentialsFailed";
1520
- })(exports.CrossDeviceCallbackErrorType || (exports.CrossDeviceCallbackErrorType = {}));
1521
- var CrossDeviceRequestCredentialsErrorMessage;
1522
- (function(CrossDeviceRequestCredentialsErrorMessage) {
1523
- CrossDeviceRequestCredentialsErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
1524
- CrossDeviceRequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
1525
- CrossDeviceRequestCredentialsErrorMessage["Abort"] = "User aborted the session";
1526
- CrossDeviceRequestCredentialsErrorMessage["Timeout"] = "User session timeout";
1527
- })(CrossDeviceRequestCredentialsErrorMessage || (CrossDeviceRequestCredentialsErrorMessage = {}));
1666
+ const getVersion = () => MATTR_SDK_VERSION_VALUE;
1528
1667
  var WindowEventListenerType;
1529
1668
  (function(WindowEventListenerType) {
1530
1669
  WindowEventListenerType["message"] = "message";
1531
1670
  })(WindowEventListenerType || (WindowEventListenerType = {}));
1532
- let listener;
1671
+ let listener = undefined;
1533
1672
  const removeWindowMessageEventListener = () => {
1534
- window.removeEventListener(WindowEventListenerType.message, listener, false);
1673
+ if (listener) {
1674
+ window.removeEventListener(WindowEventListenerType.message, listener, false);
1675
+ }
1676
+ listener = undefined;
1535
1677
  };
1536
1678
  const closeCrossDeviceModal = options => {
1537
1679
  const {container: container} = options;
@@ -1541,8 +1683,7 @@
1541
1683
  removeWindowMessageEventListener();
1542
1684
  };
1543
1685
  const receiveMessageHandler = options => async event => {
1544
- const {crossDeviceCallback: crossDeviceCallback, container: container, sessionId: sessionId, apiBaseUrl: apiBaseUrl, challenge: challenge} = options;
1545
- const {onComplete: onComplete, onFailure: onFailure} = crossDeviceCallback;
1686
+ const {onComplete: onComplete, onFailure: onFailure, container: container, sessionId: sessionId, apiBaseUrl: apiBaseUrl, challenge: challenge} = options;
1546
1687
  if (event.origin !== apiBaseUrl) {
1547
1688
  return;
1548
1689
  }
@@ -1556,8 +1697,8 @@
1556
1697
  });
1557
1698
  if (result.isErr()) {
1558
1699
  onFailure({
1559
- type: exports.CrossDeviceCallbackErrorType.RequestCredentialsFailed,
1560
- message: CrossDeviceRequestCredentialsErrorMessage.FailedToGetSessionResult
1700
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1701
+ message: RequestCredentialsErrorMessage.FailedToGetSessionResult
1561
1702
  });
1562
1703
  closeCrossDeviceModal({
1563
1704
  container: container
@@ -1565,8 +1706,9 @@
1565
1706
  return;
1566
1707
  }
1567
1708
  onComplete({
1568
- result: result.value,
1569
- sessionId: result.value.sessionId
1709
+ result: "challenge" in result.value ? result.value : undefined,
1710
+ sessionId: result.value.sessionId,
1711
+ sessionCompletedInRedirect: false
1570
1712
  });
1571
1713
  closeCrossDeviceModal({
1572
1714
  container: container
@@ -1575,8 +1717,8 @@
1575
1717
  }
1576
1718
  if (event.data.type === MessageEventDataType.PresentationTimeout) {
1577
1719
  onFailure({
1578
- type: exports.CrossDeviceCallbackErrorType.Timeout,
1579
- message: CrossDeviceRequestCredentialsErrorMessage.Timeout
1720
+ type: exports.RequestCredentialsErrorType.Timeout,
1721
+ message: RequestCredentialsErrorMessage.Timeout
1580
1722
  });
1581
1723
  closeCrossDeviceModal({
1582
1724
  container: container
@@ -1585,8 +1727,8 @@
1585
1727
  }
1586
1728
  if (event.data.type === MessageEventDataType.PresentationAbort) {
1587
1729
  onFailure({
1588
- type: exports.CrossDeviceCallbackErrorType.Abort,
1589
- message: CrossDeviceRequestCredentialsErrorMessage.Abort
1730
+ type: exports.RequestCredentialsErrorType.Abort,
1731
+ message: RequestCredentialsErrorMessage.Abort
1590
1732
  });
1591
1733
  closeCrossDeviceModal({
1592
1734
  container: container
@@ -1609,104 +1751,293 @@
1609
1751
  modalContainer.setAttribute("class", "mattr-verifier-modal-container");
1610
1752
  return modalContainer;
1611
1753
  };
1612
- const requestCredentialsCrossDevice = async options => {
1613
- const {challenge: challenge, walletProviderId: walletProviderId, credentialQuery: credentialQuery, crossDeviceCallback: crossDeviceCallback, initialiseOptions: initialiseOptions} = options;
1614
- const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
1615
- const createSessionResult = await createSession({
1616
- credentialQuery: credentialQuery,
1617
- challenge: challenge,
1754
+ const requestCredentialsWithCrossDevice = async options => {
1755
+ const {challenge: challenge, apiBaseUrl: apiBaseUrl, sessionUrl: sessionUrl, sessionId: sessionId, sessionKey: sessionKey} = options;
1756
+ const container = openCrossDeviceModal({
1757
+ sessionUrl: sessionUrl
1758
+ });
1759
+ return await new Promise((resolve => {
1760
+ const abortController = setActiveSession({
1761
+ sessionId: sessionId,
1762
+ sessionKey: sessionKey
1763
+ });
1764
+ abortController.signal.addEventListener("abort", (() => {
1765
+ closeCrossDeviceModal({
1766
+ container: container
1767
+ });
1768
+ resolve(err({
1769
+ type: exports.RequestCredentialsErrorType.Abort,
1770
+ message: RequestCredentialsErrorMessage.Abort
1771
+ }));
1772
+ }));
1773
+ removeWindowMessageEventListener();
1774
+ listener = receiveMessageHandler({
1775
+ container: container,
1776
+ sessionId: sessionId,
1777
+ apiBaseUrl: apiBaseUrl,
1778
+ challenge: challenge,
1779
+ onComplete: data => resolve(ok(data)),
1780
+ onFailure: error => resolve(err(error))
1781
+ });
1782
+ window.addEventListener(WindowEventListenerType.message, listener, false);
1783
+ }));
1784
+ };
1785
+ const requestCredentialsWithDigitalCredentialsApi = async options => {
1786
+ const {apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey, challenge: challenge, request: request} = options;
1787
+ const credentialResponseResult = await getCredentials(request);
1788
+ if (credentialResponseResult.isErr()) {
1789
+ await abortSession({
1790
+ apiBaseUrl: apiBaseUrl,
1791
+ sessionId: sessionId,
1792
+ sessionKey: sessionKey
1793
+ });
1794
+ return err(credentialResponseResult.error);
1795
+ }
1796
+ const credentialResponse = credentialResponseResult.value;
1797
+ const parsedCredentialResponseResult = parseCredentialResponse(credentialResponse);
1798
+ if (parsedCredentialResponseResult.isErr()) {
1799
+ await abortSession({
1800
+ apiBaseUrl: apiBaseUrl,
1801
+ sessionId: sessionId,
1802
+ sessionKey: sessionKey
1803
+ });
1804
+ return err(parsedCredentialResponseResult.error);
1805
+ }
1806
+ const parsedCredentialResponse = parsedCredentialResponseResult.value;
1807
+ const credentialVerificationResult = await verifyCredentialResponse({
1618
1808
  apiBaseUrl: apiBaseUrl,
1619
- applicationId: applicationId,
1620
- walletProviderId: walletProviderId
1809
+ sessionId: sessionId,
1810
+ sessionKey: sessionKey,
1811
+ challenge: challenge,
1812
+ protocol: parsedCredentialResponse.protocol,
1813
+ data: parsedCredentialResponse.data
1621
1814
  });
1622
- if (createSessionResult.isErr()) {
1815
+ if (credentialVerificationResult.isErr()) {
1623
1816
  return err({
1624
1817
  type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1625
- message: CrossDeviceRequestCredentialsErrorMessage.FailedToCreateSession,
1626
- cause: createSessionResult.error
1818
+ message: RequestCredentialsErrorMessage.FailedToVerifyCredentialResponse,
1819
+ cause: credentialVerificationResult.error
1627
1820
  });
1628
1821
  }
1629
- const {sessionUrl: sessionUrl, sessionId: sessionId} = createSessionResult.value;
1630
- const container = openCrossDeviceModal({
1631
- sessionUrl: sessionUrl,
1632
- crossDeviceCallback: crossDeviceCallback
1822
+ return ok(credentialVerificationResult.value);
1823
+ };
1824
+ const getCredentials = async request => {
1825
+ try {
1826
+ const credentialResponse = await navigator.credentials.get(request);
1827
+ return ok(credentialResponse);
1828
+ } catch (exception) {
1829
+ return err({
1830
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1831
+ message: RequestCredentialsErrorMessage.DcApiError,
1832
+ cause: exception
1833
+ });
1834
+ }
1835
+ };
1836
+ const parseCredentialResponse = credentialResponse => {
1837
+ if (!credentialResponse) {
1838
+ return err({
1839
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1840
+ message: RequestCredentialsErrorMessage.DcApiResponseParseError,
1841
+ details: {
1842
+ response: credentialResponse
1843
+ }
1844
+ });
1845
+ }
1846
+ if (typeof credentialResponse === "object") {
1847
+ return ok(credentialResponse);
1848
+ }
1849
+ if (typeof credentialResponse === "string") {
1850
+ try {
1851
+ const parsed = JSON.parse(credentialResponse);
1852
+ return ok(parsed);
1853
+ } catch (_a) {
1854
+ return err({
1855
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1856
+ message: RequestCredentialsErrorMessage.DcApiResponseParseError,
1857
+ details: {
1858
+ response: credentialResponse
1859
+ }
1860
+ });
1861
+ }
1862
+ }
1863
+ return err({
1864
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1865
+ message: RequestCredentialsErrorMessage.DcApiResponseParseError,
1866
+ details: {
1867
+ response: credentialResponse
1868
+ }
1633
1869
  });
1634
- listener = receiveMessageHandler({
1635
- crossDeviceCallback: crossDeviceCallback,
1636
- container: container,
1637
- sessionId: sessionId,
1638
- apiBaseUrl: apiBaseUrl,
1870
+ };
1871
+ const verifyCredentialResponse = async options => {
1872
+ const {apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey, challenge: challenge, protocol: protocol, data: data} = options;
1873
+ const requestBody = {
1874
+ protocol: protocol,
1875
+ data: data,
1639
1876
  challenge: challenge
1877
+ };
1878
+ const credentialVerificationResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/dc-api/response`, {
1879
+ method: "POST",
1880
+ headers: {
1881
+ "Content-Type": "application/json",
1882
+ Authorization: `Bearer ${sessionKey}`
1883
+ },
1884
+ body: JSON.stringify(requestBody)
1640
1885
  });
1641
- window.addEventListener(WindowEventListenerType.message, listener, false);
1642
- return ok({
1643
- sessionId: sessionId
1644
- });
1886
+ if (credentialVerificationResult.isErr()) {
1887
+ return err(credentialVerificationResult.error);
1888
+ }
1889
+ const credentialVerificationResponse = await credentialVerificationResult.value.json();
1890
+ if (!isType(PresentationResultRelaxValidator)(credentialVerificationResponse)) {
1891
+ return err({
1892
+ type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
1893
+ message: "Verify credential returned unsupported response",
1894
+ details: {
1895
+ response: credentialVerificationResponse
1896
+ }
1897
+ });
1898
+ }
1899
+ return ok(credentialVerificationResponse);
1645
1900
  };
1901
+ const isDigitalCredentialsApiSupported = () => {
1902
+ var _a;
1903
+ 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";
1904
+ };
1905
+ const sleep = ms => new Promise((resolve => setTimeout(resolve, ms)));
1906
+ const SESSION_STATUS_POLLING_MAX_RETRY = 1e3;
1907
+ const SESSION_STATUS_POLLING_INTERVAL_MS = 3e3;
1908
+ const SESSION_STATUS_POLLING_INITIAL_DELAY_MS = 3e3;
1646
1909
  var SameDeviceRequestCredentialsErrorMessage;
1647
1910
  (function(SameDeviceRequestCredentialsErrorMessage) {
1648
1911
  SameDeviceRequestCredentialsErrorMessage["FailedToStoreChallenge"] = "Failed to store challenge";
1649
1912
  SameDeviceRequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
1650
1913
  })(SameDeviceRequestCredentialsErrorMessage || (SameDeviceRequestCredentialsErrorMessage = {}));
1651
1914
  const requestCredentialsSameDevice = async options => {
1652
- const {challenge: challenge, credentialQuery: credentialQuery, redirectUri: redirectUri, walletProviderId: walletProviderId, initialiseOptions: initialiseOptions} = options;
1653
- const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
1915
+ const {challenge: challenge, apiBaseUrl: apiBaseUrl, applicationId: applicationId, sessionUrl: sessionUrl, sessionKey: sessionKey, sessionId: sessionId} = options;
1916
+ const abortController = setActiveSession({
1917
+ sessionId: sessionId,
1918
+ sessionKey: sessionKey
1919
+ });
1920
+ window.localStorage.setItem(LocalStorageKey.sessionId, sessionId);
1654
1921
  window.localStorage.setItem(LocalStorageKey.challenge, challenge);
1655
- const storedChallenge = window.localStorage.getItem(LocalStorageKey.challenge);
1656
- if (!storedChallenge) {
1657
- return err({
1658
- type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1659
- message: SameDeviceRequestCredentialsErrorMessage.FailedToStoreChallenge
1922
+ window.location.assign(sessionUrl);
1923
+ await sleep(SESSION_STATUS_POLLING_INITIAL_DELAY_MS);
1924
+ const checkResult = await withRetry((async () => {
1925
+ const statusResult = await getSessionStatus({
1926
+ apiBaseUrl: apiBaseUrl,
1927
+ applicationId: applicationId,
1928
+ sessionId: sessionId,
1929
+ sessionKey: sessionKey
1660
1930
  });
1931
+ if (abortController.signal.aborted) {
1932
+ return err({
1933
+ type: exports.RequestCredentialsErrorType.Abort,
1934
+ message: RequestCredentialsErrorMessage.Abort
1935
+ });
1936
+ }
1937
+ if (statusResult.isErr()) {
1938
+ if (statusResult.error.status === 404) {
1939
+ return err({
1940
+ type: exports.RequestCredentialsErrorType.Timeout,
1941
+ message: RequestCredentialsErrorMessage.Timeout
1942
+ });
1943
+ }
1944
+ throw Error("Unexpected status response. Retry");
1945
+ }
1946
+ if (statusResult.value.status !== PresentationStatusCode.ResultReady) {
1947
+ throw Error("Result is not ready. Retry");
1948
+ }
1949
+ return ok(undefined);
1950
+ }), {
1951
+ retries: SESSION_STATUS_POLLING_MAX_RETRY,
1952
+ retryDelay: SESSION_STATUS_POLLING_INTERVAL_MS
1953
+ });
1954
+ if (checkResult.isErr()) {
1955
+ return err(checkResult.error);
1956
+ }
1957
+ window.close();
1958
+ return ok({
1959
+ sessionId: sessionId,
1960
+ sessionCompletedInRedirect: true
1961
+ });
1962
+ };
1963
+ const requestCredentials = async options => {
1964
+ var _a;
1965
+ const initialiseOptions = getInitialiseOptions();
1966
+ if (!initialiseOptions) {
1967
+ throw new Exception(InitialiseErrorMessage.SdkNotInitialised);
1661
1968
  }
1969
+ assertType(RequestCredentialsOptionsValidator, "Invalid request credential options")(options);
1970
+ const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
1971
+ const {challenge: challenge = generateChallenge(), credentialQuery: credentialQuery, openid4vpConfiguration: openid4vpConfiguration} = options;
1972
+ const dcApiSupported = isDigitalCredentialsApiSupported();
1973
+ const openId4VpRedirectUri = deriveOpenId4vpRedirectUri(openid4vpConfiguration);
1662
1974
  const createSessionResult = await createSession({
1663
1975
  credentialQuery: credentialQuery,
1664
- challenge: storedChallenge,
1665
- redirectUri: redirectUri,
1976
+ challenge: challenge,
1977
+ redirectUri: openId4VpRedirectUri,
1978
+ walletProviderId: (_a = openid4vpConfiguration === null || openid4vpConfiguration === void 0 ? void 0 : openid4vpConfiguration.walletProviderId) !== null && _a !== void 0 ? _a : undefined,
1666
1979
  apiBaseUrl: apiBaseUrl,
1667
1980
  applicationId: applicationId,
1668
- walletProviderId: walletProviderId
1981
+ dcApiSupported: dcApiSupported
1669
1982
  });
1670
1983
  if (createSessionResult.isErr()) {
1671
1984
  return err({
1672
1985
  type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1673
- message: SameDeviceRequestCredentialsErrorMessage.FailedToCreateSession,
1986
+ message: RequestCredentialsErrorMessage.FailedToCreateSession,
1674
1987
  cause: createSessionResult.error
1675
1988
  });
1676
1989
  }
1677
- const {sessionUrl: sessionUrl, sessionId: sessionId} = createSessionResult.value;
1678
- window.localStorage.setItem(LocalStorageKey.sessionId, sessionId);
1679
- window.location.assign(sessionUrl);
1680
- return ok({
1990
+ const session = createSessionResult.value;
1991
+ const {sessionKey: sessionKey, sessionId: sessionId} = session;
1992
+ if (session.type === SessionType.DigitalCredentialsApi) {
1993
+ const {request: request} = session;
1994
+ return await requestCredentialsWithDigitalCredentialsApi({
1995
+ apiBaseUrl: apiBaseUrl,
1996
+ request: request,
1997
+ sessionId: sessionId,
1998
+ sessionKey: sessionKey,
1999
+ challenge: challenge
2000
+ });
2001
+ }
2002
+ if (!openid4vpConfiguration) {
2003
+ return err({
2004
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
2005
+ message: RequestCredentialsErrorMessage.MissingOpenId4vpConfig
2006
+ });
2007
+ }
2008
+ const {sessionUrl: sessionUrl} = session;
2009
+ if (openId4VpRedirectUri) {
2010
+ return await requestCredentialsSameDevice({
2011
+ challenge: challenge,
2012
+ apiBaseUrl: apiBaseUrl,
2013
+ applicationId: applicationId,
2014
+ sessionUrl: sessionUrl,
2015
+ sessionKey: sessionKey,
2016
+ sessionId: sessionId
2017
+ });
2018
+ }
2019
+ return await requestCredentialsWithCrossDevice({
2020
+ challenge: challenge,
2021
+ apiBaseUrl: apiBaseUrl,
2022
+ sessionUrl: sessionUrl,
2023
+ sessionKey: sessionKey,
1681
2024
  sessionId: sessionId
1682
2025
  });
1683
2026
  };
1684
- const requestCredentials = async options => {
1685
- var _a;
1686
- const initialiseOptions = getInitialiseOptions();
1687
- if (!initialiseOptions) {
1688
- throw new Exception(InitialiseErrorMessage.SdkNotInitialised);
2027
+ const deriveOpenId4vpRedirectUri = openid4vpConfiguration => {
2028
+ if (!openid4vpConfiguration) {
2029
+ return undefined;
1689
2030
  }
1690
- assertType(RequestCredentialsOptionsValidator, "Invalid request credential options")(options);
1691
- const {challenge: challenge = generateChallenge()} = options;
1692
- const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : isMobileDetect(navigator.userAgent) ? exports.Mode.sameDevice : exports.Mode.crossDevice;
1693
- if (mode === exports.Mode.sameDevice && "redirectUri" in options) {
1694
- return await requestCredentialsSameDevice(Object.assign(Object.assign({}, options), {
1695
- initialiseOptions: initialiseOptions,
1696
- challenge: challenge,
1697
- mode: mode
1698
- }));
2031
+ let detectedMode;
2032
+ if (openid4vpConfiguration && openid4vpConfiguration.mode) {
2033
+ detectedMode = openid4vpConfiguration.mode;
2034
+ } else {
2035
+ detectedMode = isMobileDetect(navigator.userAgent) ? exports.Mode.SameDevice : exports.Mode.CrossDevice;
1699
2036
  }
1700
- if (mode === exports.Mode.crossDevice && "crossDeviceCallback" in options) {
1701
- return await requestCredentialsCrossDevice(Object.assign(Object.assign({}, options), {
1702
- initialiseOptions: initialiseOptions,
1703
- challenge: challenge,
1704
- mode: mode
1705
- }));
2037
+ if (detectedMode === exports.Mode.SameDevice && !isType(OpenId4vpConfigCrossDeviceOptionsValidator)(openid4vpConfiguration) && openid4vpConfiguration.redirectUri) {
2038
+ return openid4vpConfiguration.redirectUri;
1706
2039
  }
1707
- throw new Exception("Invalid request credential options", {
1708
- data: options
1709
- });
2040
+ return undefined;
1710
2041
  };
1711
2042
  exports.HandleRedirectCallbackErrorType = void 0;
1712
2043
  (function(HandleRedirectCallbackErrorType) {
@@ -1716,7 +2047,7 @@
1716
2047
  (function(HandleRedirectCallbackErrorMessage) {
1717
2048
  HandleRedirectCallbackErrorMessage["FailedToFindResponseCode"] = "Failed to find response code";
1718
2049
  HandleRedirectCallbackErrorMessage["FailedToFindChallenge"] = "Failed to find challenge";
1719
- HandleRedirectCallbackErrorMessage["FailedToFindSessionId"] = "Failed to find sessionId";
2050
+ HandleRedirectCallbackErrorMessage["FailedToFindActiveSession"] = "Failed to find active session";
1720
2051
  HandleRedirectCallbackErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
1721
2052
  })(HandleRedirectCallbackErrorMessage || (HandleRedirectCallbackErrorMessage = {}));
1722
2053
  const handleRedirectCallback = async () => {
@@ -1732,18 +2063,12 @@
1732
2063
  message: HandleRedirectCallbackErrorMessage.FailedToFindResponseCode
1733
2064
  });
1734
2065
  }
1735
- const challenge = window.localStorage.getItem(LocalStorageKey.challenge);
1736
- if (!challenge) {
1737
- return err({
1738
- type: exports.HandleRedirectCallbackErrorType.HandleRedirectCallbackFailed,
1739
- message: HandleRedirectCallbackErrorMessage.FailedToFindChallenge
1740
- });
1741
- }
1742
2066
  const sessionId = window.localStorage.getItem(LocalStorageKey.sessionId);
1743
- if (!sessionId) {
2067
+ const challenge = window.localStorage.getItem(LocalStorageKey.challenge);
2068
+ if (!sessionId || !challenge) {
1744
2069
  return err({
1745
2070
  type: exports.HandleRedirectCallbackErrorType.HandleRedirectCallbackFailed,
1746
- message: HandleRedirectCallbackErrorMessage.FailedToFindSessionId
2071
+ message: HandleRedirectCallbackErrorMessage.FailedToFindActiveSession
1747
2072
  });
1748
2073
  }
1749
2074
  const result = await exchangeSessionResult({
@@ -1760,16 +2085,45 @@
1760
2085
  });
1761
2086
  }
1762
2087
  return ok({
1763
- result: result.value,
2088
+ result: "challenge" in result.value ? result.value : undefined,
1764
2089
  sessionId: result.value.sessionId
1765
2090
  });
1766
2091
  };
2092
+ const abortCredentialRequest = async () => {
2093
+ const initialiseOptions = getInitialiseOptions();
2094
+ if (!initialiseOptions) {
2095
+ throw new Exception(InitialiseErrorMessage.SdkNotInitialised);
2096
+ }
2097
+ const {apiBaseUrl: apiBaseUrl} = initialiseOptions;
2098
+ const session = getActiveSession();
2099
+ if (!session || !session.sessionKey) {
2100
+ return ok(undefined);
2101
+ }
2102
+ const {sessionId: sessionId, sessionKey: sessionKey} = session;
2103
+ removeActiveSession();
2104
+ const abortSessionResult = await abortSession({
2105
+ apiBaseUrl: apiBaseUrl,
2106
+ sessionId: sessionId,
2107
+ sessionKey: sessionKey
2108
+ });
2109
+ if (abortSessionResult.isErr()) {
2110
+ return err({
2111
+ type: exports.AbortSessionErrorType.AbortSessionFailed,
2112
+ message: AbortSessionErrorMessage.FailedToAbortSession,
2113
+ cause: abortSessionResult.error
2114
+ });
2115
+ }
2116
+ return ok(undefined);
2117
+ };
1767
2118
  const utils = {
1768
2119
  generateChallenge: generateChallenge,
2120
+ getVersion: getVersion,
1769
2121
  unwrap: unwrap
1770
2122
  };
2123
+ exports.abortCredentialRequest = abortCredentialRequest;
1771
2124
  exports.handleRedirectCallback = handleRedirectCallback;
1772
2125
  exports.initialise = initialise;
2126
+ exports.isDigitalCredentialsApiSupported = isDigitalCredentialsApiSupported;
1773
2127
  exports.requestCredentials = requestCredentials;
1774
2128
  exports.utils = utils;
1775
2129
  Object.defineProperty(exports, "__esModule", {