UNPKG

@sebak/recaptcha-v3

Version:

![npm](https://img.shields.io/npm/v/recaptcha-v3.svg) ![npm type definitions](https://img.shields.io/npm/types/recaptcha-v3.svg)

103 lines (102 loc) 4.83 kB
"use strict"; 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;