@voiceflow/api-sdk 3.7.7 → 3.8.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.
- package/build/common/resources/{analytics.d.ts → analytics/index.d.ts} +14 -10
- package/build/common/resources/analytics/index.js +91 -0
- package/build/common/resources/analytics/index.js.map +1 -0
- package/build/common/resources/analytics/queue.d.ts +10 -0
- package/build/common/resources/analytics/queue.js +34 -0
- package/build/common/resources/analytics/queue.js.map +1 -0
- package/build/esm/resources/{analytics.d.ts → analytics/index.d.ts} +14 -10
- package/build/esm/resources/analytics/index.js +86 -0
- package/build/esm/resources/analytics/index.js.map +1 -0
- package/build/esm/resources/analytics/queue.d.ts +10 -0
- package/build/esm/resources/analytics/queue.js +32 -0
- package/build/esm/resources/analytics/queue.js.map +1 -0
- package/package.json +2 -2
- package/build/common/resources/analytics.js +0 -97
- package/build/common/resources/analytics.js.map +0 -1
- package/build/esm/resources/analytics.js +0 -92
- package/build/esm/resources/analytics.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type Fetch from "
|
|
1
|
+
import type Fetch from "../../fetch";
|
|
2
2
|
import { Crypto } from '@voiceflow/common';
|
|
3
|
-
import Fetcher from '
|
|
3
|
+
import Fetcher from '../fetcher';
|
|
4
4
|
interface HashOptions<K> {
|
|
5
5
|
envIDs?: K[];
|
|
6
6
|
hashed?: K[];
|
|
@@ -9,6 +9,9 @@ interface HashOptions<K> {
|
|
|
9
9
|
interface TrackOptions<P extends Record<string, any>, K extends keyof P> extends HashOptions<K> {
|
|
10
10
|
properties?: P;
|
|
11
11
|
}
|
|
12
|
+
interface PublicTrackOptions<P extends Record<string, any>, K extends keyof P> extends TrackOptions<P, K> {
|
|
13
|
+
anonymousID?: string;
|
|
14
|
+
}
|
|
12
15
|
interface IdentifyOptions<T extends Record<string, any>, K extends keyof T> extends HashOptions<K> {
|
|
13
16
|
traits: T;
|
|
14
17
|
}
|
|
@@ -17,19 +20,20 @@ interface AnalyticsOptions {
|
|
|
17
20
|
batching?: boolean;
|
|
18
21
|
}
|
|
19
22
|
declare class Analytics extends Fetcher<Analytics, AnalyticsOptions> {
|
|
20
|
-
private encryption?;
|
|
21
|
-
private queue;
|
|
22
23
|
private batching?;
|
|
23
|
-
private
|
|
24
|
+
private encryption?;
|
|
25
|
+
private publicQueue;
|
|
26
|
+
private privateQueue;
|
|
24
27
|
constructor(fetch: Fetch, options?: AnalyticsOptions);
|
|
25
|
-
|
|
28
|
+
protected _getEndpoint(): string;
|
|
26
29
|
private get shouldEncrypt();
|
|
27
30
|
private encryptedPayload;
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
+
private onFlushPublic;
|
|
32
|
+
private onFlushPrivate;
|
|
33
|
+
setBatching(batching: boolean): void;
|
|
34
|
+
flush(): Promise<void>;
|
|
31
35
|
track<P extends Record<string, any>, K extends keyof P>(event: string, { envIDs, hashed, teamhashed, properties }?: TrackOptions<P, K>): Promise<void>;
|
|
32
|
-
|
|
36
|
+
trackPublic<P extends Record<string, any>, K extends keyof P>(event: string, { envIDs, hashed, teamhashed, anonymousID, properties }?: PublicTrackOptions<P, K>): Promise<void>;
|
|
33
37
|
identify<T extends Record<string, any>, K extends keyof T>({ envIDs, traits, hashed, teamhashed, }: IdentifyOptions<T, K>): Promise<void>;
|
|
34
38
|
identifyWorkspace<T extends {
|
|
35
39
|
name: string;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fetcher_1 = __importDefault(require("../fetcher"));
|
|
7
|
+
const queue_1 = __importDefault(require("./queue"));
|
|
8
|
+
const ENDPOINT = 'analytics';
|
|
9
|
+
const ENCRYPTED_ENDPOINT = 'vf-ping';
|
|
10
|
+
// can not have async execution on FE window.addEventListener('beforeunload', ...) process thread
|
|
11
|
+
class Analytics extends fetcher_1.default {
|
|
12
|
+
constructor(fetch, options = {}) {
|
|
13
|
+
super({ fetch, clazz: Analytics, endpoint: ENDPOINT, clazzOptions: options });
|
|
14
|
+
this.onFlushPublic = (payload) => {
|
|
15
|
+
if (this.shouldEncrypt) {
|
|
16
|
+
return this.fetch.post(`${this._getEndpoint()}/batch`, this.encryptedPayload(payload));
|
|
17
|
+
}
|
|
18
|
+
return this.fetch.post(`${this._getEndpoint()}/batch-track`, payload);
|
|
19
|
+
};
|
|
20
|
+
this.onFlushPrivate = (payload) => {
|
|
21
|
+
if (this.shouldEncrypt) {
|
|
22
|
+
return this.fetch.post(`${this._getEndpoint()}/private-batch`, this.encryptedPayload(payload));
|
|
23
|
+
}
|
|
24
|
+
return this.fetch.post(`${this._getEndpoint()}/private-batch-track`, payload);
|
|
25
|
+
};
|
|
26
|
+
this.batching = options.batching;
|
|
27
|
+
this.encryption = options.encryption;
|
|
28
|
+
this.publicQueue = new queue_1.default(this.onFlushPublic);
|
|
29
|
+
this.privateQueue = new queue_1.default(this.onFlushPrivate);
|
|
30
|
+
}
|
|
31
|
+
_getEndpoint() {
|
|
32
|
+
return this.shouldEncrypt ? ENCRYPTED_ENDPOINT : ENDPOINT;
|
|
33
|
+
}
|
|
34
|
+
get shouldEncrypt() {
|
|
35
|
+
return !!this.encryption;
|
|
36
|
+
}
|
|
37
|
+
encryptedPayload(data) {
|
|
38
|
+
if (!this.encryption) {
|
|
39
|
+
throw new Error('Encryption should be provided!');
|
|
40
|
+
}
|
|
41
|
+
return { message: this.encryption.encryptJSON(data) };
|
|
42
|
+
}
|
|
43
|
+
setBatching(batching) {
|
|
44
|
+
this.batching = batching;
|
|
45
|
+
}
|
|
46
|
+
flush() {
|
|
47
|
+
return Promise.all([this.publicQueue.flush(), this.privateQueue.flush()]).then(queue_1.default.voidFunc);
|
|
48
|
+
}
|
|
49
|
+
track(event, { envIDs, hashed, teamhashed, properties = {} } = {}) {
|
|
50
|
+
if (!event) {
|
|
51
|
+
return Promise.resolve();
|
|
52
|
+
}
|
|
53
|
+
const payload = { event, envIDs, hashed, teamhashed, properties };
|
|
54
|
+
if (this.batching) {
|
|
55
|
+
return this.privateQueue.enqueue(payload);
|
|
56
|
+
}
|
|
57
|
+
if (this.shouldEncrypt) {
|
|
58
|
+
return this.fetch.post(`${this._getEndpoint()}/private`, this.encryptedPayload(payload)).then(queue_1.default.voidFunc);
|
|
59
|
+
}
|
|
60
|
+
return this.fetch.post(`${this._getEndpoint()}/private-track`, payload).then(queue_1.default.voidFunc);
|
|
61
|
+
}
|
|
62
|
+
trackPublic(event, { envIDs, hashed, teamhashed, anonymousID, properties = {} } = {}) {
|
|
63
|
+
if (!event) {
|
|
64
|
+
return Promise.resolve();
|
|
65
|
+
}
|
|
66
|
+
const payload = { event, envIDs, hashed, teamhashed, properties, anonymousID };
|
|
67
|
+
if (this.batching) {
|
|
68
|
+
return this.publicQueue.enqueue(payload);
|
|
69
|
+
}
|
|
70
|
+
if (this.shouldEncrypt) {
|
|
71
|
+
return this.fetch.post(`${this._getEndpoint()}`, this.encryptedPayload(payload)).then(queue_1.default.voidFunc);
|
|
72
|
+
}
|
|
73
|
+
return this.fetch.post(`${this._getEndpoint()}/track`, payload).then(queue_1.default.voidFunc);
|
|
74
|
+
}
|
|
75
|
+
async identify({ envIDs, traits, hashed, teamhashed, }) {
|
|
76
|
+
const payload = { traits, envIDs, hashed, teamhashed };
|
|
77
|
+
if (this.shouldEncrypt) {
|
|
78
|
+
return this.fetch.post(`${this._getEndpoint()}/user`, this.encryptedPayload(payload)).then(queue_1.default.voidFunc);
|
|
79
|
+
}
|
|
80
|
+
return this.fetch.post(`${this._getEndpoint()}/identify`, payload).then(queue_1.default.voidFunc);
|
|
81
|
+
}
|
|
82
|
+
async identifyWorkspace(id, properties) {
|
|
83
|
+
const payload = Object.assign(Object.assign({}, properties), { id });
|
|
84
|
+
if (this.shouldEncrypt) {
|
|
85
|
+
return this.fetch.post(`${this._getEndpoint()}/workspace`, this.encryptedPayload(payload)).then(queue_1.default.voidFunc);
|
|
86
|
+
}
|
|
87
|
+
return this.fetch.post(`${this._getEndpoint()}/workspace/identify`, payload).then(queue_1.default.voidFunc);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.default = Analytics;
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/resources/analytics/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
declare class Queue {
|
|
2
|
+
private onFlush;
|
|
3
|
+
static voidFunc: () => undefined;
|
|
4
|
+
private queue;
|
|
5
|
+
private enqueuePromise;
|
|
6
|
+
constructor(onFlush: (payload: Record<string, unknown>[]) => Promise<any>);
|
|
7
|
+
enqueue(payload: Record<string, unknown>): Promise<void>;
|
|
8
|
+
flush(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export default Queue;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class Queue {
|
|
4
|
+
constructor(onFlush) {
|
|
5
|
+
this.onFlush = onFlush;
|
|
6
|
+
this.queue = [];
|
|
7
|
+
this.enqueuePromise = null;
|
|
8
|
+
}
|
|
9
|
+
async enqueue(payload) {
|
|
10
|
+
this.queue.push(payload);
|
|
11
|
+
if (this.enqueuePromise) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// we await for Promise.resolve, to push all events that came in the same tick from event loop
|
|
15
|
+
this.enqueuePromise = Promise.resolve();
|
|
16
|
+
await this.enqueuePromise;
|
|
17
|
+
this.flush();
|
|
18
|
+
this.enqueuePromise = null;
|
|
19
|
+
}
|
|
20
|
+
flush() {
|
|
21
|
+
const payload = this.queue;
|
|
22
|
+
this.queue = [];
|
|
23
|
+
if (!payload.length) {
|
|
24
|
+
return Promise.resolve();
|
|
25
|
+
}
|
|
26
|
+
return this.onFlush(payload)
|
|
27
|
+
.then(Queue.voidFunc)
|
|
28
|
+
.catch(() => {
|
|
29
|
+
this.queue.push(...payload);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.default = Queue;
|
|
34
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../../src/resources/analytics/queue.ts"],"names":[],"mappings":";;AAAA,MAAM,KAAK;IAOT,YAAoB,OAA6D;QAA7D,YAAO,GAAP,OAAO,CAAsD;QAJzE,UAAK,GAA8B,EAAE,CAAC;QAEtC,mBAAc,GAAyB,IAAI,CAAC;IAEgC,CAAC;IAE9E,KAAK,CAAC,OAAO,CAAC,OAAgC;QACnD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,OAAO;SACR;QAED,8FAA8F;QAC9F,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAExC,MAAM,IAAI,CAAC,cAAc,CAAC;QAE1B,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAEM,KAAK;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QAE3B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;SAC1B;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;aACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC;CACF;AAED,kBAAe,KAAK,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type Fetch from "
|
|
1
|
+
import type Fetch from "../../fetch";
|
|
2
2
|
import { Crypto } from '@voiceflow/common';
|
|
3
|
-
import Fetcher from '
|
|
3
|
+
import Fetcher from '../fetcher';
|
|
4
4
|
interface HashOptions<K> {
|
|
5
5
|
envIDs?: K[];
|
|
6
6
|
hashed?: K[];
|
|
@@ -9,6 +9,9 @@ interface HashOptions<K> {
|
|
|
9
9
|
interface TrackOptions<P extends Record<string, any>, K extends keyof P> extends HashOptions<K> {
|
|
10
10
|
properties?: P;
|
|
11
11
|
}
|
|
12
|
+
interface PublicTrackOptions<P extends Record<string, any>, K extends keyof P> extends TrackOptions<P, K> {
|
|
13
|
+
anonymousID?: string;
|
|
14
|
+
}
|
|
12
15
|
interface IdentifyOptions<T extends Record<string, any>, K extends keyof T> extends HashOptions<K> {
|
|
13
16
|
traits: T;
|
|
14
17
|
}
|
|
@@ -17,19 +20,20 @@ interface AnalyticsOptions {
|
|
|
17
20
|
batching?: boolean;
|
|
18
21
|
}
|
|
19
22
|
declare class Analytics extends Fetcher<Analytics, AnalyticsOptions> {
|
|
20
|
-
private encryption?;
|
|
21
|
-
private queue;
|
|
22
23
|
private batching?;
|
|
23
|
-
private
|
|
24
|
+
private encryption?;
|
|
25
|
+
private publicQueue;
|
|
26
|
+
private privateQueue;
|
|
24
27
|
constructor(fetch: Fetch, options?: AnalyticsOptions);
|
|
25
|
-
|
|
28
|
+
protected _getEndpoint(): string;
|
|
26
29
|
private get shouldEncrypt();
|
|
27
30
|
private encryptedPayload;
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
+
private onFlushPublic;
|
|
32
|
+
private onFlushPrivate;
|
|
33
|
+
setBatching(batching: boolean): void;
|
|
34
|
+
flush(): Promise<void>;
|
|
31
35
|
track<P extends Record<string, any>, K extends keyof P>(event: string, { envIDs, hashed, teamhashed, properties }?: TrackOptions<P, K>): Promise<void>;
|
|
32
|
-
|
|
36
|
+
trackPublic<P extends Record<string, any>, K extends keyof P>(event: string, { envIDs, hashed, teamhashed, anonymousID, properties }?: PublicTrackOptions<P, K>): Promise<void>;
|
|
33
37
|
identify<T extends Record<string, any>, K extends keyof T>({ envIDs, traits, hashed, teamhashed, }: IdentifyOptions<T, K>): Promise<void>;
|
|
34
38
|
identifyWorkspace<T extends {
|
|
35
39
|
name: string;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import Fetcher from '../fetcher';
|
|
2
|
+
import Queue from './queue';
|
|
3
|
+
const ENDPOINT = 'analytics';
|
|
4
|
+
const ENCRYPTED_ENDPOINT = 'vf-ping';
|
|
5
|
+
// can not have async execution on FE window.addEventListener('beforeunload', ...) process thread
|
|
6
|
+
class Analytics extends Fetcher {
|
|
7
|
+
constructor(fetch, options = {}) {
|
|
8
|
+
super({ fetch, clazz: Analytics, endpoint: ENDPOINT, clazzOptions: options });
|
|
9
|
+
this.onFlushPublic = (payload) => {
|
|
10
|
+
if (this.shouldEncrypt) {
|
|
11
|
+
return this.fetch.post(`${this._getEndpoint()}/batch`, this.encryptedPayload(payload));
|
|
12
|
+
}
|
|
13
|
+
return this.fetch.post(`${this._getEndpoint()}/batch-track`, payload);
|
|
14
|
+
};
|
|
15
|
+
this.onFlushPrivate = (payload) => {
|
|
16
|
+
if (this.shouldEncrypt) {
|
|
17
|
+
return this.fetch.post(`${this._getEndpoint()}/private-batch`, this.encryptedPayload(payload));
|
|
18
|
+
}
|
|
19
|
+
return this.fetch.post(`${this._getEndpoint()}/private-batch-track`, payload);
|
|
20
|
+
};
|
|
21
|
+
this.batching = options.batching;
|
|
22
|
+
this.encryption = options.encryption;
|
|
23
|
+
this.publicQueue = new Queue(this.onFlushPublic);
|
|
24
|
+
this.privateQueue = new Queue(this.onFlushPrivate);
|
|
25
|
+
}
|
|
26
|
+
_getEndpoint() {
|
|
27
|
+
return this.shouldEncrypt ? ENCRYPTED_ENDPOINT : ENDPOINT;
|
|
28
|
+
}
|
|
29
|
+
get shouldEncrypt() {
|
|
30
|
+
return !!this.encryption;
|
|
31
|
+
}
|
|
32
|
+
encryptedPayload(data) {
|
|
33
|
+
if (!this.encryption) {
|
|
34
|
+
throw new Error('Encryption should be provided!');
|
|
35
|
+
}
|
|
36
|
+
return { message: this.encryption.encryptJSON(data) };
|
|
37
|
+
}
|
|
38
|
+
setBatching(batching) {
|
|
39
|
+
this.batching = batching;
|
|
40
|
+
}
|
|
41
|
+
flush() {
|
|
42
|
+
return Promise.all([this.publicQueue.flush(), this.privateQueue.flush()]).then(Queue.voidFunc);
|
|
43
|
+
}
|
|
44
|
+
track(event, { envIDs, hashed, teamhashed, properties = {} } = {}) {
|
|
45
|
+
if (!event) {
|
|
46
|
+
return Promise.resolve();
|
|
47
|
+
}
|
|
48
|
+
const payload = { event, envIDs, hashed, teamhashed, properties };
|
|
49
|
+
if (this.batching) {
|
|
50
|
+
return this.privateQueue.enqueue(payload);
|
|
51
|
+
}
|
|
52
|
+
if (this.shouldEncrypt) {
|
|
53
|
+
return this.fetch.post(`${this._getEndpoint()}/private`, this.encryptedPayload(payload)).then(Queue.voidFunc);
|
|
54
|
+
}
|
|
55
|
+
return this.fetch.post(`${this._getEndpoint()}/private-track`, payload).then(Queue.voidFunc);
|
|
56
|
+
}
|
|
57
|
+
trackPublic(event, { envIDs, hashed, teamhashed, anonymousID, properties = {} } = {}) {
|
|
58
|
+
if (!event) {
|
|
59
|
+
return Promise.resolve();
|
|
60
|
+
}
|
|
61
|
+
const payload = { event, envIDs, hashed, teamhashed, properties, anonymousID };
|
|
62
|
+
if (this.batching) {
|
|
63
|
+
return this.publicQueue.enqueue(payload);
|
|
64
|
+
}
|
|
65
|
+
if (this.shouldEncrypt) {
|
|
66
|
+
return this.fetch.post(`${this._getEndpoint()}`, this.encryptedPayload(payload)).then(Queue.voidFunc);
|
|
67
|
+
}
|
|
68
|
+
return this.fetch.post(`${this._getEndpoint()}/track`, payload).then(Queue.voidFunc);
|
|
69
|
+
}
|
|
70
|
+
async identify({ envIDs, traits, hashed, teamhashed, }) {
|
|
71
|
+
const payload = { traits, envIDs, hashed, teamhashed };
|
|
72
|
+
if (this.shouldEncrypt) {
|
|
73
|
+
return this.fetch.post(`${this._getEndpoint()}/user`, this.encryptedPayload(payload)).then(Queue.voidFunc);
|
|
74
|
+
}
|
|
75
|
+
return this.fetch.post(`${this._getEndpoint()}/identify`, payload).then(Queue.voidFunc);
|
|
76
|
+
}
|
|
77
|
+
async identifyWorkspace(id, properties) {
|
|
78
|
+
const payload = Object.assign(Object.assign({}, properties), { id });
|
|
79
|
+
if (this.shouldEncrypt) {
|
|
80
|
+
return this.fetch.post(`${this._getEndpoint()}/workspace`, this.encryptedPayload(payload)).then(Queue.voidFunc);
|
|
81
|
+
}
|
|
82
|
+
return this.fetch.post(`${this._getEndpoint()}/workspace/identify`, payload).then(Queue.voidFunc);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export default Analytics;
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/resources/analytics/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
declare class Queue {
|
|
2
|
+
private onFlush;
|
|
3
|
+
static voidFunc: () => undefined;
|
|
4
|
+
private queue;
|
|
5
|
+
private enqueuePromise;
|
|
6
|
+
constructor(onFlush: (payload: Record<string, unknown>[]) => Promise<any>);
|
|
7
|
+
enqueue(payload: Record<string, unknown>): Promise<void>;
|
|
8
|
+
flush(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export default Queue;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
class Queue {
|
|
2
|
+
constructor(onFlush) {
|
|
3
|
+
this.onFlush = onFlush;
|
|
4
|
+
this.queue = [];
|
|
5
|
+
this.enqueuePromise = null;
|
|
6
|
+
}
|
|
7
|
+
async enqueue(payload) {
|
|
8
|
+
this.queue.push(payload);
|
|
9
|
+
if (this.enqueuePromise) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
// we await for Promise.resolve, to push all events that came in the same tick from event loop
|
|
13
|
+
this.enqueuePromise = Promise.resolve();
|
|
14
|
+
await this.enqueuePromise;
|
|
15
|
+
this.flush();
|
|
16
|
+
this.enqueuePromise = null;
|
|
17
|
+
}
|
|
18
|
+
flush() {
|
|
19
|
+
const payload = this.queue;
|
|
20
|
+
this.queue = [];
|
|
21
|
+
if (!payload.length) {
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
}
|
|
24
|
+
return this.onFlush(payload)
|
|
25
|
+
.then(Queue.voidFunc)
|
|
26
|
+
.catch(() => {
|
|
27
|
+
this.queue.push(...payload);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export default Queue;
|
|
32
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../../src/resources/analytics/queue.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK;IAOT,YAAoB,OAA6D;QAA7D,YAAO,GAAP,OAAO,CAAsD;QAJzE,UAAK,GAA8B,EAAE,CAAC;QAEtC,mBAAc,GAAyB,IAAI,CAAC;IAEgC,CAAC;IAE9E,KAAK,CAAC,OAAO,CAAC,OAAgC;QACnD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,OAAO;SACR;QAED,8FAA8F;QAC9F,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAExC,MAAM,IAAI,CAAC,cAAc,CAAC;QAE1B,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAEM,KAAK;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QAE3B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;SAC1B;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;aACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC;CACF;AAED,eAAe,KAAK,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voiceflow/api-sdk",
|
|
3
3
|
"description": "wrapper for creator-api",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.8.0",
|
|
5
5
|
"author": "Voiceflow",
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/voiceflow/libs/issues"
|
|
@@ -62,5 +62,5 @@
|
|
|
62
62
|
"test:single": "NODE_ENV=test ts-mocha --paths --config ./config/tests/.mocharc.json",
|
|
63
63
|
"test:unit": "NODE_ENV=test nyc --report-dir=nyc_coverage_unit ts-mocha --paths --config ./config/tests/.mocharc.json 'tests/**/*.unit.ts'"
|
|
64
64
|
},
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "1171a29e3dc4e0951663c582592523d6cda878ef"
|
|
66
66
|
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const fetcher_1 = __importDefault(require("./fetcher"));
|
|
7
|
-
const ENDPOINT = 'analytics';
|
|
8
|
-
const ENCRYPTED_ENDPOINT = 'vf-ping';
|
|
9
|
-
class Analytics extends fetcher_1.default {
|
|
10
|
-
constructor(fetch, options = {}) {
|
|
11
|
-
super({ fetch, clazz: Analytics, endpoint: ENDPOINT, clazzOptions: options });
|
|
12
|
-
this.encryption = options.encryption;
|
|
13
|
-
this.queue = [];
|
|
14
|
-
this.batching = options.batching;
|
|
15
|
-
this.batchPromise = null;
|
|
16
|
-
}
|
|
17
|
-
setBatching(batching) {
|
|
18
|
-
this.batching = batching;
|
|
19
|
-
}
|
|
20
|
-
get shouldEncrypt() {
|
|
21
|
-
return !!this.encryption;
|
|
22
|
-
}
|
|
23
|
-
encryptedPayload(data) {
|
|
24
|
-
if (!this.encryption) {
|
|
25
|
-
throw new Error('Encryption should be provided!');
|
|
26
|
-
}
|
|
27
|
-
return { message: this.encryption.encryptJSON(data) };
|
|
28
|
-
}
|
|
29
|
-
_getEndpoint() {
|
|
30
|
-
return this.shouldEncrypt ? ENCRYPTED_ENDPOINT : ENDPOINT;
|
|
31
|
-
}
|
|
32
|
-
async _enqueue(payload) {
|
|
33
|
-
this.queue.push(payload);
|
|
34
|
-
if (this.batchPromise) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
// we await for Promise.resolve, to push all events that came in the same tick from event loop
|
|
38
|
-
this.batchPromise = Promise.resolve();
|
|
39
|
-
await this.batchPromise;
|
|
40
|
-
this.flushBatched();
|
|
41
|
-
this.batchPromise = null;
|
|
42
|
-
}
|
|
43
|
-
flushBatched() {
|
|
44
|
-
const payload = this.queue;
|
|
45
|
-
this.queue = [];
|
|
46
|
-
let promise;
|
|
47
|
-
// can not have async execution on FE window.addEventListener('beforeunload', ...) process thread
|
|
48
|
-
if (this.shouldEncrypt) {
|
|
49
|
-
promise = this.fetch.post(`${this._getEndpoint()}/batch`, this.encryptedPayload(payload));
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
promise = this.fetch.post(`${this._getEndpoint()}/batch-track`, payload);
|
|
53
|
-
}
|
|
54
|
-
return promise
|
|
55
|
-
.then(() => undefined)
|
|
56
|
-
.catch(() => {
|
|
57
|
-
this.queue.push(...payload);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
track(event, { envIDs, hashed, teamhashed, properties = {} } = {}) {
|
|
61
|
-
if (!event) {
|
|
62
|
-
return Promise.resolve();
|
|
63
|
-
}
|
|
64
|
-
if (this.batching) {
|
|
65
|
-
return this._enqueue({ event, envIDs, hashed, teamhashed, properties });
|
|
66
|
-
}
|
|
67
|
-
return this._send(event, { envIDs, hashed, teamhashed, properties });
|
|
68
|
-
}
|
|
69
|
-
_send(event, { envIDs, hashed, teamhashed, properties = {} } = {}) {
|
|
70
|
-
const payload = { event, envIDs, hashed, teamhashed, properties };
|
|
71
|
-
// can not have async execution on FE window.addEventListener('beforeunload', ...) process thread
|
|
72
|
-
if (this.shouldEncrypt) {
|
|
73
|
-
return this.fetch.post(`${this._getEndpoint()}`, this.encryptedPayload(payload)).then(() => undefined);
|
|
74
|
-
}
|
|
75
|
-
return this.fetch.post(`${this._getEndpoint()}/track`, payload).then(() => undefined);
|
|
76
|
-
}
|
|
77
|
-
async identify({ envIDs, traits, hashed, teamhashed, }) {
|
|
78
|
-
const payload = { traits, envIDs, hashed, teamhashed };
|
|
79
|
-
if (this.shouldEncrypt) {
|
|
80
|
-
await this.fetch.post(`${this._getEndpoint()}/user`, this.encryptedPayload(payload));
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
await this.fetch.post(`${this._getEndpoint()}/identify`, payload);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
async identifyWorkspace(id, properties) {
|
|
87
|
-
const payload = Object.assign(Object.assign({}, properties), { id });
|
|
88
|
-
if (this.shouldEncrypt) {
|
|
89
|
-
await this.fetch.post(`${this._getEndpoint()}/workspace`, this.encryptedPayload(payload));
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
await this.fetch.post(`${this._getEndpoint()}/workspace/identify`, payload);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
exports.default = Analytics;
|
|
97
|
-
//# sourceMappingURL=analytics.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/resources/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import Fetcher from './fetcher';
|
|
2
|
-
const ENDPOINT = 'analytics';
|
|
3
|
-
const ENCRYPTED_ENDPOINT = 'vf-ping';
|
|
4
|
-
class Analytics extends Fetcher {
|
|
5
|
-
constructor(fetch, options = {}) {
|
|
6
|
-
super({ fetch, clazz: Analytics, endpoint: ENDPOINT, clazzOptions: options });
|
|
7
|
-
this.encryption = options.encryption;
|
|
8
|
-
this.queue = [];
|
|
9
|
-
this.batching = options.batching;
|
|
10
|
-
this.batchPromise = null;
|
|
11
|
-
}
|
|
12
|
-
setBatching(batching) {
|
|
13
|
-
this.batching = batching;
|
|
14
|
-
}
|
|
15
|
-
get shouldEncrypt() {
|
|
16
|
-
return !!this.encryption;
|
|
17
|
-
}
|
|
18
|
-
encryptedPayload(data) {
|
|
19
|
-
if (!this.encryption) {
|
|
20
|
-
throw new Error('Encryption should be provided!');
|
|
21
|
-
}
|
|
22
|
-
return { message: this.encryption.encryptJSON(data) };
|
|
23
|
-
}
|
|
24
|
-
_getEndpoint() {
|
|
25
|
-
return this.shouldEncrypt ? ENCRYPTED_ENDPOINT : ENDPOINT;
|
|
26
|
-
}
|
|
27
|
-
async _enqueue(payload) {
|
|
28
|
-
this.queue.push(payload);
|
|
29
|
-
if (this.batchPromise) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
// we await for Promise.resolve, to push all events that came in the same tick from event loop
|
|
33
|
-
this.batchPromise = Promise.resolve();
|
|
34
|
-
await this.batchPromise;
|
|
35
|
-
this.flushBatched();
|
|
36
|
-
this.batchPromise = null;
|
|
37
|
-
}
|
|
38
|
-
flushBatched() {
|
|
39
|
-
const payload = this.queue;
|
|
40
|
-
this.queue = [];
|
|
41
|
-
let promise;
|
|
42
|
-
// can not have async execution on FE window.addEventListener('beforeunload', ...) process thread
|
|
43
|
-
if (this.shouldEncrypt) {
|
|
44
|
-
promise = this.fetch.post(`${this._getEndpoint()}/batch`, this.encryptedPayload(payload));
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
promise = this.fetch.post(`${this._getEndpoint()}/batch-track`, payload);
|
|
48
|
-
}
|
|
49
|
-
return promise
|
|
50
|
-
.then(() => undefined)
|
|
51
|
-
.catch(() => {
|
|
52
|
-
this.queue.push(...payload);
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
track(event, { envIDs, hashed, teamhashed, properties = {} } = {}) {
|
|
56
|
-
if (!event) {
|
|
57
|
-
return Promise.resolve();
|
|
58
|
-
}
|
|
59
|
-
if (this.batching) {
|
|
60
|
-
return this._enqueue({ event, envIDs, hashed, teamhashed, properties });
|
|
61
|
-
}
|
|
62
|
-
return this._send(event, { envIDs, hashed, teamhashed, properties });
|
|
63
|
-
}
|
|
64
|
-
_send(event, { envIDs, hashed, teamhashed, properties = {} } = {}) {
|
|
65
|
-
const payload = { event, envIDs, hashed, teamhashed, properties };
|
|
66
|
-
// can not have async execution on FE window.addEventListener('beforeunload', ...) process thread
|
|
67
|
-
if (this.shouldEncrypt) {
|
|
68
|
-
return this.fetch.post(`${this._getEndpoint()}`, this.encryptedPayload(payload)).then(() => undefined);
|
|
69
|
-
}
|
|
70
|
-
return this.fetch.post(`${this._getEndpoint()}/track`, payload).then(() => undefined);
|
|
71
|
-
}
|
|
72
|
-
async identify({ envIDs, traits, hashed, teamhashed, }) {
|
|
73
|
-
const payload = { traits, envIDs, hashed, teamhashed };
|
|
74
|
-
if (this.shouldEncrypt) {
|
|
75
|
-
await this.fetch.post(`${this._getEndpoint()}/user`, this.encryptedPayload(payload));
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
await this.fetch.post(`${this._getEndpoint()}/identify`, payload);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
async identifyWorkspace(id, properties) {
|
|
82
|
-
const payload = Object.assign(Object.assign({}, properties), { id });
|
|
83
|
-
if (this.shouldEncrypt) {
|
|
84
|
-
await this.fetch.post(`${this._getEndpoint()}/workspace`, this.encryptedPayload(payload));
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
await this.fetch.post(`${this._getEndpoint()}/workspace/identify`, payload);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
export default Analytics;
|
|
92
|
-
//# sourceMappingURL=analytics.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/resources/analytics.ts"],"names":[],"mappings":"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"}
|