From 719462f041d89f08a073f80a729f7725d1b3247f Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 19 Jul 2025 10:41:48 -0300 Subject: [PATCH] something --- abstract-relay.ts | 17 +++++++++++++++-- justfile | 2 +- node-ws-relay.ts | 29 +++++++++++++++++++++++++++++ package.json | 7 +++++-- relay.ts | 16 +++------------- 5 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 node-ws-relay.ts diff --git a/abstract-relay.ts b/abstract-relay.ts index bce8681..6ef2721 100644 --- a/abstract-relay.ts +++ b/abstract-relay.ts @@ -7,9 +7,22 @@ import { Queue, normalizeURL } from './utils.ts' import { makeAuthEvent } from './nip42.ts' import { yieldThread } from './helpers.ts' +export type RelayRecord = Record + +export interface WebSocketBase { + new (url: string | URL, protocols?: string | string[] | undefined): WebSocketBaseConn +} + +export interface WebSocketBaseConn { + onopen: ((this: WebSocketBaseConn, ev: Event) => any) | null + onclose: ((this: WebSocketBaseConn) => void) | null + onerror: ((this: WebSocketBaseConn, _: MessageEvent) => void) | null + onmessage: ((_: MessageEvent) => void) | null +} + export type AbstractRelayConstructorOptions = { verifyEvent: Nostr['verifyEvent'] - websocketImplementation?: typeof WebSocket + websocketImplementation?: WebSocketBase } export class SendingOnClosedConnection extends Error { @@ -43,7 +56,7 @@ export class AbstractRelay { private serial: number = 0 private verifyEvent: Nostr['verifyEvent'] - private _WebSocket: typeof WebSocket + private _WebSocket: WebSocketBase constructor(url: string, opts: AbstractRelayConstructorOptions) { this.url = normalizeURL(url) diff --git a/justfile b/justfile index 2dec0fc..bea0a44 100644 --- a/justfile +++ b/justfile @@ -13,7 +13,7 @@ test-only file: publish: build # publish to jsr first because it is more strict and will catch some errors - perl -i -0pe "s/},\n \"optionalDependencies\": {\n/,/" package.json + jq 'delete(.optionalDependencies)' package.json | sponge package.json jsr publish --allow-dirty git checkout -- package.json diff --git a/node-ws-relay.ts b/node-ws-relay.ts new file mode 100644 index 0000000..b68a93b --- /dev/null +++ b/node-ws-relay.ts @@ -0,0 +1,29 @@ +import WebSocket from 'ws' +import { verifyEvent } from './pure.ts' +import { AbstractRelay, WebSocketBase } from './abstract-relay.ts' + +class NodeWs extends WebSocket implements WebSocketBase { + constructor(url: string | URL, protocols?: string | string[] | undefined) { + super(url, { + protocol: Array.isArray(protocols) ? protocols[0] : protocols, + }) + + setInterval(() => { + this.ping() + }, 29000) + } +} + +export class NodeWsRelay extends AbstractRelay { + constructor(url: string) { + super(url, { verifyEvent, websocketImplementation: NodeWs }) + } + + static async connect(url: string): Promise { + const relay = new NodeWsRelay(url) + await relay.connect() + return relay + } +} + +export * from './abstract-relay.ts' diff --git a/package.json b/package.json index 7ff8f86..94552a6 100644 --- a/package.json +++ b/package.json @@ -241,12 +241,15 @@ "@noble/hashes": "1.3.1", "@scure/base": "1.1.1", "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1", - "nostr-wasm": "0.1.0" + "@scure/bip39": "1.2.1" }, "peerDependencies": { "typescript": ">=5.0.0" }, + "optionalDependencies": { + "nostr-wasm": "0.1.0", + "ws": "^8.18.3" + }, "peerDependenciesMeta": { "typescript": { "optional": true diff --git a/relay.ts b/relay.ts index 7539022..0ef5c78 100644 --- a/relay.ts +++ b/relay.ts @@ -1,21 +1,13 @@ /* global WebSocket */ import { verifyEvent } from './pure.ts' -import { AbstractRelay } from './abstract-relay.ts' +import { AbstractRelay, WebSocketBaseConn } from './abstract-relay.ts' -var _WebSocket: typeof WebSocket - -try { - _WebSocket = WebSocket -} catch {} - -export function useWebSocketImplementation(websocketImplementation: any) { - _WebSocket = websocketImplementation -} +class BrowserWs extends WebSocket implements WebSocketBase, WebSocketBaseConn {} export class Relay extends AbstractRelay { constructor(url: string) { - super(url, { verifyEvent, websocketImplementation: _WebSocket }) + super(url, { verifyEvent, websocketImplementation: BrowserWs }) } static async connect(url: string): Promise { @@ -25,6 +17,4 @@ export class Relay extends AbstractRelay { } } -export type RelayRecord = Record - export * from './abstract-relay.ts'