@foxford/services 1.2.1 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  ### Captcha Service
7
7
 
8
8
  Сервис для работы с капчей.
9
- В зависимости от данных с бэке используется или Google-капча, или Cloudflare Turnstile
9
+ В зависимости от данных с бэка используется или Google-капча, или Cloudflare Turnstile
10
10
 
11
11
  ## Recaptcha Service
12
12
 
@@ -23,7 +23,7 @@ const FoxfordService = new Foxford({
23
23
  recaptchaConfig: {
24
24
  locale: 'ru',
25
25
  sitekey: 'captchaSecretKey',
26
- }
26
+ },
27
27
  })
28
28
 
29
29
  const RecaptchaService: RecaptchaServiceInterface = FoxfordService.recaptcha
@@ -54,15 +54,17 @@ async function submitHandler() {
54
54
  ## API Service
55
55
 
56
56
  ### Для чего?
57
+
57
58
  Чтобы разные проекты использовали единый HTTP-клиент (Axios) сервис апи был вынесен в пакеты
58
59
  и опубликован в [npm](https://www.npmjs.com/package/@foxford/services)
59
60
 
60
61
  Апи из пакета сервисов представляет собой фабрику, которая принимает параметры и возвращает
61
62
  инстанс клиента, подробнее описано [здесь](./api/README.md)
62
63
 
63
- ___
64
+ ---
64
65
 
65
66
  ### Как обесепечивается единобразное использование HTTP-клиента?
67
+
66
68
  > Точкой правды, поставщиком HTTP-клиента является `@foxford/foxford-js-sdk (FoxfordService)`
67
69
  > Все "потребители" должны использовать HTTP-клиент из `FoxfordService`
68
70
 
@@ -71,18 +73,21 @@ ___
71
73
  и отдает наружу два клиента:
72
74
 
73
75
  1. `FoxfordService.foxApi` - инстанс Api, ориентированный на использование внутренних сервисов Фоксфорда, в нем:
74
- - Используются `Api Interceptors`
75
- По умолчанию используются два обязательных перехватчика(`camelize` и `referrer`) и один опциональный(`captcha`) в `interceptors.request`, это:
76
- - `camelize` - для преобразования кейса в ответе запроса
77
- - `referrer` - для проброса реферрера в запросе
78
- - `captcha` - опциональный, будет добавлен, если при инициализации `FoxfordService`,
79
- в конфиге будет передан конфиг для капчи. Подробнее [здесь](./api/README.md)
80
- - Используется `axiosRetry` - плагин Api, перехватывающий упавшие запрос и поторяющий его (3 раза)
81
- - Указан `baseURL`
76
+
77
+ - Используются `Api Interceptors`
78
+ По умолчанию используются два обязательных перехватчика(`camelize` и `referrer`) и один опциональный(`captcha`) в `interceptors.request`, это:
79
+ - `camelize` - для преобразования кейса в ответе запроса
80
+ - `referrer` - для проброса реферрера в запросе
81
+ - `captcha` - опциональный, будет добавлен, если при инициализации `FoxfordService`,
82
+ в конфиге будет передан конфиг для капчи. Подробнее [здесь](./api/README.md)
83
+ - Используется `axiosRetry` - плагин Api, перехватывающий упавшие запрос и поторяющий его (3 раза)
84
+ - Указан `baseURL`
85
+
82
86
  2. `FoxfordService.api` - "базовый" инстанс Api, который имеет минимальную конфигурацию и не использует Interceptors и в нем не указан baseUrl
83
87
  Предназначен для хождения "наружу"
84
88
 
85
89
  #### Базовый конфиг Api используемый для `FoxfordService.api`
90
+
86
91
  ```javascript
87
92
  {
88
93
  xsrfCookieName: CSRF_COOKIE_NAME,
@@ -92,6 +97,7 @@ ___
92
97
  ```
93
98
 
94
99
  #### Конфиг Api используемый для `FoxfordService.foxApi`
100
+
95
101
  ```javascript
96
102
  {
97
103
  xsrfCookieName: CSRF_COOKIE_NAME,
@@ -100,12 +106,13 @@ ___
100
106
  withCredentials: true,
101
107
  }
102
108
  ```
103
- При необходимости можно расширить или переопределить конфиг для `FoxfordService.foxApi`
104
109
 
105
- ___
110
+ При необходимости можно расширить или переопределить конфиг для `FoxfordService.foxApi`
106
111
 
112
+ ---
107
113
 
108
114
  ### Пример использования апи из `FoxfordService`
115
+
109
116
  ```javascript
110
117
  import { Foxford } from '@foxford/foxford-js-sdk'
111
118
 
@@ -120,7 +127,7 @@ const FoxfordService = new Foxford({
120
127
  recaptchaConfig: {
121
128
  locale: 'ru',
122
129
  sitekey: 'captchaSecretKey',
123
- }
130
+ },
124
131
  })
125
132
 
126
133
  const getInternalData = () => {
@@ -132,7 +139,7 @@ const getExternalData = () => {
132
139
  }
133
140
  ```
134
141
 
135
- ### Пример использования апи в `stoege`
142
+ ### Пример использования апи в `stoege`
136
143
 
137
144
  ```js static
138
145
  import { Api, BaseApi } from 'services/api'
@@ -1 +1 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var e=require('./../../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.js');var t=require('../error.js');var r=require('../log.js');var o=require('./constants.js');var n=require('./style.js');var i=require('./template.js');var l=function(){};class CloudflareTurnstile{constructor(e){var{sitekey:t,locale:r,notify:o,onFatalError:n,onPotentiallyAutomatedError:i,onRenderCaptcha:a,onSuccessChallenge:s,onFailChallenge:c}=e;this.sitekey=null,this.locale='ru',this.provider='cloudflare_turnstile',this.container=null,this.notifyHandler=l,this.onFatalError=l,this.onPotentiallyAutomatedError=l,this.onRenderCaptcha=void 0,this.onSuccessChallenge=void 0,this.onFailChallenge=void 0,this.notifyHandler=null!=o?o:l,this.sitekey=null!=t?t:null,this.onFatalError=null!=n?n:l,this.onPotentiallyAutomatedError=null!=i?i:l,this.onRenderCaptcha=null!=a?a:l,this.onSuccessChallenge=null!=s?s:l,this.onFailChallenge=null!=c?c:l,r&&(this.locale=r),this.addDomElements(),CloudflareTurnstile.DEBUG&&(window.cf=this)}notify(){this.notifyHandler&&this.notifyHandler(...arguments)}addDomElements(){this.container||document.getElementById(o.CONTAINER_NODE_ID)||(document.body.insertAdjacentHTML('beforeend',i),document.body.insertAdjacentHTML('beforeend',"<style>".concat(n,"</style>")),this.container=document.getElementById(o.CONTAINER_NODE_ID))}appendScript(t){return e((function*(){if('string'!=typeof t||''===t)throw new TypeError('src script is not defined');var e=document.createElement('script');return e.src=t,document.body&&document.body.appendChild(e),new Promise(((t,r)=>{e.addEventListener('load',(()=>{t(true)})),e.addEventListener('error',(()=>{r()}))}))}))()}show(){var e;null===(e=this.container)||void 0===e||e.classList.add('fox-cf-turnstile--showing'),this.bodyScrollLock()}hide(){var e,t;null===(e=this.container)||void 0===e||e.classList.remove('fox-cf-turnstile--show'),null===(t=this.container)||void 0===t||t.classList.remove('fox-cf-turnstile--showing'),this.bodyScrollUnlock()}loadScript(){var r=this;return e((function*(){if(window.turnstile)return Promise.resolve(window.turnstile);var o=function(){var t=e((function*(){return yield r.appendScript("https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=onloadTurnstileCallback")}));return function(){return t.apply(this,arguments)}}();return new Promise(((e,n)=>{window.onloadTurnstileCallback=()=>{r.turnstileReady(),window.turnstile?e(window.turnstile):n(new t.CaptchaError('Cloudflare Turnstile is not available'))},o().catch((()=>n(new t.CaptchaError('Could not load Cloudflare Turnstile'))))}))}))()}turnstileReady(){var e,t;r.log('Cloudflare Turnstile is ready',window.turnstile),null===(e=this.container)||void 0===e||null===(t=e.querySelector('.fox-cf-turnstile__loader'))||void 0===t||t.remove()}normalizeLocation(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:'').substring(0,31).replace(/\//g,'_')}bodyScrollLock(){var e=document.body;e.style.setProperty('--st',"-".concat(document.documentElement.scrollTop,"px")),e.classList.add('fox-cf-turnstile__noscroll')}bodyScrollUnlock(){document.body.classList.remove('fox-cf-turnstile__noscroll')}renderWidget(t){var n=this;return e((function*(){return new Promise(((e,i)=>{var l;n.onRenderCaptcha(n.provider),null===(l=window.turnstile)||void 0===l||l.render("#".concat(o.RENDER_NODE_ID),{action:n.normalizeLocation(null==t?void 0:t.location),'after-interactive-callback':()=>{r.log("after-interactive-callback")},'before-interactive-callback':()=>{r.log("before-interactive-callback"),n.show()},callback:t=>{r.log("Challenge Success"),n.onSuccessChallenge(n.provider),e(t),n.hide()},'error-callback':e=>{n.onFailChallenge(n.provider,'error'),n.errorHandler(e)},'expired-callback':()=>{n.onFailChallenge(n.provider,'expired'),n.hide(),i(new Error('Captcha is expired'))},language:n.locale,sitekey:n.sitekey,theme:'light','timeout-callback':()=>{n.onFailChallenge(n.provider,'timeout'),n.hide(),i(new Error('Captcha is timeout'))},'unsupported-callback':()=>{n.onFailChallenge(n.provider,'error'),i('110500')}})}))}))()}errorHandler(e){switch(r.log("Captcha error with code:",e),true){case e.startsWith('110500'):this.notify('Ваш браузер устарел. Попробуйте ещё раз, используя другой браузер или устройство.'),Promise.reject();break;case e.startsWith('110600'):this.notify('Прошло слишком много времени с момента начала проверки. Обновите страницу и попробуйте ещё раз.');break;case e.startsWith('110510'):this.notify('Что-то пошло не так — возможно, вы используете технологию подмены User agent. Попробуйте ещё раз или обратитесь в поддержку'),Promise.reject();break;case e.startsWith('105'):case e.startsWith('106'):case e.startsWith('110100'):case e.startsWith('110110'):case e.startsWith('110200'):case e.startsWith('110420'):case e.startsWith('110430'):case e.startsWith('110500'):this.notify("Что-то пошло не так, код ошибки ".concat(e,". Мы уже знаем о проблеме и скоро всё поправим. Попробуйте ещё раз через некоторое время.")),null==this||this.onFatalError(e),Promise.reject();break;case e.startsWith('200100'):this.notify('Кажется, часы на вашем компьютере показывают неправильное время. Настройте часы и попробуйте ещё раз.'),Promise.reject();break;case e.startsWith('120'):this.notify("Что-то пошло не так. Попробуйте <a href=\"https://yandex.ru/support/common/browsers-settings/cache.html\" target=\"_blank\" rel=\"nofollow noopener\">очистить кеш браузера</a>. Если не помогает, обратитесь в поддержку."),Promise.reject();break;case e.startsWith('100'):this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.'),Promise.reject();break;case e.startsWith('300'):case e.startsWith('600'):null==this||this.onPotentiallyAutomatedError(e)}}execute(o){var n=this;return e((function*(){if(n.sitekey){if(r.log('Load cloudflare script'),yield n.loadScript(),!window.turnstile)throw new t.CaptchaError('Cloudflare Turnstile is not available in window');try{return r.log('Render turnstile widget'),yield n.renderWidget(o)}catch(e){e instanceof Error&&console.warn(e),'string'==typeof e&&n.errorHandler(e)}}}))()}}CloudflareTurnstile.DEBUG=false,exports.CloudflareTurnstile=CloudflareTurnstile;
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var e=require('./../../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.js');var r=require('../error.js');var t=require('../log.js');var o=require('./constants.js');var n=require('./style.js');var l=require('./template.js');var i=function(){};class CloudflareTurnstile{constructor(e){var{sitekey:r,locale:t,notify:o,onRenderCaptcha:n,onSuccessChallenge:l,onErrorChallenge:a,onWarnChallenge:s}=e;this.sitekey=null,this.locale='ru',this.provider='cloudflare_turnstile',this.container=null,this.notifyHandler=void 0,this.onRenderCaptcha=void 0,this.onSuccessChallenge=void 0,this.onErrorChallenge=void 0,this.onWarnChallenge=void 0,this.notifyHandler=null!=o?o:i,this.sitekey=null!=r?r:null,this.onRenderCaptcha=null!=n?n:i,this.onSuccessChallenge=null!=l?l:i,this.onErrorChallenge=null!=a?a:i,this.onWarnChallenge=null!=s?s:i,t&&(this.locale=t),this.addDomElements(),CloudflareTurnstile.DEBUG&&(window.cf=this)}notify(){this.notifyHandler&&this.notifyHandler(...arguments)}addDomElements(){this.container||document.getElementById(o.CONTAINER_NODE_ID)||(document.body.insertAdjacentHTML('beforeend',l),document.body.insertAdjacentHTML('beforeend',"<style>".concat(n,"</style>")),this.container=document.getElementById(o.CONTAINER_NODE_ID))}appendScript(r){return e((function*(){if('string'!=typeof r||''===r)throw new TypeError('src script is not defined');var e=document.createElement('script');return e.src=r,document.body&&document.body.appendChild(e),new Promise(((r,t)=>{e.addEventListener('load',(()=>{r(true)})),e.addEventListener('error',(()=>{t()}))}))}))()}show(){var e;null===(e=this.container)||void 0===e||e.classList.add('fox-cf-turnstile--showing'),this.bodyScrollLock()}hide(){var e,r;null===(e=this.container)||void 0===e||e.classList.remove('fox-cf-turnstile--show'),null===(r=this.container)||void 0===r||r.classList.remove('fox-cf-turnstile--showing'),this.bodyScrollUnlock()}loadScript(){var t=this;return e((function*(){if(window.turnstile)return Promise.resolve(window.turnstile);var o=function(){var r=e((function*(){return yield t.appendScript("https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=onloadTurnstileCallback")}));return function(){return r.apply(this,arguments)}}();return new Promise(((e,n)=>{window.onloadTurnstileCallback=()=>{t.turnstileReady(),window.turnstile?e(window.turnstile):n(new r.CaptchaError('Cloudflare Turnstile is not available'))},o().catch((()=>n(new r.CaptchaError('Could not load Cloudflare Turnstile'))))}))}))()}turnstileReady(){var e,r;t.log('Cloudflare Turnstile is ready',window.turnstile),null===(e=this.container)||void 0===e||null===(r=e.querySelector('.fox-cf-turnstile__loader'))||void 0===r||r.remove()}normalizeLocation(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:'').substring(0,31).replace(/\//g,'_')}bodyScrollLock(){var e=document.body;e.style.setProperty('--st',"-".concat(document.documentElement.scrollTop,"px")),e.classList.add('fox-cf-turnstile__noscroll')}bodyScrollUnlock(){document.body.classList.remove('fox-cf-turnstile__noscroll')}renderWidget(r){var n=this;return e((function*(){return new Promise(((e,l)=>{var i;var a='';function s(){var e;null===(e=window.turnstile)||void 0===e||e.reset(a),setTimeout((()=>{var e;null===(e=window.turnstile)||void 0===e||e.remove(a)}),500)}a=null===(i=window.turnstile)||void 0===i?void 0:i.render("#".concat(o.RENDER_NODE_ID),{action:n.normalizeLocation(null==r?void 0:r.location),'after-interactive-callback':()=>{t.log("after-interactive-callback")},'before-interactive-callback':()=>{t.log("before-interactive-callback"),n.show()},callback:r=>{t.log("Challenge Success"),n.hide(),e(r),s()},'error-callback':e=>{l(e),s()},'expired-callback':()=>{n.hide(),l('expired'),s()},language:n.locale,sitekey:n.sitekey,theme:'light','timeout-callback':()=>{n.hide(),l('timeout'),s()},'unsupported-callback':()=>{l('110500'),s()}})}))}))()}errorHandler(e){t.log("Captcha error with code:",e);var r=[...CloudflareTurnstile.NO_RETRY_ERROR_CODES];if('string'==typeof e){var o=e;switch(true){case o.startsWith('110500'):r=r.filter((e=>!e.startsWith('110500'))),this.notify('Ваш браузер устарел. Попробуйте ещё раз, используя другой браузер или устройство.');break;case o.startsWith('110600'):r=r.filter((e=>!e.startsWith('110600'))),this.notify('Прошло слишком много времени с момента начала проверки. Попробуйте еще раз.');break;case o.startsWith('110510'):r=r.filter((e=>!e.startsWith('110510'))),this.notify('Что-то пошло не так — возможно, вы используете технологию подмены User agent. Попробуйте ещё раз или обратитесь в поддержку');break;case o.startsWith('200010'):this.notify("Что-то пошло не так. Попробуйте <a href=\"https://yandex.ru/support/common/browsers-settings/cache.html\" target=\"_blank\" rel=\"nofollow noopener\">очистить кеш браузера</a>. Если не помогает, обратитесь в поддержку.");break;case o.startsWith('200100'):r=r.filter((e=>!e.startsWith('200100'))),this.notify('Кажется, часы на вашем компьютере показывают неправильное время. Настройте часы и попробуйте ещё раз.');break;case o.startsWith('300'):case o.startsWith('600'):r=r.filter((e=>!e.startsWith('300')||!e.startsWith('600'))),this.notify('Потвердите еще раз что вы человек')}r.some((e=>o.startsWith(e)))&&this.notify("Что-то пошло не так, код ошибки ".concat(o,". Мы уже знаем о проблеме и скоро всё поправим. Попробуйте ещё раз через некоторое время."))}else this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.')}execute(o){var n=this;return e((function*(){if(n.sitekey){t.log('Load cloudflare script');try{yield n.loadScript()}catch(t){var e=t instanceof r.CaptchaError?t:new r.CaptchaError('Could not load captcha with error: '+t.toString());throw n.onErrorChallenge(n.provider,e),e}if(!window.turnstile){var l=new r.CaptchaError('Cloudflare Turnstile is not available in window');throw n.onErrorChallenge(n.provider,l),l}try{t.log('Render turnstile widget'),n.onRenderCaptcha(n.provider);var i=yield n.renderWidget(o);return n.onSuccessChallenge(n.provider),i}catch(e){if(n.errorHandler(e),'string'!=typeof e){var a=new r.CaptchaError('Could not execute captcha with error: '+e.toString());throw n.onErrorChallenge(n.provider,a),a}if(['110200','110100','110110'].some((r=>e.startsWith(r)))){var s=new r.CaptchaError('Invalid sitekey or domain is not allowed');throw s.code=e,n.onErrorChallenge(n.provider,s),s}if(CloudflareTurnstile.NO_RETRY_ERROR_CODES.some((r=>e.startsWith(r)))){var c=new r.CaptchaError("Captcha challenge is failed");c.reason='error',c.capture=false,c.code=e,n.onErrorChallenge(n.provider,c)}else{var d=new r.CaptchaError("Captcha challenge has error");d.reason=['timeout','expired'].includes(e)?e:'error',d.capture=false,d.code=e,n.onWarnChallenge(n.provider,d)}}}}))()}}CloudflareTurnstile.DEBUG=false,CloudflareTurnstile.NO_RETRY_ERROR_CODES=['100','105','106','110100','110110','110200','110420','110430','110500','110510','120','200010','200100'],exports.CloudflareTurnstile=CloudflareTurnstile;
@@ -1 +1 @@
1
- import e from'./../../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.mjs';import{CaptchaError as t}from'../error.mjs';import{log as r}from'../log.mjs';import{CONTAINER_NODE_ID as o,RENDER_NODE_ID as n}from'./constants.mjs';import i from'./style.mjs';import l from'./template.mjs';var s=function(){};class CloudflareTurnstile{constructor(e){var{sitekey:t,locale:r,notify:o,onFatalError:n,onPotentiallyAutomatedError:i,onRenderCaptcha:l,onSuccessChallenge:a,onFailChallenge:c}=e;this.sitekey=null,this.locale='ru',this.provider='cloudflare_turnstile',this.container=null,this.notifyHandler=s,this.onFatalError=s,this.onPotentiallyAutomatedError=s,this.onRenderCaptcha=void 0,this.onSuccessChallenge=void 0,this.onFailChallenge=void 0,this.notifyHandler=null!=o?o:s,this.sitekey=null!=t?t:null,this.onFatalError=null!=n?n:s,this.onPotentiallyAutomatedError=null!=i?i:s,this.onRenderCaptcha=null!=l?l:s,this.onSuccessChallenge=null!=a?a:s,this.onFailChallenge=null!=c?c:s,r&&(this.locale=r),this.addDomElements(),CloudflareTurnstile.DEBUG&&(window.cf=this)}notify(){this.notifyHandler&&this.notifyHandler(...arguments)}addDomElements(){this.container||document.getElementById(o)||(document.body.insertAdjacentHTML('beforeend',l),document.body.insertAdjacentHTML('beforeend',"<style>".concat(i,"</style>")),this.container=document.getElementById(o))}appendScript(t){return e((function*(){if('string'!=typeof t||''===t)throw new TypeError('src script is not defined');var e=document.createElement('script');return e.src=t,document.body&&document.body.appendChild(e),new Promise(((t,r)=>{e.addEventListener('load',(()=>{t(true)})),e.addEventListener('error',(()=>{r()}))}))}))()}show(){var e;null===(e=this.container)||void 0===e||e.classList.add('fox-cf-turnstile--showing'),this.bodyScrollLock()}hide(){var e,t;null===(e=this.container)||void 0===e||e.classList.remove('fox-cf-turnstile--show'),null===(t=this.container)||void 0===t||t.classList.remove('fox-cf-turnstile--showing'),this.bodyScrollUnlock()}loadScript(){var r=this;return e((function*(){if(window.turnstile)return Promise.resolve(window.turnstile);var o=function(){var t=e((function*(){return yield r.appendScript("https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=onloadTurnstileCallback")}));return function(){return t.apply(this,arguments)}}();return new Promise(((e,n)=>{window.onloadTurnstileCallback=()=>{r.turnstileReady(),window.turnstile?e(window.turnstile):n(new t('Cloudflare Turnstile is not available'))},o().catch((()=>n(new t('Could not load Cloudflare Turnstile'))))}))}))()}turnstileReady(){var e,t;r('Cloudflare Turnstile is ready',window.turnstile),null===(e=this.container)||void 0===e||null===(t=e.querySelector('.fox-cf-turnstile__loader'))||void 0===t||t.remove()}normalizeLocation(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:'').substring(0,31).replace(/\//g,'_')}bodyScrollLock(){var e=document.body;e.style.setProperty('--st',"-".concat(document.documentElement.scrollTop,"px")),e.classList.add('fox-cf-turnstile__noscroll')}bodyScrollUnlock(){document.body.classList.remove('fox-cf-turnstile__noscroll')}renderWidget(t){var o=this;return e((function*(){return new Promise(((e,i)=>{var l;o.onRenderCaptcha(o.provider),null===(l=window.turnstile)||void 0===l||l.render("#".concat(n),{action:o.normalizeLocation(null==t?void 0:t.location),'after-interactive-callback':()=>{r("after-interactive-callback")},'before-interactive-callback':()=>{r("before-interactive-callback"),o.show()},callback:t=>{r("Challenge Success"),o.onSuccessChallenge(o.provider),e(t),o.hide()},'error-callback':e=>{o.onFailChallenge(o.provider,'error'),o.errorHandler(e)},'expired-callback':()=>{o.onFailChallenge(o.provider,'expired'),o.hide(),i(new Error('Captcha is expired'))},language:o.locale,sitekey:o.sitekey,theme:'light','timeout-callback':()=>{o.onFailChallenge(o.provider,'timeout'),o.hide(),i(new Error('Captcha is timeout'))},'unsupported-callback':()=>{o.onFailChallenge(o.provider,'error'),i('110500')}})}))}))()}errorHandler(e){switch(r("Captcha error with code:",e),true){case e.startsWith('110500'):this.notify('Ваш браузер устарел. Попробуйте ещё раз, используя другой браузер или устройство.'),Promise.reject();break;case e.startsWith('110600'):this.notify('Прошло слишком много времени с момента начала проверки. Обновите страницу и попробуйте ещё раз.');break;case e.startsWith('110510'):this.notify('Что-то пошло не так — возможно, вы используете технологию подмены User agent. Попробуйте ещё раз или обратитесь в поддержку'),Promise.reject();break;case e.startsWith('105'):case e.startsWith('106'):case e.startsWith('110100'):case e.startsWith('110110'):case e.startsWith('110200'):case e.startsWith('110420'):case e.startsWith('110430'):case e.startsWith('110500'):this.notify("Что-то пошло не так, код ошибки ".concat(e,". Мы уже знаем о проблеме и скоро всё поправим. Попробуйте ещё раз через некоторое время.")),null==this||this.onFatalError(e),Promise.reject();break;case e.startsWith('200100'):this.notify('Кажется, часы на вашем компьютере показывают неправильное время. Настройте часы и попробуйте ещё раз.'),Promise.reject();break;case e.startsWith('120'):this.notify("Что-то пошло не так. Попробуйте <a href=\"https://yandex.ru/support/common/browsers-settings/cache.html\" target=\"_blank\" rel=\"nofollow noopener\">очистить кеш браузера</a>. Если не помогает, обратитесь в поддержку."),Promise.reject();break;case e.startsWith('100'):this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.'),Promise.reject();break;case e.startsWith('300'):case e.startsWith('600'):null==this||this.onPotentiallyAutomatedError(e)}}execute(o){var n=this;return e((function*(){if(n.sitekey){if(r('Load cloudflare script'),yield n.loadScript(),!window.turnstile)throw new t('Cloudflare Turnstile is not available in window');try{return r('Render turnstile widget'),yield n.renderWidget(o)}catch(e){e instanceof Error&&console.warn(e),'string'==typeof e&&n.errorHandler(e)}}}))()}}CloudflareTurnstile.DEBUG=false;export{CloudflareTurnstile};
1
+ import e from'./../../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.mjs';import{CaptchaError as t}from'../error.mjs';import{log as r}from'../log.mjs';import{CONTAINER_NODE_ID as n,RENDER_NODE_ID as o}from'./constants.mjs';import i from'./style.mjs';import l from'./template.mjs';var a=function(){};class CloudflareTurnstile{constructor(e){var{sitekey:t,locale:r,notify:n,onRenderCaptcha:o,onSuccessChallenge:i,onErrorChallenge:l,onWarnChallenge:s}=e;this.sitekey=null,this.locale='ru',this.provider='cloudflare_turnstile',this.container=null,this.notifyHandler=void 0,this.onRenderCaptcha=void 0,this.onSuccessChallenge=void 0,this.onErrorChallenge=void 0,this.onWarnChallenge=void 0,this.notifyHandler=null!=n?n:a,this.sitekey=null!=t?t:null,this.onRenderCaptcha=null!=o?o:a,this.onSuccessChallenge=null!=i?i:a,this.onErrorChallenge=null!=l?l:a,this.onWarnChallenge=null!=s?s:a,r&&(this.locale=r),this.addDomElements(),CloudflareTurnstile.DEBUG&&(window.cf=this)}notify(){this.notifyHandler&&this.notifyHandler(...arguments)}addDomElements(){this.container||document.getElementById(n)||(document.body.insertAdjacentHTML('beforeend',l),document.body.insertAdjacentHTML('beforeend',"<style>".concat(i,"</style>")),this.container=document.getElementById(n))}appendScript(t){return e((function*(){if('string'!=typeof t||''===t)throw new TypeError('src script is not defined');var e=document.createElement('script');return e.src=t,document.body&&document.body.appendChild(e),new Promise(((t,r)=>{e.addEventListener('load',(()=>{t(true)})),e.addEventListener('error',(()=>{r()}))}))}))()}show(){var e;null===(e=this.container)||void 0===e||e.classList.add('fox-cf-turnstile--showing'),this.bodyScrollLock()}hide(){var e,t;null===(e=this.container)||void 0===e||e.classList.remove('fox-cf-turnstile--show'),null===(t=this.container)||void 0===t||t.classList.remove('fox-cf-turnstile--showing'),this.bodyScrollUnlock()}loadScript(){var r=this;return e((function*(){if(window.turnstile)return Promise.resolve(window.turnstile);var n=function(){var t=e((function*(){return yield r.appendScript("https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=onloadTurnstileCallback")}));return function(){return t.apply(this,arguments)}}();return new Promise(((e,o)=>{window.onloadTurnstileCallback=()=>{r.turnstileReady(),window.turnstile?e(window.turnstile):o(new t('Cloudflare Turnstile is not available'))},n().catch((()=>o(new t('Could not load Cloudflare Turnstile'))))}))}))()}turnstileReady(){var e,t;r('Cloudflare Turnstile is ready',window.turnstile),null===(e=this.container)||void 0===e||null===(t=e.querySelector('.fox-cf-turnstile__loader'))||void 0===t||t.remove()}normalizeLocation(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:'').substring(0,31).replace(/\//g,'_')}bodyScrollLock(){var e=document.body;e.style.setProperty('--st',"-".concat(document.documentElement.scrollTop,"px")),e.classList.add('fox-cf-turnstile__noscroll')}bodyScrollUnlock(){document.body.classList.remove('fox-cf-turnstile__noscroll')}renderWidget(t){var n=this;return e((function*(){return new Promise(((e,i)=>{var l;var a='';function s(){var e;null===(e=window.turnstile)||void 0===e||e.reset(a),setTimeout((()=>{var e;null===(e=window.turnstile)||void 0===e||e.remove(a)}),500)}a=null===(l=window.turnstile)||void 0===l?void 0:l.render("#".concat(o),{action:n.normalizeLocation(null==t?void 0:t.location),'after-interactive-callback':()=>{r("after-interactive-callback")},'before-interactive-callback':()=>{r("before-interactive-callback"),n.show()},callback:t=>{r("Challenge Success"),n.hide(),e(t),s()},'error-callback':e=>{i(e),s()},'expired-callback':()=>{n.hide(),i('expired'),s()},language:n.locale,sitekey:n.sitekey,theme:'light','timeout-callback':()=>{n.hide(),i('timeout'),s()},'unsupported-callback':()=>{i('110500'),s()}})}))}))()}errorHandler(e){r("Captcha error with code:",e);var t=[...CloudflareTurnstile.NO_RETRY_ERROR_CODES];if('string'==typeof e){var n=e;switch(true){case n.startsWith('110500'):t=t.filter((e=>!e.startsWith('110500'))),this.notify('Ваш браузер устарел. Попробуйте ещё раз, используя другой браузер или устройство.');break;case n.startsWith('110600'):t=t.filter((e=>!e.startsWith('110600'))),this.notify('Прошло слишком много времени с момента начала проверки. Попробуйте еще раз.');break;case n.startsWith('110510'):t=t.filter((e=>!e.startsWith('110510'))),this.notify('Что-то пошло не так — возможно, вы используете технологию подмены User agent. Попробуйте ещё раз или обратитесь в поддержку');break;case n.startsWith('200010'):this.notify("Что-то пошло не так. Попробуйте <a href=\"https://yandex.ru/support/common/browsers-settings/cache.html\" target=\"_blank\" rel=\"nofollow noopener\">очистить кеш браузера</a>. Если не помогает, обратитесь в поддержку.");break;case n.startsWith('200100'):t=t.filter((e=>!e.startsWith('200100'))),this.notify('Кажется, часы на вашем компьютере показывают неправильное время. Настройте часы и попробуйте ещё раз.');break;case n.startsWith('300'):case n.startsWith('600'):t=t.filter((e=>!e.startsWith('300')||!e.startsWith('600'))),this.notify('Потвердите еще раз что вы человек')}t.some((e=>n.startsWith(e)))&&this.notify("Что-то пошло не так, код ошибки ".concat(n,". Мы уже знаем о проблеме и скоро всё поправим. Попробуйте ещё раз через некоторое время."))}else this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.')}execute(n){var o=this;return e((function*(){if(o.sitekey){r('Load cloudflare script');try{yield o.loadScript()}catch(r){var e=r instanceof t?r:new t('Could not load captcha with error: '+r.toString());throw o.onErrorChallenge(o.provider,e),e}if(!window.turnstile){var i=new t('Cloudflare Turnstile is not available in window');throw o.onErrorChallenge(o.provider,i),i}try{r('Render turnstile widget'),o.onRenderCaptcha(o.provider);var l=yield o.renderWidget(n);return o.onSuccessChallenge(o.provider),l}catch(e){if(o.errorHandler(e),'string'!=typeof e){var a=new t('Could not execute captcha with error: '+e.toString());throw o.onErrorChallenge(o.provider,a),a}if(['110200','110100','110110'].some((t=>e.startsWith(t)))){var s=new t('Invalid sitekey or domain is not allowed');throw s.code=e,o.onErrorChallenge(o.provider,s),s}if(CloudflareTurnstile.NO_RETRY_ERROR_CODES.some((t=>e.startsWith(t)))){var c=new t("Captcha challenge is failed");c.reason='error',c.capture=false,c.code=e,o.onErrorChallenge(o.provider,c)}else{var d=new t("Captcha challenge has error");d.reason=['timeout','expired'].includes(e)?e:'error',d.capture=false,d.code=e,o.onWarnChallenge(o.provider,d)}}}}))()}}CloudflareTurnstile.DEBUG=false,CloudflareTurnstile.NO_RETRY_ERROR_CODES=['100','105','106','110100','110110','110200','110420','110430','110500','110510','120','200010','200100'];export{CloudflareTurnstile};
package/captcha/error.js CHANGED
@@ -1 +1 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});class CaptchaError extends Error{constructor(r,t){super(r),this.payload={},this.name='CaptchaError',this.message=r,t&&(this.payload=t)}}exports.CaptchaError=CaptchaError;
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});class CaptchaError extends Error{constructor(r){super(r),this.reason=void 0,this.code=void 0,this.capture=true,this.name='CaptchaError',this.message=r}}exports.CaptchaError=CaptchaError;
package/captcha/error.mjs CHANGED
@@ -1 +1 @@
1
- class CaptchaError extends Error{constructor(r,a){super(r),this.payload={},this.name='CaptchaError',this.message=r,a&&(this.payload=a)}}export{CaptchaError};
1
+ class CaptchaError extends Error{constructor(r){super(r),this.reason=void 0,this.code=void 0,this.capture=true,this.name='CaptchaError',this.message=r}}export{CaptchaError};
@@ -1 +1 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var e=require('./../../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.js');var r=require('../../utils/uuid.js');var a=require('../error.js');var t=require('../log.js');var o=require('./constants.js');var n=function(){};class GoogleCaptcha{constructor(e){var{sitekey:r,locale:a,notify:t,onFatalError:o,onRenderCaptcha:c,onSuccessChallenge:i,onFailChallenge:l}=e;this.sitekey=null,this.locale='ru',this.container=null,this.provider='recaptcha',this.notifyHandler=n,this.onFatalError=n,this.onRenderCaptcha=n,this.onSuccessChallenge=n,this.onFailChallenge=n,this.sitekey=null!=r?r:null,this.notifyHandler=null!=t?t:n,this.onFatalError=null!=o?o:n,this.onRenderCaptcha=null!=c?c:n,this.onSuccessChallenge=null!=i?i:n,this.onFailChallenge=null!=l?l:n,a&&(this.locale=a),this.addDomElements(),GoogleCaptcha.DEBUG&&(window.gr=this)}recaptchaReady(){t.log('Google recaptcha is ready',window.grecaptcha)}addDomElements(){if(!this.container&&!document.getElementById(o.NODE_ID)){document.body.insertAdjacentHTML('beforeend',"<div id=\"".concat(o.NODE_ID,"\"></div>"));var e=document.getElementById(o.NODE_ID);e.style.display='none',this.container=e}}getGrecaptchaCallbackNames(){return{error:"".concat(GoogleCaptcha.ERROR_FUNC_NAME),expired:"".concat(GoogleCaptcha.EXPIRED_FUNC_NAME),resolve:"".concat(GoogleCaptcha.RESOLVE_FUNC_NAME)}}appendScript(r){return e((function*(){if('string'!=typeof r||''===r)throw new TypeError('src script is not defined');var e=document.createElement('script');return e.src=r,document.body&&document.body.appendChild(e),new Promise(((r,a)=>{e.addEventListener('load',(()=>{r(true)})),e.addEventListener('error',(()=>{a()}))}))}))()}loadScript(){var r=this;return e((function*(){if(window.grecaptcha)return Promise.resolve(window.grecaptcha);var t=function(){var a=e((function*(){return yield r.appendScript("https://www.google.com/recaptcha/api.js?hl=".concat(r.locale,"&onload=onloadRecaptchaCallback"))}));return function(){return a.apply(this,arguments)}}();return new Promise(((e,o)=>{window.onloadRecaptchaCallback=()=>{r.recaptchaReady(),window.grecaptcha?e(window.grecaptcha):o(new a.CaptchaError('Recaptcha is not available'))},t().catch((()=>o(new a.CaptchaError('Could not load Recaptcha'))))}))}))()}notify(){this.notifyHandler&&this.notifyHandler(...arguments)}errorHandler(e){switch(t.log("Recaptcha error:",e),e.toString()){case'recaptcha is expired':case'recaptcha has error':this.notify('Возможно произшла ошибка с сетевым подключением. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.');break;default:this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.')}}renderWidget(e){return new Promise(((e,t)=>{var n,c,i;var l=document.createElement('div');var s="".concat(o.NODE_ID,"_").concat(r.generateUUID());l.id=s,null===(n=document.getElementById(o.NODE_ID))||void 0===n||n.appendChild(l);var h=this.getGrecaptchaCallbackNames();var d=NaN;window[h.resolve]=()=>{var r;this.onSuccessChallenge(this.provider);var a=null===(r=window.grecaptcha)||void 0===r?void 0:r.getResponse(d);e(null!=a?a:''),l.remove()},window[h.error]=()=>{this.onFailChallenge(this.provider,'error'),t(new a.CaptchaError('recaptcha has error')),l.remove()},window[h.expired]=()=>{this.onFailChallenge(this.provider,'expired'),t(new a.CaptchaError('recaptcha is expired')),l.remove()},this.onRenderCaptcha(this.provider),d=null===(c=window.grecaptcha)||void 0===c?void 0:c.render(s,{callback:h.resolve,'error-callback':h.error,'expired-callback':h.expired,sitekey:this.sitekey,size:'invisible'});var p=null===(i=window.grecaptcha)||void 0===i?void 0:i.execute(d);if(!p)return t(new a.CaptchaError('cannot call method execute from grecaptcha')),void l.remove();p.catch((e=>{e instanceof Error?(t(new a.CaptchaError(e.message)),l.remove()):'string'==typeof e&&(t(new a.CaptchaError(e)),l.remove())}))}))}execute(r){var o=this;return e((function*(){if(o.sitekey){if(t.log('Load recaptcha script'),yield o.loadScript(),!window.grecaptcha)throw new a.CaptchaError('Recaptcha is not available in window');try{return t.log('Render Recaptcha widget'),yield o.renderWidget(r)}catch(e){'string'==typeof e||e instanceof a.CaptchaError?o.errorHandler(e):o.onFatalError(e.toString())}}}))()}}GoogleCaptcha.RESOLVE_FUNC_NAME='grecaptcha_resolved',GoogleCaptcha.ERROR_FUNC_NAME='grecaptcha_error',GoogleCaptcha.EXPIRED_FUNC_NAME='grecaptcha_expired',GoogleCaptcha.DEBUG=false,exports.GoogleCaptcha=GoogleCaptcha;
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var e=require('./../../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.js');var r=require('../../utils/uuid.js');var a=require('../error.js');var t=require('../log.js');var o=require('./constants.js');var n=function(){};class GoogleCaptcha{constructor(e){var{sitekey:r,locale:a,notify:t,onRenderCaptcha:o,onSuccessChallenge:c,onWarnChallenge:i,onErrorChallenge:l}=e;this.sitekey=null,this.locale='ru',this.container=null,this.provider='recaptcha',this.notifyHandler=void 0,this.onRenderCaptcha=void 0,this.onSuccessChallenge=void 0,this.onErrorChallenge=void 0,this.onWarnChallenge=void 0,this.sitekey=null!=r?r:null,this.notifyHandler=null!=t?t:n,this.onRenderCaptcha=null!=o?o:n,this.onSuccessChallenge=null!=c?c:n,this.onWarnChallenge=null!=i?i:n,this.onErrorChallenge=null!=l?l:n,a&&(this.locale=a),this.addDomElements(),GoogleCaptcha.DEBUG&&(window.gr=this)}recaptchaReady(){t.log('Google recaptcha is ready',window.grecaptcha)}addDomElements(){if(!this.container&&!document.getElementById(o.NODE_ID)){document.body.insertAdjacentHTML('beforeend',"<div id=\"".concat(o.NODE_ID,"\"></div>"));var e=document.getElementById(o.NODE_ID);e.style.display='none',this.container=e}}getGrecaptchaCallbackNames(){return{error:"".concat(GoogleCaptcha.ERROR_FUNC_NAME),expired:"".concat(GoogleCaptcha.EXPIRED_FUNC_NAME),resolve:"".concat(GoogleCaptcha.RESOLVE_FUNC_NAME)}}appendScript(r){return e((function*(){if('string'!=typeof r||''===r)throw new TypeError('src script is not defined');var e=document.createElement('script');return e.src=r,document.body&&document.body.appendChild(e),new Promise(((r,a)=>{e.addEventListener('load',(()=>{r(true)})),e.addEventListener('error',(()=>{a()}))}))}))()}loadScript(){var r=this;return e((function*(){if(window.grecaptcha)return Promise.resolve(window.grecaptcha);var t=function(){var a=e((function*(){return yield r.appendScript("https://www.google.com/recaptcha/api.js?hl=".concat(r.locale,"&onload=onloadRecaptchaCallback"))}));return function(){return a.apply(this,arguments)}}();return new Promise(((e,o)=>{window.onloadRecaptchaCallback=()=>{r.recaptchaReady(),window.grecaptcha?e(window.grecaptcha):o(new a.CaptchaError('Recaptcha is not available'))},t().catch((()=>o(new a.CaptchaError('Could not load Recaptcha'))))}))}))()}notify(){this.notifyHandler&&this.notifyHandler(...arguments)}errorHandler(e){switch(t.log("Recaptcha error:",e),e){case'expired':this.notify('Прошло слишком много времени с момента начала проверки. Попробуйте еще раз.');break;case'timeout':this.notify('Возможно произшла ошибка с сетевым подключением. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.');break;default:this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.')}}renderWidget(e){return new Promise(((e,a)=>{var t,n,c;var i=document.createElement('div');var l="".concat(o.NODE_ID,"_").concat(r.generateUUID());i.id=l,null===(t=document.getElementById(o.NODE_ID))||void 0===t||t.appendChild(i);var d=this.getGrecaptchaCallbackNames();var h=NaN;function s(){var e;null===(e=window.grecaptcha)||void 0===e||e.reset(),setTimeout((()=>{i.remove()}),1e3)}window[d.resolve]=()=>{var r;var a=null===(r=window.grecaptcha)||void 0===r?void 0:r.getResponse(h);e(null!=a?a:''),s()},window[d.error]=()=>{a('error'),s()},window[d.expired]=()=>{a('expired'),s()},h=null===(n=window.grecaptcha)||void 0===n?void 0:n.render(l,{callback:d.resolve,'error-callback':d.error,'expired-callback':d.expired,sitekey:this.sitekey,size:'invisible'});var p=null===(c=window.grecaptcha)||void 0===c?void 0:c.execute(h);if(!p)return a(new Error('cannot call method execute from grecaptcha')),void s();p.catch((e=>{a(e instanceof Error?e:new Error(e.toString())),s()}))}))}execute(r){var o=this;return e((function*(){if(o.sitekey){t.log('Load recaptcha script');try{yield o.loadScript()}catch(r){var e=r instanceof a.CaptchaError?r:new a.CaptchaError('Could not load captcha with error: '+r.toString());throw o.onErrorChallenge(o.provider,e),e}if(!window.grecaptcha){var n=new a.CaptchaError('Recaptcha is not available in window');throw o.onErrorChallenge(o.provider,n),n}try{t.log('Render Recaptcha widget'),o.onRenderCaptcha(o.provider);var c=yield o.renderWidget(r);return o.onSuccessChallenge(o.provider),c}catch(e){if(o.errorHandler(e),'string'!=typeof e){var i=new a.CaptchaError('Could not execute captcha with error: '+e.toString());throw o.onErrorChallenge(o.provider,i),i}if('expired'===e){var l=new a.CaptchaError("Challenge or token expired");l.reason='expired',l.capture=false,o.onWarnChallenge(o.provider,l)}if('error'===e){var d=new a.CaptchaError("Error during captcha execution");d.reason='error',d.capture=false,o.onErrorChallenge(o.provider,d)}}}}))()}}GoogleCaptcha.RESOLVE_FUNC_NAME='grecaptcha_resolved',GoogleCaptcha.ERROR_FUNC_NAME='grecaptcha_error',GoogleCaptcha.EXPIRED_FUNC_NAME='grecaptcha_expired',GoogleCaptcha.DEBUG=false,exports.GoogleCaptcha=GoogleCaptcha;
@@ -1 +1 @@
1
- import e from'./../../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.mjs';import{generateUUID as r}from'../../utils/uuid.mjs';import{CaptchaError as a}from'../error.mjs';import{log as t}from'../log.mjs';import{NODE_ID as o}from'./constants.mjs';var n=function(){};class GoogleCaptcha{constructor(e){var{sitekey:r,locale:a,notify:t,onFatalError:o,onRenderCaptcha:i,onSuccessChallenge:c,onFailChallenge:l}=e;this.sitekey=null,this.locale='ru',this.container=null,this.provider='recaptcha',this.notifyHandler=n,this.onFatalError=n,this.onRenderCaptcha=n,this.onSuccessChallenge=n,this.onFailChallenge=n,this.sitekey=null!=r?r:null,this.notifyHandler=null!=t?t:n,this.onFatalError=null!=o?o:n,this.onRenderCaptcha=null!=i?i:n,this.onSuccessChallenge=null!=c?c:n,this.onFailChallenge=null!=l?l:n,a&&(this.locale=a),this.addDomElements(),GoogleCaptcha.DEBUG&&(window.gr=this)}recaptchaReady(){t('Google recaptcha is ready',window.grecaptcha)}addDomElements(){if(!this.container&&!document.getElementById(o)){document.body.insertAdjacentHTML('beforeend',"<div id=\"".concat(o,"\"></div>"));var e=document.getElementById(o);e.style.display='none',this.container=e}}getGrecaptchaCallbackNames(){return{error:"".concat(GoogleCaptcha.ERROR_FUNC_NAME),expired:"".concat(GoogleCaptcha.EXPIRED_FUNC_NAME),resolve:"".concat(GoogleCaptcha.RESOLVE_FUNC_NAME)}}appendScript(r){return e((function*(){if('string'!=typeof r||''===r)throw new TypeError('src script is not defined');var e=document.createElement('script');return e.src=r,document.body&&document.body.appendChild(e),new Promise(((r,a)=>{e.addEventListener('load',(()=>{r(true)})),e.addEventListener('error',(()=>{a()}))}))}))()}loadScript(){var r=this;return e((function*(){if(window.grecaptcha)return Promise.resolve(window.grecaptcha);var t=function(){var a=e((function*(){return yield r.appendScript("https://www.google.com/recaptcha/api.js?hl=".concat(r.locale,"&onload=onloadRecaptchaCallback"))}));return function(){return a.apply(this,arguments)}}();return new Promise(((e,o)=>{window.onloadRecaptchaCallback=()=>{r.recaptchaReady(),window.grecaptcha?e(window.grecaptcha):o(new a('Recaptcha is not available'))},t().catch((()=>o(new a('Could not load Recaptcha'))))}))}))()}notify(){this.notifyHandler&&this.notifyHandler(...arguments)}errorHandler(e){switch(t("Recaptcha error:",e),e.toString()){case'recaptcha is expired':case'recaptcha has error':this.notify('Возможно произшла ошибка с сетевым подключением. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.');break;default:this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.')}}renderWidget(e){return new Promise(((e,t)=>{var n,i,c;var l=document.createElement('div');var s="".concat(o,"_").concat(r());l.id=s,null===(n=document.getElementById(o))||void 0===n||n.appendChild(l);var d=this.getGrecaptchaCallbackNames();var h=NaN;window[d.resolve]=()=>{var r;this.onSuccessChallenge(this.provider);var a=null===(r=window.grecaptcha)||void 0===r?void 0:r.getResponse(h);e(null!=a?a:''),l.remove()},window[d.error]=()=>{this.onFailChallenge(this.provider,'error'),t(new a('recaptcha has error')),l.remove()},window[d.expired]=()=>{this.onFailChallenge(this.provider,'expired'),t(new a('recaptcha is expired')),l.remove()},this.onRenderCaptcha(this.provider),h=null===(i=window.grecaptcha)||void 0===i?void 0:i.render(s,{callback:d.resolve,'error-callback':d.error,'expired-callback':d.expired,sitekey:this.sitekey,size:'invisible'});var p=null===(c=window.grecaptcha)||void 0===c?void 0:c.execute(h);if(!p)return t(new a('cannot call method execute from grecaptcha')),void l.remove();p.catch((e=>{e instanceof Error?(t(new a(e.message)),l.remove()):'string'==typeof e&&(t(new a(e)),l.remove())}))}))}execute(r){var o=this;return e((function*(){if(o.sitekey){if(t('Load recaptcha script'),yield o.loadScript(),!window.grecaptcha)throw new a('Recaptcha is not available in window');try{return t('Render Recaptcha widget'),yield o.renderWidget(r)}catch(e){'string'==typeof e||e instanceof a?o.errorHandler(e):o.onFatalError(e.toString())}}}))()}}GoogleCaptcha.RESOLVE_FUNC_NAME='grecaptcha_resolved',GoogleCaptcha.ERROR_FUNC_NAME='grecaptcha_error',GoogleCaptcha.EXPIRED_FUNC_NAME='grecaptcha_expired',GoogleCaptcha.DEBUG=false;export{GoogleCaptcha};
1
+ import e from'./../../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.mjs';import{generateUUID as r}from'../../utils/uuid.mjs';import{CaptchaError as a}from'../error.mjs';import{log as o}from'../log.mjs';import{NODE_ID as t}from'./constants.mjs';var n=function(){};class GoogleCaptcha{constructor(e){var{sitekey:r,locale:a,notify:o,onRenderCaptcha:t,onSuccessChallenge:i,onWarnChallenge:c,onErrorChallenge:l}=e;this.sitekey=null,this.locale='ru',this.container=null,this.provider='recaptcha',this.notifyHandler=void 0,this.onRenderCaptcha=void 0,this.onSuccessChallenge=void 0,this.onErrorChallenge=void 0,this.onWarnChallenge=void 0,this.sitekey=null!=r?r:null,this.notifyHandler=null!=o?o:n,this.onRenderCaptcha=null!=t?t:n,this.onSuccessChallenge=null!=i?i:n,this.onWarnChallenge=null!=c?c:n,this.onErrorChallenge=null!=l?l:n,a&&(this.locale=a),this.addDomElements(),GoogleCaptcha.DEBUG&&(window.gr=this)}recaptchaReady(){o('Google recaptcha is ready',window.grecaptcha)}addDomElements(){if(!this.container&&!document.getElementById(t)){document.body.insertAdjacentHTML('beforeend',"<div id=\"".concat(t,"\"></div>"));var e=document.getElementById(t);e.style.display='none',this.container=e}}getGrecaptchaCallbackNames(){return{error:"".concat(GoogleCaptcha.ERROR_FUNC_NAME),expired:"".concat(GoogleCaptcha.EXPIRED_FUNC_NAME),resolve:"".concat(GoogleCaptcha.RESOLVE_FUNC_NAME)}}appendScript(r){return e((function*(){if('string'!=typeof r||''===r)throw new TypeError('src script is not defined');var e=document.createElement('script');return e.src=r,document.body&&document.body.appendChild(e),new Promise(((r,a)=>{e.addEventListener('load',(()=>{r(true)})),e.addEventListener('error',(()=>{a()}))}))}))()}loadScript(){var r=this;return e((function*(){if(window.grecaptcha)return Promise.resolve(window.grecaptcha);var o=function(){var a=e((function*(){return yield r.appendScript("https://www.google.com/recaptcha/api.js?hl=".concat(r.locale,"&onload=onloadRecaptchaCallback"))}));return function(){return a.apply(this,arguments)}}();return new Promise(((e,t)=>{window.onloadRecaptchaCallback=()=>{r.recaptchaReady(),window.grecaptcha?e(window.grecaptcha):t(new a('Recaptcha is not available'))},o().catch((()=>t(new a('Could not load Recaptcha'))))}))}))()}notify(){this.notifyHandler&&this.notifyHandler(...arguments)}errorHandler(e){switch(o("Recaptcha error:",e),e){case'expired':this.notify('Прошло слишком много времени с момента начала проверки. Попробуйте еще раз.');break;case'timeout':this.notify('Возможно произшла ошибка с сетевым подключением. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.');break;default:this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.')}}renderWidget(e){return new Promise(((e,a)=>{var o,n,i;var c=document.createElement('div');var l="".concat(t,"_").concat(r());c.id=l,null===(o=document.getElementById(t))||void 0===o||o.appendChild(c);var d=this.getGrecaptchaCallbackNames();var h=NaN;function s(){var e;null===(e=window.grecaptcha)||void 0===e||e.reset(),setTimeout((()=>{c.remove()}),1e3)}window[d.resolve]=()=>{var r;var a=null===(r=window.grecaptcha)||void 0===r?void 0:r.getResponse(h);e(null!=a?a:''),s()},window[d.error]=()=>{a('error'),s()},window[d.expired]=()=>{a('expired'),s()},h=null===(n=window.grecaptcha)||void 0===n?void 0:n.render(l,{callback:d.resolve,'error-callback':d.error,'expired-callback':d.expired,sitekey:this.sitekey,size:'invisible'});var p=null===(i=window.grecaptcha)||void 0===i?void 0:i.execute(h);if(!p)return a(new Error('cannot call method execute from grecaptcha')),void s();p.catch((e=>{a(e instanceof Error?e:new Error(e.toString())),s()}))}))}execute(r){var t=this;return e((function*(){if(t.sitekey){o('Load recaptcha script');try{yield t.loadScript()}catch(r){var e=r instanceof a?r:new a('Could not load captcha with error: '+r.toString());throw t.onErrorChallenge(t.provider,e),e}if(!window.grecaptcha){var n=new a('Recaptcha is not available in window');throw t.onErrorChallenge(t.provider,n),n}try{o('Render Recaptcha widget'),t.onRenderCaptcha(t.provider);var i=yield t.renderWidget(r);return t.onSuccessChallenge(t.provider),i}catch(e){if(t.errorHandler(e),'string'!=typeof e){var c=new a('Could not execute captcha with error: '+e.toString());throw t.onErrorChallenge(t.provider,c),c}if('expired'===e){var l=new a("Challenge or token expired");l.reason='expired',l.capture=false,t.onWarnChallenge(t.provider,l)}if('error'===e){var d=new a("Error during captcha execution");d.reason='error',d.capture=false,t.onErrorChallenge(t.provider,d)}}}}))()}}GoogleCaptcha.RESOLVE_FUNC_NAME='grecaptcha_resolved',GoogleCaptcha.ERROR_FUNC_NAME='grecaptcha_error',GoogleCaptcha.EXPIRED_FUNC_NAME='grecaptcha_expired',GoogleCaptcha.DEBUG=false;export{GoogleCaptcha};
package/captcha/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var e=require('./../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.js');var r=require('./cloudflare/index.js');var t=require('./error.js');var a=require('./google/index.js');var i=require('./log.js');exports.CaptchaError=t.CaptchaError,exports.CaptchaService=class CaptchaService{constructor(e){var t,i;switch(this.sitekey=null,this.provider=null,this.locale='en',this.captcha=null,this.sitekey=null!==(t=e.sitekey)&&void 0!==t?t:null,this.provider=null!==(i=e.provider)&&void 0!==i?i:null,e.locale&&(this.locale=e.locale),e.provider){case'cloudflare_turnstile':this.captcha=new r.CloudflareTurnstile(e);break;case'recaptcha':this.captcha=new a.GoogleCaptcha(e)}}isEnabled(){return'string'==typeof this.sitekey&&''!==this.sitekey}execute(r){var a=this;return e((function*(){if(false!==a.isEnabled()&&a.provider&&a.captcha){var e=yield a.captcha.execute(r);if(i.log('Receive answer from captcha provider'),!e)throw new t.CaptchaError("Could't get captcha token from provider "+a.provider);return{captcha_provider:a.provider,captcha_token:e}}}))()}};
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var e=require('./../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.js');var r=require('./cloudflare/index.js');var t=require('./google/index.js');var a=require('./log.js');exports.CaptchaService=class CaptchaService{constructor(e){var a,i;switch(this.sitekey=null,this.provider=null,this.locale='en',this.captcha=null,this.sitekey=null!==(a=e.sitekey)&&void 0!==a?a:null,this.provider=null!==(i=e.provider)&&void 0!==i?i:null,e.locale&&(this.locale=e.locale),e.provider){case'cloudflare_turnstile':this.captcha=new r.CloudflareTurnstile(e);break;case'recaptcha':this.captcha=new t.GoogleCaptcha(e)}}isEnabled(){return'string'==typeof this.sitekey&&''!==this.sitekey}execute(r){var t=this;return e((function*(){if(false!==t.isEnabled()&&t.provider&&t.captcha){var e=yield t.captcha.execute(r);return a.log('Receive answer from captcha provider'),{captcha_provider:t.provider,captcha_token:null!=e?e:''}}}))()}};
package/captcha/index.mjs CHANGED
@@ -1 +1 @@
1
- import e from'./../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.mjs';import{CloudflareTurnstile as r}from'./cloudflare/index.mjs';import{CaptchaError as t}from'./error.mjs';export{CaptchaError}from'./error.mjs';import{GoogleCaptcha as o}from'./google/index.mjs';import{log as i}from'./log.mjs';class CaptchaService{constructor(e){var t,i;switch(this.sitekey=null,this.provider=null,this.locale='en',this.captcha=null,this.sitekey=null!==(t=e.sitekey)&&void 0!==t?t:null,this.provider=null!==(i=e.provider)&&void 0!==i?i:null,e.locale&&(this.locale=e.locale),e.provider){case'cloudflare_turnstile':this.captcha=new r(e);break;case'recaptcha':this.captcha=new o(e)}}isEnabled(){return'string'==typeof this.sitekey&&''!==this.sitekey}execute(r){var o=this;return e((function*(){if(false!==o.isEnabled()&&o.provider&&o.captcha){var e=yield o.captcha.execute(r);if(i('Receive answer from captcha provider'),!e)throw new t("Could't get captcha token from provider "+o.provider);return{captcha_provider:o.provider,captcha_token:e}}}))()}}export{CaptchaService};
1
+ import e from'./../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.mjs';import{CloudflareTurnstile as r}from'./cloudflare/index.mjs';import{GoogleCaptcha as t}from'./google/index.mjs';import{log as i}from'./log.mjs';class CaptchaService{constructor(e){var i,a;switch(this.sitekey=null,this.provider=null,this.locale='en',this.captcha=null,this.sitekey=null!==(i=e.sitekey)&&void 0!==i?i:null,this.provider=null!==(a=e.provider)&&void 0!==a?a:null,e.locale&&(this.locale=e.locale),e.provider){case'cloudflare_turnstile':this.captcha=new r(e);break;case'recaptcha':this.captcha=new t(e)}}isEnabled(){return'string'==typeof this.sitekey&&''!==this.sitekey}execute(r){var t=this;return e((function*(){if(false!==t.isEnabled()&&t.provider&&t.captcha){var e=yield t.captcha.execute(r);return i('Receive answer from captcha provider'),{captcha_provider:t.provider,captcha_token:null!=e?e:''}}}))()}}export{CaptchaService};
package/index.d.ts CHANGED
@@ -175,8 +175,10 @@ export declare abstract class ResponseSuccessPlugin implements ResponseSuccessPl
175
175
  }
176
176
  declare const apiServiceInstance: ApiServiceInterface;
177
177
  export declare class CaptchaError extends Error {
178
- payload: {};
179
- constructor(message: string, payload?: object);
178
+ reason?: "error" | "timeout" | "expired";
179
+ code?: string;
180
+ capture?: boolean;
181
+ constructor(message: string);
180
182
  }
181
183
  type CaptchaProviderName = "recaptcha" | "cloudflare_turnstile";
182
184
  type CaptchaAnswer = {
@@ -189,11 +191,10 @@ export type CaptchaConfig = {
189
191
  provider?: CaptchaProviderName;
190
192
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
191
193
  notify?: (...args: any[]) => void;
192
- onFatalError?: (code: string) => void;
193
- onPotentiallyAutomatedError?: (code: string) => void;
194
194
  onRenderCaptcha?: (provider: CaptchaProviderName) => void;
195
195
  onSuccessChallenge?: (provider: CaptchaProviderName) => void;
196
- onFailChallenge?: (provider: CaptchaProviderName, reason: "error" | "timeout" | "expired") => void;
196
+ onErrorChallenge?: (provider: CaptchaProviderName, error: CaptchaError) => void;
197
+ onWarnChallenge?: (provider: CaptchaProviderName, error: CaptchaError) => void;
197
198
  };
198
199
  type ExecuteMeta = Record<string, unknown>;
199
200
  export interface Captcha {
package/index.js.flow CHANGED
@@ -243,8 +243,10 @@ declare export class ResponseSuccessPlugin
243
243
  }
244
244
  declare var apiServiceInstance: ApiServiceInterface;
245
245
  declare export class CaptchaError mixins Error {
246
- payload: {||};
247
- constructor(message: string, payload?: { [key: string]: any }): this;
246
+ reason?: "error" | "timeout" | "expired";
247
+ code?: string;
248
+ capture?: boolean;
249
+ constructor(message: string): this;
248
250
  }
249
251
  declare type CaptchaProviderName = "recaptcha" | "cloudflare_turnstile";
250
252
  declare type CaptchaAnswer = {|
@@ -256,13 +258,15 @@ export type CaptchaConfig = {|
256
258
  sitekey?: string,
257
259
  provider?: CaptchaProviderName,
258
260
  notify?: (...args: any[]) => void,
259
- onFatalError?: (code: string) => void,
260
- onPotentiallyAutomatedError?: (code: string) => void,
261
261
  onRenderCaptcha?: (provider: CaptchaProviderName) => void,
262
262
  onSuccessChallenge?: (provider: CaptchaProviderName) => void,
263
- onFailChallenge?: (
263
+ onErrorChallenge?: (
264
264
  provider: CaptchaProviderName,
265
- reason: "error" | "timeout" | "expired"
265
+ error: CaptchaError
266
+ ) => void,
267
+ onWarnChallenge?: (
268
+ provider: CaptchaProviderName,
269
+ error: CaptchaError
266
270
  ) => void,
267
271
  |};
268
272
  declare type ExecuteMeta = { [key: string]: mixed };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxford/services",
3
- "version": "1.2.1",
3
+ "version": "1.2.5",
4
4
  "description": "Foxford services",
5
5
  "main": "index.js",
6
6
  "module": "index.mjs",