swetrix 1.1.0 → 1.2.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.
@@ -14,6 +14,8 @@ export interface PageData {
14
14
  export interface PageViewsOptions {
15
15
  unique?: boolean;
16
16
  ignore?: Array<any>;
17
+ noHeartbeat?: boolean;
18
+ heartbeatOnBackground?: boolean;
17
19
  }
18
20
  export declare class Lib {
19
21
  private projectID;
@@ -22,12 +24,12 @@ export declare class Lib {
22
24
  private pageViewsOptions;
23
25
  constructor(projectID: string, options?: LibOptions | undefined);
24
26
  track(event: TrackEventOptions): void;
25
- trackPageViews(options?: PageViewsOptions): object | undefined;
27
+ trackPageViews(options?: PageViewsOptions): void | object;
28
+ private heartbeat;
26
29
  private checkIgnore;
27
30
  private trackPathChange;
28
31
  private trackPage;
29
32
  private debug;
30
33
  private canTrack;
31
- private submitData;
32
- private submitCustom;
34
+ private sendRequest;
33
35
  }
@@ -7,6 +7,7 @@ export class Lib {
7
7
  this.pageData = null;
8
8
  this.pageViewsOptions = null;
9
9
  this.trackPathChange = this.trackPathChange.bind(this);
10
+ this.heartbeat = this.heartbeat.bind(this);
10
11
  }
11
12
  track(event) {
12
13
  if (!this.canTrack()) {
@@ -16,7 +17,7 @@ export class Lib {
16
17
  pid: this.projectID,
17
18
  ...event,
18
19
  };
19
- this.submitCustom(data);
20
+ this.sendRequest('custom', data);
20
21
  }
21
22
  trackPageViews(options) {
22
23
  if (!this.canTrack()) {
@@ -26,20 +27,36 @@ export class Lib {
26
27
  return this.pageData.actions;
27
28
  }
28
29
  this.pageViewsOptions = options;
29
- let interval;
30
+ let hbInterval, interval;
30
31
  if (!options?.unique) {
31
32
  interval = setInterval(this.trackPathChange, 2000);
32
33
  }
34
+ if (!options?.noHeartbeat) {
35
+ setTimeout(this.heartbeat, 3000);
36
+ hbInterval = setInterval(this.heartbeat, 28000);
37
+ }
33
38
  const path = getPath();
34
39
  this.pageData = {
35
40
  path,
36
41
  actions: {
37
- stop: options?.unique ? () => { } : () => clearInterval(interval),
42
+ stop: () => {
43
+ clearInterval(interval);
44
+ clearInterval(hbInterval);
45
+ },
38
46
  },
39
47
  };
40
48
  this.trackPage(path, options?.unique);
41
49
  return this.pageData.actions;
42
50
  }
51
+ heartbeat() {
52
+ if (!this.pageViewsOptions?.heartbeatOnBackground && document.visibilityState === 'hidden') {
53
+ return;
54
+ }
55
+ const data = {
56
+ pid: this.projectID,
57
+ };
58
+ this.sendRequest('hb', data);
59
+ }
43
60
  checkIgnore(path) {
44
61
  const ignore = this.pageViewsOptions?.ignore;
45
62
  if (Array.isArray(ignore)) {
@@ -79,7 +96,7 @@ export class Lib {
79
96
  unique,
80
97
  pg,
81
98
  };
82
- this.submitData(data);
99
+ this.sendRequest('', data);
83
100
  }
84
101
  debug(message) {
85
102
  if (this.options?.debug) {
@@ -104,25 +121,11 @@ export class Lib {
104
121
  }
105
122
  return true;
106
123
  }
107
- submitData(body) {
108
- return fetch(host, {
109
- method: 'post',
110
- headers: {
111
- 'Accept': 'application/json',
112
- 'Content-Type': 'application/json',
113
- },
114
- body: JSON.stringify(body),
115
- });
116
- }
117
- submitCustom(body) {
118
- return fetch(`${host}/custom`, {
119
- method: 'post',
120
- headers: {
121
- 'Accept': 'application/json',
122
- 'Content-Type': 'application/json',
123
- },
124
- body: JSON.stringify(body),
125
- });
124
+ sendRequest(path, body) {
125
+ const req = new XMLHttpRequest();
126
+ req.open('POST', `${host}/${path}`, true);
127
+ req.setRequestHeader('Content-Type', 'application/json');
128
+ req.send(JSON.stringify(body));
126
129
  }
127
130
  }
128
131
  //# sourceMappingURL=Lib.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Lib.js","sourceRoot":"","sources":["../../src/Lib.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Lib.js","sourceRoot":"","sources":["../../src/Lib.ts"],"names":[],"mappings":"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"}
@@ -74,13 +74,14 @@ var Lib = /** @class */ (function () {
74
74
  this.pageData = null;
75
75
  this.pageViewsOptions = null;
76
76
  this.trackPathChange = this.trackPathChange.bind(this);
77
+ this.heartbeat = this.heartbeat.bind(this);
77
78
  }
78
79
  Lib.prototype.track = function (event) {
79
80
  if (!this.canTrack()) {
80
81
  return;
81
82
  }
82
83
  var data = __assign({ pid: this.projectID }, event);
83
- this.submitCustom(data);
84
+ this.sendRequest('custom', data);
84
85
  };
85
86
  Lib.prototype.trackPageViews = function (options) {
86
87
  if (!this.canTrack()) {
@@ -90,20 +91,37 @@ var Lib = /** @class */ (function () {
90
91
  return this.pageData.actions;
91
92
  }
92
93
  this.pageViewsOptions = options;
93
- var interval;
94
+ var hbInterval, interval;
94
95
  if (!(options === null || options === void 0 ? void 0 : options.unique)) {
95
96
  interval = setInterval(this.trackPathChange, 2000);
96
97
  }
98
+ if (!(options === null || options === void 0 ? void 0 : options.noHeartbeat)) {
99
+ setTimeout(this.heartbeat, 3000);
100
+ hbInterval = setInterval(this.heartbeat, 28000);
101
+ }
97
102
  var path = getPath();
98
103
  this.pageData = {
99
104
  path: path,
100
105
  actions: {
101
- stop: (options === null || options === void 0 ? void 0 : options.unique) ? function () { } : function () { return clearInterval(interval); },
106
+ stop: function () {
107
+ clearInterval(interval);
108
+ clearInterval(hbInterval);
109
+ },
102
110
  },
103
111
  };
104
112
  this.trackPage(path, options === null || options === void 0 ? void 0 : options.unique);
105
113
  return this.pageData.actions;
106
114
  };
115
+ Lib.prototype.heartbeat = function () {
116
+ var _a;
117
+ if (!((_a = this.pageViewsOptions) === null || _a === void 0 ? void 0 : _a.heartbeatOnBackground) && document.visibilityState === 'hidden') {
118
+ return;
119
+ }
120
+ var data = {
121
+ pid: this.projectID,
122
+ };
123
+ this.sendRequest('hb', data);
124
+ };
107
125
  Lib.prototype.checkIgnore = function (path) {
108
126
  var _a;
109
127
  var ignore = (_a = this.pageViewsOptions) === null || _a === void 0 ? void 0 : _a.ignore;
@@ -145,7 +163,7 @@ var Lib = /** @class */ (function () {
145
163
  unique: unique,
146
164
  pg: pg,
147
165
  };
148
- this.submitData(data);
166
+ this.sendRequest('', data);
149
167
  };
150
168
  Lib.prototype.debug = function (message) {
151
169
  var _a;
@@ -172,25 +190,11 @@ var Lib = /** @class */ (function () {
172
190
  }
173
191
  return true;
174
192
  };
175
- Lib.prototype.submitData = function (body) {
176
- return fetch(host, {
177
- method: 'post',
178
- headers: {
179
- 'Accept': 'application/json',
180
- 'Content-Type': 'application/json',
181
- },
182
- body: JSON.stringify(body),
183
- });
184
- };
185
- Lib.prototype.submitCustom = function (body) {
186
- return fetch(host + "/custom", {
187
- method: 'post',
188
- headers: {
189
- 'Accept': 'application/json',
190
- 'Content-Type': 'application/json',
191
- },
192
- body: JSON.stringify(body),
193
- });
193
+ Lib.prototype.sendRequest = function (path, body) {
194
+ var req = new XMLHttpRequest();
195
+ req.open('POST', "".concat(host, "/").concat(path), true);
196
+ req.setRequestHeader('Content-Type', 'application/json');
197
+ req.send(JSON.stringify(body));
194
198
  };
195
199
  return Lib;
196
200
  }());
@@ -70,13 +70,14 @@ var Lib = /** @class */ (function () {
70
70
  this.pageData = null;
71
71
  this.pageViewsOptions = null;
72
72
  this.trackPathChange = this.trackPathChange.bind(this);
73
+ this.heartbeat = this.heartbeat.bind(this);
73
74
  }
74
75
  Lib.prototype.track = function (event) {
75
76
  if (!this.canTrack()) {
76
77
  return;
77
78
  }
78
79
  var data = __assign({ pid: this.projectID }, event);
79
- this.submitCustom(data);
80
+ this.sendRequest('custom', data);
80
81
  };
81
82
  Lib.prototype.trackPageViews = function (options) {
82
83
  if (!this.canTrack()) {
@@ -86,20 +87,37 @@ var Lib = /** @class */ (function () {
86
87
  return this.pageData.actions;
87
88
  }
88
89
  this.pageViewsOptions = options;
89
- var interval;
90
+ var hbInterval, interval;
90
91
  if (!(options === null || options === void 0 ? void 0 : options.unique)) {
91
92
  interval = setInterval(this.trackPathChange, 2000);
92
93
  }
94
+ if (!(options === null || options === void 0 ? void 0 : options.noHeartbeat)) {
95
+ setTimeout(this.heartbeat, 3000);
96
+ hbInterval = setInterval(this.heartbeat, 28000);
97
+ }
93
98
  var path = getPath();
94
99
  this.pageData = {
95
100
  path: path,
96
101
  actions: {
97
- stop: (options === null || options === void 0 ? void 0 : options.unique) ? function () { } : function () { return clearInterval(interval); },
102
+ stop: function () {
103
+ clearInterval(interval);
104
+ clearInterval(hbInterval);
105
+ },
98
106
  },
99
107
  };
100
108
  this.trackPage(path, options === null || options === void 0 ? void 0 : options.unique);
101
109
  return this.pageData.actions;
102
110
  };
111
+ Lib.prototype.heartbeat = function () {
112
+ var _a;
113
+ if (!((_a = this.pageViewsOptions) === null || _a === void 0 ? void 0 : _a.heartbeatOnBackground) && document.visibilityState === 'hidden') {
114
+ return;
115
+ }
116
+ var data = {
117
+ pid: this.projectID,
118
+ };
119
+ this.sendRequest('hb', data);
120
+ };
103
121
  Lib.prototype.checkIgnore = function (path) {
104
122
  var _a;
105
123
  var ignore = (_a = this.pageViewsOptions) === null || _a === void 0 ? void 0 : _a.ignore;
@@ -141,7 +159,7 @@ var Lib = /** @class */ (function () {
141
159
  unique: unique,
142
160
  pg: pg,
143
161
  };
144
- this.submitData(data);
162
+ this.sendRequest('', data);
145
163
  };
146
164
  Lib.prototype.debug = function (message) {
147
165
  var _a;
@@ -168,25 +186,11 @@ var Lib = /** @class */ (function () {
168
186
  }
169
187
  return true;
170
188
  };
171
- Lib.prototype.submitData = function (body) {
172
- return fetch(host, {
173
- method: 'post',
174
- headers: {
175
- 'Accept': 'application/json',
176
- 'Content-Type': 'application/json',
177
- },
178
- body: JSON.stringify(body),
179
- });
180
- };
181
- Lib.prototype.submitCustom = function (body) {
182
- return fetch(host + "/custom", {
183
- method: 'post',
184
- headers: {
185
- 'Accept': 'application/json',
186
- 'Content-Type': 'application/json',
187
- },
188
- body: JSON.stringify(body),
189
- });
189
+ Lib.prototype.sendRequest = function (path, body) {
190
+ var req = new XMLHttpRequest();
191
+ req.open('POST', "".concat(host, "/").concat(path), true);
192
+ req.setRequestHeader('Content-Type', 'application/json');
193
+ req.send(JSON.stringify(body));
190
194
  };
191
195
  return Lib;
192
196
  }());
package/dist/swetrix.js CHANGED
@@ -1 +1 @@
1
- !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).swetrix={})}(this,function(i){"use strict";function o(t){return(t=location.search.match(t))&&t[2]||void 0}function e(){return location.pathname||""}var n=function(){return(n=Object.assign||function(t){for(var n,i=1,o=arguments.length;i<o;i++)for(var e in n=arguments[i])Object.prototype.hasOwnProperty.call(n,e)&&(t[e]=n[e]);return t}).apply(this,arguments)},a=/[?&](ref|source|utm_source)=([^?&]+)/,r=/[?&](utm_campaign)=([^?&]+)/,s=/[?&](utm_medium)=([^?&]+)/,c="https://api.swetrix.com/log",u=(t.prototype.track=function(t){this.canTrack()&&(t=n({pid:this.projectID},t),this.submitCustom(t))},t.prototype.trackPageViews=function(t){if(this.canTrack()){if(this.pageData)return this.pageData.actions;var n;null!=(this.pageViewsOptions=t)&&t.unique||(n=setInterval(this.trackPathChange,2e3));var i=e();return this.pageData={path:i,actions:{stop:null!=t&&t.unique?function(){}:function(){return clearInterval(n)}}},this.trackPage(i,null==t?void 0:t.unique),this.pageData.actions}},t.prototype.checkIgnore=function(t){var n,i=null===(n=this.pageViewsOptions)||void 0===n?void 0:n.ignore;if(Array.isArray(i))for(var o=0;o<i.length;++o){if(i[o]===t)return!0;if(i[o]instanceof RegExp&&i[o].test(t))return!0}return!1},t.prototype.trackPathChange=function(){var t;this.pageData&&(t=e(),this.pageData.path!==t&&this.trackPage(t,!1))},t.prototype.trackPage=function(t,n){void 0===n&&(n=!1),this.pageData&&(this.pageData.path=t,this.checkIgnore(t)||(t={pid:this.projectID,lc:void 0!==navigator.languages?navigator.languages[0]:navigator.language,tz:function(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch(t){return}}(),ref:document.referrer||void 0,so:o(a),me:o(s),ca:o(r),unique:n,pg:t},this.submitData(t)))},t.prototype.debug=function(t){var n;null!==(n=this.options)&&void 0!==n&&n.debug&&console.log("[Swetrix]",t)},t.prototype.canTrack=function(){var t,n;return"undefined"==typeof window?(this.debug("Tracking disabled: script does not run in browser environment."),!1):null!==(t=this.options)&&void 0!==t&&t.respectDNT&&"1"===(null===(n=window.navigator)||void 0===n?void 0:n.doNotTrack)?(this.debug("Tracking disabled: respecting user's 'Do Not Track' preference."),!1):!!(null!==(n=this.options)&&void 0!==n&&n.debug||"localhost"!==(null===location||void 0===location?void 0:location.hostname)&&"127.0.0.1"!==(null===location||void 0===location?void 0:location.hostname)&&""!==(null===location||void 0===location?void 0:location.hostname))&&(null===navigator||void 0===navigator||!navigator.webdriver||(this.debug("Tracking disabled: navigation is automated by WebDriver."),!1))},t.prototype.submitData=function(t){return fetch(c,{method:"post",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)})},t.prototype.submitCustom=function(t){return fetch(c+"/custom",{method:"post",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)})},t);function t(t,n){this.projectID=t,this.options=n,this.pageData=null,this.pageViewsOptions=null,this.trackPathChange=this.trackPathChange.bind(this)}i.LIB_INSTANCE=null,i.init=function(t,n){return i.LIB_INSTANCE||(i.LIB_INSTANCE=new u(t,n)),i.LIB_INSTANCE},i.track=function(t){i.LIB_INSTANCE&&i.LIB_INSTANCE.track(t)},i.trackViews=function(t){i.LIB_INSTANCE&&i.LIB_INSTANCE.trackPageViews(t)},Object.defineProperty(i,"__esModule",{value:!0})});
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).swetrix={})}(this,function(i){"use strict";function n(t){return(t=location.search.match(t))&&t[2]||void 0}function a(){return location.pathname||""}var e=function(){return(e=Object.assign||function(t){for(var e,i=1,n=arguments.length;i<n;i++)for(var a in e=arguments[i])Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a]);return t}).apply(this,arguments)},o=/[?&](ref|source|utm_source)=([^?&]+)/,r=/[?&](utm_campaign)=([^?&]+)/,s=/[?&](utm_medium)=([^?&]+)/,c=(t.prototype.track=function(t){this.canTrack()&&(t=e({pid:this.projectID},t),this.sendRequest("custom",t))},t.prototype.trackPageViews=function(t){if(this.canTrack()){if(this.pageData)return this.pageData.actions;var e,i;null!=(this.pageViewsOptions=t)&&t.unique||(i=setInterval(this.trackPathChange,2e3)),null!=t&&t.noHeartbeat||(setTimeout(this.heartbeat,3e3),e=setInterval(this.heartbeat,28e3));var n=a();return this.pageData={path:n,actions:{stop:function(){clearInterval(i),clearInterval(e)}}},this.trackPage(n,null==t?void 0:t.unique),this.pageData.actions}},t.prototype.heartbeat=function(){var t;(null!==(t=this.pageViewsOptions)&&void 0!==t&&t.heartbeatOnBackground||"hidden"!==document.visibilityState)&&(t={pid:this.projectID},this.sendRequest("hb",t))},t.prototype.checkIgnore=function(t){var e,i=null===(e=this.pageViewsOptions)||void 0===e?void 0:e.ignore;if(Array.isArray(i))for(var n=0;n<i.length;++n){if(i[n]===t)return!0;if(i[n]instanceof RegExp&&i[n].test(t))return!0}return!1},t.prototype.trackPathChange=function(){var t;this.pageData&&(t=a(),this.pageData.path!==t&&this.trackPage(t,!1))},t.prototype.trackPage=function(t,e){void 0===e&&(e=!1),this.pageData&&(this.pageData.path=t,this.checkIgnore(t)||(t={pid:this.projectID,lc:void 0!==navigator.languages?navigator.languages[0]:navigator.language,tz:function(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch(t){return}}(),ref:document.referrer||void 0,so:n(o),me:n(s),ca:n(r),unique:e,pg:t},this.sendRequest("",t)))},t.prototype.debug=function(t){var e;null!==(e=this.options)&&void 0!==e&&e.debug&&console.log("[Swetrix]",t)},t.prototype.canTrack=function(){var t,e;return"undefined"==typeof window?(this.debug("Tracking disabled: script does not run in browser environment."),!1):null!==(t=this.options)&&void 0!==t&&t.respectDNT&&"1"===(null===(e=window.navigator)||void 0===e?void 0:e.doNotTrack)?(this.debug("Tracking disabled: respecting user's 'Do Not Track' preference."),!1):!!(null!==(e=this.options)&&void 0!==e&&e.debug||"localhost"!==(null===location||void 0===location?void 0:location.hostname)&&"127.0.0.1"!==(null===location||void 0===location?void 0:location.hostname)&&""!==(null===location||void 0===location?void 0:location.hostname))&&(null===navigator||void 0===navigator||!navigator.webdriver||(this.debug("Tracking disabled: navigation is automated by WebDriver."),!1))},t.prototype.sendRequest=function(t,e){var i=new XMLHttpRequest;i.open("POST","".concat("https://api.swetrix.com/log","/").concat(t),!0),i.setRequestHeader("Content-Type","application/json"),i.send(JSON.stringify(e))},t);function t(t,e){this.projectID=t,this.options=e,this.pageData=null,this.pageViewsOptions=null,this.trackPathChange=this.trackPathChange.bind(this),this.heartbeat=this.heartbeat.bind(this)}i.LIB_INSTANCE=null,i.init=function(t,e){return i.LIB_INSTANCE||(i.LIB_INSTANCE=new c(t,e)),i.LIB_INSTANCE},i.track=function(t){i.LIB_INSTANCE&&i.LIB_INSTANCE.track(t)},i.trackViews=function(t){i.LIB_INSTANCE&&i.LIB_INSTANCE.trackPageViews(t)},Object.defineProperty(i,"__esModule",{value:!0})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swetrix",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "The JavaScript analytics client for Swetrix Analytics",
5
5
  "main": "dist/swetrix.cjs.js",
6
6
  "module": "dist/swetrix.es5.js",
@@ -18,7 +18,7 @@
18
18
  "type": "git",
19
19
  "url": "git+https://github.com/Swetrix/swetrix-js.git"
20
20
  },
21
- "author": "Swetrix <contact@swetrix.com>",
21
+ "author": "Andrii R. <contact@swetrix.com>",
22
22
  "license": "Apache-2.0",
23
23
  "bugs": {
24
24
  "url": "https://github.com/Swetrix/swetrix-js/issues"
@@ -28,14 +28,14 @@
28
28
  "@types/node": "^14.14.41"
29
29
  },
30
30
  "devDependencies": {
31
+ "@rollup/plugin-commonjs": "^21.0.1",
32
+ "@rollup/plugin-node-resolve": "^13.0.6",
31
33
  "rimraf": "^3.0.2",
32
- "rollup": "^2.53.0",
33
- "rollup-plugin-commonjs": "^10.1.0",
34
- "rollup-plugin-json": "^4.0.0",
34
+ "rollup": "^2.60.1",
35
35
  "rollup-plugin-node-resolve": "^5.2.0",
36
36
  "rollup-plugin-sourcemaps": "^0.6.3",
37
37
  "rollup-plugin-typescript2": "^0.30.0",
38
38
  "rollup-plugin-uglify": "^6.0.4",
39
- "typescript": "^4.3.5"
39
+ "typescript": "^4.5.2"
40
40
  }
41
41
  }
package/rollup.config.js CHANGED
@@ -1,5 +1,5 @@
1
- import resolve from 'rollup-plugin-node-resolve'
2
- import commonjs from 'rollup-plugin-commonjs'
1
+ import { nodeResolve } from '@rollup/plugin-node-resolve'
2
+ import commonjs from '@rollup/plugin-commonjs'
3
3
  import sourceMaps from 'rollup-plugin-sourcemaps'
4
4
  import typescript from 'rollup-plugin-typescript2'
5
5
  import { uglify } from 'rollup-plugin-uglify'
@@ -13,7 +13,7 @@ export default [
13
13
  { file: pkg.module, format: 'es' },
14
14
  ],
15
15
  plugins: [
16
- typescript(), resolve(), commonjs(), sourceMaps(),
16
+ typescript(), nodeResolve(), commonjs(), sourceMaps(),
17
17
  ]
18
18
  },
19
19
  {
@@ -22,7 +22,7 @@ export default [
22
22
  { file: pkg.browser, format: 'umd', name: 'swetrix' },
23
23
  ],
24
24
  plugins: [
25
- typescript(), resolve(), commonjs(), uglify(),
25
+ typescript(), nodeResolve(), commonjs(), uglify(),
26
26
  ]
27
27
  }
28
28
  ]
package/src/Lib.ts CHANGED
@@ -40,6 +40,12 @@ export interface PageViewsOptions {
40
40
 
41
41
  // A list of Regular Expressions or string pathes to ignore
42
42
  ignore?: Array<any>
43
+
44
+ // Do not send Heartbeat requests to the server
45
+ noHeartbeat?: boolean
46
+
47
+ // Send Heartbeat requests when the website tab is not active in the browser
48
+ heartbeatOnBackground?: boolean
43
49
  }
44
50
 
45
51
  const host = 'https://api.swetrix.com/log'
@@ -50,9 +56,10 @@ export class Lib {
50
56
 
51
57
  constructor(private projectID: string, private options?: LibOptions) {
52
58
  this.trackPathChange = this.trackPathChange.bind(this)
59
+ this.heartbeat = this.heartbeat.bind(this)
53
60
  }
54
61
 
55
- track(event: TrackEventOptions) {
62
+ track(event: TrackEventOptions): void {
56
63
  if (!this.canTrack()) {
57
64
  return
58
65
  }
@@ -61,10 +68,10 @@ export class Lib {
61
68
  pid: this.projectID,
62
69
  ...event,
63
70
  }
64
- this.submitCustom(data)
71
+ this.sendRequest('custom', data)
65
72
  }
66
73
 
67
- trackPageViews(options?: PageViewsOptions) {
74
+ trackPageViews(options?: PageViewsOptions): void | object {
68
75
  if (!this.canTrack()) {
69
76
  return
70
77
  }
@@ -74,17 +81,25 @@ export class Lib {
74
81
  }
75
82
 
76
83
  this.pageViewsOptions = options
77
- let interval: NodeJS.Timeout
84
+ let hbInterval: NodeJS.Timeout, interval: NodeJS.Timeout
78
85
  if (!options?.unique) {
79
86
  interval = setInterval(this.trackPathChange, 2000)
80
87
  }
81
88
 
89
+ if (!options?.noHeartbeat) {
90
+ setTimeout(this.heartbeat, 3000)
91
+ hbInterval = setInterval(this.heartbeat, 28000)
92
+ }
93
+
82
94
  const path = getPath()
83
95
 
84
96
  this.pageData = {
85
97
  path,
86
98
  actions: {
87
- stop: options?.unique ? () => { } : () => clearInterval(interval),
99
+ stop: () => {
100
+ clearInterval(interval)
101
+ clearInterval(hbInterval)
102
+ },
88
103
  },
89
104
  }
90
105
 
@@ -92,6 +107,18 @@ export class Lib {
92
107
  return this.pageData.actions
93
108
  }
94
109
 
110
+ private heartbeat(): void {
111
+ if (!this.pageViewsOptions?.heartbeatOnBackground && document.visibilityState === 'hidden') {
112
+ return
113
+ }
114
+
115
+ const data = {
116
+ pid: this.projectID,
117
+ }
118
+
119
+ this.sendRequest('hb', data)
120
+ }
121
+
95
122
  private checkIgnore(path: string): boolean {
96
123
  const ignore = this.pageViewsOptions?.ignore
97
124
 
@@ -105,7 +132,7 @@ export class Lib {
105
132
  }
106
133
 
107
134
  // Tracking path changes. If path changes -> calling this.trackPage method
108
- private trackPathChange() {
135
+ private trackPathChange(): void {
109
136
  if (!this.pageData) return
110
137
  const newPath = getPath()
111
138
  const { path } = this.pageData
@@ -115,7 +142,7 @@ export class Lib {
115
142
  }
116
143
  }
117
144
 
118
- private trackPage(pg: string, unique: boolean = false) {
145
+ private trackPage(pg: string, unique: boolean = false): void {
119
146
  if (!this.pageData) return
120
147
  this.pageData.path = pg
121
148
 
@@ -133,16 +160,16 @@ export class Lib {
133
160
  pg,
134
161
  }
135
162
 
136
- this.submitData(data)
163
+ this.sendRequest('', data)
137
164
  }
138
165
 
139
- private debug(message: string) {
166
+ private debug(message: string): void {
140
167
  if (this.options?.debug) {
141
168
  console.log('[Swetrix]', message)
142
169
  }
143
170
  }
144
171
 
145
- private canTrack() {
172
+ private canTrack(): boolean {
146
173
  if (!isInBrowser()) {
147
174
  this.debug('Tracking disabled: script does not run in browser environment.')
148
175
  return false
@@ -165,25 +192,10 @@ export class Lib {
165
192
  return true
166
193
  }
167
194
 
168
- private submitData(body: object) {
169
- return fetch(host, {
170
- method: 'post',
171
- headers: {
172
- 'Accept': 'application/json',
173
- 'Content-Type': 'application/json',
174
- },
175
- body: JSON.stringify(body),
176
- })
177
- }
178
-
179
- private submitCustom(body: object) {
180
- return fetch(`${host}/custom`, {
181
- method: 'post',
182
- headers: {
183
- 'Accept': 'application/json',
184
- 'Content-Type': 'application/json',
185
- },
186
- body: JSON.stringify(body),
187
- })
195
+ private sendRequest(path: string, body: object): void {
196
+ const req = new XMLHttpRequest()
197
+ req.open('POST', `${host}/${path}`, true)
198
+ req.setRequestHeader('Content-Type', 'application/json')
199
+ req.send(JSON.stringify(body))
188
200
  }
189
201
  }