mirror of
https://github.com/nbd-wtf/nostr-tools.git
synced 2025-12-08 16:28:49 +00:00
Type sub event handler (#156)
* RelayEvent allow Promises * type Sub EventHandler * Update relay.ts
This commit is contained in:
14
pool.ts
14
pool.ts
@@ -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>)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
74
relay.ts
74
relay.ts
@@ -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)
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user