@swetrix/captcha 2.0.2 → 2.3.0

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.
Files changed (46) hide show
  1. package/README.md +72 -5
  2. package/dist/captcha-loader.cjs +333 -0
  3. package/dist/captcha-loader.cjs.map +1 -0
  4. package/dist/captcha-loader.esm.js +327 -0
  5. package/dist/captcha-loader.esm.js.map +1 -0
  6. package/dist/captcha-loader.js +1 -1
  7. package/dist/captcha-loader.js.map +1 -1
  8. package/dist/captcha.js +1 -1
  9. package/dist/captcha.js.map +1 -1
  10. package/dist/esnext/captcha-loader.d.ts +10 -0
  11. package/dist/esnext/captcha-loader.js +315 -0
  12. package/dist/esnext/captcha-loader.js.map +1 -0
  13. package/dist/esnext/captcha.d.ts +10 -0
  14. package/dist/esnext/captcha.js +491 -0
  15. package/dist/esnext/captcha.js.map +1 -0
  16. package/dist/esnext/i18n.d.ts +22 -0
  17. package/dist/esnext/i18n.js +110 -0
  18. package/dist/esnext/i18n.js.map +1 -0
  19. package/dist/esnext/index.d.ts +7 -0
  20. package/dist/esnext/index.js +7 -0
  21. package/dist/esnext/index.js.map +1 -0
  22. package/dist/esnext/logger.d.ts +6 -0
  23. package/dist/esnext/logger.js +8 -0
  24. package/dist/esnext/logger.js.map +1 -0
  25. package/dist/esnext/pow-worker.d.ts +1 -0
  26. package/dist/esnext/pow-worker.js +127 -0
  27. package/dist/esnext/pow-worker.js.map +1 -0
  28. package/dist/pages/dark.html +461 -276
  29. package/dist/pages/light.html +463 -278
  30. package/dist/pages/test.html +26 -27
  31. package/package.json +58 -32
  32. package/.nvmrc +0 -1
  33. package/.prettierrc.js +0 -13
  34. package/dist/assets/logo_blue.png +0 -0
  35. package/dist/assets/logo_white.png +0 -0
  36. package/rollup.config.mjs +0 -83
  37. package/src/assets/logo_blue.png +0 -0
  38. package/src/assets/logo_white.png +0 -0
  39. package/src/captcha-loader.ts +0 -212
  40. package/src/captcha.ts +0 -358
  41. package/src/pages/dark.html +0 -284
  42. package/src/pages/light.html +0 -286
  43. package/src/pages/test.html +0 -33
  44. package/src/pow-worker.ts +0 -178
  45. package/tsconfig.esnext.json +0 -15
  46. package/tsconfig.json +0 -14
