UNPKG

@eggjs/tegg-eventbus-runtime

Version:

tegg eventbus runtime

169 lines 13.1 kB
"use strict"; 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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