@grainql/analytics-web 2.1.3 → 2.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/dist/index.js CHANGED
@@ -116,6 +116,23 @@ class GrainAnalytics {
116
116
  return v.toString(16);
117
117
  });
118
118
  }
119
+ /**
120
+ * Check if we should allow persistent storage (GDPR compliance)
121
+ *
122
+ * Returns true if:
123
+ * - Consent has been granted, OR
124
+ * - Not in opt-in mode, OR
125
+ * - User has been explicitly identified by the site (login/identify), OR
126
+ * - Using JWT auth strategy (functional/essential purpose)
127
+ */
128
+ shouldAllowPersistentStorage() {
129
+ const hasConsent = this.consentManager.hasConsent('analytics');
130
+ const isOptInMode = this.config.consentMode === 'opt-in';
131
+ const userExplicitlyIdentified = !!this.globalUserId;
132
+ const isJWTAuth = this.config.authStrategy === 'JWT';
133
+ // Allow persistent storage if any of these conditions are met
134
+ return hasConsent || !isOptInMode || userExplicitlyIdentified || isJWTAuth;
135
+ }
119
136
  /**
120
137
  * Generate a proper UUIDv4 identifier for anonymous user ID
121
138
  */
@@ -125,10 +142,19 @@ class GrainAnalytics {
125
142
  /**
126
143
  * Initialize persistent anonymous user ID from cookies or localStorage
127
144
  * Priority: Cookie → localStorage → generate new
145
+ *
146
+ * GDPR Compliance: In opt-in mode without consent, we skip loading/saving
147
+ * persistent IDs unless the user has been explicitly identified by the site
148
+ * or when using JWT auth (functional/essential purpose)
128
149
  */
129
150
  initializePersistentAnonymousUserId() {
130
151
  if (typeof window === 'undefined')
131
152
  return;
153
+ // Check if we should avoid persistent storage (GDPR compliance)
154
+ if (!this.shouldAllowPersistentStorage()) {
155
+ this.log('Opt-in mode without consent: skipping persistent ID initialization (GDPR compliance)');
156
+ return; // Don't load or create persistent ID
157
+ }
132
158
  const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
133
159
  const cookieName = '_grain_uid';
134
160
  try {
@@ -166,10 +192,18 @@ class GrainAnalytics {
166
192
  }
167
193
  /**
168
194
  * Save persistent anonymous user ID to cookie and/or localStorage
195
+ *
196
+ * GDPR Compliance: In opt-in mode without consent, we don't persist IDs
197
+ * unless the user has been explicitly identified or using JWT auth
169
198
  */
170
199
  savePersistentAnonymousUserId(userId) {
171
200
  if (typeof window === 'undefined')
172
201
  return;
202
+ // Check if we should avoid persistent storage (GDPR compliance)
203
+ if (!this.shouldAllowPersistentStorage()) {
204
+ this.log('Opt-in mode without consent: skipping persistent ID save (GDPR compliance)');
205
+ return; // Don't save persistent ID
206
+ }
173
207
  const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
174
208
  const cookieName = '_grain_uid';
175
209
  try {
@@ -192,6 +226,9 @@ class GrainAnalytics {
192
226
  }
193
227
  /**
194
228
  * Get the effective user ID (global userId or persistent anonymous ID)
229
+ *
230
+ * GDPR Compliance: In opt-in mode without consent and no explicit user identification,
231
+ * this should not be called. Use getEphemeralSessionId() instead.
195
232
  */
196
233
  getEffectiveUserIdInternal() {
197
234
  if (this.globalUserId) {
@@ -202,16 +239,8 @@ class GrainAnalytics {
202
239
  }
203
240
  // Generate a new UUIDv4 identifier as fallback
204
241
  this.persistentAnonymousUserId = this.generateAnonymousUserId();
205
- // Try to persist it
206
- if (typeof window !== 'undefined') {
207
- try {
208
- const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
209
- localStorage.setItem(storageKey, this.persistentAnonymousUserId);
210
- }
211
- catch (error) {
212
- this.log('Failed to persist generated anonymous user ID:', error);
213
- }
214
- }
242
+ // Try to persist it (will be skipped in opt-in mode without consent)
243
+ this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);
215
244
  return this.persistentAnonymousUserId;
216
245
  }
217
246
  log(...args) {
@@ -559,7 +588,12 @@ class GrainAnalytics {
559
588
  */
560
589
  handleConsentGranted() {
561
590
  this.flushWaitingForConsentQueue();
562
- // Track consent granted event with mapping
591
+ // Initialize persistent ID now that consent is granted (if not already initialized)
592
+ if (!this.persistentAnonymousUserId) {
593
+ this.initializePersistentAnonymousUserId();
594
+ this.log('Initialized persistent ID after consent grant');
595
+ }
596
+ // Track consent granted event with mapping from ephemeral to persistent ID
563
597
  if (this.ephemeralSessionId) {
564
598
  this.trackSystemEvent('_grain_consent_granted', {
565
599
  previous_session_id: this.ephemeralSessionId,
@@ -729,19 +763,11 @@ class GrainAnalytics {
729
763
  this.persistentAnonymousUserId = null;
730
764
  }
731
765
  else {
732
- // If clearing user ID, ensure we have a UUIDv4 identifier
766
+ // If clearing user ID, ensure we have an identifier
733
767
  if (!this.persistentAnonymousUserId) {
734
768
  this.persistentAnonymousUserId = this.generateAnonymousUserId();
735
- // Try to persist the new anonymous ID
736
- if (typeof window !== 'undefined') {
737
- try {
738
- const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
739
- localStorage.setItem(storageKey, this.persistentAnonymousUserId);
740
- }
741
- catch (error) {
742
- this.log('Failed to persist new anonymous user ID:', error);
743
- }
744
- }
769
+ // Try to persist the new anonymous ID (respects GDPR opt-in mode)
770
+ this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);
745
771
  }
746
772
  }
747
773
  }
package/dist/index.mjs CHANGED
@@ -112,6 +112,23 @@ export class GrainAnalytics {
112
112
  return v.toString(16);
113
113
  });
114
114
  }
115
+ /**
116
+ * Check if we should allow persistent storage (GDPR compliance)
117
+ *
118
+ * Returns true if:
119
+ * - Consent has been granted, OR
120
+ * - Not in opt-in mode, OR
121
+ * - User has been explicitly identified by the site (login/identify), OR
122
+ * - Using JWT auth strategy (functional/essential purpose)
123
+ */
124
+ shouldAllowPersistentStorage() {
125
+ const hasConsent = this.consentManager.hasConsent('analytics');
126
+ const isOptInMode = this.config.consentMode === 'opt-in';
127
+ const userExplicitlyIdentified = !!this.globalUserId;
128
+ const isJWTAuth = this.config.authStrategy === 'JWT';
129
+ // Allow persistent storage if any of these conditions are met
130
+ return hasConsent || !isOptInMode || userExplicitlyIdentified || isJWTAuth;
131
+ }
115
132
  /**
116
133
  * Generate a proper UUIDv4 identifier for anonymous user ID
117
134
  */
@@ -121,10 +138,19 @@ export class GrainAnalytics {
121
138
  /**
122
139
  * Initialize persistent anonymous user ID from cookies or localStorage
123
140
  * Priority: Cookie → localStorage → generate new
141
+ *
142
+ * GDPR Compliance: In opt-in mode without consent, we skip loading/saving
143
+ * persistent IDs unless the user has been explicitly identified by the site
144
+ * or when using JWT auth (functional/essential purpose)
124
145
  */
125
146
  initializePersistentAnonymousUserId() {
126
147
  if (typeof window === 'undefined')
127
148
  return;
149
+ // Check if we should avoid persistent storage (GDPR compliance)
150
+ if (!this.shouldAllowPersistentStorage()) {
151
+ this.log('Opt-in mode without consent: skipping persistent ID initialization (GDPR compliance)');
152
+ return; // Don't load or create persistent ID
153
+ }
128
154
  const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
129
155
  const cookieName = '_grain_uid';
130
156
  try {
@@ -162,10 +188,18 @@ export class GrainAnalytics {
162
188
  }
163
189
  /**
164
190
  * Save persistent anonymous user ID to cookie and/or localStorage
191
+ *
192
+ * GDPR Compliance: In opt-in mode without consent, we don't persist IDs
193
+ * unless the user has been explicitly identified or using JWT auth
165
194
  */
166
195
  savePersistentAnonymousUserId(userId) {
167
196
  if (typeof window === 'undefined')
168
197
  return;
198
+ // Check if we should avoid persistent storage (GDPR compliance)
199
+ if (!this.shouldAllowPersistentStorage()) {
200
+ this.log('Opt-in mode without consent: skipping persistent ID save (GDPR compliance)');
201
+ return; // Don't save persistent ID
202
+ }
169
203
  const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
170
204
  const cookieName = '_grain_uid';
171
205
  try {
@@ -188,6 +222,9 @@ export class GrainAnalytics {
188
222
  }
189
223
  /**
190
224
  * Get the effective user ID (global userId or persistent anonymous ID)
225
+ *
226
+ * GDPR Compliance: In opt-in mode without consent and no explicit user identification,
227
+ * this should not be called. Use getEphemeralSessionId() instead.
191
228
  */
192
229
  getEffectiveUserIdInternal() {
193
230
  if (this.globalUserId) {
@@ -198,16 +235,8 @@ export class GrainAnalytics {
198
235
  }
199
236
  // Generate a new UUIDv4 identifier as fallback
200
237
  this.persistentAnonymousUserId = this.generateAnonymousUserId();
201
- // Try to persist it
202
- if (typeof window !== 'undefined') {
203
- try {
204
- const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
205
- localStorage.setItem(storageKey, this.persistentAnonymousUserId);
206
- }
207
- catch (error) {
208
- this.log('Failed to persist generated anonymous user ID:', error);
209
- }
210
- }
238
+ // Try to persist it (will be skipped in opt-in mode without consent)
239
+ this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);
211
240
  return this.persistentAnonymousUserId;
212
241
  }
213
242
  log(...args) {
@@ -555,7 +584,12 @@ export class GrainAnalytics {
555
584
  */
556
585
  handleConsentGranted() {
557
586
  this.flushWaitingForConsentQueue();
558
- // Track consent granted event with mapping
587
+ // Initialize persistent ID now that consent is granted (if not already initialized)
588
+ if (!this.persistentAnonymousUserId) {
589
+ this.initializePersistentAnonymousUserId();
590
+ this.log('Initialized persistent ID after consent grant');
591
+ }
592
+ // Track consent granted event with mapping from ephemeral to persistent ID
559
593
  if (this.ephemeralSessionId) {
560
594
  this.trackSystemEvent('_grain_consent_granted', {
561
595
  previous_session_id: this.ephemeralSessionId,
@@ -725,19 +759,11 @@ export class GrainAnalytics {
725
759
  this.persistentAnonymousUserId = null;
726
760
  }
727
761
  else {
728
- // If clearing user ID, ensure we have a UUIDv4 identifier
762
+ // If clearing user ID, ensure we have an identifier
729
763
  if (!this.persistentAnonymousUserId) {
730
764
  this.persistentAnonymousUserId = this.generateAnonymousUserId();
731
- // Try to persist the new anonymous ID
732
- if (typeof window !== 'undefined') {
733
- try {
734
- const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
735
- localStorage.setItem(storageKey, this.persistentAnonymousUserId);
736
- }
737
- catch (error) {
738
- this.log('Failed to persist new anonymous user ID:', error);
739
- }
740
- }
765
+ // Try to persist the new anonymous ID (respects GDPR opt-in mode)
766
+ this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);
741
767
  }
742
768
  }
743
769
  }
@@ -22,6 +22,10 @@ export declare class ConsentManager {
22
22
  constructor(tenantId: string, consentMode?: ConsentMode);
23
23
  /**
24
24
  * Load consent state from localStorage
25
+ *
26
+ * GDPR Compliance: In opt-in mode, we can use localStorage for consent preferences
27
+ * since storing consent choices is a legitimate interest and necessary for compliance.
28
+ * The consent preference itself is not tracking data.
25
29
  */
26
30
  private loadConsentState;
27
31
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../src/consent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,0BAA0B,UAA2C,CAAC;AACnF,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAA4C;gBAEjD,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAE,WAAuB;IAMlE;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAczC;;OAEG;IACH,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IA8B1C;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC;;OAEG;IACH,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAwBtC;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAI1D;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAO7D;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,YAAY,IAAI,IAAI;CAUrB"}
1
+ {"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../src/consent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,0BAA0B,UAA2C,CAAC;AACnF,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAA4C;gBAEjD,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAE,WAAuB;IAMlE;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IA2BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAczC;;OAEG;IACH,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IA8B1C;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC;;OAEG;IACH,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAwBtC;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAI1D;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAO7D;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,YAAY,IAAI,IAAI;CAUrB"}
@@ -20,6 +20,10 @@ class ConsentManager {
20
20
  }
21
21
  /**
22
22
  * Load consent state from localStorage
23
+ *
24
+ * GDPR Compliance: In opt-in mode, we can use localStorage for consent preferences
25
+ * since storing consent choices is a legitimate interest and necessary for compliance.
26
+ * The consent preference itself is not tracking data.
23
27
  */
24
28
  loadConsentState() {
25
29
  if (typeof window === 'undefined')
@@ -43,6 +47,7 @@ class ConsentManager {
43
47
  };
44
48
  this.saveConsentState();
45
49
  }
50
+ // Note: In opt-in mode without stored consent, consentState remains null (no consent)
46
51
  }
47
52
  catch (error) {
48
53
  console.error('[Grain Consent] Failed to load consent state:', error);
@@ -17,6 +17,10 @@ export class ConsentManager {
17
17
  }
18
18
  /**
19
19
  * Load consent state from localStorage
20
+ *
21
+ * GDPR Compliance: In opt-in mode, we can use localStorage for consent preferences
22
+ * since storing consent choices is a legitimate interest and necessary for compliance.
23
+ * The consent preference itself is not tracking data.
20
24
  */
21
25
  loadConsentState() {
22
26
  if (typeof window === 'undefined')
@@ -40,6 +44,7 @@ export class ConsentManager {
40
44
  };
41
45
  this.saveConsentState();
42
46
  }
47
+ // Note: In opt-in mode without stored consent, consentState remains null (no consent)
43
48
  }
44
49
  catch (error) {
45
50
  console.error('[Grain Consent] Failed to load consent state:', error);
@@ -219,6 +219,16 @@ export declare class GrainAnalytics implements HeartbeatTracker, PageTracker {
219
219
  * Generate a UUID v4 string
220
220
  */
221
221
  private generateUUID;
222
+ /**
223
+ * Check if we should allow persistent storage (GDPR compliance)
224
+ *
225
+ * Returns true if:
226
+ * - Consent has been granted, OR
227
+ * - Not in opt-in mode, OR
228
+ * - User has been explicitly identified by the site (login/identify), OR
229
+ * - Using JWT auth strategy (functional/essential purpose)
230
+ */
231
+ private shouldAllowPersistentStorage;
222
232
  /**
223
233
  * Generate a proper UUIDv4 identifier for anonymous user ID
224
234
  */
@@ -226,14 +236,24 @@ export declare class GrainAnalytics implements HeartbeatTracker, PageTracker {
226
236
  /**
227
237
  * Initialize persistent anonymous user ID from cookies or localStorage
228
238
  * Priority: Cookie → localStorage → generate new
239
+ *
240
+ * GDPR Compliance: In opt-in mode without consent, we skip loading/saving
241
+ * persistent IDs unless the user has been explicitly identified by the site
242
+ * or when using JWT auth (functional/essential purpose)
229
243
  */
230
244
  private initializePersistentAnonymousUserId;
231
245
  /**
232
246
  * Save persistent anonymous user ID to cookie and/or localStorage
247
+ *
248
+ * GDPR Compliance: In opt-in mode without consent, we don't persist IDs
249
+ * unless the user has been explicitly identified or using JWT auth
233
250
  */
234
251
  private savePersistentAnonymousUserId;
235
252
  /**
236
253
  * Get the effective user ID (global userId or persistent anonymous ID)
254
+ *
255
+ * GDPR Compliance: In opt-in mode without consent and no explicit user identification,
256
+ * this should not be called. Use getEphemeralSessionId() instead.
237
257
  */
238
258
  private getEffectiveUserIdInternal;
239
259
  private log;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -116,6 +116,23 @@ class GrainAnalytics {
116
116
  return v.toString(16);
117
117
  });
118
118
  }
119
+ /**
120
+ * Check if we should allow persistent storage (GDPR compliance)
121
+ *
122
+ * Returns true if:
123
+ * - Consent has been granted, OR
124
+ * - Not in opt-in mode, OR
125
+ * - User has been explicitly identified by the site (login/identify), OR
126
+ * - Using JWT auth strategy (functional/essential purpose)
127
+ */
128
+ shouldAllowPersistentStorage() {
129
+ const hasConsent = this.consentManager.hasConsent('analytics');
130
+ const isOptInMode = this.config.consentMode === 'opt-in';
131
+ const userExplicitlyIdentified = !!this.globalUserId;
132
+ const isJWTAuth = this.config.authStrategy === 'JWT';
133
+ // Allow persistent storage if any of these conditions are met
134
+ return hasConsent || !isOptInMode || userExplicitlyIdentified || isJWTAuth;
135
+ }
119
136
  /**
120
137
  * Generate a proper UUIDv4 identifier for anonymous user ID
121
138
  */
@@ -125,10 +142,19 @@ class GrainAnalytics {
125
142
  /**
126
143
  * Initialize persistent anonymous user ID from cookies or localStorage
127
144
  * Priority: Cookie → localStorage → generate new
145
+ *
146
+ * GDPR Compliance: In opt-in mode without consent, we skip loading/saving
147
+ * persistent IDs unless the user has been explicitly identified by the site
148
+ * or when using JWT auth (functional/essential purpose)
128
149
  */
129
150
  initializePersistentAnonymousUserId() {
130
151
  if (typeof window === 'undefined')
131
152
  return;
153
+ // Check if we should avoid persistent storage (GDPR compliance)
154
+ if (!this.shouldAllowPersistentStorage()) {
155
+ this.log('Opt-in mode without consent: skipping persistent ID initialization (GDPR compliance)');
156
+ return; // Don't load or create persistent ID
157
+ }
132
158
  const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
133
159
  const cookieName = '_grain_uid';
134
160
  try {
@@ -166,10 +192,18 @@ class GrainAnalytics {
166
192
  }
167
193
  /**
168
194
  * Save persistent anonymous user ID to cookie and/or localStorage
195
+ *
196
+ * GDPR Compliance: In opt-in mode without consent, we don't persist IDs
197
+ * unless the user has been explicitly identified or using JWT auth
169
198
  */
170
199
  savePersistentAnonymousUserId(userId) {
171
200
  if (typeof window === 'undefined')
172
201
  return;
202
+ // Check if we should avoid persistent storage (GDPR compliance)
203
+ if (!this.shouldAllowPersistentStorage()) {
204
+ this.log('Opt-in mode without consent: skipping persistent ID save (GDPR compliance)');
205
+ return; // Don't save persistent ID
206
+ }
173
207
  const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
174
208
  const cookieName = '_grain_uid';
175
209
  try {
@@ -192,6 +226,9 @@ class GrainAnalytics {
192
226
  }
193
227
  /**
194
228
  * Get the effective user ID (global userId or persistent anonymous ID)
229
+ *
230
+ * GDPR Compliance: In opt-in mode without consent and no explicit user identification,
231
+ * this should not be called. Use getEphemeralSessionId() instead.
195
232
  */
196
233
  getEffectiveUserIdInternal() {
197
234
  if (this.globalUserId) {
@@ -202,16 +239,8 @@ class GrainAnalytics {
202
239
  }
203
240
  // Generate a new UUIDv4 identifier as fallback
204
241
  this.persistentAnonymousUserId = this.generateAnonymousUserId();
205
- // Try to persist it
206
- if (typeof window !== 'undefined') {
207
- try {
208
- const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
209
- localStorage.setItem(storageKey, this.persistentAnonymousUserId);
210
- }
211
- catch (error) {
212
- this.log('Failed to persist generated anonymous user ID:', error);
213
- }
214
- }
242
+ // Try to persist it (will be skipped in opt-in mode without consent)
243
+ this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);
215
244
  return this.persistentAnonymousUserId;
216
245
  }
217
246
  log(...args) {
@@ -559,7 +588,12 @@ class GrainAnalytics {
559
588
  */
560
589
  handleConsentGranted() {
561
590
  this.flushWaitingForConsentQueue();
562
- // Track consent granted event with mapping
591
+ // Initialize persistent ID now that consent is granted (if not already initialized)
592
+ if (!this.persistentAnonymousUserId) {
593
+ this.initializePersistentAnonymousUserId();
594
+ this.log('Initialized persistent ID after consent grant');
595
+ }
596
+ // Track consent granted event with mapping from ephemeral to persistent ID
563
597
  if (this.ephemeralSessionId) {
564
598
  this.trackSystemEvent('_grain_consent_granted', {
565
599
  previous_session_id: this.ephemeralSessionId,
@@ -729,19 +763,11 @@ class GrainAnalytics {
729
763
  this.persistentAnonymousUserId = null;
730
764
  }
731
765
  else {
732
- // If clearing user ID, ensure we have a UUIDv4 identifier
766
+ // If clearing user ID, ensure we have an identifier
733
767
  if (!this.persistentAnonymousUserId) {
734
768
  this.persistentAnonymousUserId = this.generateAnonymousUserId();
735
- // Try to persist the new anonymous ID
736
- if (typeof window !== 'undefined') {
737
- try {
738
- const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
739
- localStorage.setItem(storageKey, this.persistentAnonymousUserId);
740
- }
741
- catch (error) {
742
- this.log('Failed to persist new anonymous user ID:', error);
743
- }
744
- }
769
+ // Try to persist the new anonymous ID (respects GDPR opt-in mode)
770
+ this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);
745
771
  }
746
772
  }
747
773
  }
@@ -112,6 +112,23 @@ export class GrainAnalytics {
112
112
  return v.toString(16);
113
113
  });
114
114
  }
115
+ /**
116
+ * Check if we should allow persistent storage (GDPR compliance)
117
+ *
118
+ * Returns true if:
119
+ * - Consent has been granted, OR
120
+ * - Not in opt-in mode, OR
121
+ * - User has been explicitly identified by the site (login/identify), OR
122
+ * - Using JWT auth strategy (functional/essential purpose)
123
+ */
124
+ shouldAllowPersistentStorage() {
125
+ const hasConsent = this.consentManager.hasConsent('analytics');
126
+ const isOptInMode = this.config.consentMode === 'opt-in';
127
+ const userExplicitlyIdentified = !!this.globalUserId;
128
+ const isJWTAuth = this.config.authStrategy === 'JWT';
129
+ // Allow persistent storage if any of these conditions are met
130
+ return hasConsent || !isOptInMode || userExplicitlyIdentified || isJWTAuth;
131
+ }
115
132
  /**
116
133
  * Generate a proper UUIDv4 identifier for anonymous user ID
117
134
  */
@@ -121,10 +138,19 @@ export class GrainAnalytics {
121
138
  /**
122
139
  * Initialize persistent anonymous user ID from cookies or localStorage
123
140
  * Priority: Cookie → localStorage → generate new
141
+ *
142
+ * GDPR Compliance: In opt-in mode without consent, we skip loading/saving
143
+ * persistent IDs unless the user has been explicitly identified by the site
144
+ * or when using JWT auth (functional/essential purpose)
124
145
  */
125
146
  initializePersistentAnonymousUserId() {
126
147
  if (typeof window === 'undefined')
127
148
  return;
149
+ // Check if we should avoid persistent storage (GDPR compliance)
150
+ if (!this.shouldAllowPersistentStorage()) {
151
+ this.log('Opt-in mode without consent: skipping persistent ID initialization (GDPR compliance)');
152
+ return; // Don't load or create persistent ID
153
+ }
128
154
  const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
129
155
  const cookieName = '_grain_uid';
130
156
  try {
@@ -162,10 +188,18 @@ export class GrainAnalytics {
162
188
  }
163
189
  /**
164
190
  * Save persistent anonymous user ID to cookie and/or localStorage
191
+ *
192
+ * GDPR Compliance: In opt-in mode without consent, we don't persist IDs
193
+ * unless the user has been explicitly identified or using JWT auth
165
194
  */
166
195
  savePersistentAnonymousUserId(userId) {
167
196
  if (typeof window === 'undefined')
168
197
  return;
198
+ // Check if we should avoid persistent storage (GDPR compliance)
199
+ if (!this.shouldAllowPersistentStorage()) {
200
+ this.log('Opt-in mode without consent: skipping persistent ID save (GDPR compliance)');
201
+ return; // Don't save persistent ID
202
+ }
169
203
  const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
170
204
  const cookieName = '_grain_uid';
171
205
  try {
@@ -188,6 +222,9 @@ export class GrainAnalytics {
188
222
  }
189
223
  /**
190
224
  * Get the effective user ID (global userId or persistent anonymous ID)
225
+ *
226
+ * GDPR Compliance: In opt-in mode without consent and no explicit user identification,
227
+ * this should not be called. Use getEphemeralSessionId() instead.
191
228
  */
192
229
  getEffectiveUserIdInternal() {
193
230
  if (this.globalUserId) {
@@ -198,16 +235,8 @@ export class GrainAnalytics {
198
235
  }
199
236
  // Generate a new UUIDv4 identifier as fallback
200
237
  this.persistentAnonymousUserId = this.generateAnonymousUserId();
201
- // Try to persist it
202
- if (typeof window !== 'undefined') {
203
- try {
204
- const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
205
- localStorage.setItem(storageKey, this.persistentAnonymousUserId);
206
- }
207
- catch (error) {
208
- this.log('Failed to persist generated anonymous user ID:', error);
209
- }
210
- }
238
+ // Try to persist it (will be skipped in opt-in mode without consent)
239
+ this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);
211
240
  return this.persistentAnonymousUserId;
212
241
  }
213
242
  log(...args) {
@@ -555,7 +584,12 @@ export class GrainAnalytics {
555
584
  */
556
585
  handleConsentGranted() {
557
586
  this.flushWaitingForConsentQueue();
558
- // Track consent granted event with mapping
587
+ // Initialize persistent ID now that consent is granted (if not already initialized)
588
+ if (!this.persistentAnonymousUserId) {
589
+ this.initializePersistentAnonymousUserId();
590
+ this.log('Initialized persistent ID after consent grant');
591
+ }
592
+ // Track consent granted event with mapping from ephemeral to persistent ID
559
593
  if (this.ephemeralSessionId) {
560
594
  this.trackSystemEvent('_grain_consent_granted', {
561
595
  previous_session_id: this.ephemeralSessionId,
@@ -725,19 +759,11 @@ export class GrainAnalytics {
725
759
  this.persistentAnonymousUserId = null;
726
760
  }
727
761
  else {
728
- // If clearing user ID, ensure we have a UUIDv4 identifier
762
+ // If clearing user ID, ensure we have an identifier
729
763
  if (!this.persistentAnonymousUserId) {
730
764
  this.persistentAnonymousUserId = this.generateAnonymousUserId();
731
- // Try to persist the new anonymous ID
732
- if (typeof window !== 'undefined') {
733
- try {
734
- const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;
735
- localStorage.setItem(storageKey, this.persistentAnonymousUserId);
736
- }
737
- catch (error) {
738
- this.log('Failed to persist new anonymous user ID:', error);
739
- }
740
- }
765
+ // Try to persist the new anonymous ID (respects GDPR opt-in mode)
766
+ this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);
741
767
  }
742
768
  }
743
769
  }