From 557ab542b7b2735275db00259376feb76dab65e4 Mon Sep 17 00:00:00 2001 From: Jonathan Staab Date: Tue, 28 Mar 2023 15:07:06 -0500 Subject: [PATCH] Add event bus to pool for socket open/close --- package-lock.json | 4 ++-- package.json | 2 +- src/Pool.ts | 13 +++++++++++-- src/util/Socket.ts | 19 +++++++++++-------- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9bdcff..c07bf23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "paravel", - "version": "0.1.5", + "version": "0.1.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "paravel", - "version": "0.1.5", + "version": "0.1.7", "license": "MIT", "dependencies": { "husky": "^8.0.3", diff --git a/package.json b/package.json index 1d33802..d8802a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "paravel", - "version": "0.1.6", + "version": "0.1.7", "description": "Yet another toolkit for nostr", "repository": { "type": "git", diff --git a/src/Pool.ts b/src/Pool.ts index 705065d..216af13 100644 --- a/src/Pool.ts +++ b/src/Pool.ts @@ -1,16 +1,25 @@ import {Socket} from "./util/Socket" +import {EventBus} from "./util/EventBus" export class Pool { data: Map constructor() { this.data = new Map() + this.bus = new EventBus() } has(url) { return this.data.has(url) } get(url) { if (!this.data.has(url)) { - this.data.set(url, new Socket(url)) + const socket = new Socket(url) + + this.data.set(url, socket) + + socket.bus.addListeners({ + open: () => this.bus.emit('open', {url}), + close: () => this.bus.emit('close', {url}), + }) } return this.data.get(url) @@ -19,7 +28,7 @@ export class Pool { const socket = this.data.get(url) if (socket) { - socket.disconnect() + socket.cleanup() this.data.delete(url) } } diff --git a/src/util/Socket.ts b/src/util/Socket.ts index 766241b..ca20a60 100644 --- a/src/util/Socket.ts +++ b/src/util/Socket.ts @@ -31,6 +31,7 @@ export class Socket { this._onOpen = e => { this.status = Socket.STATUS.READY this.ready?.resolve() + this.bus.emit('open') } this._onMessage = e => { @@ -45,6 +46,7 @@ export class Socket { this.disconnect() this.ready?.reject() this.status = Socket.STATUS.CLOSED + this.bus.emit('close') } } async connect() { @@ -65,14 +67,15 @@ export class Socket { await this.ready?.catch(() => null) } disconnect() { - if (this.ws) { - this.ws.close() - this.ws.removeEventListener("open", this._onOpen) - this.ws.removeEventListener("message", this._onMessage) - this.ws.removeEventListener("error", this._onClose) - this.ws.removeEventListener("close", this._onClose) - this.ws = undefined - } + this.ws?.close() + this.ws?.removeEventListener("open", this._onOpen) + this.ws?.removeEventListener("message", this._onMessage) + this.ws?.removeEventListener("close", this._onClose) + this.ws = undefined + } + cleanup() { + this.disconnect() + this.bus.clear() } handleMessages() { for (const json of this.queue.splice(0, 10)) {