]> git.codecow.com Git - nano-pow.git/commitdiff
Unblock CPU loop.
authorChris Duncan <chris@zoso.dev>
Wed, 18 Jun 2025 20:21:44 +0000 (13:21 -0700)
committerChris Duncan <chris@zoso.dev>
Wed, 18 Jun 2025 20:21:44 +0000 (13:21 -0700)
CPU work_generate now returns a promise and iterates a limited loop before re-calling itself on the next animation frame. This unblocks the main thread and allows the environment to reload properly, i.e. refresh the browser tab.

src/lib/generate/cpu/index.ts

index 47726afa0b1dc67e467317d3d17456bc6661a145..65c292b9ae4679731cbe185e9d42095a4d69f258 100644 (file)
@@ -3,16 +3,36 @@
 
 import { NanoPowValidate } from '#lib/validate'
 import { WorkGenerateResponse } from '#types'
-import { bigintRandom } from '#utils'
+import { bigintRandom, Logger } from '#utils'
 
-export function generate (hash: bigint, difficulty: bigint, debug: boolean): WorkGenerateResponse {
-       let result
-       do {
-               result = NanoPowValidate(bigintRandom(), hash, difficulty, debug)
-       } while (result.valid !== '1')
-       return {
-               hash: result.hash,
-               work: result.work,
-               difficulty: result.difficulty
-       }
+const logger = new Logger()
+
+export async function generate (hash: bigint, difficulty: bigint, debug: boolean): Promise<WorkGenerateResponse> {
+       logger.isEnabled = debug
+       LOG: logger.groupStart('NanoPow CPU work_generate')
+       return new Promise((resolve, reject) => {
+               const check = () => {
+                       try {
+                               LOG: logger.log('check 0x8000 nonces')
+                               let result = NanoPowValidate(bigintRandom(), hash, difficulty, false)
+                               for (let i = 0; i < 0x8000; i++) {
+                                       result = NanoPowValidate(bigintRandom(), hash, difficulty, false)
+                                       if (result.valid === '1') break
+                               }
+                               if (result.valid === '1') {
+                                       LOG: logger.groupEnd('NanoPow CPU work_generate')
+                                       resolve({
+                                               hash: result.hash,
+                                               work: result.work,
+                                               difficulty: result.difficulty
+                                       })
+                               } else {
+                                       requestAnimationFrame(check)
+                               }
+                       } catch (err) {
+                               reject(err)
+                       }
+               }
+               check()
+       })
 }