@suprsend/node-sdk 1.9.1 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports._BulkWorkflowTriggerChunk = exports.BulkWorkflowTrigger = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
+ var _axios = _interopRequireDefault(require("axios"));
15
+ var _lodash = require("lodash");
16
+ var _signature = _interopRequireDefault(require("./signature"));
17
+ var _bulk_response = _interopRequireDefault(require("./bulk_response"));
18
+ var _utils = require("./utils");
19
+ var _workflow_request = _interopRequireDefault(require("./workflow_request"));
20
+ var _constants = require("./constants");
21
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
22
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
23
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
24
+ var _BulkWorkflowTriggerChunk = /*#__PURE__*/function () {
25
+ function _BulkWorkflowTriggerChunk(config) {
26
+ (0, _classCallCheck2["default"])(this, _BulkWorkflowTriggerChunk);
27
+ this.config = config;
28
+ this.url = this.__url = "".concat(this.config.base_url, "trigger/");
29
+ this.__chunk = [];
30
+ this.__running_size = 0;
31
+ this.__running_length = 0;
32
+ this.response = null;
33
+ }
34
+ (0, _createClass2["default"])(_BulkWorkflowTriggerChunk, [{
35
+ key: "_get_headers",
36
+ value: function _get_headers() {
37
+ return {
38
+ "Content-Type": "application/json; charset=utf-8",
39
+ "User-Agent": this.config.user_agent,
40
+ Date: new Date().toUTCString()
41
+ };
42
+ }
43
+ }, {
44
+ key: "__add_body_to_chunk",
45
+ value: function __add_body_to_chunk(body, body_size) {
46
+ this.__running_size += body_size;
47
+ this.__chunk.push(body);
48
+ this.__running_length++;
49
+ }
50
+ }, {
51
+ key: "_check_limit_reached",
52
+ value: function _check_limit_reached() {
53
+ return this.__running_length >= _BulkWorkflowTriggerChunk._max_records_in_chunk || this.__running_size >= _BulkWorkflowTriggerChunk._chunk_apparent_size_in_bytes;
54
+ }
55
+ }, {
56
+ key: "try_to_add_into_chunk",
57
+ value: function try_to_add_into_chunk(body, body_size) {
58
+ if (!body) {
59
+ return true;
60
+ }
61
+ if (this._check_limit_reached()) {
62
+ return false;
63
+ }
64
+ if (body_size > _constants.SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES) {
65
+ throw new _utils.InputValueError("workflow body too big - ".concat(body_size, " Bytes, must not exceed ").concat(_constants.SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES_READABLE));
66
+ }
67
+ if (this.__running_size + body_size > _BulkWorkflowTriggerChunk._chunk_apparent_size_in_bytes) {
68
+ return false;
69
+ }
70
+ if (!_constants.ALLOW_ATTACHMENTS_IN_BULK_API) {
71
+ delete body.data["$attachments"];
72
+ }
73
+ this.__add_body_to_chunk(body, body_size);
74
+ return true;
75
+ }
76
+ }, {
77
+ key: "trigger",
78
+ value: function () {
79
+ var _trigger = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
80
+ var headers, content_text, signature, resp, resp_data;
81
+ return _regenerator["default"].wrap(function _callee$(_context) {
82
+ while (1) {
83
+ switch (_context.prev = _context.next) {
84
+ case 0:
85
+ headers = this._get_headers();
86
+ content_text = JSON.stringify(this.__chunk);
87
+ signature = (0, _signature["default"])(this.__url, "POST", content_text, headers, this.config.workspace_secret);
88
+ headers["Authorization"] = "".concat(this.config.workspace_key, ":").concat(signature);
89
+ _context.prev = 4;
90
+ _context.next = 7;
91
+ return _axios["default"].post(this.__url, content_text, {
92
+ headers: headers,
93
+ transformResponse: [function (data) {
94
+ return data;
95
+ }] // dont assume type of response
96
+ });
97
+ case 7:
98
+ resp = _context.sent;
99
+ this.response = {
100
+ status: "success",
101
+ status_code: resp.status,
102
+ total: this.__chunk.length,
103
+ success: this.__chunk.length,
104
+ failure: 0,
105
+ failed_records: []
106
+ };
107
+ _context.next = 14;
108
+ break;
109
+ case 11:
110
+ _context.prev = 11;
111
+ _context.t0 = _context["catch"](4);
112
+ if (_context.t0 !== null && _context.t0 !== void 0 && _context.t0.response) {
113
+ resp_data = _context.t0.response;
114
+ this.response = {
115
+ status: "fail",
116
+ status_code: resp_data.status,
117
+ total: this.__chunk.length,
118
+ success: 0,
119
+ failure: this.__chunk.length,
120
+ failed_records: this.__chunk.map(function (record) {
121
+ return {
122
+ record: record,
123
+ error: resp_data.data,
124
+ code: resp_data.status
125
+ };
126
+ })
127
+ };
128
+ } else {
129
+ this.response = {
130
+ status: "fail",
131
+ status_code: 500,
132
+ total: this.__chunk.length,
133
+ success: 0,
134
+ failure: this.__chunk.length,
135
+ failed_records: this.__chunk.map(function (record) {
136
+ return {
137
+ record: record,
138
+ error: _context.t0.message,
139
+ code: 500
140
+ };
141
+ })
142
+ };
143
+ }
144
+ case 14:
145
+ case "end":
146
+ return _context.stop();
147
+ }
148
+ }
149
+ }, _callee, this, [[4, 11]]);
150
+ }));
151
+ function trigger() {
152
+ return _trigger.apply(this, arguments);
153
+ }
154
+ return trigger;
155
+ }()
156
+ }]);
157
+ return _BulkWorkflowTriggerChunk;
158
+ }();
159
+ exports._BulkWorkflowTriggerChunk = _BulkWorkflowTriggerChunk;
160
+ (0, _defineProperty2["default"])(_BulkWorkflowTriggerChunk, "_chunk_apparent_size_in_bytes", _constants.BODY_MAX_APPARENT_SIZE_IN_BYTES);
161
+ (0, _defineProperty2["default"])(_BulkWorkflowTriggerChunk, "_chunk_apparent_size_in_bytes_readable", _constants.BODY_MAX_APPARENT_SIZE_IN_BYTES_READABLE);
162
+ (0, _defineProperty2["default"])(_BulkWorkflowTriggerChunk, "_max_records_in_chunk", _constants.MAX_WORKFLOWS_IN_BULK_API);
163
+ var BulkWorkflowTrigger = /*#__PURE__*/function () {
164
+ function BulkWorkflowTrigger(config) {
165
+ (0, _classCallCheck2["default"])(this, BulkWorkflowTrigger);
166
+ this.config = config;
167
+ this.__workflows = [];
168
+ this.__pending_records = [];
169
+ this.chunks = [];
170
+ this.response = new _bulk_response["default"]();
171
+ // invalid_record json: {"record": workflow-json, "error": error_str, "code": 500}
172
+ this.__invalid_records = [];
173
+ }
174
+ (0, _createClass2["default"])(BulkWorkflowTrigger, [{
175
+ key: "__validate_workflows",
176
+ value: function __validate_workflows() {
177
+ var _iterator = _createForOfIteratorHelper(this.__workflows),
178
+ _step;
179
+ try {
180
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
181
+ var wf = _step.value;
182
+ try {
183
+ var is_part_of_bulk = true;
184
+ var _wf$get_final_json = wf.get_final_json(this.config, is_part_of_bulk),
185
+ _wf$get_final_json2 = (0, _slicedToArray2["default"])(_wf$get_final_json, 2),
186
+ wf_body = _wf$get_final_json2[0],
187
+ body_size = _wf$get_final_json2[1];
188
+ this.__pending_records.push([wf_body, body_size]);
189
+ } catch (ex) {
190
+ var inv_rec = (0, _utils.invalid_record_json)(wf.as_json(), ex);
191
+ this.__invalid_records.push(inv_rec);
192
+ }
193
+ }
194
+ } catch (err) {
195
+ _iterator.e(err);
196
+ } finally {
197
+ _iterator.f();
198
+ }
199
+ }
200
+ }, {
201
+ key: "__chunkify",
202
+ value: function __chunkify() {
203
+ var start_idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
204
+ var curr_chunk = new _BulkWorkflowTriggerChunk(this.config);
205
+ this.chunks.push(curr_chunk);
206
+ var entries = this.__pending_records.slice(start_idx).entries();
207
+ var _iterator2 = _createForOfIteratorHelper(entries),
208
+ _step2;
209
+ try {
210
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
211
+ var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
212
+ rel_idx = _step2$value[0],
213
+ rec = _step2$value[1];
214
+ var is_added = curr_chunk.try_to_add_into_chunk(rec[0], rec[1]);
215
+ if (!is_added) {
216
+ // create chunks from remaining records
217
+ this.__chunkify(start_idx + rel_idx);
218
+ // Don't forget to break. As current loop must not continue further
219
+ break;
220
+ }
221
+ }
222
+ } catch (err) {
223
+ _iterator2.e(err);
224
+ } finally {
225
+ _iterator2.f();
226
+ }
227
+ }
228
+ }, {
229
+ key: "append",
230
+ value: function append() {
231
+ for (var _len = arguments.length, workflows = new Array(_len), _key = 0; _key < _len; _key++) {
232
+ workflows[_key] = arguments[_key];
233
+ }
234
+ if (!workflows.length) return;
235
+ for (var _i = 0, _workflows = workflows; _i < _workflows.length; _i++) {
236
+ var wf = _workflows[_i];
237
+ if (wf instanceof _workflow_request["default"]) {
238
+ var wf_copy = (0, _lodash.cloneDeep)(wf);
239
+ this.__workflows.push(wf_copy);
240
+ }
241
+ }
242
+ }
243
+ }, {
244
+ key: "trigger",
245
+ value: function () {
246
+ var _trigger2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
247
+ var ch_response, _iterator3, _step3, _step3$value, c_idx, ch;
248
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
249
+ while (1) {
250
+ switch (_context2.prev = _context2.next) {
251
+ case 0:
252
+ this.__validate_workflows();
253
+ if (this.__invalid_records.length > 0) {
254
+ ch_response = _bulk_response["default"].invalid_records_chunk_response(this.__invalid_records);
255
+ this.response.merge_chunk_response(ch_response);
256
+ }
257
+ if (!this.__pending_records.length) {
258
+ _context2.next = 25;
259
+ break;
260
+ }
261
+ this.__chunkify();
262
+ _iterator3 = _createForOfIteratorHelper(this.chunks.entries());
263
+ _context2.prev = 5;
264
+ _iterator3.s();
265
+ case 7:
266
+ if ((_step3 = _iterator3.n()).done) {
267
+ _context2.next = 15;
268
+ break;
269
+ }
270
+ _step3$value = (0, _slicedToArray2["default"])(_step3.value, 2), c_idx = _step3$value[0], ch = _step3$value[1];
271
+ if (this.config.req_log_level > 0) {
272
+ console.log("DEBUG: triggering api call for chunk: ".concat(cIdx));
273
+ }
274
+ // do api call
275
+ _context2.next = 12;
276
+ return ch.trigger();
277
+ case 12:
278
+ // merge response
279
+ this.response.merge_chunk_response(ch.response);
280
+ case 13:
281
+ _context2.next = 7;
282
+ break;
283
+ case 15:
284
+ _context2.next = 20;
285
+ break;
286
+ case 17:
287
+ _context2.prev = 17;
288
+ _context2.t0 = _context2["catch"](5);
289
+ _iterator3.e(_context2.t0);
290
+ case 20:
291
+ _context2.prev = 20;
292
+ _iterator3.f();
293
+ return _context2.finish(20);
294
+ case 23:
295
+ _context2.next = 26;
296
+ break;
297
+ case 25:
298
+ if (this.__invalid_records.length === 0) this.response.merge_chunk_response(_bulk_response["default"].empty_chunk_success_response());
299
+ case 26:
300
+ return _context2.abrupt("return", this.response);
301
+ case 27:
302
+ case "end":
303
+ return _context2.stop();
304
+ }
305
+ }
306
+ }, _callee2, this, [[5, 17, 20, 23]]);
307
+ }));
308
+ function trigger() {
309
+ return _trigger2.apply(this, arguments);
310
+ }
311
+ return trigger;
312
+ }()
313
+ }]);
314
+ return BulkWorkflowTrigger;
315
+ }();
316
+ exports.BulkWorkflowTrigger = BulkWorkflowTrigger;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@suprsend/node-sdk",
3
- "version": "1.9.1",
3
+ "version": "1.11.0",
4
4
  "description": "Suprsend Node SDK to trigger workflow from backend",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/src/constants.js CHANGED
