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 "BATCH":
case "TAGMSG": case "TAGMSG":
case "CHATHISTORY": case "CHATHISTORY":
case "ACK":
// Ignore these // Ignore these
break; break;
default: default:

View File

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

View File

@ -544,3 +544,19 @@ export function findBatchByType(msg, type) {
} }
return null; 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;
}