PERF: Ignore repeated PresenceChannel leave/join calls (#19638)

If a consumer is calling leave or join on a channel repeatedly, that should not trigger additional HTTP requests
This commit is contained in:
David Taylor 2022-12-28 13:00:08 +00:00 committed by GitHub
parent ebe8b868bf
commit e70ed31a45
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 4 deletions

View File

@ -66,14 +66,18 @@ class PresenceChannel extends EmberObject.extend(Evented) {
}
this.setProperties({ activeOptions });
await this.presenceService._enter(this);
this.set("present", true);
if (!this.present) {
await this.presenceService._enter(this);
this.set("present", true);
}
}
// Mark the current user as leaving this channel
async leave() {
await this.presenceService._leave(this);
this.set("present", false);
if (this.present) {
await this.presenceService._leave(this);
this.set("present", false);
}
}
async subscribe(initialData = null) {

View File

@ -292,6 +292,39 @@ acceptance("Presence - Entering and Leaving", function (needs) {
);
});
test("join should be a no-op if already present", async function (assert) {
const presenceService = this.container.lookup("service:presence");
const channel = presenceService.getChannel("/test/ch1");
await channel.enter();
assert.strictEqual(requests.length, 1, "updated the server for enter");
await channel.enter();
assert.strictEqual(
requests.length,
1,
"does not update the server unnecessarily"
);
});
test("leave should be a no-op if not present", async function (assert) {
const presenceService = this.container.lookup("service:presence");
const channel = presenceService.getChannel("/test/ch1");
await channel.enter();
assert.strictEqual(requests.length, 1, "updated the server for enter");
await channel.leave();
assert.strictEqual(requests.length, 2, "updated the server for leave");
await channel.leave();
assert.strictEqual(
requests.length,
2,
"did not update the server unnecessarily"
);
});
test("raises an error when entering a non-existent channel", async function (assert) {
const presenceService = this.container.lookup("service:presence");
const channel = presenceService.getChannel("/blah/does-not-exist");