1 changed files with 57 additions and 0 deletions
@ -0,0 +1,57 @@
@@ -0,0 +1,57 @@
|
||||
import type { NDKEvent } from "@nostr-dev-kit/ndk"; |
||||
|
||||
interface PublicationTreeNode { |
||||
address: string; |
||||
parent?: PublicationTreeNode; |
||||
children?: PublicationTreeNode[]; |
||||
} |
||||
|
||||
// TODO: Add public method(s) for event retrieval.
|
||||
// TODO: Add methods for DFS and BFS traversal-retrieval.
|
||||
export class PublicationTree { |
||||
private root: PublicationTreeNode; |
||||
private nodes: Map<string, PublicationTreeNode>; |
||||
private events: Map<string, NDKEvent>; |
||||
|
||||
constructor(rootEvent: NDKEvent) { |
||||
const rootAddress = this.getAddress(rootEvent); |
||||
this.root = { address: rootAddress, children: [] }; |
||||
|
||||
this.nodes = new Map<string, PublicationTreeNode>(); |
||||
this.nodes.set(rootAddress, this.root); |
||||
|
||||
this.events = new Map<string, NDKEvent>(); |
||||
this.events.set(rootAddress, rootEvent); |
||||
} |
||||
|
||||
addEvent(event: NDKEvent, parentEvent: NDKEvent) { |
||||
const address = this.getAddress(event); |
||||
const parentAddress = this.getAddress(parentEvent); |
||||
const parentNode = this.nodes.get(parentAddress); |
||||
|
||||
if (!parentNode) { |
||||
throw new Error( |
||||
`PublicationTree: Parent node with address ${parentAddress} not found.` |
||||
); |
||||
} |
||||
|
||||
const node = { |
||||
address, |
||||
parent: parentNode, |
||||
children: [], |
||||
}; |
||||
parentNode.children!.push(node); |
||||
this.nodes.set(address, node); |
||||
this.events.set(address, event); |
||||
} |
||||
|
||||
private getAddress(event: NDKEvent): string { |
||||
if (event.kind! < 30000 || event.kind! >= 40000) { |
||||
throw new Error( |
||||
"PublicationTree: Invalid event kind. Event kind must be in the range 30000-39999" |
||||
); |
||||
} |
||||
|
||||
return `${event.kind}:${event.pubkey}:${event.dTag}`; |
||||
} |
||||
} |
||||
Loading…
Reference in new issue