@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.
- package/README.md +45 -10
- package/dist/lib/verifier-js-no-deps.cjs.js +157 -8
- package/dist/lib/verifier-js-no-deps.cjs.js.map +1 -1
- package/dist/lib/verifier-js.cjs.js +157 -8
- package/dist/lib/verifier-js.cjs.js.map +1 -1
- package/dist/typings/index.d.ts +1 -0
- package/dist/typings/verifier/requestCredentialsViaDigitalCredentialsApi.d.ts +7 -0
- package/dist/typings/verifier/types/credential-presentation.d.ts +8 -0
- package/dist/typings/verifier/types/verifier-web-sdk.d.ts +17 -1
- package/dist/typings/verifier/utils.d.ts +33 -1
- package/dist/verifier-js.development.js +150 -8
- package/dist/verifier-js.development.js.map +1 -1
- package/dist/verifier-js.production.esm.js +3 -3
- package/dist/verifier-js.production.esm.js.map +1 -1
- package/dist/verifier-js.production.js +3 -3
- package/dist/verifier-js.production.js.map +1 -1
- package/package.json +2 -2
|
@@ -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-
|
|
11
|
-
* Version:
|
|
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;
|