Type sub event handler (#156)

* RelayEvent allow Promises

* type Sub EventHandler

* Update relay.ts
This commit is contained in:
BilligsterUser
2023-03-12 12:51:38 +01:00
committed by GitHub
parent d244b62c7a
commit 6b73bbf8a3
2 changed files with 55 additions and 33 deletions

14
pool.ts
View File

@@ -107,19 +107,17 @@ export class SimplePool {
subs.forEach(sub => sub.unsub()) subs.forEach(sub => sub.unsub())
}, },
on(type, cb) { on(type, cb) {
switch (type) { if (type === 'event') {
case 'event': eventListeners.add(cb)
eventListeners.add(cb) } else if (type === 'eose') {
break eoseListeners.add(cb as () => void | Promise<void>)
case 'eose':
eoseListeners.add(cb)
break
} }
}, },
off(type, cb) { off(type, cb) {
if (type === 'event') { if (type === 'event') {
eventListeners.delete(cb) eventListeners.delete(cb)
} else if (type === 'eose') eoseListeners.delete(cb) } else if (type === 'eose')
eoseListeners.delete(cb as () => void | Promise<void>)
} }
} }

View File

@@ -5,12 +5,15 @@ import {Filter, matchFilters} from './filter'
import {getHex64, getSubscriptionId} from './fakejson' import {getHex64, getSubscriptionId} from './fakejson'
type RelayEvent = { type RelayEvent = {
connect: () => void connect: () => void | Promise<void>
disconnect: () => void disconnect: () => void | Promise<void>
error: () => void error: () => void | Promise<void>
notice: (msg: string) => void notice: (msg: string) => void | Promise<void>
}
type SubEvent = {
event: (event: Event) => void | Promise<void>
eose: () => void | Promise<void>
} }
export type Relay = { export type Relay = {
url: string url: string
status: number status: number
@@ -20,8 +23,14 @@ export type Relay = {
list: (filters: Filter[], opts?: SubscriptionOptions) => Promise<Event[]> list: (filters: Filter[], opts?: SubscriptionOptions) => Promise<Event[]>
get: (filter: Filter, opts?: SubscriptionOptions) => Promise<Event | null> get: (filter: Filter, opts?: SubscriptionOptions) => Promise<Event | null>
publish: (event: Event) => Pub publish: (event: Event) => Pub
off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(event: T, listener: U) => void off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(
on: <T extends keyof RelayEvent, U extends RelayEvent[T]>(event: T, listener: U) => void event: T,
listener: U
) => void
on: <T extends keyof RelayEvent, U extends RelayEvent[T]>(
event: T,
listener: U
) => void
} }
export type Pub = { export type Pub = {
on: (type: 'ok' | 'failed', cb: any) => void on: (type: 'ok' | 'failed', cb: any) => void
@@ -30,8 +39,14 @@ export type Pub = {
export type Sub = { export type Sub = {
sub: (filters: Filter[], opts: SubscriptionOptions) => Sub sub: (filters: Filter[], opts: SubscriptionOptions) => Sub
unsub: () => void unsub: () => void
on: (type: 'event' | 'eose', cb: any) => void on: <T extends keyof SubEvent, U extends SubEvent[T]>(
off: (type: 'event' | 'eose', cb: any) => void event: T,
listener: U
) => void
off: <T extends keyof SubEvent, U extends SubEvent[T]>(
event: T,
listener: U
) => void
} }
export type SubscriptionOptions = { export type SubscriptionOptions = {
@@ -51,17 +66,14 @@ export function relayInit(
var ws: WebSocket var ws: WebSocket
var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {} var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {}
var listeners: { [TK in keyof RelayEvent]: RelayEvent[TK][]} = { var listeners: {[TK in keyof RelayEvent]: RelayEvent[TK][]} = {
connect: [], connect: [],
disconnect: [], disconnect: [],
error: [], error: [],
notice: [] notice: []
} }
var subListeners: { var subListeners: {
[subid: string]: { [subid: string]: {[TK in keyof SubEvent]: SubEvent[TK][]}
event: Array<(event: Event) => void>
eose: Array<() => void>
}
} = {} } = {}
var pubListeners: { var pubListeners: {
[eventid: string]: { [eventid: string]: {
@@ -225,14 +237,20 @@ export function relayInit(
delete subListeners[subid] delete subListeners[subid]
trySend(['CLOSE', subid]) trySend(['CLOSE', subid])
}, },
on: (type: 'event' | 'eose', cb: any): void => { on: <T extends keyof SubEvent, U extends SubEvent[T]>(
type: T,
cb: U
): void => {
subListeners[subid] = subListeners[subid] || { subListeners[subid] = subListeners[subid] || {
event: [], event: [],
eose: [] eose: []
} }
subListeners[subid][type].push(cb) subListeners[subid][type].push(cb)
}, },
off: (type: 'event' | 'eose', cb: any): void => { off: <T extends keyof SubEvent, U extends SubEvent[T]>(
type: T,
cb: U
): void => {
let listeners = subListeners[subid] let listeners = subListeners[subid]
let idx = listeners[type].indexOf(cb) let idx = listeners[type].indexOf(cb)
if (idx >= 0) listeners[type].splice(idx, 1) if (idx >= 0) listeners[type].splice(idx, 1)
@@ -242,15 +260,21 @@ export function relayInit(
return { return {
url, url,
sub, sub,
on: <T extends keyof RelayEvent, U extends RelayEvent[T]>(type: T, cb: U): void => { on: <T extends keyof RelayEvent, U extends RelayEvent[T]>(
listeners[type].push(cb) type: T,
if (type === 'connect' && ws?.readyState === 1) { cb: U
// i would love to know why we need this ): void => {
(cb as ()=> void)() listeners[type].push(cb)
} if (type === 'connect' && ws?.readyState === 1) {
}, // i would love to know why we need this
off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(type: T, cb: U): void => { ;(cb as () => void)()
}
},
off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(
type: T,
cb: U
): void => {
let index = listeners[type].indexOf(cb) let index = listeners[type].indexOf(cb)
if (index !== -1) listeners[type].splice(index, 1) if (index !== -1) listeners[type].splice(index, 1)
}, },