@flowselections/floriday-authenticatie-module 1.0.81 → 1.0.84

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.
@@ -7,6 +7,7 @@ export declare const getFloridayWebhookStatus: import("@tanstack/start-client-co
7
7
  last24h: Record<string, number>;
8
8
  rejectedByReason: Record<string, number>;
9
9
  activeEnvironments: string[];
10
+ lastProbeAt: string | null;
10
11
  lastEnsureAt: string | null;
11
12
  }>>;
12
13
  export declare const subscribeFloridayWebhook: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
@@ -1 +1 @@
1
- {"version":3,"file":"floriday-webhooks.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-webhooks.functions.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,wBAAwB;;;;;mBAmCA,GAAG,EAAE;;;;;GAMtC,CAAC;AAEL,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;GAcjC,CAAC;AAEL,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;GAyBnC,CAAC;AAyBL,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;KAwBlC,CAAC;AAEL,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;qBAYJ,MAAM;gBAAU,MAAM;;;GAe1D,CAAC"}
1
+ {"version":3,"file":"floriday-webhooks.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-webhooks.functions.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,wBAAwB;;;;;mBA0CA,GAAG,EAAE;;;;;;GAOtC,CAAC;AAEL,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;GAcjC,CAAC;AAEL,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;GAyBnC,CAAC;AAyBL,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;KAwBlC,CAAC;AAEL,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;qBAYJ,MAAM;gBAAU,MAAM;;;GAe1D,CAAC"}
@@ -26,6 +26,13 @@ export const getFloridayWebhookStatus = createServerFn({ method: "GET" })
26
26
  }
27
27
  }
28
28
  const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
29
+ const { data: lastProbe } = await supabaseAdmin
30
+ .from("floriday_webhook_events")
31
+ .select("received_at")
32
+ .eq("status", "probe")
33
+ .order("received_at", { ascending: false })
34
+ .limit(1)
35
+ .maybeSingle();
29
36
  const { data: conns } = await supabaseAdmin
30
37
  .from("floriday_connections")
31
38
  .select("environment")
@@ -40,6 +47,7 @@ export const getFloridayWebhookStatus = createServerFn({ method: "GET" })
40
47
  last24h: counts,
41
48
  rejectedByReason,
42
49
  activeEnvironments: (conns ?? []).map((c) => c.environment),
50
+ lastProbeAt: lastProbe?.received_at ?? null,
43
51
  lastEnsureAt: setting?.value ?? null,
44
52
  };
45
53
  });
@@ -316,7 +316,10 @@ export declare const updateFlorydayPublishingSettings: import("@tanstack/start-c
316
316
  }, Promise<{
317
317
  ok: true;
318
318
  }>>;
