(challenge, config = {})
| 67 | const workerUrl = URL.createObjectURL(workerBlob); |
| 68 | |
| 69 | export default function solve(challenge, config = {}) { |
| 70 | let challenges = challenge; |
| 71 | |
| 72 | if (!Array.isArray(challenges)) { |
| 73 | let i = 0; |
| 74 | |
| 75 | challenges = Array.from({ length: config.c }, () => { |
| 76 | i = i + 1; |
| 77 | |
| 78 | return [ |
| 79 | prng(`${challenges}${i}`, config.s), |
| 80 | prng(`${challenges}${i}d`, config.d), |
| 81 | ]; |
| 82 | }); |
| 83 | } |
| 84 | |
| 85 | const totalChallenges = challenges.length; |
| 86 | const numWorkers = |
| 87 | config?.workerCount || Math.min(totalChallenges, os.cpus().length); |
| 88 | |
| 89 | let challengesProcessed = 0; |
| 90 | let nextChallengeIndex = 0; |
| 91 | let activeWorkers = 0; |
| 92 | const results = new Array(totalChallenges); |
| 93 | |
| 94 | if (totalChallenges === 0) { |
| 95 | resolve([]); |
| 96 | } |
| 97 | |
| 98 | return new Promise((resolve, reject) => { |
| 99 | function startWorker() { |
| 100 | if (nextChallengeIndex < totalChallenges && activeWorkers < numWorkers) { |
| 101 | const currentChallengeIndex = nextChallengeIndex; |
| 102 | const [salt, target] = challenges[currentChallengeIndex]; |
| 103 | nextChallengeIndex++; |
| 104 | activeWorkers++; |
| 105 | |
| 106 | const worker = new Worker(workerUrl, { |
| 107 | workerData: { salt, target, challengeIndex: currentChallengeIndex }, |
| 108 | }); |
| 109 | |
| 110 | worker.on("message", (result) => { |
| 111 | worker.terminate(); |
| 112 | activeWorkers--; |
| 113 | |
| 114 | if (result.error) { |
| 115 | console.error( |
| 116 | `Error in worker for challenge ${currentChallengeIndex}:`, |
| 117 | result.error, |
| 118 | ); |
| 119 | reject(new Error(`Worker error: ${result.error}`)); |
| 120 | return; |
| 121 | } |
| 122 | |
| 123 | results[result.challengeIndex] = result.nonce; |
| 124 | challengesProcessed++; |
| 125 | |
| 126 | if (config?.onProgress) { |
nothing calls this directly
no test coverage detected