From ac46facc460b84532e82fe200575548475a3b313 Mon Sep 17 00:00:00 2001
From: Dragory <2606411+Dragory@users.noreply.github.com>
Date: Sat, 9 Oct 2021 14:43:46 +0300
Subject: [PATCH] perf: use thread pool for encryption/decryption

---
 backend/src/utils/crypt.ts | 15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/backend/src/utils/crypt.ts b/backend/src/utils/crypt.ts
index 1d428150..9a6cf7eb 100644
--- a/backend/src/utils/crypt.ts
+++ b/backend/src/utils/crypt.ts
@@ -1,4 +1,4 @@
-import { spawn, Worker } from "threads";
+import { spawn, Worker, Pool } from "threads";
 import "../loadEnv";
 import type { CryptFns } from "./cryptWorker";
 
@@ -9,19 +9,12 @@ if (!process.env.KEY) {
 }
 
 const KEY = process.env.KEY;
-let workerPromise: Promise<CryptFns> | null = null;
-
-async function getWorker(): Promise<CryptFns> {
-  if (workerPromise == null) {
-    workerPromise = spawn(new Worker("./cryptWorker")) as unknown as Promise<CryptFns>;
-  }
-  return workerPromise;
-}
+const pool = Pool(() => spawn(new Worker("./cryptWorker")), 8);
 
 export async function encrypt(data: string) {
-  return (await getWorker()).encrypt(data, KEY);
+  return pool.queue((w) => w.encrypt(data, KEY));
 }
 
 export async function decrypt(data: string) {
-  return (await getWorker()).decrypt(data, KEY);
+  return pool.queue((w) => w.decrypt(data, KEY));
 }