UNPKG

mediateur

Version:

A simple library allowing the implementation of the Mediator design pattern

65 lines (64 loc) 2.77 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.clear = exports.mediator = void 0; const multipleHandlers_error_1 = require("./errors/multipleHandlers.error"); const unknownMessage_error_1 = require("./errors/unknownMessage.error"); const middlewares_1 = require("./middlewares"); const registry = new Map(); const metadatas = new Map(); const register = (messageType, messageHandler, metadata = {}) => { var _a; const handlers = (_a = registry.get(messageType)) !== null && _a !== void 0 ? _a : []; registry.set(messageType, [...handlers, messageHandler]); const meta = metadatas.get(messageType); metadatas.set(messageType, Object.assign(Object.assign({}, meta), metadata)); }; const getHandlers = (messageType) => { if (!registry.has(messageType)) { throw new unknownMessage_error_1.UnknownMessageError(messageType); } const handlers = registry.get(messageType); return handlers.map((handler) => middlewares_1.middlewares.apply(messageType, handler)); }; const send = (_a) => __awaiter(void 0, [_a], void 0, function* ({ type, data, }) { const handlers = getHandlers(type); if (handlers.length > 1) { throw new multipleHandlers_error_1.MultipleHandlersError(type); } return handlers[0](data); }); const publish = (_a) => __awaiter(void 0, [_a], void 0, function* ({ type, data }) { const handlers = getHandlers(type); yield Promise.all(handlers.map((handler) => handler(data))); }); const use = (options) => { middlewares_1.middlewares.add(options); }; const getMessageTypes = () => Array.from(registry.keys()).sort(); const getMetadata = (type) => metadatas.get(type); const getAllMetadata = () => Array.from(metadatas.entries(), ([key, value]) => ({ type: key, metadata: value })); const mediator = { register, send, publish, use, getMessageTypes, getMetadata, getAllMetadata, }; exports.mediator = mediator; const clear = () => { registry.clear(); metadatas.clear(); middlewares_1.middlewares.clear(); }; exports.clear = clear;