@rocicorp/zero 1.10.0-head-23da5f1c-20260822 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/shared/src/promise-race.d.ts +14 -0
- package/out/shared/src/promise-race.d.ts.map +1 -1
- package/out/shared/src/promise-race.js +32 -1
- package/out/shared/src/promise-race.js.map +1 -1
- package/out/zero/package.js +1 -1
- package/out/zero/package.js.map +1 -1
- package/out/zero-cache/src/config/normalize.d.ts +5 -0
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js +10 -2
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +3 -1
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +10 -12
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +5 -3
- package/out/zero-cache/src/db/migration-lite.js.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.d.ts +0 -13
- package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.js +34 -70
- package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +1 -1
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/main.d.ts.map +1 -1
- package/out/zero-cache/src/server/main.js +4 -4
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/server/replicator.js +2 -2
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
- package/out/zero-cache/src/services/analyze.js +1 -0
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts +12 -2
- package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js +14 -3
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.js +10 -41
- package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +3 -2
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +41 -15
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +23 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +25 -16
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js +4 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +16 -9
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.js +12 -3
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js +11 -5
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +40 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +179 -51
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +8 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js +10 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +8 -4
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +2 -5
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.js +1 -6
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.js +2 -2
- package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
- package/out/zero-cache/src/types/pg.d.ts +15 -2
- package/out/zero-cache/src/types/pg.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg.js +7 -4
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/types/streams.d.ts +4 -9
- package/out/zero-cache/src/types/streams.d.ts.map +1 -1
- package/out/zero-cache/src/types/streams.js.map +1 -1
- package/out/zero-cache/src/types/subscription.d.ts +2 -11
- package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
- package/out/zero-cache/src/types/subscription.js +4 -25
- package/out/zero-cache/src/types/subscription.js.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.js +17 -10
- package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.js +1 -1
- package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-protocol/src/custom-queries.d.ts +1 -1
- package/out/zero-protocol/src/error.d.ts +4 -4
- package/out/zero-protocol/src/inspect-down.js +1 -1
- package/out/zero-protocol/src/mutate-server.d.ts +2 -2
- package/out/zero-protocol/src/push.d.ts +1 -1
- package/out/zero-protocol/src/query-server.d.ts +2 -2
- package/package.json +1 -1
|
@@ -13,5 +13,19 @@ type PromiseRaceResult<T extends Record<string, PromiseLike<unknown>>> = {
|
|
|
13
13
|
* @throws An error if the record is empty or if a promise is rejected.
|
|
14
14
|
*/
|
|
15
15
|
export declare function promiseRace<T extends Record<string, PromiseLike<unknown>>>(promises: T): Promise<PromiseRaceResult<T> & {}>;
|
|
16
|
+
/**
|
|
17
|
+
* A memory-safe way to race a short-lived `Promise` with one or more
|
|
18
|
+
* long-leved `AbortSignal`s. This works around the unsafe practice
|
|
19
|
+
* of racing a short-lived promise (e.g. in a loop) with a long-lived one,
|
|
20
|
+
* which results in accumulating memory via `then` callbacks on the latter:
|
|
21
|
+
*
|
|
22
|
+
* https://github.com/nodejs/node/issues/17469
|
|
23
|
+
*
|
|
24
|
+
* The safe way to race a short-lived, expected-to-complete Promise against a
|
|
25
|
+
* long-lived termination signal is to control the latter via an
|
|
26
|
+
* {@link AbortController} and race the former against the signal of the
|
|
27
|
+
* latter.
|
|
28
|
+
*/
|
|
29
|
+
export declare function promiseOrAbort<T>(shortLived: Promise<T>, ...longLived: AbortSignal[]): Promise<T>;
|
|
16
30
|
export {};
|
|
17
31
|
//# sourceMappingURL=promise-race.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise-race.d.ts","sourceRoot":"","sources":["../../../../shared/src/promise-race.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"promise-race.d.ts","sourceRoot":"","sources":["../../../../shared/src/promise-race.ts"],"names":[],"mappings":"AAEA,KAAK,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI;KACtE,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG;QAC/B,GAAG,EAAE,CAAC,CAAC;QACP,MAAM,EAAE,WAAW,CAAC;QACpB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACvB;CACF,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAc5B;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,EAC9C,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAYjD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,EACtB,GAAG,SAAS,EAAE,WAAW,EAAE,GAC1B,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolver } from "@rocicorp/resolver";
|
|
1
2
|
//#region ../shared/src/promise-race.ts
|
|
2
3
|
var NO_PROMISES_MESSAGE = "No promises to race";
|
|
3
4
|
var wrapPromise = (key, promise) => Promise.resolve(promise).then((result) => ({
|
|
@@ -18,7 +19,37 @@ async function promiseRace(promises) {
|
|
|
18
19
|
const wrapped = keys.map((key) => wrapPromise(key, promises[key]));
|
|
19
20
|
return await Promise.race(wrapped);
|
|
20
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* A memory-safe way to race a short-lived `Promise` with one or more
|
|
24
|
+
* long-leved `AbortSignal`s. This works around the unsafe practice
|
|
25
|
+
* of racing a short-lived promise (e.g. in a loop) with a long-lived one,
|
|
26
|
+
* which results in accumulating memory via `then` callbacks on the latter:
|
|
27
|
+
*
|
|
28
|
+
* https://github.com/nodejs/node/issues/17469
|
|
29
|
+
*
|
|
30
|
+
* The safe way to race a short-lived, expected-to-complete Promise against a
|
|
31
|
+
* long-lived termination signal is to control the latter via an
|
|
32
|
+
* {@link AbortController} and race the former against the signal of the
|
|
33
|
+
* latter.
|
|
34
|
+
*/
|
|
35
|
+
async function promiseOrAbort(shortLived, ...longLived) {
|
|
36
|
+
const promises = [];
|
|
37
|
+
const cleanup = [];
|
|
38
|
+
for (const signal of longLived) if (signal.aborted) promises.push(Promise.reject(signal.reason));
|
|
39
|
+
else {
|
|
40
|
+
const { promise, reject } = resolver();
|
|
41
|
+
const handler = () => reject(signal.reason);
|
|
42
|
+
signal.addEventListener("abort", handler);
|
|
43
|
+
cleanup.push(() => signal.removeEventListener("abort", handler));
|
|
44
|
+
promises.push(promise);
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
return await Promise.race([shortLived, ...promises]);
|
|
48
|
+
} finally {
|
|
49
|
+
cleanup.forEach((fn) => fn());
|
|
50
|
+
}
|
|
51
|
+
}
|
|
21
52
|
//#endregion
|
|
22
|
-
export { promiseRace };
|
|
53
|
+
export { promiseOrAbort, promiseRace };
|
|
23
54
|
|
|
24
55
|
//# sourceMappingURL=promise-race.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise-race.js","names":[],"sources":["../../../../shared/src/promise-race.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"promise-race.js","names":[],"sources":["../../../../shared/src/promise-race.ts"],"sourcesContent":["import {resolver} from '@rocicorp/resolver';\n\ntype PromiseRaceResult<T extends Record<string, PromiseLike<unknown>>> = {\n [K in Extract<keyof T, string>]: {\n key: K;\n status: 'fulfilled';\n result: Awaited<T[K]>;\n };\n}[Extract<keyof T, string>];\n\nconst NO_PROMISES_MESSAGE = 'No promises to race';\n\nconst wrapPromise = <K extends string, V>(\n key: K,\n promise: PromiseLike<V>,\n): Promise<{key: K; status: 'fulfilled'; result: V}> =>\n Promise.resolve(promise).then(result => ({\n key,\n status: 'fulfilled' as const,\n result,\n }));\n\n/**\n * Race a record of promises and resolve with the first resolved entry.\n *\n * @param promises Record of promises to race.\n * @returns Promise resolving to a discriminated union of key/result pairs.\n * @throws An error if the record is empty or if a promise is rejected.\n */\nexport async function promiseRace<\n T extends Record<string, PromiseLike<unknown>>,\n>(promises: T): Promise<PromiseRaceResult<T> & {}> {\n const keys = Object.keys(promises) as Array<Extract<keyof T, string>>;\n\n if (keys.length === 0) {\n throw new Error(NO_PROMISES_MESSAGE);\n }\n\n const wrapped = keys.map(key =>\n wrapPromise(key, promises[key] as PromiseLike<Awaited<T[typeof key]>>),\n );\n\n return await Promise.race(wrapped);\n}\n\n/**\n * A memory-safe way to race a short-lived `Promise` with one or more\n * long-leved `AbortSignal`s. This works around the unsafe practice\n * of racing a short-lived promise (e.g. in a loop) with a long-lived one,\n * which results in accumulating memory via `then` callbacks on the latter:\n *\n * https://github.com/nodejs/node/issues/17469\n *\n * The safe way to race a short-lived, expected-to-complete Promise against a\n * long-lived termination signal is to control the latter via an\n * {@link AbortController} and race the former against the signal of the\n * latter.\n */\nexport async function promiseOrAbort<T>(\n shortLived: Promise<T>,\n ...longLived: AbortSignal[]\n): Promise<T> {\n const promises: Promise<T>[] = [];\n const cleanup: (() => void)[] = [];\n for (const signal of longLived) {\n if (signal.aborted) {\n promises.push(Promise.reject(signal.reason));\n } else {\n const {promise, reject} = resolver<T>();\n const handler = () => reject(signal.reason);\n signal.addEventListener('abort', handler);\n cleanup.push(() => signal.removeEventListener('abort', handler));\n promises.push(promise);\n }\n }\n\n try {\n return await Promise.race([shortLived, ...promises]);\n } finally {\n cleanup.forEach(fn => fn());\n }\n}\n"],"mappings":";;AAUA,IAAM,sBAAsB;AAE5B,IAAM,eACJ,KACA,YAEA,QAAQ,QAAQ,OAAO,EAAE,MAAK,YAAW;CACvC;CACA,QAAQ;CACR;AACF,EAAE;;;;;;;;AASJ,eAAsB,YAEpB,UAAiD;CACjD,MAAM,OAAO,OAAO,KAAK,QAAQ;CAEjC,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,mBAAmB;CAGrC,MAAM,UAAU,KAAK,KAAI,QACvB,YAAY,KAAK,SAAS,IAA2C,CACvE;CAEA,OAAO,MAAM,QAAQ,KAAK,OAAO;AACnC;;;;;;;;;;;;;;AAeA,eAAsB,eACpB,YACA,GAAG,WACS;CACZ,MAAM,WAAyB,CAAC;CAChC,MAAM,UAA0B,CAAC;CACjC,KAAK,MAAM,UAAU,WACnB,IAAI,OAAO,SACT,SAAS,KAAK,QAAQ,OAAO,OAAO,MAAM,CAAC;MACtC;EACL,MAAM,EAAC,SAAS,WAAU,SAAY;EACtC,MAAM,gBAAgB,OAAO,OAAO,MAAM;EAC1C,OAAO,iBAAiB,SAAS,OAAO;EACxC,QAAQ,WAAW,OAAO,oBAAoB,SAAS,OAAO,CAAC;EAC/D,SAAS,KAAK,OAAO;CACvB;CAGF,IAAI;EACF,OAAO,MAAM,QAAQ,KAAK,CAAC,YAAY,GAAG,QAAQ,CAAC;CACrD,UAAU;EACR,QAAQ,SAAQ,OAAM,GAAG,CAAC;CAC5B;AACF"}
|
package/out/zero/package.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var package_default = {
|
|
2
2
|
name: "@rocicorp/zero",
|
|
3
|
-
version: "1.10.0
|
|
3
|
+
version: "1.10.0",
|
|
4
4
|
description: "Zero is a web framework for serverless web development.",
|
|
5
5
|
homepage: "https://zero.rocicorp.dev",
|
|
6
6
|
bugs: { "url": "https://bugs.rocicorp.dev" },
|
package/out/zero/package.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","names":[],"sources":["../../package.json"],"sourcesContent":["{\n \"name\": \"@rocicorp/zero\",\n \"version\": \"1.10.0
|
|
1
|
+
{"version":3,"file":"package.js","names":[],"sources":["../../package.json"],"sourcesContent":["{\n \"name\": \"@rocicorp/zero\",\n \"version\": \"1.10.0\",\n \"description\": \"Zero is a web framework for serverless web development.\",\n \"homepage\": \"https://zero.rocicorp.dev\",\n \"bugs\": {\n \"url\": \"https://bugs.rocicorp.dev\"\n },\n \"license\": \"Apache-2.0\",\n \"author\": \"Rocicorp, Inc.\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/rocicorp/mono.git\",\n \"directory\": \"packages/zero\"\n },\n \"bin\": {\n \"analyze-query\": \"./out/zero/src/analyze-query.js\",\n \"ast-to-zql\": \"./out/zero/src/ast-to-zql.js\",\n \"transform-query\": \"./out/zero/src/transform-query.js\",\n \"zero-build-schema\": \"./out/zero/src/build-schema.js\",\n \"zero-cache\": \"./out/zero/src/cli.js\",\n \"zero-cache-dev\": \"./out/zero/src/zero-cache-dev.js\",\n \"zero-deploy-permissions\": \"./out/zero/src/deploy-permissions.js\",\n \"zero-out\": \"./out/zero/src/zero-out.js\"\n },\n \"files\": [\n \"out\",\n \"!*.tsbuildinfo\"\n ],\n \"type\": \"module\",\n \"main\": \"out/zero/src/zero.js\",\n \"module\": \"out/zero/src/zero.js\",\n \"types\": \"out/zero/src/zero.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./out/zero/src/zero.d.ts\",\n \"default\": \"./out/zero/src/zero.js\"\n },\n \"./analyze\": {\n \"types\": \"./out/zero/src/analyze.d.ts\",\n \"default\": \"./out/zero/src/analyze.js\"\n },\n \"./bindings\": {\n \"types\": \"./out/zero/src/bindings.d.ts\",\n \"default\": \"./out/zero/src/bindings.js\"\n },\n \"./change-protocol/v0\": {\n \"types\": \"./out/zero/src/change-protocol/v0.d.ts\",\n \"default\": \"./out/zero/src/change-protocol/v0.js\"\n },\n \"./expo-sqlite\": {\n \"types\": \"./out/zero/src/expo-sqlite.d.ts\",\n \"default\": \"./out/zero/src/expo-sqlite.js\"\n },\n \"./op-sqlite\": {\n \"types\": \"./out/zero/src/op-sqlite.d.ts\",\n \"default\": \"./out/zero/src/op-sqlite.js\"\n },\n \"./pg\": {\n \"types\": \"./out/zero/src/pg.d.ts\",\n \"default\": \"./out/zero/src/pg.js\"\n },\n \"./react\": {\n \"types\": \"./out/zero/src/react.d.ts\",\n \"default\": \"./out/zero/src/react.js\"\n },\n \"./react-native\": {\n \"types\": \"./out/zero/src/react-native.d.ts\",\n \"default\": \"./out/zero/src/react-native.js\"\n },\n \"./server\": {\n \"types\": \"./out/zero/src/server.d.ts\",\n \"default\": \"./out/zero/src/server.js\"\n },\n \"./server/adapters/drizzle\": {\n \"types\": \"./out/zero/src/adapters/drizzle.d.ts\",\n \"default\": \"./out/zero/src/adapters/drizzle.js\"\n },\n \"./server/adapters/kysely\": {\n \"types\": \"./out/zero/src/adapters/kysely.d.ts\",\n \"default\": \"./out/zero/src/adapters/kysely.js\"\n },\n \"./server/adapters/prisma\": {\n \"types\": \"./out/zero/src/adapters/prisma.d.ts\",\n \"default\": \"./out/zero/src/adapters/prisma.js\"\n },\n \"./server/adapters/pg\": {\n \"types\": \"./out/zero/src/adapters/pg.d.ts\",\n \"default\": \"./out/zero/src/adapters/pg.js\"\n },\n \"./server/adapters/postgresjs\": {\n \"types\": \"./out/zero/src/adapters/postgresjs.d.ts\",\n \"default\": \"./out/zero/src/adapters/postgresjs.js\"\n },\n \"./solid\": {\n \"types\": \"./out/zero/src/solid.d.ts\",\n \"default\": \"./out/zero/src/solid.js\"\n },\n \"./sqlite\": {\n \"types\": \"./out/zero/src/sqlite.d.ts\",\n \"default\": \"./out/zero/src/sqlite.js\"\n },\n \"./zqlite\": {\n \"types\": \"./out/zero/src/zqlite.d.ts\",\n \"default\": \"./out/zero/src/zqlite.js\"\n }\n },\n \"scripts\": {\n \"build\": \"node --experimental-strip-types --no-warnings tool/build.ts\",\n \"build:watch\": \"node --experimental-strip-types --no-warnings tool/build.ts --watch\",\n \"check-types\": \"tsc -p tsconfig.client.json && tsc -p tsconfig.server.json\",\n \"check-types:client:watch\": \"tsc -p tsconfig.client.json --watch\",\n \"check-types:server:watch\": \"tsc -p tsconfig.server.json --watch\",\n \"format\": \"oxfmt .\",\n \"check-format\": \"oxfmt --check .\",\n \"lint\": \"oxlint --quiet --config ../../oxlint.config.ts src/\",\n \"docs\": \"node --experimental-strip-types --no-warnings tool/generate-docs.ts\",\n \"docs:server\": \"node --watch --experimental-strip-types --no-warnings tool/generate-docs.ts --server\",\n \"fmt\": \"oxfmt .\",\n \"check-fmt\": \"oxfmt --check .\"\n },\n \"dependencies\": {\n \"@badrap/valita\": \"0.3.11\",\n \"@databases/escape-identifier\": \"^1.0.3\",\n \"@databases/sql\": \"^3.3.0\",\n \"@dotenvx/dotenvx\": \"^1.39.0\",\n \"@drdgvhbh/postgres-error-codes\": \"^0.0.6\",\n \"@fastify/cors\": \"^10.0.0\",\n \"@fastify/websocket\": \"^11.0.0\",\n \"@google-cloud/precise-date\": \"^4.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.218.0\",\n \"@opentelemetry/auto-instrumentations-node\": \"^0.76.0\",\n \"@opentelemetry/exporter-metrics-otlp-http\": \"^0.218.0\",\n \"@opentelemetry/resources\": \"^2.7.1\",\n \"@opentelemetry/sdk-metrics\": \"^2.7.1\",\n \"@opentelemetry/sdk-node\": \"^0.218.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.7.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.41.1\",\n \"@postgresql-typed/oids\": \"^0.2.0\",\n \"@rocicorp/lock\": \"^1.0.4\",\n \"@rocicorp/logger\": \"^6.1.0\",\n \"@rocicorp/resolver\": \"^1.0.2\",\n \"@rocicorp/zero-sqlite3\": \"^1.1.4\",\n \"@standard-schema/spec\": \"^1.0.0\",\n \"@types/basic-auth\": \"^1.1.8\",\n \"@types/ws\": \"^8.5.12\",\n \"basic-auth\": \"^2.0.1\",\n \"chalk-template\": \"^1.1.0\",\n \"chokidar\": \"^4.0.1\",\n \"cloudevents\": \"^10.0.0\",\n \"command-line-args\": \"^6.0.1\",\n \"command-line-usage\": \"^7.0.3\",\n \"compare-utf8\": \"^0.2.0\",\n \"defu\": \"^6.1.4\",\n \"eventemitter3\": \"^5.0.1\",\n \"fastify\": \"^5.0.0\",\n \"is-in-subnet\": \"^4.0.1\",\n \"jose\": \"^5.9.3\",\n \"js-xxhash\": \"^4.0.0\",\n \"json-custom-numbers\": \"^3.1.1\",\n \"kasi\": \"^1.1.0\",\n \"nanoid\": \"^5.1.2\",\n \"oxfmt\": \"^0.45.0\",\n \"parse-prometheus-text-format\": \"^1.1.1\",\n \"pg-format\": \"npm:pg-format-fix@^1.0.5\",\n \"postgres\": \"3.4.7\",\n \"semver\": \"^7.5.4\",\n \"url-pattern\": \"^1.0.3\",\n \"urlpattern-polyfill\": \"^10.1.0\",\n \"ws\": \"^8.18.1\"\n },\n \"devDependencies\": {\n \"@op-engineering/op-sqlite\": \">=15\",\n \"@vitest/runner\": \"^4.1.6\",\n \"analyze-query\": \"workspace:*\",\n \"ast-to-zql\": \"workspace:*\",\n \"expo-sqlite\": \">=15\",\n \"oxc-parser\": \"^0.129.0\",\n \"replicache\": \"workspace:*\",\n \"shared\": \"workspace:*\",\n \"syncpack\": \"^14.3.0\",\n \"typedoc\": \"^0.28.17\",\n \"typedoc-plugin-markdown\": \"^4.10.0\",\n \"typescript\": \"~6.0.2\",\n \"vite\": \"^8.0.13\",\n \"vitest\": \"^4.1.6\",\n \"zero-cache\": \"workspace:*\",\n \"zero-client\": \"workspace:*\",\n \"zero-pg\": \"workspace:*\",\n \"zero-react\": \"workspace:*\",\n \"zero-server\": \"workspace:*\",\n \"zero-solid\": \"workspace:*\",\n \"zqlite\": \"workspace:*\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"packageManager\": \"pnpm@11.11.0\"\n}\n"],"mappings":""}
|
|
@@ -20,6 +20,11 @@ export type NormalizedZeroConfig = ZeroConfig & {
|
|
|
20
20
|
};
|
|
21
21
|
export type LitestreamConfig = NormalizedZeroConfig['litestream'];
|
|
22
22
|
export declare function isDevelopmentMode(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether this process tree runs the change-streamer, as opposed to connecting
|
|
25
|
+
* to one that another task runs.
|
|
26
|
+
*/
|
|
27
|
+
export declare function runsChangeStreamer(config: ZeroConfig): boolean;
|
|
23
28
|
export declare function assertNormalized(config: ZeroConfig): asserts config is NormalizedZeroConfig;
|
|
24
29
|
/**
|
|
25
30
|
* Normalizes the parsed `config` by setting defaults from the environment
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/config/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,qEAAqE;AACrE,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;AAElE,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AASD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,MAAM,IAAI,oBAAoB,CAwFxC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,aAAa,CAAC,EAAE,MAAM,GACrB,oBAAoB,CA8EtB"}
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/config/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,qEAAqE;AACrE,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;AAElE,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AASD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAG9D;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,MAAM,IAAI,oBAAoB,CAwFxC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,aAAa,CAAC,EAAE,MAAM,GACrB,oBAAoB,CA8EtB"}
|
|
@@ -10,6 +10,14 @@ function isRunningInECS() {
|
|
|
10
10
|
return process.env.ECS_CONTAINER_METADATA_URI_V4 !== void 0;
|
|
11
11
|
}
|
|
12
12
|
var DEFAULT_ECS_KEEPALIVE_TIMEOUT_MS = 2e4;
|
|
13
|
+
/**
|
|
14
|
+
* Whether this process tree runs the change-streamer, as opposed to connecting
|
|
15
|
+
* to one that another task runs.
|
|
16
|
+
*/
|
|
17
|
+
function runsChangeStreamer(config) {
|
|
18
|
+
const { mode, uri } = config.changeStreamer;
|
|
19
|
+
return mode === "dedicated" && uri === void 0;
|
|
20
|
+
}
|
|
13
21
|
function assertNormalized(config) {
|
|
14
22
|
assert(config.taskID, "missing --task-id");
|
|
15
23
|
assert(config.changeStreamer.port, "missing --change-streamer-port");
|
|
@@ -30,7 +38,7 @@ function assertNormalized(config) {
|
|
|
30
38
|
assert(config.litestream.port, "missing --litestream-port");
|
|
31
39
|
assert(!config.litestream.backupUsingV5 || config.litestream.restoreUsingV5, "--litestream-backup-using-v5 requires --litestream-restore-using-v5");
|
|
32
40
|
assert(!config.litestream.backupURL || config.litestream.executableV5 || !(config.litestream.restoreUsingV5 || config.litestream.backupUsingV5), "--litestream-restore-using-v5 and --litestream-backup-using-v5 require --litestream-executable-v5 to be specified");
|
|
33
|
-
assert(!config.litestream.backupURL || !config.litestream.backupUsingV5 || config.litestream.
|
|
41
|
+
assert(!config.litestream.backupURL || !config.litestream.backupUsingV5 || config.litestream.vfsQueryExecutable, "--litestream-backup-using-v5 requires --litestream-vfs-query-executable to be specified");
|
|
34
42
|
assert(config.change.db, "missing --change-db");
|
|
35
43
|
assert(config.cvr.db, "missing --cvr-db");
|
|
36
44
|
assertNotUndefined(config.numSyncWorkers, "missing --num-sync-workers");
|
|
@@ -108,6 +116,6 @@ function normalizeZeroConfig(lc, config, env, defaultTaskID) {
|
|
|
108
116
|
};
|
|
109
117
|
}
|
|
110
118
|
//#endregion
|
|
111
|
-
export { assertNormalized, isDevelopmentMode, normalizeZeroConfig };
|
|
119
|
+
export { assertNormalized, isDevelopmentMode, normalizeZeroConfig, runsChangeStreamer };
|
|
112
120
|
|
|
113
121
|
//# sourceMappingURL=normalize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.js","names":[],"sources":["../../../../../zero-cache/src/config/normalize.ts"],"sourcesContent":["import {availableParallelism} from 'node:os';\nimport type {LogContext} from '@rocicorp/logger';\nimport {nanoid} from 'nanoid';\nimport {assert, assertNotUndefined} from '../../../shared/src/asserts.ts';\nimport {getHostIp} from './network.ts';\nimport type {ZeroConfig} from './zero-config.ts';\n\n/** {@link ZeroConfig} with defaults set per option documentation. */\nexport type NormalizedZeroConfig = ZeroConfig & {\n taskID: string;\n changeStreamer: {\n port: number;\n address: string;\n };\n change: {\n db: string;\n };\n cvr: {\n db: string;\n };\n litestream: {\n port: number;\n };\n numSyncWorkers: number;\n};\n\nexport type LitestreamConfig = NormalizedZeroConfig['litestream'];\n\nexport function isDevelopmentMode(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\nfunction isRunningInECS(): boolean {\n // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-environment-variables.html\n return process.env.ECS_CONTAINER_METADATA_URI_V4 !== undefined;\n}\n\nconst DEFAULT_ECS_KEEPALIVE_TIMEOUT_MS = 20_000;\n\nexport function assertNormalized(\n config: ZeroConfig,\n): asserts config is NormalizedZeroConfig {\n assert(config.taskID, 'missing --task-id');\n assert(config.changeStreamer.port, 'missing --change-streamer-port');\n assert(config.changeStreamer.address, 'missing --change-streamer-address');\n const {\n sqliteChangeLogMode,\n sqliteChangeLogReadPercent,\n sqliteChangeLogColdReadPercent,\n sqliteChangeLogComparePercent,\n sqliteChangeLogRetentionMs,\n sqliteChangeLogReadBatchRows,\n sqliteChangeLogPurgeBatchRows,\n sqliteChangeLogBarrierTimeoutMs,\n } = config.changeStreamer;\n assert(\n Number.isSafeInteger(sqliteChangeLogReadPercent) &&\n sqliteChangeLogReadPercent >= 0 &&\n sqliteChangeLogReadPercent <= 100,\n '--change-streamer-sqlite-change-log-read-percent must be an integer between 0 and 100',\n );\n assert(\n Number.isSafeInteger(sqliteChangeLogColdReadPercent) &&\n sqliteChangeLogColdReadPercent >= 0 &&\n sqliteChangeLogColdReadPercent <= 100,\n '--change-streamer-sqlite-change-log-cold-read-percent must be an integer between 0 and 100',\n );\n // This setting has no mode restriction. Comparison starts in `compare` mode.\n assert(\n Number.isSafeInteger(sqliteChangeLogComparePercent) &&\n sqliteChangeLogComparePercent >= 0 &&\n sqliteChangeLogComparePercent <= 100,\n '--change-streamer-sqlite-change-log-compare-percent must be an integer between 0 and 100',\n );\n assert(\n sqliteChangeLogMode === 'serve' || sqliteChangeLogReadPercent === 0,\n '--change-streamer-sqlite-change-log-read-percent must be 0 unless --change-streamer-sqlite-change-log-mode=serve',\n );\n assert(\n sqliteChangeLogMode === 'serve' || sqliteChangeLogColdReadPercent === 0,\n '--change-streamer-sqlite-change-log-cold-read-percent must be 0 unless --change-streamer-sqlite-change-log-mode=serve',\n );\n // The cold gate only admits a task to the read gate; it never serves one on\n // its own. A nonzero cold percentage with a zero read percentage is a\n // silent no-op, which is the shape of a rollout that looks enabled and\n // serves nothing.\n assert(\n sqliteChangeLogReadPercent > 0 || sqliteChangeLogColdReadPercent === 0,\n '--change-streamer-sqlite-change-log-cold-read-percent must be 0 when --change-streamer-sqlite-change-log-read-percent is 0',\n );\n for (const [flag, value] of [\n ['retention-ms', sqliteChangeLogRetentionMs],\n ['read-batch-rows', sqliteChangeLogReadBatchRows],\n ['purge-batch-rows', sqliteChangeLogPurgeBatchRows],\n ['barrier-timeout-ms', sqliteChangeLogBarrierTimeoutMs],\n ] as const) {\n assert(\n Number.isSafeInteger(value) && value > 0,\n `--change-streamer-sqlite-change-log-${flag} must be a positive integer`,\n );\n }\n assert(config.litestream.port, 'missing --litestream-port');\n assert(\n !config.litestream.backupUsingV5 || config.litestream.restoreUsingV5,\n '--litestream-backup-using-v5 requires --litestream-restore-using-v5',\n );\n assert(\n !config.litestream.backupURL ||\n config.litestream.executableV5 ||\n !(config.litestream.restoreUsingV5 || config.litestream.backupUsingV5),\n '--litestream-restore-using-v5 and --litestream-backup-using-v5 ' +\n 'require --litestream-executable-v5 to be specified',\n );\n assert(\n !config.litestream.backupURL ||\n !config.litestream.backupUsingV5 ||\n config.litestream.vfsPollIntervalMs,\n '--litestream-backup-using-v5 requires --litestream-vfs-query-executable to be specified',\n );\n assert(config.change.db, 'missing --change-db');\n assert(config.cvr.db, 'missing --cvr-db');\n assertNotUndefined(config.numSyncWorkers, 'missing --num-sync-workers');\n\n if (!isDevelopmentMode()) {\n assert(\n config.adminPassword,\n 'missing --admin-password: required in production mode',\n );\n }\n}\n\n/**\n * Normalizes the parsed `config` by setting defaults from the environment\n * or from other options as documented. When defaults are applied, the\n * corresponding `env` variable is updated so that the settings are propagated\n * to spawned child workers. Child workers can then call\n * {@link assertNormalized} to verify that the expected defaults have been set.\n */\nexport function normalizeZeroConfig(\n lc: LogContext,\n config: ZeroConfig,\n env: NodeJS.ProcessEnv,\n defaultTaskID?: string,\n): NormalizedZeroConfig {\n if (!config.taskID) {\n const taskID = defaultTaskID ?? nanoid();\n config.taskID = taskID;\n env['ZERO_TASK_ID'] = taskID;\n }\n if (!config.changeStreamer.port) {\n const port = config.port + 1;\n config.changeStreamer.port = port;\n env['ZERO_CHANGE_STREAMER_PORT'] = String(port);\n }\n if (!config.litestream.port) {\n const port = config.port + 2;\n config.litestream.port = port;\n env['ZERO_LITESTREAM_PORT'] = String(port);\n }\n if (config.numSyncWorkers === undefined) {\n // Reserve 1 core for the replicator. The change-streamer is not CPU heavy.\n const numSyncers = Math.max(1, availableParallelism() - 1);\n config.numSyncWorkers = numSyncers;\n env['ZERO_NUM_SYNC_WORKERS'] = String(numSyncers);\n }\n\n const hostIP = getHostIp(\n lc,\n config.changeStreamer.discoveryInterfacePreferences,\n );\n if (!config.changeStreamer.address) {\n const {port} = config.changeStreamer;\n const address = `${hostIP}:${port}`;\n config.changeStreamer.address = address;\n env['ZERO_CHANGE_STREAMER_ADDRESS'] = address;\n }\n\n if (!config.change.db) {\n config.change.db = config.upstream.db;\n env['ZERO_CHANGE_DB'] = config.upstream.db;\n }\n\n if (!config.cvr.db) {\n config.cvr.db = config.upstream.db;\n env['ZERO_CVR_DB'] = config.upstream.db;\n }\n\n if (!config.keepaliveTimeoutMs && isRunningInECS()) {\n config.keepaliveTimeoutMs = DEFAULT_ECS_KEEPALIVE_TIMEOUT_MS;\n env['ZERO_KEEPALIVE_TIMEOUT_MS'] = String(DEFAULT_ECS_KEEPALIVE_TIMEOUT_MS);\n }\n\n lc.info?.(`runtime env: taskID=${config.taskID}, hostIP=${hostIP}`);\n\n return {\n ...config,\n taskID: config.taskID,\n\n changeStreamer: {\n ...config.changeStreamer,\n port: config.changeStreamer.port,\n address: config.changeStreamer.address,\n },\n\n litestream: {\n ...config.litestream,\n port: config.litestream.port,\n },\n\n change: {\n ...config.change,\n db: config.change.db,\n },\n\n cvr: {\n ...config.cvr,\n db: config.cvr.db,\n },\n\n numSyncWorkers: config.numSyncWorkers,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"normalize.js","names":[],"sources":["../../../../../zero-cache/src/config/normalize.ts"],"sourcesContent":["import {availableParallelism} from 'node:os';\nimport type {LogContext} from '@rocicorp/logger';\nimport {nanoid} from 'nanoid';\nimport {assert, assertNotUndefined} from '../../../shared/src/asserts.ts';\nimport {getHostIp} from './network.ts';\nimport type {ZeroConfig} from './zero-config.ts';\n\n/** {@link ZeroConfig} with defaults set per option documentation. */\nexport type NormalizedZeroConfig = ZeroConfig & {\n taskID: string;\n changeStreamer: {\n port: number;\n address: string;\n };\n change: {\n db: string;\n };\n cvr: {\n db: string;\n };\n litestream: {\n port: number;\n };\n numSyncWorkers: number;\n};\n\nexport type LitestreamConfig = NormalizedZeroConfig['litestream'];\n\nexport function isDevelopmentMode(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\nfunction isRunningInECS(): boolean {\n // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-environment-variables.html\n return process.env.ECS_CONTAINER_METADATA_URI_V4 !== undefined;\n}\n\nconst DEFAULT_ECS_KEEPALIVE_TIMEOUT_MS = 20_000;\n\n/**\n * Whether this process tree runs the change-streamer, as opposed to connecting\n * to one that another task runs.\n */\nexport function runsChangeStreamer(config: ZeroConfig): boolean {\n const {mode, uri} = config.changeStreamer;\n return mode === 'dedicated' && uri === undefined;\n}\n\nexport function assertNormalized(\n config: ZeroConfig,\n): asserts config is NormalizedZeroConfig {\n assert(config.taskID, 'missing --task-id');\n assert(config.changeStreamer.port, 'missing --change-streamer-port');\n assert(config.changeStreamer.address, 'missing --change-streamer-address');\n const {\n sqliteChangeLogMode,\n sqliteChangeLogReadPercent,\n sqliteChangeLogColdReadPercent,\n sqliteChangeLogComparePercent,\n sqliteChangeLogRetentionMs,\n sqliteChangeLogReadBatchRows,\n sqliteChangeLogPurgeBatchRows,\n sqliteChangeLogBarrierTimeoutMs,\n } = config.changeStreamer;\n assert(\n Number.isSafeInteger(sqliteChangeLogReadPercent) &&\n sqliteChangeLogReadPercent >= 0 &&\n sqliteChangeLogReadPercent <= 100,\n '--change-streamer-sqlite-change-log-read-percent must be an integer between 0 and 100',\n );\n assert(\n Number.isSafeInteger(sqliteChangeLogColdReadPercent) &&\n sqliteChangeLogColdReadPercent >= 0 &&\n sqliteChangeLogColdReadPercent <= 100,\n '--change-streamer-sqlite-change-log-cold-read-percent must be an integer between 0 and 100',\n );\n // This setting has no mode restriction. Comparison starts in `compare` mode.\n assert(\n Number.isSafeInteger(sqliteChangeLogComparePercent) &&\n sqliteChangeLogComparePercent >= 0 &&\n sqliteChangeLogComparePercent <= 100,\n '--change-streamer-sqlite-change-log-compare-percent must be an integer between 0 and 100',\n );\n assert(\n sqliteChangeLogMode === 'serve' || sqliteChangeLogReadPercent === 0,\n '--change-streamer-sqlite-change-log-read-percent must be 0 unless --change-streamer-sqlite-change-log-mode=serve',\n );\n assert(\n sqliteChangeLogMode === 'serve' || sqliteChangeLogColdReadPercent === 0,\n '--change-streamer-sqlite-change-log-cold-read-percent must be 0 unless --change-streamer-sqlite-change-log-mode=serve',\n );\n // The cold gate only admits a task to the read gate; it never serves one on\n // its own. A nonzero cold percentage with a zero read percentage is a\n // silent no-op, which is the shape of a rollout that looks enabled and\n // serves nothing.\n assert(\n sqliteChangeLogReadPercent > 0 || sqliteChangeLogColdReadPercent === 0,\n '--change-streamer-sqlite-change-log-cold-read-percent must be 0 when --change-streamer-sqlite-change-log-read-percent is 0',\n );\n for (const [flag, value] of [\n ['retention-ms', sqliteChangeLogRetentionMs],\n ['read-batch-rows', sqliteChangeLogReadBatchRows],\n ['purge-batch-rows', sqliteChangeLogPurgeBatchRows],\n ['barrier-timeout-ms', sqliteChangeLogBarrierTimeoutMs],\n ] as const) {\n assert(\n Number.isSafeInteger(value) && value > 0,\n `--change-streamer-sqlite-change-log-${flag} must be a positive integer`,\n );\n }\n assert(config.litestream.port, 'missing --litestream-port');\n assert(\n !config.litestream.backupUsingV5 || config.litestream.restoreUsingV5,\n '--litestream-backup-using-v5 requires --litestream-restore-using-v5',\n );\n assert(\n !config.litestream.backupURL ||\n config.litestream.executableV5 ||\n !(config.litestream.restoreUsingV5 || config.litestream.backupUsingV5),\n '--litestream-restore-using-v5 and --litestream-backup-using-v5 ' +\n 'require --litestream-executable-v5 to be specified',\n );\n assert(\n !config.litestream.backupURL ||\n !config.litestream.backupUsingV5 ||\n config.litestream.vfsQueryExecutable,\n '--litestream-backup-using-v5 requires --litestream-vfs-query-executable to be specified',\n );\n assert(config.change.db, 'missing --change-db');\n assert(config.cvr.db, 'missing --cvr-db');\n assertNotUndefined(config.numSyncWorkers, 'missing --num-sync-workers');\n\n if (!isDevelopmentMode()) {\n assert(\n config.adminPassword,\n 'missing --admin-password: required in production mode',\n );\n }\n}\n\n/**\n * Normalizes the parsed `config` by setting defaults from the environment\n * or from other options as documented. When defaults are applied, the\n * corresponding `env` variable is updated so that the settings are propagated\n * to spawned child workers. Child workers can then call\n * {@link assertNormalized} to verify that the expected defaults have been set.\n */\nexport function normalizeZeroConfig(\n lc: LogContext,\n config: ZeroConfig,\n env: NodeJS.ProcessEnv,\n defaultTaskID?: string,\n): NormalizedZeroConfig {\n if (!config.taskID) {\n const taskID = defaultTaskID ?? nanoid();\n config.taskID = taskID;\n env['ZERO_TASK_ID'] = taskID;\n }\n if (!config.changeStreamer.port) {\n const port = config.port + 1;\n config.changeStreamer.port = port;\n env['ZERO_CHANGE_STREAMER_PORT'] = String(port);\n }\n if (!config.litestream.port) {\n const port = config.port + 2;\n config.litestream.port = port;\n env['ZERO_LITESTREAM_PORT'] = String(port);\n }\n if (config.numSyncWorkers === undefined) {\n // Reserve 1 core for the replicator. The change-streamer is not CPU heavy.\n const numSyncers = Math.max(1, availableParallelism() - 1);\n config.numSyncWorkers = numSyncers;\n env['ZERO_NUM_SYNC_WORKERS'] = String(numSyncers);\n }\n\n const hostIP = getHostIp(\n lc,\n config.changeStreamer.discoveryInterfacePreferences,\n );\n if (!config.changeStreamer.address) {\n const {port} = config.changeStreamer;\n const address = `${hostIP}:${port}`;\n config.changeStreamer.address = address;\n env['ZERO_CHANGE_STREAMER_ADDRESS'] = address;\n }\n\n if (!config.change.db) {\n config.change.db = config.upstream.db;\n env['ZERO_CHANGE_DB'] = config.upstream.db;\n }\n\n if (!config.cvr.db) {\n config.cvr.db = config.upstream.db;\n env['ZERO_CVR_DB'] = config.upstream.db;\n }\n\n if (!config.keepaliveTimeoutMs && isRunningInECS()) {\n config.keepaliveTimeoutMs = DEFAULT_ECS_KEEPALIVE_TIMEOUT_MS;\n env['ZERO_KEEPALIVE_TIMEOUT_MS'] = String(DEFAULT_ECS_KEEPALIVE_TIMEOUT_MS);\n }\n\n lc.info?.(`runtime env: taskID=${config.taskID}, hostIP=${hostIP}`);\n\n return {\n ...config,\n taskID: config.taskID,\n\n changeStreamer: {\n ...config.changeStreamer,\n port: config.changeStreamer.port,\n address: config.changeStreamer.address,\n },\n\n litestream: {\n ...config.litestream,\n port: config.litestream.port,\n },\n\n change: {\n ...config.change,\n db: config.change.db,\n },\n\n cvr: {\n ...config.cvr,\n db: config.cvr.db,\n },\n\n numSyncWorkers: config.numSyncWorkers,\n };\n}\n"],"mappings":";;;;;AA4BA,SAAgB,oBAA6B;CAC3C,OAAA,QAAA,IAAA,aAAgC;AAClC;AAEA,SAAS,iBAA0B;CAEjC,OAAO,QAAQ,IAAI,kCAAkC,KAAA;AACvD;AAEA,IAAM,mCAAmC;;;;;AAMzC,SAAgB,mBAAmB,QAA6B;CAC9D,MAAM,EAAC,MAAM,QAAO,OAAO;CAC3B,OAAO,SAAS,eAAe,QAAQ,KAAA;AACzC;AAEA,SAAgB,iBACd,QACwC;CACxC,OAAO,OAAO,QAAQ,mBAAmB;CACzC,OAAO,OAAO,eAAe,MAAM,gCAAgC;CACnE,OAAO,OAAO,eAAe,SAAS,mCAAmC;CACzE,MAAM,EACJ,qBACA,4BACA,gCACA,+BACA,4BACA,8BACA,+BACA,oCACE,OAAO;CACX,OACE,OAAO,cAAc,0BAA0B,KAC7C,8BAA8B,KAC9B,8BAA8B,KAChC,uFACF;CACA,OACE,OAAO,cAAc,8BAA8B,KACjD,kCAAkC,KAClC,kCAAkC,KACpC,4FACF;CAEA,OACE,OAAO,cAAc,6BAA6B,KAChD,iCAAiC,KACjC,iCAAiC,KACnC,0FACF;CACA,OACE,wBAAwB,WAAW,+BAA+B,GAClE,kHACF;CACA,OACE,wBAAwB,WAAW,mCAAmC,GACtE,uHACF;CAKA,OACE,6BAA6B,KAAK,mCAAmC,GACrE,4HACF;CACA,KAAK,MAAM,CAAC,MAAM,UAAU;EAC1B,CAAC,gBAAgB,0BAA0B;EAC3C,CAAC,mBAAmB,4BAA4B;EAChD,CAAC,oBAAoB,6BAA6B;EAClD,CAAC,sBAAsB,+BAA+B;CACxD,GACE,OACE,OAAO,cAAc,KAAK,KAAK,QAAQ,GACvC,uCAAuC,KAAK,4BAC9C;CAEF,OAAO,OAAO,WAAW,MAAM,2BAA2B;CAC1D,OACE,CAAC,OAAO,WAAW,iBAAiB,OAAO,WAAW,gBACtD,qEACF;CACA,OACE,CAAC,OAAO,WAAW,aACjB,OAAO,WAAW,gBAClB,EAAE,OAAO,WAAW,kBAAkB,OAAO,WAAW,gBAC1D,mHAEF;CACA,OACE,CAAC,OAAO,WAAW,aACjB,CAAC,OAAO,WAAW,iBACnB,OAAO,WAAW,oBACpB,yFACF;CACA,OAAO,OAAO,OAAO,IAAI,qBAAqB;CAC9C,OAAO,OAAO,IAAI,IAAI,kBAAkB;CACxC,mBAAmB,OAAO,gBAAgB,4BAA4B;CAEtE,IAAI,CAAC,kBAAkB,GACrB,OACE,OAAO,eACP,uDACF;AAEJ;;;;;;;;AASA,SAAgB,oBACd,IACA,QACA,KACA,eACsB;CACtB,IAAI,CAAC,OAAO,QAAQ;EAClB,MAAM,SAAS,iBAAiB,OAAO;EACvC,OAAO,SAAS;EAChB,IAAI,kBAAkB;CACxB;CACA,IAAI,CAAC,OAAO,eAAe,MAAM;EAC/B,MAAM,OAAO,OAAO,OAAO;EAC3B,OAAO,eAAe,OAAO;EAC7B,IAAI,+BAA+B,OAAO,IAAI;CAChD;CACA,IAAI,CAAC,OAAO,WAAW,MAAM;EAC3B,MAAM,OAAO,OAAO,OAAO;EAC3B,OAAO,WAAW,OAAO;EACzB,IAAI,0BAA0B,OAAO,IAAI;CAC3C;CACA,IAAI,OAAO,mBAAmB,KAAA,GAAW;EAEvC,MAAM,aAAa,KAAK,IAAI,GAAG,qBAAqB,IAAI,CAAC;EACzD,OAAO,iBAAiB;EACxB,IAAI,2BAA2B,OAAO,UAAU;CAClD;CAEA,MAAM,SAAS,UACb,IACA,OAAO,eAAe,6BACxB;CACA,IAAI,CAAC,OAAO,eAAe,SAAS;EAClC,MAAM,EAAC,SAAQ,OAAO;EACtB,MAAM,UAAU,GAAG,OAAO,GAAG;EAC7B,OAAO,eAAe,UAAU;EAChC,IAAI,kCAAkC;CACxC;CAEA,IAAI,CAAC,OAAO,OAAO,IAAI;EACrB,OAAO,OAAO,KAAK,OAAO,SAAS;EACnC,IAAI,oBAAoB,OAAO,SAAS;CAC1C;CAEA,IAAI,CAAC,OAAO,IAAI,IAAI;EAClB,OAAO,IAAI,KAAK,OAAO,SAAS;EAChC,IAAI,iBAAiB,OAAO,SAAS;CACvC;CAEA,IAAI,CAAC,OAAO,sBAAsB,eAAe,GAAG;EAClD,OAAO,qBAAqB;EAC5B,IAAI,+BAA+B,OAAO,gCAAgC;CAC5E;CAEA,GAAG,OAAO,uBAAuB,OAAO,OAAO,WAAW,QAAQ;CAElE,OAAO;EACL,GAAG;EACH,QAAQ,OAAO;EAEf,gBAAgB;GACd,GAAG,OAAO;GACV,MAAM,OAAO,eAAe;GAC5B,SAAS,OAAO,eAAe;EACjC;EAEA,YAAY;GACV,GAAG,OAAO;GACV,MAAM,OAAO,WAAW;EAC1B;EAEA,QAAQ;GACN,GAAG,OAAO;GACV,IAAI,OAAO,OAAO;EACpB;EAEA,KAAK;GACH,GAAG,OAAO;GACV,IAAI,OAAO,IAAI;EACjB;EAEA,gBAAgB,OAAO;CACzB;AACF"}
|
|
@@ -282,9 +282,11 @@ export declare const zeroOptions: {
|
|
|
282
282
|
type: v.Optional<string>;
|
|
283
283
|
desc: string[];
|
|
284
284
|
};
|
|
285
|
+
/** @deprecated */
|
|
285
286
|
maxConns: {
|
|
286
287
|
type: v.Type<number>;
|
|
287
|
-
|
|
288
|
+
deprecated: string[];
|
|
289
|
+
hidden: boolean;
|
|
288
290
|
};
|
|
289
291
|
statementTimeoutMs: {
|
|
290
292
|
type: v.Type<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zero-config.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/config/zero-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,CAAC,MAAM,+BAA+B,CAAC;AAUnD,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAC,SAAS,EAAC,MAAM,kCAAkC,CAAC;AAEhE,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAE3C,eAAO,MAAM,UAAU;;;;;;;;;CA+CtB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;CAwBxB,CAAC;AAEF,QAAA,MAAM,cAAc;;;;;;;;;CAmBnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,QAAA,MAAM,oBAAoB;;;;;;;;;CAczB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE5D,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8DhB,CAAC;AA0HF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAEpD,+DAA+D;AAC/D,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,UAAU,EACV,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CACrD,CAAC;AAKF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4EtB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAGlB,kBAAkB
|
|
1
|
+
{"version":3,"file":"zero-config.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/config/zero-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,CAAC,MAAM,+BAA+B,CAAC;AAUnD,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAC,SAAS,EAAC,MAAM,kCAAkC,CAAC;AAEhE,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAE3C,eAAO,MAAM,UAAU;;;;;;;;;CA+CtB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;CAwBxB,CAAC;AAEF,QAAA,MAAM,cAAc;;;;;;;;;CAmBnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,QAAA,MAAM,oBAAoB;;;;;;;;;CAczB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE5D,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8DhB,CAAC;AA0HF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAEpD,+DAA+D;AAC/D,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,UAAU,EACV,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CACrD,CAAC;AAKF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4EtB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAGlB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAmIhB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkHlB,kBAAkB;;;;;;QASlB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAomBpB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEnB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAIpD,wBAAgB,aAAa,CAC3B,IAAI,GAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAM,GAC7C,UAAU,CAaZ;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,GAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAM,GAC7C,oBAAoB,CAItB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,GAAG,SAAS,GACpD,MAAM,CAER;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAAC,EACnD,QAAQ,EAAE,MAAM,GAAG,SAAS,WAwC7B;AAYD,wBAAgB,kBAAkB,SAEjC"}
|
|
@@ -413,21 +413,19 @@ var zeroOptions = {
|
|
|
413
413
|
`the upstream database. If unspecified, the {bold upstream-db} will be used.`
|
|
414
414
|
]
|
|
415
415
|
},
|
|
416
|
+
/** @deprecated */
|
|
416
417
|
maxConns: {
|
|
417
418
|
type: valita_exports.number().default(5),
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
`This is used by the {bold change-streamer} for catching up`,
|
|
421
|
-
`{bold zero-cache} replication subscriptions.`
|
|
422
|
-
]
|
|
419
|
+
deprecated: [`Connections to the change db are created dynamically for subscriber catchup. Ensure`, `that the database supports sufficient connections for at least 5 + numViewSyncers.`],
|
|
420
|
+
hidden: true
|
|
423
421
|
},
|
|
424
422
|
statementTimeoutMs: {
|
|
425
|
-
type: valita_exports.number().default(
|
|
423
|
+
type: valita_exports.number().default(3e4),
|
|
426
424
|
desc: [
|
|
427
|
-
`Fail change-log
|
|
428
|
-
`
|
|
429
|
-
`
|
|
430
|
-
`
|
|
425
|
+
`Fail change-log db operations that make no progress within the specified timeout. This`,
|
|
426
|
+
`differs from a postgres {bold statement_timeout} in that it is implemented to handle a`,
|
|
427
|
+
`pathological case in which Postgres does not return a response but otherwise believes the`,
|
|
428
|
+
`connection to be idle (e.g. a half-open connection).`
|
|
431
429
|
],
|
|
432
430
|
hidden: true
|
|
433
431
|
},
|
|
@@ -907,7 +905,7 @@ var zeroOptions = {
|
|
|
907
905
|
]
|
|
908
906
|
},
|
|
909
907
|
incrementalBackupIntervalMinutes: {
|
|
910
|
-
type: valita_exports.number().default(
|
|
908
|
+
type: valita_exports.number().default(15),
|
|
911
909
|
desc: [
|
|
912
910
|
`The interval between incremental v3 backups of the replica. Shorter intervals`,
|
|
913
911
|
`reduce the amount of change history that needs to be replayed when catching`,
|
|
@@ -935,7 +933,7 @@ var zeroOptions = {
|
|
|
935
933
|
]
|
|
936
934
|
},
|
|
937
935
|
snapshotBackupIntervalHours: {
|
|
938
|
-
type: valita_exports.number().default(
|
|
936
|
+
type: valita_exports.number().default(12),
|
|
939
937
|
desc: [
|
|
940
938
|
`The interval between snapshot backups of the replica. Snapshot backups`,
|
|
941
939
|
`make a full copy of the database to a new litestream generation. This`,
|