posthog-node 5.26.2 → 5.27.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/client.d.ts +6 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +68 -1
- package/dist/client.mjs +68 -1
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -1
- 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/client.ts +112 -1
- package/src/types.ts +29 -0
- package/src/version.ts +1 -1
package/dist/client.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare abstract class PostHogBackendClient extends PostHogCoreStateless
|
|
|
13
13
|
private _flagOverrides?;
|
|
14
14
|
private _payloadOverrides?;
|
|
15
15
|
distinctIdHasSentFlagCalls: Record<string, string[]>;
|
|
16
|
+
private _waitUntilCycle?;
|
|
16
17
|
/**
|
|
17
18
|
* Initialize a new PostHog client instance.
|
|
18
19
|
*
|
|
@@ -43,6 +44,11 @@ export declare abstract class PostHogBackendClient extends PostHogCoreStateless
|
|
|
43
44
|
* @param options - Configuration options for the client
|
|
44
45
|
*/
|
|
45
46
|
constructor(apiKey: string, options?: PostHogOptions);
|
|
47
|
+
protected enqueue(type: string, message: any, options?: PostHogCaptureOptions): void;
|
|
48
|
+
flush(): Promise<void>;
|
|
49
|
+
private scheduleDebouncedFlush;
|
|
50
|
+
private _consumeWaitUntilCycle;
|
|
51
|
+
private resolveWaitUntilFlush;
|
|
46
52
|
/**
|
|
47
53
|
* Get a persisted property value from memory storage.
|
|
48
54
|
*
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAGhB,QAAQ,EACR,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,+BAA+B,EAE/B,wBAAwB,EACzB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,YAAY,EAIZ,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,2BAA2B,EAC3B,cAAc,EAEd,qBAAqB,EACrB,eAAe,EAChB,MAAM,SAAS,CAAA;AAOhB,OAAO,aAAa,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAAkB,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAGtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -45,12 +45,16 @@ const external_storage_memory_js_namespaceObject = require("./storage-memory.js"
|
|
|
45
45
|
const MINIMUM_POLLING_INTERVAL = 100;
|
|
46
46
|
const THIRTY_SECONDS = 30000;
|
|
47
47
|
const MAX_CACHE_SIZE = 50000;
|
|
48
|
+
const WAITUNTIL_DEBOUNCE_MS = 50;
|
|
49
|
+
const WAITUNTIL_MAX_WAIT_MS = 500;
|
|
48
50
|
class PostHogBackendClient extends core_namespaceObject.PostHogCoreStateless {
|
|
49
51
|
constructor(apiKey, options = {}){
|
|
50
52
|
super(apiKey, options), this._memoryStorage = new external_storage_memory_js_namespaceObject.PostHogMemoryStorage();
|
|
51
53
|
this.options = options;
|
|
52
54
|
this.context = this.initializeContext();
|
|
53
55
|
this.options.featureFlagsPollingInterval = 'number' == typeof options.featureFlagsPollingInterval ? Math.max(options.featureFlagsPollingInterval, MINIMUM_POLLING_INTERVAL) : THIRTY_SECONDS;
|
|
56
|
+
if ('number' == typeof options.waitUntilDebounceMs) this.options.waitUntilDebounceMs = Math.max(options.waitUntilDebounceMs, 0);
|
|
57
|
+
if ('number' == typeof options.waitUntilMaxWaitMs) this.options.waitUntilMaxWaitMs = Math.max(options.waitUntilMaxWaitMs, 0);
|
|
54
58
|
if (options.personalApiKey) {
|
|
55
59
|
if (options.personalApiKey.includes('phc_')) throw new Error('Your Personal API key is invalid. These keys are prefixed with "phx_" and can be created in PostHog project settings.');
|
|
56
60
|
const shouldEnableLocalEvaluation = false !== options.enableLocalEvaluation;
|
|
@@ -76,6 +80,64 @@ class PostHogBackendClient extends core_namespaceObject.PostHogCoreStateless {
|
|
|
76
80
|
this.distinctIdHasSentFlagCalls = {};
|
|
77
81
|
this.maxCacheSize = options.maxCacheSize || MAX_CACHE_SIZE;
|
|
78
82
|
}
|
|
83
|
+
enqueue(type, message, options) {
|
|
84
|
+
super.enqueue(type, message, options);
|
|
85
|
+
this.scheduleDebouncedFlush();
|
|
86
|
+
}
|
|
87
|
+
async flush() {
|
|
88
|
+
const flushPromise = super.flush();
|
|
89
|
+
const waitUntil = this.options.waitUntil;
|
|
90
|
+
if (waitUntil && !this._waitUntilCycle) try {
|
|
91
|
+
waitUntil(flushPromise.catch(()=>{}));
|
|
92
|
+
} catch {}
|
|
93
|
+
return flushPromise;
|
|
94
|
+
}
|
|
95
|
+
scheduleDebouncedFlush() {
|
|
96
|
+
const waitUntil = this.options.waitUntil;
|
|
97
|
+
if (!waitUntil) return;
|
|
98
|
+
if (this.disabled || this.optedOut) return;
|
|
99
|
+
if (!this._waitUntilCycle) {
|
|
100
|
+
let resolve;
|
|
101
|
+
const promise = new Promise((r)=>{
|
|
102
|
+
resolve = r;
|
|
103
|
+
});
|
|
104
|
+
try {
|
|
105
|
+
waitUntil(promise);
|
|
106
|
+
} catch {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this._waitUntilCycle = {
|
|
110
|
+
resolve: resolve,
|
|
111
|
+
startedAt: Date.now(),
|
|
112
|
+
timer: void 0
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const elapsed = Date.now() - this._waitUntilCycle.startedAt;
|
|
116
|
+
const maxWaitMs = this.options.waitUntilMaxWaitMs ?? WAITUNTIL_MAX_WAIT_MS;
|
|
117
|
+
const flushNow = elapsed >= maxWaitMs;
|
|
118
|
+
if (void 0 !== this._waitUntilCycle.timer) clearTimeout(this._waitUntilCycle.timer);
|
|
119
|
+
if (flushNow) return void this.resolveWaitUntilFlush();
|
|
120
|
+
const debounceMs = this.options.waitUntilDebounceMs ?? WAITUNTIL_DEBOUNCE_MS;
|
|
121
|
+
this._waitUntilCycle.timer = (0, core_namespaceObject.safeSetTimeout)(()=>{
|
|
122
|
+
this.resolveWaitUntilFlush();
|
|
123
|
+
}, debounceMs);
|
|
124
|
+
}
|
|
125
|
+
_consumeWaitUntilCycle() {
|
|
126
|
+
const cycle = this._waitUntilCycle;
|
|
127
|
+
if (cycle) {
|
|
128
|
+
clearTimeout(cycle.timer);
|
|
129
|
+
this._waitUntilCycle = void 0;
|
|
130
|
+
}
|
|
131
|
+
return cycle?.resolve;
|
|
132
|
+
}
|
|
133
|
+
async resolveWaitUntilFlush() {
|
|
134
|
+
const resolve = this._consumeWaitUntilCycle();
|
|
135
|
+
try {
|
|
136
|
+
await super.flush();
|
|
137
|
+
} catch {} finally{
|
|
138
|
+
resolve?.();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
79
141
|
getPersistedProperty(key) {
|
|
80
142
|
return this._memoryStorage.getProperty(key);
|
|
81
143
|
}
|
|
@@ -478,9 +540,14 @@ class PostHogBackendClient extends core_namespaceObject.PostHogCoreStateless {
|
|
|
478
540
|
this.context?.enter(data, options);
|
|
479
541
|
}
|
|
480
542
|
async _shutdown(shutdownTimeoutMs) {
|
|
543
|
+
const resolve = this._consumeWaitUntilCycle();
|
|
481
544
|
this.featureFlagsPoller?.stopPoller(shutdownTimeoutMs);
|
|
482
545
|
this.errorTracking.shutdown();
|
|
483
|
-
|
|
546
|
+
try {
|
|
547
|
+
return await super._shutdown(shutdownTimeoutMs);
|
|
548
|
+
} finally{
|
|
549
|
+
resolve?.();
|
|
550
|
+
}
|
|
484
551
|
}
|
|
485
552
|
async _requestRemoteConfigPayload(flagKey) {
|
|
486
553
|
if (!this.options.personalApiKey) return;
|
package/dist/client.mjs
CHANGED
|
@@ -7,12 +7,16 @@ import { PostHogMemoryStorage } from "./storage-memory.mjs";
|
|
|
7
7
|
const MINIMUM_POLLING_INTERVAL = 100;
|
|
8
8
|
const THIRTY_SECONDS = 30000;
|
|
9
9
|
const MAX_CACHE_SIZE = 50000;
|
|
10
|
+
const WAITUNTIL_DEBOUNCE_MS = 50;
|
|
11
|
+
const WAITUNTIL_MAX_WAIT_MS = 500;
|
|
10
12
|
class PostHogBackendClient extends PostHogCoreStateless {
|
|
11
13
|
constructor(apiKey, options = {}){
|
|
12
14
|
super(apiKey, options), this._memoryStorage = new PostHogMemoryStorage();
|
|
13
15
|
this.options = options;
|
|
14
16
|
this.context = this.initializeContext();
|
|
15
17
|
this.options.featureFlagsPollingInterval = 'number' == typeof options.featureFlagsPollingInterval ? Math.max(options.featureFlagsPollingInterval, MINIMUM_POLLING_INTERVAL) : THIRTY_SECONDS;
|
|
18
|
+
if ('number' == typeof options.waitUntilDebounceMs) this.options.waitUntilDebounceMs = Math.max(options.waitUntilDebounceMs, 0);
|
|
19
|
+
if ('number' == typeof options.waitUntilMaxWaitMs) this.options.waitUntilMaxWaitMs = Math.max(options.waitUntilMaxWaitMs, 0);
|
|
16
20
|
if (options.personalApiKey) {
|
|
17
21
|
if (options.personalApiKey.includes('phc_')) throw new Error('Your Personal API key is invalid. These keys are prefixed with "phx_" and can be created in PostHog project settings.');
|
|
18
22
|
const shouldEnableLocalEvaluation = false !== options.enableLocalEvaluation;
|
|
@@ -38,6 +42,64 @@ class PostHogBackendClient extends PostHogCoreStateless {
|
|
|
38
42
|
this.distinctIdHasSentFlagCalls = {};
|
|
39
43
|
this.maxCacheSize = options.maxCacheSize || MAX_CACHE_SIZE;
|
|
40
44
|
}
|
|
45
|
+
enqueue(type, message, options) {
|
|
46
|
+
super.enqueue(type, message, options);
|
|
47
|
+
this.scheduleDebouncedFlush();
|
|
48
|
+
}
|
|
49
|
+
async flush() {
|
|
50
|
+
const flushPromise = super.flush();
|
|
51
|
+
const waitUntil = this.options.waitUntil;
|
|
52
|
+
if (waitUntil && !this._waitUntilCycle) try {
|
|
53
|
+
waitUntil(flushPromise.catch(()=>{}));
|
|
54
|
+
} catch {}
|
|
55
|
+
return flushPromise;
|
|
56
|
+
}
|
|
57
|
+
scheduleDebouncedFlush() {
|
|
58
|
+
const waitUntil = this.options.waitUntil;
|
|
59
|
+
if (!waitUntil) return;
|
|
60
|
+
if (this.disabled || this.optedOut) return;
|
|
61
|
+
if (!this._waitUntilCycle) {
|
|
62
|
+
let resolve;
|
|
63
|
+
const promise = new Promise((r)=>{
|
|
64
|
+
resolve = r;
|
|
65
|
+
});
|
|
66
|
+
try {
|
|
67
|
+
waitUntil(promise);
|
|
68
|
+
} catch {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
this._waitUntilCycle = {
|
|
72
|
+
resolve: resolve,
|
|
73
|
+
startedAt: Date.now(),
|
|
74
|
+
timer: void 0
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const elapsed = Date.now() - this._waitUntilCycle.startedAt;
|
|
78
|
+
const maxWaitMs = this.options.waitUntilMaxWaitMs ?? WAITUNTIL_MAX_WAIT_MS;
|
|
79
|
+
const flushNow = elapsed >= maxWaitMs;
|
|
80
|
+
if (void 0 !== this._waitUntilCycle.timer) clearTimeout(this._waitUntilCycle.timer);
|
|
81
|
+
if (flushNow) return void this.resolveWaitUntilFlush();
|
|
82
|
+
const debounceMs = this.options.waitUntilDebounceMs ?? WAITUNTIL_DEBOUNCE_MS;
|
|
83
|
+
this._waitUntilCycle.timer = safeSetTimeout(()=>{
|
|
84
|
+
this.resolveWaitUntilFlush();
|
|
85
|
+
}, debounceMs);
|
|
86
|
+
}
|
|
87
|
+
_consumeWaitUntilCycle() {
|
|
88
|
+
const cycle = this._waitUntilCycle;
|
|
89
|
+
if (cycle) {
|
|
90
|
+
clearTimeout(cycle.timer);
|
|
91
|
+
this._waitUntilCycle = void 0;
|
|
92
|
+
}
|
|
93
|
+
return cycle?.resolve;
|
|
94
|
+
}
|
|
95
|
+
async resolveWaitUntilFlush() {
|
|
96
|
+
const resolve = this._consumeWaitUntilCycle();
|
|
97
|
+
try {
|
|
98
|
+
await super.flush();
|
|
99
|
+
} catch {} finally{
|
|
100
|
+
resolve?.();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
41
103
|
getPersistedProperty(key) {
|
|
42
104
|
return this._memoryStorage.getProperty(key);
|
|
43
105
|
}
|
|
@@ -440,9 +502,14 @@ class PostHogBackendClient extends PostHogCoreStateless {
|
|
|
440
502
|
this.context?.enter(data, options);
|
|
441
503
|
}
|
|
442
504
|
async _shutdown(shutdownTimeoutMs) {
|
|
505
|
+
const resolve = this._consumeWaitUntilCycle();
|
|
443
506
|
this.featureFlagsPoller?.stopPoller(shutdownTimeoutMs);
|
|
444
507
|
this.errorTracking.shutdown();
|
|
445
|
-
|
|
508
|
+
try {
|
|
509
|
+
return await super._shutdown(shutdownTimeoutMs);
|
|
510
|
+
} finally{
|
|
511
|
+
resolve?.();
|
|
512
|
+
}
|
|
446
513
|
}
|
|
447
514
|
async _requestRemoteConfigPayload(flagKey) {
|
|
448
515
|
if (!this.options.personalApiKey) return;
|
package/dist/types.d.ts
CHANGED
|
@@ -184,6 +184,35 @@ export type PostHogOptions = Omit<PostHogCoreOptions, 'before_send'> & {
|
|
|
184
184
|
* @default false
|
|
185
185
|
*/
|
|
186
186
|
strictLocalEvaluation?: boolean;
|
|
187
|
+
/**
|
|
188
|
+
* Provides the API to extend the lifetime of a serverless invocation until
|
|
189
|
+
* background work (like flushing analytics events) completes after the response
|
|
190
|
+
* is sent.
|
|
191
|
+
*
|
|
192
|
+
* @experimental Subject to change in a minor release.
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* // Vercel
|
|
196
|
+
* import { waitUntil } from '@vercel/functions'
|
|
197
|
+
* new PostHog('key', { waitUntil })
|
|
198
|
+
*/
|
|
199
|
+
waitUntil?: (promise: Promise<unknown>) => void;
|
|
200
|
+
/**
|
|
201
|
+
* Debounce interval in milliseconds for the `waitUntil`-based flush.
|
|
202
|
+
* After the last event is enqueued, the SDK waits this long before flushing.
|
|
203
|
+
*
|
|
204
|
+
* @experimental Subject to change in a minor release.
|
|
205
|
+
* @default 50
|
|
206
|
+
*/
|
|
207
|
+
waitUntilDebounceMs?: number;
|
|
208
|
+
/**
|
|
209
|
+
* Maximum time in milliseconds to debounce before forcing a flush.
|
|
210
|
+
* Prevents starvation from rapid concurrent captures.
|
|
211
|
+
*
|
|
212
|
+
* @experimental Subject to change in a minor release.
|
|
213
|
+
* @default 500
|
|
214
|
+
*/
|
|
215
|
+
waitUntilMaxWaitMs?: number;
|
|
187
216
|
};
|
|
188
217
|
export type PostHogFeatureFlag = {
|
|
189
218
|
id: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "5.
|
|
1
|
+
export declare const version = "5.27.0";
|
|
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.
|
|
29
|
+
const version = '5.27.0';
|
|
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.
|
|
1
|
+
const version = '5.27.0';
|
|
2
2
|
export { version };
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -46,6 +46,9 @@ const MINIMUM_POLLING_INTERVAL = 100
|
|
|
46
46
|
const THIRTY_SECONDS = 30 * 1000
|
|
47
47
|
const MAX_CACHE_SIZE = 50 * 1000
|
|
48
48
|
|
|
49
|
+
const WAITUNTIL_DEBOUNCE_MS = 50
|
|
50
|
+
const WAITUNTIL_MAX_WAIT_MS = 500
|
|
51
|
+
|
|
49
52
|
// The actual exported Nodejs API.
|
|
50
53
|
export abstract class PostHogBackendClient extends PostHogCoreStateless implements IPostHog {
|
|
51
54
|
private _memoryStorage = new PostHogMemoryStorage()
|
|
@@ -62,6 +65,13 @@ export abstract class PostHogBackendClient extends PostHogCoreStateless implemen
|
|
|
62
65
|
|
|
63
66
|
distinctIdHasSentFlagCalls: Record<string, string[]>
|
|
64
67
|
|
|
68
|
+
// waitUntil debounce state (per-instance)
|
|
69
|
+
private _waitUntilCycle?: {
|
|
70
|
+
resolve: () => void
|
|
71
|
+
startedAt: number
|
|
72
|
+
timer: ReturnType<typeof setTimeout> | undefined
|
|
73
|
+
}
|
|
74
|
+
|
|
65
75
|
/**
|
|
66
76
|
* Initialize a new PostHog client instance.
|
|
67
77
|
*
|
|
@@ -102,6 +112,13 @@ export abstract class PostHogBackendClient extends PostHogCoreStateless implemen
|
|
|
102
112
|
? Math.max(options.featureFlagsPollingInterval, MINIMUM_POLLING_INTERVAL)
|
|
103
113
|
: THIRTY_SECONDS
|
|
104
114
|
|
|
115
|
+
if (typeof options.waitUntilDebounceMs === 'number') {
|
|
116
|
+
this.options.waitUntilDebounceMs = Math.max(options.waitUntilDebounceMs, 0)
|
|
117
|
+
}
|
|
118
|
+
if (typeof options.waitUntilMaxWaitMs === 'number') {
|
|
119
|
+
this.options.waitUntilMaxWaitMs = Math.max(options.waitUntilMaxWaitMs, 0)
|
|
120
|
+
}
|
|
121
|
+
|
|
105
122
|
if (options.personalApiKey) {
|
|
106
123
|
if (options.personalApiKey.includes('phc_')) {
|
|
107
124
|
throw new Error(
|
|
@@ -138,6 +155,93 @@ export abstract class PostHogBackendClient extends PostHogCoreStateless implemen
|
|
|
138
155
|
this.maxCacheSize = options.maxCacheSize || MAX_CACHE_SIZE
|
|
139
156
|
}
|
|
140
157
|
|
|
158
|
+
protected override enqueue(type: string, message: any, options?: PostHogCaptureOptions): void {
|
|
159
|
+
super.enqueue(type, message, options)
|
|
160
|
+
this.scheduleDebouncedFlush()
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
override async flush(): Promise<void> {
|
|
164
|
+
const flushPromise = super.flush()
|
|
165
|
+
const waitUntil = this.options.waitUntil
|
|
166
|
+
// Only register when no debounce promise is already keeping runtime alive
|
|
167
|
+
if (waitUntil && !this._waitUntilCycle) {
|
|
168
|
+
try {
|
|
169
|
+
waitUntil(flushPromise.catch(() => {}))
|
|
170
|
+
} catch {
|
|
171
|
+
// waitUntil may throw outside request context
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return flushPromise
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private scheduleDebouncedFlush(): void {
|
|
178
|
+
// `waitUntil` is a serverless construct
|
|
179
|
+
// if it doesn't exist, we can skip all the debounce logic and flush as normal
|
|
180
|
+
const waitUntil = this.options.waitUntil
|
|
181
|
+
if (!waitUntil) {
|
|
182
|
+
return
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (this.disabled || this.optedOut) {
|
|
186
|
+
return
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (!this._waitUntilCycle) {
|
|
190
|
+
let resolve: () => void
|
|
191
|
+
const promise = new Promise<void>((r) => {
|
|
192
|
+
resolve = r
|
|
193
|
+
})
|
|
194
|
+
try {
|
|
195
|
+
waitUntil(promise)
|
|
196
|
+
} catch {
|
|
197
|
+
// waitUntil may throw outside request context
|
|
198
|
+
return
|
|
199
|
+
}
|
|
200
|
+
this._waitUntilCycle = { resolve: resolve!, startedAt: Date.now(), timer: undefined }
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Max time cap: if we've been debouncing too long, flush now to prevent
|
|
204
|
+
// starvation from rapid concurrent captures. I.e., don't let a steady
|
|
205
|
+
// stream of captures keep pushing the flush back indefinitely.
|
|
206
|
+
const elapsed = Date.now() - this._waitUntilCycle.startedAt
|
|
207
|
+
const maxWaitMs = this.options.waitUntilMaxWaitMs ?? WAITUNTIL_MAX_WAIT_MS
|
|
208
|
+
const flushNow = elapsed >= maxWaitMs
|
|
209
|
+
|
|
210
|
+
if (this._waitUntilCycle.timer !== undefined) {
|
|
211
|
+
clearTimeout(this._waitUntilCycle.timer)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (flushNow) {
|
|
215
|
+
void this.resolveWaitUntilFlush()
|
|
216
|
+
return
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const debounceMs = this.options.waitUntilDebounceMs ?? WAITUNTIL_DEBOUNCE_MS
|
|
220
|
+
this._waitUntilCycle.timer = safeSetTimeout(() => {
|
|
221
|
+
void this.resolveWaitUntilFlush()
|
|
222
|
+
}, debounceMs)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
private _consumeWaitUntilCycle(): (() => void) | undefined {
|
|
226
|
+
const cycle = this._waitUntilCycle
|
|
227
|
+
if (cycle) {
|
|
228
|
+
clearTimeout(cycle.timer)
|
|
229
|
+
this._waitUntilCycle = undefined
|
|
230
|
+
}
|
|
231
|
+
return cycle?.resolve
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
private async resolveWaitUntilFlush(): Promise<void> {
|
|
235
|
+
const resolve = this._consumeWaitUntilCycle()
|
|
236
|
+
try {
|
|
237
|
+
await super.flush()
|
|
238
|
+
} catch {
|
|
239
|
+
// Flush errors are already logged by flush() internals
|
|
240
|
+
} finally {
|
|
241
|
+
resolve?.()
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
141
245
|
/**
|
|
142
246
|
* Get a persisted property value from memory storage.
|
|
143
247
|
*
|
|
@@ -1592,9 +1696,16 @@ export abstract class PostHogBackendClient extends PostHogCoreStateless implemen
|
|
|
1592
1696
|
* @returns Promise that resolves when shutdown is complete
|
|
1593
1697
|
*/
|
|
1594
1698
|
async _shutdown(shutdownTimeoutMs?: number): Promise<void> {
|
|
1699
|
+
// Cancel any pending debounced flush — shutdown will flush directly.
|
|
1700
|
+
const resolve = this._consumeWaitUntilCycle()
|
|
1701
|
+
|
|
1595
1702
|
this.featureFlagsPoller?.stopPoller(shutdownTimeoutMs)
|
|
1596
1703
|
this.errorTracking.shutdown()
|
|
1597
|
-
|
|
1704
|
+
try {
|
|
1705
|
+
return await super._shutdown(shutdownTimeoutMs)
|
|
1706
|
+
} finally {
|
|
1707
|
+
resolve?.()
|
|
1708
|
+
}
|
|
1598
1709
|
}
|
|
1599
1710
|
|
|
1600
1711
|
private async _requestRemoteConfigPayload(flagKey: string): Promise<PostHogFetchResponse | undefined> {
|
package/src/types.ts
CHANGED
|
@@ -215,6 +215,35 @@ export type PostHogOptions = Omit<PostHogCoreOptions, 'before_send'> & {
|
|
|
215
215
|
* @default false
|
|
216
216
|
*/
|
|
217
217
|
strictLocalEvaluation?: boolean
|
|
218
|
+
/**
|
|
219
|
+
* Provides the API to extend the lifetime of a serverless invocation until
|
|
220
|
+
* background work (like flushing analytics events) completes after the response
|
|
221
|
+
* is sent.
|
|
222
|
+
*
|
|
223
|
+
* @experimental Subject to change in a minor release.
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* // Vercel
|
|
227
|
+
* import { waitUntil } from '@vercel/functions'
|
|
228
|
+
* new PostHog('key', { waitUntil })
|
|
229
|
+
*/
|
|
230
|
+
waitUntil?: (promise: Promise<unknown>) => void
|
|
231
|
+
/**
|
|
232
|
+
* Debounce interval in milliseconds for the `waitUntil`-based flush.
|
|
233
|
+
* After the last event is enqueued, the SDK waits this long before flushing.
|
|
234
|
+
*
|
|
235
|
+
* @experimental Subject to change in a minor release.
|
|
236
|
+
* @default 50
|
|
237
|
+
*/
|
|
238
|
+
waitUntilDebounceMs?: number
|
|
239
|
+
/**
|
|
240
|
+
* Maximum time in milliseconds to debounce before forcing a flush.
|
|
241
|
+
* Prevents starvation from rapid concurrent captures.
|
|
242
|
+
*
|
|
243
|
+
* @experimental Subject to change in a minor release.
|
|
244
|
+
* @default 500
|
|
245
|
+
*/
|
|
246
|
+
waitUntilMaxWaitMs?: number
|
|
218
247
|
}
|
|
219
248
|
|
|
220
249
|
export type PostHogFeatureFlag = {
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '5.
|
|
1
|
+
export const version = '5.27.0'
|