@mattrglobal/verifier-sdk-web 1.0.2-unstable.99 → 2.0.0-preview-digital-credential-api.2

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,8 +7,8 @@
7
7
  * Do Not Translate or Localize
8
8
  *
9
9
  * Bundle of @mattrglobal/verifier-sdk-web
10
- * Generated: 2024-10-20
11
- * Version: 1.0.1
10
+ * Generated: 2024-10-21
11
+ * Version: 2.0.0-preview-digital-credential-api.2
12
12
  * Dependencies:
13
13
  *
14
14
  * neverthrow -- 4.3.0
@@ -1418,6 +1418,11 @@ const CreateSessionResponseValidator = object({
1418
1418
  sessionUrl: string()
1419
1419
  });
1420
1420
 
1421
+ const CreateDigitalCredentialsApiSessionResponseValidator = object({
1422
+ sessionId: string(),
1423
+ request: object({})
1424
+ });
1425
+
1421
1426
  var LocalStorageKey;
1422
1427
 
1423
1428
  (function(LocalStorageKey) {
@@ -1480,7 +1485,9 @@ exports.RequestCredentialsErrorType = void 0;
1480
1485
  })(exports.RequestCredentialsErrorType || (exports.RequestCredentialsErrorType = {}));
1481
1486
 
1482
1487
  const InitialiseOptionsValidator = object({
1483
- apiBaseUrl: string()
1488
+ apiBaseUrl: string(),
1489
+ enableDigitalCredentialsApiSameDeviceFlow: optional(_boolean()),
1490
+ enableDigitalCredentialsApiCrossDeviceFlow: optional(_boolean())
1484
1491
  });
1485
1492
 
1486
1493
  let initialiseOptions = undefined;
@@ -1627,6 +1634,64 @@ const isMobileDetect = userAgent => isMobile_2({
1627
1634
  tablet: false
1628
1635
  });
1629
1636
 
1637
+ const isDigitalCredentialsApiSupported = () => {
1638
+ var _a;
1639
+ try {
1640
+ return typeof ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.identity) === null || _a === void 0 ? void 0 : _a.get) === "function";
1641
+ } catch (error) {
1642
+ return false;
1643
+ }
1644
+ };
1645
+
1646
+ const createDigitalCredentialsApiSession = async ({credentialQuery: credentialQuery, challenge: challenge, apiBaseUrl: apiBaseUrl}) => {
1647
+ const postData = {
1648
+ credentialQuery: credentialQuery,
1649
+ challenge: challenge
1650
+ };
1651
+ const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/browserApi/request`, {
1652
+ method: "POST",
1653
+ headers: {
1654
+ "Content-Type": "application/json"
1655
+ },
1656
+ body: JSON.stringify(postData)
1657
+ });
1658
+ if (responseResult.isErr()) {
1659
+ return err(responseResult.error);
1660
+ }
1661
+ const data = await responseResult.value.json();
1662
+ if (!isType(CreateDigitalCredentialsApiSessionResponseValidator)(data)) {
1663
+ return err({
1664
+ type: SafeFetchCommonRespondErrorType.UnexpectedRespond,
1665
+ message: "Create digital credentials api session return unsupported response"
1666
+ });
1667
+ }
1668
+ return ok(data);
1669
+ };
1670
+
1671
+ const getDigitalCredentialsApiSessionResult = async ({challenge: challenge, sessionId: sessionId, response: response, apiBaseUrl: apiBaseUrl}) => {
1672
+ const postData = {
1673
+ challenge: challenge,
1674
+ sessionId: sessionId,
1675
+ response: response
1676
+ };
1677
+ const fetchResultFn = async () => await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/browserApi/response`, {
1678
+ method: "POST",
1679
+ headers: {
1680
+ "Content-Type": "application/json"
1681
+ },
1682
+ body: JSON.stringify(postData)
1683
+ });
1684
+ const responseResult = await withRetrySafeFetch(fetchResultFn, {
1685
+ retries: 2,
1686
+ retryHttpStatus: 404
1687
+ });
1688
+ if (responseResult.isErr()) {
1689
+ return err(responseResult.error);
1690
+ }
1691
+ const data = await responseResult.value.json();
1692
+ return ok(data);
1693
+ };
1694
+
1630
1695
  exports.CrossDeviceCallbackErrorType = void 0;
