@fragno-dev/db 0.2.0 → 0.2.1

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 (32) hide show
  1. package/.turbo/turbo-build.log +20 -20
  2. package/CHANGELOG.md +17 -0
  3. package/dist/db-fragment-definition-builder.d.ts +55 -1
  4. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  5. package/dist/db-fragment-definition-builder.js +49 -5
  6. package/dist/db-fragment-definition-builder.js.map +1 -1
  7. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  8. package/dist/fragments/internal-fragment.js.map +1 -1
  9. package/dist/mod.d.ts.map +1 -1
  10. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -1
  11. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  12. package/dist/query/unit-of-work/execute-unit-of-work.js +133 -1
  13. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  14. package/dist/query/unit-of-work/unit-of-work.d.ts +18 -3
  15. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  16. package/dist/query/unit-of-work/unit-of-work.js +25 -11
  17. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  18. package/dist/schema/create.d.ts +0 -3
  19. package/dist/schema/create.d.ts.map +1 -1
  20. package/dist/schema/create.js +0 -4
  21. package/dist/schema/create.js.map +1 -1
  22. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -1
  23. package/package.json +3 -3
  24. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +1 -0
  25. package/src/db-fragment-definition-builder.ts +187 -7
  26. package/src/fragments/internal-fragment.ts +0 -1
  27. package/src/hooks/hooks.test.ts +28 -16
  28. package/src/query/unit-of-work/execute-unit-of-work.test.ts +555 -1
  29. package/src/query/unit-of-work/execute-unit-of-work.ts +312 -4
  30. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +249 -1
  31. package/src/query/unit-of-work/unit-of-work.ts +39 -17
  32. package/src/schema/create.ts +0 -5
