@posthog/convex 2.0.30 → 2.0.31

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.
@@ -10,9 +10,10 @@ 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">;
18
19
  }>;
@@ -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;;;AAVP,wBAaE"}
@@ -13,9 +13,10 @@ 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()),
21
22
  },
@@ -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;KAC/D;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,9 +79,28 @@ 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 readPollingIntervalSeconds(): number;
84
+ /**
85
+ * One tick: kick off a refresh now, then queue the next tick at the configured interval. A mutation
86
+ * so the chain is durable — scheduled mutations run exactly-once with retries, and queuing the next
87
+ * tick commits atomically with this one, so the chain can't silently break. The fetch is a separate
88
+ * at-most-once action; if it fails, the next tick refetches.
89
+ *
90
+ * Never invoke directly (e.g. dashboard "Run function"): it unconditionally queues a successor, so a
91
+ * manual call forks the chain into two loops that run forever and double the cadence — the
92
+ * supervisor can't detect the fork. Use `ensureRefreshLoop` to (re)start it.
93
+ */
94
+ export declare const refreshLoop: import("convex/server").RegisteredMutation<"internal", {}, Promise<void>>;
95
+ /**
96
+ * Supervisor, called by the cron in `crons.ts`: starts the chain unless a tick is already pending
97
+ * or running, recording the new tick's id so the next call sees it as alive. Idempotent —
98
+ * overlapping runs can't spawn duplicate chains.
99
+ */
100
+ export declare const ensureRefreshLoop: import("convex/server").RegisteredMutation<"internal", {}, Promise<void>>;
82
101
  /**
83
102
  * 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
103
+ * `flagDefinitions` table. Called automatically by the refresh loop (see above) when
85
104
  * `POSTHOG_PERSONAL_API_KEY` is set, and also exposed publicly so the client's
86
105
  * `reloadFeatureFlags(ctx)` method (parity with `posthog-node`) can trigger an on-demand refresh.
87
106
  */
@@ -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;AAI1C,wBAAgB,0BAA0B,IAAI,MAAM,CAYnD;AAaD;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,2EAOtB,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,2EAa5B,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4JjC,CAAA"}
@@ -310,9 +310,76 @@ 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
+ // Read at runtime, where the forwarded value is visible. String-typed on the wire, so an invalid
319
+ // value warns and falls back rather than failing. Exported for tests.
320
+ export function readPollingIntervalSeconds() {
321
+ const raw = (env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS ?? '').trim();
322
+ if (!raw)
323
+ return DEFAULT_INTERVAL_SECONDS;
324
+ const parsed = Number(raw);
325
+ if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {
326
+ console.warn(`[PostHog] POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS="${raw}" is not a positive integer; ` +
327
+ `falling back to ${DEFAULT_INTERVAL_SECONDS}s.`);
328
+ return DEFAULT_INTERVAL_SECONDS;
329
+ }
330
+ return parsed;
331
+ }
332
+ // Record the latest queued tick in the `refreshLoopState` singleton so `ensureRefreshLoop` can
333
+ // tell a live chain from a dead one before scheduling.
334
+ async function recordLoopJob(ctx, jobId) {
335
+ const existing = await ctx.db.query('refreshLoopState').first();
336
+ if (existing) {
337
+ await ctx.db.patch(existing._id, { loopJobId: jobId });
338
+ }
339
+ else {
340
+ await ctx.db.insert('refreshLoopState', { loopJobId: jobId });
341
+ }
342
+ }
343
+ /**
344
+ * One tick: kick off a refresh now, then queue the next tick at the configured interval. A mutation
345
+ * so the chain is durable — scheduled mutations run exactly-once with retries, and queuing the next
346
+ * tick commits atomically with this one, so the chain can't silently break. The fetch is a separate
347
+ * at-most-once action; if it fails, the next tick refetches.
348
+ *
349
+ * Never invoke directly (e.g. dashboard "Run function"): it unconditionally queues a successor, so a
350
+ * manual call forks the chain into two loops that run forever and double the cadence — the
351
+ * supervisor can't detect the fork. Use `ensureRefreshLoop` to (re)start it.
352
+ */
353
+ export const refreshLoop = internalMutation({
354
+ args: {},
355
+ handler: async (ctx) => {
356
+ await ctx.scheduler.runAfter(0, api.lib.refreshFlagDefinitions, {});
357
+ const nextId = await ctx.scheduler.runAfter(readPollingIntervalSeconds() * 1000, internal.lib.refreshLoop, {});
358
+ await recordLoopJob(ctx, nextId);
359
+ },
360
+ });
361
+ /**
362
+ * Supervisor, called by the cron in `crons.ts`: starts the chain unless a tick is already pending
363
+ * or running, recording the new tick's id so the next call sees it as alive. Idempotent —
364
+ * overlapping runs can't spawn duplicate chains.
365
+ */
366
+ export const ensureRefreshLoop = internalMutation({
367
+ args: {},
368
+ handler: async (ctx) => {
369
+ const state = await ctx.db.query('refreshLoopState').first();
370
+ if (state) {
371
+ const job = await ctx.db.system.get(state.loopJobId);
372
+ if (job && (job.state.kind === 'pending' || job.state.kind === 'inProgress')) {
373
+ return;
374
+ }
375
+ }
376
+ const jobId = await ctx.scheduler.runAfter(0, internal.lib.refreshLoop, {});
377
+ await recordLoopJob(ctx, jobId);
378
+ },
379
+ });
313
380
  /**
314
381
  * 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
382
+ * `flagDefinitions` table. Called automatically by the refresh loop (see above) when
316
383
  * `POSTHOG_PERSONAL_API_KEY` is set, and also exposed publicly so the client's
317
384
  * `reloadFeatureFlags(ctx)` method (parity with `posthog-node`) can trigger an on-demand refresh.
318
385
  */
