{"version":3,"sources":["common/appContext/eventBus.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,GAAG,CAAC;CACX;AAED,oBAAY,WAAW,GAAG,CAAC,QAAQ,KAAA,KAAK,GAAG,CAAC;AAE5C,UAAU,KAAK;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,UAAU,CAAiC;IAEnD,OAAO,CAAC,KAAK,CAAe;gBAEhB,KAAK,EAAE,KAAK;IAIxB;;;;;;SAMK;IACE,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO;IAajE,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO;IASpE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;IAezC,MAAM,KAAK,YAAY,WAA6E;CACrG;AAYD,wBAAsB,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,CAMhD","file":"../../../common/appContext/eventBus.d.ts","sourcesContent":["import { deepCopy } from '../mutexHelper.js';\nimport { Provider, singletonProvider } from '../provider.js';\nimport AppContext, { Dictionary, getTools } from './appContext.js';\nimport { aliasName as logKey, Logger } from './logging.js';\n\nexport interface BusEvent {\n  evType: string;\n  data: any;\n}\n\nexport type BusListener = (BusEvent) => any;\n\ninterface Tools {\n  logger: Logger;\n}\n\nexport class EventBus {\n  private listenerDb: Dictionary<BusListener[]> = {};\n\n  private tools: Tools = null;\n\n  constructor(tools: Tools) {\n    this.tools = tools;\n  }\n\n  /**\n     * Attach a listener for any event with the given type prefix\n     *\n     * @param evTypePrefix to listen for\n     * @param listener\n     * @return true if listener added, false if listener already present\n     */\n  public addListener(evTypePrefix: string, listener: BusListener): boolean {\n    let listenerList = this.listenerDb[evTypePrefix];\n    if (!listenerList) {\n      listenerList = [];\n      this.listenerDb[evTypePrefix] = listenerList;\n    }\n    if (listenerList.find((it) => it === listener)) {\n      return false;\n    }\n    listenerList.push(listener);\n    return true;\n  }\n\n  public removeListener(evTypePrefix: string, listener: BusListener): boolean {\n    const listenerList = this.listenerDb[evTypePrefix];\n    if (!listenerList) {\n      return false;\n    }\n    this.listenerDb[evTypePrefix] = listenerList.filter((it) => it !== listener);\n    return this.listenerDb[evTypePrefix].length !== listenerList.length;\n  }\n\n  public dispatch(evType: string, data: any) {\n    const ev: BusEvent = deepCopy({ evType, data }, true);\n\n    Object.entries(this.listenerDb).reduce(\n      (acc, [listenerPrefix, listeners]) => {\n        if (evType.startsWith(listenerPrefix)) {\n          acc = acc.concat(listeners);\n        }\n        return acc;\n      }, [],\n    ).forEach(\n      (lambda: BusListener) => Promise.resolve('ok').then(() => lambda(ev)),\n    );\n  }\n\n  static get providerName() { return 'driver/littleware/little-elements/common/appContext/eventBus'; }\n}\n\nAppContext.get().then(\n  (cx) => {\n    cx.putProvider(EventBus.providerName, { logger: logKey },\n      async (toolBox) => {\n        const tools: Tools = await getTools(toolBox) as Tools;\n        return singletonProvider(() => new EventBus(tools));\n      });\n  },\n);\n\nexport async function getBus(): Promise<EventBus> {\n  return AppContext.get().then(\n    (cx) => cx.getProvider(EventBus.providerName),\n  ).then(\n    (provider: Provider<EventBus>) => provider.get(),\n  );\n}\n"]}