@reachy/audience-module 1.0.16 → 1.0.18

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.
@@ -0,0 +1,335 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RfmEngine = void 0;
4
+ const DAY_MS = 24 * 60 * 60 * 1000;
5
+ const SEGMENTS_REF = [
6
+ { segment_key: 'cannot_lose_them', segment_name: 'Cannot Lose Them', segment_order: 1 },
7
+ { segment_key: 'at_risk', segment_name: 'At Risk', segment_order: 2 },
8
+ { segment_key: 'hibernating', segment_name: 'Hibernating', segment_order: 3 },
9
+ { segment_key: 'about_to_sleep', segment_name: 'About to Sleep', segment_order: 4 },
10
+ { segment_key: 'needing_attention', segment_name: 'Needing Attention', segment_order: 5 },
11
+ { segment_key: 'promising', segment_name: 'Promising', segment_order: 6 },
12
+ { segment_key: 'new_users', segment_name: 'New Users', segment_order: 7 },
13
+ { segment_key: 'potential_loyalists', segment_name: 'Potential Loyalists', segment_order: 8 },
14
+ { segment_key: 'loyal_users', segment_name: 'Loyal Users', segment_order: 9 },
15
+ { segment_key: 'champions', segment_name: 'Champions', segment_order: 10 },
16
+ ];
17
+ function toDate(input) {
18
+ if (input instanceof Date)
19
+ return input;
20
+ const d = new Date(String(input || ''));
21
+ if (Number.isNaN(d.getTime()))
22
+ throw new Error(`Data inválida: ${String(input)}`);
23
+ return d;
24
+ }
25
+ function utcDay(d) {
26
+ return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), 0, 0, 0, 0));
27
+ }
28
+ function recencyDays(to, last) {
29
+ const a = utcDay(to).getTime();
30
+ const b = utcDay(last).getTime();
31
+ return Math.max(0, Math.floor((a - b) / DAY_MS));
32
+ }
33
+ function normalizeSet(ids) {
34
+ if (!ids)
35
+ return null;
36
+ if (ids instanceof Set)
37
+ return new Set(Array.from(ids).map((s) => String(s)));
38
+ return new Set((ids || []).map((s) => String(s)));
39
+ }
40
+ function percentileDisc(values, p) {
41
+ const n = values.length;
42
+ if (n <= 0)
43
+ return Number.NaN;
44
+ const pp = Math.max(0, Math.min(1, p));
45
+ const k = Math.ceil(pp * n);
46
+ const idx = Math.min(n - 1, Math.max(0, k - 1));
47
+ return values[idx];
48
+ }
49
+ function percentileDiscCuts(valuesRaw) {
50
+ const values = [...valuesRaw].sort((a, b) => a - b);
51
+ return [
52
+ percentileDisc(values, 0.2),
53
+ percentileDisc(values, 0.4),
54
+ percentileDisc(values, 0.6),
55
+ percentileDisc(values, 0.8),
56
+ ];
57
+ }
58
+ function scoreRecency(days, cuts) {
59
+ if (days <= cuts[0])
60
+ return 5;
61
+ if (days <= cuts[1])
62
+ return 4;
63
+ if (days <= cuts[2])
64
+ return 3;
65
+ if (days <= cuts[3])
66
+ return 2;
67
+ return 1;
68
+ }
69
+ function scoreFrequency(count, cuts) {
70
+ if (count <= cuts[0])
71
+ return 1;
72
+ if (count <= cuts[1])
73
+ return 2;
74
+ if (count <= cuts[2])
75
+ return 3;
76
+ if (count <= cuts[3])
77
+ return 4;
78
+ return 5;
79
+ }
80
+ function computeSegmentKey(r, f) {
81
+ if (r >= 4 && f >= 4)
82
+ return 'champions';
83
+ if (r === 3 && f >= 4)
84
+ return 'loyal_users';
85
+ if (r >= 4 && f >= 2 && f <= 3)
86
+ return 'potential_loyalists';
87
+ if (r === 5 && f === 1)
88
+ return 'new_users';
89
+ if (r === 4 && f === 1)
90
+ return 'promising';
91
+ if (r === 3 && f === 3)
92
+ return 'needing_attention';
93
+ if (r === 3 && f <= 2)
94
+ return 'about_to_sleep';
95
+ if (r <= 2 && f === 5)
96
+ return 'cannot_lose_them';
97
+ if (r <= 2 && f >= 3 && f <= 4)
98
+ return 'at_risk';
99
+ return 'hibernating';
100
+ }
101
+ function channelsArray(prefs) {
102
+ const ch = prefs && typeof prefs === 'object' ? prefs?.channels : undefined;
103
+ return Array.isArray(ch) ? ch : [];
104
+ }
105
+ function hasChannel(prefs, channel) {
106
+ const arr = channelsArray(prefs);
107
+ return arr.some((c) => String(c?.channel || '').trim().toLowerCase() === channel);
108
+ }
109
+ function isChannelSubscribed(prefs, channel) {
110
+ const arr = channelsArray(prefs);
111
+ return arr.some((c) => {
112
+ if (String(c?.channel || '').trim().toLowerCase() !== channel)
113
+ return false;
114
+ const sub = c?.subscribed;
115
+ return String(sub ?? 'false').trim().toLowerCase() === 'true';
116
+ });
117
+ }
118
+ function reachableBy(prefs, channel) {
119
+ const rb = prefs && typeof prefs === 'object' ? prefs?.reachable_by : undefined;
120
+ const raw = rb && typeof rb === 'object' ? rb?.[channel] : undefined;
121
+ return String(raw ?? '').trim().toLowerCase() === 'true';
122
+ }
123
+ function emailOk(contact) {
124
+ const prefs = contact.communication_preferences || {};
125
+ if (contact.is_subscribed === false)
126
+ return 0;
127
+ if (hasChannel(prefs, 'email'))
128
+ return isChannelSubscribed(prefs, 'email') ? 1 : 0;
129
+ if (reachableBy(prefs, 'email'))
130
+ return 1;
131
+ const email = contact.email ? String(contact.email).trim() : '';
132
+ return email ? 1 : 0;
133
+ }
134
+ function smsOk(contact) {
135
+ const prefs = contact.communication_preferences || {};
136
+ if (contact.is_subscribed === false)
137
+ return 0;
138
+ if (hasChannel(prefs, 'sms'))
139
+ return isChannelSubscribed(prefs, 'sms') ? 1 : 0;
140
+ if (reachableBy(prefs, 'sms'))
141
+ return 1;
142
+ const phone = contact.phone ? String(contact.phone).trim() : '';
143
+ return phone ? 1 : 0;
144
+ }
145
+ class RfmEngine {
146
+ static aggregateFromEvents(contacts, events, opts) {
147
+ const from = toDate(opts.from).getTime();
148
+ const to = toDate(opts.to).getTime();
149
+ const evName = String(opts.rfEventName || '').trim();
150
+ const filterSet = normalizeSet(opts.filterContactIds);
151
+ const contactById = new Map();
152
+ const reachyToContactId = new Map();
153
+ for (const c of contacts || []) {
154
+ const cid = c?.id ? String(c.id).trim() : '';
155
+ if (cid)
156
+ contactById.set(cid, c);
157
+ const rid = c?.reachy_id ? String(c.reachy_id).trim() : '';
158
+ if (rid && cid && !reachyToContactId.has(rid))
159
+ reachyToContactId.set(rid, cid);
160
+ }
161
+ const acc = new Map();
162
+ for (const e of events || []) {
163
+ const name = e?.event_name != null ? String(e.event_name) : '';
164
+ if (evName && name !== evName)
165
+ continue;
166
+ const ts = toDate(e.event_timestamp).getTime();
167
+ if (ts < from || ts > to)
168
+ continue;
169
+ const rawCid = e?.contact_id ? String(e.contact_id).trim() : '';
170
+ const rawRid = e?.reachy_id ? String(e.reachy_id).trim() : '';
171
+ if (!rawCid && !rawRid)
172
+ continue;
173
+ const mappedCid = (() => {
174
+ if (rawCid && contactById.has(rawCid))
175
+ return rawCid;
176
+ if (rawRid) {
177
+ const mapped = reachyToContactId.get(rawRid);
178
+ if (mapped && contactById.has(mapped))
179
+ return mapped;
180
+ }
181
+ return '';
182
+ })();
183
+ if (!mappedCid)
184
+ continue;
185
+ if (filterSet && !filterSet.has(mappedCid))
186
+ continue;
187
+ const cur = acc.get(mappedCid);
188
+ if (!cur) {
189
+ acc.set(mappedCid, { last: ts, count: 1 });
190
+ }
191
+ else {
192
+ cur.count += 1;
193
+ if (ts > cur.last)
194
+ cur.last = ts;
195
+ }
196
+ }
197
+ const out = [];
198
+ acc.forEach((v, contactId) => {
199
+ out.push({
200
+ contact_id: contactId,
201
+ last_ts: new Date(v.last),
202
+ event_count: Math.max(0, Math.trunc(v.count)),
203
+ });
204
+ });
205
+ return out;
206
+ }
207
+ static scoreAggregates(contacts, aggregates, opts) {
208
+ const to = toDate(opts.to);
209
+ const contactById = new Map();
210
+ for (const c of contacts || []) {
211
+ const cid = c?.id ? String(c.id).trim() : '';
212
+ if (cid)
213
+ contactById.set(cid, c);
214
+ }
215
+ const rows = [];
216
+ const recencyValues = [];
217
+ const freqValues = [];
218
+ for (const a of aggregates || []) {
219
+ const cid = a?.contact_id ? String(a.contact_id).trim() : '';
220
+ if (!cid)
221
+ continue;
222
+ if (!contactById.has(cid))
223
+ continue;
224
+ const days = recencyDays(to, a.last_ts);
225
+ rows.push({ agg: a, days });
226
+ recencyValues.push(days);
227
+ freqValues.push(Math.max(0, Math.trunc(a.event_count)));
228
+ }
229
+ const rCuts = percentileDiscCuts(recencyValues);
230
+ const fCuts = percentileDiscCuts(freqValues);
231
+ const scored = [];
232
+ for (const r of rows) {
233
+ const c = contactById.get(r.agg.contact_id);
234
+ const rScore = scoreRecency(r.days, rCuts);
235
+ const fScore = scoreFrequency(Math.max(0, Math.trunc(r.agg.event_count)), fCuts);
236
+ scored.push({
237
+ contact_id: r.agg.contact_id,
238
+ last_ts: r.agg.last_ts,
239
+ event_count: Math.max(0, Math.trunc(r.agg.event_count)),
240
+ recency_days: r.days,
241
+ r_score: rScore,
242
+ f_score: fScore,
243
+ segment_key: computeSegmentKey(rScore, fScore),
244
+ email_ok: emailOk(c),
245
+ sms_ok: smsOk(c),
246
+ });
247
+ }
248
+ return { scored, r_days_cuts: rCuts, f_count_cuts: fCuts };
249
+ }
250
+ static thresholdsFromScored(scored) {
251
+ const rMin = new Map();
252
+ const rMax = new Map();
253
+ const fMin = new Map();
254
+ const fMax = new Map();
255
+ for (const s of scored || []) {
256
+ const rScore = s.r_score;
257
+ const fScore = s.f_score;
258
+ const rVal = Math.max(0, Math.trunc(s.recency_days));
259
+ const fVal = Math.max(0, Math.trunc(s.event_count));
260
+ const rMinPrev = rMin.get(rScore);
261
+ if (rMinPrev == null || rVal < rMinPrev)
262
+ rMin.set(rScore, rVal);
263
+ const rMaxPrev = rMax.get(rScore);
264
+ if (rMaxPrev == null || rVal > rMaxPrev)
265
+ rMax.set(rScore, rVal);
266
+ const fMinPrev = fMin.get(fScore);
267
+ if (fMinPrev == null || fVal < fMinPrev)
268
+ fMin.set(fScore, fVal);
269
+ const fMaxPrev = fMax.get(fScore);
270
+ if (fMaxPrev == null || fVal > fMaxPrev)
271
+ fMax.set(fScore, fVal);
272
+ }
273
+ const out = [];
274
+ const scores = [1, 2, 3, 4, 5];
275
+ for (const score of scores) {
276
+ if (rMin.has(score) && rMax.has(score)) {
277
+ out.push({
278
+ kind: 'r',
279
+ score,
280
+ min_value: rMin.get(score),
281
+ max_value: rMax.get(score),
282
+ });
283
+ }
284
+ }
285
+ for (const score of scores) {
286
+ if (fMin.has(score) && fMax.has(score)) {
287
+ out.push({
288
+ kind: 'f',
289
+ score,
290
+ min_value: fMin.get(score),
291
+ max_value: fMax.get(score),
292
+ });
293
+ }
294
+ }
295
+ out.sort((a, b) => (a.kind === b.kind ? a.score - b.score : a.kind.localeCompare(b.kind)));
296
+ return out;
297
+ }
298
+ static previewFromScored(scored) {
299
+ const totalUsers = scored.length;
300
+ const agg = new Map();
301
+ for (const s of scored || []) {
302
+ const key = String(s.segment_key || '').trim() || 'hibernating';
303
+ const cur = agg.get(key) || { users: 0, email_reachability: 0, sms_reachability: 0, segment_spend: 0 };
304
+ cur.users += 1;
305
+ cur.email_reachability += s.email_ok;
306
+ cur.sms_reachability += s.sms_ok;
307
+ agg.set(key, cur);
308
+ }
309
+ const out = [];
310
+ for (const seg of SEGMENTS_REF) {
311
+ const a = agg.get(seg.segment_key) || { users: 0, email_reachability: 0, sms_reachability: 0, segment_spend: 0 };
312
+ const percent = totalUsers > 0 ? Math.round((a.users * 10000) / totalUsers) / 100 : 0;
313
+ const avm = a.users > 0 ? 0 : 0;
314
+ out.push({
315
+ segment_key: seg.segment_key,
316
+ segment_name: seg.segment_name,
317
+ users: a.users,
318
+ percent,
319
+ avm,
320
+ email_reachability: a.email_reachability,
321
+ sms_reachability: a.sms_reachability,
322
+ });
323
+ }
324
+ return out;
325
+ }
326
+ static computeFromEvents(contacts, events, opts) {
327
+ const aggregates = this.aggregateFromEvents(contacts, events, opts);
328
+ const { scored } = this.scoreAggregates(contacts, aggregates, { to: opts.to });
329
+ const thresholds = this.thresholdsFromScored(scored);
330
+ const segments = this.previewFromScored(scored);
331
+ return { segments, thresholds, scored };
332
+ }
333
+ }
334
+ exports.RfmEngine = RfmEngine;
335
+ //# sourceMappingURL=RfmEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RfmEngine.js","sourceRoot":"","sources":["../../src/engine/RfmEngine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"V2AudienceEngine.d.ts","sourceRoot":"","sources":["../../src/engine/V2AudienceEngine.ts"],"names":[],"mappings":"AAGA,KAAK,MAAM,GAAG;IACZ,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC7B,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC9B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CAChC,CAAA;AAgRD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE;QAAE,cAAc,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAMvE,iCAAiC,CACrC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,GAAG,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAy4BjB,kCAAkC,CACtC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,GAAG,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;IAwqBnB,OAAO,CAAC,IAAI;CAIb"}
1
+ {"version":3,"file":"V2AudienceEngine.d.ts","sourceRoot":"","sources":["../../src/engine/V2AudienceEngine.ts"],"names":[],"mappings":"AAGA,KAAK,MAAM,GAAG;IACZ,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC7B,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC9B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CAChC,CAAA;AAgRD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE;QAAE,cAAc,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAMvE,iCAAiC,CACrC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,GAAG,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IA05BjB,kCAAkC,CACtC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,GAAG,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;IAwqBnB,OAAO,CAAC,IAAI;CAIb"}
@@ -351,11 +351,27 @@ class V2AudienceEngine {
351
351
  return new Set();
352
352
  }
