2023-07-19 08:25:36 +00:00
|
|
|
import {
|
|
|
|
NostrAccountContext,
|
|
|
|
prepareCustomAppDataEvent,
|
|
|
|
} from "https://raw.githubusercontent.com/BlowaterNostr/nostr.ts/main/nostr.ts";
|
|
|
|
import { ConnectionPool } from "https://raw.githubusercontent.com/BlowaterNostr/nostr.ts/main/relay.ts";
|
|
|
|
import { CustomAppData, Decrypted_Nostr_Event } from "../nostr.ts";
|
2023-07-09 07:06:13 +00:00
|
|
|
|
2023-06-30 14:05:57 +00:00
|
|
|
const damus = "wss://relay.damus.io";
|
|
|
|
const nos = "wss://nos.lol";
|
|
|
|
|
2023-07-11 09:19:57 +00:00
|
|
|
export const defaultRelays = [
|
2023-06-30 14:05:57 +00:00
|
|
|
nos,
|
|
|
|
damus,
|
|
|
|
"wss://relay.nostr.wirednet.jp",
|
|
|
|
];
|
|
|
|
|
2023-07-19 08:25:36 +00:00
|
|
|
export class RelayConfig {
|
|
|
|
private readonly relaySet = new Set<string>();
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
public readonly pool: ConnectionPool,
|
|
|
|
public readonly ctx: NostrAccountContext,
|
|
|
|
) {}
|
|
|
|
|
|
|
|
getRelayURLs(): string[] {
|
|
|
|
const urls = this.pool.getRelays().map((r) => r.url);
|
|
|
|
if (urls.length == 0) {
|
|
|
|
return defaultRelays;
|
|
|
|
}
|
|
|
|
return urls;
|
|
|
|
}
|
|
|
|
|
|
|
|
async addEvents(events: Decrypted_Nostr_Event[]) {
|
|
|
|
for (const event of events) {
|
|
|
|
const obj: CustomAppData = JSON.parse(event.decryptedContent);
|
|
|
|
if (obj.type == "AddRelay") {
|
|
|
|
this.relaySet.add(obj.url);
|
|
|
|
} else if (obj.type == "RemoveRelay") {
|
|
|
|
this.relaySet.delete(obj.url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const s = new Set(this.pool.getRelays().map((r) => r.url));
|
|
|
|
// add
|
|
|
|
for (const url of this.relaySet) {
|
|
|
|
if (!s.has(url)) {
|
|
|
|
const err = await this.pool.addRelayURL(url);
|
|
|
|
if (err instanceof Error) {
|
|
|
|
console.error(err);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// remove
|
|
|
|
for (const url of s) {
|
|
|
|
if (!this.relaySet.has(url)) {
|
|
|
|
this.pool.removeRelay(url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async addRelayURL(url: string) {
|
|
|
|
const err = await this.pool.addRelayURL(url);
|
|
|
|
if (err instanceof Error) {
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
const event = await prepareCustomAppDataEvent<CustomAppData>(this.ctx, {
|
|
|
|
type: "AddRelay",
|
|
|
|
url: url,
|
|
|
|
});
|
|
|
|
if (event instanceof Error) {
|
|
|
|
return event;
|
|
|
|
}
|
|
|
|
return this.pool.sendEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
async removeRelay(url: string) {
|
|
|
|
await this.pool.removeRelay(url);
|
|
|
|
const event = await prepareCustomAppDataEvent<CustomAppData>(this.ctx, {
|
|
|
|
type: "RemoveRelay",
|
|
|
|
url: url,
|
|
|
|
});
|
|
|
|
if (event instanceof Error) {
|
|
|
|
return event;
|
|
|
|
}
|
|
|
|
return this.pool.sendEvent(event);
|
|
|
|
}
|
2023-06-30 14:05:57 +00:00
|
|
|
}
|