Compare commits
3 Commits
5ccbb2ef1c
...
3c6d69c343
Author | SHA1 | Date | |
---|---|---|---|
3c6d69c343 | |||
1ff71d099e | |||
ae9016fbf6 |
@ -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,31 +57,27 @@ 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,
|
() => {
|
||||||
() => {
|
Thread.terminate(proxy);
|
||||||
Thread.terminate(proxy);
|
getWorker().then((worker) => available.push(worker));
|
||||||
getWorker().then((worker) => available.push(worker));
|
return new Error("Timed out. Try reducing the number of clues.");
|
||||||
return new Error("Timed out. Try reducing the number of clues.");
|
}
|
||||||
}
|
);
|
||||||
);
|
|
||||||
|
|
||||||
available.unshift(proxy);
|
available.push(proxy);
|
||||||
prettyPrint(regionWidth, regionHeight, puzzle);
|
prettyPrint(regionWidth, regionHeight, puzzle);
|
||||||
return {
|
return {
|
||||||
regionWidth,
|
regionWidth,
|
||||||
regionHeight,
|
regionHeight,
|
||||||
size: (regionWidth * regionHeight) ** 2,
|
size: (regionWidth * regionHeight) ** 2,
|
||||||
cells: puzzle,
|
cells: puzzle,
|
||||||
};
|
};
|
||||||
} catch (err) {
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user