@sphereon/oid4vci-common
Version:
OpenID 4 Verifiable Credential Issuance Common Types
1,261 lines (1,235 loc) • 63.2 kB
JavaScript
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __esm = (fn, res) => function __init() {
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// ../../node_modules/.pnpm/tsup@8.5.0_@swc+core@1.14.0_postcss@8.5.6_tsx@4.20.6_typescript@5.8.3_yaml@2.8.1/node_modules/tsup/assets/cjs_shims.js
var init_cjs_shims = __esm({
"../../node_modules/.pnpm/tsup@8.5.0_@swc+core@1.14.0_postcss@8.5.6_tsx@4.20.6_typescript@5.8.3_yaml@2.8.1/node_modules/tsup/assets/cjs_shims.js"() {
"use strict";
}
});
// lib/functions/randomBytes.cjs
var require_randomBytes = __commonJS({
"lib/functions/randomBytes.cjs"(exports, module2) {
"use strict";
init_cjs_shims();
var MAX_BYTES = 65536;
var MAX_UINT32 = 4294967295;
var _global = typeof globalThis !== "undefined" ? globalThis : global;
var crypto = _global.crypto || _global.msCrypto;
if (!crypto) {
try {
crypto = require("crypto");
} catch (err) {
throw Error("crypto module is not available");
}
}
function randomBytes2(size) {
if (size > MAX_UINT32) throw new Error("requested too many random bytes");
const bytes = Buffer.allocUnsafe(size);
if (size > 0) {
if (size > MAX_BYTES) {
for (let generated = 0; generated < size; generated += MAX_BYTES) {
crypto.getRandomValues(bytes.slice(generated, generated + MAX_BYTES));
}
} else {
crypto.getRandomValues(bytes);
}
}
return Uint8Array.from(bytes);
}
__name(randomBytes2, "randomBytes");
module2.exports = randomBytes2;
}
});
// lib/index.ts
var index_exports = {};
__export(index_exports, {
ACCESS_TOKEN_ISSUER_REQUIRED_ERROR: () => ACCESS_TOKEN_ISSUER_REQUIRED_ERROR,
ALG_ERROR: () => ALG_ERROR,
AUD_ERROR: () => AUD_ERROR,
Alg: () => Alg,
AuthorizationChallengeError: () => AuthorizationChallengeError,
AuthzFlowType: () => AuthzFlowType,
BAD_PARAMS: () => BAD_PARAMS,
CODE_VERIFIER_DEFAULT_LENGTH: () => CODE_VERIFIER_DEFAULT_LENGTH,
CREDENTIAL_MISSING_ERROR: () => CREDENTIAL_MISSING_ERROR,
CodeChallengeMethod: () => CodeChallengeMethod,
CreateRequestObjectMode: () => CreateRequestObjectMode,
CredentialEventNames: () => CredentialEventNames,
CredentialOfferEventNames: () => CredentialOfferEventNames,
DID_NO_DIDDOC_ERROR: () => DID_NO_DIDDOC_ERROR,
DefaultURISchemes: () => DefaultURISchemes,
EVENTS: () => EVENTS,
EXPERIMENTAL_SUBJECT_PROOF_MODE_ENABLED: () => EXPERIMENTAL_SUBJECT_PROOF_MODE_ENABLED,
EXPIRED_PRE_AUTHORIZED_CODE: () => EXPIRED_PRE_AUTHORIZED_CODE,
Encoding: () => Encoding,
GRANTS_MUST_NOT_BE_UNDEFINED: () => GRANTS_MUST_NOT_BE_UNDEFINED,
GrantTypes: () => GrantTypes,
IAT_ERROR: () => IAT_ERROR,
INVALID_PRE_AUTHORIZED_CODE: () => INVALID_PRE_AUTHORIZED_CODE,
ISSUER_CONFIG_ERROR: () => ISSUER_CONFIG_ERROR,
ISS_MUST_BE_CLIENT_ID: () => ISS_MUST_BE_CLIENT_ID,
ISS_PRESENT_IN_PRE_AUTHORIZED_CODE_CONTEXT: () => ISS_PRESENT_IN_PRE_AUTHORIZED_CODE_CONTEXT,
IssueStatus: () => IssueStatus,
JWS_NOT_VALID: () => JWS_NOT_VALID,
JWT_SIGNER_CALLBACK_REQUIRED_ERROR: () => JWT_SIGNER_CALLBACK_REQUIRED_ERROR,
JWT_VERIFY_CONFIG_ERROR: () => JWT_VERIFY_CONFIG_ERROR,
JsonURIMode: () => JsonURIMode,
KID_DID_NO_DID_ERROR: () => KID_DID_NO_DID_ERROR,
KID_JWK_X5C_ERROR: () => KID_JWK_X5C_ERROR,
NONCE_ERROR: () => NONCE_ERROR,
NONCE_LENGTH: () => NONCE_LENGTH,
NONCE_STATE_MANAGER_REQUIRED_ERROR: () => NONCE_STATE_MANAGER_REQUIRED_ERROR,
NO_ISS_IN_AUTHORIZATION_CODE_CONTEXT: () => NO_ISS_IN_AUTHORIZATION_CODE_CONTEXT,
NO_JWT_PROVIDED: () => NO_JWT_PROVIDED,
NotificationStatusEventNames: () => NotificationStatusEventNames,
OpenId4VCIVersion: () => OpenId4VCIVersion,
PARMode: () => PARMode,
PIN_NOT_MATCH_ERROR: () => PIN_NOT_MATCH_ERROR,
PIN_VALIDATION_ERROR: () => PIN_VALIDATION_ERROR,
PRE_AUTHORIZED_CODE_REQUIRED_ERROR: () => PRE_AUTHORIZED_CODE_REQUIRED_ERROR,
PRE_AUTH_CODE_LITERAL: () => PRE_AUTH_CODE_LITERAL,
PRE_AUTH_GRANT_LITERAL: () => PRE_AUTH_GRANT_LITERAL,
PROOF_CANT_BE_CONSTRUCTED: () => PROOF_CANT_BE_CONSTRUCTED,
ResponseType: () => ResponseType,
STATE_MANAGER_REQUIRED_ERROR: () => STATE_MANAGER_REQUIRED_ERROR,
STATE_MISSING_ERROR: () => STATE_MISSING_ERROR,
TYP_ERROR: () => TYP_ERROR,
TokenError: () => TokenError,
TokenErrorResponse: () => TokenErrorResponse,
UNKNOWN_CLIENT_ERROR: () => UNKNOWN_CLIENT_ERROR,
UNSUPPORTED_GRANT_TYPE_ERROR: () => UNSUPPORTED_GRANT_TYPE_ERROR,
URL_NOT_VALID: () => URL_NOT_VALID,
USER_PIN_NOT_REQUIRED_ERROR: () => USER_PIN_NOT_REQUIRED_ERROR,
USER_PIN_REQUIRED_ERROR: () => USER_PIN_REQUIRED_ERROR,
USER_PIN_TX_CODE_SPEC_ERROR: () => USER_PIN_TX_CODE_SPEC_ERROR,
VCI_LOGGERS: () => VCI_LOGGERS,
VCI_LOG_COMMON: () => VCI_LOG_COMMON,
WRONG_METADATA_FORMAT: () => WRONG_METADATA_FORMAT,
WellKnownEndpoints: () => WellKnownEndpoints,
acquireDeferredCredential: () => acquireDeferredCredential,
adjustUrl: () => adjustUrl,
assertValidCodeVerifier: () => assertValidCodeVerifier,
assertedUniformCredentialOffer: () => assertedUniformCredentialOffer,
authorizationServerMetadataFieldNames: () => authorizationServerMetadataFieldNames,
convertJsonToURI: () => convertJsonToURI,
convertURIToJsonObject: () => convertURIToJsonObject,
createCodeChallenge: () => createCodeChallenge,
createProofOfPossession: () => createProofOfPossession,
credentialIssuerMetadataFieldNamesV1_0_15: () => credentialIssuerMetadataFieldNamesV1_0_15,
decodeJsonProperties: () => decodeJsonProperties,
determineFlowType: () => determineFlowType,
determineGrantTypes: () => determineGrantTypes,
determineSpecVersionFromOffer: () => determineSpecVersionFromOffer,
determineSpecVersionFromScheme: () => determineSpecVersionFromScheme,
determineSpecVersionFromURI: () => determineSpecVersionFromURI,
determineVersionsFromIssuerMetadata: () => determineVersionsFromIssuerMetadata,
extractBearerToken: () => extractBearerToken,
formPost: () => formPost,
generateCodeVerifier: () => generateCodeVerifier,
generateNonce: () => generateNonce,
generateRandomString: () => generateRandomString,
getClientIdFromCredentialOfferPayload: () => getClientIdFromCredentialOfferPayload,
getCredentialConfigurationIdsFromOfferV1_0_15: () => getCredentialConfigurationIdsFromOfferV1_0_15,
getCredentialOfferPayload: () => getCredentialOfferPayload,
getFormatForVersion: () => getFormatForVersion,
getIssuerDisplays: () => getIssuerDisplays,
getIssuerFromCredentialOfferPayload: () => getIssuerFromCredentialOfferPayload,
getIssuerName: () => getIssuerName,
getJson: () => getJson,
getNumberOrUndefined: () => getNumberOrUndefined,
getScheme: () => getScheme,
getStateFromCredentialOfferPayload: () => getStateFromCredentialOfferPayload,
getSupportedCredential: () => getSupportedCredential,
getSupportedCredentials: () => getSupportedCredentials,
getTypesFromAuthorizationDetails: () => getTypesFromAuthorizationDetails,
getTypesFromCredentialSupported: () => getTypesFromCredentialSupported,
getTypesFromObject: () => getTypesFromObject,
getURIComponentsAsArray: () => getURIComponentsAsArray,
getUniformFormat: () => getUniformFormat,
isCredentialOfferVersion: () => isCredentialOfferVersion,
isDeferredCredentialIssuancePending: () => isDeferredCredentialIssuancePending,
isDeferredCredentialResponse: () => isDeferredCredentialResponse,
isFormat: () => isFormat,
isJWS: () => isJWS,
isNotFormat: () => isNotFormat,
isPreAuthCode: () => isPreAuthCode,
isValidURL: () => isValidURL,
isW3cCredentialSupported: () => isW3cCredentialSupported,
normalizeOfferInput: () => normalizeOfferInput,
post: () => post,
resolveCredentialOfferURI: () => resolveCredentialOfferURI,
supportedOID4VCICredentialFormat: () => supportedOID4VCICredentialFormat,
toAuthorizationResponsePayload: () => toAuthorizationResponsePayload,
toUniformCredentialOfferPayload: () => toUniformCredentialOfferPayload,
toUniformCredentialOfferRequest: () => toUniformCredentialOfferRequest,
trimBoth: () => trimBoth,
trimEnd: () => trimEnd,
trimStart: () => trimStart,
validateJWT: () => validateJWT
});
module.exports = __toCommonJS(index_exports);
init_cjs_shims();
var import_ssi_types5 = require("@sphereon/ssi-types");
// lib/functions/index.ts
init_cjs_shims();
// lib/functions/CredentialRequestUtil.ts
init_cjs_shims();
// lib/functions/CredentialResponseUtil.ts
init_cjs_shims();
// lib/functions/HttpUtils.ts
init_cjs_shims();
var import_ssi_types = require("@sphereon/ssi-types");
var import_cross_fetch = __toESM(require("cross-fetch"), 1);
// lib/types/index.ts
init_cjs_shims();
// lib/types/OpenIDClient.ts
init_cjs_shims();
// lib/types/Authorization.types.ts
init_cjs_shims();
// lib/types/Generic.types.ts
init_cjs_shims();
var supportedOID4VCICredentialFormat = [
"jwt_vc_json",
"jwt_vc_json-ld",
"ldp_vc",
"dc+sd-jwt",
"jwt_vc",
"mso_mdoc"
];
var PRE_AUTH_CODE_LITERAL = "pre-authorized_code";
var PRE_AUTH_GRANT_LITERAL = "urn:ietf:params:oauth:grant-type:pre-authorized_code";
// lib/types/Authorization.types.ts
var AuthorizationChallengeError = /* @__PURE__ */ (function(AuthorizationChallengeError2) {
AuthorizationChallengeError2["invalid_request"] = "invalid_request";
AuthorizationChallengeError2["invalid_client"] = "invalid_client";
AuthorizationChallengeError2["unauthorized_client"] = "unauthorized_client";
AuthorizationChallengeError2["invalid_session"] = "invalid_session";
AuthorizationChallengeError2["invalid_scope"] = "invalid_scope";
AuthorizationChallengeError2["insufficient_authorization"] = "insufficient_authorization";
AuthorizationChallengeError2["redirect_to_web"] = "redirect_to_web";
return AuthorizationChallengeError2;
})({});
var GrantTypes = /* @__PURE__ */ (function(GrantTypes2) {
GrantTypes2["AUTHORIZATION_CODE"] = "authorization_code";
GrantTypes2["PRE_AUTHORIZED_CODE"] = "urn:ietf:params:oauth:grant-type:pre-authorized_code";
GrantTypes2["PASSWORD"] = "password";
return GrantTypes2;
})({});
var Encoding = /* @__PURE__ */ (function(Encoding2) {
Encoding2["FORM_URL_ENCODED"] = "application/x-www-form-urlencoded";
Encoding2["UTF_8"] = "UTF-8";
return Encoding2;
})({});
var ResponseType = /* @__PURE__ */ (function(ResponseType2) {
ResponseType2["AUTH_CODE"] = "code";
return ResponseType2;
})({});
var CodeChallengeMethod = /* @__PURE__ */ (function(CodeChallengeMethod2) {
CodeChallengeMethod2["plain"] = "plain";
CodeChallengeMethod2["S256"] = "S256";
return CodeChallengeMethod2;
})({});
var PARMode = /* @__PURE__ */ (function(PARMode2) {
PARMode2[PARMode2["REQUIRE"] = 0] = "REQUIRE";
PARMode2[PARMode2["AUTO"] = 1] = "AUTO";
PARMode2[PARMode2["NEVER"] = 2] = "NEVER";
return PARMode2;
})({});
var CreateRequestObjectMode = /* @__PURE__ */ (function(CreateRequestObjectMode2) {
CreateRequestObjectMode2[CreateRequestObjectMode2["NONE"] = 0] = "NONE";
CreateRequestObjectMode2[CreateRequestObjectMode2["REQUEST_OBJECT"] = 1] = "REQUEST_OBJECT";
CreateRequestObjectMode2[CreateRequestObjectMode2["REQUEST_URI"] = 2] = "REQUEST_URI";
return CreateRequestObjectMode2;
})({});
var AuthzFlowType = /* @__PURE__ */ (function(AuthzFlowType2) {
AuthzFlowType2["AUTHORIZATION_CODE_FLOW"] = "Authorization Code Flow";
AuthzFlowType2["PRE_AUTHORIZED_CODE_FLOW"] = "Pre-Authorized Code Flow";
return AuthzFlowType2;
})({});
(function(AuthzFlowType2) {
function valueOf(request) {
if (PRE_AUTH_CODE_LITERAL in request) {
return "Pre-Authorized Code Flow";
}
return "Authorization Code Flow";
}
__name(valueOf, "valueOf");
AuthzFlowType2.valueOf = valueOf;
})(AuthzFlowType || (AuthzFlowType = {}));
// lib/types/CredentialIssuance.types.ts
init_cjs_shims();
var JsonURIMode = /* @__PURE__ */ (function(JsonURIMode2) {
JsonURIMode2[JsonURIMode2["JSON_STRINGIFY"] = 0] = "JSON_STRINGIFY";
JsonURIMode2[JsonURIMode2["X_FORM_WWW_URLENCODED"] = 1] = "X_FORM_WWW_URLENCODED";
return JsonURIMode2;
})({});
var Alg = /* @__PURE__ */ (function(Alg2) {
Alg2["EdDSA"] = "EdDSA";
Alg2["ES256"] = "ES256";
Alg2["ES256K"] = "ES256K";
Alg2["PS256"] = "PS256";
Alg2["PS384"] = "PS384";
Alg2["PS512"] = "PS512";
Alg2["RS256"] = "RS256";
Alg2["RS384"] = "RS384";
Alg2["RS512"] = "RS512";
return Alg2;
})({});
// lib/types/v1_0_15.types.ts
init_cjs_shims();
var credentialIssuerMetadataFieldNamesV1_0_15 = [
"credential_issuer",
"credential_configurations_supported",
"credential_endpoint",
"nonce_endpoint",
"deferred_credential_endpoint",
"notification_endpoint",
"credential_response_encryption",
"batch_credential_issuance",
"authorization_servers",
"token_endpoint",
"display",
"credential_supplier_config",
"credential_identifiers_supported",
"signed_metadata",
"authorization_challenge_endpoint"
];
// lib/types/ServerMetadata.ts
init_cjs_shims();
var authorizationServerMetadataFieldNames = [
"issuer",
"authorization_endpoint",
"authorization_challenge_endpoint",
"token_endpoint",
"jwks_uri",
"registration_endpoint",
"scopes_supported",
"response_types_supported",
"response_modes_supported",
"grant_types_supported",
"token_endpoint_auth_methods_supported",
"token_endpoint_auth_signing_alg_values_supported",
"service_documentation",
"ui_locales_supported",
"op_policy_uri",
"op_tos_uri",
"revocation_endpoint",
"revocation_endpoint_auth_methods_supported",
"revocation_endpoint_auth_signing_alg_values_supported",
"introspection_endpoint",
"introspection_endpoint_auth_methods_supported",
"introspection_endpoint_auth_signing_alg_values_supported",
"code_challenge_methods_supported",
"signed_metadata"
];
var WellKnownEndpoints = /* @__PURE__ */ (function(WellKnownEndpoints2) {
WellKnownEndpoints2["OPENID_CONFIGURATION"] = "/.well-known/openid-configuration";
WellKnownEndpoints2["OAUTH_AS"] = "/.well-known/oauth-authorization-server";
WellKnownEndpoints2["OPENID4VCI_ISSUER"] = "/.well-known/openid-credential-issuer";
return WellKnownEndpoints2;
})({});
// lib/types/OpenID4VCIErrors.ts
init_cjs_shims();
var BAD_PARAMS = "Wrong parameters provided";
var URL_NOT_VALID = "Request url is not valid";
var JWS_NOT_VALID = "JWS is not valid";
var PROOF_CANT_BE_CONSTRUCTED = "Proof can't be constructed.";
var NO_JWT_PROVIDED = "No JWT provided";
var TYP_ERROR = 'Typ must be "openid4vci-proof+jwt"';
var ALG_ERROR = `Algorithm is a required field, you are free to use the signing algorithm of your choice or one of the following: ${Object.keys(Alg).join(", ")}`;
var KID_JWK_X5C_ERROR = "Only one must be present: x5c should not present when kid and/or jwk is already present";
var KID_DID_NO_DID_ERROR = "A DID value needs to be returned when kid is present";
var DID_NO_DIDDOC_ERROR = "A DID Document needs to be resolved when a DID is encountered";
var AUD_ERROR = "aud must be the URL of the credential issuer";
var IAT_ERROR = "iat must be the time at which the proof was issued";
var NONCE_ERROR = "nonce must be c_nonce provided by the credential issuer";
var JWT_VERIFY_CONFIG_ERROR = "JWT verify callback not configured correctly.";
var ISSUER_CONFIG_ERROR = "Issuer not configured correctly.";
var UNKNOWN_CLIENT_ERROR = "The client is not known by the issuer";
var NO_ISS_IN_AUTHORIZATION_CODE_CONTEXT = "iss missing in authorization-code context";
var ISS_PRESENT_IN_PRE_AUTHORIZED_CODE_CONTEXT = "iss should be omitted in pre-authorized-code context";
var ISS_MUST_BE_CLIENT_ID = "iss must be the client id";
var GRANTS_MUST_NOT_BE_UNDEFINED = "Grants must not be undefined";
var STATE_MISSING_ERROR = "issuer state or pre-authorized key not found";
var CREDENTIAL_MISSING_ERROR = "Credential must be present in response";
var UNSUPPORTED_GRANT_TYPE_ERROR = "unsupported grant_type";
var PRE_AUTHORIZED_CODE_REQUIRED_ERROR = "pre-authorized_code is required";
var USER_PIN_REQUIRED_ERROR = "User pin is required";
var USER_PIN_TX_CODE_SPEC_ERROR = "user_pin is mixed with tx_code, indicating a spec mismatch";
var USER_PIN_NOT_REQUIRED_ERROR = "User pin is not required";
var PIN_VALIDATION_ERROR = "PIN must consist the following amount of characters:";
var PIN_NOT_MATCH_ERROR = "PIN is invalid";
var INVALID_PRE_AUTHORIZED_CODE = "pre-authorized_code is invalid";
var EXPIRED_PRE_AUTHORIZED_CODE = "pre-authorized_code is expired";
var JWT_SIGNER_CALLBACK_REQUIRED_ERROR = "JWT signer callback function is required";
var STATE_MANAGER_REQUIRED_ERROR = "StateManager instance is required";
var NONCE_STATE_MANAGER_REQUIRED_ERROR = "NonceStateManager instance is required";
var ACCESS_TOKEN_ISSUER_REQUIRED_ERROR = "access token issuer is required";
var WRONG_METADATA_FORMAT = "Wrong metadata format";
// lib/types/OpenID4VCIVersions.types.ts
init_cjs_shims();
var OpenId4VCIVersion = /* @__PURE__ */ (function(OpenId4VCIVersion2) {
OpenId4VCIVersion2[OpenId4VCIVersion2["VER_1_0_15"] = 1015] = "VER_1_0_15";
OpenId4VCIVersion2[OpenId4VCIVersion2["VER_UNKNOWN"] = Number.MAX_VALUE] = "VER_UNKNOWN";
return OpenId4VCIVersion2;
})({});
var DefaultURISchemes = /* @__PURE__ */ (function(DefaultURISchemes2) {
DefaultURISchemes2["INITIATE_ISSUANCE"] = "openid-initiate-issuance";
DefaultURISchemes2["CREDENTIAL_OFFER"] = "openid-credential-offer";
return DefaultURISchemes2;
})({});
// lib/types/StateManager.types.ts
init_cjs_shims();
var IssueStatus = /* @__PURE__ */ (function(IssueStatus2) {
IssueStatus2["OFFER_CREATED"] = "OFFER_CREATED";
IssueStatus2["ACCESS_TOKEN_REQUESTED"] = "ACCESS_TOKEN_REQUESTED";
IssueStatus2["ACCESS_TOKEN_CREATED"] = "ACCESS_TOKEN_CREATED";
IssueStatus2["CREDENTIAL_REQUEST_RECEIVED"] = "CREDENTIAL_REQUEST_RECEIVED";
IssueStatus2["CREDENTIAL_ISSUED"] = "CREDENTIAL_ISSUED";
IssueStatus2["NOTIFICATION_CREDENTIAL_ACCEPTED"] = "NOTIFICATION_CREDENTIAL_ACCEPTED";
IssueStatus2["NOTIFICATION_CREDENTIAL_DELETED"] = "NOTIFICATION_CREDENTIAL_DELETED";
IssueStatus2["NOTIFICATION_CREDENTIAL_FAILURE"] = "NOTIFICATION_CREDENTIAL_FAILURE";
IssueStatus2["ERROR"] = "ERROR";
return IssueStatus2;
})({});
// lib/types/Token.types.ts
init_cjs_shims();
var TokenErrorResponse = /* @__PURE__ */ (function(TokenErrorResponse2) {
TokenErrorResponse2["invalid_request"] = "invalid_request";
TokenErrorResponse2["invalid_grant"] = "invalid_grant";
TokenErrorResponse2["invalid_client"] = "invalid_client";
TokenErrorResponse2["invalid_scope"] = "invalid_scope";
TokenErrorResponse2["invalid_dpop_proof"] = "invalid_dpop_proof";
return TokenErrorResponse2;
})({});
var TokenError = class _TokenError extends Error {
static {
__name(this, "TokenError");
}
_statusCode;
_responseError;
constructor(statusCode, responseError, message) {
super(message);
this._statusCode = statusCode;
this._responseError = responseError;
Object.setPrototypeOf(this, _TokenError.prototype);
}
get statusCode() {
return this._statusCode;
}
get responseError() {
return this._responseError;
}
getDescription() {
return this.message;
}
};
// lib/types/QRCode.types.ts
init_cjs_shims();
// lib/functions/HttpUtils.ts
var logger = import_ssi_types.Loggers.DEFAULT.get("sphereon:openid4vci:http");
var getJson = /* @__PURE__ */ __name(async (URL1, opts) => {
return await openIdFetch(URL1, void 0, {
method: "GET",
...opts
});
}, "getJson");
var formPost = /* @__PURE__ */ __name(async (url, body, opts) => {
return await post(url, body, opts?.contentType ? {
...opts
} : {
contentType: Encoding.FORM_URL_ENCODED,
...opts
});
}, "formPost");
var post = /* @__PURE__ */ __name(async (url, body, opts) => {
return await openIdFetch(url, body, {
method: "POST",
...opts
});
}, "post");
var openIdFetch = /* @__PURE__ */ __name(async (url, body, opts) => {
const headers = opts?.customHeaders ?? {};
if (opts?.bearerToken) {
headers["Authorization"] = `${headers.dpop ? "DPoP" : "Bearer"} ${typeof opts.bearerToken === "function" ? await opts.bearerToken() : opts.bearerToken}`;
}
const method = opts?.method ? opts.method : body ? "POST" : "GET";
const accept = opts?.accept ? opts.accept : "application/json";
headers["Accept"] = accept;
if (headers["Content-Type"]) {
if (opts?.contentType && opts.contentType !== headers["Content-Type"]) {
throw Error(`Mismatch in content-types from custom headers (${headers["Content-Type"]}) and supplied content type option (${opts.contentType})`);
}
} else {
if (opts?.contentType) {
headers["Content-Type"] = opts.contentType;
} else if (method !== "GET") {
headers["Content-Type"] = "application/json";
}
}
const payload = {
method,
headers,
body
};
logger.debug(`START fetching url: ${url}`);
if (body) {
logger.debug(`Body:\r
${typeof body == "string" ? body : JSON.stringify(body)}`);
}
logger.debug(`Headers:\r
${JSON.stringify(payload.headers)}`);
const origResponse = await (0, import_cross_fetch.default)(url, payload);
const isJSONResponse = accept === "application/json" || origResponse.headers.get("Content-Type") === "application/json";
const success = origResponse && origResponse.status >= 200 && origResponse.status < 400;
const responseText = await origResponse.text();
const responseBody = isJSONResponse && responseText.includes("{") ? JSON.parse(responseText) : responseText;
logger.debug(`${success ? "success" : "error"} status: ${origResponse.status}, body:\r
${JSON.stringify(responseBody)}`);
if (!success && opts?.exceptionOnHttpErrorStatus) {
const error = JSON.stringify(responseBody);
throw new Error(error === "{}" ? '{"error": "not found"}' : error);
}
logger.debug(`END fetching url: ${url}`);
return {
origResponse,
successBody: success ? responseBody : void 0,
errorBody: !success ? responseBody : void 0
};
}, "openIdFetch");
var isValidURL = /* @__PURE__ */ __name((url) => {
const urlPattern = new RegExp("^(https?:\\/\\/)((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((localhost))|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+:]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$", "i");
return urlPattern.test(url);
}, "isValidURL");
var trimBoth = /* @__PURE__ */ __name((value, trim) => {
return trimEnd(trimStart(value, trim), trim);
}, "trimBoth");
var trimEnd = /* @__PURE__ */ __name((value, trim) => {
return value.endsWith(trim) ? value.substring(0, value.length - trim.length) : value;
}, "trimEnd");
var trimStart = /* @__PURE__ */ __name((value, trim) => {
return value.startsWith(trim) ? value.substring(trim.length) : value;
}, "trimStart");
var adjustUrl = /* @__PURE__ */ __name((urlOrPath, opts) => {
let url = typeof urlOrPath === "object" ? urlOrPath.toString() : urlOrPath;
if (opts?.append) {
url = trimEnd(url, "/") + "/" + trimStart(opts.append, "/");
}
if (opts?.prepend) {
if (opts.prepend.includes("://")) {
if (!url.startsWith(opts.prepend)) {
url = trimEnd(opts.prepend, "/") + "/" + trimStart(url, "/");
}
} else {
let host = "";
let path = url;
if (url.includes("://")) {
host = new URL(url).host;
path = new URL(url).pathname;
}
if (!path.startsWith(opts.prepend)) {
if (host && host !== "") {
url = trimEnd(host, "/");
}
url += trimEnd(url, "/") + "/" + trimBoth(opts.prepend, "/") + "/" + trimStart(path, "/");
}
}
}
if (opts?.stripSlashStart) {
url = trimStart(url, "/");
}
if (opts?.stripSlashEnd) {
url = trimEnd(url, "/");
}
if (typeof urlOrPath === "string") {
return url;
}
return new URL(url);
}, "adjustUrl");
// lib/functions/CredentialResponseUtil.ts
function isDeferredCredentialResponse(credentialResponse) {
const orig = credentialResponse.successBody;
return credentialResponse.origResponse.status % 200 <= 2 && !!orig && !orig.credentials && (!!orig.acceptance_token || !!orig.transaction_id);
}
__name(isDeferredCredentialResponse, "isDeferredCredentialResponse");
function assertNonFatalError(credentialResponse) {
if (credentialResponse.origResponse.status === 400 && credentialResponse.errorBody?.error) {
if (credentialResponse.errorBody.error === "invalid_transaction_id" || credentialResponse.errorBody.error.includes("acceptance_token")) {
throw Error("Invalid transaction id. Probably the deferred credential request expired");
}
}
}
__name(assertNonFatalError, "assertNonFatalError");
function isDeferredCredentialIssuancePending(credentialResponse) {
if (isDeferredCredentialResponse(credentialResponse)) {
return credentialResponse?.successBody?.transaction_id ?? !!credentialResponse?.successBody?.acceptance_token;
}
if (credentialResponse.origResponse.status === 400 && credentialResponse.errorBody?.error) {
if (credentialResponse.errorBody.error === "issuance_pending") {
return true;
} else if (credentialResponse.errorBody.error_description?.toLowerCase().includes("not available yet")) {
return true;
}
}
return false;
}
__name(isDeferredCredentialIssuancePending, "isDeferredCredentialIssuancePending");
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
__name(sleep, "sleep");
async function acquireDeferredCredential({ bearerToken, transactionId, deferredCredentialEndpoint, deferredCredentialIntervalInMS, deferredCredentialAwait }) {
let credentialResponse = await acquireDeferredCredentialImpl({
bearerToken,
transactionId,
deferredCredentialEndpoint
});
const DEFAULT_SLEEP_IN_MS = 5e3;
while (!credentialResponse.successBody?.credentials && deferredCredentialAwait) {
assertNonFatalError(credentialResponse);
const pending = isDeferredCredentialIssuancePending(credentialResponse);
console.log(`Issuance still pending?: ${pending}`);
if (!pending) {
return Promise.reject(Error(`Issuance isn't pending anymore: ${credentialResponse}`));
}
await sleep(deferredCredentialIntervalInMS ?? DEFAULT_SLEEP_IN_MS);
credentialResponse = await acquireDeferredCredentialImpl({
bearerToken,
transactionId,
deferredCredentialEndpoint
});
}
return credentialResponse;
}
__name(acquireDeferredCredential, "acquireDeferredCredential");
async function acquireDeferredCredentialImpl({ bearerToken, transactionId, deferredCredentialEndpoint }) {
const response = await post(deferredCredentialEndpoint, JSON.stringify(transactionId ? {
transaction_id: transactionId
} : ""), {
bearerToken
});
console.log(JSON.stringify(response, null, 2));
assertNonFatalError(response);
return {
...response,
access_token: bearerToken
};
}
__name(acquireDeferredCredentialImpl, "acquireDeferredCredentialImpl");
// lib/functions/CredentialOfferUtil.ts
init_cjs_shims();
var import_ssi_types2 = require("@sphereon/ssi-types");
var import_jwt_decode = require("jwt-decode");
var import_oid4vc_common = require("@sphereon/oid4vc-common");
var logger2 = import_ssi_types2.Loggers.DEFAULT.get("sphereon:oid4vci:offer");
function determineSpecVersionFromURI(uri) {
let version = determineSpecVersionFromScheme(uri, OpenId4VCIVersion.VER_UNKNOWN) ?? OpenId4VCIVersion.VER_UNKNOWN;
if (version === OpenId4VCIVersion.VER_UNKNOWN) {
version = OpenId4VCIVersion.VER_1_0_15;
}
return version;
}
__name(determineSpecVersionFromURI, "determineSpecVersionFromURI");
function determineSpecVersionFromScheme(credentialOfferURI, openId4VCIVersion) {
const scheme = getScheme(credentialOfferURI);
const url = toUrlWithDummyBase(credentialOfferURI);
const qp = url.searchParams;
if (scheme === DefaultURISchemes.INITIATE_ISSUANCE) {
if (qp.has("credential_offer") || qp.has("credential_offer_uri")) {
return recordVersion(openId4VCIVersion, [
OpenId4VCIVersion.VER_1_0_15
], scheme);
}
return recordVersion(openId4VCIVersion, [
OpenId4VCIVersion.VER_UNKNOWN
], scheme);
}
if (scheme === DefaultURISchemes.CREDENTIAL_OFFER) {
if (qp.has("credential_offer_uri")) {
return recordVersion(openId4VCIVersion, [
OpenId4VCIVersion.VER_1_0_15
], scheme);
}
const rawParam = getParamValueLoose(qp, "credential_offer");
if (rawParam) {
const decoded = tryDecodeOffer(rawParam);
const version = sniffOfferVersion(decoded);
if (version !== OpenId4VCIVersion.VER_UNKNOWN) {
return recordVersion(openId4VCIVersion, [
version
], scheme);
}
}
return recordVersion(openId4VCIVersion, [
OpenId4VCIVersion.VER_UNKNOWN
], scheme);
}
return recordVersion(openId4VCIVersion, [
OpenId4VCIVersion.VER_UNKNOWN
], scheme);
}
__name(determineSpecVersionFromScheme, "determineSpecVersionFromScheme");
function toUrlWithDummyBase(uri) {
const normalized = uri.replace(/^openid-[^?]+:\/\//, "https://dummy/?");
return new URL(normalized);
}
__name(toUrlWithDummyBase, "toUrlWithDummyBase");
function getParamValueLoose(qp, key) {
if (qp.has(key)) return qp.get(key);
if (qp.has(`?${key}`)) return qp.get(`?${key}`);
return null;
}
__name(getParamValueLoose, "getParamValueLoose");
function tryDecodeOffer(input) {
let candidate = input;
try {
candidate = decodeURIComponent(candidate);
} catch {
}
if (!/[{}]/.test(candidate) && /^[A-Za-z0-9\-_]+$/.test(candidate)) {
try {
const b64 = candidate.replace(/-/g, "+").replace(/_/g, "/").padEnd(Math.ceil(candidate.length / 4) * 4, "=");
candidate = atob(b64);
} catch {
}
}
return candidate;
}
__name(tryDecodeOffer, "tryDecodeOffer");
function sniffOfferVersion(jsonLike) {
if (!jsonLike) return OpenId4VCIVersion.VER_UNKNOWN;
return OpenId4VCIVersion.VER_UNKNOWN;
}
__name(sniffOfferVersion, "sniffOfferVersion");
function getScheme(credentialOfferURI) {
if (!credentialOfferURI || !credentialOfferURI.includes("://")) {
throw Error("Invalid credential offer URI");
}
return credentialOfferURI.split("://")[0];
}
__name(getScheme, "getScheme");
function getIssuerFromCredentialOfferPayload(request) {
if (!request || !("issuer" in request) && !("credential_issuer" in request)) {
return void 0;
}
return "issuer" in request ? request.issuer : request["credential_issuer"];
}
__name(getIssuerFromCredentialOfferPayload, "getIssuerFromCredentialOfferPayload");
var getClientIdFromCredentialOfferPayload = /* @__PURE__ */ __name((credentialOffer) => {
if (!credentialOffer) {
return;
}
if ("client_id" in credentialOffer) {
return credentialOffer.client_id;
}
const state = getStateFromCredentialOfferPayload(credentialOffer);
if (state && isJWT(state)) {
const decoded = (0, import_jwt_decode.jwtDecode)(state, {
header: false
});
if ("client_id" in decoded && typeof decoded.client_id === "string") {
return decoded.client_id;
}
}
return;
}, "getClientIdFromCredentialOfferPayload");
var isJWT = /* @__PURE__ */ __name((input) => {
if (!input) {
return false;
}
const noParts = input?.split(".").length;
return input?.startsWith("ey") && noParts === 3;
}, "isJWT");
var getStateFromCredentialOfferPayload = /* @__PURE__ */ __name((credentialOffer) => {
if ("grants" in credentialOffer) {
if (credentialOffer.grants?.authorization_code) {
return credentialOffer.grants.authorization_code.issuer_state;
} else if (credentialOffer.grants?.[PRE_AUTH_GRANT_LITERAL]) {
return credentialOffer.grants?.[PRE_AUTH_GRANT_LITERAL]?.[PRE_AUTH_CODE_LITERAL];
}
}
if ("op_state" in credentialOffer) {
return credentialOffer.op_state;
} else if (PRE_AUTH_CODE_LITERAL in credentialOffer) {
return credentialOffer[PRE_AUTH_CODE_LITERAL];
}
return;
}, "getStateFromCredentialOfferPayload");
function determineSpecVersionFromOffer(offer) {
if (isCredentialOfferV1_0_15(offer)) {
return OpenId4VCIVersion.VER_1_0_15;
}
return OpenId4VCIVersion.VER_UNKNOWN;
}
__name(determineSpecVersionFromOffer, "determineSpecVersionFromOffer");
function isCredentialOfferVersion(offer, min, max) {
if (max && max.valueOf() < min.valueOf()) {
throw Error(`Cannot have a max ${max.valueOf()} version smaller than the min version ${min.valueOf()}`);
}
const version = determineSpecVersionFromOffer(offer);
if (version.valueOf() < min.valueOf()) {
logger2.debug(`Credential offer version (${version.valueOf()}) is lower than minimum required version (${min.valueOf()})`);
return false;
} else if (max && version.valueOf() > max.valueOf()) {
logger2.debug(`Credential offer version (${version.valueOf()}) is higher than maximum required version (${max.valueOf()})`);
return false;
}
return true;
}
__name(isCredentialOfferVersion, "isCredentialOfferVersion");
function isCredentialOfferV1_0_15(offer) {
if (!offer) {
return false;
}
offer = normalizeOfferInput(offer);
if ("credential_issuer" in offer && "credential_configuration_ids" in offer) {
return Array.isArray(offer.credential_configuration_ids);
}
if ("credential_offer" in offer && offer["credential_offer"]) {
return isCredentialOfferV1_0_15(offer["credential_offer"]);
}
return "credential_offer_uri" in offer;
}
__name(isCredentialOfferV1_0_15, "isCredentialOfferV1_0_15");
async function toUniformCredentialOfferRequest(offer, opts) {
let version = opts?.version ?? determineSpecVersionFromOffer(offer);
let originalCredentialOffer = offer.credential_offer;
let credentialOfferURI;
if ("credential_offer_uri" in offer && offer?.credential_offer_uri !== void 0) {
credentialOfferURI = offer.credential_offer_uri;
if (opts?.resolve || opts?.resolve === void 0) {
VCI_LOG_COMMON.log(`Credential offer contained a URI. Will use that to get the credential offer payload: ${credentialOfferURI}`);
originalCredentialOffer = await resolveCredentialOfferURI(credentialOfferURI);
} else if (!originalCredentialOffer) {
throw Error(`Credential offer uri (${credentialOfferURI}) found, but resolution was explicitly disabled and credential_offer was supplied`);
}
version = determineSpecVersionFromOffer(originalCredentialOffer);
VCI_LOG_COMMON.log(`Offer URI payload determined to be of version ${version}`);
}
if (!originalCredentialOffer) {
throw Error("No credential offer available");
}
const payload = toUniformCredentialOfferPayload(originalCredentialOffer, {
...opts,
version
});
const supportedFlows = determineFlowType(payload, version);
return {
credential_offer: payload,
original_credential_offer: originalCredentialOffer,
...credentialOfferURI && {
credential_offer_uri: credentialOfferURI
},
supportedFlows,
version
};
}
__name(toUniformCredentialOfferRequest, "toUniformCredentialOfferRequest");
function isPreAuthCode(request) {
request = normalizeOfferInput(request);
const payload = "credential_offer" in request ? request.credential_offer : request;
return payload?.grants?.[PRE_AUTH_GRANT_LITERAL]?.[PRE_AUTH_CODE_LITERAL] !== void 0;
}
__name(isPreAuthCode, "isPreAuthCode");
async function assertedUniformCredentialOffer(origCredentialOffer, opts) {
const credentialOffer = JSON.parse(JSON.stringify(origCredentialOffer));
if (credentialOffer.credential_offer_uri && !credentialOffer.credential_offer) {
if (opts?.resolve === void 0 || opts.resolve) {
credentialOffer.credential_offer = await resolveCredentialOfferURI(credentialOffer.credential_offer_uri);
} else {
throw Error(`No credential_offer present, but we did get a URI, but resolution was explicitly disabled`);
}
}
if (!credentialOffer.credential_offer) {
throw Error(`No credential_offer present`);
}
credentialOffer.credential_offer = await toUniformCredentialOfferPayload(credentialOffer.credential_offer, {
version: credentialOffer.version
});
return credentialOffer;
}
__name(assertedUniformCredentialOffer, "assertedUniformCredentialOffer");
async function resolveCredentialOfferURI(uri) {
if (!uri) {
return void 0;
}
const response = await getJson(uri);
if (!response || !response.successBody) {
throw Error(`Could not get credential offer from uri: ${uri}: ${JSON.stringify(response?.errorBody)}`);
}
return response.successBody;
}
__name(resolveCredentialOfferURI, "resolveCredentialOfferURI");
function toUniformCredentialOfferPayload(rawOffer, opts) {
const offer = normalizeOfferInput(rawOffer);
const version = opts?.version ?? determineSpecVersionFromOffer(offer);
if (version >= OpenId4VCIVersion.VER_1_0_15) {
const orig = offer;
return {
...orig
};
}
throw Error(`Could not create uniform payload for version ${version}`);
}
__name(toUniformCredentialOfferPayload, "toUniformCredentialOfferPayload");
function determineFlowType(suppliedOffer, version) {
const payload = getCredentialOfferPayload(suppliedOffer);
const supportedFlows = [];
if (payload.grants?.authorization_code) {
supportedFlows.push(AuthzFlowType.AUTHORIZATION_CODE_FLOW);
}
if (payload.grants?.[PRE_AUTH_GRANT_LITERAL]?.[PRE_AUTH_CODE_LITERAL]) {
supportedFlows.push(AuthzFlowType.PRE_AUTHORIZED_CODE_FLOW);
}
return supportedFlows;
}
__name(determineFlowType, "determineFlowType");
function getCredentialOfferPayload(offer) {
offer = normalizeOfferInput(offer);
let payload;
if ("credential_offer" in offer && offer["credential_offer"]) {
payload = offer.credential_offer;
} else {
payload = offer;
}
return payload;
}
__name(getCredentialOfferPayload, "getCredentialOfferPayload");
function determineGrantTypes(offer) {
offer = normalizeOfferInput(offer);
let grants;
if ("grants" in offer && offer.grants) {
grants = offer.grants;
} else {
grants = getCredentialOfferPayload(offer).grants;
}
const types = [];
if (grants) {
if ("authorization_code" in grants) {
types.push(GrantTypes.AUTHORIZATION_CODE);
}
if (PRE_AUTH_GRANT_LITERAL in grants) {
types.push(GrantTypes.PRE_AUTHORIZED_CODE);
}
}
return types;
}
__name(determineGrantTypes, "determineGrantTypes");
function recordVersion(currentVersion, matchingVersion, key, allowUpgrade = true) {
matchingVersion = matchingVersion.sort().reverse();
if (currentVersion === OpenId4VCIVersion.VER_UNKNOWN) {
return matchingVersion[0];
} else if (matchingVersion.includes(currentVersion)) {
if (!allowUpgrade) {
return currentVersion;
}
return matchingVersion[0];
}
throw new Error(`Invalid param. Some keys have been used from version: ${currentVersion} version while '${key}' is used from version: ${JSON.stringify(matchingVersion)}`);
}
__name(recordVersion, "recordVersion");
function getCredentialConfigurationIdsFromOfferV1_0_15(offer) {
return offer.credential_configuration_ids ?? [];
}
__name(getCredentialConfigurationIdsFromOfferV1_0_15, "getCredentialConfigurationIdsFromOfferV1_0_15");
function normalizeOfferInput(input) {
if (typeof input !== "string") {
return input;
}
if (import_ssi_types2.ObjectUtils.isString(input) && input.startsWith("ey")) {
const payload = (0, import_oid4vc_common.base64urlToString)(input);
return JSON.parse(payload);
}
try {
return JSON.parse(input);
} catch {
}
return input;
}
__name(normalizeOfferInput, "normalizeOfferInput");
// lib/functions/Encoding.ts
init_cjs_shims();
function convertJsonToURI(json, opts) {
if (typeof json === "string") {
return convertJsonToURI(JSON.parse(json), opts);
}
const results = [];
function encodeAndStripWhitespace(key) {
return encodeURIComponent(key.replace(" ", ""));
}
__name(encodeAndStripWhitespace, "encodeAndStripWhitespace");
let components;
if (opts?.mode === JsonURIMode.JSON_STRINGIFY) {
components = encodeAndStripWhitespace(JSON.stringify(json));
} else {
for (const [key, value] of Object.entries(json)) {
if (!value) {
continue;
}
if (!opts?.uriTypeProperties?.includes(key)) {
results.push(`${key}=${value}`);
continue;
}
if (opts?.arrayTypeProperties?.includes(key) && Array.isArray(value)) {
results.push(value.map((v) => `${encodeAndStripWhitespace(key)}=${customEncodeURIComponent(v, /\./g)}`).join("&"));
continue;
}
const isBool = typeof value == "boolean";
const isNumber = typeof value == "number";
const isString = typeof value == "string";
let encoded;
if (isBool || isNumber) {
encoded = `${encodeAndStripWhitespace(key)}=${value}`;
} else if (isString) {
encoded = `${encodeAndStripWhitespace(key)}=${customEncodeURIComponent(value, /\./g)}`;
} else {
encoded = `${encodeAndStripWhitespace(key)}=${customEncodeURIComponent(JSON.stringify(value), /\./g)}`;
}
results.push(encoded);
}
components = results.join("&");
}
if (opts?.baseUrl) {
if (opts.baseUrl.endsWith("=")) {
if (opts.param) {
throw Error("Cannot combine param with an url ending in =");
}
return `${opts.baseUrl}${components}`;
} else if (!opts.baseUrl.includes("?")) {
return `${opts.baseUrl}?${opts.param ? opts.param + "=" : ""}${components}`;
} else if (opts.baseUrl.endsWith("?")) {
return `${opts.baseUrl}${opts.param ? opts.param + "=" : ""}${components}`;
} else {
return `${opts.baseUrl}${opts.param ? "&" + opts.param : ""}=${components}`;
}
}
return components;
}
__name(convertJsonToURI, "convertJsonToURI");
function convertURIToJsonObject(uri, opts) {
if (!uri || opts?.requiredProperties && !opts.requiredProperties?.every((p) => uri.includes(p))) {
throw new Error(BAD_PARAMS);
}
const uriComponents = getURIComponentsAsArray(uri, opts?.arrayTypeProperties);
return decodeJsonProperties(uriComponents);
}
__name(convertURIToJsonObject, "convertURIToJsonObject");
function decodeJsonProperties(parts) {
const result = {};
for (const key in parts) {
const value = parts[key];
if (!value) {
continue;
}
if (Array.isArray(value)) {
result[decodeURIComponent(key)] = value.map((v) => decodeURIComponent(v));
continue;
}
const isBool = typeof value == "boolean";
const isNumber = typeof value == "number";
const isString = typeof value == "string";
const isObject = typeof value == "object";
if (isBool || isNumber) {
result[decodeURIComponent(key)] = value;
} else if (isString) {
const decoded = decodeURIComponent(value);
if (decoded.startsWith("{") && decoded.endsWith("}")) {
result[decodeURIComponent(key)] = JSON.parse(decoded);
} else {
result[decodeURIComponent(key)] = decoded;
}
} else if (isObject) {
result[decodeURIComponent(key)] = decodeJsonProperties(value);
}
}
return result;
}
__name(decodeJsonProperties, "decodeJsonProperties");
function getURIComponentsAsArray(uri, arrayTypes) {
const parts = uri.includes("?") ? uri.split("?")[1] : uri.includes("://") ? uri.split("://")[1] : uri;
const json = [];
const dict = parts.split("&");
for (const entry of dict) {
const pair = entry.split("=");
const p0 = pair[0];
const p1 = pair[1];
if (arrayTypes?.includes(p0)) {
const key = json[p0];
if (Array.isArray(key)) {
key.push(p1);
} else {
json[p0] = [
p1
];
}
continue;
}
json[p0] = p1;
}
return json;
}
__name(getURIComponentsAsArray, "getURIComponentsAsArray");
function customEncodeURIComponent(uriComponent, searchValue) {
return encodeURIComponent(uriComponent).replace(searchValue, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
}
__name(customEncodeURIComponent, "customEncodeURIComponent");
// lib/functions/TypeConversionUtils.ts
init_cjs_shims();
function isW3cCredentialSupported(supported) {
return [
"jwt_vc_json",
"jwt_vc_json-ld",
"ldp_vc",
"jwt_vc"
].includes(supported.format);
}
__name(isW3cCredentialSupported, "isW3cCredentialSupported");
var getNumberOrUndefined = /* @__PURE__ */ __name((input) => {
return input && !isNaN(+input) ? +input : void 0;
}, "getNumberOrUndefined");
function getTypesFromObject(subject) {
if (subject === void 0) {
return void 0;
} else if (typeof subject === "string") {
return [
subject
];
} else if ("credential_definition" in subject) {
return getTypesFromObject(subject.credential_definition);
} else if ("types" in subject && subject.types) {
return Array.isArray(subject.types) ? subject.types : [
subject.types
];
} else if ("type" in subject && subject.type) {
return Array.isArray(subject.type) ? subject.type : [
subject.type
];
} else if ("vct" in subject && subject.vct) {
return [
subject.vct
];
} else if ("doctype" in subject && subject.doctype) {
return [
subject.doctype
];
}
VCI_LOG_COMMON.warning("Could not deduce credential types. Probably a failure down the line will happen!");
return void 0;
}
__name(getTypesFromObject, "getTypesFromObject");
function getTypesFromAuthorizationDetails(authDetails, opts) {
const { configIdAsType = false } = {
...opts
};
if (typeof authDetails === "string") {
return [
authDetails
];
} else if ("types" in authDetails && Array.isArray(authDetails.types)) {
return authDetails.types;
} else if (configIdAsType && authDetails.credential_configuration_id) {
return [
authDetails.credential_configuration_id
];
}
return void 0;
}
__name(getTypesFromAuthorizationDetails, "getTypesFromAuthorizationDetails");
function getTypesFromCredentialSupported(credentialSupported, opts) {
let types = [];
if (credentialSupported.format === "jwt_vc_json" || credentialSupported.format === "jwt_vc" || credentialSupported.format === "jwt_vc_json-ld" || credentialSupported.format === "ldp_vc") {
types = getTypesFromObject(credentialSupported) ?? [];
} else if (credentialSupported.format === "dc+sd-jwt" || credentialSupported.format === "vc+sd-jwt") {
types = [
credentialSupported.vct
];
} else if (credentialSupported.format === "mso_mdoc") {
types = [
credentialSupported.doctype
];
}
if (!types || types.length === 0) {
throw Error("Could not deduce types from credential supported");
}
if (opts?.filterVerifiableCredential) {
return types.filter((type) => type !== "VerifiableCredential");
}
return types;
}
__name(getTypesFromCredentialSupported, "getTypesFromCredentialSupported");
// lib/functions/IssuerMetadataUtils.ts
init_cjs_shims();
function getSupportedCredentials(opts) {
const { version = OpenId4VCIVersion.VER_1_0_15, types } = opts ?? {};
if (types && Array.isArray(types)) {
return types.map((typeSet) => {
return getSupportedCredential({
...opts,
version,
types: typeSet
});
}).reduce((acc, result) => {
Object.assign(acc, result);
return acc;
}, {});
}
return getSupportedCredential(opts ? {
...opts,
types: void 0
} : void 0);
}
__name(getSupportedCredentials, "getSupportedCredentials");
function determineVersionsFromIssuerMetadata(issuerMetadata) {
const versions = /* @__PURE__ */ new Set();
if ("credential_configurations_supported" in issuerMetadata) {
versions.add(OpenId4VCIVersion.VER_1_0_15);
}
if (versions.size === 0) {
versions.add(OpenId4VCIVersion.VER_UNKNOWN);
}
return Array.from(versions).sort().reverse();
}
__name(determineVersionsFromIssuerMetadata, "determineVersionsFromIssuerMetadata");
function getSupportedCredential(opts) {
const { issuerMetadata, types, format, version = OpenId4VCIVersion.VER_1_0_15 } = opts ?? {};
let credentialConfigurationsV15 = void 0;
if (issuerMetadata?.credential_configurations_supported && version >= OpenId4VCIVersion.VER_1_0_15) {
credentialConfigurationsV15 = issuerMetadata.credential_configurations_supported;
}
if (!issuerMetadata || !issuerMetadata.credential_configurations_supported && !issuerMetadata.credentials_supported) {
VCI_LOG_COMMON.warning(`No credential issuer metadata or supported credential