@suprsend/node-sdk 0.1.1 → 1.1.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,424 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.BulkEventsFactory = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
16
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
+
18
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
19
+
20
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
21
+
22
+ var _constants = require("./constants");
23
+
24
+ var _signature = _interopRequireDefault(require("./signature"));
25
+
26
+ var _bulk_response = _interopRequireDefault(require("./bulk_response"));
27
+
28
+ var _event = _interopRequireDefault(require("./event"));
29
+
30
+ var _utils = require("./utils");
31
+
32
+ var _lodash = require("lodash");
33
+
34
+ var _axios = _interopRequireDefault(require("axios"));
35
+
36
+ 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; } } }; }
37
+
38
+ 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); }
39
+
40
+ 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; }
41
+
42
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
43
+
44
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
45
+
46
+ var BulkEventsFactory = /*#__PURE__*/function () {
47
+ function BulkEventsFactory(config) {
48
+ (0, _classCallCheck2["default"])(this, BulkEventsFactory);
49
+ this.config = config;
50
+ }
51
+
52
+ (0, _createClass2["default"])(BulkEventsFactory, [{
53
+ key: "new_instance",
54
+ value: function new_instance() {
55
+ return new BulkEvents(this.config);
56
+ }
57
+ }]);
58
+ return BulkEventsFactory;
59
+ }();
60
+
61
+ exports.BulkEventsFactory = BulkEventsFactory;
62
+
63
+ var _BulkEventsChunk = /*#__PURE__*/function () {
64
+ function _BulkEventsChunk(config) {
65
+ (0, _classCallCheck2["default"])(this, _BulkEventsChunk);
66
+ this.config = config;
67
+ this.__chunk = [];
68
+ this.__url = this.__get_url();
69
+ this.__headers = this.__common_headers();
70
+ this.__running_size = 0;
71
+ this.__running_length = 0;
72
+ this.response;
73
+ }
74
+
75
+ (0, _createClass2["default"])(_BulkEventsChunk, [{
76
+ key: "__get_url",
77
+ value: function __get_url() {
78
+ var url_template = "event/";
79
+
80
+ if (this.config.include_signature_param) {
81
+ if (this.config.auth_enabled) {
82
+ url_template = url_template + "?verify=true";
83
+ } else {
84
+ url_template = url_template + "?verify=false";
85
+ }
86
+ }
87
+
88
+ var url_formatted = "".concat(this.config.base_url).concat(url_template);
89
+ return url_formatted;
90
+ }
91
+ }, {
92
+ key: "__common_headers",
93
+ value: function __common_headers() {
94
+ return {
95
+ "Content-Type": "application/json; charset=utf-8",
96
+ "User-Agent": this.config.user_agent
97
+ };
98
+ }
99
+ }, {
100
+ key: "__dynamic_headers",
101
+ value: function __dynamic_headers() {
102
+ return {
103
+ Date: new Date().toUTCString()
104
+ };
105
+ }
106
+ }, {
107
+ key: "__add_event_to_chunk",
108
+ value: function __add_event_to_chunk(event, event_size) {
109
+ // First add size, then body to reduce effects of race condition
110
+ this.__running_size += event_size;
111
+
112
+ this.__chunk.push(event);
113
+
114
+ this.__running_length += 1;
115
+ }
116
+ }, {
117
+ key: "__check_limit_reached",
118
+ value: function __check_limit_reached() {
119
+ if (this.__running_length >= _constants.MAX_EVENTS_IN_BULK_API || this.__running_size >= _constants.BODY_MAX_APPARENT_SIZE_IN_BYTES) {
120
+ return true;
121
+ } else {
122
+ return false;
123
+ }
124
+ }
125
+ }, {
126
+ key: "try_to_add_into_chunk",
127
+ value: function try_to_add_into_chunk(event, event_size) {
128
+ if (!event) {
129
+ return true;
130
+ }
131
+
132
+ if (this.__check_limit_reached()) {
133
+ return false;
134
+ }
135
+
136
+ if (event_size > _constants.SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES) {
137
+ throw new _utils.SuprsendError("Event properties too big - ".concat(event_size, " Bytes, must not cross ").concat(_constants.SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES_READABLE));
138
+ }
139
+
140
+ if (this.__running_size + event_size > _constants.BODY_MAX_APPARENT_SIZE_IN_BYTES) {
141
+ return false;
142
+ }
143
+
144
+ if (!_constants.ALLOW_ATTACHMENTS_IN_BULK_API) {
145
+ delete event.properties["$attachments"];
146
+ }
147
+
148
+ this.__add_event_to_chunk(event, event_size);
149
+
150
+ return true;
151
+ }
152
+ }, {
153
+ key: "trigger",
154
+ value: function () {
155
+ var _trigger = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
156
+ var headers, content_text, signature, response, ok_response, error_status;
157
+ return _regenerator["default"].wrap(function _callee$(_context) {
158
+ while (1) {
159
+ switch (_context.prev = _context.next) {
160
+ case 0:
161
+ headers = _objectSpread(_objectSpread({}, this.__headers), this.__dynamic_headers());
162
+ content_text = JSON.stringify(this.__chunk); // Based on whether signature is required or not, add Authorization header
163
+
164
+ if (this.config.auth_enabled) {
165
+ signature = (0, _signature["default"])(this.__url, "POST", content_text, headers, this.config.workspace_secret);
166
+ headers["Authorization"] = "".concat(this.config.workspace_key, ":").concat(signature);
167
+ }
168
+
169
+ _context.prev = 3;
170
+ _context.next = 6;
171
+ return _axios["default"].post(this.__url, content_text, {
172
+ headers: headers
173
+ });
174
+
175
+ case 6:
176
+ response = _context.sent;
177
+ ok_response = Math.floor(response.status / 100) == 2;
178
+
179
+ if (ok_response) {
180
+ this.response = {
181
+ status: "success",
182
+ status_code: response.status,
183
+ total: this.__chunk.length,
184
+ success: this.__chunk.length,
185
+ failure: 0,
186
+ failed_records: []
187
+ };
188
+ } else {
189
+ this.response = {
190
+ status: "fail",
191
+ status_code: response.status,
192
+ total: this.__chunk.length,
193
+ success: 0,
194
+ failure: this.__chunk.length,
195
+ failed_records: this.__chunk.map(function (item) {
196
+ return {
197
+ record: item,
198
+ error: response.statusText,
199
+ code: response.status
200
+ };
201
+ })
202
+ };
203
+ }
204
+
205
+ _context.next = 15;
206
+ break;
207
+
208
+ case 11:
209
+ _context.prev = 11;
210
+ _context.t0 = _context["catch"](3);
211
+ error_status = _context.t0.status || 500;
212
+ return _context.abrupt("return", {
213
+ status: "fail",
214
+ status_code: error_status,
215
+ message: _context.t0.message,
216
+ total: this.__chunk.length,
217
+ success: 0,
218
+ failure: this.__chunk.length,
219
+ failed_records: this.__chunk.map(function (item) {
220
+ return {
221
+ record: item,
222
+ error: _context.t0.message,
223
+ code: error_status
224
+ };
225
+ })
226
+ });
227
+
228
+ case 15:
229
+ case "end":
230
+ return _context.stop();
231
+ }
232
+ }
233
+ }, _callee, this, [[3, 11]]);
234
+ }));
235
+
236
+ function trigger() {
237
+ return _trigger.apply(this, arguments);
238
+ }
239
+
240
+ return trigger;
241
+ }()
242
+ }]);
243
+ return _BulkEventsChunk;
244
+ }();
245
+
246
+ var BulkEvents = /*#__PURE__*/function () {
247
+ function BulkEvents(config) {
248
+ (0, _classCallCheck2["default"])(this, BulkEvents);
249
+ this.config = config;
250
+ this.__events = [];
251
+ this.__pending_records = [];
252
+ this.chunks = [];
253
+ this.response = new _bulk_response["default"]();
254
+ }
255
+
256
+ (0, _createClass2["default"])(BulkEvents, [{
257
+ key: "__validate_events",
258
+ value: function __validate_events() {
259
+ if (!this.__events) {
260
+ throw new _utils.SuprsendError("events list is empty in bulk request");
261
+ }
262
+
263
+ var _iterator = _createForOfIteratorHelper(this.__events),
264
+ _step;
265
+
266
+ try {
267
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
268
+ var ev = _step.value;
269
+ var is_part_of_bulk = true;
270
+
271
+ var _ev$get_final_json = ev.get_final_json(this.config, is_part_of_bulk),
272
+ _ev$get_final_json2 = (0, _slicedToArray2["default"])(_ev$get_final_json, 2),
273
+ ev_json = _ev$get_final_json2[0],
274
+ body_size = _ev$get_final_json2[1];
275
+
276
+ this.__pending_records.push([ev_json, body_size]);
277
+ }
278
+ } catch (err) {
279
+ _iterator.e(err);
280
+ } finally {
281
+ _iterator.f();
282
+ }
283
+ }
284
+ }, {
285
+ key: "__chunkify",
286
+ value: function __chunkify() {
287
+ var start_idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
288
+ var curr_chunk = new _BulkEventsChunk(this.config);
289
+ this.chunks.push(curr_chunk);
290
+
291
+ var entries = this.__pending_records.slice(start_idx).entries();
292
+
293
+ var _iterator2 = _createForOfIteratorHelper(entries),
294
+ _step2;
295
+
296
+ try {
297
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
298
+ var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
299
+ rel_idx = _step2$value[0],
300
+ rec = _step2$value[1];
301
+
302
+ var is_added = curr_chunk.try_to_add_into_chunk(rec[0], rec[1]);
303
+
304
+ if (!is_added) {
305
+ // create chunks from remaining records
306
+ this.__chunkify(start_idx + rel_idx); // Don't forget to break. As current loop must not continue further
307
+
308
+
309
+ break;
310
+ }
311
+ }
312
+ } catch (err) {
313
+ _iterator2.e(err);
314
+ } finally {
315
+ _iterator2.f();
316
+ }
317
+ }
318
+ }, {
319
+ key: "append",
320
+ value: function append() {
321
+ for (var _len = arguments.length, events = new Array(_len), _key = 0; _key < _len; _key++) {
322
+ events[_key] = arguments[_key];
323
+ }
324
+
325
+ if (!events) {
326
+ throw new _utils.SuprsendError("events list empty. must pass one or more events");
327
+ }
328
+
329
+ for (var _i = 0, _events = events; _i < _events.length; _i++) {
330
+ var ev = _events[_i];
331
+
332
+ if (!ev) {
333
+ throw new _utils.SuprsendError("null/empty element found in bulk instance");
334
+ }
335
+
336
+ if (!(ev instanceof _event["default"])) {
337
+ throw new _utils.SuprsendError("element must be an instance of suprsend.Event");
338
+ }
339
+
340
+ var ev_copy = (0, _lodash.cloneDeep)(ev);
341
+
342
+ this.__events.push(ev_copy);
343
+ }
344
+ }
345
+ }, {
346
+ key: "trigger",
347
+ value: function () {
348
+ var _trigger2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
349
+ var _iterator3, _step3, _step3$value, c_idx, ch;
350
+
351
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
352
+ while (1) {
353
+ switch (_context2.prev = _context2.next) {
354
+ case 0:
355
+ this.__validate_events();
356
+
357
+ this.__chunkify();
358
+
359
+ _iterator3 = _createForOfIteratorHelper(this.chunks.entries());
360
+ _context2.prev = 3;
361
+
362
+ _iterator3.s();
363
+
364
+ case 5:
365
+ if ((_step3 = _iterator3.n()).done) {
366
+ _context2.next = 13;
367
+ break;
368
+ }
369
+
370
+ _step3$value = (0, _slicedToArray2["default"])(_step3.value, 2), c_idx = _step3$value[0], ch = _step3$value[1];
371
+
372
+ if (this.config.req_log_level > 0) {
373
+ console.log("DEBUG: triggering api call for chunk: ".concat(c_idx));
374
+ } // do api call
375
+
376
+
377
+ _context2.next = 10;
378
+ return ch.trigger();
379
+
380
+ case 10:
381
+ // merge response
382
+ this.response.merge_chunk_response(ch.response);
383
+
384
+ case 11:
385
+ _context2.next = 5;
386
+ break;
387
+
388
+ case 13:
389
+ _context2.next = 18;
390
+ break;
391
+
392
+ case 15:
393
+ _context2.prev = 15;
394
+ _context2.t0 = _context2["catch"](3);
395
+
396
+ _iterator3.e(_context2.t0);
397
+
398
+ case 18:
399
+ _context2.prev = 18;
400
+
401
+ _iterator3.f();
402
+
403
+ return _context2.finish(18);
404
+
405
+ case 21:
406
+ return _context2.abrupt("return", this.response);
407
+
408
+ case 22:
409
+ case "end":
410
+ return _context2.stop();
411
+ }
412
+ }
413
+ }, _callee2, this, [[3, 15, 18, 21]]);
414
+ }));
415
+
416
+ function trigger() {
417
+ return _trigger2.apply(this, arguments);
418
+ }
419
+
420
+ return trigger;
421
+ }()
422
+ }]);
423
+ return BulkEvents;
424
+ }();
package/dist/index.js CHANGED
@@ -2,57 +2,103 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
8
- exports["default"] = void 0;
10
+ Object.defineProperty(exports, "Event", {
11
+ enumerable: true,
12
+ get: function get() {
13
+ return _event["default"];
14
+ }
15
+ });
16
+ exports.Suprsend = void 0;
17
+ Object.defineProperty(exports, "Workflow", {
18
+ enumerable: true,
19
+ get: function get() {
20
+ return _workflow["default"];
21
+ }
22
+ });
9
23
 
