applesauce-core 0.0.0-next-20241122170522 → 0.0.0-next-20241125223343
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,6 +6,10 @@ export declare class EventStore {
|
|
|
6
6
|
constructor();
|
|
7
7
|
/** Adds an event to the database */
|
|
8
8
|
add(event: NostrEvent, fromRelay?: string): import("nostr-tools").Event;
|
|
9
|
+
protected deletedIds: Set<string>;
|
|
10
|
+
protected deletedCoords: Map<string, number>;
|
|
11
|
+
protected handleDeleteEvent(deleteEvent: NostrEvent): void;
|
|
12
|
+
protected checkDeleted(event: NostrEvent): boolean;
|
|
9
13
|
/** Add an event to the store and notifies all subscribes it has updated */
|
|
10
14
|
update(event: NostrEvent): import("nostr-tools").Event;
|
|
11
15
|
getAll(filters: Filter[]): Set<import("nostr-tools").Event>;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { kinds } from "nostr-tools";
|
|
1
2
|
import { insertEventIntoDescendingList } from "nostr-tools/utils";
|
|
2
3
|
import { Observable } from "rxjs";
|
|
3
4
|
import { Database } from "./database.js";
|
|
4
5
|
import { getEventUID, getReplaceableUID } from "../helpers/event.js";
|
|
5
6
|
import { matchFilters } from "../helpers/filter.js";
|
|
6
7
|
import { addSeenRelay } from "../helpers/relays.js";
|
|
8
|
+
import { getDeleteIds } from "../helpers/delete.js";
|
|
9
|
+
import { isParameterizedReplaceableKind } from "nostr-tools/kinds";
|
|
7
10
|
export class EventStore {
|
|
8
11
|
database;
|
|
9
12
|
constructor() {
|
|
@@ -11,11 +14,45 @@ export class EventStore {
|
|
|
11
14
|
}
|
|
12
15
|
/** Adds an event to the database */
|
|
13
16
|
add(event, fromRelay) {
|
|
17
|
+
if (event.kind === kinds.EventDeletion)
|
|
18
|
+
this.handleDeleteEvent(event);
|
|
19
|
+
if (this.checkDeleted(event))
|
|
20
|
+
return event;
|
|
14
21
|
const inserted = this.database.addEvent(event);
|
|
15
22
|
if (fromRelay)
|
|
16
23
|
addSeenRelay(inserted, fromRelay);
|
|
17
24
|
return inserted;
|
|
18
25
|
}
|
|
26
|
+
deletedIds = new Set();
|
|
27
|
+
deletedCoords = new Map();
|
|
28
|
+
handleDeleteEvent(deleteEvent) {
|
|
29
|
+
const ids = getDeleteIds(deleteEvent);
|
|
30
|
+
for (const id of ids) {
|
|
31
|
+
this.deletedIds.add(id);
|
|
32
|
+
// remove deleted events in the database
|
|
33
|
+
const event = this.database.getEvent(id);
|
|
34
|
+
if (event)
|
|
35
|
+
this.database.deleteEvent(event);
|
|
36
|
+
}
|
|
37
|
+
const coords = getDeleteIds(deleteEvent);
|
|
38
|
+
for (const coord of coords) {
|
|
39
|
+
this.deletedCoords.set(coord, Math.max(this.deletedCoords.get(coord) ?? 0, deleteEvent.created_at));
|
|
40
|
+
// remove deleted events in the database
|
|
41
|
+
const event = this.database.getEvent(coord);
|
|
42
|
+
if (event && event.created_at < deleteEvent.created_at)
|
|
43
|
+
this.database.deleteEvent(event);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
checkDeleted(event) {
|
|
47
|
+
if (this.deletedIds.has(event.id))
|
|
48
|
+
return true;
|
|
49
|
+
if (isParameterizedReplaceableKind(event.kind)) {
|
|
50
|
+
const deleted = this.deletedCoords.get(getEventUID(event));
|
|
51
|
+
if (deleted)
|
|
52
|
+
return deleted > event.created_at;
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
19
56
|
/** Add an event to the store and notifies all subscribes it has updated */
|
|
20
57
|
update(event) {
|
|
21
58
|
return this.database.updateEvent(event);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { EventTemplate, NostrEvent } from "nostr-tools";
|
|
2
|
+
export declare function getDeleteIds(deleteEvent: NostrEvent): string[];
|
|
3
|
+
export declare function getDeleteCoordinates(deleteEvent: NostrEvent): string[];
|
|
4
|
+
/** Creates a NIP-09 delete event for an array of events */
|
|
5
|
+
export declare function createDeleteEvent(events: NostrEvent[], message?: string): EventTemplate;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { kinds } from "nostr-tools";
|
|
2
|
+
import { isParameterizedReplaceableKind } from "nostr-tools/kinds";
|
|
3
|
+
import { isATag, isETag } from "./tags.js";
|
|
4
|
+
import { unixNow } from "./time.js";
|
|
5
|
+
import { getATagFromAddressPointer, getETagFromEventPointer } from "./pointers.js";
|
|
6
|
+
import { getTagValue } from "./index.js";
|
|
7
|
+
export function getDeleteIds(deleteEvent) {
|
|
8
|
+
return deleteEvent.tags.filter(isETag).map((t) => t[1]);
|
|
9
|
+
}
|
|
10
|
+
export function getDeleteCoordinates(deleteEvent) {
|
|
11
|
+
return deleteEvent.tags.filter(isATag).map((t) => t[1]);
|
|
12
|
+
}
|
|
13
|
+
/** Creates a NIP-09 delete event for an array of events */
|
|
14
|
+
export function createDeleteEvent(events, message) {
|
|
15
|
+
const eventPointers = [];
|
|
16
|
+
const addressPointers = [];
|
|
17
|
+
const eventKinds = new Set();
|
|
18
|
+
for (const event of events) {
|
|
19
|
+
eventKinds.add(event.kind);
|
|
20
|
+
eventPointers.push({ id: event.id });
|
|
21
|
+
if (isParameterizedReplaceableKind(event.kind)) {
|
|
22
|
+
const identifier = getTagValue(event, "d");
|
|
23
|
+
if (!identifier)
|
|
24
|
+
throw new Error("Event missing identifier");
|
|
25
|
+
addressPointers.push({ pubkey: event.pubkey, kind: event.kind, identifier });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
kind: kinds.EventDeletion,
|
|
30
|
+
content: message ?? "",
|
|
31
|
+
tags: [
|
|
32
|
+
...eventPointers.map(getETagFromEventPointer),
|
|
33
|
+
...addressPointers.map(getATagFromAddressPointer),
|
|
34
|
+
...Array.from(eventKinds).map((k) => ["k", String(k)]),
|
|
35
|
+
],
|
|
36
|
+
created_at: unixNow(),
|
|
37
|
+
};
|
|
38
|
+
}
|
package/dist/helpers/index.d.ts
CHANGED
package/dist/helpers/index.js
CHANGED