pbtsdb 0.9.2 → 0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/expand-paths.ts","../src/logger.ts","../src/records.ts","../src/expand-filing.ts","../src/keyed-where.ts","../src/pocketbase-query-converter.ts","../src/pocketbase-limits.ts","../src/fetch-records.ts","../src/held-targets.ts","../src/request.ts","../src/loaded-subsets.ts","../src/filter-refs.ts","../src/realtime-subscription.ts","../src/synced-write-guard.ts","../src/views.ts","../src/build-collection.ts","../src/collection.ts","../src/util.ts"],"names":["hold","createTanStackCollection"],"mappings":"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","file":"chunk-R4ASTPWG.js","sourcesContent":["import type { RelationTarget } from './types'\n\nexport type RelationTargets = Record<string, RelationTarget>\n\nexport function normalizePaths(paths: Iterable<string>): string[] {\n const set = new Set<string>()\n for (const path of paths) {\n const trimmed = path.trim()\n if (trimmed) set.add(trimmed)\n }\n return [...set].sort()\n}\n\nexport function splitPaths(csv: string | undefined): string[] {\n return csv ? normalizePaths(csv.split(',')) : []\n}\n\nexport function joinPaths(paths: Iterable<string>): string | undefined {\n const normalized = normalizePaths(paths)\n return normalized.length > 0 ? normalized.join(',') : undefined\n}\n\nexport const BACK_RELATION_EXPAND_CAP = 1000\n\n/** `<collection>_via_<field>` → `{ field }`, split at the first `_via_`. */\nexport function parseViaKey(key: string): { field: string } | undefined {\n const index = key.indexOf('_via_')\n if (index < 0) return undefined\n const field = key.slice(index + '_via_'.length)\n return field ? { field } : undefined\n}\n\n/**\n * After a parent filed the values expanded under `key`, record on the target\n * that the subset `field = parentId` is complete — unless the key is a forward\n * relation or PocketBase may have capped the expand.\n */\nexport function markFiledSubset(\n target: RelationTarget,\n key: string,\n values: readonly object[],\n parentId: string\n): void {\n const via = parseViaKey(key)\n if (!via || values.length >= BACK_RELATION_EXPAND_CAP) return\n target.markSubsetLoaded(via.field, parentId)\n}\n\nexport function validateExpandPath(\n collectionName: string,\n targets: RelationTargets | undefined,\n path: string\n): void {\n if (!targets) {\n throw new Error(\n `Cannot expand \"${path}\" on collection \"${collectionName}\": no relations declared`\n )\n }\n let current: RelationTargets | undefined = targets\n for (const segment of path.split('.')) {\n const next: RelationTarget | undefined = current?.[segment]\n if (!next) {\n throw new Error(\n `Cannot expand \"${path}\" on collection \"${collectionName}\": segment \"${segment}\" is not a declared relation`\n )\n }\n current = next.relationTargets\n }\n}\n","/**\n * Logger interface for subscription events and internal operations.\n * Users can provide their own implementation to integrate with external logging services.\n */\nexport interface Logger {\n /**\n * Log debug-level messages (typically only shown in development).\n * @param msg - The message to log\n * @param context - Optional context object with additional information\n */\n debug: (msg: string, context?: object) => void\n\n /**\n * Log info-level messages.\n * @param msg - The message to log\n * @param context - Optional context object with additional information\n */\n info: (msg: string, context?: object) => void\n\n /**\n * Log warning-level messages.\n * @param msg - The message to log\n * @param context - Optional context object with additional information\n */\n warn: (msg: string, context?: object) => void\n\n /**\n * Log error-level messages.\n * @param msg - The message to log\n * @param context - Optional context object with additional information\n */\n error: (msg: string, context?: object) => void\n}\n\n/**\n * Default console-based logger implementation.\n * Only logs debug messages in development mode.\n */\nconst defaultLogger: Logger = {\n debug: (msg: string, context?: object) => {\n if (process.env.NODE_ENV === 'development') {\n console.debug(`[pbtsdb] ${msg}`, context || '')\n }\n },\n info: (msg: string, context?: object) => {\n console.info(`[pbtsdb] ${msg}`, context || '')\n },\n warn: (msg: string, context?: object) => {\n console.warn(`[pbtsdb] ${msg}`, context || '')\n },\n error: (msg: string, context?: object) => {\n console.error(`[pbtsdb] ${msg}`, context || '')\n },\n}\n\n/**\n * Current logger instance (can be replaced by users).\n */\nlet currentLogger: Logger = defaultLogger\n\n/**\n * Internal logger instance used by the library.\n */\nexport const logger: Logger = {\n debug: (msg: string, context?: object) => currentLogger.debug(msg, context),\n info: (msg: string, context?: object) => currentLogger.info(msg, context),\n warn: (msg: string, context?: object) => currentLogger.warn(msg, context),\n error: (msg: string, context?: object) => currentLogger.error(msg, context),\n}\n\n/**\n * Set a custom logger implementation.\n * This allows users to integrate with their own logging services (e.g., Sentry, LogRocket, etc.).\n *\n * @param customLogger - The custom logger implementation\n *\n * @example\n * ```ts\n * import { setLogger } from 'pbtsdb';\n *\n * // Integration with a custom logging service\n * setLogger({\n * debug: (msg, context) => myLogger.debug(msg, context),\n * warn: (msg, context) => myLogger.warn(msg, context),\n * error: (msg, context) => {\n * myLogger.error(msg, context);\n * Sentry.captureMessage(msg, { level: 'error', extra: context });\n * },\n * });\n * ```\n *\n * @example\n * ```ts\n * // Disable all logging\n * setLogger({\n * debug: () => {},\n * warn: () => {},\n * error: () => {},\n * });\n * ```\n */\nexport function setLogger(customLogger: Logger): void {\n currentLogger = customLogger\n}\n\n/**\n * Reset the logger to the default implementation.\n */\nexport function resetLogger(): void {\n currentLogger = defaultLogger\n}\n","// Accessors for the untyped records PocketBase hands back: rows, expand\n// entries, and realtime events.\n\nexport function idOf(value: unknown): string | undefined {\n if (!value || typeof value !== 'object' || !('id' in value)) return undefined\n return typeof value.id === 'string' ? value.id : undefined\n}\n\nexport function updatedAtOf(value: unknown): string | undefined {\n if (!value || typeof value !== 'object' || !('updated' in value)) return undefined\n return typeof value.updated === 'string' && value.updated !== '' ? value.updated : undefined\n}\n\nexport function expandOf(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object' || !('expand' in value)) return undefined\n const { expand } = value\n return expand && typeof expand === 'object' ? (expand as Record<string, unknown>) : undefined\n}\n\nexport function isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null\n}\n","import { markFiledSubset, parseViaKey, type RelationTargets, splitPaths } from './expand-paths'\nimport { logger } from './logger'\nimport { expandOf, idOf, isObject } from './records'\nimport type { RelationTarget } from './types'\n\n/** A back-relation (`<collection>_via_<field>`) at the head of an active expand path. */\nexport interface BackRelationHead {\n target: RelationTarget\n key: string\n field: string\n}\n\nexport function backRelationHeads(\n expandString: string | undefined,\n targets: RelationTargets | undefined\n): BackRelationHead[] {\n if (!targets) return []\n const heads: BackRelationHead[] = []\n for (const key of splitPaths(expandString).map(path => path.split('.')[0])) {\n const target = targets[key]\n const via = target && parseViaKey(key)\n if (target && via) heads.push({ target, key, field: via.field })\n }\n return heads\n}\n\n/** Every collection along the given expand paths, through nested targets. */\nexport function targetsAlong(\n paths: Iterable<string>,\n targets: RelationTargets | undefined\n): Set<RelationTarget> {\n const found = new Set<RelationTarget>()\n for (const path of paths) {\n let current = targets\n for (const segment of path.split('.')) {\n const target = current?.[segment]\n if (!target) break\n found.add(target)\n current = target.relationTargets\n }\n }\n return found\n}\n\n// A filed copy never carries `expand`: parts with a declared target are filed\n// by the recursive call, and parts without one have nowhere to go.\nexport function withoutExpand(values: object[]): object[] {\n return values.map(value => {\n const { expand: _expand, ...plain } = value as { expand?: unknown }\n return plain\n })\n}\n\n// pbtsdb asked PocketBase for these relations only to file them into their\n// target collections; the copies never reach a row in any cache.\nexport function stripFetchedRelations<T extends object>(\n items: T[],\n expandString: string | undefined\n): T[] {\n const heads = new Set(splitPaths(expandString).map(path => path.split('.')[0]))\n if (heads.size === 0) return items\n return items.map(item => {\n const { expand, ...plain } = item as T & { expand?: Record<string, unknown> }\n if (!expand) return item\n const kept = Object.fromEntries(Object.entries(expand).filter(([key]) => !heads.has(key)))\n return (Object.keys(kept).length > 0 ? { ...plain, expand: kept } : plain) as T\n })\n}\n\ntype ExpandedGroup = { values: object[]; byParent: [string, object[]][] }\n\nfunction groupExpandedByKey(records: readonly object[]): Map<string, ExpandedGroup> {\n const byKey = new Map<string, ExpandedGroup>()\n for (const record of records) {\n const expand = expandOf(record)\n if (!expand) continue\n const parentId = idOf(record)\n for (const [key, value] of Object.entries(expand)) {\n const values = (Array.isArray(value) ? value : [value]).filter(isObject)\n const group = byKey.get(key) ?? { values: [], byParent: [] }\n group.values.push(...values)\n if (parentId) group.byParent.push([parentId, values])\n byKey.set(key, group)\n }\n }\n return byKey\n}\n\n// Many parents can expand the same record; the last copy wins.\nfunction lastById(values: object[]): object[] {\n const byId = new Map<string | undefined, object>()\n for (const value of values) byId.set(idOf(value), value)\n return [...byId.values()]\n}\n\n/** Records what a parent filed into a target: ids for a forward relation, parent ids for a back-relation. */\nexport type RecordFiled = (target: RelationTarget, field: string, values: Iterable<string>) => void\n\nexport interface ExpandFiler {\n /** File every expanded record into its target, one write per relation key. */\n upsertExpanded: (\n records: readonly object[],\n targets: RelationTargets | undefined\n ) => Promise<void>\n /** PocketBase omits an empty back-relation's key, so absence means zero children. */\n markEmptyBackRelations: (items: readonly object[], heads: readonly BackRelationHead[]) => void\n}\n\nexport function createExpandFiler(collectionName: string, recordFiled: RecordFiled): ExpandFiler {\n function recordFiledGroup(\n target: RelationTarget,\n key: string,\n group: ExpandedGroup,\n values: object[]\n ): void {\n const via = parseViaKey(key)\n if (via) {\n recordFiled(\n target,\n via.field,\n group.byParent.map(([parentId]) => parentId)\n )\n } else {\n recordFiled(\n target,\n 'id',\n values.flatMap(value => idOf(value) ?? [])\n )\n }\n }\n\n async function upsertExpanded(\n records: readonly object[],\n targets: RelationTargets | undefined\n ): Promise<void> {\n if (!targets) return\n for (const [key, group] of groupExpandedByKey(records)) {\n const target = targets[key]\n if (!target) {\n logger.debug('No relation target for expanded field', { collectionName, key })\n continue\n }\n const values = lastById(group.values)\n const filed = await target.writeFiled(values)\n await upsertExpanded(values, target.relationTargets)\n if (!filed) continue\n recordFiledGroup(target, key, group, values)\n for (const [parentId, parentValues] of group.byParent) {\n markFiledSubset(target, key, parentValues, parentId)\n }\n }\n }\n\n return {\n upsertExpanded,\n markEmptyBackRelations(items, heads) {\n if (heads.length === 0) return\n for (const item of items) {\n const id = idOf(item)\n if (!id) continue\n const expand = expandOf(item)\n for (const { target, key, field } of heads) {\n if (expand?.[key] !== undefined) continue\n target.markSubsetLoaded(field, id)\n recordFiled(target, field, [id])\n }\n }\n },\n }\n}\n","import type { IR } from '@tanstack/db'\n\nexport type WhereSubset = { field: string; values: string[] }\n\ntype Node = { type: string; name?: string; args?: Node[]; path?: string[]; value?: unknown }\n\nfunction fieldRef(node: Node | undefined): string | undefined {\n return node?.type === 'ref' && node.path?.length === 1 ? node.path[0] : undefined\n}\n\nfunction stringValue(node: Node | undefined): string | undefined {\n return node?.type === 'val' && typeof node.value === 'string' ? node.value : undefined\n}\n\nfunction collectEq(a: Node | undefined, b: Node | undefined): WhereSubset | undefined {\n const field = fieldRef(a) ?? fieldRef(b)\n if (field === undefined) return undefined\n const value = stringValue(fieldRef(a) !== undefined ? b : a)\n return value === undefined ? undefined : { field, values: [value] }\n}\n\nfunction collectIn(a: Node | undefined, b: Node | undefined): WhereSubset | undefined {\n const field = fieldRef(a)\n if (field === undefined || b?.type !== 'val' || !Array.isArray(b.value)) return undefined\n return b.value.every(v => typeof v === 'string')\n ? { field, values: b.value as string[] }\n : undefined\n}\n\nfunction collectOr(args: Node[]): WhereSubset | undefined {\n let field: string | undefined\n const values: string[] = []\n for (const arg of args) {\n const sub = collect(arg)\n if (!sub || (field !== undefined && sub.field !== field)) return undefined\n field = sub.field\n values.push(...sub.values)\n }\n return field === undefined ? undefined : { field, values }\n}\n\nfunction collect(node: Node): WhereSubset | undefined {\n if (node.type !== 'func' || !node.args) return undefined\n const [a, b] = node.args\n switch (node.name) {\n case 'eq':\n return collectEq(a, b)\n case 'in':\n return collectIn(a, b)\n case 'or':\n return collectOr(node.args)\n default:\n return undefined\n }\n}\n\n/**\n * The single-field subset a `where` selects when it is nothing but equalities on\n * one top-level field: `eq(field, x)`, `in(field, [...])`, or an `or` of those.\n * Anything else returns `undefined`.\n */\nexport function subsetFromWhere(\n where: IR.BasicExpression<boolean> | undefined | null\n): WhereSubset | undefined {\n if (!where) return undefined\n const subset = collect(where as unknown as Node)\n return subset ? { field: subset.field, values: [...new Set(subset.values)].sort() } : undefined\n}\n\n/** Whether a row's `field` is one of `wanted` (a multiple relation matches by containment). */\nexport function matchesSubset(row: object, field: string, wanted: ReadonlySet<string>): boolean {\n const value = (row as Record<string, unknown>)[field]\n if (typeof value === 'string') return wanted.has(value)\n if (Array.isArray(value))\n return value.some(item => typeof item === 'string' && wanted.has(item))\n return false\n}\n","import type { IR } from '@tanstack/db'\nimport {\n type FieldPath,\n type ParsedOrderBy,\n parseOrderByExpression,\n parseWhereExpression,\n} from '@tanstack/db'\n\ntype BasicExpression<T = unknown> = IR.BasicExpression<T>\n\nexport function escapeValue(value: unknown): string {\n if (value === null) {\n return 'null'\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false'\n }\n if (typeof value === 'number') {\n return value.toString()\n }\n if (typeof value === 'string') {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`\n }\n if (value instanceof Date) {\n return `\"${value.toISOString()}\"`\n }\n if (Array.isArray(value)) {\n return `[${value.map(escapeValue).join(',')}]`\n }\n return `\"${String(value)}\"`\n}\n\nfunction fieldPathToString(path: FieldPath): string {\n return path.join('.')\n}\n\nexport function convertToPocketBaseFilter(\n where: BasicExpression<boolean> | undefined | null\n): string | undefined {\n if (!where) {\n return undefined\n }\n\n const result = parseWhereExpression(where, {\n handlers: {\n eq: (field: FieldPath, value: unknown) => {\n return `${fieldPathToString(field)} = ${escapeValue(value)}`\n },\n gt: (field: FieldPath, value: unknown) => {\n return `${fieldPathToString(field)} > ${escapeValue(value)}`\n },\n gte: (field: FieldPath, value: unknown) => {\n return `${fieldPathToString(field)} >= ${escapeValue(value)}`\n },\n lt: (field: FieldPath, value: unknown) => {\n return `${fieldPathToString(field)} < ${escapeValue(value)}`\n },\n lte: (field: FieldPath, value: unknown) => {\n return `${fieldPathToString(field)} <= ${escapeValue(value)}`\n },\n and: (...conditions: string[]) => {\n if (conditions.length === 0) return ''\n if (conditions.length === 1) return conditions[0]\n return `(${conditions.join(' && ')})`\n },\n or: (...conditions: string[]) => {\n if (conditions.length === 0) return ''\n if (conditions.length === 1) return conditions[0]\n return `(${conditions.join(' || ')})`\n },\n not: (condition: string) => {\n return `!(${condition})`\n },\n in: (field: FieldPath, values: unknown) => {\n const valueArray = Array.isArray(values) ? values : [values]\n const uniqueValues = [...new Set(valueArray)]\n const fieldStr = fieldPathToString(field)\n const conditions = uniqueValues.map(v => `${fieldStr} = ${escapeValue(v)}`)\n return conditions.length > 1 ? `(${conditions.join(' || ')})` : conditions[0]\n },\n like: (field: FieldPath, value: unknown) => {\n return `${fieldPathToString(field)} ~ ${escapeValue(value)}`\n },\n isNull: (field: FieldPath) => {\n return `${fieldPathToString(field)} = null`\n },\n isUndefined: (field: FieldPath) => {\n return `${fieldPathToString(field)} = null`\n },\n },\n onUnknownOperator: (operator: string, _args: unknown[]) => {\n throw new Error(\n `Unsupported operator '${operator}' for PocketBase filter conversion. ` +\n `Supported operators: eq, gt, gte, lt, lte, in, like, and, or, not, isNull, isUndefined`\n )\n },\n })\n\n return result || undefined\n}\n\nexport function convertToPocketBaseSort(\n orderBy: IR.OrderBy | undefined | null\n): string | undefined {\n if (!orderBy) {\n return undefined\n }\n\n const sorts = parseOrderByExpression(orderBy)\n\n if (sorts.length === 0) {\n return undefined\n }\n\n return sorts\n .map((sort: ParsedOrderBy) => {\n const field = fieldPathToString(sort.field)\n return sort.direction === 'desc' ? `-${field}` : field\n })\n .join(',')\n}\n","import type { RecordSubscribeOptions } from 'pocketbase'\nimport type { WhereSubset } from './keyed-where'\nimport { escapeValue } from './pocketbase-query-converter'\n\n// PocketBase refuses a filter over MaxFilterLength (3500 bytes) with a generic\n// 400, and a subset's size is the caller's data — a user's memberships, a\n// mailbox's threads. The margin below the server cap absorbs multi-byte values,\n// since `.length` counts UTF-16 units.\nconst MAX_FILTER_LENGTH = 2500\n\n// PocketBase caps a realtime subscription topic at 2500 characters, and the\n// SDK URI-encodes the filter into the topic at roughly 2.1x its length; this\n// leaves room for `expand` and factory headers in the same topic.\nexport const REALTIME_MAX_FILTER_LENGTH = 1000\n\n/** PocketBase rejects a realtime subscription topic longer than this. */\nexport const REALTIME_TOPIC_MAX_LENGTH = 2500\n\n// Option keys the PocketBase SDK keeps out of `query` (normalizeUnknownQueryParams).\nconst SDK_RESERVED_OPTIONS = new Set([\n 'requestKey',\n '$cancelKey',\n '$autoCancel',\n 'fetch',\n 'headers',\n 'body',\n 'query',\n 'params',\n 'cache',\n 'credentials',\n 'integrity',\n 'keepalive',\n 'method',\n 'mode',\n 'redirect',\n 'referrer',\n 'referrerPolicy',\n 'signal',\n 'window',\n])\n\n/**\n * The length of the topic the PocketBase SDK builds for a `subscribe('*', ..., options)`\n * call on `collectionName`. PocketBase rejects a topic over\n * `REALTIME_TOPIC_MAX_LENGTH`, and the SDK keeps a rejected topic in its list.\n */\nexport function realtimeTopicLength(\n collectionName: string,\n options: RecordSubscribeOptions | undefined\n): number {\n const topic = `${collectionName}/*`\n if (!options) return topic.length\n const query: Record<string, unknown> = { ...options.query }\n for (const [key, value] of Object.entries(options)) {\n if (!SDK_RESERVED_OPTIONS.has(key)) query[key] = value\n }\n const encoded = encodeURIComponent(JSON.stringify({ query, headers: options.headers }))\n return `${topic}?options=${encoded}`.length\n}\n\n/**\n * The PocketBase filters that select `subset`, each short enough for the server\n * to accept: one when every value fits, more when they do not. `maxLength`\n * defaults to the REST fetch budget; pass `REALTIME_MAX_FILTER_LENGTH` when the\n * filters go to a realtime subscription instead.\n */\nexport function subsetFilters(\n { field, values }: WhereSubset,\n maxLength = MAX_FILTER_LENGTH\n): string[] {\n const filters: string[] = []\n let current = ''\n for (const value of values) {\n const clause = `${field} = ${escapeValue(value)}`\n const joined = current ? `${current} || ${clause}` : clause\n if (current && joined.length > maxLength) {\n filters.push(current)\n current = clause\n } else {\n current = joined\n }\n }\n if (current) filters.push(current)\n return filters\n}\n","import type { QueryClient } from '@tanstack/react-query'\nimport type PocketBase from 'pocketbase'\nimport {\n type BackRelationHead,\n backRelationHeads,\n type ExpandFiler,\n stripFetchedRelations,\n} from './expand-filing'\nimport type { RelationTargets } from './expand-paths'\nimport { matchesSubset, type WhereSubset } from './keyed-where'\nimport type { LoadedSubsets } from './loaded-subsets'\nimport { subsetFilters } from './pocketbase-limits'\nimport type { PbRequest } from './request'\nimport type { SyncedWriteGuard } from './synced-write-guard'\n\nexport interface FetchDeps<T extends object> {\n pb: PocketBase\n collectionName: string\n queryClient: QueryClient\n relationTargets: RelationTargets | undefined\n ignoreAutoCancellation: boolean\n /** The full expand string a request sends, alwaysFetchRelations included. */\n activeExpand: (request: PbRequest) => string | undefined\n syncedRow: (id: string) => T | undefined\n syncedRows: () => Iterable<T>\n subsets: Pick<LoadedSubsets, 'isLoaded'>\n guard: Pick<SyncedWriteGuard<T>, 'trackFetch' | 'withRowsConfirmedMidFlight'>\n filer: ExpandFiler\n}\n\nexport interface Fetcher<T extends object> {\n fetchRecords: (request: PbRequest, queryKey: readonly unknown[]) => Promise<T[]>\n /**\n * A parent's fetch may file and mark `field` once `settles` resolves; a\n * fetch for a not-yet-loaded subset on that field waits for it first.\n * Returns the unregister function the parent runs once its fetch settles.\n */\n expectFiling: (field: string, settles: Promise<void>) => () => void\n}\n\nexport function createFetcher<T extends object>(deps: FetchDeps<T>): Fetcher<T> {\n const { pb, collectionName, queryClient, relationTargets, guard, filer, subsets } = deps\n const pendingFilings = new Map<string, Promise<void>[]>()\n\n function expectFiling(field: string, settles: Promise<void>): () => void {\n let pending = pendingFilings.get(field)\n if (!pending) {\n pending = []\n pendingFilings.set(field, pending)\n }\n pending.push(settles)\n return () => {\n const index = pending.indexOf(settles)\n if (index !== -1) pending.splice(index, 1)\n if (pending.length === 0) pendingFilings.delete(field)\n }\n }\n\n async function awaitPendingFiling(field: string): Promise<void> {\n const pending = pendingFilings.get(field)\n if (pending && pending.length > 0) await Promise.all(pending)\n }\n\n // Rows in the synced store are as fresh as realtime keeps them; an id-only\n // request whose ids are all present needs no round trip.\n function rowsFromStore(ids: readonly string[]): T[] | undefined {\n const rows: T[] = []\n for (const id of ids) {\n const row = deps.syncedRow(id)\n if (!row) return undefined\n rows.push(row)\n }\n return rows\n }\n\n function fieldSubsetFromStore(subset: WhereSubset): T[] | undefined {\n if (!subsets.isLoaded(subset)) return undefined\n const wanted = new Set(subset.values)\n return [...deps.syncedRows()].filter(row => matchesSubset(row, subset.field, wanted))\n }\n\n // Stored rows were filed with alwaysFetchRelations already; only a view's\n // extra `request.expand` forces a fetch. An empty subset selects nothing\n // and must never become a request, which would fetch everything. A sorted\n // and limited request must be sliced in that order, which the store's id\n // order cannot provide.\n function servedFromStore(request: PbRequest): T[] | undefined {\n const { subset, sort, limit } = request\n if (!subset) return undefined\n if (subset.values.length === 0) return []\n if (request.expand || (sort && limit)) return undefined\n const rows =\n subset.field === 'id' ? rowsFromStore(subset.values) : fieldSubsetFromStore(subset)\n return rows && limit ? rows.slice(0, limit) : rows\n }\n\n // Each chunk carries its own request key so the SDK's auto-cancellation\n // does not abort sibling chunks. A limited request returns each chunk's\n // first rows unsliced: the live query re-applies sort and limit.\n async function fetchPage(\n request: PbRequest,\n expand: string | undefined,\n filter: string | undefined,\n index: number\n ): Promise<T[]> {\n const { sort, limit } = request\n const requestKey = `${collectionName}:${index}`\n if (limit) {\n const result = await pb\n .collection(collectionName)\n .getList(1, limit, { filter, sort, skipTotal: true, expand, requestKey })\n return result.items as unknown as T[]\n }\n const items = await pb\n .collection(collectionName)\n .getFullList({ filter, sort, expand, requestKey })\n return items as unknown as T[]\n }\n\n async function fetchItems(\n request: PbRequest,\n heads: readonly BackRelationHead[]\n ): Promise<T[]> {\n const served = servedFromStore(request)\n if (served) return served\n // Give a same-tick parent fetch the chance to file this subset first.\n // Invariant: a fetch that registers pending filings never waits on\n // them, or two mutually back-related collections deadlock.\n if (request.subset && request.subset.field !== 'id' && heads.length === 0) {\n await awaitPendingFiling(request.subset.field)\n const servedAfterFiling = servedFromStore(request)\n if (servedAfterFiling) return servedAfterFiling\n }\n const filters = request.subset ? subsetFilters(request.subset) : [request.filter]\n const expand = deps.activeExpand(request)\n const pages = await Promise.all(\n filters.map((filter, index) => fetchPage(request, expand, filter, index))\n )\n const items = pages.flat()\n filer.markEmptyBackRelations(items, heads)\n return items\n }\n\n function isAutoCancelled(error: unknown): boolean {\n return (\n deps.ignoreAutoCancellation &&\n error instanceof Error &&\n error.message.includes('autocancelled')\n )\n }\n\n async function fetchRecords(request: PbRequest, queryKey: readonly unknown[]): Promise<T[]> {\n const tracked = guard.trackFetch()\n // Registered before the request goes out, and settled on every path,\n // so a waiting target fetch is never left hanging.\n let settleFiling: () => void = () => undefined\n const filed = new Promise<void>(resolve => {\n settleFiling = resolve\n })\n const heads = backRelationHeads(deps.activeExpand(request), relationTargets)\n const unregister = heads.map(({ target, field }) => target.expectFiling(field, filed))\n try {\n let items: T[]\n try {\n items = await fetchItems(request, heads)\n } catch (error) {\n if (!isAutoCancelled(error)) throw error\n // Superseded by a newer request. Resolve to this subset's own\n // cached rows so its reconcile is a no-op; the base key's\n // snapshot would reconcile foreign rows into the subset.\n return guard.withRowsConfirmedMidFlight(\n queryClient.getQueryData<T[]>(queryKey) ?? [],\n tracked.confirmed\n )\n }\n await filer.upsertExpanded(items, relationTargets)\n return guard.withRowsConfirmedMidFlight(\n stripFetchedRelations(items, deps.activeExpand(request)),\n tracked.confirmed\n )\n } finally {\n tracked.done()\n settleFiling()\n for (const fn of unregister) fn()\n }\n }\n\n return { fetchRecords, expectFiling }\n}\n","import { logger } from './logger'\nimport { REALTIME_MAX_FILTER_LENGTH, subsetFilters } from './pocketbase-limits'\nimport type { HeldTarget, RelationTarget } from './types'\n\n/**\n * Relation targets a collection holds live while its own subscription is\n * open, each told which rows this collection filed into it.\n */\nexport interface HeldTargets {\n recordFiled: (target: RelationTarget, field: string, values: Iterable<string>) => void\n /** Hold exactly `desired`; release every other held target. */\n sync: (desired: Set<RelationTarget>) => void\n releaseAll: () => void\n /** Forget what was filed; the next hold subscribes to nothing until refiled. */\n clearFiled: () => void\n count: () => number\n}\n\nexport function createHeldTargets(collectionName: string): HeldTargets {\n const held = new Map<RelationTarget, HeldTarget>()\n // Kept across releases: a cached refetch re-holds without filing again.\n const filedByTarget = new Map<RelationTarget, Map<string, Set<string>>>()\n\n function filtersFor(target: RelationTarget): string[] {\n const byField = filedByTarget.get(target)\n if (!byField) return []\n const filters: string[] = []\n for (const [field, values] of byField) {\n filters.push(\n ...subsetFilters({ field, values: [...values] }, REALTIME_MAX_FILTER_LENGTH)\n )\n }\n return filters\n }\n\n function release(target: RelationTarget): void {\n const hold = held.get(target)\n if (!hold) return\n held.delete(target)\n try {\n hold.release()\n } catch (error) {\n logger.error('Failed to release relation target subscription', {\n collectionName,\n error,\n })\n }\n }\n\n function hold(target: RelationTarget): void {\n if (held.has(target)) return\n try {\n const hold = target.holdLive()\n held.set(target, hold)\n hold.setFilters(filtersFor(target))\n } catch (error) {\n logger.error('Failed to hold relation target subscription', { collectionName, error })\n }\n }\n\n function sync(desired: Set<RelationTarget>): void {\n for (const target of [...held.keys()]) if (!desired.has(target)) release(target)\n for (const target of desired) hold(target)\n }\n\n return {\n recordFiled(target, field, values) {\n let byField = filedByTarget.get(target)\n if (!byField) {\n byField = new Map()\n filedByTarget.set(target, byField)\n }\n let recorded = byField.get(field)\n if (!recorded) {\n recorded = new Set()\n byField.set(field, recorded)\n }\n let grew = false\n for (const value of values) {\n if (recorded.has(value)) continue\n recorded.add(value)\n grew = true\n }\n if (grew) held.get(target)?.setFilters(filtersFor(target))\n },\n sync,\n releaseAll: () => sync(new Set()),\n clearFiled: () => filedByTarget.clear(),\n count: () => held.size,\n }\n}\n","import type { LoadSubsetOptions } from '@tanstack/db'\nimport { joinPaths } from './expand-paths'\nimport { subsetFromWhere, type WhereSubset } from './keyed-where'\nimport { REALTIME_MAX_FILTER_LENGTH, subsetFilters } from './pocketbase-limits'\nimport { convertToPocketBaseFilter, convertToPocketBaseSort } from './pocketbase-query-converter'\n\n/** Load options plus the expand paths a view adds. */\nexport type LoadOptions = LoadSubsetOptions & { expand?: readonly string[] }\n\n/**\n * What a query's load options ask PocketBase for. Also the second element of\n * the query key, so equal requests share one cached query.\n */\nexport interface PbRequest {\n filter?: string\n sort?: string\n limit?: number\n expand?: string\n subset?: WhereSubset\n}\n\nexport function toRequest(opts: LoadSubsetOptions | undefined): PbRequest {\n const request: PbRequest = {}\n const subset = subsetFromWhere(opts?.where)\n const filter = subset ? undefined : convertToPocketBaseFilter(opts?.where)\n const sort = convertToPocketBaseSort(opts?.orderBy)\n const expand = joinPaths((opts as LoadOptions | undefined)?.expand ?? [])\n if (subset) request.subset = subset\n if (filter) request.filter = filter\n if (sort) request.sort = sort\n if (opts?.limit) request.limit = opts.limit\n if (expand) request.expand = expand\n return request\n}\n\nexport function queryKeyFor<C extends string>(\n collectionName: C,\n opts?: LoadSubsetOptions\n): [C] | [C, PbRequest] {\n const request = toRequest(opts)\n return Object.keys(request).length === 0 ? [collectionName] : [collectionName, request]\n}\n\nexport function requestFromQueryKey(queryKey: readonly unknown[]): PbRequest | undefined {\n return queryKey[1] as PbRequest | undefined\n}\n\n/**\n * The filters a query's realtime entries send: every chunk of a keyed subset,\n * or the single converted filter. `undefined` means the whole collection.\n */\nexport function realtimeFiltersFor(request: PbRequest): string[] | undefined {\n if (request.subset) return subsetFilters(request.subset, REALTIME_MAX_FILTER_LENGTH)\n return request.filter ? [request.filter] : undefined\n}\n","import type { QueryClient } from '@tanstack/react-query'\nimport type { WhereSubset } from './keyed-where'\nimport { logger } from './logger'\nimport { requestFromQueryKey } from './request'\n\n/**\n * Field → values whose subset is known complete in the store, so a query on\n * that subset is served without a request (see docs/internals.md,\n * \"Loaded-subset marks\").\n */\nexport interface LoadedSubsets {\n mark: (field: string, value: string) => void\n count: () => number\n isLoaded: (subset: WhereSubset) => boolean\n /** Forget the marks a pruned row belonged to and invalidate their cached queries. */\n forgetRow: (row: unknown) => void\n /** Invalidate every marked subset's cached query; call before `clear` on a real stop. */\n invalidateAll: () => void\n clear: () => void\n}\n\nexport function createLoadedSubsets(\n collectionName: string,\n queryClient: QueryClient\n): LoadedSubsets {\n const marks = new Map<string, Set<string>>()\n\n function forgetValue(marked: Set<string>, value: unknown): string[] {\n if (typeof value === 'string') return marked.delete(value) ? [value] : []\n if (!Array.isArray(value)) return []\n return value.filter(item => typeof item === 'string' && marked.delete(item))\n }\n\n function matchesMarked(\n query: { queryKey: readonly unknown[] },\n isMarked: (field: string, value: string) => boolean\n ): boolean {\n if (query.queryKey[0] !== collectionName) return false\n const subset = requestFromQueryKey(query.queryKey)?.subset\n if (!subset) return false\n return subset.values.some(value => isMarked(subset.field, value))\n }\n\n // A subset query that resolved once is served from query-db-collection's\n // observer cache on the next mount regardless of marks, so forgetting a\n // mark must also invalidate that cached query.\n function invalidate(isMarked: (field: string, value: string) => boolean): void {\n void queryClient\n .invalidateQueries({ predicate: query => matchesMarked(query, isMarked) })\n .catch(error =>\n logger.error('Failed to invalidate marked subset queries', {\n collectionName,\n error,\n })\n )\n }\n\n return {\n mark(field, value) {\n let values = marks.get(field)\n if (!values) {\n values = new Set()\n marks.set(field, values)\n }\n values.add(value)\n },\n count() {\n let count = 0\n for (const values of marks.values()) count += values.size\n return count\n },\n isLoaded({ field, values }) {\n const marked = marks.get(field)\n return marked !== undefined && values.every(value => marked.has(value))\n },\n // Deferred: this runs inside TanStack's write batch, and\n // invalidateQueries may start a queryFn synchronously.\n forgetRow(row) {\n if (!row || typeof row !== 'object') return\n for (const [field, marked] of marks) {\n const forgotten = forgetValue(marked, (row as Record<string, unknown>)[field])\n if (forgotten.length === 0) continue\n queueMicrotask(() =>\n invalidate(\n (queryField, value) => queryField === field && forgotten.includes(value)\n )\n )\n }\n },\n invalidateAll() {\n invalidate((field, value) => marks.get(field)?.has(value) ?? false)\n },\n clear() {\n marks.clear()\n },\n }\n}\n","/** Reference counts keyed by filter string. */\nexport class RefCounter {\n private readonly counts = new Map<string, number>()\n\n add(key: string): void {\n this.counts.set(key, (this.counts.get(key) ?? 0) + 1)\n }\n\n /** Drops one reference. Returns true when none remain. */\n drop(key: string): boolean {\n const count = (this.counts.get(key) ?? 0) - 1\n if (count > 0) {\n this.counts.set(key, count)\n return false\n }\n this.counts.delete(key)\n return true\n }\n\n has(key: string): boolean {\n return this.counts.has(key)\n }\n\n keys(): IterableIterator<string> {\n return this.counts.keys()\n }\n\n clear(): void {\n this.counts.clear()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordSubscribeOptions, RecordSubscription } from 'pocketbase'\nimport { RefCounter } from './filter-refs'\nimport { logger } from './logger'\nimport { REALTIME_TOPIC_MAX_LENGTH, realtimeTopicLength } from './pocketbase-limits'\n\nexport interface RealtimeSubscriptionDeps<T extends object> {\n pb: PocketBase\n collectionName: string\n handleEvent: (event: RecordSubscription<T>) => void\n /** The expand union the next subscribe carries; pure, compared to detect drift. */\n pendingExpand: () => string | undefined\n /** Options for the next subscribe attempt; calls the factory callback. */\n subscribeOptions: () => RecordSubscribeOptions | undefined\n /** An entry opened, so the collections its expand reaches should be held. */\n onEntryOpened: () => void\n /** Nothing is open and nothing is wanted. */\n onIdle: () => void\n}\n\n/**\n * The PocketBase realtime entries for one collection. The `'*'` entry covers\n * the whole collection; a filter entry covers one query filter. Filter entries\n * stay closed while `'*'` is open. Every change to what is wanted goes through\n * `reconcile`, which serializes all open and close work on one promise tail.\n */\nexport interface RealtimeSubscription {\n /** Counted subscribers want the whole collection. */\n addCollectionSubscriber: () => void\n dropCollectionSubscriber: () => void\n /** A query's filters, or `undefined` for the whole collection. Refs are zeroed on sync cleanup. */\n retainQueryFilters: (filters: readonly string[] | undefined) => void\n releaseQueryFilters: (filters: readonly string[] | undefined) => void\n resetQueryFilters: () => void\n /** Filters a parent's hold on this collection wants; they outlive the sync session. */\n swapHoldFilters: (previous: readonly string[], next: readonly string[]) => void\n reconcile: () => void\n /** Close every open entry and reopen what is wanted; a no-op when nothing is live. */\n restart: () => void\n isOpen: () => boolean\n /** Resolves once an entry is open; rejects when none opens within `timeout`. */\n wait: (timeout?: number) => Promise<void>\n}\n\nexport function createRealtimeSubscription<T extends object>(\n deps: RealtimeSubscriptionDeps<T>\n): RealtimeSubscription {\n const { pb, collectionName } = deps\n\n let starUnsubscribe: (() => Promise<void>) | null = null\n let starExpand: string | undefined\n const filterEntries = new Map<\n string,\n { unsubscribe: () => Promise<void>; expand: string | undefined }\n >()\n const waiters = new Set<() => void>()\n\n let collectionSubscribers = 0\n let unfilteredQueryRefs = 0\n const queryRefs = new RefCounter()\n const holdRefs = new RefCounter()\n // Wanted filters whose topic is over PocketBase's cap. The SDK keeps a\n // rejected topic and re-posts it with every later change, breaking\n // realtime for the whole client, so these widen to '*' instead.\n const oversizedFilters = new Set<string>()\n\n const isStarOpen = () => starUnsubscribe !== null\n const isOpen = () => isStarOpen() || filterEntries.size > 0\n const wantedFilters = () => new Set([...queryRefs.keys(), ...holdRefs.keys()])\n const wantsStar = () =>\n collectionSubscribers > 0 || unfilteredQueryRefs > 0 || oversizedFilters.size > 0\n\n function dropRef(refs: RefCounter, filter: string): void {\n if (refs.drop(filter) && !queryRefs.has(filter) && !holdRefs.has(filter)) {\n oversizedFilters.delete(filter)\n }\n }\n\n function notifyOpened(): void {\n deps.onEntryOpened()\n for (const resolve of waiters) resolve()\n waiters.clear()\n }\n\n // A failed step is logged and never poisons the tail.\n let work: Promise<void> = Promise.resolve()\n function enqueue(fn: () => Promise<void>): void {\n work = work.then(fn, fn).catch(error => {\n logger.error('Subscription work failed', { collectionName, error })\n })\n }\n\n async function openStar(): Promise<void> {\n if (isStarOpen()) return\n const expand = deps.pendingExpand()\n try {\n starUnsubscribe = await pb\n .collection(collectionName)\n .subscribe('*', deps.handleEvent, deps.subscribeOptions())\n starExpand = expand\n logger.debug('Subscription started', { collectionName })\n notifyOpened()\n } catch (error) {\n logger.error('Failed to start subscription', { collectionName, error })\n }\n }\n\n async function closeStar(): Promise<void> {\n const unsubscribe = starUnsubscribe\n if (!unsubscribe) return\n // Cleared first: a throwing unsubscribe must not leave the entry open.\n starUnsubscribe = null\n starExpand = undefined\n try {\n await unsubscribe()\n logger.debug('Subscription stopped', { collectionName })\n } catch (error) {\n logger.debug('Unsubscribe failed (expected if connection closed)', {\n collectionName,\n error,\n })\n }\n }\n\n // A factory-supplied filter narrows every entry; the query filter narrows\n // further, so the two are conjoined.\n function filteredOptions(filter: string): RecordSubscribeOptions {\n const base = deps.subscribeOptions()\n const combined = base?.filter ? `(${base.filter}) && (${filter})` : filter\n return { ...base, filter: combined }\n }\n\n // Returns false when the filter's topic is over the cap: the filter is\n // then oversized and the collection widens to '*'.\n async function openFilter(filter: string): Promise<boolean> {\n if (filterEntries.has(filter)) return true\n const options = filteredOptions(filter)\n const topicLength = realtimeTopicLength(collectionName, options)\n if (topicLength > REALTIME_TOPIC_MAX_LENGTH) {\n oversizedFilters.add(filter)\n logger.warn('Realtime filter too long; subscribing to the whole collection', {\n collectionName,\n filterLength: filter.length,\n topicLength,\n })\n return false\n }\n const expand = deps.pendingExpand()\n try {\n const unsubscribe = await pb\n .collection(collectionName)\n .subscribe('*', deps.handleEvent, options)\n filterEntries.set(filter, { unsubscribe, expand })\n logger.debug('Filtered subscription started', { collectionName, filter })\n notifyOpened()\n } catch (error) {\n // Not retried on a timer: the next reconcile tries this filter again.\n logger.error('Failed to start filtered subscription', {\n collectionName,\n filter,\n error,\n })\n }\n return true\n }\n\n async function closeFilter(filter: string): Promise<void> {\n const entry = filterEntries.get(filter)\n if (!entry) return\n filterEntries.delete(filter)\n try {\n await entry.unsubscribe()\n logger.debug('Filtered subscription stopped', { collectionName, filter })\n } catch (error) {\n logger.debug('Unsubscribe failed (expected if connection closed)', {\n collectionName,\n filter,\n error,\n })\n }\n }\n\n async function closeFilters(keep: (filter: string) => boolean = () => false): Promise<void> {\n for (const filter of [...filterEntries.keys()]) {\n if (!keep(filter)) await closeFilter(filter)\n }\n }\n\n async function openWantedFilters(): Promise<void> {\n if (wantsStar()) return\n for (const filter of wantedFilters()) {\n if (!(await openFilter(filter))) return\n }\n }\n\n // The expand union can grow while a subscribe call is in flight.\n function expandDrifted(): boolean {\n const pending = deps.pendingExpand()\n if (isStarOpen() && starExpand !== pending) return true\n for (const entry of filterEntries.values()) if (entry.expand !== pending) return true\n return false\n }\n\n // The single place entries are opened or closed. Wanted entries open\n // before unwanted ones close: an overlap duplicates events, a gap loses\n // them. A filter found oversized while opening flips wantsStar in this pass.\n async function doReconcile(): Promise<void> {\n await openWantedFilters()\n if (wantsStar()) {\n await openStar()\n if (isStarOpen()) await closeFilters()\n } else {\n await closeStar()\n const wanted = wantedFilters()\n await closeFilters(filter => wanted.has(filter))\n }\n if (!isOpen() && !wantsStar() && wantedFilters().size === 0) deps.onIdle()\n if (expandDrifted()) restart()\n }\n\n async function doRestart(): Promise<void> {\n if (!isOpen()) return\n await closeStar()\n await closeFilters()\n await doReconcile()\n }\n\n const reconcile = () => enqueue(doReconcile)\n const restart = () => enqueue(doRestart)\n\n return {\n addCollectionSubscriber() {\n collectionSubscribers += 1\n },\n dropCollectionSubscriber() {\n collectionSubscribers -= 1\n },\n retainQueryFilters(filters) {\n if (!filters) unfilteredQueryRefs += 1\n else for (const filter of filters) queryRefs.add(filter)\n reconcile()\n },\n releaseQueryFilters(filters) {\n if (!filters) unfilteredQueryRefs -= 1\n else for (const filter of filters) dropRef(queryRefs, filter)\n reconcile()\n },\n resetQueryFilters() {\n queryRefs.clear()\n unfilteredQueryRefs = 0\n for (const filter of oversizedFilters) {\n if (!holdRefs.has(filter)) oversizedFilters.delete(filter)\n }\n reconcile()\n },\n swapHoldFilters(previous, next) {\n for (const filter of next) if (!previous.includes(filter)) holdRefs.add(filter)\n for (const filter of previous) if (!next.includes(filter)) dropRef(holdRefs, filter)\n reconcile()\n },\n reconcile,\n restart,\n isOpen,\n wait(timeout = 5000) {\n if (isOpen()) return Promise.resolve()\n return new Promise((resolve, reject) => {\n const onOpen = () => {\n clearTimeout(timer)\n resolve()\n }\n const timer = setTimeout(() => {\n waiters.delete(onOpen)\n reject(new Error('Subscription timeout'))\n }, timeout)\n waiters.add(onOpen)\n })\n },\n }\n}\n","import { logger } from './logger'\nimport { idOf, updatedAtOf } from './records'\n\n/** What the guard reads from and writes to the collection it protects. */\nexport interface GuardedStore<T extends object> {\n isReady: () => boolean\n syncedRow: (id: string) => T | undefined\n /** True while an optimistic mutation on `id` has not settled. */\n hasPendingMutation: (id: string) => boolean\n writeUpsert: (records: T[]) => void\n}\n\nexport interface SyncedWrite {\n type: string\n value?: unknown\n key?: unknown\n}\n\n/** An in-flight fetch's view of rows confirmed after it was issued. */\nexport interface TrackedFetch {\n confirmed: Set<string>\n done: () => void\n}\n\n/**\n * Guards the synced store against writes that would revert a row: late query\n * results and reordered echoes (see docs/internals.md, \"Staleness\" and\n * \"Confirmed rows and in-flight fetches\").\n */\nexport interface SyncedWriteGuard<T extends object> {\n /** Run pbtsdb's own authoritative write; exempt from the optimistic check. */\n writeOwn: (fn: () => void) => void\n isOwnWrite: () => boolean\n shouldDrop: (op: SyncedWrite) => boolean\n isStaleServerRecord: (record: unknown) => boolean\n /** Record that the server holds these rows, for every fetch in flight. */\n markConfirmedPresent: (records: readonly T[]) => void\n trackFetch: () => TrackedFetch\n /** A fetch result plus every row confirmed while it was in flight. */\n withRowsConfirmedMidFlight: (items: T[], confirmed: Set<string>) => T[]\n /** Land a mutation's server rows once its transaction has persisted. */\n writeBackAfterPersisted: (\n transaction: { isPersisted: { promise: Promise<unknown> } },\n records: T[]\n ) => void\n}\n\nexport function createSyncedWriteGuard<T extends object>(\n collectionName: string,\n store: GuardedStore<T>\n): SyncedWriteGuard<T> {\n let applyingOwnWrite = false\n const inFlight = new Set<Set<string>>()\n\n // Strictly older by `updated` than the synced row; ISO 8601 strings compare\n // chronologically. Equal is the same version and must pass, since that is\n // what clears a lingering optimistic overlay.\n function isStaleServerRecord(record: unknown): boolean {\n const id = idOf(record)\n if (!id) return false\n const incoming = updatedAtOf(record)\n if (!incoming) return false\n const current = updatedAtOf(store.syncedRow(id))\n return current !== undefined && incoming < current\n }\n\n function writeKey(op: SyncedWrite): string | null {\n if (op.type !== 'insert' && op.type !== 'update') return null\n if (typeof op.key === 'string') return op.key\n return idOf(op.value) ?? null\n }\n\n function markConfirmedPresent(records: readonly T[]): void {\n if (inFlight.size === 0) return\n for (const record of records) {\n const id = idOf(record)\n if (!id) continue\n for (const confirmed of inFlight) confirmed.add(id)\n }\n }\n\n function withRowsConfirmedMidFlight(items: T[], confirmed: Set<string>): T[] {\n if (confirmed.size === 0) return items\n const resultIds = new Set(items.map(idOf))\n const merged: T[] = []\n for (const id of confirmed) {\n if (resultIds.has(id)) continue\n const row = store.syncedRow(id)\n if (row) merged.push(row)\n }\n if (merged.length === 0) return items\n logger.debug('Merging rows confirmed while fetch was in flight', {\n collectionName,\n ids: merged.map(idOf),\n })\n return [...items, ...merged]\n }\n\n return {\n writeOwn(fn) {\n applyingOwnWrite = true\n try {\n fn()\n } finally {\n applyingOwnWrite = false\n }\n },\n isOwnWrite: () => applyingOwnWrite,\n // A write to a key the synced store lacks is populating it and must\n // pass, or the row is absent once the overlay clears.\n shouldDrop(op) {\n const key = writeKey(op)\n if (key === null) return false\n if (!applyingOwnWrite && store.hasPendingMutation(key) && store.syncedRow(key)) {\n logger.debug('Dropping synced write for optimistically-pending row', {\n collectionName,\n id: key,\n })\n return true\n }\n if (isStaleServerRecord(op.value)) {\n logger.debug('Dropping stale synced write', { collectionName, id: key })\n return true\n }\n return false\n },\n isStaleServerRecord,\n markConfirmedPresent,\n trackFetch() {\n const confirmed = new Set<string>()\n inFlight.add(confirmed)\n return { confirmed, done: () => inFlight.delete(confirmed) }\n },\n withRowsConfirmedMidFlight,\n // Rows are marked confirmed at once. The write waits for persistence\n // (see docs/internals.md, \"Write-back timing\"), skips a collection\n // that is not ready, and drops rows the store already supersedes.\n writeBackAfterPersisted(transaction, records) {\n markConfirmedPresent(records)\n void transaction.isPersisted.promise.then(\n () => {\n if (!store.isReady()) return\n const fresh = records.filter(record => !isStaleServerRecord(record))\n if (fresh.length > 0) this.writeOwn(() => store.writeUpsert(fresh))\n },\n () => undefined\n )\n },\n }\n}\n","import type { LoadSubsetOptions } from '@tanstack/db'\nimport { normalizePaths, type RelationTargets, validateExpandPath } from './expand-paths'\nimport type { LoadOptions } from './request'\nimport type { RealtimeMode } from './types'\n\n/**\n * What a view adds to every subscription made through it: extra expand paths\n * and, when set, a realtime mode that overrides the collection default.\n */\nexport interface ViewTag {\n paths: string[]\n realtime: RealtimeMode | undefined\n}\n\nexport interface ViewRegistry<Args extends unknown[], Sub extends object> {\n /** The tag for a load, from its subscription or the subscribe call on the stack. */\n tagFor: (opts: LoadSubsetOptions) => ViewTag | undefined\n /** Load options with the tagged view's expand paths. */\n withViewExpand: (opts: LoadSubsetOptions) => LoadOptions\n subscribeTagged: (tag: ViewTag | undefined, args: Args) => Sub\n}\n\n/**\n * Tags subscriptions with their view. A subscription's first loadSubset runs\n * inside subscribeChanges, before the subscription object exists to tag, so\n * while a view's subscribe call is on the stack its tag applies to untagged\n * load options.\n */\nexport function createViewRegistry<Args extends unknown[], Sub extends object>(\n subscribe: (...args: Args) => Sub\n): ViewRegistry<Args, Sub> {\n const tags = new WeakMap<object, ViewTag>()\n let subscribing: ViewTag | undefined\n\n function tagFor(opts: LoadSubsetOptions): ViewTag | undefined {\n return (opts.subscription && tags.get(opts.subscription)) ?? subscribing\n }\n\n return {\n tagFor,\n withViewExpand(opts) {\n const paths = tagFor(opts)?.paths\n return paths ? { ...opts, expand: paths } : opts\n },\n subscribeTagged(tag, args) {\n subscribing = tag\n try {\n const subscription = subscribe(...args)\n if (tag) tags.set(subscription, tag)\n return subscription\n } finally {\n subscribing = undefined\n }\n },\n }\n}\n\nexport interface ViewDeps<V extends object> {\n collectionName: string\n collection: V\n alwaysFetch: readonly string[]\n relationTargets: RelationTargets | undefined\n realtimeMode: RealtimeMode\n assertRealtimeMode: (mode: RealtimeMode) => void\n subscribeChangesFor: (tag: ViewTag) => unknown\n}\n\nexport interface Views<V extends object> {\n fetchRelations: (...paths: string[]) => V\n withRealtime: (mode: RealtimeMode) => V\n}\n\n/**\n * Views share the collection's store and prototype; each is identified by its\n * normalized expand paths plus its realtime override. A mode equal to the\n * collection default is stored as `undefined`, so it never creates a view.\n */\nexport function createViews<V extends object>(deps: ViewDeps<V>): Views<V> {\n const { collectionName, collection, alwaysFetch, relationTargets, realtimeMode } = deps\n const views = new Map<string, V>()\n\n function createView(tag: ViewTag): V {\n const query: string[] = []\n if (tag.paths.length > 0) query.push(`expand=${tag.paths.join(',')}`)\n if (tag.realtime) query.push(`realtime=${tag.realtime}`)\n const view: V = Object.create(collection)\n Object.defineProperties(view, {\n id: { value: `${collectionName}?${query.join('&')}` },\n subscribeChanges: { value: deps.subscribeChangesFor(tag) },\n fetchRelations: {\n value: (...more: string[]) => viewFor([...tag.paths, ...more], tag.realtime),\n },\n withRealtime: {\n value: (mode: RealtimeMode) => {\n deps.assertRealtimeMode(mode)\n const override = mode === realtimeMode ? undefined : mode\n if (tag.realtime !== undefined && tag.realtime !== override) {\n throw new Error(\n `A view of \"${collectionName}\" already uses realtime '${tag.realtime}'`\n )\n }\n return viewFor(tag.paths, mode)\n },\n },\n })\n return view\n }\n\n function viewFor(paths: readonly string[], realtime: RealtimeMode | undefined): V {\n for (const path of paths) validateExpandPath(collectionName, relationTargets, path)\n const all = normalizePaths([...alwaysFetch, ...paths])\n const override = realtime === realtimeMode ? undefined : realtime\n if (override === undefined && all.every(path => alwaysFetch.includes(path))) {\n return collection\n }\n const key = `${all.join(',')}|${override ?? ''}`\n let view = views.get(key)\n if (!view) {\n view = createView({ paths: all, realtime: override })\n views.set(key, view)\n }\n return view\n }\n\n return {\n fetchRelations: (...paths) => viewFor(paths, undefined),\n withRealtime: mode => {\n deps.assertRealtimeMode(mode)\n return viewFor([], mode)\n },\n }\n}\n","import {\n BTreeIndex,\n type Collection,\n createCollection as createTanStackCollection,\n type DeleteMutationFn,\n type InsertMutationFn,\n type LoadSubsetOptions,\n type UpdateMutationFn,\n} from '@tanstack/db'\nimport {\n DeleteOperationItemNotFoundError,\n type QueryCollectionUtils,\n queryCollectionOptions,\n} from '@tanstack/query-db-collection'\nimport type { QueryClient } from '@tanstack/react-query'\nimport type PocketBase from 'pocketbase'\nimport type { RecordSubscribeOptions, RecordSubscription } from 'pocketbase'\nimport {\n createExpandFiler,\n stripFetchedRelations,\n targetsAlong,\n withoutExpand,\n} from './expand-filing'\nimport {\n joinPaths,\n normalizePaths,\n type RelationTargets,\n splitPaths,\n validateExpandPath,\n} from './expand-paths'\nimport { createFetcher } from './fetch-records'\nimport { createHeldTargets } from './held-targets'\nimport { createLoadedSubsets } from './loaded-subsets'\nimport { logger } from './logger'\nimport { createRealtimeSubscription } from './realtime-subscription'\nimport { idOf } from './records'\nimport {\n type PbRequest,\n queryKeyFor,\n realtimeFiltersFor,\n requestFromQueryKey,\n toRequest,\n} from './request'\nimport { createSyncedWriteGuard, type SyncedWrite } from './synced-write-guard'\nimport type {\n CreateCollectionOptions,\n ExtractRecordType,\n HeldTarget,\n RealtimeMode,\n SchemaDeclaration,\n} from './types'\nimport { createViewRegistry, createViews, type ViewTag } from './views'\n\nconst REALTIME_MODES: readonly RealtimeMode[] = ['collection', 'query']\n\n/**\n * Minimal shape of the two collection events that invalidate every loaded-subset\n * mark: `status:change` (cleared on reaching `cleaned-up`) and `truncate`\n * (cleared unconditionally). Extracted so the wiring itself is unit-testable\n * against a fake emitter, independent of a real `Collection` instance.\n * @internal\n */\nexport type MarkInvalidatingCollection = {\n onStatusChange: (callback: (event: { status: string }) => void) => () => void\n onTruncate: (callback: () => void) => () => void\n}\n\n/**\n * Without a live subscription, back-relation children can appear server-side\n * unseen, so every mark is stale once the collection cleans up or truncates.\n * @internal\n */\nexport function registerMarkInvalidationEvents(\n collection: MarkInvalidatingCollection,\n clearMarks: () => void\n): void {\n collection.onStatusChange(event => {\n if (event.status === 'cleaned-up') clearMarks()\n })\n collection.onTruncate(() => clearMarks())\n}\n\n/**\n * Options applied to every collection built by a {@link createCollection} factory.\n */\nexport interface CreateCollectionFactoryOptions {\n /**\n * Extra options passed to every real-time subscription this factory creates,\n * such as `headers`, `filter`, `expand` or `fields`.\n *\n * Invoked on every subscribe attempt rather than read once: each filtered\n * entry of a `realtime: 'query'` collection and each restart (reconnect,\n * wider expand) calls it again, so a value captured at build time would go\n * stale.\n *\n * Returning `undefined` subscribes with no extra options.\n */\n subscribeOptions?: () => RecordSubscribeOptions | undefined\n}\n\n/**\n * Subscription helpers added to collection instances.\n * @internal\n */\nexport interface CollectionSubscriptionHelpers {\n /** The PocketBase collection name */\n collectionName: string\n /** Wait for subscription to be established (useful in tests) */\n waitForSubscription: (timeout?: number) => Promise<void>\n /** Check if collection has an active subscription */\n isSubscribed: () => boolean\n /** Relation targets declared through `relations` */\n relationTargets: RelationTargets | undefined\n /** Number of relation targets currently held live */\n heldRelationTargetCount: () => number\n /** Record that every row with `field === value` is now in this collection's store */\n markSubsetLoaded: (field: string, value: string) => void\n /** Number of field/value pairs currently marked loaded */\n loadedSubsetCount: () => number\n /** Hold this collection live as a relation target; see RelationTarget.holdLive */\n holdLive: () => HeldTarget\n /** Receive rows a parent expanded into this collection; see RelationTarget.writeFiled */\n writeFiled: (records: object[]) => Promise<boolean>\n /** A parent's fetch may file a subset here; see RelationTarget.expectFiling */\n expectFiling: (field: string, settles: Promise<void>) => () => void\n}\n\n/**\n * Runtime shape of a built collection, before the public factory narrows it.\n * @internal\n */\nexport type BuiltCollection<T extends object> = Collection<\n T,\n string | number,\n QueryCollectionUtils<T, string | number, T>,\n never,\n T\n> &\n CollectionSubscriptionHelpers & {\n fetchRelations: (...paths: string[]) => BuiltCollection<T>\n withRealtime: (mode: RealtimeMode) => BuiltCollection<T>\n }\n\n/** @internal */\nexport interface BuildCollectionInput<\n Schema extends SchemaDeclaration,\n C extends keyof Schema & string,\n> {\n pb: PocketBase\n queryClient: QueryClient\n factoryOptions: CreateCollectionFactoryOptions | undefined\n collectionName: C\n options: CreateCollectionOptions<Schema, C> | undefined\n}\n\n/** @internal */\nexport function buildCollection<Schema extends SchemaDeclaration, C extends keyof Schema & string>(\n input: BuildCollectionInput<Schema, C>\n): BuiltCollection<ExtractRecordType<Schema, C>> {\n const { pb, queryClient, factoryOptions, collectionName, options } = input\n type RecordType = ExtractRecordType<Schema, C>\n\n const relationTargets = options?.relations as RelationTargets | undefined\n for (const [key, target] of Object.entries(relationTargets ?? {})) {\n if (\n typeof target?.writeFiled !== 'function' ||\n typeof target.holdLive !== 'function' ||\n typeof target.expectFiling !== 'function'\n ) {\n throw new Error(\n `Collection '${collectionName}': relation '${key}' is not a pbtsdb collection`\n )\n }\n }\n const alwaysFetch = normalizePaths(options?.alwaysFetchRelations ?? [])\n for (const path of alwaysFetch) validateExpandPath(collectionName, relationTargets, path)\n const syncMode = options?.syncMode ?? 'eager'\n const realtimeMode: RealtimeMode = options?.realtime ?? 'collection'\n const ignoreAutoCancellation = options?.ignoreAutoCancellation ?? true\n const refetchOnMutation = options?.refetchOnMutation ?? false\n\n function assertRealtimeMode(mode: RealtimeMode): void {\n if (!REALTIME_MODES.includes(mode)) {\n throw new Error(\n `Collection '${collectionName}': unknown realtime mode '${String(mode)}'`\n )\n }\n if (mode === 'query' && syncMode !== 'on-demand') {\n throw new Error(\n `Collection '${collectionName}': realtime 'query' requires syncMode 'on-demand'`\n )\n }\n }\n assertRealtimeMode(realtimeMode)\n\n // Paths requested by views that have subscribed at least once. Eager fetches\n // read it because they cannot receive per-subset options; the realtime\n // subscription reads it so echoes carry every relation in use.\n const requestedExpand = new Set<string>()\n\n const pendingSubscribeExpand = () => joinPaths([...alwaysFetch, ...requestedExpand])\n\n function activeExpand(request: PbRequest): string | undefined {\n return joinPaths([\n ...alwaysFetch,\n ...splitPaths(request.expand),\n ...(syncMode === 'eager' ? requestedExpand : []),\n ])\n }\n\n // The factory's own subscribeOptions() merged with the expand union.\n function realtimeSubscribeOptions(): RecordSubscribeOptions | undefined {\n const base = factoryOptions?.subscribeOptions?.()\n const expand = joinPaths([\n ...splitPaths(pendingSubscribeExpand()),\n ...splitPaths(base?.expand),\n ])\n return expand ? { ...base, expand } : base\n }\n\n // Every held target and every subset mark exists to serve rows realtime\n // keeps fresh; with nothing live and nothing wanted, release them all.\n function releaseAll(): void {\n held.releaseAll()\n subsets.invalidateAll()\n subsets.clear()\n }\n\n // Store accessors close over `collection`, created below; every caller\n // runs after construction. The synced (pre-optimistic) row has no public\n // accessor; `_state.syncedData` is the field @tanstack/query-db-collection\n // itself reads, and test/tanstack-internals.test.ts pins it.\n const syncedRow = (id: string) => collection._state.syncedData.get(id)\n const syncedRows = () => collection._state.syncedData.values()\n const subsets = createLoadedSubsets(collectionName, queryClient)\n const held = createHeldTargets(collectionName)\n const filer = createExpandFiler(collectionName, held.recordFiled)\n const guard = createSyncedWriteGuard<RecordType>(collectionName, {\n isReady: () => collection.isReady(),\n syncedRow,\n // A visible row reports its own overlay; an invisible row with a\n // synced copy is under an optimistic delete.\n hasPendingMutation: id => {\n const visible = collection.get(id)\n return visible ? !visible.$synced : syncedRow(id) !== undefined\n },\n writeUpsert: records => collection.utils.writeUpsert(records),\n })\n const fetcher = createFetcher<RecordType>({\n pb,\n collectionName,\n queryClient,\n relationTargets,\n ignoreAutoCancellation,\n activeExpand,\n syncedRow,\n syncedRows,\n subsets,\n guard,\n filer,\n })\n const realtime = createRealtimeSubscription<RecordType>({\n pb,\n collectionName,\n handleEvent: event => handleRealtimeEvent(event),\n pendingExpand: pendingSubscribeExpand,\n subscribeOptions: realtimeSubscribeOptions,\n onEntryOpened: () =>\n held.sync(targetsAlong(splitPaths(pendingSubscribeExpand()), relationTargets)),\n onIdle: releaseAll,\n })\n\n // `false` disables the mutation; `undefined` selects the built-in handler.\n function resolveHandler<H>(option: H | false | undefined, fallback: H): H | undefined {\n return option === false ? undefined : (option ?? fallback)\n }\n\n const defaultInsert: InsertMutationFn<RecordType> = async ({ transaction }) => {\n const created = await Promise.all(\n transaction.mutations.map(async mutation => {\n const {\n created: _created,\n updated: _updated,\n collectionId: _collectionId,\n collectionName: _collectionName,\n ...data\n } = mutation.modified as unknown as Record<string, unknown>\n return pb.collection(collectionName).create(data)\n })\n )\n guard.writeBackAfterPersisted(transaction, created)\n return { refetch: refetchOnMutation }\n }\n\n const defaultUpdate: UpdateMutationFn<RecordType> = async ({ transaction }) => {\n const updated = await Promise.all(\n transaction.mutations.map(async mutation => {\n return pb.collection(collectionName).update(mutation.original.id, mutation.changes)\n })\n )\n guard.writeBackAfterPersisted(transaction, updated)\n return { refetch: refetchOnMutation }\n }\n\n const defaultDelete: DeleteMutationFn<RecordType> = async ({ transaction }) => {\n await Promise.all(\n transaction.mutations.map(async mutation => {\n await pb.collection(collectionName).delete(mutation.original.id)\n })\n )\n return { refetch: refetchOnMutation }\n }\n\n // TanStack DB 0.6 turned auto-indexing off by default; without an index an\n // orderBy+limit query loads the whole subset instead of paging lazily and\n // warns on every compile. Restore the earlier default; callers can override\n // both settings through collectionOptions.\n const queryCollectionConfig = queryCollectionOptions({\n autoIndex: 'eager',\n defaultIndexType: BTreeIndex,\n ...options?.collectionOptions,\n queryClient,\n queryKey: (opts?: LoadSubsetOptions) => queryKeyFor(collectionName, opts),\n syncMode,\n queryFn: (ctx): Promise<RecordType[]> =>\n fetcher.fetchRecords(requestFromQueryKey(ctx.queryKey) ?? {}, ctx.queryKey),\n getKey: (item: RecordType) => {\n const id = idOf(item)\n if (id === undefined) {\n throw new Error(\n `Record in collection '${collectionName}' is missing required 'id' field. Received: ${JSON.stringify(item)}`\n )\n }\n return id\n },\n onInsert: resolveHandler(options?.onInsert, defaultInsert),\n onUpdate: resolveHandler(options?.onUpdate, defaultUpdate),\n onDelete: resolveHandler(options?.onDelete, defaultDelete),\n })\n\n // queryCollectionOptions keeps `gcTime` for its react-query observer and\n // does not forward it to the collection's own lifecycle GC.\n const collectionOptions =\n options?.collectionOptions?.gcTime === undefined\n ? queryCollectionConfig\n : { ...queryCollectionConfig, gcTime: options.collectionOptions.gcTime }\n\n // What each loadSubset retained, keyed by the options object TanStack\n // passes again to unloadSubset: the view tag in effect can differ between\n // the two calls. Replaced on sync cleanup, so a stale unload cannot drop a\n // newer ref.\n let retainedFilters = new WeakMap<LoadSubsetOptions, { filters: string[] | undefined }[]>()\n\n function retainQueryFilters(opts: LoadSubsetOptions): void {\n if ((registry.tagFor(opts)?.realtime ?? realtimeMode) !== 'query') return\n const filters = realtimeFiltersFor(toRequest(opts))\n const records = retainedFilters.get(opts) ?? []\n records.push({ filters })\n retainedFilters.set(opts, records)\n realtime.retainQueryFilters(filters)\n }\n\n function releaseQueryFilters(opts: LoadSubsetOptions): void {\n const records = retainedFilters.get(opts)\n const retained = records?.shift()\n if (!retained) return\n if (records?.length === 0) retainedFilters.delete(opts)\n realtime.releaseQueryFilters(retained.filters)\n }\n\n // Wrap the sync factory so every synced `write` flows through the guard and\n // every loadSubset/unloadSubset call carries its view's expand paths.\n const innerSync = collectionOptions.sync.sync\n collectionOptions.sync = {\n ...collectionOptions.sync,\n sync: (params: Parameters<typeof innerSync>[0]) => {\n const guardedWrite: typeof params.write = message => {\n const op = message as SyncedWrite\n if (op.type === 'delete' && !guard.isOwnWrite()) subsets.forgetRow(op.value)\n if (guard.shouldDrop(op)) return\n return params.write(message)\n }\n const res = innerSync({ ...params, write: guardedWrite })\n if (!res) return res\n const parts = typeof res === 'function' ? { cleanup: res } : res\n const { cleanup, loadSubset, unloadSubset } = parts\n return {\n ...parts,\n // TanStack drops a discarded sync session's demands without\n // unloadSubset and reloads them on the next session.\n cleanup: () => {\n retainedFilters = new WeakMap()\n realtime.resetQueryFilters()\n return cleanup?.()\n },\n loadSubset: loadSubset\n ? (opts: LoadSubsetOptions) => {\n retainQueryFilters(opts)\n try {\n return loadSubset(registry.withViewExpand(opts))\n } catch (error) {\n releaseQueryFilters(opts)\n throw error\n }\n }\n : undefined,\n unloadSubset: unloadSubset\n ? (opts: LoadSubsetOptions) => {\n releaseQueryFilters(opts)\n return unloadSubset(registry.withViewExpand(opts))\n }\n : undefined,\n }\n },\n }\n\n const collection = createTanStackCollection(collectionOptions)\n\n // Captured before the base collection's own subscribeChanges is replaced\n // below, so views and the base both reach TanStack's original.\n const originalSubscribeChanges = collection.subscribeChanges.bind(collection)\n type ChangesSubscription = ReturnType<typeof originalSubscribeChanges>\n const registry = createViewRegistry(originalSubscribeChanges)\n\n // Subscribe while counting toward the '*' entry; the count drops once,\n // on the first unsubscribe.\n function subscribeCounted(subscribe: () => ChangesSubscription): ChangesSubscription {\n realtime.addCollectionSubscriber()\n let subscription: ChangesSubscription\n try {\n subscription = subscribe()\n } catch (error) {\n realtime.dropCollectionSubscriber()\n throw error\n }\n const unsubscribe = subscription.unsubscribe.bind(subscription)\n let released = false\n subscription.unsubscribe = () => {\n if (!released) {\n released = true\n realtime.dropCollectionSubscriber()\n realtime.reconcile()\n }\n unsubscribe()\n }\n return subscription\n }\n\n function subscribeChangesFor(tag: ViewTag | undefined) {\n return (...args: Parameters<typeof originalSubscribeChanges>) => {\n if (tag) noteViewSubscribed(tag.paths)\n const subscription =\n (tag?.realtime ?? realtimeMode) === 'collection'\n ? subscribeCounted(() => registry.subscribeTagged(tag, args))\n : registry.subscribeTagged(tag, args)\n realtime.reconcile()\n return subscription\n }\n }\n\n Object.defineProperty(collection, 'subscribeChanges', {\n value: subscribeChangesFor(undefined),\n })\n\n const views = createViews({\n collectionName,\n collection,\n alwaysFetch,\n relationTargets,\n realtimeMode,\n assertRealtimeMode,\n subscribeChangesFor,\n })\n\n // PocketBase can redeliver or reorder echoes; a strictly older\n // create/update would revert the row. Deletes are terminal.\n function isStaleEcho(event: RecordSubscription<RecordType>): boolean {\n if (event.action !== 'create' && event.action !== 'update') return false\n if (!guard.isStaleServerRecord(event.record)) return false\n logger.debug('Ignoring stale realtime echo', { collectionName, id: idOf(event.record) })\n return true\n }\n\n function handleRealtimeEvent(event: RecordSubscription<RecordType>): void {\n if (!collection.utils) return\n // Before the stale filter: even a stale create/update echo proves the\n // server holds the row. Delete echoes need no marking.\n if (event.action !== 'delete') guard.markConfirmedPresent([event.record])\n if (isStaleEcho(event)) return\n\n const [stored] = stripFetchedRelations([event.record], pendingSubscribeExpand())\n try {\n guard.writeOwn(() =>\n collection.utils.writeBatch(() => {\n switch (event.action) {\n case 'create':\n collection.utils.writeInsert(stored)\n break\n case 'update':\n collection.utils.writeUpsert(stored)\n break\n case 'delete': {\n const id = idOf(event.record)\n if (id) collection.utils.writeDelete(id)\n break\n }\n }\n })\n )\n } catch (error) {\n // writeDelete throws when a prune or an earlier echo already removed\n // the key; the row is gone either way, so the echo is a no-op.\n if (!(error instanceof DeleteOperationItemNotFoundError)) throw error\n logger.debug('Ignoring delete echo for already-removed record', {\n collectionName,\n id: idOf(event.record),\n })\n }\n\n if (event.action !== 'delete') {\n filer.upsertExpanded([event.record], relationTargets).catch(error =>\n logger.error('Failed to upsert expanded records from realtime echo', {\n collectionName,\n error,\n })\n )\n }\n }\n\n // Receives rows a parent expanded through a relation to this collection.\n // Returns whether the write happened: a caller marks a subset complete\n // only after a real filing.\n async function writeFiled(records: object[]): Promise<boolean> {\n if (!collection.isReady()) {\n const idle = collection.status === 'idle' || collection.status === 'cleaned-up'\n if (syncMode === 'eager' && idle) {\n // Filing must not start a full eager load; a load already\n // running (a hold started it) is worth waiting for.\n logger.warn(\n `not syncing filed rows into ${collectionName} because store is not yet ready`\n )\n return false\n }\n await collection.preload()\n }\n collection.utils.writeUpsert(withoutExpand(records) as RecordType[])\n return true\n }\n\n // A parent's hold on this collection as a relation target. Keeps sync\n // alive and GC blocked like any subscriber. In collection mode the hold\n // counts toward '*'; in query mode it is uncounted and the parent\n // supplies the filters covering the rows it filed here.\n function holdLive(): HeldTarget {\n const subscribe = () => originalSubscribeChanges(() => {}, { includeInitialState: false })\n const subscription =\n realtimeMode === 'collection' ? subscribeCounted(subscribe) : subscribe()\n let current: string[] = []\n let released = false\n realtime.reconcile()\n return {\n setFilters: filters => {\n if (released) return\n const next = [...new Set(filters)]\n realtime.swapHoldFilters(current, next)\n current = next\n },\n release: () => {\n if (released) return\n released = true\n realtime.swapHoldFilters(current, [])\n current = []\n subscription.unsubscribe()\n },\n }\n }\n\n // Record which expand paths a view has subscribed with at least once.\n // Eager collections cannot request per-subset options, so a wider union\n // needs a refetch; a live realtime subscription needs a restart.\n function noteViewSubscribed(paths: string[]): void {\n let grew = false\n for (const path of paths) {\n if (requestedExpand.has(path)) continue\n requestedExpand.add(path)\n grew = true\n }\n if (!grew) return\n if (\n syncMode === 'eager' &&\n collection.status !== 'idle' &&\n collection.status !== 'cleaned-up'\n ) {\n void collection.utils.refetch().catch(error =>\n logger.error('Failed to refetch after widening expand', {\n collectionName,\n error,\n })\n )\n }\n realtime.restart()\n }\n\n registerMarkInvalidationEvents(\n {\n onStatusChange: callback => collection.on('status:change', callback),\n onTruncate: callback => collection.on('truncate', callback),\n },\n () => {\n subsets.clear()\n held.clearFiled()\n }\n )\n\n Object.assign(collection, {\n collectionName,\n relationTargets,\n waitForSubscription: realtime.wait,\n isSubscribed: realtime.isOpen,\n heldRelationTargetCount: held.count,\n markSubsetLoaded: subsets.mark,\n loadedSubsetCount: subsets.count,\n holdLive,\n writeFiled,\n expectFiling: fetcher.expectFiling,\n fetchRelations: views.fetchRelations,\n withRealtime: views.withRealtime,\n })\n\n return collection as unknown as BuiltCollection<RecordType>\n}\n","import type { Collection } from '@tanstack/db'\nimport type { QueryCollectionUtils } from '@tanstack/query-db-collection'\nimport type { QueryClient } from '@tanstack/react-query'\nimport type PocketBase from 'pocketbase'\nimport {\n buildCollection,\n type CollectionSubscriptionHelpers,\n type CreateCollectionFactoryOptions,\n} from './build-collection'\nimport type {\n CreateCollectionOptions,\n ExpandPath,\n ExtractRecordType,\n InsertInputOf,\n PbMeta,\n RealtimeMode,\n RelationsOf,\n SchemaDeclaration,\n} from './types'\n\nexport type { CreateCollectionFactoryOptions } from './build-collection'\nexport type { BaseRecord, CreateCollectionOptions, SchemaDeclaration } from './types'\n\n/**\n * A pbtsdb collection or view: a TanStack DB collection over\n * `ExtractRecordType<Schema, C>` rows, plus pbtsdb's subscription helpers.\n * Views are created by {@link PbCollectionView.fetchRelations} and\n * {@link PbCollectionView.withRealtime}, and compose in either order.\n */\nexport type PbCollectionView<\n Schema extends SchemaDeclaration,\n C extends keyof Schema & string,\n Opts,\n> = Collection<\n ExtractRecordType<Schema, C>,\n string | number,\n QueryCollectionUtils<\n ExtractRecordType<Schema, C>,\n string | number,\n ExtractRecordType<Schema, C>\n >,\n never,\n InsertInputOf<Schema, C, Opts>\n> &\n CollectionSubscriptionHelpers & {\n /** The PocketBase collection name */\n readonly collectionName: C\n /** @internal phantom; never present at runtime */\n readonly __pbtsdb: PbMeta<Schema, C, RelationsOf<Opts>>\n /**\n * A view of this collection whose queries also fetch `paths` and file the\n * expanded records into their target collections. Rows are unchanged; read\n * related records through `materialize()`, a join, or the target's `get()`.\n */\n fetchRelations<const P extends readonly ExpandPath<RelationsOf<Opts>>[]>(\n ...paths: P\n ): PbCollectionView<Schema, C, Opts>\n /**\n * A view of this collection whose live queries subscribe to realtime in\n * `mode`, overriding the collection's `realtime` option for those queries.\n * `'query'` requires `syncMode: 'on-demand'`. Returns the collection itself\n * when `mode` equals the collection default.\n */\n withRealtime(mode: RealtimeMode): PbCollectionView<Schema, C, Opts>\n }\n\n/**\n * The collection returned by {@link createCollection}. Identical to\n * {@link PbCollectionView}; kept as the name for the root collection.\n */\nexport type PbCollection<\n Schema extends SchemaDeclaration,\n C extends keyof Schema & string,\n Opts,\n> = PbCollectionView<Schema, C, Opts>\n\ntype AlwaysFetchRelationsCheck<Opts> = {\n alwaysFetchRelations?: readonly ExpandPath<RelationsOf<Opts>>[]\n}\n\n/**\n * Creates a type-safe TanStack DB collection backed by PocketBase.\n * Use this when you need fine-grained control or need to create collections with dependencies.\n *\n * @param pb - PocketBase client instance\n * @param queryClient - TanStack Query client\n * @returns A curried function that takes collection name and options\n *\n * @example\n * Basic usage:\n * ```ts\n * const booksCollection = createCollection<Schema>(pb, queryClient)('books', {});\n *\n * // Use directly\n * const books = await booksCollection.getFullList();\n * ```\n *\n * @example\n * With relations fetched on every request:\n * ```ts\n * const authorsCollection = createCollection<Schema>(pb, queryClient)('authors', {});\n * const booksCollection = createCollection<Schema>(pb, queryClient)('books', {\n * relations: { author: authorsCollection },\n * alwaysFetchRelations: ['author'],\n * });\n *\n * const { data } = useLiveQuery((q) => q.from({ books: booksCollection }));\n * // The expanded author is filed into authorsCollection, not kept on the row.\n * authorsCollection.get(data[0].author)?.name\n * ```\n *\n * @example\n * With a per-query fetchRelations view:\n * ```ts\n * const booksCollection = createCollection<Schema>(pb, queryClient)('books', {\n * relations: { author: authorsCollection },\n * });\n *\n * const view = booksCollection.fetchRelations('author');\n * const { data } = useLiveQuery((q) => q.from({ books: view }));\n * // Same target collection as above; the view only affects what gets fetched.\n * authorsCollection.get(data[0].author)?.name\n * ```\n */\nexport function createCollection<Schema extends SchemaDeclaration>(\n pb: PocketBase,\n queryClient: QueryClient,\n factoryOptions?: CreateCollectionFactoryOptions\n) {\n return <C extends keyof Schema & string, const Opts extends CreateCollectionOptions<Schema, C>>(\n collectionName: C,\n options?: Opts & AlwaysFetchRelationsCheck<Opts>\n ): PbCollection<Schema, C, Opts> => {\n return buildCollection<Schema, C>({\n pb,\n queryClient,\n factoryOptions,\n collectionName,\n options,\n }) as unknown as PbCollection<Schema, C, Opts>\n }\n}\n","/**\n * Generates a new PocketBase-compatible record ID.\n * Returns a 15-character alphanumeric string (lowercase letters and numbers).\n *\n * PocketBase uses 15-character IDs for records, formatted as lowercase alphanumeric.\n *\n * @returns A 15-character alphanumeric string suitable for use as a PocketBase record ID\n *\n * @example\n * ```ts\n * const id = newRecordId(); // \"a1b2c3d4e5f6g7h\"\n * ```\n */\nexport function newRecordId(): string {\n const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'\n let result = ''\n for (let i = 0; i < 15; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length))\n }\n return result\n}\n"]}
package/dist/core.d.ts CHANGED
@@ -5,6 +5,8 @@ export { RecordSubscribeOptions } from 'pocketbase';
5
5
  import { QueryCollectionUtils } from '@tanstack/query-db-collection';
