@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.
- package/README.md +12 -17
- package/dist/lib/verifier-js-no-deps.cjs.js +279 -92
- package/dist/lib/verifier-js-no-deps.cjs.js.map +1 -1
- package/dist/lib/verifier-js.cjs.js +269 -111
- package/dist/lib/verifier-js.cjs.js.map +1 -1
- package/dist/typings/common/safeFetch.d.ts +3 -1
- package/dist/typings/common/sleep.d.ts +1 -0
- package/dist/typings/index.d.ts +5 -6
- package/dist/typings/verifier/abortCredentialRequest.d.ts +6 -0
- package/dist/typings/verifier/handleRedirectCallback.d.ts +1 -1
- package/dist/typings/verifier/index.d.ts +1 -0
- package/dist/typings/verifier/instanceContext.d.ts +7 -0
- package/dist/typings/verifier/requestCredentialsCrossDevice.d.ts +3 -47
- package/dist/typings/verifier/requestCredentialsSameDevice.d.ts +1 -1
- package/dist/typings/verifier/types/credential-presentation.d.ts +31 -0
- package/dist/typings/verifier/types/verifier-web-sdk.d.ts +48 -58
- package/dist/typings/verifier/utils.d.ts +18 -2
- package/dist/verifier-js.development.js +245 -106
- package/dist/verifier-js.development.js.map +1 -1
- package/dist/verifier-js.production.esm.js +2 -2
- package/dist/verifier-js.production.esm.js.map +1 -1
- package/dist/verifier-js.production.js +2 -2
- package/dist/verifier-js.production.js.map +1 -1
- package/package.json +2 -2
|
@@ -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-
|
|
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:
|
|
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(
|
|
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
|
-
|
|
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 {
|
|
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.
|
|
1690
|
-
message:
|
|
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.
|
|
1709
|
-
message:
|
|
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.
|
|
1719
|
-
message:
|
|
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,
|
|
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:
|
|
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:
|
|
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
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
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["
|
|
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
|
-
|
|
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.
|
|
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;
|