diff --git a/awx/ui/client/features/output/index.js b/awx/ui/client/features/output/index.js index 0bb295a714..372d28221f 100644 --- a/awx/ui/client/features/output/index.js +++ b/awx/ui/client/features/output/index.js @@ -8,6 +8,7 @@ import RenderService from '~features/output/render.service'; import ScrollService from '~features/output/scroll.service'; import EngineService from '~features/output/engine.service'; import StatusService from '~features/output/status.service'; +import MessageService from '~features/output/message.service'; import LegacyRedirect from '~features/output/legacy.route'; import DetailsDirective from '~features/output/details.directive'; @@ -221,6 +222,7 @@ angular .service('JobRenderService', RenderService) .service('JobEventEngine', EngineService) .service('JobStatusService', StatusService) + .service('JobMessageService', MessageService) .directive('atJobDetails', DetailsDirective) .directive('atJobSearch', SearchDirective) .directive('atJobStats', StatsDirective) diff --git a/awx/ui/client/features/output/message.service.js b/awx/ui/client/features/output/message.service.js new file mode 100644 index 0000000000..7e15ff302f --- /dev/null +++ b/awx/ui/client/features/output/message.service.js @@ -0,0 +1,41 @@ +function MessageService () { + const listeners = {}; + const registry = {}; + + this.subscribe = (key, listener) => { + registry[key] = registry[key] || 0; + + listeners[key] = listeners[key] || {}; + listeners[key][registry[key]] = listener; + + const unsubscribe = this.createCallback(key, registry[key]); + + registry[key]++; + + return unsubscribe; + }; + + this.dispatch = (key, data) => { + if (!listeners[key]) { + return; + } + + const indices = Object.keys(listeners[key]); + + for (let i = 0; i < indices.length; i++) { + listeners[key][indices[i]](data); + } + }; + + this.createCallback = (key, index) => { + const callback = () => { + if (listeners[key]) { + delete listeners[key][index]; + } + }; + + return callback; + }; +} + +export default MessageService;