PushWorker.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = exports.PushWorker = void 0;
  6. var _deepcopy = _interopRequireDefault(require("deepcopy"));
  7. var _AdaptableController = _interopRequireDefault(require("../Controllers/AdaptableController"));
  8. var _Auth = require("../Auth");
  9. var _Config = _interopRequireDefault(require("../Config"));
  10. var _PushAdapter = require("../Adapters/Push/PushAdapter");
  11. var _rest = _interopRequireDefault(require("../rest"));
  12. var _StatusHandler = require("../StatusHandler");
  13. var utils = _interopRequireWildcard(require("./utils"));
  14. var _ParseMessageQueue = require("../ParseMessageQueue");
  15. var _PushQueue = require("./PushQueue");
  16. var _logger = _interopRequireDefault(require("../logger"));
  17. 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); }
  18. 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; }
  19. function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
  20. // -disable-next
  21. function groupByBadge(installations) {
  22. return installations.reduce((map, installation) => {
  23. const badge = installation.badge + '';
  24. map[badge] = map[badge] || [];
  25. map[badge].push(installation);
  26. return map;
  27. }, {});
  28. }
  29. class PushWorker {
  30. constructor(pushAdapter, subscriberConfig = {}) {
  31. _AdaptableController.default.validateAdapter(pushAdapter, this, _PushAdapter.PushAdapter);
  32. this.adapter = pushAdapter;
  33. this.channel = subscriberConfig.channel || _PushQueue.PushQueue.defaultPushChannel();
  34. this.subscriber = _ParseMessageQueue.ParseMessageQueue.createSubscriber(subscriberConfig);
  35. if (this.subscriber) {
  36. const subscriber = this.subscriber;
  37. subscriber.subscribe(this.channel);
  38. subscriber.on('message', (channel, messageStr) => {
  39. const workItem = JSON.parse(messageStr);
  40. this.run(workItem);
  41. });
  42. }
  43. }
  44. run({
  45. body,
  46. query,
  47. pushStatus,
  48. applicationId,
  49. UTCOffset
  50. }) {
  51. const config = _Config.default.get(applicationId);
  52. const auth = (0, _Auth.master)(config);
  53. const where = utils.applyDeviceTokenExists(query.where);
  54. delete query.where;
  55. pushStatus = (0, _StatusHandler.pushStatusHandler)(config, pushStatus.objectId);
  56. return _rest.default.find(config, auth, '_Installation', where, query).then(({
  57. results
  58. }) => {
  59. if (results.length == 0) {
  60. return;
  61. }
  62. return this.sendToAdapter(body, results, pushStatus, config, UTCOffset);
  63. });
  64. }
  65. sendToAdapter(body, installations, pushStatus, config, UTCOffset) {
  66. // Check if we have locales in the push body
  67. const locales = utils.getLocalesFromPush(body);
  68. if (locales.length > 0) {
  69. // Get all tranformed bodies for each locale
  70. const bodiesPerLocales = utils.bodiesPerLocales(body, locales);
  71. // Group installations on the specified locales (en, fr, default etc...)
  72. const grouppedInstallations = utils.groupByLocaleIdentifier(installations, locales);
  73. const promises = Object.keys(grouppedInstallations).map(locale => {
  74. const installations = grouppedInstallations[locale];
  75. const body = bodiesPerLocales[locale];
  76. return this.sendToAdapter(body, installations, pushStatus, config, UTCOffset);
  77. });
  78. return Promise.all(promises);
  79. }
  80. if (!utils.isPushIncrementing(body)) {
  81. _logger.default.verbose(`Sending push to ${installations.length}`);
  82. return this.adapter.send(body, installations, pushStatus.objectId).then(results => {
  83. return pushStatus.trackSent(results, UTCOffset).then(() => results);
  84. });
  85. }
  86. // Collect the badges to reduce the # of calls
  87. const badgeInstallationsMap = groupByBadge(installations);
  88. // Map the on the badges count and return the send result
  89. const promises = Object.keys(badgeInstallationsMap).map(badge => {
  90. const payload = (0, _deepcopy.default)(body);
  91. payload.data.badge = parseInt(badge);
  92. const installations = badgeInstallationsMap[badge];
  93. return this.sendToAdapter(payload, installations, pushStatus, config, UTCOffset);
  94. });
  95. return Promise.all(promises);
  96. }
  97. }
  98. exports.PushWorker = PushWorker;
  99. var _default = exports.default = PushWorker;
  100. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVlcGNvcHkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9BZGFwdGFibGVDb250cm9sbGVyIiwiX0F1dGgiLCJfQ29uZmlnIiwiX1B1c2hBZGFwdGVyIiwiX3Jlc3QiLCJfU3RhdHVzSGFuZGxlciIsInV0aWxzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfUGFyc2VNZXNzYWdlUXVldWUiLCJfUHVzaFF1ZXVlIiwiX2xvZ2dlciIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImdyb3VwQnlCYWRnZSIsImluc3RhbGxhdGlvbnMiLCJyZWR1Y2UiLCJtYXAiLCJpbnN0YWxsYXRpb24iLCJiYWRnZSIsInB1c2giLCJQdXNoV29ya2VyIiwiY29uc3RydWN0b3IiLCJwdXNoQWRhcHRlciIsInN1YnNjcmliZXJDb25maWciLCJBZGFwdGFibGVDb250cm9sbGVyIiwidmFsaWRhdGVBZGFwdGVyIiwiUHVzaEFkYXB0ZXIiLCJhZGFwdGVyIiwiY2hhbm5lbCIsIlB1c2hRdWV1ZSIsImRlZmF1bHRQdXNoQ2hhbm5lbCIsInN1YnNjcmliZXIiLCJQYXJzZU1lc3NhZ2VRdWV1ZSIsImNyZWF0ZVN1YnNjcmliZXIiLCJzdWJzY3JpYmUiLCJvbiIsIm1lc3NhZ2VTdHIiLCJ3b3JrSXRlbSIsIkpTT04iLCJwYXJzZSIsInJ1biIsImJvZHkiLCJxdWVyeSIsInB1c2hTdGF0dXMiLCJhcHBsaWNhdGlvbklkIiwiVVRDT2Zmc2V0IiwiY29uZmlnIiwiQ29uZmlnIiwiYXV0aCIsIm1hc3RlciIsIndoZXJlIiwiYXBwbHlEZXZpY2VUb2tlbkV4aXN0cyIsInB1c2hTdGF0dXNIYW5kbGVyIiwib2JqZWN0SWQiLCJyZXN0IiwiZmluZCIsInRoZW4iLCJyZXN1bHRzIiwibGVuZ3RoIiwic2VuZFRvQWRhcHRlciIsImxvY2FsZXMiLCJnZXRMb2NhbGVzRnJvbVB1c2giLCJib2RpZXNQZXJMb2NhbGVzIiwiZ3JvdXBwZWRJbnN0YWxsYXRpb25zIiwiZ3JvdXBCeUxvY2FsZUlkZW50aWZpZXIiLCJwcm9taXNlcyIsImtleXMiLCJsb2NhbGUiLCJQcm9taXNlIiwiYWxsIiwiaXNQdXNoSW5jcmVtZW50aW5nIiwibG9nZ2VyIiwidmVyYm9zZSIsInNlbmQiLCJ0cmFja1NlbnQiLCJiYWRnZUluc3RhbGxhdGlvbnNNYXAiLCJwYXlsb2FkIiwiZGVlcGNvcHkiLCJkYXRhIiwicGFyc2VJbnQiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvUHVzaC9QdXNoV29ya2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG4vLyBAZmxvdy1kaXNhYmxlLW5leHRcbmltcG9ydCBkZWVwY29weSBmcm9tICdkZWVwY29weSc7XG5pbXBvcnQgQWRhcHRhYmxlQ29udHJvbGxlciBmcm9tICcuLi9Db250cm9sbGVycy9BZGFwdGFibGVDb250cm9sbGVyJztcbmltcG9ydCB7IG1hc3RlciB9IGZyb20gJy4uL0F1dGgnO1xuaW1wb3J0IENvbmZpZyBmcm9tICcuLi9Db25maWcnO1xuaW1wb3J0IHsgUHVzaEFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9QdXNoL1B1c2hBZGFwdGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IHsgcHVzaFN0YXR1c0hhbmRsZXIgfSBmcm9tICcuLi9TdGF0dXNIYW5kbGVyJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgUGFyc2VNZXNzYWdlUXVldWUgfSBmcm9tICcuLi9QYXJzZU1lc3NhZ2VRdWV1ZSc7XG5pbXBvcnQgeyBQdXNoUXVldWUgfSBmcm9tICcuL1B1c2hRdWV1ZSc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5cbmZ1bmN0aW9uIGdyb3VwQnlCYWRnZShpbnN0YWxsYXRpb25zKSB7XG4gIHJldHVybiBpbnN0YWxsYXRpb25zLnJlZHVjZSgobWFwLCBpbnN0YWxsYXRpb24pID0+IHtcbiAgICBjb25zdCBiYWRnZSA9IGluc3RhbGxhdGlvbi5iYWRnZSArICcnO1xuICAgIG1hcFtiYWRnZV0gPSBtYXBbYmFkZ2VdIHx8IFtdO1xuICAgIG1hcFtiYWRnZV0ucHVzaChpbnN0YWxsYXRpb24pO1xuICAgIHJldHVybiBtYXA7XG4gIH0sIHt9KTtcbn1cblxuZXhwb3J0IGNsYXNzIFB1c2hXb3JrZXIge1xuICBzdWJzY3JpYmVyOiA/YW55O1xuICBhZGFwdGVyOiBhbnk7XG4gIGNoYW5uZWw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwdXNoQWRhcHRlcjogUHVzaEFkYXB0ZXIsIHN1YnNjcmliZXJDb25maWc6IGFueSA9IHt9KSB7XG4gICAgQWRhcHRhYmxlQ29udHJvbGxlci52YWxpZGF0ZUFkYXB0ZXIocHVzaEFkYXB0ZXIsIHRoaXMsIFB1c2hBZGFwdGVyKTtcbiAgICB0aGlzLmFkYXB0ZXIgPSBwdXNoQWRhcHRlcjtcblxuICAgIHRoaXMuY2hhbm5lbCA9IHN1YnNjcmliZXJDb25maWcuY2hhbm5lbCB8fCBQdXNoUXVldWUuZGVmYXVsdFB1c2hDaGFubmVsKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gUGFyc2VNZXNzYWdlUXVldWUuY3JlYXRlU3Vic2NyaWJlcihzdWJzY3JpYmVyQ29uZmlnKTtcbiAgICBpZiAodGhpcy5zdWJzY3JpYmVyKSB7XG4gICAgICBjb25zdCBzdWJzY3JpYmVyID0gdGhpcy5zdWJzY3JpYmVyO1xuICAgICAgc3Vic2NyaWJlci5zdWJzY3JpYmUodGhpcy5jaGFubmVsKTtcbiAgICAgIHN1YnNjcmliZXIub24oJ21lc3NhZ2UnLCAoY2hhbm5lbCwgbWVzc2FnZVN0cikgPT4ge1xuICAgICAgICBjb25zdCB3b3JrSXRlbSA9IEpTT04ucGFyc2UobWVzc2FnZVN0cik7XG4gICAgICAgIHRoaXMucnVuKHdvcmtJdGVtKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJ1bih7IGJvZHksIHF1ZXJ5LCBwdXNoU3RhdHVzLCBhcHBsaWNhdGlvbklkLCBVVENPZmZzZXQgfTogYW55KTogUHJvbWlzZTwqPiB7XG4gICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChhcHBsaWNhdGlvbklkKTtcbiAgICBjb25zdCBhdXRoID0gbWFzdGVyKGNvbmZpZyk7XG4gICAgY29uc3Qgd2hlcmUgPSB1dGlscy5hcHBseURldmljZVRva2VuRXhpc3RzKHF1ZXJ5LndoZXJlKTtcbiAgICBkZWxldGUgcXVlcnkud2hlcmU7XG4gICAgcHVzaFN0YXR1cyA9IHB1c2hTdGF0dXNIYW5kbGVyKGNvbmZpZywgcHVzaFN0YXR1cy5vYmplY3RJZCk7XG4gICAgcmV0dXJuIHJlc3QuZmluZChjb25maWcsIGF1dGgsICdfSW5zdGFsbGF0aW9uJywgd2hlcmUsIHF1ZXJ5KS50aGVuKCh7IHJlc3VsdHMgfSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvQWRhcHRlcihib2R5LCByZXN1bHRzLCBwdXNoU3RhdHVzLCBjb25maWcsIFVUQ09mZnNldCk7XG4gICAgfSk7XG4gIH1cblxuICBzZW5kVG9BZGFwdGVyKFxuICAgIGJvZHk6IGFueSxcbiAgICBpbnN0YWxsYXRpb25zOiBhbnlbXSxcbiAgICBwdXNoU3RhdHVzOiBhbnksXG4gICAgY29uZmlnOiBDb25maWcsXG4gICAgVVRDT2Zmc2V0OiA/YW55XG4gICk6IFByb21pc2U8Kj4ge1xuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbG9jYWxlcyBpbiB0aGUgcHVzaCBib2R5XG4gICAgY29uc3QgbG9jYWxlcyA9IHV0aWxzLmdldExvY2FsZXNGcm9tUHVzaChib2R5KTtcbiAgICBpZiAobG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBHZXQgYWxsIHRyYW5mb3JtZWQgYm9kaWVzIGZvciBlYWNoIGxvY2FsZVxuICAgICAgY29uc3QgYm9kaWVzUGVyTG9jYWxlcyA9IHV0aWxzLmJvZGllc1BlckxvY2FsZXMoYm9keSwgbG9jYWxlcyk7XG5cbiAgICAgIC8vIEdyb3VwIGluc3RhbGxhdGlvbnMgb24gdGhlIHNwZWNpZmllZCBsb2NhbGVzIChlbiwgZnIsIGRlZmF1bHQgZXRjLi4uKVxuICAgICAgY29uc3QgZ3JvdXBwZWRJbnN0YWxsYXRpb25zID0gdXRpbHMuZ3JvdXBCeUxvY2FsZUlkZW50aWZpZXIoaW5zdGFsbGF0aW9ucywgbG9jYWxlcyk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC5rZXlzKGdyb3VwcGVkSW5zdGFsbGF0aW9ucykubWFwKGxvY2FsZSA9PiB7XG4gICAgICAgIGNvbnN0IGluc3RhbGxhdGlvbnMgPSBncm91cHBlZEluc3RhbGxhdGlvbnNbbG9jYWxlXTtcbiAgICAgICAgY29uc3QgYm9keSA9IGJvZGllc1BlckxvY2FsZXNbbG9jYWxlXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvQWRhcHRlcihib2R5LCBpbnN0YWxsYXRpb25zLCBwdXNoU3RhdHVzLCBjb25maWcsIFVUQ09mZnNldCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfVxuXG4gICAgaWYgKCF1dGlscy5pc1B1c2hJbmNyZW1lbnRpbmcoYm9keSkpIHtcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBTZW5kaW5nIHB1c2ggdG8gJHtpbnN0YWxsYXRpb25zLmxlbmd0aH1gKTtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuc2VuZChib2R5LCBpbnN0YWxsYXRpb25zLCBwdXNoU3RhdHVzLm9iamVjdElkKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICByZXR1cm4gcHVzaFN0YXR1cy50cmFja1NlbnQocmVzdWx0cywgVVRDT2Zmc2V0KS50aGVuKCgpID0+IHJlc3VsdHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCB0aGUgYmFkZ2VzIHRvIHJlZHVjZSB0aGUgIyBvZiBjYWxsc1xuICAgIGNvbnN0IGJhZGdlSW5zdGFsbGF0aW9uc01hcCA9IGdyb3VwQnlCYWRnZShpbnN0YWxsYXRpb25zKTtcblxuICAgIC8vIE1hcCB0aGUgb24gdGhlIGJhZGdlcyBjb3VudCBhbmQgcmV0dXJuIHRoZSBzZW5kIHJlc3VsdFxuICAgIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LmtleXMoYmFkZ2VJbnN0YWxsYXRpb25zTWFwKS5tYXAoYmFkZ2UgPT4ge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IGRlZXBjb3B5KGJvZHkpO1xuICAgICAgcGF5bG9hZC5kYXRhLmJhZGdlID0gcGFyc2VJbnQoYmFkZ2UpO1xuICAgICAgY29uc3QgaW5zdGFsbGF0aW9ucyA9IGJhZGdlSW5zdGFsbGF0aW9uc01hcFtiYWRnZV07XG4gICAgICByZXR1cm4gdGhpcy5zZW5kVG9BZGFwdGVyKHBheWxvYWQsIGluc3RhbGxhdGlvbnMsIHB1c2hTdGF0dXMsIGNvbmZpZywgVVRDT2Zmc2V0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1c2hXb3JrZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLElBQUFBLFNBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLG9CQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxLQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxjQUFBLEdBQUFOLE9BQUE7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