syncorejs 0.2.1 → 0.2.3

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.
Files changed (169) hide show
  1. package/README.md +2 -1
  2. package/dist/_vendor/cli/app.d.mts.map +1 -1
  3. package/dist/_vendor/cli/app.mjs +330 -46
  4. package/dist/_vendor/cli/app.mjs.map +1 -1
  5. package/dist/_vendor/cli/context.mjs +27 -9
  6. package/dist/_vendor/cli/context.mjs.map +1 -1
  7. package/dist/_vendor/cli/dev-session.mjs.map +1 -1
  8. package/dist/_vendor/cli/doctor.mjs +513 -46
  9. package/dist/_vendor/cli/doctor.mjs.map +1 -1
  10. package/dist/_vendor/cli/errors.mjs.map +1 -1
  11. package/dist/_vendor/cli/help.mjs.map +1 -1
  12. package/dist/_vendor/cli/index.mjs +9 -2
  13. package/dist/_vendor/cli/index.mjs.map +1 -1
  14. package/dist/_vendor/cli/messages.mjs +5 -4
  15. package/dist/_vendor/cli/messages.mjs.map +1 -1
  16. package/dist/_vendor/cli/preflight.mjs.map +1 -1
  17. package/dist/_vendor/cli/project.mjs +125 -27
  18. package/dist/_vendor/cli/project.mjs.map +1 -1
  19. package/dist/_vendor/cli/render.mjs +57 -9
  20. package/dist/_vendor/cli/render.mjs.map +1 -1
  21. package/dist/_vendor/cli/targets.mjs +4 -3
  22. package/dist/_vendor/cli/targets.mjs.map +1 -1
  23. package/dist/_vendor/core/cli.d.mts +20 -4
  24. package/dist/_vendor/core/cli.d.mts.map +1 -1
  25. package/dist/_vendor/core/cli.mjs +458 -133
  26. package/dist/_vendor/core/cli.mjs.map +1 -1
  27. package/dist/_vendor/core/devtools-auth.mjs +60 -0
  28. package/dist/_vendor/core/devtools-auth.mjs.map +1 -0
  29. package/dist/_vendor/core/index.d.mts +5 -3
  30. package/dist/_vendor/core/index.mjs +22 -2
  31. package/dist/_vendor/core/index.mjs.map +1 -1
  32. package/dist/_vendor/core/runtime/components.d.mts +111 -0
  33. package/dist/_vendor/core/runtime/components.d.mts.map +1 -0
  34. package/dist/_vendor/core/runtime/components.mjs +186 -0
  35. package/dist/_vendor/core/runtime/components.mjs.map +1 -0
  36. package/dist/_vendor/core/runtime/devtools.d.mts +4 -4
  37. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
  38. package/dist/_vendor/core/runtime/devtools.mjs +178 -60
  39. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
  40. package/dist/_vendor/core/runtime/functions.d.mts +398 -16
  41. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
  42. package/dist/_vendor/core/runtime/functions.mjs +74 -3
  43. package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
  44. package/dist/_vendor/core/runtime/id.d.mts.map +1 -1
  45. package/dist/_vendor/core/runtime/id.mjs.map +1 -1
  46. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +83 -0
  47. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -0
  48. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +720 -0
  49. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -0
  50. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +234 -0
  51. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -0
  52. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +255 -0
  53. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -0
  54. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +200 -0
  55. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -0
  56. package/dist/_vendor/core/runtime/internal/engines/shared.mjs +252 -0
  57. package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -0
  58. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +145 -0
  59. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -0
  60. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +221 -0
  61. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -0
  62. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs +32 -0
  63. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -0
  64. package/dist/_vendor/core/runtime/internal/systemMeta.mjs +61 -0
  65. package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -0
  66. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +41 -0
  67. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -0
  68. package/dist/_vendor/core/runtime/runtime.d.mts +1187 -202
  69. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
  70. package/dist/_vendor/core/runtime/runtime.mjs +73 -1365
  71. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
  72. package/dist/_vendor/core/transport.d.mts +113 -0
  73. package/dist/_vendor/core/transport.d.mts.map +1 -0
  74. package/dist/_vendor/core/transport.mjs +428 -0
  75. package/dist/_vendor/core/transport.mjs.map +1 -0
  76. package/dist/_vendor/devtools-protocol/index.d.ts +187 -4
  77. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
  78. package/dist/_vendor/devtools-protocol/index.js +25 -9
  79. package/dist/_vendor/devtools-protocol/index.js.map +1 -1
  80. package/dist/_vendor/next/config.d.ts +3 -4
  81. package/dist/_vendor/next/config.d.ts.map +1 -1
  82. package/dist/_vendor/next/config.js +37 -19
  83. package/dist/_vendor/next/config.js.map +1 -1
  84. package/dist/_vendor/next/index.d.ts +109 -29
  85. package/dist/_vendor/next/index.d.ts.map +1 -1
  86. package/dist/_vendor/next/index.js +104 -26
  87. package/dist/_vendor/next/index.js.map +1 -1
  88. package/dist/_vendor/platform-expo/index.d.ts +156 -37
  89. package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
  90. package/dist/_vendor/platform-expo/index.js +80 -12
  91. package/dist/_vendor/platform-expo/index.js.map +1 -1
  92. package/dist/_vendor/platform-expo/react.d.ts.map +1 -1
  93. package/dist/_vendor/platform-expo/react.js +11 -10
  94. package/dist/_vendor/platform-expo/react.js.map +1 -1
  95. package/dist/_vendor/platform-expo/web-sqljs-wasm.js +16 -0
  96. package/dist/_vendor/platform-expo/web-sqljs-wasm.js.map +1 -0
  97. package/dist/_vendor/platform-node/index.d.mts +192 -24
  98. package/dist/_vendor/platform-node/index.d.mts.map +1 -1
  99. package/dist/_vendor/platform-node/index.mjs +236 -97
  100. package/dist/_vendor/platform-node/index.mjs.map +1 -1
  101. package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -1
  102. package/dist/_vendor/platform-node/ipc-react.mjs +15 -2
  103. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
  104. package/dist/_vendor/platform-node/ipc.d.mts +11 -35
  105. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
  106. package/dist/_vendor/platform-node/ipc.mjs +3 -273
  107. package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
  108. package/dist/_vendor/platform-web/external-change.d.ts +43 -1
  109. package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
  110. package/dist/_vendor/platform-web/external-change.js +32 -1
  111. package/dist/_vendor/platform-web/external-change.js.map +1 -1
  112. package/dist/_vendor/platform-web/index.d.ts +323 -51
  113. package/dist/_vendor/platform-web/index.d.ts.map +1 -1
  114. package/dist/_vendor/platform-web/index.js +233 -30
  115. package/dist/_vendor/platform-web/index.js.map +1 -1
  116. package/dist/_vendor/platform-web/indexeddb.d.ts +12 -0
  117. package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -1
  118. package/dist/_vendor/platform-web/indexeddb.js +10 -0
  119. package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
  120. package/dist/_vendor/platform-web/opfs.d.ts +13 -0
  121. package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
  122. package/dist/_vendor/platform-web/opfs.js +12 -0
  123. package/dist/_vendor/platform-web/opfs.js.map +1 -1
  124. package/dist/_vendor/platform-web/persistence.d.ts +54 -0
  125. package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
  126. package/dist/_vendor/platform-web/persistence.js +15 -0
  127. package/dist/_vendor/platform-web/persistence.js.map +1 -1
  128. package/dist/_vendor/platform-web/react.d.ts +1 -2
  129. package/dist/_vendor/platform-web/react.d.ts.map +1 -1
  130. package/dist/_vendor/platform-web/react.js +27 -13
  131. package/dist/_vendor/platform-web/react.js.map +1 -1
  132. package/dist/_vendor/platform-web/sqljs.js +10 -1
  133. package/dist/_vendor/platform-web/sqljs.js.map +1 -1
  134. package/dist/_vendor/platform-web/web-sqljs-wasm.js +8 -0
  135. package/dist/_vendor/platform-web/web-sqljs-wasm.js.map +1 -0
  136. package/dist/_vendor/platform-web/worker.d.ts +71 -44
  137. package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
  138. package/dist/_vendor/platform-web/worker.js +40 -271
  139. package/dist/_vendor/platform-web/worker.js.map +1 -1
  140. package/dist/_vendor/react/index.d.ts +222 -23
  141. package/dist/_vendor/react/index.d.ts.map +1 -1
  142. package/dist/_vendor/react/index.js +476 -63
  143. package/dist/_vendor/react/index.js.map +1 -1
  144. package/dist/_vendor/schema/definition.d.ts +151 -37
  145. package/dist/_vendor/schema/definition.d.ts.map +1 -1
  146. package/dist/_vendor/schema/definition.js +102 -20
  147. package/dist/_vendor/schema/definition.js.map +1 -1
  148. package/dist/_vendor/schema/index.d.ts +4 -4
  149. package/dist/_vendor/schema/index.js +2 -2
  150. package/dist/_vendor/schema/planner.d.ts +19 -2
  151. package/dist/_vendor/schema/planner.d.ts.map +1 -1
  152. package/dist/_vendor/schema/planner.js +79 -3
  153. package/dist/_vendor/schema/planner.js.map +1 -1
  154. package/dist/_vendor/schema/validators.d.ts +279 -83
  155. package/dist/_vendor/schema/validators.d.ts.map +1 -1
  156. package/dist/_vendor/schema/validators.js +330 -38
  157. package/dist/_vendor/schema/validators.js.map +1 -1
  158. package/dist/_vendor/svelte/index.d.ts +245 -19
  159. package/dist/_vendor/svelte/index.d.ts.map +1 -1
  160. package/dist/_vendor/svelte/index.js +443 -20
  161. package/dist/_vendor/svelte/index.js.map +1 -1
  162. package/dist/browser.d.ts.map +1 -1
  163. package/dist/cli.js +3 -1
  164. package/dist/cli.js.map +1 -1
  165. package/dist/components.d.ts +2 -0
  166. package/dist/components.js +2 -0
  167. package/dist/index.d.ts +3 -2
  168. package/dist/index.js +2 -1
  169. package/package.json +29 -21
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionEngine.mjs","names":[],"sources":["../../../../src/runtime/internal/engines/executionEngine.ts"],"sourcesContent":["import type {\n FunctionArgsFromDefinition,\n FunctionKindFromDefinition,\n FunctionReference,\n FunctionResultFromDefinition,\n MisfirePolicy,\n SyncoreFunctionKind\n} from \"../../functions.js\";\nimport {\n toCanonicalComponentFunctionName,\n type SyncoreComponentFunctionMetadata\n} from \"../../components.js\";\nimport type {\n ActionCtx,\n CapabilityDescriptor,\n DevtoolsLiveQueryScope,\n DocumentForTable,\n ExecutionResult,\n FilterBuilder,\n ImpactScope,\n IndexRangeBuilder,\n InsertValueForTable,\n JsonObject,\n MutationCtx,\n PatchValueForTable,\n PaginationOptions,\n PaginationResult,\n QueryBuilder,\n QueryCtx,\n QueryExpression,\n RegisteredSyncoreFunction,\n SchedulerApi,\n SearchIndexBuilder,\n SearchQuery,\n SyncoreCapabilities,\n SyncoreClient,\n SyncoreDataModel,\n SyncoreDatabaseReader,\n SyncoreDatabaseWriter,\n SyncoreFunctionRegistry,\n SyncoreSqlDriver,\n SyncoreWatch,\n TableNames\n} from \"../../runtime.js\";\nimport type {\n AnyTableDefinition as SchemaAnyTableDefinition,\n TableIndexFields,\n TableIndexNames,\n TableSearchIndexConfig,\n TableSearchIndexNames\n} from \"@syncore/schema\";\nimport { DevtoolsEngine } from \"./devtoolsEngine.js\";\nimport { SchemaEngine } from \"./schemaEngine.js\";\nimport { StorageEngine } from \"./storageEngine.js\";\nimport { SchedulerEngine } from \"./schedulerEngine.js\";\nimport { ReactivityEngine } from \"./reactivityEngine.js\";\nimport {\n createDevtoolsPreview,\n fieldExpression,\n normalizeOptionalArgs,\n omitSystemFields,\n quoteIdentifier,\n resolveSearchIndexTableName,\n splitSchedulerArgs,\n stableStringify,\n type DatabaseRow,\n type DependencyKey,\n type DevtoolsEventMeta,\n type ExecuteQueryBuilderOptions,\n type QuerySource,\n type RuntimeExecutionState\n} from \"./shared.js\";\nimport { generateId } from \"../../id.js\";\nimport type { Validator } from \"@syncore/schema\";\nimport {\n TransactionCoordinator,\n createEmptyExecutionResult\n} from \"../transactionCoordinator.js\";\nimport type { RuntimeStatusController } from \"../runtimeStatus.js\";\n\nconst DEFAULT_MISFIRE_POLICY: MisfirePolicy = { type: \"catch_up\" };\n\ntype OptionalArgsTuple<TArgs> =\n Record<never, never> extends TArgs ? [args?: TArgs] : [args: TArgs];\n\ntype ExecutionEngineDeps<TSchema extends SyncoreDataModel> = {\n runtimeId: string;\n functions: SyncoreFunctionRegistry;\n driver: SyncoreSqlDriver;\n capabilities: Readonly<SyncoreCapabilities>;\n capabilityDescriptors: ReadonlyArray<CapabilityDescriptor>;\n schema: SchemaEngine<TSchema>;\n storage: StorageEngine;\n scheduler: SchedulerEngine;\n reactivity: ReactivityEngine;\n devtools: DevtoolsEngine;\n transactionCoordinator: TransactionCoordinator;\n runtimeStatus: RuntimeStatusController;\n};\n\nclass RuntimeFilterBuilder implements FilterBuilder {\n eq(field: string, value: unknown): QueryExpression {\n return { type: \"condition\", condition: { field, operator: \"=\", value } };\n }\n\n gt(field: string, value: unknown): QueryExpression {\n return { type: \"condition\", condition: { field, operator: \">\", value } };\n }\n\n gte(field: string, value: unknown): QueryExpression {\n return { type: \"condition\", condition: { field, operator: \">=\", value } };\n }\n\n lt(field: string, value: unknown): QueryExpression {\n return { type: \"condition\", condition: { field, operator: \"<\", value } };\n }\n\n lte(field: string, value: unknown): QueryExpression {\n return { type: \"condition\", condition: { field, operator: \"<=\", value } };\n }\n\n and(...expressions: QueryExpression[]): QueryExpression {\n return { type: \"and\", expressions };\n }\n\n or(...expressions: QueryExpression[]): QueryExpression {\n return { type: \"or\", expressions };\n }\n}\n\nclass RuntimeIndexRangeBuilder<\n TFieldName extends string = string\n> implements IndexRangeBuilder<TFieldName> {\n private readonly conditions: Array<{\n field: string;\n operator: \"=\" | \">\" | \">=\" | \"<\" | \"<=\";\n value: unknown;\n }> = [];\n\n eq(field: TFieldName, value: unknown): IndexRangeBuilder<TFieldName> {\n this.conditions.push({ field, operator: \"=\", value });\n return this;\n }\n\n gt(field: TFieldName, value: unknown): IndexRangeBuilder<TFieldName> {\n this.conditions.push({ field, operator: \">\", value });\n return this;\n }\n\n gte(field: TFieldName, value: unknown): IndexRangeBuilder<TFieldName> {\n this.conditions.push({ field, operator: \">=\", value });\n return this;\n }\n\n lt(field: TFieldName, value: unknown): IndexRangeBuilder<TFieldName> {\n this.conditions.push({ field, operator: \"<\", value });\n return this;\n }\n\n lte(field: TFieldName, value: unknown): IndexRangeBuilder<TFieldName> {\n this.conditions.push({ field, operator: \"<=\", value });\n return this;\n }\n\n build() {\n return [...this.conditions];\n }\n}\n\nclass RuntimeSearchIndexBuilder<\n TSearchField extends string = string,\n TFilterField extends string = string\n> implements SearchIndexBuilder<TSearchField, TFilterField> {\n private searchField: string | undefined;\n private searchText: string | undefined;\n private readonly filters: Array<{\n field: string;\n operator: \"=\";\n value: unknown;\n }> = [];\n\n search(\n field: TSearchField,\n value: string\n ): SearchIndexBuilder<TSearchField, TFilterField> {\n this.searchField = field;\n this.searchText = value;\n return this;\n }\n\n eq(\n field: TFilterField,\n value: unknown\n ): SearchIndexBuilder<TSearchField, TFilterField> {\n this.filters.push({ field, operator: \"=\", value });\n return this;\n }\n\n build(): SearchQuery {\n if (!this.searchField || !this.searchText) {\n throw new Error(\"Search queries require a search field and search text.\");\n }\n return {\n searchField: this.searchField,\n searchText: this.searchText,\n filters: [...this.filters]\n };\n }\n}\n\nclass RuntimeQueryBuilder<\n TTable extends SchemaAnyTableDefinition,\n TDocument\n> implements QueryBuilder<TTable, TDocument> {\n private orderDirection: \"asc\" | \"desc\" = \"asc\";\n private source: QuerySource = { type: \"table\" };\n private filterExpression: QueryExpression | undefined;\n\n constructor(\n private readonly executeQuery: (\n options: ExecuteQueryBuilderOptions\n ) => Promise<TDocument[]>,\n private readonly tableName: string,\n private readonly dependencyCollector?: Set<DependencyKey>\n ) {}\n\n withIndex<TIndexName extends TableIndexNames<TTable>>(\n indexName: TIndexName,\n builder?: (\n range: IndexRangeBuilder<TableIndexFields<TTable, TIndexName>[number]>\n ) => IndexRangeBuilder<TableIndexFields<TTable, TIndexName>[number]>\n ): this {\n const indexRange = builder?.(new RuntimeIndexRangeBuilder()).build() ?? [];\n this.source = { type: \"index\", name: indexName, range: indexRange };\n return this;\n }\n\n withSearchIndex<TIndexName extends TableSearchIndexNames<TTable>>(\n indexName: TIndexName,\n builder: (\n search: SearchIndexBuilder<\n TableSearchIndexConfig<TTable, TIndexName>[\"searchField\"],\n TableSearchIndexConfig<TTable, TIndexName>[\"filterFields\"]\n >\n ) => SearchIndexBuilder<\n TableSearchIndexConfig<TTable, TIndexName>[\"searchField\"],\n TableSearchIndexConfig<TTable, TIndexName>[\"filterFields\"]\n >\n ): this {\n this.source = {\n type: \"search\",\n name: indexName,\n query: builder(new RuntimeSearchIndexBuilder()).build()\n };\n return this;\n }\n\n order(order: \"asc\" | \"desc\"): this {\n this.orderDirection = order;\n return this;\n }\n\n filter(builder: (filter: FilterBuilder) => QueryExpression): this {\n this.filterExpression = builder(new RuntimeFilterBuilder());\n return this;\n }\n\n async collect(): Promise<TDocument[]> {\n return this.execute();\n }\n\n async take(count: number): Promise<TDocument[]> {\n return this.execute({ limit: count });\n }\n\n async first(): Promise<TDocument | null> {\n const results = await this.execute({ limit: 1 });\n return results[0] ?? null;\n }\n\n async unique(): Promise<TDocument | null> {\n const results = await this.execute({ limit: 2 });\n if (results.length > 1) {\n throw new Error(\"Expected a unique result but found multiple rows.\");\n }\n return results[0] ?? null;\n }\n\n async paginate(\n options: PaginationOptions\n ): Promise<PaginationResult<TDocument>> {\n const offset = options.cursor ? Number.parseInt(options.cursor, 10) : 0;\n const page = await this.execute({ limit: options.numItems, offset });\n const nextCursor =\n page.length < options.numItems ? null : String(offset + page.length);\n return {\n page,\n cursor: nextCursor,\n isDone: nextCursor === null\n };\n }\n\n private async execute(options?: {\n limit?: number;\n offset?: number;\n }): Promise<TDocument[]> {\n this.dependencyCollector?.add(`table:${this.tableName}`);\n const queryOptions: ExecuteQueryBuilderOptions = {\n tableName: this.tableName,\n source: this.source,\n filterExpression: this.filterExpression,\n orderDirection: this.orderDirection\n };\n if (this.dependencyCollector) {\n queryOptions.dependencyCollector = this.dependencyCollector;\n }\n if (options?.limit !== undefined) {\n queryOptions.limit = options.limit;\n }\n if (options?.offset !== undefined) {\n queryOptions.offset = options.offset;\n }\n return this.executeQuery(queryOptions);\n }\n}\n\nexport class ExecutionEngine<\n TSchema extends SyncoreDataModel\n> {\n constructor(private readonly deps: ExecutionEngineDeps<TSchema>) {}\n\n createClient(): SyncoreClient {\n return {\n query: (reference, ...args) =>\n this.runQuery(reference, normalizeOptionalArgs(args) as JsonObject),\n mutation: (reference, ...args) =>\n this.runMutation(reference, normalizeOptionalArgs(args) as JsonObject),\n action: (reference, ...args) =>\n this.runAction(reference, normalizeOptionalArgs(args) as JsonObject),\n watchQuery: (reference, ...args) =>\n this.watchQuery(reference, normalizeOptionalArgs(args) as JsonObject),\n watchRuntimeStatus: () => this.deps.runtimeStatus.watch()\n };\n }\n\n watchQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n args: JsonObject = {}\n ): SyncoreWatch<TResult> {\n return this.deps.reactivity.watchQuery(reference, args);\n }\n\n async runQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n args: JsonObject = {},\n meta: DevtoolsEventMeta = {}\n ): Promise<TResult> {\n const definition = this.resolveFunction(reference, \"query\");\n const dependencyCollector = new Set<DependencyKey>();\n const executionId = meta.executionId ?? generateId();\n const startedAt = Date.now();\n const result = await this.invokeFunction<TResult>(definition, args, {\n executionId,\n mutationDepth: 0,\n changedTables: new Set<string>(),\n documentChanges: [],\n storageChanges: [],\n dependencyCollector,\n componentMetadata: definition.__syncoreComponent\n });\n const completedAt = Date.now();\n\n this.deps.devtools.emit({\n type: \"query.executed\",\n runtimeId: this.deps.runtimeId,\n queryId: reference.name,\n functionName: reference.name,\n executionId,\n ...(meta.parentExecutionId\n ? { parentExecutionId: meta.parentExecutionId }\n : {}),\n ...(definition.__syncoreComponent\n ? {\n componentPath: definition.__syncoreComponent.componentPath,\n componentName: definition.__syncoreComponent.componentName\n }\n : {}),\n dependencies: [...dependencyCollector],\n argsPreview: createDevtoolsPreview(args),\n resultPreview: createDevtoolsPreview(result),\n readScopes: [...dependencyCollector],\n durationMs: completedAt - startedAt,\n timestamp: completedAt,\n ...(meta.origin ? { origin: meta.origin } : {})\n });\n\n return result;\n }\n\n async runMutation<TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n args: JsonObject = {},\n meta: DevtoolsEventMeta = {}\n ): Promise<TResult> {\n const definition = this.resolveFunction(reference, \"mutation\");\n const mutationId = generateId();\n const executionId = meta.executionId ?? mutationId;\n const startedAt = Date.now();\n const execution = await this.deps.transactionCoordinator.runInTransaction(\n async (transactionState) =>\n this.invokeFunction<TResult>(definition, args, {\n executionId,\n mutationDepth: 1,\n changedTables: transactionState.changedTables,\n documentChanges: transactionState.documentChanges,\n storageChanges: transactionState.storageChanges,\n componentMetadata: definition.__syncoreComponent\n })\n );\n const completedAt = Date.now();\n\n const impact = this.collectStatefulExecutionImpact(execution);\n\n this.deps.devtools.emit({\n type: \"mutation.committed\",\n runtimeId: this.deps.runtimeId,\n mutationId,\n functionName: reference.name,\n executionId,\n ...(meta.parentExecutionId\n ? { parentExecutionId: meta.parentExecutionId }\n : {}),\n ...(definition.__syncoreComponent\n ? {\n componentPath: definition.__syncoreComponent.componentPath,\n componentName: definition.__syncoreComponent.componentName\n }\n : {}),\n changedTables: [...execution.changedTables],\n argsPreview: createDevtoolsPreview(args),\n resultPreview: createDevtoolsPreview(execution.result),\n writeScopes: [...impact.changedScopes],\n changedScopes: [...impact.changedScopes],\n changedDocumentsPreview: execution.documentChanges,\n invalidatedQueryIds: impact.invalidatedQueryIds,\n durationMs: completedAt - startedAt,\n timestamp: completedAt,\n ...(meta.origin ? { origin: meta.origin } : {})\n });\n await this.publishStatefulExecutionEffects(\n executionId,\n execution,\n impact.changedScopes\n );\n\n return execution.result;\n }\n\n async runAction<TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n args: JsonObject = {},\n meta: DevtoolsEventMeta = {}\n ): Promise<TResult> {\n const definition = this.resolveFunction(reference, \"action\");\n const actionId = generateId();\n const executionId = meta.executionId ?? actionId;\n const startedAt = Date.now();\n const state = this.deps.transactionCoordinator.createState();\n\n try {\n const result = await this.invokeFunction<TResult>(definition, args, {\n executionId,\n mutationDepth: 0,\n changedTables: state.changedTables,\n documentChanges: state.documentChanges,\n storageChanges: state.storageChanges,\n componentMetadata: definition.__syncoreComponent\n });\n const completedAt = Date.now();\n const execution = createEmptyExecutionResult(result, state);\n const impact = this.collectStatefulExecutionImpact(execution);\n this.deps.devtools.emit({\n type: \"action.completed\",\n runtimeId: this.deps.runtimeId,\n actionId,\n functionName: reference.name,\n executionId,\n ...(meta.parentExecutionId\n ? { parentExecutionId: meta.parentExecutionId }\n : {}),\n ...(definition.__syncoreComponent\n ? {\n componentPath: definition.__syncoreComponent.componentPath,\n componentName: definition.__syncoreComponent.componentName\n }\n : {}),\n argsPreview: createDevtoolsPreview(args),\n resultPreview: createDevtoolsPreview(result),\n writeScopes: [...impact.changedScopes],\n changedScopes: [...impact.changedScopes],\n changedDocumentsPreview: state.documentChanges,\n invalidatedQueryIds: impact.invalidatedQueryIds,\n durationMs: completedAt - startedAt,\n timestamp: completedAt,\n ...(meta.origin ? { origin: meta.origin } : {})\n });\n await this.publishStatefulExecutionEffects(\n executionId,\n execution,\n impact.changedScopes\n );\n return result;\n } catch (error) {\n const completedAt = Date.now();\n this.deps.devtools.emit({\n type: \"action.completed\",\n runtimeId: this.deps.runtimeId,\n actionId,\n functionName: reference.name,\n executionId,\n ...(meta.parentExecutionId\n ? { parentExecutionId: meta.parentExecutionId }\n : {}),\n ...(definition.__syncoreComponent\n ? {\n componentPath: definition.__syncoreComponent.componentPath,\n componentName: definition.__syncoreComponent.componentName\n }\n : {}),\n argsPreview: createDevtoolsPreview(args),\n durationMs: completedAt - startedAt,\n timestamp: completedAt,\n ...(meta.origin ? { origin: meta.origin } : {}),\n error: error instanceof Error ? error.message : String(error)\n });\n throw error;\n }\n }\n\n async runDevtoolsMutation<TResult>(\n callback: (ctx: { db: SyncoreDatabaseWriter<TSchema> }) => Promise<TResult>,\n meta: DevtoolsEventMeta = {}\n ): Promise<TResult> {\n const mutationId = generateId();\n const executionId = meta.executionId ?? mutationId;\n const startedAt = Date.now();\n const execution = await this.deps.transactionCoordinator.runInTransaction(\n async (transactionState) =>\n callback({\n db: this.createDatabaseWriter({\n executionId,\n mutationDepth: 1,\n changedTables: transactionState.changedTables,\n documentChanges: transactionState.documentChanges,\n storageChanges: transactionState.storageChanges\n })\n })\n );\n const completedAt = Date.now();\n\n const impact = this.collectStatefulExecutionImpact(execution);\n\n this.deps.devtools.emit({\n type: \"mutation.committed\",\n runtimeId: this.deps.runtimeId,\n mutationId,\n functionName: \"__devtools__/mutation\",\n executionId,\n ...(meta.parentExecutionId\n ? { parentExecutionId: meta.parentExecutionId }\n : {}),\n changedTables: [...execution.changedTables],\n argsPreview: createDevtoolsPreview({ source: \"dashboard\" }),\n resultPreview: createDevtoolsPreview(execution.result),\n writeScopes: [...impact.changedScopes],\n changedScopes: [...impact.changedScopes],\n changedDocumentsPreview: execution.documentChanges,\n invalidatedQueryIds: impact.invalidatedQueryIds,\n durationMs: completedAt - startedAt,\n timestamp: completedAt,\n ...(meta.origin ? { origin: meta.origin } : {})\n });\n await this.publishStatefulExecutionEffects(\n executionId,\n execution,\n impact.changedScopes\n );\n return execution.result;\n }\n\n private collectStatefulExecutionImpact<TResult>(\n execution: ExecutionResult<TResult>\n ): { changedScopes: Set<ImpactScope>; invalidatedQueryIds: string[] } {\n const changedScopes = collectChangedScopes(\n execution.changedTables,\n execution.storageChanges\n );\n const invalidatedQueryIds =\n changedScopes.size > 0\n ? this.deps.reactivity.getInvalidatedQueryIdsForScopes(changedScopes)\n : [];\n return { changedScopes, invalidatedQueryIds };\n }\n\n private async publishStatefulExecutionEffects<TResult>(\n executionId: string,\n execution: ExecutionResult<TResult>,\n changedScopes: Set<ImpactScope>\n ): Promise<void> {\n if (changedScopes.size > 0) {\n await this.deps.reactivity.refreshQueriesForScopes(\n changedScopes,\n `Execution ${executionId} touched ${[...changedScopes].join(\", \")}`,\n { executionId }\n );\n }\n if (execution.changedTables.size > 0) {\n await this.deps.reactivity.publishExternalChange({\n scope: \"database\",\n reason: \"commit\",\n changedScopes: [...changedScopes].filter((scope) =>\n scope.startsWith(\"table:\")\n ),\n changedTables: [...execution.changedTables]\n });\n }\n await this.deps.reactivity.publishStorageChanges(execution.storageChanges);\n }\n\n async collectQueryDependencies(\n functionName: string,\n args: JsonObject\n ): Promise<Set<DependencyKey>> {\n const definition = this.resolveFunction(\n { kind: \"query\", name: functionName },\n \"query\"\n );\n const dependencyCollector = new Set<DependencyKey>();\n await this.invokeFunction(definition, args, {\n executionId: generateId(),\n mutationDepth: 0,\n changedTables: new Set<string>(),\n documentChanges: [],\n storageChanges: [],\n dependencyCollector,\n componentMetadata: definition.__syncoreComponent\n });\n return dependencyCollector;\n }\n\n private async executeQueryBuilder<TDocument>(\n options: ExecuteQueryBuilderOptions\n ): Promise<TDocument[]> {\n const table = this.deps.schema.getTableDefinition(options.tableName);\n const params: unknown[] = [];\n const whereClauses: string[] = [];\n const orderClauses: string[] = [];\n let joinClause = \"\";\n const source = options.source;\n\n if (source.type === \"index\") {\n const index = table.indexes.find(\n (candidate) => candidate.name === source.name\n );\n if (!index) {\n throw new Error(\n `Unknown index \"${source.name}\" on table \"${options.tableName}\".`\n );\n }\n for (const condition of source.range) {\n whereClauses.push(this.renderCondition(\"t\", condition, params));\n }\n const primaryField = index.fields[0];\n if (primaryField) {\n orderClauses.push(\n `${fieldExpression(\"t\", primaryField)} ${options.orderDirection.toUpperCase()}`\n );\n }\n }\n\n if (source.type === \"search\") {\n const searchIndex = table.searchIndexes.find(\n (candidate) => candidate.name === source.name\n );\n if (!searchIndex) {\n throw new Error(\n `Unknown search index \"${source.name}\" on table \"${options.tableName}\".`\n );\n }\n if (searchIndex.searchField !== source.query.searchField) {\n throw new Error(\n `Search index \"${searchIndex.name}\" expects field \"${searchIndex.searchField}\".`\n );\n }\n if (this.deps.schema.isSearchIndexDisabled(options.tableName, searchIndex.name)) {\n whereClauses.push(\n `${fieldExpression(\"t\", searchIndex.searchField)} LIKE ?`\n );\n params.push(`%${source.query.searchText}%`);\n } else {\n const searchTableName = resolveSearchIndexTableName(\n options.tableName,\n searchIndex.name\n );\n joinClause = `JOIN ${quoteIdentifier(searchTableName)} s ON s._id = t._id`;\n whereClauses.push(`s.search_value MATCH ?`);\n params.push(source.query.searchText);\n }\n for (const condition of source.query.filters) {\n whereClauses.push(this.renderCondition(\"t\", condition, params));\n }\n }\n\n if (options.filterExpression) {\n whereClauses.push(\n this.renderExpression(\"t\", options.filterExpression, params)\n );\n }\n\n if (orderClauses.length === 0) {\n orderClauses.push(\n `t._creationTime ${options.orderDirection.toUpperCase()}`\n );\n }\n orderClauses.push(`t._id ${options.orderDirection.toUpperCase()}`);\n\n const sql = [\n `SELECT t._id, t._creationTime, t._json FROM ${quoteIdentifier(options.tableName)} t`,\n joinClause,\n whereClauses.length > 0 ? `WHERE ${whereClauses.join(\" AND \")}` : \"\",\n `ORDER BY ${orderClauses.join(\", \")}`,\n options.limit !== undefined ? `LIMIT ${options.limit}` : \"\",\n options.offset !== undefined ? `OFFSET ${options.offset}` : \"\"\n ]\n .filter(Boolean)\n .join(\" \");\n\n const rows = await this.deps.driver.all<DatabaseRow>(sql, params);\n return rows.map((row) =>\n this.deps.schema.deserializeDocument<TDocument>(options.tableName, row)\n );\n }\n\n private async invokeFunction<TResult>(\n definition: RegisteredSyncoreFunction,\n rawArgs: JsonObject,\n state: RuntimeExecutionState\n ): Promise<TResult> {\n const args = definition.argsValidator.parse(rawArgs) as JsonObject;\n const ctx = this.createContext(definition.kind, {\n ...state,\n componentMetadata:\n definition.__syncoreComponent ?? state.componentMetadata\n });\n const result = (await definition.handler(ctx, args)) as TResult;\n if (definition.returnsValidator) {\n return definition.returnsValidator.parse(result) as TResult;\n }\n return result;\n }\n\n private createContext(\n kind: SyncoreFunctionKind,\n state: RuntimeExecutionState\n ): QueryCtx<TSchema> | MutationCtx<TSchema> | ActionCtx<TSchema> {\n const db =\n kind === \"mutation\"\n ? this.createDatabaseWriter(state)\n : this.createDatabaseReader(state);\n const storage = this.deps.storage.createStorageApi(state);\n const scheduler = this.createSchedulerApi(state.componentMetadata);\n const callerMetadata = state.componentMetadata;\n\n return {\n db,\n storage,\n capabilities: this.deps.capabilities,\n capabilityDescriptors: this.deps.capabilityDescriptors,\n ...(callerMetadata\n ? {\n component: {\n path: callerMetadata.componentPath,\n name: callerMetadata.componentName,\n version: callerMetadata.version,\n capabilities: callerMetadata.grantedCapabilities\n }\n }\n : {}),\n scheduler,\n runQuery: <TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ) =>\n this.runQuery(\n this.resolveReferenceForCaller(reference, \"query\", callerMetadata),\n normalizeOptionalArgs(args) as JsonObject,\n state.executionId ? { parentExecutionId: state.executionId } : {}\n ),\n runMutation: <TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ) => {\n const resolvedReference = this.resolveReferenceForCaller(\n reference,\n \"mutation\",\n callerMetadata\n );\n const normalizedArgs = normalizeOptionalArgs(args);\n if (kind === \"mutation\") {\n return this.deps.driver.withSavepoint(\n `sp_${generateId().replace(/-/g, \"_\")}`,\n () =>\n this.invokeFunction<TResult>(\n this.resolveFunction(\n resolvedReference,\n \"mutation\",\n callerMetadata\n ),\n normalizedArgs as JsonObject,\n {\n ...(state.executionId ? { executionId: state.executionId } : {}),\n mutationDepth: state.mutationDepth + 1,\n changedTables: state.changedTables,\n documentChanges: state.documentChanges,\n storageChanges: state.storageChanges,\n componentMetadata: callerMetadata\n }\n )\n );\n }\n return this.runMutation(\n resolvedReference,\n normalizedArgs as JsonObject,\n state.executionId ? { parentExecutionId: state.executionId } : {}\n );\n },\n runAction: <TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ) =>\n this.runAction(\n this.resolveReferenceForCaller(reference, \"action\", callerMetadata),\n normalizeOptionalArgs(args) as JsonObject,\n state.executionId ? { parentExecutionId: state.executionId } : {}\n )\n } as QueryCtx<TSchema> | MutationCtx<TSchema> | ActionCtx<TSchema>;\n }\n\n private createDatabaseReader(\n state: RuntimeExecutionState\n ): SyncoreDatabaseReader<TSchema> {\n return {\n get: async <TTableName extends TableNames<TSchema>>(\n tableName: TTableName,\n id: string\n ) => {\n const scopedTableName = this.resolveTableName(\n tableName,\n state.componentMetadata\n );\n state.dependencyCollector?.add(`table:${scopedTableName}`);\n state.dependencyCollector?.add(`row:${scopedTableName}:${id}`);\n const row = await this.deps.driver.get<DatabaseRow>(\n `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(scopedTableName)} WHERE _id = ?`,\n [id]\n );\n return row\n ? this.deps.schema.deserializeDocument<\n DocumentForTable<TSchema, TTableName>\n >(scopedTableName, row)\n : null;\n },\n query: <TTableName extends TableNames<TSchema>>(tableName: TTableName) =>\n new RuntimeQueryBuilder<\n TSchema[\"tables\"][TTableName],\n DocumentForTable<TSchema, TTableName>\n >(\n (options) =>\n this.executeQueryBuilder<DocumentForTable<TSchema, TTableName>>(\n {\n ...options,\n tableName: this.resolveTableName(\n tableName,\n state.componentMetadata\n )\n }\n ),\n this.resolveTableName(tableName, state.componentMetadata),\n state.dependencyCollector\n ),\n raw: <TValue>(sql: string, params?: unknown[]) =>\n this.deps.driver.all<TValue>(sql, params)\n };\n }\n\n private createDatabaseWriter(\n state: RuntimeExecutionState\n ): SyncoreDatabaseWriter<TSchema> {\n const reader = this.createDatabaseReader(state);\n\n return {\n ...reader,\n insert: async <TTableName extends TableNames<TSchema>>(\n tableName: TTableName,\n value: InsertValueForTable<TSchema, TTableName>\n ) => {\n const scopedTableName = this.resolveTableName(\n tableName,\n state.componentMetadata\n );\n const validated = this.deps.schema.validateDocument(\n scopedTableName,\n value as JsonObject\n );\n const id = generateId();\n const creationTime = Date.now();\n const json = stableStringify(validated);\n await this.deps.driver.run(\n `INSERT INTO ${quoteIdentifier(scopedTableName)} (_id, _creationTime, _json) VALUES (?, ?, ?)`,\n [id, creationTime, json]\n );\n await this.deps.schema.syncSearchIndexes(scopedTableName, {\n _id: id,\n _creationTime: creationTime,\n _json: json\n });\n state.changedTables.add(scopedTableName);\n state.documentChanges.push({\n table: scopedTableName,\n id,\n operation: \"insert\",\n fields: Object.keys(validated),\n afterPreview: createDevtoolsPreview({\n _id: id,\n _creationTime: creationTime,\n ...validated\n })\n });\n return id;\n },\n patch: async <TTableName extends TableNames<TSchema>>(\n tableName: TTableName,\n id: string,\n value: PatchValueForTable<TSchema, TTableName>\n ) => {\n const scopedTableName = this.resolveTableName(\n tableName,\n state.componentMetadata\n );\n const current = await reader.get(tableName, id);\n if (!current) {\n throw new Error(`Document \"${id}\" does not exist in \"${scopedTableName}\".`);\n }\n const merged: JsonObject = { ...omitSystemFields(current), ...value };\n for (const key of Object.keys(merged)) {\n if (merged[key] === undefined) {\n delete merged[key];\n }\n }\n const validated = this.deps.schema.validateDocument(\n scopedTableName,\n merged\n );\n await this.deps.driver.run(\n `UPDATE ${quoteIdentifier(scopedTableName)} SET _json = ? WHERE _id = ?`,\n [stableStringify(validated), id]\n );\n const row = await this.deps.driver.get<DatabaseRow>(\n `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(scopedTableName)} WHERE _id = ?`,\n [id]\n );\n if (row) {\n await this.deps.schema.syncSearchIndexes(scopedTableName, row);\n }\n state.changedTables.add(scopedTableName);\n state.documentChanges.push({\n table: scopedTableName,\n id,\n operation: \"patch\",\n fields: Object.keys(value as Record<string, unknown>),\n beforePreview: createDevtoolsPreview(current),\n afterPreview: createDevtoolsPreview(\n row\n ? this.deps.schema.deserializeDocument(scopedTableName, row)\n : validated\n )\n });\n },\n replace: async <TTableName extends TableNames<TSchema>>(\n tableName: TTableName,\n id: string,\n value: InsertValueForTable<TSchema, TTableName>\n ) => {\n const scopedTableName = this.resolveTableName(\n tableName,\n state.componentMetadata\n );\n const validated = this.deps.schema.validateDocument(\n scopedTableName,\n value as JsonObject\n );\n const current = await reader.get(tableName, id);\n await this.deps.driver.run(\n `UPDATE ${quoteIdentifier(scopedTableName)} SET _json = ? WHERE _id = ?`,\n [stableStringify(validated), id]\n );\n const row = await this.deps.driver.get<DatabaseRow>(\n `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(scopedTableName)} WHERE _id = ?`,\n [id]\n );\n if (!row) {\n throw new Error(`Document \"${id}\" does not exist in \"${scopedTableName}\".`);\n }\n await this.deps.schema.syncSearchIndexes(scopedTableName, row);\n state.changedTables.add(scopedTableName);\n state.documentChanges.push({\n table: scopedTableName,\n id,\n operation: \"replace\",\n fields: Object.keys(validated),\n ...(current ? { beforePreview: createDevtoolsPreview(current) } : {}),\n afterPreview: createDevtoolsPreview(\n this.deps.schema.deserializeDocument(scopedTableName, row)\n )\n });\n },\n delete: async <TTableName extends TableNames<TSchema>>(\n tableName: TTableName,\n id: string\n ) => {\n const scopedTableName = this.resolveTableName(\n tableName,\n state.componentMetadata\n );\n const current = await reader.get(tableName, id);\n await this.deps.driver.run(\n `DELETE FROM ${quoteIdentifier(scopedTableName)} WHERE _id = ?`,\n [id]\n );\n await this.deps.schema.removeSearchIndexes(scopedTableName, id);\n state.changedTables.add(scopedTableName);\n state.documentChanges.push({\n table: scopedTableName,\n id,\n operation: \"delete\",\n ...(current ? { beforePreview: createDevtoolsPreview(current) } : {})\n });\n }\n };\n }\n\n private createSchedulerApi(\n componentMetadata?: SyncoreComponentFunctionMetadata\n ): SchedulerApi {\n return {\n runAfter: async (delayMs, reference, ...args) => {\n if (\n componentMetadata &&\n !componentMetadata.grantedCapabilities.includes(\"scheduler\")\n ) {\n throw new Error(\n `Component ${JSON.stringify(componentMetadata.componentPath)} does not have scheduler capability.`\n );\n }\n const schedulerArgs = splitSchedulerArgs(args);\n const functionArgs = schedulerArgs[0];\n const misfirePolicy = schedulerArgs[1] ?? DEFAULT_MISFIRE_POLICY;\n const resolvedReference = this.resolveReferenceForCaller(\n reference,\n reference.kind,\n componentMetadata\n );\n return this.deps.scheduler.scheduleJob(\n Date.now() + delayMs,\n resolvedReference,\n functionArgs,\n misfirePolicy,\n componentMetadata\n ? `component:${componentMetadata.componentPath}:`\n : undefined\n );\n },\n runAt: async (timestamp, reference, ...args) => {\n if (\n componentMetadata &&\n !componentMetadata.grantedCapabilities.includes(\"scheduler\")\n ) {\n throw new Error(\n `Component ${JSON.stringify(componentMetadata.componentPath)} does not have scheduler capability.`\n );\n }\n const schedulerArgs = splitSchedulerArgs(args);\n const functionArgs = schedulerArgs[0];\n const misfirePolicy = schedulerArgs[1] ?? DEFAULT_MISFIRE_POLICY;\n const value =\n timestamp instanceof Date ? timestamp.getTime() : timestamp;\n const resolvedReference = this.resolveReferenceForCaller(\n reference,\n reference.kind,\n componentMetadata\n );\n return this.deps.scheduler.scheduleJob(\n value,\n resolvedReference,\n functionArgs,\n misfirePolicy,\n componentMetadata\n ? `component:${componentMetadata.componentPath}:`\n : undefined\n );\n },\n cancel: async (id) => {\n await this.deps.scheduler.cancelScheduledJob(id);\n }\n };\n }\n\n private resolveFunction<TKind extends SyncoreFunctionKind>(\n reference: FunctionReference<TKind, unknown, unknown>,\n expectedKind: TKind,\n callerMetadata?: SyncoreComponentFunctionMetadata\n ): RegisteredSyncoreFunction & {\n kind: TKind;\n } {\n const resolvedReference = this.resolveReferenceForCaller(\n reference,\n expectedKind,\n callerMetadata\n );\n const definition = this.deps.functions[resolvedReference.name];\n if (!definition) {\n throw new Error(`Unknown function \"${resolvedReference.name}\".`);\n }\n if (definition.kind !== expectedKind) {\n throw new Error(\n `Function \"${resolvedReference.name}\" is a ${definition.kind}, expected ${expectedKind}.`\n );\n }\n const metadata = definition.__syncoreComponent;\n if (metadata?.visibility === \"internal\") {\n if (!callerMetadata) {\n throw new Error(\n `Function \"${resolvedReference.name}\" is internal to component \"${metadata.componentPath}\".`\n );\n }\n if (callerMetadata.componentPath !== metadata.componentPath) {\n throw new Error(\n `Function \"${resolvedReference.name}\" is internal to component \"${metadata.componentPath}\" and cannot be called from \"${callerMetadata.componentPath}\".`\n );\n }\n }\n return definition as RegisteredSyncoreFunction & {\n kind: TKind;\n };\n }\n\n private renderExpression(\n tableAlias: string,\n expression: QueryExpression,\n params: unknown[]\n ): string {\n if (expression.type === \"condition\") {\n return this.renderCondition(tableAlias, expression.condition, params);\n }\n const separator = expression.type === \"and\" ? \" AND \" : \" OR \";\n return `(${expression.expressions\n .map((child) => this.renderExpression(tableAlias, child, params))\n .join(separator)})`;\n }\n\n private renderCondition(\n tableAlias: string,\n condition: {\n field: string;\n operator: \"=\" | \">\" | \">=\" | \"<\" | \"<=\";\n value: unknown;\n },\n params: unknown[]\n ): string {\n params.push(condition.value);\n return `${fieldExpression(tableAlias, condition.field)} ${condition.operator} ?`;\n }\n\n private resolveReferenceForCaller<TKind extends SyncoreFunctionKind>(\n reference: FunctionReference<TKind, unknown, unknown>,\n expectedKind: TKind,\n callerMetadata?: SyncoreComponentFunctionMetadata\n ): FunctionReference<TKind, unknown, unknown> {\n if (!callerMetadata) {\n return reference;\n }\n\n if (reference.name.startsWith(\"components/\")) {\n return reference;\n }\n\n const bindingMatch = /^binding:([^/]+)\\/(.+)$/.exec(reference.name);\n if (bindingMatch) {\n const bindingName = bindingMatch[1]!;\n const localName = bindingMatch[2]!;\n const targetComponentPath = callerMetadata.bindings[bindingName];\n if (!targetComponentPath) {\n throw new Error(\n `Component ${JSON.stringify(callerMetadata.componentPath)} does not define binding ${JSON.stringify(bindingName)}.`\n );\n }\n const canonicalName = toCanonicalComponentFunctionName(\n targetComponentPath,\n \"public\",\n localName\n );\n return {\n kind: expectedKind,\n name: canonicalName\n };\n }\n\n const internalName = toCanonicalComponentFunctionName(\n callerMetadata.componentPath,\n \"internal\",\n reference.name\n );\n if (this.deps.functions[internalName]) {\n return {\n kind: expectedKind,\n name: internalName\n };\n }\n\n const publicName = toCanonicalComponentFunctionName(\n callerMetadata.componentPath,\n \"public\",\n reference.name\n );\n if (this.deps.functions[publicName]) {\n return {\n kind: expectedKind,\n name: publicName\n };\n }\n\n return reference;\n }\n\n private resolveTableName<TTableName extends string>(\n tableName: TTableName,\n componentMetadata?: SyncoreComponentFunctionMetadata\n ): TTableName {\n if (!componentMetadata) {\n return tableName;\n }\n\n const scopedTableName = componentMetadata.localTables[tableName];\n if (!scopedTableName) {\n throw new Error(\n `Table ${JSON.stringify(tableName)} is not available inside component ${JSON.stringify(componentMetadata.componentPath)}.`\n );\n }\n\n return scopedTableName as TTableName;\n }\n}\n\nfunction collectChangedScopes(\n changedTables: Set<string>,\n storageChanges: Array<{\n storageId: string;\n reason: \"storage-put\" | \"storage-delete\";\n }>\n): Set<ImpactScope> {\n return new Set<ImpactScope>([\n ...[...changedTables].map((tableName) => `table:${tableName}` as ImpactScope),\n ...storageChanges.map(\n (change) => `storage:${change.storageId}` as ImpactScope\n )\n ]);\n}\n"],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ import { generateId } from "../../id.mjs";
2
+ import { parseCanonicalComponentFunctionName } from "./shared.mjs";
3
+ //#region src/runtime/internal/engines/reactivityEngine.ts
4
+ var ReactivityEngine = class {
5
+ deps;
6
+ activeQueries = /* @__PURE__ */ new Map();
7
+ detachExternalChangeListener;
8
+ pendingExternalChangePromise;
9
+ queuedExternalChange;
10
+ constructor(deps) {
11
+ this.deps = deps;
12
+ }
13
+ start() {
14
+ this.detachExternalChangeListener = this.deps.externalChangeSignal?.subscribe((event) => {
15
+ this.handleExternalChangeEvent(event);
16
+ });
17
+ }
18
+ stop() {
19
+ this.detachExternalChangeListener?.();
20
+ this.detachExternalChangeListener = void 0;
21
+ }
22
+ getActiveQueryInfos() {
23
+ return [...this.activeQueries.values()].map((query) => {
24
+ const componentFunction = parseCanonicalComponentFunctionName(query.functionName);
25
+ return {
26
+ id: query.id,
27
+ functionName: query.functionName,
28
+ args: query.args,
29
+ consumers: query.consumers,
30
+ ...componentFunction ? {
31
+ owner: "component",
32
+ componentPath: componentFunction.componentPath
33
+ } : { owner: "root" },
34
+ dependencyKeys: [...query.dependencyKeys],
35
+ lastRunAt: query.lastRunAt
36
+ };
37
+ });
38
+ }
39
+ watchQuery(reference, args = {}) {
40
+ const key = this.createActiveQueryKey(reference.name, args);
41
+ let record = this.activeQueries.get(key);
42
+ if (!record) {
43
+ record = {
44
+ id: key,
45
+ functionName: reference.name,
46
+ args,
47
+ listeners: /* @__PURE__ */ new Set(),
48
+ consumers: 0,
49
+ dependencyKeys: /* @__PURE__ */ new Set(),
50
+ lastResult: void 0,
51
+ lastError: void 0,
52
+ lastRunAt: 0
53
+ };
54
+ this.activeQueries.set(key, record);
55
+ this.notifyActiveQueriesChanged();
56
+ this.rerunActiveQuery(record);
57
+ }
58
+ const activeRecord = record;
59
+ activeRecord.consumers += 1;
60
+ let disposed = false;
61
+ const ownedListeners = /* @__PURE__ */ new Set();
62
+ return {
63
+ onUpdate: (callback) => {
64
+ activeRecord.listeners.add(callback);
65
+ ownedListeners.add(callback);
66
+ queueMicrotask(callback);
67
+ return () => {
68
+ activeRecord.listeners.delete(callback);
69
+ ownedListeners.delete(callback);
70
+ };
71
+ },
72
+ localQueryResult: () => activeRecord.lastResult,
73
+ localQueryError: () => activeRecord.lastError,
74
+ dispose: () => {
75
+ if (disposed) return;
76
+ disposed = true;
77
+ for (const callback of ownedListeners) activeRecord.listeners.delete(callback);
78
+ ownedListeners.clear();
79
+ activeRecord.consumers = Math.max(0, activeRecord.consumers - 1);
80
+ if (activeRecord.consumers === 0) {
81
+ this.activeQueries.delete(key);
82
+ this.notifyActiveQueriesChanged();
83
+ }
84
+ }
85
+ };
86
+ }
87
+ async refreshInvalidatedQueries(changedTables, mutationId) {
88
+ const impactedScopes = new Set([...changedTables].map((tableName) => `table:${tableName}`));
89
+ await this.refreshQueriesForScopes(impactedScopes, `Mutation ${mutationId} changed ${[...changedTables].join(", ")}`);
90
+ }
91
+ async refreshQueriesForScopes(scopes, reason, cause) {
92
+ const scopeSet = new Set(scopes);
93
+ if (scopeSet.size === 0) return [];
94
+ const invalidatedQueryIds = [];
95
+ for (const { query, matchedScopes } of this.getInvalidatedQueriesForScopes(scopeSet)) {
96
+ const rerunExecutionId = generateReactivityExecutionId();
97
+ this.deps.devtools.emit({
98
+ type: "query.invalidated",
99
+ runtimeId: this.deps.runtimeId,
100
+ queryId: query.id,
101
+ ...parseCanonicalComponentFunctionName(query.functionName) ? { componentPath: parseCanonicalComponentFunctionName(query.functionName).componentPath } : {},
102
+ reason,
103
+ ...cause?.executionId ? { causedByExecutionId: cause.executionId } : {},
104
+ changedScopes: [...scopeSet],
105
+ matchedScopes,
106
+ rerunExecutionId,
107
+ timestamp: Date.now()
108
+ });
109
+ invalidatedQueryIds.push(query.id);
110
+ await this.rerunActiveQuery(query, {
111
+ executionId: rerunExecutionId,
112
+ ...cause?.executionId ? { parentExecutionId: cause.executionId } : {}
113
+ });
114
+ }
115
+ return invalidatedQueryIds;
116
+ }
117
+ getInvalidatedQueryIdsForScopes(scopes) {
118
+ return this.getInvalidatedQueriesForScopes(new Set(scopes)).map(({ query }) => query.id);
119
+ }
120
+ async publishExternalChange(event) {
121
+ const changedScopes = resolveChangedScopes(event);
122
+ if (changedScopes.size === 0) throw new Error(`Syncore cannot publish external change "${event.reason}" without precise impact scopes.`);
123
+ await this.deps.externalChangeSignal?.publish({
124
+ ...event,
125
+ changedScopes: [...changedScopes],
126
+ sourceId: this.deps.externalChangeSourceId,
127
+ timestamp: Date.now()
128
+ });
129
+ }
130
+ async publishStorageChanges(storageChanges) {
131
+ for (const change of storageChanges) await this.publishExternalChange({
132
+ scope: "storage",
133
+ reason: change.reason,
134
+ changedScopes: [`storage:${change.storageId}`],
135
+ storageIds: [change.storageId]
136
+ });
137
+ }
138
+ async publishDatabaseReconcile() {
139
+ throw new Error("Syncore database reconcile without precise impact scopes is unsupported.");
140
+ }
141
+ async rerunActiveQuery(record, meta) {
142
+ record.dependencyKeys.clear();
143
+ try {
144
+ record.lastResult = await this.deps.runQuery({
145
+ kind: "query",
146
+ name: record.functionName
147
+ }, record.args, meta);
148
+ record.lastError = void 0;
149
+ record.lastRunAt = Date.now();
150
+ record.dependencyKeys = await this.deps.collectQueryDependencies(record.functionName, record.args);
151
+ } catch (error) {
152
+ record.lastError = error;
153
+ record.lastRunAt = Date.now();
154
+ }
155
+ for (const listener of record.listeners) listener();
156
+ this.notifyActiveQueriesChanged();
157
+ }
158
+ notifyActiveQueriesChanged() {
159
+ this.deps.devtools.notifyScopes(["runtime.summary", "runtime.activeQueries"]);
160
+ }
161
+ getInvalidatedQueriesForScopes(scopeSet) {
162
+ return [...this.activeQueries.values()].map((query) => ({
163
+ query,
164
+ matchedScopes: [...scopeSet].filter((scope) => query.dependencyKeys.has(scope))
165
+ })).filter(({ matchedScopes }) => matchedScopes.length > 0);
166
+ }
167
+ async handleExternalChangeEvent(event) {
168
+ if (event.sourceId === this.deps.externalChangeSourceId) return;
169
+ const result = this.deps.externalChangeApplier ? await this.deps.externalChangeApplier.applyExternalChange(event) : {
170
+ databaseChanged: event.scope === "database" || event.scope === "all",
171
+ storageChanged: event.scope === "storage" || event.scope === "all",
172
+ changedScopes: [...resolveChangedScopes(event)]
173
+ };
174
+ await this.processExternalChangeResult(result);
175
+ }
176
+ async processExternalChangeResult(result) {
177
+ const changedScopes = new Set(result.changedScopes);
178
+ if (changedScopes.size === 0) return;
179
+ if (this.pendingExternalChangePromise) {
180
+ this.queuedExternalChange = { changedScopes: new Set([...this.queuedExternalChange?.changedScopes ?? [], ...changedScopes]) };
181
+ return this.pendingExternalChangePromise;
182
+ }
183
+ this.pendingExternalChangePromise = (async () => {
184
+ this.deps.devtools.notifyScopes(toDevtoolsScopes(changedScopes));
185
+ await this.refreshQueriesForScopes(changedScopes, `External change touched ${[...changedScopes].join(", ")}`);
186
+ })();
187
+ try {
188
+ await this.pendingExternalChangePromise;
189
+ } finally {
190
+ this.pendingExternalChangePromise = void 0;
191
+ const queued = this.queuedExternalChange;
192
+ this.queuedExternalChange = void 0;
193
+ if (queued) await this.processExternalChangeResult({ changedScopes: [...queued.changedScopes] });
194
+ }
195
+ }
196
+ createActiveQueryKey(name, args) {
197
+ return `${name}:${stableStringify(args)}`;
198
+ }
199
+ };
200
+ function generateReactivityExecutionId() {
201
+ return generateId();
202
+ }
203
+ function resolveChangedScopes(event) {
204
+ if (Array.isArray(event.changedScopes) && event.changedScopes.length > 0) return new Set(event.changedScopes);
205
+ const scopes = /* @__PURE__ */ new Set();
206
+ for (const tableName of event.changedTables ?? []) scopes.add(`table:${tableName}`);
207
+ for (const storageId of event.storageIds ?? []) scopes.add(`storage:${storageId}`);
208
+ if (scopes.size === 0 && event.scope !== void 0) throw new Error(`Syncore external change scope "${event.scope}" did not provide precise impact scopes.`);
209
+ return scopes;
210
+ }
211
+ function toDevtoolsScopes(scopes) {
212
+ const resolved = /* @__PURE__ */ new Set();
213
+ for (const scope of scopes) {
214
+ if (scope.startsWith("row:")) {
215
+ const [, tableName] = scope.split(":");
216
+ if (tableName) resolved.add(`table:${tableName}`);
217
+ continue;
218
+ }
219
+ if (scope === "runtime.summary" || scope === "runtime.activeQueries" || scope === "schema.tables" || scope === "scheduler.jobs" || scope.startsWith("table:") || scope.startsWith("storage:")) resolved.add(scope);
220
+ }
221
+ return resolved.size > 0 ? [...resolved] : ["all"];
222
+ }
223
+ function stableStringify(value) {
224
+ return JSON.stringify(sortValue(value));
225
+ }
226
+ function sortValue(value) {
227
+ if (Array.isArray(value)) return value.map(sortValue);
228
+ if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, nested]) => [key, sortValue(nested)]));
229
+ return value;
230
+ }
231
+ //#endregion
232
+ export { ReactivityEngine };
233
+
234
+ //# sourceMappingURL=reactivityEngine.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactivityEngine.mjs","names":[],"sources":["../../../../src/runtime/internal/engines/reactivityEngine.ts"],"sourcesContent":["import type {\n SyncoreActiveQueryInfo,\n SyncoreDevtoolsEvent\n} from \"@syncore/devtools-protocol\";\nimport type { FunctionReference } from \"../../functions.js\";\nimport type {\n DevtoolsLiveQueryScope,\n ImpactScope,\n JsonObject,\n SyncoreExternalChangeApplier,\n SyncoreExternalChangeEvent,\n SyncoreExternalChangeSignal,\n SyncoreWatch\n} from \"../../runtime.js\";\nimport { DevtoolsEngine } from \"./devtoolsEngine.js\";\nimport { generateId } from \"../../id.js\";\nimport type {\n ActiveQueryRecord,\n DependencyKey\n} from \"./shared.js\";\nimport { parseCanonicalComponentFunctionName } from \"./shared.js\";\n\ntype ReactivityEngineDeps = {\n runtimeId: string;\n externalChangeSourceId: string;\n externalChangeSignal?: SyncoreExternalChangeSignal;\n externalChangeApplier?: SyncoreExternalChangeApplier;\n devtools: DevtoolsEngine;\n runQuery: <TResult>(\n reference: FunctionReference<\"query\", unknown, TResult>,\n args: JsonObject,\n meta?: { executionId?: string; parentExecutionId?: string }\n ) => Promise<TResult>;\n collectQueryDependencies: (\n functionName: string,\n args: JsonObject\n ) => Promise<Set<DependencyKey>>;\n};\n\nexport class ReactivityEngine {\n private readonly activeQueries = new Map<string, ActiveQueryRecord>();\n private detachExternalChangeListener: (() => void) | undefined;\n private pendingExternalChangePromise: Promise<void> | undefined;\n private queuedExternalChange:\n | {\n changedScopes: Set<ImpactScope>;\n }\n | undefined;\n\n constructor(private readonly deps: ReactivityEngineDeps) {}\n\n start(): void {\n this.detachExternalChangeListener =\n this.deps.externalChangeSignal?.subscribe((event) => {\n void this.handleExternalChangeEvent(event);\n });\n }\n\n stop(): void {\n this.detachExternalChangeListener?.();\n this.detachExternalChangeListener = undefined;\n }\n\n getActiveQueryInfos(): SyncoreActiveQueryInfo[] {\n return [...this.activeQueries.values()].map((query) => {\n const componentFunction = parseCanonicalComponentFunctionName(\n query.functionName\n );\n return {\n id: query.id,\n functionName: query.functionName,\n args: query.args,\n consumers: query.consumers,\n ...(componentFunction\n ? {\n owner: \"component\" as const,\n componentPath: componentFunction.componentPath\n }\n : {\n owner: \"root\" as const\n }),\n dependencyKeys: [...query.dependencyKeys],\n lastRunAt: query.lastRunAt\n };\n });\n }\n\n watchQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n args: JsonObject = {}\n ): SyncoreWatch<TResult> {\n const key = this.createActiveQueryKey(reference.name, args);\n let record = this.activeQueries.get(key);\n\n if (!record) {\n record = {\n id: key,\n functionName: reference.name,\n args,\n listeners: new Set<() => void>(),\n consumers: 0,\n dependencyKeys: new Set<DependencyKey>(),\n lastResult: undefined,\n lastError: undefined,\n lastRunAt: 0\n };\n this.activeQueries.set(key, record);\n this.notifyActiveQueriesChanged();\n void this.rerunActiveQuery(record);\n }\n\n const activeRecord = record;\n activeRecord.consumers += 1;\n let disposed = false;\n const ownedListeners = new Set<() => void>();\n\n return {\n onUpdate: (callback) => {\n activeRecord.listeners.add(callback);\n ownedListeners.add(callback);\n queueMicrotask(callback);\n return () => {\n activeRecord.listeners.delete(callback);\n ownedListeners.delete(callback);\n };\n },\n localQueryResult: () => activeRecord.lastResult as TResult | undefined,\n localQueryError: () => activeRecord.lastError,\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n for (const callback of ownedListeners) {\n activeRecord.listeners.delete(callback);\n }\n ownedListeners.clear();\n activeRecord.consumers = Math.max(0, activeRecord.consumers - 1);\n if (activeRecord.consumers === 0) {\n this.activeQueries.delete(key);\n this.notifyActiveQueriesChanged();\n }\n }\n };\n }\n\n async refreshInvalidatedQueries(\n changedTables: Set<string>,\n mutationId: string\n ): Promise<void> {\n const impactedScopes = new Set(\n [...changedTables].map((tableName) => `table:${tableName}` as ImpactScope)\n );\n await this.refreshQueriesForScopes(\n impactedScopes,\n `Mutation ${mutationId} changed ${[...changedTables].join(\", \")}`\n );\n }\n\n async refreshQueriesForScopes(\n scopes: Iterable<ImpactScope>,\n reason: string,\n cause?: { executionId?: string }\n ): Promise<string[]> {\n const scopeSet = new Set(scopes);\n if (scopeSet.size === 0) {\n return [];\n }\n const invalidatedQueryIds: string[] = [];\n for (const { query, matchedScopes } of this.getInvalidatedQueriesForScopes(\n scopeSet\n )) {\n const rerunExecutionId = generateReactivityExecutionId();\n this.deps.devtools.emit({\n type: \"query.invalidated\",\n runtimeId: this.deps.runtimeId,\n queryId: query.id,\n ...(parseCanonicalComponentFunctionName(query.functionName)\n ? {\n componentPath: parseCanonicalComponentFunctionName(query.functionName)!\n .componentPath\n }\n : {}),\n reason,\n ...(cause?.executionId ? { causedByExecutionId: cause.executionId } : {}),\n changedScopes: [...scopeSet],\n matchedScopes,\n rerunExecutionId,\n timestamp: Date.now()\n });\n invalidatedQueryIds.push(query.id);\n await this.rerunActiveQuery(query, {\n executionId: rerunExecutionId,\n ...(cause?.executionId ? { parentExecutionId: cause.executionId } : {})\n });\n }\n return invalidatedQueryIds;\n }\n\n getInvalidatedQueryIdsForScopes(scopes: Iterable<ImpactScope>): string[] {\n return this.getInvalidatedQueriesForScopes(new Set(scopes)).map(\n ({ query }) => query.id\n );\n }\n\n async publishExternalChange(\n event: Omit<SyncoreExternalChangeEvent, \"sourceId\" | \"timestamp\">\n ): Promise<void> {\n const changedScopes = resolveChangedScopes(event);\n if (changedScopes.size === 0) {\n throw new Error(\n `Syncore cannot publish external change \"${event.reason}\" without precise impact scopes.`\n );\n }\n await this.deps.externalChangeSignal?.publish({\n ...event,\n changedScopes: [...changedScopes],\n sourceId: this.deps.externalChangeSourceId,\n timestamp: Date.now()\n });\n }\n\n async publishStorageChanges(\n storageChanges: Array<{\n storageId: string;\n reason: \"storage-put\" | \"storage-delete\";\n }>\n ): Promise<void> {\n for (const change of storageChanges) {\n await this.publishExternalChange({\n scope: \"storage\",\n reason: change.reason,\n changedScopes: [`storage:${change.storageId}`],\n storageIds: [change.storageId]\n });\n }\n }\n\n async publishDatabaseReconcile(): Promise<void> {\n throw new Error(\n \"Syncore database reconcile without precise impact scopes is unsupported.\"\n );\n }\n\n private async rerunActiveQuery(\n record: ActiveQueryRecord,\n meta?: { executionId?: string; parentExecutionId?: string }\n ): Promise<void> {\n record.dependencyKeys.clear();\n try {\n const result = await this.deps.runQuery(\n { kind: \"query\", name: record.functionName },\n record.args,\n meta\n );\n record.lastResult = result;\n record.lastError = undefined;\n record.lastRunAt = Date.now();\n record.dependencyKeys = await this.deps.collectQueryDependencies(\n record.functionName,\n record.args\n );\n } catch (error) {\n record.lastError = error as Error;\n record.lastRunAt = Date.now();\n }\n for (const listener of record.listeners) {\n listener();\n }\n this.notifyActiveQueriesChanged();\n }\n\n private notifyActiveQueriesChanged(): void {\n this.deps.devtools.notifyScopes([\"runtime.summary\", \"runtime.activeQueries\"]);\n }\n\n private getInvalidatedQueriesForScopes(scopeSet: Set<ImpactScope>): Array<{\n query: ActiveQueryRecord;\n matchedScopes: ImpactScope[];\n }> {\n return [...this.activeQueries.values()]\n .map((query) => ({\n query,\n matchedScopes: [...scopeSet].filter((scope) =>\n query.dependencyKeys.has(scope)\n )\n }))\n .filter(({ matchedScopes }) => matchedScopes.length > 0);\n }\n\n private async handleExternalChangeEvent(\n event: SyncoreExternalChangeEvent\n ): Promise<void> {\n if (event.sourceId === this.deps.externalChangeSourceId) {\n return;\n }\n const result = this.deps.externalChangeApplier\n ? await this.deps.externalChangeApplier.applyExternalChange(event)\n : {\n databaseChanged: event.scope === \"database\" || event.scope === \"all\",\n storageChanged: event.scope === \"storage\" || event.scope === \"all\",\n changedScopes: [...resolveChangedScopes(event)]\n };\n await this.processExternalChangeResult(result);\n }\n\n private async processExternalChangeResult(result: {\n changedScopes: ImpactScope[];\n }): Promise<void> {\n const changedScopes = new Set(result.changedScopes);\n if (changedScopes.size === 0) {\n return;\n }\n if (this.pendingExternalChangePromise) {\n this.queuedExternalChange = {\n changedScopes: new Set([\n ...(this.queuedExternalChange?.changedScopes ?? []),\n ...changedScopes\n ])\n };\n return this.pendingExternalChangePromise;\n }\n\n this.pendingExternalChangePromise = (async () => {\n this.deps.devtools.notifyScopes(toDevtoolsScopes(changedScopes));\n await this.refreshQueriesForScopes(\n changedScopes,\n `External change touched ${[...changedScopes].join(\", \")}`\n );\n })();\n\n try {\n await this.pendingExternalChangePromise;\n } finally {\n this.pendingExternalChangePromise = undefined;\n const queued = this.queuedExternalChange;\n this.queuedExternalChange = undefined;\n if (queued) {\n await this.processExternalChangeResult({\n changedScopes: [...queued.changedScopes]\n });\n }\n }\n }\n\n private createActiveQueryKey(name: string, args: JsonObject): string {\n return `${name}:${stableStringify(args)}`;\n }\n}\n\nfunction generateReactivityExecutionId(): string {\n return generateId();\n}\n\nfunction resolveChangedScopes(\n event: Pick<\n SyncoreExternalChangeEvent,\n \"scope\" | \"changedScopes\" | \"changedTables\" | \"storageIds\"\n >\n): Set<ImpactScope> {\n if (Array.isArray(event.changedScopes) && event.changedScopes.length > 0) {\n return new Set(event.changedScopes);\n }\n\n const scopes = new Set<ImpactScope>();\n for (const tableName of event.changedTables ?? []) {\n scopes.add(`table:${tableName}`);\n }\n for (const storageId of event.storageIds ?? []) {\n scopes.add(`storage:${storageId}`);\n }\n\n if (scopes.size === 0 && event.scope !== undefined) {\n throw new Error(\n `Syncore external change scope \"${event.scope}\" did not provide precise impact scopes.`\n );\n }\n\n return scopes;\n}\n\nfunction toDevtoolsScopes(\n scopes: Iterable<ImpactScope>\n): DevtoolsLiveQueryScope[] {\n const resolved = new Set<DevtoolsLiveQueryScope>();\n for (const scope of scopes) {\n if (scope.startsWith(\"row:\")) {\n const [, tableName] = scope.split(\":\");\n if (tableName) {\n resolved.add(`table:${tableName}`);\n }\n continue;\n }\n if (\n scope === \"runtime.summary\" ||\n scope === \"runtime.activeQueries\" ||\n scope === \"schema.tables\" ||\n scope === \"scheduler.jobs\" ||\n scope.startsWith(\"table:\") ||\n scope.startsWith(\"storage:\")\n ) {\n resolved.add(scope as DevtoolsLiveQueryScope);\n }\n }\n return resolved.size > 0 ? [...resolved] : [\"all\"];\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortValue);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, sortValue(nested)])\n );\n }\n return value;\n}\n"],"mappings":"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"}