Compare commits

..

4 Commits

Author SHA1 Message Date
5ccbb2ef1c Simplified selectColumnSizeHeuristic 2021-02-25 00:49:41 -07:00
da1405f262 Update Dockerfile 2021-02-25 00:38:11 -07:00
2f8801bae6 Worker threads message 2021-02-25 00:37:54 -07:00
67ec0d5430 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 00:34:34 -07:00

View File

@ -34,15 +34,7 @@ function initialize() {
}
initialize();
/**
* 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) {
function withTimeout<T>(promise: Promise<T>, ms: number, cb: () => Error) {
let timeout: NodeJS.Timeout;
return new Promise<T>((resolve, reject) => {
timeout = setTimeout(() => {
@ -57,12 +49,13 @@ export async function generate(
regionHeight: number,
clues: number
): Promise<Sudoku> {
const proxy = available.pop();
const proxy = available.shift();
if (!proxy) {
throw new Error("No workers available right now. Please try again.");
}
const puzzle = await withTimeout<number[]>(
try {
const puzzle: number[] = await withTimeout(
proxy.generate(regionWidth, regionHeight, clues),
TIMEOUT,
() => {
@ -72,7 +65,7 @@ export async function generate(
}
);
available.push(proxy);
available.unshift(proxy);
prettyPrint(regionWidth, regionHeight, puzzle);
return {
regionWidth,
@ -80,4 +73,7 @@ export async function generate(
size: (regionWidth * regionHeight) ** 2,
cells: puzzle,
};
} catch (err) {
throw err;
}
}