"use strict" let Gather = require("./gather"); let gatherCallbacks = {}; let archiveUpdatedCallback = () => {}; let winston = require("winston"); let mongoose = require("mongoose"); let ArchivedGather = mongoose.model("ArchivedGather"); // Register initial callback to reset gather when state is `done` gatherCallbacks['onDone'] = [function () { rotateGather(); }]; let newGather = () => { return SingletonClass.current = Gather({ onEvent: function () { gatherCallbacks['onEvent'].forEach(cb => { cb.apply(this, [].slice.call(arguments)) }); }, onDone: function () { gatherCallbacks['onDone'].forEach(cb => { cb.apply(this, [].slice.call(arguments)) }); } }); }; let archiveGather = gather => { ArchivedGather.archive(gather, (error, result) => { if (error) return winston.error(error); if (archiveUpdatedCallback && typeof archiveUpdatedCallback === 'function') { archiveUpdatedCallback(); } }); }; let rotateGather = () => { if (SingletonClass.current) { SingletonClass.previous = SingletonClass.current; archiveGather(SingletonClass.previous); } return newGather(); } let SingletonClass = { registerCallback: function (type, method) { if (gatherCallbacks[type]) { gatherCallbacks[type].push(method); } else { gatherCallbacks[type] = [method]; } }, onArchiveUpdate: function (callback) { archiveUpdatedCallback = callback; }, restart: function () { this.previousGather = undefined; this.current = undefined; return newGather(); }, reset: function () { return newGather(); }, current: Gather(), previous: undefined }; module.exports = SingletonClass;