@posthog/convex 2.0.30 → 2.0.32

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.
@@ -12,6 +12,7 @@ import type { DataModel } from "./dataModel.js";
12
12
  * Typesafe environment variables declared in `convex.config.ts`.
13
13
  */
14
14
  type Env = {
15
+ readonly POSTHOG_DISABLE_LOCAL_EVALUATION: string | undefined;
15
16
  readonly POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS: string | undefined;
16
17
  readonly POSTHOG_HOST: string | undefined;
17
18
  readonly POSTHOG_PERSONAL_API_KEY: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/component/_generated/server.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAUvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;GAEG;AACH,KAAK,GAAG,GAAG;IACT,QAAQ,CAAC,sCAAsC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAgB,CAAC;AAErE;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,YAAY,CAAC,SAAS,EAAE,UAAU,CACxC,CAAC;AAEvB;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,EAAE,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAmB,CAAC;AAE9E;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,SAAS,EAAE,UAAU,CAC3C,CAAC;AAE1B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAiB,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,SAAS,EAAE,UAAU,CACzC,CAAC;AAExB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,EAAE,iBAAqC,CAAC;AAC/D,eAAO,MAAM,GAAG,EAAE,GAAmC,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAExD;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;AAE9D;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/component/_generated/server.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAUvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;GAEG;AACH,KAAK,GAAG,GAAG;IACT,QAAQ,CAAC,gCAAgC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9D,QAAQ,CAAC,sCAAsC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAgB,CAAC;AAErE;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,YAAY,CAAC,SAAS,EAAE,UAAU,CACxC,CAAC;AAEvB;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,EAAE,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAmB,CAAC;AAE9E;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,SAAS,EAAE,UAAU,CAC3C,CAAC;AAE1B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAiB,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,SAAS,EAAE,UAAU,CACzC,CAAC;AAExB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,EAAE,iBAAqC,CAAC;AAC/D,eAAO,MAAM,GAAG,EAAE,GAAmC,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAExD;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;AAE9D;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/component/_generated/server.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB;;;;;;;GAOG;AAaH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAavB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,KAAK,GAAsC,YAAY,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,oBAAoB,CAAC;AAEvB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAyC,eAAe,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,uBAAuB,CAAC;AAE1B;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,MAAM,GAAuC,aAAa,CAAC;AAExE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GACzB,qBAAqB,CAAC;AAExB;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,UAAU,GAAsB,iBAAiB,CAAC;AAC/D,MAAM,CAAC,MAAM,GAAG,GAAQ,OAAO,CAAC,GAAqB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/component/_generated/server.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB;;;;;;;GAOG;AAaH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAcvB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,KAAK,GAAsC,YAAY,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,oBAAoB,CAAC;AAEvB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAyC,eAAe,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,uBAAuB,CAAC;AAE1B;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,MAAM,GAAuC,aAAa,CAAC;AAExE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GACzB,qBAAqB,CAAC;AAExB;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,UAAU,GAAsB,iBAAiB,CAAC;AAC/D,MAAM,CAAC,MAAM,GAAG,GAAQ,OAAO,CAAC,GAAqB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The component declares the env vars it needs so the installing app can wire them in
3
3
  * `convex/convex.config.ts` (typically via `app.env.*` so existing project-level env vars
4
- * pass straight through). All three are read via `process.env` inside the component's
4
+ * pass straight through). These are read via `process.env` inside the component's
5
5
  * actions and cron — `POSTHOG_PERSONAL_API_KEY`'s presence is also what gates the local
6
6
  * evaluation refresh cron.
7
7
  */
@@ -10,11 +10,19 @@ declare const _default: import("convex/server").ComponentDefinition<any, {
10
10
  readonly POSTHOG_HOST: import("convex/values").VString<string | undefined, "optional">;
11
11
  readonly POSTHOG_PERSONAL_API_KEY: import("convex/values").VString<string | undefined, "optional">;
12
12
  /**
13
- * Polling interval for the local-evaluation refresh cron, in whole seconds. Optional
14
- * (defaults to 60). Convex component env vars are string-typed on the wire, so this is
15
- * parsed at module load — invalid values log a warning and fall back to the default.
13
+ * Polling interval for the local-evaluation refresh, in whole seconds. Optional (defaults
14
+ * to 60). Convex component env vars are string-typed on the wire and only forwarded at
15
+ * runtime, so it's read by the self-rescheduling refresh loop in `lib.ts` rather than at
16
+ * cron-registration time — invalid values log a warning and fall back to the default.
16
17
  */
17
18
  readonly POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS: import("convex/values").VString<string | undefined, "optional">;
19
+ /**
20
+ * Off-switch for the background local-evaluation refresh loop. Optional; unset by default, so
21
+ * polling stays on whenever `POSTHOG_PERSONAL_API_KEY` is set. Set to `"true"` (or `1`/`yes`/`on`)
22
+ * to stop the poll even with a key configured — e.g. if you only evaluate flags via the remote
23
+ * `evaluateFlag*` actions.
24
+ */
25
+ readonly POSTHOG_DISABLE_LOCAL_EVALUATION: import("convex/values").VString<string | undefined, "optional">;
18
26
  }>;
19
27
  export default _default;
20
28
  //# sourceMappingURL=convex.config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"convex.config.d.ts","sourceRoot":"","sources":["../../src/component/convex.config.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;;;;;IAMC;;;;OAIG;;;AATP,wBAYE"}
