@mattrglobal/verifier-sdk-web 1.1.1-unstable.91 → 1.1.1-unstable.94

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-02-24
10
+ * Generated: 2025-02-25
11
11
  * Version: 1.1.0
12
12
  * Dependencies:
13
13
  *
@@ -744,24 +744,6 @@
744
744
  }
745
745
  };
746
746
  }
747
- function function_(message) {
748
- return {
749
- kind: "schema",
750
- type: "function",
751
- reference: function_,
752
- expects: "Function",
753
- async: false,
754
- message: message,
755
- _run: function _run(dataset, config2) {
756
- if (typeof dataset.value === "function") {
757
- dataset.typed = true;
758
- } else {
759
- _addIssue(this, "type", dataset, config2);
760
- }
761
- return dataset;
762
- }
763
- };
764
- }
765
747
  function object(entries, message) {
766
748
  return {
767
749
  kind: "schema",
@@ -1302,6 +1284,13 @@
1302
1284
  (function(OpenidPresentationCredentialProfileSupported) {
1303
1285
  OpenidPresentationCredentialProfileSupported["MOBILE"] = "mobile";
1304
1286
  })(exports.OpenidPresentationCredentialProfileSupported || (exports.OpenidPresentationCredentialProfileSupported = {}));
1287
+ var PresentationStatusCode;
1288
+ (function(PresentationStatusCode) {
1289
+ PresentationStatusCode["AwaitingRequestRetrieval"] = "AwaitingRequestRetrieval";
1290
+ PresentationStatusCode["AwaitingResponse"] = "AwaitingResponse";
1291
+ PresentationStatusCode["ResponseSubmitted"] = "ResponseSubmitted";
1292
+ PresentationStatusCode["ResultReady"] = "ResultReady";
1293
+ })(PresentationStatusCode || (PresentationStatusCode = {}));
1305
1294
  const CredentialQueryValidator = object({
1306
1295
  profile: picklist([ exports.OpenidPresentationCredentialProfileSupported.MOBILE ]),
1307
1296
  docType: string(),
@@ -1333,8 +1322,15 @@
1333
1322
  });
1334
1323
  const CreateSessionResponseValidator = object({
1335
1324
  sessionId: string(),
1325
+ sessionKey: string(),
1336
1326
  sessionUrl: string()
1337
1327
  });
1328
+ const GetSessionStatusResponseValidator = union([ object({
1329
+ status: picklist([ PresentationStatusCode.ResultReady ]),
1330
+ responseCode: optional(string())
1331
+ }), object({
1332
+ status: string()
1333
+ }) ]);
1338
1334
  var LocalStorageKey;
1339
1335
  (function(LocalStorageKey) {
1340
1336
  LocalStorageKey["challenge"] = "mattr_chg";
@@ -1360,20 +1356,12 @@
1360
1356
  });
1361
1357
  const RequestCredentialsCrossDeviceOptionsValidator = object({
1362
1358
  credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1363
- crossDeviceCallback: object({
1364
- onComplete: function_(),
1365
- onFailure: function_()
1366
- }),
1367
1359
  challenge: optional(string()),
1368
1360
  walletProviderId: optional(string()),
1369
1361
  mode: picklist([ exports.Mode.crossDevice ])
1370
1362
  });
1371
1363
  const RequestCredentialsAutoDetectDeviceOptionsValidator = object({
1372
1364
  credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1373
- crossDeviceCallback: object({
1374
- onComplete: function_(),
1375
- onFailure: function_()
1376
- }),
1377
1365
  redirectUri: string(),
1378
1366
  challenge: optional(string()),
1379
1367
  walletProviderId: optional(string()),
@@ -1383,10 +1371,28 @@
1383
1371
  exports.RequestCredentialsErrorType = void 0;
1384
1372
  (function(RequestCredentialsErrorType) {
1385
1373
  RequestCredentialsErrorType["RequestCredentialsFailed"] = "RequestCredentialsFailed";
1374
+ RequestCredentialsErrorType["Timeout"] = "Timeout";
1375
+ RequestCredentialsErrorType["Abort"] = "Abort";
1386
1376
  })(exports.RequestCredentialsErrorType || (exports.RequestCredentialsErrorType = {}));
1377
+ var RequestCredentialsErrorMessage;
1378
+ (function(RequestCredentialsErrorMessage) {
1379
+ RequestCredentialsErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
1380
+ RequestCredentialsErrorMessage["FailedToGetSessionStatus"] = "Failed to get session status";
1381
+ RequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
1382
+ RequestCredentialsErrorMessage["Abort"] = "User aborted the session";
1383
+ RequestCredentialsErrorMessage["Timeout"] = "User session timeout";
1384
+ })(RequestCredentialsErrorMessage || (RequestCredentialsErrorMessage = {}));
1385
+ exports.AbortSessionErrorType = void 0;
1386
+ (function(AbortSessionErrorType) {
1387
+ AbortSessionErrorType["AbortSessionFailed"] = "AbortSessionFailed";
1388
+ })(exports.AbortSessionErrorType || (exports.AbortSessionErrorType = {}));
1389
+ var AbortSessionErrorMessage;
1390
+ (function(AbortSessionErrorMessage) {
1391
+ AbortSessionErrorMessage["FailedToAbortSession"] = "Failed to abort session";
1392
+ })(AbortSessionErrorMessage || (AbortSessionErrorMessage = {}));
1387
1393
  const InitialiseOptionsValidator = object({
1388
- apiBaseUrl: string(),
1389
- applicationId: optional(string())
1394
+ apiBaseUrl: pipe(string(), nonEmpty("Must not be empty")),
1395
+ applicationId: pipe(string(), nonEmpty("Must not be empty"))
1390
1396
  });
1391
1397
  let initialiseOptions = undefined;
1392
1398
  var InitialiseErrorMessage;
@@ -1398,6 +1404,34 @@
1398
1404
  initialiseOptions = options;
1399
1405
  };
1400
1406
  const getInitialiseOptions = () => initialiseOptions;
1407
+ let sessionAbortController = undefined;
1408
+ let _sessionId = undefined;
1409
+ let _sessionKey = undefined;
1410
+ const getActiveSession = () => {
1411
+ const sessionId = _sessionId;
1412
+ const sessionKey = _sessionKey;
1413
+ if (sessionId) {
1414
+ return {
1415
+ sessionId: sessionId,
1416
+ sessionKey: sessionKey
1417
+ };
1418
+ }
1419
+ return undefined;
1420
+ };
1421
+ const setActiveSession = session => {
1422
+ const {sessionId: sessionId, sessionKey: sessionKey} = session;
1423
+ _sessionId = sessionId;
1424
+ _sessionKey = sessionKey;
1425
+ const abortController = new AbortController;
1426
+ sessionAbortController = abortController;
1427
+ return abortController;
1428
+ };
1429
+ const removeActiveSession = () => {
1430
+ sessionAbortController === null || sessionAbortController === void 0 ? void 0 : sessionAbortController.abort();
1431
+ sessionAbortController = undefined;
1432
+ _sessionKey = undefined;
1433
+ _sessionId = undefined;
1434
+ };
1401
1435
  var isMobile_1 = isMobile;
1402
1436
  var isMobile_2 = isMobile;
1403
1437
  var default_1 = isMobile;
@@ -1422,6 +1456,23 @@
1422
1456
  isMobile_1["default"] = default_1;
1423
1457
  const defaultRetryDelay = attempt => Math.pow(2, attempt) * 1e3;
1424
1458
  const defaultRetry = 2;
1459
+ const withRetry = async (fn, options) => {
1460
+ const {retries: retries = defaultRetry, retryDelay: retryDelay = defaultRetryDelay, attempt: attempt = 0} = options;
1461
+ try {
1462
+ return await fn();
1463
+ } catch (err) {
1464
+ if (retries > 0) {
1465
+ const delay = typeof retryDelay === "function" ? retryDelay(attempt) : retryDelay;
1466
+ await new Promise((resolve => setTimeout(resolve, delay)));
1467
+ return await withRetry(fn, Object.assign(Object.assign({}, options), {
1468
+ retries: retries - 1,
1469
+ retryDelay: retryDelay,
1470
+ attempt: attempt + 1
1471
+ }));
1472
+ }
1473
+ throw err;
1474
+ }
1475
+ };
1425
1476
  const withRetrySafeFetch = async (fn, options) => {
1426
1477
  const {retries: retries = defaultRetry, retryDelay: retryDelay = defaultRetryDelay, attempt: attempt = 0, retryHttpStatus: retryHttpStatus} = options;
1427
1478
  const result = await fn();
@@ -1448,13 +1499,12 @@
1448
1499
  return urlParams.get(param);
1449
1500
  };
1450
1501
  const createSession = async ({credentialQuery: credentialQuery, challenge: challenge, redirectUri: redirectUri, apiBaseUrl: apiBaseUrl, applicationId: applicationId, walletProviderId: walletProviderId}) => {
1451
- const postData = Object.assign(Object.assign(Object.assign({
1502
+ const postData = Object.assign(Object.assign({
1452
1503
  credentialQuery: credentialQuery,
1453
- challenge: challenge
1504
+ challenge: challenge,
1505
+ applicationId: applicationId
1454
1506
  }, redirectUri ? {
1455
1507
  redirectUri: redirectUri
1456
- } : {}), applicationId ? {
1457
- applicationId: applicationId
1458
1508
  } : {}), walletProviderId ? {
1459
1509
  walletProviderId: walletProviderId
1460
1510
  } : {});
@@ -1477,6 +1527,38 @@
1477
1527
  }
1478
1528
  return ok(data);
1479
1529
  };
1530
+ const abortSession = async ({apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey}) => {
1531
+ const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/abort`, {
1532
+ method: "POST",
1533
+ headers: {
1534
+ "Content-Type": "application/json",
1535
+ Authorization: `Bearer ${sessionKey}`
1536
+ }
1537
+ });
1538
+ if (responseResult.isErr()) {
1539
+ return err(responseResult.error);
1540
+ }
1541
+ return ok(undefined);
1542
+ };
1543
+ const getSessionStatus = async ({apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey}) => {
1544
+ const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/status`, {
1545
+ method: "GET",
1546
+ headers: {
1547
+ Authorization: `Bearer ${sessionKey}`
1548
+ }
1549
+ });
1550
+ if (responseResult.isErr()) {
1551
+ return err(responseResult.error);
1552
+ }
1553
+ const data = await responseResult.value.json();
1554
+ if (!isType(GetSessionStatusResponseValidator)(data)) {
1555
+ return err({
1556
+ type: SafeFetchCommonRespondErrorType.UnexpectedRespond,
1557
+ message: "Get session status return unsupported response"
1558
+ });
1559
+ }
1560
+ return ok(data);
1561
+ };
1480
1562
  const exchangeSessionResult = async ({challenge: challenge, responseCode: responseCode, sessionId: sessionId, apiBaseUrl: apiBaseUrl}) => {
1481
1563
  const postData = {
1482
1564
  challenge: challenge,
@@ -1512,26 +1594,16 @@
1512
1594
  ua: userAgent,
1513
1595
  tablet: false
1514
1596
  });
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 = {}));
1528
1597
  var WindowEventListenerType;
1529
1598
  (function(WindowEventListenerType) {
1530
1599
  WindowEventListenerType["message"] = "message";
1531
1600
  })(WindowEventListenerType || (WindowEventListenerType = {}));
1532
- let listener;
1601
+ let listener = undefined;
1533
1602
  const removeWindowMessageEventListener = () => {
1534
- window.removeEventListener(WindowEventListenerType.message, listener, false);
1603
+ if (listener) {
1604
+ window.removeEventListener(WindowEventListenerType.message, listener, false);
1605
+ }
1606
+ listener = undefined;
1535
1607
  };
1536
1608
  const closeCrossDeviceModal = options => {
1537
1609
  const {container: container} = options;
@@ -1541,8 +1613,7 @@
1541
1613
  removeWindowMessageEventListener();
1542
1614
  };
1543
1615
  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;
1616
+ const {onComplete: onComplete, onFailure: onFailure, container: container, sessionId: sessionId, apiBaseUrl: apiBaseUrl, challenge: challenge} = options;
1546
1617
  if (event.origin !== apiBaseUrl) {
1547
1618
  return;
1548
1619
  }
@@ -1556,8 +1627,8 @@
1556
1627
  });
