@sebak/recaptcha-v3
Version:
 
103 lines (102 loc) • 4.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var ReCaptchaInstance_1 = require("./ReCaptchaInstance");
var ReCaptchaLoader = (function () {
function ReCaptchaLoader() {
}
ReCaptchaLoader.load = function (siteKey, options) {
if (options === void 0) { options = {}; }
if (typeof document === 'undefined')
throw new Error('This is a library for the browser!');
if (ReCaptchaLoader.getLoadingState() === ELoadingState.LOADED)
return Promise.resolve(new ReCaptchaInstance_1.ReCaptchaInstance(siteKey, grecaptcha));
if (ReCaptchaLoader.getLoadingState() === ELoadingState.LOADING)
return new Promise(function (resolve, reject) {
ReCaptchaLoader.successfulLoadingConsumers.push(function (instance) { return resolve(instance); });
ReCaptchaLoader.errorLoadingRunnable.push(function (reason) { return reject(); });
});
ReCaptchaLoader.setLoadingState(ELoadingState.LOADING);
var loader = new ReCaptchaLoader();
return new Promise(function (resolve, reject) {
loader.loadScript(siteKey, options.useRecaptchaNet || false).then(function () {
ReCaptchaLoader.setLoadingState(ELoadingState.LOADED);
var instance = new ReCaptchaInstance_1.ReCaptchaInstance(siteKey, grecaptcha);
ReCaptchaLoader.successfulLoadingConsumers.forEach(function (v) { return v(instance); });
ReCaptchaLoader.successfulLoadingConsumers = [];
if (options.autoHideBadge || false)
instance.hideBadge();
resolve(instance);
}).catch(function (error) {
ReCaptchaLoader.errorLoadingRunnable.forEach(function (v) { return v(error); });
ReCaptchaLoader.errorLoadingRunnable = [];
reject(error);
});
});
};
ReCaptchaLoader.setLoadingState = function (state) {
document.documentElement.setAttribute(ReCaptchaLoader.stateAttributeName, state);
};
ReCaptchaLoader.getLoadingState = function () {
var element = document.documentElement;
if (element.hasAttribute(ReCaptchaLoader.stateAttributeName)) {
var val = parseInt(element.getAttribute(ReCaptchaLoader.stateAttributeName), 10);
if (isNaN(val))
return ELoadingState.NOT_LOADED;
return val;
}
else
return ELoadingState.NOT_LOADED;
};
ReCaptchaLoader.hasReCaptchaScript = function () {
var scripts = document.head.getElementsByTagName('script');
for (var i = 0; i < scripts.length; i++) {
var script = scripts[i];
if (script.hasAttribute('recaptcha-v3-script'))
return true;
}
return false;
};
ReCaptchaLoader.prototype.loadScript = function (siteKey, useRecaptchaNet) {
var _this = this;
if (useRecaptchaNet === void 0) { useRecaptchaNet = false; }
var scriptElement = document.createElement('script');
scriptElement.setAttribute('recaptcha-v3-script', '');
var scriptBase = 'https://www.google.com/recaptcha/api.js';
if (useRecaptchaNet)
scriptBase = 'https://recaptcha.net/recaptcha/api.js';
scriptElement.src = scriptBase + '?render=' + siteKey;
return new Promise(function (resolve, reject) {
scriptElement.addEventListener('load', _this.waitForScriptToLoad(function () {
resolve(scriptElement);
}), false);
scriptElement.onerror = function (error) {
reject(new Error('Something went wrong while loading ReCaptcha. (' + error.toString() + ')'));
};
document.head.appendChild(scriptElement);
});
};
ReCaptchaLoader.prototype.waitForScriptToLoad = function (callback) {
var _this = this;
return function () {
if (window.grecaptcha === undefined)
setTimeout(function () {
_this.waitForScriptToLoad(callback);
}, 100);
else
window.grecaptcha.ready(function () {
callback();
});
};
};
ReCaptchaLoader.stateAttributeName = 'recaptcha-v3-state';
ReCaptchaLoader.successfulLoadingConsumers = [];
ReCaptchaLoader.errorLoadingRunnable = [];
return ReCaptchaLoader;
}());
var ELoadingState;
(function (ELoadingState) {
ELoadingState[ELoadingState["NOT_LOADED"] = 0] = "NOT_LOADED";
ELoadingState[ELoadingState["LOADING"] = 1] = "LOADING";
ELoadingState[ELoadingState["LOADED"] = 2] = "LOADED";
})(ELoadingState || (ELoadingState = {}));
exports.load = ReCaptchaLoader.load;