@@ -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":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,aAAa,EAAE,KAAK,EAAoB,MAAM,wBAAwB,CAAA;AAC9G,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,CAAC,EAAkB,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC;;;;GAIG;AACH,MAAM,OAAQ,SAAQ,WAAW;IAC/B,YAAY;QACV,OAAO,gBAAgB,CAAA;IACzB,CAAC;IACD,iBAAiB;QACf,OAAO,OAAO,CAAA;IAChB,CAAC;CACF;AAED,MAAM,YAAY,GAAG,0BAA0B,CAAA;AAE/C;;;;;;;GAOG;AACH,SAAS,UAAU;IACjB,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC7D,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,YAAY,CAAA;IAC5D,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAClE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,oGAAoG;QACpG,8FAA8F;QAC9F,oGAAoG;QACpG,iDAAiD;QACjD,OAAO,CAAC,IAAI,CACV,iFAAiF;YAC/E,4EAA4E,CAC/E,CAAA;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,CAAA;AAC/C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmB,CAAA;AAE9C,SAAS,SAAS,CAAC,YAAoB,EAAE,IAAY;IACnD,MAAM,GAAG,GAAG,GAAG,YAAY,IAAI,IAAI,EAAE,CAAA;IACrC,IAAI,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1E,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAC9B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,iGAAiG;AACjG,SAAS,eAAe,CAAC,IAAwB;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAA;IAC3B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,iEAAiE,EAAE,CAAC,CAAC,CAAA;QAClF,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC;IAC5B,IAAI,EAAE;QACJ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACzC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KACtC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,YAAY;YAAE,OAAM;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC5C,MAAM,MAAM,CAAC,gBAAgB,CAAC;YAC5B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;YAC5C,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAgD;YACnF,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;YAChE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC;IAC7B,IAAI,EAAE;QACJ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KACtC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,YAAY;YAAE,OAAM;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC5C,2FAA2F;QAC3F,4FAA4F;QAC5F,iGAAiG;QACjG,0EAA0E;QAC1E,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;QACzD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,IAAI,EAAE,GAAG,UAI7B,CAAA;QAC3B,MAAM,MAAM,CAAC,gBAAgB,CAAC;YAC5B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE,WAAW;YAClB,UAAU,EAAE;gBACV,IAAI,EAAE,IAAI,IAAI,IAAI;gBAClB,SAAS,EAAE,SAAS,IAAI,EAAE;gBAC1B,iBAAiB;aAClB;YACD,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;IAClC,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KACtC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,YAAY;YAAE,OAAM;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC5C,MAAM,MAAM,CAAC,sBAAsB,CAAC;YAClC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YAClD,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC;IAC1B,IAAI,EAAE;QACJ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KACtC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,YAAY;YAAE,OAAM;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC5C,MAAM,MAAM,CAAC,cAAc,CAAC;YAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;IACrC,IAAI,EAAE;QACJ,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,oBAAoB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7C;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,YAAY;YAAE,OAAM;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC5C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC1C,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAA;QAC/C,IAAI,IAAI,CAAC,UAAU;YAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAA;QAClD,MAAM,MAAM,CAAC,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAA;IAC5G,CAAC;CACF,CAAC,CAAA;AAEF,yCAAyC;AACzC,EAAE;AACF,2FAA2F;AAC3F,8FAA8F;AAC9F,4FAA4F;AAC5F,gGAAgG;AAEhG,MAAM,eAAe,GAAG;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC3B,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACrC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACpC,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;CAC1C,CAAA;AAED,SAAS,kBAAkB,CAAC,IAM3B;IACC,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAA4C;QACzD,gBAAgB,EAAE,IAAI,CAAC,gBAAmD;QAC1E,eAAe,EAAE,IAAI,CAAC,eAAkE;QACxF,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,mBAAmB,EAAE,KAAK;KAC3B,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;IACjC,IAAI,EAAE,EAAE,GAAG,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;IAC7C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAA;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC5C,0FAA0F;QAC1F,8FAA8F;QAC9F,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE;YAC3D,GAAG,kBAAkB,CAAC,IAAI,CAAC;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACtC,CAAC,CAAA;QACF,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACxC,OAAO,KAAK,IAAI,IAAI,CAAA;IACtB,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;IACxC,IAAI,EAAE,EAAE,GAAG,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;IAC7C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAA;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC5C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE;YAC3D,GAAG,kBAAkB,CAAC,IAAI,CAAC;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACtC,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjD,OAAO,OAAO,IAAI,IAAI,CAAA;IACxB,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;IACrC,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAA;QACvE,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC5C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAA;QACtF,MAAM,YAAY,GAA4B,EAAE,CAAA;QAChD,MAAM,mBAAmB,GAA4B,EAAE,CAAA;QACvD,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACnC,IAAI,KAAK,KAAK,SAAS;gBAAE,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;YAC5C,IAAI,OAAO,KAAK,SAAS;gBAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA;QAC/D,CAAC;QACD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAA;IAC9C,CAAC;CACF,CAAC,CAAA;AAEF,wCAAwC;AACxC,EAAE;AACF,0FAA0F;AAC1F,sFAAsF;AACtF,uCAAuC;AAEvC,uFAAuF;AACvF,oFAAoF;AACpF,oEAAoE;AACpE,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;IACtC,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,mBAAmB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACzE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;QACvE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QAC9E,CAAC;QACD,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1F,CAAC;CACF,CAAC,CAAA;AAEF,+FAA+F;AAC/F,2FAA2F;AAC3F,4FAA4F;AAC5F,oEAAoE;AAEpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;IAClD,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;IACxD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;QAC5E,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAA;QACxE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;IAC3C,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;QACvE,OAAO,GAAG,EAAE,IAAI,CAAA;IAClB,CAAC;CACF,CAAC,CAAA;AAEF,wCAAwC;AACxC,EAAE;AACF,mFAAmF;AACnF,sGAAsG;AAEtG,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAA;AAE1C,iGAAiG;AACjG,sEAAsE;AACtE,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,+FAA+F;AAC/F,uDAAuD;AACvD,KAAK,UAAU,aAAa,CAAC,GAAgB,EAAE,KAAwC;IACrF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAA;IAC/D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;IAC1C,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAA;QACnE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QAC9G,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAClC,CAAC;CACF,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;IAChD,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAA;QAC5D,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACpD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;gBAC7E,OAAM;YACR,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QAC3E,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACjC,CAAC;CACF,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;IAC3C,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,UAAU,EAAE,CAAA;QAE3D,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc,EAAE,CAAC;YACrC,iFAAiF;YACjF,OAAO,EAAE,MAAM,EAAE,SAAkB,EAAE,MAAM,EAAE,cAAuB,EAAE,CAAA;QACxE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;QAEjE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,4BAA4B,YAAY,eAAe,CAAA;QAC7F,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,cAAc,EAAE;SAC1C,CAAA;QACD,IAAI,IAAI;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAA;QAEzC,wFAAwF;QACxF,yFAAyF;QACzF,yFAAyF;QACzF,sFAAsF;QACtF,0FAA0F;QAC1F,qFAAqF;QACrF,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;QAC9E,MAAM,eAAe,GACnB,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC;YAChD,CAAC,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC;YAC5C,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QACxB,IAAI,QAAkB,CAAA;QACtB,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;YACzD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAA;gBAChE,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,MAAM,EAAE,cAAuB,EAAE,CAAA;YACtE,CAAC;YACD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAA;YAC9F,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,eAAe,CAAC,MAAM;gBAAE,MAAK;YAC1D,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;YACrC,OAAO,EAAE,CAAA;YACT,kDAAkD;YAClD,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,OAAO,CAAC,IAAI,CACV,6CAA6C,QAAQ,CAAC,MAAM,iBAAiB,IAAI,eAAe,OAAO,IAAI,eAAe,CAAC,MAAM,IAAI,CACtI,CAAA;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,WAAoB,EAAE,CAAA;QACzC,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvD,OAAO,CAAC,IAAI,CACV,gDAAgD,QAAQ,CAAC,MAAM,IAAI;gBACjE,wFAAwF,CAC3F,CAAA;YACD,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,MAAM,EAAE,MAAe,EAAE,CAAA;QAC9D,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAA;YAC1F,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE;gBACtD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;gBACtE,IAAI,EAAE,SAAS;aAChB,CAAC,CAAA;YACF,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,MAAM,EAAE,OAAgB,EAAE,CAAA;QAC/D,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;YACvF,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,MAAM,EAAE,cAAuB,EAAE,CAAA;QACtE,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAI,QAAQ,GAAG,WAAW,CAAA;YAC1B,IAAI,CAAC;gBACH,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;YACD,wFAAwF;YACxF,0FAA0F;YAC1F,2FAA2F;YAC3F,yFAAyF;YACzF,qFAAqF;YACrF,4EAA4E;YAC5E,MAAM,cAAc,GAClB,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAA;YAChG,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;gBACnE,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;gBACpC,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;oBAChC,qFAAqF;oBACrF,gDAAgD;oBAChD,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE;wBACtD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;wBACtE,IAAI,EAAE,SAAS;qBAChB,CAAC,CAAA;oBACF,OAAO,CAAC,IAAI,CACV,kIAAkI,CACnI,CAAA;oBACD,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,CAAA;gBACrC,CAAC;gBACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,GAAG,cAAc,EAAE,CAAC;oBACrD,wFAAwF;oBACxF,0FAA0F;oBAC1F,8EAA8E;oBAC9E,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE;wBACtD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;wBACtE,IAAI,EAAE,SAAS;qBAChB,CAAC,CAAA;oBACF,OAAO,CAAC,IAAI,CACV,6HAA6H,CAC9H,CAAA;oBACD,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,CAAA;gBACrC,CAAC;gBACD,kFAAkF;gBAClF,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,CAAA;YACrC,CAAC;YAED,OAAO,CAAC,IAAI,CACV,+BAA+B,QAAQ,CAAC,MAAM,mCAAmC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI;gBACvH,kBAAkB,QAAQ,EAAE,CAC/B,CAAA;YACD,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,MAAM,EAAE,mBAA4B,EAAE,CAAA;QAC3E,CAAC;QAED,IAAI,IAA0E,CAAA;QAC9E,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAA;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,GAAG,CAAC,CAAA;YACzE,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,MAAM,EAAE,cAAuB,EAAE,CAAA;QACtE,CAAC;QACD,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;YAC1E,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,MAAM,EAAE,eAAwB,EAAE,CAAA;QACvE,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;YACvB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,IAAI,EAAE;YAC/C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;SAC5B,CAAC,CAAA;QAEF,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE;YACtD,IAAI;YACJ,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;SAChD,CAAC,CAAA;QAEF,OAAO,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAA;IACvC,CAAC;CACF,CAAC,CAAA"}
@@ -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.31";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,2 +1,2 @@
1
- export const version = '2.0.30';
1
+ export const version = '2.0.31';
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.31",
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.2",
52
+ "posthog-node": "^5.39.1"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@edge-runtime/vm": "^5.0.0",
@@ -14,9 +14,10 @@ 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()),
22
23
  },