@@ -1,7 +1,5 @@
1
1
  // Default urls
2
2
  export const DEFAULT_URL = "https://hub.suprsend.com/";
3
- export const DEFAULT_UAT_URL =
4
- "https://collector-staging.suprsend.workers.dev/";
5
3
 
6
4
  // an Event should not have apparent body size of more than 100KB
7
5
  export const SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES = 100 * 1024; // 100 * 1024
package/src/index.js CHANGED
@@ -2,6 +2,8 @@ import { SuprsendConfigError, InputValueError } from "./utils";
2
2
  import get_attachment_json from "./attachment";
3
3
  import Workflow, { _WorkflowTrigger } from "./workflow";
4
4
  import { BulkWorkflowsFactory } from "./workflows_bulk";
5
+ import WorkflowTriggerRequest from "./workflow_request";
6
+ import WorkflowsApi from "./workflow_api";
5
7
  import Event, { EventCollector } from "./event";
6
8
  import { BulkEventsFactory } from "./events_bulk";
7
9
  import SubscriberFactory from "./subscriber";
@@ -9,7 +11,8 @@ import BulkSubscribersFactory from "./subscribers_bulk";
9
11
  import { SubscriberListsApi, SubscriberListBroadcast } from "./subscriber_list";
10
12
  import BrandsApi from "./brands";
