-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathindex.ts
More file actions
103 lines (92 loc) · 2.82 KB
/
index.ts
File metadata and controls
103 lines (92 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import { ComponentSettings, Manager, MCEvent } from '@managed-components/types'
import UAParser from 'ua-parser-js'
export const eventHandler = async (
eventType: string,
manager: Manager,
event: MCEvent,
settings: ComponentSettings
) => {
const { payload, client } = event
let { hostname = 'api.segment.io' } = settings
if (payload.hostname) {
hostname = payload.hostname
}
const endpoint = `https://${hostname}/v1/${eventType}`
const { writeKey } = settings
// Prepare new payload
const uaParser = new UAParser(client.userAgent).getResult()
/* eslint-disable @typescript-eslint/no-explicit-any */
const segmentPayload: any = {
...(payload.event && { event: payload.event }),
callType: eventType,
anonymousId: payload.anonymousId,
userId: payload.userId,
context: {
ip: client.ip,
locale: client.language,
page: {
url: client.url.href,
title: client.title,
referrer: client.referer,
path: client.url.pathname,
search: client.url.search,
},
screen: {
width: client.screenWidth,
height: client.screenHeight,
},
os: { name: uaParser.os.name },
userAgent: uaParser.ua,
},
}
if (eventType === 'identify' || eventType === 'group') {
segmentPayload.traits = payload
} else {
segmentPayload.properties = payload
}
if (eventType === 'page') {
segmentPayload.properties = {
...segmentPayload.properties,
...segmentPayload.context.page,
}
}
// If we don't have anonymousId, try to get it from the cookie
if (!segmentPayload.anonymousId && client.get('ajs_anonymous_id')) {
segmentPayload.anonymousId = client.get('ajs_anonymous_id')
}
// If both userid and anonymousId are missing, generate one
if (!segmentPayload.userId && !segmentPayload.anonymousId) {
const anonId = crypto.randomUUID()
segmentPayload.anonymousId = anonId
client.set('ajs_anonymous_id', anonId, {
scope: 'infinite',
})
}
// Send the request
const headers = {
Authorization: 'Basic ' + btoa(writeKey),
'Content-Type': 'application/json',
}
manager.fetch(endpoint, {
headers,
method: 'POST',
body: JSON.stringify(segmentPayload),
})
}
export default async function (manager: Manager, settings: ComponentSettings) {
manager.addEventListener('pageview', event => {
eventHandler('page', manager, event, settings)
})
manager.addEventListener('track', event => {
eventHandler('track', manager, event, settings)
})
manager.addEventListener('identify', event => {
eventHandler('identify', manager, event, settings)
})
manager.addEventListener('alias', event => {
eventHandler('alias', manager, event, settings)
})
manager.addEventListener('group', event => {
eventHandler('group', manager, event, settings)
})
}