@suprsend/node-sdk 0.1.1 → 1.0.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.BODY_MAX_APPARENT_SIZE_IN_BYTES) {
137
+ throw new _utils.SuprsendError("workflow body (discounting attachment if any) too big - ".concat(event_size, " Bytes, must not cross ").concat(_constants.BODY_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");
15
29
 
16
- var _workflow = _interopRequireDefault(require("./workflow"));
30
+ var _attachment = _interopRequireDefault(require("./attachment"));
17
31
 
18
- var _path = _interopRequireDefault(require("path"));
32
+ var _workflow = _interopRequireWildcard(require("./workflow"));
19
33
 
20
- var _mimeTypes = _interopRequireDefault(require("mime-types"));
34
+ var _workflows_bulk = require("./workflows_bulk");
21
35
 
22
- var _utils = require("./utils");
36
+ var _event = _interopRequireWildcard(require("./event"));
23
37
 
24
- var _identity = _interopRequireDefault(require("./identity"));
38
+ var _events_bulk = require("./events_bulk");
25
39
 
26
- var _event = _interopRequireDefault(require("./event"));
40
+ var _subscriber = _interopRequireDefault(require("./subscriber"));
41
+
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
 
@@ -89,7 +135,7 @@ var Suprsend = /*#__PURE__*/function () {
89
135
  throw new _utils.SuprsendError("data must be an object");
90
136
  }
91
137
 
92
- var attachment = this._get_attachment_json_for_file(file_path);
138
+ var attachment = (0, _attachment["default"])(file_path);
93
139
 
94
140
  if (!body.data["$attachments"]) {
95
141
  body["data"]["$attachments"] = [];
@@ -98,34 +144,38 @@ var Suprsend = /*#__PURE__*/function () {
98
144
  body["data"]["$attachments"].push(attachment);
99
145
  return body;
100
146
  }
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
147
  }, {
113
148
  key: "trigger_workflow",
114
149
  value: function trigger_workflow(data) {
115
- var wf = new _workflow["default"](this, data);
116
- wf.validate_data();
117
- return wf.execute_workflow();
150
+ var wf_ins;
151
+
152
+ if (data instanceof _workflow["default"]) {
153
+ wf_ins = data;
154
+ } else {
155
+ wf_ins = new _workflow["default"](data);
156
+ }
157
+
158
+ return this._workflow_trigger.trigger(wf_ins);
118
159
  }
119
160
  }, {
120
161
  key: "track",
121
162
  value: function track(distinct_id, event_name) {
122
163
  var properties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
123
- return this._eventcollector.collect(distinct_id, event_name, properties);
164
+ var idempotency_key = arguments.length > 3 ? arguments[3] : undefined;
165
+ var event = new _event["default"](distinct_id, event_name, properties, idempotency_key);
166
+ return this._eventcollector.collect(event);
167
+ }
168
+ }, {
169
+ key: "track_event",
170
+ value: function track_event(event) {
171
+ if (!(event instanceof _event["default"])) {
172
+ throw new _utils.SuprsendError("argument must be an instance of suprsend.Event");
173
+ }
174
+
175
+ return this._eventcollector.collect(event);
124
176
  }
125
177
  }]);
126
178
  return Suprsend;
127
179
  }();
128
180
 
129
- var _default = Suprsend;
130
- exports["default"] = _default;
131
- module.exports = exports.default;
181
+ 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,