From 61e7eb8ff1d7ef222e60b687090cca53a182efc3 Mon Sep 17 00:00:00 2001
From: riku6460 <17585784+riku6460@users.noreply.github.com>
Date: Tue, 4 Jul 2023 07:49:13 +0900
Subject: [PATCH] =?UTF-8?q?perf(backend):=20JSON.parse=20=E3=81=AE?=
 =?UTF-8?q?=E5=91=BC=E3=81=B3=E5=87=BA=E3=81=97=E3=82=92=E5=89=8A=E6=B8=9B?=
 =?UTF-8?q?=E3=81=99=E3=82=8B=20(#11091)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* perf(backend): JSON.parse の呼び出しを削減する

Co-authored-by: Hidekazu Kobayashi <kobahide789@gmail.com>

* Update CHANGELOG.md

---------

Co-authored-by: Hidekazu Kobayashi <kobahide789@gmail.com>
---
 CHANGELOG.md                                     |  3 +++
 .../src/server/api/StreamingApiServerService.ts  | 16 +++++++++++-----
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index e7f900509b..c8fd80063d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,6 +22,9 @@
 - Fix: サーバーメトリクスが90度傾いている
 - Fix: sparkle内にリンクを入れるとクリック不能になる問題の修正
 
+### Server
+- JSON.parse の回数を削減することで、ストリーミングのパフォーマンスを向上しました
+
 ## 13.13.2
 
 ### General
diff --git a/packages/backend/src/server/api/StreamingApiServerService.ts b/packages/backend/src/server/api/StreamingApiServerService.ts
index 4a0342d2b4..e4291becf0 100644
--- a/packages/backend/src/server/api/StreamingApiServerService.ts
+++ b/packages/backend/src/server/api/StreamingApiServerService.ts
@@ -103,6 +103,13 @@ export class StreamingApiServerService {
 			});
 		});
 
+		const globalEv = new EventEmitter();
+
+		this.redisForSub.on('message', (_: string, data: string) => {
+			const parsed = JSON.parse(data);
+			globalEv.emit('message', parsed);
+		});
+
 		this.#wss.on('connection', async (connection: WebSocket.WebSocket, request: http.IncomingMessage, ctx: {
 			stream: MainStreamConnection,
 			user: LocalUser | null;
@@ -112,12 +119,11 @@ export class StreamingApiServerService {
 
 			const ev = new EventEmitter();
 
-			async function onRedisMessage(_: string, data: string): Promise<void> {
-				const parsed = JSON.parse(data);
-				ev.emit(parsed.channel, parsed.message);
+			function onRedisMessage(data: any): void {
+				ev.emit(data.channel, data.message);
 			}
 
-			this.redisForSub.on('message', onRedisMessage);
+			globalEv.on('message', onRedisMessage);
 
 			await stream.listen(ev, connection);
 
@@ -137,7 +143,7 @@ export class StreamingApiServerService {
 			connection.once('close', () => {
 				ev.removeAllListeners();
 				stream.dispose();
-				this.redisForSub.off('message', onRedisMessage);
+				globalEv.off('message', onRedisMessage);
 				this.#connections.delete(connection);
 				if (userUpdateIntervalId) clearInterval(userUpdateIntervalId);
 			});