import type { CrdtType, InferCrdtJson } from "@pluv/crdt"; import type { StorageSubscriptionCallback } from "@pluv/types"; import type { Subject } from "wonka"; import { makeSubject, subscribe } from "wonka"; export class CrdtNotifier>> { public rootSubject = makeSubject<{ [P in keyof TStorage]: InferCrdtJson; }>(); public subjects = new Map< keyof TStorage, Subject> | null >(); public subject(key: TKey): Subject> { const subject = this.subjects.get(key); if (subject) { return subject as Subject>; } const newSubject = makeSubject>(); this.subjects.set(key, newSubject); return newSubject as Subject>; } public subcribeRoot( callback: (value: { [P in keyof TStorage]: InferCrdtJson; }) => void, ): () => void { return subscribe(callback)(this.rootSubject.source).unsubscribe; } public subscribe( key: TKey, callback: StorageSubscriptionCallback, ): () => void { const subject = this.subject(key); return subscribe(callback)(subject.source).unsubscribe; } }