@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.
- package/dist/component/convex.config.d.ts +4 -3
- package/dist/component/convex.config.d.ts.map +1 -1
- package/dist/component/convex.config.js +4 -3
- package/dist/component/convex.config.js.map +1 -1
- package/dist/component/crons.d.ts +0 -2
- package/dist/component/crons.d.ts.map +1 -1
- package/dist/component/crons.js +9 -22
- package/dist/component/crons.js.map +1 -1
- package/dist/component/lib.d.ts +20 -1
- package/dist/component/lib.d.ts.map +1 -1
- package/dist/component/lib.js +68 -1
- package/dist/component/lib.js.map +1 -1
- package/dist/component/schema.d.ts +12 -0
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +10 -0
- package/dist/component/schema.js.map +1 -1
- package/dist/component/version.d.ts +1 -1
- package/dist/component/version.js +1 -1
- package/package.json +3 -3
- package/src/component/convex.config.ts +4 -3
- package/src/component/crons.test.ts +9 -8
- package/src/component/crons.ts +9 -30
- package/src/component/lib.ts +76 -3
- package/src/component/refresh-loop.test.ts +151 -0
- package/src/component/schema.ts +11 -0
- package/src/component/version.ts +1 -1
|
@@ -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
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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
|
|
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
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crons.d.ts","sourceRoot":"","sources":["../../src/component/crons.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/component/crons.js
CHANGED
|
@@ -1,26 +1,13 @@
|
|
|
1
1
|
import { cronJobs } from 'convex/server';
|
|
2
|
-
import {
|
|
3
|
-
import { env } from './_generated/server.js';
|
|
2
|
+
import { internal } from './_generated/api.js';
|
|
4
3
|
const crons = cronJobs();
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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,
|
|
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"}
|
package/dist/component/lib.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/component/lib.js
CHANGED
|
@@ -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
|
|
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":"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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
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";IAIE;;;;;;OAMG;;;;;;;;;;IAOH;;;;;;OAMG;;;;;;;AApBL,wBAwBE"}
|
package/dist/component/schema.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
52
|
-
"posthog-node": "^5.39.
|
|
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
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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 './
|
|
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
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
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
|
|
28
|
-
if (
|
|
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 =
|
|
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('
|
|
35
|
+
expect(Object.keys(mod.default.crons)).toContain('Ensure PostHog flag refresh loop is running')
|
|
35
36
|
})
|
|
36
37
|
})
|
|
37
38
|
|
package/src/component/crons.ts
CHANGED
|
@@ -1,36 +1,15 @@
|
|
|
1
1
|
import { cronJobs } from 'convex/server'
|
|
2
|
-
import {
|
|
3
|
-
import { env } from './_generated/server.js'
|
|
2
|
+
import { internal } from './_generated/api.js'
|
|
4
3
|
|
|
5
4
|
const crons = cronJobs()
|
|
6
5
|
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
package/src/component/lib.ts
CHANGED
|
@@ -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
|
|
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
|
+
})
|
package/src/component/schema.ts
CHANGED
|
@@ -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
|
})
|
package/src/component/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '2.0.
|
|
1
|
+
export const version = '2.0.31'
|