1
+ {"version":3,"file":"convex.config.d.ts","sourceRoot":"","sources":["../../src/component/convex.config.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;;;;;IAMC;;;;;OAKG;;IAEH;;;;;OAKG;;;AAjBP,wBAoBE"}
@@ -3,7 +3,7 @@ import { v } from 'convex/values';
3
3
  /**
4
4
  * The component declares the env vars it needs so the installing app can wire them in
5
5
  * `convex/convex.config.ts` (typically via `app.env.*` so existing project-level env vars
6
- * pass straight through). All three are read via `process.env` inside the component's
6
+ * pass straight through). These are read via `process.env` inside the component's
7
7
  * actions and cron — `POSTHOG_PERSONAL_API_KEY`'s presence is also what gates the local
8
8
  * evaluation refresh cron.
9
9
  */
@@ -13,11 +13,19 @@ export default defineComponent('posthog', {
13
13
  POSTHOG_HOST: v.optional(v.string()),
14
14
  POSTHOG_PERSONAL_API_KEY: v.optional(v.string()),
15
15
  /**
16
- * Polling interval for the local-evaluation refresh cron, in whole seconds. Optional
17
- * (defaults to 60). Convex component env vars are string-typed on the wire, so this is
18
- * parsed at module load — invalid values log a warning and fall back to the default.
16
+ * Polling interval for the local-evaluation refresh, in whole seconds. Optional (defaults
17
+ * to 60). Convex component env vars are string-typed on the wire and only forwarded at
18
+ * runtime, so it's read by the self-rescheduling refresh loop in `lib.ts` rather than at
19
+ * cron-registration time — invalid values log a warning and fall back to the default.
19
20
  */
20
21
  POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS: v.optional(v.string()),
22
+ /**
23
+ * Off-switch for the background local-evaluation refresh loop. Optional; unset by default, so
24
+ * polling stays on whenever `POSTHOG_PERSONAL_API_KEY` is set. Set to `"true"` (or `1`/`yes`/`on`)
25
+ * to stop the poll even with a key configured — e.g. if you only evaluate flags via the remote
26
+ * `evaluateFlag*` actions.
27
+ */
28
+ POSTHOG_DISABLE_LOCAL_EVALUATION: v.optional(v.string()),
21
29
  },
22
30
  });
23
31
  //# sourceMappingURL=convex.config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"convex.config.js","sourceRoot":"","sources":["../../src/component/convex.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAA;AAEjC;;;;;;GAMG;AACH,eAAe,eAAe,CAAC,SAAS,EAAE;IACxC,GAAG,EAAE;QACH,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE;QACjC,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACpC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChD;;;;WAIG;QACH,sCAAsC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/D;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"convex.config.js","sourceRoot":"","sources":["../../src/component/convex.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAA;AAEjC;;;;;;GAMG;AACH,eAAe,eAAe,CAAC,SAAS,EAAE;IACxC,GAAG,EAAE;QACH,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE;QACjC,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACpC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChD;;;;;WAKG;QACH,sCAAsC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9D;;;;;WAKG;QACH,gCAAgC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACzD;CACF,CAAC,CAAA"}
@@ -1,5 +1,3 @@
1
1
  declare const crons: import("convex/server").Crons;
2
- export declare const DEFAULT_INTERVAL_SECONDS = 60;
3
- export declare function readPollingIntervalSeconds(): number;
4
2
  export default crons;
5
3
  //# sourceMappingURL=crons.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"crons.d.ts","sourceRoot":"","sources":["../../src/component/crons.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,KAAK,+BAAa,CAAA;AAGxB,eAAO,MAAM,wBAAwB,KAAK,CAAA;AAI1C,wBAAgB,0BAA0B,IAAI,MAAM,CAYnD;AAYD,eAAe,KAAK,CAAA"}
