UNPKG

recaptcha-v3-enterprise

Version:

A simple and easy to use reCAPTCHA Enterprise (v3 only) library for the browser.

154 lines (153 loc) 6.84 kB
"use strict"; 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.renderParameters ? options.renderParameters : {}, options.customUrl).then(function () { ReCaptchaLoader.setLoadingState(ELoadingState.LOADED); var widgetID = loader.doExplicitRender(grecaptcha, siteKey, options.explicitRenderParameters ? options.explicitRenderParameters : {}); 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, renderParameters, customUrl) { var _this = this; if (useRecaptchaNet === void 0) { useRecaptchaNet = false; } if (renderParameters === void 0) { renderParameters = {}; } if (customUrl === void 0) { customUrl = ''; } var scriptElement = document.createElement('script'); scriptElement.setAttribute('recaptcha-v3-enterprise-script', ''); var scriptBase = 'https://www.google.com/recaptcha/enterprise.js'; if (useRecaptchaNet) { scriptBase = 'https://recaptcha.net/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); }), 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) { var _this = this; return function () { if (window.grecaptcha === undefined) { setTimeout(function () { _this.waitForScriptToLoad(callback); }, ReCaptchaLoader.SCRIPT_LOAD_DELAY); } else { window.grecaptcha.enterprise.ready(function () { callback(); }); } }; }; ReCaptchaLoader.prototype.doExplicitRender = function (grecaptcha, siteKey, parameters) { var augmentedParameters = { sitekey: siteKey, badge: parameters.badge, size: parameters.size, tabindex: parameters.tabindex }; if (parameters.container) { return grecaptcha.enterprise.render(parameters.container, augmentedParameters); } else { return grecaptcha.enterprise.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;