@descope/flow-scripts 1.0.11 → 1.0.12
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/dist/arkose.js +1 -0
- package/dist/fingerprint.js +2 -2
- package/dist/fingerprintDescope.js +2 -2
- package/package.json +7 -7
- package/src/arkose.ts +127 -0
package/dist/arkose.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(o,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):((o="undefined"!=typeof globalThis?globalThis:o||self).descope=o.descope||{},o.descope.arkose=e())}(this,(function(){"use strict";function o(o,e,l,n){return new(l||(l=Promise))((function(s,r){function c(o){try{a(n.next(o))}catch(o){r(o)}}function t(o){try{a(n.throw(o))}catch(o){r(o)}}function a(o){var e;o.done?s(o.value):(e=o.value,e instanceof l?e:new l((function(o){o(e)}))).then(c,t)}a((n=n.apply(o,e||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;return(e,l,n)=>{let s=null,r=!1,c=!1,t=()=>{};window.onArkoseLoadCallback=o=>{console.log("Arkose callback [loaded]"),(o=>{s=o,c=!0,s.setConfig({onReady:()=>{console.log("Arkose callback [ready]"),r=!0},onError:o=>{console.log("Arkose callback [error]",o.error),t()},onFailed:o=>{console.log("Arkose callback [failed]",o.token),t()},onWarning:o=>{console.log("Arkose callback [warning]",o.warning)},onShown:o=>{console.log("Arkose callback [shown]",o)},onSuppress:o=>{console.log("Arkose callback [suppress]",o)},onCompleted:o=>{console.log("Arkose callback [completed]",o.token),n(o.token),t()}})})(o)},e.publicKey||console.error("Arkose public key is required");var a;const i=`${(a=e.clientBaseUrl||"https://client-api.arkoselabs.com/v2").endsWith("/")?a:a+"/"}${e.publicKey}/api.js`;return console.log("Arkose script loading",i),((o,e)=>{const l=document.createElement("script");l.src=o,l.id="arkose-script",l.async=!0,l.defer=!0,l.onload=e,l.setAttribute("data-callback","onArkoseLoadCallback"),document.body.appendChild(l)})(i,(()=>{console.log("Arkose script loaded"),n(null)})),{start:()=>{console.log("Arkose module start called"),c=!0},stop:()=>{console.log("Arkose module stop called"),c=!1},refresh:()=>o(void 0,void 0,void 0,(function*(){if(r){if(c)return console.log("Arkose module refresh called"),s.run(),new Promise((o=>{t=()=>{console.log("Arkose module finish called"),t=()=>{},o(null)}}));console.log("Arkose module refresh skipped")}else console.log("Arkose module not ready yet")})),timeout:()=>r&&c?12e4:0}}}));
|
package/dist/fingerprint.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,
|
|
2
|
-
/*! Source: (c) FingerprintJS and other contributors | https://dev.fingerprint.com/ */return(
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):((e="undefined"!=typeof globalThis?globalThis:e||self).descope=e.descope||{},e.descope.fingerprint=t())}(this,(function(){"use strict";function e(e,t,n,r){return new(n||(n=Promise))((function(o,i){function c(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(c,s)}u((r=r.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const t={default:"endpoint"},n="Blocked by CSP",r="The endpoint parameter is not a valid URL";const o="Failed to load the JS script of the agent",i="9319";function c(e,t){const c=[],[s,u]=function(e){const t=function(e){const t=[...e];return{current:()=>t[0],postpone(){const e=t.shift();void 0!==e&&t.push(e)},exclude(){t.shift()}}}(e),c=function(){let e=0;return()=>Math.random()*Math.min(3e3,100*Math.pow(2,e++))}(),s=new Set;return[t.current(),(e,u)=>{let l;const a=u instanceof Error?u.message:"";if(a===n||a===r)t.exclude(),l=0;else if(a===i)t.exclude();else if(a===o){const n=Date.now()-e.getTime()<50,r=t.current();r&&n&&!s.has(r)&&(s.add(r),l=0),t.postpone()}else t.postpone();const d=t.current();return void 0===d?void 0:[d,null!=l?l:e.getTime()+c()-Date.now()]}]}(e);let l;if(void 0===s)return Promise.reject(new TypeError("The list of script URL patterns is empty"));const a=e=>{const n=new Date,r=t=>c.push({url:e,startedAt:n,finishedAt:new Date,error:t}),o=t(e);return o.then((()=>r()),r),o.catch((e=>{if(null!=l||(l=e),c.length>=5)throw l;const t=u(n,e);if(!t)throw l;const[r,o]=t;return(i=o,new Promise((e=>setTimeout(e,i)))).then((()=>a(r)));var i}))};return a(s).then((e=>[e,c]))}const s="https://fpnpmcdn.net/v<version>/<apiKey>/loader_v<loaderVersion>.js",u=s;function l(e){var t,n;const{picked:r,rest:u}=function(e,t){const n={},r={};for(const[o,i]of Object.entries(e))t.includes(o)?n[o]=i:r[o]=i;return{picked:n,rest:r}}(e,["scriptUrlPattern","token","apiKey"]),l=r.token,d=null!==(t=r.apiKey)&&void 0!==t?t:l,p=null!==(n=function(e,t){return function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}(e,t)?e[t]:void 0}(e,"scriptUrlPattern"))&&void 0!==n?n:s,[f,h]=function(){const e=[],t=()=>{e.push({time:new Date,state:document.visibilityState})},n=function(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}(document,"visibilitychange",t);return t(),[e,n]}();return Promise.resolve().then((()=>{if(!d||"string"!=typeof d)throw new Error("API key required");const e=function(e,t){return(Array.isArray(e)?e:[e]).map((e=>function(e,t){const n=encodeURIComponent;return e.replace(/<[^<>]+>/g,(e=>"<version>"===e?"3":"<apiKey>"===e?n(t):"<loaderVersion>"===e?n("3.12.1"):e))}(String(e),t)))}(p,d);return c(e,a)})).catch((e=>{throw h(),function(e){return e instanceof Error&&e.message===i?new Error(o):e}(e)})).then((([e,t])=>(h(),e.load({...u,ldi:{attempts:t,visibilityStates:f}}))))}function a(e){return function(e,t,n){const r=document,o="securitypolicyviolation";let i;const c=t=>{const n=new URL(e,location.href),{blockedURI:r}=t;r!==n.href&&r!==n.protocol.slice(0,-1)&&r!==n.origin||(i=t,s())};r.addEventListener(o,c);const s=()=>r.removeEventListener(o,c);return Promise.resolve().then(t).then((e=>(s(),e)),(e=>new Promise((e=>{const t=new MessageChannel;t.port1.onmessage=()=>e(),t.port2.postMessage(null)})).then((()=>{if(s(),i)return n(i);throw e}))))}(e,(()=>function(e){return new Promise(((t,n)=>{if(function(e){if(URL.prototype)try{return new URL(e,location.href),!1}catch(e){if(e instanceof Error&&"TypeError"===e.name)return!0;throw e}}(e))throw new Error(r);const i=document.createElement("script"),c=()=>{var e;return null===(e=i.parentNode)||void 0===e?void 0:e.removeChild(i)},s=document.head||document.getElementsByTagName("head")[0];i.onload=()=>{c(),t()},i.onerror=()=>{c(),n(new Error(o))},i.async=!0,i.src=e,s.appendChild(i)}))}(e)),(()=>{throw new Error(n)})).then(d)}function d(){const e=window,t="__fpjs_p_l_b",n=e[t];if(function(e,t){var n;const r=null===(n=Object.getOwnPropertyDescriptor)||void 0===n?void 0:n.call(Object,e,t);(null==r?void 0:r.configurable)?delete e[t]:r&&!r.writable||(e[t]=void 0)}(e,t),"function"!=typeof(null==n?void 0:n.load))throw new Error(i);return n}
|
|
2
|
+
/*! Source: (c) FingerprintJS and other contributors | https://dev.fingerprint.com/ */return(n,r,o)=>e(void 0,void 0,void 0,(function*(){try{const{publicApiKey:e,useCloudflareIntegration:r,cloudflareScriptUrl:i,cloudflareEndpointUrl:c}=n;let s=[];s=r&&c?[c,t]:[t];let a=[];if(r&&i){const e=new URL(i);a=[`${e.toString()}?apiKey=<apiKey>&version=<version>&loaderVersion=<loaderVersion>`,u]}else a=[u];const d=l({apiKey:e,endpoint:s,scriptUrlPattern:a}),p=yield d,{requestId:f}=yield p.get();o(f)}catch(e){console.warn("Could not load fingerprint",e)}}))}));
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,
|
|
2
|
-
/*! Source: (c) FingerprintJS and other contributors | https://dev.fingerprint.com/ */return(
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):((e="undefined"!=typeof globalThis?globalThis:e||self).descope=e.descope||{},e.descope.fingerprintDescope=t())}(this,(function(){"use strict";function e(e,t,n,o){return new(n||(n=Promise))((function(r,i){function c(e){try{a(o.next(e))}catch(e){i(e)}}function s(e){try{a(o.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(c,s)}a((o=o.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const t={default:"endpoint"},n="Blocked by CSP",o="The endpoint parameter is not a valid URL";const r="Failed to load the JS script of the agent",i="9319";function c(e,t){const c=[],[s,a]=function(e){const t=function(e){const t=[...e];return{current:()=>t[0],postpone(){const e=t.shift();void 0!==e&&t.push(e)},exclude(){t.shift()}}}(e),c=function(){let e=0;return()=>Math.random()*Math.min(3e3,100*Math.pow(2,e++))}(),s=new Set;return[t.current(),(e,a)=>{let u;const l=a instanceof Error?a.message:"";if(l===n||l===o)t.exclude(),u=0;else if(l===i)t.exclude();else if(l===r){const n=Date.now()-e.getTime()<50,o=t.current();o&&n&&!s.has(o)&&(s.add(o),u=0),t.postpone()}else t.postpone();const d=t.current();return void 0===d?void 0:[d,null!=u?u:e.getTime()+c()-Date.now()]}]}(e);let u;if(void 0===s)return Promise.reject(new TypeError("The list of script URL patterns is empty"));const l=e=>{const n=new Date,o=t=>c.push({url:e,startedAt:n,finishedAt:new Date,error:t}),r=t(e);return r.then((()=>o()),o),r.catch((e=>{if(null!=u||(u=e),c.length>=5)throw u;const t=a(n,e);if(!t)throw u;const[o,r]=t;return(i=r,new Promise((e=>setTimeout(e,i)))).then((()=>l(o)));var i}))};return l(s).then((e=>[e,c]))}const s="https://fpnpmcdn.net/v<version>/<apiKey>/loader_v<loaderVersion>.js",a=s;function u(e){var t,n;const{picked:o,rest:a}=function(e,t){const n={},o={};for(const[r,i]of Object.entries(e))t.includes(r)?n[r]=i:o[r]=i;return{picked:n,rest:o}}(e,["scriptUrlPattern","token","apiKey"]),u=o.token,d=null!==(t=o.apiKey)&&void 0!==t?t:u,p=null!==(n=function(e,t){return function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}(e,t)?e[t]:void 0}(e,"scriptUrlPattern"))&&void 0!==n?n:s,[f,h]=function(){const e=[],t=()=>{e.push({time:new Date,state:document.visibilityState})},n=function(e,t,n,o){return e.addEventListener(t,n,o),()=>e.removeEventListener(t,n,o)}(document,"visibilitychange",t);return t(),[e,n]}();return Promise.resolve().then((()=>{if(!d||"string"!=typeof d)throw new Error("API key required");const e=function(e,t){return(Array.isArray(e)?e:[e]).map((e=>function(e,t){const n=encodeURIComponent;return e.replace(/<[^<>]+>/g,(e=>"<version>"===e?"3":"<apiKey>"===e?n(t):"<loaderVersion>"===e?n("3.12.1"):e))}(String(e),t)))}(p,d);return c(e,l)})).catch((e=>{throw h(),function(e){return e instanceof Error&&e.message===i?new Error(r):e}(e)})).then((([e,t])=>(h(),e.load({...a,ldi:{attempts:t,visibilityStates:f}}))))}function l(e){return function(e,t,n){const o=document,r="securitypolicyviolation";let i;const c=t=>{const n=new URL(e,location.href),{blockedURI:o}=t;o!==n.href&&o!==n.protocol.slice(0,-1)&&o!==n.origin||(i=t,s())};o.addEventListener(r,c);const s=()=>o.removeEventListener(r,c);return Promise.resolve().then(t).then((e=>(s(),e)),(e=>new Promise((e=>{const t=new MessageChannel;t.port1.onmessage=()=>e(),t.port2.postMessage(null)})).then((()=>{if(s(),i)return n(i);throw e}))))}(e,(()=>function(e){return new Promise(((t,n)=>{if(function(e){if(URL.prototype)try{return new URL(e,location.href),!1}catch(e){if(e instanceof Error&&"TypeError"===e.name)return!0;throw e}}(e))throw new Error(o);const i=document.createElement("script"),c=()=>{var e;return null===(e=i.parentNode)||void 0===e?void 0:e.removeChild(i)},s=document.head||document.getElementsByTagName("head")[0];i.onload=()=>{c(),t()},i.onerror=()=>{c(),n(new Error(r))},i.async=!0,i.src=e,s.appendChild(i)}))}(e)),(()=>{throw new Error(n)})).then(d)}function d(){const e=window,t="__fpjs_p_l_b",n=e[t];if(function(e,t){var n;const o=null===(n=Object.getOwnPropertyDescriptor)||void 0===n?void 0:n.call(Object,e,t);(null==o?void 0:o.configurable)?delete e[t]:o&&!o.writable||(e[t]=void 0)}(e,t),"function"!=typeof(null==n?void 0:n.load))throw new Error(i);return n}
|
|
2
|
+
/*! Source: (c) FingerprintJS and other contributors | https://dev.fingerprint.com/ */return(n,o,r)=>e(void 0,void 0,void 0,(function*(){try{const{customDomain:e,publicApiKey:i,cloudflareEndpointPath:c,cloudflareScriptPath:s}=n,{baseUrl:l}=o;let d;d=e?`https://${e}`:l||"https://api.descope.com";const p=new URL(d);p.pathname=c;const f=new URL(d);f.pathname=s;const h=`${f.toString()}?apiKey=<apiKey>&version=<version>&loaderVersion=<loaderVersion>`,v=u({apiKey:i,endpoint:[p.toString(),t],scriptUrlPattern:[h,a]}),m=yield v,{requestId:w}=yield m.get();r(w)}catch(e){console.warn("Could not load descope fingerprint",e)}}))}));
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@descope/flow-scripts",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.12",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/descope/content"
|
|
@@ -18,19 +18,19 @@
|
|
|
18
18
|
"@rollup/plugin-node-resolve": "16.0.1",
|
|
19
19
|
"@rollup/plugin-terser": "0.4.4",
|
|
20
20
|
"@rollup/plugin-typescript": "12.1.4",
|
|
21
|
-
"@testing-library/dom": "10.4.
|
|
21
|
+
"@testing-library/dom": "10.4.1",
|
|
22
22
|
"@testing-library/react": "16.3.0",
|
|
23
23
|
"@types/jest": "29.5.14",
|
|
24
|
-
"eslint": "9.
|
|
24
|
+
"eslint": "9.35.0",
|
|
25
25
|
"eslint-plugin-import": "2.32.0",
|
|
26
26
|
"jest": "29.7.0",
|
|
27
27
|
"jest-environment-jsdom": "29.7.0",
|
|
28
|
-
"rollup": "4.
|
|
29
|
-
"ts-jest": "29.4.
|
|
28
|
+
"rollup": "4.52.4",
|
|
29
|
+
"ts-jest": "29.4.4",
|
|
30
30
|
"ts-node": "10.9.2",
|
|
31
|
-
"typescript": "5.
|
|
31
|
+
"typescript": "5.9.2"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@fingerprintjs/fingerprintjs-pro": "3.
|
|
34
|
+
"@fingerprintjs/fingerprintjs-pro": "3.12.1"
|
|
35
35
|
}
|
|
36
36
|
}
|
package/src/arkose.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
const ARKOSE_DEFAULT_CLIENT_BASE_URL = 'https://client-api.arkoselabs.com/v2';
|
|
2
|
+
const ARKOSE_ENFORCEMENT_TIMEOUT_MS = 2 * 60 * 1000; // 2 minutes
|
|
3
|
+
|
|
4
|
+
function ensureTrailingSlash(url: string): string {
|
|
5
|
+
return url.endsWith('/') ? url : url + '/';
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const loadScript = (src: string, onLoad: () => void) => {
|
|
9
|
+
const script = document.createElement('script');
|
|
10
|
+
script.src = src;
|
|
11
|
+
script.id = 'arkose-script';
|
|
12
|
+
script.async = true;
|
|
13
|
+
script.defer = true;
|
|
14
|
+
script.onload = onLoad;
|
|
15
|
+
script.setAttribute('data-callback', 'onArkoseLoadCallback');
|
|
16
|
+
document.body.appendChild(script);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const loadArkose = (
|
|
20
|
+
initArgs: { publicKey: string; clientBaseUrl?: string },
|
|
21
|
+
_inputs: { baseUrl?: string; ref: any },
|
|
22
|
+
onTokenReady: (token: string | null) => void,
|
|
23
|
+
) => {
|
|
24
|
+
let enforcement: any = null;
|
|
25
|
+
let ready = false;
|
|
26
|
+
let active = false;
|
|
27
|
+
let finish = () => {};
|
|
28
|
+
|
|
29
|
+
const setup = (instance: any) => {
|
|
30
|
+
enforcement = instance;
|
|
31
|
+
active = true;
|
|
32
|
+
enforcement.setConfig({
|
|
33
|
+
onReady: () => {
|
|
34
|
+
console.log('Arkose callback [ready]');
|
|
35
|
+
ready = true;
|
|
36
|
+
},
|
|
37
|
+
onError: (response) => {
|
|
38
|
+
console.log('Arkose callback [error]', response.error);
|
|
39
|
+
finish();
|
|
40
|
+
},
|
|
41
|
+
onFailed: (response) => {
|
|
42
|
+
console.log('Arkose callback [failed]', response.token);
|
|
43
|
+
finish();
|
|
44
|
+
},
|
|
45
|
+
onWarning: (response) => {
|
|
46
|
+
console.log('Arkose callback [warning]', response.warning);
|
|
47
|
+
},
|
|
48
|
+
onShown: (response) => {
|
|
49
|
+
console.log('Arkose callback [shown]', response);
|
|
50
|
+
},
|
|
51
|
+
onSuppress: (response) => {
|
|
52
|
+
console.log('Arkose callback [suppress]', response);
|
|
53
|
+
},
|
|
54
|
+
onCompleted: (response) => {
|
|
55
|
+
console.log('Arkose callback [completed]', response.token);
|
|
56
|
+
onTokenReady(response.token);
|
|
57
|
+
finish();
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// on flow state update, set the flag so we know to use enforcement on the next refresh
|
|
63
|
+
const start = () => {
|
|
64
|
+
console.log('Arkose module start called');
|
|
65
|
+
active = true;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// after submit, we stop profiling
|
|
69
|
+
const stop = () => {
|
|
70
|
+
console.log('Arkose module stop called');
|
|
71
|
+
active = false;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// before submit, run the enforcement, but only if the script is active
|
|
75
|
+
const refresh = async () => {
|
|
76
|
+
if (!ready) {
|
|
77
|
+
console.log('Arkose module not ready yet');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (!active) {
|
|
81
|
+
console.log('Arkose module refresh skipped');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
console.log('Arkose module refresh called');
|
|
85
|
+
enforcement.run();
|
|
86
|
+
return new Promise((resolve) => {
|
|
87
|
+
finish = () => {
|
|
88
|
+
console.log('Arkose module finish called');
|
|
89
|
+
finish = () => {};
|
|
90
|
+
resolve(null);
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// override the default refresh timeout of 5 seconds to 2 minutes to allow time for the
|
|
96
|
+
// user to complete the Arkose enforcement challenge
|
|
97
|
+
const timeout = () => {
|
|
98
|
+
return (ready && active) ? ARKOSE_ENFORCEMENT_TIMEOUT_MS : 0;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// a custom callback that's invoked by the Arkose script when it's loaded
|
|
102
|
+
(window as any).onArkoseLoadCallback = (instance) => {
|
|
103
|
+
console.log('Arkose callback [loaded]');
|
|
104
|
+
setup(instance);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
if (!initArgs.publicKey) {
|
|
108
|
+
console.error('Arkose public key is required');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// compose the Arkose script URL from the base URL and the public key
|
|
112
|
+
const scriptBaseUrl = ensureTrailingSlash(
|
|
113
|
+
initArgs.clientBaseUrl || ARKOSE_DEFAULT_CLIENT_BASE_URL,
|
|
114
|
+
);
|
|
115
|
+
const scriptUrl = `${scriptBaseUrl}${initArgs.publicKey}/api.js`;
|
|
116
|
+
|
|
117
|
+
// load the Arkose script, and reset the token to null as an initial state
|
|
118
|
+
console.log('Arkose script loading', scriptUrl);
|
|
119
|
+
loadScript(scriptUrl, () => {
|
|
120
|
+
console.log('Arkose script loaded');
|
|
121
|
+
onTokenReady(null);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
return { start, stop, refresh, timeout };
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export default loadArkose;
|