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