From cd0aeb46f7b07a69b6fb86eea377803a1c59a7f7 Mon Sep 17 00:00:00 2001 From: ennmichael Date: Sat, 1 Apr 2023 14:17:58 +0200 Subject: [PATCH] add event deletion --- packages/nostr/.eslintrc.cjs | 1 + packages/nostr/src/event/deletion.ts | 48 ++++++++++++++++++++++++++++ packages/nostr/src/event/index.ts | 13 +++++++- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 packages/nostr/src/event/deletion.ts diff --git a/packages/nostr/.eslintrc.cjs b/packages/nostr/.eslintrc.cjs index d478b681..b732448c 100644 --- a/packages/nostr/.eslintrc.cjs +++ b/packages/nostr/.eslintrc.cjs @@ -12,5 +12,6 @@ module.exports = { rules: { "require-await": "error", eqeqeq: "error", + "object-shorthand": "warn", }, } diff --git a/packages/nostr/src/event/deletion.ts b/packages/nostr/src/event/deletion.ts new file mode 100644 index 00000000..227f2cc3 --- /dev/null +++ b/packages/nostr/src/event/deletion.ts @@ -0,0 +1,48 @@ +import { EventId, EventKind, RawEvent, signEvent } from "." +import { NostrError } from "../common" +import { HexOrBechPrivateKey } from "../crypto" + +/** + * A deletion event. Used for marking published events as deleted. + * + * Related NIPs: NIP-09. + */ +export interface Deletion extends RawEvent { + kind: EventKind.Deletion + + /** + * The IDs of events to delete. + */ + getEvents(): EventId[] +} + +/** + * Create a deletion event. + */ +export function createDeletion( + { events, content }: { events: EventId[]; content?: string }, + priv?: HexOrBechPrivateKey +): Promise { + return signEvent( + { + kind: EventKind.Deletion, + tags: events.map((id) => ["e", id]), + content: content ?? "", + getEvents, + }, + priv + ) +} + +export function getEvents(this: Deletion): EventId[] { + return this.tags + .filter((tag) => tag[0] === "e") + .map((tag) => { + if (tag[1] !== undefined) { + throw new NostrError( + `invalid deletion event tag: ${JSON.stringify(tag)}` + ) + } + return tag[1] + }) +} diff --git a/packages/nostr/src/event/index.ts b/packages/nostr/src/event/index.ts index c5e56395..535e7c71 100644 --- a/packages/nostr/src/event/index.ts +++ b/packages/nostr/src/event/index.ts @@ -21,6 +21,7 @@ import { getRecipient, } from "./direct-message" import { ContactList, getContacts } from "./contact-list" +import { Deletion, getEvents } from "./deletion" // TODO Add remaining event types @@ -69,8 +70,9 @@ export interface Unknown extends RawEvent { EventKind, | EventKind.SetMetadata | EventKind.TextNote - | EventKind.DirectMessage | EventKind.ContactList + | EventKind.DirectMessage + | EventKind.Deletion > } @@ -79,6 +81,7 @@ export type Event = | TextNote | ContactList | DirectMessage + | Deletion | Unknown /** @@ -189,6 +192,14 @@ export async function parseEvent(event: RawEvent): Promise { } } + if (event.kind === EventKind.Deletion) { + return { + ...event, + kind: EventKind.Deletion, + getEvents, + } + } + return { ...event, kind: event.kind,