@cross-deck/web 1.6.1 → 1.6.3

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/CHANGELOG.md CHANGED
@@ -2,6 +2,49 @@
2
2
 
3
3
  All notable changes to `@cross-deck/web` will be documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## [1.6.3] — 2026-06-01
6
+
7
+ Patch — error-capture noise reduction. The fetch wrapper raised an
8
+ `HTTPError(status 0)` for **every** failed request, including the opaque
9
+ `TypeError` an adblocker, an offline device, or an aborted navigation
10
+ produces. Per the Fetch spec these are indistinguishable from a real outage,
11
+ so `status 0` is the single biggest false-alarm source in browser error
12
+ tracking — a developer's own adblocker blocking a first-party asset would
13
+ page as a production error. No public API change.
14
+
15
+ **Status-0 network failures from unambiguous client noise are no longer
16
+ reported.** A new internal predicate suppresses three cases: `AbortError`
17
+ (navigation / explicit cancel), offline (`navigator.onLine === false`), and
18
+ **same-origin** failures — the page itself loaded from that origin, so it's
19
+ demonstrably reachable; a status-0 there is client-side blocking, not a
20
+ server fault. Genuine same-origin server failures still surface as 5xx on
21
+ the success path. **Cross-origin outages still report** — real signal is
22
+ kept, only the noise is dropped. The request breadcrumb still fires
23
+ regardless, so context is preserved on other errors.
24
+
25
+ ## [1.6.2] — 2026-05-31
26
+
27
+ Patch — session-boundary correctness. A stored session could span a gap
28
+ longer than the 30-minute inactivity window in two cases the resume logic
29
+ missed, fragmenting journey grouping. Both are now fixed. No public API
30
+ change; `session.ended` emission timing changes as described, so read
31
+ before upgrading if you have downstream logic keyed on it.
32
+
33
+ **A tab left open and idle, then used again, no longer stretches one
34
+ session across the gap.** `markActivity()` now rolls to a new session when
35
+ an event lands after the 30-minute window has lapsed — covering the case
36
+ the page-load and tab-return resume checks miss entirely (a tab kept open
37
+ and idle, then interacted with, with no visibility transition). A single
38
+ stored session can no longer contain a >30-minute gap.
39
+
40
+ **Returning to a long-idle tab no longer back-dates `session.ended`.** The
41
+ visibility-resume path emitted `session.ended` at the moment of return —
42
+ more than 30 minutes after the session's last real event — which itself
43
+ opened an intra-session gap. The prior session now ends implicitly (its
44
+ end inferred from its last event), consistent with the page-load resume
45
+ path. If you key downstream logic on `session.ended`, note it no longer
46
+ fires on a >30-minute tab-return.
47
+
5
48
  ## [1.6.1] — 2026-05-30
6
49
 
7
50
  Minor — two autocapture fidelity fixes, plus a repair to the release
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "generatedAt": "2026-05-30T11:19:57.350Z",
3
+ "generatedAt": "2026-06-01T07:38:09.435Z",
4
4
  "sdk": "@cross-deck/web",
5
- "sdkVersion": "1.6.1",
6
- "bundledIn": "@cross-deck/web@1.6.1",
7
- "count": 8,
5
+ "sdkVersion": "1.6.3",
6
+ "bundledIn": "@cross-deck/web@1.6.3",
7
+ "count": 9,
8
8
  "contracts": [
9
9
  {
10
10
  "id": "contract-failed-payload-schema-lock",
@@ -126,7 +126,7 @@
126
126
  "legal/security/index.html#diagnostic",
127
127
  "legal/sdk-data/index.html#b-diagnostic"
128
128
  ],
129
- "bundledIn": "@cross-deck/web@1.6.1"
129
+ "bundledIn": "@cross-deck/web@1.6.3"
130
130
  },
131
131
  {
132
132
  "id": "error-envelope-shape",
@@ -165,7 +165,7 @@
165
165
  ],
166
166
  "registeredAt": "2026-05-26",
167
167
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 — phase 8 (codifies existing contract)",
168
- "bundledIn": "@cross-deck/web@1.6.1"
168
+ "bundledIn": "@cross-deck/web@1.6.3"
169
169
  },
170
170
  {
171
171
  "id": "flush-interval-parity",
@@ -210,7 +210,7 @@
210
210
  ],
211
211
  "registeredAt": "2026-05-26",
212
212
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 — phase 3.3",
213
- "bundledIn": "@cross-deck/web@1.6.1"
213
+ "bundledIn": "@cross-deck/web@1.6.3"
214
214
  },
215
215
  {
216
216
  "id": "idempotency-key-deterministic",
@@ -315,7 +315,7 @@
315
315
  ],
316
316
  "registeredAt": "2026-05-26",