319
- export declare const SEQUENCE_SAFETY_MARGIN = 2000;
319
+ /** Alleen items met een hoger volgnummer dan `cursor` (puur, testbaar). */
320
+ export declare function filterNewerThan<T = any>(items: T[], cursor: number): T[];
321
+ /** Hoogste volgnummer in een batch, minimaal `cursor`. */
322
+ export declare function highestSequence(items: any[], cursor: number): number;
320
323
  interface SyncOptions {
321
324
  entityType: string;
322
325
  maxSequenceEndpoint: string;
@@ -328,6 +331,8 @@ interface SyncOptions {
328
331
  /** Optioneel: epoch-ms waarna geen nieuwe pagina meer wordt opgehaald. */
329
332
  deadlineMs?: number;
330
333
  }
334
+ /** Overslaan als het eigen volgnummer bij is, of het maximum niet hoger is dan vorige ronde. */
335
+ export declare function shouldSkipFetch(cursor: number, maxSeq: number, lastSeenMax: number | null): boolean;
331
336
  export declare function syncFloridayEntityBySequence(supabase: SupabaseClient, env: FlorydayEnvironment, connectionId: string, opts: SyncOptions): Promise<{
332
337
  synced: number;
333
338
  fromSequence: number;
@@ -1 +1 @@
1
- {"version":3,"file":"floriday.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday.functions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"floriday.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday.functions.ts"],"names":[],"mappings":"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"}
@@ -464,11 +464,16 @@ export async function florydayFetch(supabase, pathOrEnv, pathOrInit, maybeInit =
464
464
  if (ok && flowLog?.countItems && response) {
465
465
  try {
466
466
  const json = await response.clone().json();
467
- const items = Array.isArray(json)
467
+ const all = Array.isArray(json)
468
468
  ? json
469
469
  : Array.isArray(json?.results)
470
470
  ? json.results
471
471
  : null;
472
+ // Ophaalronde: alleen items met een hoger volgnummer dan gevraagd
473
+ // tellen als wijziging (zelfde volgnummer = al verwerkt).
474
+ const items = all && typeof flowLog?.cursorFrom === "number"
475
+ ? filterNewerThan(all, flowLog.cursorFrom)
476
+ : all;
472
477
  itemCount = items ? items.length : null;
473
478
  if (items)
474
479
  syncItems = items;
@@ -1340,17 +1345,26 @@ export const updateFlorydayPublishingSettings = createServerFn({ method: "POST"
1340
1345
  // /<entity>/max-sequence, daarna /<entity>/sync/{seq}. Deze helper houdt
1341
1346
  // de cursor in `floriday_sync_state` per (connection, entity).
1342
1347
  const SEQUENCE_BATCH_CAP = 1000;
1343
- // Veiligheidsmarge op de cursor.
1348
+ // Cursorregels (1.0.82)
1344
1349
  // ----------------------------------------------------------------------------
1345
- // Floriday stempelt een wijziging met een volgnummer, maar die wijziging kan
1346
- // pas even later opvraagbaar zijn via /sync/{seq}. Zetten we de cursor na een
1347
- // lege/kleine ronde hard op het op dat moment gelezen max-sequence, dan wordt
1348
- // zo'n "net te laat gepubliceerde" wijziging definitief overgeslagen. We zetten
1349
- // de cursor daarom altijd een marge terug; opnieuw ophalen is goedkoop (dezelfde
1350
- // rij wordt idempotent bijgewerkt) en de sequence-guard voorkomt terugzetten.
1351
- export const SEQUENCE_SAFETY_MARGIN = 2000;
1352
- function cursorWithMargin(target, floor) {
1353
- return Math.max(floor, target - SEQUENCE_SAFETY_MARGIN);
1350
+ // Swagger: "Your data is up to date when your given SequenceNumber is equal to
1351
+ // the received MaximumSequenceNumber." De cursor gaat daarom alleen vooruit,
1352
+ // naar het hoogste volgnummer dat echt is opgeslagen (nooit een marge terug).
1353
+ // Een later gepubliceerde wijziging krijgt altijd een hoger volgnummer en komt
1354
+ // zo vanzelf binnen. Items met een volgnummer <= de cursor zijn al verwerkt.
1355
+ /** Alleen items met een hoger volgnummer dan `cursor` (puur, testbaar). */
1356
+ export function filterNewerThan(items, cursor) {
1357
+ return items.filter((it) => {
1358
+ const s = Number(it?.sequenceNumber ?? it?.sequence_number);
1359
+ return !Number.isFinite(s) || s > cursor;
1360
+ });
1361
+ }
1362
+ /** Hoogste volgnummer in een batch, minimaal `cursor`. */
1363
+ export function highestSequence(items, cursor) {
1364
+ return items.reduce((m, item) => {
1365
+ const s = Number(item?.sequenceNumber ?? item?.sequence_number ?? 0);
1366
+ return Number.isFinite(s) && s > m ? s : m;
1367
+ }, cursor);
1354
1368
  }
1355
1369
  async function fetchMaxSequence(supabase, env, maxSequenceEndpoint, entityType, caller) {
1356
1370
  const res = await florydayFetch(supabase, env, maxSequenceEndpoint, {
@@ -1399,12 +1413,18 @@ async function fetchBySequence(supabase, env, bySequenceEndpointBase, fromSequen
1399
1413
  const json = await res.json().catch(() => null);
1400
1414
  return Array.isArray(json) ? json : Array.isArray(json?.results) ? json.results : [];
1401
1415
  }
1416
+ /** Overslaan als het eigen volgnummer bij is, of het maximum niet hoger is dan vorige ronde. */
1417
+ export function shouldSkipFetch(cursor, maxSeq, lastSeenMax) {
1418
+ if (cursor >= maxSeq)
1419
+ return true;
1420
+ return lastSeenMax != null && maxSeq <= lastSeenMax;
1421
+ }
1402
1422
  export async function syncFloridayEntityBySequence(supabase, env, connectionId, opts) {
1403
1423
  const t0 = Date.now();
1404
1424
  const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
1405
1425
  const { data: stateRow } = await supabase
1406
1426
  .from("floriday_sync_state")
1407
- .select("last_sequence_number")
1427
+ .select("last_sequence_number, last_max_sequence_seen")
1408
1428
  .eq("connection_id", connectionId)
1409
1429
  .eq("entity_type", opts.entityType)
1410
1430
  .maybeSingle();
@@ -1414,6 +1434,7 @@ export async function syncFloridayEntityBySequence(supabase, env, connectionId,
1414
1434
  // in dat geval expliciet op maxSeq en markeren de rij als "backfill nodig".
1415
1435
  const hasStateRow = stateRow != null;
1416
1436
  const startCursor = stateRow?.last_sequence_number ?? 0;
1437
+ let savedCursor = startCursor;
1417
1438
  try {
1418
1439
  // Debug-logging: helpt 401's onderscheid maken tussen scope-issue,
1419
1440
  // expired token en wrong env. Token zelf wordt NIET gelogd.
@@ -1448,6 +1469,23 @@ export async function syncFloridayEntityBySequence(supabase, env, connectionId,
1448
1469
  backfillNeeded: true,
1449
1470
  };
1450
1471
  }
1472
+ // Hoogste nummer niet gestegen sinds de vorige ronde: niets ophalen.
1473
+ // (Floriday nummert globaal; een stijging kan van anderen komen.)
1474
+ const lastSeen = stateRow?.last_max_sequence_seen ?? null;
1475
+ if (shouldSkipFetch(startCursor, maxSeq, lastSeen)) {
1476
+ const skipIso = new Date().toISOString();
1477
+ await supabase.from("floriday_sync_state").upsert({
1478
+ connection_id: connectionId,
1479
+ entity_type: opts.entityType,
1480
+ last_sequence_number: startCursor,
1481
+ last_max_sequence_seen: maxSeq,
1482
+ last_synced_at: skipIso,
1483
+ last_success_at: skipIso,
1484
+ last_items_processed: 0,
1485
+ last_error: null,
1486
+ });
1487
+ return { synced: 0, fromSequence: startCursor, toSequence: startCursor, durationMs: Date.now() - t0 };
1488
+ }
1451
1489
  let cursor = startCursor;
1452
1490
  let totalSynced = 0;
1453
1491
  let safety = 0;
@@ -1459,30 +1497,36 @@ export async function syncFloridayEntityBySequence(supabase, env, connectionId,
1459
1497
  break;
1460
1498
  }
1461
1499
  safety++;
1462
- const batch = await fetchBySequence(supabase, env, opts.bySequenceEndpointBase, cursor, opts.entityType, opts.caller);
1500
+ const raw = await fetchBySequence(supabase, env, opts.bySequenceEndpointBase, cursor, opts.entityType, opts.caller);
1501
+ // Zelfde of lager volgnummer = al verwerkt: niet opnieuw doorgeven.
1502
+ const batch = filterNewerThan(raw, cursor);
1463
1503
  if (batch.length === 0) {
1464
- // Geen nieuwe wijzigingen tot het gelezen max-sequence-punt. Cursor
1465
- // doorzetten zodat we niet elke run dezelfde lege call doen, maar met
1466
- // veiligheidsmarge: een net gestempelde wijziging kan nog onderweg zijn.
1467
- cursor = cursorWithMargin(maxSeq, startCursor);
1504
+ // Niets nieuws. Cursor blijft staan (niet vooruit springen naar maxSeq:
1505
+ // een nog niet gepubliceerde wijziging mag niet worden overgeslagen).
1468
1506
  break;
1469
1507
  }
1470
- const highest = batch.reduce((m, item) => {
1471
- const s = Number(item?.sequenceNumber ?? item?.sequence_number ?? 0);
1472
- return s > m ? s : m;
1473
- }, cursor);
1508
+ const highest = highestSequence(batch, cursor);
1474
1509
  await opts.onBatch(batch, highest);
1475
1510
  totalSynced += batch.length;
1476
1511
  if (highest <= cursor)
1477
1512
  break;
1478
1513
  cursor = highest;
1479
- if (batch.length < SEQUENCE_BATCH_CAP) {
1480
- // Kleine batch ⇒ bijgewerkt tot maxSeq op moment van de eerste call,
1481
- // maar met veiligheidsmarge (zie SEQUENCE_SAFETY_MARGIN).
1482
- cursor = cursorWithMargin(Math.max(cursor, maxSeq), startCursor);
1514
+ // Na elke gelukte pagina vastleggen: mislukt een latere pagina, dan
1515
+ // blijft de cursor op het laatst opgeslagen item.
1516
+ await supabase
1517
+ .from("floriday_sync_state")
1518
+ .upsert({
1519
+ connection_id: connectionId,
1520
+ entity_type: opts.entityType,
1521
+ last_sequence_number: cursor,
1522
+ });
1523
+ savedCursor = cursor;
1524
+ // Volle pagina: in dezelfde ronde doorhalen tot maxSeq.
1525
+ if (raw.length < SEQUENCE_BATCH_CAP)
1483
1526
  break;
1484
- }
1485
1527
  }
1528
+ if (cursor < maxSeq && safety >= 1000)
1529
+ partial = true;
1486
1530
  const nowIso = new Date().toISOString();
1487
1531
  await supabase
1488
1532
  .from("floriday_sync_state")
@@ -1490,6 +1534,7 @@ export async function syncFloridayEntityBySequence(supabase, env, connectionId,
1490
1534
  connection_id: connectionId,
1491
1535
  entity_type: opts.entityType,
1492
1536
  last_sequence_number: cursor,
1537
+ ...(partial ? {} : { last_max_sequence_seen: maxSeq }),
1493
1538
  last_synced_at: nowIso,
1494
1539
  // Een afgebroken (begrensde) ronde is niet bij: last_success_at alleen bij een volledige ronde.
1495
1540
  ...(partial ? {} : { last_success_at: nowIso }),
@@ -1511,7 +1556,7 @@ export async function syncFloridayEntityBySequence(supabase, env, connectionId,
1511
1556
  .upsert({
1512
1557
  connection_id: connectionId,
1513
1558
  entity_type: opts.entityType,
1514
- last_sequence_number: startCursor,
1559
+ last_sequence_number: savedCursor,
1515
1560
  last_error: msg.slice(0, 500),
1516
1561
  });
1517
1562
  throw e;
@@ -50,7 +50,7 @@ export async function probeWebhookCallbackBase(base) {
50
50
  try {
51
51
  const res = await fetch(`${base}/api/public/gateway/webhook-in?t=${"0".repeat(64)}`, {
52
52
  method: "POST",
53
- headers: { "Content-Type": "application/json" },
53
+ headers: { "Content-Type": "application/json", "x-flowselections-probe": "1" },
54
54
  body: "{}",
55
55
  signal: AbortSignal.timeout(10000),
56
56
  });
@@ -11,7 +11,12 @@ export interface WebhookCallContext {
11
11
  /** Volledig adres waarop de melding binnenkwam (incl. token). */
12
12
  callbackUrl?: string | null;
13
13
  route?: string;
14
+ /** Eigen proefaanroep (header x-flowselections-probe: 1). */
15
+ probe?: boolean;
14
16
  }
17
+ export declare const PROBE_HEADER = "x-flowselections-probe";
18
+ /** Eigen proef: sleutel van alleen nullen, of geen sleutel met de proefheader. */
19
+ export declare function isOwnProbe(token: string, probeHeader: boolean): boolean;
15
20
  /** Token in een callback-adres maskeren: eerste 4 en laatste 4 tekens. */
16
21
  export declare function maskCallbackUrl(url: string): string;
17
22
  export declare const STALE_CALLBACK_PREFIX = "floriday_webhook_stale_callback:";
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/webhook.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAW5D,eAAO,MAAM,2BAA2B,mCAAmC,CAAC;AAE5E,wBAAsB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AA4CD,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAO3D;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED,eAAO,MAAM,qBAAqB,qCAAqC,CAAC;AAExE;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB/G;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,kBAAuB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA6KxB;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,MAAM,EACb,KAAK,SAAoB,GACxB,OAAO,CAAC,QAAQ,CAAC,CAcnB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAGnB;AAKD,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBhG;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAWnB"}
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/webhook.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAW5D,eAAO,MAAM,2BAA2B,mCAAmC,CAAC;AAE5E,wBAAsB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AA4CD,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAO3D;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,2BAA2B,CAAC;AAErD,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAGvE;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED,eAAO,MAAM,qBAAqB,qCAAqC,CAAC;AAExE;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB/G;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,kBAAuB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAwLxB;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,MAAM,EACb,KAAK,SAAoB,GACxB,OAAO,CAAC,QAAQ,CAAC,CAenB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAGnB;AAKD,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBhG;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAWnB"}
@@ -64,6 +64,13 @@ export function originalRequestUrl(request) {
64
64
  u.protocol = proto + ":";
65
65
  return u.toString();
66
66
  }
67
+ export const PROBE_HEADER = "x-flowselections-probe";
68
+ /** Eigen proef: sleutel van alleen nullen, of geen sleutel met de proefheader. */
69
+ export function isOwnProbe(token, probeHeader) {
70
+ if (token && /^0+$/.test(token))
71
+ return true;
72
+ return probeHeader && !token;
73
+ }
67
74
  /** Token in een callback-adres maskeren: eerste 4 en laatste 4 tekens. */
68
75
  export function maskCallbackUrl(url) {
69
76
  const mask = (t) => (t.length <= 8 ? "****" : `${t.slice(0, 4)}…${t.slice(-4)}`);
@@ -105,6 +112,18 @@ export async function recordStaleCallback(supabase, url, route) {
105
112
  }
106
113
  export async function runFloridayWebhook(supabase, token, rawBody, ctx = {}) {
107
114
  const route = ctx.route ?? "webhook";
115
+ if (isOwnProbe(token, !!ctx.probe)) {
116
+ try {
117
+ await supabase.from(WEBHOOK_EVENTS_TABLE).insert({
118
+ dedupe_key: `probe:${crypto.randomUUID()}`,
119
+ status: "probe",
120
+ payload: { route },
121
+ });
122
+ }
123
+ catch { /* loggen mag de respons niet breken */ }
124
+ // Zelfde antwoord als een weigering, zodat de routecontrole blijft werken.
125
+ return { status: 404, payload: { ok: false } };
126
+ }
108
127
  if (!token || token.length < 32) {
109
128
  await logRejected(supabase, "Ongeldig of ontbrekend callback-token", null, {
110
129
  route, callbackUrlMasked: ctx.callbackUrl ? maskCallbackUrl(ctx.callbackUrl) : null,
@@ -278,6 +297,7 @@ export async function handleFloridayWebhook(request, supabase, token, route = "w
278
297
  const { status, payload } = await runFloridayWebhook(supabase, token, raw, {
279
298
  callbackUrl: originalRequestUrl(request),
280
299
  route,
300
+ probe: request.headers.get(PROBE_HEADER) === "1",
281
301
  });
282
302
  return Response.json(payload, { status });
283
303
  }
@@ -1,2 +1,2 @@
1
- export declare const MODULE_VERSION = "1.0.81";
1
+ export declare const MODULE_VERSION = "1.0.84";
2
2
  //# sourceMappingURL=module-version.d.ts.map
@@ -1,2 +1,2 @@
1
1
  // GEGENEREERD door scripts/write-module-version.mjs uit package.json — niet handmatig wijzigen.
2
- export const MODULE_VERSION = "1.0.81";
2
+ export const MODULE_VERSION = "1.0.84";
@@ -58,7 +58,7 @@ async function probe(base, path) {
58
58
  try {
59
59
  const res = await fetch(`${base}${path}`, {
60
60
  method: "POST",
61
- headers: { "content-type": "application/json" },
61
+ headers: { "content-type": "application/json", "x-flowselections-probe": "1" },
62
62
  body: "{}",
63
63
  signal: AbortSignal.timeout(8000),
64
64
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/floriday-authenticatie-module",
3
- "version": "1.0.81",
3
+ "version": "1.0.84",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "main": "./dist-lib/index.js",