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 "BATCH":
|
||||||
case "TAGMSG":
|
case "TAGMSG":
|
||||||
case "CHATHISTORY":
|
case "CHATHISTORY":
|
||||||
|
case "ACK":
|
||||||
// Ignore these
|
// Ignore these
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -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);
|
||||||
|
16
lib/irc.js
16
lib/irc.js
@ -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;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user