@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
  *
@@ -793,25 +793,6 @@ function _boolean(message) {
793
793
  };
794
794
  }
795
795
 
796
- function function_(message) {
797
- return {
798
- kind: "schema",
799
- type: "function",
800
- reference: function_,
801
- expects: "Function",
802
- async: false,
803
- message: message,
804
- _run: function _run(dataset, config2) {
805
- if (typeof dataset.value === "function") {
806
- dataset.typed = true;
807
- } else {
808
- _addIssue(this, "type", dataset, config2);
809
- }
810
- return dataset;
811
- }
812
- };
813
- }
814
-
815
796
  function object(entries, message) {
816
797
  return {
817
798
  kind: "schema",
@@ -1382,6 +1363,15 @@ exports.OpenidPresentationCredentialProfileSupported = void 0;
1382
1363
  OpenidPresentationCredentialProfileSupported["MOBILE"] = "mobile";
1383
1364
  })(exports.OpenidPresentationCredentialProfileSupported || (exports.OpenidPresentationCredentialProfileSupported = {}));
1384
1365
 
1366
+ var PresentationStatusCode;
1367
+
1368
+ (function(PresentationStatusCode) {
1369
+ PresentationStatusCode["AwaitingRequestRetrieval"] = "AwaitingRequestRetrieval";
1370
+ PresentationStatusCode["AwaitingResponse"] = "AwaitingResponse";
1371
+ PresentationStatusCode["ResponseSubmitted"] = "ResponseSubmitted";
1372
+ PresentationStatusCode["ResultReady"] = "ResultReady";
1373
+ })(PresentationStatusCode || (PresentationStatusCode = {}));
1374
+
1385
1375
  const CredentialQueryValidator = object({
1386
1376
  profile: picklist([ exports.OpenidPresentationCredentialProfileSupported.MOBILE ]),
1387
1377
  docType: string(),
@@ -1418,9 +1408,17 @@ object({
1418
1408
 
1419
1409
  const CreateSessionResponseValidator = object({
1420
1410
  sessionId: string(),
1411
+ sessionKey: string(),
1421
1412
  sessionUrl: string()
1422
1413
  });
1423
1414
 
1415
+ const GetSessionStatusResponseValidator = union([ object({
1416
+ status: picklist([ PresentationStatusCode.ResultReady ]),
1417
+ responseCode: optional(string())
1418
+ }), object({
1419
+ status: string()
1420
+ }) ]);
1421
+
1424
1422
  var LocalStorageKey;
1425
1423
 
1426
1424
  (function(LocalStorageKey) {
@@ -1453,10 +1451,6 @@ const RequestCredentialsSameDeviceOptionsValidator = object({
1453
1451
 
1454
1452
  const RequestCredentialsCrossDeviceOptionsValidator = object({
1455
1453
  credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1456
- crossDeviceCallback: object({
1457
- onComplete: function_(),
1458
- onFailure: function_()
1459
- }),
1460
1454
  challenge: optional(string()),
1461
1455
  walletProviderId: optional(string()),
1462
1456
  mode: picklist([ exports.Mode.crossDevice ])
@@ -1464,10 +1458,6 @@ const RequestCredentialsCrossDeviceOptionsValidator = object({
1464
1458
 
1465
1459
  const RequestCredentialsAutoDetectDeviceOptionsValidator = object({
1466
1460
  credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
1467
- crossDeviceCallback: object({
1468
- onComplete: function_(),
1469
- onFailure: function_()
1470
- }),
1471
1461
  redirectUri: string(),
1472
1462
  challenge: optional(string()),
1473
1463
  walletProviderId: optional(string()),
@@ -1480,11 +1470,35 @@ exports.RequestCredentialsErrorType = void 0;
1480
1470
 
1481
1471
  (function(RequestCredentialsErrorType) {
1482
1472
  RequestCredentialsErrorType["RequestCredentialsFailed"] = "RequestCredentialsFailed";
1473
+ RequestCredentialsErrorType["Timeout"] = "Timeout";
1474
+ RequestCredentialsErrorType["Abort"] = "Abort";
1483
1475
  })(exports.RequestCredentialsErrorType || (exports.RequestCredentialsErrorType = {}));
1484
1476
 
1477
+ var RequestCredentialsErrorMessage;
1478
+
1479
+ (function(RequestCredentialsErrorMessage) {
1480
+ RequestCredentialsErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
1481
+ RequestCredentialsErrorMessage["FailedToGetSessionStatus"] = "Failed to get session status";
1482
+ RequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
1483
+ RequestCredentialsErrorMessage["Abort"] = "User aborted the session";
1484
+ RequestCredentialsErrorMessage["Timeout"] = "User session timeout";
1485
+ })(RequestCredentialsErrorMessage || (RequestCredentialsErrorMessage = {}));
1486
+
1487
+ exports.AbortSessionErrorType = void 0;
1488
+
1489
+ (function(AbortSessionErrorType) {
1490
+ AbortSessionErrorType["AbortSessionFailed"] = "AbortSessionFailed";
1491
+ })(exports.AbortSessionErrorType || (exports.AbortSessionErrorType = {}));
1492
+
1493
+ var AbortSessionErrorMessage;
1494
+
1495
+ (function(AbortSessionErrorMessage) {
1496
+ AbortSessionErrorMessage["FailedToAbortSession"] = "Failed to abort session";
1497
+ })(AbortSessionErrorMessage || (AbortSessionErrorMessage = {}));
1498
+
1485
1499
  const InitialiseOptionsValidator = object({
1486
- apiBaseUrl: string(),
1487
- applicationId: optional(string())
1500
+ apiBaseUrl: pipe(string(), nonEmpty("Must not be empty")),
1501
+ applicationId: pipe(string(), nonEmpty("Must not be empty"))
1488
1502
  });
1489
1503
 
1490
1504
  let initialiseOptions = undefined;
@@ -1502,6 +1516,40 @@ const initialise = options => {
1502
1516
 
1503
1517
  const getInitialiseOptions = () => initialiseOptions;
1504
1518
 
1519
+ let sessionAbortController = undefined;
1520
+
1521
+ let _sessionId = undefined;
1522
+
1523
+ let _sessionKey = undefined;
1524
+
1525
+ const getActiveSession = () => {
1526
+ const sessionId = _sessionId;
1527
+ const sessionKey = _sessionKey;
1528
+ if (sessionId) {
1529
+ return {
1530
+ sessionId: sessionId,
1531
+ sessionKey: sessionKey
1532
+ };
1533
+ }
1534
+ return undefined;
1535
+ };
1536
+
1537
+ const setActiveSession = session => {
1538
+ const {sessionId: sessionId, sessionKey: sessionKey} = session;
1539
+ _sessionId = sessionId;
1540
+ _sessionKey = sessionKey;
1541
+ const abortController = new AbortController;
1542
+ sessionAbortController = abortController;
1543
+ return abortController;
1544
+ };
1545
+
1546
+ const removeActiveSession = () => {
1547
+ sessionAbortController === null || sessionAbortController === void 0 ? void 0 : sessionAbortController.abort();
1548
+ sessionAbortController = undefined;
1549
+ _sessionKey = undefined;
1550
+ _sessionId = undefined;
1551
+ };
1552
+
1505
1553
  var isMobile_1 = isMobile;
1506
1554
 
1507
1555
  var isMobile_2 = isMobile;
@@ -1537,6 +1585,24 @@ const defaultRetryDelay = attempt => Math.pow(2, attempt) * 1e3;
1537
1585
 
1538
1586
  const defaultRetry = 2;
1539
1587
 
1588
+ const withRetry = async (fn, options) => {
1589
+ const {retries: retries = defaultRetry, retryDelay: retryDelay = defaultRetryDelay, attempt: attempt = 0} = options;
1590
+ try {
1591
+ return await fn();
1592
+ } catch (err) {
1593
+ if (retries > 0) {
1594
+ const delay = typeof retryDelay === "function" ? retryDelay(attempt) : retryDelay;
1595
+ await new Promise((resolve => setTimeout(resolve, delay)));
1596
+ return await withRetry(fn, Object.assign(Object.assign({}, options), {
1597
+ retries: retries - 1,
1598
+ retryDelay: retryDelay,
1599
+ attempt: attempt + 1
1600
+ }));
1601
+ }
1602
+ throw err;
1603
+ }
1604
+ };
1605
+
1540
1606
  const withRetrySafeFetch = async (fn, options) => {
1541
1607
  const {retries: retries = defaultRetry, retryDelay: retryDelay = defaultRetryDelay, attempt: attempt = 0, retryHttpStatus: retryHttpStatus} = options;
1542
1608
  const result = await fn();
@@ -1566,13 +1632,12 @@ const getHashParamValue = (hash, param) => {
1566
1632
  };
1567
1633
 
1568
1634
  const createSession = async ({credentialQuery: credentialQuery, challenge: challenge, redirectUri: redirectUri, apiBaseUrl: apiBaseUrl, applicationId: applicationId, walletProviderId: walletProviderId}) => {
1569
- const postData = Object.assign(Object.assign(Object.assign({
1635
+ const postData = Object.assign(Object.assign({
1570
1636
  credentialQuery: credentialQuery,
1571
- challenge: challenge
1637
+ challenge: challenge,
1638
+ applicationId: applicationId
1572
1639
  }, redirectUri ? {
1573
1640
  redirectUri: redirectUri
1574
- } : {}), applicationId ? {
1575
- applicationId: applicationId
1576
1641
  } : {}), walletProviderId ? {
1577
1642
  walletProviderId: walletProviderId
1578
1643
  } : {});
@@ -1596,6 +1661,40 @@ const createSession = async ({credentialQuery: credentialQuery, challenge: chall
1596
1661
  return ok(data);
1597
1662
  };
1598
1663
 
1664
+ const abortSession = async ({apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey}) => {
1665
+ const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/abort`, {
1666
+ method: "POST",
1667
+ headers: {
1668
+ "Content-Type": "application/json",
1669
+ Authorization: `Bearer ${sessionKey}`
1670
+ }
1671
+ });
1672
+ if (responseResult.isErr()) {
1673
+ return err(responseResult.error);
1674
+ }
1675
+ return ok(undefined);
1676
+ };
1677
+
1678
+ const getSessionStatus = async ({apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey}) => {
1679
+ const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/status`, {
1680
+ method: "GET",
1681
+ headers: {
1682
+ Authorization: `Bearer ${sessionKey}`
1683
+ }
1684
+ });
1685
+ if (responseResult.isErr()) {
1686
+ return err(responseResult.error);
1687
+ }
1688
+ const data = await responseResult.value.json();
1689
+ if (!isType(GetSessionStatusResponseValidator)(data)) {
1690
+ return err({
1691
+ type: SafeFetchCommonRespondErrorType.UnexpectedRespond,
1692
+ message: "Get session status return unsupported response"
1693
+ });
1694
+ }
1695
+ return ok(data);
1696
+ };
1697
+
1599
1698
  const exchangeSessionResult = async ({challenge: challenge, responseCode: responseCode, sessionId: sessionId, apiBaseUrl: apiBaseUrl}) => {
1600
1699
  const postData = {
1601
1700
  challenge: challenge,
@@ -1633,33 +1732,19 @@ const isMobileDetect = userAgent => isMobile_2({
1633
1732
  tablet: false
1634
1733
  });
1635
1734
 
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 = {}));
1652
-
1653
1735
  var WindowEventListenerType;
1654
1736
 
1655
1737
  (function(WindowEventListenerType) {
1656
1738
  WindowEventListenerType["message"] = "message";
1657
1739
  })(WindowEventListenerType || (WindowEventListenerType = {}));
1658
1740
 
1659
- let listener;
1741
+ let listener = undefined;
1660
1742
 
1661
1743
  const removeWindowMessageEventListener = () => {
1662
- window.removeEventListener(WindowEventListenerType.message, listener, false);
1744
+ if (listener) {
1745
+ window.removeEventListener(WindowEventListenerType.message, listener, false);
1746
+ }
1747
+ listener = undefined;
1663
1748
  };
1664
1749
 
1665
1750
  const closeCrossDeviceModal = options => {
@@ -1671,8 +1756,7 @@ const closeCrossDeviceModal = options => {
1671
1756
  };
1672
1757
 
1673
1758
  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;
1759
+ const {onComplete: onComplete, onFailure: onFailure, container: container, sessionId: sessionId, apiBaseUrl: apiBaseUrl, challenge: challenge} = options;
1676
1760
  if (event.origin !== apiBaseUrl) {
1677
1761
  return;
1678
1762
  }
@@ -1686,8 +1770,8 @@ const receiveMessageHandler = options => async event => {
1686
1770
  });
1687
1771
  if (result.isErr()) {
1688
1772
  onFailure({
1689
- type: exports.CrossDeviceCallbackErrorType.RequestCredentialsFailed,
1690
- message: CrossDeviceRequestCredentialsErrorMessage.FailedToGetSessionResult
1773
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1774
+ message: RequestCredentialsErrorMessage.FailedToGetSessionResult
1691
1775
  });
1692
1776
  closeCrossDeviceModal({
1693
1777
  container: container
@@ -1695,8 +1779,9 @@ const receiveMessageHandler = options => async event => {
1695
1779
  return;
1696
1780
  }
1697
1781
  onComplete({
1698
- result: result.value,
1699
- sessionId: result.value.sessionId
1782
+ result: "challenge" in result.value ? result.value : undefined,
1783
+ sessionId: result.value.sessionId,
1784
+ sessionCompletedInRedirect: false
1700
1785
  });
1701
1786
  closeCrossDeviceModal({
1702
1787
  container: container
@@ -1705,8 +1790,8 @@ const receiveMessageHandler = options => async event => {
1705
1790
  }
1706
1791
  if (event.data.type === MessageEventDataType.PresentationTimeout) {
1707
1792
  onFailure({
1708
- type: exports.CrossDeviceCallbackErrorType.Timeout,
1709
- message: CrossDeviceRequestCredentialsErrorMessage.Timeout
1793
+ type: exports.RequestCredentialsErrorType.Timeout,
1794
+ message: RequestCredentialsErrorMessage.Timeout
1710
1795
  });
1711
1796
  closeCrossDeviceModal({
1712
1797
  container: container
@@ -1715,8 +1800,8 @@ const receiveMessageHandler = options => async event => {
1715
1800
  }
1716
1801
  if (event.data.type === MessageEventDataType.PresentationAbort) {
1717
1802
  onFailure({
1718
- type: exports.CrossDeviceCallbackErrorType.Abort,
1719
- message: CrossDeviceRequestCredentialsErrorMessage.Abort
1803
+ type: exports.RequestCredentialsErrorType.Abort,
1804
+ message: RequestCredentialsErrorMessage.Abort
1720
1805
  });
1721
1806
  closeCrossDeviceModal({
1722
1807
  container: container
@@ -1742,7 +1827,7 @@ const openCrossDeviceModal = options => {
1742
1827
  };
1743
1828
 
1744
1829
  const requestCredentialsCrossDevice = async options => {
1745
- const {challenge: challenge, walletProviderId: walletProviderId, credentialQuery: credentialQuery, crossDeviceCallback: crossDeviceCallback, initialiseOptions: initialiseOptions} = options;
1830
+ const {challenge: challenge, walletProviderId: walletProviderId, credentialQuery: credentialQuery, initialiseOptions: initialiseOptions} = options;
1746
1831
  const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
1747
1832
  const createSessionResult = await createSession({
1748
1833
  credentialQuery: credentialQuery,
@@ -1754,28 +1839,49 @@ const requestCredentialsCrossDevice = async options => {
1754
1839
  if (createSessionResult.isErr()) {
1755
1840
  return err({
1756
1841
  type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1757
- message: CrossDeviceRequestCredentialsErrorMessage.FailedToCreateSession,
1842
+ message: RequestCredentialsErrorMessage.FailedToCreateSession,
1758
1843
  cause: createSessionResult.error
1759
1844
  });
1760
1845
  }
1761
- const {sessionUrl: sessionUrl, sessionId: sessionId} = createSessionResult.value;
1846
+ const {sessionUrl: sessionUrl, sessionId: sessionId, sessionKey: sessionKey} = createSessionResult.value;
1762
1847
  const container = openCrossDeviceModal({
1763
- sessionUrl: sessionUrl,
1764
- crossDeviceCallback: crossDeviceCallback
1765
- });
1766
- listener = receiveMessageHandler({
1767
- crossDeviceCallback: crossDeviceCallback,
1768
- container: container,
1769
- sessionId: sessionId,
1770
- apiBaseUrl: apiBaseUrl,
1771
- challenge: challenge
1772
- });
1773
- window.addEventListener(WindowEventListenerType.message, listener, false);
1774
- return ok({
1775
- sessionId: sessionId
1848
+ sessionUrl: sessionUrl
1776
1849
  });
1850
+ return await new Promise((resolve => {
1851
+ const abortController = setActiveSession({
1852
+ sessionId: sessionId,
1853
+ sessionKey: sessionKey
1854
+ });
1855
+ abortController.signal.addEventListener("abort", (() => {
1856
+ closeCrossDeviceModal({
1857
+ container: container
1858
+ });
1859
+ resolve(err({
1860
+ type: exports.RequestCredentialsErrorType.Abort,
1861
+ message: RequestCredentialsErrorMessage.Abort
1862
+ }));
1863
+ }));
1864
+ removeWindowMessageEventListener();
1865
+ listener = receiveMessageHandler({
1866
+ container: container,
1867
+ sessionId: sessionId,
1868
+ apiBaseUrl: apiBaseUrl,
1869
+ challenge: challenge,
1870
+ onComplete: data => resolve(ok(data)),
1871
+ onFailure: error => resolve(err(error))
1872
+ });
1873
+ window.addEventListener(WindowEventListenerType.message, listener, false);
1874
+ }));
1777
1875
  };
1778
1876
 
1877
+ const sleep = ms => new Promise((resolve => setTimeout(resolve, ms)));
1878
+
1879
+ const SESSION_STATUS_POLLING_MAX_RETRY = 1e3;
1880
+
1881
+ const SESSION_STATUS_POLLING_INTERVAL_MS = 3e3;
1882
+
1883
+ const SESSION_STATUS_POLLING_INITIAL_DELAY_MS = 3e3;
1884
+
1779
1885
  var SameDeviceRequestCredentialsErrorMessage;
1780
1886
 
1781
1887
  (function(SameDeviceRequestCredentialsErrorMessage) {
@@ -1786,17 +1892,9 @@ var SameDeviceRequestCredentialsErrorMessage;
1786
1892
  const requestCredentialsSameDevice = async options => {
1787
1893
  const {challenge: challenge, credentialQuery: credentialQuery, redirectUri: redirectUri, walletProviderId: walletProviderId, initialiseOptions: initialiseOptions} = options;
1788
1894
  const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
1789
- 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
1795
- });
1796
- }
1797
1895
  const createSessionResult = await createSession({
1798
1896
  credentialQuery: credentialQuery,
1799
- challenge: storedChallenge,
1897
+ challenge: challenge,
1800
1898
  redirectUri: redirectUri,
1801
1899
  apiBaseUrl: apiBaseUrl,
1802
1900
  applicationId: applicationId,
@@ -1809,11 +1907,52 @@ const requestCredentialsSameDevice = async options => {
1809
1907
  cause: createSessionResult.error
1810
1908
  });
1811
1909
  }
1812
- const {sessionUrl: sessionUrl, sessionId: sessionId} = createSessionResult.value;
1910
+ const {sessionUrl: sessionUrl, sessionKey: sessionKey, sessionId: sessionId} = createSessionResult.value;
1911
+ const abortController = setActiveSession({
1912
+ sessionId: sessionId,
1913
+ sessionKey: sessionKey
1914
+ });
1813
1915
  window.localStorage.setItem(LocalStorageKey.sessionId, sessionId);
1916
+ window.localStorage.setItem(LocalStorageKey.challenge, challenge);
1814
1917
  window.location.assign(sessionUrl);
1918
+ await sleep(SESSION_STATUS_POLLING_INITIAL_DELAY_MS);
1919
+ const checkResult = await withRetry((async () => {
1920
+ const statusResult = await getSessionStatus({
1921
+ apiBaseUrl: apiBaseUrl,
1922
+ applicationId: applicationId,
1923
+ sessionId: sessionId,
1924
+ sessionKey: sessionKey
1925
+ });
1926
+ if (abortController.signal.aborted) {
1927
+ return err({
1928
+ type: exports.RequestCredentialsErrorType.Abort,
1929
+ message: RequestCredentialsErrorMessage.Abort
1930
+ });
1931
+ }
1932
+ if (statusResult.isErr()) {
1933
+ if (statusResult.error.status === 404) {
1934
+ return err({
1935
+ type: exports.RequestCredentialsErrorType.Timeout,
1936
+ message: RequestCredentialsErrorMessage.Timeout
1937
+ });
1938
+ }
1939
+ throw Error("Unexpected status response. Retry");
1940
+ }
1941
+ if (statusResult.value.status !== PresentationStatusCode.ResultReady) {
1942
+ throw Error("Result is not ready. Retry");
1943
+ }
1944
+ return ok(undefined);
1945
+ }), {
1946
+ retries: SESSION_STATUS_POLLING_MAX_RETRY,
1947
+ retryDelay: SESSION_STATUS_POLLING_INTERVAL_MS
1948
+ });
1949
+ if (checkResult.isErr()) {
1950
+ return err(checkResult.error);
1951
+ }
1952
+ window.close();
1815
1953
  return ok({
1816
- sessionId: sessionId
1954
+ sessionId: sessionId,
1955
+ sessionCompletedInRedirect: true
1817
1956
  });
1818
1957
  };
1819
1958
 
@@ -1833,16 +1972,11 @@ const requestCredentials = async options => {
1833
1972
  mode: mode
1834
1973
  }));
1835
1974
  }
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
- }));
1842
- }
1843
- throw new Exception("Invalid request credential options", {
1844
- data: options
1845
- });
1975
+ return await requestCredentialsCrossDevice(Object.assign(Object.assign({}, options), {
1976
+ initialiseOptions: initialiseOptions,
1977
+ challenge: challenge,
1978
+ mode: exports.Mode.crossDevice
1979
+ }));
1846
1980
  };
1847
1981
 
1848
1982
  exports.HandleRedirectCallbackErrorType = void 0;
@@ -1856,7 +1990,7 @@ var HandleRedirectCallbackErrorMessage;
1856
1990
  (function(HandleRedirectCallbackErrorMessage) {
1857
1991
  HandleRedirectCallbackErrorMessage["FailedToFindResponseCode"] = "Failed to find response code";
1858
1992
  HandleRedirectCallbackErrorMessage["FailedToFindChallenge"] = "Failed to find challenge";
1859
- HandleRedirectCallbackErrorMessage["FailedToFindSessionId"] = "Failed to find sessionId";
1993
+ HandleRedirectCallbackErrorMessage["FailedToFindActiveSession"] = "Failed to find active session";
1860
1994
  HandleRedirectCallbackErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
1861
1995
  })(HandleRedirectCallbackErrorMessage || (HandleRedirectCallbackErrorMessage = {}));
1862
1996
 
@@ -1873,18 +2007,12 @@ const handleRedirectCallback = async () => {
1873
2007
  message: HandleRedirectCallbackErrorMessage.FailedToFindResponseCode
1874
2008
  });
1875
2009
  }
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
2010
  const sessionId = window.localStorage.getItem(LocalStorageKey.sessionId);
1884
- if (!sessionId) {
2011
+ const challenge = window.localStorage.getItem(LocalStorageKey.challenge);
2012
+ if (!sessionId || !challenge) {
1885
2013
  return err({
1886
2014
  type: exports.HandleRedirectCallbackErrorType.HandleRedirectCallbackFailed,
1887
- message: HandleRedirectCallbackErrorMessage.FailedToFindSessionId
2015
+ message: HandleRedirectCallbackErrorMessage.FailedToFindActiveSession
1888
2016
  });
1889
2017
  }
1890
2018
  const result = await exchangeSessionResult({
@@ -1901,16 +2029,46 @@ const handleRedirectCallback = async () => {
1901
2029
  });
1902
2030
  }
1903
2031
  return ok({
1904
- result: result.value,
2032
+ result: "challenge" in result.value ? result.value : undefined,
1905
2033
  sessionId: result.value.sessionId
1906
2034
  });
1907
2035
  };
1908
2036
 
2037
+ const abortCredentialRequest = async () => {
2038
+ const initialiseOptions = getInitialiseOptions();
2039
+ if (!initialiseOptions) {
2040
+ throw new Exception(InitialiseErrorMessage.SdkNotInitialised);
2041
+ }
2042
+ const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
2043
+ const session = getActiveSession();
2044
+ if (!session || !session.sessionKey) {
2045
+ return ok(undefined);
2046
+ }
2047
+ const {sessionId: sessionId, sessionKey: sessionKey} = session;
2048
+ removeActiveSession();
2049
+ const abortSessionResult = await abortSession({
2050
+ apiBaseUrl: apiBaseUrl,
2051
+ applicationId: applicationId,
2052
+ sessionId: sessionId,
2053
+ sessionKey: sessionKey
2054
+ });
2055
+ if (abortSessionResult.isErr()) {
2056
+ return err({
2057
+ type: exports.AbortSessionErrorType.AbortSessionFailed,
2058
+ message: AbortSessionErrorMessage.FailedToAbortSession,
2059
+ cause: abortSessionResult.error
2060
+ });
2061
+ }
2062
+ return ok(undefined);
2063
+ };
2064
+
1909
2065
  const utils = {
1910
2066
  generateChallenge: generateChallenge,
1911
2067
  unwrap: unwrap
1912
2068
  };
1913
2069
 
2070
+ exports.abortCredentialRequest = abortCredentialRequest;
2071
+
1914
2072
  exports.handleRedirectCallback = handleRedirectCallback;
1915
2073
 
1916
2074
  exports.initialise = initialise;