@mattrglobal/verifier-sdk-web 1.1.1-unstable.15 → 1.1.1-unstable.153
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 +39 -24
- package/dist/lib/verifier-js-no-deps.cjs.js +563 -185
- package/dist/lib/verifier-js-no-deps.cjs.js.map +1 -1
- package/dist/lib/verifier-js.cjs.js +689 -299
- package/dist/lib/verifier-js.cjs.js.map +1 -1
- package/dist/typings/common/safeFetch.d.ts +6 -3
- package/dist/typings/common/sleep.d.ts +1 -0
- package/dist/typings/index.d.ts +6 -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 +2 -0
- package/dist/typings/verifier/instanceContext.d.ts +7 -0
- package/dist/typings/verifier/requestCredentialsCrossDevice.d.ts +3 -47
- package/dist/typings/verifier/requestCredentialsDigitalCredentialsApi.d.ts +16 -0
- package/dist/typings/verifier/requestCredentialsSameDevice.d.ts +1 -1
- package/dist/typings/verifier/types/credential-presentation.d.ts +127 -20
- package/dist/typings/verifier/types/verifier-web-sdk.d.ts +124 -183
- package/dist/typings/verifier/utils.d.ts +25 -5
- package/dist/verifier-js.development.js +635 -281
- 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-
|
|
10
|
+
* Generated: 2025-05-16
|
|
11
11
|
* Version: 1.1.0
|
|
12
12
|
* Dependencies:
|
|
13
13
|
*
|
|
@@ -426,6 +426,73 @@
|
|
|
426
426
|
};
|
|
427
427
|
ResultAsync.fromPromise;
|
|
428
428
|
ResultAsync.fromSafePromise;
|
|
429
|
+
function _arrayLikeToArray(r, a) {
|
|
430
|
+
(null == a || a > r.length) && (a = r.length);
|
|
431
|
+
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
|
|
432
|
+
return n;
|
|
433
|
+
}
|
|
434
|
+
function _arrayWithoutHoles(r) {
|
|
435
|
+
if (Array.isArray(r)) return _arrayLikeToArray(r);
|
|
436
|
+
}
|
|
437
|
+
function _createForOfIteratorHelper(r, e) {
|
|
438
|
+
var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
|
|
439
|
+
if (!t) {
|
|
440
|
+
if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
|
|
441
|
+
t && (r = t);
|
|
442
|
+
var n = 0, F = function() {};
|
|
443
|
+
return {
|
|
444
|
+
s: F,
|
|
445
|
+
n: function() {
|
|
446
|
+
return n >= r.length ? {
|
|
447
|
+
done: !0
|
|
448
|
+
} : {
|
|
449
|
+
done: !1,
|
|
450
|
+
value: r[n++]
|
|
451
|
+
};
|
|
452
|
+
},
|
|
453
|
+
e: function(r) {
|
|
454
|
+
throw r;
|
|
455
|
+
},
|
|
456
|
+
f: F
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
460
|
+
}
|
|
461
|
+
var o, a = !0, u = !1;
|
|
462
|
+
return {
|
|
463
|
+
s: function() {
|
|
464
|
+
t = t.call(r);
|
|
465
|
+
},
|
|
466
|
+
n: function() {
|
|
467
|
+
var r = t.next();
|
|
468
|
+
return a = r.done, r;
|
|
469
|
+
},
|
|
470
|
+
e: function(r) {
|
|
471
|
+
u = !0, o = r;
|
|
472
|
+
},
|
|
473
|
+
f: function() {
|
|
474
|
+
try {
|
|
475
|
+
a || null == t.return || t.return();
|
|
476
|
+
} finally {
|
|
477
|
+
if (u) throw o;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
function _defineProperty(e, r, t) {
|
|
483
|
+
return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
484
|
+
value: t,
|
|
485
|
+
enumerable: !0,
|
|
486
|
+
configurable: !0,
|
|
487
|
+
writable: !0
|
|
488
|
+
}) : e[r] = t, e;
|
|
489
|
+
}
|
|
490
|
+
function _iterableToArray(r) {
|
|
491
|
+
if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
|
|
492
|
+
}
|
|
493
|
+
function _nonIterableSpread() {
|
|
494
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
495
|
+
}
|
|
429
496
|
function ownKeys(e, r) {
|
|
430
497
|
var t = Object.keys(e);
|
|
431
498
|
if (Object.getOwnPropertySymbols) {
|
|
@@ -447,6 +514,23 @@
|
|
|
447
514
|
}
|
|
448
515
|
return e;
|
|
449
516
|
}
|
|
517
|
+
function _toConsumableArray(r) {
|
|
518
|
+
return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
|
|
519
|
+
}
|
|
520
|
+
function _toPrimitive(t, r) {
|
|
521
|
+
if ("object" != typeof t || !t) return t;
|
|
522
|
+
var e = t[Symbol.toPrimitive];
|
|
523
|
+
if (void 0 !== e) {
|
|
524
|
+
var i = e.call(t, r || "default");
|
|
525
|
+
if ("object" != typeof i) return i;
|
|
526
|
+
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
527
|
+
}
|
|
528
|
+
return ("string" === r ? String : Number)(t);
|
|
529
|
+
}
|
|
530
|
+
function _toPropertyKey(t) {
|
|
531
|
+
var i = _toPrimitive(t, "string");
|
|
532
|
+
return "symbol" == typeof i ? i : i + "";
|
|
533
|
+
}
|
|
450
534
|
function _typeof(o) {
|
|
451
535
|
"@babel/helpers - typeof";
|
|
452
536
|
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
|
|
@@ -455,107 +539,12 @@
|
|
|
455
539
|
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
|
|
456
540
|
}, _typeof(o);
|
|
457
541
|
}
|
|
458
|
-
function
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
enumerable: true,
|
|
464
|
-
configurable: true,
|
|
465
|
-
writable: true
|
|
466
|
-
});
|
|
467
|
-
} else {
|
|
468
|
-
obj[key] = value;
|
|
469
|
-
}
|
|
470
|
-
return obj;
|
|
471
|
-
}
|
|
472
|
-
function _toConsumableArray(arr) {
|
|
473
|
-
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
|
|
474
|
-
}
|
|
475
|
-
function _arrayWithoutHoles(arr) {
|
|
476
|
-
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
|
|
477
|
-
}
|
|
478
|
-
function _iterableToArray(iter) {
|
|
479
|
-
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
480
|
-
}
|
|
481
|
-
function _unsupportedIterableToArray(o, minLen) {
|
|
482
|
-
if (!o) return;
|
|
483
|
-
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
484
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
485
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
486
|
-
if (n === "Map" || n === "Set") return Array.from(o);
|
|
487
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
488
|
-
}
|
|
489
|
-
function _arrayLikeToArray(arr, len) {
|
|
490
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
491
|
-
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
492
|
-
return arr2;
|
|
493
|
-
}
|
|
494
|
-
function _nonIterableSpread() {
|
|
495
|
-
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
496
|
-
}
|
|
497
|
-
function _createForOfIteratorHelper(o, allowArrayLike) {
|
|
498
|
-
var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
|
|
499
|
-
if (!it) {
|
|
500
|
-
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
|
|
501
|
-
if (it) o = it;
|
|
502
|
-
var i = 0;
|
|
503
|
-
var F = function() {};
|
|
504
|
-
return {
|
|
505
|
-
s: F,
|
|
506
|
-
n: function() {
|
|
507
|
-
if (i >= o.length) return {
|
|
508
|
-
done: true
|
|
509
|
-
};
|
|
510
|
-
return {
|
|
511
|
-
done: false,
|
|
512
|
-
value: o[i++]
|
|
513
|
-
};
|
|
514
|
-
},
|
|
515
|
-
e: function(e) {
|
|
516
|
-
throw e;
|
|
517
|
-
},
|
|
518
|
-
f: F
|
|
519
|
-
};
|
|
520
|
-
}
|
|
521
|
-
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
522
|
-
}
|
|
523
|
-
var normalCompletion = true, didErr = false, err;
|
|
524
|
-
return {
|
|
525
|
-
s: function() {
|
|
526
|
-
it = it.call(o);
|
|
527
|
-
},
|
|
528
|
-
n: function() {
|
|
529
|
-
var step = it.next();
|
|
530
|
-
normalCompletion = step.done;
|
|
531
|
-
return step;
|
|
532
|
-
},
|
|
533
|
-
e: function(e) {
|
|
534
|
-
didErr = true;
|
|
535
|
-
err = e;
|
|
536
|
-
},
|
|
537
|
-
f: function() {
|
|
538
|
-
try {
|
|
539
|
-
if (!normalCompletion && it.return != null) it.return();
|
|
540
|
-
} finally {
|
|
541
|
-
if (didErr) throw err;
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
};
|
|
545
|
-
}
|
|
546
|
-
function _toPrimitive(input, hint) {
|
|
547
|
-
if (typeof input !== "object" || input === null) return input;
|
|
548
|
-
var prim = input[Symbol.toPrimitive];
|
|
549
|
-
if (prim !== undefined) {
|
|
550
|
-
var res = prim.call(input, hint || "default");
|
|
551
|
-
if (typeof res !== "object") return res;
|
|
552
|
-
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
542
|
+
function _unsupportedIterableToArray(r, a) {
|
|
543
|
+
if (r) {
|
|
544
|
+
if ("string" == typeof r) return _arrayLikeToArray(r, a);
|
|
545
|
+
var t = {}.toString.call(r).slice(8, -1);
|
|
546
|
+
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
|
|
553
547
|
}
|
|
554
|
-
return (hint === "string" ? String : Number)(input);
|
|
555
|
-
}
|
|
556
|
-
function _toPropertyKey(arg) {
|
|
557
|
-
var key = _toPrimitive(arg, "string");
|
|
558
|
-
return typeof key === "symbol" ? key : String(key);
|
|
559
548
|
}
|
|
560
549
|
var store;
|
|
561
550
|
function getGlobalConfig(config2) {
|
|
@@ -661,6 +650,19 @@
|
|
|
661
650
|
function getDefault(schema, dataset, config2) {
|
|
662
651
|
return typeof schema["default"] === "function" ? schema["default"](dataset, config2) : schema["default"];
|
|
663
652
|
}
|
|
653
|
+
function any() {
|
|
654
|
+
return {
|
|
655
|
+
kind: "schema",
|
|
656
|
+
type: "any",
|
|
657
|
+
reference: any,
|
|
658
|
+
expects: "any",
|
|
659
|
+
async: false,
|
|
660
|
+
_run: function _run(dataset) {
|
|
661
|
+
dataset.typed = true;
|
|
662
|
+
return dataset;
|
|
663
|
+
}
|
|
664
|
+
};
|
|
665
|
+
}
|
|
664
666
|
function array(item, message) {
|
|
665
667
|
return {
|
|
666
668
|
kind: "schema",
|
|
@@ -744,16 +746,35 @@
|
|
|
744
746
|
}
|
|
745
747
|
};
|
|
746
748
|
}
|
|
747
|
-
function
|
|
749
|
+
function literal(literal_, message) {
|
|
750
|
+
return {
|
|
751
|
+
kind: "schema",
|
|
752
|
+
type: "literal",
|
|
753
|
+
reference: literal,
|
|
754
|
+
expects: _stringify(literal_),
|
|
755
|
+
async: false,
|
|
756
|
+
literal: literal_,
|
|
757
|
+
message: message,
|
|
758
|
+
_run: function _run(dataset, config2) {
|
|
759
|
+
if (dataset.value === this.literal) {
|
|
760
|
+
dataset.typed = true;
|
|
761
|
+
} else {
|
|
762
|
+
_addIssue(this, "type", dataset, config2);
|
|
763
|
+
}
|
|
764
|
+
return dataset;
|
|
765
|
+
}
|
|
766
|
+
};
|
|
767
|
+
}
|
|
768
|
+
function number(message) {
|
|
748
769
|
return {
|
|
749
770
|
kind: "schema",
|
|
750
|
-
type: "
|
|
751
|
-
reference:
|
|
752
|
-
expects: "
|
|
771
|
+
type: "number",
|
|
772
|
+
reference: number,
|
|
773
|
+
expects: "number",
|
|
753
774
|
async: false,
|
|
754
775
|
message: message,
|
|
755
776
|
_run: function _run(dataset, config2) {
|
|
756
|
-
if (typeof dataset.value === "
|
|
777
|
+
if (typeof dataset.value === "number" && !isNaN(dataset.value)) {
|
|
757
778
|
dataset.typed = true;
|
|
758
779
|
} else {
|
|
759
780
|
_addIssue(this, "type", dataset, config2);
|
|
@@ -1242,41 +1263,20 @@
|
|
|
1242
1263
|
});
|
|
1243
1264
|
}
|
|
1244
1265
|
};
|
|
1245
|
-
var SafeFetchCommonRespondErrorType;
|
|
1246
|
-
(function(SafeFetchCommonRespondErrorType) {
|
|
1247
|
-
SafeFetchCommonRespondErrorType["UnexpectedRespond"] = "UnexpectedRespond";
|
|
1248
|
-
})(SafeFetchCommonRespondErrorType || (SafeFetchCommonRespondErrorType = {}));
|
|
1249
|
-
var SafeFetchErrorType;
|
|
1250
|
-
(function(SafeFetchErrorType) {
|
|
1251
|
-
SafeFetchErrorType["HttpError"] = "HttpError";
|
|
1252
|
-
SafeFetchErrorType["UnknownError"] = "UnknownError";
|
|
1253
|
-
})(SafeFetchErrorType || (SafeFetchErrorType = {}));
|
|
1254
|
-
const safeFetch = async (input, init) => {
|
|
1255
|
-
try {
|
|
1256
|
-
const response = await fetch(input, init);
|
|
1257
|
-
if (response.status > 299 || response.status < 200) {
|
|
1258
|
-
return err({
|
|
1259
|
-
type: SafeFetchErrorType.HttpError,
|
|
1260
|
-
message: `HTTP error, status = ${response.status}`,
|
|
1261
|
-
status: response.status
|
|
1262
|
-
});
|
|
1263
|
-
}
|
|
1264
|
-
return ok(response);
|
|
1265
|
-
} catch (error) {
|
|
1266
|
-
return err({
|
|
1267
|
-
type: SafeFetchErrorType.UnknownError,
|
|
1268
|
-
message: "Unknown error",
|
|
1269
|
-
cause: error
|
|
1270
|
-
});
|
|
1271
|
-
}
|
|
1272
|
-
};
|
|
1273
1266
|
exports.MobileCredentialVerificationReasonType = void 0;
|
|
1274
1267
|
(function(MobileCredentialVerificationReasonType) {
|
|
1275
|
-
MobileCredentialVerificationReasonType["
|
|
1276
|
-
MobileCredentialVerificationReasonType["
|
|
1277
|
-
MobileCredentialVerificationReasonType["
|
|
1278
|
-
MobileCredentialVerificationReasonType["
|
|
1279
|
-
MobileCredentialVerificationReasonType["
|
|
1268
|
+
MobileCredentialVerificationReasonType["TrustedIssuerCertificateExpired"] = "TrustedIssuerCertificateExpired";
|
|
1269
|
+
MobileCredentialVerificationReasonType["TrustedIssuerCertificateNotYetValid"] = "TrustedIssuerCertificateNotYetValid";
|
|
1270
|
+
MobileCredentialVerificationReasonType["IssuerNotTrusted"] = "IssuerNotTrusted";
|
|
1271
|
+
MobileCredentialVerificationReasonType["MobileCredentialInvalid"] = "MobileCredentialInvalid";
|
|
1272
|
+
MobileCredentialVerificationReasonType["MobileCredentialExpired"] = "MobileCredentialExpired";
|
|
1273
|
+
MobileCredentialVerificationReasonType["MobileCredentialNotYetValid"] = "MobileCredentialNotYetValid";
|
|
1274
|
+
MobileCredentialVerificationReasonType["InvalidSignerCertificate"] = "InvalidSignerCertificate";
|
|
1275
|
+
MobileCredentialVerificationReasonType["DeviceKeyInvalid"] = "DeviceKeyInvalid";
|
|
1276
|
+
MobileCredentialVerificationReasonType["UnsupportedCurve"] = "UnsupportedCurve";
|
|
1277
|
+
MobileCredentialVerificationReasonType["StatusRevoked"] = "StatusRevoked";
|
|
1278
|
+
MobileCredentialVerificationReasonType["StatusSuspended"] = "StatusSuspended";
|
|
1279
|
+
MobileCredentialVerificationReasonType["StatusUnknown"] = "StatusUnknown";
|
|
1280
1280
|
})(exports.MobileCredentialVerificationReasonType || (exports.MobileCredentialVerificationReasonType = {}));
|
|
1281
1281
|
exports.ClaimType = void 0;
|
|
1282
1282
|
(function(ClaimType) {
|
|
@@ -1302,6 +1302,13 @@
|
|
|
1302
1302
|
(function(OpenidPresentationCredentialProfileSupported) {
|
|
1303
1303
|
OpenidPresentationCredentialProfileSupported["MOBILE"] = "mobile";
|
|
1304
1304
|
})(exports.OpenidPresentationCredentialProfileSupported || (exports.OpenidPresentationCredentialProfileSupported = {}));
|
|
1305
|
+
var PresentationStatusCode;
|
|
1306
|
+
(function(PresentationStatusCode) {
|
|
1307
|
+
PresentationStatusCode["AwaitingRequestRetrieval"] = "AwaitingRequestRetrieval";
|
|
1308
|
+
PresentationStatusCode["AwaitingResponse"] = "AwaitingResponse";
|
|
1309
|
+
PresentationStatusCode["ResponseSubmitted"] = "ResponseSubmitted";
|
|
1310
|
+
PresentationStatusCode["ResultReady"] = "ResultReady";
|
|
1311
|
+
})(PresentationStatusCode || (PresentationStatusCode = {}));
|
|
1305
1312
|
const CredentialQueryValidator = object({
|
|
1306
1313
|
profile: picklist([ exports.OpenidPresentationCredentialProfileSupported.MOBILE ]),
|
|
1307
1314
|
docType: string(),
|
|
@@ -1325,69 +1332,138 @@
|
|
|
1325
1332
|
credentialErrors: optional(unknown()),
|
|
1326
1333
|
error: optional(unknown())
|
|
1327
1334
|
});
|
|
1335
|
+
exports.Mode = void 0;
|
|
1336
|
+
(function(Mode) {
|
|
1337
|
+
Mode["SameDevice"] = "sameDevice";
|
|
1338
|
+
Mode["CrossDevice"] = "crossDevice";
|
|
1339
|
+
})(exports.Mode || (exports.Mode = {}));
|
|
1340
|
+
var SessionType;
|
|
1341
|
+
(function(SessionType) {
|
|
1342
|
+
SessionType["DigitalCredentialsApi"] = "digital-credentials-api";
|
|
1343
|
+
SessionType["Openid4vp"] = "openid4vp";
|
|
1344
|
+
})(SessionType || (SessionType = {}));
|
|
1328
1345
|
object({
|
|
1329
1346
|
credentialQuery: array(CredentialQueryValidator),
|
|
1330
1347
|
challenge: string(),
|
|
1331
1348
|
redirectUri: optional(string()),
|
|
1332
|
-
walletProviderId: optional(string())
|
|
1349
|
+
walletProviderId: optional(string()),
|
|
1350
|
+
dcApiSupported: optional(_boolean())
|
|
1333
1351
|
});
|
|
1334
|
-
const
|
|
1352
|
+
const CreateSessionDigitalCredentialsValidator = object({
|
|
1353
|
+
type: literal(SessionType.DigitalCredentialsApi),
|
|
1335
1354
|
sessionId: string(),
|
|
1355
|
+
sessionKey: string(),
|
|
1356
|
+
sessionTtl: number(),
|
|
1357
|
+
request: record(string(), any())
|
|
1358
|
+
});
|
|
1359
|
+
const CreateSessionOpenId4vpResponseValidator = object({
|
|
1360
|
+
type: optional(literal(SessionType.Openid4vp)),
|
|
1361
|
+
sessionId: string(),
|
|
1362
|
+
sessionKey: string(),
|
|
1336
1363
|
sessionUrl: string()
|
|
1337
1364
|
});
|
|
1365
|
+
const CreateSessionResponseValidator = union([ CreateSessionDigitalCredentialsValidator, CreateSessionOpenId4vpResponseValidator ]);
|
|
1366
|
+
const GetSessionStatusResponseValidator = union([ object({
|
|
1367
|
+
status: picklist([ PresentationStatusCode.ResultReady ]),
|
|
1368
|
+
responseCode: optional(string())
|
|
1369
|
+
}), object({
|
|
1370
|
+
status: string()
|
|
1371
|
+
}) ]);
|
|
1338
1372
|
var LocalStorageKey;
|
|
1339
1373
|
(function(LocalStorageKey) {
|
|
1340
1374
|
LocalStorageKey["challenge"] = "mattr_chg";
|
|
1341
1375
|
LocalStorageKey["sessionId"] = "mattr_sid";
|
|
1342
1376
|
})(LocalStorageKey || (LocalStorageKey = {}));
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
Mode["sameDevice"] = "sameDevice";
|
|
1346
|
-
Mode["crossDevice"] = "crossDevice";
|
|
1347
|
-
})(exports.Mode || (exports.Mode = {}));
|
|
1377
|
+
const MATTR_SDK_VERSION_HEADER = "x-mattr-sdk-version";
|
|
1378
|
+
const MATTR_SDK_VERSION_VALUE = "2.0.0";
|
|
1348
1379
|
var MessageEventDataType;
|
|
1349
1380
|
(function(MessageEventDataType) {
|
|
1350
1381
|
MessageEventDataType["PresentationCompleted"] = "PresentationCompleted";
|
|
1351
1382
|
MessageEventDataType["PresentationTimeout"] = "PresentationTimeout";
|
|
1352
1383
|
MessageEventDataType["PresentationAbort"] = "PresentationAbort";
|
|
1353
1384
|
})(MessageEventDataType || (MessageEventDataType = {}));
|
|
1354
|
-
const
|
|
1355
|
-
credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
|
|
1356
|
-
redirectUri: string(),
|
|
1357
|
-
challenge: optional(string()),
|
|
1385
|
+
const OpenId4vpConfigSameDeviceOptionsValidator = object({
|
|
1358
1386
|
walletProviderId: optional(string()),
|
|
1359
|
-
mode:
|
|
1387
|
+
mode: literal(exports.Mode.SameDevice),
|
|
1388
|
+
redirectUri: string()
|
|
1360
1389
|
});
|
|
1361
|
-
const
|
|
1362
|
-
credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
|
|
1363
|
-
crossDeviceCallback: object({
|
|
1364
|
-
onComplete: function_(),
|
|
1365
|
-
onFailure: function_()
|
|
1366
|
-
}),
|
|
1367
|
-
challenge: optional(string()),
|
|
1390
|
+
const OpenId4vpConfigCrossDeviceOptionsValidator = object({
|
|
1368
1391
|
walletProviderId: optional(string()),
|
|
1369
|
-
mode:
|
|
1392
|
+
mode: literal(exports.Mode.CrossDevice)
|
|
1370
1393
|
});
|
|
1371
|
-
const
|
|
1372
|
-
|
|
1373
|
-
crossDeviceCallback: object({
|
|
1374
|
-
onComplete: function_(),
|
|
1375
|
-
onFailure: function_()
|
|
1376
|
-
}),
|
|
1394
|
+
const OpenId4vpConfigAutoDetectOptionsValidator = object({
|
|
1395
|
+
walletProviderId: optional(string()),
|
|
1377
1396
|
redirectUri: string(),
|
|
1397
|
+
mode: optional(picklist([ exports.Mode.CrossDevice, exports.Mode.SameDevice ]))
|
|
1398
|
+
});
|
|
1399
|
+
const RequestCredentialsOptionsValidator = object({
|
|
1400
|
+
credentialQuery: pipe(array(CredentialQueryValidator), nonEmpty()),
|
|
1378
1401
|
challenge: optional(string()),
|
|
1379
|
-
|
|
1380
|
-
mode: optional(picklist([ exports.Mode.crossDevice, exports.Mode.sameDevice ]))
|
|
1402
|
+
openid4vpConfiguration: optional(union([ OpenId4vpConfigSameDeviceOptionsValidator, OpenId4vpConfigCrossDeviceOptionsValidator, OpenId4vpConfigAutoDetectOptionsValidator ]))
|
|
1381
1403
|
});
|
|
1382
|
-
const RequestCredentialsOptionsValidator = union([ RequestCredentialsSameDeviceOptionsValidator, RequestCredentialsCrossDeviceOptionsValidator, RequestCredentialsAutoDetectDeviceOptionsValidator ]);
|
|
1383
1404
|
exports.RequestCredentialsErrorType = void 0;
|
|
1384
1405
|
(function(RequestCredentialsErrorType) {
|
|
1385
1406
|
RequestCredentialsErrorType["RequestCredentialsFailed"] = "RequestCredentialsFailed";
|
|
1407
|
+
RequestCredentialsErrorType["Timeout"] = "Timeout";
|
|
1408
|
+
RequestCredentialsErrorType["Abort"] = "Abort";
|
|
1386
1409
|
})(exports.RequestCredentialsErrorType || (exports.RequestCredentialsErrorType = {}));
|
|
1410
|
+
var RequestCredentialsErrorMessage;
|
|
1411
|
+
(function(RequestCredentialsErrorMessage) {
|
|
1412
|
+
RequestCredentialsErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
|
|
1413
|
+
RequestCredentialsErrorMessage["FailedToGetSessionStatus"] = "Failed to get session status";
|
|
1414
|
+
RequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
|
|
1415
|
+
RequestCredentialsErrorMessage["FailedToVerifyCredentialResponse"] = "Failed to verify credential response";
|
|
1416
|
+
RequestCredentialsErrorMessage["MissingOpenId4vpConfig"] = "Identified openid4vp session, but missing openId4vpConfiguration on `requestCredentials`";
|
|
1417
|
+
RequestCredentialsErrorMessage["DcApiError"] = "Failed to request credentials with Digital Credentials API";
|
|
1418
|
+
RequestCredentialsErrorMessage["DcApiResponseParseError"] = "Failed to parse response from Digital Credentials API";
|
|
1419
|
+
RequestCredentialsErrorMessage["Abort"] = "User aborted the session";
|
|
1420
|
+
RequestCredentialsErrorMessage["Timeout"] = "User session timeout";
|
|
1421
|
+
})(RequestCredentialsErrorMessage || (RequestCredentialsErrorMessage = {}));
|
|
1422
|
+
exports.AbortSessionErrorType = void 0;
|
|
1423
|
+
(function(AbortSessionErrorType) {
|
|
1424
|
+
AbortSessionErrorType["AbortSessionFailed"] = "AbortSessionFailed";
|
|
1425
|
+
})(exports.AbortSessionErrorType || (exports.AbortSessionErrorType = {}));
|
|
1426
|
+
var AbortSessionErrorMessage;
|
|
1427
|
+
(function(AbortSessionErrorMessage) {
|
|
1428
|
+
AbortSessionErrorMessage["FailedToAbortSession"] = "Failed to abort session";
|
|
1429
|
+
})(AbortSessionErrorMessage || (AbortSessionErrorMessage = {}));
|
|
1387
1430
|
const InitialiseOptionsValidator = object({
|
|
1388
|
-
apiBaseUrl: string(),
|
|
1389
|
-
applicationId:
|
|
1431
|
+
apiBaseUrl: pipe(string(), nonEmpty("Must not be empty")),
|
|
1432
|
+
applicationId: pipe(string(), nonEmpty("Must not be empty"))
|
|
1390
1433
|
});
|
|
1434
|
+
var SafeFetchCommonResponseErrorType;
|
|
1435
|
+
(function(SafeFetchCommonResponseErrorType) {
|
|
1436
|
+
SafeFetchCommonResponseErrorType["UnexpectedResponse"] = "UnexpectedResponse";
|
|
1437
|
+
})(SafeFetchCommonResponseErrorType || (SafeFetchCommonResponseErrorType = {}));
|
|
1438
|
+
var SafeFetchErrorType;
|
|
1439
|
+
(function(SafeFetchErrorType) {
|
|
1440
|
+
SafeFetchErrorType["HttpError"] = "HttpError";
|
|
1441
|
+
SafeFetchErrorType["UnknownError"] = "UnknownError";
|
|
1442
|
+
})(SafeFetchErrorType || (SafeFetchErrorType = {}));
|
|
1443
|
+
const safeFetch = async (input, init) => {
|
|
1444
|
+
try {
|
|
1445
|
+
const headers = Object.assign(Object.assign({}, init === null || init === void 0 ? void 0 : init.headers), {
|
|
1446
|
+
[MATTR_SDK_VERSION_HEADER]: `verifier-sdk-web/${MATTR_SDK_VERSION_VALUE}`
|
|
1447
|
+
});
|
|
1448
|
+
const response = await fetch(input, Object.assign(Object.assign({}, init), {
|
|
1449
|
+
headers: headers
|
|
1450
|
+
}));
|
|
1451
|
+
if (response.status > 299 || response.status < 200) {
|
|
1452
|
+
return err({
|
|
1453
|
+
type: SafeFetchErrorType.HttpError,
|
|
1454
|
+
message: `HTTP error, status = ${response.status}`,
|
|
1455
|
+
status: response.status
|
|
1456
|
+
});
|
|
1457
|
+
}
|
|
1458
|
+
return ok(response);
|
|
1459
|
+
} catch (error) {
|
|
1460
|
+
return err({
|
|
1461
|
+
type: SafeFetchErrorType.UnknownError,
|
|
1462
|
+
message: "Unknown error",
|
|
1463
|
+
cause: error
|
|
1464
|
+
});
|
|
1465
|
+
}
|
|
1466
|
+
};
|
|
1391
1467
|
let initialiseOptions = undefined;
|
|
1392
1468
|
var InitialiseErrorMessage;
|
|
1393
1469
|
(function(InitialiseErrorMessage) {
|
|
@@ -1398,6 +1474,34 @@
|
|
|
1398
1474
|
initialiseOptions = options;
|
|
1399
1475
|
};
|
|
1400
1476
|
const getInitialiseOptions = () => initialiseOptions;
|
|
1477
|
+
let sessionAbortController = undefined;
|
|
1478
|
+
let _sessionId = undefined;
|
|
1479
|
+
let _sessionKey = undefined;
|
|
1480
|
+
const getActiveSession = () => {
|
|
1481
|
+
const sessionId = _sessionId;
|
|
1482
|
+
const sessionKey = _sessionKey;
|
|
1483
|
+
if (sessionId) {
|
|
1484
|
+
return {
|
|
1485
|
+
sessionId: sessionId,
|
|
1486
|
+
sessionKey: sessionKey
|
|
1487
|
+
};
|
|
1488
|
+
}
|
|
1489
|
+
return undefined;
|
|
1490
|
+
};
|
|
1491
|
+
const setActiveSession = session => {
|
|
1492
|
+
const {sessionId: sessionId, sessionKey: sessionKey} = session;
|
|
1493
|
+
_sessionId = sessionId;
|
|
1494
|
+
_sessionKey = sessionKey;
|
|
1495
|
+
const abortController = new AbortController;
|
|
1496
|
+
sessionAbortController = abortController;
|
|
1497
|
+
return abortController;
|
|
1498
|
+
};
|
|
1499
|
+
const removeActiveSession = () => {
|
|
1500
|
+
sessionAbortController === null || sessionAbortController === void 0 ? void 0 : sessionAbortController.abort();
|
|
1501
|
+
sessionAbortController = undefined;
|
|
1502
|
+
_sessionKey = undefined;
|
|
1503
|
+
_sessionId = undefined;
|
|
1504
|
+
};
|
|
1401
1505
|
var isMobile_1 = isMobile;
|
|
1402
1506
|
var isMobile_2 = isMobile;
|
|
1403
1507
|
var default_1 = isMobile;
|
|
@@ -1422,6 +1526,23 @@
|
|
|
1422
1526
|
isMobile_1["default"] = default_1;
|
|
1423
1527
|
const defaultRetryDelay = attempt => Math.pow(2, attempt) * 1e3;
|
|
1424
1528
|
const defaultRetry = 2;
|
|
1529
|
+
const withRetry = async (fn, options) => {
|
|
1530
|
+
const {retries: retries = defaultRetry, retryDelay: retryDelay = defaultRetryDelay, attempt: attempt = 0} = options;
|
|
1531
|
+
try {
|
|
1532
|
+
return await fn();
|
|
1533
|
+
} catch (err) {
|
|
1534
|
+
if (retries > 0) {
|
|
1535
|
+
const delay = typeof retryDelay === "function" ? retryDelay(attempt) : retryDelay;
|
|
1536
|
+
await new Promise((resolve => setTimeout(resolve, delay)));
|
|
1537
|
+
return await withRetry(fn, Object.assign(Object.assign({}, options), {
|
|
1538
|
+
retries: retries - 1,
|
|
1539
|
+
retryDelay: retryDelay,
|
|
1540
|
+
attempt: attempt + 1
|
|
1541
|
+
}));
|
|
1542
|
+
}
|
|
1543
|
+
throw err;
|
|
1544
|
+
}
|
|
1545
|
+
};
|
|
1425
1546
|
const withRetrySafeFetch = async (fn, options) => {
|
|
1426
1547
|
const {retries: retries = defaultRetry, retryDelay: retryDelay = defaultRetryDelay, attempt: attempt = 0, retryHttpStatus: retryHttpStatus} = options;
|
|
1427
1548
|
const result = await fn();
|
|
@@ -1447,17 +1568,15 @@
|
|
|
1447
1568
|
const urlParams = new URLSearchParams(hash.split("#")[1]);
|
|
1448
1569
|
return urlParams.get(param);
|
|
1449
1570
|
};
|
|
1450
|
-
const createSession = async ({credentialQuery: credentialQuery, challenge: challenge, redirectUri: redirectUri, apiBaseUrl: apiBaseUrl,
|
|
1451
|
-
const postData =
|
|
1571
|
+
const createSession = async ({credentialQuery: credentialQuery, challenge: challenge, redirectUri: redirectUri, apiBaseUrl: apiBaseUrl, walletProviderId: walletProviderId, dcApiSupported: dcApiSupported, applicationId: applicationId}) => {
|
|
1572
|
+
const postData = {
|
|
1452
1573
|
credentialQuery: credentialQuery,
|
|
1453
|
-
challenge: challenge
|
|
1454
|
-
|
|
1455
|
-
redirectUri: redirectUri
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
}
|
|
1459
|
-
walletProviderId: walletProviderId
|
|
1460
|
-
} : {});
|
|
1574
|
+
challenge: challenge,
|
|
1575
|
+
applicationId: applicationId,
|
|
1576
|
+
redirectUri: redirectUri,
|
|
1577
|
+
walletProviderId: walletProviderId,
|
|
1578
|
+
dcApiSupported: dcApiSupported
|
|
1579
|
+
};
|
|
1461
1580
|
const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions`, {
|
|
1462
1581
|
method: "POST",
|
|
1463
1582
|
headers: {
|
|
@@ -1471,8 +1590,40 @@
|
|
|
1471
1590
|
const data = await responseResult.value.json();
|
|
1472
1591
|
if (!isType(CreateSessionResponseValidator)(data)) {
|
|
1473
1592
|
return err({
|
|
1474
|
-
type:
|
|
1475
|
-
message: "Create session
|
|
1593
|
+
type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
|
|
1594
|
+
message: "Create session returned unsupported response"
|
|
1595
|
+
});
|
|
1596
|
+
}
|
|
1597
|
+
return ok(data);
|
|
1598
|
+
};
|
|
1599
|
+
const abortSession = async ({apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey}) => {
|
|
1600
|
+
const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/abort`, {
|
|
1601
|
+
method: "POST",
|
|
1602
|
+
headers: {
|
|
1603
|
+
"Content-Type": "application/json",
|
|
1604
|
+
Authorization: `Bearer ${sessionKey}`
|
|
1605
|
+
}
|
|
1606
|
+
});
|
|
1607
|
+
if (responseResult.isErr()) {
|
|
1608
|
+
return err(responseResult.error);
|
|
1609
|
+
}
|
|
1610
|
+
return ok(undefined);
|
|
1611
|
+
};
|
|
1612
|
+
const getSessionStatus = async ({apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey}) => {
|
|
1613
|
+
const responseResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/status`, {
|
|
1614
|
+
method: "GET",
|
|
1615
|
+
headers: {
|
|
1616
|
+
Authorization: `Bearer ${sessionKey}`
|
|
1617
|
+
}
|
|
1618
|
+
});
|
|
1619
|
+
if (responseResult.isErr()) {
|
|
1620
|
+
return err(responseResult.error);
|
|
1621
|
+
}
|
|
1622
|
+
const data = await responseResult.value.json();
|
|
1623
|
+
if (!isType(GetSessionStatusResponseValidator)(data)) {
|
|
1624
|
+
return err({
|
|
1625
|
+
type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
|
|
1626
|
+
message: "Get session status return unsupported response"
|
|
1476
1627
|
});
|
|
1477
1628
|
}
|
|
1478
1629
|
return ok(data);
|
|
@@ -1499,7 +1650,7 @@
|
|
|
1499
1650
|
const data = await responseResult.value.json();
|
|
1500
1651
|
if (!isType(PresentationResultRelaxValidator)(data)) {
|
|
1501
1652
|
return err({
|
|
1502
|
-
type:
|
|
1653
|
+
type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
|
|
1503
1654
|
message: "Exchange session result return unsupported response",
|
|
1504
1655
|
details: {
|
|
1505
1656
|
data: data
|
|
@@ -1512,26 +1663,17 @@
|
|
|
1512
1663
|
ua: userAgent,
|
|
1513
1664
|
tablet: false
|
|
1514
1665
|
});
|
|
1515
|
-
|
|
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 = {}));
|
|
1666
|
+
const getVersion = () => MATTR_SDK_VERSION_VALUE;
|
|
1528
1667
|
var WindowEventListenerType;
|
|
1529
1668
|
(function(WindowEventListenerType) {
|
|
1530
1669
|
WindowEventListenerType["message"] = "message";
|
|
1531
1670
|
})(WindowEventListenerType || (WindowEventListenerType = {}));
|
|
1532
|
-
let listener;
|
|
1671
|
+
let listener = undefined;
|
|
1533
1672
|
const removeWindowMessageEventListener = () => {
|
|
1534
|
-
|
|
1673
|
+
if (listener) {
|
|
1674
|
+
window.removeEventListener(WindowEventListenerType.message, listener, false);
|
|
1675
|
+
}
|
|
1676
|
+
listener = undefined;
|
|
1535
1677
|
};
|
|
1536
1678
|
const closeCrossDeviceModal = options => {
|
|
1537
1679
|
const {container: container} = options;
|
|
@@ -1541,8 +1683,7 @@
|
|
|
1541
1683
|
removeWindowMessageEventListener();
|
|
1542
1684
|
};
|
|
1543
1685
|
const receiveMessageHandler = options => async event => {
|
|
1544
|
-
const {
|
|
1545
|
-
const {onComplete: onComplete, onFailure: onFailure} = crossDeviceCallback;
|
|
1686
|
+
const {onComplete: onComplete, onFailure: onFailure, container: container, sessionId: sessionId, apiBaseUrl: apiBaseUrl, challenge: challenge} = options;
|
|
1546
1687
|
if (event.origin !== apiBaseUrl) {
|
|
1547
1688
|
return;
|
|
1548
1689
|
}
|
|
@@ -1556,8 +1697,8 @@
|
|
|
1556
1697
|
});
|
|
1557
1698
|
if (result.isErr()) {
|
|
1558
1699
|
onFailure({
|
|
1559
|
-
type: exports.
|
|
1560
|
-
message:
|
|
1700
|
+
type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
|
|
1701
|
+
message: RequestCredentialsErrorMessage.FailedToGetSessionResult
|
|
1561
1702
|
});
|
|
1562
1703
|
closeCrossDeviceModal({
|
|
1563
1704
|
container: container
|
|
@@ -1565,8 +1706,9 @@
|
|
|
1565
1706
|
return;
|
|
1566
1707
|
}
|
|
1567
1708
|
onComplete({
|
|
1568
|
-
result: result.value,
|
|
1569
|
-
sessionId: result.value.sessionId
|
|
1709
|
+
result: "challenge" in result.value ? result.value : undefined,
|
|
1710
|
+
sessionId: result.value.sessionId,
|
|
1711
|
+
sessionCompletedInRedirect: false
|
|
1570
1712
|
});
|
|
1571
1713
|
closeCrossDeviceModal({
|
|
1572
1714
|
container: container
|
|
@@ -1575,8 +1717,8 @@
|
|
|
1575
1717
|
}
|
|
1576
1718
|
if (event.data.type === MessageEventDataType.PresentationTimeout) {
|
|
1577
1719
|
onFailure({
|
|
1578
|
-
type: exports.
|
|
1579
|
-
message:
|
|
1720
|
+
type: exports.RequestCredentialsErrorType.Timeout,
|
|
1721
|
+
message: RequestCredentialsErrorMessage.Timeout
|
|
1580
1722
|
});
|
|
1581
1723
|
closeCrossDeviceModal({
|
|
1582
1724
|
container: container
|
|
@@ -1585,8 +1727,8 @@
|
|
|
1585
1727
|
}
|
|
1586
1728
|
if (event.data.type === MessageEventDataType.PresentationAbort) {
|
|
1587
1729
|
onFailure({
|
|
1588
|
-
type: exports.
|
|
1589
|
-
message:
|
|
1730
|
+
type: exports.RequestCredentialsErrorType.Abort,
|
|
1731
|
+
message: RequestCredentialsErrorMessage.Abort
|
|
1590
1732
|
});
|
|
1591
1733
|
closeCrossDeviceModal({
|
|
1592
1734
|
container: container
|
|
@@ -1609,104 +1751,293 @@
|
|
|
1609
1751
|
modalContainer.setAttribute("class", "mattr-verifier-modal-container");
|
|
1610
1752
|
return modalContainer;
|
|
1611
1753
|
};
|
|
1612
|
-
const
|
|
1613
|
-
const {challenge: challenge,
|
|
1614
|
-
const
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1754
|
+
const requestCredentialsWithCrossDevice = async options => {
|
|
1755
|
+
const {challenge: challenge, apiBaseUrl: apiBaseUrl, sessionUrl: sessionUrl, sessionId: sessionId, sessionKey: sessionKey} = options;
|
|
1756
|
+
const container = openCrossDeviceModal({
|
|
1757
|
+
sessionUrl: sessionUrl
|
|
1758
|
+
});
|
|
1759
|
+
return await new Promise((resolve => {
|
|
1760
|
+
const abortController = setActiveSession({
|
|
1761
|
+
sessionId: sessionId,
|
|
1762
|
+
sessionKey: sessionKey
|
|
1763
|
+
});
|
|
1764
|
+
abortController.signal.addEventListener("abort", (() => {
|
|
1765
|
+
closeCrossDeviceModal({
|
|
1766
|
+
container: container
|
|
1767
|
+
});
|
|
1768
|
+
resolve(err({
|
|
1769
|
+
type: exports.RequestCredentialsErrorType.Abort,
|
|
1770
|
+
message: RequestCredentialsErrorMessage.Abort
|
|
1771
|
+
}));
|
|
1772
|
+
}));
|
|
1773
|
+
removeWindowMessageEventListener();
|
|
1774
|
+
listener = receiveMessageHandler({
|
|
1775
|
+
container: container,
|
|
1776
|
+
sessionId: sessionId,
|
|
1777
|
+
apiBaseUrl: apiBaseUrl,
|
|
1778
|
+
challenge: challenge,
|
|
1779
|
+
onComplete: data => resolve(ok(data)),
|
|
1780
|
+
onFailure: error => resolve(err(error))
|
|
1781
|
+
});
|
|
1782
|
+
window.addEventListener(WindowEventListenerType.message, listener, false);
|
|
1783
|
+
}));
|
|
1784
|
+
};
|
|
1785
|
+
const requestCredentialsWithDigitalCredentialsApi = async options => {
|
|
1786
|
+
const {apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey, challenge: challenge, request: request} = options;
|
|
1787
|
+
const credentialResponseResult = await getCredentials(request);
|
|
1788
|
+
if (credentialResponseResult.isErr()) {
|
|
1789
|
+
await abortSession({
|
|
1790
|
+
apiBaseUrl: apiBaseUrl,
|
|
1791
|
+
sessionId: sessionId,
|
|
1792
|
+
sessionKey: sessionKey
|
|
1793
|
+
});
|
|
1794
|
+
return err(credentialResponseResult.error);
|
|
1795
|
+
}
|
|
1796
|
+
const credentialResponse = credentialResponseResult.value;
|
|
1797
|
+
const parsedCredentialResponseResult = parseCredentialResponse(credentialResponse);
|
|
1798
|
+
if (parsedCredentialResponseResult.isErr()) {
|
|
1799
|
+
await abortSession({
|
|
1800
|
+
apiBaseUrl: apiBaseUrl,
|
|
1801
|
+
sessionId: sessionId,
|
|
1802
|
+
sessionKey: sessionKey
|
|
1803
|
+
});
|
|
1804
|
+
return err(parsedCredentialResponseResult.error);
|
|
1805
|
+
}
|
|
1806
|
+
const parsedCredentialResponse = parsedCredentialResponseResult.value;
|
|
1807
|
+
const credentialVerificationResult = await verifyCredentialResponse({
|
|
1618
1808
|
apiBaseUrl: apiBaseUrl,
|
|
1619
|
-
|
|
1620
|
-
|
|
1809
|
+
sessionId: sessionId,
|
|
1810
|
+
sessionKey: sessionKey,
|
|
1811
|
+
challenge: challenge,
|
|
1812
|
+
protocol: parsedCredentialResponse.protocol,
|
|
1813
|
+
data: parsedCredentialResponse.data
|
|
1621
1814
|
});
|
|
1622
|
-
if (
|
|
1815
|
+
if (credentialVerificationResult.isErr()) {
|
|
1623
1816
|
return err({
|
|
1624
1817
|
type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
|
|
1625
|
-
message:
|
|
1626
|
-
cause:
|
|
1818
|
+
message: RequestCredentialsErrorMessage.FailedToVerifyCredentialResponse,
|
|
1819
|
+
cause: credentialVerificationResult.error
|
|
1627
1820
|
});
|
|
1628
1821
|
}
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1822
|
+
return ok(credentialVerificationResult.value);
|
|
1823
|
+
};
|
|
1824
|
+
const getCredentials = async request => {
|
|
1825
|
+
try {
|
|
1826
|
+
const credentialResponse = await navigator.credentials.get(request);
|
|
1827
|
+
return ok(credentialResponse);
|
|
1828
|
+
} catch (exception) {
|
|
1829
|
+
return err({
|
|
1830
|
+
type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
|
|
1831
|
+
message: RequestCredentialsErrorMessage.DcApiError,
|
|
1832
|
+
cause: exception
|
|
1833
|
+
});
|
|
1834
|
+
}
|
|
1835
|
+
};
|
|
1836
|
+
const parseCredentialResponse = credentialResponse => {
|
|
1837
|
+
if (!credentialResponse) {
|
|
1838
|
+
return err({
|
|
1839
|
+
type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
|
|
1840
|
+
message: RequestCredentialsErrorMessage.DcApiResponseParseError,
|
|
1841
|
+
details: {
|
|
1842
|
+
response: credentialResponse
|
|
1843
|
+
}
|
|
1844
|
+
});
|
|
1845
|
+
}
|
|
1846
|
+
if (typeof credentialResponse === "object") {
|
|
1847
|
+
return ok(credentialResponse);
|
|
1848
|
+
}
|
|
1849
|
+
if (typeof credentialResponse === "string") {
|
|
1850
|
+
try {
|
|
1851
|
+
const parsed = JSON.parse(credentialResponse);
|
|
1852
|
+
return ok(parsed);
|
|
1853
|
+
} catch (_a) {
|
|
1854
|
+
return err({
|
|
1855
|
+
type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
|
|
1856
|
+
message: RequestCredentialsErrorMessage.DcApiResponseParseError,
|
|
1857
|
+
details: {
|
|
1858
|
+
response: credentialResponse
|
|
1859
|
+
}
|
|
1860
|
+
});
|
|
1861
|
+
}
|
|
1862
|
+
}
|
|
1863
|
+
return err({
|
|
1864
|
+
type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
|
|
1865
|
+
message: RequestCredentialsErrorMessage.DcApiResponseParseError,
|
|
1866
|
+
details: {
|
|
1867
|
+
response: credentialResponse
|
|
1868
|
+
}
|
|
1633
1869
|
});
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1870
|
+
};
|
|
1871
|
+
const verifyCredentialResponse = async options => {
|
|
1872
|
+
const {apiBaseUrl: apiBaseUrl, sessionId: sessionId, sessionKey: sessionKey, challenge: challenge, protocol: protocol, data: data} = options;
|
|
1873
|
+
const requestBody = {
|
|
1874
|
+
protocol: protocol,
|
|
1875
|
+
data: data,
|
|
1639
1876
|
challenge: challenge
|
|
1877
|
+
};
|
|
1878
|
+
const credentialVerificationResult = await safeFetch(`${apiBaseUrl}/v2/presentations/sessions/${sessionId}/dc-api/response`, {
|
|
1879
|
+
method: "POST",
|
|
1880
|
+
headers: {
|
|
1881
|
+
"Content-Type": "application/json",
|
|
1882
|
+
Authorization: `Bearer ${sessionKey}`
|
|
1883
|
+
},
|
|
1884
|
+
body: JSON.stringify(requestBody)
|
|
1640
1885
|
});
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1886
|
+
if (credentialVerificationResult.isErr()) {
|
|
1887
|
+
return err(credentialVerificationResult.error);
|
|
1888
|
+
}
|
|
1889
|
+
const credentialVerificationResponse = await credentialVerificationResult.value.json();
|
|
1890
|
+
if (!isType(PresentationResultRelaxValidator)(credentialVerificationResponse)) {
|
|
1891
|
+
return err({
|
|
1892
|
+
type: SafeFetchCommonResponseErrorType.UnexpectedResponse,
|
|
1893
|
+
message: "Verify credential returned unsupported response",
|
|
1894
|
+
details: {
|
|
1895
|
+
response: credentialVerificationResponse
|
|
1896
|
+
}
|
|
1897
|
+
});
|
|
1898
|
+
}
|
|
1899
|
+
return ok(credentialVerificationResponse);
|
|
1645
1900
|
};
|
|
1901
|
+
const isDigitalCredentialsApiSupported = () => {
|
|
1902
|
+
var _a;
|
|
1903
|
+
return "DigitalCredential" in window && typeof window.DigitalCredential === "function" && typeof ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.credentials) === null || _a === void 0 ? void 0 : _a.get) === "function";
|
|
1904
|
+
};
|
|
1905
|
+
const sleep = ms => new Promise((resolve => setTimeout(resolve, ms)));
|
|
1906
|
+
const SESSION_STATUS_POLLING_MAX_RETRY = 1e3;
|
|
1907
|
+
const SESSION_STATUS_POLLING_INTERVAL_MS = 3e3;
|
|
1908
|
+
const SESSION_STATUS_POLLING_INITIAL_DELAY_MS = 3e3;
|
|
1646
1909
|
var SameDeviceRequestCredentialsErrorMessage;
|
|
1647
1910
|
(function(SameDeviceRequestCredentialsErrorMessage) {
|
|
1648
1911
|
SameDeviceRequestCredentialsErrorMessage["FailedToStoreChallenge"] = "Failed to store challenge";
|
|
1649
1912
|
SameDeviceRequestCredentialsErrorMessage["FailedToCreateSession"] = "Failed to create session";
|
|
1650
1913
|
})(SameDeviceRequestCredentialsErrorMessage || (SameDeviceRequestCredentialsErrorMessage = {}));
|
|
1651
1914
|
const requestCredentialsSameDevice = async options => {
|
|
1652
|
-
const {challenge: challenge,
|
|
1653
|
-
const
|
|
1915
|
+
const {challenge: challenge, apiBaseUrl: apiBaseUrl, applicationId: applicationId, sessionUrl: sessionUrl, sessionKey: sessionKey, sessionId: sessionId} = options;
|
|
1916
|
+
const abortController = setActiveSession({
|
|
1917
|
+
sessionId: sessionId,
|
|
1918
|
+
sessionKey: sessionKey
|
|
1919
|
+
});
|
|
1920
|
+
window.localStorage.setItem(LocalStorageKey.sessionId, sessionId);
|
|
1654
1921
|
window.localStorage.setItem(LocalStorageKey.challenge, challenge);
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1922
|
+
window.location.assign(sessionUrl);
|
|
1923
|
+
await sleep(SESSION_STATUS_POLLING_INITIAL_DELAY_MS);
|
|
1924
|
+
const checkResult = await withRetry((async () => {
|
|
1925
|
+
const statusResult = await getSessionStatus({
|
|
1926
|
+
apiBaseUrl: apiBaseUrl,
|
|
1927
|
+
applicationId: applicationId,
|
|
1928
|
+
sessionId: sessionId,
|
|
1929
|
+
sessionKey: sessionKey
|
|
1660
1930
|
});
|
|
1931
|
+
if (abortController.signal.aborted) {
|
|
1932
|
+
return err({
|
|
1933
|
+
type: exports.RequestCredentialsErrorType.Abort,
|
|
1934
|
+
message: RequestCredentialsErrorMessage.Abort
|
|
1935
|
+
});
|
|
1936
|
+
}
|
|
1937
|
+
if (statusResult.isErr()) {
|
|
1938
|
+
if (statusResult.error.status === 404) {
|
|
1939
|
+
return err({
|
|
1940
|
+
type: exports.RequestCredentialsErrorType.Timeout,
|
|
1941
|
+
message: RequestCredentialsErrorMessage.Timeout
|
|
1942
|
+
});
|
|
1943
|
+
}
|
|
1944
|
+
throw Error("Unexpected status response. Retry");
|
|
1945
|
+
}
|
|
1946
|
+
if (statusResult.value.status !== PresentationStatusCode.ResultReady) {
|
|
1947
|
+
throw Error("Result is not ready. Retry");
|
|
1948
|
+
}
|
|
1949
|
+
return ok(undefined);
|
|
1950
|
+
}), {
|
|
1951
|
+
retries: SESSION_STATUS_POLLING_MAX_RETRY,
|
|
1952
|
+
retryDelay: SESSION_STATUS_POLLING_INTERVAL_MS
|
|
1953
|
+
});
|
|
1954
|
+
if (checkResult.isErr()) {
|
|
1955
|
+
return err(checkResult.error);
|
|
1956
|
+
}
|
|
1957
|
+
window.close();
|
|
1958
|
+
return ok({
|
|
1959
|
+
sessionId: sessionId,
|
|
1960
|
+
sessionCompletedInRedirect: true
|
|
1961
|
+
});
|
|
1962
|
+
};
|
|
1963
|
+
const requestCredentials = async options => {
|
|
1964
|
+
var _a;
|
|
1965
|
+
const initialiseOptions = getInitialiseOptions();
|
|
1966
|
+
if (!initialiseOptions) {
|
|
1967
|
+
throw new Exception(InitialiseErrorMessage.SdkNotInitialised);
|
|
1661
1968
|
}
|
|
1969
|
+
assertType(RequestCredentialsOptionsValidator, "Invalid request credential options")(options);
|
|
1970
|
+
const {apiBaseUrl: apiBaseUrl, applicationId: applicationId} = initialiseOptions;
|
|
1971
|
+
const {challenge: challenge = generateChallenge(), credentialQuery: credentialQuery, openid4vpConfiguration: openid4vpConfiguration} = options;
|
|
1972
|
+
const dcApiSupported = isDigitalCredentialsApiSupported();
|
|
1973
|
+
const openId4VpRedirectUri = deriveOpenId4vpRedirectUri(openid4vpConfiguration);
|
|
1662
1974
|
const createSessionResult = await createSession({
|
|
1663
1975
|
credentialQuery: credentialQuery,
|
|
1664
|
-
challenge:
|
|
1665
|
-
redirectUri:
|
|
1976
|
+
challenge: challenge,
|
|
1977
|
+
redirectUri: openId4VpRedirectUri,
|
|
1978
|
+
walletProviderId: (_a = openid4vpConfiguration === null || openid4vpConfiguration === void 0 ? void 0 : openid4vpConfiguration.walletProviderId) !== null && _a !== void 0 ? _a : undefined,
|
|
1666
1979
|
apiBaseUrl: apiBaseUrl,
|
|
1667
1980
|
applicationId: applicationId,
|
|
1668
|
-
|
|
1981
|
+
dcApiSupported: dcApiSupported
|
|
1669
1982
|
});
|
|
1670
1983
|
if (createSessionResult.isErr()) {
|
|
1671
1984
|
return err({
|
|
1672
1985
|
type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
|
|
1673
|
-
message:
|
|
1986
|
+
message: RequestCredentialsErrorMessage.FailedToCreateSession,
|
|
1674
1987
|
cause: createSessionResult.error
|
|
1675
1988
|
});
|
|
1676
1989
|
}
|
|
1677
|
-
const
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1990
|
+
const session = createSessionResult.value;
|
|
1991
|
+
const {sessionKey: sessionKey, sessionId: sessionId} = session;
|
|
1992
|
+
if (session.type === SessionType.DigitalCredentialsApi) {
|
|
1993
|
+
const {request: request} = session;
|
|
1994
|
+
return await requestCredentialsWithDigitalCredentialsApi({
|
|
1995
|
+
apiBaseUrl: apiBaseUrl,
|
|
1996
|
+
request: request,
|
|
1997
|
+
sessionId: sessionId,
|
|
1998
|
+
sessionKey: sessionKey,
|
|
1999
|
+
challenge: challenge
|
|
2000
|
+
});
|
|
2001
|
+
}
|
|
2002
|
+
if (!openid4vpConfiguration) {
|
|
2003
|
+
return err({
|
|
2004
|
+
type: exports.RequestCredentialsErrorType.RequestCredentialsFailed,
|
|
2005
|
+
message: RequestCredentialsErrorMessage.MissingOpenId4vpConfig
|
|
2006
|
+
});
|
|
2007
|
+
}
|
|
2008
|
+
const {sessionUrl: sessionUrl} = session;
|
|
2009
|
+
if (openId4VpRedirectUri) {
|
|
2010
|
+
return await requestCredentialsSameDevice({
|
|
2011
|
+
challenge: challenge,
|
|
2012
|
+
apiBaseUrl: apiBaseUrl,
|
|
2013
|
+
applicationId: applicationId,
|
|
2014
|
+
sessionUrl: sessionUrl,
|
|
2015
|
+
sessionKey: sessionKey,
|
|
2016
|
+
sessionId: sessionId
|
|
2017
|
+
});
|
|
2018
|
+
}
|
|
2019
|
+
return await requestCredentialsWithCrossDevice({
|
|
2020
|
+
challenge: challenge,
|
|
2021
|
+
apiBaseUrl: apiBaseUrl,
|
|
2022
|
+
sessionUrl: sessionUrl,
|
|
2023
|
+
sessionKey: sessionKey,
|
|
1681
2024
|
sessionId: sessionId
|
|
1682
2025
|
});
|
|
1683
2026
|
};
|
|
1684
|
-
const
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
if (!initialiseOptions) {
|
|
1688
|
-
throw new Exception(InitialiseErrorMessage.SdkNotInitialised);
|
|
2027
|
+
const deriveOpenId4vpRedirectUri = openid4vpConfiguration => {
|
|
2028
|
+
if (!openid4vpConfiguration) {
|
|
2029
|
+
return undefined;
|
|
1689
2030
|
}
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
initialiseOptions: initialiseOptions,
|
|
1696
|
-
challenge: challenge,
|
|
1697
|
-
mode: mode
|
|
1698
|
-
}));
|
|
2031
|
+
let detectedMode;
|
|
2032
|
+
if (openid4vpConfiguration && openid4vpConfiguration.mode) {
|
|
2033
|
+
detectedMode = openid4vpConfiguration.mode;
|
|
2034
|
+
} else {
|
|
2035
|
+
detectedMode = isMobileDetect(navigator.userAgent) ? exports.Mode.SameDevice : exports.Mode.CrossDevice;
|
|
1699
2036
|
}
|
|
1700
|
-
if (
|
|
1701
|
-
return
|
|
1702
|
-
initialiseOptions: initialiseOptions,
|
|
1703
|
-
challenge: challenge,
|
|
1704
|
-
mode: mode
|
|
1705
|
-
}));
|
|
2037
|
+
if (detectedMode === exports.Mode.SameDevice && !isType(OpenId4vpConfigCrossDeviceOptionsValidator)(openid4vpConfiguration) && openid4vpConfiguration.redirectUri) {
|
|
2038
|
+
return openid4vpConfiguration.redirectUri;
|
|
1706
2039
|
}
|
|
1707
|
-
|
|
1708
|
-
data: options
|
|
1709
|
-
});
|
|
2040
|
+
return undefined;
|
|
1710
2041
|
};
|
|
1711
2042
|
exports.HandleRedirectCallbackErrorType = void 0;
|
|
1712
2043
|
(function(HandleRedirectCallbackErrorType) {
|
|
@@ -1716,7 +2047,7 @@
|
|
|
1716
2047
|
(function(HandleRedirectCallbackErrorMessage) {
|
|
1717
2048
|
HandleRedirectCallbackErrorMessage["FailedToFindResponseCode"] = "Failed to find response code";
|
|
1718
2049
|
HandleRedirectCallbackErrorMessage["FailedToFindChallenge"] = "Failed to find challenge";
|
|
1719
|
-
HandleRedirectCallbackErrorMessage["
|
|
2050
|
+
HandleRedirectCallbackErrorMessage["FailedToFindActiveSession"] = "Failed to find active session";
|
|
1720
2051
|
HandleRedirectCallbackErrorMessage["FailedToGetSessionResult"] = "Failed to get session result";
|
|
1721
2052
|
})(HandleRedirectCallbackErrorMessage || (HandleRedirectCallbackErrorMessage = {}));
|
|
1722
2053
|
const handleRedirectCallback = async () => {
|
|
@@ -1732,18 +2063,12 @@
|
|
|
1732
2063
|
message: HandleRedirectCallbackErrorMessage.FailedToFindResponseCode
|
|
1733
2064
|
});
|
|
1734
2065
|
}
|
|
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
2066
|
const sessionId = window.localStorage.getItem(LocalStorageKey.sessionId);
|
|
1743
|
-
|
|
2067
|
+
const challenge = window.localStorage.getItem(LocalStorageKey.challenge);
|
|
2068
|
+
if (!sessionId || !challenge) {
|
|
1744
2069
|
return err({
|
|
1745
2070
|
type: exports.HandleRedirectCallbackErrorType.HandleRedirectCallbackFailed,
|
|
1746
|
-
message: HandleRedirectCallbackErrorMessage.
|
|
2071
|
+
message: HandleRedirectCallbackErrorMessage.FailedToFindActiveSession
|
|
1747
2072
|
});
|
|
1748
2073
|
}
|
|
1749
2074
|
const result = await exchangeSessionResult({
|
|
@@ -1760,16 +2085,45 @@
|
|
|
1760
2085
|
});
|
|
1761
2086
|
}
|
|
1762
2087
|
return ok({
|
|
1763
|
-
result: result.value,
|
|
2088
|
+
result: "challenge" in result.value ? result.value : undefined,
|
|
1764
2089
|
sessionId: result.value.sessionId
|
|
1765
2090
|
});
|
|
1766
2091
|
};
|
|
2092
|
+
const abortCredentialRequest = async () => {
|
|
2093
|
+
const initialiseOptions = getInitialiseOptions();
|
|
2094
|
+
if (!initialiseOptions) {
|
|
2095
|
+
throw new Exception(InitialiseErrorMessage.SdkNotInitialised);
|
|
2096
|
+
}
|
|
2097
|
+
const {apiBaseUrl: apiBaseUrl} = initialiseOptions;
|
|
2098
|
+
const session = getActiveSession();
|
|
2099
|
+
if (!session || !session.sessionKey) {
|
|
2100
|
+
return ok(undefined);
|
|
2101
|
+
}
|
|
2102
|
+
const {sessionId: sessionId, sessionKey: sessionKey} = session;
|
|
2103
|
+
removeActiveSession();
|
|
2104
|
+
const abortSessionResult = await abortSession({
|
|
2105
|
+
apiBaseUrl: apiBaseUrl,
|
|
2106
|
+
sessionId: sessionId,
|
|
2107
|
+
sessionKey: sessionKey
|
|
2108
|
+
});
|
|
2109
|
+
if (abortSessionResult.isErr()) {
|
|
2110
|
+
return err({
|
|
2111
|
+
type: exports.AbortSessionErrorType.AbortSessionFailed,
|
|
2112
|
+
message: AbortSessionErrorMessage.FailedToAbortSession,
|
|
2113
|
+
cause: abortSessionResult.error
|
|
2114
|
+
});
|
|
2115
|
+
}
|
|
2116
|
+
return ok(undefined);
|
|
2117
|
+
};
|
|
1767
2118
|
const utils = {
|
|
1768
2119
|
generateChallenge: generateChallenge,
|
|
2120
|
+
getVersion: getVersion,
|
|
1769
2121
|
unwrap: unwrap
|
|
1770
2122
|
};
|
|
2123
|
+
exports.abortCredentialRequest = abortCredentialRequest;
|
|
1771
2124
|
exports.handleRedirectCallback = handleRedirectCallback;
|
|
1772
2125
|
exports.initialise = initialise;
|
|
2126
|
+
exports.isDigitalCredentialsApiSupported = isDigitalCredentialsApiSupported;
|
|
1773
2127
|
exports.requestCredentials = requestCredentials;
|
|
1774
2128
|
exports.utils = utils;
|
|
1775
2129
|
Object.defineProperty(exports, "__esModule", {
|