353
353
  const typeId = String(criteria?.type || '');
354
- const { data: allContacts } = await this.supabase
354
+ const fetchAll = async (baseQuery, pageSize) => {
355
+ let offset = 0;
356
+ let out = [];
357
+ while (true) {
358
+ const { data, error } = await baseQuery.range(offset, offset + pageSize - 1);
359
+ if (error)
360
+ throw error;
361
+ if (!data || data.length === 0)
362
+ break;
363
+ out = out.concat(data);
364
+ if (data.length < pageSize)
365
+ break;
366
+ offset += pageSize;
367
+ }
368
+ return out;
369
+ };
370
+ const allContacts = await fetchAll(this.supabase
355
371
  .from('contacts')
356
372
  .select('id, reachy_id, email')
357
373
  .eq('organization_id', organizationId)
358
- .eq('project_id', projectId);
374
+ .eq('project_id', projectId), 1000);
359
375
  const allContactIds = new Set((allContacts || []).map((c) => c.id));
360
376
  const reachyIdToContactId = new Map();
361
377
  const contactIdToReachyId = new Map();
@@ -606,10 +622,10 @@ class V2AudienceEngine {
606
622
  if (this.debug)
607
623
  this.logger.warn('[AUDIENCE_MODULE_ENGINE] event attributes filter error');
608
624
  }
