@vrplatform/log 1.0.17 → 1.0.18
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/main/tracking/index.d.ts +1 -5
- package/build/main/tracking/index.js +7 -19
- package/build/main/tracking/index.js.map +1 -1
- package/build/main/tracking/intercom.d.ts +45 -45
- package/build/main/tracking/intercom.js +60 -45
- package/build/main/tracking/intercom.js.map +1 -1
- package/build/module/tracking/index.d.ts +1 -5
- package/build/module/tracking/index.js +7 -19
- package/build/module/tracking/index.js.map +1 -1
- package/build/module/tracking/intercom.d.ts +45 -45
- package/build/module/tracking/intercom.js +60 -45
- package/build/module/tracking/intercom.js.map +1 -1
- package/package.json +1 -1
- package/src/tracking/index.ts +7 -28
- package/src/tracking/intercom.ts +115 -104
|
@@ -30,10 +30,6 @@ export declare const useTracking: ({ dataset, env, name }: TrackingProps, isDev?
|
|
|
30
30
|
alias: string;
|
|
31
31
|
}) => void;
|
|
32
32
|
shutdown: () => Promise<void>;
|
|
33
|
-
|
|
34
|
-
tenantId: string;
|
|
35
|
-
customerId: string;
|
|
36
|
-
data: Parameters<IntercomAPI["updateCompany"]>[0]["data"];
|
|
37
|
-
}) => Promise<void>;
|
|
33
|
+
intercom: IntercomAPI;
|
|
38
34
|
log: import("../log").WorkerLog;
|
|
39
35
|
};
|
|
@@ -6,13 +6,14 @@ const posthog_node_1 = require("posthog-node");
|
|
|
6
6
|
const log_1 = require("../log");
|
|
7
7
|
const intercom_1 = require("./intercom");
|
|
8
8
|
const useTracking = ({ dataset, env, name }, isDev) => {
|
|
9
|
-
const
|
|
10
|
-
const intercom = (0, intercom_1.useIntercom)(env.INTERCOM_TOKEN,
|
|
9
|
+
const axiom = (0, log_1.useLog)({ name, dataset, env });
|
|
10
|
+
const intercom = (0, intercom_1.useIntercom)(env.INTERCOM_TOKEN, axiom);
|
|
11
11
|
const juneso = new analytics_node_1.Analytics(env.JUNESO_ANALYTICS_WRITE_KEY);
|
|
12
12
|
const posthog = new posthog_node_1.PostHog(env.POSTHOG_API_KEY, {
|
|
13
13
|
host: 'https://app.posthog.com',
|
|
14
14
|
});
|
|
15
15
|
return {
|
|
16
|
+
// General
|
|
16
17
|
track: async ({ userId, event, tenantId, properties, }) => {
|
|
17
18
|
if (isDev)
|
|
18
19
|
return;
|
|
@@ -64,28 +65,15 @@ const useTracking = ({ dataset, env, name }, isDev) => {
|
|
|
64
65
|
traits: properties,
|
|
65
66
|
});
|
|
66
67
|
},
|
|
68
|
+
// Posthog specific
|
|
67
69
|
alias: ({ distinctId, alias }) => posthog.alias({ distinctId, alias }),
|
|
68
70
|
shutdown: async () => {
|
|
69
71
|
await posthog.shutdown();
|
|
70
72
|
await juneso.closeAndFlush();
|
|
71
73
|
},
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if (!intercomCompany)
|
|
76
|
-
return;
|
|
77
|
-
await intercom.updateCompany({
|
|
78
|
-
companyId: intercomCompany.id,
|
|
79
|
-
data: {
|
|
80
|
-
...data,
|
|
81
|
-
custom_attributes: {
|
|
82
|
-
...data.custom_attributes,
|
|
83
|
-
billingPortalUrl: `https://billing.vrplatform.app/portal/${customerId}`,
|
|
84
|
-
},
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
},
|
|
88
|
-
log,
|
|
74
|
+
// export intercom and axiom
|
|
75
|
+
intercom,
|
|
76
|
+
log: axiom,
|
|
89
77
|
};
|
|
90
78
|
};
|
|
91
79
|
exports.useTracking = useTracking;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["tracking/index.ts"],"names":[],"mappings":";;;AAAA,4DAAoD;AACpD,+CAAuC;AACvC,gCAAgC;AAChC,yCAA2D;AAcpD,MAAM,WAAW,GAAG,CACzB,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAiB,EACrC,KAAe,EACf,EAAE;IACF,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["tracking/index.ts"],"names":[],"mappings":";;;AAAA,4DAAoD;AACpD,+CAAuC;AACvC,gCAAgC;AAChC,yCAA2D;AAcpD,MAAM,WAAW,GAAG,CACzB,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAiB,EACrC,KAAe,EACf,EAAE;IACF,MAAM,KAAK,GAAG,IAAA,YAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAA,sBAAW,EAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,0BAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,sBAAO,CAAC,GAAG,CAAC,eAAe,EAAE;QAC/C,IAAI,EAAE,yBAAyB;KAChC,CAAC,CAAC;IAEH,OAAO;QACL,UAAU;QACV,KAAK,EAAE,KAAK,EAAE,EACZ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,UAAU,GAMX,EAAE,EAAE;YACH,IAAI,KAAK;gBAAE,OAAO;YAElB,OAAO,CAAC,OAAO,CAAC;gBACd,UAAU,EAAE,MAAM;gBAClB,KAAK;gBACL,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ;iBACjB;gBACD,UAAU;aACX,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC;gBACX,MAAM;gBACN,KAAK;gBACL,UAAU;gBACV,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;aAC/B,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,UAAU,CAAC;oBACxB,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,UAAU;iBACrB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,QAAQ,EAAE,CAAC,EACT,UAAU,EACV,MAAM,GAC8C,EAAE,EAAE;YACxD,OAAO,CAAC,QAAQ,CAAC;gBACf,UAAU,EAAE,MAAM;gBAClB,UAAU;aACX,CAAC,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC;gBACd,MAAM;gBACN,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,EAAE,CAAC,EACN,UAAU,EACV,QAAQ,EACR,MAAM,GAKP,EAAE,EAAE;YACH,OAAO,CAAC,aAAa,CAAC;gBACpB,QAAQ,EAAE,QAAQ;gBAClB,SAAS,EAAE,QAAQ;gBACnB,UAAU;gBACV,UAAU,EAAE,MAAM;aACnB,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC;gBACX,MAAM;gBACN,OAAO,EAAE,QAAQ;gBACjB,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;QACL,CAAC;QACD,mBAAmB;QACnB,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAyC,EAAE,EAAE,CACtE,OAAO,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACtC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAC/B,CAAC;QACD,4BAA4B;QAC5B,QAAQ;QACR,GAAG,EAAE,KAAK;KACX,CAAC;AACJ,CAAC,CAAC;AAhGW,QAAA,WAAW,eAgGtB"}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import type { Log } from '../log';
|
|
2
2
|
export declare class IntercomAPI {
|
|
3
|
-
constructor(token: string, log
|
|
3
|
+
constructor(token: string, log?: Log);
|
|
4
4
|
private headers;
|
|
5
|
-
private log
|
|
5
|
+
private log?;
|
|
6
6
|
private fetch;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
getUserByUserId(userId: string): Promise<{
|
|
8
|
+
type: "list";
|
|
9
9
|
data: {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
id: string;
|
|
11
|
+
}[] | undefined;
|
|
12
|
+
total_count: 0;
|
|
13
|
+
pages: {
|
|
14
|
+
type: "pages";
|
|
15
|
+
page: 1;
|
|
16
|
+
per_page: 10;
|
|
17
|
+
total_pages: 0;
|
|
13
18
|
};
|
|
14
|
-
}
|
|
15
|
-
updateCompany({ data, companyId, }: {
|
|
16
|
-
companyId: string;
|
|
17
|
-
data: Record<string, any>;
|
|
18
|
-
}): Promise<unknown>;
|
|
19
|
+
} | undefined>;
|
|
19
20
|
createUser({ data, userId, }: {
|
|
20
21
|
userId: string;
|
|
21
22
|
data: {
|
|
@@ -24,18 +25,35 @@ export declare class IntercomAPI {
|
|
|
24
25
|
custom_attributes: Record<string, any>;
|
|
25
26
|
};
|
|
26
27
|
}): Promise<unknown>;
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
updateUser({ data, contactId, }: {
|
|
29
|
+
contactId: string;
|
|
29
30
|
data: {
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
email?: string;
|
|
32
|
+
name?: string;
|
|
32
33
|
custom_attributes: Record<string, any>;
|
|
33
34
|
};
|
|
34
35
|
}): Promise<unknown>;
|
|
36
|
+
deleteUser(intercom_contact_id: string): Promise<{
|
|
37
|
+
id: "6657adf56abd0167d9419d1c";
|
|
38
|
+
external_id: "70";
|
|
39
|
+
type: "contact";
|
|
40
|
+
deleted: true;
|
|
41
|
+
} | undefined>;
|
|
35
42
|
createCompanyUser(data: {
|
|
36
43
|
intercom_contact_id: string;
|
|
37
44
|
intercom_company_id: string;
|
|
38
45
|
}): Promise<unknown>;
|
|
46
|
+
deleteCompanyUser({ intercom_company_id, intercom_contact_id, }: {
|
|
47
|
+
intercom_contact_id: string;
|
|
48
|
+
intercom_company_id: string;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
id: "6657adc96abd0167d9419ca7";
|
|
51
|
+
} | undefined>;
|
|
52
|
+
trackEvent(data: {
|
|
53
|
+
user_id: string;
|
|
54
|
+
event_name: string;
|
|
55
|
+
metadata: Record<string, any>;
|
|
56
|
+
}): Promise<unknown>;
|
|
39
57
|
getCompanyByTenantId(tenantId: string): Promise<{
|
|
40
58
|
type: "list";
|
|
41
59
|
data: [{
|
|
@@ -69,40 +87,22 @@ export declare class IntercomAPI {
|
|
|
69
87
|
};
|
|
70
88
|
total_count: 1;
|
|
71
89
|
} | undefined>;
|
|
72
|
-
|
|
73
|
-
|
|
90
|
+
createCompany({ data, tenantId, }: {
|
|
91
|
+
tenantId: string;
|
|
74
92
|
data: {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
pages: {
|
|
79
|
-
type: "pages";
|
|
80
|
-
page: 1;
|
|
81
|
-
per_page: 10;
|
|
82
|
-
total_pages: 0;
|
|
93
|
+
name: string;
|
|
94
|
+
remote_created_at: string;
|
|
95
|
+
custom_attributes: Record<string, any>;
|
|
83
96
|
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
deleted: true;
|
|
90
|
-
} | undefined>;
|
|
97
|
+
}): Promise<unknown>;
|
|
98
|
+
updateCompany({ data, companyId, }: {
|
|
99
|
+
companyId: string;
|
|
100
|
+
data: Record<string, any>;
|
|
101
|
+
}): Promise<unknown>;
|
|
91
102
|
deleteCompany(intercom_company_id: string): Promise<{
|
|
92
103
|
id: "6657adc96abd0167d9419ca7";
|
|
93
104
|
object: "company";
|
|
94
105
|
deleted: true;
|
|
95
106
|
} | undefined>;
|
|
96
|
-
deleteCompanyUser({ intercom_company_id, intercom_contact_id, }: {
|
|
97
|
-
intercom_contact_id: string;
|
|
98
|
-
intercom_company_id: string;
|
|
99
|
-
}): Promise<{
|
|
100
|
-
id: "6657adc96abd0167d9419ca7";
|
|
101
|
-
} | undefined>;
|
|
102
|
-
trackEvent(data: {
|
|
103
|
-
user_id: string;
|
|
104
|
-
event_name: string;
|
|
105
|
-
metadata: Record<string, any>;
|
|
106
|
-
}): Promise<unknown>;
|
|
107
107
|
}
|
|
108
|
-
export declare function useIntercom(token: string, log
|
|
108
|
+
export declare function useIntercom(token: string, log?: Log): IntercomAPI;
|
|
@@ -20,36 +20,50 @@ class IntercomAPI {
|
|
|
20
20
|
try {
|
|
21
21
|
const result = await fetch(`https://api.intercom.io${path}`, {
|
|
22
22
|
method: 'GET',
|
|
23
|
-
...options,
|
|
24
23
|
headers: this.headers,
|
|
24
|
+
...options,
|
|
25
25
|
});
|
|
26
26
|
if (!result.ok) {
|
|
27
|
-
this.log
|
|
27
|
+
this.log?.info('Failed to fetch from Intercom', {
|
|
28
28
|
result: {
|
|
29
29
|
status: result.status,
|
|
30
30
|
statusText: result.statusText,
|
|
31
31
|
body: await result.text(),
|
|
32
32
|
},
|
|
33
33
|
});
|
|
34
|
-
|
|
34
|
+
if (result.status === 404)
|
|
35
|
+
return undefined;
|
|
36
|
+
if (result.status === 429) {
|
|
37
|
+
console.log('Intercom rate limit exceeded, waiting for 1 minute');
|
|
38
|
+
// X-RateLimit-Reset: 1487332520 => timestamp from header response when resetting
|
|
39
|
+
const reset = Number(result.headers.get('X-RateLimit-Reset'));
|
|
40
|
+
if (reset) {
|
|
41
|
+
const now = Math.floor(Date.now() / 1000);
|
|
42
|
+
const wait = reset - now + 1;
|
|
43
|
+
console.log(`Waiting for ${wait} seconds`);
|
|
44
|
+
await new Promise((resolve) => setTimeout(resolve, wait * 1000));
|
|
45
|
+
return await this.fetch(path, options);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
35
48
|
}
|
|
36
49
|
return result.status === 202 ? {} : (await result.json());
|
|
37
50
|
}
|
|
38
51
|
catch (error) {
|
|
39
|
-
this.log
|
|
52
|
+
this.log?.error(error);
|
|
40
53
|
return undefined;
|
|
41
54
|
}
|
|
42
55
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
// User
|
|
57
|
+
async getUserByUserId(userId) {
|
|
58
|
+
return await this.fetch('/contacts/search', {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
data: {
|
|
61
|
+
query: {
|
|
62
|
+
field: 'external_id',
|
|
63
|
+
operator: '=',
|
|
64
|
+
value: userId,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
53
67
|
});
|
|
54
68
|
}
|
|
55
69
|
async createUser({ data, userId, }) {
|
|
@@ -58,13 +72,15 @@ class IntercomAPI {
|
|
|
58
72
|
data: { ...data, external_id: userId },
|
|
59
73
|
});
|
|
60
74
|
}
|
|
61
|
-
async
|
|
62
|
-
return await this.fetch(
|
|
63
|
-
method: '
|
|
64
|
-
data
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
75
|
+
async updateUser({ data, contactId, }) {
|
|
76
|
+
return await this.fetch(`/contacts/${contactId}`, {
|
|
77
|
+
method: 'PUT',
|
|
78
|
+
data,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async deleteUser(intercom_contact_id) {
|
|
82
|
+
return await this.fetch(`/contacts/${intercom_contact_id}`, {
|
|
83
|
+
method: 'DELETE',
|
|
68
84
|
});
|
|
69
85
|
}
|
|
70
86
|
async createCompanyUser(data) {
|
|
@@ -75,26 +91,39 @@ class IntercomAPI {
|
|
|
75
91
|
},
|
|
76
92
|
});
|
|
77
93
|
}
|
|
94
|
+
async deleteCompanyUser({ intercom_company_id, intercom_contact_id, }) {
|
|
95
|
+
return await this.fetch(`/contacts/${intercom_contact_id}/companies/${intercom_company_id}`, {
|
|
96
|
+
method: 'DELETE',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async trackEvent(data) {
|
|
100
|
+
return await this.fetch('/events', {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
data: {
|
|
103
|
+
created_at: Math.floor(new Date().getTime() / 1000), // to seconds
|
|
104
|
+
...data,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Company
|
|
78
109
|
async getCompanyByTenantId(tenantId) {
|
|
79
110
|
return await this.fetch(`/companies?company_id=${tenantId}`, {
|
|
80
111
|
method: 'GET',
|
|
81
112
|
});
|
|
82
113
|
}
|
|
83
|
-
async
|
|
84
|
-
return await this.fetch('/
|
|
114
|
+
async createCompany({ data, tenantId, }) {
|
|
115
|
+
return await this.fetch('/companies', {
|
|
85
116
|
method: 'POST',
|
|
86
117
|
data: {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
operator: '=',
|
|
90
|
-
value: userId,
|
|
91
|
-
},
|
|
118
|
+
...data,
|
|
119
|
+
company_id: tenantId,
|
|
92
120
|
},
|
|
93
121
|
});
|
|
94
122
|
}
|
|
95
|
-
async
|
|
96
|
-
return await this.fetch(`/
|
|
97
|
-
method: '
|
|
123
|
+
async updateCompany({ data, companyId, }) {
|
|
124
|
+
return await this.fetch(`/companies/${companyId}`, {
|
|
125
|
+
method: 'PUT',
|
|
126
|
+
data,
|
|
98
127
|
});
|
|
99
128
|
}
|
|
100
129
|
async deleteCompany(intercom_company_id) {
|
|
@@ -102,20 +131,6 @@ class IntercomAPI {
|
|
|
102
131
|
method: 'DELETE',
|
|
103
132
|
});
|
|
104
133
|
}
|
|
105
|
-
async deleteCompanyUser({ intercom_company_id, intercom_contact_id, }) {
|
|
106
|
-
return await this.fetch(`/contacts/${intercom_contact_id}/companies/${intercom_company_id}`, {
|
|
107
|
-
method: 'DELETE',
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
async trackEvent(data) {
|
|
111
|
-
return await this.fetch('/events', {
|
|
112
|
-
method: 'POST',
|
|
113
|
-
data: {
|
|
114
|
-
created_at: Math.floor(new Date().getTime() / 1000), // to seconds
|
|
115
|
-
...data,
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
134
|
}
|
|
120
135
|
exports.IntercomAPI = IntercomAPI;
|
|
121
136
|
function useIntercom(token, log) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercom.js","sourceRoot":"src/","sources":["tracking/intercom.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"intercom.js","sourceRoot":"src/","sources":["tracking/intercom.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,10 +30,6 @@ export declare const useTracking: ({ dataset, env, name }: TrackingProps, isDev?
|
|
|
30
30
|
alias: string;
|
|
31
31
|
}) => void;
|
|
32
32
|
shutdown: () => Promise<void>;
|
|
33
|
-
|
|
34
|
-
tenantId: string;
|
|
35
|
-
customerId: string;
|
|
36
|
-
data: Parameters<IntercomAPI["updateCompany"]>[0]["data"];
|
|
37
|
-
}) => Promise<void>;
|
|
33
|
+
intercom: IntercomAPI;
|
|
38
34
|
log: import("../log").WorkerLog;
|
|
39
35
|
};
|
|
@@ -3,13 +3,14 @@ import { PostHog } from 'posthog-node';
|
|
|
3
3
|
import { useLog } from '../log';
|
|
4
4
|
import { useIntercom } from './intercom';
|
|
5
5
|
export const useTracking = ({ dataset, env, name }, isDev) => {
|
|
6
|
-
const
|
|
7
|
-
const intercom = useIntercom(env.INTERCOM_TOKEN,
|
|
6
|
+
const axiom = useLog({ name, dataset, env });
|
|
7
|
+
const intercom = useIntercom(env.INTERCOM_TOKEN, axiom);
|
|
8
8
|
const juneso = new Analytics(env.JUNESO_ANALYTICS_WRITE_KEY);
|
|
9
9
|
const posthog = new PostHog(env.POSTHOG_API_KEY, {
|
|
10
10
|
host: 'https://app.posthog.com',
|
|
11
11
|
});
|
|
12
12
|
return {
|
|
13
|
+
// General
|
|
13
14
|
track: async ({ userId, event, tenantId, properties, }) => {
|
|
14
15
|
if (isDev)
|
|
15
16
|
return;
|
|
@@ -61,28 +62,15 @@ export const useTracking = ({ dataset, env, name }, isDev) => {
|
|
|
61
62
|
traits: properties,
|
|
62
63
|
});
|
|
63
64
|
},
|
|
65
|
+
// Posthog specific
|
|
64
66
|
alias: ({ distinctId, alias }) => posthog.alias({ distinctId, alias }),
|
|
65
67
|
shutdown: async () => {
|
|
66
68
|
await posthog.shutdown();
|
|
67
69
|
await juneso.closeAndFlush();
|
|
68
70
|
},
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (!intercomCompany)
|
|
73
|
-
return;
|
|
74
|
-
await intercom.updateCompany({
|
|
75
|
-
companyId: intercomCompany.id,
|
|
76
|
-
data: {
|
|
77
|
-
...data,
|
|
78
|
-
custom_attributes: {
|
|
79
|
-
...data.custom_attributes,
|
|
80
|
-
billingPortalUrl: `https://billing.vrplatform.app/portal/${customerId}`,
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
},
|
|
85
|
-
log,
|
|
71
|
+
// export intercom and axiom
|
|
72
|
+
intercom,
|
|
73
|
+
log: axiom,
|
|
86
74
|
};
|
|
87
75
|
};
|
|
88
76
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["tracking/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAc3D,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAiB,EACrC,KAAe,EACf,EAAE;IACF,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["tracking/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAc3D,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAiB,EACrC,KAAe,EACf,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE;QAC/C,IAAI,EAAE,yBAAyB;KAChC,CAAC,CAAC;IAEH,OAAO;QACL,UAAU;QACV,KAAK,EAAE,KAAK,EAAE,EACZ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,UAAU,GAMX,EAAE,EAAE;YACH,IAAI,KAAK;gBAAE,OAAO;YAElB,OAAO,CAAC,OAAO,CAAC;gBACd,UAAU,EAAE,MAAM;gBAClB,KAAK;gBACL,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ;iBACjB;gBACD,UAAU;aACX,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC;gBACX,MAAM;gBACN,KAAK;gBACL,UAAU;gBACV,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;aAC/B,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,UAAU,CAAC;oBACxB,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,UAAU;iBACrB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,QAAQ,EAAE,CAAC,EACT,UAAU,EACV,MAAM,GAC8C,EAAE,EAAE;YACxD,OAAO,CAAC,QAAQ,CAAC;gBACf,UAAU,EAAE,MAAM;gBAClB,UAAU;aACX,CAAC,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC;gBACd,MAAM;gBACN,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,EAAE,CAAC,EACN,UAAU,EACV,QAAQ,EACR,MAAM,GAKP,EAAE,EAAE;YACH,OAAO,CAAC,aAAa,CAAC;gBACpB,QAAQ,EAAE,QAAQ;gBAClB,SAAS,EAAE,QAAQ;gBACnB,UAAU;gBACV,UAAU,EAAE,MAAM;aACnB,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC;gBACX,MAAM;gBACN,OAAO,EAAE,QAAQ;gBACjB,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;QACL,CAAC;QACD,mBAAmB;QACnB,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAyC,EAAE,EAAE,CACtE,OAAO,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACtC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAC/B,CAAC;QACD,4BAA4B;QAC5B,QAAQ;QACR,GAAG,EAAE,KAAK;KACX,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import type { Log } from '../log';
|
|
2
2
|
export declare class IntercomAPI {
|
|
3
|
-
constructor(token: string, log
|
|
3
|
+
constructor(token: string, log?: Log);
|
|
4
4
|
private headers;
|
|
5
|
-
private log
|
|
5
|
+
private log?;
|
|
6
6
|
private fetch;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
getUserByUserId(userId: string): Promise<{
|
|
8
|
+
type: "list";
|
|
9
9
|
data: {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
id: string;
|
|
11
|
+
}[] | undefined;
|
|
12
|
+
total_count: 0;
|
|
13
|
+
pages: {
|
|
14
|
+
type: "pages";
|
|
15
|
+
page: 1;
|
|
16
|
+
per_page: 10;
|
|
17
|
+
total_pages: 0;
|
|
13
18
|
};
|
|
14
|
-
}
|
|
15
|
-
updateCompany({ data, companyId, }: {
|
|
16
|
-
companyId: string;
|
|
17
|
-
data: Record<string, any>;
|
|
18
|
-
}): Promise<unknown>;
|
|
19
|
+
} | undefined>;
|
|
19
20
|
createUser({ data, userId, }: {
|
|
20
21
|
userId: string;
|
|
21
22
|
data: {
|
|
@@ -24,18 +25,35 @@ export declare class IntercomAPI {
|
|
|
24
25
|
custom_attributes: Record<string, any>;
|
|
25
26
|
};
|
|
26
27
|
}): Promise<unknown>;
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
updateUser({ data, contactId, }: {
|
|
29
|
+
contactId: string;
|
|
29
30
|
data: {
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
email?: string;
|
|
32
|
+
name?: string;
|
|
32
33
|
custom_attributes: Record<string, any>;
|
|
33
34
|
};
|
|
34
35
|
}): Promise<unknown>;
|
|
36
|
+
deleteUser(intercom_contact_id: string): Promise<{
|
|
37
|
+
id: "6657adf56abd0167d9419d1c";
|
|
38
|
+
external_id: "70";
|
|
39
|
+
type: "contact";
|
|
40
|
+
deleted: true;
|
|
41
|
+
} | undefined>;
|
|
35
42
|
createCompanyUser(data: {
|
|
36
43
|
intercom_contact_id: string;
|
|
37
44
|
intercom_company_id: string;
|
|
38
45
|
}): Promise<unknown>;
|
|
46
|
+
deleteCompanyUser({ intercom_company_id, intercom_contact_id, }: {
|
|
47
|
+
intercom_contact_id: string;
|
|
48
|
+
intercom_company_id: string;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
id: "6657adc96abd0167d9419ca7";
|
|
51
|
+
} | undefined>;
|
|
52
|
+
trackEvent(data: {
|
|
53
|
+
user_id: string;
|
|
54
|
+
event_name: string;
|
|
55
|
+
metadata: Record<string, any>;
|
|
56
|
+
}): Promise<unknown>;
|
|
39
57
|
getCompanyByTenantId(tenantId: string): Promise<{
|
|
40
58
|
type: "list";
|
|
41
59
|
data: [{
|
|
@@ -69,40 +87,22 @@ export declare class IntercomAPI {
|
|
|
69
87
|
};
|
|
70
88
|
total_count: 1;
|
|
71
89
|
} | undefined>;
|
|
72
|
-
|
|
73
|
-
|
|
90
|
+
createCompany({ data, tenantId, }: {
|
|
91
|
+
tenantId: string;
|
|
74
92
|
data: {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
pages: {
|
|
79
|
-
type: "pages";
|
|
80
|
-
page: 1;
|
|
81
|
-
per_page: 10;
|
|
82
|
-
total_pages: 0;
|
|
93
|
+
name: string;
|
|
94
|
+
remote_created_at: string;
|
|
95
|
+
custom_attributes: Record<string, any>;
|
|
83
96
|
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
deleted: true;
|
|
90
|
-
} | undefined>;
|
|
97
|
+
}): Promise<unknown>;
|
|
98
|
+
updateCompany({ data, companyId, }: {
|
|
99
|
+
companyId: string;
|
|
100
|
+
data: Record<string, any>;
|
|
101
|
+
}): Promise<unknown>;
|
|
91
102
|
deleteCompany(intercom_company_id: string): Promise<{
|
|
92
103
|
id: "6657adc96abd0167d9419ca7";
|
|
93
104
|
object: "company";
|
|
94
105
|
deleted: true;
|
|
95
106
|
} | undefined>;
|
|
96
|
-
deleteCompanyUser({ intercom_company_id, intercom_contact_id, }: {
|
|
97
|
-
intercom_contact_id: string;
|
|
98
|
-
intercom_company_id: string;
|
|
99
|
-
}): Promise<{
|
|
100
|
-
id: "6657adc96abd0167d9419ca7";
|
|
101
|
-
} | undefined>;
|
|
102
|
-
trackEvent(data: {
|
|
103
|
-
user_id: string;
|
|
104
|
-
event_name: string;
|
|
105
|
-
metadata: Record<string, any>;
|
|
106
|
-
}): Promise<unknown>;
|
|
107
107
|
}
|
|
108
|
-
export declare function useIntercom(token: string, log
|
|
108
|
+
export declare function useIntercom(token: string, log?: Log): IntercomAPI;
|
|
@@ -18,36 +18,50 @@ export class IntercomAPI {
|
|
|
18
18
|
try {
|
|
19
19
|
const result = await fetch(`https://api.intercom.io${path}`, {
|
|
20
20
|
method: 'GET',
|
|
21
|
-
...options,
|
|
22
21
|
headers: this.headers,
|
|
22
|
+
...options,
|
|
23
23
|
});
|
|
24
24
|
if (!result.ok) {
|
|
25
|
-
this.log
|
|
25
|
+
this.log?.info('Failed to fetch from Intercom', {
|
|
26
26
|
result: {
|
|
27
27
|
status: result.status,
|
|
28
28
|
statusText: result.statusText,
|
|
29
29
|
body: await result.text(),
|
|
30
30
|
},
|
|
31
31
|
});
|
|
32
|
-
|
|
32
|
+
if (result.status === 404)
|
|
33
|
+
return undefined;
|
|
34
|
+
if (result.status === 429) {
|
|
35
|
+
console.log('Intercom rate limit exceeded, waiting for 1 minute');
|
|
36
|
+
// X-RateLimit-Reset: 1487332520 => timestamp from header response when resetting
|
|
37
|
+
const reset = Number(result.headers.get('X-RateLimit-Reset'));
|
|
38
|
+
if (reset) {
|
|
39
|
+
const now = Math.floor(Date.now() / 1000);
|
|
40
|
+
const wait = reset - now + 1;
|
|
41
|
+
console.log(`Waiting for ${wait} seconds`);
|
|
42
|
+
await new Promise((resolve) => setTimeout(resolve, wait * 1000));
|
|
43
|
+
return await this.fetch(path, options);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
33
46
|
}
|
|
34
47
|
return result.status === 202 ? {} : (await result.json());
|
|
35
48
|
}
|
|
36
49
|
catch (error) {
|
|
37
|
-
this.log
|
|
50
|
+
this.log?.error(error);
|
|
38
51
|
return undefined;
|
|
39
52
|
}
|
|
40
53
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
// User
|
|
55
|
+
async getUserByUserId(userId) {
|
|
56
|
+
return await this.fetch('/contacts/search', {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
data: {
|
|
59
|
+
query: {
|
|
60
|
+
field: 'external_id',
|
|
61
|
+
operator: '=',
|
|
62
|
+
value: userId,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
51
65
|
});
|
|
52
66
|
}
|
|
53
67
|
async createUser({ data, userId, }) {
|
|
@@ -56,13 +70,15 @@ export class IntercomAPI {
|
|
|
56
70
|
data: { ...data, external_id: userId },
|
|
57
71
|
});
|
|
58
72
|
}
|
|
59
|
-
async
|
|
60
|
-
return await this.fetch(
|
|
61
|
-
method: '
|
|
62
|
-
data
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
73
|
+
async updateUser({ data, contactId, }) {
|
|
74
|
+
return await this.fetch(`/contacts/${contactId}`, {
|
|
75
|
+
method: 'PUT',
|
|
76
|
+
data,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async deleteUser(intercom_contact_id) {
|
|
80
|
+
return await this.fetch(`/contacts/${intercom_contact_id}`, {
|
|
81
|
+
method: 'DELETE',
|
|
66
82
|
});
|
|
67
83
|
}
|
|
68
84
|
async createCompanyUser(data) {
|
|
@@ -73,26 +89,39 @@ export class IntercomAPI {
|
|
|
73
89
|
},
|
|
74
90
|
});
|
|
75
91
|
}
|
|
92
|
+
async deleteCompanyUser({ intercom_company_id, intercom_contact_id, }) {
|
|
93
|
+
return await this.fetch(`/contacts/${intercom_contact_id}/companies/${intercom_company_id}`, {
|
|
94
|
+
method: 'DELETE',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async trackEvent(data) {
|
|
98
|
+
return await this.fetch('/events', {
|
|
99
|
+
method: 'POST',
|
|
100
|
+
data: {
|
|
101
|
+
created_at: Math.floor(new Date().getTime() / 1000), // to seconds
|
|
102
|
+
...data,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// Company
|
|
76
107
|
async getCompanyByTenantId(tenantId) {
|
|
77
108
|
return await this.fetch(`/companies?company_id=${tenantId}`, {
|
|
78
109
|
method: 'GET',
|
|
79
110
|
});
|
|
80
111
|
}
|
|
81
|
-
async
|
|
82
|
-
return await this.fetch('/
|
|
112
|
+
async createCompany({ data, tenantId, }) {
|
|
113
|
+
return await this.fetch('/companies', {
|
|
83
114
|
method: 'POST',
|
|
84
115
|
data: {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
operator: '=',
|
|
88
|
-
value: userId,
|
|
89
|
-
},
|
|
116
|
+
...data,
|
|
117
|
+
company_id: tenantId,
|
|
90
118
|
},
|
|
91
119
|
});
|
|
92
120
|
}
|
|
93
|
-
async
|
|
94
|
-
return await this.fetch(`/
|
|
95
|
-
method: '
|
|
121
|
+
async updateCompany({ data, companyId, }) {
|
|
122
|
+
return await this.fetch(`/companies/${companyId}`, {
|
|
123
|
+
method: 'PUT',
|
|
124
|
+
data,
|
|
96
125
|
});
|
|
97
126
|
}
|
|
98
127
|
async deleteCompany(intercom_company_id) {
|
|
@@ -100,20 +129,6 @@ export class IntercomAPI {
|
|
|
100
129
|
method: 'DELETE',
|
|
101
130
|
});
|
|
102
131
|
}
|
|
103
|
-
async deleteCompanyUser({ intercom_company_id, intercom_contact_id, }) {
|
|
104
|
-
return await this.fetch(`/contacts/${intercom_contact_id}/companies/${intercom_company_id}`, {
|
|
105
|
-
method: 'DELETE',
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
async trackEvent(data) {
|
|
109
|
-
return await this.fetch('/events', {
|
|
110
|
-
method: 'POST',
|
|
111
|
-
data: {
|
|
112
|
-
created_at: Math.floor(new Date().getTime() / 1000), // to seconds
|
|
113
|
-
...data,
|
|
114
|
-
},
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
132
|
}
|
|
118
133
|
export function useIntercom(token, log) {
|
|
119
134
|
return new IntercomAPI(token, log);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercom.js","sourceRoot":"src/","sources":["tracking/intercom.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IACtB,YAAY,KAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"intercom.js","sourceRoot":"src/","sources":["tracking/intercom.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IACtB,YAAY,KAAa,EAAE,GAAS;QAClC,IAAI,CAAC,OAAO,GAAG;YACb,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,kBAAkB,EAAE,MAAM;YAC1B,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC,CAAC;QAEF,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAEO,OAAO,CAAyB;IAChC,GAAG,CAAO;IAEV,KAAK,CAAC,KAAK,CACjB,IAAY,EACZ,OAAsC;QAEtC,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,0BAA0B,IAAI,EAAE,EAAE;gBAC3D,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG,OAAO;aACX,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,+BAA+B,EAAE;oBAC9C,MAAM,EAAE;wBACN,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,UAAU,EAAE,MAAM,CAAC,UAAU;wBAC7B,IAAI,EAAE,MAAM,MAAM,CAAC,IAAI,EAAE;qBAC1B;iBACF,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,SAAS,CAAC;gBAE5C,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;oBAClE,iFAAiF;oBAEjF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;oBAE9D,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;wBAC1C,MAAM,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;wBAC7B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,UAAU,CAAC,CAAC;wBAC3C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;wBAEjE,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAE,EAAQ,CAAC,CAAC,CAAE,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAO,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO;IACP,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,OAAO,MAAM,IAAI,CAAC,KAAK,CAUpB,kBAAkB,EAAE;YACrB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,KAAK,EAAE,aAAa;oBACpB,QAAQ,EAAE,GAAG;oBACb,KAAK,EAAE,MAAM;iBACd;aACF;SACF,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,EACf,IAAI,EACJ,MAAM,GAQP;QACC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;SACvC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,EACf,IAAI,EACJ,SAAS,GAQV;QACC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,SAAS,EAAE,EAAE;YAChD,MAAM,EAAE,KAAK;YACb,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,mBAA2B;QAC1C,OAAO,MAAM,IAAI,CAAC,KAAK,CAKpB,aAAa,mBAAmB,EAAE,EAAE;YACrC,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,IAGvB;QACC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,mBAAmB,YAAY,EAAE;YACzE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,mBAAmB;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,EACtB,mBAAmB,EACnB,mBAAmB,GAIpB;QACC,OAAO,MAAM,IAAI,CAAC,KAAK,CAEpB,aAAa,mBAAmB,cAAc,mBAAmB,EAAE,EAAE;YACtE,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,IAIhB;QACC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE,aAAa;gBAClE,GAAG,IAAI;aACR;SACF,CAAC,CAAC;IACL,CAAC;IAED,UAAU;IACV,KAAK,CAAC,oBAAoB,CAAC,QAAgB;QACzC,OAAO,MAAM,IAAI,CAAC,KAAK,CAoCpB,yBAAyB,QAAQ,EAAE,EAAE;YACtC,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,EAClB,IAAI,EACJ,QAAQ,GAQT;QACC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YACpC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,GAAG,IAAI;gBACP,UAAU,EAAE,QAAQ;aACrB;SACF,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,EAClB,IAAI,EACJ,SAAS,GAIV;QACC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,SAAS,EAAE,EAAE;YACjD,MAAM,EAAE,KAAK;YACb,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,mBAA2B;QAC7C,OAAO,MAAM,IAAI,CAAC,KAAK,CAIpB,cAAc,mBAAmB,EAAE,EAAE;YACtC,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,GAAS;IAClD,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC"}
|
package/package.json
CHANGED
package/src/tracking/index.ts
CHANGED
|
@@ -19,14 +19,15 @@ export const useTracking = (
|
|
|
19
19
|
{ dataset, env, name }: TrackingProps,
|
|
20
20
|
isDev?: boolean
|
|
21
21
|
) => {
|
|
22
|
-
const
|
|
23
|
-
const intercom = useIntercom(env.INTERCOM_TOKEN,
|
|
22
|
+
const axiom = useLog({ name, dataset, env });
|
|
23
|
+
const intercom = useIntercom(env.INTERCOM_TOKEN, axiom);
|
|
24
24
|
const juneso = new Analytics(env.JUNESO_ANALYTICS_WRITE_KEY);
|
|
25
25
|
const posthog = new PostHog(env.POSTHOG_API_KEY, {
|
|
26
26
|
host: 'https://app.posthog.com',
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
return {
|
|
30
|
+
// General
|
|
30
31
|
track: async ({
|
|
31
32
|
userId,
|
|
32
33
|
event,
|
|
@@ -99,37 +100,15 @@ export const useTracking = (
|
|
|
99
100
|
traits: properties,
|
|
100
101
|
});
|
|
101
102
|
},
|
|
103
|
+
// Posthog specific
|
|
102
104
|
alias: ({ distinctId, alias }: { distinctId: string; alias: string }) =>
|
|
103
105
|
posthog.alias({ distinctId, alias }),
|
|
104
106
|
shutdown: async () => {
|
|
105
107
|
await posthog.shutdown();
|
|
106
108
|
await juneso.closeAndFlush();
|
|
107
109
|
},
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
data,
|
|
112
|
-
}: {
|
|
113
|
-
tenantId: string;
|
|
114
|
-
customerId: string;
|
|
115
|
-
data: Parameters<IntercomAPI['updateCompany']>[0]['data'];
|
|
116
|
-
}) => {
|
|
117
|
-
const intercomCompanies = await intercom.getCompanyByTenantId(tenantId);
|
|
118
|
-
const intercomCompany = intercomCompanies?.data?.[0];
|
|
119
|
-
|
|
120
|
-
if (!intercomCompany) return;
|
|
121
|
-
|
|
122
|
-
await intercom.updateCompany({
|
|
123
|
-
companyId: intercomCompany.id,
|
|
124
|
-
data: {
|
|
125
|
-
...data,
|
|
126
|
-
custom_attributes: {
|
|
127
|
-
...data.custom_attributes,
|
|
128
|
-
billingPortalUrl: `https://billing.vrplatform.app/portal/${customerId}`,
|
|
129
|
-
},
|
|
130
|
-
},
|
|
131
|
-
});
|
|
132
|
-
},
|
|
133
|
-
log,
|
|
110
|
+
// export intercom and axiom
|
|
111
|
+
intercom,
|
|
112
|
+
log: axiom,
|
|
134
113
|
};
|
|
135
114
|
};
|
package/src/tracking/intercom.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Log } from '../log';
|
|
2
2
|
|
|
3
3
|
export class IntercomAPI {
|
|
4
|
-
constructor(token: string, log
|
|
4
|
+
constructor(token: string, log?: Log) {
|
|
5
5
|
this.headers = {
|
|
6
6
|
'Content-Type': 'application/json',
|
|
7
7
|
Accept: 'application/json',
|
|
@@ -13,7 +13,7 @@ export class IntercomAPI {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
private headers: Record<string, string>;
|
|
16
|
-
private log
|
|
16
|
+
private log?: Log;
|
|
17
17
|
|
|
18
18
|
private async fetch<T>(
|
|
19
19
|
path: string,
|
|
@@ -27,57 +27,67 @@ export class IntercomAPI {
|
|
|
27
27
|
try {
|
|
28
28
|
const result = await fetch(`https://api.intercom.io${path}`, {
|
|
29
29
|
method: 'GET',
|
|
30
|
-
...options,
|
|
31
30
|
headers: this.headers,
|
|
31
|
+
...options,
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
if (!result.ok) {
|
|
35
|
-
this.log
|
|
35
|
+
this.log?.info('Failed to fetch from Intercom', {
|
|
36
36
|
result: {
|
|
37
37
|
status: result.status,
|
|
38
38
|
statusText: result.statusText,
|
|
39
39
|
body: await result.text(),
|
|
40
40
|
},
|
|
41
41
|
});
|
|
42
|
-
|
|
42
|
+
|
|
43
|
+
if (result.status === 404) return undefined;
|
|
44
|
+
|
|
45
|
+
if (result.status === 429) {
|
|
46
|
+
console.log('Intercom rate limit exceeded, waiting for 1 minute');
|
|
47
|
+
// X-RateLimit-Reset: 1487332520 => timestamp from header response when resetting
|
|
48
|
+
|
|
49
|
+
const reset = Number(result.headers.get('X-RateLimit-Reset'));
|
|
50
|
+
|
|
51
|
+
if (reset) {
|
|
52
|
+
const now = Math.floor(Date.now() / 1000);
|
|
53
|
+
const wait = reset - now + 1;
|
|
54
|
+
console.log(`Waiting for ${wait} seconds`);
|
|
55
|
+
await new Promise((resolve) => setTimeout(resolve, wait * 1000));
|
|
56
|
+
|
|
57
|
+
return await this.fetch(path, options);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
43
60
|
}
|
|
44
61
|
return result.status === 202 ? ({} as T) : ((await result.json()) as T);
|
|
45
62
|
} catch (error: any) {
|
|
46
|
-
this.log
|
|
63
|
+
this.log?.error(error);
|
|
47
64
|
return undefined;
|
|
48
65
|
}
|
|
49
66
|
}
|
|
50
67
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
companyId: string;
|
|
73
|
-
data: Record<string, any>;
|
|
74
|
-
}) {
|
|
75
|
-
return await this.fetch(`/companies/${companyId}`, {
|
|
76
|
-
method: 'PUT',
|
|
77
|
-
data,
|
|
68
|
+
// User
|
|
69
|
+
async getUserByUserId(userId: string) {
|
|
70
|
+
return await this.fetch<{
|
|
71
|
+
type: 'list';
|
|
72
|
+
data: { id: string }[] | undefined;
|
|
73
|
+
total_count: 0;
|
|
74
|
+
pages: {
|
|
75
|
+
type: 'pages';
|
|
76
|
+
page: 1;
|
|
77
|
+
per_page: 10;
|
|
78
|
+
total_pages: 0;
|
|
79
|
+
};
|
|
80
|
+
}>('/contacts/search', {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
data: {
|
|
83
|
+
query: {
|
|
84
|
+
field: 'external_id',
|
|
85
|
+
operator: '=',
|
|
86
|
+
value: userId,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
78
89
|
});
|
|
79
90
|
}
|
|
80
|
-
|
|
81
91
|
async createUser({
|
|
82
92
|
data,
|
|
83
93
|
userId,
|
|
@@ -94,27 +104,32 @@ export class IntercomAPI {
|
|
|
94
104
|
data: { ...data, external_id: userId },
|
|
95
105
|
});
|
|
96
106
|
}
|
|
97
|
-
|
|
98
|
-
async createCompany({
|
|
107
|
+
async updateUser({
|
|
99
108
|
data,
|
|
100
|
-
|
|
109
|
+
contactId,
|
|
101
110
|
}: {
|
|
102
|
-
|
|
111
|
+
contactId: string;
|
|
103
112
|
data: {
|
|
104
|
-
|
|
105
|
-
|
|
113
|
+
email?: string;
|
|
114
|
+
name?: string;
|
|
106
115
|
custom_attributes: Record<string, any>;
|
|
107
116
|
};
|
|
108
117
|
}) {
|
|
109
|
-
return await this.fetch(
|
|
110
|
-
method: '
|
|
111
|
-
data
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
118
|
+
return await this.fetch(`/contacts/${contactId}`, {
|
|
119
|
+
method: 'PUT',
|
|
120
|
+
data,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async deleteUser(intercom_contact_id: string) {
|
|
124
|
+
return await this.fetch<{
|
|
125
|
+
id: '6657adf56abd0167d9419d1c';
|
|
126
|
+
external_id: '70';
|
|
127
|
+
type: 'contact';
|
|
128
|
+
deleted: true;
|
|
129
|
+
}>(`/contacts/${intercom_contact_id}`, {
|
|
130
|
+
method: 'DELETE',
|
|
115
131
|
});
|
|
116
132
|
}
|
|
117
|
-
|
|
118
133
|
async createCompanyUser(data: {
|
|
119
134
|
intercom_contact_id: string;
|
|
120
135
|
intercom_company_id: string;
|
|
@@ -126,7 +141,34 @@ export class IntercomAPI {
|
|
|
126
141
|
},
|
|
127
142
|
});
|
|
128
143
|
}
|
|
144
|
+
async deleteCompanyUser({
|
|
145
|
+
intercom_company_id,
|
|
146
|
+
intercom_contact_id,
|
|
147
|
+
}: {
|
|
148
|
+
intercom_contact_id: string;
|
|
149
|
+
intercom_company_id: string;
|
|
150
|
+
}) {
|
|
151
|
+
return await this.fetch<{
|
|
152
|
+
id: '6657adc96abd0167d9419ca7';
|
|
153
|
+
}>(`/contacts/${intercom_contact_id}/companies/${intercom_company_id}`, {
|
|
154
|
+
method: 'DELETE',
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async trackEvent(data: {
|
|
158
|
+
user_id: string;
|
|
159
|
+
event_name: string;
|
|
160
|
+
metadata: Record<string, any>;
|
|
161
|
+
}) {
|
|
162
|
+
return await this.fetch('/events', {
|
|
163
|
+
method: 'POST',
|
|
164
|
+
data: {
|
|
165
|
+
created_at: Math.floor(new Date().getTime() / 1000), // to seconds
|
|
166
|
+
...data,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
129
170
|
|
|
171
|
+
// Company
|
|
130
172
|
async getCompanyByTenantId(tenantId: string) {
|
|
131
173
|
return await this.fetch<{
|
|
132
174
|
type: 'list';
|
|
@@ -168,41 +210,37 @@ export class IntercomAPI {
|
|
|
168
210
|
method: 'GET',
|
|
169
211
|
});
|
|
170
212
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}>('/contacts/search', {
|
|
213
|
+
async createCompany({
|
|
214
|
+
data,
|
|
215
|
+
tenantId,
|
|
216
|
+
}: {
|
|
217
|
+
tenantId: string;
|
|
218
|
+
data: {
|
|
219
|
+
name: string;
|
|
220
|
+
remote_created_at: string;
|
|
221
|
+
custom_attributes: Record<string, any>;
|
|
222
|
+
};
|
|
223
|
+
}) {
|
|
224
|
+
return await this.fetch('/companies', {
|
|
184
225
|
method: 'POST',
|
|
185
226
|
data: {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
operator: '=',
|
|
189
|
-
value: userId,
|
|
190
|
-
},
|
|
227
|
+
...data,
|
|
228
|
+
company_id: tenantId,
|
|
191
229
|
},
|
|
192
230
|
});
|
|
193
231
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
method: '
|
|
232
|
+
async updateCompany({
|
|
233
|
+
data,
|
|
234
|
+
companyId,
|
|
235
|
+
}: {
|
|
236
|
+
companyId: string;
|
|
237
|
+
data: Record<string, any>;
|
|
238
|
+
}) {
|
|
239
|
+
return await this.fetch(`/companies/${companyId}`, {
|
|
240
|
+
method: 'PUT',
|
|
241
|
+
data,
|
|
203
242
|
});
|
|
204
243
|
}
|
|
205
|
-
|
|
206
244
|
async deleteCompany(intercom_company_id: string) {
|
|
207
245
|
return await this.fetch<{
|
|
208
246
|
id: '6657adc96abd0167d9419ca7';
|
|
@@ -212,35 +250,8 @@ export class IntercomAPI {
|
|
|
212
250
|
method: 'DELETE',
|
|
213
251
|
});
|
|
214
252
|
}
|
|
215
|
-
|
|
216
|
-
async deleteCompanyUser({
|
|
217
|
-
intercom_company_id,
|
|
218
|
-
intercom_contact_id,
|
|
219
|
-
}: {
|
|
220
|
-
intercom_contact_id: string;
|
|
221
|
-
intercom_company_id: string;
|
|
222
|
-
}) {
|
|
223
|
-
return await this.fetch<{
|
|
224
|
-
id: '6657adc96abd0167d9419ca7';
|
|
225
|
-
}>(`/contacts/${intercom_contact_id}/companies/${intercom_company_id}`, {
|
|
226
|
-
method: 'DELETE',
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
async trackEvent(data: {
|
|
231
|
-
user_id: string;
|
|
232
|
-
event_name: string;
|
|
233
|
-
metadata: Record<string, any>;
|
|
234
|
-
}) {
|
|
235
|
-
return await this.fetch('/events', {
|
|
236
|
-
method: 'POST',
|
|
237
|
-
data: {
|
|
238
|
-
created_at: Math.floor(new Date().getTime() / 1000), // to seconds
|
|
239
|
-
...data,
|
|
240
|
-
},
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
253
|
}
|
|
244
|
-
|
|
254
|
+
|
|
255
|
+
export function useIntercom(token: string, log?: Log) {
|
|
245
256
|
return new IntercomAPI(token, log);
|
|
246
257
|
}
|