From dfb106d4572bee749025025f207af5b382f6a544 Mon Sep 17 00:00:00 2001 From: Pierre Demailly Date: Thu, 6 Feb 2025 22:59:43 +0100 Subject: [PATCH] fix(http-server/data): initialize cache with available payloads --- src/cache.js | 12 ++++++---- src/http-server/endpoints/data.js | 4 ++-- src/http-server/websocket/commands/search.js | 2 +- test/cache.test.js | 24 +++++++++++++------- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/cache.js b/src/cache.js index 2f62e81f..3dbe67e9 100644 --- a/src/cache.js +++ b/src/cache.js @@ -40,7 +40,7 @@ class _AppCache { fs.writeFileSync(path.join(kPayloadsPath, pkg.replaceAll("/", "-")), JSON.stringify(payload)); } - async getPayload(pkg) { + getPayload(pkg) { try { return JSON.parse(fs.readFileSync(path.join(kPayloadsPath, pkg.replaceAll("/", "-")), "utf-8")); } @@ -51,9 +51,13 @@ class _AppCache { } } - async getPayloadOrNull(pkg) { + availablePayloads() { + return fs.readdirSync(kPayloadsPath); + } + + getPayloadOrNull(pkg) { try { - return await this.getPayload(pkg); + return this.getPayload(pkg); } catch { return null; @@ -125,7 +129,7 @@ class _AppCache { catch { // Do nothing. } - const packagesInFolder = fs.readdirSync(kPayloadsPath); + const packagesInFolder = this.availablePayloads(); if (packagesInFolder.length === 0) { await this.#initDefaultPayloadsList(); diff --git a/src/http-server/endpoints/data.js b/src/http-server/endpoints/data.js index 9e5a04f1..66de0b69 100644 --- a/src/http-server/endpoints/data.js +++ b/src/http-server/endpoints/data.js @@ -25,7 +25,7 @@ export async function get(_req, res) { logger.info(`[data|get](current: ${current})`); logger.debug(`[data|get](lru: ${mru})`); - send(res, 200, await appCache.getPayload(current)); + send(res, 200, appCache.getPayload(current)); } catch { logger.error(`[data|get](No cache yet. Creating one...)`); @@ -37,7 +37,7 @@ export async function get(_req, res) { mru: [formatted], current: formatted, lru: [], - availables: [], + availables: appCache.availablePayloads(), lastUsed: { [formatted]: Date.now() }, diff --git a/src/http-server/websocket/commands/search.js b/src/http-server/websocket/commands/search.js index 2ac38685..3e4a08e0 100644 --- a/src/http-server/websocket/commands/search.js +++ b/src/http-server/websocket/commands/search.js @@ -8,7 +8,7 @@ export async function* search( const { logger, cache } = context; logger.info(`[ws|search](pkg: ${pkg})`); - const cachedPayload = await cache.getPayloadOrNull(pkg); + const cachedPayload = cache.getPayloadOrNull(pkg); if (cachedPayload) { logger.info(`[ws|search](payload: ${pkg} found in cache)`); const cacheList = await cache.payloadsList(); diff --git a/test/cache.test.js b/test/cache.test.js index 92068a19..00178e82 100644 --- a/test/cache.test.js +++ b/test/cache.test.js @@ -48,42 +48,50 @@ describe("appCache", () => { assert.equal(writeValue, JSON.stringify({ foo: "bar" })); }); - it("getPayload should return the payload", async(t) => { + it("getPayload should return the payload", (t) => { t.mock.method(fs, "readFileSync", () => JSON.stringify({ foo: "bar" })); - const payload = await appCache.getPayload("foo/bar"); + const payload = appCache.getPayload("foo/bar"); assert.deepEqual(payload, { foo: "bar" }); }); - it("getPayload should throw", async(t) => { + it("getPayload should throw", (t) => { t.mock.method(fs, "readFileSync", () => { throw new Error("boo"); }); - await assert.rejects(async() => appCache.getPayload("foo/bar"), { + assert.throws(() => appCache.getPayload("foo/bar"), { message: "boo" }); }); - it("getPayloadOrNull should return payload", async(t) => { + it("getPayloadOrNull should return payload", (t) => { t.mock.method(fs, "readFileSync", () => JSON.stringify({ foo: "bar" })); - const payload = await appCache.getPayloadOrNull("foo/bar"); + const payload = appCache.getPayloadOrNull("foo/bar"); assert.deepEqual(payload, { foo: "bar" }); }); - it("getPayloadOrNull should return null", async(t) => { + it("getPayloadOrNull should return null", (t) => { t.mock.method(fs, "readFileSync", () => { throw new Error("boo"); }); - const payload = await appCache.getPayloadOrNull("foo/bar"); + const payload = appCache.getPayloadOrNull("foo/bar"); assert.equal(payload, null); }); + it("availablePayloads should return the list of payloads", (t) => { + t.mock.method(fs, "readdirSync", () => ["foo-bar", "bar-foo"]); + + const payloads = appCache.availablePayloads(); + + assert.deepEqual(payloads, ["foo-bar", "bar-foo"]); + }); + it("should update and get payloadsList", async() => { await appCache.updatePayloadsList({ foo: "bar" });