@wireai/activation 0.1.0 → 0.2.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/AGENTS.md +82 -40
- package/CHANGELOG.md +17 -2
- package/INTEGRATION_PROMPT.md +8 -8
- package/README.md +38 -38
- package/dist/analytics/index.d.mts +92 -0
- package/dist/analytics/index.d.ts +92 -0
- package/dist/analytics/index.js +439 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +426 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/coachmarks/index.js.map +1 -1
- package/dist/coachmarks/index.mjs.map +1 -1
- package/dist/decision-BzbiKwk3.d.mts +79 -0
- package/dist/decision-plDEOCkt.d.ts +79 -0
- package/dist/eventQueue-CxKi7Qd5.d.mts +546 -0
- package/dist/eventQueue-rV1dtJJR.d.ts +546 -0
- package/dist/index.d.mts +162 -418
- package/dist/index.d.ts +162 -418
- package/dist/index.js +407 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +402 -5
- package/dist/index.mjs.map +1 -1
- package/dist/questionnaire/index.d.mts +2 -1
- package/dist/questionnaire/index.d.ts +2 -1
- package/dist/questionnaire/index.js.map +1 -1
- package/dist/questionnaire/index.mjs.map +1 -1
- package/dist/reviews/index.d.mts +5 -40
- package/dist/reviews/index.d.ts +5 -40
- package/dist/reviews/index.js.map +1 -1
- package/dist/reviews/index.mjs.map +1 -1
- package/dist/showcase/index.js.map +1 -1
- package/dist/showcase/index.mjs.map +1 -1
- package/dist/transport-BeO_Brcu.d.mts +40 -0
- package/dist/transport-DLpd1v5_.d.ts +40 -0
- package/dist/{decision-Cl8OFYzu.d.mts → types-A6pTxIZV.d.mts} +1 -77
- package/dist/{decision-CFvGY6nP.d.ts → types-BhpXJGlg.d.ts} +1 -77
- package/llms.txt +7 -7
- package/metro/index.d.ts +3 -3
- package/metro/index.js +3 -3
- package/package.json +15 -1
- package/src/analytics/contextEnvelope.ts +72 -0
- package/src/analytics/eventQueue.ts +331 -0
- package/src/analytics/index.ts +47 -0
- package/src/analytics/screenTracking.ts +122 -0
- package/src/analytics/useScreenTracking.ts +48 -0
- package/src/coachmarks/index.ts +2 -2
- package/src/features/WireFeaturesProvider.tsx +1 -1
- package/src/features/index.ts +2 -2
- package/src/index.ts +18 -1
- package/src/questionnaire/index.ts +2 -2
- package/src/reviews/index.ts +2 -2
- package/src/session-analytics/index.ts +20 -0
- package/src/session-analytics/lifecycle.ts +236 -0
- package/src/session-analytics/reportSessionStart.ts +27 -7
- package/src/session-analytics/useLifecycleEvents.ts +184 -0
- package/src/showcase/index.ts +2 -2
- package/src/types.ts +1 -1
package/dist/index.mjs
CHANGED
|
@@ -3095,7 +3095,7 @@ var resetSessionStartGuard = () => {
|
|
|
3095
3095
|
var reportSessionStart = (opts) => {
|
|
3096
3096
|
var _a;
|
|
3097
3097
|
const target = opts.target;
|
|
3098
|
-
if (!(target == null ? void 0 : target.serverUrl)) return;
|
|
3098
|
+
if (!opts.sink && !(target == null ? void 0 : target.serverUrl)) return;
|
|
3099
3099
|
const sessionId = (_a = opts.sessionId) != null ? _a : makeSessionId();
|
|
3100
3100
|
if (opts.once !== false) {
|
|
3101
3101
|
if (_emitted.has(sessionId)) return;
|
|
@@ -3106,9 +3106,6 @@ var reportSessionStart = (opts) => {
|
|
|
3106
3106
|
_emitted.add(sessionId);
|
|
3107
3107
|
}
|
|
3108
3108
|
try {
|
|
3109
|
-
const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
|
|
3110
|
-
const headers = { "Content-Type": "application/json" };
|
|
3111
|
-
if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
|
|
3112
3109
|
const userContext = {};
|
|
3113
3110
|
if (opts.deviceKey) userContext.device_key = opts.deviceKey;
|
|
3114
3111
|
if (typeof opts.sessionCount === "number" && Number.isFinite(opts.sessionCount)) {
|
|
@@ -3127,6 +3124,14 @@ var reportSessionStart = (opts) => {
|
|
|
3127
3124
|
if (Object.keys(userContext).length > 0) event.user_context = userContext;
|
|
3128
3125
|
if (opts.device) event.device = opts.device;
|
|
3129
3126
|
if (opts.meta && Object.keys(opts.meta).length > 0) event.meta = JSON.stringify(opts.meta);
|
|
3127
|
+
if (opts.sink) {
|
|
3128
|
+
opts.sink(event);
|
|
3129
|
+
return;
|
|
3130
|
+
}
|
|
3131
|
+
if (!(target == null ? void 0 : target.serverUrl)) return;
|
|
3132
|
+
const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
|
|
3133
|
+
const headers = { "Content-Type": "application/json" };
|
|
3134
|
+
if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
|
|
3130
3135
|
void fetch(url, {
|
|
3131
3136
|
method: "POST",
|
|
3132
3137
|
headers,
|
|
@@ -3181,6 +3186,398 @@ var useSessionStart = (config, options = {}) => {
|
|
|
3181
3186
|
}, []);
|
|
3182
3187
|
};
|
|
3183
3188
|
|
|
3184
|
-
|
|
3189
|
+
// src/session-analytics/lifecycle.ts
|
|
3190
|
+
var FIRST_OPEN_EVENT = "app.first_open";
|
|
3191
|
+
var firstOpenStorageKey = (appId) => `wireai:first_open:${appId}`;
|
|
3192
|
+
var READ_TIMEOUT_MS3 = 1500;
|
|
3193
|
+
var withTimeout3 = (p, ms) => {
|
|
3194
|
+
let timer;
|
|
3195
|
+
const timeout = new Promise((resolve) => {
|
|
3196
|
+
timer = setTimeout(() => resolve(void 0), ms);
|
|
3197
|
+
});
|
|
3198
|
+
return Promise.race([p, timeout]).finally(() => clearTimeout(timer));
|
|
3199
|
+
};
|
|
3200
|
+
var _firstOpenLatched = /* @__PURE__ */ new Set();
|
|
3201
|
+
var resetFirstOpenLatch = () => {
|
|
3202
|
+
_firstOpenLatched.clear();
|
|
3203
|
+
};
|
|
3204
|
+
var buildLifecycleEvent = (questionKey, opts) => {
|
|
3205
|
+
var _a;
|
|
3206
|
+
const userContext = {};
|
|
3207
|
+
if (opts.deviceKey) userContext.device_key = opts.deviceKey;
|
|
3208
|
+
if (typeof opts.sessionCount === "number" && Number.isFinite(opts.sessionCount)) {
|
|
3209
|
+
userContext.session_count = opts.sessionCount;
|
|
3210
|
+
userContext.returning = opts.sessionCount > 1;
|
|
3211
|
+
}
|
|
3212
|
+
if (opts.appVersion) userContext.app_version = opts.appVersion;
|
|
3213
|
+
if (opts.platform) userContext.platform = opts.platform;
|
|
3214
|
+
const event = {
|
|
3215
|
+
event_type: "app_event",
|
|
3216
|
+
question_key: questionKey,
|
|
3217
|
+
session_id: (_a = opts.sessionId) != null ? _a : makeSessionId()
|
|
3218
|
+
};
|
|
3219
|
+
const userId = sanitizeUserId(opts.userId);
|
|
3220
|
+
if (userId) event.user_id = userId;
|
|
3221
|
+
if (Object.keys(userContext).length > 0) event.user_context = userContext;
|
|
3222
|
+
if (opts.device) event.device = opts.device;
|
|
3223
|
+
if (opts.meta && Object.keys(opts.meta).length > 0) event.meta = JSON.stringify(opts.meta);
|
|
3224
|
+
return event;
|
|
3225
|
+
};
|
|
3226
|
+
var routeLifecycleEvent = (event, opts) => {
|
|
3227
|
+
try {
|
|
3228
|
+
if (opts.sink) {
|
|
3229
|
+
opts.sink(event);
|
|
3230
|
+
return;
|
|
3231
|
+
}
|
|
3232
|
+
const target = opts.target;
|
|
3233
|
+
if (!(target == null ? void 0 : target.serverUrl)) return;
|
|
3234
|
+
const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
|
|
3235
|
+
const headers = { "Content-Type": "application/json" };
|
|
3236
|
+
if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
|
|
3237
|
+
void fetch(url, {
|
|
3238
|
+
method: "POST",
|
|
3239
|
+
headers,
|
|
3240
|
+
body: JSON.stringify({ events: [event] })
|
|
3241
|
+
}).catch(() => {
|
|
3242
|
+
});
|
|
3243
|
+
} catch {
|
|
3244
|
+
}
|
|
3245
|
+
};
|
|
3246
|
+
var emitFirstOpen = (opts) => {
|
|
3247
|
+
routeLifecycleEvent(buildLifecycleEvent(FIRST_OPEN_EVENT, opts), opts);
|
|
3248
|
+
};
|
|
3249
|
+
var reportFirstOpen = (opts) => {
|
|
3250
|
+
var _a;
|
|
3251
|
+
const appId = (_a = opts.appId) != null ? _a : "default";
|
|
3252
|
+
if (_firstOpenLatched.has(appId)) return;
|
|
3253
|
+
_firstOpenLatched.add(appId);
|
|
3254
|
+
const storage = opts.storage;
|
|
3255
|
+
if (!storage) {
|
|
3256
|
+
emitFirstOpen(opts);
|
|
3257
|
+
return;
|
|
3258
|
+
}
|
|
3259
|
+
const key = firstOpenStorageKey(appId);
|
|
3260
|
+
void (async () => {
|
|
3261
|
+
try {
|
|
3262
|
+
const seen = await withTimeout3(storage.getItem(key), READ_TIMEOUT_MS3);
|
|
3263
|
+
if (seen) return;
|
|
3264
|
+
emitFirstOpen(opts);
|
|
3265
|
+
try {
|
|
3266
|
+
void storage.setItem(key, JSON.stringify({ ts: Date.now() })).catch(() => {
|
|
3267
|
+
});
|
|
3268
|
+
} catch {
|
|
3269
|
+
}
|
|
3270
|
+
} catch {
|
|
3271
|
+
emitFirstOpen(opts);
|
|
3272
|
+
}
|
|
3273
|
+
})();
|
|
3274
|
+
};
|
|
3275
|
+
var wireLifecycleEvents = (opts) => {
|
|
3276
|
+
reportFirstOpen(opts);
|
|
3277
|
+
reportSessionStart({
|
|
3278
|
+
target: opts.target,
|
|
3279
|
+
sink: opts.sink,
|
|
3280
|
+
sessionId: opts.sessionId,
|
|
3281
|
+
userId: opts.userId,
|
|
3282
|
+
deviceKey: opts.deviceKey,
|
|
3283
|
+
sessionCount: opts.sessionCount,
|
|
3284
|
+
appVersion: opts.appVersion,
|
|
3285
|
+
platform: opts.platform,
|
|
3286
|
+
device: opts.device,
|
|
3287
|
+
meta: opts.meta
|
|
3288
|
+
});
|
|
3289
|
+
};
|
|
3290
|
+
|
|
3291
|
+
// src/analytics/eventQueue.ts
|
|
3292
|
+
var DEFAULTS = {
|
|
3293
|
+
maxSize: 200,
|
|
3294
|
+
batchSize: 20,
|
|
3295
|
+
baseBackoffMs: 1e3,
|
|
3296
|
+
maxBackoffMs: 3e4,
|
|
3297
|
+
maxRetries: 6
|
|
3298
|
+
};
|
|
3299
|
+
var READ_TIMEOUT_MS4 = 1500;
|
|
3300
|
+
var withTimeout4 = (p, ms) => {
|
|
3301
|
+
let timer;
|
|
3302
|
+
const timeout = new Promise((resolve) => {
|
|
3303
|
+
timer = setTimeout(() => resolve(void 0), ms);
|
|
3304
|
+
});
|
|
3305
|
+
return Promise.race([p, timeout]).finally(() => clearTimeout(timer));
|
|
3306
|
+
};
|
|
3307
|
+
var unrefTimer = (timer) => {
|
|
3308
|
+
const t = timer;
|
|
3309
|
+
if (typeof t.unref === "function") t.unref();
|
|
3310
|
+
};
|
|
3311
|
+
var parsePersisted2 = (raw) => {
|
|
3312
|
+
if (!raw) return [];
|
|
3313
|
+
try {
|
|
3314
|
+
const parsed = JSON.parse(raw);
|
|
3315
|
+
if (!Array.isArray(parsed)) return [];
|
|
3316
|
+
const items = [];
|
|
3317
|
+
for (const entry of parsed) {
|
|
3318
|
+
if (entry && typeof entry === "object" && typeof entry.id === "number" && entry.event && typeof entry.event === "object") {
|
|
3319
|
+
items.push(entry);
|
|
3320
|
+
}
|
|
3321
|
+
}
|
|
3322
|
+
return items;
|
|
3323
|
+
} catch {
|
|
3324
|
+
return [];
|
|
3325
|
+
}
|
|
3326
|
+
};
|
|
3327
|
+
var createEventQueue = (options) => {
|
|
3328
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
3329
|
+
const target = options.target;
|
|
3330
|
+
const storage = options.storage;
|
|
3331
|
+
const key = (_b = options.storageKey) != null ? _b : `wireai:evtq:${(_a = options.appId) != null ? _a : "default"}`;
|
|
3332
|
+
const maxSize = (_c = options.maxSize) != null ? _c : DEFAULTS.maxSize;
|
|
3333
|
+
const batchSize = (_d = options.batchSize) != null ? _d : DEFAULTS.batchSize;
|
|
3334
|
+
const baseBackoffMs = (_e = options.baseBackoffMs) != null ? _e : DEFAULTS.baseBackoffMs;
|
|
3335
|
+
const maxBackoffMs = (_f = options.maxBackoffMs) != null ? _f : DEFAULTS.maxBackoffMs;
|
|
3336
|
+
const maxRetries = (_g = options.maxRetries) != null ? _g : DEFAULTS.maxRetries;
|
|
3337
|
+
let pending = [];
|
|
3338
|
+
let nextId = 0;
|
|
3339
|
+
let flushing = false;
|
|
3340
|
+
let attempt = 0;
|
|
3341
|
+
let retryTimer;
|
|
3342
|
+
const resolveEnvelope = () => {
|
|
3343
|
+
try {
|
|
3344
|
+
return typeof options.envelope === "function" ? options.envelope() : options.envelope;
|
|
3345
|
+
} catch {
|
|
3346
|
+
return void 0;
|
|
3347
|
+
}
|
|
3348
|
+
};
|
|
3349
|
+
const stamp = (event) => {
|
|
3350
|
+
var _a2;
|
|
3351
|
+
const env = resolveEnvelope();
|
|
3352
|
+
const stamped = { ...event };
|
|
3353
|
+
if (!env) return stamped;
|
|
3354
|
+
if (!stamped.device && env.device) stamped.device = env.device;
|
|
3355
|
+
if (!stamped.session_id && env.sessionId) stamped.session_id = env.sessionId;
|
|
3356
|
+
const uc = { ...(_a2 = stamped.user_context) != null ? _a2 : {} };
|
|
3357
|
+
if (env.appVersion && uc.app_version === void 0) uc.app_version = env.appVersion;
|
|
3358
|
+
if (env.appBuild && uc.app_build === void 0) uc.app_build = env.appBuild;
|
|
3359
|
+
if (env.networkType && uc.network_type === void 0) uc.network_type = env.networkType;
|
|
3360
|
+
if (Object.keys(uc).length > 0) stamped.user_context = uc;
|
|
3361
|
+
return stamped;
|
|
3362
|
+
};
|
|
3363
|
+
const persist = () => {
|
|
3364
|
+
if (!storage) return;
|
|
3365
|
+
try {
|
|
3366
|
+
if (pending.length === 0) {
|
|
3367
|
+
void storage.removeItem(key).catch(() => {
|
|
3368
|
+
});
|
|
3369
|
+
return;
|
|
3370
|
+
}
|
|
3371
|
+
const payload = pending.map((item) => ({ id: item.id, event: item.event }));
|
|
3372
|
+
void storage.setItem(key, JSON.stringify(payload)).catch(() => {
|
|
3373
|
+
});
|
|
3374
|
+
} catch {
|
|
3375
|
+
}
|
|
3376
|
+
};
|
|
3377
|
+
const enforceSizeCap = () => {
|
|
3378
|
+
if (pending.length > maxSize) pending.splice(0, pending.length - maxSize);
|
|
3379
|
+
};
|
|
3380
|
+
const safeSig = (event) => {
|
|
3381
|
+
try {
|
|
3382
|
+
return JSON.stringify(event);
|
|
3383
|
+
} catch {
|
|
3384
|
+
return `__nosig_${nextId}_${Math.random()}`;
|
|
3385
|
+
}
|
|
3386
|
+
};
|
|
3387
|
+
const loadPromise = (async () => {
|
|
3388
|
+
if (!storage) return;
|
|
3389
|
+
try {
|
|
3390
|
+
const persistedItems = parsePersisted2(await withTimeout4(storage.getItem(key), READ_TIMEOUT_MS4));
|
|
3391
|
+
if (persistedItems.length === 0) return;
|
|
3392
|
+
const events = [...persistedItems.map((p) => p.event), ...pending.map((p) => p.event)];
|
|
3393
|
+
pending = [];
|
|
3394
|
+
nextId = 0;
|
|
3395
|
+
const seen = /* @__PURE__ */ new Set();
|
|
3396
|
+
for (const event of events) {
|
|
3397
|
+
const sig = safeSig(event);
|
|
3398
|
+
if (seen.has(sig)) continue;
|
|
3399
|
+
seen.add(sig);
|
|
3400
|
+
pending.push({ id: nextId++, event, sig });
|
|
3401
|
+
}
|
|
3402
|
+
enforceSizeCap();
|
|
3403
|
+
persist();
|
|
3404
|
+
} catch {
|
|
3405
|
+
}
|
|
3406
|
+
})();
|
|
3407
|
+
const postBatch = async (events) => {
|
|
3408
|
+
if (!(target == null ? void 0 : target.serverUrl) || events.length === 0) return false;
|
|
3409
|
+
try {
|
|
3410
|
+
const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
|
|
3411
|
+
const headers = { "Content-Type": "application/json" };
|
|
3412
|
+
if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
|
|
3413
|
+
const res = await fetch(url, {
|
|
3414
|
+
method: "POST",
|
|
3415
|
+
headers,
|
|
3416
|
+
body: JSON.stringify({ events })
|
|
3417
|
+
});
|
|
3418
|
+
return !!(res && res.ok);
|
|
3419
|
+
} catch {
|
|
3420
|
+
return false;
|
|
3421
|
+
}
|
|
3422
|
+
};
|
|
3423
|
+
const clearRetry = () => {
|
|
3424
|
+
if (retryTimer !== void 0) {
|
|
3425
|
+
clearTimeout(retryTimer);
|
|
3426
|
+
retryTimer = void 0;
|
|
3427
|
+
}
|
|
3428
|
+
};
|
|
3429
|
+
const scheduleRetry = () => {
|
|
3430
|
+
if (attempt >= maxRetries) return;
|
|
3431
|
+
const delay = Math.min(baseBackoffMs * 2 ** attempt, maxBackoffMs);
|
|
3432
|
+
attempt++;
|
|
3433
|
+
clearRetry();
|
|
3434
|
+
retryTimer = setTimeout(() => {
|
|
3435
|
+
retryTimer = void 0;
|
|
3436
|
+
void drain();
|
|
3437
|
+
}, delay);
|
|
3438
|
+
unrefTimer(retryTimer);
|
|
3439
|
+
};
|
|
3440
|
+
const drain = async () => {
|
|
3441
|
+
try {
|
|
3442
|
+
await loadPromise;
|
|
3443
|
+
} catch {
|
|
3444
|
+
}
|
|
3445
|
+
if (flushing) return;
|
|
3446
|
+
flushing = true;
|
|
3447
|
+
try {
|
|
3448
|
+
while (pending.length > 0) {
|
|
3449
|
+
const batch = pending.slice(0, batchSize);
|
|
3450
|
+
const ok = await postBatch(batch.map((item) => item.event));
|
|
3451
|
+
if (!ok) {
|
|
3452
|
+
scheduleRetry();
|
|
3453
|
+
return;
|
|
3454
|
+
}
|
|
3455
|
+
const acked = new Set(batch.map((item) => item.id));
|
|
3456
|
+
pending = pending.filter((item) => !acked.has(item.id));
|
|
3457
|
+
persist();
|
|
3458
|
+
attempt = 0;
|
|
3459
|
+
clearRetry();
|
|
3460
|
+
}
|
|
3461
|
+
} finally {
|
|
3462
|
+
flushing = false;
|
|
3463
|
+
}
|
|
3464
|
+
};
|
|
3465
|
+
const flush = () => {
|
|
3466
|
+
try {
|
|
3467
|
+
void drain();
|
|
3468
|
+
} catch {
|
|
3469
|
+
}
|
|
3470
|
+
};
|
|
3471
|
+
const enqueue = (event) => {
|
|
3472
|
+
try {
|
|
3473
|
+
const stamped = stamp(event);
|
|
3474
|
+
const sig = safeSig(stamped);
|
|
3475
|
+
for (const item of pending) {
|
|
3476
|
+
if (item.sig === sig) return;
|
|
3477
|
+
}
|
|
3478
|
+
pending.push({ id: nextId++, event: stamped, sig });
|
|
3479
|
+
enforceSizeCap();
|
|
3480
|
+
persist();
|
|
3481
|
+
if (retryTimer === void 0) flush();
|
|
3482
|
+
} catch {
|
|
3483
|
+
}
|
|
3484
|
+
};
|
|
3485
|
+
const notifyOnline = () => {
|
|
3486
|
+
attempt = 0;
|
|
3487
|
+
clearRetry();
|
|
3488
|
+
flush();
|
|
3489
|
+
};
|
|
3490
|
+
const size = () => pending.length;
|
|
3491
|
+
return { enqueue, flush, notifyOnline, size };
|
|
3492
|
+
};
|
|
3493
|
+
|
|
3494
|
+
// src/session-analytics/useLifecycleEvents.ts
|
|
3495
|
+
var useLifecycleEvents = (config, options = {}) => {
|
|
3496
|
+
const latest = useRef({ config, options });
|
|
3497
|
+
latest.current = { config, options };
|
|
3498
|
+
const queueRef = useRef(void 0);
|
|
3499
|
+
useEffect(() => {
|
|
3500
|
+
var _a;
|
|
3501
|
+
const resolveSink = () => {
|
|
3502
|
+
var _a2, _b;
|
|
3503
|
+
const { config: cfg, options: opts } = latest.current;
|
|
3504
|
+
if (opts.sink) return opts.sink;
|
|
3505
|
+
if (!(cfg == null ? void 0 : cfg.serverUrl)) return void 0;
|
|
3506
|
+
if (!queueRef.current) {
|
|
3507
|
+
queueRef.current = createEventQueue({
|
|
3508
|
+
target: { serverUrl: cfg.serverUrl, apiKey: (_a2 = cfg.apiKey) != null ? _a2 : "" },
|
|
3509
|
+
storage: cfg.storage,
|
|
3510
|
+
// Dedicated key so the hook's internal queue never collides with a host's main queue.
|
|
3511
|
+
storageKey: `wireai:evtq:lifecycle:${(_b = cfg.appId) != null ? _b : "default"}`,
|
|
3512
|
+
envelope: opts.envelope
|
|
3513
|
+
});
|
|
3514
|
+
}
|
|
3515
|
+
return queueRef.current.enqueue;
|
|
3516
|
+
};
|
|
3517
|
+
const targetOf = (cfg) => {
|
|
3518
|
+
var _a2;
|
|
3519
|
+
return (cfg == null ? void 0 : cfg.serverUrl) ? { serverUrl: cfg.serverUrl, apiKey: (_a2 = cfg.apiKey) != null ? _a2 : "" } : void 0;
|
|
3520
|
+
};
|
|
3521
|
+
{
|
|
3522
|
+
const { config: cfg, options: opts } = latest.current;
|
|
3523
|
+
if (opts.enabled !== false) {
|
|
3524
|
+
const device = collectDeviceContext();
|
|
3525
|
+
if ((cfg == null ? void 0 : cfg.appVersion) && !device.appVersion) device.appVersion = cfg.appVersion;
|
|
3526
|
+
reportFirstOpen({
|
|
3527
|
+
target: targetOf(cfg),
|
|
3528
|
+
sink: resolveSink(),
|
|
3529
|
+
storage: cfg == null ? void 0 : cfg.storage,
|
|
3530
|
+
appId: cfg == null ? void 0 : cfg.appId,
|
|
3531
|
+
userId: opts.userId,
|
|
3532
|
+
deviceKey: opts.deviceKey,
|
|
3533
|
+
sessionCount: opts.sessionCount,
|
|
3534
|
+
appVersion: (_a = cfg == null ? void 0 : cfg.appVersion) != null ? _a : device.appVersion,
|
|
3535
|
+
platform: Platform.OS,
|
|
3536
|
+
device,
|
|
3537
|
+
meta: opts.meta
|
|
3538
|
+
});
|
|
3539
|
+
}
|
|
3540
|
+
}
|
|
3541
|
+
const fireSession = () => {
|
|
3542
|
+
var _a2;
|
|
3543
|
+
const { config: cfg, options: opts } = latest.current;
|
|
3544
|
+
if (opts.enabled === false) return;
|
|
3545
|
+
if (!(cfg == null ? void 0 : cfg.serverUrl) && !opts.sink) return;
|
|
3546
|
+
const device = collectDeviceContext();
|
|
3547
|
+
if ((cfg == null ? void 0 : cfg.appVersion) && !device.appVersion) device.appVersion = cfg.appVersion;
|
|
3548
|
+
reportSessionStart({
|
|
3549
|
+
target: targetOf(cfg),
|
|
3550
|
+
sink: resolveSink(),
|
|
3551
|
+
// A fresh per-open id each fire; the emitter's once-guard dedupes within the open.
|
|
3552
|
+
userId: opts.userId,
|
|
3553
|
+
deviceKey: opts.deviceKey,
|
|
3554
|
+
sessionCount: opts.sessionCount,
|
|
3555
|
+
appVersion: (_a2 = cfg == null ? void 0 : cfg.appVersion) != null ? _a2 : device.appVersion,
|
|
3556
|
+
platform: Platform.OS,
|
|
3557
|
+
device,
|
|
3558
|
+
meta: opts.meta
|
|
3559
|
+
});
|
|
3560
|
+
};
|
|
3561
|
+
fireSession();
|
|
3562
|
+
let backgroundedAt = null;
|
|
3563
|
+
const onChange = (state) => {
|
|
3564
|
+
if (state === "background" || state === "inactive") {
|
|
3565
|
+
if (backgroundedAt == null) backgroundedAt = Date.now();
|
|
3566
|
+
return;
|
|
3567
|
+
}
|
|
3568
|
+
if (state === "active") {
|
|
3569
|
+
const since = backgroundedAt;
|
|
3570
|
+
backgroundedAt = null;
|
|
3571
|
+
if (since != null && Date.now() - since >= BACKGROUND_SESSION_MS) fireSession();
|
|
3572
|
+
}
|
|
3573
|
+
};
|
|
3574
|
+
const sub = AppState.addEventListener("change", onChange);
|
|
3575
|
+
return () => {
|
|
3576
|
+
if (sub && typeof sub.remove === "function") sub.remove();
|
|
3577
|
+
};
|
|
3578
|
+
}, []);
|
|
3579
|
+
};
|
|
3580
|
+
|
|
3581
|
+
export { AnimatedSparkle, BACKGROUND_SESSION_MS, CardHandoff, CenteredModal, ChipSelectCard, CompletionView, DEFAULT_FEATURES_TTL_MS, DEFAULT_SESSION_TTL_MS, DemoOnboarding, DoneBlock, ErrorBlock, FIRST_OPEN_EVENT, IllustrationProvider, InterstitialCard, LoadingBlock, LoadingScreen, NumberStepperCard, Button as OnboardingButton, OnboardingFlow, OnboardingScaffold, OnboardingThemeProvider, SESSION_STARTED_EVENT, SelectionCard, StatusCard, StepProgress, TextInputCard, USER_ID_MAX_LENGTH, WIRE_ONBOARDING_EVENTS, WireFeaturesProvider, WireOnboarding, attributionMetadata, clearPersistedSession, collectDeviceContext, defaultIllustrations, defaultOnboardingTheme, defaultWireFeatures, deriveAnswers, featuresCacheKey, featuresEqual, fetchWireFeatures, firstOpenStorageKey, identifyOnboarding, isFeaturesFresh, isOnboardingEnabled, loadPersistedSession, makeSessionId, mergeTheme, motionSpec_exports as motionSpec, onboardingComponents, parseWireFeatures, peekPersistedSession, readCachedFeatures, readProgress, reportClientEvent, reportClientEvents, reportFirstOpen, reportSessionStart, resetFirstOpenLatch, resetSessionStartGuard, sanitizeUserId, savePersistedSession, sessionStorageKey, themeFromBrand, toAnalyticsEvent, useIllustration, useLifecycleEvents, useOnboardingTheme, useReducedMotion, useResolvedFeatures, useSessionStart, useWireFeatures, useWireFeaturesContext, wireConfigFromEnv, wireLifecycleEvents, writeCachedFeatures };
|
|
3185
3582
|
//# sourceMappingURL=index.mjs.map
|
|
3186
3583
|
//# sourceMappingURL=index.mjs.map
|