@mattrglobal/verifier-sdk-web 2.1.2-unstable.99 → 2.2.1-unstable.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.
@@ -7,8 +7,8 @@
7
7
  * Do Not Translate or Localize
8
8
  *
9
9
  * Bundle of @mattrglobal/verifier-sdk-web
10
- * Generated: 2026-03-17
11
- * Version: 2.1.1
10
+ * Generated: 2026-06-09
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.1.1";
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