317
317
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 — phase 2.2.a + 2.2.b + 2.2.c",
318
- "bundledIn": "@cross-deck/web@1.6.1"
318
+ "bundledIn": "@cross-deck/web@1.6.3"
319
319
  },
320
320
  {
321
321
  "id": "init-reentry-drains-prior-queue",
@@ -342,7 +342,7 @@
342
342
  ],
343
343
  "registeredAt": "2026-05-26",
344
344
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 — phase 5.5",
345
- "bundledIn": "@cross-deck/web@1.6.1"
345
+ "bundledIn": "@cross-deck/web@1.6.3"
346
346
  },
347
347
  {
348
348
  "id": "per-user-cache-isolation",
@@ -421,7 +421,7 @@
421
421
  ],
422
422
  "registeredAt": "2026-05-26",
423
423
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 — phase 1.3 (web/RN) + dogfood-gap fix (swift + android)",
424
- "bundledIn": "@cross-deck/web@1.6.1"
424
+ "bundledIn": "@cross-deck/web@1.6.3"
425
425
  },
426
426
  {
427
427
  "id": "sdk-error-codes-catalogue",
@@ -435,9 +435,14 @@
435
435
  "codeRef": [
436
436
  "sdks/web/src/error-codes.ts",
437
437
  "sdks/node/src/error-codes.ts",
438
+ "sdks/web/src/_contract-verifiers.ts",
438
439
  "backend/src/api/v1-errors.ts"
439
440
  ],
440
441
  "testRef": [
442
+ {
443
+ "file": "sdks/web/tests/contract-verifiers.test.ts",
444
+ "name": "sdk-error-codes-catalogue covers every backend wire code with remediation"
445
+ },
441
446
  {
442
447
  "file": "sdks/web/tests/error-codes-backfill.test.ts",
443
448
  "name": "includes backend code"
@@ -461,7 +466,48 @@
461
466
  ],
462
467
  "registeredAt": "2026-05-26",
463
468
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 — phase 6.2",
464
- "bundledIn": "@cross-deck/web@1.6.1"
469
+ "bundledIn": "@cross-deck/web@1.6.3"
470
+ },
471
+ {
472
+ "id": "super-property-merge-precedence",
473
+ "pillar": "analytics",
474
+ "status": "enforced",
475
+ "claim": "Every Crossdeck SDK merges event properties with the precedence device < super < caller (caller-supplied values win over registered super-properties, which win over auto-attached device info). Pre-v1.4.0 Swift had it INVERTED (super < device < caller — device clobbered super), so a `register('plan', 'pro')` super-property was silently overridden by auto-attached device fields whenever keys collided. Cross-SDK funnel queries on super-property keys returned different answers per platform.",
476
+ "appliesTo": [
477
+ "web",
478
+ "swift"
479
+ ],
480
+ "codeRef": [
481
+ "sdks/web/src/super-properties.ts",
482
+ "sdks/web/src/_contract-verifiers.ts",
483
+ "sdks/swift/Sources/Crossdeck/EventPropertyMerge.swift",
484
+ "sdks/swift/Sources/Crossdeck/Crossdeck.swift"
485
+ ],
486
+ "testRef": [
487
+ {
488
+ "file": "sdks/web/tests/contract-verifiers.test.ts",
489
+ "name": "super-property-merge-precedence verifies caller > super > device"
490
+ },
491
+ {
492
+ "file": "sdks/swift/Tests/CrossdeckTests/EventPropertyMergeTests.swift",
493
+ "name": "test_super_overrides_device"
494
+ },
495
+ {
496
+ "file": "sdks/swift/Tests/CrossdeckTests/EventPropertyMergeTests.swift",
497
+ "name": "test_caller_overrides_super"
498
+ },
499
+ {
500
+ "file": "sdks/swift/Tests/CrossdeckTests/EventPropertyMergeTests.swift",
501
+ "name": "test_full_precedence_chain"
502
+ },
503
+ {
504
+ "file": "sdks/swift/Tests/CrossdeckTests/EventPropertyMergeTests.swift",
505
+ "name": "test_matchesWebNodeRNPrecedence"
506
+ }
507
+ ],
508
+ "registeredAt": "2026-05-26",
509
+ "firstRegisteredIn": "bank-grade reconciliation v1.4.0 — phase 3.2",
510
+ "bundledIn": "@cross-deck/web@1.6.3"
465
511
  },
466
512
  {
467
513
  "id": "sync-purchases-funnel-parity",
@@ -494,7 +540,7 @@
494
540
  ],
495
541
  "registeredAt": "2026-05-26",
496
542
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 — phase 3.5",
497
- "bundledIn": "@cross-deck/web@1.6.1"
543
+ "bundledIn": "@cross-deck/web@1.6.3"
498
544
  }
499
545
  ]
500
546
  }