@posthog/core 1.33.0 → 1.35.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.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -18
- package/dist/index.mjs +3 -3
- package/dist/logs/index.d.ts +14 -15
- package/dist/logs/index.d.ts.map +1 -1
- package/dist/logs/index.js +46 -18
- package/dist/logs/index.mjs +47 -19
- package/dist/logs/logs-utils.d.ts +16 -1
- package/dist/logs/logs-utils.d.ts.map +1 -1
- package/dist/logs/logs-utils.js +17 -0
- package/dist/logs/logs-utils.mjs +15 -1
- package/dist/logs/types.d.ts +23 -38
- package/dist/logs/types.d.ts.map +1 -1
- package/dist/posthog-core.d.ts +20 -0
- package/dist/posthog-core.d.ts.map +1 -1
- package/dist/posthog-core.js +79 -10
- package/dist/posthog-core.mjs +79 -10
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +2 -1
- package/src/logs/index.spec.ts +259 -0
- package/src/logs/index.ts +108 -49
- package/src/logs/logs-utils.ts +30 -1
- package/src/logs/types.ts +32 -37
- package/src/posthog-core.ts +120 -13
- package/src/types.ts +19 -0
package/dist/logs/logs-utils.js
CHANGED
|
@@ -26,6 +26,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
27
|
toOtlpKeyValueList: ()=>toOtlpKeyValueList,
|
|
28
28
|
getOtlpSeverityNumber: ()=>getOtlpSeverityNumber,
|
|
29
|
+
buildResourceAttributes: ()=>buildResourceAttributes,
|
|
29
30
|
getOtlpSeverityText: ()=>getOtlpSeverityText,
|
|
30
31
|
buildOtlpLogsPayload: ()=>buildOtlpLogsPayload,
|
|
31
32
|
buildOtlpLogRecord: ()=>buildOtlpLogRecord,
|
|
@@ -142,6 +143,20 @@ function buildOtlpLogRecord(options, sdkContext) {
|
|
|
142
143
|
if (!(0, index_js_namespaceObject.isUndefined)(options.trace_flags)) record.flags = options.trace_flags;
|
|
143
144
|
return record;
|
|
144
145
|
}
|
|
146
|
+
function buildResourceAttributes(config, scopeName, scopeVersion) {
|
|
147
|
+
return {
|
|
148
|
+
...config.resourceAttributes,
|
|
149
|
+
'service.name': config.serviceName || 'unknown_service',
|
|
150
|
+
...config.environment && {
|
|
151
|
+
'deployment.environment': config.environment
|
|
152
|
+
},
|
|
153
|
+
...config.serviceVersion && {
|
|
154
|
+
'service.version': config.serviceVersion
|
|
155
|
+
},
|
|
156
|
+
'telemetry.sdk.name': scopeName,
|
|
157
|
+
'telemetry.sdk.version': scopeVersion
|
|
158
|
+
};
|
|
159
|
+
}
|
|
145
160
|
function buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVersion) {
|
|
146
161
|
return {
|
|
147
162
|
resourceLogs: [
|
|
@@ -164,6 +179,7 @@ function buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVe
|
|
|
164
179
|
}
|
|
165
180
|
exports.buildOtlpLogRecord = __webpack_exports__.buildOtlpLogRecord;
|
|
166
181
|
exports.buildOtlpLogsPayload = __webpack_exports__.buildOtlpLogsPayload;
|
|
182
|
+
exports.buildResourceAttributes = __webpack_exports__.buildResourceAttributes;
|
|
167
183
|
exports.getOtlpSeverityNumber = __webpack_exports__.getOtlpSeverityNumber;
|
|
168
184
|
exports.getOtlpSeverityText = __webpack_exports__.getOtlpSeverityText;
|
|
169
185
|
exports.toOtlpAnyValue = __webpack_exports__.toOtlpAnyValue;
|
|
@@ -171,6 +187,7 @@ exports.toOtlpKeyValueList = __webpack_exports__.toOtlpKeyValueList;
|
|
|
171
187
|
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
172
188
|
"buildOtlpLogRecord",
|
|
173
189
|
"buildOtlpLogsPayload",
|
|
190
|
+
"buildResourceAttributes",
|
|
174
191
|
"getOtlpSeverityNumber",
|
|
175
192
|
"getOtlpSeverityText",
|
|
176
193
|
"toOtlpAnyValue",
|
package/dist/logs/logs-utils.mjs
CHANGED
|
@@ -109,6 +109,20 @@ function buildOtlpLogRecord(options, sdkContext) {
|
|
|
109
109
|
if (!isUndefined(options.trace_flags)) record.flags = options.trace_flags;
|
|
110
110
|
return record;
|
|
111
111
|
}
|
|
112
|
+
function buildResourceAttributes(config, scopeName, scopeVersion) {
|
|
113
|
+
return {
|
|
114
|
+
...config.resourceAttributes,
|
|
115
|
+
'service.name': config.serviceName || 'unknown_service',
|
|
116
|
+
...config.environment && {
|
|
117
|
+
'deployment.environment': config.environment
|
|
118
|
+
},
|
|
119
|
+
...config.serviceVersion && {
|
|
120
|
+
'service.version': config.serviceVersion
|
|
121
|
+
},
|
|
122
|
+
'telemetry.sdk.name': scopeName,
|
|
123
|
+
'telemetry.sdk.version': scopeVersion
|
|
124
|
+
};
|
|
125
|
+
}
|
|
112
126
|
function buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVersion) {
|
|
113
127
|
return {
|
|
114
128
|
resourceLogs: [
|
|
@@ -129,4 +143,4 @@ function buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVe
|
|
|
129
143
|
]
|
|
130
144
|
};
|
|
131
145
|
}
|
|
132
|
-
export { buildOtlpLogRecord, buildOtlpLogsPayload, getOtlpSeverityNumber, getOtlpSeverityText, toOtlpAnyValue, toOtlpKeyValueList };
|
|
146
|
+
export { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes, getOtlpSeverityNumber, getOtlpSeverityText, toOtlpAnyValue, toOtlpKeyValueList };
|
package/dist/logs/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { LogSeverityLevel, OtlpSeverityText, OtlpSeverityEntry, LogAttributeValue, LogAttributes, CaptureLogOptions, OtlpAnyValue, OtlpKeyValue, OtlpLogRecord, OtlpLogsPayload, } from '@posthog/types';
|
|
1
|
+
export type { LogSeverityLevel, OtlpSeverityText, OtlpSeverityEntry, LogAttributeValue, LogAttributes, CaptureLogOptions, OtlpAnyValue, OtlpKeyValue, OtlpLogRecord, OtlpLogsPayload, BeforeSendLogFn, } from '@posthog/types';
|
|
2
2
|
/**
|
|
3
3
|
* SDK-internal context the host SDK passes to `buildOtlpLogRecord` at capture
|
|
4
4
|
* time. Each SDK populates the fields that apply to it: browser fills
|
|
@@ -20,42 +20,26 @@ export interface LogSdkContext {
|
|
|
20
20
|
}
|
|
21
21
|
import type { Logger as CaptureLoggerType } from '@posthog/types';
|
|
22
22
|
export type CaptureLogger = CaptureLoggerType;
|
|
23
|
-
import type { LogAttributeValue,
|
|
23
|
+
import type { LogAttributeValue, OtlpLogRecord, OtlpLogsPayload, BeforeSendLogFn } from '@posthog/types';
|
|
24
|
+
import type { PostHogPersistedProperty } from '../types';
|
|
25
|
+
import type { SendLogsBatchOutcome } from '../posthog-core-stateless';
|
|
24
26
|
export interface BufferedLogEntry {
|
|
25
27
|
record: OtlpLogRecord;
|
|
26
28
|
}
|
|
27
29
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* Configure as a single fn or an array. Arrays form a left-to-right chain:
|
|
33
|
-
* each fn receives the previous fn's return value. A `null` from any link
|
|
34
|
-
* short-circuits the chain and drops the record.
|
|
35
|
-
*
|
|
36
|
-
* Runs *before* the rate cap so dropped records don't consume the
|
|
37
|
-
* per-interval budget. Throwing fns are logged and skipped — the chain
|
|
38
|
-
* continues with the previous return value, so a buggy filter degrades to a
|
|
39
|
-
* no-op rather than crashing `captureLog()`.
|
|
40
|
-
*
|
|
41
|
-
* @example Redact secrets from log bodies
|
|
42
|
-
* ```ts
|
|
43
|
-
* logs: {
|
|
44
|
-
* beforeSend: (record) => ({
|
|
45
|
-
* ...record,
|
|
46
|
-
* body: record.body.replace(/api_key=\S+/g, 'api_key=[REDACTED]'),
|
|
47
|
-
* }),
|
|
48
|
-
* }
|
|
49
|
-
* ```
|
|
50
|
-
*
|
|
51
|
-
* @example Drop noisy debug logs in production
|
|
52
|
-
* ```ts
|
|
53
|
-
* logs: {
|
|
54
|
-
* beforeSend: (record) => (record.level === 'debug' ? null : record),
|
|
55
|
-
* }
|
|
56
|
-
* ```
|
|
30
|
+
* The minimal host surface `PostHogLogs` depends on. `PostHogCoreStateless`
|
|
31
|
+
* satisfies it structurally (mobile/node); the browser supplies an adapter
|
|
32
|
+
* backed by its own persistence and request layer.
|
|
57
33
|
*/
|
|
58
|
-
export
|
|
34
|
+
export interface LogsHost {
|
|
35
|
+
readonly isDisabled: boolean;
|
|
36
|
+
readonly optedOut: boolean;
|
|
37
|
+
getPersistedProperty<T>(key: PostHogPersistedProperty): T | undefined;
|
|
38
|
+
setPersistedProperty<T>(key: PostHogPersistedProperty, value: T | null): void;
|
|
39
|
+
_sendLogsBatch(payload: OtlpLogsPayload): Promise<SendLogsBatchOutcome>;
|
|
40
|
+
getLibraryId(): string;
|
|
41
|
+
getLibraryVersion(): string;
|
|
42
|
+
}
|
|
59
43
|
/**
|
|
60
44
|
* Configuration for the logs feature on `new PostHog(key, { logs: ... })`.
|
|
61
45
|
* All fields are optional; per-SDK defaults apply (mobile vs browser tune
|
|
@@ -65,7 +49,7 @@ export interface PostHogLogsConfig {
|
|
|
65
49
|
/**
|
|
66
50
|
* Service name attached to every record as the OTLP `service.name`
|
|
67
51
|
* resource attribute. Used by the Logs UI for filtering / grouping.
|
|
68
|
-
*
|
|
52
|
+
* Defaults to `'unknown_service'` when unset.
|
|
69
53
|
*/
|
|
70
54
|
serviceName?: string;
|
|
71
55
|
/**
|
|
@@ -94,11 +78,11 @@ export interface PostHogLogsConfig {
|
|
|
94
78
|
*/
|
|
95
79
|
flushIntervalMs?: number;
|
|
96
80
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
81
|
+
* Number of buffered records that triggers an immediate flush. Records also
|
|
82
|
+
* flush on the periodic interval and on `shutdown()`. The queue can grow past
|
|
83
|
+
* this while an async flush is in flight (e.g. during a synchronous burst); a
|
|
84
|
+
* separate, larger memory backstop evicts the oldest only once the queue
|
|
85
|
+
* exceeds the per-interval rate cap. Default: 100.
|
|
102
86
|
*/
|
|
103
87
|
maxBufferSize?: number;
|
|
104
88
|
/**
|
|
@@ -148,6 +132,7 @@ export interface PostHogLogsConfig {
|
|
|
148
132
|
}
|
|
149
133
|
export interface ResolvedPostHogLogsConfig extends Omit<PostHogLogsConfig, 'rateCap'> {
|
|
150
134
|
maxBufferSize: number;
|
|
135
|
+
maxQueueSize?: number;
|
|
151
136
|
flushIntervalMs: number;
|
|
152
137
|
maxBatchRecordsPerPost: number;
|
|
153
138
|
rateCapWindowMs: number;
|
package/dist/logs/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/logs/types.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,gBAAgB,CAAA;AAEvB;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,CAAA;IACtC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC9B;AAKD,OAAO,KAAK,EAAE,MAAM,IAAI,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACjE,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAA;AAE7C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/logs/types.ts"],"names":[],"mappings":"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"}
|
package/dist/posthog-core.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ interface FlagsAsyncOptions {
|
|
|
9
9
|
}
|
|
10
10
|
export declare abstract class PostHogCore extends PostHogCoreStateless {
|
|
11
11
|
private sendFeatureFlagEvent;
|
|
12
|
+
private disableRemoteFeatureFlags;
|
|
12
13
|
private flagCallReported;
|
|
13
14
|
private _beforeSend?;
|
|
14
15
|
protected _flagsResponsePromise?: Promise<PostHogFeatureFlagsResponse | undefined>;
|
|
@@ -165,6 +166,25 @@ export declare abstract class PostHogCore extends PostHogCoreStateless {
|
|
|
165
166
|
onFeatureFlags(cb: (flags: PostHogFlagsResponse['featureFlags']) => void): () => void;
|
|
166
167
|
onFeatureFlag(key: string, cb: (value: FeatureFlagValue) => void): () => void;
|
|
167
168
|
overrideFeatureFlag(flags: PostHogFlagsResponse['featureFlags'] | null): Promise<void>;
|
|
169
|
+
/**
|
|
170
|
+
* Replaces (or merges into) the stored feature flags and payloads with locally supplied
|
|
171
|
+
* values, exactly as if they had been returned by the flags endpoint: the values are
|
|
172
|
+
* persisted, `getFeatureFlag()`/`getFeatureFlagPayload()` read them back, and
|
|
173
|
+
* `onFeatureFlags` listeners fire. Makes no network request.
|
|
174
|
+
*
|
|
175
|
+
* Intended for apps that evaluate flags outside the SDK (e.g. server-side local
|
|
176
|
+
* evaluation) and push the results in at runtime, typically together with the
|
|
177
|
+
* `disableRemoteFeatureFlags` option so the SDK never fetches flags itself.
|
|
178
|
+
*
|
|
179
|
+
* The values are cleared by `reset()`, so push them again after an identity change.
|
|
180
|
+
*
|
|
181
|
+
* @param flags - Flag keys mapped to their values (boolean, or a variant string)
|
|
182
|
+
* @param payloads - Optional flag keys mapped to their JSON payloads
|
|
183
|
+
* @param options - Set `merge: true` to merge with the currently stored flags instead of replacing them
|
|
184
|
+
*/
|
|
185
|
+
updateFlags(flags: Record<string, FeatureFlagValue>, payloads?: Record<string, JsonType>, options?: {
|
|
186
|
+
merge?: boolean;
|
|
187
|
+
}): void;
|
|
168
188
|
/**
|
|
169
189
|
* Capture a caught exception manually
|
|
170
190
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog-core.d.ts","sourceRoot":"","sources":["../src/posthog-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EAGxB,yBAAyB,EAKzB,sBAAsB,EAGvB,MAAM,SAAS,CAAA;AAYhB,OAAO,EAAiC,wBAAwB,EAAE,MAAM,SAAS,CAAA;AACjF,OAAO,EAAY,oBAAoB,EAAuB,MAAM,0BAA0B,CAAA;AAG9F,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAG5C,UAAU,iBAAiB;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AAOD,8BAAsB,WAAY,SAAQ,oBAAoB;IAE5D,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,WAAW,CAAC,CAA+B;IAGnD,SAAS,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC,CAAA;IAClF,SAAS,CAAC,6BAA6B,EAAE,MAAM,CAAA;IAC/C,OAAO,CAAC,wBAAwB,CAAuB;IACvD,SAAS,CAAC,YAAY,EAAE,sBAAsB,CAAK;IAInD,OAAO,CAAC,oBAAoB,CAAC,CAAqB;IAGlD,SAAS,CAAC,eAAe,EAAE,QAAQ,GAAG,iBAAiB,GAAG,OAAO,CAAA;IAGjE,SAAS,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAO;gBAE3C,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;
|
|
1
|
+
{"version":3,"file":"posthog-core.d.ts","sourceRoot":"","sources":["../src/posthog-core.ts"],"names":[],"mappings":"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"}
|
package/dist/posthog-core.js
CHANGED
|
@@ -41,6 +41,7 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
41
41
|
featureFlagsRequestTimeoutMs
|
|
42
42
|
}), this.flagCallReported = {}, this._sessionMaxLengthSeconds = 86400, this.sessionProps = {}, this._cachedPersonProperties = null;
|
|
43
43
|
this.sendFeatureFlagEvent = options?.sendFeatureFlagEvent ?? true;
|
|
44
|
+
this.disableRemoteFeatureFlags = options?.disableRemoteFeatureFlags ?? false;
|
|
44
45
|
this._sessionExpirationTimeSeconds = options?.sessionExpirationTimeSeconds ?? 1800;
|
|
45
46
|
this._personProfiles = options?.personProfiles ?? 'identified_only';
|
|
46
47
|
this._beforeSend = options?.before_send;
|
|
@@ -97,7 +98,11 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
97
98
|
this.clearProps();
|
|
98
99
|
this._cachedPersonProperties = null;
|
|
99
100
|
for (const key of Object.keys(external_types_js_namespaceObject.PostHogPersistedProperty))if (!allPropertiesToKeep.includes(external_types_js_namespaceObject.PostHogPersistedProperty[key])) this.setPersistedProperty(external_types_js_namespaceObject.PostHogPersistedProperty[key], null);
|
|
100
|
-
this.
|
|
101
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) {
|
|
102
|
+
if (!allPropertiesToKeep.includes(external_types_js_namespaceObject.PostHogPersistedProperty.FeatureFlagDetails)) this.setKnownFeatureFlagDetails({
|
|
103
|
+
flags: {}
|
|
104
|
+
});
|
|
105
|
+
} else this.reloadFeatureFlags();
|
|
101
106
|
});
|
|
102
107
|
}
|
|
103
108
|
getCommonEventProperties() {
|
|
@@ -312,6 +317,7 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
312
317
|
const { sendAnonDistinctId = true, fetchConfig = false, triggerOnRemoteConfig = false } = options ?? {};
|
|
313
318
|
await this._initPromise;
|
|
314
319
|
if (this.disabled) return;
|
|
320
|
+
if (this.disableRemoteFeatureFlags && !fetchConfig) return void this._logger.info('Feature flags are disabled (disableRemoteFeatureFlags), skipping reload.');
|
|
315
321
|
if (this._flagsResponsePromise) {
|
|
316
322
|
this._logger.info('Feature flags are being loaded already, queuing reload.');
|
|
317
323
|
if (this._pendingFlagsRequest) this._flagsResponsePromise.then(this._pendingFlagsRequest.resolve).catch(this._pendingFlagsRequest.reject);
|
|
@@ -375,11 +381,11 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
375
381
|
this.cacheSessionReplay('remote config', response);
|
|
376
382
|
let willLoadFlags = false;
|
|
377
383
|
if (false === response.hasFeatureFlags) {
|
|
378
|
-
this.setKnownFeatureFlagDetails({
|
|
384
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
379
385
|
flags: {}
|
|
380
386
|
});
|
|
381
387
|
this._logger.warn('Remote config has no feature flags, will not load feature flags.');
|
|
382
|
-
} else if (false !== this.preloadFeatureFlags) {
|
|
388
|
+
} else if (false !== this.preloadFeatureFlags && !this.disableRemoteFeatureFlags) {
|
|
383
389
|
willLoadFlags = true;
|
|
384
390
|
this.flagsAsync({
|
|
385
391
|
sendAnonDistinctId: true,
|
|
@@ -410,16 +416,22 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
410
416
|
const deviceId = this.getPersistedProperty(external_types_js_namespaceObject.PostHogPersistedProperty.DeviceId);
|
|
411
417
|
const extraProperties = {
|
|
412
418
|
$anon_distinct_id: sendAnonDistinctId ? this.getAnonymousId() : void 0,
|
|
413
|
-
$device_id: deviceId ?? void 0
|
|
419
|
+
$device_id: deviceId ?? void 0,
|
|
420
|
+
...this.disableRemoteFeatureFlags ? {
|
|
421
|
+
disable_flags: true
|
|
422
|
+
} : {}
|
|
414
423
|
};
|
|
415
424
|
const result = await super.getFlags(distinctId, groups, personProperties, groupProperties, extraProperties, fetchConfig);
|
|
416
|
-
if (!result.success)
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
425
|
+
if (!result.success) {
|
|
426
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
427
|
+
flags: this.getKnownFeatureFlagDetails()?.flags ?? {},
|
|
428
|
+
requestError: result.error
|
|
429
|
+
});
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
420
432
|
const res = result.response;
|
|
421
433
|
if (res?.quotaLimited?.includes(external_posthog_core_stateless_js_namespaceObject.QuotaLimitedFeature.FeatureFlags)) {
|
|
422
|
-
this.setKnownFeatureFlagDetails({
|
|
434
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
423
435
|
flags: this.getKnownFeatureFlagDetails()?.flags ?? {},
|
|
424
436
|
quotaLimited: res.quotaLimited
|
|
425
437
|
});
|
|
@@ -428,6 +440,11 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
428
440
|
return res;
|
|
429
441
|
}
|
|
430
442
|
if (res?.featureFlags) {
|
|
443
|
+
if (this.disableRemoteFeatureFlags) {
|
|
444
|
+
this.cacheSessionReplay('flags', res);
|
|
445
|
+
this.maybeNotifyRemoteConfig(triggerOnRemoteConfig, res);
|
|
446
|
+
return res;
|
|
447
|
+
}
|
|
431
448
|
if (this.sendFeatureFlagEvent) this.flagCallReported = {};
|
|
432
449
|
let newFeatureFlagDetails = res;
|
|
433
450
|
if (res.errorsWhileComputingFlags) {
|
|
@@ -607,7 +624,9 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
607
624
|
featureFlagPayloads: {},
|
|
608
625
|
flags: {}
|
|
609
626
|
};
|
|
610
|
-
const flags =
|
|
627
|
+
const flags = {
|
|
628
|
+
...details.flags ?? {}
|
|
629
|
+
};
|
|
611
630
|
for(const key in overriddenFlags)if (overriddenFlags[key]) flags[key] = (0, external_featureFlagUtils_js_namespaceObject.updateFlagValue)(flags[key], overriddenFlags[key]);
|
|
612
631
|
else delete flags[key];
|
|
613
632
|
const result = {
|
|
@@ -630,6 +649,7 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
630
649
|
return !!response;
|
|
631
650
|
}
|
|
632
651
|
reloadFeatureFlags(options) {
|
|
652
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) return void this._initPromise.then(()=>options?.cb?.(void 0, this.getFeatureFlags()));
|
|
633
653
|
this.flagsAsync({
|
|
634
654
|
sendAnonDistinctId: true
|
|
635
655
|
}).then((res)=>{
|
|
@@ -643,6 +663,10 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
643
663
|
return await this.remoteConfigAsync();
|
|
644
664
|
}
|
|
645
665
|
async reloadFeatureFlagsAsync(sendAnonDistinctId) {
|
|
666
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) {
|
|
667
|
+
await this._initPromise;
|
|
668
|
+
return this.getFeatureFlags();
|
|
669
|
+
}
|
|
646
670
|
return (await this.flagsAsync({
|
|
647
671
|
sendAnonDistinctId: sendAnonDistinctId
|
|
648
672
|
}))?.featureFlags;
|
|
@@ -665,6 +689,51 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
665
689
|
return this.setPersistedProperty(external_types_js_namespaceObject.PostHogPersistedProperty.OverrideFeatureFlags, flags);
|
|
666
690
|
});
|
|
667
691
|
}
|
|
692
|
+
updateFlags(flags, payloads, options) {
|
|
693
|
+
this.wrap(()=>{
|
|
694
|
+
const existingDetails = options?.merge ? this.getKnownFeatureFlagDetails()?.flags : void 0;
|
|
695
|
+
const existingFlags = existingDetails ? (0, external_featureFlagUtils_js_namespaceObject.getFlagValuesFromFlags)(existingDetails) : {};
|
|
696
|
+
const existingPayloads = {};
|
|
697
|
+
for(const key in existingDetails){
|
|
698
|
+
const storedPayload = existingDetails[key].metadata?.payload;
|
|
699
|
+
if (void 0 !== storedPayload) existingPayloads[key] = (0, external_featureFlagUtils_js_namespaceObject.parsePayload)(storedPayload);
|
|
700
|
+
}
|
|
701
|
+
const finalFlags = {
|
|
702
|
+
...existingFlags,
|
|
703
|
+
...flags
|
|
704
|
+
};
|
|
705
|
+
const finalPayloads = {
|
|
706
|
+
...existingPayloads,
|
|
707
|
+
...payloads ?? {}
|
|
708
|
+
};
|
|
709
|
+
const flagDetails = {};
|
|
710
|
+
for (const [key, value] of Object.entries(finalFlags)){
|
|
711
|
+
const payload = finalPayloads[key];
|
|
712
|
+
let serializedPayload;
|
|
713
|
+
if (void 0 !== payload) try {
|
|
714
|
+
serializedPayload = JSON.stringify(payload);
|
|
715
|
+
} catch (e) {
|
|
716
|
+
this._logger.error(`updateFlags: could not serialize the payload for flag "${key}", dropping it.`, e);
|
|
717
|
+
}
|
|
718
|
+
flagDetails[key] = {
|
|
719
|
+
key,
|
|
720
|
+
enabled: (0, external_featureFlagUtils_js_namespaceObject.getEnabledFromValue)(value),
|
|
721
|
+
variant: (0, external_featureFlagUtils_js_namespaceObject.getVariantFromValue)(value),
|
|
722
|
+
reason: void 0,
|
|
723
|
+
metadata: {
|
|
724
|
+
id: void 0,
|
|
725
|
+
version: void 0,
|
|
726
|
+
description: void 0,
|
|
727
|
+
payload: serializedPayload
|
|
728
|
+
}
|
|
729
|
+
};
|
|
730
|
+
}
|
|
731
|
+
if (this.sendFeatureFlagEvent) this.flagCallReported = {};
|
|
732
|
+
this.setKnownFeatureFlagDetails({
|
|
733
|
+
flags: flagDetails
|
|
734
|
+
});
|
|
735
|
+
});
|
|
736
|
+
}
|
|
668
737
|
captureException(error, additionalProperties, hint) {
|
|
669
738
|
try {
|
|
670
739
|
const exceptionProperties = this.getErrorPropertiesBuilder().buildFromUnknown(error, hint);
|
package/dist/posthog-core.mjs
CHANGED
|
@@ -13,6 +13,7 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
13
13
|
featureFlagsRequestTimeoutMs
|
|
14
14
|
}), this.flagCallReported = {}, this._sessionMaxLengthSeconds = 86400, this.sessionProps = {}, this._cachedPersonProperties = null;
|
|
15
15
|
this.sendFeatureFlagEvent = options?.sendFeatureFlagEvent ?? true;
|
|
16
|
+
this.disableRemoteFeatureFlags = options?.disableRemoteFeatureFlags ?? false;
|
|
16
17
|
this._sessionExpirationTimeSeconds = options?.sessionExpirationTimeSeconds ?? 1800;
|
|
17
18
|
this._personProfiles = options?.personProfiles ?? 'identified_only';
|
|
18
19
|
this._beforeSend = options?.before_send;
|
|
@@ -69,7 +70,11 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
69
70
|
this.clearProps();
|
|
70
71
|
this._cachedPersonProperties = null;
|
|
71
72
|
for (const key of Object.keys(PostHogPersistedProperty))if (!allPropertiesToKeep.includes(PostHogPersistedProperty[key])) this.setPersistedProperty(PostHogPersistedProperty[key], null);
|
|
72
|
-
this.
|
|
73
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) {
|
|
74
|
+
if (!allPropertiesToKeep.includes(PostHogPersistedProperty.FeatureFlagDetails)) this.setKnownFeatureFlagDetails({
|
|
75
|
+
flags: {}
|
|
76
|
+
});
|
|
77
|
+
} else this.reloadFeatureFlags();
|
|
73
78
|
});
|
|
74
79
|
}
|
|
75
80
|
getCommonEventProperties() {
|
|
@@ -284,6 +289,7 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
284
289
|
const { sendAnonDistinctId = true, fetchConfig = false, triggerOnRemoteConfig = false } = options ?? {};
|
|
285
290
|
await this._initPromise;
|
|
286
291
|
if (this.disabled) return;
|
|
292
|
+
if (this.disableRemoteFeatureFlags && !fetchConfig) return void this._logger.info('Feature flags are disabled (disableRemoteFeatureFlags), skipping reload.');
|
|
287
293
|
if (this._flagsResponsePromise) {
|
|
288
294
|
this._logger.info('Feature flags are being loaded already, queuing reload.');
|
|
289
295
|
if (this._pendingFlagsRequest) this._flagsResponsePromise.then(this._pendingFlagsRequest.resolve).catch(this._pendingFlagsRequest.reject);
|
|
@@ -347,11 +353,11 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
347
353
|
this.cacheSessionReplay('remote config', response);
|
|
348
354
|
let willLoadFlags = false;
|
|
349
355
|
if (false === response.hasFeatureFlags) {
|
|
350
|
-
this.setKnownFeatureFlagDetails({
|
|
356
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
351
357
|
flags: {}
|
|
352
358
|
});
|
|
353
359
|
this._logger.warn('Remote config has no feature flags, will not load feature flags.');
|
|
354
|
-
} else if (false !== this.preloadFeatureFlags) {
|
|
360
|
+
} else if (false !== this.preloadFeatureFlags && !this.disableRemoteFeatureFlags) {
|
|
355
361
|
willLoadFlags = true;
|
|
356
362
|
this.flagsAsync({
|
|
357
363
|
sendAnonDistinctId: true,
|
|
@@ -382,16 +388,22 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
382
388
|
const deviceId = this.getPersistedProperty(PostHogPersistedProperty.DeviceId);
|
|
383
389
|
const extraProperties = {
|
|
384
390
|
$anon_distinct_id: sendAnonDistinctId ? this.getAnonymousId() : void 0,
|
|
385
|
-
$device_id: deviceId ?? void 0
|
|
391
|
+
$device_id: deviceId ?? void 0,
|
|
392
|
+
...this.disableRemoteFeatureFlags ? {
|
|
393
|
+
disable_flags: true
|
|
394
|
+
} : {}
|
|
386
395
|
};
|
|
387
396
|
const result = await super.getFlags(distinctId, groups, personProperties, groupProperties, extraProperties, fetchConfig);
|
|
388
|
-
if (!result.success)
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
397
|
+
if (!result.success) {
|
|
398
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
399
|
+
flags: this.getKnownFeatureFlagDetails()?.flags ?? {},
|
|
400
|
+
requestError: result.error
|
|
401
|
+
});
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
392
404
|
const res = result.response;
|
|
393
405
|
if (res?.quotaLimited?.includes(QuotaLimitedFeature.FeatureFlags)) {
|
|
394
|
-
this.setKnownFeatureFlagDetails({
|
|
406
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
395
407
|
flags: this.getKnownFeatureFlagDetails()?.flags ?? {},
|
|
396
408
|
quotaLimited: res.quotaLimited
|
|
397
409
|
});
|
|
@@ -400,6 +412,11 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
400
412
|
return res;
|
|
401
413
|
}
|
|
402
414
|
if (res?.featureFlags) {
|
|
415
|
+
if (this.disableRemoteFeatureFlags) {
|
|
416
|
+
this.cacheSessionReplay('flags', res);
|
|
417
|
+
this.maybeNotifyRemoteConfig(triggerOnRemoteConfig, res);
|
|
418
|
+
return res;
|
|
419
|
+
}
|
|
403
420
|
if (this.sendFeatureFlagEvent) this.flagCallReported = {};
|
|
404
421
|
let newFeatureFlagDetails = res;
|
|
405
422
|
if (res.errorsWhileComputingFlags) {
|
|
@@ -579,7 +596,9 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
579
596
|
featureFlagPayloads: {},
|
|
580
597
|
flags: {}
|
|
581
598
|
};
|
|
582
|
-
const flags =
|
|
599
|
+
const flags = {
|
|
600
|
+
...details.flags ?? {}
|
|
601
|
+
};
|
|
583
602
|
for(const key in overriddenFlags)if (overriddenFlags[key]) flags[key] = updateFlagValue(flags[key], overriddenFlags[key]);
|
|
584
603
|
else delete flags[key];
|
|
585
604
|
const result = {
|
|
@@ -602,6 +621,7 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
602
621
|
return !!response;
|
|
603
622
|
}
|
|
604
623
|
reloadFeatureFlags(options) {
|
|
624
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) return void this._initPromise.then(()=>options?.cb?.(void 0, this.getFeatureFlags()));
|
|
605
625
|
this.flagsAsync({
|
|
606
626
|
sendAnonDistinctId: true
|
|
607
627
|
}).then((res)=>{
|
|
@@ -615,6 +635,10 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
615
635
|
return await this.remoteConfigAsync();
|
|
616
636
|
}
|
|
617
637
|
async reloadFeatureFlagsAsync(sendAnonDistinctId) {
|
|
638
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) {
|
|
639
|
+
await this._initPromise;
|
|
640
|
+
return this.getFeatureFlags();
|
|
641
|
+
}
|
|
618
642
|
return (await this.flagsAsync({
|
|
619
643
|
sendAnonDistinctId: sendAnonDistinctId
|
|
620
644
|
}))?.featureFlags;
|
|
@@ -637,6 +661,51 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
637
661
|
return this.setPersistedProperty(PostHogPersistedProperty.OverrideFeatureFlags, flags);
|
|
638
662
|
});
|
|
639
663
|
}
|
|
664
|
+
updateFlags(flags, payloads, options) {
|
|
665
|
+
this.wrap(()=>{
|
|
666
|
+
const existingDetails = options?.merge ? this.getKnownFeatureFlagDetails()?.flags : void 0;
|
|
667
|
+
const existingFlags = existingDetails ? getFlagValuesFromFlags(existingDetails) : {};
|
|
668
|
+
const existingPayloads = {};
|
|
669
|
+
for(const key in existingDetails){
|
|
670
|
+
const storedPayload = existingDetails[key].metadata?.payload;
|
|
671
|
+
if (void 0 !== storedPayload) existingPayloads[key] = parsePayload(storedPayload);
|
|
672
|
+
}
|
|
673
|
+
const finalFlags = {
|
|
674
|
+
...existingFlags,
|
|
675
|
+
...flags
|
|
676
|
+
};
|
|
677
|
+
const finalPayloads = {
|
|
678
|
+
...existingPayloads,
|
|
679
|
+
...payloads ?? {}
|
|
680
|
+
};
|
|
681
|
+
const flagDetails = {};
|
|
682
|
+
for (const [key, value] of Object.entries(finalFlags)){
|
|
683
|
+
const payload = finalPayloads[key];
|
|
684
|
+
let serializedPayload;
|
|
685
|
+
if (void 0 !== payload) try {
|
|
686
|
+
serializedPayload = JSON.stringify(payload);
|
|
687
|
+
} catch (e) {
|
|
688
|
+
this._logger.error(`updateFlags: could not serialize the payload for flag "${key}", dropping it.`, e);
|
|
689
|
+
}
|
|
690
|
+
flagDetails[key] = {
|
|
691
|
+
key,
|
|
692
|
+
enabled: getEnabledFromValue(value),
|
|
693
|
+
variant: getVariantFromValue(value),
|
|
694
|
+
reason: void 0,
|
|
695
|
+
metadata: {
|
|
696
|
+
id: void 0,
|
|
697
|
+
version: void 0,
|
|
698
|
+
description: void 0,
|
|
699
|
+
payload: serializedPayload
|
|
700
|
+
}
|
|
701
|
+
};
|
|
702
|
+
}
|
|
703
|
+
if (this.sendFeatureFlagEvent) this.flagCallReported = {};
|
|
704
|
+
this.setKnownFeatureFlagDetails({
|
|
705
|
+
flags: flagDetails
|
|
706
|
+
});
|
|
707
|
+
});
|
|
708
|
+
}
|
|
640
709
|
captureException(error, additionalProperties, hint) {
|
|
641
710
|
try {
|
|
642
711
|
const exceptionProperties = this.getErrorPropertiesBuilder().buildFromUnknown(error, hint);
|
package/dist/types.d.ts
CHANGED
|
@@ -53,6 +53,25 @@ export type PostHogCoreOptions = {
|
|
|
53
53
|
* @default true
|
|
54
54
|
*/
|
|
55
55
|
preloadFeatureFlags?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Advanced: whether to disable fetching and evaluating feature flags from PostHog entirely.
|
|
58
|
+
*
|
|
59
|
+
* When set to true, `reloadFeatureFlags()` and the reloads triggered by `identify()`,
|
|
60
|
+
* `group()`, `setPersonPropertiesForFlags()` and `reset()` become no-ops, and any request
|
|
61
|
+
* to the flags endpoint that still goes out (e.g. to fetch remote config or surveys)
|
|
62
|
+
* carries `disable_flags: true` so the server skips flag evaluation. Flag values must be
|
|
63
|
+
* supplied via the `bootstrap` option or `updateFlags()` instead; `getFeatureFlag()` and
|
|
64
|
+
* related methods keep working against those values. Until `updateFlags()` runs, reads
|
|
65
|
+
* return their not-loaded defaults, so use `bootstrap` for any flags needed at startup.
|
|
66
|
+
* Equivalent to the web SDK's `advanced_disable_feature_flags`.
|
|
67
|
+
*
|
|
68
|
+
* Note: surveys gated on feature flags will not evaluate unless the survey targeting
|
|
69
|
+
* flags are also provided via `updateFlags()`. This option cannot be toggled at runtime.
|
|
70
|
+
* `posthog-node` inherits this option but does not implement it (no-op).
|
|
71
|
+
*
|
|
72
|
+
* @default false
|
|
73
|
+
*/
|
|
74
|
+
disableRemoteFeatureFlags?: boolean;
|
|
56
75
|
/**
|
|
57
76
|
* Whether to load remote config when initialized or not
|
|
58
77
|
* Experimental support
|