lib/client: use Error objects for error events

This commit is contained in:
Simon Ser 2021-12-06 23:09:30 +01:00
parent f9ec578fce
commit 31b293fa03
2 changed files with 31 additions and 24 deletions

View file

@ -317,8 +317,21 @@ export default class App extends Component {
}
}
showError(msg) {
this.setState({ error: String(msg) });
showError(err) {
console.error("App error: ", err);
let text;
if (err instanceof Error) {
let l = [];
while (err) {
l.push(err.message);
err = err.cause;
}
text = l.join(": ");
} else {
text = String(err);
}
this.setState({ error: text });
lastErrorID++;
return lastErrorID;
}

View file

@ -126,7 +126,7 @@ export default class Client extends EventTarget {
} catch (err) {
console.error("Failed to create connection:", err);
setTimeout(() => {
this.dispatchEvent(new CustomEvent("error", { detail: "Failed to create connection: " + err }));
this.dispatchError(new Error("Failed to create connection", { cause: err }));
this.setStatus(Client.Status.DISCONNECTED);
}, 0);
return;
@ -137,7 +137,7 @@ export default class Client extends EventTarget {
try {
this.handleMessage(event);
} catch (err) {
this.dispatchEvent(new CustomEvent("error", { detail: err }));
this.dispatchError(err);
this.disconnect();
}
});
@ -146,7 +146,7 @@ export default class Client extends EventTarget {
console.log("Connection closed (code: " + event.code + ")");
if (event.code !== NORMAL_CLOSURE && event.code !== GOING_AWAY) {
this.dispatchEvent(new CustomEvent("error", { detail: "Connection error" }));
this.dispatchError(new Error("Connection error"));
}
this.ws = null;
@ -202,6 +202,10 @@ export default class Client extends EventTarget {
this.dispatchEvent(new CustomEvent("status"));
}
dispatchError(err) {
this.dispatchEvent(new CustomEvent("error", { detail: err }));
}
handleOpen() {
console.log("Connection opened");
this.setStatus(Client.Status.REGISTERING);
@ -264,7 +268,7 @@ export default class Client extends EventTarget {
switch (msg.command) {
case irc.RPL_WELCOME:
if (this.params.saslPlain && !this.supportsCap) {
this.dispatchEvent(new CustomEvent("error", { detail: "Server doesn't support SASL PLAIN" }));
this.dispatchError(new Error("Server doesn't support SASL PLAIN"));
this.disconnect();
return;
}
@ -303,7 +307,7 @@ export default class Client extends EventTarget {
// Both PLAIN and EXTERNAL expect an empty challenge
let challengeStr = msg.params[0];
if (challengeStr != "+") {
this.dispatchEvent(new CustomEvent("error", { detail: "Expected an empty challenge, got: " + challengeStr }));
this.dispatchError(new Error("Expected an empty challenge, got: " + challengeStr));
this.send({ command: "AUTHENTICATE", params: ["*"] });
}
break;
@ -362,9 +366,7 @@ export default class Client extends EventTarget {
}
break;
case "ERROR":
this.dispatchEvent(new CustomEvent("error", {
detail: "Fatal IRC error: " + msg.params[0],
}));
this.dispatchError(new IRCError(msg));
this.disconnect();
break;
case irc.ERR_PASSWDMISMATCH:
@ -374,9 +376,7 @@ export default class Client extends EventTarget {
case irc.ERR_UNAVAILRESOURCE:
case irc.ERR_NOPERMFORHOST:
case irc.ERR_YOUREBANNEDCREEP:
this.dispatchEvent(new CustomEvent("error", {
detail: "Error (" + msg.command + "): " + msg.params[msg.params.length - 1],
}));
this.dispatchError(new IRCError(msg));
if (this.status != Client.Status.REGISTERED) {
this.disconnect();
}
@ -387,15 +387,13 @@ export default class Client extends EventTarget {
}
let reason = msg.params[msg.params.length - 1];
if (msg.params[0] === "BOUNCER" && msg.params[2] === "BIND") {
this.dispatchEvent(new CustomEvent("error", {
detail: "Failed to bind to bouncer network: " + reason,
this.dispatchError(new Error("Failed to bind to bouncer network", {
cause: new IRCError(msg),
}));
this.disconnect();
}
if (msg.params[1] === "ACCOUNT_REQUIRED") {
this.dispatchEvent(new CustomEvent("error", {
detail: reason,
}));
this.dispatchError(new IRCError(msg));
this.disconnect();
}
break;
@ -635,12 +633,8 @@ export default class Client extends EventTarget {
} else if (this.params.saslExternal) {
promise = this.authenticate("EXTERNAL");
}
(promise || Promise.resolve()).catch((msg) => {
if (msg.command) {
this.dispatchEvent(new CustomEvent("error", {
detail: "Authentication error (SASL " + msg.command + "): " + msg.params[1],
}));
}
(promise || Promise.resolve()).catch((err) => {
this.dispatchError(err);
this.disconnect();
});
}