diff --git a/apps/gui/src/routes/relays/+page.svelte b/apps/gui/src/routes/relays/+page.svelte index 06275fa5..e3daca1b 100644 --- a/apps/gui/src/routes/relays/+page.svelte +++ b/apps/gui/src/routes/relays/+page.svelte @@ -2,7 +2,7 @@ import { relayAggregates } from '$lib/stores/checks.js'; import { doBootstrap } from '$lib/stores/routines'; import { doAggregateCache } from '$lib/stores/app'; - import { onMount } from 'svelte'; + import { onDestroy, onMount } from 'svelte'; import { writable, type Writable } from 'svelte/store'; import { StateManager } from '@nostrwatch/nip66'; import { type default as DataTableType } from '$lib/components/lists/table/DataTable.svelte'; @@ -10,6 +10,7 @@ import type { DataTableConfig } from '$lib/components/lists/table/DataTableTypes'; import { defaultDataTableConfig } from '$lib/components/lists/table/DataTableTypes'; import { default as relaysTableConfig } from '$lib/config/dataTable/relays.js'; + import { userService } from '$lib/stores/user'; export const prerender = true; @@ -56,12 +57,12 @@ doAggregateCache.set(true) loadComponents().then(setConfig); } - - onMount(mount) + const destroy = () => {} + onMount(mount) + onDestroy(destroy)
- {#if $ready} diff --git a/apps/gui/src/routes/relays/[protocol]/[...relay]/+page.svelte b/apps/gui/src/routes/relays/[protocol]/[...relay]/+page.svelte index 191949ce..0877e163 100644 --- a/apps/gui/src/routes/relays/[protocol]/[...relay]/+page.svelte +++ b/apps/gui/src/routes/relays/[protocol]/[...relay]/+page.svelte @@ -123,20 +123,8 @@ } ); - const reset = () => { - if (currentRelay === relayUrl) return; - $nip66?.services?.relay?.unsubscribeAll(); - console.log('!!! RESET'); - loading = true; - currentRelay = ''; - activeTab.set('overview'); - monitors.set([]); - operatorProfile.set(null); - operatorRelays.set(null); - }; - const loadRelayData = async () => { - reset(); + destroy(); await nip66Ready() loadNip11().then(loadOperatorMeta) if (!$isLivesyncing) { @@ -192,6 +180,7 @@ }; const mount = async () => { + if (currentRelay === relayUrl) return; const resume = await pauseLiveSync() loadComponents(); if (typeof window === 'undefined' || typeof navigator === 'undefined') return; @@ -205,23 +194,21 @@ }); }; - onMount(mount); + const destroy = () => { + if (currentRelay === relayUrl) return; + $nip66?.services?.relay?.unsubscribeAll(); + loading = true; + currentRelay = ''; + monitors.set([]); + operatorProfile.set(null); + operatorRelays.set(null); + }; - onDestroy(() => { - reset(); - }); + onMount(mount); + onDestroy(destroy); $: relayUrl = new URL(`${$page.params.protocol}://${$page.params.relay}`).toString(); - $: timesSeen = $checksrelay.length; - $: seenBy = $checksrelay.map((check: any) => check.pubkey); - $: seenByCount = $checksrelay.length; - $: rttAverage = $relayAggregate?.rtt; - $: ipv4 = $relayAggregate?.ipv4; - $: ipv6 = $relayAggregate?.ipv6; $: geocode = $relayAggregate?.geocode; - $: dd = $relayAggregate?.dd; - $: isp = $relayAggregate?.isp; - $: name = $nip11?.name || null; $: description = $nip11?.description || null; $: banner = $nip11?.banner || null; $: icon = $nip11?.icon || null; diff --git a/libraries/auditor/src/base/Auditor.ts b/libraries/auditor/src/base/Auditor.ts index 3a18c1f8..cc593c4e 100644 --- a/libraries/auditor/src/base/Auditor.ts +++ b/libraries/auditor/src/base/Auditor.ts @@ -60,6 +60,10 @@ export class Auditor { return this._suites; } + abort(): void { + Emitter.emit('all:abort'); + } + addSuite(suite: string, options?: any) { this.suites.add(suite); if(options) this._conf.options[suite] = options; diff --git a/libraries/auditor/src/base/Sampler.ts b/libraries/auditor/src/base/Sampler.ts index fd75e430..3428342a 100644 --- a/libraries/auditor/src/base/Sampler.ts +++ b/libraries/auditor/src/base/Sampler.ts @@ -7,6 +7,7 @@ import type { WebSocketWrapper as WebSocket } from '@nostrwatch/websocket'; import { Nip01ClientMessageGenerator } from "#src/nips/Nip01/utils/generators.js"; import type { Note, RelayEventMessage } from "#src/nips/Nip01/interfaces/index.js"; import { generateSubId } from "#utils/nostr.js"; +import { Emitter } from "./Emitter"; export class Sampler { private ws: WebSocket; @@ -16,7 +17,7 @@ export class Sampler { private _timeoutMs: number = 5000; private _totalSamples: number = 0; private _abort: boolean = false; - private signal = new EventEmitter(); + // private signal = new EventEmitter(); private logger: Logger = new Logger('@nostrwatch/auditor:Sampler'); private _ingestors: Ingestor[] = []; @@ -24,6 +25,7 @@ export class Sampler { this.ws = ws; if(maximumSamples) this._maximumSamples = maximumSamples; if(timeout) this._timeoutMs = timeout + Emitter.on('all:abort', this.abort.bind(this)) } get ingestors(): Ingestor[] { @@ -62,7 +64,8 @@ export class Sampler { break; } case 'EOSE': { - this.signal.emit('WS:EOSE'); + // this.signal.emit('ws:eose'); + Emitter.emit(`ws:eose:${this.subId}`); break; } } @@ -121,12 +124,14 @@ export class Sampler { }, 100); const cleanup = () => { - this.signal.off('WS:EOSE', onEose); + Emitter.off(`ws:eose:${this.subId}`, onEose); + // this.signal.off('ws:eose', onEose); clearTimeout(timeout); clearInterval(interval); }; - - this.signal.once('WS:EOSE', onEose); + + Emitter.once(`ws:eose:${this.subId}`, onEose); + // this.signal.once('ws:eose', onEose); }); } diff --git a/libraries/auditor/src/base/Suite.ts b/libraries/auditor/src/base/Suite.ts index e2104797..dadedf2d 100644 --- a/libraries/auditor/src/base/Suite.ts +++ b/libraries/auditor/src/base/Suite.ts @@ -97,7 +97,7 @@ export abstract class Suite implements ISuite { private _sampler: Sampler; private _ingestors: Ingestor[] = []; - protected ajv = new Ajv(); + protected ajv = new Ajv({strict: false}); protected ws: WebSocket; protected signal: EventEmitter = new EventEmitter(); protected result: ISuiteResult = structuredClone(defaultSuiteResult); diff --git a/libraries/auditor/src/base/SuiteTest.ts b/libraries/auditor/src/base/SuiteTest.ts index c574fb0a..28ff8bde 100644 --- a/libraries/auditor/src/base/SuiteTest.ts +++ b/libraries/auditor/src/base/SuiteTest.ts @@ -15,6 +15,7 @@ import { Nip01ClientMessageGenerator } from "#src/nips/Nip01/utils/generators.j import type { INip01Filter, Note, RelayEventMessage, RelayNoticeMessage } from "#src/nips/Nip01/interfaces/index.js"; import { SuiteState } from "./SuiteState.js"; +import { Emitter } from "./Emitter.js"; export type CompleteOnType = "off" | "maxEvents" | "EOSE"; export type CompleteOnTypeArray = [CompleteOnType, ...CompleteOnType[]]; @@ -89,6 +90,7 @@ export abstract class SuiteTest implements ISuiteTest { this.logger.registerLogger('pass', 'info', chalk.green.bold); this.logger.registerLogger('fail', 'info', chalk.redBright.bold); this.logger.registerLogger('skipped', 'info', chalk.bgGray.yellow.bold); + Emitter.on('all:abort', this.abort.bind(this)) } get filters(): INip01Filter[] { diff --git a/libraries/auditor/src/nips/Nip42/schemata/client-auth-event.schema.json b/libraries/auditor/src/nips/Nip42/schemata/client-auth-event.schema.json index 8618b514..5ce29b41 100644 --- a/libraries/auditor/src/nips/Nip42/schemata/client-auth-event.schema.json +++ b/libraries/auditor/src/nips/Nip42/schemata/client-auth-event.schema.json @@ -1,7 +1,13 @@ ---- -type: "array" -items: -- const: "AUTH" -- $ref: "@/note.yaml" -minItems: "2" -maxItems: "2" \ No newline at end of file +{ + "type": "array", + "items": [ + { + "const": "AUTH" + }, + { + "$ref": "../../Nip01/schemata/note.schema.json" + } + ], + "minItems": 2, + "maxItems": 2 + } \ No newline at end of file diff --git a/libraries/nip66/src/core/WebsocketAdapter.ts b/libraries/nip66/src/core/WebsocketAdapter.ts index 37fa459b..30db5f4f 100644 --- a/libraries/nip66/src/core/WebsocketAdapter.ts +++ b/libraries/nip66/src/core/WebsocketAdapter.ts @@ -11,7 +11,7 @@ export interface SubscribeHandlers { onevent?: (event: any) => void onevents?: (events: any[]) => void oneose?: () => void - onclose?: () => void + onclose?: (subId: string) => void } export interface IWebsocketAdapterCallbacks { onNotice?: (notice: any) => void diff --git a/libraries/nip66/src/services/Service.ts b/libraries/nip66/src/services/Service.ts index b38a221b..e77fd13c 100644 --- a/libraries/nip66/src/services/Service.ts +++ b/libraries/nip66/src/services/Service.ts @@ -78,23 +78,26 @@ export class Service { } async subscribe(args: FetchOptions, callbacks?: SubscribeHandlers): Promise { - console.log(`Service.subscribe()`) await this.ready(); - console.log(`Service: is ready`) let { filters, relays, options, hash } = args; if(!hash) { hash = deterministicHash(args) - console.log('Service.subscribe:hash', hash) } - console.log('Service add hash', hash) this.subscriptions.add(hash) if(filters) { this.fetchFromCache(filters, callbacks); } + if(callbacks) { + callbacks.onclose = (subId: string) => { + this.subscriptions.delete(subId) + callbacks?.onclose?.(subId) + } + } const message: WebsocketRequestBody = { filters, relays, options, hash }; const result = await this.websocketAdapter.subscribe(message, callbacks); - console.log('Service delete hash', hash) - this.subscriptions.delete(hash) + if(!options?.keepAlive) { + this.subscriptions.delete(hash) + } return typeof result === 'boolean'? []: result; } @@ -222,7 +225,6 @@ export class Service { } const websocketEvents = await this.fetchFromWebsocket(args, _callbacks); - console.log('fetchFromWebsocket resolved') websocketEvents.forEach(maybeAddEventToMap); const finalEvents = Array.from(events.values()); @@ -243,5 +245,4 @@ export class Service { if (!this._groupedRelays?.[from]) return; this._groupedRelays[from] = this._groupedRelays[from].filter((r) => r !== relay); } - } \ No newline at end of file