1631
1696
 
1632
1697
  (function(CrossDeviceCallbackErrorType) {
@@ -1768,12 +1833,12 @@ const requestCredentialsCrossDevice = async options => {
1768
1833
  });
1769
1834
  };
1770
1835
 
1771
- var SameDeviceRequestCredentialsErrorMessage;
1836
+ var SameDeviceRequestCredentialsErrorMessage$1;
1772
1837
 
1773
1838
  (function(SameDeviceRequestCredentialsErrorMessage) {
1774
1839
  SameDeviceRequestCredentialsErrorMessage["FailedToStoreChallenge"] = "Failed to store challenge";
1775
1840
  SameDeviceRequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
1776
- })(SameDeviceRequestCredentialsErrorMessage || (SameDeviceRequestCredentialsErrorMessage = {}));
1841
+ })(SameDeviceRequestCredentialsErrorMessage$1 || (SameDeviceRequestCredentialsErrorMessage$1 = {}));
1777
1842
 
1778
1843
  const requestCredentialsSameDevice = async options => {
1779
1844
  const {challenge: challenge, credentialQuery: credentialQuery, redirectUri: redirectUri, walletProviderId: walletProviderId, initialiseOptions: initialiseOptions} = options;
@@ -1783,7 +1848,7 @@ const requestCredentialsSameDevice = async options => {
1783
1848
  if (!storedChallenge) {
1784
1849
  return err({
1785
1850
  type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1786
- message: SameDeviceRequestCredentialsErrorMessage.FailedToStoreChallenge
1851
+ message: SameDeviceRequestCredentialsErrorMessage$1.FailedToStoreChallenge
1787
1852
  });
1788
1853
  }
1789
1854
  const createSessionResult = await createSession({
@@ -1796,7 +1861,7 @@ const requestCredentialsSameDevice = async options => {
1796
1861
  if (createSessionResult.isErr()) {
1797
1862
  return err({
1798
1863
  type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1799
- message: SameDeviceRequestCredentialsErrorMessage.FailedToCreateSession,
1864
+ message: SameDeviceRequestCredentialsErrorMessage$1.FailedToCreateSession,
1800
1865
  cause: createSessionResult.error
1801
1866
  });
1802
1867
  }
@@ -1808,6 +1873,71 @@ const requestCredentialsSameDevice = async options => {
1808
1873
  });
1809
1874
  };
1810
1875
 
1876
+ var SameDeviceRequestCredentialsErrorMessage;
1877
+
1878
+ (function(SameDeviceRequestCredentialsErrorMessage) {
1879
+ SameDeviceRequestCredentialsErrorMessage["FailedToStoreChallenge"] = "Failed to store challenge";
1880
+ SameDeviceRequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
1881
+ })(SameDeviceRequestCredentialsErrorMessage || (SameDeviceRequestCredentialsErrorMessage = {}));
1882
+
1883
+ const requestCredentialsDigitalCredentialsApi = async options => {
1884
+ const {challenge: challenge, credentialQuery: credentialQuery, initialiseOptions: initialiseOptions} = options;
1885
+ const {apiBaseUrl: apiBaseUrl} = initialiseOptions;
1886
+ window.localStorage.setItem(LocalStorageKey.challenge, challenge);
1887
+ const storedChallenge = window.localStorage.getItem(LocalStorageKey.challenge);
1888
+ if (!storedChallenge) {
1889
+ return err({
1890
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1891
+ message: SameDeviceRequestCredentialsErrorMessage.FailedToStoreChallenge
1892
+ });
1893
+ }
1894
+ const createSessionResult = await createDigitalCredentialsApiSession({
1895
+ credentialQuery: credentialQuery,
1896
+ challenge: storedChallenge,
1897
+ apiBaseUrl: apiBaseUrl
1898
+ });
1899
+ if (createSessionResult.isErr()) {
1900
+ return err({
1901
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1902
+ message: SameDeviceRequestCredentialsErrorMessage.FailedToCreateSession,
1903
+ cause: createSessionResult.error
1904
+ });
1905
+ }
1906
+ const {request: request, sessionId: sessionId} = createSessionResult.value;
1907
+ window.localStorage.setItem(LocalStorageKey.sessionId, sessionId);
1908
+ let rawResponse;
1909
+ try {
1910
+ rawResponse = await navigator.identity.get(request);
1911
+ } catch (_a) {
1912
+ return err({
1913
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1914
+ message: "Failed call to digital credentials api"
1915
+ });
1916
+ }
1917
+ let response;
1918
+ try {
1919
+ response = JSON.parse(rawResponse.data);
1920
+ } catch (_b) {
1921
+ response = rawResponse.data;
1922
+ }
1923
+ const result = await getDigitalCredentialsApiSessionResult({
1924
+ challenge: challenge,
1925
+ sessionId: sessionId,
1926
+ response: response,
1927
+ apiBaseUrl: apiBaseUrl
1928
+ });
1929
+ if (result.isOk()) {
1930
+ return ok({
1931
+ sessionId: sessionId,
1932
+ result: result.value
1933
+ });
1934
+ }
1935
+ return err({
1936
+ type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
1937
+ message: "Invalid response from digital credentials api"
1938
+ });
1939
+ };
1940
+
1811
1941
  const requestCredentials = async options => {
1812
1942
  var _a;
1813
1943
  const initialiseOptions = getInitialiseOptions();
@@ -1817,6 +1947,24 @@ const requestCredentials = async options => {
1817
1947
  assertType(RequestCredentialsOptionsValidator, "Invalid request credential options")(options);
1818
1948
  const {challenge: challenge = generateChallenge()} = options;
1819
1949
  const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : isMobileDetect(navigator.userAgent) ? exports.Mode.sameDevice : exports.Mode.crossDevice;
1950
+ if (initialiseOptions.enableDigitalCredentialsApiCrossDeviceFlow && isDigitalCredentialsApiSupported() && mode === exports.Mode.crossDevice) {
1951
+ console.log("Digital Credentials API support found, proceeding with request using API in cross device flow");
1952
+ return await requestCredentialsDigitalCredentialsApi(Object.assign(Object.assign({}, options), {
1953
+ initialiseOptions: initialiseOptions,
1954
+ challenge: challenge
1955
+ }));
1956
+ } else if (initialiseOptions.enableDigitalCredentialsApiCrossDeviceFlow) {
1957
+ console.log("Digital Credentials API support not found, falling back to OpenID4VP");
1958
+ }
1959
+ if (initialiseOptions.enableDigitalCredentialsApiSameDeviceFlow && isDigitalCredentialsApiSupported() && mode === exports.Mode.sameDevice) {
1960
+ console.log("Digital Credentials API support found, proceeding with request using API in same device flow");
1961
+ return await requestCredentialsDigitalCredentialsApi(Object.assign(Object.assign({}, options), {
1962
+ initialiseOptions: initialiseOptions,
1963
+ challenge: challenge
1964
+ }));
1965
+ } else if (initialiseOptions.enableDigitalCredentialsApiSameDeviceFlow) {
1966
+ console.log("Digital Credentials API support not found, falling back to OpenID4VP");
1967
+ }
1820
1968
  if (mode === exports.Mode.sameDevice && "redirectUri" in options) {
1821
1969
  return await requestCredentialsSameDevice(Object.assign(Object.assign({}, options), {
1822
1970
  initialiseOptions: initialiseOptions,
@@ -1899,7 +2047,8 @@ const handleRedirectCallback = async () => {
1899
2047
 
1900
2048
  const utils = {
1901
2049
  generateChallenge: generateChallenge,
1902
- unwrap: unwrap
2050
+ unwrap: unwrap,
2051
+ isDigitalCredentialsApiSupported: isDigitalCredentialsApiSupported
1903
2052
  };
1904
2053
 
1905
2054
  exports.handleRedirectCallback = handleRedirectCallback;