10
24
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
25
 
12
26
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
27
 
14
- var _config = _interopRequireDefault(require("./config"));
28
+ var _utils = require("./utils");
29
+
30
+ var _attachment = _interopRequireDefault(require("./attachment"));
15
31
 
16
- var _workflow = _interopRequireDefault(require("./workflow"));
32
+ var _workflow = _interopRequireWildcard(require("./workflow"));
17
33
 
18
- var _path = _interopRequireDefault(require("path"));
34
+ var _workflows_bulk = require("./workflows_bulk");
19
35
 
20
- var _mimeTypes = _interopRequireDefault(require("mime-types"));
36
+ var _event = _interopRequireWildcard(require("./event"));
21
37
 
22
- var _utils = require("./utils");
38
+ var _events_bulk = require("./events_bulk");
23
39
 
24
- var _identity = _interopRequireDefault(require("./identity"));
40
+ var _subscriber = _interopRequireDefault(require("./subscriber"));
25
41
 
26
- var _event = _interopRequireDefault(require("./event"));
42
+ var _subscribers_bulk = _interopRequireDefault(require("./subscribers_bulk"));
43
+
44
+ var _constants = require("./constants");
45
+
46
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
47
+
48
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
49
 
28
50
  var package_json = require("../package.json");
29
51
 
