import { CID } from "./common/cid.js" import { EventEmitter } from "./common/event-emitter.js" import { DistinctivePath, Partition, Partitioned } from "./path/index.js" export { EventEmitter, EventEmitter as Emitter } /** * Events interface. * * Subscribe to events using `on` and unsubscribe using `off`, * alternatively you can use `addListener` and `removeListener`. * * ```ts * program.on("fileSystem:local-change", ({ path, root }) => { * console.log("The file system has changed locally 🔔") * console.log("Changed path:", path) * console.log("New data root CID:", root) * }) * * program.off("fileSystem:publish") * ``` */ export type ListenTo = Pick< EventEmitter, "addListener" | "removeListener" | "on" | "off" > export type FileSystem = { "fileSystem:local-change": { root: CID; path: DistinctivePath> } "fileSystem:publish": { root: CID } } export type Session = { "session:create": { session: S } "session:destroy": { username: string } } export type All = FileSystem & Session export function createEmitter(): EventEmitter { return new EventEmitter() } export function listenTo(emitter: EventEmitter): ListenTo { return { addListener: emitter.addListener.bind(emitter), removeListener: emitter.removeListener.bind(emitter), on: emitter.on.bind(emitter), off: emitter.off.bind(emitter), } } export function merge(a: EventEmitter, b: EventEmitter): EventEmitter { const merged = createEmitter() const aEmit = a.emit const bEmit = b.emit a.emit = (eventName: K, event: (A & B)[ K ]) => { aEmit.call(a, eventName, event) merged.emit(eventName, event) } b.emit = (eventName: K, event: (A & B)[ K ]) => { bEmit.call(b, eventName, event) merged.emit(eventName, event) } return merged }