diff --git a/src/cultmesh-provider-client.d.ts b/src/cultmesh-provider-client.d.ts index a64346a..10e4a1f 100644 --- a/src/cultmesh-provider-client.d.ts +++ b/src/cultmesh-provider-client.d.ts @@ -22,6 +22,7 @@ export declare class EveCultMeshProviderClient { providerAdvertisement(): Promise>; surface(surfaceId?: string): Promise>; document(request: { schemaId: string; recordRef: string }): Promise; + resolveDocument(request: { documentId: string; schemaId: string }): Promise<{ documentId: string; schemaId: string; document: unknown }>; submitCommand(request: Record): Promise; receipt(submission: Record): Promise; } diff --git a/src/cultmesh-provider-client.mjs b/src/cultmesh-provider-client.mjs index e85295c..eee18e1 100644 --- a/src/cultmesh-provider-client.mjs +++ b/src/cultmesh-provider-client.mjs @@ -50,6 +50,13 @@ export class EveCultMeshProviderClient { return this.#document(schemaId, recordRef, "embedded-document"); } + async resolveDocument(request) { + const documentId = String(request?.documentId || request?.recordRef || "").trim(); + const schemaId = String(request?.schemaId || "").trim(); + if (!documentId || !schemaId) throw new Error("Embedded documents require documentId and schemaId."); + return { documentId, schemaId, document: await this.document({ schemaId, recordRef: documentId }) }; + } + async submitCommand(request) { const advertisement = await this.providerAdvertisement(); const surface = selectSurface(advertisement, request?.surfaceId); diff --git a/test/cultmesh-provider-client.test.mjs b/test/cultmesh-provider-client.test.mjs index 2852e34..9d03640 100644 --- a/test/cultmesh-provider-client.test.mjs +++ b/test/cultmesh-provider-client.test.mjs @@ -16,7 +16,7 @@ function harness() { const sent = []; const connections = []; const encoded = []; - const records = new Map([["records/provider", advertisement], ["records/world", surface], ["records/receipts:cmd-1", ["gamecult.eve.command_receipt.v1", "receipt-1", "cmd-1", "move", "accepted", "Provider", "daemon", "test-provider", "world", "moved", "now", 4]]]); + const records = new Map([["records/provider", advertisement], ["records/world", surface], ["records/objects", { entities: [1] }], ["records/receipts:cmd-1", ["gamecult.eve.command_receipt.v1", "receipt-1", "cmd-1", "move", "accepted", "Provider", "daemon", "test-provider", "world", "moved", "now", 4]]]); const peer = { send: message => sent.push(message), close() {}, on() {} }; const mesh = { createPeerCatalog: () => ({ upsert() {} }), createAuthorityLeaseCatalog: () => ({ upsert() {} }), @@ -60,6 +60,13 @@ test("submits at the advertised command boundary and reads the advertised receip }); }); +test("resolves embedded documents without provider-specific slot logic", async () => { + const { client } = harness(); + assert.deepEqual(await client.resolveDocument({ documentId: "records/objects", schemaId: "test.objects.v1" }), { + documentId: "records/objects", schemaId: "test.objects.v1", document: { entities: [1] }, + }); +}); + test("refuses unadvertised surfaces", async () => { const { client } = harness(); await assert.rejects(() => client.surface("missing"), /does not advertise/);