From 5d8c3e46265f9da1fb0a1345abc5a2ceedce4244 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Thu, 19 Feb 2026 22:30:24 -0800 Subject: [PATCH 1/3] Add getCachedStatements method to MetadataService --- .../server/src/services/metadataService.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/server/src/services/metadataService.ts b/packages/server/src/services/metadataService.ts index 7ae339d6..5519cfde 100644 --- a/packages/server/src/services/metadataService.ts +++ b/packages/server/src/services/metadataService.ts @@ -70,6 +70,10 @@ interface MetadataService { * BLOB download. */ getStatement(aaguid: string | Uint8Array): Promise; + /** + * Return all currently cached MDS metadata statements. + */ + getCachedStatements(): MetadataStatement[]; } /** @@ -216,6 +220,25 @@ export class BaseMetadataService implements MetadataService { return entry.metadataStatement; } + getCachedStatements(): MetadataStatement[] { + if (this.state === SERVICE_STATE.DISABLED) { + throw new Error( + 'MetadataService has not been initialized. Call `await MetadataService.initialize()` before calling this method.', + ); + } + + const toReturn: MetadataStatement[] = []; + + const cachedStatements = Object.values(this.statementCache); + cachedStatements.forEach((statement) => { + if (statement.entry.metadataStatement) { + toReturn.push(statement.entry.metadataStatement); + } + }); + + return toReturn; + } + /** * Download and process the latest BLOB from MDS */ From 43ae778ac86716054bcfedd40b19a78a2e007838 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Thu, 19 Feb 2026 22:32:06 -0800 Subject: [PATCH 2/3] Add tests --- .../src/services/metadataService.test.ts | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/server/src/services/metadataService.test.ts b/packages/server/src/services/metadataService.test.ts index c2a0a4bc..03909817 100644 --- a/packages/server/src/services/metadataService.test.ts +++ b/packages/server/src/services/metadataService.test.ts @@ -1,4 +1,4 @@ -import { assertEquals, assertRejects } from '@std/assert'; +import { assertEquals, assertRejects, assertThrows } from '@std/assert'; import { afterEach, beforeEach, describe, it } from '@std/testing/bdd'; import { assertSpyCallArg, assertSpyCalls, type Stub, stub } from '@std/testing/mock'; @@ -95,6 +95,38 @@ describe('Method: getStatement()', () => { }); }); +describe('Method: getCachedStatements()', () => { + beforeEach(() => { + mockFetch = stub(_fetchInternals, 'stubThis'); + }); + + afterEach(() => { + mockFetch.restore(); + }); + + it('should throw when MetadataService is not initialized', () => { + const _service = new BaseMetadataService(); + assertThrows( + () => _service.getCachedStatements(), + 'MetadataService has not been initialized', + ); + }); + + it('should return cached statements', async () => { + const _service = new BaseMetadataService(); + + await _service.initialize({ + mdsServers: [], + statements: [localStatement], + }); + + const statements = _service.getCachedStatements(); + + assertEquals(statements.length, 1); + assertEquals(statements[0], localStatement); + }); +}); + const localStatementAAGUID = '91dfead7-959e-4475-ad26-9b0d482be089'; const localStatement: MetadataStatement = { legalHeader: 'https://fidoalliance.org/metadata/metadata-statement-legal-header/', From 1d63b605d79ad9937b0495ba84d882cd8351ea9a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Thu, 19 Feb 2026 22:41:22 -0800 Subject: [PATCH 3/3] Be extra certain the output can be valid input --- .../src/services/metadataService.test.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/server/src/services/metadataService.test.ts b/packages/server/src/services/metadataService.test.ts index 03909817..0730cd90 100644 --- a/packages/server/src/services/metadataService.test.ts +++ b/packages/server/src/services/metadataService.test.ts @@ -125,6 +125,32 @@ describe('Method: getCachedStatements()', () => { assertEquals(statements.length, 1); assertEquals(statements[0], localStatement); }); + + it('should return an array value that can be fed back into initialize()', async () => { + let _service = new BaseMetadataService(); + + // Pretend we loaded some statements from MDS + await _service.initialize({ + mdsServers: [], + statements: [localStatement], + }); + + const cachedStatements = _service.getCachedStatements(); + + _service = new BaseMetadataService(); + + // Feed the cached statements back into another initialization + await _service.initialize({ + mdsServers: [], + statements: cachedStatements, + }); + + // Make sure MetadataService is fine with this + assertEquals( + await _service.getStatement(localStatementAAGUID), + localStatement, + ); + }); }); const localStatementAAGUID = '91dfead7-959e-4475-ad26-9b0d482be089';