@linkforty/core 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/index.d.ts +4 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +13 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/database.d.ts.map +1 -1
  6. package/dist/lib/database.js +154 -0
  7. package/dist/lib/database.js.map +1 -1
  8. package/dist/lib/event-emitter.d.ts +46 -0
  9. package/dist/lib/event-emitter.d.ts.map +1 -0
  10. package/dist/lib/event-emitter.js +29 -0
  11. package/dist/lib/event-emitter.js.map +1 -0
  12. package/dist/lib/fingerprint.d.ts +64 -0
  13. package/dist/lib/fingerprint.d.ts.map +1 -0
  14. package/dist/lib/fingerprint.js +387 -0
  15. package/dist/lib/fingerprint.js.map +1 -0
  16. package/dist/lib/utils.d.ts +1 -0
  17. package/dist/lib/utils.d.ts.map +1 -1
  18. package/dist/lib/utils.js +1 -0
  19. package/dist/lib/utils.js.map +1 -1
  20. package/dist/lib/webhook.d.ts +18 -0
  21. package/dist/lib/webhook.d.ts.map +1 -0
  22. package/dist/lib/webhook.js +150 -0
  23. package/dist/lib/webhook.js.map +1 -0
  24. package/dist/routes/debug.d.ts +7 -0
  25. package/dist/routes/debug.d.ts.map +1 -0
  26. package/dist/routes/debug.js +321 -0
  27. package/dist/routes/debug.js.map +1 -0
  28. package/dist/routes/index.d.ts +5 -0
  29. package/dist/routes/index.d.ts.map +1 -1
  30. package/dist/routes/index.js +11 -1
  31. package/dist/routes/index.js.map +1 -1
  32. package/dist/routes/links.d.ts.map +1 -1
  33. package/dist/routes/links.js +21 -3
  34. package/dist/routes/links.js.map +1 -1
  35. package/dist/routes/preview.d.ts +3 -0
  36. package/dist/routes/preview.d.ts.map +1 -0
  37. package/dist/routes/preview.js +225 -0
  38. package/dist/routes/preview.js.map +1 -0
  39. package/dist/routes/qr.d.ts +6 -0
  40. package/dist/routes/qr.d.ts.map +1 -0
  41. package/dist/routes/qr.js +136 -0
  42. package/dist/routes/qr.js.map +1 -0
  43. package/dist/routes/redirect.d.ts.map +1 -1
  44. package/dist/routes/redirect.js +167 -11
  45. package/dist/routes/redirect.js.map +1 -1
  46. package/dist/routes/sdk.d.ts +7 -0
  47. package/dist/routes/sdk.d.ts.map +1 -0
  48. package/dist/routes/sdk.js +265 -0
  49. package/dist/routes/sdk.js.map +1 -0
  50. package/dist/routes/webhooks.d.ts +3 -0
  51. package/dist/routes/webhooks.d.ts.map +1 -0
  52. package/dist/routes/webhooks.js +212 -0
  53. package/dist/routes/webhooks.js.map +1 -0
  54. package/dist/types/index.d.ts +81 -0
  55. package/dist/types/index.d.ts.map +1 -1
  56. package/package.json +11 -7
