summaryrefslogtreecommitdiff
path: root/packages/backend/src/misc
diff options
context:
space:
mode:
authorKagami Sascha Rosylight <saschanaz@outlook.com>2024-01-08 04:28:13 +0100
committerGitHub <noreply@github.com>2024-01-08 12:28:13 +0900
commit0c2118e9630939eb709c84049bdc8e0fbae8ec11 (patch)
tree46fcbd78dfabc5e7062db6826207f3fc34c93d61 /packages/backend/src/misc
parentrefactor(frontend): extract game engine from vue component (diff)
downloadmisskey-0c2118e9630939eb709c84049bdc8e0fbae8ec11.tar.gz
misskey-0c2118e9630939eb709c84049bdc8e0fbae8ec11.tar.bz2
misskey-0c2118e9630939eb709c84049bdc8e0fbae8ec11.zip
refactor: make sure promises are settled before app shutdown (#12942)
👍
Diffstat (limited to 'packages/backend/src/misc')
-rw-r--r--packages/backend/src/misc/promise-tracker.ts23
1 files changed, 23 insertions, 0 deletions
diff --git a/packages/backend/src/misc/promise-tracker.ts b/packages/backend/src/misc/promise-tracker.ts
new file mode 100644
index 0000000000..c7166c6de9
--- /dev/null
+++ b/packages/backend/src/misc/promise-tracker.ts
@@ -0,0 +1,23 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+const promiseRefs: Set<WeakRef<Promise<unknown>>> = new Set();
+
+/**
+ * This tracks promises that other modules decided not to wait for,
+ * and makes sure they are all settled before fully closing down the server.
+ */
+export function trackPromise(promise: Promise<unknown>) {
+ if (process.env.NODE_ENV !== 'test') {
+ return;
+ }
+ const ref = new WeakRef(promise);
+ promiseRefs.add(ref);
+ promise.finally(() => promiseRefs.delete(ref));
+}
+
+export async function allSettled(): Promise<void> {
+ await Promise.allSettled([...promiseRefs].map(r => r.deref()));
+}