1557
1628
  if (result.isErr()) {
1558
1629
  onFailure({
1559
- type: exports.CrossDeviceCallbackErrorType.RequestCredentialsFailed,
1560
- message: CrossDeviceRequestCredentialsErrorMessage.FailedToGetSessionResult
1630
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1631
+ message: RequestCredentialsErrorMessage.FailedToGetSessionResult
1561
1632
  });
1562
1633
  closeCrossDeviceModal({
1563
1634
  container: container
@@ -1565,8 +1636,9 @@
1565
1636
  return;
1566
1637
  }
1567
1638
  onComplete({
1568
- result: result.value,
1569
- sessionId: result.value.sessionId
1639
+ result: "challenge" in result.value ? result.value : undefined,
1640
+ sessionId: result.value.sessionId,
1641
+ sessionCompletedInRedirect: false
1570
1642
  });
1571
1643
  closeCrossDeviceModal({
1572
1644
  container: container
@@ -1575,8 +1647,8 @@
1575
1647
  }
1576
1648
  if (event.data.type === MessageEventDataType.PresentationTimeout) {
1577
1649
  onFailure({
1578
- type: exports.CrossDeviceCallbackErrorType.Timeout,
1579
- message: CrossDeviceRequestCredentialsErrorMessage.Timeout
1650
+ type: exports.RequestCredentialsErrorType.Timeout,
1651
+ message: RequestCredentialsErrorMessage.Timeout
1580
1652
  });
1581
1653
  closeCrossDeviceModal({
1582
1654
  container: container
@@ -1585,8 +1657,8 @@
1585
1657
  }
1586
1658
  if (event.data.type === MessageEventDataType.PresentationAbort) {
1587
1659
  onFailure({
1588
- type: exports.CrossDeviceCallbackErrorType.Abort,
1589
- message: CrossDeviceRequestCredentialsErrorMessage.Abort
1660
+ type: exports.RequestCredentialsErrorType.Abort,
1661
+ message: RequestCredentialsErrorMessage.Abort
1590
1662
  });
1591
1663
  closeCrossDeviceModal({
1592
1664
  container: container
@@ -1610,7 +1682,7 @@
1610
1682
  return modalContainer;
1611
1683
  };
1612
1684
  const requestCredentialsCrossDevice = async options => {
1613
- const {challenge: challenge, walletProviderId: walletProviderId, credentialQuery: credentialQuery, crossDeviceCallback: crossDeviceCallback, initialiseOptions: initialiseOptions} = options;
1685
+ const {challenge: challenge, walletProviderId: walletProviderId, credentialQuery: credentialQuery, initialiseOptions: initialiseOptions} = options;
1614
1686
  const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
1615
1687
  const createSessionResult = await createSession({
1616
1688
  credentialQuery: credentialQuery,
@@ -1622,27 +1694,44 @@
1622
1694
  if (createSessionResult.isErr()) {
1623
1695
  return err({
1624
1696
  type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1625
- message: CrossDeviceRequestCredentialsErrorMessage.FailedToCreateSession,
1697
+ message: RequestCredentialsErrorMessage.FailedToCreateSession,
1626
1698
  cause: createSessionResult.error
1627
1699
  });
1628
1700
  }
1629
- const {sessionUrl: sessionUrl, sessionId: sessionId} = createSessionResult.value;
1701
+ const {sessionUrl: sessionUrl, sessionId: sessionId, sessionKey: sessionKey} = createSessionResult.value;
1630
1702
  const container = openCrossDeviceModal({
1631
- sessionUrl: sessionUrl,
1632
- crossDeviceCallback: crossDeviceCallback
1633
- });
1634
- listener = receiveMessageHandler({
1635
- crossDeviceCallback: crossDeviceCallback,
1636
- container: container,
1637
- sessionId: sessionId,
1638
- apiBaseUrl: apiBaseUrl,
1639
- challenge: challenge
1640
- });
1641
- window.addEventListener(WindowEventListenerType.message, listener, false);
1642
- return ok({
1643
- sessionId: sessionId
1703
+ sessionUrl: sessionUrl
1644
1704
  });
1705
+ return await new Promise((resolve => {
1706
+ const abortController = setActiveSession({
1707
+ sessionId: sessionId,
1708
+ sessionKey: sessionKey
1709
+ });
1710
+ abortController.signal.addEventListener("abort", (() => {
1711
+ closeCrossDeviceModal({
1712
+ container: container
1713
+ });
1714
+ resolve(err({
1715
+ type: exports.RequestCredentialsErrorType.Abort,
1716
+ message: RequestCredentialsErrorMessage.Abort
1717
+ }));
1718
+ }));
1719
+ removeWindowMessageEventListener();
1720
+ listener = receiveMessageHandler({
1721
+ container: container,
1722
+ sessionId: sessionId,
1723
+ apiBaseUrl: apiBaseUrl,
1724
+ challenge: challenge,
1725
+ onComplete: data => resolve(ok(data)),
1726
+ onFailure: error => resolve(err(error))
1727
+ });
1728
+ window.addEventListener(WindowEventListenerType.message, listener, false);
1729
+ }));
1645
1730
  };
1731
+ const sleep = ms => new Promise((resolve => setTimeout(resolve, ms)));
1732
+ const SESSION_STATUS_POLLING_MAX_RETRY = 1e3;
1733
+ const SESSION_STATUS_POLLING_INTERVAL_MS = 3e3;
1734
+ const SESSION_STATUS_POLLING_INITIAL_DELAY_MS = 3e3;
1646
1735
  var SameDeviceRequestCredentialsErrorMessage;
1647
1736
  (function(SameDeviceRequestCredentialsErrorMessage) {
1648
1737
  SameDeviceRequestCredentialsErrorMessage["FailedToStoreChallenge"] = "Failed to store challenge";
@@ -1651,17 +1740,9 @@
1651
1740
  const requestCredentialsSameDevice = async options => {
1652
1741
  const {challenge: challenge, credentialQuery: credentialQuery, redirectUri: redirectUri, walletProviderId: walletProviderId, initialiseOptions: initialiseOptions} = options;
1653
1742
  const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
1654
- 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
1660
- });
1661
- }
1662
1743
  const createSessionResult = await createSession({
1663
1744
  credentialQuery: credentialQuery,
1664
- challenge: storedChallenge,
1745
+ challenge: challenge,
1665
1746
  redirectUri: redirectUri,
1666
1747
  apiBaseUrl: apiBaseUrl,
1667
1748
  applicationId: applicationId,
@@ -1674,11 +1755,52 @@
1674
1755
  cause: createSessionResult.error
1675
1756
  });
1676
1757
  }
1677
- const {sessionUrl: sessionUrl, sessionId: sessionId} = createSessionResult.value;
1758
+ const {sessionUrl: sessionUrl, sessionKey: sessionKey, sessionId: sessionId} = createSessionResult.value;
1759
+ const abortController = setActiveSession({
1760
+ sessionId: sessionId,
1761
+ sessionKey: sessionKey
1762
+ });
1678
1763
  window.localStorage.setItem(LocalStorageKey.sessionId, sessionId);
1764
+ window.localStorage.setItem(LocalStorageKey.challenge, challenge);
1679
1765
  window.location.assign(sessionUrl);
1766
+ await sleep(SESSION_STATUS_POLLING_INITIAL_DELAY_MS);
1767
+ const checkResult = await withRetry((async () => {
1768
+ const statusResult = await getSessionStatus({
1769
+ apiBaseUrl: apiBaseUrl,
1770
+ applicationId: applicationId,
1771
+ sessionId: sessionId,
1772
+ sessionKey: sessionKey
1773
+ });
1774
+ if (abortController.signal.aborted) {
1775
+ return err({
1776
+ type: exports.RequestCredentialsErrorType.Abort,
1777
+ message: RequestCredentialsErrorMessage.Abort
1778
+ });
1779
+ }
1780
+ if (statusResult.isErr()) {
1781
+ if (statusResult.error.status === 404) {
1782
+ return err({
1783
+ type: exports.RequestCredentialsErrorType.Timeout,
1784
+ message: RequestCredentialsErrorMessage.Timeout
1785
+ });
1786
+ }
1787
+ throw Error("Unexpected status response. Retry");
1788
+ }
1789
+ if (statusResult.value.status !== PresentationStatusCode.ResultReady) {
1790
+ throw Error("Result is not ready. Retry");
1791
+ }
1792
+ return ok(undefined);
1793
+ }), {
1794
+ retries: SESSION_STATUS_POLLING_MAX_RETRY,
1795
+ retryDelay: SESSION_STATUS_POLLING_INTERVAL_MS
1796
+ });
1797
+ if (checkResult.isErr()) {
1798
+ return err(checkResult.error);
1799
+ }
1800
+ window.close();
1680
1801
  return ok({
1681
- sessionId: sessionId
1802
+ sessionId: sessionId,
1803
+ sessionCompletedInRedirect: true
1682
1804
  });
1683
1805
  };
1684
1806
  const requestCredentials = async options => {
@@ -1697,16 +1819,11 @@
1697
1819
  mode: mode
1698
1820
  }));
1699
1821
  }
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
- }));
1706
- }
1707
- throw new Exception("Invalid request credential options", {
1708
- data: options
1709
- });
1822
+ return await requestCredentialsCrossDevice(Object.assign(Object.assign({}, options), {
1823
+ initialiseOptions: initialiseOptions,
1824
+ challenge: challenge,
1825
+ mode: exports.Mode.crossDevice
1826
+ }));
1710
1827
  };