30
52
  var Suprsend = /*#__PURE__*/function () {
31
- function Suprsend(workspace_env, workspace_secret) {
53
+ function Suprsend(workspace_key, workspace_secret) {
32
54
  var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
33
55
  (0, _classCallCheck2["default"])(this, Suprsend);
34
- this.env_key = workspace_env;
35
- this.env_secret = workspace_secret;
56
+ this.workspace_key = workspace_key;
57
+ this.workspace_secret = workspace_secret;
36
58
  this.config = config;
37
59
  this.base_url = this._get_url(config.base_url);
38
60
  this.auth_enabled = config.auth_enabled !== false;
39
61
  this.include_signature_param = config.include_signature_param !== false;
40
62
  this.user_agent = "suprsend/".concat(package_json.version, ";node/").concat(process.version.slice(1));
41
- this.user = new _identity["default"](this);
42
- this._eventcollector = new _event["default"](this);
63
+ this._workflow_trigger = new _workflow._WorkflowTrigger(this);
64
+ this._eventcollector = new _event.EventCollector(this);
65
+ this._bulk_workflows = new _workflows_bulk.BulkWorkflowsFactory(this);
66
+ this._bulk_events = new _events_bulk.BulkEventsFactory(this);
67
+ this._bulk_users = new _subscribers_bulk["default"](this);
68
+ this._user = new _subscriber["default"](this);
43
69
 
44
70
  this._validate();
45
71
  }
46
72
 
47
73
  (0, _createClass2["default"])(Suprsend, [{
74
+ key: "bulk_workflows",
75
+ get: function get() {
76
+ return this._bulk_workflows;
77
+ }
78
+ }, {
79
+ key: "bulk_events",
80
+ get: function get() {
81
+ return this._bulk_events;
82
+ }
83
+ }, {
84
+ key: "bulk_users",
85
+ get: function get() {
86
+ return this._bulk_users;
87
+ }
88
+ }, {
89
+ key: "user",
90
+ get: function get() {
91
+ return this._user;
92
+ }
93
+ }, {
48
94
  key: "_validate",
49
95
  value: function _validate() {
50
- if (!this.env_key) {
51
- throw new _utils.SuprsendError("Missing Mandatory WORKSPACE_ENVIRONEMENT");
52
- } else if (!this.env_secret) {
53
- throw new _utils.SuprsendError("Missing Mandatory WORKSPACE_SECRET");
96
+ if (!this.workspace_key) {
97
+ throw new _utils.SuprsendConfigError("Missing workspace_key");
98
+ } else if (!this.workspace_secret) {
99
+ throw new _utils.SuprsendConfigError("Missing workspace_secret");
54
100
  } else if (!this.base_url) {
55
- throw new _utils.SuprsendError("Missing Mandatory base url");
101
+ throw new _utils.SuprsendConfigError("Missing base_url");
56
102
  }
57
103
  }
58
104
  }, {
@@ -64,9 +110,9 @@ var Suprsend = /*#__PURE__*/function () {
64
110
 
65
111
  if (!base_url) {
66
112
  if (this.config.is_staging) {
67
- base_url = _config["default"].staging;
113
+ base_url = _constants.DEFAULT_UAT_URL;
68
114
  } else {
69
- base_url = _config["default"].prod;
115
+ base_url = _constants.DEFAULT_URL;
70
116
  }
71
117
  }
72
118
 
@@ -81,6 +127,12 @@ var Suprsend = /*#__PURE__*/function () {
81
127
  }, {
82
128
  key: "add_attachment",
83
129
  value: function add_attachment(body, file_path) {
130
+ var _kwargs$ignore_if_err;
131
+
132
+ var kwargs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
133
+ var file_name = kwargs === null || kwargs === void 0 ? void 0 : kwargs.file_name;
134
+ var ignore_if_error = (_kwargs$ignore_if_err = kwargs === null || kwargs === void 0 ? void 0 : kwargs.ignore_if_error) !== null && _kwargs$ignore_if_err !== void 0 ? _kwargs$ignore_if_err : false;
135
+
84
136
  if (!body.data) {
85
137
  body.data = {};
86
138
  }
@@ -89,7 +141,7 @@ var Suprsend = /*#__PURE__*/function () {
89
141
  throw new _utils.SuprsendError("data must be an object");
90
142
  }
91
143
 
92
- var attachment = this._get_attachment_json_for_file(file_path);
144
+ var attachment = (0, _attachment["default"])(file_path, file_name, ignore_if_error);
93
145
 
94
146
  if (!body.data["$attachments"]) {
95
147
  body["data"]["$attachments"] = [];
@@ -98,34 +150,38 @@ var Suprsend = /*#__PURE__*/function () {
98
150
  body["data"]["$attachments"].push(attachment);
99
151
  return body;
100
152
  }
101
- }, {
102
- key: "_get_attachment_json_for_file",
103
- value: function _get_attachment_json_for_file(file_path) {
104
- var abs_path = _path["default"].resolve((0, _utils.resolveTilde)(file_path));
105
-
106
- return {
107
- filename: _path["default"].basename(abs_path),
108
- contentType: _mimeTypes["default"].lookup(abs_path),
109
- data: (0, _utils.base64Encode)(abs_path)
110
- };
111
- }
112
153
  }, {
113
154
  key: "trigger_workflow",
114
155
  value: function trigger_workflow(data) {
115
- var wf = new _workflow["default"](this, data);
116
- wf.validate_data();
117
- return wf.execute_workflow();
156
+ var wf_ins;
157
+
158
+ if (data instanceof _workflow["default"]) {
159
+ wf_ins = data;
160
+ } else {
161
+ wf_ins = new _workflow["default"](data);
162
+ }
163
+
164
+ return this._workflow_trigger.trigger(wf_ins);
118
165
  }
119
166
  }, {
120
167
  key: "track",
121
168
  value: function track(distinct_id, event_name) {
122
169
  var properties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
123
- return this._eventcollector.collect(distinct_id, event_name, properties);
170
+ var kwargs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
171
+ var event = new _event["default"](distinct_id, event_name, properties, kwargs);
172
+ return this._eventcollector.collect(event);
173
+ }
174
+ }, {
175
+ key: "track_event",
176
+ value: function track_event(event) {
177
+ if (!(event instanceof _event["default"])) {
178
+ throw new _utils.SuprsendError("argument must be an instance of suprsend.Event");
179
+ }
180
+
181
+ return this._eventcollector.collect(event);
124
182
  }
125
183
  }]);
126
184
  return Suprsend;
127
185
  }();
128
186
 
129
- var _default = Suprsend;
130
- exports["default"] = _default;
131
- module.exports = exports.default;
187
+ exports.Suprsend = Suprsend;
@@ -6,6 +6,11 @@
6
6
  "$comment": "Json schema for Track event",
7
7
  "type": "object",
8
8
  "properties": {
9
+ "$idempotency_key": {
10
+ "type": ["string", "null"],
11
+ "maxLength": 64,
12
+ "description": "unique id provided by client for request"
13
+ },
9
14
  "$insert_id": {
10
15
  "type": "string",
11
16
  "minLength": 36,