@linkforty/core 1.2.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.js +26 -55
- package/dist/index.js.map +1 -1
- package/dist/lib/database.js +6 -12
- package/dist/lib/database.js.map +1 -1
- package/dist/lib/event-emitter.js +7 -12
- package/dist/lib/event-emitter.js.map +1 -1
- package/dist/lib/fingerprint.js +20 -64
- package/dist/lib/fingerprint.js.map +1 -1
- package/dist/lib/utils.js +11 -21
- package/dist/lib/utils.js.map +1 -1
- package/dist/lib/webhook.js +7 -16
- package/dist/lib/webhook.js.map +1 -1
- package/dist/routes/analytics.js +14 -17
- package/dist/routes/analytics.js.map +1 -1
- package/dist/routes/debug.js +16 -19
- package/dist/routes/debug.js.map +1 -1
- package/dist/routes/index.js +8 -19
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/links.js +38 -41
- package/dist/routes/links.js.map +1 -1
- package/dist/routes/preview.js +4 -7
- package/dist/routes/preview.js.map +1 -1
- package/dist/routes/qr.js +6 -12
- package/dist/routes/qr.js.map +1 -1
- package/dist/routes/redirect.js +19 -55
- package/dist/routes/redirect.js.map +1 -1
- package/dist/routes/sdk.js +28 -31
- package/dist/routes/sdk.js.map +1 -1
- package/dist/routes/webhooks.js +29 -65
- package/dist/routes/webhooks.js.map +1 -1
- package/dist/scripts/migrate.js +2 -4
- package/dist/scripts/migrate.js.map +1 -1
- package/dist/types/index.js +1 -2
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,71 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
-
};
|
|
19
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.debugRoutes = exports.previewRoutes = exports.qrRoutes = exports.webhookRoutes = exports.sdkRoutes = exports.analyticsRoutes = exports.linkRoutes = exports.redirectRoutes = void 0;
|
|
21
|
-
exports.createServer = createServer;
|
|
22
|
-
const fastify_1 = __importDefault(require("fastify"));
|
|
23
|
-
const cors_1 = __importDefault(require("@fastify/cors"));
|
|
24
|
-
const redis_1 = __importDefault(require("@fastify/redis"));
|
|
25
|
-
const database_js_1 = require("./lib/database.js");
|
|
26
|
-
const redirect_js_1 = require("./routes/redirect.js");
|
|
27
|
-
const links_js_1 = require("./routes/links.js");
|
|
28
|
-
const analytics_js_1 = require("./routes/analytics.js");
|
|
29
|
-
const sdk_js_1 = require("./routes/sdk.js");
|
|
30
|
-
const webhooks_js_1 = require("./routes/webhooks.js");
|
|
31
|
-
async function createServer(options = {}) {
|
|
32
|
-
const fastify = (0, fastify_1.default)({
|
|
1
|
+
import Fastify from 'fastify';
|
|
2
|
+
import cors from '@fastify/cors';
|
|
3
|
+
import redis from '@fastify/redis';
|
|
4
|
+
import { initializeDatabase } from './lib/database.js';
|
|
5
|
+
import { redirectRoutes } from './routes/redirect.js';
|
|
6
|
+
import { linkRoutes } from './routes/links.js';
|
|
7
|
+
import { analyticsRoutes } from './routes/analytics.js';
|
|
8
|
+
import { sdkRoutes } from './routes/sdk.js';
|
|
9
|
+
import { webhookRoutes } from './routes/webhooks.js';
|
|
10
|
+
export async function createServer(options = {}) {
|
|
11
|
+
const fastify = Fastify({
|
|
33
12
|
logger: options.logger !== undefined ? options.logger : true,
|
|
34
13
|
});
|
|
35
14
|
// CORS
|
|
36
|
-
await fastify.register(
|
|
15
|
+
await fastify.register(cors, {
|
|
37
16
|
origin: options.cors?.origin || '*',
|
|
38
17
|
});
|
|
39
18
|
// Redis (optional)
|
|
40
19
|
if (options.redis?.url) {
|
|
41
|
-
await fastify.register(
|
|
20
|
+
await fastify.register(redis, {
|
|
42
21
|
url: options.redis.url,
|
|
43
22
|
});
|
|
44
23
|
}
|
|
45
24
|
// Database
|
|
46
|
-
await
|
|
25
|
+
await initializeDatabase(options.database);
|
|
47
26
|
// Routes
|
|
48
|
-
await fastify.register(
|
|
49
|
-
await fastify.register(
|
|
50
|
-
await fastify.register(
|
|
51
|
-
await fastify.register(
|
|
52
|
-
await fastify.register(
|
|
27
|
+
await fastify.register(redirectRoutes);
|
|
28
|
+
await fastify.register(linkRoutes);
|
|
29
|
+
await fastify.register(analyticsRoutes);
|
|
30
|
+
await fastify.register(sdkRoutes);
|
|
31
|
+
await fastify.register(webhookRoutes);
|
|
53
32
|
return fastify;
|
|
54
33
|
}
|
|
55
34
|
// Re-export utilities and types
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
Object.defineProperty(exports, "redirectRoutes", { enumerable: true, get: function () { return index_js_1.redirectRoutes; } });
|
|
64
|
-
Object.defineProperty(exports, "linkRoutes", { enumerable: true, get: function () { return index_js_1.linkRoutes; } });
|
|
65
|
-
Object.defineProperty(exports, "analyticsRoutes", { enumerable: true, get: function () { return index_js_1.analyticsRoutes; } });
|
|
66
|
-
Object.defineProperty(exports, "sdkRoutes", { enumerable: true, get: function () { return index_js_1.sdkRoutes; } });
|
|
67
|
-
Object.defineProperty(exports, "webhookRoutes", { enumerable: true, get: function () { return index_js_1.webhookRoutes; } });
|
|
68
|
-
Object.defineProperty(exports, "qrRoutes", { enumerable: true, get: function () { return index_js_1.qrRoutes; } });
|
|
69
|
-
Object.defineProperty(exports, "previewRoutes", { enumerable: true, get: function () { return index_js_1.previewRoutes; } });
|
|
70
|
-
Object.defineProperty(exports, "debugRoutes", { enumerable: true, get: function () { return index_js_1.debugRoutes; } });
|
|
35
|
+
export * from './lib/utils.js';
|
|
36
|
+
export * from './lib/database.js';
|
|
37
|
+
export * from './lib/fingerprint.js';
|
|
38
|
+
export * from './lib/webhook.js';
|
|
39
|
+
export * from './lib/event-emitter.js';
|
|
40
|
+
export * from './types/index.js';
|
|
41
|
+
export { redirectRoutes, linkRoutes, analyticsRoutes, sdkRoutes, webhookRoutes, qrRoutes, previewRoutes, debugRoutes } from './routes/index.js';
|
|
71
42
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAA4B,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAmB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAarD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAAyB,EAAE;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;KAC7D,CAAC,CAAC;IAEH,OAAO;IACP,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC3B,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG;KACpC,CAAC,CAAC;IAEH,mBAAmB;IACnB,IAAI,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE;YAC5B,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG;SACvB,CAAC,CAAC;IACL,CAAC;IAED,WAAW;IACX,MAAM,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE3C,SAAS;IACT,MAAM,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACvC,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACxC,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gCAAgC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/lib/database.js
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.db = void 0;
|
|
7
|
-
exports.initializeDatabase = initializeDatabase;
|
|
8
|
-
const pg_1 = __importDefault(require("pg"));
|
|
9
|
-
const { Pool } = pg_1.default;
|
|
1
|
+
import pg from 'pg';
|
|
2
|
+
const { Pool } = pg;
|
|
3
|
+
export let db;
|
|
10
4
|
// Helper function to wait for a specified time
|
|
11
5
|
function sleep(ms) {
|
|
12
6
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
@@ -15,7 +9,7 @@ function sleep(ms) {
|
|
|
15
9
|
async function connectWithRetry(maxRetries = 10, baseDelay = 1000) {
|
|
16
10
|
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
17
11
|
try {
|
|
18
|
-
const client = await
|
|
12
|
+
const client = await db.connect();
|
|
19
13
|
console.log('Database connection established successfully');
|
|
20
14
|
return client;
|
|
21
15
|
}
|
|
@@ -34,9 +28,9 @@ async function connectWithRetry(maxRetries = 10, baseDelay = 1000) {
|
|
|
34
28
|
throw new Error('Max retries exceeded');
|
|
35
29
|
}
|
|
36
30
|
// Initialize database schema
|
|
37
|
-
async function initializeDatabase(options = {}) {
|
|
31
|
+
export async function initializeDatabase(options = {}) {
|
|
38
32
|
// Initialize pool
|
|
39
|
-
|
|
33
|
+
db = new Pool({
|
|
40
34
|
connectionString: options.url || process.env.DATABASE_URL || 'postgresql://postgres:password@localhost:5432/linkforty',
|
|
41
35
|
ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false,
|
|
42
36
|
min: options.pool?.min || 2,
|
package/dist/lib/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/lib/database.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/lib/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.clickEventEmitter = void 0;
|
|
4
|
-
exports.emitClickEvent = emitClickEvent;
|
|
5
|
-
exports.subscribeToClickEvents = subscribeToClickEvents;
|
|
6
|
-
const events_1 = require("events");
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
7
2
|
/**
|
|
8
3
|
* Global event emitter for real-time events
|
|
9
4
|
* Used for broadcasting click events to WebSocket clients
|
|
10
5
|
*/
|
|
11
|
-
|
|
6
|
+
export const clickEventEmitter = new EventEmitter();
|
|
12
7
|
/**
|
|
13
8
|
* Emit a click event for real-time streaming
|
|
14
9
|
*/
|
|
15
|
-
function emitClickEvent(eventData) {
|
|
16
|
-
|
|
10
|
+
export function emitClickEvent(eventData) {
|
|
11
|
+
clickEventEmitter.emit('click', eventData);
|
|
17
12
|
}
|
|
18
13
|
/**
|
|
19
14
|
* Subscribe to click events
|
|
20
15
|
* Returns unsubscribe function
|
|
21
16
|
*/
|
|
22
|
-
function subscribeToClickEvents(callback) {
|
|
23
|
-
|
|
17
|
+
export function subscribeToClickEvents(callback) {
|
|
18
|
+
clickEventEmitter.on('click', callback);
|
|
24
19
|
// Return unsubscribe function
|
|
25
20
|
return () => {
|
|
26
|
-
|
|
21
|
+
clickEventEmitter.off('click', callback);
|
|
27
22
|
};
|
|
28
23
|
}
|
|
29
24
|
//# sourceMappingURL=event-emitter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../src/lib/event-emitter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../src/lib/event-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,YAAY,EAAE,CAAC;AA2CpD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAyB;IACtD,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAA6C;IAE7C,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAExC,8BAA8B;IAC9B,OAAO,GAAG,EAAE;QACV,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/lib/fingerprint.js
CHANGED
|
@@ -1,49 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.CONFIDENCE_THRESHOLD = exports.DEFAULT_ATTRIBUTION_WINDOW_HOURS = void 0;
|
|
40
|
-
exports.generateFingerprintHash = generateFingerprintHash;
|
|
41
|
-
exports.calculateConfidenceScore = calculateConfidenceScore;
|
|
42
|
-
exports.matchInstallToClick = matchInstallToClick;
|
|
43
|
-
exports.storeFingerprintForClick = storeFingerprintForClick;
|
|
44
|
-
exports.recordInstallEvent = recordInstallEvent;
|
|
45
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
46
|
-
const database_js_1 = require("./database.js");
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import { db } from './database.js';
|
|
47
3
|
/**
|
|
48
4
|
* Scoring weights for probabilistic matching
|
|
49
5
|
* Total should equal 100 for percentage-based confidence
|
|
@@ -58,16 +14,16 @@ const FINGERPRINT_WEIGHTS = {
|
|
|
58
14
|
/**
|
|
59
15
|
* Default attribution window in hours (7 days)
|
|
60
16
|
*/
|
|
61
|
-
|
|
17
|
+
export const DEFAULT_ATTRIBUTION_WINDOW_HOURS = 168;
|
|
62
18
|
/**
|
|
63
19
|
* Minimum confidence threshold for attribution (70%)
|
|
64
20
|
*/
|
|
65
|
-
|
|
21
|
+
export const CONFIDENCE_THRESHOLD = 70;
|
|
66
22
|
/**
|
|
67
23
|
* Generate a fingerprint hash from device data
|
|
68
24
|
* Uses SHA-256 hash of concatenated device attributes
|
|
69
25
|
*/
|
|
70
|
-
function generateFingerprintHash(data) {
|
|
26
|
+
export function generateFingerprintHash(data) {
|
|
71
27
|
const components = [
|
|
72
28
|
data.ipAddress || '',
|
|
73
29
|
data.userAgent || '',
|
|
@@ -79,7 +35,7 @@ function generateFingerprintHash(data) {
|
|
|
79
35
|
data.platformVersion || '',
|
|
80
36
|
];
|
|
81
37
|
const concatenated = components.join('|');
|
|
82
|
-
return
|
|
38
|
+
return crypto.createHash('sha256').update(concatenated).digest('hex');
|
|
83
39
|
}
|
|
84
40
|
/**
|
|
85
41
|
* Normalize IP address for comparison
|
|
@@ -119,7 +75,7 @@ function normalizeUserAgent(ua) {
|
|
|
119
75
|
* Calculate confidence score by comparing two fingerprints
|
|
120
76
|
* Returns a score from 0-100 based on matched components
|
|
121
77
|
*/
|
|
122
|
-
function calculateConfidenceScore(fingerprint1, fingerprint2) {
|
|
78
|
+
export function calculateConfidenceScore(fingerprint1, fingerprint2) {
|
|
123
79
|
let score = 0;
|
|
124
80
|
const matchedFactors = [];
|
|
125
81
|
// Compare IP addresses (normalized to /24 subnet for IPv4)
|
|
@@ -176,12 +132,12 @@ function calculateConfidenceScore(fingerprint1, fingerprint2) {
|
|
|
176
132
|
*
|
|
177
133
|
* Note: Uses link-specific attribution windows - each link can have its own window
|
|
178
134
|
*/
|
|
179
|
-
async function matchInstallToClick(installFingerprint, attributionWindowHours =
|
|
135
|
+
export async function matchInstallToClick(installFingerprint, attributionWindowHours = DEFAULT_ATTRIBUTION_WINDOW_HOURS) {
|
|
180
136
|
// Query recent click events within maximum possible attribution window (90 days)
|
|
181
137
|
// We'll validate against each link's specific window during matching
|
|
182
138
|
const maxWindowHours = 2160; // 90 days
|
|
183
139
|
const cutoffTime = new Date(Date.now() - maxWindowHours * 60 * 60 * 1000);
|
|
184
|
-
const clicksResult = await
|
|
140
|
+
const clicksResult = await db.query(`SELECT
|
|
185
141
|
ce.id as click_id,
|
|
186
142
|
ce.link_id,
|
|
187
143
|
ce.clicked_at,
|
|
@@ -209,7 +165,7 @@ async function matchInstallToClick(installFingerprint, attributionWindowHours =
|
|
|
209
165
|
let highestScore = 0;
|
|
210
166
|
for (const row of clicksResult.rows) {
|
|
211
167
|
// Check if click is within the link's specific attribution window
|
|
212
|
-
const linkWindowHours = row.attribution_window_hours ||
|
|
168
|
+
const linkWindowHours = row.attribution_window_hours || DEFAULT_ATTRIBUTION_WINDOW_HOURS;
|
|
213
169
|
const clickTime = new Date(row.clicked_at);
|
|
214
170
|
const timeDiffHours = (installTime.getTime() - clickTime.getTime()) / (1000 * 60 * 60);
|
|
215
171
|
if (timeDiffHours > linkWindowHours) {
|
|
@@ -228,7 +184,7 @@ async function matchInstallToClick(installFingerprint, attributionWindowHours =
|
|
|
228
184
|
};
|
|
229
185
|
const { score, matchedFactors } = calculateConfidenceScore(installFingerprint, clickFingerprint);
|
|
230
186
|
// Track the best match
|
|
231
|
-
if (score > highestScore && score >=
|
|
187
|
+
if (score > highestScore && score >= CONFIDENCE_THRESHOLD) {
|
|
232
188
|
highestScore = score;
|
|
233
189
|
bestMatch = {
|
|
234
190
|
clickId: row.click_id,
|
|
@@ -244,9 +200,9 @@ async function matchInstallToClick(installFingerprint, attributionWindowHours =
|
|
|
244
200
|
/**
|
|
245
201
|
* Store device fingerprint for a click event
|
|
246
202
|
*/
|
|
247
|
-
async function storeFingerprintForClick(clickId, fingerprintData) {
|
|
203
|
+
export async function storeFingerprintForClick(clickId, fingerprintData) {
|
|
248
204
|
const fingerprintHash = generateFingerprintHash(fingerprintData);
|
|
249
|
-
await
|
|
205
|
+
await db.query(`INSERT INTO device_fingerprints (
|
|
250
206
|
click_id,
|
|
251
207
|
fingerprint_hash,
|
|
252
208
|
ip_address,
|
|
@@ -273,12 +229,12 @@ async function storeFingerprintForClick(clickId, fingerprintData) {
|
|
|
273
229
|
/**
|
|
274
230
|
* Record an install event and attempt to match it to a click
|
|
275
231
|
*/
|
|
276
|
-
async function recordInstallEvent(fingerprintData, deviceId, attributionWindowHours =
|
|
232
|
+
export async function recordInstallEvent(fingerprintData, deviceId, attributionWindowHours = DEFAULT_ATTRIBUTION_WINDOW_HOURS) {
|
|
277
233
|
const fingerprintHash = generateFingerprintHash(fingerprintData);
|
|
278
234
|
// Attempt to match install to a click
|
|
279
235
|
const match = await matchInstallToClick(fingerprintData, attributionWindowHours);
|
|
280
236
|
// Insert install event
|
|
281
|
-
const installResult = await
|
|
237
|
+
const installResult = await db.query(`INSERT INTO install_events (
|
|
282
238
|
link_id,
|
|
283
239
|
click_id,
|
|
284
240
|
fingerprint_hash,
|
|
@@ -318,7 +274,7 @@ async function recordInstallEvent(fingerprintData, deviceId, attributionWindowHo
|
|
|
318
274
|
let deepLinkData = {};
|
|
319
275
|
// If we have a match, retrieve the deep link data from the original link
|
|
320
276
|
if (match) {
|
|
321
|
-
const linkResult = await
|
|
277
|
+
const linkResult = await db.query(`SELECT
|
|
322
278
|
short_code,
|
|
323
279
|
original_url,
|
|
324
280
|
ios_url,
|
|
@@ -343,19 +299,19 @@ async function recordInstallEvent(fingerprintData, deviceId, attributionWindowHo
|
|
|
343
299
|
matchedFactors: match.matchedFactors,
|
|
344
300
|
};
|
|
345
301
|
// Update the install event with deep link data
|
|
346
|
-
await
|
|
302
|
+
await db.query(`UPDATE install_events
|
|
347
303
|
SET deep_link_data = $1,
|
|
348
304
|
deep_link_retrieved = true
|
|
349
305
|
WHERE id = $2`, [JSON.stringify(deepLinkData), installId]);
|
|
350
306
|
// Trigger webhooks for install_event (only if attributed)
|
|
351
307
|
try {
|
|
352
308
|
// Get the link's user_id for webhook lookup
|
|
353
|
-
const linkUserResult = await
|
|
309
|
+
const linkUserResult = await db.query('SELECT user_id FROM links WHERE id = $1', [match.linkId]);
|
|
354
310
|
if (linkUserResult.rows.length > 0) {
|
|
355
311
|
const userId = linkUserResult.rows[0].user_id;
|
|
356
|
-
const webhooksResult = await
|
|
312
|
+
const webhooksResult = await db.query('SELECT * FROM webhooks WHERE user_id = $1 AND is_active = true', [userId]);
|
|
357
313
|
if (webhooksResult.rows.length > 0) {
|
|
358
|
-
const { triggerWebhooks } = await
|
|
314
|
+
const { triggerWebhooks } = await import('./webhook.js');
|
|
359
315
|
const installEventData = {
|
|
360
316
|
id: installId,
|
|
361
317
|
linkId: match.linkId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/lib/fingerprint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/lib/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AA2BnC;;;GAGG;AACH,MAAM,mBAAmB,GAAG;IAC1B,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,iBAAiB,EAAE,EAAE;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,GAAG,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAqB;IAC3D,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,SAAS,IAAI,EAAE;QACpB,IAAI,CAAC,SAAS,IAAI,EAAE;QACpB,IAAI,CAAC,QAAQ,IAAI,EAAE;QACnB,IAAI,CAAC,QAAQ,IAAI,EAAE;QACnB,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;QAClC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;QACnC,IAAI,CAAC,QAAQ,IAAI,EAAE;QACnB,IAAI,CAAC,eAAe,IAAI,EAAE;KAC3B,CAAC;IAEF,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,EAAU;IAC7B,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IAEnB,mDAAmD;IACnD,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,gEAAgE;IAChE,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,EAAU;IACpC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IAEnB,uDAAuD;IACvD,MAAM,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvD,kDAAkD;IAClD,MAAM,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpD,OAAO,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,YAA6B,EAC7B,YAA6B;IAE7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,2DAA2D;IAC3D,IAAI,YAAY,CAAC,SAAS,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,KAAK,IAAI,mBAAmB,CAAC,UAAU,CAAC;YACxC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,IAAI,YAAY,CAAC,SAAS,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,kBAAkB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,kBAAkB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAEvD,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,KAAK,IAAI,mBAAmB,CAAC,UAAU,CAAC;YACxC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;QACnD,IAAI,YAAY,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ,EAAE,CAAC;YACpD,KAAK,IAAI,mBAAmB,CAAC,QAAQ,CAAC;YACtC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;QACnD,2DAA2D;QAC3D,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAElE,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,KAAK,IAAI,mBAAmB,CAAC,QAAQ,CAAC;YACtC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IACE,YAAY,CAAC,WAAW;QACxB,YAAY,CAAC,YAAY;QACzB,YAAY,CAAC,WAAW;QACxB,YAAY,CAAC,YAAY,EACzB,CAAC;QACD,IACE,YAAY,CAAC,WAAW,KAAK,YAAY,CAAC,WAAW;YACrD,YAAY,CAAC,YAAY,KAAK,YAAY,CAAC,YAAY,EACvD,CAAC;YACD,KAAK,IAAI,mBAAmB,CAAC,iBAAiB,CAAC;YAC/C,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,kBAAmC,EACnC,yBAAiC,gCAAgC;IAEjE,iFAAiF;IACjF,qEAAqE;IACrE,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,UAAU;IACvC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAE1E,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,KAAK,CACjC;;;;;;;;;;;;;;;;;;gBAkBY,EACZ,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;IAE/B,sDAAsD;IACtD,IAAI,SAAS,GAA4B,IAAI,CAAC;IAC9C,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC;QACpC,kEAAkE;QAClE,MAAM,eAAe,GAAG,GAAG,CAAC,wBAAwB,IAAI,gCAAgC,CAAC;QACzF,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAEvF,IAAI,aAAa,GAAG,eAAe,EAAE,CAAC;YACpC,+DAA+D;YAC/D,SAAS;QACX,CAAC;QAED,MAAM,gBAAgB,GAAoB;YACxC,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,eAAe,EAAE,GAAG,CAAC,gBAAgB;SACtC,CAAC;QAEF,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,wBAAwB,CACxD,kBAAkB,EAClB,gBAAgB,CACjB,CAAC;QAEF,uBAAuB;QACvB,IAAI,KAAK,GAAG,YAAY,IAAI,KAAK,IAAI,oBAAoB,EAAE,CAAC;YAC1D,YAAY,GAAG,KAAK,CAAC;YACrB,SAAS,GAAG;gBACV,OAAO,EAAE,GAAG,CAAC,QAAQ;gBACrB,MAAM,EAAE,GAAG,CAAC,OAAO;gBACnB,eAAe,EAAE,KAAK;gBACtB,cAAc;gBACd,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;aACpC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAe,EACf,eAAgC;IAEhC,MAAM,eAAe,GAAG,uBAAuB,CAAC,eAAe,CAAC,CAAC;IAEjE,MAAM,EAAE,CAAC,KAAK,CACZ;;;;;;;;;;;uDAWmD,EACnD;QACE,OAAO;QACP,eAAe;QACf,eAAe,CAAC,SAAS;QACzB,eAAe,CAAC,SAAS;QACzB,eAAe,CAAC,QAAQ,IAAI,IAAI;QAChC,eAAe,CAAC,QAAQ,IAAI,IAAI;QAChC,eAAe,CAAC,WAAW,IAAI,IAAI;QACnC,eAAe,CAAC,YAAY,IAAI,IAAI;QACpC,eAAe,CAAC,QAAQ,IAAI,IAAI;QAChC,eAAe,CAAC,eAAe,IAAI,IAAI;KACxC,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,eAAgC,EAChC,QAAiB,EACjB,yBAAiC,gCAAgC;IAMjE,MAAM,eAAe,GAAG,uBAAuB,CAAC,eAAe,CAAC,CAAC;IAEjE,sCAAsC;IACtC,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;IAEjF,uBAAuB;IACvB,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,KAAK,CAClC;;;;;;;;;;;;;;;;;;;iCAmB6B,EAC7B;QACE,KAAK,EAAE,MAAM,IAAI,IAAI;QACrB,KAAK,EAAE,OAAO,IAAI,IAAI;QACtB,eAAe;QACf,KAAK,EAAE,eAAe,IAAI,IAAI;QAC9B,sBAAsB;QACtB,eAAe,CAAC,SAAS;QACzB,eAAe,CAAC,SAAS;QACzB,eAAe,CAAC,QAAQ,IAAI,IAAI;QAChC,eAAe,CAAC,QAAQ,IAAI,IAAI;QAChC,eAAe,CAAC,WAAW,IAAI,IAAI;QACnC,eAAe,CAAC,YAAY,IAAI,IAAI;QACpC,eAAe,CAAC,QAAQ,IAAI,IAAI;QAChC,eAAe,CAAC,eAAe,IAAI,IAAI;QACvC,QAAQ,IAAI,IAAI;QAChB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,mCAAmC;KACrF,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,IAAI,YAAY,GAAG,EAAE,CAAC;IAEtB,yEAAyE;IACzE,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,KAAK,CAC/B;;;;;;;;;qBASe,EACf,CAAC,KAAK,CAAC,MAAM,CAAC,CACf,CAAC;QAEF,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,YAAY,GAAG;gBACb,SAAS,EAAE,IAAI,CAAC,UAAU;gBAC1B,WAAW,EAAE,IAAI,CAAC,YAAY;gBAC9B,MAAM,EAAE,IAAI,CAAC,OAAO;gBACpB,UAAU,EAAE,IAAI,CAAC,WAAW;gBAC5B,cAAc,EAAE,IAAI,CAAC,gBAAgB;gBACrC,aAAa,EAAE,IAAI,CAAC,cAAc;gBAClC,cAAc,EAAE,IAAI,CAAC,eAAe;gBACpC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,cAAc,EAAE,KAAK,CAAC,cAAc;aACrC,CAAC;YAEF,+CAA+C;YAC/C,MAAM,EAAE,CAAC,KAAK,CACZ;;;uBAGe,EACf,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,CAC1C,CAAC;YAEF,0DAA0D;YAC1D,IAAI,CAAC;gBACH,4CAA4C;gBAC5C,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,KAAK,CACnC,yCAAyC,EACzC,CAAC,KAAK,CAAC,MAAM,CAAC,CACf,CAAC;gBAEF,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;oBAE9C,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,KAAK,CACnC,gEAAgE,EAChE,CAAC,MAAM,CAAC,CACT,CAAC;oBAEF,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACnC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;wBAEzD,MAAM,gBAAgB,GAAG;4BACvB,EAAE,EAAE,SAAS;4BACb,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,eAAe;4BACf,eAAe,EAAE,KAAK,CAAC,eAAe;4BACtC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BACrC,YAAY;4BACZ,SAAS,EAAE,eAAe,CAAC,SAAS;4BACpC,SAAS,EAAE,eAAe,CAAC,SAAS;4BACpC,QAAQ,EAAE,eAAe,CAAC,QAAQ;yBACnC,CAAC;wBAEF,4DAA4D;wBAC5D,8DAA8D;wBAC9D,MAAM,eAAe,CACnB,cAAc,CAAC,IAAI,EACnB,eAAe,EACf,SAAS,EACT,gBAAgB,CACjB,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS;QACT,KAAK;QACL,YAAY;KACb,CAAC;AACJ,CAAC"}
|
package/dist/lib/utils.js
CHANGED
|
@@ -1,21 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
exports.generateShortCode = generateShortCode;
|
|
7
|
-
exports.parseUserAgent = parseUserAgent;
|
|
8
|
-
exports.getLocationFromIP = getLocationFromIP;
|
|
9
|
-
exports.buildRedirectUrl = buildRedirectUrl;
|
|
10
|
-
exports.detectDevice = detectDevice;
|
|
11
|
-
const nanoid_1 = require("nanoid");
|
|
12
|
-
const geoip_lite_1 = __importDefault(require("geoip-lite"));
|
|
13
|
-
const ua_parser_js_1 = __importDefault(require("ua-parser-js"));
|
|
14
|
-
function generateShortCode(length = 8) {
|
|
15
|
-
return (0, nanoid_1.nanoid)(length);
|
|
1
|
+
import { nanoid } from 'nanoid';
|
|
2
|
+
import geoip from 'geoip-lite';
|
|
3
|
+
import UAParser from 'ua-parser-js';
|
|
4
|
+
export function generateShortCode(length = 8) {
|
|
5
|
+
return nanoid(length);
|
|
16
6
|
}
|
|
17
|
-
function parseUserAgent(userAgent) {
|
|
18
|
-
const parser = new
|
|
7
|
+
export function parseUserAgent(userAgent) {
|
|
8
|
+
const parser = new UAParser(userAgent);
|
|
19
9
|
const result = parser.getResult();
|
|
20
10
|
return {
|
|
21
11
|
deviceType: result.device.type || 'desktop',
|
|
@@ -73,8 +63,8 @@ const COUNTRY_NAMES = {
|
|
|
73
63
|
HU: 'Hungary',
|
|
74
64
|
RO: 'Romania',
|
|
75
65
|
};
|
|
76
|
-
function getLocationFromIP(ip) {
|
|
77
|
-
const geo =
|
|
66
|
+
export function getLocationFromIP(ip) {
|
|
67
|
+
const geo = geoip.lookup(ip);
|
|
78
68
|
if (!geo) {
|
|
79
69
|
return {
|
|
80
70
|
countryCode: null,
|
|
@@ -96,7 +86,7 @@ function getLocationFromIP(ip) {
|
|
|
96
86
|
timezone: geo.timezone,
|
|
97
87
|
};
|
|
98
88
|
}
|
|
99
|
-
function buildRedirectUrl(originalUrl, utmParameters) {
|
|
89
|
+
export function buildRedirectUrl(originalUrl, utmParameters) {
|
|
100
90
|
const url = new URL(originalUrl);
|
|
101
91
|
if (utmParameters) {
|
|
102
92
|
Object.entries(utmParameters).forEach(([key, value]) => {
|
|
@@ -107,7 +97,7 @@ function buildRedirectUrl(originalUrl, utmParameters) {
|
|
|
107
97
|
}
|
|
108
98
|
return url.toString();
|
|
109
99
|
}
|
|
110
|
-
function detectDevice(userAgent) {
|
|
100
|
+
export function detectDevice(userAgent) {
|
|
111
101
|
const ua = userAgent.toLowerCase();
|
|
112
102
|
if (ua.includes('iphone') || ua.includes('ipad') || ua.includes('ipod')) {
|
|
113
103
|
return 'ios';
|
package/dist/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/webhook.js
CHANGED
|
@@ -1,24 +1,15 @@
|
|
|
1
|
-
|
|
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
|
-
exports.generateWebhookSignature = generateWebhookSignature;
|
|
7
|
-
exports.generateWebhookSecret = generateWebhookSecret;
|
|
8
|
-
exports.deliverWebhook = deliverWebhook;
|
|
9
|
-
exports.triggerWebhooks = triggerWebhooks;
|
|
10
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
1
|
+
import crypto from 'crypto';
|
|
11
2
|
/**
|
|
12
3
|
* Generate HMAC SHA-256 signature for webhook payload
|
|
13
4
|
*/
|
|
14
|
-
function generateWebhookSignature(payload, secret) {
|
|
15
|
-
return
|
|
5
|
+
export function generateWebhookSignature(payload, secret) {
|
|
6
|
+
return crypto.createHmac('sha256', secret).update(payload).digest('hex');
|
|
16
7
|
}
|
|
17
8
|
/**
|
|
18
9
|
* Generate a secure random secret for webhook signing
|
|
19
10
|
*/
|
|
20
|
-
function generateWebhookSecret() {
|
|
21
|
-
return
|
|
11
|
+
export function generateWebhookSecret() {
|
|
12
|
+
return crypto.randomBytes(32).toString('hex');
|
|
22
13
|
}
|
|
23
14
|
/**
|
|
24
15
|
* Sleep utility for retry delays
|
|
@@ -83,7 +74,7 @@ async function attemptWebhookDelivery(webhook, payload, attemptNumber) {
|
|
|
83
74
|
/**
|
|
84
75
|
* Deliver webhook with retry logic and exponential backoff
|
|
85
76
|
*/
|
|
86
|
-
async function deliverWebhook(webhook, payload, logDelivery) {
|
|
77
|
+
export async function deliverWebhook(webhook, payload, logDelivery) {
|
|
87
78
|
const maxRetries = webhook.retry_count || 3;
|
|
88
79
|
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
89
80
|
const result = await attemptWebhookDelivery(webhook, payload, attempt);
|
|
@@ -117,7 +108,7 @@ async function deliverWebhook(webhook, payload, logDelivery) {
|
|
|
117
108
|
/**
|
|
118
109
|
* Trigger webhooks for a specific event (fire and forget)
|
|
119
110
|
*/
|
|
120
|
-
async function triggerWebhooks(webhooks, event, eventId, data, logDelivery) {
|
|
111
|
+
export async function triggerWebhooks(webhooks, event, eventId, data, logDelivery) {
|
|
121
112
|
// Create webhook payload
|
|
122
113
|
const payload = {
|
|
123
114
|
event,
|
package/dist/lib/webhook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/lib/webhook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/lib/webhook.ts"],"names":[],"mappings":"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"}
|