@eggjs/tegg-eventbus-runtime
Version:
tegg eventbus runtime
169 lines • 13.1 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SingletonEventBus = void 0;
const core_decorator_1 = require("@eggjs/core-decorator");
const eventbus_decorator_1 = require("@eggjs/eventbus-decorator");
const tegg_runtime_1 = require("@eggjs/tegg-runtime");
const tegg_types_1 = require("@eggjs/tegg-types");
const EventContextFactory_1 = require("./EventContextFactory");
const EventHandlerFactory_1 = require("./EventHandlerFactory");
const events_1 = require("events");
const await_event_1 = __importDefault(require("await-event"));
const await_first_1 = __importDefault(require("await-first"));
let SingletonEventBus = class SingletonEventBus {
constructor() {
this.emitter = new events_1.EventEmitter();
this.corkIdSequence = 0;
this.corkedEvents = new Map();
}
/**
* only use for ensure event will happen
*/
once(event, listener) {
this.emitter.once(event, listener);
return this;
}
async await(event) {
return (0, await_event_1.default)(this.emitter, event);
}
awaitFirst(...e) {
return (0, await_first_1.default)(this.emitter, e);
}
emit(event, ...args) {
const ctx = this.eventContextFactory.createContext();
const hasListener = this.eventHandlerFactory.hasListeners(event);
this.doEmit(ctx, event, args);
return hasListener;
}
generateCorkId() {
return String(++this.corkIdSequence);
}
cork(corkId) {
let corkEvents = this.corkedEvents.get(corkId);
if (!corkEvents) {
corkEvents = {
times: 0,
events: [],
};
this.corkedEvents.set(corkId, corkEvents);
}
corkEvents.times++;
}
uncork(corkId) {
const corkEvents = this.corkedEvents.get(corkId);
if (!corkEvents) {
throw new Error(`eventbus corkId ${corkId} not found`);
}
if (--corkEvents.times !== 0) {
return false;
}
this.corkedEvents.delete(corkId);
for (const event of corkEvents.events) {
if (event.context) {
this.doEmitWithContext(event.context, event.name, event.args);
}
}
return true;
}
queueEvent(corkId, event) {
const corkdEvents = this.corkedEvents.get(corkId);
if (!corkdEvents) {
throw new Error(`eventbus corkId ${corkId} not found`);
}
corkdEvents.events.push(event);
}
emitWithContext(parentContext, event, args) {
const corkId = parentContext.get(eventbus_decorator_1.CORK_ID);
const hasListener = this.eventHandlerFactory.hasListeners(event);
if (corkId) {
this.queueEvent(corkId, { name: event, args, context: parentContext });
return hasListener;
}
return this.doEmitWithContext(parentContext, event, args);
}
doEmitWithContext(parentContext, event, args) {
const hasListener = this.eventHandlerFactory.hasListeners(event);
const ctx = this.eventContextFactory.createContext(parentContext);
this.doEmit(ctx, event, args);
return hasListener;
}
doOnceEmit(event, args) {
try {
this.emitter.emit(event, ...args);
}
catch (e) {
e.message = `[EventBus] process once event ${String(event)} failed: ${e.message}`;
this.logger.error(e);
}
}
async doEmit(ctx, event, args) {
await tegg_runtime_1.ContextHandler.run(ctx, async () => {
const lifecycle = {};
if (ctx.init) {
await ctx.init(lifecycle);
}
try {
const handlerProtos = this.eventHandlerFactory.getHandlerProtos(event);
await Promise.all(handlerProtos.map(async (proto) => {
try {
await this.eventHandlerFactory.handle(event, proto, args);
}
catch (e) {
// should wait all handlers done then destroy ctx
e.message = `[EventBus] process event ${String(event)} for handler ${String(proto.name)} failed: ${e.message}`;
this.logger.error(e);
}
}));
}
catch (e) {
e.message = `[EventBus] process event ${String(event)} failed: ${e.message}`;
this.logger.error(e);
}
finally {
if (ctx.destroy) {
ctx.destroy(lifecycle).catch(e => {
e.message = '[tegg/SingletonEventBus] destroy tegg ctx failed:' + e.message;
this.logger.error(e);
});
}
}
this.doOnceEmit(event, args);
});
}
};
exports.SingletonEventBus = SingletonEventBus;
__decorate([
(0, core_decorator_1.Inject)(),
__metadata("design:type", EventContextFactory_1.EventContextFactory)
], SingletonEventBus.prototype, "eventContextFactory", void 0);
__decorate([
(0, core_decorator_1.Inject)(),
__metadata("design:type", EventHandlerFactory_1.EventHandlerFactory)
], SingletonEventBus.prototype, "eventHandlerFactory", void 0);
__decorate([
(0, core_decorator_1.Inject)({
name: 'logger',
}),
__metadata("design:type", Object)
], SingletonEventBus.prototype, "logger", void 0);
exports.SingletonEventBus = SingletonEventBus = __decorate([
(0, core_decorator_1.SingletonProto)({
// TODO 需要考虑支持别名
// SingletonEventBus 同时实现了两个接口
name: 'eventBus',
accessLevel: tegg_types_1.AccessLevel.PUBLIC,
})
], SingletonEventBus);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luZ2xldG9uRXZlbnRCdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2luZ2xldG9uRXZlbnRCdXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMERBQStEO0FBQy9ELGtFQUE4RjtBQUU5RixzREFBcUQ7QUFFckQsa0RBQWdEO0FBRWhELCtEQUE0RDtBQUM1RCwrREFBNEQ7QUFDNUQsbUNBQXNDO0FBQ3RDLDhEQUFxQztBQUNyQyw4REFBcUM7QUFtQjlCLElBQU0saUJBQWlCLEdBQXZCLE1BQU0saUJBQWlCO0lBQXZCO1FBQ1ksWUFBTyxHQUFHLElBQUkscUJBQVksRUFBRSxDQUFDO1FBYXRDLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBRVYsaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBbUMsQ0FBQztJQTJIN0UsQ0FBQztJQXpIQzs7T0FFRztJQUNILElBQUksQ0FBeUIsS0FBUSxFQUFFLFFBQW1CO1FBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSyxDQUF5QixLQUFRO1FBQzFDLE9BQU8sSUFBQSxxQkFBVSxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFVBQVUsQ0FBeUIsR0FBRyxDQUFXO1FBQy9DLE9BQU8sSUFBQSxxQkFBVSxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksQ0FBeUIsS0FBUSxFQUFFLEdBQUcsSUFBMEI7UUFDbEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMs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