@cross-deck/web 1.6.3 → 1.7.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "generatedAt": "2026-06-01T07:38:09.406Z",
3
+ "generatedAt": "2026-06-10T12:59:26.148Z",
4
4
  "sdk": "@cross-deck/web",
5
5
  "codes": [
6
6
  {
package/dist/index.cjs CHANGED
@@ -99,7 +99,7 @@ function typeMapForStatus(status) {
99
99
  }
100
100
 
101
101
  // src/_version.ts
102
- var SDK_VERSION = "1.6.3";
102
+ var SDK_VERSION = "1.7.0";
103
103
  var SDK_NAME = "@cross-deck/web";
104
104
 
105
105
  // src/http.ts
@@ -1015,9 +1015,13 @@ var EventQueue = class {
1015
1015
  const env = this.cfg.envelope();
1016
1016
  const result = await this.cfg.http.request("POST", "/events", {
1017
1017
  body: {
1018
- // NorthStar §13.1 batch envelope. The backend validates these
1019
- // against the API-key-resolved app and rejects mismatches
1020
- // loudly (env_mismatch).
1018
+ // Event Envelope v1 batch envelope (backend/docs/
1019
+ // event-envelope-spec-v1.md §1). `envelopeVersion` is the
1020
+ // schema/wire version the server parses against ("can I parse
1021
+ // this?") and is DISTINCT from `sdk.version` ("which build is in
1022
+ // the wild?") — two questions, two fields, never conflated. The
1023
+ // backend refuses payloads with a missing/unknown envelopeVersion.
1024
+ envelopeVersion: 1,
1021
1025
  appId: env.appId,
1022
1026
  environment: env.environment,
1023
1027
  sdk: env.sdk,
@@ -1472,6 +1476,15 @@ var AutoTracker = class {
1472
1476
  this.cleanups = [];
1473
1477
  /** Last time we flushed lastActivityAt to storage (throttle gate). */
1474
1478
  this.lastPersistAt = 0;
1479
+ /**
1480
+ * Event Envelope v1 §3 — per-session monotonic sequence counter.
1481
+ * The single owner of the seq counter lives here, alongside all other
1482
+ * session state. Incremented atomically at track() time (via nextSeq()),
1483
+ * reset to 0 whenever a new session boundary is crossed (startNewSession
1484
+ * path + resetSession). Persists across background/foreground within a
1485
+ * session — only a real session boundary (not a tab hide/show) resets it.
1486
+ */
1487
+ this._sessionSeq = 0;
1475
1488
  /**
1476
1489
  * Stable per-page-view identifier. Minted at every `page.viewed`
1477
1490
  * emission and attached to every subsequent event until the next
@@ -1556,6 +1569,20 @@ var AutoTracker = class {
1556
1569
  get currentAcquisition() {
1557
1570
  return this.session?.acquisition ?? EMPTY_ACQUISITION;
1558
1571
  }
1572
+ /**
1573
+ * Event Envelope v1 §3 — return the next seq value for the current session
1574
+ * and advance the counter. Called SYNCHRONOUSLY at track() time, before any
1575
+ * async dispatch, so the seq assignment order is deterministic (call order,
1576
+ * not scheduler luck). The counter is reset to 0 at every session boundary;
1577
+ * it is NOT reset by tab hide/show (spec §3 clause 1: backgrounding does not
1578
+ * reset seq). When no session is active (Node, before init, after uninstall),
1579
+ * returns 0 and leaves the counter unchanged — fallback, not an error.
1580
+ */
1581
+ nextSeq() {
1582
+ const seq = this._sessionSeq;
1583
+ this._sessionSeq += 1;
1584
+ return seq;
1585
+ }
1559
1586
  // ---------- sessions ----------
1560
1587
  installSessionTracking() {
1561
1588
  const now = Date.now();
@@ -1607,6 +1634,7 @@ var AutoTracker = class {
1607
1634
  }
1608
1635
  startNewSession() {
1609
1636
  const now = Date.now();
1637
+ this._sessionSeq = 0;
1610
1638
  return {
1611
1639
  sessionId: mintSessionId(),
1612
1640
  startedAt: now,
@@ -2335,6 +2363,40 @@ function writeJson(storage, key, value) {
2335
2363
  }
2336
2364
  }
2337
2365
 
2366
+ // src/internal-opt-out.ts
2367
+ var INTERNAL_OPT_OUT_PROPERTY = "$crossdeck_internal";
2368
+ var STORAGE_KEY = "crossdeck.internalOptOut";
2369
+ function localStore() {
2370
+ try {
2371
+ return typeof localStorage !== "undefined" ? localStorage : null;
2372
+ } catch {
2373
+ return null;
2374
+ }
2375
+ }
2376
+ function processInternalOptOutUrl() {
2377
+ try {
2378
+ const search = typeof location !== "undefined" ? location.search : "";
2379
+ const params = new URLSearchParams(search || "");
2380
+ if (!params.has("crossdeck_internal")) return;
2381
+ const store = localStore();
2382
+ if (!store) return;
2383
+ const v = params.get("crossdeck_internal");
2384
+ if (v === "1" || v === "true") {
2385
+ store.setItem(STORAGE_KEY, "1");
2386
+ } else if (v === "0" || v === "false") {
2387
+ store.removeItem(STORAGE_KEY);
2388
+ }
2389
+ } catch {
2390
+ }
2391
+ }
2392
+ function isInternalOptOut() {
2393
+ try {
2394
+ return localStore()?.getItem(STORAGE_KEY) === "1";
2395
+ } catch {
2396
+ return false;
2397
+ }
2398
+ }
2399
+
2338
2400
  // src/web-vitals.ts
2339
2401
  var WebVitalsTracker = class {
2340
2402
  constructor(cfg, report) {
@@ -3695,18 +3757,18 @@ function isInAppFrame(filename) {
3695
3757
  if (/\/crossdeck\.umd\.min\.js$/.test(filename)) return false;
3696
3758
  return true;
3697
3759
  }
3698
- function fingerprintError(message, frames, location) {
3760
+ function fingerprintError(message, frames, location2) {
3699
3761
  const inAppFrames = frames.filter((f) => f.in_app).slice(0, 3);
3700
3762
  const parts = [
3701
3763
  (message || "").slice(0, 200),
3702
3764
  ...inAppFrames.map((f) => `${f.function}@${f.filename}:${f.lineno}`)
3703
3765
  ];
3704
- if (inAppFrames.length === 0 && location) {
3766
+ if (inAppFrames.length === 0 && location2) {
3705
3767
  const loc = [
3706
- location.errorType ?? "",
3707
- location.filename ?? "",
3708
- location.lineno ?? "",
3709
- location.colno ?? ""
3768
+ location2.errorType ?? "",
3769
+ location2.filename ?? "",
3770
+ location2.lineno ?? "",
3771
+ location2.colno ?? ""
3710
3772
  ].join(":");
3711
3773
  if (loc !== ":::") parts.push(loc);
3712
3774
  }
@@ -4552,6 +4614,7 @@ var CrossdeckClient = class {
4552
4614
  persistIdentity ? effectiveStorage : new MemoryStorage(),
4553
4615
  opts.storagePrefix
4554
4616
  );
4617
+ processInternalOptOutUrl();
4555
4618
  const consent = new ConsentManager({ respectDnt: options.respectDnt === true });
4556
4619
  if (consent.isDntDenied) {
4557
4620
  debug.emit(
@@ -5205,8 +5268,27 @@ var CrossdeckClient = class {
5205
5268
  );
5206
5269
  }
5207
5270
  }
5271
+ const seq = s.autoTracker?.nextSeq() ?? 0;
5272
+ const occurrenceTimestamp = Date.now();
5208
5273
  s.autoTracker?.markActivity();
5209
- const enriched = { ...s.deviceInfo };
5274
+ const wireContext = {};
5275
+ const di = s.deviceInfo;
5276
+ if (di.os) wireContext.os = di.os;
5277
+ if (di.osVersion) wireContext.osVersion = di.osVersion;
5278
+ const appVer = s.options.appVersion;
5279
+ if (appVer) wireContext.appVersion = appVer;
5280
+ wireContext.sdkName = SDK_NAME;
5281
+ wireContext.sdkVersion = s.options.sdkVersion;
5282
+ if (di.locale) wireContext.locale = di.locale;
5283
+ if (di.timezone) wireContext.timezone = di.timezone;
5284
+ if (di.browser) wireContext.browser = di.browser;
5285
+ if (di.browserVersion) wireContext.browserVersion = di.browserVersion;
5286
+ const enriched = {};
5287
+ if (di.screenWidth !== void 0) enriched.screenWidth = di.screenWidth;
5288
+ if (di.screenHeight !== void 0) enriched.screenHeight = di.screenHeight;
5289
+ if (di.viewportWidth !== void 0) enriched.viewportWidth = di.viewportWidth;
5290
+ if (di.viewportHeight !== void 0) enriched.viewportHeight = di.viewportHeight;
5291
+ if (di.devicePixelRatio !== void 0) enriched.devicePixelRatio = di.devicePixelRatio;
5210
5292
  const sessionId = s.autoTracker?.currentSessionId;
5211
5293
  if (sessionId) enriched.sessionId = sessionId;
5212
5294
  const pageviewId = s.autoTracker?.currentPageviewId;
@@ -5237,11 +5319,16 @@ var CrossdeckClient = class {
5237
5319
  enriched.$groups = groupIds;
5238
5320
  }
5239
5321
  Object.assign(enriched, validation.properties);
5322
+ if (isInternalOptOut()) {
5323
+ enriched[INTERNAL_OPT_OUT_PROPERTY] = true;
5324
+ }
5240
5325
  const finalProperties = s.scrubPii ? scrubPiiFromProperties(enriched) : enriched;
5241
5326
  const event = {
5242
5327
  eventId: this.mintEventId(),
5243
5328
  name,
5244
- timestamp: Date.now(),
5329
+ timestamp: occurrenceTimestamp,
5330
+ seq,
5331
+ context: wireContext,
5245
5332
  properties: finalProperties
5246
5333
  };
5247
5334
  Object.assign(event, this.identityHintForEvent());
@@ -5596,8 +5683,8 @@ function installUnloadFlush(onUnload) {
5596
5683
  }
5597
5684
 
5598
5685
  // src/_contracts-bundled.ts
5599
- var BUNDLED_IN = "@cross-deck/web@1.6.3";
5600
- var SDK_VERSION2 = "1.6.3";
5686
+ var BUNDLED_IN = "@cross-deck/web@1.7.0";
5687
+ var SDK_VERSION2 = "1.7.0";
5601
5688
  var BUNDLED_CONTRACTS = Object.freeze([
5602
5689
  {
5603
5690
  "id": "contract-failed-payload-schema-lock",
@@ -5719,7 +5806,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5719
5806
  "legal/security/index.html#diagnostic",
5720
5807
  "legal/sdk-data/index.html#b-diagnostic"
5721
5808
  ],
5722
- "bundledIn": "@cross-deck/web@1.6.3",
5809
+ "bundledIn": "@cross-deck/web@1.7.0",
5723
5810
  "runtimeVerified": true
5724
5811
  },
5725
5812
  {
@@ -5759,7 +5846,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5759
5846
  ],
5760
5847
  "registeredAt": "2026-05-26",
5761
5848
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 8 (codifies existing contract)",
5762
- "bundledIn": "@cross-deck/web@1.6.3",
5849
+ "bundledIn": "@cross-deck/web@1.7.0",
5763
5850
  "runtimeVerified": true
5764
5851
  },
5765
5852
  {
@@ -5805,7 +5892,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5805
5892
  ],
5806
5893
  "registeredAt": "2026-05-26",
5807
5894
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 3.3",
5808
- "bundledIn": "@cross-deck/web@1.6.3",
5895
+ "bundledIn": "@cross-deck/web@1.7.0",
5809
5896
  "runtimeVerified": true
5810
5897
  },
5811
5898
  {
@@ -5911,7 +5998,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5911
5998
  ],
5912
5999
  "registeredAt": "2026-05-26",
5913
6000
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 2.2.a + 2.2.b + 2.2.c",
5914
- "bundledIn": "@cross-deck/web@1.6.3",
6001
+ "bundledIn": "@cross-deck/web@1.7.0",
5915
6002
  "runtimeVerified": true
5916
6003
  },
5917
6004
  {
@@ -5939,7 +6026,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
5939
6026
  ],
5940
6027
  "registeredAt": "2026-05-26",
5941
6028
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 5.5",
5942
- "bundledIn": "@cross-deck/web@1.6.3",
6029
+ "bundledIn": "@cross-deck/web@1.7.0",
5943
6030
  "runtimeVerified": false
5944
6031
  },
5945
6032
  {
@@ -6019,7 +6106,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
6019
6106
  ],
6020
6107
  "registeredAt": "2026-05-26",
6021
6108
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 1.3 (web/RN) + dogfood-gap fix (swift + android)",
6022
- "bundledIn": "@cross-deck/web@1.6.3",
6109
+ "bundledIn": "@cross-deck/web@1.7.0",
6023
6110
  "runtimeVerified": true
6024
6111
  },
6025
6112
  {
@@ -6065,7 +6152,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
6065
6152
  ],
6066
6153
  "registeredAt": "2026-05-26",
6067
6154
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 6.2",
6068
- "bundledIn": "@cross-deck/web@1.6.3",
6155
+ "bundledIn": "@cross-deck/web@1.7.0",
6069
6156
  "runtimeVerified": true
6070
6157
  },
6071
6158
  {
@@ -6107,7 +6194,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
6107
6194
  ],
6108
6195
  "registeredAt": "2026-05-26",
6109
6196
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 3.2",
6110
- "bundledIn": "@cross-deck/web@1.6.3",
6197
+ "bundledIn": "@cross-deck/web@1.7.0",
6111
6198
  "runtimeVerified": true
6112
6199
  },
6113
6200
  {
@@ -6141,7 +6228,7 @@ var BUNDLED_CONTRACTS = Object.freeze([
6141
6228
  ],
6142
6229
  "registeredAt": "2026-05-26",
6143
6230
  "firstRegisteredIn": "bank-grade reconciliation v1.4.0 \u2014 phase 3.5",
6144
- "bundledIn": "@cross-deck/web@1.6.3",
6231
+ "bundledIn": "@cross-deck/web@1.7.0",
6145
6232
  "runtimeVerified": false
6146
6233
  }
6147
6234
  ]);