@wireai/activation 0.9.1 → 0.10.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/dist/index.js CHANGED
@@ -1507,22 +1507,38 @@ var readProgress = (response) => {
1507
1507
 
1508
1508
  // src/analytics/reportClientEvent.ts
1509
1509
  var makeSessionId = () => `wire_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
1510
- var reportClientEvents = (target, events) => {
1511
- if (!(target == null ? void 0 : target.serverUrl) || events.length === 0) return;
1510
+ var buildEventsRequest = (target, events) => {
1511
+ if (!(target == null ? void 0 : target.serverUrl) || events.length === 0) return null;
1512
1512
  try {
1513
1513
  const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
1514
1514
  const headers = { "Content-Type": "application/json" };
1515
1515
  if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
1516
- void fetch(url, {
1517
- method: "POST",
1518
- headers,
1519
- body: JSON.stringify({ events })
1520
- }).catch(() => {
1516
+ return { url, init: { method: "POST", headers, body: JSON.stringify({ events }) } };
1517
+ } catch {
1518
+ return null;
1519
+ }
1520
+ };
1521
+ var reportClientEvents = (target, events) => {
1522
+ try {
1523
+ const req = buildEventsRequest(target, events);
1524
+ if (!req) return;
1525
+ void fetch(req.url, req.init).catch(() => {
1521
1526
  });
1522
1527
  } catch {
1523
1528
  }
1524
1529
  };
1525
1530
  var reportClientEvent = (target, event) => reportClientEvents(target, [event]);
1531
+ var reportClientEventsAwait = async (target, events) => {
1532
+ try {
1533
+ const req = buildEventsRequest(target, events);
1534
+ if (!req) return false;
1535
+ const res = await fetch(req.url, req.init);
1536
+ return Boolean(res && res.ok);
1537
+ } catch {
1538
+ return false;
1539
+ }
1540
+ };
1541
+ var reportClientEventAwait = (target, event) => reportClientEventsAwait(target, [event]);
1526
1542
 
1527
1543
  // src/analytics/sendPreview.ts
1528
1544
  var sendPreview = (target, { sessionId, userMessage }) => {
@@ -3285,13 +3301,18 @@ var collectDeviceContext = () => {
3285
3301
  };
3286
3302
 
3287
3303
  // src/analytics/currentSession.ts
3288
- var _currentSessionId;
3304
+ var CURRENT_SESSION_ID_SLOT = /* @__PURE__ */ Symbol.for(
3305
+ "@wireai/activation:currentSessionId"
3306
+ );
3307
+ var globalSlot = globalThis;
3289
3308
  var setCurrentSessionId = (id) => {
3290
- if (typeof id === "string" && id.length > 0) _currentSessionId = id;
3309
+ if (typeof id === "string" && id.length > 0) {
3310
+ globalSlot[CURRENT_SESSION_ID_SLOT] = id;
3311
+ }
3291
3312
  };
3292
- var getCurrentSessionId = () => _currentSessionId;
3313
+ var getCurrentSessionId = () => globalSlot[CURRENT_SESSION_ID_SLOT];
3293
3314
  var resetCurrentSessionId = () => {
3294
- _currentSessionId = void 0;
3315
+ globalSlot[CURRENT_SESSION_ID_SLOT] = void 0;
3295
3316
  };
3296
3317
 
3297
3318
  // src/session/persistedSession.ts
@@ -3351,6 +3372,7 @@ var clearPersistedSession = (storage, key) => {
3351
3372
  } catch {
3352
3373
  }
3353
3374
  };
3375
+ var shouldClearOnComplete = (retainSessionOnComplete) => !retainSessionOnComplete;
3354
3376
 
3355
3377
  // src/identity/userIdentity.ts
3356
3378
  var USER_ID_MAX_LENGTH = 128;
@@ -3400,6 +3422,7 @@ var WireOnboarding = ({
3400
3422
  storage,
3401
3423
  sessionTtlMs = DEFAULT_SESSION_TTL_MS,
3402
3424
  persistKey,
3425
+ retainSessionOnComplete,
3403
3426
  userContext,
3404
3427
  userId
3405
3428
  }) => {
@@ -3434,10 +3457,10 @@ var WireOnboarding = ({
3434
3457
  }, [storage, storageKey, sessionTtlMs, session]);
3435
3458
  const handleComplete = React18.useCallback(
3436
3459
  (result) => {
3437
- if (storage) clearPersistedSession(storage, storageKey);
3460
+ if (storage && shouldClearOnComplete(retainSessionOnComplete)) clearPersistedSession(storage, storageKey);
3438
3461
  onComplete(result);
3439
3462
  },
3440
- [storage, storageKey, onComplete]
3463
+ [storage, storageKey, retainSessionOnComplete, onComplete]
3441
3464
  );
3442
3465
  const sessionId = (_a2 = session == null ? void 0 : session.id) != null ? _a2 : "";
3443
3466
  const startupUserIdRef = React18.useRef(boundUserId);
@@ -4113,6 +4136,115 @@ var mintDeviceId = () => {
4113
4136
  return `${AUTO_DEVICE_ID_PREFIX}${time}_${randomChunk()}${randomChunk()}`;
4114
4137
  };
4115
4138
 
4139
+ // src/activation/revalidation.ts
4140
+ var REVALIDATION_SLOT = /* @__PURE__ */ Symbol.for(
4141
+ "@wireai/activation:activationRevalidation"
4142
+ );
4143
+ var globalSlot2 = globalThis;
4144
+ var store = () => {
4145
+ const existing = globalSlot2[REVALIDATION_SLOT];
4146
+ if (existing) return existing;
4147
+ const created = { version: 0, listeners: /* @__PURE__ */ new Set() };
4148
+ globalSlot2[REVALIDATION_SLOT] = created;
4149
+ return created;
4150
+ };
4151
+ var bumpActivationRevalidation = () => {
4152
+ const s = store();
4153
+ s.version += 1;
4154
+ for (const listener of Array.from(s.listeners)) {
4155
+ try {
4156
+ listener();
4157
+ } catch {
4158
+ }
4159
+ }
4160
+ };
4161
+ var subscribeActivationRevalidation = (listener) => {
4162
+ const s = store();
4163
+ s.listeners.add(listener);
4164
+ return () => {
4165
+ s.listeners.delete(listener);
4166
+ };
4167
+ };
4168
+ var getActivationRevalidationVersion = () => store().version;
4169
+ var resetActivationRevalidation = () => {
4170
+ const s = store();
4171
+ s.version = 0;
4172
+ s.listeners.clear();
4173
+ };
4174
+
4175
+ // src/activation/wireActivation.ts
4176
+ var clean = (value) => {
4177
+ if (typeof value !== "string") return void 0;
4178
+ const trimmed = value.trim();
4179
+ return trimmed.length > 0 ? trimmed : void 0;
4180
+ };
4181
+ var createWireActivation = (config) => {
4182
+ var _a2, _b;
4183
+ const target = { serverUrl: config.serverUrl, apiKey: config.apiKey };
4184
+ const explicitDeviceKey = (_b = clean(config.deviceKey)) != null ? _b : clean((_a2 = config.userContext) == null ? void 0 : _a2.deviceKey);
4185
+ let autoDeviceKey = explicitDeviceKey != null ? explicitDeviceKey : mintDeviceId();
4186
+ if (config.storage && !explicitDeviceKey) {
4187
+ const storage = config.storage;
4188
+ const key = deviceIdStorageKey(config.appId);
4189
+ void storage.getItem(key).then((saved) => {
4190
+ const persisted = clean(saved != null ? saved : void 0);
4191
+ if (persisted) autoDeviceKey = persisted;
4192
+ else void storage.setItem(key, autoDeviceKey).catch(() => {
4193
+ });
4194
+ }).catch(() => {
4195
+ });
4196
+ }
4197
+ const applyContext = (event) => {
4198
+ var _a3, _b2;
4199
+ const resolved = resolveUserContext(
4200
+ { ...(_a3 = config.userContext) != null ? _a3 : {}, deviceKey: explicitDeviceKey != null ? explicitDeviceKey : autoDeviceKey },
4201
+ { autoAppVersion: config.appVersion }
4202
+ );
4203
+ if (resolved.userContext) {
4204
+ event.user_context = { ...resolved.userContext, ...(_b2 = event.user_context) != null ? _b2 : {} };
4205
+ }
4206
+ if (resolved.userId && !event.user_id) event.user_id = resolved.userId;
4207
+ };
4208
+ const track = async (name2, meta) => {
4209
+ const sessionId = getCurrentSessionId();
4210
+ if (!clean(name2) || !sessionId) return false;
4211
+ const event = {
4212
+ event_type: "app_event",
4213
+ session_id: sessionId,
4214
+ question_key: name2
4215
+ };
4216
+ if (meta && Object.keys(meta).length > 0) event.meta = JSON.stringify(meta);
4217
+ applyContext(event);
4218
+ const ok = await reportClientEventAwait(target, event);
4219
+ if (ok) bumpActivationRevalidation();
4220
+ return ok;
4221
+ };
4222
+ return {
4223
+ track,
4224
+ get sessionId() {
4225
+ return getCurrentSessionId();
4226
+ },
4227
+ subscribeRevalidation: subscribeActivationRevalidation,
4228
+ getRevalidationVersion: getActivationRevalidationVersion
4229
+ };
4230
+ };
4231
+ var useActivationRevalidation = () => React18.useSyncExternalStore(
4232
+ subscribeActivationRevalidation,
4233
+ getActivationRevalidationVersion,
4234
+ getActivationRevalidationVersion
4235
+ );
4236
+ var useWireActivation = (config) => {
4237
+ const ref = React18.useRef(void 0);
4238
+ const prevKeys = React18.useRef("");
4239
+ const currentKeys = `${config.serverUrl}|${config.apiKey}|${config.appId}|${config.deviceKey}`;
4240
+ if (!ref.current || prevKeys.current !== currentKeys) {
4241
+ prevKeys.current = currentKeys;
4242
+ ref.current = createWireActivation(config);
4243
+ }
4244
+ const revalidation = useActivationRevalidation();
4245
+ return { track: ref.current.track, sessionId: ref.current.sessionId, revalidation };
4246
+ };
4247
+
4116
4248
  // src/session-analytics/reportSessionStart.ts
4117
4249
  var SESSION_STARTED_EVENT = "app.session_started";
4118
4250
  var _emitted = /* @__PURE__ */ new Set();
@@ -4651,8 +4783,10 @@ exports.WireFeaturesProvider = WireFeaturesProvider;
4651
4783
  exports.WireIcon = WireIcon;
4652
4784
  exports.WireOnboarding = WireOnboarding;
4653
4785
  exports.attributionMetadata = attributionMetadata;
4786
+ exports.bumpActivationRevalidation = bumpActivationRevalidation;
4654
4787
  exports.clearPersistedSession = clearPersistedSession;
4655
4788
  exports.collectDeviceContext = collectDeviceContext;
4789
+ exports.createWireActivation = createWireActivation;
4656
4790
  exports.defaultIllustrations = defaultIllustrations;
4657
4791
  exports.defaultOnboardingTheme = defaultOnboardingTheme;
4658
4792
  exports.defaultWireFeatures = defaultWireFeatures;
@@ -4664,6 +4798,7 @@ exports.featuresCacheKey = featuresCacheKey;
4664
4798
  exports.featuresEqual = featuresEqual;
4665
4799
  exports.fetchWireFeatures = fetchWireFeatures;
4666
4800
  exports.firstOpenStorageKey = firstOpenStorageKey;
4801
+ exports.getActivationRevalidationVersion = getActivationRevalidationVersion;
4667
4802
  exports.getCurrentSessionId = getCurrentSessionId;
4668
4803
  exports.hashEmailFnv1a = hashEmailFnv1a;
4669
4804
  exports.identifyOnboarding = identifyOnboarding;
@@ -4683,9 +4818,12 @@ exports.peekPersistedSession = peekPersistedSession;
4683
4818
  exports.readCachedFeatures = readCachedFeatures;
4684
4819
  exports.readProgress = readProgress;
4685
4820
  exports.reportClientEvent = reportClientEvent;
4821
+ exports.reportClientEventAwait = reportClientEventAwait;
4686
4822
  exports.reportClientEvents = reportClientEvents;
4823
+ exports.reportClientEventsAwait = reportClientEventsAwait;
4687
4824
  exports.reportFirstOpen = reportFirstOpen;
4688
4825
  exports.reportSessionStart = reportSessionStart;
4826
+ exports.resetActivationRevalidation = resetActivationRevalidation;
4689
4827
  exports.resetCurrentSessionId = resetCurrentSessionId;
4690
4828
  exports.resetFirstOpenLatch = resetFirstOpenLatch;
4691
4829
  exports.resetSessionStartGuard = resetSessionStartGuard;
@@ -4694,8 +4832,10 @@ exports.sanitizeUserId = sanitizeUserId;
4694
4832
  exports.savePersistedSession = savePersistedSession;
4695
4833
  exports.sessionStorageKey = sessionStorageKey;
4696
4834
  exports.setCurrentSessionId = setCurrentSessionId;
4835
+ exports.subscribeActivationRevalidation = subscribeActivationRevalidation;
4697
4836
  exports.themeFromBrand = themeFromBrand;
4698
4837
  exports.toAnalyticsEvent = toAnalyticsEvent;
4838
+ exports.useActivationRevalidation = useActivationRevalidation;
4699
4839
  exports.useHostIcon = useHostIcon;
4700
4840
  exports.useIllustration = useIllustration;
4701
4841
  exports.useLifecycleEvents = useLifecycleEvents;
@@ -4703,6 +4843,7 @@ exports.useOnboardingTheme = useOnboardingTheme;
4703
4843
  exports.useReducedMotion = useReducedMotion;
4704
4844
  exports.useResolvedFeatures = useResolvedFeatures;
4705
4845
  exports.useSessionStart = useSessionStart;
4846
+ exports.useWireActivation = useWireActivation;
4706
4847
  exports.useWireFeatures = useWireFeatures;
4707
4848
  exports.useWireFeaturesContext = useWireFeaturesContext;
4708
4849
  exports.wireConfigFromEnv = wireConfigFromEnv;