1711
1828
  exports.HandleRedirectCallbackErrorType = void 0;
1712
1829
  (function(HandleRedirectCallbackErrorType) {
@@ -1716,7 +1833,7 @@
1716
1833
  (function(HandleRedirectCallbackErrorMessage) {
1717
1834
  HandleRedirectCallbackErrorMessage["FailedToFindResponseCode"] = "Failed to find response code";
1718
1835
  HandleRedirectCallbackErrorMessage["FailedToFindChallenge"] = "Failed to find challenge";
1719
- HandleRedirectCallbackErrorMessage["FailedToFindSessionId"] = "Failed to find sessionId";
1836
+ HandleRedirectCallbackErrorMessage["FailedToFindActiveSession"] = "Failed to find active session";
1720
1837
  HandleRedirectCallbackErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
1721
1838
  })(HandleRedirectCallbackErrorMessage || (HandleRedirectCallbackErrorMessage = {}));
1722
1839
  const handleRedirectCallback = async () => {
@@ -1732,18 +1849,12 @@
1732
1849
  message: HandleRedirectCallbackErrorMessage.FailedToFindResponseCode
1733
1850
  });
1734
1851
  }
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
1852
  const sessionId = window.localStorage.getItem(LocalStorageKey.sessionId);
1743
- if (!sessionId) {
1853
+ const challenge = window.localStorage.getItem(LocalStorageKey.challenge);
1854
+ if (!sessionId || !challenge) {
1744
1855
  return err({
1745
1856
  type: exports.HandleRedirectCallbackErrorType.HandleRedirectCallbackFailed,
1746
- message: HandleRedirectCallbackErrorMessage.FailedToFindSessionId
1857
+ message: HandleRedirectCallbackErrorMessage.FailedToFindActiveSession
1747
1858
  });
1748
1859
  }
1749
1860
  const result = await exchangeSessionResult({
@@ -1760,14 +1871,42 @@
1760
1871
  });
1761
1872
  }