11
13
  import TenantsApi from "./tenant";
12
- import { DEFAULT_UAT_URL, DEFAULT_URL } from "./constants";
14
+ import ObjectsApi from "./object";
15
+ import { DEFAULT_URL } from "./constants";
13
16
 
14
17
  const package_json = require("../package.json");
15
18
 
@@ -35,6 +38,8 @@ class Suprsend {
35
38
 
36
39
  this.brands = new BrandsApi(this);
37
40
  this.tenants = new TenantsApi(this);
41
+ this.workflows = new WorkflowsApi(this);
42
+ this.objects = new ObjectsApi(this);
38
43
 
39
44
  this.subscriber_lists = new SubscriberListsApi(this);
40
45
 
@@ -72,11 +77,7 @@ class Suprsend {
72
77
  base_url = base_url.trim();
73
78
  }
74
79
  if (!base_url) {
75
- if (this.config.is_staging) {
76
- base_url = DEFAULT_UAT_URL;
77
- } else {
78
- base_url = DEFAULT_URL;
79
- }
80
+ base_url = DEFAULT_URL;
80
81
  }
81
82
  base_url = base_url.trim();
82
83
  if (!base_url.endsWith("/")) {
@@ -86,6 +87,9 @@ class Suprsend {
86
87
  }
87
88
 
88
89
  add_attachment(body, file_path, kwargs = {}) {
90
+ console.warn(
91
+ 'This method is deprecated. Use "WorkflowTriggerRequest.add_attachment()" instead'
92
+ );
89
93
  const file_name = kwargs?.file_name;
90
94
  const ignore_if_error = kwargs?.ignore_if_error ?? false;
91
95
  if (!body?.data) {
@@ -117,6 +121,7 @@ class Suprsend {
117
121
  }
118
122
 
119
123
  track(distinct_id, event_name, properties = {}, kwargs = {}) {
124
+ console.warn('This method is deprecated. Use "track_event(Event)" instead');
120
125
  const event = new Event(distinct_id, event_name, properties, kwargs);
121
126
  return this._eventcollector.collect(event);
122
127
  }
@@ -131,4 +136,10 @@ class Suprsend {
131
136
  }
132
137
  }
133
138
 
134
- export { Suprsend, Event, Workflow, SubscriberListBroadcast };
139
+ export {
140
+ Suprsend,
141
+ Event,
142
+ Workflow,
143
+ SubscriberListBroadcast,
144
+ WorkflowTriggerRequest,
145
+ };