@foxford/services 1.2.1 → 1.2.2
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 +22 -15
- package/captcha/cloudflare/index.js +1 -1
- package/captcha/cloudflare/index.mjs +1 -1
- package/captcha/google/index.js +1 -1
- package/captcha/google/index.mjs +1 -1
- package/index.d.ts +1 -1
- package/index.js.flow +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
### Captcha Service
|
|
7
7
|
|
|
8
8
|
Сервис для работы с капчей.
|
|
9
|
-
В зависимости от данных с
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
### Пример использования апи
|
|
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
|
|
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 l=require('./template.js');var i=function(){};class CloudflareTurnstile{constructor(e){var{sitekey:t,locale:r,notify:o,onFatalError:n,onPotentiallyAutomatedError:l,onRenderCaptcha:a,onSuccessChallenge:s,onFailChallenge:c}=e;this.sitekey=null,this.locale='ru',this.provider='cloudflare_turnstile',this.container=null,this.notifyHandler=i,this.onFatalError=i,this.onPotentiallyAutomatedError=i,this.onRenderCaptcha=void 0,this.onSuccessChallenge=void 0,this.onFailChallenge=void 0,this.notifyHandler=null!=o?o:i,this.sitekey=null!=t?t:null,this.onFatalError=null!=n?n:i,this.onPotentiallyAutomatedError=null!=l?l:i,this.onRenderCaptcha=null!=a?a:i,this.onSuccessChallenge=null!=s?s:i,this.onFailChallenge=null!=c?c:i,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',l),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,l)=>{var i;var a='';a=null===(i=window.turnstile)||void 0===i?void 0:i.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=>{var o;r.log("Challenge Success"),n.hide(),e(t),null===(o=window.turnstile)||void 0===o||o.remove(a)},'error-callback':e=>{var t;CloudflareTurnstile.NO_RETRY_ERROR_CODES.some((t=>e.startsWith(t)))?(l(e),null===(t=window.turnstile)||void 0===t||t.remove(a)):n.onFailChallenge(n.provider,'error',{code:e})},'expired-callback':()=>{var e;n.hide(),l('expired'),null===(e=window.turnstile)||void 0===e||e.remove(a)},language:n.locale,sitekey:n.sitekey,theme:'light','timeout-callback':()=>{var e;n.hide(),l('timeout'),null===(e=window.turnstile)||void 0===e||e.remove(a)},'unsupported-callback':()=>{var e;n.onFailChallenge(n.provider,'error'),l('110500'),null===(e=window.turnstile)||void 0===e||e.remove(a)}})}))}))()}errorHandler(e){r.log("Captcha error with code:",e);var t=[...CloudflareTurnstile.NO_RETRY_ERROR_CODES];if('string'==typeof e){var o=e;switch(true){case o.startsWith('110500'):t=t.filter((e=>!e.startsWith('110500'))),this.notify('Ваш браузер устарел. Попробуйте ещё раз, используя другой браузер или устройство.');break;case o.startsWith('110600'):t=t.filter((e=>!e.startsWith('110600'))),this.notify('Прошло слишком много времени с момента начала проверки. Попробуйте еще раз.');break;case o.startsWith('110510'):t=t.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'):t=t.filter((e=>!e.startsWith('200100'))),this.notify('Кажется, часы на вашем компьютере показывают неправильное время. Настройте часы и попробуйте ещё раз.');break;case o.startsWith('300'):case o.startsWith('600'):t=t.filter((e=>!e.startsWith('300')||!e.startsWith('600'))),this.notify('Потвердите еще раз что вы человек')}t.some((e=>o.startsWith(e)))&&this.notify("Что-то пошло не так, код ошибки — ".concat(o,". Мы уже знаем о проблеме и скоро всё поправим. Попробуйте ещё раз через некоторое время."))}else this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.')}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{r.log('Render turnstile widget'),n.onRenderCaptcha(n.provider);var e=yield n.renderWidget(o);return n.onSuccessChallenge(n.provider),e}catch(e){if(n.errorHandler(e),e instanceof Error)throw new t.CaptchaError('Could not execute captcha with error: '+e.toString());throw'string'==typeof e&&(['timeout','expired'].includes(e)?n.onFailChallenge(n.provider,e):n.onFailChallenge(n.provider,'fail',{code:e}),['crashed','undefined_error'].includes(e)||['105','110100','110110','110200'].some((t=>e.startsWith(t)))?null==n||n.onFatalError(e):['300','600'].some((t=>e.startsWith(t)))&&(null==n||n.onPotentiallyAutomatedError(e))),new t.CaptchaError(e)}}}))()}}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
|
|
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 a=function(){};class CloudflareTurnstile{constructor(e){var{sitekey:t,locale:r,notify:o,onFatalError:n,onPotentiallyAutomatedError:i,onRenderCaptcha:l,onSuccessChallenge:s,onFailChallenge:d}=e;this.sitekey=null,this.locale='ru',this.provider='cloudflare_turnstile',this.container=null,this.notifyHandler=a,this.onFatalError=a,this.onPotentiallyAutomatedError=a,this.onRenderCaptcha=void 0,this.onSuccessChallenge=void 0,this.onFailChallenge=void 0,this.notifyHandler=null!=o?o:a,this.sitekey=null!=t?t:null,this.onFatalError=null!=n?n:a,this.onPotentiallyAutomatedError=null!=i?i:a,this.onRenderCaptcha=null!=l?l:a,this.onSuccessChallenge=null!=s?s:a,this.onFailChallenge=null!=d?d:a,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;var a='';a=null===(l=window.turnstile)||void 0===l?void 0: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=>{var n;r("Challenge Success"),o.hide(),e(t),null===(n=window.turnstile)||void 0===n||n.remove(a)},'error-callback':e=>{var t;CloudflareTurnstile.NO_RETRY_ERROR_CODES.some((t=>e.startsWith(t)))?(i(e),null===(t=window.turnstile)||void 0===t||t.remove(a)):o.onFailChallenge(o.provider,'error',{code:e})},'expired-callback':()=>{var e;o.hide(),i('expired'),null===(e=window.turnstile)||void 0===e||e.remove(a)},language:o.locale,sitekey:o.sitekey,theme:'light','timeout-callback':()=>{var e;o.hide(),i('timeout'),null===(e=window.turnstile)||void 0===e||e.remove(a)},'unsupported-callback':()=>{var e;o.onFailChallenge(o.provider,'error'),i('110500'),null===(e=window.turnstile)||void 0===e||e.remove(a)}})}))}))()}errorHandler(e){r("Captcha error with code:",e);var t=[...CloudflareTurnstile.NO_RETRY_ERROR_CODES];if('string'==typeof e){var o=e;switch(true){case o.startsWith('110500'):t=t.filter((e=>!e.startsWith('110500'))),this.notify('Ваш браузер устарел. Попробуйте ещё раз, используя другой браузер или устройство.');break;case o.startsWith('110600'):t=t.filter((e=>!e.startsWith('110600'))),this.notify('Прошло слишком много времени с момента начала проверки. Попробуйте еще раз.');break;case o.startsWith('110510'):t=t.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'):t=t.filter((e=>!e.startsWith('200100'))),this.notify('Кажется, часы на вашем компьютере показывают неправильное время. Настройте часы и попробуйте ещё раз.');break;case o.startsWith('300'):case o.startsWith('600'):t=t.filter((e=>!e.startsWith('300')||!e.startsWith('600'))),this.notify('Потвердите еще раз что вы человек')}t.some((e=>o.startsWith(e)))&&this.notify("Что-то пошло не так, код ошибки — ".concat(o,". Мы уже знаем о проблеме и скоро всё поправим. Попробуйте ещё раз через некоторое время."))}else this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.')}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{r('Render turnstile widget'),n.onRenderCaptcha(n.provider);var e=yield n.renderWidget(o);return n.onSuccessChallenge(n.provider),e}catch(e){if(n.errorHandler(e),e instanceof Error)throw new t('Could not execute captcha with error: '+e.toString());throw'string'==typeof e&&(['timeout','expired'].includes(e)?n.onFailChallenge(n.provider,e):n.onFailChallenge(n.provider,'fail',{code:e}),['crashed','undefined_error'].includes(e)||['105','110100','110110','110200'].some((t=>e.startsWith(t)))?null==n||n.onFatalError(e):['300','600'].some((t=>e.startsWith(t)))&&(null==n||n.onPotentiallyAutomatedError(e))),new t(e)}}}))()}}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/google/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('../../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
|
|
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){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 s=NaN;window[d.resolve]=()=>{var r;var a=null===(r=window.grecaptcha)||void 0===r?void 0:r.getResponse(s);e(null!=a?a:''),i.remove()},window[d.error]=()=>{a('error'),i.remove()},window[d.expired]=()=>{a('expired'),i.remove()},this.onRenderCaptcha(this.provider),s=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 h=null===(c=window.grecaptcha)||void 0===c?void 0:c.execute(s);if(!h)return a(new Error('cannot call method execute from grecaptcha')),void i.remove();h.catch((e=>{a(e instanceof Error?e:new Error(e.toString())),i.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{t.log('Render Recaptcha widget'),o.onRenderCaptcha(o.provider);var e=yield o.renderWidget(r);return o.onSuccessChallenge(o.provider),e}catch(e){if(o.errorHandler(e),e instanceof Error)throw new a.CaptchaError('Could not execute captcha with error: '+e.toString());throw'string'==typeof e&&('expired'===e&&o.onFailChallenge(o.provider,'expired'),'error'===e&&o.onFailChallenge(o.provider,'fail')),new a.CaptchaError(e)}}}))()}}GoogleCaptcha.RESOLVE_FUNC_NAME='grecaptcha_resolved',GoogleCaptcha.ERROR_FUNC_NAME='grecaptcha_error',GoogleCaptcha.EXPIRED_FUNC_NAME='grecaptcha_expired',GoogleCaptcha.DEBUG=false,exports.GoogleCaptcha=GoogleCaptcha;
|
package/captcha/google/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from'./../../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.mjs';import{generateUUID as r}from'../../utils/uuid.mjs';import{CaptchaError as
|
|
1
|
+
import e from'./../../dependencies/@babel/runtime/helpers/esm/asyncToGenerator.mjs';import{generateUUID as r}from'../../utils/uuid.mjs';import{CaptchaError as t}from'../error.mjs';import{log as a}from'../log.mjs';import{NODE_ID as o}from'./constants.mjs';var n=function(){};class GoogleCaptcha{constructor(e){var{sitekey:r,locale:t,notify:a,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!=a?a: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,t&&(this.locale=t),this.addDomElements(),GoogleCaptcha.DEBUG&&(window.gr=this)}recaptchaReady(){a('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,t)=>{e.addEventListener('load',(()=>{r(true)})),e.addEventListener('error',(()=>{t()}))}))}))()}loadScript(){var r=this;return e((function*(){if(window.grecaptcha)return Promise.resolve(window.grecaptcha);var a=function(){var t=e((function*(){return yield r.appendScript("https://www.google.com/recaptcha/api.js?hl=".concat(r.locale,"&onload=onloadRecaptchaCallback"))}));return function(){return t.apply(this,arguments)}}();return new Promise(((e,o)=>{window.onloadRecaptchaCallback=()=>{r.recaptchaReady(),window.grecaptcha?e(window.grecaptcha):o(new t('Recaptcha is not available'))},a().catch((()=>o(new t('Could not load Recaptcha'))))}))}))()}notify(){this.notifyHandler&&this.notifyHandler(...arguments)}errorHandler(e){switch(a("Recaptcha error:",e),e){case'expired':this.notify('Прошло слишком много времени с момента начала проверки. Попробуйте еще раз.');break;case'timeout':this.notify('Возможно произшла ошибка с сетевым подключением. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.');break;default:this.notify('Что-то пошло не так. Попробуйте ещё раз. Если не помогает, обратитесь в поддержку.')}}renderWidget(e){return new Promise(((e,t)=>{var a,n,i;var c=document.createElement('div');var l="".concat(o,"_").concat(r());c.id=l,null===(a=document.getElementById(o))||void 0===a||a.appendChild(c);var d=this.getGrecaptchaCallbackNames();var s=NaN;window[d.resolve]=()=>{var r;var t=null===(r=window.grecaptcha)||void 0===r?void 0:r.getResponse(s);e(null!=t?t:''),c.remove()},window[d.error]=()=>{t('error'),c.remove()},window[d.expired]=()=>{t('expired'),c.remove()},this.onRenderCaptcha(this.provider),s=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 h=null===(i=window.grecaptcha)||void 0===i?void 0:i.execute(s);if(!h)return t(new Error('cannot call method execute from grecaptcha')),void c.remove();h.catch((e=>{t(e instanceof Error?e:new Error(e.toString())),c.remove()}))}))}execute(r){var o=this;return e((function*(){if(o.sitekey){if(a('Load recaptcha script'),yield o.loadScript(),!window.grecaptcha)throw new t('Recaptcha is not available in window');try{a('Render Recaptcha widget'),o.onRenderCaptcha(o.provider);var e=yield o.renderWidget(r);return o.onSuccessChallenge(o.provider),e}catch(e){if(o.errorHandler(e),e instanceof Error)throw new t('Could not execute captcha with error: '+e.toString());throw'string'==typeof e&&('expired'===e&&o.onFailChallenge(o.provider,'expired'),'error'===e&&o.onFailChallenge(o.provider,'fail')),new t(e)}}}))()}}GoogleCaptcha.RESOLVE_FUNC_NAME='grecaptcha_resolved',GoogleCaptcha.ERROR_FUNC_NAME='grecaptcha_error',GoogleCaptcha.EXPIRED_FUNC_NAME='grecaptcha_expired',GoogleCaptcha.DEBUG=false;export{GoogleCaptcha};
|
package/index.d.ts
CHANGED
|
@@ -193,7 +193,7 @@ export type CaptchaConfig = {
|
|
|
193
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
|
+
onFailChallenge?: (provider: CaptchaProviderName, reason: "fail" | "error" | "timeout" | "expired") => void;
|
|
197
197
|
};
|
|
198
198
|
type ExecuteMeta = Record<string, unknown>;
|
|
199
199
|
export interface Captcha {
|
package/index.js.flow
CHANGED
|
@@ -262,7 +262,7 @@ export type CaptchaConfig = {|
|
|
|
262
262
|
onSuccessChallenge?: (provider: CaptchaProviderName) => void,
|
|
263
263
|
onFailChallenge?: (
|
|
264
264
|
provider: CaptchaProviderName,
|
|
265
|
-
reason: "error" | "timeout" | "expired"
|
|
265
|
+
reason: "fail" | "error" | "timeout" | "expired"
|
|
266
266
|
) => void,
|
|
267
267
|
|};
|
|
268
268
|
declare type ExecuteMeta = { [key: string]: mixed };
|