1762
1873
  return ok({
1763
- result: result.value,
1874
+ result: "challenge" in result.value ? result.value : undefined,
1764
1875
  sessionId: result.value.sessionId
1765
1876
  });
1766
1877
  };
1878
+ const abortCredentialRequest = async () => {
1879
+ const initialiseOptions = getInitialiseOptions();
1880
+ if (!initialiseOptions) {
1881
+ throw new Exception(InitialiseErrorMessage.SdkNotInitialised);
1882
+ }
1883
+ const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
1884
+ const session = getActiveSession();
1885
+ if (!session || !session.sessionKey) {
1886
+ return ok(undefined);
1887
+ }
1888
+ const {sessionId: sessionId, sessionKey: sessionKey} = session;
1889
+ removeActiveSession();
1890
+ const abortSessionResult = await abortSession({
1891
+ apiBaseUrl: apiBaseUrl,
1892
+ applicationId: applicationId,
1893
+ sessionId: sessionId,
1894
+ sessionKey: sessionKey
1895
+ });
1896
+ if (abortSessionResult.isErr()) {
1897
+ return err({
1898
+ type: exports.AbortSessionErrorType.AbortSessionFailed,
1899
+ message: AbortSessionErrorMessage.FailedToAbortSession,
1900
+ cause: abortSessionResult.error
1901
+ });
1902
+ }
1903
+ return ok(undefined);
1904
+ };
1767
1905
  const utils = {
1768
1906
  generateChallenge: generateChallenge,
1769
1907
  unwrap: unwrap
1770
1908
  };
1909
+ exports.abortCredentialRequest = abortCredentialRequest;
1771
1910
  exports.handleRedirectCallback = handleRedirectCallback;
1772
1911
  exports.initialise = initialise;
1773
1912
  exports.requestCredentials = requestCredentials;