1
+ {"version":3,"file":"crons.d.ts","sourceRoot":"","sources":["../../src/component/crons.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,KAAK,+BAAa,CAAA;AAWxB,eAAe,KAAK,CAAA"}
@@ -1,26 +1,13 @@
1
1
  import { cronJobs } from 'convex/server';
2
- import { api } from './_generated/api.js';
3
- import { env } from './_generated/server.js';
2
+ import { internal } from './_generated/api.js';
4
3
  const crons = cronJobs();
5
- // Override via `POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS`.
6
- export const DEFAULT_INTERVAL_SECONDS = 60;
7
- // Convex component env vars are string-typed. Invalid values warn and fall back rather than
8
- // failing the deploy. Exported for unit testing.
9
- export function readPollingIntervalSeconds() {
10
- const raw = (env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS ?? '').trim();
11
- if (!raw)
12
- return DEFAULT_INTERVAL_SECONDS;
13
- const parsed = Number(raw);
14
- if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {
15
- console.warn(`[PostHog] POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS="${raw}" is not a positive integer; ` +
16
- `falling back to ${DEFAULT_INTERVAL_SECONDS}s.`);
17
- return DEFAULT_INTERVAL_SECONDS;
18
- }
19
- return parsed;
20
- }
21
- // Registered unconditionally — Convex forwards component env vars only at runtime, so a
22
- // load-time gate on `POSTHOG_PERSONAL_API_KEY` sees an empty value at deploy-time module
23
- // analysis and silently drops the cron. The handler in `lib.ts` gates at runtime instead.
24
- crons.interval('Refresh PostHog feature flag definitions', { seconds: readPollingIntervalSeconds() }, api.lib.refreshFlagDefinitions, {});
4
+ // A cron's interval is fixed at registration, but Convex forwards component env vars only at
5
+ // runtime, so `POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS` is empty when crons are analysed (#3957;
6
+ // #3683 hit the same wall with the `POSTHOG_PERSONAL_API_KEY` gate). So the refresh runs as a
7
+ // self-rescheduling chain (`lib.ts:refreshLoop`) that reads the interval at runtime; this cron only
8
+ // supervises — `ensureRefreshLoop` (re)starts the chain to bootstrap a deploy and self-heal a stop.
9
+ // Its 5-minute cadence is a fixed floor (it can't read the runtime interval either), traded against
10
+ // bootstrap/heal latency; at very long intervals the supervisor itself dominates the cost.
11
+ crons.interval('Ensure PostHog flag refresh loop is running', { minutes: 5 }, internal.lib.ensureRefreshLoop, {});
25
12
  export default crons;
26
13
  //# sourceMappingURL=crons.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"crons.js","sourceRoot":"","sources":["../../src/component/crons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAA;AAE5C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;AAExB,yDAAyD;AACzD,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAA;AAE1C,4FAA4F;AAC5F,iDAAiD;AACjD,MAAM,UAAU,0BAA0B;IACxC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACrE,IAAI,CAAC,GAAG;QAAE,OAAO,wBAAwB,CAAA;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QACzE,OAAO,CAAC,IAAI,CACV,qDAAqD,GAAG,+BAA+B;YACrF,mBAAmB,wBAAwB,IAAI,CAClD,CAAA;QACD,OAAO,wBAAwB,CAAA;IACjC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,wFAAwF;AACxF,yFAAyF;AACzF,0FAA0F;AAC1F,KAAK,CAAC,QAAQ,CACZ,0CAA0C,EAC1C,EAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE,EACzC,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAC9B,EAAE,CACH,CAAA;AAED,eAAe,KAAK,CAAA"}
1
+ {"version":3,"file":"crons.js","sourceRoot":"","sources":["../../src/component/crons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;AAExB,6FAA6F;AAC7F,gGAAgG;AAChG,8FAA8F;AAC9F,oGAAoG;AACpG,oGAAoG;AACpG,oGAAoG;AACpG,2FAA2F;AAC3F,KAAK,CAAC,QAAQ,CAAC,6CAA6C,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;AAEjH,eAAe,KAAK,CAAA"}
@@ -79,11 +79,31 @@ export declare const _setFlagDefinitions: import("convex/server").RegisteredMuta
79
79
  data: string;
80
80
  }, Promise<void>>;
81
81
  export declare const _getCurrentEtag: import("convex/server").RegisteredQuery<"internal", {}, Promise<string | undefined>>;
82
+ export declare const DEFAULT_INTERVAL_SECONDS = 60;
83
+ export declare function envFlagIsTrue(raw: string | undefined): boolean;
84
+ export declare function readPollingIntervalSeconds(): number;
85
+ /**
86
+ * One tick: kick off a refresh now, then queue the next tick at the configured interval. A mutation
87
+ * so the chain is durable — scheduled mutations run exactly-once with retries, and queuing the next
88
+ * tick commits atomically with this one, so the chain can't silently break. The fetch is a separate
89
+ * at-most-once action; if it fails, the next tick refetches.
90
+ *
91
+ * Never invoke directly (e.g. dashboard "Run function"): while local evaluation is enabled it queues
92
+ * a successor, so a manual call forks the chain into two loops that run forever and double the
93
+ * cadence — the supervisor can't detect the fork. Use `ensureRefreshLoop` to (re)start it.
94
+ */
95
+ export declare const refreshLoop: import("convex/server").RegisteredMutation<"internal", {}, Promise<void>>;
96
+ /**
97
+ * Supervisor, called by the cron in `crons.ts`: starts the chain unless a tick is already pending
98
+ * or running, recording the new tick's id so the next call sees it as alive. Idempotent —
99
+ * overlapping runs can't spawn duplicate chains.
100
+ */
101
+ export declare const ensureRefreshLoop: import("convex/server").RegisteredMutation<"internal", {}, Promise<void>>;
82
102
  /**
83
103
  * Fetches flag definitions from PostHog's local-evaluation endpoint and stores them in the
84
- * `flagDefinitions` table. Called automatically by the cron registered in `crons.ts` when
85
- * `POSTHOG_PERSONAL_API_KEY` is set, and also exposed publicly so the client's
86
- * `reloadFeatureFlags(ctx)` method (parity with `posthog-node`) can trigger an on-demand refresh.
104
+ * `flagDefinitions` table. Called automatically by the refresh loop (see above) when local
105
+ * evaluation is enabled, and also exposed publicly so the client's `reloadFeatureFlags(ctx)`
106
+ * method (parity with `posthog-node`) can trigger an on-demand refresh.
87
107
  */
88
108
  export declare const refreshFlagDefinitions: import("convex/server").RegisteredAction<"public", {}, Promise<{
89
109
  status: "skipped";
@@ -1 +1 @@
1
- {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"AAgFA,eAAO,MAAM,OAAO;;;;;;;;;iBA0BlB,CAAA;AAEF,eAAO,MAAM,QAAQ;;;;iBA+BnB,CAAA;AAEF,eAAO,MAAM,aAAa;;;;;;iBAoBxB,CAAA;AAEF,eAAO,MAAM,KAAK;;;;iBAgBhB,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;iBAiB3B,CAAA;AAmCF,eAAO,MAAM,YAAY;;;;;;;;4DAevB,CAAA;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;+CAa9B,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;GAiB3B,CAAA;AAYF,eAAO,MAAM,kBAAkB;;;;;;;;;;GAU7B,CAAA;AAOF,eAAO,MAAM,mBAAmB;;;iBAW9B,CAAA;AAEF,eAAO,MAAM,eAAe,sFAM1B,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4JjC,CAAA"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"AAgFA,eAAO,MAAM,OAAO;;;;;;;;;iBA0BlB,CAAA;AAEF,eAAO,MAAM,QAAQ;;;;iBA+BnB,CAAA;AAEF,eAAO,MAAM,aAAa;;;;;;iBAoBxB,CAAA;AAEF,eAAO,MAAM,KAAK;;;;iBAgBhB,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;iBAiB3B,CAAA;AAmCF,eAAO,MAAM,YAAY;;;;;;;;4DAevB,CAAA;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;+CAa9B,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;GAiB3B,CAAA;AAYF,eAAO,MAAM,kBAAkB;;;;;;;;;;GAU7B,CAAA;AAOF,eAAO,MAAM,mBAAmB;;;iBAW9B,CAAA;AAEF,eAAO,MAAM,eAAe,sFAM1B,CAAA;AAOF,eAAO,MAAM,wBAAwB,KAAK,CAAA;AAE1C,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAG9D;AAUD,wBAAgB,0BAA0B,IAAI,MAAM,CAYnD;AAaD;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,2EAQtB,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,2EAc5B,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4JjC,CAAA"}
@@ -310,11 +310,92 @@ export const _getCurrentEtag = internalQuery({
310
310
  return row?.etag;
311
311
  },
312
312
  });
313
+ // --- Local-evaluation refresh loop ---
314
+ //
315
+ // A self-rescheduling chain rather than a fixed-interval cron, so the runtime-only
316
+ // `POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS` governs the cadence (see `crons.ts` for why a cron can't).
317
+ export const DEFAULT_INTERVAL_SECONDS = 60;
318
+ export function envFlagIsTrue(raw) {
319
+ const value = (raw ?? '').trim().toLowerCase();
320
+ return value === '1' || value === 'true' || value === 'yes' || value === 'on';
321
+ }
322
+ function localEvaluationEnabled() {
323
+ const personalApiKey = (env.POSTHOG_PERSONAL_API_KEY ?? '').trim();
324
+ if (!personalApiKey)
325
+ return false;
326
+ return !envFlagIsTrue(env.POSTHOG_DISABLE_LOCAL_EVALUATION);
327
+ }
328
+ // Read at runtime, where the forwarded value is visible. String-typed on the wire, so an invalid
329
+ // value warns and falls back rather than failing. Exported for tests.
330
+ export function readPollingIntervalSeconds() {
331
+ const raw = (env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS ?? '').trim();
332
+ if (!raw)
333
+ return DEFAULT_INTERVAL_SECONDS;
334
+ const parsed = Number(raw);
335
+ if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {
336
+ console.warn(`[PostHog] POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS="${raw}" is not a positive integer; ` +
337
+ `falling back to ${DEFAULT_INTERVAL_SECONDS}s.`);
338
+ return DEFAULT_INTERVAL_SECONDS;
339
+ }
340
+ return parsed;
341
+ }
342
+ // Record the latest queued tick in the `refreshLoopState` singleton so `ensureRefreshLoop` can
343
+ // tell a live chain from a dead one before scheduling.
344
+ async function recordLoopJob(ctx, jobId) {
345
+ const existing = await ctx.db.query('refreshLoopState').first();
346
+ if (existing) {
347
+ await ctx.db.patch(existing._id, { loopJobId: jobId });
348
+ }
349
+ else {
350
+ await ctx.db.insert('refreshLoopState', { loopJobId: jobId });
351
+ }
352
+ }
353
+ /**
354
+ * One tick: kick off a refresh now, then queue the next tick at the configured interval. A mutation
355
+ * so the chain is durable — scheduled mutations run exactly-once with retries, and queuing the next
356
+ * tick commits atomically with this one, so the chain can't silently break. The fetch is a separate
357
+ * at-most-once action; if it fails, the next tick refetches.
358
+ *
359
+ * Never invoke directly (e.g. dashboard "Run function"): while local evaluation is enabled it queues
360
+ * a successor, so a manual call forks the chain into two loops that run forever and double the
361
+ * cadence — the supervisor can't detect the fork. Use `ensureRefreshLoop` to (re)start it.
362
+ */
363
+ export const refreshLoop = internalMutation({
364
+ args: {},
365
+ handler: async (ctx) => {
366
+ if (!localEvaluationEnabled())
367
+ return;
368
+ await ctx.scheduler.runAfter(0, api.lib.refreshFlagDefinitions, {});
369
+ const nextId = await ctx.scheduler.runAfter(readPollingIntervalSeconds() * 1000, internal.lib.refreshLoop, {});
370
+ await recordLoopJob(ctx, nextId);
371
+ },
372
+ });
373
+ /**
374
+ * Supervisor, called by the cron in `crons.ts`: starts the chain unless a tick is already pending
375
+ * or running, recording the new tick's id so the next call sees it as alive. Idempotent —
376
+ * overlapping runs can't spawn duplicate chains.
377
+ */
378
+ export const ensureRefreshLoop = internalMutation({
379
+ args: {},
380
+ handler: async (ctx) => {
381
+ if (!localEvaluationEnabled())
382
+ return;
383
+ const state = await ctx.db.query('refreshLoopState').first();
384
+ if (state) {
385
+ const job = await ctx.db.system.get(state.loopJobId);
386
+ if (job && (job.state.kind === 'pending' || job.state.kind === 'inProgress')) {
387
+ return;
388
+ }
389
+ }
390
+ const jobId = await ctx.scheduler.runAfter(0, internal.lib.refreshLoop, {});
391
+ await recordLoopJob(ctx, jobId);
392
+ },
393
+ });
313
394
  /**
314
395
  * Fetches flag definitions from PostHog's local-evaluation endpoint and stores them in the
315
- * `flagDefinitions` table. Called automatically by the cron registered in `crons.ts` when
316
- * `POSTHOG_PERSONAL_API_KEY` is set, and also exposed publicly so the client's
317
- * `reloadFeatureFlags(ctx)` method (parity with `posthog-node`) can trigger an on-demand refresh.
396
+ * `flagDefinitions` table. Called automatically by the refresh loop (see above) when local
397
+ * evaluation is enabled, and also exposed publicly so the client's `reloadFeatureFlags(ctx)`
398
+ * method (parity with `posthog-node`) can trigger an on-demand refresh.
318
399
  */
319
400
  export const refreshFlagDefinitions = action({
320
401
  args: {},
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,18 @@ declare const _default: import("convex/server").SchemaDefinition<{
15
15
  fetchedAt: import("convex/values").VFloat64<number, "required">;
16
16
  etag: import("convex/values").VString<string | undefined, "optional">;
17
17
  }, "required", "data" | "fetchedAt" | "etag">, {}, {}, {}>;
18
+ /**
19
+ * Singleton table tracking the self-rescheduling flag-refresh chain (see `lib.ts`).
20
+ *
21
+ * `loopJobId` is the `_scheduled_functions` id of the next pending `refreshLoop` tick. The
22
+ * supervisor cron reads it to decide whether the chain is still alive before starting a new
23
+ * one, so overlapping supervisor runs can't spawn duplicate chains.
24
+ */
25
+ refreshLoopState: import("convex/server").TableDefinition<import("convex/values").VObject<{
26
+ loopJobId: import("convex/values").GenericId<"_scheduled_functions">;
27
+ }, {
28
+ loopJobId: import("convex/values").VId<import("convex/values").GenericId<"_scheduled_functions">, "required">;
29
+ }, "required", "loopJobId">, {}, {}, {}>;
18
30
  }, true>;
19
31
  export default _default;
20
32
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";IAIE;;;;;;OAMG;;;;;;;;;;;AAPL,wBAaE"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";IAIE;;;;;;OAMG;;;;;;;;;;IAOH;;;;;;OAMG;;;;;;;AApBL,wBAwBE"}
@@ -13,5 +13,15 @@ export default defineSchema({
13
13
  fetchedAt: v.number(),
14
14
  etag: v.optional(v.string()),
15
15
  }),
16
+ /**
17
+ * Singleton table tracking the self-rescheduling flag-refresh chain (see `lib.ts`).
18
+ *
19
+ * `loopJobId` is the `_scheduled_functions` id of the next pending `refreshLoop` tick. The
20
+ * supervisor cron reads it to decide whether the chain is still alive before starting a new
21
+ * one, so overlapping supervisor runs can't spawn duplicate chains.
22
+ */
23
+ refreshLoopState: defineTable({
24
+ loopJobId: v.id('_scheduled_functions'),
25
+ }),
16
26
  });
