Add subscribe and publish utils

This commit is contained in:
Jon Staab
2025-03-21 12:47:16 -07:00
parent 1e681b16e2
commit 158f6d50f9
5 changed files with 118 additions and 12 deletions
+46
View File
@@ -0,0 +1,46 @@
import {EventEmitter} from "events"
import {on} from "@welshman/lib"
import {SignedEvent} from "@welshman/util"
import {RelayMessage, isRelayOkMessage} from "./message.js"
import {AbstractAdapter, AdapterEventType} from "./adapter.js"
import {TypedEmitter} from "./util.js"
export enum PublishEventType {
Ok = "publish:event:ok",
}
export type PublishEvents = {
[PublishEventType.Ok]: (id: string, ok: boolean, detail: string, url: string) => void
}
export class Publish extends (EventEmitter as new () => TypedEmitter<PublishEvents>) {
_unsubscriber: () => void
constructor(
readonly adapter: AbstractAdapter,
readonly event: SignedEvent,
readonly verb = "EVENT",
) {
super()
this._unsubscriber = on(
adapter,
AdapterEventType.Receive,
(message: RelayMessage, url: string) => {
if (isRelayOkMessage(message)) {
const [_, id, ok, detail] = message
if (id === event.id) {
this.emit(PublishEventType.Ok, id, ok, detail, url)
}
}
},
)
adapter.send([verb, event])
}
close() {
this._unsubscriber()
}
}