relay auto reconnection (#252)

This commit is contained in:
BlowaterNostr 2023-10-23 11:59:41 +08:00 committed by GitHub
parent 72c333a234
commit f011aa8aa4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 32 additions and 26 deletions

View File

@ -25,7 +25,7 @@ import { DexieDatabase } from "./dexie-db.ts";
import { About } from "./about.tsx";
import { ProfileSyncer } from "../features/profile.ts";
import { Popover, PopOverInputChannel } from "./components/popover.tsx";
import { Channel } from "https://raw.githubusercontent.com/BlowaterNostr/csp/master/csp.ts";
import { Channel, sleep } from "https://raw.githubusercontent.com/BlowaterNostr/csp/master/csp.ts";
import { GroupChatSyncer, GroupMessageController } from "../features/gm.ts";
import { OtherConfig } from "./config-other.ts";
import { ProfileGetter } from "./search.tsx";
@ -59,7 +59,6 @@ export async function Start(database: DexieDatabase) {
popOverInputChan,
otherConfig,
});
await app.initApp();
model.app = app;
}
@ -181,7 +180,7 @@ export class App {
}
})();
return new App(
const app = new App(
args.database,
args.model,
args.ctx,
@ -197,9 +196,11 @@ export class App {
lamport,
dmController,
);
await app.initApp();
return app;
}
initApp = async () => {
private initApp = async () => {
console.log("App.initApp");
///////////////////////////////////
@ -236,6 +237,19 @@ export class App {
this.relayConfig.saveToLocalStorage(this.ctx);
}
})();
(async () => {
for (;;) {
await sleep(3000);
const urls = this.pool.getClosedRelaysThatShouldBeReconnected();
for (const url of urls) {
await this.pool.removeRelay(url);
const err = await this.pool.addRelayURL(url);
if (err instanceof Error) {
console.error(err);
}
}
}
})();
this.otherConfig.syncFromRelay(this.pool, this.ctx);

View File

@ -123,7 +123,6 @@ export async function* UI_Interaction_Update(args: {
popOverInputChan: args.popOver,
otherConfig,
});
await app.initApp();
model.app = app;
} else {
console.error("failed to sign in");

View File

@ -54,8 +54,7 @@ Deno.test("Relay Config", async () => {
assertEquals(relayConfig.getRelayURLs(), new Set(["wss://relay.damus.io", "wss://somewhere"]));
}
const pri = PrivateKey.Generate();
const ctx = InMemoryAccountContext.New(pri);
const ctx = InMemoryAccountContext.Generate();
const event = await relayConfig.toNostrEvent(ctx);
if (event instanceof Error) fail(event.message);
@ -69,8 +68,7 @@ Deno.test("Relay Config", async () => {
{
const err = await relayConfig.syncWithPool(pool);
if (err != undefined) {
assertEquals(err.length, 1);
assertEquals(err[0].message, "wss://somewhere has been closed, can't wait for it to open");
assertEquals(err.message, "wss://somewhere has been closed, can't wait for it to open");
}
// add one relay to the pool directly
@ -85,8 +83,7 @@ Deno.test("Relay Config", async () => {
// will remove urls that's in the pool but not in the config
const err2 = await relayConfig.syncWithPool(pool);
if (err2 != undefined) {
assertEquals(err2.length, 1);
assertEquals(err2[0].message, "wss://somewhere has been closed, can't wait for it to open");
assertEquals(err2.message, "wss://somewhere has been closed, can't wait for it to open");
}
assertEquals(pool.getRelays().map((r) => r.url), ["wss://relay.damus.io"]); // wirednet is removed
}

View File

@ -85,7 +85,7 @@ export class RelayConfig {
save() {
return Automerge.save(this.config);
}
saveAsHex() {
private saveAsHex() {
const bytes = this.save();
return secp256k1.utils.bytesToHex(bytes);
}
@ -118,22 +118,18 @@ export class RelayConfig {
}
async syncWithPool(pool: ConnectionPool) {
const errors = [];
for (const url of Object.keys(this.config)) {
const err = await pool.addRelayURL(url);
if (err instanceof RelayAlreadyRegistered) {
continue;
} else if (err instanceof Error) {
errors.push(err);
}
}
for (const r of pool.getRelays()) {
if (this.config[r.url] == undefined) {
await pool.removeRelay(r.url);
}
}
if (errors.length > 0) {
return errors;
for (const url of Object.keys(this.config)) {
const err = await pool.addRelayURL(url);
if (err instanceof RelayAlreadyRegistered) {
continue;
} else if (err instanceof Error) {
return err;
}
}
}
}

View File

@ -108,7 +108,7 @@ export class RelaySetting extends Component<RelaySettingProp, RelaySettingState>
const err = await this.props.relayConfig.syncWithPool(this.props.relayPool);
if (err != undefined) {
this.setState({
error: err.map((e) => e.message).join("\n"),
error: err.message,
});
}
this.setState({
@ -151,7 +151,7 @@ export class RelaySetting extends Component<RelaySettingProp, RelaySettingState>
const err = await props.relayConfig.syncWithPool(props.relayPool);
if (err != undefined) {
this.setState({
error: err.map((e) => e.message).join("\n"),
error: err.message,
});
}
this.setState({
@ -221,7 +221,7 @@ export class RelaySetting extends Component<RelaySettingProp, RelaySettingState>
const err = await props.relayConfig.syncWithPool(props.relayPool);
if (err != undefined) {
this.setState({
error: err.map((e) => e.message).join("\n"),
error: err.message,
});
}
this.setState({