17
27
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAA;AAEjC,eAAe,YAAY,CAAC;IAC1B;;;;;;OAMG;IACH,eAAe,EAAE,WAAW,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7B,CAAC;CACH,CAAC,CAAA"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAA;AAEjC,eAAe,YAAY,CAAC;IAC1B;;;;;;OAMG;IACH,eAAe,EAAE,WAAW,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7B,CAAC;IAEF;;;;;;OAMG;IACH,gBAAgB,EAAE,WAAW,CAAC;QAC5B,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC;KACxC,CAAC;CACH,CAAC,CAAA"}
@@ -1,2 +1,2 @@
1
- export declare const version = "2.0.30";
1
+ export declare const version = "2.0.32";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,2 +1,2 @@
1
- export const version = '2.0.30';
1
+ export const version = '2.0.32';
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "url": "https://github.com/PostHog/posthog-js/issues"
12
12
  },
13
13
  "author": "PostHog Inc.",
14
- "version": "2.0.30",
14
+ "version": "2.0.32",
15
15
  "license": "MIT",
16
16
  "keywords": [
17
17
  "convex",
@@ -48,8 +48,8 @@
48
48
  "types": "./dist/client/index.d.ts",
49
49
  "module": "./dist/client/index.js",
50
50
  "dependencies": {
51
- "@posthog/core": "^1.39.0",
52
- "posthog-node": "^5.39.0"
51
+ "@posthog/core": "^1.39.6",
52
+ "posthog-node": "^5.39.4"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@edge-runtime/vm": "^5.0.0",
@@ -34,6 +34,7 @@ import type { DataModel } from "./dataModel.js";
34
34
  * Typesafe environment variables declared in `convex.config.ts`.
35
35
  */
36
36
  type Env = {
37
+ readonly POSTHOG_DISABLE_LOCAL_EVALUATION: string | undefined;
37
38
  readonly POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS: string | undefined;
38
39
  readonly POSTHOG_HOST: string | undefined;
39
40
  readonly POSTHOG_PERSONAL_API_KEY: string | undefined;
@@ -4,7 +4,7 @@ import { v } from 'convex/values'
4
4
  /**
5
5
  * The component declares the env vars it needs so the installing app can wire them in
6
6
  * `convex/convex.config.ts` (typically via `app.env.*` so existing project-level env vars
7
- * pass straight through). All three are read via `process.env` inside the component's
7
+ * pass straight through). These are read via `process.env` inside the component's
8
8
  * actions and cron — `POSTHOG_PERSONAL_API_KEY`'s presence is also what gates the local
9
9
  * evaluation refresh cron.
10
10
  */
@@ -14,10 +14,18 @@ export default defineComponent('posthog', {
14
14
  POSTHOG_HOST: v.optional(v.string()),
15
15
  POSTHOG_PERSONAL_API_KEY: v.optional(v.string()),
16
16
  /**
17
- * Polling interval for the local-evaluation refresh cron, in whole seconds. Optional
18
- * (defaults to 60). Convex component env vars are string-typed on the wire, so this is
19
- * parsed at module load — invalid values log a warning and fall back to the default.
17
+ * Polling interval for the local-evaluation refresh, in whole seconds. Optional (defaults
18
+ * to 60). Convex component env vars are string-typed on the wire and only forwarded at
19
+ * runtime, so it's read by the self-rescheduling refresh loop in `lib.ts` rather than at
20
+ * cron-registration time — invalid values log a warning and fall back to the default.
20
21
  */
21
22
  POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS: v.optional(v.string()),
23
+ /**
24
+ * Off-switch for the background local-evaluation refresh loop. Optional; unset by default, so
25
+ * polling stays on whenever `POSTHOG_PERSONAL_API_KEY` is set. Set to `"true"` (or `1`/`yes`/`on`)
26
+ * to stop the poll even with a key configured — e.g. if you only evaluate flags via the remote
27
+ * `evaluateFlag*` actions.
28
+ */
29
+ POSTHOG_DISABLE_LOCAL_EVALUATION: v.optional(v.string()),
22
30
  },
23
31
  })
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, test, beforeEach, afterEach, jest } from '@jest/globals'
2
2
  import type { Crons } from 'convex/server'
3
- import { DEFAULT_INTERVAL_SECONDS, readPollingIntervalSeconds } from './crons.js'
3
+ import { DEFAULT_INTERVAL_SECONDS, envFlagIsTrue, readPollingIntervalSeconds } from './lib.js'
4
4
 
5
5
  describe('cron registration', () => {
6
6
  let originalPak: string | undefined
@@ -18,20 +18,21 @@ describe('cron registration', () => {
18
18
  }
19
19
  })
20
20
 
21
- // Convex forwards component env vars only at runtime, so deploy-time module analysis sees
22
- // `process.env.POSTHOG_PERSONAL_API_KEY` empty even when the installing app has set it.
23
- // A load-time gate would silently drop the cron — see #3683.
21
+ // The cron is only a supervisor for the self-rescheduling refresh loop — it registers
22
+ // unconditionally and reads no env vars at module load (which would be empty at deploy-time
23
+ // analysis anyway; see #3957). Parameterised over POSTHOG_PERSONAL_API_KEY to lock in that the
24
+ // cron registers regardless of env, so no future load-time gate silently drops it (see #3683).
24
25
  test.each<[string, string | undefined]>([
25
26
  ['unset', undefined],
26
27
  ['set', 'phx_test'],
27
- ])('registers the refresh cron when POSTHOG_PERSONAL_API_KEY is %s at module load', async (_label, pakValue) => {
28
- if (pakValue === undefined) {
28
+ ])('registers the refresh-loop supervisor cron when POSTHOG_PERSONAL_API_KEY is %s', async (_label, pak) => {
29
+ if (pak === undefined) {
29
30
  delete process.env.POSTHOG_PERSONAL_API_KEY
30
31
  } else {
31
- process.env.POSTHOG_PERSONAL_API_KEY = pakValue
32
+ process.env.POSTHOG_PERSONAL_API_KEY = pak
32
33
  }
33
34
  const mod = (await import('./crons.js')) as { default: Crons }
34
- expect(Object.keys(mod.default.crons)).toContain('Refresh PostHog feature flag definitions')
35
+ expect(Object.keys(mod.default.crons)).toContain('Ensure PostHog flag refresh loop is running')
35
36
  })
36
37
  })
37
38
 
@@ -94,3 +95,13 @@ describe('readPollingIntervalSeconds', () => {
94
95
  expect(warnSpy).toHaveBeenCalled()
95
96
  })
96
97
  })