6
6
  import { QueryClient } from '@tanstack/react-query';
7
7
 
8
+ /** Which rows a collection's realtime subscription covers. */
9
+ type RealtimeMode = 'collection' | 'query';
8
10
  /**
9
11
  * Base record type required by PocketBase collections.
10
12
  * All records must have an 'id' field.
@@ -91,7 +93,39 @@ type ExcludeUndefined<T> = T extends infer U | undefined ? U : T;
91
93
  * RelationAsCollection<Customer[]> => Collection<Customer, string | number, ...>
92
94
  * @internal
93
95
  */
94
- type RelationAsCollection<T> = T extends Array<infer U> ? U extends object ? Collection<U, string | number, any, any, any> : Collection<object, string | number, any, any, any> : T extends object ? Collection<T, string | number, any, any, any> : Collection<object, string | number, any, any, any>;
96
+ type RelationAsCollection<T> = T extends Array<infer U> ? U extends object ? Collection<U, string | number, any, any, any> & RelationTarget : Collection<object, string | number, any, any, any> & RelationTarget : T extends object ? Collection<T, string | number, any, any, any> & RelationTarget : Collection<object, string | number, any, any, any> & RelationTarget;
97
+ /**
98
+ * What a pbtsdb collection exposes to a parent that files expanded rows into
99
+ * it. Every value in `relations` implements it; `createCollection` builds one.
100
+ * @internal
101
+ */
102
+ interface RelationTarget {
103
+ /** Relation targets of this collection, for nested expand paths. */
104
+ readonly relationTargets: Record<string, RelationTarget> | undefined;
105
+ /** Upsert filed rows into the store. False when the store cannot take them yet. */
106
+ writeFiled: (records: object[]) => Promise<boolean>;
107
+ /**
108
+ * A parent's fetch may file and mark `field` once `settles` resolves; the
109
+ * target's own fetch for that subset waits for it (see docs/internals.md,
110
+ * "Pending filings"). Returns the unregister function.
111
+ */
112
+ expectFiling: (field: string, settles: Promise<void>) => () => void;
113
+ /** Record that every row with `field === value` is now in this collection's store. */
114
+ markSubsetLoaded: (field: string, value: string) => void;
115
+ /**
116
+ * Hold this collection live for a parent, with the filters covering the
117
+ * rows the parent filed here (query mode only).
118
+ */
119
+ holdLive: () => HeldTarget;
120
+ }
121
+ /**
122
+ * A parent's hold on a relation target, returned by `holdLive`.
123
+ * @internal
124
+ */
125
+ type HeldTarget = {
126
+ setFilters: (filters: readonly string[]) => void;
127
+ release: () => void;
128
+ };
95
129
  /**
96
130
  * Maps relation field names to the collections that receive their expanded records.
97
131
  */
