Source code
Revision control
Copy as Markdown
Other Tools
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
import { Module } from "chrome://remote/content/shared/messagehandler/Module.sys.mjs";
class EventEmitterModule extends Module {
#isSubscribed;
#subscribedEvents;
constructor(messageHandler) {
super(messageHandler);
this.#isSubscribed = false;
this.#subscribedEvents = new Set();
}
destroy() {}
/**
* Commands
*/
emitTestEvent() {
if (this.#isSubscribed) {
const text = `event from ${this.messageHandler.contextId}`;
this.emitEvent("eventemitter.testEvent", { text });
}
// Emit another event consistently for monitoring during the test.
this.emitEvent("eventemitter.monitoringEvent", {});
}
isSubscribed() {
return this.#isSubscribed;
}
_applySessionData(params) {
const { category } = params;
if (category === "event") {
const filteredSessionData = params.sessionData.filter(item =>
this.messageHandler.matchesContext(item.contextDescriptor)
);
for (const event of this.#subscribedEvents.values()) {
const hasSessionItem = filteredSessionData.some(
item => item.value === event
);
// If there are no session items for this context, we should unsubscribe from the event.
if (!hasSessionItem) {
this.#unsubscribeEvent(event);
}
}
// Subscribe to all events, which have an item in SessionData
for (const { value } of filteredSessionData) {
this.#subscribeEvent(value);
}
}
}
#subscribeEvent(event) {
if (event === "eventemitter.testEvent") {
if (this.#isSubscribed) {
throw new Error("Already subscribed to eventemitter.testEvent");
}
this.#isSubscribed = true;
this.#subscribedEvents.add(event);
}
}
#unsubscribeEvent(event) {
if (event === "eventemitter.testEvent") {
if (!this.#isSubscribed) {
throw new Error("Not subscribed to eventemitter.testEvent");
}
this.#isSubscribed = false;
this.#subscribedEvents.delete(event);
}
}
}
export const eventemitter = EventEmitterModule;