diff --git a/components/app.js b/components/app.js index c4f0507..bdee786 100644 --- a/components/app.js +++ b/components/app.js @@ -704,6 +704,7 @@ export default class App extends Component { case "BATCH": case "TAGMSG": case "CHATHISTORY": + case "ACK": // Ignore these break; default: diff --git a/lib/client.js b/lib/client.js index a46aa82..f53a890 100644 --- a/lib/client.js +++ b/lib/client.js @@ -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); diff --git a/lib/irc.js b/lib/irc.js index 1669d87..a7e5365 100644 --- a/lib/irc.js +++ b/lib/irc.js @@ -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; +}