@@ -328,6 +362,28 @@ interface CreateCollectionOptions<Schema extends SchemaDeclaration, CollectionNa
328
362
  * ```
329
363
  */
330
364
  syncMode?: 'eager' | 'on-demand';
365
+ /**
366
+ * Which rows the realtime subscription covers.
367
+ *
368
+ * - `'collection'` (default): one subscription to every row.
369
+ * - `'query'`: one subscription per active query filter, using the same
370
+ * filter the query's fetch sends. Requires `syncMode: 'on-demand'`.
371
+ * An update that moves a row out of every active filter sends no
372
+ * event; the row stays until its query refetches.
373
+ *
374
+ * A single query overrides this with `collection.withRealtime(mode)`.
375
+ *
376
+ * @default 'collection'
377
+ *
378
+ * @example
379
+ * ```ts
380
+ * const books = createCollection<Schema>(pb, queryClient)('books', {
381
+ * syncMode: 'on-demand',
382
+ * realtime: 'query',
383
+ * });
384
+ * ```
385
+ */
386
+ realtime?: RealtimeMode;
331
387
  /**
332
388
  * Whether to ignore PocketBase auto-cancellation errors.
333
389
  *
@@ -376,6 +432,8 @@ interface CreateCollectionOptions<Schema extends SchemaDeclaration, CollectionNa
376
432
  collectionOptions?: Omit<Partial<BaseCollectionConfig<ExtractRecordType<Schema, CollectionName>, string | number>>, 'getKey' | 'syncMode' | 'onInsert' | 'onUpdate' | 'onDelete' | 'schema'>;
377
433
  }
378
434
 
435
+ type RelationTargets = Record<string, RelationTarget>;
436
+
379
437
  /**
380
438
  * Options applied to every collection built by a {@link createCollection} factory.
381
439
  */
@@ -384,51 +442,72 @@ interface CreateCollectionFactoryOptions {
384
442
  * Extra options passed to every real-time subscription this factory creates,
385
443
  * such as `headers`, `filter`, `expand` or `fields`.
386
444
  *
387
- * Invoked at subscribe time rather than read once, because a subscription is
388
- * re-established on reconnect and whenever the subscriber count rises from
389
- * zero — a value captured at build time would go stale exactly then.
445
+ * Invoked on every subscribe attempt rather than read once: each filtered
446
+ * entry of a `realtime: 'query'` collection and each restart (reconnect,
447
+ * wider expand) calls it again, so a value captured at build time would go
448
+ * stale.
390
449
  *
391
450
  * Returning `undefined` subscribes with no extra options.
392
451
  */
393
452
  subscribeOptions?: () => RecordSubscribeOptions | undefined;
394
453
  }
454
+ /**
455
+ * Subscription helpers added to collection instances.
456
+ * @internal
457
+ */
458
+ interface CollectionSubscriptionHelpers {
459
+ /** The PocketBase collection name */
460
+ collectionName: string;
461
+ /** Wait for subscription to be established (useful in tests) */
462
+ waitForSubscription: (timeout?: number) => Promise<void>;
463
+ /** Check if collection has an active subscription */
464
+ isSubscribed: () => boolean;
465
+ /** Relation targets declared through `relations` */
466
+ relationTargets: RelationTargets | undefined;
467
+ /** Number of relation targets currently held live */
468
+ heldRelationTargetCount: () => number;
469
+ /** Record that every row with `field === value` is now in this collection's store */
470
+ markSubsetLoaded: (field: string, value: string) => void;
471
+ /** Number of field/value pairs currently marked loaded */
472
+ loadedSubsetCount: () => number;
473
+ /** Hold this collection live as a relation target; see RelationTarget.holdLive */
474
+ holdLive: () => HeldTarget;
475
+ /** Receive rows a parent expanded into this collection; see RelationTarget.writeFiled */
476
+ writeFiled: (records: object[]) => Promise<boolean>;
477
+ /** A parent's fetch may file a subset here; see RelationTarget.expectFiling */
478
+ expectFiling: (field: string, settles: Promise<void>) => () => void;
479
+ }
395
480
 
396
481
  /**
397
482
  * A pbtsdb collection or view: a TanStack DB collection over
398
483
  * `ExtractRecordType<Schema, C>` rows, plus pbtsdb's subscription helpers.
399
- * Views are created by {@link PbCollection.fetchRelations} and are leaves:
400
- * they have no further `fetchRelations()`.
484
+ * Views are created by {@link PbCollectionView.fetchRelations} and
485
+ * {@link PbCollectionView.withRealtime}, and compose in either order.
401
486
  */
402
- type PbCollectionView<Schema extends SchemaDeclaration, C extends keyof Schema & string, Opts> = Collection<ExtractRecordType<Schema, C>, string | number, QueryCollectionUtils<ExtractRecordType<Schema, C>, string | number, ExtractRecordType<Schema, C>>, never, InsertInputOf<Schema, C, Opts>> & {
487
+ type PbCollectionView<Schema extends SchemaDeclaration, C extends keyof Schema & string, Opts> = Collection<ExtractRecordType<Schema, C>, string | number, QueryCollectionUtils<ExtractRecordType<Schema, C>, string | number, ExtractRecordType<Schema, C>>, never, InsertInputOf<Schema, C, Opts>> & CollectionSubscriptionHelpers & {
403
488
  /** The PocketBase collection name */
404
489
  readonly collectionName: C;
405
- /** Wait for the real-time subscription to be established (useful in tests) */
406
- waitForSubscription: (timeout?: number) => Promise<void>;
407
- /** Whether the collection has an active real-time subscription */
408
- isSubscribed: () => boolean;
409
- /** @internal relation targets declared through `relations` */
410
- readonly relationTargets: Record<string, unknown> | undefined;
411
- /** @internal number of relation targets currently held live */
412
- readonly heldRelationTargetCount: () => number;
413
- /** @internal record that every row with `field === value` is now in this collection's store */
414
- readonly markSubsetLoaded: (field: string, value: string) => void;
415
- /** @internal number of field/value pairs currently marked loaded */
416
- readonly loadedSubsetCount: () => number;
417
490
  /** @internal phantom; never present at runtime */
418
491
  readonly __pbtsdb: PbMeta<Schema, C, RelationsOf<Opts>>;
419
- };
420
- /**
421
- * The collection returned by {@link createCollection}: a {@link PbCollectionView}
422
- * plus `fetchRelations()` for per-query views.
423
- */
424
- type PbCollection<Schema extends SchemaDeclaration, C extends keyof Schema & string, Opts> = PbCollectionView<Schema, C, Opts> & {
425
492
  /**
426
493
  * A view of this collection whose queries also fetch `paths` and file the
427
494
  * expanded records into their target collections. Rows are unchanged; read
428
495
  * related records through `materialize()`, a join, or the target's `get()`.
429
496
  */
430
497
  fetchRelations<const P extends readonly ExpandPath<RelationsOf<Opts>>[]>(...paths: P): PbCollectionView<Schema, C, Opts>;
498
+ /**
499
+ * A view of this collection whose live queries subscribe to realtime in
500
+ * `mode`, overriding the collection's `realtime` option for those queries.
501
+ * `'query'` requires `syncMode: 'on-demand'`. Returns the collection itself
502
+ * when `mode` equals the collection default.
503
+ */
504
+ withRealtime(mode: RealtimeMode): PbCollectionView<Schema, C, Opts>;
431
505
  };
506
+ /**
507
+ * The collection returned by {@link createCollection}. Identical to
508
+ * {@link PbCollectionView}; kept as the name for the root collection.
509
+ */
510
+ type PbCollection<Schema extends SchemaDeclaration, C extends keyof Schema & string, Opts> = PbCollectionView<Schema, C, Opts>;
432
511
  type AlwaysFetchRelationsCheck<Opts> = {
433
512
  alwaysFetchRelations?: readonly ExpandPath<RelationsOf<Opts>>[];
434
513
  };
@@ -560,4 +639,4 @@ declare function resetLogger(): void;
560
639
  */
561
640
  declare function newRecordId(): string;
562
641
 
563
- export { type CreateCollectionFactoryOptions, type CreateCollectionOptions, type ExcludeUndefined, type ExpandPath, type ExtractRecordType, type ExtractRelations, type Logger, type OmittableFields, type PbCollection, type PbCollectionView, type RelationAsCollection, type RelationsConfig, type SchemaDeclaration, createCollection, newRecordId, resetLogger, setLogger };
642
+ export { type CreateCollectionFactoryOptions, type CreateCollectionOptions, type ExcludeUndefined, type ExpandPath, type ExtractRecordType, type ExtractRelations, type Logger, type OmittableFields, type PbCollection, type PbCollectionView, type RealtimeMode, type RelationAsCollection, type RelationsConfig, type SchemaDeclaration, createCollection, newRecordId, resetLogger, setLogger };
package/dist/core.js CHANGED
@@ -1,3 +1,3 @@
1
- export { BTreeIndex, BasicIndex, ReverseIndex, createCollection, createEffect, materialize, newRecordId, resetLogger, setLogger, toArray } from './chunk-I6UWXRAH.js';
1
+ export { BTreeIndex, BasicIndex, ReverseIndex, createCollection, createEffect, materialize, newRecordId, resetLogger, setLogger, toArray } from './chunk-R4ASTPWG.js';
2
2
  //# sourceMappingURL=core.js.map
3
3
  //# sourceMappingURL=core.js.map
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { BTreeIndex, BasicIndex, DeltaEvent, DeltaType, EffectConfig, EffectContext, IndexConstructor, ReverseIndex, createEffect, materialize, toArray } from '@tanstack/db';
2
2
  export { RecordSubscribeOptions } from 'pocketbase';
3
- export { CreateCollectionFactoryOptions, CreateCollectionOptions, ExcludeUndefined, ExpandPath, ExtractRecordType, ExtractRelations, Logger, OmittableFields, PbCollection, PbCollectionView, RelationAsCollection, RelationsConfig, SchemaDeclaration, createCollection, newRecordId, resetLogger, setLogger } from './core.js';
3
+ export { CreateCollectionFactoryOptions, CreateCollectionOptions, ExcludeUndefined, ExpandPath, ExtractRecordType, ExtractRelations, Logger, OmittableFields, PbCollection, PbCollectionView, RealtimeMode, RelationAsCollection, RelationsConfig, SchemaDeclaration, createCollection, newRecordId, resetLogger, setLogger } from './core.js';
4
4
  import React, { ReactNode } from 'react';
5
5
  import '@tanstack/query-db-collection';
6
6
  import '@tanstack/react-query';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { BTreeIndex, BasicIndex, ReverseIndex, createCollection, createEffect, materialize, newRecordId, resetLogger, setLogger, toArray } from './chunk-I6UWXRAH.js';
1
+ export { BTreeIndex, BasicIndex, ReverseIndex, createCollection, createEffect, materialize, newRecordId, resetLogger, setLogger, toArray } from './chunk-R4ASTPWG.js';
2
2
  import { createContext, useContext } from 'react';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pbtsdb",
3
- "version": "0.9.2",
3
+ "version": "0.10.0",
4
4
  "description": "Type-safe PocketBase integration with TanStack Query and TanStack DB",
5
5
  "keywords": [
6
6
  "pocketbase",