cdp-edge 1.25.0 → 1.26.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdp-edge",
3
- "version": "1.25.0",
3
+ "version": "1.26.0",
4
4
  "description": "CDP Edge - Quantum Tracking - Sistema multi-agente para tracking digital Cloudflare Native (Workers + D1)",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -282,7 +282,9 @@ export default {
282
282
  }
283
283
 
284
284
  // ── Sanitização e Validação de Campos String ──────────────────────
285
- const SANITIZE_FIELDS = {
285
+ type SanitizeResult = { error?: string; sanitized: string | null };
286
+
287
+ const SANITIZE_FIELDS: Record<string, (val: string) => SanitizeResult> = {
286
288
  email: (val: string) => {
287
289
  if (!isValidEmail(val)) return { error: 'email inválido (formato incorreto)' };
288
290
  return { sanitized: val.toLowerCase().trim() };
@@ -342,8 +344,9 @@ export default {
342
344
  }
343
345
 
344
346
  // Sanitiza campos de string restantes
345
- const STR_FIELDS = ['transactionId', 'fbclid', 'ttclid', 'gclid'];
346
- for (const field of STR_FIELDS) {
347
+ const TRACKING_ID_FIELDS = ['transactionId', 'fbclid', 'ttclid', 'gclid'];
348
+
349
+ for (const field of TRACKING_ID_FIELDS) {
347
350
  const value = trackPayload[field as keyof TrackPayload];
348
351
  if (value !== undefined && value !== null) {
349
352
  if (typeof value !== 'string') {
@@ -62,6 +62,11 @@ export async function sendGA4Mp(env: Env, ga4EventName: string, payload: TrackPa
62
62
  ctx.waitUntil(logApiFailure(env.DB, 'ga4', ga4EventName, 'FETCH_ERROR', err?.message || String(err), '', JSON.stringify(body)));
63
63
  }
64
64
 
65
+ if (env.RETRY_QUEUE) {
66
+ const send = env.RETRY_QUEUE.send({ eventType: ga4EventName, payload, platform: 'ga4' });
67
+ if (ctx) ctx.waitUntil(send); else send.catch(() => {});
68
+ }
69
+
65
70
  return { error: err?.message || String(err) };
66
71
  }
67
72
  }
@@ -133,6 +133,11 @@ export async function sendMetaCapi(env: Env, eventName: string, payload: TrackPa
133
133
  ctx.waitUntil(logApiFailure(env.DB, 'meta', eventName, 'FETCH_ERROR', err?.message || String(err), eventPayload.event_id, JSON.stringify(requestBody)));
134
134
  }
135
135
 
136
+ if (env.RETRY_QUEUE) {
137
+ const send = env.RETRY_QUEUE.send({ eventType: eventName, payload, platform: 'meta' });
138
+ if (ctx) ctx.waitUntil(send); else send.catch(() => {});
139
+ }
140
+
136
141
  return { error: err?.message || String(err) };
137
142
  }
138
143
  }
@@ -97,6 +97,11 @@ export async function sendTikTokApi(env: Env, eventName: string, payload: TrackP
97
97
  ctx.waitUntil(logApiFailure(env.DB, 'tiktok', eventName, 'FETCH_ERROR', err?.message || String(err), '', JSON.stringify(body)));
98
98
  }
99
99
 
100
+ if (env.RETRY_QUEUE) {
101
+ const send = env.RETRY_QUEUE.send({ eventType: eventName, payload, platform: 'tiktok' });
102
+ if (ctx) ctx.waitUntil(send); else send.catch(() => {});
103
+ }
104
+
100
105
  return { error: err?.message || String(err) };
101
106
  }
102
107
  }
@@ -3,7 +3,7 @@
3
3
  * Tipos para o Cloudflare Worker e bindings
4
4
  */
5
5
 
6
- import { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types';
6
+ import { D1Database, KVNamespace, Queue, R2Bucket } from '@cloudflare/workers-types';
7
7
 
8
8
  // ── Environment Bindings ─────────────────────────────────────────────────────
9
9
  export interface Env {
@@ -22,6 +22,9 @@ export interface Env {
22
22
  // Rate Limiter
23
23
  RATE_LIMITER?: any;
24
24
 
25
+ // Queue — Retry de eventos com falha de rede
26
+ RETRY_QUEUE?: Queue<QueueMessage>;
27
+
25
28
  // Public Variables
26
29
  META_PIXEL_ID?: string;
27
30
  GA4_MEASUREMENT_ID?: string;