@@ -1 +1 @@
1
- {"version":3,"file":"internal-fragment.js","names":["version"],"sources":["../../src/fragments/internal-fragment.ts"],"sourcesContent":["import { FragmentDefinitionBuilder } from \"@fragno-dev/core\";\nimport type { InstantiatedFragmentFromDefinition } from \"@fragno-dev/core\";\nimport {\n DatabaseFragmentDefinitionBuilder,\n type DatabaseHandlerContext,\n type DatabaseRequestStorage,\n type DatabaseServiceContext,\n type FragnoPublicConfigWithDatabase,\n type ImplicitDatabaseDependencies,\n} from \"../db-fragment-definition-builder\";\nimport type { FragnoId } from \"../schema/create\";\nimport { schema, idColumn, column } from \"../schema/create\";\nimport type { RetryPolicy } from \"../query/unit-of-work/retry-policy\";\n\n// Constants for Fragno's internal settings table\nexport const SETTINGS_TABLE_NAME = \"fragno_db_settings\" as const;\n// FIXME: In some places we simply use empty string \"\" as namespace, which is not correct.\nexport const SETTINGS_NAMESPACE = \"fragno-db-settings\" as const;\n\nexport const internalSchema = schema((s) => {\n return s\n .addTable(SETTINGS_TABLE_NAME, (t) => {\n return t\n .addColumn(\"id\", idColumn())\n .addColumn(\"key\", column(\"string\"))\n .addColumn(\"value\", column(\"string\"))\n .createIndex(\"unique_key\", [\"key\"], { unique: true });\n })\n .addTable(\"fragno_hooks\", (t) => {\n return t\n .addColumn(\"id\", idColumn())\n .addColumn(\"namespace\", column(\"string\"))\n .addColumn(\"hookName\", column(\"string\"))\n .addColumn(\"payload\", column(\"json\"))\n .addColumn(\"status\", column(\"string\")) // \"pending\" | \"processing\" | \"completed\" | \"failed\"\n .addColumn(\"attempts\", column(\"integer\").defaultTo(0))\n .addColumn(\"maxAttempts\", column(\"integer\").defaultTo(5))\n .addColumn(\"lastAttemptAt\", column(\"timestamp\").nullable())\n .addColumn(\"nextRetryAt\", column(\"timestamp\").nullable())\n .addColumn(\"error\", column(\"string\").nullable())\n .addColumn(\n \"createdAt\",\n column(\"timestamp\").defaultTo((b) => b.now()),\n )\n .addColumn(\"nonce\", column(\"string\"))\n .createIndex(\"idx_namespace_status_retry\", [\"namespace\", \"status\", \"nextRetryAt\"])\n .createIndex(\"idx_nonce\", [\"nonce\"]);\n });\n});\n\n// This uses DatabaseFragmentDefinitionBuilder directly\n// to avoid circular dependency (it doesn't need to link to itself)\nexport const internalFragmentDef = new DatabaseFragmentDefinitionBuilder(\n new FragmentDefinitionBuilder<\n {},\n FragnoPublicConfigWithDatabase,\n ImplicitDatabaseDependencies<typeof internalSchema>,\n {},\n {},\n {},\n {},\n DatabaseServiceContext<{}>,\n DatabaseHandlerContext,\n DatabaseRequestStorage\n >(\"$fragno-internal-fragment\"),\n internalSchema,\n \"\", // intentionally blank namespace so there is no prefix\n)\n .providesService(\"settingsService\", ({ defineService }) => {\n return defineService({\n async get(\n namespace: string,\n key: string,\n ): Promise<{ id: FragnoId; key: string; value: string } | undefined> {\n const fullKey = `${namespace}.${key}`;\n const uow = this.uow(internalSchema).find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", fullKey)),\n );\n const [results] = await uow.retrievalPhase;\n return results?.[0];\n },\n\n async set(namespace: string, key: string, value: string) {\n const fullKey = `${namespace}.${key}`;\n const uow = this.uow(internalSchema);\n\n // First, find if the key already exists\n const findUow = uow.find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", fullKey)),\n );\n const [existing] = await findUow.retrievalPhase;\n\n if (existing?.[0]) {\n uow.update(SETTINGS_TABLE_NAME, existing[0].id, (b) => b.set({ value }).check());\n } else {\n uow.create(SETTINGS_TABLE_NAME, {\n key: fullKey,\n value,\n });\n }\n\n // Await mutation phase - will throw if mutation fails\n await uow.mutationPhase;\n },\n\n async delete(id: FragnoId) {\n const uow = this.uow(internalSchema);\n uow.delete(SETTINGS_TABLE_NAME, id);\n await uow.mutationPhase;\n },\n });\n })\n .providesService(\"hookService\", ({ defineService }) => {\n // TODO(Wilco): re-implement this better\n return defineService({\n /**\n * Get pending hook events for processing.\n * Returns all pending events for the given namespace that are ready to be processed.\n */\n async getPendingHookEvents(namespace: string): Promise<\n {\n id: FragnoId;\n hookName: string;\n payload: unknown;\n attempts: number;\n maxAttempts: number;\n nonce: string;\n }[]\n > {\n const uow = this.uow(internalSchema).find(\"fragno_hooks\", (b) =>\n b.whereIndex(\"idx_namespace_status_retry\", (eb) =>\n eb.and(eb(\"namespace\", \"=\", namespace), eb(\"status\", \"=\", \"pending\")),\n ),\n );\n\n const [events] = await uow.retrievalPhase;\n\n // Filter for pending status and events ready for retry\n const now = new Date();\n const ready = events.filter((event) => {\n // FIXME(Wilco): this should be handled by the database query, but there seems to be an issue.\n if (!event.nextRetryAt) {\n return true; // Newly created events (nextRetryAt = null) are ready\n }\n return event.nextRetryAt <= now; // Only include if retry time has passed\n });\n\n return ready.map((event) => ({\n id: event.id,\n hookName: event.hookName,\n payload: event.payload,\n attempts: event.attempts,\n maxAttempts: event.maxAttempts,\n nonce: event.nonce,\n }));\n },\n\n /**\n * Mark a hook event as completed.\n */\n markHookCompleted(eventId: FragnoId): void {\n const uow = this.uow(internalSchema);\n uow.update(\"fragno_hooks\", eventId, (b) =>\n b.set({ status: \"completed\", lastAttemptAt: new Date() }).check(),\n );\n },\n\n /**\n * Mark a hook event as failed and schedule next retry.\n */\n markHookFailed(\n eventId: FragnoId,\n error: string,\n attempts: number,\n retryPolicy: RetryPolicy,\n ): void {\n const uow = this.uow(internalSchema);\n\n const newAttempts = attempts + 1;\n const shouldRetry = retryPolicy.shouldRetry(newAttempts - 1);\n\n if (shouldRetry) {\n const delayMs = retryPolicy.getDelayMs(newAttempts - 1);\n const nextRetryAt = new Date(Date.now() + delayMs);\n uow.update(\"fragno_hooks\", eventId, (b) =>\n b\n .set({\n status: \"pending\",\n attempts: newAttempts,\n lastAttemptAt: new Date(),\n nextRetryAt,\n error,\n })\n .check(),\n );\n } else {\n uow.update(\"fragno_hooks\", eventId, (b) =>\n b\n .set({\n status: \"failed\",\n attempts: newAttempts,\n lastAttemptAt: new Date(),\n error,\n })\n .check(),\n );\n }\n },\n\n /**\n * Mark a hook event as processing (to prevent concurrent execution).\n */\n markHookProcessing(eventId: FragnoId): void {\n const uow = this.uow(internalSchema);\n uow.update(\"fragno_hooks\", eventId, (b) =>\n b.set({ status: \"processing\", lastAttemptAt: new Date() }).check(),\n );\n },\n });\n })\n .build();\n\n/**\n * Type representing an instantiated internal fragment.\n * This is the fragment that manages Fragno's internal settings table.\n */\nexport type InternalFragmentInstance = InstantiatedFragmentFromDefinition<\n typeof internalFragmentDef\n>;\n\nexport async function getSchemaVersionFromDatabase(\n fragment: InternalFragmentInstance,\n namespace: string,\n): Promise<number> {\n try {\n const version = await fragment.inContext(async function () {\n const version = await this.uow(async ({ executeRetrieve }) => {\n const version = fragment.services.settingsService.get(namespace, \"schema_version\");\n await executeRetrieve();\n return version;\n });\n\n return version ? parseInt(version.value, 10) : 0;\n });\n return version;\n } catch {\n return 0;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"internal-fragment.js","names":["version"],"sources":["../../src/fragments/internal-fragment.ts"],"sourcesContent":["import { FragmentDefinitionBuilder } from \"@fragno-dev/core\";\nimport type { InstantiatedFragmentFromDefinition } from \"@fragno-dev/core\";\nimport {\n DatabaseFragmentDefinitionBuilder,\n type DatabaseHandlerContext,\n type DatabaseRequestStorage,\n type DatabaseServiceContext,\n type FragnoPublicConfigWithDatabase,\n type ImplicitDatabaseDependencies,\n} from \"../db-fragment-definition-builder\";\nimport type { FragnoId } from \"../schema/create\";\nimport { schema, idColumn, column } from \"../schema/create\";\nimport type { RetryPolicy } from \"../query/unit-of-work/retry-policy\";\n\n// Constants for Fragno's internal settings table\nexport const SETTINGS_TABLE_NAME = \"fragno_db_settings\" as const;\n// FIXME: In some places we simply use empty string \"\" as namespace, which is not correct.\nexport const SETTINGS_NAMESPACE = \"fragno-db-settings\" as const;\n\nexport const internalSchema = schema((s) => {\n return s\n .addTable(SETTINGS_TABLE_NAME, (t) => {\n return t\n .addColumn(\"id\", idColumn())\n .addColumn(\"key\", column(\"string\"))\n .addColumn(\"value\", column(\"string\"))\n .createIndex(\"unique_key\", [\"key\"], { unique: true });\n })\n .addTable(\"fragno_hooks\", (t) => {\n return t\n .addColumn(\"id\", idColumn())\n .addColumn(\"namespace\", column(\"string\"))\n .addColumn(\"hookName\", column(\"string\"))\n .addColumn(\"payload\", column(\"json\"))\n .addColumn(\"status\", column(\"string\")) // \"pending\" | \"processing\" | \"completed\" | \"failed\"\n .addColumn(\"attempts\", column(\"integer\").defaultTo(0))\n .addColumn(\"maxAttempts\", column(\"integer\").defaultTo(5))\n .addColumn(\"lastAttemptAt\", column(\"timestamp\").nullable())\n .addColumn(\"nextRetryAt\", column(\"timestamp\").nullable())\n .addColumn(\"error\", column(\"string\").nullable())\n .addColumn(\n \"createdAt\",\n column(\"timestamp\").defaultTo((b) => b.now()),\n )\n .addColumn(\"nonce\", column(\"string\"))\n .createIndex(\"idx_namespace_status_retry\", [\"namespace\", \"status\", \"nextRetryAt\"])\n .createIndex(\"idx_nonce\", [\"nonce\"]);\n });\n});\n\n// This uses DatabaseFragmentDefinitionBuilder directly\n// to avoid circular dependency (it doesn't need to link to itself)\nexport const internalFragmentDef = new DatabaseFragmentDefinitionBuilder(\n new FragmentDefinitionBuilder<\n {},\n FragnoPublicConfigWithDatabase,\n ImplicitDatabaseDependencies<typeof internalSchema>,\n {},\n {},\n {},\n {},\n DatabaseServiceContext<{}>,\n DatabaseHandlerContext,\n DatabaseRequestStorage\n >(\"$fragno-internal-fragment\"),\n internalSchema,\n \"\", // intentionally blank namespace so there is no prefix\n)\n .providesService(\"settingsService\", ({ defineService }) => {\n return defineService({\n async get(\n namespace: string,\n key: string,\n ): Promise<{ id: FragnoId; key: string; value: string } | undefined> {\n const fullKey = `${namespace}.${key}`;\n const uow = this.uow(internalSchema).find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", fullKey)),\n );\n const [results] = await uow.retrievalPhase;\n return results?.[0];\n },\n\n async set(namespace: string, key: string, value: string) {\n const fullKey = `${namespace}.${key}`;\n const uow = this.uow(internalSchema);\n\n // First, find if the key already exists\n const findUow = uow.find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", fullKey)),\n );\n const [existing] = await findUow.retrievalPhase;\n\n if (existing?.[0]) {\n uow.update(SETTINGS_TABLE_NAME, existing[0].id, (b) => b.set({ value }).check());\n } else {\n uow.create(SETTINGS_TABLE_NAME, {\n key: fullKey,\n value,\n });\n }\n\n // Await mutation phase - will throw if mutation fails\n await uow.mutationPhase;\n },\n\n async delete(id: FragnoId) {\n const uow = this.uow(internalSchema);\n uow.delete(SETTINGS_TABLE_NAME, id);\n await uow.mutationPhase;\n },\n });\n })\n .providesService(\"hookService\", ({ defineService }) => {\n return defineService({\n /**\n * Get pending hook events for processing.\n * Returns all pending events for the given namespace that are ready to be processed.\n */\n async getPendingHookEvents(namespace: string): Promise<\n {\n id: FragnoId;\n hookName: string;\n payload: unknown;\n attempts: number;\n maxAttempts: number;\n nonce: string;\n }[]\n > {\n const uow = this.uow(internalSchema).find(\"fragno_hooks\", (b) =>\n b.whereIndex(\"idx_namespace_status_retry\", (eb) =>\n eb.and(eb(\"namespace\", \"=\", namespace), eb(\"status\", \"=\", \"pending\")),\n ),\n );\n\n const [events] = await uow.retrievalPhase;\n\n // Filter for pending status and events ready for retry\n const now = new Date();\n const ready = events.filter((event) => {\n // FIXME(Wilco): this should be handled by the database query, but there seems to be an issue.\n if (!event.nextRetryAt) {\n return true; // Newly created events (nextRetryAt = null) are ready\n }\n return event.nextRetryAt <= now; // Only include if retry time has passed\n });\n\n return ready.map((event) => ({\n id: event.id,\n hookName: event.hookName,\n payload: event.payload,\n attempts: event.attempts,\n maxAttempts: event.maxAttempts,\n nonce: event.nonce,\n }));\n },\n\n /**\n * Mark a hook event as completed.\n */\n markHookCompleted(eventId: FragnoId): void {\n const uow = this.uow(internalSchema);\n uow.update(\"fragno_hooks\", eventId, (b) =>\n b.set({ status: \"completed\", lastAttemptAt: new Date() }).check(),\n );\n },\n\n /**\n * Mark a hook event as failed and schedule next retry.\n */\n markHookFailed(\n eventId: FragnoId,\n error: string,\n attempts: number,\n retryPolicy: RetryPolicy,\n ): void {\n const uow = this.uow(internalSchema);\n\n const newAttempts = attempts + 1;\n const shouldRetry = retryPolicy.shouldRetry(newAttempts - 1);\n\n if (shouldRetry) {\n const delayMs = retryPolicy.getDelayMs(newAttempts - 1);\n const nextRetryAt = new Date(Date.now() + delayMs);\n uow.update(\"fragno_hooks\", eventId, (b) =>\n b\n .set({\n status: \"pending\",\n attempts: newAttempts,\n lastAttemptAt: new Date(),\n nextRetryAt,\n error,\n })\n .check(),\n );\n } else {\n uow.update(\"fragno_hooks\", eventId, (b) =>\n b\n .set({\n status: \"failed\",\n attempts: newAttempts,\n lastAttemptAt: new Date(),\n error,\n })\n .check(),\n );\n }\n },\n\n /**\n * Mark a hook event as processing (to prevent concurrent execution).\n */\n markHookProcessing(eventId: FragnoId): void {\n const uow = this.uow(internalSchema);\n uow.update(\"fragno_hooks\", eventId, (b) =>\n b.set({ status: \"processing\", lastAttemptAt: new Date() }).check(),\n );\n },\n });\n })\n .build();\n\n/**\n * Type representing an instantiated internal fragment.\n * This is the fragment that manages Fragno's internal settings table.\n */\nexport type InternalFragmentInstance = InstantiatedFragmentFromDefinition<\n typeof internalFragmentDef\n>;\n\nexport async function getSchemaVersionFromDatabase(\n fragment: InternalFragmentInstance,\n namespace: string,\n): Promise<number> {\n try {\n const version = await fragment.inContext(async function () {\n const version = await this.uow(async ({ executeRetrieve }) => {\n const version = fragment.services.settingsService.get(namespace, \"schema_version\");\n await executeRetrieve();\n return version;\n });\n\n return version ? parseInt(version.value, 10) : 0;\n });\n return version;\n } catch {\n return 0;\n }\n}\n"],"mappings":"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"}
package/dist/mod.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;cAiBa;cACA;UAEI,gDAAgD;;EAHpD,MAAA,EAKH,CALG;AACb;AAEiB,iBAKD,gBAAA,CALC,KAAqC,EAAA,OAAA,CAAW,EAAA,KAAA,IAKN,cAHhD,CAG+D,SAH/D,CAAA;AAGX;AAmBA;;;AAKgF,cALnE,cAKmE,CAAA,gBALpC,SAKoC,EAAA,aAAA,IAAA,CAAA,CAAA;EAAhB,CAAA,OAAA;EAMrB,WAAA,CAAA,OAAA,EAAA;IAApC,SAAA,EAAA,MAAA;IAQK,MAAA,EAdwC,CAcxC;IAIqB,OAAA,EAlB+B,eAkB/B,CAlB+C,UAkB/C,CAAA;EAAhB,CAAA;EAAe,KAZzB,wBAAA,GAYyB,EAAA,OAZW,wBAYX;EAiDpB,IAAA,SAAA,CAAA,CAAA,EAAA,MAAA;EAGmB,IAAA,MAAA,CAAA,CAAA,EAxDnB,CAwDmB;EAA7B,IAAA,OAAA,CAAA,CAAA,EApDe,eAoDf,CApD+B,UAoD/B,CAAA;;KAHU,qCAAA,GAAwC,gCAGlD,6BAA6B,gCAS7B;oBAEoB;IAA6B,eAAe;;;;;;;;;;;;;;;;;;;;;;;iBAyB5C,OAAA,WAAkB,wCAAwC"}
1
+ {"version":3,"file":"mod.d.ts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;cAiBa;cACA;UAEI,gDAAgD;;EAHpD,MAAA,EAKH,CALG;AACb;AAEiB,iBAKD,gBAAA,CALC,KAAqC,EAAA,OAAA,CAAA,EAAW,KAAA,IAKN,cAHhD,CAG+D,SAH/D,CAAA;AAGX;AAmBA;;;AAKgF,cALnE,cAKmE,CAAA,gBALpC,SAKoC,EAAA,aAAA,IAAA,CAAA,CAAA;EAAhB,CAAA,OAAA;EAMrB,WAAA,CAAA,OAAA,EAAA;IAApC,SAAA,EAAA,MAAA;IAQK,MAAA,EAdwC,CAcxC;IAIqB,OAAA,EAlB+B,eAkB/B,CAlB+C,UAkB/C,CAAA;EAAhB,CAAA;EAAe,KAZzB,wBAAA,GAYyB,EAAA,OAZW,wBAYX;EAiDpB,IAAA,SAAA,CAAA,CAAA,EAAA,MAAA;EAGmB,IAAA,MAAA,CAAA,CAAA,EAxDnB,CAwDmB;EAA7B,IAAA,OAAA,CAAA,CAAA,EApDe,eAoDf,CApD+B,UAoD/B,CAAA;;KAHU,qCAAA,GAAwC,gCAGlD,6BAA6B,gCAS7B;oBAEoB;IAA6B,eAAe;;;;;;;;;;;;;;;;;;;;;;;iBAyB5C,OAAA,WAAkB,wCAAwC"}
@@ -1,5 +1,6 @@
1
1
  import { AnySchema, FragnoId } from "../../schema/create.js";
2
2
  import { RetryPolicy } from "./retry-policy.js";
3
+ import { HooksMap } from "../../hooks/hooks.js";
3
4
  import { IUnitOfWork, TypedUnitOfWork } from "./unit-of-work.js";
4
5
 
5
6
  //#region src/query/unit-of-work/execute-unit-of-work.d.ts
@@ -128,6 +129,41 @@ interface ExecuteRestrictedUnitOfWorkOptions {
128
129
  */
129
130
  onSuccess?: (uow: IUnitOfWork) => Promise<void>;
130
131
  }
132
+ /**
133
+ * Context provided to handler tx callbacks
134
+ */
135
+ interface TxPhaseContext<THooks extends HooksMap> {
136
+ /**
137
+ * Get a typed Unit of Work for the given schema
138
+ */
139
+ forSchema: <S extends AnySchema, H extends HooksMap = THooks>(schema: S, hooks?: H) => TypedUnitOfWork<S, [], unknown, H>;
140
+ }
141
+ /**
142
+ * Handler callbacks for tx() - SYNCHRONOUS ONLY (no Promise return allowed)
143
+ * This prevents accidentally awaiting services in the wrong place
144
+ */
145
+ interface HandlerTxCallbacks<TRetrieveResult, TMutationResult, THooks extends HooksMap> {
146
+ /**
147
+ * Retrieval phase callback - schedules retrievals and optionally calls services
148
+ * Must be synchronous - cannot await promises
149
+ */
150
+ retrieve?: (context: TxPhaseContext<THooks>) => TRetrieveResult;
151
+ /**
152
+ * Mutation phase callback - receives retrieve result, schedules mutations
153
+ * Must be synchronous - cannot await promises (but may return a promise to be awaited)
154
+ */
155
+ mutate?: (context: TxPhaseContext<THooks>, retrieveResult: TRetrieveResult) => TMutationResult;
156
+ }
157
+ interface ServiceTxCallbacks<TSchema extends AnySchema, TRetrievalResults extends unknown[], TMutationResult, THooks extends HooksMap> {
158
+ /**
159
+ * Retrieval phase callback - schedules retrievals, returns typed UOW
160
+ */
161
+ retrieve?: (uow: TypedUnitOfWork<TSchema, [], unknown, THooks>) => TypedUnitOfWork<TSchema, TRetrievalResults, unknown, THooks>;
162
+ /**
163
+ * Mutation phase callback - receives retrieval results, schedules mutations and hooks
164
+ */
165
+ mutate?: (uow: TypedUnitOfWork<TSchema, TRetrievalResults, unknown, THooks>, results: TRetrievalResults) => TMutationResult | Promise<TMutationResult>;
166
+ }
131
167
  //#endregion
132
- export { AwaitedPromisesInObject, ExecuteRestrictedUnitOfWorkOptions, ExecuteUnitOfWorkCallbacks, ExecuteUnitOfWorkOptions, ExecuteUnitOfWorkResult, executeUnitOfWork };
168
+ export { AwaitedPromisesInObject, ExecuteRestrictedUnitOfWorkOptions, ExecuteUnitOfWorkCallbacks, ExecuteUnitOfWorkOptions, ExecuteUnitOfWorkResult, HandlerTxCallbacks, ServiceTxCallbacks, executeUnitOfWork };
133
169
  //# sourceMappingURL=execute-unit-of-work.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"execute-unit-of-work.d.ts","names":[],"sources":["../../../src/query/unit-of-work/execute-unit-of-work.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"execute-unit-of-work.d.ts","names":[],"sources":["../../../src/query/unit-of-work/execute-unit-of-work.ts"],"sourcesContent":[],"mappings":"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"}
@@ -191,7 +191,139 @@ async function executeRestrictedUnitOfWork(callback, options) {
191
191
  }
192
192
  }
