(core) Add logging of errors whenever ProxyAgent is used, and a test for it.

Summary:
Also:
- Move ProxyAgent to from app/server/utils to app/server/lib, which is
  the more usual place for such classes.
- Refactor a helper (delayAbort) that node was reporting a leak in.

Test Plan: Added a test case, and tested manually.

Reviewers: JakubSerafin

Reviewed By: JakubSerafin

Subscribers: JakubSerafin, paulfitz

Differential Revision: https://phab.getgrist.com/D3897
This commit is contained in:
Dmitry S
2023-05-17 09:59:35 -04:00
parent 84854b7cfa
commit be5cb9124a
6 changed files with 106 additions and 34 deletions

View File

@@ -178,25 +178,21 @@ export function getSupportedEngineChoices(): EngineCode[]|undefined {
* Returns a promise that resolves in the given number of milliseconds or rejects
* when the given signal is raised.
*/
export function delayAbort(msec: number, signal?: AbortSignal): Promise<void> {
return new Promise<void>((resolve, reject) => {
let resolved = false;
const timeout = setTimeout(() => {
if (!resolved) {
resolved = true;
resolve();
}
}, msec);
if (signal?.addEventListener) {
signal.addEventListener('abort', (ev) => {
if (!resolved) {
resolved = true;
clearTimeout(timeout);
reject(ev);
}
});
}
});
export async function delayAbort(msec: number, signal?: AbortSignal): Promise<void> {
let cleanup: () => void = () => {};
try {
await new Promise<void>((resolve, reject) => {
const timeout = setTimeout(() => resolve(), msec);
signal?.addEventListener('abort', reject);
cleanup = () => {
// Be careful to clean up both the timer and the listener to avoid leaks.
clearTimeout(timeout);
signal?.removeEventListener('abort', reject);
};
});
} finally {
cleanup();
}
}
/**