@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
|
*
|
|
@@ -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:
|
|
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(
|
|
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
|
-
|
|
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 {
|
|
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.
|
|
1560
|
-
message:
|
|
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.
|
|
1579
|
-
message:
|
|
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.
|
|
1589
|
-
message:
|
|
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,
|
|
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:
|
|
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:
|
|
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
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
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["
|
|
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
|
-
|
|
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.
|
|
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;
|