@rocicorp/zero 1.5.0-canary.3 → 1.6.0-canary.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/analyze-query/src/analyze-cli.js +2 -2
- package/out/analyze-query/src/analyze-cli.js.map +1 -1
- package/out/replicache/src/btree/node.d.ts +3 -0
- package/out/replicache/src/btree/node.d.ts.map +1 -1
- package/out/replicache/src/btree/node.js +114 -1
- package/out/replicache/src/btree/node.js.map +1 -1
- package/out/replicache/src/btree/write.d.ts +7 -0
- package/out/replicache/src/btree/write.d.ts.map +1 -1
- package/out/replicache/src/btree/write.js +50 -0
- package/out/replicache/src/btree/write.js.map +1 -1
- package/out/replicache/src/db/write.d.ts +8 -0
- package/out/replicache/src/db/write.d.ts.map +1 -1
- package/out/replicache/src/db/write.js +15 -0
- package/out/replicache/src/db/write.js.map +1 -1
- package/out/replicache/src/kv/sqlite-store.d.ts +2 -5
- package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
- package/out/replicache/src/kv/sqlite-store.js +21 -24
- package/out/replicache/src/kv/sqlite-store.js.map +1 -1
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/sync/patch.d.ts +15 -0
- package/out/replicache/src/sync/patch.d.ts.map +1 -1
- package/out/replicache/src/sync/patch.js +85 -26
- package/out/replicache/src/sync/patch.js.map +1 -1
- package/out/shared/src/testing.d.ts +3 -0
- package/out/shared/src/testing.d.ts.map +1 -0
- package/out/zero/package.js +5 -6
- package/out/zero/package.js.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +4 -0
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +8 -0
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.d.ts +3 -2
- package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.js +19 -9
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
- package/out/zero-cache/src/server/runner/run-worker.js +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js +2 -2
- package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +7 -6
- 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.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +49 -66
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +0 -8
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js +22 -52
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +57 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js +162 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +18 -0
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +17 -3
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +43 -16
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +2 -3
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +5 -5
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +10 -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 +13 -3
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +6 -11
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js +0 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.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 +2 -2
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +12 -5
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +43 -21
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +4 -5
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js +18 -16
- 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 +3 -2
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/litestream/config.yml +1 -0
- package/out/zero-cache/src/services/mutagen/pusher.d.ts +2 -2
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +2 -2
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +5 -6
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/streams.d.ts +4 -0
- package/out/zero-cache/src/types/streams.d.ts.map +1 -1
- package/out/zero-cache/src/types/streams.js +13 -10
- package/out/zero-cache/src/types/streams.js.map +1 -1
- package/out/zero-cache/src/workers/connection.js +5 -5
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-client/src/client/inspector/inspector.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/inspector.js +15 -2
- package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.d.ts +9 -3
- package/out/zero-client/src/client/inspector/lazy-inspector.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.js +27 -6
- package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
- package/out/zero-client/src/client/inspector/query.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/query.js +3 -3
- package/out/zero-client/src/client/inspector/query.js.map +1 -1
- package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
- package/out/zero-client/src/client/ivm-branch.js +16 -2
- package/out/zero-client/src/client/ivm-branch.js.map +1 -1
- package/out/zero-client/src/client/options.d.ts +12 -4
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/options.js.map +1 -1
- package/out/zero-client/src/client/query-manager.d.ts +8 -1
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.js +28 -3
- package/out/zero-client/src/client/query-manager.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +12 -11
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-protocol/src/down.d.ts +1 -1
- package/out/zero-protocol/src/inspect-down.d.ts +15 -4
- package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
- package/out/zero-protocol/src/inspect-down.js +11 -1
- package/out/zero-protocol/src/inspect-down.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-react/src/use-query.js.map +1 -1
- package/out/zero-react/src/zero-provider.d.ts +6 -0
- package/out/zero-react/src/zero-provider.d.ts.map +1 -1
- package/out/zero-react/src/zero-provider.js +21 -1
- package/out/zero-react/src/zero-provider.js.map +1 -1
- package/out/zero-solid/src/use-zero.d.ts +6 -0
- package/out/zero-solid/src/use-zero.d.ts.map +1 -1
- package/out/zero-solid/src/use-zero.js +24 -4
- package/out/zero-solid/src/use-zero.js.map +1 -1
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/builder/builder.js +18 -8
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/ivm/cap.d.ts +32 -0
- package/out/zql/src/ivm/cap.d.ts.map +1 -0
- package/out/zql/src/ivm/cap.js +205 -0
- package/out/zql/src/ivm/cap.js.map +1 -0
- package/out/zql/src/ivm/constraint.d.ts.map +1 -1
- package/out/zql/src/ivm/constraint.js.map +1 -1
- package/out/zql/src/ivm/flipped-join.d.ts +9 -0
- package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
- package/out/zql/src/ivm/flipped-join.js +56 -69
- package/out/zql/src/ivm/flipped-join.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts +24 -3
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +162 -7
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/operator.d.ts +26 -0
- package/out/zql/src/ivm/operator.d.ts.map +1 -1
- package/out/zql/src/ivm/operator.js.map +1 -1
- package/out/zql/src/ivm/take.js +2 -2
- package/out/zqlite/src/query-builder.d.ts +14 -2
- package/out/zqlite/src/query-builder.d.ts.map +1 -1
- package/out/zqlite/src/query-builder.js +32 -1
- package/out/zqlite/src/query-builder.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +4 -4
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +5 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-manager.js","names":["#clientID","#clientToServer","#serverToClient","#send","#onFatalError","#queries","#recentQueriesMaxSize","#recentQueries","#gotQueries","#mutationTracker","#pendingQueryChanges","#queryChangeThrottleMs","#lc","#metrics","#queryMetrics","#slowMaterializeThreshold","#pendingRemovals","#fireGotCallbacks","#closedError","#add","#queueQueryChange","#updateEntry","#remove","#scheduleBatch","#batchTimer"],"sources":["../../../../../zero-client/src/client/query-manager.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {ReplicacheImpl} from '../../../replicache/src/replicache-impl.ts';\nimport type {ClientID} from '../../../replicache/src/sync/ids.ts';\nimport {assert} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {must} from '../../../shared/src/must.ts';\nimport {difference} from '../../../shared/src/set-utils.ts';\nimport {TDigest} from '../../../shared/src/tdigest.ts';\nimport {\n mapAST,\n normalizeAST,\n type AST,\n} from '../../../zero-protocol/src/ast.ts';\nimport type {ChangeDesiredQueriesMessage} from '../../../zero-protocol/src/change-desired-queries.ts';\nimport type {ErroredQuery} from '../../../zero-protocol/src/custom-queries.ts';\nimport {ErrorKind} from '../../../zero-protocol/src/error-kind.ts';\nimport {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts';\nimport {ErrorReason} from '../../../zero-protocol/src/error-reason.ts';\nimport {ProtocolError} from '../../../zero-protocol/src/error.ts';\nimport type {UpQueriesPatchOp} from '../../../zero-protocol/src/queries-patch.ts';\nimport {\n hashOfAST,\n hashOfNameAndArgs,\n} from '../../../zero-protocol/src/query-hash.ts';\nimport {\n clientToServer,\n serverToClient,\n type NameMapper,\n} from '../../../zero-schema/src/name-mapper.ts';\nimport type {TableSchema} from '../../../zero-schema/src/table-schema.ts';\nimport type {ClientMetricMap} from '../../../zql/src/query/metrics-delegate.ts';\nimport type {CustomQueryID} from '../../../zql/src/query/named.ts';\nimport type {GotCallback} from '../../../zql/src/query/query-delegate.ts';\nimport {clampTTL, compareTTL, type TTL} from '../../../zql/src/query/ttl.ts';\nimport type {ClientErrorKind} from './client-error-kind.ts';\nimport type {ClientError} from './error.ts';\nimport {type ZeroError} from './error.ts';\nimport type {InspectorDelegate} from './inspector/inspector.ts';\nimport {desiredQueriesPrefixForClient, GOT_QUERIES_KEY_PREFIX} from './keys.ts';\nimport type {MutationTracker} from './mutation-tracker.ts';\nimport type {ReadTransaction} from './replicache-types.ts';\n\ntype QueryHash = string;\n\ntype Entry = {\n // We keep track of the AST so we can use it in the inspector.\n normalized: AST;\n name: string | undefined;\n args: readonly ReadonlyJSONValue[] | undefined;\n count: number;\n gotCallbacks: GotCallback[];\n ttl: TTL;\n};\n\ntype ClientMetric = {\n [K in keyof ClientMetricMap]: TDigest;\n};\n\n/**\n * Tracks what queries the client is currently subscribed to on the server.\n * Sends `changeDesiredQueries` message to server when this changes.\n * Deduplicates requests so that we only listen to a given unique query once.\n */\nexport class QueryManager implements InspectorDelegate {\n readonly #clientID: ClientID;\n readonly #clientToServer: NameMapper;\n readonly #serverToClient: NameMapper;\n readonly #send: (change: ChangeDesiredQueriesMessage) => void;\n readonly #onFatalError: (error: ZeroError) => void;\n readonly #queries: Map<QueryHash, Entry> = new Map();\n readonly #recentQueriesMaxSize: number;\n readonly #recentQueries: Set<string> = new Set();\n readonly #gotQueries: Set<string> = new Set();\n readonly #mutationTracker: MutationTracker;\n readonly #pendingQueryChanges: UpQueriesPatchOp[] = [];\n readonly #queryChangeThrottleMs: number;\n #pendingRemovals: Array<() => void> = [];\n #batchTimer: ReturnType<typeof setTimeout> | undefined;\n readonly #lc: LogContext;\n readonly #metrics: ClientMetric = newMetrics();\n readonly #queryMetrics: Map<string, ClientMetric> = new Map();\n readonly #slowMaterializeThreshold: number;\n #closedError: ZeroError | undefined;\n\n constructor(\n lc: LogContext,\n mutationTracker: MutationTracker,\n clientID: ClientID,\n tables: Record<string, TableSchema>,\n send: (change: ChangeDesiredQueriesMessage) => void,\n experimentalWatch: ReplicacheImpl['experimentalWatch'],\n recentQueriesMaxSize: number,\n queryChangeThrottleMs: number,\n slowMaterializeThreshold: number,\n onFatalError: (error: ZeroError) => void,\n ) {\n this.#lc = lc.withContext('QueryManager');\n this.#clientID = clientID;\n this.#clientToServer = clientToServer(tables);\n this.#serverToClient = serverToClient(tables);\n this.#recentQueriesMaxSize = recentQueriesMaxSize;\n this.#send = send;\n this.#mutationTracker = mutationTracker;\n this.#queryChangeThrottleMs = queryChangeThrottleMs;\n this.#slowMaterializeThreshold = slowMaterializeThreshold;\n this.#onFatalError = onFatalError;\n this.#mutationTracker.onAllMutationsApplied(() => {\n if (this.#pendingRemovals.length === 0) {\n return;\n }\n const pendingRemovals = this.#pendingRemovals;\n this.#pendingRemovals = [];\n for (const removal of pendingRemovals) {\n removal();\n }\n });\n\n experimentalWatch(\n diff => {\n for (const diffOp of diff) {\n const queryHash = diffOp.key.substring(GOT_QUERIES_KEY_PREFIX.length);\n switch (diffOp.op) {\n case 'add':\n this.#gotQueries.add(queryHash);\n this.#fireGotCallbacks(queryHash, true);\n break;\n case 'del':\n this.#gotQueries.delete(queryHash);\n this.#fireGotCallbacks(queryHash, false);\n break;\n }\n }\n },\n {\n prefix: GOT_QUERIES_KEY_PREFIX,\n initialValuesInFirstDiff: true,\n },\n );\n }\n\n getAST(queryID: string): AST | undefined {\n const ast = this.#queries.get(queryID)?.normalized;\n return ast && mapAST(ast, this.#serverToClient);\n }\n\n mapClientASTToServer(ast: AST): AST {\n return mapAST(ast, this.#clientToServer);\n }\n\n #fireGotCallbacks(queryHash: string, got: boolean) {\n const gotCallbacks = this.#queries.get(queryHash)?.gotCallbacks ?? [];\n for (const gotCallback of gotCallbacks) {\n gotCallback(got);\n }\n }\n\n /**\n * Get the queries that need to be registered with the server.\n *\n * An optional `lastPatch` can be provided. This is the last patch that was\n * sent to the server and may not yet have been acked. If `lastPatch` is provided,\n * this method will return a patch that does not include any events sent in `lastPatch`.\n *\n * This diffing of last patch and current patch is needed since we send\n * a set of queries to the server when we first connect inside of the `sec-protocol` as\n * the `initConnectionMessage`.\n *\n * While we're waiting for the `connected` response to come back from the server,\n * the client may have registered more queries. We need to diff the `initConnectionMessage`\n * queries with the current set of queries to understand what those were.\n */\n async getQueriesPatch(\n tx: ReadTransaction,\n lastPatch?: Map<string, UpQueriesPatchOp>,\n ): Promise<Map<string, UpQueriesPatchOp>> {\n const existingQueryHashes = new Set<string>();\n const prefix = desiredQueriesPrefixForClient(this.#clientID);\n for await (const key of tx.scan({prefix}).keys()) {\n existingQueryHashes.add(key.substring(prefix.length, key.length));\n }\n const patch: Map<string, UpQueriesPatchOp> = new Map();\n for (const hash of existingQueryHashes) {\n if (!this.#queries.has(hash)) {\n patch.set(hash, {op: 'del', hash});\n }\n }\n\n for (const [hash, {normalized, ttl, name, args}] of this.#queries) {\n if (!existingQueryHashes.has(hash)) {\n patch.set(hash, {\n op: 'put',\n hash,\n ast: name === undefined ? normalized : undefined,\n name,\n args,\n // We get TTL out of the DagStore so it is possible that the TTL was written\n // with a too high TTL.\n ttl: clampTTL(ttl), // no lc here since no need to log here\n });\n }\n }\n\n if (lastPatch) {\n // if there are any `puts` in `lastPatch` that are not in `patch` then we need to\n // send a `del` event in `patch`.\n for (const [hash, {op}] of lastPatch) {\n if (op === 'put' && !patch.has(hash)) {\n patch.set(hash, {op: 'del', hash});\n }\n }\n // Remove everything from `patch` that was already sent in `lastPatch`.\n for (const [hash, {op}] of patch) {\n const lastPatchOp = lastPatch.get(hash);\n if (lastPatchOp && lastPatchOp.op === op) {\n patch.delete(hash);\n }\n }\n }\n\n return patch;\n }\n\n handleTransformErrors(errors: ErroredQuery[]) {\n for (const error of errors) {\n const queryId = error.id;\n const entry = this.#queries.get(queryId);\n\n // if we don't have the query registered, continue\n if (!entry) {\n continue;\n }\n\n if (error.error === 'app' || error.error === 'parse') {\n entry.gotCallbacks.forEach(callback => callback(false, error));\n }\n // this code path is not possible technically since errors were never implemented in the legacy query transform error\n // but is included for backwards compatibility and we have a test case for it\n else {\n this.#onFatalError(\n new ProtocolError({\n kind: ErrorKind.TransformFailed,\n origin: ErrorOrigin.ZeroCache,\n reason: ErrorReason.Internal,\n message: `Unknown error transforming queries: ${JSON.stringify(error)}`,\n queryIDs: [],\n }),\n );\n // unreachable(error); TODO(0xcadams): this should eventually be unreachable\n }\n }\n }\n\n handleClosed(\n reason: ClientError<{kind: ClientErrorKind.ClientClosed; message: string}>,\n ) {\n if (this.#closedError) {\n return;\n }\n this.#closedError = reason;\n for (const [queryId, entry] of this.#queries) {\n const erroredQuery: ErroredQuery = {\n error: 'app',\n id: queryId,\n name: entry.name ?? 'legacy',\n message: reason.message,\n details: {kind: reason.kind},\n };\n for (const gotCallback of entry.gotCallbacks) {\n gotCallback(false, erroredQuery);\n }\n }\n }\n\n addCustom(\n ast: AST,\n {name, args}: CustomQueryID,\n ttl: TTL,\n gotCallback?: GotCallback,\n ): () => void {\n const normalized = normalizeAST(ast);\n const queryId = hashOfNameAndArgs(name, args);\n return this.#add(queryId, normalized, name, args, ttl, gotCallback);\n }\n\n addLegacy(ast: AST, ttl: TTL, gotCallback?: GotCallback): () => void {\n const normalized = normalizeAST(ast);\n const astHash = hashOfAST(normalized);\n return this.#add(\n astHash,\n normalized,\n undefined, // name is undefined for legacy queries\n undefined, // args are undefined for legacy queries\n ttl,\n gotCallback,\n );\n }\n\n #add(\n queryId: string,\n normalized: AST,\n name: string | undefined,\n args: readonly ReadonlyJSONValue[] | undefined,\n ttl: TTL,\n gotCallback?: GotCallback,\n ) {\n assert(\n (name === undefined) === (args === undefined),\n 'If name is defined, args must be defined',\n );\n ttl = clampTTL(ttl, this.#lc);\n let entry = this.#queries.get(queryId);\n this.#recentQueries.delete(queryId);\n if (!entry) {\n normalized = mapAST(normalized, this.#clientToServer);\n\n entry = {\n normalized,\n name,\n args,\n count: 1,\n gotCallbacks: gotCallback ? [gotCallback] : [],\n ttl,\n };\n this.#queries.set(queryId, entry);\n this.#queueQueryChange({\n op: 'put',\n hash: queryId,\n ast: name === undefined ? normalized : undefined,\n name,\n args,\n ttl,\n });\n } else {\n ++entry.count;\n this.#updateEntry(entry, queryId, ttl);\n\n if (gotCallback) {\n entry.gotCallbacks.push(gotCallback);\n }\n }\n\n if (gotCallback) {\n gotCallback(this.#gotQueries.has(queryId));\n }\n\n let removed = false;\n const cleanupCb = () => {\n if (removed) {\n return;\n }\n removed = true;\n\n // We cannot remove queries while mutations are pending\n // as that could take data out of scope that is needed in a rebase\n if (this.#mutationTracker.size > 0) {\n this.#pendingRemovals.push(() =>\n this.#remove(entry, queryId, gotCallback),\n );\n return;\n }\n\n this.#remove(entry, queryId, gotCallback);\n };\n return cleanupCb;\n }\n\n updateCustom({name, args}: CustomQueryID, ttl: TTL) {\n const queryID = hashOfNameAndArgs(name, args);\n const entry = must(this.#queries.get(queryID));\n this.#updateEntry(entry, queryID, ttl);\n }\n\n updateLegacy(ast: AST, ttl: TTL) {\n const normalized = normalizeAST(ast);\n const queryID = hashOfAST(normalized);\n const entry = must(this.#queries.get(queryID));\n this.#updateEntry(entry, queryID, ttl);\n }\n\n #updateEntry(entry: Entry, queryID: string, ttl: TTL): void {\n // If the query already exists and the new ttl is larger than the old one\n // we send a changeDesiredQueries message to the server to update the ttl.\n ttl = clampTTL(ttl, this.#lc);\n if (compareTTL(ttl, entry.ttl) > 0) {\n entry.ttl = ttl;\n this.#queueQueryChange({\n op: 'put',\n hash: queryID,\n ast: entry.name === undefined ? entry.normalized : undefined,\n name: entry.name,\n args: entry.args,\n ttl,\n });\n }\n }\n\n #queueQueryChange(op: UpQueriesPatchOp) {\n this.#pendingQueryChanges.push(op);\n this.#scheduleBatch();\n }\n\n #scheduleBatch() {\n if (this.#batchTimer === undefined) {\n this.#batchTimer = setTimeout(\n () => this.flushBatch(),\n this.#queryChangeThrottleMs,\n );\n }\n }\n\n flushBatch() {\n if (this.#batchTimer !== undefined) {\n clearTimeout(this.#batchTimer);\n this.#batchTimer = undefined;\n }\n if (this.#pendingQueryChanges.length > 0) {\n this.#send([\n 'changeDesiredQueries',\n {\n desiredQueriesPatch: [...this.#pendingQueryChanges],\n },\n ]);\n this.#pendingQueryChanges.length = 0;\n }\n }\n\n #remove(entry: Entry, astHash: string, gotCallback: GotCallback | undefined) {\n if (gotCallback) {\n const index = entry.gotCallbacks.indexOf(gotCallback);\n entry.gotCallbacks.splice(index, 1);\n }\n --entry.count;\n if (entry.count === 0) {\n this.#recentQueries.add(astHash);\n if (this.#recentQueries.size > this.#recentQueriesMaxSize) {\n const lruQueryID = this.#recentQueries.values().next().value;\n assert(lruQueryID, 'Expected LRU query ID to exist');\n this.#queries.delete(lruQueryID);\n this.#recentQueries.delete(lruQueryID);\n this.#queryMetrics.delete(lruQueryID);\n this.#queueQueryChange({op: 'del', hash: lruQueryID});\n }\n }\n }\n\n /**\n * Gets the aggregated metrics for all queries managed by this QueryManager.\n */\n get metrics(): ClientMetric {\n return this.#metrics;\n }\n\n addMetric<K extends keyof ClientMetricMap>(\n metric: K,\n value: number,\n ...args: ClientMetricMap[K]\n ): void {\n // Only query metrics are tracked at this point.\n // If this check fails then we need to add a runtime check.\n metric satisfies `query-${string}`;\n\n // We track all materializations of queries as well as per\n // query materializations.\n this.#metrics[metric].add(value);\n\n const queryID = args[0];\n\n // Handle slow query logging for end-to-end materialization\n if (metric === 'query-materialization-end-to-end') {\n const ast = args[1];\n\n if (\n this.#slowMaterializeThreshold !== undefined &&\n value > this.#slowMaterializeThreshold\n ) {\n this.#lc.warn?.(\n 'Slow query materialization (including server/network)',\n queryID,\n ast,\n value,\n );\n } else {\n this.#lc.debug?.(\n 'Materialized query (including server/network)',\n queryID,\n ast,\n value,\n );\n }\n }\n\n // The query manager manages metrics that are per query.\n let existing = this.#queryMetrics.get(queryID);\n if (!existing) {\n existing = newMetrics();\n this.#queryMetrics.set(queryID, existing);\n }\n existing[metric].add(value);\n }\n\n getQueryMetrics(queryID: string): ClientMetric | undefined {\n return this.#queryMetrics.get(queryID);\n }\n\n /**\n * For testing only: returns all query hashes currently registered.\n */\n getAllNonGotQueryHashes(): Iterable<string> {\n return difference(this.#queries, this.#gotQueries);\n }\n}\n\nfunction newMetrics(): ClientMetric {\n return {\n 'query-materialization-client': new TDigest(),\n 'query-materialization-end-to-end': new TDigest(),\n 'query-update-client': new TDigest(),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA+DA,IAAa,eAAb,MAAuD;CACrD;CACA;CACA;CACA;CACA;CACA,2BAA2C,IAAI,KAAK;CACpD;CACA,iCAAuC,IAAI,KAAK;CAChD,8BAAoC,IAAI,KAAK;CAC7C;CACA,uBAAoD,EAAE;CACtD;CACA,mBAAsC,EAAE;CACxC;CACA;CACA,WAAkC,YAAY;CAC9C,gCAAoD,IAAI,KAAK;CAC7D;CACA;CAEA,YACE,IACA,iBACA,UACA,QACA,MACA,mBACA,sBACA,uBACA,0BACA,cACA;AACA,QAAA,KAAW,GAAG,YAAY,eAAe;AACzC,QAAA,WAAiB;AACjB,QAAA,iBAAuB,eAAe,OAAO;AAC7C,QAAA,iBAAuB,eAAe,OAAO;AAC7C,QAAA,uBAA6B;AAC7B,QAAA,OAAa;AACb,QAAA,kBAAwB;AACxB,QAAA,wBAA8B;AAC9B,QAAA,2BAAiC;AACjC,QAAA,eAAqB;AACrB,QAAA,gBAAsB,4BAA4B;AAChD,OAAI,MAAA,gBAAsB,WAAW,EACnC;GAEF,MAAM,kBAAkB,MAAA;AACxB,SAAA,kBAAwB,EAAE;AAC1B,QAAK,MAAM,WAAW,gBACpB,UAAS;IAEX;AAEF,qBACE,SAAQ;AACN,QAAK,MAAM,UAAU,MAAM;IACzB,MAAM,YAAY,OAAO,IAAI,UAAA,EAAwC;AACrE,YAAQ,OAAO,IAAf;KACE,KAAK;AACH,YAAA,WAAiB,IAAI,UAAU;AAC/B,YAAA,iBAAuB,WAAW,KAAK;AACvC;KACF,KAAK;AACH,YAAA,WAAiB,OAAO,UAAU;AAClC,YAAA,iBAAuB,WAAW,MAAM;AACxC;;;KAIR;GACE,QAAA;GACA,0BAA0B;GAC3B,CACF;;CAGH,OAAO,SAAkC;EACvC,MAAM,MAAM,MAAA,QAAc,IAAI,QAAQ,EAAE;AACxC,SAAO,OAAO,OAAO,KAAK,MAAA,eAAqB;;CAGjD,qBAAqB,KAAe;AAClC,SAAO,OAAO,KAAK,MAAA,eAAqB;;CAG1C,kBAAkB,WAAmB,KAAc;EACjD,MAAM,eAAe,MAAA,QAAc,IAAI,UAAU,EAAE,gBAAgB,EAAE;AACrE,OAAK,MAAM,eAAe,aACxB,aAAY,IAAI;;;;;;;;;;;;;;;;;CAmBpB,MAAM,gBACJ,IACA,WACwC;EACxC,MAAM,sCAAsB,IAAI,KAAa;EAC7C,MAAM,SAAS,8BAA8B,MAAA,SAAe;AAC5D,aAAW,MAAM,OAAO,GAAG,KAAK,EAAC,QAAO,CAAC,CAAC,MAAM,CAC9C,qBAAoB,IAAI,IAAI,UAAU,OAAO,QAAQ,IAAI,OAAO,CAAC;EAEnE,MAAM,wBAAuC,IAAI,KAAK;AACtD,OAAK,MAAM,QAAQ,oBACjB,KAAI,CAAC,MAAA,QAAc,IAAI,KAAK,CAC1B,OAAM,IAAI,MAAM;GAAC,IAAI;GAAO;GAAK,CAAC;AAItC,OAAK,MAAM,CAAC,MAAM,EAAC,YAAY,KAAK,MAAM,WAAU,MAAA,QAClD,KAAI,CAAC,oBAAoB,IAAI,KAAK,CAChC,OAAM,IAAI,MAAM;GACd,IAAI;GACJ;GACA,KAAK,SAAS,KAAA,IAAY,aAAa,KAAA;GACvC;GACA;GAGA,KAAK,SAAS,IAAI;GACnB,CAAC;AAIN,MAAI,WAAW;AAGb,QAAK,MAAM,CAAC,MAAM,EAAC,SAAQ,UACzB,KAAI,OAAO,SAAS,CAAC,MAAM,IAAI,KAAK,CAClC,OAAM,IAAI,MAAM;IAAC,IAAI;IAAO;IAAK,CAAC;AAItC,QAAK,MAAM,CAAC,MAAM,EAAC,SAAQ,OAAO;IAChC,MAAM,cAAc,UAAU,IAAI,KAAK;AACvC,QAAI,eAAe,YAAY,OAAO,GACpC,OAAM,OAAO,KAAK;;;AAKxB,SAAO;;CAGT,sBAAsB,QAAwB;AAC5C,OAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,UAAU,MAAM;GACtB,MAAM,QAAQ,MAAA,QAAc,IAAI,QAAQ;AAGxC,OAAI,CAAC,MACH;AAGF,OAAI,MAAM,UAAU,SAAS,MAAM,UAAU,QAC3C,OAAM,aAAa,SAAQ,aAAY,SAAS,OAAO,MAAM,CAAC;OAK9D,OAAA,aACE,IAAI,cAAc;IAChB,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS,uCAAuC,KAAK,UAAU,MAAM;IACrE,UAAU,EAAE;IACb,CAAC,CACH;;;CAMP,aACE,QACA;AACA,MAAI,MAAA,YACF;AAEF,QAAA,cAAoB;AACpB,OAAK,MAAM,CAAC,SAAS,UAAU,MAAA,SAAe;GAC5C,MAAM,eAA6B;IACjC,OAAO;IACP,IAAI;IACJ,MAAM,MAAM,QAAQ;IACpB,SAAS,OAAO;IAChB,SAAS,EAAC,MAAM,OAAO,MAAK;IAC7B;AACD,QAAK,MAAM,eAAe,MAAM,aAC9B,aAAY,OAAO,aAAa;;;CAKtC,UACE,KACA,EAAC,MAAM,QACP,KACA,aACY;EACZ,MAAM,aAAa,aAAa,IAAI;EACpC,MAAM,UAAU,kBAAkB,MAAM,KAAK;AAC7C,SAAO,MAAA,IAAU,SAAS,YAAY,MAAM,MAAM,KAAK,YAAY;;CAGrE,UAAU,KAAU,KAAU,aAAuC;EACnE,MAAM,aAAa,aAAa,IAAI;EACpC,MAAM,UAAU,UAAU,WAAW;AACrC,SAAO,MAAA,IACL,SACA,YACA,KAAA,GACA,KAAA,GACA,KACA,YACD;;CAGH,KACE,SACA,YACA,MACA,MACA,KACA,aACA;AACA,SACG,SAAS,KAAA,OAAgB,SAAS,KAAA,IACnC,2CACD;AACD,QAAM,SAAS,KAAK,MAAA,GAAS;EAC7B,IAAI,QAAQ,MAAA,QAAc,IAAI,QAAQ;AACtC,QAAA,cAAoB,OAAO,QAAQ;AACnC,MAAI,CAAC,OAAO;AACV,gBAAa,OAAO,YAAY,MAAA,eAAqB;AAErD,WAAQ;IACN;IACA;IACA;IACA,OAAO;IACP,cAAc,cAAc,CAAC,YAAY,GAAG,EAAE;IAC9C;IACD;AACD,SAAA,QAAc,IAAI,SAAS,MAAM;AACjC,SAAA,iBAAuB;IACrB,IAAI;IACJ,MAAM;IACN,KAAK,SAAS,KAAA,IAAY,aAAa,KAAA;IACvC;IACA;IACA;IACD,CAAC;SACG;AACL,KAAE,MAAM;AACR,SAAA,YAAkB,OAAO,SAAS,IAAI;AAEtC,OAAI,YACF,OAAM,aAAa,KAAK,YAAY;;AAIxC,MAAI,YACF,aAAY,MAAA,WAAiB,IAAI,QAAQ,CAAC;EAG5C,IAAI,UAAU;EACd,MAAM,kBAAkB;AACtB,OAAI,QACF;AAEF,aAAU;AAIV,OAAI,MAAA,gBAAsB,OAAO,GAAG;AAClC,UAAA,gBAAsB,WACpB,MAAA,OAAa,OAAO,SAAS,YAAY,CAC1C;AACD;;AAGF,SAAA,OAAa,OAAO,SAAS,YAAY;;AAE3C,SAAO;;CAGT,aAAa,EAAC,MAAM,QAAsB,KAAU;EAClD,MAAM,UAAU,kBAAkB,MAAM,KAAK;EAC7C,MAAM,QAAQ,KAAK,MAAA,QAAc,IAAI,QAAQ,CAAC;AAC9C,QAAA,YAAkB,OAAO,SAAS,IAAI;;CAGxC,aAAa,KAAU,KAAU;EAE/B,MAAM,UAAU,UADG,aAAa,IAAI,CACC;EACrC,MAAM,QAAQ,KAAK,MAAA,QAAc,IAAI,QAAQ,CAAC;AAC9C,QAAA,YAAkB,OAAO,SAAS,IAAI;;CAGxC,aAAa,OAAc,SAAiB,KAAgB;AAG1D,QAAM,SAAS,KAAK,MAAA,GAAS;AAC7B,MAAI,WAAW,KAAK,MAAM,IAAI,GAAG,GAAG;AAClC,SAAM,MAAM;AACZ,SAAA,iBAAuB;IACrB,IAAI;IACJ,MAAM;IACN,KAAK,MAAM,SAAS,KAAA,IAAY,MAAM,aAAa,KAAA;IACnD,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ;IACD,CAAC;;;CAIN,kBAAkB,IAAsB;AACtC,QAAA,oBAA0B,KAAK,GAAG;AAClC,QAAA,eAAqB;;CAGvB,iBAAiB;AACf,MAAI,MAAA,eAAqB,KAAA,EACvB,OAAA,aAAmB,iBACX,KAAK,YAAY,EACvB,MAAA,sBACD;;CAIL,aAAa;AACX,MAAI,MAAA,eAAqB,KAAA,GAAW;AAClC,gBAAa,MAAA,WAAiB;AAC9B,SAAA,aAAmB,KAAA;;AAErB,MAAI,MAAA,oBAA0B,SAAS,GAAG;AACxC,SAAA,KAAW,CACT,wBACA,EACE,qBAAqB,CAAC,GAAG,MAAA,oBAA0B,EACpD,CACF,CAAC;AACF,SAAA,oBAA0B,SAAS;;;CAIvC,QAAQ,OAAc,SAAiB,aAAsC;AAC3E,MAAI,aAAa;GACf,MAAM,QAAQ,MAAM,aAAa,QAAQ,YAAY;AACrD,SAAM,aAAa,OAAO,OAAO,EAAE;;AAErC,IAAE,MAAM;AACR,MAAI,MAAM,UAAU,GAAG;AACrB,SAAA,cAAoB,IAAI,QAAQ;AAChC,OAAI,MAAA,cAAoB,OAAO,MAAA,sBAA4B;IACzD,MAAM,aAAa,MAAA,cAAoB,QAAQ,CAAC,MAAM,CAAC;AACvD,WAAO,YAAY,iCAAiC;AACpD,UAAA,QAAc,OAAO,WAAW;AAChC,UAAA,cAAoB,OAAO,WAAW;AACtC,UAAA,aAAmB,OAAO,WAAW;AACrC,UAAA,iBAAuB;KAAC,IAAI;KAAO,MAAM;KAAW,CAAC;;;;;;;CAQ3D,IAAI,UAAwB;AAC1B,SAAO,MAAA;;CAGT,UACE,QACA,OACA,GAAG,MACG;AAON,QAAA,QAAc,QAAQ,IAAI,MAAM;EAEhC,MAAM,UAAU,KAAK;AAGrB,MAAI,WAAW,oCAAoC;GACjD,MAAM,MAAM,KAAK;AAEjB,OACE,MAAA,6BAAmC,KAAA,KACnC,QAAQ,MAAA,yBAER,OAAA,GAAS,OACP,yDACA,SACA,KACA,MACD;OAED,OAAA,GAAS,QACP,iDACA,SACA,KACA,MACD;;EAKL,IAAI,WAAW,MAAA,aAAmB,IAAI,QAAQ;AAC9C,MAAI,CAAC,UAAU;AACb,cAAW,YAAY;AACvB,SAAA,aAAmB,IAAI,SAAS,SAAS;;AAE3C,WAAS,QAAQ,IAAI,MAAM;;CAG7B,gBAAgB,SAA2C;AACzD,SAAO,MAAA,aAAmB,IAAI,QAAQ;;;;;CAMxC,0BAA4C;AAC1C,SAAO,WAAW,MAAA,SAAe,MAAA,WAAiB;;;AAItD,SAAS,aAA2B;AAClC,QAAO;EACL,gCAAgC,IAAI,SAAS;EAC7C,oCAAoC,IAAI,SAAS;EACjD,uBAAuB,IAAI,SAAS;EACrC"}
|
|
1
|
+
{"version":3,"file":"query-manager.js","names":["#clientID","#clientToServer","#serverToClient","#send","#onFatalError","#queries","#recentQueriesMaxSize","#recentQueries","#gotQueries","#mutationTracker","#pendingQueryChanges","#queryChangeThrottleMs","#lc","#metrics","#queryMetrics","#slowMaterializeThreshold","#pendingRemovals","#fireGotCallbacks","#queryEvictedCallback","#closedError","#add","#queueQueryChange","#updateEntry","#remove","#scheduleBatch","#batchTimer"],"sources":["../../../../../zero-client/src/client/query-manager.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {ReplicacheImpl} from '../../../replicache/src/replicache-impl.ts';\nimport type {ClientID} from '../../../replicache/src/sync/ids.ts';\nimport {assert, unreachable} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {must} from '../../../shared/src/must.ts';\nimport {difference} from '../../../shared/src/set-utils.ts';\nimport {TDigest} from '../../../shared/src/tdigest.ts';\nimport {\n mapAST,\n normalizeAST,\n type AST,\n} from '../../../zero-protocol/src/ast.ts';\nimport type {ChangeDesiredQueriesMessage} from '../../../zero-protocol/src/change-desired-queries.ts';\nimport type {ErroredQuery} from '../../../zero-protocol/src/custom-queries.ts';\nimport {ErrorKind} from '../../../zero-protocol/src/error-kind.ts';\nimport {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts';\nimport {ErrorReason} from '../../../zero-protocol/src/error-reason.ts';\nimport {ProtocolError} from '../../../zero-protocol/src/error.ts';\nimport type {UpQueriesPatchOp} from '../../../zero-protocol/src/queries-patch.ts';\nimport {\n hashOfAST,\n hashOfNameAndArgs,\n} from '../../../zero-protocol/src/query-hash.ts';\nimport {\n clientToServer,\n serverToClient,\n type NameMapper,\n} from '../../../zero-schema/src/name-mapper.ts';\nimport type {TableSchema} from '../../../zero-schema/src/table-schema.ts';\nimport type {ClientMetricMap} from '../../../zql/src/query/metrics-delegate.ts';\nimport type {CustomQueryID} from '../../../zql/src/query/named.ts';\nimport type {GotCallback} from '../../../zql/src/query/query-delegate.ts';\nimport {clampTTL, compareTTL, type TTL} from '../../../zql/src/query/ttl.ts';\nimport type {ClientErrorKind} from './client-error-kind.ts';\nimport type {ClientError} from './error.ts';\nimport {type ZeroError} from './error.ts';\nimport type {InspectorDelegate} from './inspector/inspector.ts';\nimport type {QueryClientMetrics} from './inspector/lazy-inspector.ts';\nimport {desiredQueriesPrefixForClient, GOT_QUERIES_KEY_PREFIX} from './keys.ts';\nimport type {MutationTracker} from './mutation-tracker.ts';\nimport type {ReadTransaction} from './replicache-types.ts';\n\ntype QueryHash = string;\n\ntype Entry = {\n // We keep track of the AST so we can use it in the inspector.\n normalized: AST;\n name: string | undefined;\n args: readonly ReadonlyJSONValue[] | undefined;\n count: number;\n gotCallbacks: GotCallback[];\n ttl: TTL;\n};\n\ntype ClientMetric = {\n [K in keyof ClientMetricMap]: TDigest;\n};\n\ntype PerQueryClientMetric = {\n 'query-materialization-client': number | undefined;\n 'query-materialization-end-to-end': number | undefined;\n 'query-update-client': TDigest;\n};\n\n/**\n * Tracks what queries the client is currently subscribed to on the server.\n * Sends `changeDesiredQueries` message to server when this changes.\n * Deduplicates requests so that we only listen to a given unique query once.\n */\nexport class QueryManager implements InspectorDelegate {\n readonly #clientID: ClientID;\n readonly #clientToServer: NameMapper;\n readonly #serverToClient: NameMapper;\n readonly #send: (change: ChangeDesiredQueriesMessage) => void;\n readonly #onFatalError: (error: ZeroError) => void;\n readonly #queries: Map<QueryHash, Entry> = new Map();\n readonly #recentQueriesMaxSize: number;\n readonly #recentQueries: Set<string> = new Set();\n readonly #gotQueries: Set<string> = new Set();\n readonly #mutationTracker: MutationTracker;\n readonly #pendingQueryChanges: UpQueriesPatchOp[] = [];\n readonly #queryChangeThrottleMs: number;\n #pendingRemovals: Array<() => void> = [];\n #batchTimer: ReturnType<typeof setTimeout> | undefined;\n readonly #lc: LogContext;\n readonly #metrics: ClientMetric = newMetrics();\n readonly #queryMetrics: Map<string, PerQueryClientMetric> = new Map();\n readonly #slowMaterializeThreshold: number;\n #closedError: ZeroError | undefined;\n #queryEvictedCallback:\n | ((hash: string, ast: AST, metrics: QueryClientMetrics) => void)\n | undefined;\n\n constructor(\n lc: LogContext,\n mutationTracker: MutationTracker,\n clientID: ClientID,\n tables: Record<string, TableSchema>,\n send: (change: ChangeDesiredQueriesMessage) => void,\n experimentalWatch: ReplicacheImpl['experimentalWatch'],\n recentQueriesMaxSize: number,\n queryChangeThrottleMs: number,\n slowMaterializeThreshold: number,\n onFatalError: (error: ZeroError) => void,\n ) {\n this.#lc = lc.withContext('QueryManager');\n this.#clientID = clientID;\n this.#clientToServer = clientToServer(tables);\n this.#serverToClient = serverToClient(tables);\n this.#recentQueriesMaxSize = recentQueriesMaxSize;\n this.#send = send;\n this.#mutationTracker = mutationTracker;\n this.#queryChangeThrottleMs = queryChangeThrottleMs;\n this.#slowMaterializeThreshold = slowMaterializeThreshold;\n this.#onFatalError = onFatalError;\n this.#mutationTracker.onAllMutationsApplied(() => {\n if (this.#pendingRemovals.length === 0) {\n return;\n }\n const pendingRemovals = this.#pendingRemovals;\n this.#pendingRemovals = [];\n for (const removal of pendingRemovals) {\n removal();\n }\n });\n\n experimentalWatch(\n diff => {\n for (const diffOp of diff) {\n const queryHash = diffOp.key.substring(GOT_QUERIES_KEY_PREFIX.length);\n switch (diffOp.op) {\n case 'add':\n this.#gotQueries.add(queryHash);\n this.#fireGotCallbacks(queryHash, true);\n break;\n case 'del':\n this.#gotQueries.delete(queryHash);\n this.#fireGotCallbacks(queryHash, false);\n break;\n }\n }\n },\n {\n prefix: GOT_QUERIES_KEY_PREFIX,\n initialValuesInFirstDiff: true,\n },\n );\n }\n\n getAST(queryID: string): AST | undefined {\n const ast = this.#queries.get(queryID)?.normalized;\n return ast && mapAST(ast, this.#serverToClient);\n }\n\n setQueryEvictedCallback(\n cb: (hash: string, ast: AST, metrics: QueryClientMetrics) => void,\n ): void {\n this.#queryEvictedCallback = cb;\n }\n\n mapClientASTToServer(ast: AST): AST {\n return mapAST(ast, this.#clientToServer);\n }\n\n #fireGotCallbacks(queryHash: string, got: boolean) {\n const gotCallbacks = this.#queries.get(queryHash)?.gotCallbacks ?? [];\n for (const gotCallback of gotCallbacks) {\n gotCallback(got);\n }\n }\n\n /**\n * Get the queries that need to be registered with the server.\n *\n * An optional `lastPatch` can be provided. This is the last patch that was\n * sent to the server and may not yet have been acked. If `lastPatch` is provided,\n * this method will return a patch that does not include any events sent in `lastPatch`.\n *\n * This diffing of last patch and current patch is needed since we send\n * a set of queries to the server when we first connect inside of the `sec-protocol` as\n * the `initConnectionMessage`.\n *\n * While we're waiting for the `connected` response to come back from the server,\n * the client may have registered more queries. We need to diff the `initConnectionMessage`\n * queries with the current set of queries to understand what those were.\n */\n async getQueriesPatch(\n tx: ReadTransaction,\n lastPatch?: Map<string, UpQueriesPatchOp>,\n ): Promise<Map<string, UpQueriesPatchOp>> {\n const existingQueryHashes = new Set<string>();\n const prefix = desiredQueriesPrefixForClient(this.#clientID);\n for await (const key of tx.scan({prefix}).keys()) {\n existingQueryHashes.add(key.substring(prefix.length, key.length));\n }\n const patch: Map<string, UpQueriesPatchOp> = new Map();\n for (const hash of existingQueryHashes) {\n if (!this.#queries.has(hash)) {\n patch.set(hash, {op: 'del', hash});\n }\n }\n\n for (const [hash, {normalized, ttl, name, args}] of this.#queries) {\n if (!existingQueryHashes.has(hash)) {\n patch.set(hash, {\n op: 'put',\n hash,\n ast: name === undefined ? normalized : undefined,\n name,\n args,\n // We get TTL out of the DagStore so it is possible that the TTL was written\n // with a too high TTL.\n ttl: clampTTL(ttl), // no lc here since no need to log here\n });\n }\n }\n\n if (lastPatch) {\n // if there are any `puts` in `lastPatch` that are not in `patch` then we need to\n // send a `del` event in `patch`.\n for (const [hash, {op}] of lastPatch) {\n if (op === 'put' && !patch.has(hash)) {\n patch.set(hash, {op: 'del', hash});\n }\n }\n // Remove everything from `patch` that was already sent in `lastPatch`.\n for (const [hash, {op}] of patch) {\n const lastPatchOp = lastPatch.get(hash);\n if (lastPatchOp && lastPatchOp.op === op) {\n patch.delete(hash);\n }\n }\n }\n\n return patch;\n }\n\n handleTransformErrors(errors: ErroredQuery[]) {\n for (const error of errors) {\n const queryId = error.id;\n const entry = this.#queries.get(queryId);\n\n // if we don't have the query registered, continue\n if (!entry) {\n continue;\n }\n\n if (error.error === 'app' || error.error === 'parse') {\n entry.gotCallbacks.forEach(callback => callback(false, error));\n }\n // this code path is not possible technically since errors were never implemented in the legacy query transform error\n // but is included for backwards compatibility and we have a test case for it\n else {\n this.#onFatalError(\n new ProtocolError({\n kind: ErrorKind.TransformFailed,\n origin: ErrorOrigin.ZeroCache,\n reason: ErrorReason.Internal,\n message: `Unknown error transforming queries: ${JSON.stringify(error)}`,\n queryIDs: [],\n }),\n );\n // unreachable(error); TODO(0xcadams): this should eventually be unreachable\n }\n }\n }\n\n handleClosed(\n reason: ClientError<{kind: ClientErrorKind.ClientClosed; message: string}>,\n ) {\n if (this.#closedError) {\n return;\n }\n this.#closedError = reason;\n for (const [queryId, entry] of this.#queries) {\n const erroredQuery: ErroredQuery = {\n error: 'app',\n id: queryId,\n name: entry.name ?? 'legacy',\n message: reason.message,\n details: {kind: reason.kind},\n };\n for (const gotCallback of entry.gotCallbacks) {\n gotCallback(false, erroredQuery);\n }\n }\n }\n\n addCustom(\n ast: AST,\n {name, args}: CustomQueryID,\n ttl: TTL,\n gotCallback?: GotCallback,\n ): () => void {\n const normalized = normalizeAST(ast);\n const queryId = hashOfNameAndArgs(name, args);\n return this.#add(queryId, normalized, name, args, ttl, gotCallback);\n }\n\n addLegacy(ast: AST, ttl: TTL, gotCallback?: GotCallback): () => void {\n const normalized = normalizeAST(ast);\n const astHash = hashOfAST(normalized);\n return this.#add(\n astHash,\n normalized,\n undefined, // name is undefined for legacy queries\n undefined, // args are undefined for legacy queries\n ttl,\n gotCallback,\n );\n }\n\n #add(\n queryId: string,\n normalized: AST,\n name: string | undefined,\n args: readonly ReadonlyJSONValue[] | undefined,\n ttl: TTL,\n gotCallback?: GotCallback,\n ) {\n assert(\n (name === undefined) === (args === undefined),\n 'If name is defined, args must be defined',\n );\n ttl = clampTTL(ttl, this.#lc);\n let entry = this.#queries.get(queryId);\n this.#recentQueries.delete(queryId);\n if (!entry) {\n normalized = mapAST(normalized, this.#clientToServer);\n\n entry = {\n normalized,\n name,\n args,\n count: 1,\n gotCallbacks: gotCallback ? [gotCallback] : [],\n ttl,\n };\n this.#queries.set(queryId, entry);\n this.#queueQueryChange({\n op: 'put',\n hash: queryId,\n ast: name === undefined ? normalized : undefined,\n name,\n args,\n ttl,\n });\n } else {\n ++entry.count;\n this.#updateEntry(entry, queryId, ttl);\n\n if (gotCallback) {\n entry.gotCallbacks.push(gotCallback);\n }\n }\n\n if (gotCallback) {\n gotCallback(this.#gotQueries.has(queryId));\n }\n\n let removed = false;\n const cleanupCb = () => {\n if (removed) {\n return;\n }\n removed = true;\n\n // We cannot remove queries while mutations are pending\n // as that could take data out of scope that is needed in a rebase\n if (this.#mutationTracker.size > 0) {\n this.#pendingRemovals.push(() =>\n this.#remove(entry, queryId, gotCallback),\n );\n return;\n }\n\n this.#remove(entry, queryId, gotCallback);\n };\n return cleanupCb;\n }\n\n updateCustom({name, args}: CustomQueryID, ttl: TTL) {\n const queryID = hashOfNameAndArgs(name, args);\n const entry = must(this.#queries.get(queryID));\n this.#updateEntry(entry, queryID, ttl);\n }\n\n updateLegacy(ast: AST, ttl: TTL) {\n const normalized = normalizeAST(ast);\n const queryID = hashOfAST(normalized);\n const entry = must(this.#queries.get(queryID));\n this.#updateEntry(entry, queryID, ttl);\n }\n\n #updateEntry(entry: Entry, queryID: string, ttl: TTL): void {\n // If the query already exists and the new ttl is larger than the old one\n // we send a changeDesiredQueries message to the server to update the ttl.\n ttl = clampTTL(ttl, this.#lc);\n if (compareTTL(ttl, entry.ttl) > 0) {\n entry.ttl = ttl;\n this.#queueQueryChange({\n op: 'put',\n hash: queryID,\n ast: entry.name === undefined ? entry.normalized : undefined,\n name: entry.name,\n args: entry.args,\n ttl,\n });\n }\n }\n\n #queueQueryChange(op: UpQueriesPatchOp) {\n this.#pendingQueryChanges.push(op);\n this.#scheduleBatch();\n }\n\n #scheduleBatch() {\n if (this.#batchTimer === undefined) {\n this.#batchTimer = setTimeout(\n () => this.flushBatch(),\n this.#queryChangeThrottleMs,\n );\n }\n }\n\n flushBatch() {\n if (this.#batchTimer !== undefined) {\n clearTimeout(this.#batchTimer);\n this.#batchTimer = undefined;\n }\n if (this.#pendingQueryChanges.length > 0) {\n this.#send([\n 'changeDesiredQueries',\n {\n desiredQueriesPatch: [...this.#pendingQueryChanges],\n },\n ]);\n this.#pendingQueryChanges.length = 0;\n }\n }\n\n #remove(entry: Entry, astHash: string, gotCallback: GotCallback | undefined) {\n if (gotCallback) {\n const index = entry.gotCallbacks.indexOf(gotCallback);\n entry.gotCallbacks.splice(index, 1);\n }\n --entry.count;\n if (entry.count === 0) {\n this.#recentQueries.add(astHash);\n if (this.#recentQueries.size > this.#recentQueriesMaxSize) {\n const lruQueryID = this.#recentQueries.values().next().value;\n assert(lruQueryID, 'Expected LRU query ID to exist');\n const evictedAST = this.getAST(lruQueryID);\n const evictedMetrics = this.#queryMetrics.get(lruQueryID);\n this.#queries.delete(lruQueryID);\n this.#recentQueries.delete(lruQueryID);\n this.#queryMetrics.delete(lruQueryID);\n this.#queueQueryChange({op: 'del', hash: lruQueryID});\n assert(evictedAST, 'Expected evicted AST to exist');\n assert(evictedMetrics, 'Expected evicted metrics to exist');\n this.#queryEvictedCallback?.(lruQueryID, evictedAST, evictedMetrics);\n }\n }\n }\n\n /**\n * Gets the aggregated metrics for all queries managed by this QueryManager.\n */\n get metrics(): ClientMetric {\n return this.#metrics;\n }\n\n addMetric<K extends keyof ClientMetricMap>(\n metric: K,\n value: number,\n ...args: ClientMetricMap[K]\n ): void {\n // Only query metrics are tracked at this point.\n // If this check fails then we need to add a runtime check.\n metric satisfies `query-${string}`;\n\n // We track all materializations of queries as well as per\n // query materializations.\n this.#metrics[metric].add(value);\n\n const queryID = args[0];\n\n // Handle slow query logging for end-to-end materialization\n if (metric === 'query-materialization-end-to-end') {\n const ast = args[1];\n\n if (\n this.#slowMaterializeThreshold !== undefined &&\n value > this.#slowMaterializeThreshold\n ) {\n this.#lc.warn?.(\n 'Slow query materialization (including server/network)',\n queryID,\n ast,\n value,\n );\n } else {\n this.#lc.debug?.(\n 'Materialized query (including server/network)',\n queryID,\n ast,\n value,\n );\n }\n }\n\n // The query manager manages metrics that are per query.\n let existing = this.#queryMetrics.get(queryID);\n if (!existing) {\n existing = newPerQueryMetrics();\n this.#queryMetrics.set(queryID, existing);\n }\n switch (metric) {\n case 'query-update-client':\n existing['query-update-client'].add(value);\n break;\n case 'query-materialization-client':\n case 'query-materialization-end-to-end':\n // Recorded once per query (last value wins).\n existing[\n metric as\n | 'query-materialization-client'\n | 'query-materialization-end-to-end'\n ] = value;\n break;\n default:\n unreachable(metric);\n }\n }\n\n getQueryMetrics(queryID: string): PerQueryClientMetric | undefined {\n return this.#queryMetrics.get(queryID);\n }\n\n /**\n * For testing only: returns all query hashes currently registered.\n */\n getAllNonGotQueryHashes(): Iterable<string> {\n return difference(this.#queries, this.#gotQueries);\n }\n}\n\nfunction newMetrics(): ClientMetric {\n return {\n 'query-materialization-client': new TDigest(),\n 'query-materialization-end-to-end': new TDigest(),\n 'query-update-client': new TDigest(),\n };\n}\n\nfunction newPerQueryMetrics(): PerQueryClientMetric {\n return {\n 'query-materialization-client': undefined,\n 'query-materialization-end-to-end': undefined,\n 'query-update-client': new TDigest(),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zero.d.ts","sourceRoot":"","sources":["../../../../../zero-client/src/client/zero.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAA8B,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAC,KAAK,QAAQ,EAAW,MAAM,oBAAoB,CAAC;AAG3D,OAAO,EACL,cAAc,EAEf,MAAM,iCAAiC,CAAC;AAGzC,OAAO,KAAK,EAAC,MAAM,EAAe,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAC,MAAM,EAAe,MAAM,mCAAmC,CAAC;AAE5E,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACT,MAAM,qCAAqC,CAAC;AAG7C,OAAO,KAAK,EACV,WAAW,EAEZ,MAAM,kCAAkC,CAAC;AAU1C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AAMnE,OAAO,EAAC,YAAY,EAAC,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"zero.d.ts","sourceRoot":"","sources":["../../../../../zero-client/src/client/zero.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { IDBDatabasesStore } from "../../../replicache/src/persist/idb-databases
|
|
|
10
10
|
import { dropDatabase } from "../../../replicache/src/persist/collect-idb-databases.js";
|
|
11
11
|
import { getErrorMessage } from "../../../shared/src/error.js";
|
|
12
12
|
import { must } from "../../../shared/src/must.js";
|
|
13
|
-
import "../../../zero-protocol/src/error-kind-enum.js";
|
|
13
|
+
import { ClientNotFound } from "../../../zero-protocol/src/error-kind-enum.js";
|
|
14
14
|
import { ProtocolError } from "../../../zero-protocol/src/error.js";
|
|
15
15
|
import { h64 } from "../../../shared/src/hash.js";
|
|
16
16
|
import "../../../zero-protocol/src/client-schema.js";
|
|
@@ -62,7 +62,6 @@ import { PokeHandler } from "./zero-poke-handler.js";
|
|
|
62
62
|
import { ZeroRep, fromReplicacheAuthToken, toReplicacheAuthToken } from "./zero-rep.js";
|
|
63
63
|
import { resolver } from "@rocicorp/resolver";
|
|
64
64
|
import { LogContext } from "@rocicorp/logger";
|
|
65
|
-
//#region ../zero-client/src/client/zero.ts
|
|
66
65
|
var RUN_LOOP_INTERVAL_MS = 5e3;
|
|
67
66
|
/**
|
|
68
67
|
* Default timeout for ping operations. Controls both:
|
|
@@ -261,7 +260,7 @@ var Zero = class Zero {
|
|
|
261
260
|
})).toString(36);
|
|
262
261
|
const storageScopedUserID = userID ?? "__anonymous__";
|
|
263
262
|
const replicacheOptions = {
|
|
264
|
-
schemaVersion: `
|
|
263
|
+
schemaVersion: `51.${hash}`,
|
|
265
264
|
logLevel: logOptions.logLevel,
|
|
266
265
|
logSinks: [logOptions.logSink],
|
|
267
266
|
mutators: replicacheMutators,
|
|
@@ -310,11 +309,13 @@ var Zero = class Zero {
|
|
|
310
309
|
this.#rep.onUpdateNeeded = (reason) => {
|
|
311
310
|
onUpdateNeededCallback(convertOnUpdateNeededReason(reason));
|
|
312
311
|
};
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
this.#rep.onClientStateNotFound =
|
|
312
|
+
this.#onClientStateNotFound = (kind, message) => {
|
|
313
|
+
if (onClientStateNotFound) onClientStateNotFound();
|
|
314
|
+
else reloadWithReason(this.#lc, this.#reload, kind, message);
|
|
315
|
+
};
|
|
316
|
+
this.#rep.onClientStateNotFound = () => {
|
|
317
|
+
this.#onClientStateNotFound(ClientNotFound, ON_CLIENT_STATE_NOT_FOUND_REASON_CLIENT);
|
|
318
|
+
};
|
|
318
319
|
const mutatorProxy = new MutatorProxy(this.#lc, this.#connectionManager, this.#mutationTracker);
|
|
319
320
|
const { mutators } = options;
|
|
320
321
|
const registeredMutators = new Set(isMutatorRegistry(mutators) ? iterateMutators(mutators) : void 0);
|
|
@@ -733,10 +734,10 @@ var Zero = class Zero {
|
|
|
733
734
|
});
|
|
734
735
|
} else if (kind === "ClientNotFound") {
|
|
735
736
|
await this.#rep.disableClientGroup();
|
|
736
|
-
this.#onClientStateNotFound
|
|
737
|
+
this.#onClientStateNotFound(kind, onClientStateNotFoundServerReason(message));
|
|
737
738
|
} else if (kind === "InvalidConnectionRequestLastMutationID" || kind === "InvalidConnectionRequestBaseCookie") {
|
|
738
739
|
await dropDatabase(this.#rep.idbName, { kvStore: this.#kvStore });
|
|
739
|
-
|
|
740
|
+
this.#onClientStateNotFound(kind, serverAheadReloadReason);
|
|
740
741
|
}
|
|
741
742
|
}
|
|
742
743
|
async #handleConnectedMessage(lc, connectedMessage) {
|
|
@@ -1386,7 +1387,7 @@ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigi
|
|
|
1386
1387
|
];
|
|
1387
1388
|
}
|
|
1388
1389
|
async function createConnectionURL(socketOrigin, clientID, clientGroupID, userID, baseCookie, lmid, wsid, rep, debugPerf, additionalConnectParams, lc) {
|
|
1389
|
-
const url = new URL(appendPath(socketOrigin, `/sync/
|
|
1390
|
+
const url = new URL(appendPath(socketOrigin, `/sync/v51/connect`));
|
|
1390
1391
|
const { searchParams } = url;
|
|
1391
1392
|
searchParams.set("clientID", clientID);
|
|
1392
1393
|
searchParams.set("clientGroupID", clientGroupID);
|