Skip to content

Commit bdfbc89

Browse files
committed
feat(relay): respond to EVENT messages with OK messages
1 parent ecc2cc6 commit bdfbc89

File tree

4 files changed

+45
-21
lines changed

4 files changed

+45
-21
lines changed

client.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,7 @@ export class Relay extends NostrNode<ClientToRelayMessage> {
176176
(resolve, reject) => {
177177
this.#published.set(event.id, { resolve, reject });
178178
},
179-
).finally(async () => {
180-
await this.#publisher.ready;
179+
).finally(() => {
181180
this.#published.delete(event.id);
182181
});
183182

deno.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"check": "deno check ./**/*.ts",
55
"test": "deno test -A --no-check",
66
"build": "mkdir -p ./dist && deno run -A ./bin/bundle.ts",
7-
"dev": "deno fmt && deno task -q check && deno task -q test"
7+
"dev": "deno fmt && deno lint && deno task -q check && deno task -q test"
88
},
99
"exclude": [
1010
"dist/",

relay.ts

+29-15
Original file line numberDiff line numberDiff line change
@@ -43,33 +43,47 @@ export class Client extends NostrNode<RelayToClientMessage> {
4343
enqueueRequest = controller.enqueue.bind(controller);
4444
},
4545
});
46-
this.ws.addEventListener("message", (ev: MessageEvent<string>) => {
46+
const writer = this.getWriter();
47+
this.ws.addEventListener("message", async (ev: MessageEvent<string>) => {
4748
// TODO: Validate the type of the message.
4849
const msg = JSON.parse(ev.data) as ClientToRelayMessage;
50+
4951
// TODO: Apply backpressure when a queue is full.
52+
5053
const kind = msg[0];
5154
if (kind === "EVENT") {
52-
return enqueueEvent(msg[1]);
55+
const event = msg[1];
56+
57+
// TODO: Validate the event and send OkMessage<false> if necessary.
58+
59+
await writer.ready;
60+
writer.write(["OK", event.id, true, ""]);
61+
return enqueueEvent(event);
5362
}
54-
const id = msg[1];
63+
const sid = msg[1];
5564
if (kind === "CLOSE") {
56-
const sub = this.subscriptions.get(id);
65+
const sub = this.subscriptions.get(sid);
5766
if (!sub) {
67+
this.config.logger?.warn?.("Unknown subscription:", sid);
5868
return;
5969
}
60-
this.subscriptions.delete(id);
70+
this.subscriptions.delete(sid);
6171
return sub.close();
6272
}
63-
// kind === "REQ"
64-
const filter = msg[2];
65-
const writer = this.getWriter();
66-
const writable = new WritableStream<NostrEvent>({
67-
write: (event) => {
68-
return writer.write(["EVENT", id, event]);
69-
},
70-
});
71-
this.subscriptions.set(id, writable);
72-
return enqueueRequest([id, filter]);
73+
if (kind === "REQ") {
74+
const filter = msg[2];
75+
this.subscriptions.set(
76+
sid,
77+
new WritableStream<NostrEvent>({
78+
write: async (event) => {
79+
await writer.ready;
80+
return writer.write(["EVENT", sid, event]);
81+
},
82+
}),
83+
);
84+
return enqueueRequest([sid, filter]);
85+
}
86+
this.config.logger?.warn?.("Unknown message kind:", kind);
7387
});
7488
}
7589

tests/relay_test.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { EventMessage, NostrEvent, SubscriptionId } from "../core/nips/01.ts";
1+
import {
2+
EventMessage,
3+
NostrEvent,
4+
OkMessage,
5+
SubscriptionId,
6+
} from "../core/nips/01.ts";
27
import { Client } from "../relay.ts";
38
import { afterAll, beforeAll, describe, it } from "../lib/std/testing.ts";
49
import { assert, assertEquals } from "../lib/std/assert.ts";
@@ -27,8 +32,13 @@ describe("Client", () => {
2732
it("should return a ReadableStream of events", () => {
2833
assert(client.events instanceof ReadableStream);
2934
});
30-
it("should receive events", async () => {
31-
const ev = { kind: 0 };
35+
it("should receive an event and send a OK message", async () => {
36+
const ev = { id: "test-ok", kind: 0 };
37+
const received = new Promise<OkMessage>((resolve) => {
38+
ws.remote.addEventListener("message", (ev: MessageEvent<string>) => {
39+
resolve(JSON.parse(ev.data));
40+
});
41+
});
3242
ws.dispatchEvent(
3343
new MessageEvent("message", {
3444
data: JSON.stringify(["EVENT", ev]),
@@ -37,6 +47,7 @@ describe("Client", () => {
3747
const reader = client.events.getReader();
3848
const { value } = await reader.read();
3949
assertEquals(value, ev);
50+
assertEquals(await received, ["OK", "test-ok", true, ""]);
4051
});
4152
});
4253

0 commit comments

Comments
 (0)