@@ -0,0 +1,7 @@
1
+ import { forceLoadCaptcha, loadCaptcha } from './captcha-loader';
2
+ export { forceLoadCaptcha, loadCaptcha };
3
+ declare const _default: {
4
+ forceLoadCaptcha: () => void;
5
+ loadCaptcha: (forced?: boolean) => void;
6
+ };
7
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import { forceLoadCaptcha, loadCaptcha } from './captcha-loader';
2
+ export { forceLoadCaptcha, loadCaptcha };
3
+ export default {
4
+ forceLoadCaptcha,
5
+ loadCaptcha,
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEhE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAA;AAExC,eAAe;IACb,gBAAgB;IAChB,WAAW;CACZ,CAAA"}
@@ -0,0 +1,6 @@
1
+ export declare const logger: {
2
+ readonly log: (...args: unknown[]) => void;
3
+ readonly error: (...args: unknown[]) => void;
4
+ readonly warn: (...args: unknown[]) => void;
5
+ readonly info: (...args: unknown[]) => void;
6
+ };
@@ -0,0 +1,8 @@
1
+ const PREFIX = '[Swetrix Captcha]';
2
+ export const logger = {
3
+ log: (...args) => console.log(PREFIX, ...args),
4
+ error: (...args) => console.error(PREFIX, ...args),
5
+ warn: (...args) => console.warn(PREFIX, ...args),
6
+ info: (...args) => console.info(PREFIX, ...args),
7
+ };
8
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,mBAAmB,CAAA;AAElC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IACzD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7D,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3D,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;CACnD,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,127 @@
1
+ // PoW Worker - Computes the proof-of-work solution in a background thread
2
+ // Maximum allowed difficulty to prevent excessive computation
3
+ const MAX_DIFFICULTY = 32;
4
+ // Default maximum iterations to prevent infinite loops (100 million)
5
+ const DEFAULT_MAX_ITERATIONS = 100000000;
6
+ // SHA-256 implementation using SubtleCrypto
7
+ async function sha256(message) {
8
+ const encoder = new TextEncoder();
9
+ const data = encoder.encode(message);
10
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
11
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
12
+ return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
13
+ }
14
+ // Check if hash has required number of leading zeros
15
+ function hasValidPrefix(hash, difficulty) {
16
+ for (let i = 0; i < difficulty; i++) {
17
+ if (hash[i] !== '0') {
18
+ return false;
19
+ }
20
+ }
21
+ return true;
22
+ }
23
+ // Solve the PoW challenge
24
+ async function solveChallenge(challenge, difficulty, maxIterations) {
25
+ let nonce = 0;
26
+ const startTime = Date.now();
27
+ const progressInterval = 10000; // Report progress every 10k attempts
28
+ while (nonce < maxIterations) {
29
+ const input = `${challenge}:${nonce}`;
30
+ const hash = await sha256(input);
31
+ if (hasValidPrefix(hash, difficulty)) {
32
+ // Found the solution!
33
+ const result = {
34
+ type: 'result',
35
+ nonce,
36
+ solution: hash,
37
+ };
38
+ self.postMessage(result);
39
+ return;
40
+ }
41
+ nonce++;
42
+ // Report progress periodically
43
+ if (nonce % progressInterval === 0) {
44
+ const elapsedMs = Date.now() - startTime;
45
+ const elapsed = elapsedMs / 1000;
46
+ const hashRate = Math.round(nonce / elapsed);
47
+ const progress = {
48
+ type: 'progress',
49
+ attempts: nonce,
50
+ hashRate,
51
+ };
52
+ self.postMessage(progress);
53
+ }
54
+ }
55
+ // Max iterations reached - send timeout message
56
+ const elapsedMs = Date.now() - startTime;
57
+ const elapsed = elapsedMs / 1000;
58
+ const hashRate = elapsed > 0 ? Math.round(nonce / elapsed) : 0;
59
+ const timeout = {
60
+ type: 'timeout',
61
+ reason: `Maximum iterations reached (${maxIterations.toLocaleString()})`,
62
+ attempts: nonce,
63
+ elapsedMs,
64
+ hashRate,
65
+ };
66
+ self.postMessage(timeout);
67
+ }
68
+ // Listen for messages from the main thread
69
+ self.onmessage = async (event) => {
70
+ // Validate event.data exists
71
+ if (!event.data) {
72
+ const error = {
73
+ type: 'error',
74
+ message: 'Invalid message: event.data is missing or empty',
75
+ };
76
+ self.postMessage(error);
77
+ return;
78
+ }
79
+ const { challenge, difficulty, maxIterations } = event.data;
80
+ // Validate challenge is provided and is a non-empty string
81
+ if (typeof challenge !== 'string' || challenge.length === 0) {
82
+ const error = {
83
+ type: 'error',
84
+ message: 'Invalid message: challenge must be a non-empty string',
85
+ };
86
+ self.postMessage(error);
87
+ return;
88
+ }
89
+ // Validate difficulty is a positive integer within acceptable range
90
+ if (typeof difficulty !== 'number' || !Number.isInteger(difficulty)) {
91
+ const error = {
92
+ type: 'error',
93
+ message: 'Invalid message: difficulty must be an integer',
94
+ };
95
+ self.postMessage(error);
96
+ return;
97
+ }
98
+ if (difficulty < 1 || difficulty > MAX_DIFFICULTY) {
99
+ const error = {
100
+ type: 'error',
101
+ message: `Invalid message: difficulty must be between 1 and ${MAX_DIFFICULTY}`,
102
+ };
103
+ self.postMessage(error);
104
+ return;
105
+ }
106
+ // Validate maxIterations if provided
107
+ const effectiveMaxIterations = maxIterations ?? DEFAULT_MAX_ITERATIONS;
108
+ if (typeof effectiveMaxIterations !== 'number' || !Number.isInteger(effectiveMaxIterations)) {
109
+ const error = {
110
+ type: 'error',
111
+ message: 'Invalid message: maxIterations must be an integer',
112
+ };
113
+ self.postMessage(error);
114
+ return;
115
+ }
116
+ if (effectiveMaxIterations < 1) {
117
+ const error = {
118
+ type: 'error',
119
+ message: 'Invalid message: maxIterations must be at least 1',
120
+ };
121
+ self.postMessage(error);
122
+ return;
123
+ }
124
+ await solveChallenge(challenge, difficulty, effectiveMaxIterations);
125
+ };
126
+ export {};
127
+ //# sourceMappingURL=pow-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pow-worker.js","sourceRoot":"","sources":["../../src/pow-worker.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAE1E,8DAA8D;AAC9D,MAAM,cAAc,GAAG,EAAE,CAAA;AAEzB,qEAAqE;AACrE,MAAM,sBAAsB,GAAG,SAAW,CAAA;AAmC1C,4CAA4C;AAC5C,KAAK,UAAU,MAAM,CAAC,OAAe;IACnC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IACjC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACpC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;IACxD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACvE,CAAC;AAED,qDAAqD;AACrD,SAAS,cAAc,CAAC,IAAY,EAAE,UAAkB;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpB,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,0BAA0B;AAC1B,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,UAAkB,EAAE,aAAqB;IACxF,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,MAAM,gBAAgB,GAAG,KAAK,CAAA,CAAC,qCAAqC;IAEpE,OAAO,KAAK,GAAG,aAAa,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,KAAK,EAAE,CAAA;QACrC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;QAEhC,IAAI,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;YACrC,sBAAsB;YACtB,MAAM,MAAM,GAAc;gBACxB,IAAI,EAAE,QAAQ;gBACd,KAAK;gBACL,QAAQ,EAAE,IAAI;aACf,CAAA;YACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;YACxB,OAAM;QACR,CAAC;QAED,KAAK,EAAE,CAAA;QAEP,+BAA+B;QAC/B,IAAI,KAAK,GAAG,gBAAgB,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;YACxC,MAAM,OAAO,GAAG,SAAS,GAAG,IAAI,CAAA;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,CAAA;YAC5C,MAAM,QAAQ,GAAgB;gBAC5B,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,KAAK;gBACf,QAAQ;aACT,CAAA;YACD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;IACxC,MAAM,OAAO,GAAG,SAAS,GAAG,IAAI,CAAA;IAChC,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9D,MAAM,OAAO,GAAe;QAC1B,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,+BAA+B,aAAa,CAAC,cAAc,EAAE,GAAG;QACxE,QAAQ,EAAE,KAAK;QACf,SAAS;QACT,QAAQ;KACT,CAAA;IACD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;AAC3B,CAAC;AAED,2CAA2C;AAC3C,IAAI,CAAC,SAAS,GAAG,KAAK,EAAE,KAAiC,EAAE,EAAE;IAC3D,6BAA6B;IAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,KAAK,GAAa;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,iDAAiD;SAC3D,CAAA;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACvB,OAAM;IACR,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,IAAI,CAAA;IAE3D,2DAA2D;IAC3D,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAa;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,uDAAuD;SACjE,CAAA;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACvB,OAAM;IACR,CAAC;IAED,oEAAoE;IACpE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,MAAM,KAAK,GAAa;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,gDAAgD;SAC1D,CAAA;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACvB,OAAM;IACR,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,cAAc,EAAE,CAAC;QAClD,MAAM,KAAK,GAAa;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,qDAAqD,cAAc,EAAE;SAC/E,CAAA;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACvB,OAAM;IACR,CAAC;IAED,qCAAqC;IACrC,MAAM,sBAAsB,GAAG,aAAa,IAAI,sBAAsB,CAAA;IACtE,IAAI,OAAO,sBAAsB,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC5F,MAAM,KAAK,GAAa;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,mDAAmD;SAC7D,CAAA;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACvB,OAAM;IACR,CAAC;IAED,IAAI,sBAAsB,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAa;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,mDAAmD;SAC7D,CAAA;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACvB,OAAM;IACR,CAAC;IAED,MAAM,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,sBAAsB,CAAC,CAAA;AACrE,CAAC,CAAA"}