@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
51 lines (50 loc) • 8.19 kB
JavaScript
import { Evt, to } from "evt";
//#region src/events/EventEmitterishMixin.ts
function EventEmitterishMixin(Base, getEvt) {
const instanceProperties = /* @__PURE__ */ new WeakMap();
return class extends Base {
constructor(...args) {
super(...args);
Evt.setDefaultMaxHandlers(Number.MAX_SAFE_INTEGER);
instanceProperties.set(this, {
evt: getEvt({
constructorArgs: args,
instance: this
}),
ctx: Evt.newCtx()
});
}
on(id, callback) {
const { evt, ctx } = instanceProperties.get(this);
evt.$attach(to(id), ctx, callback);
return this;
}
once(id, callback) {
const { evt, ctx } = instanceProperties.get(this);
evt.$attachOnce(to(id), ctx, callback);
return this;
}
removeListener(id, callback) {
const { ctx } = instanceProperties.get(this);
ctx.getHandlers().filter(({ handler }) => handler.op === to(id) && handler.callback === callback).forEach(({ handler }) => handler.detach());
return this;
}
removeAllListeners(id) {
const { ctx } = instanceProperties.get(this);
if (id === void 0) ctx.done();
else ctx.getHandlers().filter(({ handler }) => handler.op === to(id)).forEach(({ handler }) => handler.detach());
return this;
}
/**
* Returns a promise that resolve after
* each async callbacks have resolved.
*/
async emit(id, event) {
const { evt } = instanceProperties.get(this);
return evt.postAndWait([id, event]);
}
};
}
//#endregion
export { EventEmitterishMixin };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRFbWl0dGVyaXNoTWl4aW4uZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V2ZW50cy9FdmVudEVtaXR0ZXJpc2hNaXhpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEN0eCwgRXZ0LCB0byB9IGZyb20gJ2V2dCc7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmVudEVtaXR0ZXJpc2g8RXZlbnRUeXBlcyBleHRlbmRzIFtzdHJpbmcsIGFueV0+IHtcbiAgICBvbjxUIGV4dGVuZHMgRXZlbnRUeXBlcywgSyBleHRlbmRzIFRbMF0+KFxuICAgICAgICBpZDogSyxcbiAgICAgICAgY2FsbGJhY2s6IChldmVudDogVCBleHRlbmRzIHJlYWRvbmx5IFtLLCBpbmZlciBVXSA/IFUgOiBuZXZlcikgPT4gdm9pZFxuICAgICk6IHRoaXM7XG5cbiAgICBvbmNlOiBFdmVudEVtaXR0ZXJpc2g8RXZlbnRUeXBlcz5bJ29uJ107XG5cbiAgICByZW1vdmVMaXN0ZW5lcjogRXZlbnRFbWl0dGVyaXNoPEV2ZW50VHlwZXM+WydvbiddO1xuXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzKGlkPzogRXZlbnRUeXBlc1swXSk6IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmUgYWZ0ZXJcbiAgICAgKiBlYWNoIGFzeW5jIGNhbGxiYWNrcyBoYXZlIHJlc29sdmVkLlxuICAgICAqL1xuICAgIGVtaXQ8VCBleHRlbmRzIEV2ZW50VHlwZXMsIEsgZXh0ZW5kcyBUWzBdPihcbiAgICAgICAgaWQ6IEssXG4gICAgICAgIGV2ZW50OiBUIGV4dGVuZHMgcmVhZG9ubHkgW0ssIGluZmVyIFVdID8gVSA6IG5ldmVyXG4gICAgKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50RW1pdHRlcmlzaE1peGluPEV2ZW50VHlwZXMgZXh0ZW5kcyBbc3RyaW5nLCBhbnldLCBUQmFzZSBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IHt9PihcbiAgICBCYXNlOiBUQmFzZSxcbiAgICBnZXRFdnQ6IChwYXJhbWV0ZXJzOiB7XG4gICAgICAgIGNvbnN0cnVjdG9yQXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFRCYXNlPjtcbiAgICAgICAgaW5zdGFuY2U6IEluc3RhbmNlVHlwZTxUQmFzZT47XG4gICAgfSkgPT4gRXZ0PEV2ZW50VHlwZXM+XG4pIHtcbiAgICAvLyBOT1RFOiBXZSBjYW4ndCB1c2UgcHJpdmF0ZSBwcm9wZXJ0aWVzIGluIGEgbWl4aW4gaGVuY2UgdGhlIHVzZSBvZiBhIHdlYWsgbWFwLlxuICAgIGNvbnN0IGluc3RhbmNlUHJvcGVydGllcyA9IG5ldyBXZWFrTWFwPFxuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgICAgZXZ0OiBFdnQ8RXZlbnRUeXBlcz47XG4gICAgICAgICAgICBjdHg6IEN0eDtcbiAgICAgICAgfVxuICAgID4oKTtcblxuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBFdmVudEVtaXR0ZXJpc2g8RXZlbnRUeXBlcz4ge1xuICAgICAgICBwdWJsaWMgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuXG4gICAgICAgICAgICAvLyBIYWNrP1xuICAgICAgICAgICAgRXZ0LnNldERlZmF1bHRNYXhIYW5kbGVycyhOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XG5cbiAgICAgICAgICAgIGluc3RhbmNlUHJvcGVydGllcy5zZXQodGhpcywge1xuICAgICAgICAgICAgICAgIGV2dDogZ2V0RXZ0KHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3JBcmdzOiBhcmdzIGFzIENvbnN0cnVjdG9yUGFyYW1ldGVyczxUQmFzZT4sXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiB0aGlzIGFzIEluc3RhbmNlVHlwZTxUQmFzZT5cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjdHg6IEV2dC5uZXdDdHgoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb248VCBleHRlbmRzIEV2ZW50VHlwZXMsIEsgZXh0ZW5kcyBUWzBdPihcbiAgICAgICAgICAgIGlkOiBLLFxuICAgICAgICAgICAgY2FsbGJhY2s6IChldmVudDogVCBleHRlbmRzIHJlYWRvbmx5IFtLLCBpbmZlciBVXSA/IFUgOiBuZXZlcikgPT4gdm9pZFxuICAgICAgICApOiBhbnkge1xuICAgICAgICAgICAgY29uc3QgeyBldnQsIGN0eCB9ID0gaW5zdGFuY2VQcm9wZXJ0aWVzLmdldCh0aGlzKSE7XG5cbiAgICAgICAgICAgIGV2dC4kYXR0YWNoKHRvKGlkKSwgY3R4LCBjYWxsYmFjayk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG9uY2U8VCBleHRlbmRzIEV2ZW50VHlwZXMsIEsgZXh0ZW5kcyBUWzBdPihcbiAgICAgICAgICAgIGlkOiBLLFxuICAgICAgICAgICAgY2FsbGJhY2s6IChldmVudDogVCBleHRlbmRzIHJlYWRvbmx5IFtLLCBpbmZlciBVXSA/IFUgOiBuZXZlcikgPT4gdm9pZFxuICAgICAgICApOiBhbnkge1xuICAgICAgICAgICAgY29uc3QgeyBldnQsIGN0eCB9ID0gaW5zdGFuY2VQcm9wZXJ0aWVzLmdldCh0aGlzKSE7XG5cbiAgICAgICAgICAgIGV2dC4kYXR0YWNoT25jZSh0byhpZCksIGN0eCwgY2FsbGJhY2spO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyByZW1vdmVMaXN0ZW5lcjxUIGV4dGVuZHMgRXZlbnRUeXBlcywgSyBleHRlbmRzIFRbMF0+KFxuICAgICAgICAgICAgaWQ6IEssXG4gICAgICAgICAgICBjYWxsYmFjazogKGV2ZW50OiBUIGV4dGVuZHMgcmVhZG9ubHkgW0ssIGluZmVyIFVdID8gVSA6IG5ldmVyKSA9PiB2b2lkXG4gICAgICAgICk6IGFueSB7XG4gICAgICAgICAgICBjb25zdCB7IGN0eCB9ID0gaW5zdGFuY2VQcm9wZXJ0aWVzLmdldCh0aGlzKSE7XG5cbiAgICAgICAgICAgIGN0eC5nZXRIYW5kbGVycygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeyBoYW5kbGVyIH0pID0+IGhhbmRsZXIub3AgPT09IHRvKGlkKSAmJiBoYW5kbGVyLmNhbGxiYWNrID09PSBjYWxsYmFjaylcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoeyBoYW5kbGVyIH0pID0+IGhhbmRsZXIuZGV0YWNoKCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnMoaWQ/OiBFdmVudFR5cGVzWzBdKTogYW55IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY3R4IH0gPSBpbnN0YW5jZVByb3BlcnRpZXMuZ2V0KHRoaXMpITtcblxuICAgICAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjdHguZG9uZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdHguZ2V0SGFuZGxlcnMoKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh7IGhhbmRsZXIgfSkgPT4gaGFuZGxlci5vcCA9PT0gdG8oaWQpKVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoeyBoYW5kbGVyIH0pID0+IGhhbmRsZXIuZGV0YWNoKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmUgYWZ0ZXJcbiAgICAgICAgICogZWFjaCBhc3luYyBjYWxsYmFja3MgaGF2ZSByZXNvbHZlZC5cbiAgICAgICAgICovXG4gICAgICAgIHB1YmxpYyBhc3luYyBlbWl0PFQgZXh0ZW5kcyBFdmVudFR5cGVzLCBLIGV4dGVuZHMgVFswXT4oXG4gICAgICAgICAgICBpZDogSyxcbiAgICAgICAgICAgIGV2ZW50OiBUIGV4dGVuZHMgcmVhZG9ubHkgW0ssIGluZmVyIFVdID8gVSA6IG5ldmVyXG4gICAgICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgY29uc3QgeyBldnQgfSA9IGluc3RhbmNlUHJvcGVydGllcy5nZXQodGhpcykhO1xuXG4gICAgICAgICAgICByZXR1cm4gZXZ0LnBvc3RBbmRXYWl0KFtpZCwgZXZlbnRdIGFzIGFueSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQTJCQSxTQUFnQixxQkFDWixNQUNBLFFBSUY7Q0FFRSxNQUFNLHFDQUFxQixJQUFJLFFBTTdCO0NBRUYsT0FBTyxjQUFjLEtBQTRDO0VBQzdELFlBQW1CLEdBQUcsTUFBYTtHQUMvQixNQUFNLEdBQUcsSUFBSTtHQUdiLElBQUksc0JBQXNCLE9BQU8sZ0JBQWdCO0dBRWpELG1CQUFtQixJQUFJLE1BQU07SUFDekIsS0FBSyxPQUFPO0tBQ1IsaUJBQWlCO0tBQ2pCLFVBQVU7SUFDZCxDQUFDO0lBQ0QsS0FBSyxJQUFJLE9BQU87R0FDcEIsQ0FBQztFQUNMO0VBRUEsR0FDSSxJQUNBLFVBQ0c7R0FDSCxNQUFNLEVBQUUsS0FBSyxRQUFRLG1CQUFtQixJQUFJLElBQUk7R0FFaEQsSUFBSSxRQUFRLEdBQUcsRUFBRSxHQUFHLEtBQUssUUFBUTtHQUVqQyxPQUFPO0VBQ1g7RUFFQSxLQUNJLElBQ0EsVUFDRztHQUNILE1BQU0sRUFBRSxLQUFLLFFBQVEsbUJBQW1CLElBQUksSUFBSTtHQUVoRCxJQUFJLFlBQVksR0FBRyxFQUFFLEdBQUcsS0FBSyxRQUFRO0dBRXJDLE9BQU87RUFDWDtFQUVBLGVBQ0ksSUFDQSxVQUNHO0dBQ0gsTUFBTSxFQUFFLFFBQVEsbUJBQW1CLElBQUksSUFBSTtHQUUzQyxJQUFJLFlBQVksRUFDWCxRQUFRLEVBQUUsY0FBYyxRQUFRLE9BQU8sR0FBRyxFQUFFLEtBQUssUUFBUSxhQUFhLFFBQVEsRUFDOUUsU0FBUyxFQUFFLGNBQWMsUUFBUSxPQUFPLENBQUM7R0FFOUMsT0FBTztFQUNYO0VBRUEsbUJBQTBCLElBQXlCO0dBQy9DLE1BQU0sRUFBRSxRQUFRLG1CQUFtQixJQUFJLElBQUk7R0FFM0MsSUFBSSxPQUFPLEtBQUEsR0FDUCxJQUFJLEtBQUs7UUFFVCxJQUFJLFlBQVksRUFDWCxRQUFRLEVBQUUsY0FBYyxRQUFRLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFDN0MsU0FBUyxFQUFFLGNBQWMsUUFBUSxPQUFPLENBQUM7R0FHbEQsT0FBTztFQUNYOzs7OztFQU1BLE1BQWEsS0FDVCxJQUNBLE9BQ2E7R0FDYixNQUFNLEVBQUUsUUFBUSxtQkFBbUIsSUFBSSxJQUFJO0dBRTNDLE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLENBQVE7RUFDN0M7Q0FDSjtBQUNKIn0=