193
193
  }
194
+ /**
195
+ * Execute a transaction with array syntax (handler context).
196
+ * Takes a factory function that creates an array of service promises, enabling proper retry support.
197
+ *
198
+ * @param servicesFactory - Function that creates an array of service promises
199
+ * @param options - Configuration including UOW factory, retry policy, and abort signal
200
+ * @returns Promise resolving to array of awaited service results
201
+ *
202
+ * @example
203
+ * ```ts
204
+ * const [result1, result2] = await executeTxArray(
205
+ * () => [
206
+ * executeServiceTx(schema, callbacks1, uow),
207
+ * executeServiceTx(schema, callbacks2, uow)
208
+ * ],
209
+ * { createUnitOfWork }
210
+ * );
211
+ * ```
212
+ */
213
+ async function executeTxArray(servicesFactory, options) {
214
+ const retryPolicy = options.retryPolicy ?? new ExponentialBackoffRetryPolicy({
215
+ maxRetries: 5,
216
+ initialDelayMs: 10,
217
+ maxDelayMs: 100
218
+ });
219
+ const signal = options.signal;
220
+ let attempt = 0;
221
+ while (true) {
222
+ if (signal?.aborted) throw new Error("Unit of Work execution aborted");
223
+ try {
224
+ const baseUow = options.createUnitOfWork();
225
+ const services = servicesFactory();
226
+ await baseUow.executeRetrieve();
227
+ if (options.onBeforeMutate) options.onBeforeMutate(baseUow);
228
+ if (!(await baseUow.executeMutations()).success) throw new ConcurrencyConflictError();
229
+ if (options.onSuccess) await options.onSuccess(baseUow);
230
+ return await Promise.all(services);
231
+ } catch (error) {
232
+ if (signal?.aborted) throw new Error("Unit of Work execution aborted");
233
+ if (!(error instanceof ConcurrencyConflictError)) throw error;
234
+ if (!retryPolicy.shouldRetry(attempt, error, signal)) {
235
+ if (signal?.aborted) throw new Error("Unit of Work execution aborted");
236
+ throw new Error("Unit of Work execution failed: optimistic concurrency conflict", { cause: error });
237
+ }
238
+ const delayMs = retryPolicy.getDelayMs(attempt);
239
+ if (delayMs > 0) await new Promise((resolve) => setTimeout(resolve, delayMs));
240
+ attempt++;
241
+ }
242
+ }
243
+ }
244
+ /**
245
+ * Execute a transaction with callback syntax (handler context).
246
+ * Callbacks are synchronous only to prevent accidentally awaiting services in wrong place.
247
+ *
248
+ * @param callbacks - Object containing retrieve and mutate callbacks
249
+ * @param options - Configuration including UOW factory, retry policy, and abort signal
250
+ * @returns Promise resolving to the mutation result with promises awaited 1 level deep
251
+ */
252
+ async function executeTxCallbacks(callbacks, options) {
253
+ const retryPolicy = options.retryPolicy ?? new ExponentialBackoffRetryPolicy({
254
+ maxRetries: 5,
255
+ initialDelayMs: 10,
256
+ maxDelayMs: 100
257
+ });
258
+ const signal = options.signal;
259
+ let attempt = 0;
260
+ while (true) {
261
+ if (signal?.aborted) throw new Error("Unit of Work execution aborted");
262
+ try {
263
+ const baseUow = options.createUnitOfWork();
264
+ const context = { forSchema: (schema, hooks) => {
265
+ return baseUow.forSchema(schema, hooks);
266
+ } };
267
+ let retrieveResult;
268
+ if (callbacks.retrieve) retrieveResult = callbacks.retrieve(context);
269
+ else retrieveResult = void 0;
270
+ await baseUow.executeRetrieve();
271
+ let mutationResult;
272
+ if (callbacks.mutate) mutationResult = callbacks.mutate(context, retrieveResult);
273
+ else mutationResult = retrieveResult;
274
+ const awaitedMutationResult = await awaitPromisesInObject(mutationResult);
275
+ if (options.onBeforeMutate) options.onBeforeMutate(baseUow);
276
+ if (!(await baseUow.executeMutations()).success) throw new ConcurrencyConflictError();
277
+ if (options.onSuccess) await options.onSuccess(baseUow);
278
+ return awaitedMutationResult;
279
+ } catch (error) {
280
+ if (signal?.aborted) throw new Error("Unit of Work execution aborted");
281
+ if (!(error instanceof ConcurrencyConflictError)) throw error;
282
+ if (!retryPolicy.shouldRetry(attempt, error, signal)) {
283
+ if (signal?.aborted) throw new Error("Unit of Work execution aborted");
284
+ throw new Error("Unit of Work execution failed: optimistic concurrency conflict", { cause: error });
285
+ }
286
+ const delayMs = retryPolicy.getDelayMs(attempt);
287
+ if (delayMs > 0) await new Promise((resolve) => setTimeout(resolve, delayMs));
288
+ attempt++;
289
+ }
290
+ }
291
+ }
292
+ /**
293
+ * Execute a transaction for service context.
294
+ * Service callbacks can be async for ergonomic async work.
295
+ *
296
+ * @param schema - Schema to use for the transaction
297
+ * @param callbacks - Object containing retrieve and mutate callbacks
298
+ * @param baseUow - Base Unit of Work (restricted) to use
299
+ * @returns Promise resolving to the mutation result with promises awaited 1 level deep
300
+ */
301
+ async function executeServiceTx(schema, callbacks, baseUow) {
302
+ const typedUow = baseUow.restrict({ readyFor: "none" }).forSchema(schema);
303
+ let retrievalUow;
304
+ try {
305
+ if (callbacks.retrieve) retrievalUow = callbacks.retrieve(typedUow);
306
+ else retrievalUow = typedUow;
307
+ } catch (error) {
308
+ typedUow.signalReadyForRetrieval();
309
+ typedUow.signalReadyForMutation();
310
+ throw error;
311
+ }
312
+ typedUow.signalReadyForRetrieval();
313
+ const results = await retrievalUow.retrievalPhase;
314
+ let mutationResult;
315
+ try {
316
+ if (callbacks.mutate) mutationResult = await callbacks.mutate(retrievalUow, results);
317
+ else mutationResult = void 0;
318
+ } catch (error) {
319
+ typedUow.signalReadyForMutation();
320
+ throw error;
321
+ }
322
+ typedUow.signalReadyForMutation();
323
+ await retrievalUow.mutationPhase;
324
+ return await awaitPromisesInObject(mutationResult);
325
+ }
194
326
 
