@mattrglobal/verifier-sdk-web 2.1.2-unstable.99 → 2.2.0
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 +259 -90
- package/dist/lib/verifier-js-no-deps.cjs.js +64 -19
- package/dist/lib/verifier-js-no-deps.cjs.js.map +1 -1
- package/dist/lib/verifier-js.cjs.js +82 -19
- package/dist/lib/verifier-js.cjs.js.map +1 -1
- package/dist/typings/verifier/handleRedirectCallback.d.ts +2 -1
- package/dist/typings/verifier/requestCredentials.d.ts +8 -0
- package/dist/typings/verifier/types/credential-presentation.d.ts +6 -0
- package/dist/typings/verifier/types/verifier-web-sdk.d.ts +26 -3
- package/dist/typings/verifier/utils.d.ts +1 -1
- package/dist/verifier-js.development.js +81 -19
- 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 +5 -3
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* Do Not Translate or Localize
|
|
8
8
|
*
|
|
9
9
|
* Bundle of @mattrglobal/verifier-sdk-web
|
|
10
|
-
* Generated: 2026-
|
|
11
|
-
* Version: 2.
|
|
10
|
+
* Generated: 2026-06-08
|
|
11
|
+
* Version: 2.2.0
|
|
12
12
|
* Dependencies:
|
|
13
13
|
*
|
|
14
14
|
* neverthrow -- 4.3.0
|
|
@@ -670,6 +670,24 @@ function _joinExpects(values$1, separator) {
|
|
|
670
670
|
return (_list$ = list[0]) !== null && _list$ !== void 0 ? _list$ : "never";
|
|
671
671
|
}
|
|
672
672
|
|
|
673
|
+
function minLength(requirement, message$1) {
|
|
674
|
+
return {
|
|
675
|
+
kind: "validation",
|
|
676
|
+
type: "min_length",
|
|
677
|
+
reference: minLength,
|
|
678
|
+
async: false,
|
|
679
|
+
expects: ">=".concat(requirement),
|
|
680
|
+
requirement: requirement,
|
|
681
|
+
message: message$1,
|
|
682
|
+
"~run": function run(dataset, config$1) {
|
|
683
|
+
if (dataset.typed && dataset.value.length < this.requirement) _addIssue(this, "length", dataset, config$1, {
|
|
684
|
+
received: "".concat(dataset.value.length)
|
|
685
|
+
});
|
|
686
|
+
return dataset;
|
|
687
|
+
}
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
|
|
673
691
|
function nonEmpty(message$1) {
|
|
674
692
|
return {
|
|
675
693
|
kind: "validation",
|
|
@@ -1405,7 +1423,8 @@ const PresentationResultRelaxValidator = object({
|
|
|
1405
1423
|
credentialQuery: optional(unknown()),
|
|
1406
1424
|
credentials: optional(unknown()),
|
|
1407
1425
|
credentialErrors: optional(unknown()),
|
|
1408
|
-
error: optional(unknown())
|
|
1426
|
+
error: optional(unknown()),
|
|
1427
|
+
state: optional(string())
|
|
1409
1428
|
});
|
|
1410
1429
|
|
|
1411
1430
|
exports.Mode = void 0;
|
|
@@ -1427,7 +1446,8 @@ object({
|
|
|
1427
1446
|
challenge: string(),
|
|
1428
1447
|
redirectUri: optional(string()),
|
|
1429
1448
|
walletProviderId: optional(string()),
|
|
1430
|
-
dcApiSupported: optional(_boolean())
|
|
1449
|
+
dcApiSupported: optional(_boolean()),
|
|
1450
|
+
state: optional(pipe(string(), minLength(1)))
|
|
1431
1451
|
});
|
|
1432
1452
|
|
|
1433
1453
|
const CreateSessionDigitalCredentialsValidator = object({
|
|
@@ -1442,7 +1462,8 @@ const CreateSessionOpenId4vpResponseValidator = object({
|
|
|
1442
1462
|
type: optional(literal(SessionType.Openid4vp)),
|
|
1443
1463
|
sessionId: string(),
|
|
1444
1464
|
sessionKey: string(),
|
|
1445
|
-
sessionUrl: string()
|
|
1465
|
+
sessionUrl: string(),
|
|
1466
|
+
state: optional(string())
|
|
1446
1467
|
});
|
|
1447
1468
|
|
|
1448
1469
|
const CreateSessionResponseValidator = union([ CreateSessionDigitalCredentialsValidator, CreateSessionOpenId4vpResponseValidator ]);
|
|
@@ -1459,11 +1480,12 @@ var LocalStorageKey;
|
|
|
1459
1480
|
(function(LocalStorageKey) {
|
|
1460
1481
|
LocalStorageKey["challenge"] = "mattr_chg";
|
|
1461
1482
|
LocalStorageKey["sessionId"] = "mattr_sid";
|
|
1483
|
+
LocalStorageKey["state"] = "mattr_st";
|
|
1462
1484
|
})(LocalStorageKey || (LocalStorageKey = {}));
|
|
1463
1485
|
|
|
1464
1486
|
const MATTR_SDK_VERSION_HEADER = "x-mattr-sdk-version";
|
|
1465
1487
|
|
|
1466
|
-
const MATTR_SDK_VERSION_VALUE = "2.
|
|
1488
|
+
const MATTR_SDK_VERSION_VALUE = "2.2.0";
|
|
1467
1489
|
|
|
1468
1490
|
var MessageEventDataType;
|
|
1469
1491
|
|
|
@@ -1493,7 +1515,8 @@ const OpenId4vpConfigAutoDetectOptionsValidator = object({
|
|
|
1493
1515
|
const RequestCredentialsOptionsValidator = object({
|
|
1494
1516
|
credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
|
|
1495
1517
|
challenge: optional(string()),
|
|
1496
|
-
openid4vpConfiguration: optional(union([ OpenId4vpConfigSameDeviceOptionsValidator, OpenId4vpConfigCrossDeviceOptionsValidator, OpenId4vpConfigAutoDetectOptionsValidator ]))
|
|
1518
|
+
openid4vpConfiguration: optional(union([ OpenId4vpConfigSameDeviceOptionsValidator, OpenId4vpConfigCrossDeviceOptionsValidator, OpenId4vpConfigAutoDetectOptionsValidator ])),
|
|
1519
|
+
state: optional(pipe(string(), minLength(1, "state must not be empty")))
|
|
1497
1520
|
});
|
|
1498
1521
|
|
|
1499
1522
|
exports.RequestCredentialsErrorType = void 0;
|
|
@@ -1516,6 +1539,7 @@ var RequestCredentialsErrorMessage;
|
|
|
1516
1539
|
RequestCredentialsErrorMessage["DcApiResponseParseError"] = "Failed to parse response from Digital Credentials API";
|
|
1517
1540
|
RequestCredentialsErrorMessage["Abort"] = "User aborted the session";
|
|
1518
1541
|
RequestCredentialsErrorMessage["Timeout"] = "User session timeout";
|
|
1542
|
+
RequestCredentialsErrorMessage["StateMismatch"] = "State mismatch between requested session and back-channel result";
|
|
1519
1543
|
})(RequestCredentialsErrorMessage || (RequestCredentialsErrorMessage = {}));
|
|
1520
1544
|
|
|
1521
1545
|
exports.AbortSessionErrorType = void 0;
|
|
@@ -1736,18 +1760,20 @@ const getHashParamValue = (hash, param) => {
|
|
|
1736
1760
|
return urlParams.get(param);
|
|
1737
1761
|
};
|
|
1738
1762
|
|
|
1739
|
-
const createSession = async ({credentialQuery: credentialQuery, challenge: challenge, redirectUri: redirectUri, apiBaseUrl: apiBaseUrl, walletProviderId: walletProviderId, dcApiSupported: dcApiSupported, applicationId: applicationId}) => {
|
|
1763
|
+
const createSession = async ({credentialQuery: credentialQuery, challenge: challenge, redirectUri: redirectUri, apiBaseUrl: apiBaseUrl, walletProviderId: walletProviderId, dcApiSupported: dcApiSupported, applicationId: applicationId, state: state}) => {
|
|
1740
1764
|
const openid4vpConfiguration = !!walletProviderId || !!redirectUri ? {
|
|
1741
1765
|
redirectUri: redirectUri,
|
|
1742
1766
|
walletProviderId: walletProviderId
|
|
1743
1767
|
} : undefined;
|
|
1744
|
-
const postData = {
|
|
1768
|
+
const postData = Object.assign({
|
|
1745
1769
|
credentialQuery: credentialQuery,
|
|
1746
1770
|
challenge: challenge,
|
|
1747
1771
|
applicationId: applicationId,
|
|
1748
1772
|
dcApiSupported: dcApiSupported,
|
|
1749
1773
|
openid4vpConfiguration: openid4vpConfiguration
|
|
1750
|
-
}
|
|
1774
|
+
}, state !== undefined ? {
|
|
1775
|
+
state: state
|
|
1776
|
+
} : {});
|
|
1751
1777
|
const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/web/sessions`, {
|
|
1752
1778
|
method: "POST",
|
|
1753
1779
|
headers: {
|
|
@@ -1865,7 +1891,7 @@ const closeCrossDeviceModal = options => {
|
|
|
1865
1891
|
};
|
|
1866
1892
|
|
|
1867
1893
|
const receiveMessageHandler = options => async event => {
|
|
1868
|
-
const {onComplete: onComplete, onFailure: onFailure, container: container, sessionId: sessionId, apiBaseUrl: apiBaseUrl, challenge: challenge} = options;
|
|
1894
|
+
const {onComplete: onComplete, onFailure: onFailure, container: container, sessionId: sessionId, apiBaseUrl: apiBaseUrl, challenge: challenge, state: state} = options;
|
|
1869
1895
|
if (event.origin !== apiBaseUrl) {
|
|
1870
1896
|
return;
|
|
1871
1897
|
}
|
|
@@ -1887,10 +1913,22 @@ const receiveMessageHandler = options => async event => {
|
|
|
1887
1913
|
});
|
|
1888
1914
|
return;
|
|
1889
1915
|
}
|
|
1916
|
+
const resultState = "challenge" in result.value ? result.value.state : undefined;
|
|
1917
|
+
if (state !== undefined && resultState !== undefined && state !== resultState) {
|
|
1918
|
+
onFailure({
|
|
1919
|
+
type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
|
|
1920
|
+
message: RequestCredentialsErrorMessage.StateMismatch
|
|
1921
|
+
});
|
|
1922
|
+
closeCrossDeviceModal({
|
|
1923
|
+
container: container
|
|
1924
|
+
});
|
|
1925
|
+
return;
|
|
1926
|
+
}
|
|
1890
1927
|
onComplete({
|
|
1891
1928
|
result: "challenge" in result.value ? result.value : undefined,
|
|
1892
1929
|
sessionId: result.value.sessionId,
|
|
1893
|
-
sessionCompletedInRedirect: false
|
|
1930
|
+
sessionCompletedInRedirect: false,
|
|
1931
|
+
state: resultState !== null && resultState !== void 0 ? resultState : state
|
|
1894
1932
|
});
|
|
1895
1933
|
closeCrossDeviceModal({
|
|
1896
1934
|
container: container
|
|
@@ -1936,7 +1974,7 @@ const openCrossDeviceModal = options => {
|
|
|
1936
1974
|
};
|
|
1937
1975
|
|
|
1938
1976
|
const requestCredentialsWithCrossDevice = async options => {
|
|
1939
|
-
const {challenge: challenge, apiBaseUrl: apiBaseUrl, sessionUrl: sessionUrl, sessionId: sessionId, sessionKey: sessionKey} = options;
|
|
1977
|
+
const {challenge: challenge, apiBaseUrl: apiBaseUrl, sessionUrl: sessionUrl, sessionId: sessionId, sessionKey: sessionKey, state: state} = options;
|
|
1940
1978
|
const container = openCrossDeviceModal({
|
|
1941
1979
|
sessionUrl: sessionUrl
|
|
1942
1980
|
});
|
|
@@ -1960,6 +1998,7 @@ const requestCredentialsWithCrossDevice = async options => {
|
|
|
1960
1998
|
sessionId: sessionId,
|
|
1961
1999
|
apiBaseUrl: apiBaseUrl,
|
|
1962
2000
|
challenge: challenge,
|
|
2001
|
+
state: state,
|
|
1963
2002
|
onComplete: data => resolve(ok(data)),
|
|
1964
2003
|
onFailure: error => resolve(err(error))
|
|
1965
2004
|
});
|
|
@@ -2147,13 +2186,18 @@ var SameDeviceRequestCredentialsErrorMessage;
|
|
|
2147
2186
|
})(SameDeviceRequestCredentialsErrorMessage || (SameDeviceRequestCredentialsErrorMessage = {}));
|
|
2148
2187
|
|
|
2149
2188
|
const requestCredentialsSameDevice = async options => {
|
|
2150
|
-
const {challenge: challenge, apiBaseUrl: apiBaseUrl, applicationId: applicationId, sessionUrl: sessionUrl, sessionKey: sessionKey, sessionId: sessionId} = options;
|
|
2189
|
+
const {challenge: challenge, apiBaseUrl: apiBaseUrl, applicationId: applicationId, sessionUrl: sessionUrl, sessionKey: sessionKey, sessionId: sessionId, state: state} = options;
|
|
2151
2190
|
const abortController = setActiveSession({
|
|
2152
2191
|
sessionId: sessionId,
|
|
2153
2192
|
sessionKey: sessionKey
|
|
2154
2193
|
});
|
|
2155
2194
|
window.localStorage.setItem(LocalStorageKey.sessionId, sessionId);
|
|
2156
2195
|
window.localStorage.setItem(LocalStorageKey.challenge, challenge);
|
|
2196
|
+
if (state !== undefined) {
|
|
2197
|
+
window.localStorage.setItem(LocalStorageKey.state, state);
|
|
2198
|
+
} else {
|
|
2199
|
+
window.localStorage.removeItem(LocalStorageKey.state);
|
|
2200
|
+
}
|
|
2157
2201
|
window.location.assign(sessionUrl);
|
|
2158
2202
|
await sleep(SESSION_STATUS_POLLING_INITIAL_DELAY_MS);
|
|
2159
2203
|
const checkResult = await withRetry((async () => {
|
|
@@ -2204,7 +2248,7 @@ const requestCredentials = async options => {
|
|
|
2204
2248
|
}
|
|
2205
2249
|
assertType(RequestCredentialsOptionsValidator, "Invalid request credential options")(options);
|
|
2206
2250
|
const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initializeOptions;
|
|
2207
|
-
const {challenge: challenge = generateChallenge(), credentialQuery: credentialQuery, openid4vpConfiguration: openid4vpConfiguration} = options;
|
|
2251
|
+
const {challenge: challenge = generateChallenge(), credentialQuery: credentialQuery, openid4vpConfiguration: openid4vpConfiguration, state: state} = options;
|
|
2208
2252
|
const dcApiSupported = isDigitalCredentialsApiSupported();
|
|
2209
2253
|
const openId4VpRedirectUri = deriveOpenId4vpRedirectUri(openid4vpConfiguration);
|
|
2210
2254
|
const createSessionResult = await createSession({
|
|
@@ -2214,7 +2258,8 @@ const requestCredentials = async options => {
|
|
|
2214
2258
|
walletProviderId: (_a = openid4vpConfiguration === null || openid4vpConfiguration === void 0 ? void 0 : openid4vpConfiguration.walletProviderId) !== null && _a !== void 0 ? _a : undefined,
|
|
2215
2259
|
apiBaseUrl: apiBaseUrl,
|
|
2216
2260
|
applicationId: applicationId,
|
|
2217
|
-
dcApiSupported: dcApiSupported
|
|
2261
|
+
dcApiSupported: dcApiSupported,
|
|
2262
|
+
state: state
|
|
2218
2263
|
});
|
|
2219
2264
|
if (createSessionResult.isErr()) {
|
|
2220
2265
|
return err({
|
|
@@ -2250,7 +2295,8 @@ const requestCredentials = async options => {
|
|
|
2250
2295
|
applicationId: applicationId,
|
|
2251
2296
|
sessionUrl: sessionUrl,
|
|
2252
2297
|
sessionKey: sessionKey,
|
|
2253
|
-
sessionId: sessionId
|
|
2298
|
+
sessionId: sessionId,
|
|
2299
|
+
state: state
|
|
2254
2300
|
});
|
|
2255
2301
|
}
|
|
2256
2302
|
return await requestCredentialsWithCrossDevice({
|
|
@@ -2258,7 +2304,8 @@ const requestCredentials = async options => {
|
|
|
2258
2304
|
apiBaseUrl: apiBaseUrl,
|
|
2259
2305
|
sessionUrl: sessionUrl,
|
|
2260
2306
|
sessionKey: sessionKey,
|
|
2261
|
-
sessionId: sessionId
|
|
2307
|
+
sessionId: sessionId,
|
|
2308
|
+
state: state
|
|
2262
2309
|
});
|
|
2263
2310
|
};
|
|
2264
2311
|
|
|
@@ -2291,9 +2338,11 @@ var HandleRedirectCallbackErrorMessage;
|
|
|
2291
2338
|
HandleRedirectCallbackErrorMessage["FailedToFindChallenge"] = "Failed to find challenge";
|
|
2292
2339
|
HandleRedirectCallbackErrorMessage["FailedToFindActiveSession"] = "Failed to find active session";
|
|
2293
2340
|
HandleRedirectCallbackErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
|
|
2341
|
+
HandleRedirectCallbackErrorMessage["StateMismatch"] = "State mismatch between stored session and back-channel result";
|
|
2294
2342
|
})(HandleRedirectCallbackErrorMessage || (HandleRedirectCallbackErrorMessage = {}));
|
|
2295
2343
|
|
|
2296
2344
|
const handleRedirectCallback = async () => {
|
|
2345
|
+
var _a;
|
|
2297
2346
|
const initializeOptions = getInitializeOptions();
|
|
2298
2347
|
if (!initializeOptions) {
|
|
2299
2348
|
throw new Exception(InitializeErrorMessage.SdkNotInitialized);
|
|
@@ -2308,6 +2357,7 @@ const handleRedirectCallback = async () => {
|
|
|
2308
2357
|
}
|
|
2309
2358
|
const sessionId = window.localStorage.getItem(LocalStorageKey.sessionId);
|
|
2310
2359
|
const challenge = window.localStorage.getItem(LocalStorageKey.challenge);
|
|
2360
|
+
const storedState = (_a = window.localStorage.getItem(LocalStorageKey.state)) !== null && _a !== void 0 ? _a : undefined;
|
|
2311
2361
|
if (!sessionId || !challenge) {
|
|
2312
2362
|
return err({
|
|
2313
2363
|
type: exports.HandleRedirectCallbackErrorType.HandleRedirectCallbackFailed,
|
|
@@ -2327,9 +2377,22 @@ const handleRedirectCallback = async () => {
|
|
|
2327
2377
|
cause: result.error
|
|
2328
2378
|
});
|
|
2329
2379
|
}
|
|
2380
|
+
const resultState = "challenge" in result.value ? result.value.state : undefined;
|
|
2381
|
+
if (storedState !== undefined && resultState !== undefined && storedState !== resultState) {
|
|
2382
|
+
window.localStorage.removeItem(LocalStorageKey.challenge);
|
|
2383
|
+
window.localStorage.removeItem(LocalStorageKey.sessionId);
|
|
2384
|
+
window.localStorage.removeItem(LocalStorageKey.state);
|
|
2385
|
+
return err({
|
|
2386
|
+
type: exports.HandleRedirectCallbackErrorType.HandleRedirectCallbackFailed,
|
|
2387
|
+
message: HandleRedirectCallbackErrorMessage.StateMismatch
|
|
2388
|
+
});
|
|
2389
|
+
}
|
|
2390
|
+
const state = resultState !== null && resultState !== void 0 ? resultState : storedState;
|
|
2391
|
+
window.localStorage.removeItem(LocalStorageKey.state);
|
|
2330
2392
|
return ok({
|
|
2331
2393
|
result: "challenge" in result.value ? result.value : undefined,
|
|
2332
|
-
sessionId: result.value.sessionId
|
|
2394
|
+
sessionId: result.value.sessionId,
|
|
2395
|
+
state: state
|
|
2333
2396
|
});
|
|
2334
2397
|
};
|
|
2335
2398
|
|