recaptcha-v3
Version:
199 lines (198 loc) • 8.43 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getInstance = exports.load = void 0;
var ReCaptchaInstance_1 = require("./ReCaptchaInstance");
var ELoadingState;
(function (ELoadingState) {
ELoadingState[ELoadingState["NOT_LOADED"] = 0] = "NOT_LOADED";
ELoadingState[ELoadingState["LOADING"] = 1] = "LOADING";
ELoadingState[ELoadingState["LOADED"] = 2] = "LOADED";
})(ELoadingState || (ELoadingState = {}));
var ReCaptchaLoader = (function () {
function ReCaptchaLoader() {
}
ReCaptchaLoader.load = function (siteKey, options) {
if (options === void 0) { options = {}; }
if (typeof document === "undefined") {
return Promise.reject(new Error("This is a library for the browser!"));
}
if (ReCaptchaLoader.getLoadingState() === ELoadingState.LOADED) {
if (ReCaptchaLoader.instance.getSiteKey() === siteKey) {
return Promise.resolve(ReCaptchaLoader.instance);
}
else {
return Promise.reject(new Error("reCAPTCHA already loaded with different site key!"));
}
}
if (ReCaptchaLoader.getLoadingState() === ELoadingState.LOADING) {
if (siteKey !== ReCaptchaLoader.instanceSiteKey) {
return Promise.reject(new Error("reCAPTCHA already loaded with different site key!"));
}
return new Promise(function (resolve, reject) {
ReCaptchaLoader.successfulLoadingConsumers.push(function (instance) { return resolve(instance); });
ReCaptchaLoader.errorLoadingRunnable.push(function (reason) {
return reject(reason);
});
});
}
ReCaptchaLoader.instanceSiteKey = siteKey;
ReCaptchaLoader.setLoadingState(ELoadingState.LOADING);
var loader = new ReCaptchaLoader();
return new Promise(function (resolve, reject) {
loader
.loadScript(siteKey, options.useRecaptchaNet || false, options.useEnterprise || false, options.renderParameters ? options.renderParameters : {}, options.customUrl)
.then(function () {
ReCaptchaLoader.setLoadingState(ELoadingState.LOADED);
var widgetID = loader.doExplicitRender(grecaptcha, siteKey, options.explicitRenderParameters
? options.explicitRenderParameters
: {}, options.useEnterprise || false);
var instance = new ReCaptchaInstance_1.ReCaptchaInstance(siteKey, widgetID, grecaptcha);
ReCaptchaLoader.successfulLoadingConsumers.forEach(function (v) {
return v(instance);
});
ReCaptchaLoader.successfulLoadingConsumers = [];
if (options.autoHideBadge) {
instance.hideBadge();
}
ReCaptchaLoader.instance = instance;
resolve(instance);
})
.catch(function (error) {
ReCaptchaLoader.errorLoadingRunnable.forEach(function (v) { return v(error); });
ReCaptchaLoader.errorLoadingRunnable = [];
reject(error);
});
});
};
ReCaptchaLoader.getInstance = function () {
return ReCaptchaLoader.instance;
};
ReCaptchaLoader.setLoadingState = function (state) {
ReCaptchaLoader.loadingState = state;
};
ReCaptchaLoader.getLoadingState = function () {
if (ReCaptchaLoader.loadingState === null) {
return ELoadingState.NOT_LOADED;
}
else {
return ReCaptchaLoader.loadingState;
}
};
ReCaptchaLoader.prototype.loadScript = function (siteKey, useRecaptchaNet, useEnterprise, renderParameters, customUrl) {
var _this = this;
if (useRecaptchaNet === void 0) { useRecaptchaNet = false; }
if (useEnterprise === void 0) { useEnterprise = false; }
if (renderParameters === void 0) { renderParameters = {}; }
if (customUrl === void 0) { customUrl = ""; }
var scriptElement = document.createElement("script");
scriptElement.setAttribute("recaptcha-v3-script", "");
scriptElement.setAttribute("async", "");
scriptElement.setAttribute("defer", "");
var scriptBase = "https://www.google.com/recaptcha/api.js";
if (useRecaptchaNet) {
if (useEnterprise) {
scriptBase = "https://recaptcha.net/recaptcha/enterprise.js";
}
else {
scriptBase = "https://recaptcha.net/recaptcha/api.js";
}
}
else if (useEnterprise) {
scriptBase = "https://www.google.com/recaptcha/enterprise.js";
}
if (customUrl) {
scriptBase = customUrl;
}
if (renderParameters.render) {
renderParameters.render = undefined;
}
var parametersQuery = this.buildQueryString(renderParameters);
scriptElement.src = scriptBase + "?render=explicit" + parametersQuery;
return new Promise(function (resolve, reject) {
scriptElement.addEventListener("load", _this.waitForScriptToLoad(function () {
resolve(scriptElement);
}, useEnterprise), false);
scriptElement.onerror = function (error) {
ReCaptchaLoader.setLoadingState(ELoadingState.NOT_LOADED);
reject(error);
};
document.head.appendChild(scriptElement);
});
};
ReCaptchaLoader.prototype.buildQueryString = function (parameters) {
var parameterKeys = Object.keys(parameters);
if (parameterKeys.length < 1) {
return "";
}
return ("&" +
Object.keys(parameters)
.filter(function (parameterKey) {
return !!parameters[parameterKey];
})
.map(function (parameterKey) {
return parameterKey + "=" + parameters[parameterKey];
})
.join("&"));
};
ReCaptchaLoader.prototype.waitForScriptToLoad = function (callback, useEnterprise) {
var _this = this;
return function () {
if (window.grecaptcha === undefined) {
setTimeout(function () {
_this.waitForScriptToLoad(callback, useEnterprise);
}, ReCaptchaLoader.SCRIPT_LOAD_DELAY);
}
else {
if (useEnterprise) {
window.grecaptcha.enterprise.ready(function () {
callback();
});
}
else {
window.grecaptcha.ready(function () {
callback();
});
}
}
};
};
ReCaptchaLoader.prototype.doExplicitRender = function (grecaptcha, siteKey, parameters, isEnterprise) {
var augmentedParameters = __assign({ sitekey: siteKey }, parameters);
if (parameters.container) {
if (isEnterprise) {
return grecaptcha.enterprise.render(parameters.container, augmentedParameters);
}
else {
return grecaptcha.render(parameters.container, augmentedParameters);
}
}
else {
if (isEnterprise) {
return grecaptcha.enterprise.render(augmentedParameters);
}
else {
return grecaptcha.render(augmentedParameters);
}
}
};
ReCaptchaLoader.loadingState = null;
ReCaptchaLoader.instance = null;
ReCaptchaLoader.instanceSiteKey = null;
ReCaptchaLoader.successfulLoadingConsumers = [];
ReCaptchaLoader.errorLoadingRunnable = [];
ReCaptchaLoader.SCRIPT_LOAD_DELAY = 25;
return ReCaptchaLoader;
}());
exports.load = ReCaptchaLoader.load;
exports.getInstance = ReCaptchaLoader.getInstance;