package/dist/index.d.ts CHANGED
@@ -13,6 +13,9 @@ export interface ServerOptions {
13
13
  export declare function createServer(options?: ServerOptions): Promise<FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>>;
14
14
  export * from './lib/utils.js';
15
15
  export * from './lib/database.js';
16
+ export * from './lib/fingerprint.js';
17
+ export * from './lib/webhook.js';
18
+ export * from './lib/event-emitter.js';
16
19
  export * from './types/index.js';
17
- export { redirectRoutes, linkRoutes, analyticsRoutes } from './routes/index.js';
20
+ export { redirectRoutes, linkRoutes, analyticsRoutes, sdkRoutes, webhookRoutes, qrRoutes, previewRoutes, debugRoutes } from './routes/index.js';
18
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGnD,OAAO,EAAsB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKxE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC3B,CAAC;IACF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,aAAkB,kTA0B7D;AAGD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGnD,OAAO,EAAsB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOxE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC3B,CAAC;IACF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,aAAkB,kTA4B7D;AAGD,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/index.js CHANGED
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.analyticsRoutes = exports.linkRoutes = exports.redirectRoutes = void 0;
20
+ exports.debugRoutes = exports.previewRoutes = exports.qrRoutes = exports.webhookRoutes = exports.sdkRoutes = exports.analyticsRoutes = exports.linkRoutes = exports.redirectRoutes = void 0;
21
21
  exports.createServer = createServer;
22
22
  const fastify_1 = __importDefault(require("fastify"));
23
23
  const cors_1 = __importDefault(require("@fastify/cors"));
@@ -26,6 +26,8 @@ const database_js_1 = require("./lib/database.js");
26
26
  const redirect_js_1 = require("./routes/redirect.js");
27
27
  const links_js_1 = require("./routes/links.js");
28
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");
29
31
  async function createServer(options = {}) {
30
32
  const fastify = (0, fastify_1.default)({
31
33
  logger: options.logger !== undefined ? options.logger : true,
@@ -46,14 +48,24 @@ async function createServer(options = {}) {
46
48
  await fastify.register(redirect_js_1.redirectRoutes);
47
49
  await fastify.register(links_js_1.linkRoutes);
48
50
  await fastify.register(analytics_js_1.analyticsRoutes);
51
+ await fastify.register(sdk_js_1.sdkRoutes);
52
+ await fastify.register(webhooks_js_1.webhookRoutes);
49
53
  return fastify;
50
54
  }
51
55
  // Re-export utilities and types
52
56
  __exportStar(require("./lib/utils.js"), exports);
53
57
  __exportStar(require("./lib/database.js"), exports);
58
+ __exportStar(require("./lib/fingerprint.js"), exports);
59
+ __exportStar(require("./lib/webhook.js"), exports);
60
+ __exportStar(require("./lib/event-emitter.js"), exports);
54
61
  __exportStar(require("./types/index.js"), exports);
55
62
  var index_js_1 = require("./routes/index.js");
56
63
  Object.defineProperty(exports, "redirectRoutes", { enumerable: true, get: function () { return index_js_1.redirectRoutes; } });
57
64
  Object.defineProperty(exports, "linkRoutes", { enumerable: true, get: function () { return index_js_1.linkRoutes; } });
58
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; } });
59
71
  //# 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":";;;;;;;;;;;;;;;;;;;;AAmBA,oCA0BC;AA7CD,sDAAmD;AACnD,yDAAiC;AACjC,2DAAmC;AACnC,mDAAwE;AACxE,sDAAsD;AACtD,gDAA+C;AAC/C,wDAAwD;AAajD,KAAK,UAAU,YAAY,CAAC,UAAyB,EAAE;IAC5D,MAAM,OAAO,GAAG,IAAA,iBAAO,EAAC;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,cAAI,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,eAAK,EAAE;YAC5B,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG;SACvB,CAAC,CAAC;IACL,CAAC;IAED,WAAW;IACX,MAAM,IAAA,gCAAkB,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE3C,SAAS;IACT,MAAM,OAAO,CAAC,QAAQ,CAAC,4BAAc,CAAC,CAAC;IACvC,MAAM,OAAO,CAAC,QAAQ,CAAC,qBAAU,CAAC,CAAC;IACnC,MAAM,OAAO,CAAC,QAAQ,CAAC,8BAAe,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gCAAgC;AAChC,iDAA+B;AAC/B,oDAAkC;AAClC,mDAAiC;AACjC,8CAAgF;AAAvE,0GAAA,cAAc,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,2GAAA,eAAe,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAqBA,oCA4BC;AAjDD,sDAAmD;AACnD,yDAAiC;AACjC,2DAAmC;AACnC,mDAAwE;AACxE,sDAAsD;AACtD,gDAA+C;AAC/C,wDAAwD;AACxD,4CAA4C;AAC5C,sDAAqD;AAa9C,KAAK,UAAU,YAAY,CAAC,UAAyB,EAAE;IAC5D,MAAM,OAAO,GAAG,IAAA,iBAAO,EAAC;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,cAAI,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,eAAK,EAAE;YAC5B,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG;SACvB,CAAC,CAAC;IACL,CAAC;IAED,WAAW;IACX,MAAM,IAAA,gCAAkB,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE3C,SAAS;IACT,MAAM,OAAO,CAAC,QAAQ,CAAC,4BAAc,CAAC,CAAC;IACvC,MAAM,OAAO,CAAC,QAAQ,CAAC,qBAAU,CAAC,CAAC;IACnC,MAAM,OAAO,CAAC,QAAQ,CAAC,8BAAe,CAAC,CAAC;IACxC,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAS,CAAC,CAAC;IAClC,MAAM,OAAO,CAAC,QAAQ,CAAC,2BAAa,CAAC,CAAC;IAEtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gCAAgC;AAChC,iDAA+B;AAC/B,oDAAkC;AAClC,uDAAqC;AACrC,mDAAiC;AACjC,yDAAuC;AACvC,mDAAiC;AACjC,8CAAgJ;AAAvI,0GAAA,cAAc,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,uGAAA,WAAW,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/lib/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAIpB,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,eAAO,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;AA6BvB,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,eAAoB,iBAoFrE"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/lib/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAIpB,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,eAAO,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;AA6BvB,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,eAAoB,iBA2PrE"}
@@ -63,6 +63,7 @@ async function initializeDatabase(options = {}) {
63
63
  short_code VARCHAR(20) UNIQUE NOT NULL,
64
64
  original_url TEXT NOT NULL,
65
65
  title VARCHAR(255),
66
+ description TEXT,
66
67
  ios_url TEXT,
67
68
  android_url TEXT,
68
69
  web_fallback_url TEXT,
@@ -96,6 +97,145 @@ async function initializeDatabase(options = {}) {
96
97
  utm_campaign VARCHAR(255),
97
98
  referrer TEXT
98
99
  )
100
+ `);
101
+ // Device fingerprints table - stores individual fingerprint components for probabilistic matching
102
+ await client.query(`
103
+ CREATE TABLE IF NOT EXISTS device_fingerprints (
104
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
105
+ click_id UUID NOT NULL REFERENCES click_events(id) ON DELETE CASCADE,
106
+ fingerprint_hash VARCHAR(64) NOT NULL,
107
+ ip_address INET,
108
+ user_agent TEXT,
109
+ timezone VARCHAR(100),
110
+ language VARCHAR(10),
111
+ screen_width INTEGER,
112
+ screen_height INTEGER,
113
+ platform VARCHAR(50),
114
+ platform_version VARCHAR(50),
115
+ created_at TIMESTAMP DEFAULT NOW()
116
+ )
117
+ `);
118
+ // Install events table - tracks app installations and matches to clicks via fingerprinting
119
+ await client.query(`
120
+ CREATE TABLE IF NOT EXISTS install_events (
121
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
122
+ link_id UUID REFERENCES links(id) ON DELETE SET NULL,
123
+ click_id UUID REFERENCES click_events(id) ON DELETE SET NULL,
124
+ fingerprint_hash VARCHAR(64) NOT NULL,
125
+ confidence_score DECIMAL(5, 2),
126
+ installed_at TIMESTAMP DEFAULT NOW(),
127
+ first_open_at TIMESTAMP,
128
+ deep_link_retrieved BOOLEAN DEFAULT false,
129
+ deep_link_data JSONB DEFAULT '{}',
130
+ attribution_window_hours INTEGER DEFAULT 168,
131
+ ip_address INET,
132
+ user_agent TEXT,
133
+ timezone VARCHAR(100),
134
+ language VARCHAR(10),
135
+ screen_width INTEGER,
136
+ screen_height INTEGER,
137
+ platform VARCHAR(50),
138
+ platform_version VARCHAR(50),
139
+ device_id VARCHAR(255),
140
+ created_at TIMESTAMP DEFAULT NOW()
141
+ )
142
+ `);
143
+ // In-app events table - tracks conversion events from mobile apps
144
+ await client.query(`
145
+ CREATE TABLE IF NOT EXISTS in_app_events (
146
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
147
+ install_id UUID NOT NULL REFERENCES install_events(id) ON DELETE CASCADE,
148
+ event_name VARCHAR(255) NOT NULL,
149
+ event_data JSONB DEFAULT '{}',
150
+ event_timestamp TIMESTAMP NOT NULL,
151
+ created_at TIMESTAMP DEFAULT NOW()
152
+ )
153
+ `);
154
+ // Webhooks table - stores webhook configurations for event postbacks
155
+ await client.query(`
156
+ CREATE TABLE IF NOT EXISTS webhooks (
157
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
158
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
159
+ name VARCHAR(255) NOT NULL,
160
+ url TEXT NOT NULL,
161
+ secret VARCHAR(255) NOT NULL,
162
+ events TEXT[] NOT NULL DEFAULT '{}',
163
+ is_active BOOLEAN DEFAULT true,
164
+ retry_count INTEGER DEFAULT 3,
165
+ timeout_ms INTEGER DEFAULT 10000,
166
+ headers JSONB DEFAULT '{}',
167
+ created_at TIMESTAMP DEFAULT NOW(),
168
+ updated_at TIMESTAMP DEFAULT NOW()
169
+ )
170
+ `);
171
+ // Add description column to existing links table if it doesn't exist
172
+ await client.query(`
173
+ DO $$
174
+ BEGIN
175
+ IF NOT EXISTS (
176
+ SELECT 1 FROM information_schema.columns
177
+ WHERE table_name='links' AND column_name='description'
178
+ ) THEN
179
+ ALTER TABLE links ADD COLUMN description TEXT;
180
+ END IF;
181
+ END $$;
182
+ `);
183
+ // Add Open Graph (OG) tag columns for social media previews
184
+ await client.query(`
185
+ DO $$
186
+ BEGIN
187
+ IF NOT EXISTS (
188
+ SELECT 1 FROM information_schema.columns
189
+ WHERE table_name='links' AND column_name='og_title'
190
+ ) THEN
191
+ ALTER TABLE links ADD COLUMN og_title VARCHAR(255);
192
+ END IF;
193
+ END $$;
194
+ `);
195
+ await client.query(`
196
+ DO $$
197
+ BEGIN
198
+ IF NOT EXISTS (
199
+ SELECT 1 FROM information_schema.columns
200
+ WHERE table_name='links' AND column_name='og_description'
201
+ ) THEN
202
+ ALTER TABLE links ADD COLUMN og_description TEXT;
203
+ END IF;
204
+ END $$;
205
+ `);
206
+ await client.query(`
207
+ DO $$
208
+ BEGIN
209
+ IF NOT EXISTS (
210
+ SELECT 1 FROM information_schema.columns
211
+ WHERE table_name='links' AND column_name='og_image_url'
212
+ ) THEN
213
+ ALTER TABLE links ADD COLUMN og_image_url TEXT;
214
+ END IF;
215
+ END $$;
216
+ `);
217
+ await client.query(`
218
+ DO $$
219
+ BEGIN
220
+ IF NOT EXISTS (
221
+ SELECT 1 FROM information_schema.columns
222
+ WHERE table_name='links' AND column_name='og_type'
223
+ ) THEN
224
+ ALTER TABLE links ADD COLUMN og_type VARCHAR(50) DEFAULT 'website';
225
+ END IF;
226
+ END $$;
227
+ `);
228
+ // Add attribution window column for configurable install attribution windows
229
+ await client.query(`
230
+ DO $$
231
+ BEGIN
232
+ IF NOT EXISTS (
233
+ SELECT 1 FROM information_schema.columns
234
+ WHERE table_name='links' AND column_name='attribution_window_hours'
235
+ ) THEN
236
+ ALTER TABLE links ADD COLUMN attribution_window_hours INTEGER DEFAULT 168;
237
+ END IF;
238
+ END $$;
99
239
  `);
100
240
  // Create indexes for performance
101
241
  await client.query('CREATE UNIQUE INDEX IF NOT EXISTS idx_links_short_code ON links(short_code)');
@@ -105,6 +245,20 @@ async function initializeDatabase(options = {}) {
105
245
  await client.query('CREATE INDEX IF NOT EXISTS idx_clicks_timestamp ON click_events(clicked_at DESC)');
106
246
  await client.query('CREATE INDEX IF NOT EXISTS idx_clicks_link_date ON click_events(link_id, clicked_at DESC)');
107
247
  await client.query('CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)');
248
+ // Indexes for deferred deep linking
249
+ await client.query('CREATE INDEX IF NOT EXISTS idx_fingerprints_hash ON device_fingerprints(fingerprint_hash)');
250
+ await client.query('CREATE INDEX IF NOT EXISTS idx_fingerprints_click_id ON device_fingerprints(click_id)');
251
+ await client.query('CREATE INDEX IF NOT EXISTS idx_installs_fingerprint ON install_events(fingerprint_hash)');
252
+ await client.query('CREATE INDEX IF NOT EXISTS idx_installs_link_id ON install_events(link_id)');
253
+ await client.query('CREATE INDEX IF NOT EXISTS idx_installs_timestamp ON install_events(installed_at DESC)');
254
+ await client.query('CREATE INDEX IF NOT EXISTS idx_installs_link_date ON install_events(link_id, installed_at DESC)');
255
+ // Indexes for webhooks
256
+ await client.query('CREATE INDEX IF NOT EXISTS idx_webhooks_user_id ON webhooks(user_id)');
257
+ await client.query('CREATE INDEX IF NOT EXISTS idx_webhooks_active ON webhooks(is_active) WHERE is_active = true');
258
+ // Indexes for in-app events
259
+ await client.query('CREATE INDEX IF NOT EXISTS idx_in_app_events_install_id ON in_app_events(install_id)');
260
+ await client.query('CREATE INDEX IF NOT EXISTS idx_in_app_events_name ON in_app_events(event_name)');
261
+ await client.query('CREATE INDEX IF NOT EXISTS idx_in_app_events_timestamp ON in_app_events(event_timestamp DESC)');
108
262
  console.log('Database schema initialized successfully');
109
263
  }
110
264
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/lib/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/lib/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { EventEmitter } from 'events';
2
+ /**
3
+ * Global event emitter for real-time events
4
+ * Used for broadcasting click events to WebSocket clients
5
+ */
6
+ export declare const clickEventEmitter: EventEmitter<[never]>;
7
+ /**
8
+ * Click event data structure for real-time streaming
9
+ */
10
+ export interface ClickEventData {
11
+ eventId: string;
12
+ timestamp: string;
13
+ linkId: string;
14
+ shortCode: string;
15
+ userId: string;
16
+ organizationId?: string;
17
+ ipAddress: string;
18
+ userAgent: string;
19
+ country?: string;
20
+ city?: string;
21
+ deviceType: 'ios' | 'android' | 'web';
22
+ platform?: string;
23
+ browser?: string;
24
+ redirectUrl: string;
25
+ redirectReason: string;
26
+ targetingMatched: boolean;
27
+ utmParameters?: {
28
+ source?: string;
29
+ medium?: string;
30
+ campaign?: string;
31
+ term?: string;
32
+ content?: string;
33
+ };
34
+ referer?: string;
35
+ language?: string;
36
+ }
37
+ /**
38
+ * Emit a click event for real-time streaming
39
+ */
40
+ export declare function emitClickEvent(eventData: ClickEventData): void;
41
+ /**
42
+ * Subscribe to click events
43
+ * Returns unsubscribe function
44
+ */
45
+ export declare function subscribeToClickEvents(callback: (eventData: ClickEventData) => void): () => void;
46
+ //# sourceMappingURL=event-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/lib/event-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,uBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,UAAU,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAG1B,aAAa,CAAC,EAAE;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAGF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,cAAc,QAEvD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,GAC5C,MAAM,IAAI,CAOZ"}
@@ -0,0 +1,29 @@
1
+ "use strict";
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");
7
+ /**
8
+ * Global event emitter for real-time events
9
+ * Used for broadcasting click events to WebSocket clients
10
+ */
11
+ exports.clickEventEmitter = new events_1.EventEmitter();
12
+ /**
13
+ * Emit a click event for real-time streaming
14
+ */
15
+ function emitClickEvent(eventData) {
16
+ exports.clickEventEmitter.emit('click', eventData);
17
+ }
18
+ /**
19
+ * Subscribe to click events
20
+ * Returns unsubscribe function
21
+ */
22
+ function subscribeToClickEvents(callback) {
23
+ exports.clickEventEmitter.on('click', callback);
24
+ // Return unsubscribe function
25
+ return () => {
26
+ exports.clickEventEmitter.off('click', callback);
27
+ };
28
+ }
29
+ //# sourceMappingURL=event-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../src/lib/event-emitter.ts"],"names":[],"mappings":";;;AAoDA,wCAEC;AAMD,wDASC;AArED,mCAAsC;AAEtC;;;GAGG;AACU,QAAA,iBAAiB,GAAG,IAAI,qBAAY,EAAE,CAAC;AA2CpD;;GAEG;AACH,SAAgB,cAAc,CAAC,SAAyB;IACtD,yBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CACpC,QAA6C;IAE7C,yBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAExC,8BAA8B;IAC9B,OAAO,GAAG,EAAE;QACV,yBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Device fingerprint data structure
3
+ */
4
+ export interface FingerprintData {
5
+ ipAddress: string;
6
+ userAgent: string;
7
+ timezone?: string;
8
+ language?: string;
9
+ screenWidth?: number;
10
+ screenHeight?: number;
11
+ platform?: string;
12
+ platformVersion?: string;
13
+ }
14
+ /**
15
+ * Fingerprint match result with confidence scoring
16
+ */
17
+ export interface FingerprintMatch {
18
+ clickId: string;
19
+ linkId: string;
20
+ confidenceScore: number;
21
+ matchedFactors: string[];
22
+ clickedAt: Date;
23
+ }
24
+ /**
25
+ * Default attribution window in hours (7 days)
26
+ */
27
+ export declare const DEFAULT_ATTRIBUTION_WINDOW_HOURS = 168;
28
+ /**
29
+ * Minimum confidence threshold for attribution (70%)
30
+ */
31
+ export declare const CONFIDENCE_THRESHOLD = 70;
32
+ /**
33
+ * Generate a fingerprint hash from device data
34
+ * Uses SHA-256 hash of concatenated device attributes
35
+ */
36
+ export declare function generateFingerprintHash(data: FingerprintData): string;
37
+ /**
38
+ * Calculate confidence score by comparing two fingerprints
39
+ * Returns a score from 0-100 based on matched components
40
+ */
41
+ export declare function calculateConfidenceScore(fingerprint1: FingerprintData, fingerprint2: FingerprintData): {
42
+ score: number;
43
+ matchedFactors: string[];
44
+ };
45
+ /**
46
+ * Match an install event to potential click events via probabilistic fingerprinting
47
+ * Returns the best match above confidence threshold within attribution window
48
+ *
49
+ * Note: Uses link-specific attribution windows - each link can have its own window
50
+ */
51
+ export declare function matchInstallToClick(installFingerprint: FingerprintData, attributionWindowHours?: number): Promise<FingerprintMatch | null>;
52
+ /**
53
+ * Store device fingerprint for a click event
54
+ */
55
+ export declare function storeFingerprintForClick(clickId: string, fingerprintData: FingerprintData): Promise<void>;
56
+ /**
57
+ * Record an install event and attempt to match it to a click
58
+ */
59
+ export declare function recordInstallEvent(fingerprintData: FingerprintData, deviceId?: string, attributionWindowHours?: number): Promise<{
60
+ installId: string;
61
+ match: FingerprintMatch | null;
62
+ deepLinkData: any;
63
+ }>;
64
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/lib/fingerprint.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;CACjB;AAcD;;GAEG;AACH,eAAO,MAAM,gCAAgC,MAAM,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAcrE;AA0CD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,eAAe,EAC7B,YAAY,EAAE,eAAe,GAC5B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CA+D7C;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,kBAAkB,EAAE,eAAe,EACnC,sBAAsB,GAAE,MAAyC,GAChE,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAgFlC;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,eAAe,EAAE,eAAe,EAChC,QAAQ,CAAC,EAAE,MAAM,EACjB,sBAAsB,GAAE,MAAyC,GAChE,OAAO,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,GAAG,CAAC;CACnB,CAAC,CA8ID"}