Remove relay package, move everything into net
This commit is contained in:
+59
-10
@@ -1,8 +1,16 @@
|
||||
import EventEmitter from "events"
|
||||
import {call, mergeRight, on} from "@welshman/lib"
|
||||
import {isRelayUrl} from "@welshman/util"
|
||||
import {LocalRelay, LOCAL_RELAY_URL} from "@welshman/relay"
|
||||
import {RelayMessage, ClientMessage} from "./message.js"
|
||||
import {call, sleep, mergeRight, on} from "@welshman/lib"
|
||||
import {isRelayUrl, matchFilters, Filter} from "@welshman/util"
|
||||
import {LOCAL_RELAY_URL, Repository} from "./repository"
|
||||
import {
|
||||
RelayMessage,
|
||||
RelayMessageType,
|
||||
ClientMessage,
|
||||
ClientMessageType,
|
||||
ClientEvent,
|
||||
ClientReq,
|
||||
ClientClose,
|
||||
} from "./message.js"
|
||||
import {Socket, SocketEvent} from "./socket.js"
|
||||
import {Unsubscriber} from "./util.js"
|
||||
import {netContext, NetContext} from "./context.js"
|
||||
@@ -53,12 +61,20 @@ export class SocketAdapter extends AbstractAdapter {
|
||||
}
|
||||
|
||||
export class LocalAdapter extends AbstractAdapter {
|
||||
constructor(readonly relay: LocalRelay) {
|
||||
subs = new Map<string, Filter[]>()
|
||||
|
||||
constructor(readonly repository: Repository) {
|
||||
super()
|
||||
|
||||
this._unsubscribers.push(
|
||||
on(relay, "*", (...message: RelayMessage) => {
|
||||
this.emit(AdapterEvent.Receive, message, LOCAL_RELAY_URL)
|
||||
on(repository, "update", ({added}) => {
|
||||
for (const [subId, filters] of this.subs.entries()) {
|
||||
for (const event of added) {
|
||||
if (matchFilters(filters, event)) {
|
||||
this.#receive([RelayMessageType.Event, subId, event])
|
||||
}
|
||||
}
|
||||
}
|
||||
}),
|
||||
)
|
||||
}
|
||||
@@ -72,9 +88,42 @@ export class LocalAdapter extends AbstractAdapter {
|
||||
}
|
||||
|
||||
send(message: ClientMessage) {
|
||||
const [type, ...rest] = message
|
||||
switch (message[0]) {
|
||||
case ClientMessageType.Event:
|
||||
return this.#handleEVENT(message as ClientEvent)
|
||||
case ClientMessageType.Close:
|
||||
return this.#handleCLOSE(message as ClientClose)
|
||||
case ClientMessageType.Req:
|
||||
return this.#handleREQ(message as ClientReq)
|
||||
}
|
||||
}
|
||||
|
||||
this.relay.send(type, ...rest)
|
||||
#receive(message: RelayMessage) {
|
||||
this.emit(AdapterEvent.Receive, message, LOCAL_RELAY_URL)
|
||||
}
|
||||
|
||||
#handleEVENT([_, event]: ClientEvent) {
|
||||
this.repository.publish(event)
|
||||
|
||||
// Callers generally expect async relays
|
||||
sleep(1).then(() => this.#receive([RelayMessageType.Ok, event.id, true, ""]))
|
||||
}
|
||||
|
||||
#handleCLOSE([_, subId]: ClientClose) {
|
||||
this.subs.delete(subId)
|
||||
}
|
||||
|
||||
#handleREQ([_, subId, ...filters]: ClientReq) {
|
||||
this.subs.set(subId, filters)
|
||||
|
||||
// Callers generally expect async relays
|
||||
sleep(1).then(() => {
|
||||
for (const event of this.repository.query(filters)) {
|
||||
this.#receive([RelayMessageType.Event, subId, event])
|
||||
}
|
||||
|
||||
this.#receive([RelayMessageType.Eose, subId])
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,7 +162,7 @@ export const getAdapter = (url: string, adapterContext: AdapterContext = {}) =>
|
||||
}
|
||||
|
||||
if (url === LOCAL_RELAY_URL) {
|
||||
return new LocalAdapter(new LocalRelay(context.repository))
|
||||
return new LocalAdapter(context.repository)
|
||||
}
|
||||
|
||||
if (isRelayUrl(url)) {
|
||||
|
||||
Reference in New Issue
Block a user