98
+
99
+ describe('envFlagIsTrue', () => {
100
+ test.each(['1', 'true', 'TRUE', 'yes', 'on', ' On '])('treats %j as true', (raw) => {
101
+ expect(envFlagIsTrue(raw)).toBe(true)
102
+ })
103
+
104
+ test.each([undefined, '', ' ', 'false', '0', 'off', 'no', 'disabled', '2'])('treats %j as false', (raw) => {
105
+ expect(envFlagIsTrue(raw)).toBe(false)
106
+ })
107
+ })
@@ -1,36 +1,15 @@
1
1
  import { cronJobs } from 'convex/server'
2
- import { api } from './_generated/api.js'
3
- import { env } from './_generated/server.js'
2
+ import { internal } from './_generated/api.js'
4
3
 
5
4
  const crons = cronJobs()
6
5
 
7
- // Override via `POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS`.
8
- export const DEFAULT_INTERVAL_SECONDS = 60
9
-
10
- // Convex component env vars are string-typed. Invalid values warn and fall back rather than
11
- // failing the deploy. Exported for unit testing.
12
- export function readPollingIntervalSeconds(): number {
13
- const raw = (env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS ?? '').trim()
14
- if (!raw) return DEFAULT_INTERVAL_SECONDS
15
- const parsed = Number(raw)
16
- if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {
17
- console.warn(
18
- `[PostHog] POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS="${raw}" is not a positive integer; ` +
19
- `falling back to ${DEFAULT_INTERVAL_SECONDS}s.`
20
- )
21
- return DEFAULT_INTERVAL_SECONDS
22
- }
23
- return parsed
24
- }
25
-
26
- // Registered unconditionally — Convex forwards component env vars only at runtime, so a
27
- // load-time gate on `POSTHOG_PERSONAL_API_KEY` sees an empty value at deploy-time module
28
- // analysis and silently drops the cron. The handler in `lib.ts` gates at runtime instead.
29
- crons.interval(
30
- 'Refresh PostHog feature flag definitions',
31
- { seconds: readPollingIntervalSeconds() },
32
- api.lib.refreshFlagDefinitions,
33
- {}
34
- )
6
+ // A cron's interval is fixed at registration, but Convex forwards component env vars only at
7
+ // runtime, so `POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS` is empty when crons are analysed (#3957;
8
+ // #3683 hit the same wall with the `POSTHOG_PERSONAL_API_KEY` gate). So the refresh runs as a
9
+ // self-rescheduling chain (`lib.ts:refreshLoop`) that reads the interval at runtime; this cron only
10
+ // supervises — `ensureRefreshLoop` (re)starts the chain to bootstrap a deploy and self-heal a stop.
11
+ // Its 5-minute cadence is a fixed floor (it can't read the runtime interval either), traded against
12
+ // bootstrap/heal latency; at very long intervals the supervisor itself dominates the cost.
13
+ crons.interval('Ensure PostHog flag refresh loop is running', { minutes: 5 }, internal.lib.ensureRefreshLoop, {})
35
14
 
