@linkforty/core 1.0.0 → 1.2.1
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/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -43
- package/dist/index.js.map +1 -1
- package/dist/lib/database.d.ts.map +1 -1
- package/dist/lib/database.js +160 -12
- package/dist/lib/database.js.map +1 -1
- package/dist/lib/event-emitter.d.ts +46 -0
- package/dist/lib/event-emitter.d.ts.map +1 -0
- package/dist/lib/event-emitter.js +24 -0
- package/dist/lib/event-emitter.js.map +1 -0
- package/dist/lib/fingerprint.d.ts +64 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +343 -0
- package/dist/lib/fingerprint.js.map +1 -0
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +12 -21
- package/dist/lib/utils.js.map +1 -1
- package/dist/lib/webhook.d.ts +18 -0
- package/dist/lib/webhook.d.ts.map +1 -0
- package/dist/lib/webhook.js +141 -0
- package/dist/lib/webhook.js.map +1 -0
- package/dist/routes/analytics.js +14 -17
- package/dist/routes/analytics.js.map +1 -1
- package/dist/routes/debug.d.ts +7 -0
- package/dist/routes/debug.d.ts.map +1 -0
- package/dist/routes/debug.js +318 -0
- package/dist/routes/debug.js.map +1 -0
- package/dist/routes/index.d.ts +5 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +8 -9
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/links.d.ts.map +1 -1
- package/dist/routes/links.js +53 -38
- package/dist/routes/links.js.map +1 -1
- package/dist/routes/preview.d.ts +3 -0
- package/dist/routes/preview.d.ts.map +1 -0
- package/dist/routes/preview.js +222 -0
- package/dist/routes/preview.js.map +1 -0
- package/dist/routes/qr.d.ts +6 -0
- package/dist/routes/qr.d.ts.map +1 -0
- package/dist/routes/qr.js +130 -0
- package/dist/routes/qr.js.map +1 -0
- package/dist/routes/redirect.d.ts.map +1 -1
- package/dist/routes/redirect.js +142 -22
- package/dist/routes/redirect.js.map +1 -1
- package/dist/routes/sdk.d.ts +7 -0
- package/dist/routes/sdk.d.ts.map +1 -0
- package/dist/routes/sdk.js +262 -0
- package/dist/routes/sdk.js.map +1 -0
- package/dist/routes/webhooks.d.ts +3 -0
- package/dist/routes/webhooks.d.ts.map +1 -0
- package/dist/routes/webhooks.js +176 -0
- package/dist/routes/webhooks.js.map +1 -0
- package/dist/scripts/migrate.js +2 -4
- package/dist/scripts/migrate.js.map +1 -1
- package/dist/types/index.d.ts +81 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -2
- package/package.json +11 -7
package/dist/routes/analytics.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.analyticsRoutes = analyticsRoutes;
|
|
4
|
-
const database_js_1 = require("../lib/database.js");
|
|
5
|
-
async function analyticsRoutes(fastify) {
|
|
1
|
+
import { db } from '../lib/database.js';
|
|
2
|
+
export async function analyticsRoutes(fastify) {
|
|
6
3
|
// Get overall analytics for a user
|
|
7
4
|
fastify.get('/api/analytics/overview', async (request) => {
|
|
8
5
|
const { userId, days = 30 } = request.query;
|
|
@@ -10,14 +7,14 @@ async function analyticsRoutes(fastify) {
|
|
|
10
7
|
throw new Error('userId query parameter is required');
|
|
11
8
|
}
|
|
12
9
|
// Get total and unique clicks
|
|
13
|
-
const clicksResult = await
|
|
10
|
+
const clicksResult = await db.query(`SELECT
|
|
14
11
|
COUNT(*) as total_clicks,
|
|
15
12
|
COUNT(DISTINCT ip_address) as unique_clicks
|
|
16
13
|
FROM click_events ce
|
|
17
14
|
JOIN links l ON ce.link_id = l.id
|
|
18
15
|
WHERE l.user_id = $1 AND ce.clicked_at >= NOW() - INTERVAL '${days} days'`, [userId]);
|
|
19
16
|
// Get clicks by date
|
|
20
|
-
const dateResult = await
|
|
17
|
+
const dateResult = await db.query(`SELECT
|
|
21
18
|
DATE(ce.clicked_at) as date,
|
|
22
19
|
COUNT(*) as clicks
|
|
23
20
|
FROM click_events ce
|
|
@@ -26,7 +23,7 @@ async function analyticsRoutes(fastify) {
|
|
|
26
23
|
GROUP BY DATE(ce.clicked_at)
|
|
27
24
|
ORDER BY date`, [userId]);
|
|
28
25
|
// Get clicks by country
|
|
29
|
-
const countryResult = await
|
|
26
|
+
const countryResult = await db.query(`SELECT
|
|
30
27
|
COALESCE(ce.country_code, 'Unknown') as country_code,
|
|
31
28
|
COALESCE(ce.country_name, ce.country_code, 'Unknown') as country,
|
|
32
29
|
COUNT(*) as clicks
|
|
@@ -36,7 +33,7 @@ async function analyticsRoutes(fastify) {
|
|
|
36
33
|
GROUP BY ce.country_code, ce.country_name
|
|
37
34
|
ORDER BY clicks DESC`, [userId]);
|
|
38
35
|
// Get clicks by device
|
|
39
|
-
const deviceResult = await
|
|
36
|
+
const deviceResult = await db.query(`SELECT
|
|
40
37
|
COALESCE(ce.device_type, 'Unknown') as device,
|
|
41
38
|
COUNT(*) as clicks
|
|
42
39
|
FROM click_events ce
|
|
@@ -45,7 +42,7 @@ async function analyticsRoutes(fastify) {
|
|
|
45
42
|
GROUP BY ce.device_type
|
|
46
43
|
ORDER BY clicks DESC`, [userId]);
|
|
47
44
|
// Get clicks by platform
|
|
48
|
-
const platformResult = await
|
|
45
|
+
const platformResult = await db.query(`SELECT
|
|
49
46
|
COALESCE(ce.platform, 'Unknown') as platform,
|
|
50
47
|
COUNT(*) as clicks
|
|
51
48
|
FROM click_events ce
|
|
@@ -54,7 +51,7 @@ async function analyticsRoutes(fastify) {
|
|
|
54
51
|
GROUP BY ce.platform
|
|
55
52
|
ORDER BY clicks DESC`, [userId]);
|
|
56
53
|
// Get top performing links
|
|
57
|
-
const topLinksResult = await
|
|
54
|
+
const topLinksResult = await db.query(`SELECT
|
|
58
55
|
l.id,
|
|
59
56
|
l.short_code,
|
|
60
57
|
l.title,
|
|
@@ -106,24 +103,24 @@ async function analyticsRoutes(fastify) {
|
|
|
106
103
|
throw new Error('userId query parameter is required');
|
|
107
104
|
}
|
|
108
105
|
// Verify link ownership
|
|
109
|
-
const linkResult = await
|
|
106
|
+
const linkResult = await db.query('SELECT id FROM links WHERE id = $1 AND user_id = $2', [linkId, userId]);
|
|
110
107
|
if (linkResult.rows.length === 0) {
|
|
111
108
|
throw new Error('Link not found');
|
|
112
109
|
}
|
|
113
110
|
// Get analytics for specific link
|
|
114
|
-
const clicksResult = await
|
|
111
|
+
const clicksResult = await db.query(`SELECT
|
|
115
112
|
COUNT(*) as total_clicks,
|
|
116
113
|
COUNT(DISTINCT ip_address) as unique_clicks
|
|
117
114
|
FROM click_events
|
|
118
115
|
WHERE link_id = $1 AND clicked_at >= NOW() - INTERVAL '${days} days'`, [linkId]);
|
|
119
|
-
const dateResult = await
|
|
116
|
+
const dateResult = await db.query(`SELECT
|
|
120
117
|
DATE(clicked_at) as date,
|
|
121
118
|
COUNT(*) as clicks
|
|
122
119
|
FROM click_events
|
|
123
120
|
WHERE link_id = $1 AND clicked_at >= NOW() - INTERVAL '${days} days'
|
|
124
121
|
GROUP BY DATE(clicked_at)
|
|
125
122
|
ORDER BY date`, [linkId]);
|
|
126
|
-
const countryResult = await
|
|
123
|
+
const countryResult = await db.query(`SELECT
|
|
127
124
|
COALESCE(country_code, 'Unknown') as country_code,
|
|
128
125
|
COALESCE(country_name, country_code, 'Unknown') as country,
|
|
129
126
|
COUNT(*) as clicks
|
|
@@ -131,14 +128,14 @@ async function analyticsRoutes(fastify) {
|
|
|
131
128
|
WHERE link_id = $1 AND clicked_at >= NOW() - INTERVAL '${days} days'
|
|
132
129
|
GROUP BY country_code, country_name
|
|
133
130
|
ORDER BY clicks DESC`, [linkId]);
|
|
134
|
-
const deviceResult = await
|
|
131
|
+
const deviceResult = await db.query(`SELECT
|
|
135
132
|
COALESCE(device_type, 'Unknown') as device,
|
|
136
133
|
COUNT(*) as clicks
|
|
137
134
|
FROM click_events
|
|
138
135
|
WHERE link_id = $1 AND clicked_at >= NOW() - INTERVAL '${days} days'
|
|
139
136
|
GROUP BY device_type
|
|
140
137
|
ORDER BY clicks DESC`, [linkId]);
|
|
141
|
-
const platformResult = await
|
|
138
|
+
const platformResult = await db.query(`SELECT
|
|
142
139
|
COALESCE(platform, 'Unknown') as platform,
|
|
143
140
|
COUNT(*) as clicks
|
|
144
141
|
FROM click_events
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/routes/debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAqB1D;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,iBAoVzD"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { db } from '../lib/database.js';
|
|
3
|
+
import { detectDevice } from '../lib/utils.js';
|
|
4
|
+
import { subscribeToClickEvents } from '../lib/event-emitter.js';
|
|
5
|
+
/**
|
|
6
|
+
* Device simulation request schema
|
|
7
|
+
*/
|
|
8
|
+
const simulateRequestSchema = z.object({
|
|
9
|
+
linkId: z.string().uuid(),
|
|
10
|
+
userId: z.string().uuid(),
|
|
11
|
+
deviceType: z.enum(['ios', 'android', 'web']).optional(),
|
|
12
|
+
userAgent: z.string().optional(),
|
|
13
|
+
country: z.string().length(2).optional(), // ISO country code
|
|
14
|
+
language: z.string().optional(), // e.g., "en", "es", "fr"
|
|
15
|
+
ipAddress: z.string().ip().optional(),
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Debugging routes for testing and validation
|
|
19
|
+
* Premium Cloud-only feature
|
|
20
|
+
*/
|
|
21
|
+
export async function debugRoutes(fastify) {
|
|
22
|
+
/**
|
|
23
|
+
* POST /api/debug/simulate
|
|
24
|
+
* Simulate a link click with custom device parameters
|
|
25
|
+
* Returns detailed information about redirect decision without logging
|
|
26
|
+
*/
|
|
27
|
+
fastify.post('/api/debug/simulate', async (request) => {
|
|
28
|
+
const data = simulateRequestSchema.parse(request.body);
|
|
29
|
+
// Fetch the link
|
|
30
|
+
const linkResult = await db.query(`SELECT * FROM links WHERE id = $1 AND user_id = $2`, [data.linkId, data.userId]);
|
|
31
|
+
if (linkResult.rows.length === 0) {
|
|
32
|
+
throw new Error('Link not found');
|
|
33
|
+
}
|
|
34
|
+
const link = linkResult.rows[0];
|
|
35
|
+
// Determine device type
|
|
36
|
+
let deviceType;
|
|
37
|
+
if (data.deviceType) {
|
|
38
|
+
deviceType = data.deviceType;
|
|
39
|
+
}
|
|
40
|
+
else if (data.userAgent) {
|
|
41
|
+
deviceType = detectDevice(data.userAgent);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
deviceType = 'web'; // Default
|
|
45
|
+
}
|
|
46
|
+
// Simulate targeting rules evaluation
|
|
47
|
+
const targetingRules = link.targeting_rules || {};
|
|
48
|
+
const simulatedCountry = data.country || 'US';
|
|
49
|
+
const simulatedLanguage = data.language || 'en';
|
|
50
|
+
let targetingMatched = true;
|
|
51
|
+
const targetingDetails = {
|
|
52
|
+
countryMatch: null,
|
|
53
|
+
deviceMatch: null,
|
|
54
|
+
languageMatch: null,
|
|
55
|
+
};
|
|
56
|
+
// Check country targeting
|
|
57
|
+
if (targetingRules.countries && targetingRules.countries.length > 0) {
|
|
58
|
+
targetingDetails.countryMatch = targetingRules.countries.includes(simulatedCountry);
|
|
59
|
+
if (!targetingDetails.countryMatch) {
|
|
60
|
+
targetingMatched = false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Check device targeting
|
|
64
|
+
if (targetingRules.devices && targetingRules.devices.length > 0) {
|
|
65
|
+
targetingDetails.deviceMatch = targetingRules.devices.includes(deviceType);
|
|
66
|
+
if (!targetingDetails.deviceMatch) {
|
|
67
|
+
targetingMatched = false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Check language targeting
|
|
71
|
+
if (targetingRules.languages && targetingRules.languages.length > 0) {
|
|
72
|
+
const primaryLang = simulatedLanguage.split('-')[0];
|
|
73
|
+
targetingDetails.languageMatch = targetingRules.languages.some((lang) => lang.toLowerCase().startsWith(primaryLang.toLowerCase()));
|
|
74
|
+
if (!targetingDetails.languageMatch) {
|
|
75
|
+
targetingMatched = false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Determine redirect URL based on device type
|
|
79
|
+
let redirectUrl = link.original_url;
|
|
80
|
+
let redirectReason = 'original_url (default)';
|
|
81
|
+
if (deviceType === 'ios' && link.ios_url) {
|
|
82
|
+
redirectUrl = link.ios_url;
|
|
83
|
+
redirectReason = 'ios_url (iOS device detected)';
|
|
84
|
+
}
|
|
85
|
+
else if (deviceType === 'android' && link.android_url) {
|
|
86
|
+
redirectUrl = link.android_url;
|
|
87
|
+
redirectReason = 'android_url (Android device detected)';
|
|
88
|
+
}
|
|
89
|
+
else if (deviceType === 'web' && link.web_fallback_url) {
|
|
90
|
+
redirectUrl = link.web_fallback_url;
|
|
91
|
+
redirectReason = 'web_fallback_url (Web device detected)';
|
|
92
|
+
}
|
|
93
|
+
// Add UTM parameters if present
|
|
94
|
+
let finalUrl = redirectUrl;
|
|
95
|
+
const utmParameters = link.utm_parameters || {};
|
|
96
|
+
if (Object.keys(utmParameters).length > 0) {
|
|
97
|
+
const url = new URL(redirectUrl);
|
|
98
|
+
if (utmParameters.source)
|
|
99
|
+
url.searchParams.set('utm_source', utmParameters.source);
|
|
100
|
+
if (utmParameters.medium)
|
|
101
|
+
url.searchParams.set('utm_medium', utmParameters.medium);
|
|
102
|
+
if (utmParameters.campaign)
|
|
103
|
+
url.searchParams.set('utm_campaign', utmParameters.campaign);
|
|
104
|
+
if (utmParameters.term)
|
|
105
|
+
url.searchParams.set('utm_term', utmParameters.term);
|
|
106
|
+
if (utmParameters.content)
|
|
107
|
+
url.searchParams.set('utm_content', utmParameters.content);
|
|
108
|
+
finalUrl = url.toString();
|
|
109
|
+
}
|
|
110
|
+
// Return detailed simulation results
|
|
111
|
+
return {
|
|
112
|
+
simulation: {
|
|
113
|
+
linkId: link.id,
|
|
114
|
+
shortCode: link.short_code,
|
|
115
|
+
title: link.title,
|
|
116
|
+
isActive: link.is_active,
|
|
117
|
+
expiresAt: link.expires_at,
|
|
118
|
+
},
|
|
119
|
+
input: {
|
|
120
|
+
deviceType: data.deviceType || 'auto-detected',
|
|
121
|
+
userAgent: data.userAgent || 'Not provided',
|
|
122
|
+
country: simulatedCountry,
|
|
123
|
+
language: simulatedLanguage,
|
|
124
|
+
ipAddress: data.ipAddress || 'Not provided',
|
|
125
|
+
},
|
|
126
|
+
detection: {
|
|
127
|
+
detectedDevice: deviceType,
|
|
128
|
+
detectionMethod: data.deviceType
|
|
129
|
+
? 'manual (provided in request)'
|
|
130
|
+
: data.userAgent
|
|
131
|
+
? 'user-agent parsing'
|
|
132
|
+
: 'default (web)',
|
|
133
|
+
},
|
|
134
|
+
targeting: {
|
|
135
|
+
hasRules: Object.keys(targetingRules).length > 0,
|
|
136
|
+
rules: targetingRules,
|
|
137
|
+
matched: targetingMatched,
|
|
138
|
+
details: targetingDetails,
|
|
139
|
+
},
|
|
140
|
+
redirect: {
|
|
141
|
+
wouldRedirect: link.is_active && targetingMatched,
|
|
142
|
+
finalUrl: targetingMatched ? finalUrl : null,
|
|
143
|
+
redirectReason: targetingMatched ? redirectReason : 'Targeting rules not matched',
|
|
144
|
+
utmParametersAdded: Object.keys(utmParameters).length > 0,
|
|
145
|
+
utmParameters: utmParameters,
|
|
146
|
+
},
|
|
147
|
+
warnings: [
|
|
148
|
+
...(!link.is_active ? ['Link is inactive - would return 404'] : []),
|
|
149
|
+
...(link.expires_at && new Date(link.expires_at) < new Date()
|
|
150
|
+
? ['Link has expired - would return 404']
|
|
151
|
+
: []),
|
|
152
|
+
...(!targetingMatched ? ['Targeting rules not matched - would return 404'] : []),
|
|
153
|
+
],
|
|
154
|
+
};
|
|
155
|
+
});
|
|
156
|
+
/**
|
|
157
|
+
* GET /api/debug/user-agents
|
|
158
|
+
* Get a list of common User-Agent strings for testing
|
|
159
|
+
*/
|
|
160
|
+
fastify.get('/api/debug/user-agents', async () => {
|
|
161
|
+
return {
|
|
162
|
+
ios: [
|
|
163
|
+
{
|
|
164
|
+
name: 'iPhone 15 Pro - iOS 17 - Safari',
|
|
165
|
+
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
|
|
166
|
+
device: 'ios',
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: 'iPhone 14 - iOS 16 - Safari',
|
|
170
|
+
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1',
|
|
171
|
+
device: 'ios',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
name: 'iPad Pro - iOS 17 - Safari',
|
|
175
|
+
userAgent: 'Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
|
|
176
|
+
device: 'ios',
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
android: [
|
|
180
|
+
{
|
|
181
|
+
name: 'Samsung Galaxy S23 - Android 13 - Chrome',
|
|
182
|
+
userAgent: 'Mozilla/5.0 (Linux; Android 13; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36',
|
|
183
|
+
device: 'android',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: 'Google Pixel 8 - Android 14 - Chrome',
|
|
187
|
+
userAgent: 'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36',
|
|
188
|
+
device: 'android',
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: 'OnePlus 11 - Android 13 - Chrome',
|
|
192
|
+
userAgent: 'Mozilla/5.0 (Linux; Android 13; CPH2449) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36',
|
|
193
|
+
device: 'android',
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
web: [
|
|
197
|
+
{
|
|
198
|
+
name: 'Chrome on Windows',
|
|
199
|
+
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
|
|
200
|
+
device: 'web',
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: 'Safari on macOS',
|
|
204
|
+
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15',
|
|
205
|
+
device: 'web',
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
name: 'Firefox on Linux',
|
|
209
|
+
userAgent: 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0',
|
|
210
|
+
device: 'web',
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
/**
|
|
216
|
+
* GET /api/debug/countries
|
|
217
|
+
* Get a list of common countries for testing
|
|
218
|
+
*/
|
|
219
|
+
fastify.get('/api/debug/countries', async () => {
|
|
220
|
+
return {
|
|
221
|
+
countries: [
|
|
222
|
+
{ code: 'US', name: 'United States' },
|
|
223
|
+
{ code: 'GB', name: 'United Kingdom' },
|
|
224
|
+
{ code: 'CA', name: 'Canada' },
|
|
225
|
+
{ code: 'AU', name: 'Australia' },
|
|
226
|
+
{ code: 'DE', name: 'Germany' },
|
|
227
|
+
{ code: 'FR', name: 'France' },
|
|
228
|
+
{ code: 'ES', name: 'Spain' },
|
|
229
|
+
{ code: 'IT', name: 'Italy' },
|
|
230
|
+
{ code: 'JP', name: 'Japan' },
|
|
231
|
+
{ code: 'CN', name: 'China' },
|
|
232
|
+
{ code: 'IN', name: 'India' },
|
|
233
|
+
{ code: 'BR', name: 'Brazil' },
|
|
234
|
+
{ code: 'MX', name: 'Mexico' },
|
|
235
|
+
{ code: 'KR', name: 'South Korea' },
|
|
236
|
+
{ code: 'SG', name: 'Singapore' },
|
|
237
|
+
],
|
|
238
|
+
};
|
|
239
|
+
});
|
|
240
|
+
/**
|
|
241
|
+
* GET /api/debug/languages
|
|
242
|
+
* Get a list of common languages for testing
|
|
243
|
+
*/
|
|
244
|
+
fastify.get('/api/debug/languages', async () => {
|
|
245
|
+
return {
|
|
246
|
+
languages: [
|
|
247
|
+
{ code: 'en', name: 'English' },
|
|
248
|
+
{ code: 'es', name: 'Spanish' },
|
|
249
|
+
{ code: 'fr', name: 'French' },
|
|
250
|
+
{ code: 'de', name: 'German' },
|
|
251
|
+
{ code: 'it', name: 'Italian' },
|
|
252
|
+
{ code: 'pt', name: 'Portuguese' },
|
|
253
|
+
{ code: 'ja', name: 'Japanese' },
|
|
254
|
+
{ code: 'zh', name: 'Chinese' },
|
|
255
|
+
{ code: 'ko', name: 'Korean' },
|
|
256
|
+
{ code: 'ar', name: 'Arabic' },
|
|
257
|
+
{ code: 'ru', name: 'Russian' },
|
|
258
|
+
{ code: 'hi', name: 'Hindi' },
|
|
259
|
+
],
|
|
260
|
+
};
|
|
261
|
+
});
|
|
262
|
+
/**
|
|
263
|
+
* WebSocket: /api/debug/live
|
|
264
|
+
* Real-time click event streaming
|
|
265
|
+
* Clients can subscribe to live click events filtered by userId and optionally linkId
|
|
266
|
+
*/
|
|
267
|
+
fastify.get('/api/debug/live', { websocket: true }, (connection, request) => {
|
|
268
|
+
const { userId, linkId } = request.query;
|
|
269
|
+
if (!userId) {
|
|
270
|
+
connection.socket.send(JSON.stringify({
|
|
271
|
+
type: 'error',
|
|
272
|
+
message: 'userId query parameter is required',
|
|
273
|
+
}));
|
|
274
|
+
connection.socket.close();
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
// Send welcome message
|
|
278
|
+
connection.socket.send(JSON.stringify({
|
|
279
|
+
type: 'connected',
|
|
280
|
+
message: 'Connected to live request inspector',
|
|
281
|
+
filters: {
|
|
282
|
+
userId,
|
|
283
|
+
linkId: linkId || 'all',
|
|
284
|
+
},
|
|
285
|
+
}));
|
|
286
|
+
// Subscribe to click events
|
|
287
|
+
const unsubscribe = subscribeToClickEvents((eventData) => {
|
|
288
|
+
// Filter by userId
|
|
289
|
+
if (eventData.userId !== userId) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
// Filter by linkId if provided
|
|
293
|
+
if (linkId && eventData.linkId !== linkId) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
// Send event to client
|
|
297
|
+
try {
|
|
298
|
+
connection.socket.send(JSON.stringify({
|
|
299
|
+
type: 'click_event',
|
|
300
|
+
data: eventData,
|
|
301
|
+
}));
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
console.error('Failed to send WebSocket message:', error);
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
// Handle client disconnect
|
|
308
|
+
connection.socket.on('close', () => {
|
|
309
|
+
unsubscribe();
|
|
310
|
+
});
|
|
311
|
+
// Handle errors
|
|
312
|
+
connection.socket.on('error', (error) => {
|
|
313
|
+
console.error('WebSocket error:', error);
|
|
314
|
+
unsubscribe();
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/routes/debug.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/index.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export { redirectRoutes } from './redirect.js';
|
|
2
2
|
export { linkRoutes } from './links.js';
|
|
3
3
|
export { analyticsRoutes } from './analytics.js';
|
|
4
|
+
export { sdkRoutes } from './sdk.js';
|
|
5
|
+
export { qrRoutes } from './qr.js';
|
|
6
|
+
export { webhookRoutes } from './webhooks.js';
|
|
7
|
+
export { previewRoutes } from './preview.js';
|
|
8
|
+
export { debugRoutes } from './debug.js';
|
|
4
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/routes/index.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
Object.defineProperty(exports, "analyticsRoutes", { enumerable: true, get: function () { return analytics_js_1.analyticsRoutes; } });
|
|
1
|
+
export { redirectRoutes } from './redirect.js';
|
|
2
|
+
export { linkRoutes } from './links.js';
|
|
3
|
+
export { analyticsRoutes } from './analytics.js';
|
|
4
|
+
export { sdkRoutes } from './sdk.js';
|
|
5
|
+
export { qrRoutes } from './qr.js';
|
|
6
|
+
export { webhookRoutes } from './webhooks.js';
|
|
7
|
+
export { previewRoutes } from './preview.js';
|
|
8
|
+
export { debugRoutes } from './debug.js';
|
|
10
9
|
//# sourceMappingURL=index.js.map
|
package/dist/routes/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/routes/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/routes/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AA0C1D,wBAAsB,UAAU,CAAC,OAAO,EAAE,eAAe,iBAmNxD"}
|