Skip to content

Commit

Permalink
+
Browse files Browse the repository at this point in the history
  • Loading branch information
BlowaterNostr committed Apr 11, 2024
1 parent 5fcf152 commit fd3f544
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 21 deletions.
10 changes: 6 additions & 4 deletions main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { func_ResolvePolicyByKind } from "./resolvers/policy.ts";
import { NostrEvent, NostrKind, parseJSON, PublicKey, verifyEvent } from "./_libs.ts";
import { PolicyStore } from "./resolvers/policy.ts";
import { Policies } from "./resolvers/policy.ts";
import { interface_GetEventsByAuthors } from "./resolvers/event.ts";
import { func_WriteReplaceableEvent, interface_GetEventsByAuthors } from "./resolvers/event.ts";
import Landing from "./routes/landing.tsx";
import Error404 from "./routes/_404.tsx";
import { RelayInformation, RelayInformationStore } from "./resolvers/nip11.ts";
Expand All @@ -18,7 +18,7 @@ import {
func_GetEventsByIDs,
func_GetEventsByKinds,
func_MarkEventDeleted,
func_WriteEvent,
func_WriteRegularEvent,
} from "./resolvers/event.ts";

const schema = gql.buildSchema(gql.print(typeDefs));
Expand Down Expand Up @@ -94,12 +94,13 @@ export async function run(args: {
password,
connections,
resolvePolicyByKind: policyStore.resolvePolicyByKind,
write_event: eventStore.write_event.bind(eventStore),
get_events_by_IDs: eventStore.get_events_by_IDs.bind(eventStore),
get_events_by_kinds: eventStore.get_events_by_kinds.bind(eventStore),
get_events_by_authors: eventStore.get_events_by_authors.bind(eventStore),
get_events_by_filter: eventStore.get_events_by_filter.bind(eventStore),
mark_event_deleted: eventStore.mark_event_deleted,
write_regular_event: eventStore.write_regular_event.bind(eventStore),
write_replaceable_event: eventStore.write_replaceable_event,
policyStore,
relayInformationStore,
kv: args.kv,
Expand All @@ -123,7 +124,8 @@ export async function run(args: {
}

export type EventReadWriter = {
write_event: func_WriteEvent;
write_regular_event: func_WriteRegularEvent;
write_replaceable_event: func_WriteReplaceableEvent
get_events_by_IDs: func_GetEventsByIDs;
get_events_by_kinds: func_GetEventsByKinds;
get_events_by_filter: func_GetEventsByFilter;
Expand Down
34 changes: 29 additions & 5 deletions resolvers/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,9 @@ export type interface_GetEventsByAuthors = {

export type func_GetEventsByFilter = (filter: NostrFilter) => AsyncIterable<NostrEvent>;

export type func_WriteEvent = (event: NostrEvent) => Promise<boolean>;
export type interface_WriteEvent = {
write_event: func_WriteEvent;
};
export type func_WriteRegularEvent = (event: NostrEvent) => Promise<boolean>;

export type func_WriteReplaceableEvent = (event: NostrEvent) => Promise<boolean>;

export type func_MarkEventDeleted = (event: NostrEvent | NoteID) => Promise<boolean>;

Expand Down Expand Up @@ -97,7 +96,10 @@ export class EventStore implements EventReadWriter {
}
}

async write_event(event: NostrEvent) {
write_regular_event = async (event: NostrEvent) => {
if(isReplaceableEvent(event.kind)) {
return false;
}
console.log("write_event", event);
const result = await this.kv.atomic()
.set(["event", event.id], event)
Expand All @@ -112,6 +114,24 @@ export class EventStore implements EventReadWriter {
return result.ok;
}

write_replaceable_event = async (event: NostrEvent) => {
const kind = event.kind;
if(!isReplaceableEvent(kind)) {
return false;
}
console.log("write_replaceable_event", event);
const result = await this.kv.atomic()
.set(["event", event.kind, event.pubkey], event)
.set(["event", event.pubkey, event.kind], event)
.commit();

if (result.ok) {
this.events.set(event.id, event);
}

return result.ok;
}

mark_event_deleted = async (event_or_id: NostrEvent | NoteID) => {
let id: string;
if(event_or_id instanceof NoteID) {
Expand All @@ -127,6 +147,10 @@ export class EventStore implements EventReadWriter {
};
}

function isReplaceableEvent(kind: NostrKind) {
return kind == NostrKind.META_DATA || kind == NostrKind.CONTACTS || (10000 <= kind && kind < 20000)
}

function isMatched(event: NostrEvent, filter: NostrFilter) {
const kinds = filter.kinds || [];
const authors = filter.authors || [];
Expand Down
20 changes: 19 additions & 1 deletion test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,24 @@ Deno.test("main", async (t) => {
await relay.shutdown();
});

// https://github.com/nostr-protocol/nips/blob/master/01.md#kinds
Deno.test("replaceable events", async () => {
const relay = await run({
password: "123",
port: 8080,
default_policy: {
allowed_kinds: "all",
},
kv: await test_kv(),
}) as Relay;
const client = SingleRelayConnection.New(relay.url, { log: false });
{
await client_test.get_replaceable_event(relay.url)();
}
await client.close();
await relay.shutdown();
})

// https://github.com/nostr-protocol/nips/blob/master/09.md
Deno.test("NIP-9: Deletion", async () => {
const relay = await run({
Expand All @@ -164,7 +182,7 @@ Deno.test("NIP-9: Deletion", async () => {
}) as Relay;
const client = SingleRelayConnection.New(relay.url, { log: false });
{
await client_nip9_test.send_deletion_event(relay.url)();
await client_nip9_test.store_deletion_event(relay.url)();
}
await client.close();
await relay.shutdown();
Expand Down
33 changes: 22 additions & 11 deletions ws.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import {
func_GetEventsByIDs,
func_GetEventsByKinds,
func_MarkEventDeleted,
func_WriteEvent,
func_WriteRegularEvent,
func_WriteReplaceableEvent,
} from "./resolvers/event.ts";
import {
_RelayResponse_EOSE,
Expand Down Expand Up @@ -114,17 +115,20 @@ async function handle_cmd_event(args: {
connections: Map<WebSocket, SubscriptionMap>;
nostr_ws_msg: ClientRequest_Event;
resolvePolicyByKind: func_ResolvePolicyByKind;
write_event: func_WriteEvent;
write_regular_event: func_WriteRegularEvent;
write_replaceable_event: func_WriteReplaceableEvent;
mark_event_deleted: func_MarkEventDeleted;
}) {
const { this_socket, connections, nostr_ws_msg, resolvePolicyByKind, write_event } = args;
const { this_socket, connections, nostr_ws_msg, resolvePolicyByKind } = args;
const event = nostr_ws_msg[1];
const ok = await verifyEvent(event);
if (!ok) {
return send(
this_socket,
JSON.stringify(respond_ok(event, false, "invalid event")),
);
{
const ok = await verifyEvent(event);
if (!ok) {
return send(
this_socket,
JSON.stringify(respond_ok(event, false, "invalid event")),
);
}
}

const policy = await resolvePolicyByKind(event.kind);
Expand Down Expand Up @@ -167,8 +171,15 @@ async function handle_cmd_event(args: {
}
}
}
const _ok = await write_event(event);
if (_ok) {

let ok: boolean;
if (event.kind == NostrKind.META_DATA || event.kind == NostrKind.CONTACTS || (10000 <= event.kind && event.kind < 20000)) {
ok = await args.write_replaceable_event(event)
} else {
ok = await args.write_regular_event(event);
}

if (ok) {
send(this_socket, JSON.stringify(respond_ok(event, true, "")));
} else {
send(this_socket, JSON.stringify(respond_ok(event, false, "")));
Expand Down

0 comments on commit fd3f544

Please sign in to comment.