@@ -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, 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
 
@@ -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,9 +330,82 @@ 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
+ // Read at runtime, where the forwarded value is visible. String-typed on the wire, so an invalid
341
+ // value warns and falls back rather than failing. Exported for tests.
342
+ export function readPollingIntervalSeconds(): number {
343
+ const raw = (env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS ?? '').trim()
344
+ if (!raw) return DEFAULT_INTERVAL_SECONDS
345
+ const parsed = Number(raw)
346
+ if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {
347
+ console.warn(
348
+ `[PostHog] POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS="${raw}" is not a positive integer; ` +
349
+ `falling back to ${DEFAULT_INTERVAL_SECONDS}s.`
350
+ )
351
+ return DEFAULT_INTERVAL_SECONDS
352
+ }
353
+ return parsed
354
+ }
355
+
356
+ // Record the latest queued tick in the `refreshLoopState` singleton so `ensureRefreshLoop` can
357
+ // tell a live chain from a dead one before scheduling.
358
+ async function recordLoopJob(ctx: MutationCtx, jobId: GenericId<'_scheduled_functions'>): Promise<void> {
359
+ const existing = await ctx.db.query('refreshLoopState').first()
360
+ if (existing) {
361
+ await ctx.db.patch(existing._id, { loopJobId: jobId })
362
+ } else {
363
+ await ctx.db.insert('refreshLoopState', { loopJobId: jobId })
364
+ }
365
+ }
366
+
367
+ /**
368
+ * One tick: kick off a refresh now, then queue the next tick at the configured interval. A mutation
369
+ * so the chain is durable — scheduled mutations run exactly-once with retries, and queuing the next
370
+ * tick commits atomically with this one, so the chain can't silently break. The fetch is a separate
371
+ * at-most-once action; if it fails, the next tick refetches.
372
+ *
373
+ * Never invoke directly (e.g. dashboard "Run function"): it unconditionally queues a successor, so a
374
+ * manual call forks the chain into two loops that run forever and double the cadence — the
375
+ * supervisor can't detect the fork. Use `ensureRefreshLoop` to (re)start it.
376
+ */
377
+ export const refreshLoop = internalMutation({
378
+ args: {},
379
+ handler: async (ctx) => {
380
+ await ctx.scheduler.runAfter(0, api.lib.refreshFlagDefinitions, {})
381
+ const nextId = await ctx.scheduler.runAfter(readPollingIntervalSeconds() * 1000, internal.lib.refreshLoop, {})
382
+ await recordLoopJob(ctx, nextId)
383
+ },
384
+ })
385
+
386
+ /**
387
+ * Supervisor, called by the cron in `crons.ts`: starts the chain unless a tick is already pending
388
+ * or running, recording the new tick's id so the next call sees it as alive. Idempotent —
389
+ * overlapping runs can't spawn duplicate chains.
390
+ */
391
+ export const ensureRefreshLoop = internalMutation({
392
+ args: {},
393
+ handler: async (ctx) => {
394
+ const state = await ctx.db.query('refreshLoopState').first()
395
+ if (state) {
396
+ const job = await ctx.db.system.get(state.loopJobId)
397
+ if (job && (job.state.kind === 'pending' || job.state.kind === 'inProgress')) {
398
+ return
399
+ }
400
+ }
401
+ const jobId = await ctx.scheduler.runAfter(0, internal.lib.refreshLoop, {})
402
+ await recordLoopJob(ctx, jobId)
403
+ },
404
+ })
405
+
333
406
  /**
334
407
  * 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
408
+ * `flagDefinitions` table. Called automatically by the refresh loop (see above) when
336
409
  * `POSTHOG_PERSONAL_API_KEY` is set, and also exposed publicly so the client's
337
410
  * `reloadFeatureFlags(ctx)` method (parity with `posthog-node`) can trigger an on-demand refresh.
338
411
  */
