applesauce-core 0.0.0-next-20250206150045 → 0.0.0-next-20250206231639

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.
@@ -21,6 +21,8 @@ export declare class Database {
21
21
  updated: Subject<import("nostr-tools").Event>;
22
22
  /** A stream of events removed of the database */
23
23
  deleted: Subject<import("nostr-tools").Event>;
24
+ /** A method thats called before a new event is inserted */
25
+ onBeforeInsert?: (event: NostrEvent) => void;
24
26
  get size(): number;
25
27
  protected claims: WeakMap<import("nostr-tools").Event, any>;
26
28
  /** Index helper methods */
@@ -24,6 +24,8 @@ export class Database {
24
24
  updated = new Subject();
25
25
  /** A stream of events removed of the database */
26
26
  deleted = new Subject();
27
+ /** A method thats called before a new event is inserted */
28
+ onBeforeInsert;
27
29
  get size() {
28
30
  return this.events.size;
29
31
  }
@@ -82,11 +84,12 @@ export class Database {
82
84
  const id = event.id;
83
85
  const current = this.events.get(id);
84
86
  if (current) {
85
- // if this is a duplicate event, transfer some import symbols
87
+ // if this is a duplicate event, transfer some important symbols
86
88
  if (event[FromCacheSymbol])
87
89
  current[FromCacheSymbol] = event[FromCacheSymbol];
88
90
  return current;
89
91
  }
92
+ this.onBeforeInsert?.(event);
90
93
  this.events.set(id, event);
91
94
  this.getKindIndex(event.kind).add(event);
92
95
  this.getAuthorsIndex(event.pubkey).add(event);
@@ -5,8 +5,13 @@ export declare class EventStore {
5
5
  database: Database;
6
6
  /** Enable this to keep old versions of replaceable events */
7
7
  keepOldVersions: boolean;
8
+ /** A method used to verify new events before added them */
9
+ verifyEvent?: (event: NostrEvent) => boolean;
8
10
  constructor();
9
- /** Adds an event to the database and update subscriptions */
11
+ /**
12
+ * Adds an event to the database and update subscriptions
13
+ * @throws
14
+ */
10
15
  add(event: NostrEvent, fromRelay?: string): NostrEvent;
11
16
  /** Removes an event from the database and updates subscriptions */
12
17
  remove(event: string | NostrEvent): boolean;
@@ -11,10 +11,20 @@ export class EventStore {
11
11
  database;
12
12
  /** Enable this to keep old versions of replaceable events */
13
13
  keepOldVersions = false;
14
+ /** A method used to verify new events before added them */
15
+ verifyEvent;
14
16
  constructor() {
15
17
  this.database = new Database();
18
+ this.database.onBeforeInsert = (event) => {
19
+ // reject events that are invalid
20
+ if (this.verifyEvent && this.verifyEvent(event) === false)
21
+ throw new Error("Invalid event");
22
+ };
16
23
  }
17
- /** Adds an event to the database and update subscriptions */
24
+ /**
25
+ * Adds an event to the database and update subscriptions
26
+ * @throws
27
+ */
18
28
  add(event, fromRelay) {
19
29
  if (event.kind === kinds.EventDeletion)
20
30
  this.handleDeleteEvent(event);
@@ -79,7 +79,8 @@ export function getTagValue(event, name) {
79
79
  }
80
80
  /** Sets events verified flag without checking anything */
81
81
  export function fakeVerifyEvent(event) {
82
- return (event[verifiedSymbol] = true);
82
+ event[verifiedSymbol] = true;
83
+ return true;
83
84
  }
84
85
  /** Marks an event as being from a cache */
85
86
  export function markFromCache(event) {
@@ -6,5 +6,9 @@ import { Filter, NostrEvent } from "nostr-tools";
6
6
  export declare function matchFilter(filter: Filter, event: NostrEvent): boolean;
7
7
  /** Copied from nostr-tools */
8
8
  export declare function matchFilters(filters: Filter[], event: NostrEvent): boolean;
9
+ /**
10
+ * Copied from nostr-tools and modified to support undefined
11
+ */
12
+ export declare function mergeFilters(...filters: Filter[]): Filter;
9
13
  /** Check if two filters are equal */
10
14
  export declare function isFilterEqual(a: Filter | Filter[], b: Filter | Filter[]): boolean;
@@ -40,6 +40,39 @@ export function matchFilters(filters, event) {
40
40
  }
41
41
  return false;
42
42
  }
43
+ /**
44
+ * Copied from nostr-tools and modified to support undefined
45
+ */
46
+ export function mergeFilters(...filters) {
47
+ let result = {};
48
+ for (let i = 0; i < filters.length; i++) {
49
+ let filter = filters[i];
50
+ Object.entries(filter).forEach(([property, values]) => {
51
+ // skip undefined
52
+ if (values === undefined)
53
+ return;
54
+ if (property === "kinds" || property === "ids" || property === "authors" || property[0] === "#") {
55
+ // @ts-ignore
56
+ result[property] = result[property] || [];
57
+ // @ts-ignore
58
+ for (let v = 0; v < values.length; v++) {
59
+ // @ts-ignore
60
+ let value = values[v];
61
+ // @ts-ignore
62
+ if (!result[property].includes(value))
63
+ result[property].push(value);
64
+ }
65
+ }
66
+ });
67
+ if (filter.limit && (!result.limit || filter.limit > result.limit))
68
+ result.limit = filter.limit;
69
+ if (filter.until && (!result.until || filter.until > result.until))
70
+ result.until = filter.until;
71
+ if (filter.since && (!result.since || filter.since < result.since))
72
+ result.since = filter.since;
73
+ }
74
+ return result;
75
+ }
43
76
  /** Check if two filters are equal */
44
77
  export function isFilterEqual(a, b) {
45
78
  return equal(a, b);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "applesauce-core",
3
- "version": "0.0.0-next-20250206150045",
3
+ "version": "0.0.0-next-20250206231639",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",