activator-oce-exporter
Version:
Extract Activator binder and convert it to valid OCE mono pacakge
77 lines (65 loc) • 1.72 kB
JavaScript
import { FusionLogger } from './services/fusion-logger';
class EditorMessenger {
static get MAX_QUEUE_SIZE() {
return 100;
}
constructor() {
this.pendingRequests = new Map(); // { messageID: resolver }
this.currentId = 0;
this.isPublishingInited = false;
this.createListener();
this.queue = [];
}
static createEvent(data) {
return new CustomEvent('fusionMessage', {
detail: data,
});
}
static send(data) {
const event = EditorMessenger.createEvent(data);
document.dispatchEvent(event);
}
initPublishing() {
this.isPublishingInited = true;
this.digest();
}
digest() {
this.queue.forEach(data => EditorMessenger.send(data));
this.queue = [];
}
addToQueue(data) {
this.queue.push(data);
if (this.queue.length > EditorMessenger.MAX_QUEUE_SIZE) {
FusionLogger.warn('Max queue size exceeded!', 'EditorMessenger');
this.queue.shift();
}
}
request(data = {}) {
return new Promise((res) => {
this.currentId += 1;
const id = this.currentId;
data.meta = {
id,
isRequest: true,
};
this.pendingRequests.set(id, res);
this.addToQueue(data);
if (this.isPublishingInited) {
this.digest();
}
});
}
createListener() {
document.addEventListener('fusionResponse', ({ detail }) => {
const resolver = this.pendingRequests.get(detail.name);
if (resolver) {
resolver(detail.data);
this.pendingRequests.delete(detail.name);
} else {
FusionLogger.warn('No resolver found', 'EventEmitter');
}
});
}
}
const editorMessenger = new EditorMessenger();
export { editorMessenger };