"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.PushWorker = void 0; var _deepcopy = _interopRequireDefault(require("deepcopy")); var _AdaptableController = _interopRequireDefault(require("../Controllers/AdaptableController")); var _Auth = require("../Auth"); var _Config = _interopRequireDefault(require("../Config")); var _PushAdapter = require("../Adapters/Push/PushAdapter"); var _rest = _interopRequireDefault(require("../rest")); var _StatusHandler = require("../StatusHandler"); var utils = _interopRequireWildcard(require("./utils")); var _ParseMessageQueue = require("../ParseMessageQueue"); var _PushQueue = require("./PushQueue"); var _logger = _interopRequireDefault(require("../logger")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } // -disable-next function groupByBadge(installations) { return installations.reduce((map, installation) => { const badge = installation.badge + ''; map[badge] = map[badge] || []; map[badge].push(installation); return map; }, {}); } class PushWorker { constructor(pushAdapter, subscriberConfig = {}) { _AdaptableController.default.validateAdapter(pushAdapter, this, _PushAdapter.PushAdapter); this.adapter = pushAdapter; this.channel = subscriberConfig.channel || _PushQueue.PushQueue.defaultPushChannel(); this.subscriber = _ParseMessageQueue.ParseMessageQueue.createSubscriber(subscriberConfig); if (this.subscriber) { const subscriber = this.subscriber; subscriber.subscribe(this.channel); subscriber.on('message', (channel, messageStr) => { const workItem = JSON.parse(messageStr); this.run(workItem); }); } } run({ body, query, pushStatus, applicationId, UTCOffset }) { const config = _Config.default.get(applicationId); const auth = (0, _Auth.master)(config); const where = utils.applyDeviceTokenExists(query.where); delete query.where; pushStatus = (0, _StatusHandler.pushStatusHandler)(config, pushStatus.objectId); return _rest.default.find(config, auth, '_Installation', where, query).then(({ results }) => { if (results.length == 0) { return; } return this.sendToAdapter(body, results, pushStatus, config, UTCOffset); }); } sendToAdapter(body, installations, pushStatus, config, UTCOffset) { // Check if we have locales in the push body const locales = utils.getLocalesFromPush(body); if (locales.length > 0) { // Get all tranformed bodies for each locale const bodiesPerLocales = utils.bodiesPerLocales(body, locales); // Group installations on the specified locales (en, fr, default etc...) const grouppedInstallations = utils.groupByLocaleIdentifier(installations, locales); const promises = Object.keys(grouppedInstallations).map(locale => { const installations = grouppedInstallations[locale]; const body = bodiesPerLocales[locale]; return this.sendToAdapter(body, installations, pushStatus, config, UTCOffset); }); return Promise.all(promises); } if (!utils.isPushIncrementing(body)) { _logger.default.verbose(`Sending push to ${installations.length}`); return this.adapter.send(body, installations, pushStatus.objectId).then(results => { return pushStatus.trackSent(results, UTCOffset).then(() => results); }); } // Collect the badges to reduce the # of calls const badgeInstallationsMap = groupByBadge(installations); // Map the on the badges count and return the send result const promises = Object.keys(badgeInstallationsMap).map(badge => { const payload = (0, _deepcopy.default)(body); payload.data.badge = parseInt(badge); const installations = badgeInstallationsMap[badge]; return this.sendToAdapter(payload, installations, pushStatus, config, UTCOffset); }); return Promise.all(promises); } } exports.PushWorker = PushWorker; var _default = exports.default = PushWorker; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVlcGNvcHkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9BZGFwdGFibGVDb250cm9sbGVyIiwiX0F1dGgiLCJfQ29uZmlnIiwiX1B1c2hBZGFwdGVyIiwiX3Jlc3QiLCJfU3RhdHVzSGFuZGxlciIsInV0aWxzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfUGFyc2VNZXNzYWdlUXVldWUiLCJfUHVzaFF1ZXVlIiwiX2xvZ2dlciIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImdyb3VwQnlCYWRnZSIsImluc3RhbGxhdGlvbnMiLCJyZWR1Y2UiLCJtYXAiLCJpbnN0YWxsYXRpb24iLCJiYWRnZSIsInB1c2giLCJQdXNoV29ya2VyIiwiY29uc3RydWN0b3IiLCJwdXNoQWRhcHRlciIsInN1YnNjcmliZXJDb25maWciLCJBZGFwdGFibGVDb250cm9sbGVyIiwidmFsaWRhdGVBZGFwdGVyIiwiUHVzaEFkYXB0ZXIiLCJhZGFwdGVyIiwiY2hhbm5lbCIsIlB1c2hRdWV1ZSIsImRlZmF1bHRQdXNoQ2hhbm5lbCIsInN1YnNjcmliZXIiLCJQYXJzZU1lc3NhZ2VRdWV1ZSIsImNyZWF0ZVN1YnNjcmliZXIiLCJzdWJzY3JpYmUiLCJvbiIsIm1lc3NhZ2VTdHIiLCJ3b3JrSXRlbSIsIkpTT04iLCJwYXJzZSIsInJ1biIsImJvZHkiLCJxdWVyeSIsInB1c2hTdGF0dXMiLCJhcHBsaWNhdGlvbklkIiwiVVRDT2Zmc2V0IiwiY29uZmlnIiwiQ29uZmlnIiwiYXV0aCIsIm1hc3RlciIsIndoZXJlIiwiYXBwbHlEZXZpY2VUb2tlbkV4aXN0cyIsInB1c2hTdGF0dXNIYW5kbGVyIiwib2JqZWN0SWQiLCJyZXN0IiwiZmluZCIsInRoZW4iLCJyZXN1bHRzIiwibGVuZ3RoIiwic2VuZFRvQWRhcHRlciIsImxvY2FsZXMiLCJnZXRMb2NhbGVzRnJvbVB1c2giLCJib2RpZXNQZXJMb2NhbGVzIiwiZ3JvdXBwZWRJbnN0YWxsYXRpb25zIiwiZ3JvdXBCeUxvY2FsZUlkZW50aWZpZXIiLCJwcm9taXNlcyIsImtleXMiLCJsb2NhbGUiLCJQcm9taXNlIiwiYWxsIiwiaXNQdXNoSW5jcmVtZW50aW5nIiwibG9nZ2VyIiwidmVyYm9zZSIsInNlbmQiLCJ0cmFja1NlbnQiLCJiYWRnZUluc3RhbGxhdGlvbnNNYXAiLCJwYXlsb2FkIiwiZGVlcGNvcHkiLCJkYXRhIiwicGFyc2VJbnQiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvUHVzaC9QdXNoV29ya2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG4vLyBAZmxvdy1kaXNhYmxlLW5leHRcbmltcG9ydCBkZWVwY29weSBmcm9tICdkZWVwY29weSc7XG5pbXBvcnQgQWRhcHRhYmxlQ29udHJvbGxlciBmcm9tICcuLi9Db250cm9sbGVycy9BZGFwdGFibGVDb250cm9sbGVyJztcbmltcG9ydCB7IG1hc3RlciB9IGZyb20gJy4uL0F1dGgnO1xuaW1wb3J0IENvbmZpZyBmcm9tICcuLi9Db25maWcnO1xuaW1wb3J0IHsgUHVzaEFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9QdXNoL1B1c2hBZGFwdGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IHsgcHVzaFN0YXR1c0hhbmRsZXIgfSBmcm9tICcuLi9TdGF0dXNIYW5kbGVyJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgUGFyc2VNZXNzYWdlUXVldWUgfSBmcm9tICcuLi9QYXJzZU1lc3NhZ2VRdWV1ZSc7XG5pbXBvcnQgeyBQdXNoUXVldWUgfSBmcm9tICcuL1B1c2hRdWV1ZSc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5cbmZ1bmN0aW9uIGdyb3VwQnlCYWRnZShpbnN0YWxsYXRpb25zKSB7XG4gIHJldHVybiBpbnN0YWxsYXRpb25zLnJlZHVjZSgobWFwLCBpbnN0YWxsYXRpb24pID0+IHtcbiAgICBjb25zdCBiYWRnZSA9IGluc3RhbGxhdGlvbi5iYWRnZSArICcnO1xuICAgIG1hcFtiYWRnZV0gPSBtYXBbYmFkZ2VdIHx8IFtdO1xuICAgIG1hcFtiYWRnZV0ucHVzaChpbnN0YWxsYXRpb24pO1xuICAgIHJldHVybiBtYXA7XG4gIH0sIHt9KTtcbn1cblxuZXhwb3J0IGNsYXNzIFB1c2hXb3JrZXIge1xuICBzdWJzY3JpYmVyOiA/YW55O1xuICBhZGFwdGVyOiBhbnk7XG4gIGNoYW5uZWw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwdXNoQWRhcHRlcjogUHVzaEFkYXB0ZXIsIHN1YnNjcmliZXJDb25maWc6IGFueSA9IHt9KSB7XG4gICAgQWRhcHRhYmxlQ29udHJvbGxlci52YWxpZGF0ZUFkYXB0ZXIocHVzaEFkYXB0ZXIsIHRoaXMsIFB1c2hBZGFwdGVyKTtcbiAgICB0aGlzLmFkYXB0ZXIgPSBwdXNoQWRhcHRlcjtcblxuICAgIHRoaXMuY2hhbm5lbCA9IHN1YnNjcmliZXJDb25maWcuY2hhbm5lbCB8fCBQdXNoUXVldWUuZGVmYXVsdFB1c2hDaGFubmVsKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gUGFyc2VNZXNzYWdlUXVldWUuY3JlYXRlU3Vic2NyaWJlcihzdWJzY3JpYmVyQ29uZmlnKTtcbiAgICBpZiAodGhpcy5zdWJzY3JpYmVyKSB7XG4gICAgICBjb25zdCBzdWJzY3JpYmVyID0gdGhpcy5zdWJzY3JpYmVyO1xuICAgICAgc3Vic2NyaWJlci5zdWJzY3JpYmUodGhpcy5jaGFubmVsKTtcbiAgICAgIHN1YnNjcmliZXIub24oJ21lc3NhZ2UnLCAoY2hhbm5lbCwgbWVzc2FnZVN0cikgPT4ge1xuICAgICAgICBjb25zdCB3b3JrSXRlbSA9IEpTT04ucGFyc2UobWVzc2FnZVN0cik7XG4gICAgICAgIHRoaXMucnVuKHdvcmtJdGVtKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJ1bih7IGJvZHksIHF1ZXJ5LCBwdXNoU3RhdHVzLCBhcHBsaWNhdGlvbklkLCBVVENPZmZzZXQgfTogYW55KTogUHJvbWlzZTwqPiB7XG4gICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChhcHBsaWNhdGlvbklkKTtcbiAgICBjb25zdCBhdXRoID0gbWFzdGVyKGNvbmZpZyk7XG4gICAgY29uc3Qgd2hlcmUgPSB1dGlscy5hcHBseURldmljZVRva2VuRXhpc3RzKHF1ZXJ5LndoZXJlKTtcbiAgICBkZWxldGUgcXVlcnkud2hlcmU7XG4gICAgcHVzaFN0YXR1cyA9IHB1c2hTdGF0dXNIYW5kbGVyKGNvbmZpZywgcHVzaFN0YXR1cy5vYmplY3RJZCk7XG4gICAgcmV0dXJuIHJlc3QuZmluZChjb25maWcsIGF1dGgsICdfSW5zdGFsbGF0aW9uJywgd2hlcmUsIHF1ZXJ5KS50aGVuKCh7IHJlc3VsdHMgfSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvQWRhcHRlcihib2R5LCByZXN1bHRzLCBwdXNoU3RhdHVzLCBjb25maWcsIFVUQ09mZnNldCk7XG4gICAgfSk7XG4gIH1cblxuICBzZW5kVG9BZGFwdGVyKFxuICAgIGJvZHk6IGFueSxcbiAgICBpbnN0YWxsYXRpb25zOiBhbnlbXSxcbiAgICBwdXNoU3RhdHVzOiBhbnksXG4gICAgY29uZmlnOiBDb25maWcsXG4gICAgVVRDT2Zmc2V0OiA/YW55XG4gICk6IFByb21pc2U8Kj4ge1xuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbG9jYWxlcyBpbiB0aGUgcHVzaCBib2R5XG4gICAgY29uc3QgbG9jYWxlcyA9IHV0aWxzLmdldExvY2FsZXNGcm9tUHVzaChib2R5KTtcbiAgICBpZiAobG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBHZXQgYWxsIHRyYW5mb3JtZWQgYm9kaWVzIGZvciBlYWNoIGxvY2FsZVxuICAgICAgY29uc3QgYm9kaWVzUGVyTG9jYWxlcyA9IHV0aWxzLmJvZGllc1BlckxvY2FsZXMoYm9keSwgbG9jYWxlcyk7XG5cbiAgICAgIC8vIEdyb3VwIGluc3RhbGxhdGlvbnMgb24gdGhlIHNwZWNpZmllZCBsb2NhbGVzIChlbiwgZnIsIGRlZmF1bHQgZXRjLi4uKVxuICAgICAgY29uc3QgZ3JvdXBwZWRJbnN0YWxsYXRpb25zID0gdXRpbHMuZ3JvdXBCeUxvY2FsZUlkZW50aWZpZXIoaW5zdGFsbGF0aW9ucywgbG9jYWxlcyk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC5rZXlzKGdyb3VwcGVkSW5zdGFsbGF0aW9ucykubWFwKGxvY2FsZSA9PiB7XG4gICAgICAgIGNvbnN0IGluc3RhbGxhdGlvbnMgPSBncm91cHBlZEluc3RhbGxhdGlvbnNbbG9jYWxlXTtcbiAgICAgICAgY29uc3QgYm9keSA9IGJvZGllc1BlckxvY2FsZXNbbG9jYWxlXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvQWRhcHRlcihib2R5LCBpbnN0YWxsYXRpb25zLCBwdXNoU3RhdHVzLCBjb25maWcsIFVUQ09mZnNldCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfVxuXG4gICAgaWYgKCF1dGlscy5pc1B1c2hJbmNyZW1lbnRpbmcoYm9keSkpIHtcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBTZW5kaW5nIHB1c2ggdG8gJHtpbnN0YWxsYXRpb25zLmxlbmd0aH1gKTtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuc2VuZChib2R5LCBpbnN0YWxsYXRpb25zLCBwdXNoU3RhdHVzLm9iamVjdElkKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICByZXR1cm4gcHVzaFN0YXR1cy50cmFja1NlbnQocmVzdWx0cywgVVRDT2Zmc2V0KS50aGVuKCgpID0+IHJlc3VsdHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCB0aGUgYmFkZ2VzIHRvIHJlZHVjZSB0aGUgIyBvZiBjYWxsc1xuICAgIGNvbnN0IGJhZGdlSW5zdGFsbGF0aW9uc01hcCA9IGdyb3VwQnlCYWRnZShpbnN0YWxsYXRpb25zKTtcblxuICAgIC8vIE1hcCB0aGUgb24gdGhlIGJhZGdlcyBjb3VudCBhbmQgcmV0dXJuIHRoZSBzZW5kIHJlc3VsdFxuICAgIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LmtleXMoYmFkZ2VJbnN0YWxsYXRpb25zTWFwKS5tYXAoYmFkZ2UgPT4ge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IGRlZXBjb3B5KGJvZHkpO1xuICAgICAgcGF5bG9hZC5kYXRhLmJhZGdlID0gcGFyc2VJbnQoYmFkZ2UpO1xuICAgICAgY29uc3QgaW5zdGFsbGF0aW9ucyA9IGJhZGdlSW5zdGFsbGF0aW9uc01hcFtiYWRnZV07XG4gICAgICByZXR1cm4gdGhpcy5zZW5kVG9BZGFwdGVyKHBheWxvYWQsIGluc3RhbGxhdGlvbnMsIHB1c2hTdGF0dXMsIGNvbmZpZywgVVRDT2Zmc2V0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1c2hXb3JrZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLElBQUFBLFNBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLG9CQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxLQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxjQUFBLEdBQUFOLE9BQUE7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