Skip to content

Commit 5a10db4

Browse files
committed
Improve error messaging
1 parent 9f49428 commit 5a10db4

File tree

10 files changed

+78
-190
lines changed

10 files changed

+78
-190
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
"vitest.disableWorkspaceWarning": true,
33
"typescript.tsdk": "node_modules/typescript/lib",
44
"remote.autoForwardPorts": false
5-
}
5+
}

bun.lock

Lines changed: 12 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/src/hooks/useRoundRobinQueries.ts

Lines changed: 0 additions & 126 deletions
This file was deleted.
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
export function proportionOf<T>(xs: T[], f: (x: T) => boolean): number {
2-
console.log(xs)
32
return xs.length ? xs.filter(f).length / xs.length : 0;
43
}

packages/config/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
export const appId = "com.shortestpathlab.tracker";
2-
export const version = "0.2.24";
2+
export const version = "0.2.25";

server/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
"react-dom": "^18",
7777
"react-email": "3.0.1",
7878
"redis-memory-server": "^0.11.0",
79+
"serialize-error": "^13.0.1",
7980
"serve-index": "^1.9.1",
8081
"sharp": "^0.33.5",
8182
"string-hash": "^1.1.3",

server/src/query/index.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { log } from "logging";
99
import { debounce, has } from "lodash";
1010
import { diskCached } from "./withDiskCache";
1111
import { get } from "models/Version";
12+
import { serializeError } from "serialize-error";
1213

1314
export const toJson = (r: Response) => r.json();
1415
export const toBlob = (r: Response) => r.blob();
@@ -54,7 +55,8 @@ export function cached<V extends z.ZodType>(
5455
} catch (e) {
5556
log.error(e, e)
5657
res.status(500).json({
57-
error: `Error occurred: ${e}`,
58+
error: `Error occurred retrieving data.`,
59+
details: serializeError(e)
5860
});
5961
}
6062
}) as RequestHandler<unknown>;
@@ -77,9 +79,9 @@ export const queryClient = <T>(model: Model<T>) => {
7779
try {
7880
res.json(await g(data));
7981
} catch (e) {
80-
log.error(e, e)
8182
res.status(500).json({
82-
error: `Error occurred in ${model.modelName} query handler: ${e}`,
83+
error: `Error occurred processing query for ${model.modelName}.`,
84+
details: serializeError(e),
8385
});
8486
}
8587
};
@@ -186,7 +188,8 @@ export const route = <T extends z.ZodType, R>(
186188
log.error("Query error", { message: has(e, "message") ? e.message : e });
187189
console.error(e);
188190
res.status(500).json({
189-
error: e,
191+
error: `Error occurred processing this request.`,
192+
details: serializeError(e),
190193
});
191194
}
192195
};

server/src/queue/usingWorker.ts

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -11,40 +11,42 @@ export const usingWorkerReusable = <R>(w: WorkerConstructor) => {
1111

1212
export const usingWorker =
1313
<R>(w: WorkerConstructor) =>
14-
async (task: (w: Worker) => Promise<R>) => {
15-
const worker = w();
16-
const out = await task(worker);
17-
worker.terminate();
18-
return out;
19-
};
14+
async (task: (w: Worker) => Promise<R>) => {
15+
const worker = w();
16+
try {
17+
return await task(worker);
18+
} finally {
19+
worker.terminate();
20+
}
21+
};
2022

2123
const createWorkerTaskFunction =
2224
(u = usingWorker) =>
23-
<T, R>(w: WorkerConstructor) => {
24-
const usingW = once(() => u<R>(w));
25-
return (inp: T) =>
26-
usingW()(
27-
(worker) =>
28-
new Promise<R>((res, rej) => {
29-
const id = randomUUIDv7();
30-
worker.postMessage({ data: inp, id });
31-
const f = (out: MessageEvent<MessageHandlerResult<R>>) => {
32-
if (out.data.id === id) {
33-
worker.removeEventListener("message", f);
34-
if (out.data.status === "success") res(out.data.result);
35-
else rej(out.data.error);
36-
}
37-
};
38-
worker.addEventListener("message", f);
39-
worker.addEventListener("error", (e) => {
40-
log.error("Worker error", { message: e.message });
41-
console.error(e);
42-
// Do not reject on error, this listener listens to general worker errors, which may not indicate the current task failing.
43-
// Task fails should result in a message that looks like { error: ErrorMessage }.
44-
});
45-
})
46-
);
47-
};
25+
<T, R>(w: WorkerConstructor) => {
26+
const usingW = once(() => u<R>(w));
27+
return (inp: T) =>
28+
usingW()(
29+
(worker) =>
30+
new Promise<R>((res, rej) => {
31+
const id = randomUUIDv7();
32+
worker.postMessage({ data: inp, id });
33+
const f = (out: MessageEvent<MessageHandlerResult<R>>) => {
34+
if (out.data.id === id) {
35+
worker.removeEventListener("message", f);
36+
if (out.data.status === "success") res(out.data.result);
37+
else rej(out.data.error);
38+
}
39+
};
40+
worker.addEventListener("message", f);
41+
worker.addEventListener("error", (e) => {
42+
log.error("Worker error", { message: e.message });
43+
console.error(e);
44+
// Do not reject on error, this listener listens to general worker errors, which may not indicate the current task failing.
45+
// Task fails should result in a message that looks like { error: ErrorMessage }.
46+
});
47+
})
48+
);
49+
};
4850

4951
export const usingWorkerTask = createWorkerTaskFunction(usingWorker);
5052

@@ -57,11 +59,11 @@ type MessageHandlerResult<U> =
5759

5860
export const usingTaskMessageHandler =
5961
<T, U>(f: (a: T) => Promise<U>) =>
60-
async (m: MessageEvent<{ id: string; data: T }>) => {
61-
try {
62-
const output = await f(m.data.data);
63-
postMessage({ status: "success", result: output, id: m.data.id });
64-
} catch (e) {
65-
postMessage({ status: "error", error: e, id: m.data.id });
66-
}
67-
};
62+
async (m: MessageEvent<{ id: string; data: T }>) => {
63+
try {
64+
const output = await f(m.data.data);
65+
postMessage({ status: "success", result: output, id: m.data.id });
66+
} catch (e) {
67+
postMessage({ status: "error", error: e, id: m.data.id });
68+
}
69+
};

0 commit comments

Comments
 (0)