1
1
import { getElement } from '../utils/utils.js' ;
2
2
import { removeUrlQueryParams } from '../utils/url.js' ;
3
- import { ErrorResponse , SuccessResponse } from '../types' ;
3
+ import { ErrorResponse , PirError , SuccessResponse } from '../types' ;
4
4
import { getCaptchaProvider , getCaptchaSolveProvider } from './get-captcha-provider' ;
5
5
import { captchaFactory } from './providers/registry.js' ;
6
6
import { getCaptchaInfo as getCaptchaInfoDeprecated , solveCaptcha as solveCaptchaDeprecated } from '../actions/captcha-deprecated' ;
@@ -13,20 +13,18 @@ import { getCaptchaInfo as getCaptchaInfoDeprecated, solveCaptcha as solveCaptch
13
13
*/
14
14
export function getSupportingCodeToInject ( action ) {
15
15
const { id : actionID , actionType, injectCaptchaHandler : captchaType } = action ;
16
+ const createError = ErrorResponse . generateErrorResponseFunction ( { actionID, context : 'getSupportingCodeToInject' } ) ;
16
17
if ( ! captchaType ) {
17
18
// ensures backward compatibility with old actions
18
- return new SuccessResponse ( { actionID, actionType, response : { } } ) ;
19
+ return SuccessResponse . create ( { actionID, actionType, response : { } } ) ;
19
20
}
20
21
21
22
const captchaProvider = captchaFactory . getProviderByType ( captchaType ) ;
22
23
if ( ! captchaProvider ) {
23
- return new ErrorResponse ( {
24
- actionID,
25
- message : `[injectCaptchaHandler] could not find captchaProvider with type ${ captchaType } ` ,
26
- } ) ;
24
+ return createError ( `could not find captchaProvider with type ${ captchaType } ` ) ;
27
25
}
28
26
29
- return new SuccessResponse ( { actionID, actionType, response : { code : captchaProvider . getSupportingCodeToInject ( ) } } ) ;
27
+ return SuccessResponse . create ( { actionID, actionType, response : { code : captchaProvider . getSupportingCodeToInject ( ) } } ) ;
30
28
}
31
29
32
30
/**
@@ -38,36 +36,38 @@ export function getSupportingCodeToInject(action) {
38
36
*/
39
37
export function getCaptchaInfo ( action , root = document ) {
40
38
const { id : actionID , selector, actionType, captchaType } = action ;
41
- try {
42
- if ( ! captchaType ) {
43
- // ensures backward compatibility with old actions
44
- return getCaptchaInfoDeprecated ( action , root ) ;
45
- }
46
-
47
- if ( ! selector ) {
48
- throw new Error ( 'missing selector' ) ;
49
- }
50
-
51
- const captchaContainer = getElement ( root , selector ) ;
52
- if ( ! captchaContainer ) {
53
- throw new Error ( `could not find captchaContainer with selector ${ selector } ` ) ;
54
- }
55
-
56
- const captchaProvider = getCaptchaProvider ( captchaContainer , captchaType ) ;
57
- const captchaIdentifier = captchaProvider . getCaptchaIdentifier ( captchaContainer ) ;
58
- if ( ! captchaIdentifier ) {
59
- throw new Error ( `could not extract captcha identifier from ${ captchaType } captcha` ) ;
60
- }
61
-
62
- const response = {
63
- url : removeUrlQueryParams ( window . location . href ) , // query params (which may include PII)
64
- siteKey : captchaIdentifier ,
65
- type : captchaProvider . getType ( ) ,
66
- } ;
67
- return new SuccessResponse ( { actionID, actionType, response } ) ;
68
- } catch ( e ) {
69
- return new ErrorResponse ( { actionID, message : `[getCaptchaInfo] ${ e . message } ` } ) ;
39
+ if ( ! captchaType ) {
40
+ // ensures backward compatibility with old actions
41
+ return getCaptchaInfoDeprecated ( action , root ) ;
42
+ }
43
+
44
+ const createError = ErrorResponse . generateErrorResponseFunction ( { actionID, context : `[getCaptchaInfo] captchaType: ${ captchaType } ` } ) ;
45
+ if ( ! selector ) {
46
+ return createError ( 'missing selector' ) ;
47
+ }
48
+
49
+ const captchaContainer = getElement ( root , selector ) ;
50
+ if ( ! captchaContainer ) {
51
+ return createError ( `could not find captcha container with selector ${ selector } ` ) ;
70
52
}
53
+
54
+ const captchaProvider = getCaptchaProvider ( captchaContainer , captchaType ) ;
55
+ if ( PirError . isError ( captchaProvider ) ) {
56
+ return createError ( captchaProvider . error . message ) ;
57
+ }
58
+
59
+ const captchaIdentifier = captchaProvider . getCaptchaIdentifier ( captchaContainer ) ;
60
+ if ( ! captchaIdentifier ) {
61
+ return createError ( `could not extract captcha identifier from the container with selector ${ selector } ` ) ;
62
+ }
63
+
64
+ const response = {
65
+ url : removeUrlQueryParams ( window . location . href ) , // query params (which may include PII)
66
+ siteKey : captchaIdentifier ,
67
+ type : captchaProvider . getType ( ) ,
68
+ } ;
69
+
70
+ return SuccessResponse . create ( { actionID, actionType, response } ) ;
71
71
}
72
72
73
73
/**
@@ -80,28 +80,34 @@ export function getCaptchaInfo(action, root = document) {
80
80
*/
81
81
export function solveCaptcha ( action , token , root = document ) {
82
82
const { id : actionID , actionType, captchaType } = action ;
83
- try {
84
- if ( ! captchaType ) {
85
- // ensures backward compatibility with old actions
86
- return solveCaptchaDeprecated ( action , token , root ) ;
87
- }
88
-
89
- const captchaSolveProvider = getCaptchaSolveProvider ( root , captchaType ) ;
90
- if ( ! captchaSolveProvider . canSolve ( root ) ) {
91
- throw new Error ( `[solveCaptcha] cannot solve captcha with type ${ captchaType } ` ) ;
92
- }
93
-
94
- const isTokenInjected = captchaSolveProvider . injectToken ( root , token ) ;
95
- if ( ! isTokenInjected ) {
96
- throw new Error ( `[solveCaptcha] could not inject token for captcha with type ${ captchaType } ` ) ;
97
- }
98
-
99
- return new SuccessResponse ( {
100
- actionID,
101
- actionType,
102
- response : { callback : { eval : captchaSolveProvider . getSolveCallback ( token ) } } ,
103
- } ) ;
104
- } catch ( e ) {
105
- return new ErrorResponse ( { actionID, message : `[solveCaptcha] ${ e . message } ` } ) ;
83
+ if ( ! captchaType ) {
84
+ // ensures backward compatibility with old actions
85
+ return solveCaptchaDeprecated ( action , token , root ) ;
86
+ }
87
+
88
+ const createError = ErrorResponse . generateErrorResponseFunction ( { actionID, context : `[solveCaptcha] captchaType: ${ captchaType } ` } ) ;
89
+ const captchaSolveProvider = getCaptchaSolveProvider ( root , captchaType ) ;
90
+
91
+ if ( PirError . isError ( captchaSolveProvider ) ) {
92
+ return createError ( captchaSolveProvider . error . message ) ;
93
+ }
94
+
95
+ if ( ! captchaSolveProvider . canSolve ( root ) ) {
96
+ return createError ( 'cannot solve captcha' ) ;
97
+ }
98
+
99
+ const tokenResponse = captchaSolveProvider . injectToken ( root , token ) ;
100
+ if ( PirError . isError ( tokenResponse ) ) {
101
+ return createError ( tokenResponse . error . message ) ;
106
102
}
103
+
104
+ if ( ! tokenResponse . response . injected ) {
105
+ return createError ( 'could not inject token' ) ;
106
+ }
107
+
108
+ return SuccessResponse . create ( {
109
+ actionID,
110
+ actionType,
111
+ response : { callback : { eval : captchaSolveProvider . getSolveCallback ( token ) } } ,
112
+ } ) ;
107
113
}
0 commit comments