36
15
  export default crons
@@ -1,7 +1,7 @@
1
1
  import { PostHog as PostHogEdge } from 'posthog-node/edge'
2
- import { action, env, internalMutation, internalQuery, query } from './_generated/server.js'
2
+ import { action, env, internalMutation, internalQuery, query, type MutationCtx } from './_generated/server.js'
3
3
  import { api, internal } from './_generated/api.js'
4
- import { v } from 'convex/values'
4
+ import { v, type GenericId } from 'convex/values'
5
5
  import { version } from './version.js'
6
6
 
7
7
  /**
@@ -330,11 +330,97 @@ export const _getCurrentEtag = internalQuery({
330
330
  },
331
331
  })
332
332
 
333
+ // --- Local-evaluation refresh loop ---
334
+ //
335
+ // A self-rescheduling chain rather than a fixed-interval cron, so the runtime-only
336
+ // `POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS` governs the cadence (see `crons.ts` for why a cron can't).
337
+
338
+ export const DEFAULT_INTERVAL_SECONDS = 60
339
+
340
+ export function envFlagIsTrue(raw: string | undefined): boolean {
341
+ const value = (raw ?? '').trim().toLowerCase()
342
+ return value === '1' || value === 'true' || value === 'yes' || value === 'on'
343
+ }
344
+
345
+ function localEvaluationEnabled(): boolean {
346
+ const personalApiKey = (env.POSTHOG_PERSONAL_API_KEY ?? '').trim()
347
+ if (!personalApiKey) return false
348
+ return !envFlagIsTrue(env.POSTHOG_DISABLE_LOCAL_EVALUATION)
349
+ }
350
+
351
+ // Read at runtime, where the forwarded value is visible. String-typed on the wire, so an invalid
352
+ // value warns and falls back rather than failing. Exported for tests.
353
+ export function readPollingIntervalSeconds(): number {
354
+ const raw = (env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS ?? '').trim()
355
+ if (!raw) return DEFAULT_INTERVAL_SECONDS
356
+ const parsed = Number(raw)
357
+ if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {
358
+ console.warn(
359
+ `[PostHog] POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS="${raw}" is not a positive integer; ` +
360
+ `falling back to ${DEFAULT_INTERVAL_SECONDS}s.`
361
+ )
362
+ return DEFAULT_INTERVAL_SECONDS
363
+ }
364
+ return parsed
365
+ }
366
+
367
+ // Record the latest queued tick in the `refreshLoopState` singleton so `ensureRefreshLoop` can
368
+ // tell a live chain from a dead one before scheduling.
369
+ async function recordLoopJob(ctx: MutationCtx, jobId: GenericId<'_scheduled_functions'>): Promise<void> {
370
+ const existing = await ctx.db.query('refreshLoopState').first()
371
+ if (existing) {
372
+ await ctx.db.patch(existing._id, { loopJobId: jobId })
373
+ } else {
374
+ await ctx.db.insert('refreshLoopState', { loopJobId: jobId })
375
+ }
376
+ }
377
+
378
+ /**
379
+ * One tick: kick off a refresh now, then queue the next tick at the configured interval. A mutation
380
+ * so the chain is durable — scheduled mutations run exactly-once with retries, and queuing the next
381
+ * tick commits atomically with this one, so the chain can't silently break. The fetch is a separate
382
+ * at-most-once action; if it fails, the next tick refetches.
383
+ *
384
+ * Never invoke directly (e.g. dashboard "Run function"): while local evaluation is enabled it queues
385
+ * a successor, so a manual call forks the chain into two loops that run forever and double the
386
+ * cadence — the supervisor can't detect the fork. Use `ensureRefreshLoop` to (re)start it.
387
+ */
388
+ export const refreshLoop = internalMutation({
389
+ args: {},
390
+ handler: async (ctx) => {
391
+ if (!localEvaluationEnabled()) return
392
+ await ctx.scheduler.runAfter(0, api.lib.refreshFlagDefinitions, {})
393
+ const nextId = await ctx.scheduler.runAfter(readPollingIntervalSeconds() * 1000, internal.lib.refreshLoop, {})
394
+ await recordLoopJob(ctx, nextId)
395
+ },
396
+ })
397
+
398
+ /**
399
+ * Supervisor, called by the cron in `crons.ts`: starts the chain unless a tick is already pending
400
+ * or running, recording the new tick's id so the next call sees it as alive. Idempotent —
401
+ * overlapping runs can't spawn duplicate chains.
402
+ */
403
+ export const ensureRefreshLoop = internalMutation({
404
+ args: {},
405
+ handler: async (ctx) => {
406
+ if (!localEvaluationEnabled()) return
407
+ const state = await ctx.db.query('refreshLoopState').first()
408
+ if (state) {
409
+ const job = await ctx.db.system.get(state.loopJobId)
410
+ if (job && (job.state.kind === 'pending' || job.state.kind === 'inProgress')) {
411
+ return
412
+ }
413
+ }
414
+ const jobId = await ctx.scheduler.runAfter(0, internal.lib.refreshLoop, {})
415
+ await recordLoopJob(ctx, jobId)
416
+ },
417
+ })
418
+
333
419
  /**
334
420
  * Fetches flag definitions from PostHog's local-evaluation endpoint and stores them in the
335
- * `flagDefinitions` table. Called automatically by the cron registered in `crons.ts` when
336
- * `POSTHOG_PERSONAL_API_KEY` is set, and also exposed publicly so the client's
337
- * `reloadFeatureFlags(ctx)` method (parity with `posthog-node`) can trigger an on-demand refresh.
421
+ * `flagDefinitions` table. Called automatically by the refresh loop (see above) when local
422
+ * evaluation is enabled, and also exposed publicly so the client's `reloadFeatureFlags(ctx)`
423
+ * method (parity with `posthog-node`) can trigger an on-demand refresh.
338
424
  */
