Add support for labeled-response

It's just used to avoid mixing up messages coming from the server
so far.
This commit is contained in:
Simon Ser 2021-06-04 20:38:01 +02:00
parent 34078d5da7
commit 0dfb7623db
3 changed files with 43 additions and 5 deletions

View File

@ -704,6 +704,7 @@ export default class App extends Component {
case "BATCH":
case "TAGMSG":
case "CHATHISTORY":
case "ACK":
// Ignore these
break;
default:

View File

@ -7,6 +7,7 @@ const permanentCaps = [
"batch",
"echo-message",
"invite-notify",
"labeled-response",
"message-tags",
"multi-prefix",
"server-time",
@ -20,6 +21,8 @@ const permanentCaps = [
const RECONNECT_DELAY_SEC = 10;
var lastLabel = 0;
export default class Client extends EventTarget {
static Status = {
DISCONNECTED: "disconnected",
@ -251,6 +254,7 @@ export default class Client extends EventTarget {
name,
type: msg.params[1],
params: msg.params.slice(2),
tags: msg.tags,
parent: msgBatch,
messages: [],
};
@ -491,18 +495,35 @@ export default class Client extends EventTarget {
/* Execute a command that expects a response. `done` is called with message
* events until it returns a truthy value. */
roundtrip(msg, done) {
var label;
if (this.enabledCaps["labeled-response"]) {
lastLabel++;
label = String(lastLabel);
msg.tags = { ...msg.tags, label };
}
return new Promise((resolve, reject) => {
var handleMessage = (event) => {
var msg = event.detail.message;
var msgLabel = irc.getMessageLabel(msg);
if (msgLabel && msgLabel != label) {
return;
}
var result;
try {
var result = done(event.detail.message);
if (result) {
this.removeEventListener("message", handleMessage);
resolve(result);
}
result = done(msg);
} catch (err) {
this.removeEventListener("message", handleMessage);
reject(err);
}
if (result) {
this.removeEventListener("message", handleMessage);
resolve(result);
}
// TODO: handle end of labeled response somehow
};
this.addEventListener("message", handleMessage);

View File

@ -544,3 +544,19 @@ export function findBatchByType(msg, type) {
}
return null;
}
export function getMessageLabel(msg) {
if (msg.tags.label) {
return msg.tags.label;
}
var batch = msg.batch;
while (batch) {
if (batch.tags.label) {
return batch.tags.label;
}
batch = batch.parent;
}
return null;
}