@@ -0,0 +1,151 @@
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
+ })
57
+
58
+ test('queues the next tick at the configured interval, not the 60s default', async () => {
59
+ process.env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS = '3600'
60
+ const t = convexTest(schema, modules)
61
+
62
+ await t.mutation(internal.lib.refreshLoop, {})
63
+
64
+ const jobs = await scheduledJobs(t)
65
+ // The tick kicks a refresh now…
66
+ expect(byName(jobs, 'refreshFlagDefinitions')).toHaveLength(1)
67
+ // …and queues exactly one successor at the runtime interval. This guards the architecture: a
68
+ // reverted fixed `crons.interval` would queue no successor here at all. (The harness reads the
69
+ // env var live, so it can't reproduce the deploy-time invisibility that was the root of #3957.)
70
+ const next = byName(jobs, 'refreshLoop')
71
+ expect(next).toHaveLength(1)
72
+ const delayMs = next[0].scheduledTime - Date.now()
73
+ expect(delayMs).toBeGreaterThan(3600 * 1000 - 1000)
74
+ expect(delayMs).toBeLessThanOrEqual(3600 * 1000)
75
+ })
76
+
77
+ test('queues the next tick at the 60s default when the interval is unset', async () => {
78
+ const t = convexTest(schema, modules)
79
+
80
+ await t.mutation(internal.lib.refreshLoop, {})
81
+
82
+ const next = byName(await scheduledJobs(t), 'refreshLoop')
83
+ expect(next).toHaveLength(1)
84
+ const delayMs = next[0].scheduledTime - Date.now()
85
+ expect(delayMs).toBeGreaterThan(60 * 1000 - 1000)
86
+ expect(delayMs).toBeLessThanOrEqual(60 * 1000)
87
+ })
88
+
89
+ test('records the queued tick id so the supervisor can detect a live chain', async () => {
90
+ process.env.POSTHOG_FLAGS_POLLING_INTERVAL_SECONDS = '3600'
91
+ const t = convexTest(schema, modules)
92
+
93
+ await t.mutation(internal.lib.refreshLoop, {})
94
+
95
+ const next = byName(await scheduledJobs(t), 'refreshLoop')
96
+ const state = await t.run(async (ctx) => ctx.db.query('refreshLoopState').first())
97
+ expect(state?.loopJobId).toBe(next[0]._id)
98
+ })
99
+
100
+ test('supervisor starts the chain when none is running', async () => {
101
+ const t = convexTest(schema, modules)
102
+
103
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
104
+
105
+ expect(pending(byName(await scheduledJobs(t), 'refreshLoop'))).toHaveLength(1)
106
+ })
107
+
108
+ test('supervisor is idempotent: a second run does not spawn a rival chain', async () => {
109
+ const t = convexTest(schema, modules)
110
+
111
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
112
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
113
+
114
+ expect(pending(byName(await scheduledJobs(t), 'refreshLoop'))).toHaveLength(1)
115
+ })
116
+
117
+ test('supervisor restarts a dead chain (self-heal)', async () => {
118
+ const t = convexTest(schema, modules)
119
+
120
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
121
+ const tracked = pending(byName(await scheduledJobs(t), 'refreshLoop'))
122
+ expect(tracked).toHaveLength(1)
123
+ const deadId = tracked[0]._id
124
+
125
+ // Drive the tracked tick to a terminal state, simulating a chain that stopped.
126
+ await t.run(async (ctx) => {
127
+ await ctx.scheduler.cancel(deadId as Parameters<typeof ctx.scheduler.cancel>[0])
128
+ })
129
+
130
+ // The supervisor must notice the recorded job is no longer live and queue a fresh tick —
131
+ // a regression that treated any recorded job as alive would leave the chain dead forever.
132
+ await t.mutation(internal.lib.ensureRefreshLoop, {})
133
+
134
+ const revived = pending(byName(await scheduledJobs(t), 'refreshLoop'))
135
+ expect(revived).toHaveLength(1)
136
+ expect(revived[0]._id).not.toBe(deadId)
137
+ const state = await t.run(async (ctx) => ctx.db.query('refreshLoopState').first())
138
+ expect(state?.loopJobId).toBe(revived[0]._id)
139
+ })
140
+
141
+ test('the refresh the loop kicks actually fetches definitions and caches them', async () => {
142
+ const t = convexTest(schema, modules)
143
+
144
+ // refreshLoop schedules this action; running it directly proves the kicked work fetches.
145
+ await t.action(api.lib.refreshFlagDefinitions, {})
146
+
147
+ expect(flagsFetches).toBe(1)
148
+ const row = await t.run(async (ctx) => ctx.db.query('flagDefinitions').first())
149
+ expect(row).not.toBeNull()
150
+ })
151
+ })
@@ -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.31'