Compare commits

..

3 Commits

Author SHA1 Message Date
3c6d69c343 Simplified selectColumnSizeHeuristic 2021-02-25 11:16:16 -07:00
1ff71d099e Update Dockerfile 2021-02-25 11:16:16 -07:00
ae9016fbf6 Update all imports to .js for esm support, use threads.js
threads.js has better support for modules - no need to give a
project-relative path to the worker file, which complicated the build.

Add rudimentary thread pooling w/ execution timeout.
2021-02-25 11:16:16 -07:00

View File

@ -34,7 +34,15 @@ function initialize() {
} }
initialize(); initialize();
function withTimeout<T>(promise: Promise<T>, ms: number, cb: () => Error) { /**
* Awaits a promise with a timeout.
*
* @param promise the promise to await
* @param ms the timeout in milliseconds
* @param cb a callback to call when the timeout is reached. The promise is
* rejected with whatever gets returned here.
*/
function withTimeout<T>(promise: Promise<T>, ms: number, cb: () => any) {
let timeout: NodeJS.Timeout; let timeout: NodeJS.Timeout;
return new Promise<T>((resolve, reject) => { return new Promise<T>((resolve, reject) => {
timeout = setTimeout(() => { timeout = setTimeout(() => {
@ -49,13 +57,12 @@ export async function generate(
regionHeight: number, regionHeight: number,
clues: number clues: number
): Promise<Sudoku> { ): Promise<Sudoku> {
const proxy = available.shift(); const proxy = available.pop();
if (!proxy) { if (!proxy) {
throw new Error("No workers available right now. Please try again."); throw new Error("No workers available right now. Please try again.");
} }
try { const puzzle = await withTimeout<number[]>(
const puzzle: number[] = await withTimeout(
proxy.generate(regionWidth, regionHeight, clues), proxy.generate(regionWidth, regionHeight, clues),
TIMEOUT, TIMEOUT,
() => { () => {
@ -65,7 +72,7 @@ export async function generate(
} }
); );
available.unshift(proxy); available.push(proxy);
prettyPrint(regionWidth, regionHeight, puzzle); prettyPrint(regionWidth, regionHeight, puzzle);
return { return {
regionWidth, regionWidth,
@ -73,7 +80,4 @@ export async function generate(
size: (regionWidth * regionHeight) ** 2, size: (regionWidth * regionHeight) ** 2,
cells: puzzle, cells: puzzle,
}; };
} catch (err) {
throw err;
}
} }