From f7de7bd430acec842875c50482d580f4b967e235 Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Sun, 6 Apr 2025 15:23:19 +0900 Subject: [PATCH] Add Cache Compression --- .../WelsonJS.Launcher/ResourceServer.cs | 43 ++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs index 02f3e0b..71c28e6 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.IO.Compression; using System.Net; using System.Net.Http; using System.Reflection; @@ -213,7 +214,15 @@ namespace WelsonJS.Launcher { if (File.Exists(cachePath)) { - data = File.ReadAllBytes(cachePath); + byte[] raw = File.ReadAllBytes(cachePath); + + if (isMetadata) + { + data = raw; + return true; + } + + data = IsCompressed(raw) ? Decompress(raw) : raw; return true; } } @@ -255,7 +264,8 @@ namespace WelsonJS.Launcher } // Save the cache - File.WriteAllBytes(cachePath, data); + byte[] compressed = Compress(data); + File.WriteAllBytes(cachePath, compressed); // Save the cache meta File.WriteAllBytes($"{cachePath}.meta", Encoding.UTF8.GetBytes(mimeType)); @@ -360,5 +370,34 @@ namespace WelsonJS.Launcher return memoryStream.ToArray(); } } + + private byte[] Compress(byte[] data) + { + using (var output = new MemoryStream()) + { + using (var gzip = new GZipStream(output, CompressionMode.Compress)) + { + gzip.Write(data, 0, data.Length); + } + return output.ToArray(); // includes GZip signature + } + } + + private byte[] Decompress(byte[] data) + { + using (var input = new MemoryStream(data)) + using (var gzip = new GZipStream(input, CompressionMode.Decompress)) + using (var output = new MemoryStream()) + { + gzip.CopyTo(output); + return output.ToArray(); + } + } + + private bool IsCompressed(byte[] data) + { + // GZip signature: 0x1F 0x8B + return data != null && data.Length >= 2 && data[0] == 0x1F && data[1] == 0x8B; + } } }