195
327
  //#endregion
196
- export { executeRestrictedUnitOfWork, executeUnitOfWork };
328
+ export { executeRestrictedUnitOfWork, executeServiceTx, executeTxArray, executeTxCallbacks, executeUnitOfWork };
197
329
  //# sourceMappingURL=execute-unit-of-work.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"execute-unit-of-work.js","names":["retrievalUow: TypedUnitOfWork<TSchema, TRetrievalResults, TRawInput>","mutationResult: TMutationResult"],"sources":["../../../src/query/unit-of-work/execute-unit-of-work.ts"],"sourcesContent":["import type { AnySchema } from \"../../schema/create\";\nimport type { TypedUnitOfWork, IUnitOfWork } from \"./unit-of-work\";\nimport type { HooksMap } from \"../../hooks/hooks\";\nimport { NoRetryPolicy, ExponentialBackoffRetryPolicy, type RetryPolicy } from \"./retry-policy\";\nimport type { FragnoId } from \"../../schema/create\";\n\n/**\n * Error thrown when a Unit of Work execution fails due to optimistic concurrency conflict.\n * This error triggers automatic retry behavior in executeRestrictedUnitOfWork.\n */\nexport class ConcurrencyConflictError extends Error {\n constructor(message = \"Optimistic concurrency conflict detected\") {\n super(message);\n this.name = \"ConcurrencyConflictError\";\n }\n}\n\n/**\n * Type utility that unwraps promises 1 level deep in objects, arrays, or direct promises\n * Handles tuples, arrays, objects, and direct promises\n */\nexport type AwaitedPromisesInObject<T> =\n // First check if it's a Promise\n T extends Promise<infer U>\n ? Awaited<U>\n : // Check for arrays with known length (tuples) - preserves tuple structure\n T extends readonly [unknown, ...unknown[]]\n ? { [K in keyof T]: AwaitedPromisesInObject<T[K]> }\n : T extends [unknown, ...unknown[]]\n ? { [K in keyof T]: AwaitedPromisesInObject<T[K]> }\n : // Check for regular arrays (unknown length)\n T extends (infer U)[]\n ? Awaited<U>[]\n : T extends readonly (infer U)[]\n ? readonly Awaited<U>[]\n : // Check for objects\n T extends Record<string, unknown>\n ? {\n [K in keyof T]: T[K] extends Promise<infer U> ? Awaited<U> : T[K];\n }\n : // Otherwise return as-is\n T;\n\n/**\n * Await promises in an object 1 level deep\n */\nasync function awaitPromisesInObject<T>(obj: T): Promise<AwaitedPromisesInObject<T>> {\n if (obj === null || obj === undefined) {\n return obj as AwaitedPromisesInObject<T>;\n }\n\n if (typeof obj !== \"object\") {\n return obj as AwaitedPromisesInObject<T>;\n }\n\n // Check if it's a Promise\n if (obj instanceof Promise) {\n return (await obj) as AwaitedPromisesInObject<T>;\n }\n\n // Check if it's an array\n if (Array.isArray(obj)) {\n const awaited = await Promise.all(\n obj.map((item) => (item instanceof Promise ? item : Promise.resolve(item))),\n );\n return awaited as AwaitedPromisesInObject<T>;\n }\n\n // It's a plain object - await promises in each property\n const result = {} as T;\n const entries = Object.entries(obj as Record<string, unknown>);\n const awaitedEntries = await Promise.all(\n entries.map(async ([key, value]) => {\n const awaitedValue = value instanceof Promise ? await value : value;\n return [key, awaitedValue] as const;\n }),\n );\n\n for (const [key, value] of awaitedEntries) {\n (result as Record<string, unknown>)[key] = value;\n }\n\n return result as AwaitedPromisesInObject<T>;\n}\n\n/**\n * Result of executing a Unit of Work with retry support\n * Promises in mutationResult are unwrapped 1 level deep\n */\nexport type ExecuteUnitOfWorkResult<TRetrievalResults, TMutationResult> =\n | {\n success: true;\n results: TRetrievalResults;\n mutationResult: AwaitedPromisesInObject<TMutationResult>;\n createdIds: FragnoId[];\n nonce: string;\n }\n | {\n success: false;\n reason: \"conflict\";\n }\n | {\n success: false;\n reason: \"aborted\";\n }\n | {\n success: false;\n reason: \"error\";\n error: unknown;\n };\n\n/**\n * Callbacks for executing a Unit of Work\n */\nexport interface ExecuteUnitOfWorkCallbacks<\n TSchema extends AnySchema,\n TRetrievalResults extends unknown[],\n TMutationResult,\n TRawInput,\n> {\n /**\n * Retrieval phase callback - adds retrieval operations to the UOW\n */\n retrieve?: (\n uow: TypedUnitOfWork<TSchema, [], TRawInput>,\n ) => TypedUnitOfWork<TSchema, TRetrievalResults, TRawInput>;\n\n /**\n * Mutation phase callback - receives UOW and retrieval results, adds mutation operations\n */\n mutate?: (\n uow: TypedUnitOfWork<TSchema, TRetrievalResults, TRawInput>,\n results: TRetrievalResults,\n ) => TMutationResult | Promise<TMutationResult>;\n\n /**\n * Success callback - invoked after successful execution\n * Promises in mutationResult are already unwrapped 1 level deep\n */\n onSuccess?: (result: {\n results: TRetrievalResults;\n mutationResult: AwaitedPromisesInObject<TMutationResult>;\n createdIds: FragnoId[];\n nonce: string;\n }) => void | Promise<void>;\n}\n\n/**\n * Options for executing a Unit of Work\n */\nexport interface ExecuteUnitOfWorkOptions<TSchema extends AnySchema, TRawInput> {\n /**\n * Factory function that creates or resets a UOW instance for each attempt\n */\n createUnitOfWork: () => TypedUnitOfWork<TSchema, [], TRawInput>;\n\n /**\n * Retry policy for handling optimistic concurrency conflicts\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * Abort signal to cancel execution\n */\n signal?: AbortSignal;\n}\n\n/**\n * Create a bound version of executeUnitOfWork with a pre-configured UOW factory.\n * This is useful for handler contexts where the factory is already known.\n *\n * @param createUnitOfWork - Factory function that creates a fresh UOW instance\n * @returns A bound executeUnitOfWork function that doesn't require the factory parameter\n *\n * @example\n * ```ts\n * const boundExecute = createExecuteUnitOfWork(() => db.createUnitOfWork());\n * const result = await boundExecute({\n * retrieve: (uow) => uow.find(\"users\", (b) => b.whereIndex(\"primary\")),\n * mutate: (uow, [users]) => {\n * uow.update(\"users\", users[0].id, (b) => b.set({ balance: newBalance }));\n * }\n * });\n * ```\n */\nexport function createExecuteUnitOfWork<TSchema extends AnySchema, TRawInput>(\n createUnitOfWork: () => TypedUnitOfWork<TSchema, [], TRawInput>,\n) {\n return async function <TRetrievalResults extends unknown[], TMutationResult = void>(\n callbacks: ExecuteUnitOfWorkCallbacks<TSchema, TRetrievalResults, TMutationResult, TRawInput>,\n options?: Omit<ExecuteUnitOfWorkOptions<TSchema, TRawInput>, \"createUnitOfWork\">,\n ): Promise<ExecuteUnitOfWorkResult<TRetrievalResults, TMutationResult>> {\n return executeUnitOfWork(callbacks, { ...options, createUnitOfWork });\n };\n}\n\n/**\n * Execute a Unit of Work with automatic retry support for optimistic concurrency conflicts.\n *\n * This function orchestrates the two-phase execution (retrieval + mutation) with retry logic.\n * It creates fresh UOW instances for each attempt.\n *\n * @param callbacks - Object containing retrieve, mutate, and onSuccess callbacks\n * @param options - Configuration including UOW factory, retry policy, and abort signal\n * @returns Promise resolving to the execution result\n *\n * @example\n * ```ts\n * const result = await executeUnitOfWork(\n * {\n * retrieve: (uow) => uow.find(\"users\", (b) => b.whereIndex(\"primary\")),\n * mutate: (uow, [users]) => {\n * const user = users[0];\n * uow.update(\"users\", user.id, (b) => b.set({ balance: newBalance }));\n * },\n * onSuccess: async ({ results, mutationResult }) => {\n * console.log(\"Update successful!\");\n * }\n * },\n * {\n * createUnitOfWork: () => queryEngine.createUnitOfWork(),\n * retryPolicy: new ExponentialBackoffRetryPolicy({ maxRetries: 3 })\n * }\n * );\n * ```\n */\nexport async function executeUnitOfWork<\n TSchema extends AnySchema,\n TRetrievalResults extends unknown[],\n TMutationResult = void,\n TRawInput = unknown,\n>(\n callbacks: ExecuteUnitOfWorkCallbacks<TSchema, TRetrievalResults, TMutationResult, TRawInput>,\n options: ExecuteUnitOfWorkOptions<TSchema, TRawInput>,\n): Promise<ExecuteUnitOfWorkResult<TRetrievalResults, TMutationResult>> {\n // Validate that at least one of retrieve or mutate is provided\n if (!callbacks.retrieve && !callbacks.mutate) {\n throw new Error(\"At least one of 'retrieve' or 'mutate' callbacks must be provided\");\n }\n\n const retryPolicy = options.retryPolicy ?? new NoRetryPolicy();\n const signal = options.signal;\n let attempt = 0;\n\n while (true) {\n // Check if aborted before starting attempt\n if (signal?.aborted) {\n return { success: false, reason: \"aborted\" };\n }\n\n try {\n // Create a fresh UOW for this attempt\n const uow = options.createUnitOfWork();\n\n // Apply retrieval phase if provided\n let retrievalUow: TypedUnitOfWork<TSchema, TRetrievalResults, TRawInput>;\n if (callbacks.retrieve) {\n retrievalUow = callbacks.retrieve(uow);\n } else {\n // No retrieval phase, use empty UOW with type cast\n // This is safe because when there's no retrieve, TRetrievalResults should be []\n retrievalUow = uow as unknown as TypedUnitOfWork<TSchema, TRetrievalResults, TRawInput>;\n }\n\n // Execute retrieval phase\n const results = (await retrievalUow.executeRetrieve()) as TRetrievalResults;\n\n // Invoke mutation phase callback if provided\n let mutationResult: TMutationResult;\n if (callbacks.mutate) {\n mutationResult = await callbacks.mutate(retrievalUow, results);\n } else {\n mutationResult = undefined as TMutationResult;\n }\n\n // Execute mutation phase\n const { success } = await retrievalUow.executeMutations();\n\n if (success) {\n // Success! Get created IDs and nonce, then invoke onSuccess if provided\n const createdIds = retrievalUow.getCreatedIds();\n const nonce = retrievalUow.nonce;\n\n // Await promises in mutationResult (1 level deep)\n const awaitedMutationResult = await awaitPromisesInObject(mutationResult);\n\n if (callbacks.onSuccess) {\n await callbacks.onSuccess({\n results,\n mutationResult: awaitedMutationResult,\n createdIds,\n nonce,\n });\n }\n\n return {\n success: true,\n results,\n mutationResult: awaitedMutationResult,\n createdIds,\n nonce,\n };\n }\n\n // Failed - check if we should retry\n // attempt represents the number of attempts completed so far\n if (!retryPolicy.shouldRetry(attempt, undefined, signal)) {\n // No more retries\n return { success: false, reason: \"conflict\" };\n }\n\n // Wait before retrying\n const delayMs = retryPolicy.getDelayMs(attempt);\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n // Increment attempt counter for next iteration\n attempt++;\n } catch (error) {\n // An error was thrown during execution\n return { success: false, reason: \"error\", error };\n }\n }\n}\n\n/**\n * Options for executing a Unit of Work with restricted access\n */\nexport interface ExecuteRestrictedUnitOfWorkOptions {\n /**\n * Factory function that creates or resets a UOW instance for each attempt\n */\n createUnitOfWork: () => IUnitOfWork;\n\n /**\n * Retry policy for handling optimistic concurrency conflicts\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * Abort signal to cancel execution\n */\n signal?: AbortSignal;\n\n /**\n * Callback invoked before mutations are executed.\n * Use this to add additional mutation operations (e.g., hook event records).\n */\n onBeforeMutate?: (uow: IUnitOfWork) => void;\n\n /**\n * Callback invoked after successful mutation phase.\n * Use this for post-mutation processing like hook execution.\n */\n onSuccess?: (uow: IUnitOfWork) => Promise<void>;\n}\n\n/**\n * Execute a Unit of Work with explicit phase control and automatic retry support.\n *\n * This function provides an alternative API where users write a single callback that receives\n * a context object with forSchema, executeRetrieve, and executeMutate methods. The user can\n * create schema-specific UOWs via forSchema, then call executeRetrieve() and executeMutate()\n * to execute the retrieval and mutation phases. The entire callback is re-executed on optimistic\n * concurrency conflicts, ensuring retries work properly.\n *\n * @param callback - Async function that receives a context with forSchema, executeRetrieve, executeMutate, nonce, and currentAttempt\n * @param options - Configuration including UOW factory, retry policy, and abort signal\n * @returns Promise resolving to the callback's return value\n * @throws Error if retries are exhausted or callback throws an error\n *\n * @example\n * ```ts\n * const { userId, profileId } = await executeRestrictedUnitOfWork(\n * async ({ forSchema, executeRetrieve, executeMutate, nonce, currentAttempt }) => {\n * const uow = forSchema(schema);\n * const userId = uow.create(\"users\", { name: \"John\" });\n *\n * // Execute retrieval phase\n * await executeRetrieve();\n *\n * const profileId = uow.create(\"profiles\", { userId });\n *\n * // Execute mutation phase\n * await executeMutate();\n *\n * return { userId, profileId };\n * },\n * {\n * createUnitOfWork: () => db.createUnitOfWork(),\n * retryPolicy: new ExponentialBackoffRetryPolicy({ maxRetries: 5 })\n * }\n * );\n * ```\n */\nexport async function executeRestrictedUnitOfWork<TResult, THooks extends HooksMap = {}>(\n callback: (context: {\n forSchema: <S extends AnySchema, H extends HooksMap = THooks>(\n schema: S,\n hooks?: H,\n ) => TypedUnitOfWork<S, [], unknown, H>;\n executeRetrieve: () => Promise<void>;\n executeMutate: () => Promise<void>;\n nonce: string;\n currentAttempt: number;\n }) => Promise<TResult>,\n options: ExecuteRestrictedUnitOfWorkOptions,\n): Promise<AwaitedPromisesInObject<TResult>> {\n // Default retry policy with small, fast retries for optimistic concurrency\n const retryPolicy =\n options.retryPolicy ??\n new ExponentialBackoffRetryPolicy({\n maxRetries: 5,\n initialDelayMs: 10,\n maxDelayMs: 100,\n });\n const signal = options.signal;\n let attempt = 0;\n\n while (true) {\n // Check if aborted before starting attempt\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n\n try {\n // Create a fresh UOW for this attempt\n const baseUow = options.createUnitOfWork();\n\n const context = {\n forSchema: <S extends AnySchema, H extends HooksMap = THooks>(schema: S, hooks?: H) => {\n return baseUow.forSchema(schema, hooks);\n },\n executeRetrieve: async () => {\n await baseUow.executeRetrieve();\n },\n executeMutate: async () => {\n if (baseUow.state === \"executed\") {\n return;\n }\n\n if (baseUow.state === \"building-retrieval\") {\n await baseUow.executeRetrieve();\n }\n\n // Add hook mutations before executing\n if (options.onBeforeMutate) {\n options.onBeforeMutate(baseUow);\n }\n\n const result = await baseUow.executeMutations();\n if (!result.success) {\n throw new ConcurrencyConflictError();\n }\n\n if (options.onSuccess) {\n await options.onSuccess(baseUow);\n }\n },\n nonce: baseUow.nonce,\n currentAttempt: attempt,\n };\n\n // Execute the callback which will call executeRetrieve and executeMutate\n const result = await callback(context);\n\n // Await promises in the result object (1 level deep)\n const awaitedResult = await awaitPromisesInObject(result);\n\n // Return the awaited result\n return awaitedResult;\n } catch (error) {\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n\n // Only retry concurrency conflicts, not other errors\n if (!(error instanceof ConcurrencyConflictError)) {\n // Not a concurrency conflict - throw immediately without retry\n throw error;\n }\n\n if (!retryPolicy.shouldRetry(attempt, error, signal)) {\n // No more retries - check again if aborted or throw conflict error\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n throw new Error(\"Unit of Work execution failed: optimistic concurrency conflict\", {\n cause: error,\n });\n }\n\n // Wait before retrying\n const delayMs = retryPolicy.getDelayMs(attempt);\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n // Increment attempt counter for next iteration\n attempt++;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"execute-unit-of-work.js","names":["retrievalUow: TypedUnitOfWork<TSchema, TRetrievalResults, TRawInput>","mutationResult: TMutationResult","context: TxPhaseContext<THooks>","retrieveResult: TRetrieveResult","retrievalUow: TypedUnitOfWork<TSchema, TRetrievalResults, unknown, THooks>"],"sources":["../../../src/query/unit-of-work/execute-unit-of-work.ts"],"sourcesContent":["import type { AnySchema } from \"../../schema/create\";\nimport type { TypedUnitOfWork, IUnitOfWork } from \"./unit-of-work\";\nimport type { HooksMap } from \"../../hooks/hooks\";\nimport { NoRetryPolicy, ExponentialBackoffRetryPolicy, type RetryPolicy } from \"./retry-policy\";\nimport type { FragnoId } from \"../../schema/create\";\n\n/**\n * Error thrown when a Unit of Work execution fails due to optimistic concurrency conflict.\n * This error triggers automatic retry behavior in executeRestrictedUnitOfWork.\n */\nexport class ConcurrencyConflictError extends Error {\n constructor(message = \"Optimistic concurrency conflict detected\") {\n super(message);\n this.name = \"ConcurrencyConflictError\";\n }\n}\n\n/**\n * Type utility that unwraps promises 1 level deep in objects, arrays, or direct promises\n * Handles tuples, arrays, objects, and direct promises\n */\nexport type AwaitedPromisesInObject<T> =\n // First check if it's a Promise\n T extends Promise<infer U>\n ? Awaited<U>\n : // Check for arrays with known length (tuples) - preserves tuple structure\n T extends readonly [unknown, ...unknown[]]\n ? { [K in keyof T]: AwaitedPromisesInObject<T[K]> }\n : T extends [unknown, ...unknown[]]\n ? { [K in keyof T]: AwaitedPromisesInObject<T[K]> }\n : // Check for regular arrays (unknown length)\n T extends (infer U)[]\n ? Awaited<U>[]\n : T extends readonly (infer U)[]\n ? readonly Awaited<U>[]\n : // Check for objects\n T extends Record<string, unknown>\n ? {\n [K in keyof T]: T[K] extends Promise<infer U> ? Awaited<U> : T[K];\n }\n : // Otherwise return as-is\n T;\n\n/**\n * Await promises in an object 1 level deep\n */\nasync function awaitPromisesInObject<T>(obj: T): Promise<AwaitedPromisesInObject<T>> {\n if (obj === null || obj === undefined) {\n return obj as AwaitedPromisesInObject<T>;\n }\n\n if (typeof obj !== \"object\") {\n return obj as AwaitedPromisesInObject<T>;\n }\n\n // Check if it's a Promise\n if (obj instanceof Promise) {\n return (await obj) as AwaitedPromisesInObject<T>;\n }\n\n // Check if it's an array\n if (Array.isArray(obj)) {\n const awaited = await Promise.all(\n obj.map((item) => (item instanceof Promise ? item : Promise.resolve(item))),\n );\n return awaited as AwaitedPromisesInObject<T>;\n }\n\n // It's a plain object - await promises in each property\n const result = {} as T;\n const entries = Object.entries(obj as Record<string, unknown>);\n const awaitedEntries = await Promise.all(\n entries.map(async ([key, value]) => {\n const awaitedValue = value instanceof Promise ? await value : value;\n return [key, awaitedValue] as const;\n }),\n );\n\n for (const [key, value] of awaitedEntries) {\n (result as Record<string, unknown>)[key] = value;\n }\n\n return result as AwaitedPromisesInObject<T>;\n}\n\n/**\n * Result of executing a Unit of Work with retry support\n * Promises in mutationResult are unwrapped 1 level deep\n */\nexport type ExecuteUnitOfWorkResult<TRetrievalResults, TMutationResult> =\n | {\n success: true;\n results: TRetrievalResults;\n mutationResult: AwaitedPromisesInObject<TMutationResult>;\n createdIds: FragnoId[];\n nonce: string;\n }\n | {\n success: false;\n reason: \"conflict\";\n }\n | {\n success: false;\n reason: \"aborted\";\n }\n | {\n success: false;\n reason: \"error\";\n error: unknown;\n };\n\n/**\n * Callbacks for executing a Unit of Work\n */\nexport interface ExecuteUnitOfWorkCallbacks<\n TSchema extends AnySchema,\n TRetrievalResults extends unknown[],\n TMutationResult,\n TRawInput,\n> {\n /**\n * Retrieval phase callback - adds retrieval operations to the UOW\n */\n retrieve?: (\n uow: TypedUnitOfWork<TSchema, [], TRawInput>,\n ) => TypedUnitOfWork<TSchema, TRetrievalResults, TRawInput>;\n\n /**\n * Mutation phase callback - receives UOW and retrieval results, adds mutation operations\n */\n mutate?: (\n uow: TypedUnitOfWork<TSchema, TRetrievalResults, TRawInput>,\n results: TRetrievalResults,\n ) => TMutationResult | Promise<TMutationResult>;\n\n /**\n * Success callback - invoked after successful execution\n * Promises in mutationResult are already unwrapped 1 level deep\n */\n onSuccess?: (result: {\n results: TRetrievalResults;\n mutationResult: AwaitedPromisesInObject<TMutationResult>;\n createdIds: FragnoId[];\n nonce: string;\n }) => void | Promise<void>;\n}\n\n/**\n * Options for executing a Unit of Work\n */\nexport interface ExecuteUnitOfWorkOptions<TSchema extends AnySchema, TRawInput> {\n /**\n * Factory function that creates or resets a UOW instance for each attempt\n */\n createUnitOfWork: () => TypedUnitOfWork<TSchema, [], TRawInput>;\n\n /**\n * Retry policy for handling optimistic concurrency conflicts\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * Abort signal to cancel execution\n */\n signal?: AbortSignal;\n}\n\n/**\n * Create a bound version of executeUnitOfWork with a pre-configured UOW factory.\n * This is useful for handler contexts where the factory is already known.\n *\n * @param createUnitOfWork - Factory function that creates a fresh UOW instance\n * @returns A bound executeUnitOfWork function that doesn't require the factory parameter\n *\n * @example\n * ```ts\n * const boundExecute = createExecuteUnitOfWork(() => db.createUnitOfWork());\n * const result = await boundExecute({\n * retrieve: (uow) => uow.find(\"users\", (b) => b.whereIndex(\"primary\")),\n * mutate: (uow, [users]) => {\n * uow.update(\"users\", users[0].id, (b) => b.set({ balance: newBalance }));\n * }\n * });\n * ```\n */\nexport function createExecuteUnitOfWork<TSchema extends AnySchema, TRawInput>(\n createUnitOfWork: () => TypedUnitOfWork<TSchema, [], TRawInput>,\n) {\n return async function <TRetrievalResults extends unknown[], TMutationResult = void>(\n callbacks: ExecuteUnitOfWorkCallbacks<TSchema, TRetrievalResults, TMutationResult, TRawInput>,\n options?: Omit<ExecuteUnitOfWorkOptions<TSchema, TRawInput>, \"createUnitOfWork\">,\n ): Promise<ExecuteUnitOfWorkResult<TRetrievalResults, TMutationResult>> {\n return executeUnitOfWork(callbacks, { ...options, createUnitOfWork });\n };\n}\n\n/**\n * Execute a Unit of Work with automatic retry support for optimistic concurrency conflicts.\n *\n * This function orchestrates the two-phase execution (retrieval + mutation) with retry logic.\n * It creates fresh UOW instances for each attempt.\n *\n * @param callbacks - Object containing retrieve, mutate, and onSuccess callbacks\n * @param options - Configuration including UOW factory, retry policy, and abort signal\n * @returns Promise resolving to the execution result\n *\n * @example\n * ```ts\n * const result = await executeUnitOfWork(\n * {\n * retrieve: (uow) => uow.find(\"users\", (b) => b.whereIndex(\"primary\")),\n * mutate: (uow, [users]) => {\n * const user = users[0];\n * uow.update(\"users\", user.id, (b) => b.set({ balance: newBalance }));\n * },\n * onSuccess: async ({ results, mutationResult }) => {\n * console.log(\"Update successful!\");\n * }\n * },\n * {\n * createUnitOfWork: () => queryEngine.createUnitOfWork(),\n * retryPolicy: new ExponentialBackoffRetryPolicy({ maxRetries: 3 })\n * }\n * );\n * ```\n */\nexport async function executeUnitOfWork<\n TSchema extends AnySchema,\n TRetrievalResults extends unknown[],\n TMutationResult = void,\n TRawInput = unknown,\n>(\n callbacks: ExecuteUnitOfWorkCallbacks<TSchema, TRetrievalResults, TMutationResult, TRawInput>,\n options: ExecuteUnitOfWorkOptions<TSchema, TRawInput>,\n): Promise<ExecuteUnitOfWorkResult<TRetrievalResults, TMutationResult>> {\n // Validate that at least one of retrieve or mutate is provided\n if (!callbacks.retrieve && !callbacks.mutate) {\n throw new Error(\"At least one of 'retrieve' or 'mutate' callbacks must be provided\");\n }\n\n const retryPolicy = options.retryPolicy ?? new NoRetryPolicy();\n const signal = options.signal;\n let attempt = 0;\n\n while (true) {\n // Check if aborted before starting attempt\n if (signal?.aborted) {\n return { success: false, reason: \"aborted\" };\n }\n\n try {\n // Create a fresh UOW for this attempt\n const uow = options.createUnitOfWork();\n\n // Apply retrieval phase if provided\n let retrievalUow: TypedUnitOfWork<TSchema, TRetrievalResults, TRawInput>;\n if (callbacks.retrieve) {\n retrievalUow = callbacks.retrieve(uow);\n } else {\n // No retrieval phase, use empty UOW with type cast\n // This is safe because when there's no retrieve, TRetrievalResults should be []\n retrievalUow = uow as unknown as TypedUnitOfWork<TSchema, TRetrievalResults, TRawInput>;\n }\n\n // Execute retrieval phase\n const results = (await retrievalUow.executeRetrieve()) as TRetrievalResults;\n\n // Invoke mutation phase callback if provided\n let mutationResult: TMutationResult;\n if (callbacks.mutate) {\n mutationResult = await callbacks.mutate(retrievalUow, results);\n } else {\n mutationResult = undefined as TMutationResult;\n }\n\n // Execute mutation phase\n const { success } = await retrievalUow.executeMutations();\n\n if (success) {\n // Success! Get created IDs and nonce, then invoke onSuccess if provided\n const createdIds = retrievalUow.getCreatedIds();\n const nonce = retrievalUow.nonce;\n\n // Await promises in mutationResult (1 level deep)\n const awaitedMutationResult = await awaitPromisesInObject(mutationResult);\n\n if (callbacks.onSuccess) {\n await callbacks.onSuccess({\n results,\n mutationResult: awaitedMutationResult,\n createdIds,\n nonce,\n });\n }\n\n return {\n success: true,\n results,\n mutationResult: awaitedMutationResult,\n createdIds,\n nonce,\n };\n }\n\n // Failed - check if we should retry\n // attempt represents the number of attempts completed so far\n if (!retryPolicy.shouldRetry(attempt, undefined, signal)) {\n // No more retries\n return { success: false, reason: \"conflict\" };\n }\n\n const delayMs = retryPolicy.getDelayMs(attempt);\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n attempt++;\n } catch (error) {\n // An error was thrown during execution\n return { success: false, reason: \"error\", error };\n }\n }\n}\n\n/**\n * Options for executing a Unit of Work with restricted access\n */\nexport interface ExecuteRestrictedUnitOfWorkOptions {\n /**\n * Factory function that creates or resets a UOW instance for each attempt\n */\n createUnitOfWork: () => IUnitOfWork;\n\n /**\n * Retry policy for handling optimistic concurrency conflicts\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * Abort signal to cancel execution\n */\n signal?: AbortSignal;\n\n /**\n * Callback invoked before mutations are executed.\n * Use this to add additional mutation operations (e.g., hook event records).\n */\n onBeforeMutate?: (uow: IUnitOfWork) => void;\n\n /**\n * Callback invoked after successful mutation phase.\n * Use this for post-mutation processing like hook execution.\n */\n onSuccess?: (uow: IUnitOfWork) => Promise<void>;\n}\n\n/**\n * Context provided to handler tx callbacks\n */\nexport interface TxPhaseContext<THooks extends HooksMap> {\n /**\n * Get a typed Unit of Work for the given schema\n */\n forSchema: <S extends AnySchema, H extends HooksMap = THooks>(\n schema: S,\n hooks?: H,\n ) => TypedUnitOfWork<S, [], unknown, H>;\n}\n\n/**\n * Handler callbacks for tx() - SYNCHRONOUS ONLY (no Promise return allowed)\n * This prevents accidentally awaiting services in the wrong place\n */\nexport interface HandlerTxCallbacks<TRetrieveResult, TMutationResult, THooks extends HooksMap> {\n /**\n * Retrieval phase callback - schedules retrievals and optionally calls services\n * Must be synchronous - cannot await promises\n */\n retrieve?: (context: TxPhaseContext<THooks>) => TRetrieveResult;\n /**\n * Mutation phase callback - receives retrieve result, schedules mutations\n * Must be synchronous - cannot await promises (but may return a promise to be awaited)\n */\n mutate?: (context: TxPhaseContext<THooks>, retrieveResult: TRetrieveResult) => TMutationResult;\n}\n\nexport interface ServiceTxCallbacks<\n TSchema extends AnySchema,\n TRetrievalResults extends unknown[],\n TMutationResult,\n THooks extends HooksMap,\n> {\n /**\n * Retrieval phase callback - schedules retrievals, returns typed UOW\n */\n retrieve?: (\n uow: TypedUnitOfWork<TSchema, [], unknown, THooks>,\n ) => TypedUnitOfWork<TSchema, TRetrievalResults, unknown, THooks>;\n /**\n * Mutation phase callback - receives retrieval results, schedules mutations and hooks\n */\n mutate?: (\n uow: TypedUnitOfWork<TSchema, TRetrievalResults, unknown, THooks>,\n results: TRetrievalResults,\n ) => TMutationResult | Promise<TMutationResult>;\n}\n\n/**\n * Execute a Unit of Work with explicit phase control and automatic retry support.\n *\n * This function provides an alternative API where users write a single callback that receives\n * a context object with forSchema, executeRetrieve, and executeMutate methods. The user can\n * create schema-specific UOWs via forSchema, then call executeRetrieve() and executeMutate()\n * to execute the retrieval and mutation phases. The entire callback is re-executed on optimistic\n * concurrency conflicts, ensuring retries work properly.\n *\n * @param callback - Async function that receives a context with forSchema, executeRetrieve, executeMutate, nonce, and currentAttempt\n * @param options - Configuration including UOW factory, retry policy, and abort signal\n * @returns Promise resolving to the callback's return value\n * @throws Error if retries are exhausted or callback throws an error\n *\n * @example\n * ```ts\n * const { userId, profileId } = await executeRestrictedUnitOfWork(\n * async ({ forSchema, executeRetrieve, executeMutate, nonce, currentAttempt }) => {\n * const uow = forSchema(schema);\n * const userId = uow.create(\"users\", { name: \"John\" });\n *\n * // Execute retrieval phase\n * await executeRetrieve();\n *\n * const profileId = uow.create(\"profiles\", { userId });\n *\n * // Execute mutation phase\n * await executeMutate();\n *\n * return { userId, profileId };\n * },\n * {\n * createUnitOfWork: () => db.createUnitOfWork(),\n * retryPolicy: new ExponentialBackoffRetryPolicy({ maxRetries: 5 })\n * }\n * );\n * ```\n */\nexport async function executeRestrictedUnitOfWork<TResult, THooks extends HooksMap = {}>(\n callback: (context: {\n forSchema: <S extends AnySchema, H extends HooksMap = THooks>(\n schema: S,\n hooks?: H,\n ) => TypedUnitOfWork<S, [], unknown, H>;\n executeRetrieve: () => Promise<void>;\n executeMutate: () => Promise<void>;\n nonce: string;\n currentAttempt: number;\n }) => Promise<TResult>,\n options: ExecuteRestrictedUnitOfWorkOptions,\n): Promise<AwaitedPromisesInObject<TResult>> {\n // Default retry policy with small, fast retries for optimistic concurrency\n const retryPolicy =\n options.retryPolicy ??\n new ExponentialBackoffRetryPolicy({\n maxRetries: 5,\n initialDelayMs: 10,\n maxDelayMs: 100,\n });\n const signal = options.signal;\n let attempt = 0;\n\n while (true) {\n // Check if aborted before starting attempt\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n\n try {\n // Create a fresh UOW for this attempt\n const baseUow = options.createUnitOfWork();\n\n const context = {\n forSchema: <S extends AnySchema, H extends HooksMap = THooks>(schema: S, hooks?: H) => {\n return baseUow.forSchema(schema, hooks);\n },\n executeRetrieve: async () => {\n await baseUow.executeRetrieve();\n },\n executeMutate: async () => {\n if (baseUow.state === \"executed\") {\n return;\n }\n\n if (baseUow.state === \"building-retrieval\") {\n await baseUow.executeRetrieve();\n }\n\n // Add hook mutations before executing\n if (options.onBeforeMutate) {\n options.onBeforeMutate(baseUow);\n }\n\n const result = await baseUow.executeMutations();\n if (!result.success) {\n throw new ConcurrencyConflictError();\n }\n\n if (options.onSuccess) {\n await options.onSuccess(baseUow);\n }\n },\n nonce: baseUow.nonce,\n currentAttempt: attempt,\n };\n\n // Execute the callback which will call executeRetrieve and executeMutate\n const result = await callback(context);\n\n // Await promises in the result object (1 level deep)\n const awaitedResult = await awaitPromisesInObject(result);\n\n // Return the awaited result\n return awaitedResult;\n } catch (error) {\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n\n // Only retry concurrency conflicts, not other errors\n if (!(error instanceof ConcurrencyConflictError)) {\n // Not a concurrency conflict - throw immediately without retry\n throw error;\n }\n\n if (!retryPolicy.shouldRetry(attempt, error, signal)) {\n // No more retries - check again if aborted or throw conflict error\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n throw new Error(\"Unit of Work execution failed: optimistic concurrency conflict\", {\n cause: error,\n });\n }\n\n const delayMs = retryPolicy.getDelayMs(attempt);\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n attempt++;\n }\n }\n}\n\n/**\n * Execute a transaction with array syntax (handler context).\n * Takes a factory function that creates an array of service promises, enabling proper retry support.\n *\n * @param servicesFactory - Function that creates an array of service promises\n * @param options - Configuration including UOW factory, retry policy, and abort signal\n * @returns Promise resolving to array of awaited service results\n *\n * @example\n * ```ts\n * const [result1, result2] = await executeTxArray(\n * () => [\n * executeServiceTx(schema, callbacks1, uow),\n * executeServiceTx(schema, callbacks2, uow)\n * ],\n * { createUnitOfWork }\n * );\n * ```\n */\nexport async function executeTxArray<T extends readonly unknown[]>(\n servicesFactory: () => readonly [...{ [K in keyof T]: Promise<T[K]> }],\n options: ExecuteRestrictedUnitOfWorkOptions,\n): Promise<{ [K in keyof T]: T[K] }> {\n const retryPolicy =\n options.retryPolicy ??\n new ExponentialBackoffRetryPolicy({\n maxRetries: 5,\n initialDelayMs: 10,\n maxDelayMs: 100,\n });\n const signal = options.signal;\n let attempt = 0;\n\n while (true) {\n // Check if aborted before starting attempt\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n\n try {\n // Create a fresh UOW for this attempt\n const baseUow = options.createUnitOfWork();\n\n // Call factory to create fresh service promises for this attempt\n const services = servicesFactory();\n\n await baseUow.executeRetrieve();\n\n if (options.onBeforeMutate) {\n options.onBeforeMutate(baseUow);\n }\n\n const result = await baseUow.executeMutations();\n if (!result.success) {\n throw new ConcurrencyConflictError();\n }\n\n if (options.onSuccess) {\n await options.onSuccess(baseUow);\n }\n\n // Now await all service promises - they should all resolve now that mutations executed\n const results = await Promise.all(services);\n return results as { [K in keyof T]: T[K] };\n } catch (error) {\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n\n // Only retry concurrency conflicts, not other errors\n if (!(error instanceof ConcurrencyConflictError)) {\n throw error;\n }\n\n if (!retryPolicy.shouldRetry(attempt, error, signal)) {\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n throw new Error(\"Unit of Work execution failed: optimistic concurrency conflict\", {\n cause: error,\n });\n }\n\n const delayMs = retryPolicy.getDelayMs(attempt);\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n attempt++;\n }\n }\n}\n\n/**\n * Execute a transaction with callback syntax (handler context).\n * Callbacks are synchronous only to prevent accidentally awaiting services in wrong place.\n *\n * @param callbacks - Object containing retrieve and mutate callbacks\n * @param options - Configuration including UOW factory, retry policy, and abort signal\n * @returns Promise resolving to the mutation result with promises awaited 1 level deep\n */\nexport async function executeTxCallbacks<\n TRetrieveResult,\n TMutationResult,\n THooks extends HooksMap = {},\n>(\n callbacks: HandlerTxCallbacks<TRetrieveResult, TMutationResult, THooks>,\n options: ExecuteRestrictedUnitOfWorkOptions,\n): Promise<AwaitedPromisesInObject<TMutationResult>> {\n const retryPolicy =\n options.retryPolicy ??\n new ExponentialBackoffRetryPolicy({\n maxRetries: 5,\n initialDelayMs: 10,\n maxDelayMs: 100,\n });\n const signal = options.signal;\n let attempt = 0;\n\n while (true) {\n // Check if aborted before starting attempt\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n\n try {\n // Create a fresh UOW for this attempt\n const baseUow = options.createUnitOfWork();\n\n const context: TxPhaseContext<THooks> = {\n forSchema: <S extends AnySchema, H extends HooksMap = THooks>(schema: S, hooks?: H) => {\n return baseUow.forSchema(schema, hooks);\n },\n };\n\n let retrieveResult: TRetrieveResult;\n if (callbacks.retrieve) {\n retrieveResult = callbacks.retrieve(context);\n } else {\n retrieveResult = undefined as TRetrieveResult;\n }\n\n await baseUow.executeRetrieve();\n\n let mutationResult: TMutationResult;\n if (callbacks.mutate) {\n mutationResult = callbacks.mutate(context, retrieveResult);\n } else {\n mutationResult = retrieveResult as unknown as TMutationResult;\n }\n\n const awaitedMutationResult = await awaitPromisesInObject(mutationResult);\n\n if (options.onBeforeMutate) {\n options.onBeforeMutate(baseUow);\n }\n\n const result = await baseUow.executeMutations();\n if (!result.success) {\n throw new ConcurrencyConflictError();\n }\n\n if (options.onSuccess) {\n await options.onSuccess(baseUow);\n }\n\n return awaitedMutationResult;\n } catch (error) {\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n\n // Only retry concurrency conflicts, not other errors\n if (!(error instanceof ConcurrencyConflictError)) {\n throw error;\n }\n\n if (!retryPolicy.shouldRetry(attempt, error, signal)) {\n if (signal?.aborted) {\n throw new Error(\"Unit of Work execution aborted\");\n }\n throw new Error(\"Unit of Work execution failed: optimistic concurrency conflict\", {\n cause: error,\n });\n }\n\n const delayMs = retryPolicy.getDelayMs(attempt);\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n attempt++;\n }\n }\n}\n\n/**\n * Execute a transaction for service context.\n * Service callbacks can be async for ergonomic async work.\n *\n * @param schema - Schema to use for the transaction\n * @param callbacks - Object containing retrieve and mutate callbacks\n * @param baseUow - Base Unit of Work (restricted) to use\n * @returns Promise resolving to the mutation result with promises awaited 1 level deep\n */\nexport async function executeServiceTx<\n TSchema extends AnySchema,\n TRetrievalResults extends unknown[],\n TMutationResult,\n THooks extends HooksMap,\n>(\n schema: TSchema,\n callbacks: ServiceTxCallbacks<TSchema, TRetrievalResults, TMutationResult, THooks>,\n baseUow: IUnitOfWork,\n): Promise<AwaitedPromisesInObject<TMutationResult>> {\n const typedUow = baseUow.restrict({ readyFor: \"none\" }).forSchema<TSchema, THooks>(schema);\n\n let retrievalUow: TypedUnitOfWork<TSchema, TRetrievalResults, unknown, THooks>;\n try {\n if (callbacks.retrieve) {\n retrievalUow = callbacks.retrieve(typedUow);\n } else {\n // Safe cast: when there's no retrieve callback, TRetrievalResults should be []\n retrievalUow = typedUow as unknown as TypedUnitOfWork<\n TSchema,\n TRetrievalResults,\n unknown,\n THooks\n >;\n }\n } catch (error) {\n typedUow.signalReadyForRetrieval();\n typedUow.signalReadyForMutation();\n throw error;\n }\n\n typedUow.signalReadyForRetrieval();\n\n // Safe cast: retrievalPhase returns the correct type based on the UOW's type parameters\n const results = (await retrievalUow.retrievalPhase) as TRetrievalResults;\n\n let mutationResult: TMutationResult;\n try {\n if (callbacks.mutate) {\n mutationResult = await callbacks.mutate(retrievalUow, results);\n } else {\n // Safe cast: when there's no mutate callback, TMutationResult should be void\n mutationResult = undefined as TMutationResult;\n }\n } catch (error) {\n typedUow.signalReadyForMutation();\n throw error;\n }\n\n typedUow.signalReadyForMutation();\n\n await retrievalUow.mutationPhase;\n\n return await awaitPromisesInObject(mutationResult);\n}\n"],"mappings":"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"}
