posthog-node 5.17.1 → 5.17.2
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/extensions/feature-flags/feature-flags.d.ts +1 -0
- package/dist/extensions/feature-flags/feature-flags.d.ts.map +1 -1
- package/dist/extensions/feature-flags/feature-flags.js +17 -7
- package/dist/extensions/feature-flags/feature-flags.mjs +17 -7
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +1 -1
- package/src/extensions/feature-flags/feature-flags.ts +31 -7
- package/src/version.ts +1 -1
|
@@ -47,6 +47,7 @@ declare class FeatureFlagsPoller {
|
|
|
47
47
|
onLoad?: (count: number) => void;
|
|
48
48
|
private cacheProvider?;
|
|
49
49
|
private loadingPromise?;
|
|
50
|
+
private flagsEtag?;
|
|
50
51
|
constructor({ pollingInterval, personalApiKey, projectApiKey, timeout, host, customHeaders, ...options }: FeatureFlagsPollerOptions);
|
|
51
52
|
debug(enabled?: boolean): void;
|
|
52
53
|
private logMsgIfDebug;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flags.d.ts","sourceRoot":"","sources":["../../../src/extensions/feature-flags/feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmC,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACtH,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAG1G,OAAO,EAAE,2BAA2B,EAA2B,MAAM,SAAS,CAAA;AAQ9E,cAAM,WAAY,SAAQ,KAAK;gBACjB,OAAO,EAAE,MAAM;CAO5B;AAED,cAAM,sBAAuB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAS5B;AAED,cAAM,wBAAyB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAS5B;AAED,KAAK,yBAAyB,GAAG;IAC/B,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACpF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,aAAa,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;IACzC,aAAa,CAAC,EAAE,2BAA2B,CAAA;CAC5C,CAAA;AAED,cAAM,kBAAkB;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACvC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IACrD,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACtC,sBAAsB,EAAE,OAAO,CAAA;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;IACvB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACnF,SAAS,EAAE,OAAO,CAAQ;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,aAAa,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;IACzC,6BAA6B,EAAE,OAAO,CAAQ;IAC9C,YAAY,EAAE,MAAM,CAAI;IACxB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,OAAO,CAAC,aAAa,CAAC,CAA6B;IACnD,OAAO,CAAC,cAAc,CAAC,CAAe;
|
|
1
|
+
{"version":3,"file":"feature-flags.d.ts","sourceRoot":"","sources":["../../../src/extensions/feature-flags/feature-flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -329,6 +329,13 @@ class FeatureFlagsPoller {
|
|
|
329
329
|
const res = await this._requestFeatureFlagDefinitions();
|
|
330
330
|
if (!res) return;
|
|
331
331
|
switch(res.status){
|
|
332
|
+
case 304:
|
|
333
|
+
this.logMsgIfDebug(()=>console.debug('[FEATURE FLAGS] Flags not modified (304), using cached data'));
|
|
334
|
+
this.flagsEtag = res.headers?.get('ETag') ?? this.flagsEtag;
|
|
335
|
+
this.loadedSuccessfullyOnce = true;
|
|
336
|
+
this.shouldBeginExponentialBackoff = false;
|
|
337
|
+
this.backOffCount = 0;
|
|
338
|
+
return;
|
|
332
339
|
case 401:
|
|
333
340
|
this.shouldBeginExponentialBackoff = true;
|
|
334
341
|
this.backOffCount += 1;
|
|
@@ -352,6 +359,7 @@ class FeatureFlagsPoller {
|
|
|
352
359
|
{
|
|
353
360
|
const responseJson = await res.json() ?? {};
|
|
354
361
|
if (!('flags' in responseJson)) return void this.onError?.(new Error(`Invalid response when getting feature flags: ${JSON.stringify(responseJson)}`));
|
|
362
|
+
this.flagsEtag = res.headers?.get('ETag') ?? void 0;
|
|
355
363
|
const flagData = {
|
|
356
364
|
flags: responseJson.flags ?? [],
|
|
357
365
|
groupTypeMapping: responseJson.group_type_mapping || {},
|
|
@@ -375,19 +383,21 @@ class FeatureFlagsPoller {
|
|
|
375
383
|
if (err instanceof ClientError) this.onError?.(err);
|
|
376
384
|
}
|
|
377
385
|
}
|
|
378
|
-
getPersonalApiKeyRequestOptions(method = 'GET') {
|
|
386
|
+
getPersonalApiKeyRequestOptions(method = 'GET', etag) {
|
|
387
|
+
const headers = {
|
|
388
|
+
...this.customHeaders,
|
|
389
|
+
'Content-Type': 'application/json',
|
|
390
|
+
Authorization: `Bearer ${this.personalApiKey}`
|
|
391
|
+
};
|
|
392
|
+
if (etag) headers['If-None-Match'] = etag;
|
|
379
393
|
return {
|
|
380
394
|
method,
|
|
381
|
-
headers
|
|
382
|
-
...this.customHeaders,
|
|
383
|
-
'Content-Type': 'application/json',
|
|
384
|
-
Authorization: `Bearer ${this.personalApiKey}`
|
|
385
|
-
}
|
|
395
|
+
headers
|
|
386
396
|
};
|
|
387
397
|
}
|
|
388
398
|
_requestFeatureFlagDefinitions() {
|
|
389
399
|
const url = `${this.host}/api/feature_flag/local_evaluation?token=${this.projectApiKey}&send_cohorts`;
|
|
390
|
-
const options = this.getPersonalApiKeyRequestOptions();
|
|
400
|
+
const options = this.getPersonalApiKeyRequestOptions('GET', this.flagsEtag);
|
|
391
401
|
let abortTimeout = null;
|
|
392
402
|
if (this.timeout && 'number' == typeof this.timeout) {
|
|
393
403
|
const controller = new AbortController();
|
|
@@ -296,6 +296,13 @@ class FeatureFlagsPoller {
|
|
|
296
296
|
const res = await this._requestFeatureFlagDefinitions();
|
|
297
297
|
if (!res) return;
|
|
298
298
|
switch(res.status){
|
|
299
|
+
case 304:
|
|
300
|
+
this.logMsgIfDebug(()=>console.debug('[FEATURE FLAGS] Flags not modified (304), using cached data'));
|
|
301
|
+
this.flagsEtag = res.headers?.get('ETag') ?? this.flagsEtag;
|
|
302
|
+
this.loadedSuccessfullyOnce = true;
|
|
303
|
+
this.shouldBeginExponentialBackoff = false;
|
|
304
|
+
this.backOffCount = 0;
|
|
305
|
+
return;
|
|
299
306
|
case 401:
|
|
300
307
|
this.shouldBeginExponentialBackoff = true;
|
|
301
308
|
this.backOffCount += 1;
|
|
@@ -319,6 +326,7 @@ class FeatureFlagsPoller {
|
|
|
319
326
|
{
|
|
320
327
|
const responseJson = await res.json() ?? {};
|
|
321
328
|
if (!('flags' in responseJson)) return void this.onError?.(new Error(`Invalid response when getting feature flags: ${JSON.stringify(responseJson)}`));
|
|
329
|
+
this.flagsEtag = res.headers?.get('ETag') ?? void 0;
|
|
322
330
|
const flagData = {
|
|
323
331
|
flags: responseJson.flags ?? [],
|
|
324
332
|
groupTypeMapping: responseJson.group_type_mapping || {},
|
|
@@ -342,19 +350,21 @@ class FeatureFlagsPoller {
|
|
|
342
350
|
if (err instanceof ClientError) this.onError?.(err);
|
|
343
351
|
}
|
|
344
352
|
}
|
|
345
|
-
getPersonalApiKeyRequestOptions(method = 'GET') {
|
|
353
|
+
getPersonalApiKeyRequestOptions(method = 'GET', etag) {
|
|
354
|
+
const headers = {
|
|
355
|
+
...this.customHeaders,
|
|
356
|
+
'Content-Type': 'application/json',
|
|
357
|
+
Authorization: `Bearer ${this.personalApiKey}`
|
|
358
|
+
};
|
|
359
|
+
if (etag) headers['If-None-Match'] = etag;
|
|
346
360
|
return {
|
|
347
361
|
method,
|
|
348
|
-
headers
|
|
349
|
-
...this.customHeaders,
|
|
350
|
-
'Content-Type': 'application/json',
|
|
351
|
-
Authorization: `Bearer ${this.personalApiKey}`
|
|
352
|
-
}
|
|
362
|
+
headers
|
|
353
363
|
};
|
|
354
364
|
}
|
|
355
365
|
_requestFeatureFlagDefinitions() {
|
|
356
366
|
const url = `${this.host}/api/feature_flag/local_evaluation?token=${this.projectApiKey}&send_cohorts`;
|
|
357
|
-
const options = this.getPersonalApiKeyRequestOptions();
|
|
367
|
+
const options = this.getPersonalApiKeyRequestOptions('GET', this.flagsEtag);
|
|
358
368
|
let abortTimeout = null;
|
|
359
369
|
if (this.timeout && 'number' == typeof this.timeout) {
|
|
360
370
|
const controller = new AbortController();
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "5.17.
|
|
1
|
+
export declare const version = "5.17.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -26,7 +26,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
27
|
version: ()=>version
|
|
28
28
|
});
|
|
29
|
-
const version = '5.17.
|
|
29
|
+
const version = '5.17.2';
|
|
30
30
|
exports.version = __webpack_exports__.version;
|
|
31
31
|
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
32
32
|
"version"
|
package/dist/version.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const version = '5.17.
|
|
1
|
+
const version = '5.17.2';
|
|
2
2
|
export { version };
|
package/package.json
CHANGED
|
@@ -78,6 +78,7 @@ class FeatureFlagsPoller {
|
|
|
78
78
|
onLoad?: (count: number) => void
|
|
79
79
|
private cacheProvider?: FlagDefinitionCacheProvider
|
|
80
80
|
private loadingPromise?: Promise<void>
|
|
81
|
+
private flagsEtag?: string
|
|
81
82
|
|
|
82
83
|
constructor({
|
|
83
84
|
pollingInterval,
|
|
@@ -683,6 +684,16 @@ class FeatureFlagsPoller {
|
|
|
683
684
|
// both the background poller and any subsequent manual calls can keep trying to load flags
|
|
684
685
|
// once the issue (quota, permission, rate limit, etc.) is resolved.
|
|
685
686
|
switch (res.status) {
|
|
687
|
+
case 304:
|
|
688
|
+
// Not Modified - flags haven't changed, keep using cached data
|
|
689
|
+
this.logMsgIfDebug(() => console.debug('[FEATURE FLAGS] Flags not modified (304), using cached data'))
|
|
690
|
+
// Update ETag if server sent one (304 can include updated ETag per HTTP spec)
|
|
691
|
+
this.flagsEtag = res.headers?.get('ETag') ?? this.flagsEtag
|
|
692
|
+
this.loadedSuccessfullyOnce = true
|
|
693
|
+
this.shouldBeginExponentialBackoff = false
|
|
694
|
+
this.backOffCount = 0
|
|
695
|
+
return
|
|
696
|
+
|
|
686
697
|
case 401:
|
|
687
698
|
// Invalid API key
|
|
688
699
|
this.shouldBeginExponentialBackoff = true
|
|
@@ -726,6 +737,10 @@ class FeatureFlagsPoller {
|
|
|
726
737
|
return
|
|
727
738
|
}
|
|
728
739
|
|
|
740
|
+
// Store ETag from response for subsequent conditional requests
|
|
741
|
+
// Clear it if server stops sending one
|
|
742
|
+
this.flagsEtag = res.headers?.get('ETag') ?? undefined
|
|
743
|
+
|
|
729
744
|
const flagData: FlagDefinitionCacheData = {
|
|
730
745
|
flags: (responseJson.flags as PostHogFeatureFlag[]) ?? [],
|
|
731
746
|
groupTypeMapping: (responseJson.group_type_mapping as Record<string, string>) || {},
|
|
@@ -764,21 +779,30 @@ class FeatureFlagsPoller {
|
|
|
764
779
|
}
|
|
765
780
|
}
|
|
766
781
|
|
|
767
|
-
private getPersonalApiKeyRequestOptions(
|
|
782
|
+
private getPersonalApiKeyRequestOptions(
|
|
783
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH' = 'GET',
|
|
784
|
+
etag?: string
|
|
785
|
+
): PostHogFetchOptions {
|
|
786
|
+
const headers: { [key: string]: string } = {
|
|
787
|
+
...this.customHeaders,
|
|
788
|
+
'Content-Type': 'application/json',
|
|
789
|
+
Authorization: `Bearer ${this.personalApiKey}`,
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
if (etag) {
|
|
793
|
+
headers['If-None-Match'] = etag
|
|
794
|
+
}
|
|
795
|
+
|
|
768
796
|
return {
|
|
769
797
|
method,
|
|
770
|
-
headers
|
|
771
|
-
...this.customHeaders,
|
|
772
|
-
'Content-Type': 'application/json',
|
|
773
|
-
Authorization: `Bearer ${this.personalApiKey}`,
|
|
774
|
-
},
|
|
798
|
+
headers,
|
|
775
799
|
}
|
|
776
800
|
}
|
|
777
801
|
|
|
778
802
|
_requestFeatureFlagDefinitions(): Promise<PostHogFetchResponse> {
|
|
779
803
|
const url = `${this.host}/api/feature_flag/local_evaluation?token=${this.projectApiKey}&send_cohorts`
|
|
780
804
|
|
|
781
|
-
const options = this.getPersonalApiKeyRequestOptions()
|
|
805
|
+
const options = this.getPersonalApiKeyRequestOptions('GET', this.flagsEtag)
|
|
782
806
|
|
|
783
807
|
let abortTimeout = null
|
|
784
808
|
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '5.17.
|
|
1
|
+
export const version = '5.17.2'
|