609
- const { data, error } = await query;
610
- if (error)
625
+ const data = await fetchAll(query, 500);
626
+ if (!data || data.length === 0)
611
627
  return new Set();
612
- let rows = (data || []);
628
+ let rows = data;
613
629
  const ruleFiltersAll = Array.isArray(rule.filters) ? rule.filters : [];
614
630
  const hasFirstTime = ruleFiltersAll.some((f) => String(f?.type || '').trim() === 'first_time');
615
631
  const hasLastTime = ruleFiltersAll.some((f) => String(f?.type || '').trim() === 'last_time');
@@ -959,11 +975,11 @@ class V2AudienceEngine {
959
975
  if (op === 'between' && a > b)
960
976
  return new Set();
961
977
  query = query.not(dbField, 'is', null).neq(dbField, '');
962
- const { data, error } = await query;
963
- if (error)
978
+ const data = await fetchAll(query, 1000);
979
+ if (!data || data.length === 0)
964
980
  return new Set();
965
981
  const res = new Set();
966
- for (const row of (data || [])) {
982
+ for (const row of data) {
967
983
  const raw = row?.properties?.[field];
968
984
  const n = Number(raw);
969
985
  if (!Number.isFinite(n))
@@ -982,13 +998,13 @@ class V2AudienceEngine {
982
998
  return res;
983
999
  }
984
1000
  if (shouldManualJsonbNegation) {
985
- const { data, error } = await query;
986
- if (error)
1001
+ const data = await fetchAll(query, 1000);
1002
+ if (!data || data.length === 0)
987
1003
  return new Set();
988
1004
  const expected = value == null ? '' : String(value);
989
1005
  const expectedLower = expected.toLowerCase();
990
1006
  const res = new Set();
991
- for (const row of (data || [])) {
1007
+ for (const row of data) {
992
1008
  const raw = row?.properties?.[field];
993
1009
  const id = row?.id;
994
1010
  if (!id)
@@ -1187,10 +1203,10 @@ class V2AudienceEngine {
1187
1203
  }
1188
1204
  };
1189
1205
  apply(dbField, isJsonb);
1190
- const { data, error } = await query;
1191
- if (error)
1206
+ const data = await fetchAll(query, 1000);
1207
+ if (!data || data.length === 0)
1192
1208
  return new Set();
1193
- return new Set((data || []).map((r) => r.id));
1209
+ return new Set(data.map((r) => r.id));
1194
1210
  };
1195
1211
  const evalGroup = async (group) => {
1196
1212
  let acc = null;