@@ -394,7 +394,11 @@ interface IUnitOfWork {
394
394
  getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>>;
395
395
  getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>>;
396
396
  getCreatedIds(): FragnoId[];
397
- restrict(): IUnitOfWork;
397
+ restrict(options?: {
398
+ readyFor?: "mutation" | "retrieval" | "none";
399
+ }): IUnitOfWork;
400
+ signalReadyForRetrieval(): void;
401
+ signalReadyForMutation(): void;
398
402
  reset(): void;
399
403
  forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(schema: TOtherSchema, hooks?: TOtherHooks): TypedUnitOfWork<TOtherSchema, [], any, TOtherHooks>;
400
404
  registerSchema(schema: AnySchema, namespace: string): void;
@@ -467,8 +471,15 @@ declare class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
467
471
  * Create a restricted child UOW that cannot execute phases.
468
472
  * The child shares the same operation storage but must signal readiness
469
473
  * before the parent can execute each phase.
474
+ *
475
+ * @param options.readyFor - Controls automatic readiness signaling:
476
+ * - "mutation" (default): Signals ready for both retrieval and mutation immediately
477
+ * - "retrieval": Signals ready for retrieval only
478
+ * - "none": No automatic signaling, caller must signal manually
470
479
  */
471
- restrict(): UnitOfWork<TRawInput>;
480
+ restrict(options?: {
481
+ readyFor?: "mutation" | "retrieval" | "none";
482
+ }): UnitOfWork<TRawInput>;
472
483
  /**
473
484
  * Signal that this child is ready for retrieval phase execution.
474
485
  * Only valid for restricted (child) UOWs.
@@ -576,7 +587,11 @@ declare class TypedUnitOfWork<const TSchema extends AnySchema, const TRetrievalR
576
587
  executeMutations(): Promise<{
577
588
  success: boolean;
578
589
  }>;
579
- restrict(): IUnitOfWork;
590
+ restrict(options?: {
591
+ readyFor?: "mutation" | "retrieval" | "none";
592
+ }): IUnitOfWork;
593
+ signalReadyForRetrieval(): void;
594
+ signalReadyForMutation(): void;
580
595
  reset(): void;
581
596
  forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(schema: TOtherSchema, hooks?: TOtherHooks): TypedUnitOfWork<TOtherSchema, [], TRawInput, TOtherHooks>;
582
597
  registerSchema(schema: AnySchema, namespace: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"unit-of-work.d.ts","names":[],"sources":["../../../src/query/unit-of-work/unit-of-work.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"unit-of-work.d.ts","names":[],"sources":["../../../src/query/unit-of-work/unit-of-work.ts"],"sourcesContent":[],"mappings":"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"}
@@ -582,14 +582,19 @@ var UnitOfWork = class UnitOfWork {
582
582
  * Create a restricted child UOW that cannot execute phases.
583
583
  * The child shares the same operation storage but must signal readiness
584
584
  * before the parent can execute each phase.
585
+ *
586
+ * @param options.readyFor - Controls automatic readiness signaling:
587
+ * - "mutation" (default): Signals ready for both retrieval and mutation immediately
588
+ * - "retrieval": Signals ready for retrieval only
589
+ * - "none": No automatic signaling, caller must signal manually
585
590
  */
586
- restrict() {
591
+ restrict(options) {
592
+ const readyFor = options?.readyFor ?? "mutation";
587
593
  const child = new UnitOfWork(this.#compiler, this.#executor, this.#decoder, this.#name, {
588
594
  ...this.#config,
589
595
  nonce: this.#nonce
590
596
  }, this.#schemaNamespaceMap);
591
597
  child.#coordinator.setAsRestricted(this, this.#coordinator);
592
- child.#state = this.#state;
593
598
  child.#retrievalOps = this.#retrievalOps;
594
599
  child.#mutationOps = this.#mutationOps;
595
600
  child.#retrievalResults = this.#retrievalResults;
@@ -600,8 +605,8 @@ var UnitOfWork = class UnitOfWork {
600
605
  child.#mutationError = this.#mutationError;
601
606
  child.#triggeredHooks = this.#triggeredHooks;
602
607
  this.#coordinator.addChild(child);
603
- child.signalReadyForRetrieval();
604
- child.signalReadyForMutation();
608
+ if (readyFor === "mutation" || readyFor === "retrieval") child.signalReadyForRetrieval();
609
+ if (readyFor === "mutation") child.signalReadyForMutation();
605
610
  return child;
606
611
  }
607
612
  /**
@@ -653,7 +658,7 @@ var UnitOfWork = class UnitOfWork {
653
658
  return this.#triggeredHooks;
654
659
  }
655
660
  get state() {
656
- return this.#state;
661
+ return this.#coordinator.parent?.state ?? this.#state;
657
662
  }
658
663
  get name() {
659
664
  return this.#name;
@@ -738,7 +743,10 @@ var UnitOfWork = class UnitOfWork {
738
743
  }
739
744
  const result = await this.#executor.executeMutationPhase(mutationBatch);
740
745
  this.#state = "executed";
741
- if (result.success) this.#createdInternalIds = result.createdInternalIds;
746
+ if (result.success) {
747
+ this.#createdInternalIds.length = 0;
748
+ this.#createdInternalIds.push(...result.createdInternalIds);
749
+ }
742
750
  this.#mutationPhaseDeferred.resolve();
743
751
  return { success: result.success };
744
752
  } catch (error) {
@@ -763,7 +771,7 @@ var UnitOfWork = class UnitOfWork {
763
771
  * Add a retrieval operation (used by TypedUnitOfWork)
764
772
  */
765
773
  addRetrievalOperation(op) {
766
- if (this.#state !== "building-retrieval") throw new Error(`Cannot add retrieval operation in state ${this.#state}. Must be in building-retrieval state.`);
774
+ if (this.state !== "building-retrieval") throw new Error(`Cannot add retrieval operation in state ${this.state}. Must be in building-retrieval state.`);
767
775
  this.#retrievalOps.push(op);
768
776
  return this.#retrievalOps.length - 1;
769
777
  }
@@ -772,7 +780,7 @@ var UnitOfWork = class UnitOfWork {
772
780
  * Add a mutation operation (used by TypedUnitOfWork)
773
781
  */
774
782
  addMutationOperation(op) {
775
- if (this.#state === "executed") throw new Error(`Cannot add mutation operation in executed state.`);
783
+ if (this.state === "executed") throw new Error(`Cannot add mutation operation in executed state.`);
776
784
  this.#mutationOps.push(op);
777
785
  }
778
786
  /**
@@ -784,7 +792,7 @@ var UnitOfWork = class UnitOfWork {
784
792
  * @returns Array of FragnoIds in the same order as create() calls
785
793
  */
786
794
  getCreatedIds() {
787
- if (this.#state !== "executed") throw new Error(`getCreatedIds() can only be called after executeMutations(). Current state: ${this.#state}`);
795
+ if (this.state !== "executed") throw new Error(`getCreatedIds() can only be called after executeMutations(). Current state: ${this.state}`);
788
796
  const createdIds = [];
789
797
  let createIndex = 0;
790
798
  for (const op of this.#mutationOps) if (op.type === "create") {
@@ -881,8 +889,14 @@ var TypedUnitOfWork = class {
881
889
  async executeMutations() {
882
890
  return this.#uow.executeMutations();
883
891
  }
884
- restrict() {
885
- return this.#uow.restrict();
892
+ restrict(options) {
893
+ return this.#uow.restrict(options);
894
+ }
895
+ signalReadyForRetrieval() {
896
+ this.#uow.signalReadyForRetrieval();
897
+ }
898
+ signalReadyForMutation() {
899
+ this.#uow.signalReadyForMutation();
886
900
  }
887
901
  reset() {
888
902
  return this.#uow.reset();