forked from CringeStudios/gamja
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:
parent
34078d5da7
commit
0dfb7623db
@ -704,6 +704,7 @@ export default class App extends Component {
|
||||
case "BATCH":
|
||||
case "TAGMSG":
|
||||
case "CHATHISTORY":
|
||||
case "ACK":
|
||||
// Ignore these
|
||||
break;
|
||||
default:
|
||||
|
@ -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) => {
|
||||
try {
|
||||
var result = done(event.detail.message);
|
||||
if (result) {
|
||||
this.removeEventListener("message", handleMessage);
|
||||
resolve(result);
|
||||
var msg = event.detail.message;
|
||||
|
||||
var msgLabel = irc.getMessageLabel(msg);
|
||||
if (msgLabel && msgLabel != label) {
|
||||
return;
|
||||
}
|
||||
|
||||
var result;
|
||||
try {
|
||||
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);
|
||||
|
16
lib/irc.js
16
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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user