339
425
  export const refreshFlagDefinitions = action({
340
426
  args: {},
@@ -0,0 +1,205 @@
1
+ /// <reference types="vite/client" />
2
+ import { describe, test, expect, beforeEach, afterEach, jest } from '@jest/globals'
3
+ import { convexTest } from 'convex-test'
4
+ import schema from './schema.js'
5
+ import { api, internal } from './_generated/api.js'
6
+
7
+ const modules = import.meta.glob('./**/*.ts')
8
+
9
+ type ScheduledJob = {
10
+ _id: string
11
+ name: string
12
+ scheduledTime: number
13
+ state: { kind: 'pending' | 'inProgress' | 'success' | 'failed' | 'canceled' }
14
+ }
15
+
16
+ const originalFetch = global.fetch
17
+ let flagsFetches = 0
18
+
19
+ function mockFetch() {
20
+ flagsFetches = 0
21
+ return jest.fn(async (url: string | URL) => {
22
+ if (url.toString().includes('/flags/definitions')) flagsFetches++
23
+ return new Response(JSON.stringify({ flags: [], group_type_mapping: {}, cohorts: {} }), {
24
+ status: 200,
25
+ headers: { 'Content-Type': 'application/json' },
26
+ })
27
+ }) as unknown as typeof fetch
28
+ }
29
+
30
+ function scheduledJobs(t: ReturnType<typeof convexTest>): Promise<ScheduledJob[]> {
31
+ return t.run(async (ctx) => (await ctx.db.system.query('_scheduled_functions').collect()) as ScheduledJob[])
32
+ }
33
+
34
+ const byName = (jobs: ScheduledJob[], needle: string) => jobs.filter((j) => j.name.includes(needle))
35
+ const pending = (jobs: ScheduledJob[]) => jobs.filter((j) => j.state.kind === 'pending')
36
+
37
+ // The chain self-reschedules forever, so `finishAllScheduledFunctions` never terminates and hand-
38
+ // stepping fake timers trips convex-test's transaction tracking. Instead we invoke one tick and
39
+ // inspect what it queued — `runAfter` records the job synchronously, so the cadence is observable
40
+ // without firing a timer.
41
+
42
+ describe('self-rescheduling flag refresh loop', () => {
43
+ beforeEach(() => {
44
+ process.env.POSTHOG_PROJECT_TOKEN = 'phc_test'
45
+ process.env.POSTHOG_HOST = 'https://test.posthog.com'
46
+ process.env.POSTHOG_PERSONAL_API_KEY = 'phx_test'
47
+ global.fetch = mockFetch()
48
+ })
49
+
50
+ afterEach(() => {
51
+ global.fetch = originalFetch
52
+ delete process.env.POSTHOG_PROJECT_TOKEN
53
+ delete process.env.POSTHOG_HOST
54
+ delete process.env.POSTHOG_PERSONAL_API_KEY
55
+ delete process.env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS
56
+ delete process.env.POSTHOG_DISABLE_LOCAL_EVALUATION
57
+ })
58
+
59
+ test('queues the next tick at the configured interval, not the 60s default', async () => {
60
+ process.env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS = '3600'
61
+ const t = convexTest(schema, modules)
62
+
63
+ await t.mutation(internal.lib.refreshLoop, {})
64
+
65
+ const jobs = await scheduledJobs(t)
66
+ // The tick kicks a refresh now…
67
+ expect(byName(jobs, 'refreshFlagDefinitions')).toHaveLength(1)
68
+ // …and queues exactly one successor at the runtime interval. This guards the architecture: a
69
+ // reverted fixed `crons.interval` would queue no successor here at all. (The harness reads the
70
+ // env var live, so it can't reproduce the deploy-time invisibility that was the root of #3957.)
71
+ const next = byName(jobs, 'refreshLoop')
72
+ expect(next).toHaveLength(1)
73
+ const delayMs = next[0].scheduledTime - Date.now()
74
+ expect(delayMs).toBeGreaterThan(3600 * 1000 - 1000)
75
+ expect(delayMs).toBeLessThanOrEqual(3600 * 1000)
76
+ })
77
+
78
+ test('queues the next tick at the 60s default when the interval is unset', async () => {
79
+ const t = convexTest(schema, modules)
80
+
81
+ await t.mutation(internal.lib.refreshLoop, {})
82
+
83
+ const next = byName(await scheduledJobs(t), 'refreshLoop')
84
+ expect(next).toHaveLength(1)
85
+ const delayMs = next[0].scheduledTime - Date.now()
86
+ expect(delayMs).toBeGreaterThan(60 * 1000 - 1000)
87
+ expect(delayMs).toBeLessThanOrEqual(60 * 1000)
88
+ })
89
+
90
+ test('records the queued tick id so the supervisor can detect a live chain', async () => {
91
+ process.env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS = '3600'
92
+ const t = convexTest(schema, modules)
93
+
94
+ await t.mutation(internal.lib.refreshLoop, {})
95
+
96
+ const next = byName(await scheduledJobs(t), 'refreshLoop')
97
+ const state = await t.run(async (ctx) => ctx.db.query('refreshLoopState').first())
98
+ expect(state?.loopJobId).toBe(next[0]._id)
99
+ })
100
+
101
+ test('supervisor starts the chain when none is running', async () => {
102
+ const t = convexTest(schema, modules)
103
+
104
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
105
+
106
+ expect(pending(byName(await scheduledJobs(t), 'refreshLoop'))).toHaveLength(1)
107
+ })
108
+
109
+ test('supervisor is idempotent: a second run does not spawn a rival chain', async () => {
110
+ const t = convexTest(schema, modules)
111
+
112
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
113
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
114
+
115
+ expect(pending(byName(await scheduledJobs(t), 'refreshLoop'))).toHaveLength(1)
116
+ })
117
+
118
+ test('supervisor restarts a dead chain (self-heal)', async () => {
119
+ const t = convexTest(schema, modules)
120
+
121
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
122
+ const tracked = pending(byName(await scheduledJobs(t), 'refreshLoop'))
123
+ expect(tracked).toHaveLength(1)
124
+ const deadId = tracked[0]._id
125
+
126
+ // Drive the tracked tick to a terminal state, simulating a chain that stopped.
127
+ await t.run(async (ctx) => {
128
+ await ctx.scheduler.cancel(deadId as Parameters<typeof ctx.scheduler.cancel>[0])
129
+ })
130
+
131
+ // The supervisor must notice the recorded job is no longer live and queue a fresh tick —
132
+ // a regression that treated any recorded job as alive would leave the chain dead forever.
133
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
134
+
135
+ const revived = pending(byName(await scheduledJobs(t), 'refreshLoop'))
136
+ expect(revived).toHaveLength(1)
137
+ expect(revived[0]._id).not.toBe(deadId)
138
+ const state = await t.run(async (ctx) => ctx.db.query('refreshLoopState').first())
139
+ expect(state?.loopJobId).toBe(revived[0]._id)
140
+ })
141
+
142
+ test('the refresh the loop kicks actually fetches definitions and caches them', async () => {
143
+ const t = convexTest(schema, modules)
144
+
145
+ // refreshLoop schedules this action; running it directly proves the kicked work fetches.
146
+ await t.action(api.lib.refreshFlagDefinitions, {})
147
+
148
+ expect(flagsFetches).toBe(1)
149
+ const row = await t.run(async (ctx) => ctx.db.query('flagDefinitions').first())
150
+ expect(row).not.toBeNull()
151
+ })
152
+
153
+ describe('gated when local evaluation is not enabled (issue #4046)', () => {
154
+ const disabledCases: [string, () => void][] = [
155
+ ['no personal API key', () => delete process.env.POSTHOG_PERSONAL_API_KEY],
156
+ [
157
+ 'key set but POSTHOG_DISABLE_LOCAL_EVALUATION=true',
158
+ () => (process.env.POSTHOG_DISABLE_LOCAL_EVALUATION = 'true'),
159
+ ],
160
+ ]
161
+
162
+ test.each(disabledCases)('supervisor schedules nothing (%s)', async (_label, disable) => {
163
+ disable()
164
+ const t = convexTest(schema, modules)
165
+
166
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
167
+
168
+ expect(byName(await scheduledJobs(t), 'refreshLoop')).toHaveLength(0)
169
+ })
170
+
171
+ test.each(disabledCases)(
172
+ 'a tick queues no successor and no fetch, so a live chain stops (%s)',
173
+ async (_label, disable) => {
174
+ disable()
175
+ const t = convexTest(schema, modules)
176
+
177
+ await t.mutation(internal.lib.refreshLoop, {})
178
+
179
+ const jobs = await scheduledJobs(t)
180
+ expect(byName(jobs, 'refreshLoop')).toHaveLength(0)
181
+ expect(byName(jobs, 'refreshFlagDefinitions')).toHaveLength(0)
182
+ }
183
+ )
184
+
185
+ test('key set with POSTHOG_DISABLE_LOCAL_EVALUATION=false: supervisor still schedules', async () => {
186
+ process.env.POSTHOG_DISABLE_LOCAL_EVALUATION = 'false'
187
+ const t = convexTest(schema, modules)
188
+
189
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
190
+
191
+ expect(pending(byName(await scheduledJobs(t), 'refreshLoop'))).toHaveLength(1)
192
+ })
193
+
194
+ // Disabling the poll must NOT flip localEvalConfigured to false — otherwise the client throws
195
+ // a misleading "set your API key" error at users who only turned off the background refresh.
196
+ test('key set with POSTHOG_DISABLE_LOCAL_EVALUATION=true keeps localEvalConfigured true', async () => {
197
+ process.env.POSTHOG_DISABLE_LOCAL_EVALUATION = 'true'
198
+ const t = convexTest(schema, modules)
199
+
200
+ const result = await t.query(api.lib.getFlagDefinitions, {})
201
+
202
+ expect(result.localEvalConfigured).toBe(true)
203
+ })
204
+ })
205
+ })
@@ -14,4 +14,15 @@ export default defineSchema({
14
14
  fetchedAt: v.number(),
15
15
  etag: v.optional(v.string()),
16
16
  }),
17
+
18
+ /**
19
+ * Singleton table tracking the self-rescheduling flag-refresh chain (see `lib.ts`).
20
+ *
21
+ * `loopJobId` is the `_scheduled_functions` id of the next pending `refreshLoop` tick. The
22
+ * supervisor cron reads it to decide whether the chain is still alive before starting a new
23
+ * one, so overlapping supervisor runs can't spawn duplicate chains.
24
+ */
25
+ refreshLoopState: defineTable({
26
+ loopJobId: v.id('_scheduled_functions'),
27
+ }),
17
28
  })
@@ -1 +1 @@
1
- export const version = '2.0.30'
1
+ export const version = '2.0.32'