@sixb/core 0.1.9 → 0.1.10

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 (279) hide show
  1. package/dist/actions/index.js +8 -8
  2. package/dist/agents/index.js +16 -15
  3. package/dist/agents/index.js.map +1 -1
  4. package/dist/bootstrap/index.js +20 -19
  5. package/dist/bootstrap/index.js.map +1 -1
  6. package/dist/broker/in-memory.d.ts +8 -2
  7. package/dist/broker/in-memory.d.ts.map +1 -1
  8. package/dist/broker/index.d.ts +4 -2
  9. package/dist/broker/index.d.ts.map +1 -1
  10. package/dist/broker/index.js +7 -3
  11. package/dist/broker/index.js.map +1 -1
  12. package/dist/broker/retention.d.ts +4 -0
  13. package/dist/broker/retention.d.ts.map +1 -0
  14. package/dist/broker/subscriber.d.ts +10 -0
  15. package/dist/broker/subscriber.d.ts.map +1 -0
  16. package/dist/broker/types.d.ts +14 -1
  17. package/dist/broker/types.d.ts.map +1 -1
  18. package/dist/{chunk-k3cqkkn2.js → chunk-1824gssz.js} +30 -65
  19. package/dist/chunk-1824gssz.js.map +12 -0
  20. package/dist/{chunk-h1gfhhbh.js → chunk-28ja2cjs.js} +1 -1
  21. package/dist/chunk-2c4j899j.js.map +1 -1
  22. package/dist/{chunk-ppytyr6w.js → chunk-358caqf5.js} +4 -4
  23. package/dist/chunk-358caqf5.js.map +12 -0
  24. package/dist/{chunk-kxwa347f.js → chunk-3qms4nax.js} +2 -2
  25. package/dist/{chunk-kxwa347f.js.map → chunk-3qms4nax.js.map} +3 -3
  26. package/dist/{chunk-emyyk7dx.js → chunk-5c7ga8zz.js} +22 -145
  27. package/dist/chunk-5c7ga8zz.js.map +12 -0
  28. package/dist/{chunk-hpr1r6av.js → chunk-5p1v802y.js} +46 -39
  29. package/dist/{chunk-hpr1r6av.js.map → chunk-5p1v802y.js.map} +4 -4
  30. package/dist/{chunk-zcnq6105.js → chunk-85cd7e8c.js} +2 -1
  31. package/dist/chunk-85cd7e8c.js.map +10 -0
  32. package/dist/{chunk-1enhpacz.js → chunk-976rxdpx.js} +5 -5
  33. package/dist/{chunk-3f7veca0.js → chunk-9x8dybsb.js} +3 -3
  34. package/dist/chunk-9x8dybsb.js.map +10 -0
  35. package/dist/{chunk-r29fxdhn.js → chunk-aa6z4a19.js} +160 -44
  36. package/dist/chunk-aa6z4a19.js.map +12 -0
  37. package/dist/{chunk-r4tfx1sf.js → chunk-agbbygvh.js} +4 -4
  38. package/dist/{chunk-jjy0fhrn.js → chunk-b0ec55a1.js} +20 -3
  39. package/dist/chunk-b0ec55a1.js.map +12 -0
  40. package/dist/{chunk-xfbydgzy.js → chunk-bn138h9w.js} +7 -8
  41. package/dist/{chunk-xfbydgzy.js.map → chunk-bn138h9w.js.map} +3 -3
  42. package/dist/{chunk-an5tt9y0.js → chunk-ftv470j8.js} +42 -4
  43. package/dist/{chunk-an5tt9y0.js.map → chunk-ftv470j8.js.map} +7 -7
  44. package/dist/{chunk-0w35wavj.js → chunk-g7knyczr.js} +1 -1
  45. package/dist/{chunk-x57ycxq0.js → chunk-gqh45d2n.js} +42 -3
  46. package/dist/{chunk-x57ycxq0.js.map → chunk-gqh45d2n.js.map} +3 -3
  47. package/dist/{chunk-0rdrecsb.js → chunk-kfee1h52.js} +116 -32
  48. package/dist/chunk-kfee1h52.js.map +13 -0
  49. package/dist/{chunk-ypbtykv6.js → chunk-nmbxcaqx.js} +1 -1
  50. package/dist/{chunk-3tgwrcyh.js → chunk-nt99sxd6.js} +2 -2
  51. package/dist/{chunk-3tgwrcyh.js.map → chunk-nt99sxd6.js.map} +3 -3
  52. package/dist/{chunk-vf691g1r.js → chunk-p5vcsw9c.js} +2 -2
  53. package/dist/{chunk-mjbk2djy.js → chunk-p6a4npdx.js} +211 -106
  54. package/dist/{chunk-mjbk2djy.js.map → chunk-p6a4npdx.js.map} +9 -8
  55. package/dist/{chunk-3frsnm7x.js → chunk-qma80ych.js} +4 -6
  56. package/dist/chunk-qma80ych.js.map +11 -0
  57. package/dist/{chunk-qhcpj9wc.js → chunk-qyeptdyv.js} +96 -2
  58. package/dist/chunk-qyeptdyv.js.map +15 -0
  59. package/dist/{chunk-52hbv0ak.js → chunk-r7fj830t.js} +101 -48
  60. package/dist/chunk-r7fj830t.js.map +36 -0
  61. package/dist/{chunk-xyr8kppc.js → chunk-rtk71jzp.js} +1 -1
  62. package/dist/{chunk-m3z3x9v0.js → chunk-t1f4f1ve.js} +1 -1
  63. package/dist/chunk-v2vcg0w6.js +151 -0
  64. package/dist/chunk-v2vcg0w6.js.map +11 -0
  65. package/dist/connectors/connections/authorizations.d.ts.map +1 -1
  66. package/dist/connectors/connections/contracts.d.ts +3 -0
  67. package/dist/connectors/connections/contracts.d.ts.map +1 -1
  68. package/dist/connectors/connections/internal.js +1 -1
  69. package/dist/connectors/connections/request.d.ts +3 -1
  70. package/dist/connectors/connections/request.d.ts.map +1 -1
  71. package/dist/connectors/connections/runs.d.ts.map +1 -1
  72. package/dist/connectors/connections/tokens.d.ts.map +1 -1
  73. package/dist/connectors/connections/validation.d.ts +5 -1
  74. package/dist/connectors/connections/validation.d.ts.map +1 -1
  75. package/dist/connectors/types.d.ts +19 -4
  76. package/dist/connectors/types.d.ts.map +1 -1
  77. package/dist/events/execution.d.ts +1 -1
  78. package/dist/events/execution.d.ts.map +1 -1
  79. package/dist/events/index.js +1 -1
  80. package/dist/events/service.d.ts +2 -2
  81. package/dist/events/service.d.ts.map +1 -1
  82. package/dist/execution/agent.js +16 -15
  83. package/dist/execution/agent.js.map +1 -1
  84. package/dist/execution/primitive.js +16 -15
  85. package/dist/execution/primitive.js.map +2 -2
  86. package/dist/execution/request.js +16 -15
  87. package/dist/execution/request.js.map +2 -2
  88. package/dist/index.d.ts +3 -3
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +30 -28
  91. package/dist/index.js.map +1 -1
  92. package/dist/lake-storage/changes.d.ts +5 -0
  93. package/dist/lake-storage/changes.d.ts.map +1 -0
  94. package/dist/lake-storage/in-memory.d.ts +2 -1
  95. package/dist/lake-storage/in-memory.d.ts.map +1 -1
  96. package/dist/lake-storage/index.d.ts +2 -1
  97. package/dist/lake-storage/index.d.ts.map +1 -1
  98. package/dist/lake-storage/index.js +4 -2
  99. package/dist/lake-storage/index.js.map +1 -1
  100. package/dist/lake-storage/types.d.ts +36 -0
  101. package/dist/lake-storage/types.d.ts.map +1 -1
  102. package/dist/logging/internal.js +1 -1
  103. package/dist/materialization/index.d.ts +1 -1
  104. package/dist/materialization/index.d.ts.map +1 -1
  105. package/dist/materialization/model.d.ts +12 -1
  106. package/dist/materialization/model.d.ts.map +1 -1
  107. package/dist/materializer/index.d.ts +1 -1
  108. package/dist/materializer/index.d.ts.map +1 -1
  109. package/dist/materializer/index.js +5 -5
  110. package/dist/materializer/materializer.d.ts +5 -1
  111. package/dist/materializer/materializer.d.ts.map +1 -1
  112. package/dist/materializer/projections/entry-validator.d.ts +2 -1
  113. package/dist/materializer/projections/entry-validator.d.ts.map +1 -1
  114. package/dist/materializer/projections/replace.d.ts.map +1 -1
  115. package/dist/materializer/projections/source-materialization.d.ts +4 -3
  116. package/dist/materializer/projections/source-materialization.d.ts.map +1 -1
  117. package/dist/materializer/shared/normalize.d.ts +2 -1
  118. package/dist/materializer/shared/normalize.d.ts.map +1 -1
  119. package/dist/models/execution/index.js +5 -5
  120. package/dist/objects/index.js +9 -9
  121. package/dist/objects/query/index.js +5 -5
  122. package/dist/pipelines/index.js +6 -6
  123. package/dist/pipelines/run-dispatch.d.ts.map +1 -1
  124. package/dist/projections/internal.js +6 -8
  125. package/dist/projections/internal.js.map +1 -1
  126. package/dist/projections/run-dispatch.d.ts.map +1 -1
  127. package/dist/queues/in-memory.d.ts +7 -3
  128. package/dist/queues/in-memory.d.ts.map +1 -1
  129. package/dist/queues/index.js +1 -1
  130. package/dist/queues/indexed-heap.d.ts +15 -0
  131. package/dist/queues/indexed-heap.d.ts.map +1 -0
  132. package/dist/runtime/host.d.ts.map +1 -1
  133. package/dist/runtime/internal.js +1 -1
  134. package/dist/runtime/ontology-mutations.d.ts +3 -1
  135. package/dist/runtime/ontology-mutations.d.ts.map +1 -1
  136. package/dist/shares/internal.js +4 -4
  137. package/dist/storage/connector-connections/in-memory.d.ts.map +1 -1
  138. package/dist/storage/connector-connections/provider/runs.d.ts.map +1 -1
  139. package/dist/storage/connector-connections/provider.js +2 -2
  140. package/dist/storage/connector-connections/provider.js.map +3 -3
  141. package/dist/storage/connector-connections/types.d.ts +3 -2
  142. package/dist/storage/connector-connections/types.d.ts.map +1 -1
  143. package/dist/storage/index.d.ts +1 -1
  144. package/dist/storage/index.d.ts.map +1 -1
  145. package/dist/storage/index.js +4 -4
  146. package/dist/storage/internal.js +1 -1
  147. package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -1
  148. package/dist/storage/ontology/in-memory/materializations.d.ts +1 -1
  149. package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
  150. package/dist/storage/ontology/in-memory/shared-state.d.ts +15 -2
  151. package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
  152. package/dist/storage/ontology/in-memory/source-roots.d.ts +6 -0
  153. package/dist/storage/ontology/in-memory/source-roots.d.ts.map +1 -0
  154. package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
  155. package/dist/storage/ontology/index.d.ts +1 -1
  156. package/dist/storage/ontology/index.d.ts.map +1 -1
  157. package/dist/storage/ontology/provider.d.ts +16 -0
  158. package/dist/storage/ontology/provider.d.ts.map +1 -1
  159. package/dist/storage/ontology/provider.js +4 -2
  160. package/dist/storage/ontology/provider.js.map +1 -1
  161. package/dist/storage/ontology/sources.d.ts +13 -4
  162. package/dist/storage/ontology/sources.d.ts.map +1 -1
  163. package/dist/storage/projection-runs/lifecycle.d.ts.map +1 -1
  164. package/dist/storage/projection-runs/provider.js +2 -2
  165. package/dist/storage/projection-runs/types.d.ts +2 -0
  166. package/dist/storage/projection-runs/types.d.ts.map +1 -1
  167. package/dist/syncs/index.js +8 -7
  168. package/dist/syncs/index.js.map +1 -1
  169. package/dist/syncs/run-dispatch.d.ts.map +1 -1
  170. package/dist/testing/broker-contract.d.ts.map +1 -1
  171. package/dist/testing/connector-connection-storage-contract.d.ts.map +1 -1
  172. package/dist/testing/index.d.ts +1 -0
  173. package/dist/testing/index.d.ts.map +1 -1
  174. package/dist/testing/index.js +1459 -951
  175. package/dist/testing/index.js.map +9 -8
  176. package/dist/testing/lake-changes-contract.d.ts +6 -0
  177. package/dist/testing/lake-changes-contract.d.ts.map +1 -0
  178. package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
  179. package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
  180. package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
  181. package/dist/webhooks/connections.d.ts +6 -0
  182. package/dist/webhooks/connections.d.ts.map +1 -0
  183. package/dist/webhooks/index.d.ts +1 -1
  184. package/dist/webhooks/index.d.ts.map +1 -1
  185. package/dist/webhooks/internal.d.ts +2 -0
  186. package/dist/webhooks/internal.d.ts.map +1 -1
  187. package/dist/webhooks/internal.js +54 -9
  188. package/dist/webhooks/internal.js.map +4 -3
  189. package/dist/webhooks/registry.d.ts +1 -1
  190. package/dist/webhooks/registry.d.ts.map +1 -1
  191. package/dist/webhooks/types.d.ts +15 -4
  192. package/dist/webhooks/types.d.ts.map +1 -1
  193. package/dist/workflows/index.js +17 -16
  194. package/dist/workflows/index.js.map +1 -1
  195. package/dist/workflows/run-dispatch.d.ts +3 -1
  196. package/dist/workflows/run-dispatch.d.ts.map +1 -1
  197. package/package.json +1 -1
  198. package/src/broker/in-memory.ts +104 -39
  199. package/src/broker/index.ts +4 -1
  200. package/src/broker/retention.ts +28 -0
  201. package/src/broker/subscriber.ts +21 -0
  202. package/src/broker/types.ts +15 -1
  203. package/src/connectors/builders.ts +0 -6
  204. package/src/connectors/connections/authorizations.ts +11 -5
  205. package/src/connectors/connections/contracts.ts +3 -0
  206. package/src/connectors/connections/request.ts +56 -22
  207. package/src/connectors/connections/runs.ts +1 -0
  208. package/src/connectors/connections/tokens.ts +4 -0
  209. package/src/connectors/connections/validation.ts +91 -5
  210. package/src/connectors/types.ts +19 -4
  211. package/src/events/execution.ts +2 -2
  212. package/src/events/service.ts +3 -3
  213. package/src/index.ts +10 -2
  214. package/src/lake-storage/changes.ts +43 -0
  215. package/src/lake-storage/in-memory.ts +73 -0
  216. package/src/lake-storage/index.ts +4 -0
  217. package/src/lake-storage/types.ts +40 -0
  218. package/src/logging/service.ts +1 -1
  219. package/src/materialization/index.ts +2 -0
  220. package/src/materialization/model.ts +14 -1
  221. package/src/materializer/index.ts +2 -0
  222. package/src/materializer/materializer.ts +10 -0
  223. package/src/materializer/projections/entry-validator.ts +19 -1
  224. package/src/materializer/projections/replace.ts +36 -1
  225. package/src/materializer/projections/source-materialization.ts +26 -6
  226. package/src/materializer/shared/normalize.ts +1 -1
  227. package/src/pipelines/run-dispatch.ts +21 -1
  228. package/src/projections/run-dispatch.ts +30 -68
  229. package/src/queues/in-memory.ts +105 -62
  230. package/src/queues/indexed-heap.ts +74 -0
  231. package/src/runtime/host.ts +0 -14
  232. package/src/runtime/ontology-mutations.ts +4 -0
  233. package/src/storage/connector-connections/in-memory.ts +3 -1
  234. package/src/storage/connector-connections/provider/runs.ts +3 -1
  235. package/src/storage/connector-connections/types.ts +3 -2
  236. package/src/storage/index.ts +1 -0
  237. package/src/storage/ontology/in-memory/materializations-state.ts +5 -18
  238. package/src/storage/ontology/in-memory/materializations.ts +73 -92
  239. package/src/storage/ontology/in-memory/shared-state.ts +26 -1
  240. package/src/storage/ontology/in-memory/source-roots.ts +123 -0
  241. package/src/storage/ontology/in-memory/sources.ts +78 -23
  242. package/src/storage/ontology/index.ts +1 -0
  243. package/src/storage/ontology/provider.ts +70 -0
  244. package/src/storage/ontology/sources.ts +14 -3
  245. package/src/storage/projection-runs/lifecycle.ts +5 -2
  246. package/src/storage/projection-runs/types.ts +4 -3
  247. package/src/syncs/run-dispatch.ts +19 -1
  248. package/src/testing/broker-contract.ts +95 -0
  249. package/src/testing/connector-connection-storage-contract.ts +18 -1
  250. package/src/testing/index.ts +1 -0
  251. package/src/testing/lake-changes-contract.ts +240 -0
  252. package/src/testing/materializer-storage-contract.ts +172 -1
  253. package/src/testing/ontology-storage-contract.ts +7 -0
  254. package/src/testing/projection-run-storage-contract.ts +34 -0
  255. package/src/webhooks/connections.ts +56 -0
  256. package/src/webhooks/index.ts +2 -0
  257. package/src/webhooks/internal.ts +2 -0
  258. package/src/webhooks/registry.ts +3 -4
  259. package/src/webhooks/types.ts +17 -4
  260. package/src/workflows/run-dispatch.ts +42 -29
  261. package/dist/chunk-0rdrecsb.js.map +0 -11
  262. package/dist/chunk-3f7veca0.js.map +0 -10
  263. package/dist/chunk-3frsnm7x.js.map +0 -11
  264. package/dist/chunk-52hbv0ak.js.map +0 -36
  265. package/dist/chunk-emyyk7dx.js.map +0 -14
  266. package/dist/chunk-jjy0fhrn.js.map +0 -12
  267. package/dist/chunk-k3cqkkn2.js.map +0 -12
  268. package/dist/chunk-ppytyr6w.js.map +0 -12
  269. package/dist/chunk-qhcpj9wc.js.map +0 -14
  270. package/dist/chunk-r29fxdhn.js.map +0 -11
  271. package/dist/chunk-zcnq6105.js.map +0 -10
  272. /package/dist/{chunk-h1gfhhbh.js.map → chunk-28ja2cjs.js.map} +0 -0
  273. /package/dist/{chunk-1enhpacz.js.map → chunk-976rxdpx.js.map} +0 -0
  274. /package/dist/{chunk-r4tfx1sf.js.map → chunk-agbbygvh.js.map} +0 -0
  275. /package/dist/{chunk-0w35wavj.js.map → chunk-g7knyczr.js.map} +0 -0
  276. /package/dist/{chunk-ypbtykv6.js.map → chunk-nmbxcaqx.js.map} +0 -0
  277. /package/dist/{chunk-vf691g1r.js.map → chunk-p5vcsw9c.js.map} +0 -0
  278. /package/dist/{chunk-xyr8kppc.js.map → chunk-rtk71jzp.js.map} +0 -0
  279. /package/dist/{chunk-m3z3x9v0.js.map → chunk-t1f4f1ve.js.map} +0 -0
@@ -1,14 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/connectors/errors.ts", "../src/syncs/errors.ts", "../src/syncs/run-dispatch.ts", "../src/syncs/request.ts", "../src/connectors/execution.ts"],
4
- "sourcesContent": [
5
- "import {\n createSixbError,\n isSixbError,\n type SixbCodedError,\n type SixbErrorOptions,\n} from \"../errors/internal\"\nimport type { SixbErrorCode } from \"../errors/types\"\nimport { ConnectorConnectionStorageError } from \"../storage/connector-connections/errors\"\n\ntype ConnectorCodedErrorCode = Extract<SixbErrorCode, `connector.${string}`> | \"internal.unexpected\"\n\n/**\n * Legacy authoring error for static connector definitions and lookup.\n *\n * Persistent connection lifecycle failures use the global `SixbErrorCode` contract instead.\n * `ConnectorOAuthError` remains a class because adapters and Core need `instanceof` control flow at\n * the provider-effect boundary.\n */\nexport class ConnectorError extends Error {\n readonly name: string = \"ConnectorError\"\n}\n\nexport class ConnectorNotFoundError extends ConnectorError {\n override readonly name = \"ConnectorNotFoundError\"\n constructor(readonly connectorId: string) {\n super(`Unknown connector '${connectorId}'`)\n }\n}\n\n/**\n * Provider mutation outcome reported by an OAuth adapter.\n *\n * `retryable` guarantees that the provider made no change. `terminal` means the current grant can\n * no longer progress. `ambiguous` means the provider may have changed state; Core fails closed.\n * This classifies the provider effect, not the final Sixb error retry policy: Core also accounts for\n * one-use state, consumed authorization codes, and durable mutation phase before choosing a code.\n */\nexport type ConnectorOAuthErrorKind = \"retryable\" | \"terminal\" | \"ambiguous\"\n\n/** Adapter signal used by Core to decide whether a provider operation can be retried safely. */\nexport class ConnectorOAuthError extends ConnectorError {\n override readonly name = \"ConnectorOAuthError\"\n\n constructor(\n readonly kind: ConnectorOAuthErrorKind,\n message: string,\n options?: ErrorOptions\n ) {\n super(message, options)\n }\n}\n\n/** Internal factory for connector failures that cross a Sixb boundary. */\nexport function createConnectorCodedError(\n code: ConnectorCodedErrorCode,\n message: string,\n options: SixbErrorOptions = {}\n): SixbCodedError {\n return createSixbError(\n code,\n message.startsWith(\"[Sixb]\") ? message : `[Sixb] ${message}`,\n options\n )\n}\n\n/** Internal failure used when a provider operation may have completed after Core lost its fence. */\nexport function createAmbiguousProviderOperationError(\n options: SixbErrorOptions = {}\n): SixbCodedError {\n return createConnectorCodedError(\n \"connector.provider_failed\",\n \"Connector provider operation outcome is ambiguous.\",\n options\n )\n}\n\nexport function oauthErrorKind(error: unknown): ConnectorOAuthErrorKind {\n return error instanceof ConnectorOAuthError ? error.kind : \"ambiguous\"\n}\n\nexport function providerFailureCode(\n error: unknown\n): \"connector.provider_failed\" | \"connector.provider_unavailable\" {\n return oauthErrorKind(error) === \"retryable\"\n ? \"connector.provider_unavailable\"\n : \"connector.provider_failed\"\n}\n\nexport function providerBoundaryError(\n error: unknown,\n code: \"connector.provider_failed\" | \"connector.provider_unavailable\",\n message: string\n): Error {\n if (isSixbError(error) && error.code.startsWith(\"connector.\")) return error\n return createConnectorCodedError(code, message, { cause: error })\n}\n\nexport function isConnectorStorageError(\n error: unknown,\n code?: ConnectorConnectionStorageError[\"code\"]\n): error is ConnectorConnectionStorageError {\n return (\n error instanceof ConnectorConnectionStorageError && (code === undefined || error.code === code)\n )\n}\n\nexport function storageBoundaryError(error: unknown, message: string): SixbCodedError {\n return createConnectorCodedError(\"internal.unexpected\", message, { cause: error })\n}\n\nexport async function recoverConnectorFailure<T>(\n primaryError: unknown,\n message: string,\n recovery: () => Promise<T>\n): Promise<T> {\n try {\n return await recovery()\n } catch (recoveryError) {\n throw createConnectorCodedError(\"internal.unexpected\", message, {\n cause: new AggregateError([primaryError, recoveryError], message),\n })\n }\n}\n",
6
- "export class SyncValidationError extends Error {\n readonly name = \"SyncValidationError\"\n}\n",
7
- "import { randomUUID } from \"node:crypto\"\nimport { reportRunFailure } from \"../error-reporting/capability\"\nimport { createSixbError, toSixbFailure } from \"../errors/internal\"\nimport type { SixbFailure } from \"../errors/types\"\nimport type { RunDispatcher } from \"../execution/dispatch\"\nimport { createPrimitiveExecutionRecord } from \"../execution/durable\"\nimport type { Queues } from \"../queues\"\nimport type { SixbDefinitions } from \"../runtime/definitions\"\nimport type { CreateExecutionInput, Storage, SyncRunFailureCode, SyncRunRecord } from \"../storage\"\nimport { SYNC_RUN_FAILURE_CODES, SyncRunError } from \"../storage\"\nimport { SyncValidationError } from \"./errors\"\nimport type { SyncRunRequestOptions, SyncRunRequestResult } from \"./request\"\nimport type { SyncDefinition } from \"./types\"\n\nexport type AutomaticSyncExecutionSource =\n | { readonly type: \"schedule\"; readonly eventId: string }\n | { readonly type: \"event\"; readonly eventId: string }\n\nexport interface AutomaticSyncRunDispatchInput extends SyncRunRequestOptions {\n readonly syncId: string\n readonly runId: string\n readonly source: AutomaticSyncExecutionSource\n readonly correlationId: string\n readonly metadata?: Readonly<Record<string, string>>\n}\n\nexport type SyncRunDispatchPort = RunDispatcher<AutomaticSyncRunDispatchInput, SyncRunRequestResult>\n\nexport interface SyncRunDispatcherDependencies {\n readonly id: string\n readonly definitions: Pick<SixbDefinitions, \"syncs\">\n readonly storage: Storage\n readonly queues: Pick<Queues, \"syncRuns\">\n}\n\ninterface DispatchSyncRunInput extends SyncRunRequestOptions {\n readonly errorReporterHost: object\n readonly projectId: string\n readonly sync: SyncDefinition\n readonly storage: Storage\n readonly queue: Queues[\"syncRuns\"]\n readonly metadata?: Readonly<Record<string, string>>\n readonly createExecution: (executionId: string, runId: string) => Promise<CreateExecutionInput>\n readonly validateExistingRun?: (run: SyncRunRecord, storage: Storage) => Promise<void>\n}\n\ntype PersistedSyncRun =\n | { readonly publish: false; readonly run: SyncRunRecord }\n | {\n readonly publish: true\n readonly run: SyncRunRecord\n readonly execution: CreateExecutionInput\n readonly queuedAt: Date\n readonly created: boolean\n }\n\n/** Core-owned durable dispatch boundary used by automatic Sync triggers. */\nexport class SyncRunDispatcher implements SyncRunDispatchPort {\n constructor(private readonly dependencies: SyncRunDispatcherDependencies) {}\n\n async dispatch(input: AutomaticSyncRunDispatchInput): Promise<SyncRunRequestResult> {\n assertAutomaticDispatchInput(input)\n const sync = this.dependencies.definitions.syncs.getById(input.syncId)\n if (!sync) throw new SyncValidationError(`[Sixb] Unknown sync '${input.syncId}'`)\n\n return dispatchSyncRun({\n errorReporterHost: this.dependencies,\n projectId: this.dependencies.id,\n sync,\n storage: this.dependencies.storage,\n queue: this.dependencies.queues.syncRuns,\n runId: input.runId,\n expectedLatestVersionId: input.expectedLatestVersionId,\n commitMessage: input.commitMessage,\n metadata: input.metadata,\n validateExistingRun: (run, storage) =>\n assertAutomaticExecutionIdentity(storage, this.dependencies.id, input, run),\n createExecution: async (executionId, runId) =>\n createPrimitiveExecutionRecord({\n id: executionId,\n primitive: { kind: \"sync\", id: sync.id, runId },\n origin: {\n type: \"automatic\",\n projectId: this.dependencies.id,\n source: input.source,\n correlationId: input.correlationId,\n },\n }),\n })\n }\n}\n\n/** Persist a Sync execution and queued run before publishing its queue job. */\nexport async function dispatchSyncRun(input: DispatchSyncRunInput): Promise<SyncRunRequestResult> {\n const runId = createSyncRunId(input.runId)\n const persisted = await persistSyncRun(input, runId)\n if (!persisted.publish) return existingSyncRunResult(persisted.run)\n return publishSyncRun(input, persisted)\n}\n\nasync function persistSyncRun(\n input: DispatchSyncRunInput,\n runId: string\n): Promise<PersistedSyncRun> {\n const syncRuns = requireSyncRunStorage(input.storage)\n const existing = await syncRuns.getById({ projectId: input.projectId, id: runId })\n if (existing) return reuseSyncRun(input, existing)\n\n const execution = await input.createExecution(`exec_${randomUUID()}`, runId)\n const queuedAt = new Date()\n try {\n return await input.storage.transaction(\n async (tx): Promise<PersistedSyncRun> => {\n const transactionalRuns = requireSyncRunStorage(tx)\n const raced = await transactionalRuns.getById({ projectId: input.projectId, id: runId })\n if (raced) {\n assertExistingRunMatchesRequest(raced, input)\n await input.validateExistingRun?.(raced, tx)\n return { publish: false, run: raced }\n }\n\n await tx.executions.create(execution)\n const run = await transactionalRuns.queue({\n projectId: input.projectId,\n id: runId,\n executionId: execution.id,\n syncId: input.sync.id,\n datasetId: input.sync.target.dataset.id,\n mode: input.sync.config.mode,\n queuedAt,\n expectedLatestVersionId: input.expectedLatestVersionId,\n commitMessage: input.commitMessage,\n })\n return { publish: true, run, execution, queuedAt, created: true }\n },\n { isolation: \"serializable\" }\n )\n } catch (error) {\n if (!(error instanceof SyncRunError)) throw error\n const raced = await syncRuns.getById({ projectId: input.projectId, id: runId })\n if (!raced) throw error\n assertExistingRunMatchesRequest(raced, input)\n await input.validateExistingRun?.(raced, input.storage)\n return { publish: false, run: raced }\n }\n}\n\nasync function reuseSyncRun(\n input: DispatchSyncRunInput,\n existing: SyncRunRecord\n): Promise<PersistedSyncRun> {\n assertExistingRunMatchesRequest(existing, input)\n await input.validateExistingRun?.(existing, input.storage)\n if (\n existing.status !== \"failed\" ||\n existing.error?.code !== \"queue.enqueue_failed\" ||\n !existing.error.retryable\n ) {\n return { publish: false, run: existing }\n }\n\n const execution = await input.storage.executions.getById({\n projectId: input.projectId,\n id: existing.executionId,\n })\n if (!execution) {\n throw new SyncRunError(\n `[Sixb] Execution '${existing.executionId}' for Sync run '${existing.id}' was not found.`\n )\n }\n\n const queuedAt = new Date()\n const run = await requireSyncRunStorage(input.storage).queue({\n projectId: input.projectId,\n id: existing.id,\n executionId: existing.executionId,\n syncId: existing.syncId,\n datasetId: existing.datasetId,\n mode: existing.mode,\n queuedAt,\n expectedLatestVersionId: existing.expectedLatestVersionId,\n commitMessage: existing.commitMessage,\n })\n return { publish: true, run, execution, queuedAt, created: false }\n}\n\nasync function publishSyncRun(\n input: DispatchSyncRunInput,\n persisted: Extract<PersistedSyncRun, { readonly publish: true }>\n): Promise<SyncRunRequestResult> {\n try {\n const [job] = await input.queue.enqueue({\n projectId: input.projectId,\n jobs: [\n {\n id: persisted.run.id,\n type: \"sync.run.requested\",\n payload: { runId: persisted.run.id },\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n },\n ],\n })\n return {\n syncId: persisted.run.syncId,\n runId: persisted.run.id,\n queuedAt: persisted.queuedAt.toISOString(),\n ...(job?.id ? { jobId: job.id } : {}),\n created: persisted.created,\n }\n } catch (error) {\n const failedAt = new Date()\n const failure = toEnqueueFailure(error, persisted.run, failedAt)\n const failed = await requireSyncRunStorage(input.storage).finish({\n projectId: input.projectId,\n id: persisted.run.id,\n status: \"failed\",\n finishedAt: failedAt,\n error: failure,\n })\n reportRunFailure(input.errorReporterHost, error, {\n projectId: input.projectId,\n runKind: \"sync\",\n run: { runId: failed.id, syncId: failed.syncId },\n failure,\n })\n throw error\n }\n}\n\nfunction assertExistingRunMatchesRequest(\n existing: SyncRunRecord,\n input: Pick<DispatchSyncRunInput, \"sync\" | \"expectedLatestVersionId\" | \"commitMessage\">\n): void {\n if (\n existing.syncId !== input.sync.id ||\n existing.datasetId !== input.sync.target.dataset.id ||\n existing.mode !== input.sync.config.mode ||\n existing.expectedLatestVersionId !== input.expectedLatestVersionId ||\n existing.commitMessage !== input.commitMessage\n ) {\n throw new SyncRunError(\n `[Sixb] Sync run '${existing.id}' already exists with a different request payload.`\n )\n }\n}\n\nfunction existingSyncRunResult(existing: SyncRunRecord): SyncRunRequestResult {\n return {\n syncId: existing.syncId,\n runId: existing.id,\n queuedAt: existing.queuedAt.toISOString(),\n created: false,\n }\n}\n\nfunction requireSyncRunStorage(storage: Storage): NonNullable<Storage[\"syncRuns\"]> {\n if (!storage.syncRuns) throw new SyncValidationError(\"[Sixb] Sync run storage is not configured.\")\n return storage.syncRuns\n}\n\nfunction createSyncRunId(runId: string | undefined): string {\n if (runId === undefined) return `run_${randomUUID()}`\n if (!runId.trim()) throw new SyncValidationError(\"[Sixb] Sync run id must not be empty\")\n return runId\n}\n\nfunction assertAutomaticDispatchInput(input: AutomaticSyncRunDispatchInput): void {\n assertNonBlank(input.syncId, \"Sync id\")\n assertNonBlank(input.runId, \"Sync run id\")\n assertNonBlank(input.source.eventId, \"Sync source event id\")\n assertNonBlank(input.correlationId, \"Sync correlation id\")\n}\n\nasync function assertAutomaticExecutionIdentity(\n storage: Storage,\n projectId: string,\n input: AutomaticSyncRunDispatchInput,\n run: SyncRunRecord\n): Promise<void> {\n const execution = await storage.executions.getById({ projectId, id: run.executionId })\n if (\n !execution ||\n execution.source.type !== input.source.type ||\n execution.source.eventId !== input.source.eventId ||\n execution.correlationId !== input.correlationId ||\n execution.requestedBy !== undefined\n ) {\n throw new SyncValidationError(\n `[Sixb] Sync run '${run.id}' already exists with different automatic provenance.`\n )\n }\n}\n\nfunction toEnqueueFailure(\n error: unknown,\n run: SyncRunRecord,\n at: Date\n): SixbFailure<SyncRunFailureCode> {\n const enqueueError = createSixbError(\n \"queue.enqueue_failed\",\n `[Sixb] Could not enqueue Sync run '${run.id}'.`,\n {\n cause: error,\n details: { syncId: run.syncId, runId: run.id, phase: \"enqueue\" },\n }\n )\n return toSixbFailure(enqueueError, { allowedCodes: SYNC_RUN_FAILURE_CODES, at })\n}\n\nfunction assertNonBlank(value: string, label: string): void {\n if (!value.trim()) throw new SyncValidationError(`[Sixb] ${label} must not be empty.`)\n}\n",
8
- "import { assertAuthorized } from \"../authorization\"\nimport { resolveExecutionScopeAuthorization } from \"../execution/authorization\"\nimport {\n createPrimitiveExecutionRecord,\n ensureExecutionRecord,\n executionRecordInputFromRuntime,\n} from \"../execution/durable\"\nimport type { ExecutionContext } from \"../execution/types\"\nimport type { SixbRuntimeContext } from \"../runtime/types\"\nimport { SyncValidationError } from \"./errors\"\nimport { dispatchSyncRun } from \"./run-dispatch\"\nimport type { SyncDefinition } from \"./types\"\n\nexport interface SyncRunRequestOptions {\n /** Stable identity used to make dispatch idempotent. */\n readonly runId?: string\n /** Optimistic concurrency guard: fail the run if the dataset moved past this version. */\n readonly expectedLatestVersionId?: string\n readonly commitMessage?: string\n}\n\nexport interface RequestSyncRunInput extends SyncRunRequestOptions {\n readonly syncId: string\n}\n\nexport interface SyncRunRequestResult {\n readonly syncId: string\n readonly runId: string\n /** Durable time at which the run entered the queue. */\n readonly queuedAt: string\n readonly jobId?: string\n readonly created: boolean\n}\n\n/**\n * Authorize and queue a sync run request.\n *\n * Operates on an already-resolved definition and the shared runtime context, so the HTTP route and\n * the runtime verb cannot drift apart.\n *\n * The immutable child execution and queued run are persisted before queue publication.\n */\nexport async function requestSyncRun(\n runtime: SixbRuntimeContext,\n execution: ExecutionContext,\n sync: SyncDefinition,\n options: SyncRunRequestOptions = {}\n): Promise<SyncRunRequestResult> {\n resolveExecutionScopeAuthorization(runtime.projectId, {\n execution,\n authorization: runtime.runtimeAuthorization,\n })\n assertAuthorized(runtime, { kind: \"sync.run\", syncId: sync.id })\n if (!runtime.storage.syncRuns) {\n throw new SyncValidationError(\"[Sixb] Sync run storage is not configured.\")\n }\n\n const queue = runtime.queues.syncRuns\n if (!queue) {\n throw new SyncValidationError(\"[Sixb] Sync run queue is not configured.\")\n }\n\n return dispatchSyncRun({\n errorReporterHost: runtime,\n projectId: runtime.projectId,\n sync,\n storage: runtime.storage,\n queue,\n ...options,\n createExecution: async (executionId, runId) => {\n const caller = await ensureExecutionRecord(\n runtime.storage.executions,\n executionRecordInputFromRuntime({\n execution,\n runtimeAuthorization: runtime.runtimeAuthorization,\n })\n )\n return createPrimitiveExecutionRecord({\n id: executionId,\n primitive: { kind: \"sync\", id: sync.id, runId },\n origin: { type: \"execution\", parent: caller },\n })\n },\n })\n}\n",
9
- "import { AuthorizationError, assertProviderAccess } from \"../authorization\"\nimport type { ExecutionContext } from \"../execution\"\nimport { resolveExecutionScopeAuthorization } from \"../execution/authorization\"\nimport type { SixbRuntimeContext } from \"../runtime/types\"\nimport { createConnectorCodedError } from \"./errors\"\nimport type { ConnectorService } from \"./service\"\nimport type {\n AnyConnectorAdapter,\n ConnectorAdapter,\n ConnectorClient,\n ConnectorConnectionMetadata,\n ConnectorConnectionSelector,\n ConnectorDefinition,\n OAuthConnectorAdapter,\n} from \"./types\"\nimport { isOAuthConnectorDefinition } from \"./types\"\n\n/** Resolve a registered connector through one authorized execution. */\nexport interface ConnectorRuntime {\n <TAdapter extends ConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<ConnectorClient<TAdapter>>\n <TAdapter extends OAuthConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>,\n selector: ConnectorConnectionSelector\n ): Promise<ConnectorClient<TAdapter>>\n}\n\nexport interface ConnectorExecutionSource<\n TAdapter extends AnyConnectorAdapter = AnyConnectorAdapter,\n> {\n readonly connection?: ConnectorConnectionMetadata\n connect(signal: AbortSignal): Promise<ConnectorClient<TAdapter>>\n}\n\nexport interface ConnectorExecutionSourceResolver {\n list<TAdapter extends AnyConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<readonly ConnectorExecutionSource<TAdapter>[]>\n}\n\nconst sourceResolvers = new WeakMap<ConnectorRuntime, ConnectorExecutionSourceResolver>()\n\nexport function createConnectorRuntime(\n runtime: SixbRuntimeContext,\n execution: ExecutionContext,\n service: ConnectorService\n): ConnectorRuntime {\n const connector = ((definition: ConnectorDefinition, selector?: ConnectorConnectionSelector) => {\n if (isOAuthConnectorDefinition(definition)) {\n assertConnectorConnectionAccess(runtime, execution)\n if (!selector) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `[Sixb] Connector '${definition.id}' uses persistent connections and requires an explicit owner and slot.`\n )\n }\n return service.connectConnection(definition, selector)\n }\n if (selector) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `[Sixb] Static connector '${definition.id}' does not accept a connection.`\n )\n }\n assertProviderAccess(runtime, execution, \"connector.connect\")\n return service.connect(definition as ConnectorDefinition<string, ConnectorAdapter>)\n }) as ConnectorRuntime\n\n registerConnectorExecutionSourceResolver(connector, {\n async list<TAdapter extends AnyConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<readonly ConnectorExecutionSource<TAdapter>[]> {\n if (!isOAuthConnectorDefinition(definition)) {\n return [\n {\n connect: (_signal) =>\n connector(definition as ConnectorDefinition<string, ConnectorAdapter>) as Promise<\n ConnectorClient<TAdapter>\n >,\n },\n ]\n }\n\n assertConnectorConnectionAccess(runtime, execution)\n const connections = await service.listExecutionConnections(definition)\n return connections.map((connection) => ({\n connection: {\n id: connection.id,\n connectorId: connection.connectorId,\n owner: connection.owner,\n slot: connection.slot,\n account: connection.account,\n },\n connect: (signal) =>\n service.connectExecutionConnection(definition, connection, signal) as Promise<\n ConnectorClient<TAdapter>\n >,\n }))\n },\n })\n return connector\n}\n\nfunction registerConnectorExecutionSourceResolver(\n connector: ConnectorRuntime,\n resolver: ConnectorExecutionSourceResolver\n): void {\n const registered = sourceResolvers.get(connector)\n if (registered && registered !== resolver) {\n throw new Error(\"[Sixb] Connector source resolver is already registered for this execution.\")\n }\n sourceResolvers.set(connector, resolver)\n}\n\nexport function getConnectorExecutionSourceResolver(\n connector: ConnectorRuntime\n): ConnectorExecutionSourceResolver {\n const resolver = sourceResolvers.get(connector)\n if (resolver) return resolver\n\n return {\n async list<TAdapter extends AnyConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<readonly ConnectorExecutionSource<TAdapter>[]> {\n if (isOAuthConnectorDefinition(definition)) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `[Sixb] OAuth connector '${definition.id}' cannot be resolved without the managed connection runtime.`\n )\n }\n return [\n {\n connect: (_signal) =>\n connector(definition as ConnectorDefinition<string, ConnectorAdapter>) as Promise<\n ConnectorClient<TAdapter>\n >,\n },\n ]\n },\n }\n}\n\nfunction assertConnectorConnectionAccess(\n runtime: SixbRuntimeContext,\n execution: ExecutionContext\n): void {\n const resolved = resolveExecutionScopeAuthorization(runtime.projectId, {\n execution,\n authorization: runtime.runtimeAuthorization,\n })\n if (resolved.type === \"unrestricted\" && resolved.ref.type === \"trustedPrimitive\") return\n throw new AuthorizationError(\n \"privileged:connector-connection.connect\",\n \"[Sixb] Connector connection clients are restricted to trusted primitive executions.\"\n )\n}\n"
10
- ],
11
- "mappings": "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",
12
- "debugId": "98A5F7B5136CE1F764756E2164756E21",
13
- "names": []
14
- }
@@ -1,12 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/pipelines/errors.ts", "../src/pipelines/run-dispatch.ts", "../src/pipelines/request.ts"],
4
- "sourcesContent": [
5
- "export class PipelineError extends Error {\n readonly name = \"PipelineError\"\n}\n",
6
- "import { randomUUID } from \"node:crypto\"\nimport { reportRunFailure } from \"../error-reporting/capability\"\nimport { createSixbError, toSixbFailure } from \"../errors/internal\"\nimport type { SixbFailure } from \"../errors/types\"\nimport type { RunDispatcher } from \"../execution/dispatch\"\nimport { createPrimitiveExecutionRecord } from \"../execution/durable\"\nimport type { Queues } from \"../queues\"\nimport type { SixbDefinitions } from \"../runtime/definitions\"\nimport type {\n CreateExecutionInput,\n PipelineRunFailureCode,\n PipelineRunRecord,\n Storage,\n} from \"../storage\"\nimport { PIPELINE_RUN_FAILURE_CODES, PipelineRunError } from \"../storage\"\nimport { PipelineError } from \"./errors\"\nimport type { PipelineRunRequestOptions, PipelineRunRequestResult } from \"./request\"\nimport type { PipelineDefinition } from \"./types\"\n\nexport type AutomaticPipelineExecutionSource =\n | { readonly type: \"schedule\"; readonly eventId: string }\n | { readonly type: \"event\"; readonly eventId: string }\n\nexport interface AutomaticPipelineRunDispatchInput extends PipelineRunRequestOptions {\n readonly pipelineId: string\n readonly runId: string\n readonly source: AutomaticPipelineExecutionSource\n readonly correlationId: string\n readonly metadata?: Readonly<Record<string, string>>\n}\n\nexport type PipelineRunDispatchPort = RunDispatcher<\n AutomaticPipelineRunDispatchInput,\n PipelineRunRequestResult\n>\n\nexport interface PipelineRunDispatcherDependencies {\n readonly id: string\n readonly definitions: Pick<SixbDefinitions, \"pipelines\">\n readonly storage: Storage\n readonly queues: Pick<Queues, \"pipelines\">\n}\n\ninterface DispatchPipelineRunInput extends PipelineRunRequestOptions {\n readonly errorReporterHost: object\n readonly projectId: string\n readonly pipeline: PipelineDefinition\n readonly storage: Storage\n readonly queue: Queues[\"pipelines\"]\n readonly metadata?: Readonly<Record<string, string>>\n readonly createExecution: (executionId: string, runId: string) => Promise<CreateExecutionInput>\n readonly validateExistingRun?: (run: PipelineRunRecord, storage: Storage) => Promise<void>\n}\n\ntype PersistedPipelineRun =\n | { readonly publish: false; readonly run: PipelineRunRecord }\n | {\n readonly publish: true\n readonly run: PipelineRunRecord\n readonly execution: CreateExecutionInput\n readonly queuedAt: Date\n readonly created: boolean\n }\n\n/** Core-owned durable dispatch boundary used by automatic Pipeline triggers. */\nexport class PipelineRunDispatcher implements PipelineRunDispatchPort {\n constructor(private readonly dependencies: PipelineRunDispatcherDependencies) {}\n\n async dispatch(input: AutomaticPipelineRunDispatchInput): Promise<PipelineRunRequestResult> {\n assertAutomaticDispatchInput(input)\n const pipeline = this.dependencies.definitions.pipelines.getById(input.pipelineId)\n if (!pipeline) throw new PipelineError(`[Sixb] Unknown pipeline '${input.pipelineId}'`)\n\n return dispatchPipelineRun({\n errorReporterHost: this.dependencies,\n projectId: this.dependencies.id,\n pipeline,\n storage: this.dependencies.storage,\n queue: this.dependencies.queues.pipelines,\n runId: input.runId,\n metadata: input.metadata,\n validateExistingRun: (run, storage) =>\n assertAutomaticExecutionIdentity(storage, this.dependencies.id, input, run),\n createExecution: async (executionId, runId) =>\n createPrimitiveExecutionRecord({\n id: executionId,\n primitive: { kind: \"pipeline\", id: pipeline.id, runId },\n origin: {\n type: \"automatic\",\n projectId: this.dependencies.id,\n source: input.source,\n correlationId: input.correlationId,\n },\n }),\n })\n }\n}\n\n/** Persist a Pipeline execution and queued run before publishing its queue job. */\nexport async function dispatchPipelineRun(\n input: DispatchPipelineRunInput\n): Promise<PipelineRunRequestResult> {\n const runId = createPipelineRunId(input.runId)\n const persisted = await persistPipelineRun(input, runId)\n if (!persisted.publish) return existingPipelineRunResult(persisted.run)\n return publishPipelineRun(input, persisted)\n}\n\nasync function persistPipelineRun(\n input: DispatchPipelineRunInput,\n runId: string\n): Promise<PersistedPipelineRun> {\n const pipelineRuns = requirePipelineRunStorage(input.storage)\n const existing = await pipelineRuns.getById({ projectId: input.projectId, id: runId })\n if (existing) return reusePipelineRun(input, existing)\n\n const execution = await input.createExecution(`exec_${randomUUID()}`, runId)\n const queuedAt = new Date()\n try {\n return await input.storage.transaction(\n async (tx): Promise<PersistedPipelineRun> => {\n const transactionalRuns = requirePipelineRunStorage(tx)\n const raced = await transactionalRuns.getById({ projectId: input.projectId, id: runId })\n if (raced) {\n assertExistingRunMatchesRequest(raced, input)\n await input.validateExistingRun?.(raced, tx)\n return { publish: false, run: raced }\n }\n\n await tx.executions.create(execution)\n const run = await transactionalRuns.queue({\n projectId: input.projectId,\n id: runId,\n executionId: execution.id,\n pipelineId: input.pipeline.id,\n queuedAt,\n })\n return { publish: true, run, execution, queuedAt, created: true }\n },\n { isolation: \"serializable\" }\n )\n } catch (error) {\n if (!(error instanceof PipelineRunError)) throw error\n const raced = await pipelineRuns.getById({ projectId: input.projectId, id: runId })\n if (!raced) throw error\n assertExistingRunMatchesRequest(raced, input)\n await input.validateExistingRun?.(raced, input.storage)\n return { publish: false, run: raced }\n }\n}\n\nasync function reusePipelineRun(\n input: DispatchPipelineRunInput,\n existing: PipelineRunRecord\n): Promise<PersistedPipelineRun> {\n assertExistingRunMatchesRequest(existing, input)\n await input.validateExistingRun?.(existing, input.storage)\n if (\n existing.status !== \"failed\" ||\n existing.error?.code !== \"queue.enqueue_failed\" ||\n !existing.error.retryable\n ) {\n return { publish: false, run: existing }\n }\n\n const execution = await input.storage.executions.getById({\n projectId: input.projectId,\n id: existing.executionId,\n })\n if (!execution) {\n throw new PipelineRunError(\n `[Sixb] Execution '${existing.executionId}' for Pipeline run '${existing.id}' was not found.`\n )\n }\n\n const queuedAt = new Date()\n const run = await requirePipelineRunStorage(input.storage).queue({\n projectId: input.projectId,\n id: existing.id,\n executionId: existing.executionId,\n pipelineId: existing.pipelineId,\n queuedAt,\n })\n return { publish: true, run, execution, queuedAt, created: false }\n}\n\nasync function publishPipelineRun(\n input: DispatchPipelineRunInput,\n persisted: Extract<PersistedPipelineRun, { readonly publish: true }>\n): Promise<PipelineRunRequestResult> {\n try {\n const [job] = await input.queue.enqueue({\n projectId: input.projectId,\n jobs: [\n {\n id: persisted.run.id,\n type: \"pipeline.run.requested\",\n payload: { runId: persisted.run.id },\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n },\n ],\n })\n return {\n pipelineId: persisted.run.pipelineId,\n runId: persisted.run.id,\n queuedAt: persisted.queuedAt.toISOString(),\n ...(job?.id ? { jobId: job.id } : {}),\n created: persisted.created,\n }\n } catch (error) {\n const failedAt = new Date()\n const failure = toEnqueueFailure(error, persisted.run, failedAt)\n const failed = await requirePipelineRunStorage(input.storage).finish({\n projectId: input.projectId,\n id: persisted.run.id,\n status: \"failed\",\n finishedAt: failedAt,\n error: failure,\n })\n reportRunFailure(input.errorReporterHost, error, {\n projectId: input.projectId,\n runKind: \"pipeline\",\n run: { runId: failed.id, pipelineId: failed.pipelineId },\n failure,\n })\n throw error\n }\n}\n\nfunction assertExistingRunMatchesRequest(\n existing: PipelineRunRecord,\n input: Pick<DispatchPipelineRunInput, \"pipeline\">\n): void {\n if (existing.pipelineId !== input.pipeline.id) {\n throw new PipelineRunError(\n `[Sixb] Pipeline run '${existing.id}' already exists with a different request payload.`\n )\n }\n}\n\nfunction existingPipelineRunResult(existing: PipelineRunRecord): PipelineRunRequestResult {\n return {\n pipelineId: existing.pipelineId,\n runId: existing.id,\n queuedAt: existing.queuedAt.toISOString(),\n created: false,\n }\n}\n\nfunction requirePipelineRunStorage(storage: Storage): NonNullable<Storage[\"pipelineRuns\"]> {\n if (!storage.pipelineRuns) {\n throw new PipelineError(\"[Sixb] Pipeline run storage is not configured.\")\n }\n return storage.pipelineRuns\n}\n\nfunction createPipelineRunId(runId: string | undefined): string {\n if (runId === undefined) return `run_${randomUUID()}`\n if (!runId.trim()) throw new PipelineError(\"[Sixb] Pipeline run id must not be empty\")\n return runId\n}\n\nfunction assertAutomaticDispatchInput(input: AutomaticPipelineRunDispatchInput): void {\n assertNonBlank(input.pipelineId, \"Pipeline id\")\n assertNonBlank(input.runId, \"Pipeline run id\")\n assertNonBlank(input.source.eventId, \"Pipeline source event id\")\n assertNonBlank(input.correlationId, \"Pipeline correlation id\")\n}\n\nasync function assertAutomaticExecutionIdentity(\n storage: Storage,\n projectId: string,\n input: AutomaticPipelineRunDispatchInput,\n run: PipelineRunRecord\n): Promise<void> {\n const execution = await storage.executions.getById({ projectId, id: run.executionId })\n if (\n !execution ||\n execution.source.type !== input.source.type ||\n execution.source.eventId !== input.source.eventId ||\n execution.correlationId !== input.correlationId ||\n execution.requestedBy !== undefined\n ) {\n throw new PipelineError(\n `[Sixb] Pipeline run '${run.id}' already exists with different automatic provenance.`\n )\n }\n}\n\nfunction toEnqueueFailure(\n error: unknown,\n run: PipelineRunRecord,\n at: Date\n): SixbFailure<PipelineRunFailureCode> {\n const enqueueError = createSixbError(\n \"queue.enqueue_failed\",\n `[Sixb] Could not enqueue Pipeline run '${run.id}'.`,\n {\n cause: error,\n details: { pipelineId: run.pipelineId, runId: run.id, phase: \"enqueue\" },\n }\n )\n return toSixbFailure(enqueueError, { allowedCodes: PIPELINE_RUN_FAILURE_CODES, at })\n}\n\nfunction assertNonBlank(value: string, label: string): void {\n if (!value.trim()) throw new PipelineError(`[Sixb] ${label} must not be empty.`)\n}\n",
7
- "import { assertAuthorized } from \"../authorization\"\nimport { resolveExecutionScopeAuthorization } from \"../execution/authorization\"\nimport {\n createPrimitiveExecutionRecord,\n ensureExecutionRecord,\n executionRecordInputFromRuntime,\n} from \"../execution/durable\"\nimport type { ExecutionContext } from \"../execution/types\"\nimport type { SixbRuntimeContext } from \"../runtime/types\"\nimport { PipelineError } from \"./errors\"\nimport { dispatchPipelineRun } from \"./run-dispatch\"\nimport type { PipelineDefinition } from \"./types\"\n\nexport interface PipelineRunRequestOptions {\n /** Stable identity used to make dispatch idempotent. */\n readonly runId?: string\n}\n\nexport interface RequestPipelineRunInput extends PipelineRunRequestOptions {\n readonly pipelineId: string\n}\n\nexport interface PipelineRunRequestResult {\n readonly pipelineId: string\n readonly runId: string\n /** Durable time at which the run entered the queue. */\n readonly queuedAt: string\n readonly jobId?: string\n readonly created: boolean\n}\n\n/**\n * Authorize and queue a pipeline run request.\n *\n * Operates on an already-resolved definition and the shared runtime context, so the HTTP route and\n * the runtime verb cannot drift apart.\n *\n * The immutable child execution and queued run are persisted before queue publication.\n */\nexport async function requestPipelineRun(\n runtime: SixbRuntimeContext,\n execution: ExecutionContext,\n pipeline: PipelineDefinition,\n options: PipelineRunRequestOptions = {}\n): Promise<PipelineRunRequestResult> {\n resolveExecutionScopeAuthorization(runtime.projectId, {\n execution,\n authorization: runtime.runtimeAuthorization,\n })\n assertAuthorized(runtime, { kind: \"pipeline.run\", pipelineId: pipeline.id })\n if (!runtime.storage.pipelineRuns) {\n throw new PipelineError(\"[Sixb] Pipeline run storage is not configured.\")\n }\n\n const queue = runtime.queues.pipelines\n if (!queue) {\n throw new PipelineError(\"[Sixb] Pipeline run queue is not configured.\")\n }\n\n return dispatchPipelineRun({\n errorReporterHost: runtime,\n projectId: runtime.projectId,\n pipeline,\n storage: runtime.storage,\n queue,\n ...options,\n createExecution: async (executionId, runId) => {\n const caller = await ensureExecutionRecord(\n runtime.storage.executions,\n executionRecordInputFromRuntime({\n execution,\n runtimeAuthorization: runtime.runtimeAuthorization,\n })\n )\n return createPrimitiveExecutionRecord({\n id: executionId,\n primitive: { kind: \"pipeline\", id: pipeline.id, runId },\n origin: { type: \"execution\", parent: caller },\n })\n },\n })\n}\n"
8
- ],
9
- "mappings": "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",
10
- "debugId": "C687324B500486F164756E2164756E21",
11
- "names": []
12
- }
@@ -1,12 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/projections/capability.ts", "../src/projections/run-dispatch.ts", "../src/projections/run-id.ts"],
4
- "sourcesContent": [
5
- "import type { ProjectionRegistry } from \"./registry\"\nimport type { ProjectionDispatchDescriptor } from \"./types\"\n\nconst projectionRegistryKey: unique symbol = Symbol(\"sixb.projectionRegistry\")\n\ninterface ProjectionRegistryOwner {\n readonly [projectionRegistryKey]?: ProjectionRegistry\n}\n\nexport function registerProjectionRegistry(owner: object, registry: ProjectionRegistry): void {\n const registered = (owner as ProjectionRegistryOwner)[projectionRegistryKey]\n if (registered && registered !== registry) {\n throw new Error(\"[Sixb] Projection registry is already registered for this owner.\")\n }\n Object.defineProperty(owner, projectionRegistryKey, {\n configurable: false,\n enumerable: false,\n value: registry,\n writable: false,\n })\n}\n\nexport function getProjectionRegistry(owner: object): ProjectionRegistry {\n const registry = (owner as ProjectionRegistryOwner)[projectionRegistryKey]\n if (registry) return registry\n throw new Error(\"[Sixb] Projection registry is not registered for this runtime.\")\n}\n\nexport function getProjectionDispatchDescriptors(\n owner: object\n): readonly ProjectionDispatchDescriptor[] {\n return getProjectionRegistry(owner).getDispatchDescriptors()\n}\n\nexport function shareProjectionRegistry(source: object, target: object): void {\n registerProjectionRegistry(target, getProjectionRegistry(source))\n}\n",
6
- "import { randomUUID } from \"node:crypto\"\nimport { reportRunFailure } from \"../error-reporting/capability\"\nimport { createSixbError, toSixbFailure } from \"../errors/internal\"\nimport type { SixbFailure } from \"../errors/types\"\nimport type { RunDispatcher } from \"../execution/dispatch\"\nimport { createPrimitiveExecutionRecord } from \"../execution/durable\"\nimport type { DatasetProducer, LakeStorage } from \"../lake-storage\"\nimport type { Queues } from \"../queues\"\nimport type { SixbDefinitions } from \"../runtime/definitions\"\nimport type { ExecutionRecord, ProjectionRunRecord, Storage } from \"../storage\"\nimport { ProjectionRunError } from \"../storage\"\nimport { findPrimitiveRunExecution } from \"../storage/executions/run-link\"\nimport {\n assertProjectionRunDurableExecution,\n assertProjectionRunIdentityMatches,\n} from \"../storage/projection-runs/provider\"\nimport { getProjectionRegistry } from \"./capability\"\nimport { ProjectionValidationError } from \"./errors\"\nimport { createProjectionRunId } from \"./run-id\"\nimport {\n PROJECTION_RUN_FAILURE_CODES,\n type ProjectionDefinition,\n type ProjectionRunFailureCode,\n} from \"./types\"\n\n/** Target maximum mapped points per telemetry commit; a single-property projection reads 500 rows. */\nexport const PROJECTION_TELEMETRY_BATCH_SIZE = 500\n\nexport interface ProjectionRunDispatchInput {\n readonly projectionId: string\n readonly datasetVersion: {\n readonly datasetId: string\n readonly versionId: string\n readonly createdAt: string\n }\n readonly metadata?: Readonly<Record<string, string>>\n}\n\nexport interface ProjectionRunDispatchResult {\n readonly projectionId: string\n readonly runId: string\n readonly queuedAt: string\n readonly jobId?: string\n readonly created: boolean\n}\n\nexport type ProjectionRunDispatchPort = RunDispatcher<\n ProjectionRunDispatchInput,\n ProjectionRunDispatchResult\n>\n\nexport interface ProjectionRunDispatcherDependencies {\n readonly id: string\n readonly definitions: Pick<SixbDefinitions, \"projections\">\n readonly lakeStorage: Pick<LakeStorage, \"getVersion\">\n readonly storage: Storage\n readonly queues: Pick<Queues, \"projections\">\n}\n\ntype PersistedProjectionRun =\n | { readonly publish: false; readonly run: ProjectionRunRecord }\n | {\n readonly publish: true\n readonly run: ProjectionRunRecord\n readonly queuedAt: Date\n readonly created: boolean\n }\n\n/** Core-owned durable dispatch boundary for immutable dataset-version materialization. */\nexport class ProjectionRunDispatcher implements ProjectionRunDispatchPort {\n constructor(private readonly dependencies: ProjectionRunDispatcherDependencies) {}\n\n async dispatch(input: ProjectionRunDispatchInput): Promise<ProjectionRunDispatchResult> {\n assertDispatchInput(input)\n const registry = getProjectionRegistry(this.dependencies)\n const descriptor = registry.resolveDispatch(input.projectionId)\n if (descriptor.datasetId !== input.datasetVersion.datasetId) {\n throw new ProjectionValidationError(\n `[Sixb] Projection '${input.projectionId}' consumes dataset '${descriptor.datasetId}', not '${input.datasetVersion.datasetId}'.`\n )\n }\n const projection = this.dependencies.definitions.projections.getById(input.projectionId)\n if (!projection) {\n throw new ProjectionValidationError(`[Sixb] Unknown projection '${input.projectionId}'.`)\n }\n const version = await this.dependencies.lakeStorage.getVersion(\n input.datasetVersion.datasetId,\n input.datasetVersion.versionId\n )\n if (!version || version.createdAt.toISOString() !== input.datasetVersion.createdAt) {\n throw new ProjectionValidationError(\n `[Sixb] Dataset '${input.datasetVersion.datasetId}' version '${input.datasetVersion.versionId}' does not match its immutable metadata.`\n )\n }\n if (version.mode === \"schema\") {\n throw new ProjectionValidationError(\n `[Sixb] Projection '${input.projectionId}' cannot materialize a schema-only dataset version.`\n )\n }\n\n const { datasetId: _datasetId, ...semanticIdentity } = descriptor\n const identity = {\n ...semanticIdentity,\n datasetVersion: structuredClone(input.datasetVersion),\n }\n const runId = createProjectionRunId(this.dependencies.id, identity)\n const projectionRuns = requireProjectionRunStorage(this.dependencies.storage)\n const existing = await projectionRuns.getById({ projectId: this.dependencies.id, id: runId })\n const persisted = existing\n ? await reuseProjectionRun(this.dependencies, existing, identity)\n : await persistProjectionRun({\n dependencies: this.dependencies,\n runId,\n identity,\n projection,\n producerExecution: await resolveProducerExecution(\n this.dependencies.storage,\n this.dependencies.id,\n version.producer\n ),\n })\n\n if (!persisted.publish) return existingResult(persisted.run)\n return publishProjectionRun(this.dependencies, input.metadata, persisted)\n }\n}\n\nasync function persistProjectionRun(input: {\n readonly dependencies: ProjectionRunDispatcherDependencies\n readonly runId: string\n readonly identity: ProjectionRunRecord[\"identity\"]\n readonly projection: ProjectionDefinition\n readonly producerExecution: ExecutionRecord | null\n}): Promise<PersistedProjectionRun> {\n const execution = createPrimitiveExecutionRecord({\n id: `exec_${randomUUID()}`,\n primitive: { kind: \"projection\", id: input.identity.projectionId, runId: input.runId },\n origin: {\n type: \"automatic\",\n projectId: input.dependencies.id,\n source: {\n type: \"datasetVersion\",\n datasetId: input.identity.datasetVersion.datasetId,\n versionId: input.identity.datasetVersion.versionId,\n },\n correlationId: input.producerExecution?.correlationId ?? input.runId,\n requesterGroupIds: input.producerExecution?.requesterGroupIds,\n ...(input.producerExecution?.requestedBy === undefined\n ? {}\n : { requestedBy: input.producerExecution.requestedBy }),\n },\n })\n const queuedAt = new Date()\n\n try {\n return await input.dependencies.storage.transaction(\n async (tx): Promise<PersistedProjectionRun> => {\n const projectionRuns = requireProjectionRunStorage(tx)\n const raced = await projectionRuns.getById({\n projectId: input.dependencies.id,\n id: input.runId,\n })\n if (raced) {\n await assertExistingRun(tx, raced, input.identity)\n return { publish: false, run: raced }\n }\n await tx.executions.create(execution)\n const run = await queueProjectionRun(projectionRuns, {\n id: input.runId,\n projectId: input.dependencies.id,\n executionId: execution.id,\n identity: input.identity,\n projection: input.projection,\n queuedAt,\n })\n return { publish: true, run, queuedAt, created: true }\n },\n { isolation: \"serializable\" }\n )\n } catch (error) {\n if (!(error instanceof ProjectionRunError)) throw error\n const raced = await requireProjectionRunStorage(input.dependencies.storage).getById({\n projectId: input.dependencies.id,\n id: input.runId,\n })\n if (!raced) throw error\n await assertExistingRun(input.dependencies.storage, raced, input.identity)\n return { publish: false, run: raced }\n }\n}\n\nasync function reuseProjectionRun(\n dependencies: ProjectionRunDispatcherDependencies,\n existing: ProjectionRunRecord,\n identity: ProjectionRunRecord[\"identity\"]\n): Promise<PersistedProjectionRun> {\n await assertExistingRun(dependencies.storage, existing, identity)\n if (\n existing.status !== \"failed\" ||\n existing.error?.code !== \"queue.enqueue_failed\" ||\n !existing.error.retryable\n ) {\n return { publish: false, run: existing }\n }\n const queuedAt = new Date()\n const projectionRuns = requireProjectionRunStorage(dependencies.storage)\n try {\n const run = await requeueProjectionRun(projectionRuns, existing, queuedAt)\n return { publish: true, run, queuedAt, created: false }\n } catch (error) {\n if (!(error instanceof ProjectionRunError)) throw error\n const raced = await projectionRuns.getById({ projectId: existing.projectId, id: existing.id })\n if (\n !raced ||\n (raced.status === \"failed\" &&\n raced.error?.code === \"queue.enqueue_failed\" &&\n raced.error.retryable)\n ) {\n throw error\n }\n await assertExistingRun(dependencies.storage, raced, identity)\n return { publish: false, run: raced }\n }\n}\n\nasync function publishProjectionRun(\n dependencies: ProjectionRunDispatcherDependencies,\n metadata: Readonly<Record<string, string>> | undefined,\n persisted: Extract<PersistedProjectionRun, { readonly publish: true }>\n): Promise<ProjectionRunDispatchResult> {\n try {\n const [job] = await dependencies.queues.projections.enqueue({\n projectId: dependencies.id,\n jobs: [\n {\n id: persisted.run.id,\n type: \"projection.run.requested\",\n payload: { runId: persisted.run.id },\n ...(metadata === undefined ? {} : { metadata }),\n },\n ],\n })\n return {\n projectionId: persisted.run.identity.projectionId,\n runId: persisted.run.id,\n queuedAt: persisted.queuedAt.toISOString(),\n ...(job?.id ? { jobId: job.id } : {}),\n created: persisted.created,\n }\n } catch (error) {\n const failedAt = new Date()\n const failure = toEnqueueFailure(error, persisted.run, failedAt)\n const failed = await requireProjectionRunStorage(dependencies.storage).failEnqueue({\n projectId: dependencies.id,\n id: persisted.run.id,\n finishedAt: failedAt,\n error: failure,\n })\n reportRunFailure(dependencies, error, {\n projectId: dependencies.id,\n runKind: \"projection\",\n run: {\n runId: failed.id,\n projectionId: failed.identity.projectionId,\n projectionKind: failed.identity.projectionKind,\n },\n failure,\n })\n throw error\n }\n}\n\nasync function assertExistingRun(\n storage: Storage,\n run: ProjectionRunRecord,\n identity: ProjectionRunRecord[\"identity\"]\n): Promise<void> {\n assertProjectionRunIdentityMatches(run, identity)\n await assertProjectionRunDurableExecution({\n executions: storage.executions,\n projectId: run.projectId,\n executionId: run.executionId,\n runId: run.id,\n projectionId: run.identity.projectionId,\n datasetId: run.identity.datasetVersion.datasetId,\n datasetVersionId: run.identity.datasetVersion.versionId,\n })\n}\n\nasync function resolveProducerExecution(\n storage: Storage,\n projectId: string,\n producer: DatasetProducer | undefined\n): Promise<ExecutionRecord | null> {\n if (producer?.kind === \"ingest\") {\n return producer.id ? storage.executions.getById({ projectId, id: producer.id }) : null\n }\n if (!producer?.runId) return null\n if (producer.kind === \"sync\") {\n const run = await storage.syncRuns?.getById({ projectId, id: producer.runId })\n if (!run) return null\n assertProducerId(producer, run.syncId)\n return requireProducerExecution({\n executions: storage.executions,\n projectId,\n executionId: run.executionId,\n primitive: { kind: \"sync\", id: run.syncId, runId: run.id },\n })\n }\n\n const run = await storage.pipelineRuns?.getById({ projectId, id: producer.runId })\n if (!run) return null\n assertProducerId(producer, run.pipelineId)\n return requireProducerExecution({\n executions: storage.executions,\n projectId,\n executionId: run.executionId,\n primitive: { kind: \"pipeline\", id: run.pipelineId, runId: run.id },\n })\n}\n\nasync function requireProducerExecution(input: {\n readonly executions: Storage[\"executions\"]\n readonly projectId: string\n readonly executionId: string\n readonly primitive:\n | { readonly kind: \"sync\"; readonly id: string; readonly runId: string }\n | { readonly kind: \"pipeline\"; readonly id: string; readonly runId: string }\n}): Promise<ExecutionRecord> {\n const execution = await findPrimitiveRunExecution({\n executions: input.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n primitive: input.primitive,\n sourceTypes: [\"execution\", \"schedule\", \"event\"],\n })\n if (execution) return execution\n throw new ProjectionValidationError(\n `[Sixb] Dataset producer run '${input.primitive.runId}' references an invalid execution.`\n )\n}\n\nfunction assertProducerId(producer: DatasetProducer, runOwnerId: string): void {\n if (producer.id === undefined || producer.id === runOwnerId) return\n throw new ProjectionValidationError(\n `[Sixb] Dataset producer '${producer.kind}:${producer.id}' does not match run '${producer.runId}'.`\n )\n}\n\nfunction requireProjectionRunStorage(storage: Storage): NonNullable<Storage[\"projectionRuns\"]> {\n if (storage.projectionRuns) return storage.projectionRuns\n throw new ProjectionValidationError(\"[Sixb] Projection run storage is not configured.\")\n}\n\nfunction queueProjectionRun(\n storage: NonNullable<Storage[\"projectionRuns\"]>,\n input: {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly identity: ProjectionRunRecord[\"identity\"]\n readonly projection: ProjectionDefinition\n readonly queuedAt: Date\n }\n): Promise<ProjectionRunRecord> {\n const common = {\n id: input.id,\n projectId: input.projectId,\n executionId: input.executionId,\n queuedAt: input.queuedAt,\n }\n switch (input.projection._tag) {\n case \"ObjectProjectionDefinition\":\n if (input.identity.projectionKind !== \"object\") {\n throw invalidProjectionDefinition(input.id)\n }\n return storage.queue({\n ...common,\n identity: input.identity,\n target: { objectTypeId: input.projection.objectTypeId },\n })\n case \"LinkProjectionDefinition\":\n if (input.identity.projectionKind !== \"link\") {\n throw invalidProjectionDefinition(input.id)\n }\n return storage.queue({\n ...common,\n identity: input.identity,\n target: {\n sourceObjectTypeId: input.projection.sourceObjectTypeId,\n targetObjectTypeId: input.projection.targetObjectTypeId,\n },\n })\n case \"TelemetryProjectionDefinition\":\n if (input.identity.projectionKind !== \"telemetry\") {\n throw invalidProjectionDefinition(input.id)\n }\n return storage.queue({\n ...common,\n identity: input.identity,\n target: { objectTypeId: input.projection.objectTypeId },\n fixedBatchSize: telemetryProjectionBatchRowCount(input.projection),\n })\n }\n}\n\nfunction telemetryProjectionBatchRowCount(\n projection: Extract<ProjectionDefinition, { readonly _tag: \"TelemetryProjectionDefinition\" }>\n): number {\n const mappedPropertyCount = Object.keys(projection.properties).length\n if (mappedPropertyCount === 0) throw invalidProjectionDefinition(projection.id)\n return Math.max(1, Math.floor(PROJECTION_TELEMETRY_BATCH_SIZE / mappedPropertyCount))\n}\n\nfunction requeueProjectionRun(\n storage: NonNullable<Storage[\"projectionRuns\"]>,\n run: ProjectionRunRecord,\n queuedAt: Date\n): Promise<ProjectionRunRecord> {\n const common = {\n id: run.id,\n projectId: run.projectId,\n executionId: run.executionId,\n queuedAt,\n }\n switch (run.identity.projectionKind) {\n case \"object\": {\n if (!(\"objectTypeId\" in run.target)) throw invalidProjectionDefinition(run.id)\n return storage.queue({ ...common, identity: run.identity, target: run.target })\n }\n case \"link\": {\n if (!(\"sourceObjectTypeId\" in run.target)) throw invalidProjectionDefinition(run.id)\n return storage.queue({ ...common, identity: run.identity, target: run.target })\n }\n case \"telemetry\": {\n if (!(\"objectTypeId\" in run.target) || !run.telemetryCheckpoint) {\n throw invalidProjectionDefinition(run.id)\n }\n return storage.queue({\n ...common,\n identity: run.identity,\n target: run.target,\n fixedBatchSize: run.telemetryCheckpoint.fixedBatchSize,\n })\n }\n }\n}\n\nfunction invalidProjectionDefinition(runId: string): ProjectionValidationError {\n return new ProjectionValidationError(\n `[Sixb] Projection run '${runId}' has inconsistent definition metadata.`\n )\n}\n\nfunction existingResult(run: ProjectionRunRecord): ProjectionRunDispatchResult {\n return {\n projectionId: run.identity.projectionId,\n runId: run.id,\n queuedAt: run.queuedAt.toISOString(),\n created: false,\n }\n}\n\nfunction assertDispatchInput(input: ProjectionRunDispatchInput): void {\n for (const [field, value] of [\n [\"projectionId\", input.projectionId],\n [\"datasetId\", input.datasetVersion.datasetId],\n [\"versionId\", input.datasetVersion.versionId],\n ] as const) {\n if (!value.trim())\n throw new ProjectionValidationError(`[Sixb] Projection ${field} is required.`)\n }\n const timestamp = Date.parse(input.datasetVersion.createdAt)\n if (\n !Number.isFinite(timestamp) ||\n new Date(timestamp).toISOString() !== input.datasetVersion.createdAt\n ) {\n throw new ProjectionValidationError(\"[Sixb] Projection dataset version timestamp is invalid.\")\n }\n}\n\nfunction toEnqueueFailure(\n error: unknown,\n run: ProjectionRunRecord,\n at: Date\n): SixbFailure<ProjectionRunFailureCode> {\n const enqueueError = createSixbError(\n \"queue.enqueue_failed\",\n `[Sixb] Could not enqueue Projection run '${run.id}'.`,\n {\n cause: error,\n details: {\n projectionId: run.identity.projectionId,\n projectionKind: run.identity.projectionKind,\n runId: run.id,\n phase: \"enqueue\",\n },\n }\n )\n return toSixbFailure(enqueueError, { allowedCodes: PROJECTION_RUN_FAILURE_CODES, at })\n}\n",
7
- "import { sha256Canonical } from \"../materialization/identity\"\nimport type { ProjectionMaterializationIdentity } from \"../materialization/model\"\n\nexport function createProjectionRunId(\n projectId: string,\n identity: ProjectionMaterializationIdentity\n): string {\n return sha256Canonical({\n projectId,\n projectionId: identity.projectionId,\n projectionKind: identity.projectionKind,\n protocol: identity.protocol,\n datasetId: identity.datasetVersion.datasetId,\n versionId: identity.datasetVersion.versionId,\n createdAt: identity.datasetVersion.createdAt,\n ontologyRevision: identity.ontologyRevision,\n projectionRevision: identity.projectionRevision,\n ownershipHash: identity.ownershipHash,\n })\n}\n"
8
- ],
9
- "mappings": "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",
10
- "debugId": "43DF77A719EA335B64756E2164756E21",
11
- "names": []
12
- }
@@ -1,12 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/storage/projection-runs/errors.ts", "../src/storage/projection-runs/lifecycle.ts", "../src/storage/projection-runs/provider.ts"],
4
- "sourcesContent": [
5
- "import {\n MaterializationConflictError,\n type MaterializationConflictKind,\n} from \"../../materialization/errors\"\n\n/**\n * Base error for projection-run storage operations.\n */\nexport class ProjectionRunError extends MaterializationConflictError {\n readonly name = \"ProjectionRunError\"\n\n constructor(message: string, kind: MaterializationConflictKind = \"run-correlation\") {\n super(kind, message)\n }\n}\n",
6
- "import { parseSixbFailure } from \"../../errors/internal\"\nimport type { SixbFailure } from \"../../errors/types\"\nimport type {\n ProjectionMaterializationIdentity,\n ProjectionRunTerminalDecision,\n} from \"../../materialization/model\"\nimport type {\n ProjectionKind,\n ProjectionRunFailureCode,\n ProjectionTarget,\n} from \"../../projections/types\"\nimport { PROJECTION_RUN_FAILURE_CODES } from \"../../projections/types\"\nimport { ProjectionRunError } from \"./errors\"\nimport type {\n AdvanceProjectionTelemetryCheckpointInput,\n FailProjectionRunEnqueueInput,\n FinishProjectionRunInput,\n ProjectionMissingTarget,\n ProjectionRunClaim,\n ProjectionRunProgress,\n ProjectionRunRecord,\n ProjectionRunStatus,\n ProjectionTelemetryCheckpoint,\n QueueProjectionRunInput,\n StartOrReclaimProjectionRunInput,\n TelemetryProjectionRunRecord,\n} from \"./types\"\nimport { PROJECTION_RUN_PROGRESS_KEYS, zeroProjectionRunProgress } from \"./types\"\n\nexport type StoredProjectionRunRecord = ProjectionRunRecord & {\n readonly executionToken?: string\n}\n\nexport interface PersistedProjectionRunRecord {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly projectionId: string\n readonly projectionKind: ProjectionKind\n readonly protocol?: \"replacement\" | \"telemetry\"\n readonly datasetId: string\n readonly datasetVersionId: string\n readonly datasetVersionCreatedAt?: string\n readonly ontologyRevision?: string\n readonly projectionRevision?: string\n readonly ownershipHash?: string\n readonly objectTypeId?: string\n readonly sourceObjectTypeId?: string\n readonly targetObjectTypeId?: string\n readonly status: ProjectionRunStatus\n readonly queuedAt: Date\n readonly startedAt?: Date\n readonly finishedAt?: Date\n readonly attempt: number\n readonly executionToken?: string\n readonly fixedBatchSize?: number\n readonly nextBatchOrdinal?: number\n readonly nextRowOffset?: number\n readonly inputExhausted?: boolean\n readonly missingTargetObjectTypeId?: string\n readonly missingTargetObjectId?: string\n readonly missingTargetBatchOrdinal?: number\n readonly missingTargetFirstSeenAt?: Date\n readonly progress: ProjectionRunProgress\n readonly error?: unknown\n}\n\nexport interface ProjectionTelemetryAdvance {\n readonly progress: ProjectionRunProgress\n readonly checkpoint: ProjectionTelemetryCheckpoint\n}\n\nexport interface ProjectionRunFinishPlan {\n readonly status: Exclude<ProjectionRunStatus, \"queued\" | \"running\">\n readonly finishedAt: Date\n readonly progress: ProjectionRunProgress\n readonly inputExhausted?: true\n readonly error?: SixbFailure<ProjectionRunFailureCode>\n}\n\n// ── Scalar and identity validation ──────────────────────────\n\nexport function assertProjectionRunNonEmpty(value: string, fieldName: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new ProjectionRunError(`[Sixb] Projection run ${fieldName} must not be empty.`)\n }\n}\n\nexport function assertProjectionRunCounter(value: number, fieldName: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new ProjectionRunError(\n `[Sixb] Projection run ${fieldName} must be a non-negative safe integer.`\n )\n }\n}\n\nexport function assertProjectionRunListWindow(value: number | undefined, fieldName: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw new ProjectionRunError(`[Sixb] Projection run list ${fieldName} must be >= 0.`)\n }\n}\n\nexport function addProjectionRunCounter(left: number, right: number, fieldName: string): number {\n const result = left + right\n if (!Number.isSafeInteger(result)) {\n throw new ProjectionRunError(`[Sixb] Projection run ${fieldName} exceeds safe integer range.`)\n }\n return result\n}\n\nexport function assertProjectionRunIdentity(identity: ProjectionMaterializationIdentity): void {\n assertProjectionRunNonEmpty(identity.projectionId, \"projectionId\")\n if (!isProjectionKind(identity.projectionKind)) {\n throw new ProjectionRunError(\n \"[Sixb] Projection run projectionKind must be 'object', 'link', or 'telemetry'.\"\n )\n }\n if (identity.protocol !== \"replacement\" && identity.protocol !== \"telemetry\") {\n throw new ProjectionRunError(\n \"[Sixb] Projection run protocol must be 'replacement' or 'telemetry'.\"\n )\n }\n assertProjectionRunNonEmpty(identity.datasetVersion.datasetId, \"datasetId\")\n assertProjectionRunNonEmpty(identity.datasetVersion.versionId, \"datasetVersionId\")\n assertCanonicalTimestamp(identity.datasetVersion.createdAt, \"datasetVersionCreatedAt\")\n assertProjectionRunNonEmpty(identity.ontologyRevision, \"ontologyRevision\")\n assertProjectionRunNonEmpty(identity.projectionRevision, \"projectionRevision\")\n assertProjectionRunNonEmpty(identity.ownershipHash, \"ownershipHash\")\n if ((identity.protocol === \"telemetry\") !== (identity.projectionKind === \"telemetry\")) {\n throw new ProjectionRunError(\n `[Sixb] Projection run protocol '${identity.protocol}' is incompatible with kind '${identity.projectionKind}'.`\n )\n }\n}\n\nexport function assertProjectionRunIdentityMatches(\n record: Pick<ProjectionRunRecord, \"id\" | \"identity\">,\n identity: ProjectionMaterializationIdentity\n): void {\n if (projectionRunIdentitiesEqual(record.identity, identity)) return\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' materialization identity does not match.`\n )\n}\n\nexport function assertProjectionRunTargetMatches(\n record: Pick<ProjectionRunRecord, \"id\" | \"target\">,\n target: ProjectionTarget\n): void {\n if (projectionTargetsEqual(record.target, target)) return\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' target object types do not match.`\n )\n}\n\nexport function assertProjectionRunStartInput(input: StartOrReclaimProjectionRunInput): void {\n assertProjectionRunNonEmpty(input.id, \"id\")\n assertProjectionRunNonEmpty(input.projectId, \"projectId\")\n assertProjectionRunIdentityAndTarget(input)\n if (input.startedAt) assertProjectionRunDate(input.startedAt, \"startedAt\")\n}\n\nexport function assertProjectionRunQueueInput(input: QueueProjectionRunInput): void {\n assertProjectionRunNonEmpty(input.id, \"id\")\n assertProjectionRunNonEmpty(input.projectId, \"projectId\")\n assertProjectionRunNonEmpty(input.executionId, \"executionId\")\n assertProjectionRunIdentityAndTarget(input)\n if (input.queuedAt) assertProjectionRunDate(input.queuedAt, \"queuedAt\")\n}\n\nfunction assertProjectionRunIdentityAndTarget(\n input: QueueProjectionRunInput | StartOrReclaimProjectionRunInput\n): void {\n assertProjectionRunIdentity(input.identity)\n assertProjectionTarget(input.identity.projectionKind, input.target)\n if (input.identity.projectionKind === \"telemetry\") {\n const telemetry = input as ProjectionRunIdentityInput<\"telemetry\">\n assertPositiveCounter(telemetry.fixedBatchSize, \"fixedBatchSize\")\n } else if (input.fixedBatchSize !== undefined) {\n throw new ProjectionRunError(\n \"[Sixb] Replacement projection runs cannot declare a telemetry fixedBatchSize.\"\n )\n }\n}\n\nexport function planProjectionRunReclaim(\n record: StoredProjectionRunRecord,\n input: StartOrReclaimProjectionRunInput\n): { readonly attempt: number } {\n if (record.status !== \"queued\" && record.status !== \"running\") {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' cannot start from status '${record.status}'.`\n )\n }\n assertProjectionRunIdentityMatches(record, input.identity)\n assertProjectionRunTargetMatches(record, input.target)\n if (record.telemetryCheckpoint?.fixedBatchSize !== input.fixedBatchSize) {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${input.id}' fixed batch size does not match.`\n )\n }\n return { attempt: record.status === \"queued\" ? 1 : nextProjectionRunAttempt(record.attempt) }\n}\n\n// ── Lifecycle transitions ───────────────────────────────────\n\nexport function createProjectionRunRecord(\n input: QueueProjectionRunInput,\n now: Date = new Date()\n): ProjectionRunRecord {\n assertProjectionRunQueueInput(input)\n const base = {\n id: input.id,\n projectId: input.projectId,\n executionId: input.executionId,\n status: \"queued\" as const,\n attempt: 0,\n progress: zeroProjectionRunProgress(),\n queuedAt: new Date(input.queuedAt ?? now),\n }\n switch (input.identity.projectionKind) {\n case \"object\": {\n const object = input as ProjectionRunAdmission<\"object\">\n return { ...base, identity: object.identity, target: object.target }\n }\n case \"link\": {\n const link = input as ProjectionRunAdmission<\"link\">\n return { ...base, identity: link.identity, target: link.target }\n }\n case \"telemetry\": {\n const telemetry = input as ProjectionRunAdmission<\"telemetry\">\n return {\n ...base,\n identity: telemetry.identity,\n target: telemetry.target,\n telemetryCheckpoint: {\n fixedBatchSize: telemetry.fixedBatchSize,\n nextBatchOrdinal: 0,\n nextRowOffset: 0,\n inputExhausted: false,\n },\n }\n }\n }\n}\n\nexport function assertProjectionRunRunning(\n record: Pick<ProjectionRunRecord, \"id\" | \"projectId\" | \"status\">\n): void {\n if (record.status === \"running\") return\n if (record.status !== \"queued\") {\n throw new ProjectionRunError(`[Sixb] Projection run '${record.id}' is already terminal.`)\n }\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' for project '${record.projectId}' is not running.`\n )\n}\n\nexport function assertProjectionRunAttempt(\n record: StoredProjectionRunRecord,\n input: {\n readonly id: string\n readonly executionToken: string\n readonly identity: ProjectionMaterializationIdentity\n }\n): asserts record is StoredProjectionRunRecord & { readonly executionToken: string } {\n assertProjectionRunNonEmpty(input.executionToken, \"executionToken\")\n assertProjectionRunIdentity(input.identity)\n assertProjectionRunRunning(record)\n assertProjectionRunIdentityMatches(record, input.identity)\n if (record.executionToken !== input.executionToken) {\n throw staleProjectionRunExecution(input.id)\n }\n}\n\nexport function nextProjectionRunAttempt(current: number): number {\n assertProjectionRunCounter(current, \"attempt\")\n return addProjectionRunCounter(current, 1, \"attempt\")\n}\n\nexport function mergeProjectionRunProgress(\n current: ProjectionRunProgress,\n patch: Partial<ProjectionRunProgress>\n): ProjectionRunProgress {\n const progress = { ...current }\n for (const key of PROJECTION_RUN_PROGRESS_KEYS) {\n const value = patch[key]\n if (value === undefined) continue\n assertProjectionRunCounter(value, key)\n if (value < current[key]) {\n throw new ProjectionRunError(`[Sixb] Projection run ${key} must not decrease.`)\n }\n progress[key] = value\n }\n assertProjectionRunProgress(progress)\n return progress\n}\n\nexport function assertGenericProgressDoesNotAdvanceTelemetry(\n record: Pick<ProjectionRunRecord, \"id\" | \"identity\" | \"progress\">,\n patch: Partial<ProjectionRunProgress>\n): void {\n if (record.identity.protocol !== \"telemetry\") return\n for (const key of PROJECTION_RUN_PROGRESS_KEYS) {\n if (patch[key] !== undefined && patch[key] !== record.progress[key]) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${record.id}' progress can only advance with its checkpoint.`\n )\n }\n }\n}\n\nexport function advanceProjectionTelemetry(\n record: ProjectionRunRecord,\n input: AdvanceProjectionTelemetryCheckpointInput\n): ProjectionTelemetryAdvance {\n const telemetry = requireTelemetryProjectionRun(record)\n const checkpoint = telemetry.telemetryCheckpoint\n assertProjectionRunCounter(input.batchOrdinal, \"batchOrdinal\")\n assertPositiveCounter(input.batchRowCount, \"batchRowCount\")\n assertProjectionRunCounter(input.batchRowsSkipped, \"batchRowsSkipped\")\n if (input.batchRowsSkipped > input.batchRowCount) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${record.id}' skipped rows exceed its batch row count.`\n )\n }\n if (input.batchOrdinal !== checkpoint.nextBatchOrdinal) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${record.id}' expected batch ordinal ${checkpoint.nextBatchOrdinal}, got ${input.batchOrdinal}.`\n )\n }\n if (input.batchRowCount > checkpoint.fixedBatchSize) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${record.id}' batch exceeds its fixed size.`\n )\n }\n if (!input.inputExhausted && input.batchRowCount !== checkpoint.fixedBatchSize) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${record.id}' cannot advance past a partial non-final batch.`\n )\n }\n if (checkpoint.inputExhausted) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${record.id}' has already exhausted its input.`\n )\n }\n\n const nextRowOffset = addProjectionRunCounter(\n checkpoint.nextRowOffset,\n input.batchRowCount,\n \"nextRowOffset\"\n )\n return {\n progress: {\n sourceRowsRead: nextRowOffset,\n sourceRowsSkipped: addProjectionRunCounter(\n telemetry.progress.sourceRowsSkipped,\n input.batchRowsSkipped,\n \"sourceRowsSkipped\"\n ),\n },\n checkpoint: {\n ...checkpoint,\n nextBatchOrdinal: addProjectionRunCounter(checkpoint.nextBatchOrdinal, 1, \"nextBatchOrdinal\"),\n nextRowOffset,\n inputExhausted: input.inputExhausted,\n },\n }\n}\n\nexport function planProjectionRunFinish(\n record: ProjectionRunRecord,\n input: FinishProjectionRunInput,\n now: Date = new Date()\n): ProjectionRunFinishPlan {\n assertFinishDecision(record, input)\n const patch = input.progress ?? {}\n assertGenericProgressDoesNotAdvanceTelemetry(record, patch)\n const progress = mergeProjectionRunProgress(record.progress, patch)\n const finishedAt = new Date(input.finishedAt ?? now)\n assertProjectionRunDate(finishedAt, \"finishedAt\")\n return {\n status: input.status,\n finishedAt,\n progress,\n ...(input.status === \"succeeded\" && input.protocol === \"telemetry\"\n ? { inputExhausted: true as const }\n : {}),\n ...(input.status === \"succeeded\" || input.error === undefined\n ? {}\n : { error: parseSixbFailure(input.error, PROJECTION_RUN_FAILURE_CODES) }),\n }\n}\n\nexport function finishProjectionRunRecord(\n record: StoredProjectionRunRecord,\n input: FinishProjectionRunInput,\n now: Date = new Date()\n): StoredProjectionRunRecord {\n const plan = planProjectionRunFinish(record, input, now)\n const terminal = {\n executionToken: undefined,\n status: plan.status,\n finishedAt: plan.finishedAt,\n progress: plan.progress,\n error: plan.error,\n }\n if (plan.inputExhausted) {\n const telemetry = requireTelemetryProjectionRun(record)\n return {\n ...telemetry,\n ...terminal,\n telemetryCheckpoint: { ...telemetry.telemetryCheckpoint, inputExhausted: true },\n }\n }\n return { ...record, ...terminal }\n}\n\nexport function failProjectionRunEnqueue(\n record: StoredProjectionRunRecord,\n input: FailProjectionRunEnqueueInput,\n now: Date = new Date()\n): StoredProjectionRunRecord {\n if (record.status !== \"queued\") {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' cannot fail enqueue from status '${record.status}'.`\n )\n }\n const error = parseSixbFailure(input.error, PROJECTION_RUN_FAILURE_CODES)\n if (error.code !== \"queue.enqueue_failed\") {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' enqueue failure must use code 'queue.enqueue_failed'.`\n )\n }\n const finishedAt = new Date(input.finishedAt ?? now)\n assertProjectionRunDate(finishedAt, \"finishedAt\")\n return {\n ...record,\n status: \"failed\",\n finishedAt,\n error,\n }\n}\n\nexport function canRequeueProjectionRunAfterEnqueueFailure(\n record: ProjectionRunRecord,\n input: QueueProjectionRunInput\n): boolean {\n return (\n record.status === \"failed\" &&\n record.error?.code === \"queue.enqueue_failed\" &&\n record.error.retryable &&\n record.executionId === input.executionId &&\n projectionRunIdentitiesEqual(record.identity, input.identity) &&\n projectionTargetsEqual(record.target, input.target) &&\n record.telemetryCheckpoint?.fixedBatchSize === input.fixedBatchSize\n )\n}\n\n// ── Persistence mapping ─────────────────────────────────────\n\nexport function restoreProjectionRun(row: PersistedProjectionRunRecord): StoredProjectionRunRecord {\n assertProjectionRunNonEmpty(row.id, \"id\")\n assertProjectionRunNonEmpty(row.projectId, \"projectId\")\n assertProjectionRunNonEmpty(row.executionId, \"executionId\")\n assertProjectionRunCounter(row.attempt, \"attempt\")\n assertProjectionRunProgress(row.progress)\n assertValidDate(row.queuedAt, \"queuedAt\")\n if (row.startedAt) assertValidDate(row.startedAt, \"startedAt\")\n if (row.finishedAt) assertValidDate(row.finishedAt, \"finishedAt\")\n assertPersistedLifecycle(row)\n\n const identity = restoreIdentity(row)\n const base = {\n id: row.id,\n projectId: row.projectId,\n executionId: row.executionId,\n identity,\n status: row.status,\n queuedAt: new Date(row.queuedAt),\n startedAt: row.startedAt ? new Date(row.startedAt) : undefined,\n finishedAt: row.finishedAt ? new Date(row.finishedAt) : undefined,\n attempt: row.attempt,\n progress: { ...row.progress },\n error:\n row.error === undefined\n ? undefined\n : parseSixbFailure(row.error, PROJECTION_RUN_FAILURE_CODES),\n executionToken: row.executionToken,\n }\n\n if (identity.projectionKind === \"link\") {\n if (!row.sourceObjectTypeId || !row.targetObjectTypeId || row.objectTypeId) {\n throw invalidProjectionRunTarget(row.id)\n }\n assertNoCheckpoint(row)\n return {\n ...base,\n identity,\n target: {\n sourceObjectTypeId: row.sourceObjectTypeId,\n targetObjectTypeId: row.targetObjectTypeId,\n },\n }\n }\n if (!row.objectTypeId || row.sourceObjectTypeId || row.targetObjectTypeId) {\n throw invalidProjectionRunTarget(row.id)\n }\n if (identity.projectionKind === \"telemetry\") {\n const telemetryCheckpoint = restoreCheckpoint(row)\n if (row.progress.sourceRowsRead !== telemetryCheckpoint.nextRowOffset) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${row.id}' progress does not match its checkpoint.`\n )\n }\n if (row.status === \"succeeded\" && !telemetryCheckpoint.inputExhausted) {\n throw incompleteProjectionRun(row.id)\n }\n const missingTarget = restoreMissingTarget(row, telemetryCheckpoint)\n return {\n ...base,\n identity,\n target: { objectTypeId: row.objectTypeId },\n telemetryCheckpoint,\n ...(missingTarget ? { missingTarget } : {}),\n }\n }\n assertNoCheckpoint(row)\n return { ...base, identity, target: { objectTypeId: row.objectTypeId } }\n}\n\nexport function publicProjectionRunRecord(record: StoredProjectionRunRecord): ProjectionRunRecord {\n const cloned = structuredClone(record)\n Reflect.deleteProperty(cloned, \"executionToken\")\n return cloned\n}\n\nexport function createProjectionRunClaim(record: StoredProjectionRunRecord): ProjectionRunClaim {\n assertProjectionRunRunning(record)\n const executionToken = requireProjectionRunExecutionToken(record)\n return {\n run: publicProjectionRunRecord(record),\n execution: { projectionRunId: record.id, executionToken },\n }\n}\n\nexport function requireProjectionRunExecutionToken(record: StoredProjectionRunRecord): string {\n if (record.executionToken) return record.executionToken\n throw incompleteProjectionRun(record.id)\n}\n\nexport function staleProjectionRunExecution(id: string): ProjectionRunError {\n return new ProjectionRunError(\n `[Sixb] Projection run '${id}' execution token is stale.`,\n \"execution-lost\"\n )\n}\n\nexport function projectionRunNotFound(projectId: string, id: string): ProjectionRunError {\n return new ProjectionRunError(\n `[Sixb] Projection run '${id}' not found for project '${projectId}'.`\n )\n}\n\nexport function immutableDatasetVersionConflict(\n identity: ProjectionMaterializationIdentity\n): ProjectionRunError {\n return new ProjectionRunError(\n `[Sixb] Dataset version '${identity.datasetVersion.versionId}' reused an immutable dataset version id with different metadata.`\n )\n}\n\n// ── Private helpers ─────────────────────────────────────────\n\nfunction assertPositiveCounter(value: number, fieldName: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new ProjectionRunError(\n `[Sixb] Projection run ${fieldName} must be a positive safe integer.`\n )\n }\n}\n\nfunction assertCanonicalTimestamp(value: string, fieldName: string): void {\n const milliseconds = Date.parse(value)\n if (!Number.isFinite(milliseconds) || new Date(milliseconds).toISOString() !== value) {\n throw new ProjectionRunError(\n `[Sixb] Projection run ${fieldName} must be a canonical UTC timestamp.`\n )\n }\n}\n\nfunction assertValidDate(value: Date, fieldName: string): void {\n if (!Number.isFinite(value.getTime())) {\n throw new ProjectionRunError(`[Sixb] Projection run persisted ${fieldName} is invalid.`)\n }\n}\n\nfunction assertPersistedLifecycle(row: PersistedProjectionRunRecord): void {\n const hasError = row.error !== undefined\n\n if (row.status === \"queued\") {\n if (\n row.attempt !== 0 ||\n row.startedAt !== undefined ||\n row.finishedAt !== undefined ||\n row.executionToken !== undefined ||\n hasError\n ) {\n throw incompleteProjectionRun(row.id)\n }\n return\n }\n\n if (row.status === \"running\") {\n if (\n row.attempt < 1 ||\n row.startedAt === undefined ||\n row.finishedAt !== undefined ||\n row.executionToken === undefined ||\n hasError\n ) {\n throw incompleteProjectionRun(row.id)\n }\n return\n }\n\n if (row.finishedAt === undefined || row.executionToken !== undefined) {\n throw incompleteProjectionRun(row.id)\n }\n if (row.error !== undefined) {\n const failure = parseSixbFailure(row.error, PROJECTION_RUN_FAILURE_CODES)\n if (failure.code === \"queue.enqueue_failed\") {\n if (\n !failure.retryable ||\n row.status !== \"failed\" ||\n row.attempt !== 0 ||\n row.startedAt !== undefined\n ) {\n throw incompleteProjectionRun(row.id)\n }\n return\n }\n }\n if (row.attempt < 1 || row.startedAt === undefined || (row.status === \"succeeded\" && hasError)) {\n throw incompleteProjectionRun(row.id)\n }\n}\n\nfunction assertProjectionRunDate(value: Date, fieldName: string): void {\n if (!Number.isFinite(value.getTime())) {\n throw new ProjectionRunError(`[Sixb] Projection run ${fieldName} is invalid.`)\n }\n}\n\nfunction isProjectionKind(value: unknown): value is ProjectionKind {\n return value === \"object\" || value === \"link\" || value === \"telemetry\"\n}\n\nfunction assertProjectionTarget(kind: ProjectionKind, target: ProjectionTarget): void {\n if (kind === \"link\") {\n if (!(\"sourceObjectTypeId\" in target)) {\n throw new ProjectionRunError(\n \"[Sixb] Link projection runs must declare source and target object types.\"\n )\n }\n assertProjectionRunNonEmpty(target.sourceObjectTypeId, \"sourceObjectTypeId\")\n assertProjectionRunNonEmpty(target.targetObjectTypeId, \"targetObjectTypeId\")\n return\n }\n if (!(\"objectTypeId\" in target)) {\n throw new ProjectionRunError(\n \"[Sixb] Object and telemetry projection runs must declare one object type.\"\n )\n }\n assertProjectionRunNonEmpty(target.objectTypeId, \"objectTypeId\")\n}\n\nfunction projectionRunIdentitiesEqual(\n left: ProjectionMaterializationIdentity,\n right: ProjectionMaterializationIdentity\n): boolean {\n return (\n left.projectionId === right.projectionId &&\n left.projectionKind === right.projectionKind &&\n left.protocol === right.protocol &&\n left.datasetVersion.datasetId === right.datasetVersion.datasetId &&\n left.datasetVersion.versionId === right.datasetVersion.versionId &&\n left.datasetVersion.createdAt === right.datasetVersion.createdAt &&\n left.ontologyRevision === right.ontologyRevision &&\n left.projectionRevision === right.projectionRevision &&\n left.ownershipHash === right.ownershipHash\n )\n}\n\nfunction projectionTargetsEqual(left: ProjectionTarget, right: ProjectionTarget): boolean {\n if (\"sourceObjectTypeId\" in left || \"sourceObjectTypeId\" in right) {\n return (\n \"sourceObjectTypeId\" in left &&\n \"sourceObjectTypeId\" in right &&\n left.sourceObjectTypeId === right.sourceObjectTypeId &&\n left.targetObjectTypeId === right.targetObjectTypeId\n )\n }\n return left.objectTypeId === right.objectTypeId\n}\n\nfunction assertProjectionRunProgress(progress: ProjectionRunProgress): void {\n for (const key of PROJECTION_RUN_PROGRESS_KEYS) {\n assertProjectionRunCounter(progress[key], key)\n }\n if (progress.sourceRowsSkipped > progress.sourceRowsRead) {\n throw new ProjectionRunError(\n \"[Sixb] Projection run sourceRowsSkipped must not exceed sourceRowsRead.\"\n )\n }\n}\n\nfunction assertFinishDecision(\n record: ProjectionRunRecord,\n input: ProjectionRunTerminalDecision\n): void {\n if (input.status !== \"succeeded\" && input.status !== \"failed\" && input.status !== \"cancelled\") {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' finish status must be terminal.`\n )\n }\n if (input.protocol !== \"replacement\" && input.protocol !== \"telemetry\") {\n throw new ProjectionRunError(`[Sixb] Projection run '${record.id}' finish protocol is invalid.`)\n }\n if (input.protocol !== record.identity.protocol) {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' finish protocol does not match its identity.`\n )\n }\n const inputExhausted = \"inputExhausted\" in input ? input.inputExhausted : undefined\n if (input.status === \"succeeded\" && input.protocol === \"telemetry\") {\n if (inputExhausted === true) return\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${record.id}' cannot succeed before input exhaustion.`\n )\n }\n if (inputExhausted !== undefined) {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' contains telemetry-only completion metadata.`\n )\n }\n}\n\nfunction restoreIdentity(row: PersistedProjectionRunRecord): ProjectionMaterializationIdentity {\n if (\n !row.protocol ||\n !row.datasetVersionCreatedAt ||\n !row.ontologyRevision ||\n !row.projectionRevision ||\n !row.ownershipHash\n ) {\n throw incompleteProjectionRun(row.id)\n }\n const identity = {\n projectionId: row.projectionId,\n projectionKind: row.projectionKind,\n protocol: row.protocol,\n datasetVersion: {\n datasetId: row.datasetId,\n versionId: row.datasetVersionId,\n createdAt: row.datasetVersionCreatedAt,\n },\n ontologyRevision: row.ontologyRevision,\n projectionRevision: row.projectionRevision,\n ownershipHash: row.ownershipHash,\n } as ProjectionMaterializationIdentity\n assertProjectionRunIdentity(identity)\n return identity\n}\n\nfunction restoreCheckpoint(row: PersistedProjectionRunRecord): ProjectionTelemetryCheckpoint {\n if (\n row.fixedBatchSize === undefined ||\n row.nextBatchOrdinal === undefined ||\n row.nextRowOffset === undefined ||\n row.inputExhausted === undefined\n ) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${row.id}' has incomplete checkpoint state.`\n )\n }\n assertPositiveCounter(row.fixedBatchSize, \"fixedBatchSize\")\n assertProjectionRunCounter(row.nextBatchOrdinal, \"nextBatchOrdinal\")\n assertProjectionRunCounter(row.nextRowOffset, \"nextRowOffset\")\n return {\n fixedBatchSize: row.fixedBatchSize,\n nextBatchOrdinal: row.nextBatchOrdinal,\n nextRowOffset: row.nextRowOffset,\n inputExhausted: row.inputExhausted,\n }\n}\n\n/**\n * A wait is either fully persisted or absent. A partially written one would read as \"waiting since\n * the epoch\" or \"waiting for nothing\", and both would decide a run's fate.\n */\nfunction restoreMissingTarget(\n row: PersistedProjectionRunRecord,\n checkpoint: ProjectionTelemetryCheckpoint\n): ProjectionMissingTarget | undefined {\n const columns = [\n row.missingTargetObjectTypeId,\n row.missingTargetObjectId,\n row.missingTargetBatchOrdinal,\n row.missingTargetFirstSeenAt,\n ]\n if (columns.every((column) => column === undefined)) return undefined\n if (\n row.missingTargetObjectTypeId === undefined ||\n row.missingTargetObjectId === undefined ||\n row.missingTargetBatchOrdinal === undefined ||\n row.missingTargetFirstSeenAt === undefined\n ) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${row.id}' has a partially persisted missing target.`\n )\n }\n const missingTarget: ProjectionMissingTarget = {\n objectTypeId: row.missingTargetObjectTypeId,\n objectId: row.missingTargetObjectId,\n batchOrdinal: row.missingTargetBatchOrdinal,\n firstSeenAt: new Date(row.missingTargetFirstSeenAt),\n }\n assertValidDate(missingTarget.firstSeenAt, \"missingTarget.firstSeenAt\")\n assertProjectionRunCounter(missingTarget.batchOrdinal, \"missingTarget.batchOrdinal\")\n if (missingTarget.batchOrdinal !== checkpoint.nextBatchOrdinal) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${row.id}' is waiting on a batch it has already passed.`\n )\n }\n if (missingTarget.objectTypeId !== row.objectTypeId) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${row.id}' is waiting on an object type it does not write.`\n )\n }\n return missingTarget\n}\n\nfunction assertNoCheckpoint(row: PersistedProjectionRunRecord): void {\n if (\n row.fixedBatchSize === undefined &&\n row.nextBatchOrdinal === undefined &&\n row.nextRowOffset === undefined &&\n row.inputExhausted === undefined\n ) {\n return\n }\n throw new ProjectionRunError(\n `[Sixb] Replacement projection run '${row.id}' contains a telemetry checkpoint.`\n )\n}\n\nfunction incompleteProjectionRun(id: string): ProjectionRunError {\n return new ProjectionRunError(\n `[Sixb] Projection run '${id}' has incomplete materialization state.`\n )\n}\n\nfunction invalidProjectionRunTarget(id: string): ProjectionRunError {\n return new ProjectionRunError(`[Sixb] Projection run '${id}' has an invalid target.`)\n}\n\n/**\n * Validates a wait before it is stored, so every adapter refuses the same shapes and the SQL\n * `CHECK` behind them never has to be the thing that catches it.\n *\n * The ordinal has to be the batch the run is actually stuck on: anchored to a stale one, a wait\n * would survive the progress that resolved it and fail a run that is working. The object type\n * has to be the one this run writes, since that is the only type its telemetry can reference.\n */\nexport function assertProjectionMissingTarget(\n record: TelemetryProjectionRunRecord,\n missingTarget: ProjectionMissingTarget\n): ProjectionMissingTarget {\n assertProjectionRunNonEmpty(missingTarget.objectTypeId, \"missingTarget.objectTypeId\")\n assertProjectionRunNonEmpty(missingTarget.objectId, \"missingTarget.objectId\")\n assertProjectionRunCounter(missingTarget.batchOrdinal, \"missingTarget.batchOrdinal\")\n if (Number.isNaN(missingTarget.firstSeenAt.getTime())) {\n throw new ProjectionRunError(\"[Sixb] Projection run missingTarget.firstSeenAt is invalid.\")\n }\n if (missingTarget.objectTypeId !== record.target.objectTypeId) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${record.id}' cannot wait on '${missingTarget.objectTypeId}'; it writes '${record.target.objectTypeId}'.`\n )\n }\n if (missingTarget.batchOrdinal !== record.telemetryCheckpoint.nextBatchOrdinal) {\n throw new ProjectionRunError(\n `[Sixb] Telemetry projection run '${record.id}' cannot wait on batch ${missingTarget.batchOrdinal}; it is at ${record.telemetryCheckpoint.nextBatchOrdinal}.`\n )\n }\n return missingTarget\n}\n\nexport function requireTelemetryProjectionRun<TRecord extends ProjectionRunRecord>(\n record: TRecord\n): TRecord & TelemetryProjectionRunRecord {\n if (isTelemetryProjectionRun(record)) return record as TRecord & TelemetryProjectionRunRecord\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' does not have a telemetry checkpoint.`\n )\n}\n\ntype ProjectionRunIdentityInput<TKind extends ProjectionKind> = Extract<\n QueueProjectionRunInput | StartOrReclaimProjectionRunInput,\n { readonly identity: { readonly projectionKind: TKind } }\n>\n\ntype ProjectionRunAdmission<TKind extends ProjectionKind> = Extract<\n QueueProjectionRunInput,\n { readonly identity: { readonly projectionKind: TKind } }\n>\n\nfunction isTelemetryProjectionRun(\n record: ProjectionRunRecord\n): record is TelemetryProjectionRunRecord {\n return record.identity.projectionKind === \"telemetry\"\n}\n",
7
- "import type { ExecutionStorage } from \"../executions\"\nimport { findPrimitiveRunExecution } from \"../executions/run-link\"\nimport { ProjectionRunError } from \"./errors\"\n\nexport * from \"./lifecycle\"\n\n/** Validate the semantic link between a durable Projection run and its immutable execution. */\nexport async function assertProjectionRunDurableExecution(input: {\n readonly executions: ExecutionStorage\n readonly projectId: string\n readonly executionId: string\n readonly runId: string\n readonly projectionId: string\n readonly datasetId: string\n readonly datasetVersionId: string\n}): Promise<void> {\n const execution = await findPrimitiveRunExecution({\n executions: input.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n primitive: { kind: \"projection\", id: input.projectionId, runId: input.runId },\n sourceTypes: [\"datasetVersion\"],\n })\n if (\n !execution ||\n execution.source.type !== \"datasetVersion\" ||\n execution.source.datasetId !== input.datasetId ||\n execution.source.versionId !== input.datasetVersionId\n ) {\n throw new ProjectionRunError(\n `[Sixb] Execution '${input.executionId}' does not authorize Projection run '${input.runId}'.`\n )\n }\n}\n"
8
- ],
9
- "mappings": "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",
10
- "debugId": "26E512EA50F920A164756E2164756E21",
11
- "names": []
12
- }
@@ -1,14 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lake-storage/definition-updates.ts", "../src/lake-storage/in-memory.ts", "../src/lake-storage/merge.ts", "../src/lake-storage/source-ordering.ts", "../src/lake-storage/version-inputs.ts"],
4
- "sourcesContent": [
5
- "import type { DatasetColumnDefinition, DatasetDefinition } from \"../datasets\"\nimport { assertDatasetDefinition } from \"../datasets/validation\"\nimport { LakeStorageError } from \"./errors\"\nimport type { LakeStorage } from \"./types\"\n\nexport type DatasetSchemaUpdatePlan =\n | { readonly kind: \"none\" }\n | {\n readonly kind: \"addNullableColumns\"\n readonly columns: readonly DatasetColumnDefinition[]\n }\n\nexport interface DatasetMetadataUpdatePlan {\n readonly descriptionChanged: boolean\n readonly partitionByChanged: boolean\n}\n\nexport interface DatasetDefinitionUpdatePlan {\n readonly existing: DatasetDefinition\n readonly requested: DatasetDefinition\n readonly definition: DatasetDefinition\n readonly schema: DatasetSchemaUpdatePlan\n readonly metadata: DatasetMetadataUpdatePlan\n readonly changed: boolean\n}\n\nconst SCHEMA_UPDATE_V1_POLICY =\n \"Dataset definition updates V1 support only adding nullable columns.\"\n\n/**\n * Build a provider-neutral update plan for two versions of the same dataset\n * definition. Core owns the definition diff; storage providers own how much of\n * the plan they can apply.\n */\nexport function planDatasetDefinitionUpdate(\n existing: DatasetDefinition,\n requested: DatasetDefinition\n): DatasetDefinitionUpdatePlan {\n assertSameDataset(existing, requested)\n assertDatasetDefinition(requested, (message) => new LakeStorageError(`[SixbLake] ${message}`))\n if (existing.sequenceBy !== requested.sequenceBy) {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${requested.id}' sequenceBy is immutable. Create a new dataset and backfill to adopt or change source ordering.`\n )\n }\n assertPrimaryKeyUnchanged(existing, requested)\n\n const addedColumns = getAddedColumnsAfterValidatingExistingColumns(existing, requested)\n assertAddedColumnsAreNullable(requested.id, addedColumns)\n\n const schema = toSchemaUpdatePlan(addedColumns)\n const definition = mergeDatasetDefinition(existing, requested, addedColumns)\n const metadata: DatasetMetadataUpdatePlan = {\n descriptionChanged: existing.description !== definition.description,\n partitionByChanged: !areStringArraysEqual(existing.partitionBy, definition.partitionBy),\n }\n\n return {\n existing: structuredClone(existing),\n requested: structuredClone(requested),\n definition,\n schema,\n metadata,\n changed: schema.kind !== \"none\" || metadata.descriptionChanged || metadata.partitionByChanged,\n }\n}\n\n/**\n * Strict providers can use this helper when they do not support schema\n * evolution. Metadata-only compatible additions are still merged.\n */\nexport function mergeStrictDatasetDefinition(options: {\n readonly existing?: DatasetDefinition | null\n readonly next: DatasetDefinition\n}): DatasetDefinition {\n assertDatasetDefinition(options.next, (message) => new LakeStorageError(`[SixbLake] ${message}`))\n if (!options.existing) {\n return structuredClone(options.next)\n }\n\n const plan = planDatasetDefinitionUpdate(options.existing, options.next)\n if (plan.schema.kind !== \"none\") {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${options.next.id}' cannot be redefined with an incompatible schema.`\n )\n }\n\n return structuredClone(plan.definition)\n}\n\nexport interface AssertLakeDatasetDefinitionsCompatibleOptions {\n readonly lakeStorage: LakeStorage\n readonly definitions: readonly DatasetDefinition[]\n}\n\nexport async function assertLakeDatasetDefinitionsCompatible(\n options: AssertLakeDatasetDefinitionsCompatibleOptions\n): Promise<void> {\n await options.lakeStorage.assertDatasetDefinitionsCompatible(options.definitions)\n}\n\nfunction assertSameDataset(existing: DatasetDefinition, requested: DatasetDefinition): void {\n if (existing.id !== requested.id) {\n throw new LakeStorageError(\n `[SixbLake] Cannot update dataset '${existing.id}' with definition for '${requested.id}'.`\n )\n }\n}\n\nfunction assertPrimaryKeyUnchanged(\n existing: DatasetDefinition,\n requested: DatasetDefinition\n): void {\n const existingPrimaryKey = existing.primaryKey\n const requestedPrimaryKey = requested.primaryKey\n const unchanged =\n existingPrimaryKey === undefined || requestedPrimaryKey === undefined\n ? existingPrimaryKey === requestedPrimaryKey\n : areDefinitionValuesEqual(existingPrimaryKey, requestedPrimaryKey)\n\n if (!unchanged) {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${requested.id}' cannot be redefined with an incompatible primaryKey. Primary keys are immutable.`\n )\n }\n}\n\nfunction getAddedColumnsAfterValidatingExistingColumns(\n existing: DatasetDefinition,\n requested: DatasetDefinition\n): readonly DatasetColumnDefinition[] {\n const existingColumns = existing.schema.columns\n const requestedColumnsByName = new Map(\n requested.schema.columns.map((column) => [column.name, column])\n )\n\n // Existing columns are matched by name, not position. Developers can reorder\n // declarations for readability without implying a storage-level schema change.\n for (const existingColumn of existingColumns) {\n const requestedColumn = requestedColumnsByName.get(existingColumn.name)\n if (requestedColumn === undefined) {\n throwUnsupportedSchemaUpdate(\n requested.id,\n `dropping column '${existingColumn.name}' is not supported`\n )\n }\n\n assertExistingColumnUnchanged(requested.id, existingColumn, requestedColumn)\n }\n\n const existingColumnNames = new Set(existingColumns.map((column) => column.name))\n return requested.schema.columns.filter((column) => !existingColumnNames.has(column.name))\n}\n\nfunction assertAddedColumnsAreNullable(\n datasetId: string,\n addedColumns: readonly DatasetColumnDefinition[]\n): void {\n for (const column of addedColumns) {\n // Existing rows have no value for a new column. Until DatasetDefinition\n // supports defaults or backfills, only nullable columns are safe to add.\n if (!isNullable(column)) {\n throwUnsupportedSchemaUpdate(\n datasetId,\n `adding required column '${column.name}' is not supported`\n )\n }\n }\n}\n\nfunction assertExistingColumnUnchanged(\n datasetId: string,\n existing: DatasetColumnDefinition,\n requested: DatasetColumnDefinition\n): void {\n if (existing.type !== requested.type) {\n throwUnsupportedSchemaUpdate(\n datasetId,\n `changing column '${existing.name}' type from '${existing.type}' to '${requested.type}' is not supported`\n )\n }\n\n if (isNullable(existing) !== isNullable(requested)) {\n throwUnsupportedSchemaUpdate(\n datasetId,\n `changing column '${existing.name}' nullability is not supported`\n )\n }\n}\n\nfunction toSchemaUpdatePlan(\n addedColumns: readonly DatasetColumnDefinition[]\n): DatasetSchemaUpdatePlan {\n if (addedColumns.length === 0) {\n return { kind: \"none\" }\n }\n\n return {\n kind: \"addNullableColumns\",\n columns: cloneColumns(addedColumns),\n }\n}\n\nfunction mergeDatasetDefinition(\n existing: DatasetDefinition,\n requested: DatasetDefinition,\n addedColumns: readonly DatasetColumnDefinition[]\n): DatasetDefinition {\n assertCompatibleMetadataField(\n requested.id,\n \"description\",\n existing.description,\n requested.description\n )\n assertCompatibleMetadataField(\n requested.id,\n \"partitionBy\",\n existing.partitionBy,\n requested.partitionBy\n )\n\n const columns = [...cloneColumns(existing.schema.columns), ...cloneColumns(addedColumns)]\n const primaryKey = existing.primaryKey\n const partitionBy = requested.partitionBy ?? existing.partitionBy\n const description = requested.description ?? existing.description\n\n return {\n kind: \"dataset\",\n id: requested.id,\n schema: { columns },\n ...(primaryKey !== undefined ? { primaryKey: structuredClone(primaryKey) } : {}),\n ...(existing.sequenceBy !== undefined ? { sequenceBy: existing.sequenceBy } : {}),\n ...(partitionBy !== undefined ? { partitionBy: [...partitionBy] } : {}),\n ...(description !== undefined ? { description } : {}),\n }\n}\n\nfunction assertCompatibleMetadataField(\n datasetId: string,\n field: \"description\" | \"partitionBy\",\n existing: string | readonly string[] | undefined,\n requested: string | readonly string[] | undefined\n): void {\n if (\n existing === undefined ||\n requested === undefined ||\n areDefinitionValuesEqual(existing, requested)\n ) {\n return\n }\n\n throw new LakeStorageError(\n `[SixbLake] Dataset '${datasetId}' cannot be redefined with an incompatible ${field}.`\n )\n}\n\nfunction areStringArraysEqual(\n left: readonly string[] | undefined,\n right: readonly string[] | undefined\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right\n }\n\n return left.length === right.length && left.every((value, index) => value === right[index])\n}\n\nfunction areDefinitionValuesEqual(\n left: string | readonly string[],\n right: string | readonly string[]\n): boolean {\n if (typeof left === \"string\" || typeof right === \"string\") {\n return left === right\n }\n\n return areStringArraysEqual(left, right)\n}\n\nfunction isNullable(column: DatasetColumnDefinition): boolean {\n return column.nullable === true\n}\n\nfunction cloneColumns(\n columns: readonly DatasetColumnDefinition[]\n): readonly DatasetColumnDefinition[] {\n return columns.map((column) => ({ ...column }))\n}\n\nfunction throwUnsupportedSchemaUpdate(datasetId: string, detail: string): never {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${datasetId}' cannot apply schema update because ${detail}. ${SCHEMA_UPDATE_V1_POLICY}`\n )\n}\n",
6
- "import { randomUUID } from \"node:crypto\"\nimport type { DatasetDefinition, DatasetSchema, MergeChange } from \"../datasets\"\nimport { getDatasetRowValidationError } from \"../datasets/validation\"\nimport { mergeStrictDatasetDefinition } from \"./definition-updates\"\nimport { LakeConcurrencyError, LakeStorageError } from \"./errors\"\nimport type {\n BeginDatasetMergeInput,\n CommitDatasetMergeInput,\n DatasetMergeCommitResult,\n LakeMergeSession,\n} from \"./merge\"\nimport { retryDatasetMergeCommit } from \"./merge\"\nimport {\n cloneDatasetMergeChange,\n encodeDatasetPrimaryKey,\n getDatasetMergeChangeValidationError,\n getDatasetPrimaryKeyColumns,\n} from \"./merge-validation\"\nimport {\n assertUnsequencedDatasetWrite,\n type DatasetSequenceState,\n datasetSequenceChange,\n reconcileDatasetSequences,\n} from \"./source-ordering\"\nimport type {\n BeginDatasetWriteInput,\n CommitDatasetWriteInput,\n DatasetCatalogState,\n DatasetRow,\n DatasetVersion,\n DatasetWriteCommitResult,\n DatasetWriteMode,\n LakeStorage,\n LakeWriteSession,\n ReadDatasetRowsInput,\n} from \"./types\"\nimport { hasDatasetInputChanges } from \"./version-inputs\"\n\nfunction cloneDatasetDefinition(definition: DatasetDefinition): DatasetDefinition {\n return structuredClone(definition)\n}\n\nfunction cloneDatasetVersion(version: DatasetVersion): DatasetVersion {\n return {\n ...structuredClone(version),\n createdAt: new Date(version.createdAt),\n }\n}\n\nfunction cloneRow(row: DatasetRow): DatasetRow {\n return structuredClone(row)\n}\n\nfunction selectColumns(row: DatasetRow, columns?: readonly string[]): DatasetRow {\n if (!columns || columns.length === 0) {\n return cloneRow(row)\n }\n\n const selected: Record<string, unknown> = {}\n for (const column of columns) {\n selected[column] = row[column]\n }\n return selected\n}\n\n// Canonical content key for unchanged-write detection. JSON.stringify\n// serializes Date values via toJSON, matching how rows persist as JSON;\n// missing and undefined nullable values normalize to null. The unchanged-write\n// semantics are pinned by the shared lake-storage contract suite.\nfunction rowContentKey(row: DatasetRow, schema: DatasetSchema): string {\n return JSON.stringify(schema.columns.map((column) => row[column.name] ?? null))\n}\n\n// Order-insensitive multiset equality over canonical row keys.\nfunction sameRowContent(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) {\n return false\n }\n\n const sortedLeft = [...left].sort()\n const sortedRight = [...right].sort()\n return sortedLeft.every((key, index) => key === sortedRight[index])\n}\n\nfunction assertDatasetId(datasetId: string): void {\n if (datasetId.trim().length === 0) {\n throw new LakeStorageError(\"[LakeStorage] Dataset id must not be empty\")\n }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nclass InMemoryLakeWriteSession implements LakeWriteSession {\n private readonly rows: DatasetRow[] = []\n private readonly primaryKeys = new Set<string>()\n private closed = false\n\n constructor(\n private readonly storage: InMemoryLakeStorage,\n private readonly input: BeginDatasetWriteInput\n ) {}\n\n async writeRows(rows: Iterable<DatasetRow> | AsyncIterable<DatasetRow>): Promise<void> {\n this.assertOpen()\n\n const stagedRows: DatasetRow[] = []\n const stagedPrimaryKeys = new Set<string>()\n for await (const row of rows) {\n const validationError = getDatasetRowValidationError(row, this.input.dataset)\n if (validationError) {\n throw new LakeStorageError(`[LakeStorage] ${validationError}`)\n }\n\n if (getDatasetPrimaryKeyColumns(this.input.dataset) !== null) {\n const primaryKey = encodeDatasetPrimaryKey(this.input.dataset, row)\n if (this.primaryKeys.has(primaryKey) || stagedPrimaryKeys.has(primaryKey)) {\n throw new LakeStorageError(\n `[LakeStorage] Dataset '${this.input.dataset.id}' write contains duplicate primary key ${primaryKey}.`\n )\n }\n stagedPrimaryKeys.add(primaryKey)\n }\n\n stagedRows.push(cloneRow(row))\n }\n\n this.rows.push(...stagedRows)\n for (const primaryKey of stagedPrimaryKeys) {\n this.primaryKeys.add(primaryKey)\n }\n }\n\n async commit(input?: CommitDatasetWriteInput): Promise<DatasetWriteCommitResult> {\n this.assertOpen()\n this.closed = true\n return this.storage.commitWrite({\n write: this.input,\n rows: this.rows,\n commit: input,\n })\n }\n\n async abort(): Promise<void> {\n this.closed = true\n this.rows.length = 0\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new LakeStorageError(\"[LakeStorage] Write session is already closed\")\n }\n }\n}\n\nclass InMemoryLakeMergeSession implements LakeMergeSession {\n private readonly changes: MergeChange<DatasetRow, DatasetRow>[] = []\n private closed = false\n\n constructor(\n private readonly storage: InMemoryLakeStorage,\n private readonly input: BeginDatasetMergeInput,\n private readonly baseVersionId: string | null\n ) {}\n\n async writeChanges(\n changes:\n | Iterable<MergeChange<DatasetRow, DatasetRow>>\n | AsyncIterable<MergeChange<DatasetRow, DatasetRow>>\n ): Promise<void> {\n this.assertOpen()\n\n const stagedChanges: MergeChange<DatasetRow, DatasetRow>[] = []\n for await (const change of changes) {\n const validationError = getDatasetMergeChangeValidationError(change, this.input.dataset)\n if (validationError) {\n throw new LakeStorageError(`[LakeStorage] ${validationError}`)\n }\n stagedChanges.push(cloneDatasetMergeChange(change))\n }\n this.changes.push(...stagedChanges)\n }\n\n async commit(input?: CommitDatasetMergeInput): Promise<DatasetMergeCommitResult> {\n this.assertOpen()\n this.closed = true\n return retryDatasetMergeCommit(this.input, input, async (rebase) =>\n this.storage.commitMerge({\n merge: this.input,\n baseVersionId: rebase\n ? ((await this.storage.getLatestVersion(this.input.dataset.id))?.versionId ?? null)\n : this.baseVersionId,\n changes: this.changes,\n commit: input,\n })\n )\n }\n\n async abort(): Promise<void> {\n this.closed = true\n this.changes.length = 0\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new LakeStorageError(\"[LakeStorage] Merge session is already closed\")\n }\n }\n}\n\nexport class InMemoryLakeStorage implements LakeStorage {\n private readonly datasets = new Map<string, DatasetDefinition>()\n private readonly versionsByDataset = new Map<string, DatasetVersion[]>()\n private readonly rowsByVersionId = new Map<string, readonly DatasetRow[]>()\n private readonly sequencesByVersionId = new Map<string, Map<string, DatasetSequenceState>>()\n private readonly latestVersionIdByDataset = new Map<string, string>()\n private readonly commitLocks = new Map<string, Promise<void>>()\n\n async createDataset(definition: DatasetDefinition): Promise<DatasetDefinition> {\n assertDatasetId(definition.id)\n const existing = this.datasets.get(definition.id)\n const stored = mergeStrictDatasetDefinition({\n existing,\n next: definition,\n })\n this.datasets.set(definition.id, stored)\n return cloneDatasetDefinition(stored)\n }\n\n async assertDatasetDefinitionsCompatible(\n definitions: readonly DatasetDefinition[]\n ): Promise<void> {\n const failures: string[] = []\n\n for (const definition of definitions) {\n try {\n assertDatasetId(definition.id)\n const existing = this.datasets.get(definition.id)\n if (!existing) {\n continue\n }\n\n mergeStrictDatasetDefinition({\n existing,\n next: definition,\n })\n } catch (error) {\n failures.push(`- ${definition.id}: ${errorMessage(error)}`)\n }\n }\n\n if (failures.length > 0) {\n const details = failures.join(\"\\n\")\n throw new LakeStorageError(\n `[SixbLake] Lake dataset definition check failed for ${failures.length} dataset(s).\\n${details}`\n )\n }\n }\n\n async getDataset(datasetId: string): Promise<DatasetDefinition | null> {\n const definition = this.datasets.get(datasetId)\n return definition ? cloneDatasetDefinition(definition) : null\n }\n\n async listDatasets(): Promise<readonly DatasetDefinition[]> {\n return [...this.datasets.values()].map((definition) => cloneDatasetDefinition(definition))\n }\n\n async listDatasetCatalogState(\n datasetIds: readonly string[]\n ): Promise<readonly DatasetCatalogState[]> {\n return Promise.all(\n datasetIds.map(async (datasetId) => {\n if (!this.datasets.has(datasetId)) {\n return { datasetId, materialized: false, latestVersion: null }\n }\n\n const latest = await this.getLatestVersion(datasetId)\n return {\n datasetId,\n materialized: true,\n latestVersion: latest\n ? {\n datasetId: latest.datasetId,\n versionId: latest.versionId,\n mode: latest.mode,\n createdAt: latest.createdAt,\n ...(latest.rowCount !== undefined ? { rowCount: latest.rowCount } : {}),\n }\n : null,\n }\n })\n )\n }\n\n async listVersions(datasetId: string, limit?: number): Promise<readonly DatasetVersion[]> {\n const versions = [...(this.versionsByDataset.get(datasetId) ?? [])]\n .sort((left, right) => right.createdAt.getTime() - left.createdAt.getTime())\n .map((version) => cloneDatasetVersion(version))\n\n return limit === undefined ? versions : versions.slice(0, Math.max(0, limit))\n }\n\n async beginWrite(input: BeginDatasetWriteInput): Promise<LakeWriteSession> {\n const definition = await this.getDataset(input.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${input.dataset.id}'`)\n }\n\n assertUnsequencedDatasetWrite(definition)\n return new InMemoryLakeWriteSession(this, {\n ...input,\n dataset: definition,\n mode: input.mode ?? \"snapshot\",\n })\n }\n\n async beginMerge(input: BeginDatasetMergeInput): Promise<LakeMergeSession> {\n const definition = await this.getDataset(input.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${input.dataset.id}'`)\n }\n if (getDatasetPrimaryKeyColumns(definition) === null) {\n throw new LakeStorageError(\n `[LakeStorage] Dataset '${definition.id}' must define a primaryKey before it can be merged.`\n )\n }\n\n const latestVersion = await this.getLatestVersion(definition.id)\n if (\n input.expectedLatestVersionId !== undefined &&\n latestVersion?.versionId !== input.expectedLatestVersionId\n ) {\n throw new LakeConcurrencyError(\n `[LakeStorage] Optimistic merge start failed for dataset '${definition.id}': expected latest version '${input.expectedLatestVersionId}', found '${latestVersion?.versionId ?? \"none\"}'`\n )\n }\n return new InMemoryLakeMergeSession(\n this,\n {\n ...input,\n dataset: definition,\n },\n latestVersion?.versionId ?? null\n )\n }\n\n async getLatestVersion(datasetId: string): Promise<DatasetVersion | null> {\n const latestVersionId = this.latestVersionIdByDataset.get(datasetId)\n if (!latestVersionId) {\n return null\n }\n\n return this.getVersion(datasetId, latestVersionId)\n }\n\n async getVersion(datasetId: string, versionId: string): Promise<DatasetVersion | null> {\n const versions = this.versionsByDataset.get(datasetId) ?? []\n const version = versions.find((candidate) => candidate.versionId === versionId)\n return version ? cloneDatasetVersion(version) : null\n }\n\n async *readRows(input: ReadDatasetRowsInput): AsyncIterable<DatasetRow> {\n const definition = this.datasets.get(input.datasetId)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${input.datasetId}'`)\n }\n\n const version =\n input.versionId === undefined\n ? await this.getLatestVersion(input.datasetId)\n : await this.getVersion(input.datasetId, input.versionId)\n\n if (!version) {\n throw new LakeStorageError(\n `[LakeStorage] No committed version found for dataset '${input.datasetId}'`\n )\n }\n\n const offset = Math.max(0, input.offset ?? 0)\n const limit = input.limit === undefined ? undefined : Math.max(0, input.limit)\n const rows = this.rowsByVersionId\n .get(version.versionId)\n ?.slice(offset, limit === undefined ? undefined : offset + limit)\n\n for (const row of rows ?? []) {\n yield selectColumns(row, input.columns)\n }\n }\n\n async commitWrite(options: {\n write: BeginDatasetWriteInput\n rows: readonly DatasetRow[]\n commit?: CommitDatasetWriteInput\n }): Promise<DatasetWriteCommitResult> {\n return this.withDatasetCommitLock(options.write.dataset.id, () =>\n this.commitWriteUnlocked(options)\n )\n }\n\n async commitMerge(options: {\n merge: BeginDatasetMergeInput\n baseVersionId: string | null\n changes: readonly MergeChange<DatasetRow, DatasetRow>[]\n commit?: CommitDatasetMergeInput\n }): Promise<DatasetMergeCommitResult> {\n return this.withDatasetCommitLock(options.merge.dataset.id, async () => {\n const definition = this.datasets.get(options.merge.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${options.merge.dataset.id}'`)\n }\n\n const latestVersion = await this.getLatestVersion(options.merge.dataset.id)\n options.commit?.signal?.throwIfAborted()\n const actualVersionId = latestVersion?.versionId ?? null\n if (actualVersionId !== options.baseVersionId) {\n throw new LakeConcurrencyError(\n `[LakeStorage] Optimistic merge commit failed for dataset '${options.merge.dataset.id}': expected latest version '${options.baseVersionId ?? \"none\"}', found '${actualVersionId ?? \"none\"}'`\n )\n }\n\n const previousRows = this.rowsByVersionId.get(latestVersion?.versionId ?? \"\") ?? []\n const previousByKey = this.rowsByPrimaryKey(previousRows, definition)\n const finalChanges = new Map<string, MergeChange<DatasetRow, DatasetRow>>()\n const ordered =\n definition.sequenceBy === undefined\n ? undefined\n : reconcileDatasetSequences(\n definition,\n this.sequencesByVersionId.get(actualVersionId ?? \"\") ?? new Map(),\n options.changes.map((change) => datasetSequenceChange(definition, change))\n )\n if (ordered) {\n for (const [key, index] of ordered.accepted) finalChanges.set(key, options.changes[index]!)\n } else {\n for (const change of options.changes) {\n const value = change.kind === \"upsert\" ? change.row : change.key\n finalChanges.set(encodeDatasetPrimaryKey(definition, value), change)\n }\n }\n\n const nextByKey = new Map(previousByKey)\n for (const [primaryKey, change] of finalChanges) {\n if (change.kind === \"upsert\") {\n nextByKey.set(primaryKey, cloneRow(change.row))\n } else {\n nextByKey.delete(primaryKey)\n }\n }\n\n const createInitialVersion = options.commit?.createInitialVersion && latestVersion === null\n if (\n !createInitialVersion &&\n (ordered\n ? ordered.accepted.size === 0\n : this.sameKeyedRowContent(previousByKey, nextByKey, definition.schema))\n ) {\n return {\n outcome: \"unchanged\",\n version: latestVersion ? cloneDatasetVersion(latestVersion) : null,\n }\n }\n\n const visibleRows = [...nextByKey.values()]\n const versionId = `ver_${randomUUID()}`\n const version: DatasetVersion = {\n datasetId: options.merge.dataset.id,\n versionId,\n parentVersionId: latestVersion?.versionId,\n mode: \"merge\",\n createdAt: new Date(),\n schema: definition.schema,\n producer: options.merge.producer ? structuredClone(options.merge.producer) : undefined,\n inputs: options.merge.inputs ? structuredClone(options.merge.inputs) : undefined,\n rowCount: visibleRows.length,\n sizeBytes: new TextEncoder().encode(\n visibleRows.map((row) => JSON.stringify(row)).join(\"\\n\")\n ).byteLength,\n }\n\n const versions = this.versionsByDataset.get(options.merge.dataset.id) ?? []\n versions.push(version)\n this.versionsByDataset.set(options.merge.dataset.id, versions)\n this.rowsByVersionId.set(\n versionId,\n visibleRows.map((row) => cloneRow(row))\n )\n this.latestVersionIdByDataset.set(options.merge.dataset.id, versionId)\n if (ordered) this.sequencesByVersionId.set(versionId, ordered.states)\n\n return { outcome: \"created\", version: cloneDatasetVersion(version) }\n })\n }\n\n private async commitWriteUnlocked(options: {\n write: BeginDatasetWriteInput\n rows: readonly DatasetRow[]\n commit?: CommitDatasetWriteInput\n }): Promise<DatasetWriteCommitResult> {\n const definition = this.datasets.get(options.write.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${options.write.dataset.id}'`)\n }\n\n const mode = options.write.mode ?? \"snapshot\"\n assertUnsequencedDatasetWrite(definition)\n const latestVersion = await this.getLatestVersion(options.write.dataset.id)\n\n if (options.commit?.expectedLatestVersionId !== undefined) {\n const actual = latestVersion?.versionId ?? null\n if (actual !== options.commit.expectedLatestVersionId) {\n throw new LakeConcurrencyError(\n `[LakeStorage] Optimistic commit failed for dataset '${options.write.dataset.id}': expected latest version '${options.commit.expectedLatestVersionId ?? \"none\"}', found '${actual ?? \"none\"}'`\n )\n }\n }\n\n this.assertKeyedWriteIsUnique(mode, options.rows, latestVersion, definition)\n\n // Content-identical snapshots and empty appends reuse the latest version\n // unless explicitly supplied input lineage has changed.\n if (\n latestVersion &&\n !hasDatasetInputChanges(latestVersion.inputs, options.write.inputs) &&\n this.isUnchangedWrite(mode, latestVersion, options.rows, definition.schema)\n ) {\n return { ...latestVersion, outcome: \"unchanged\" }\n }\n\n const versionId = `ver_${randomUUID()}`\n const visibleRows =\n mode === \"append\"\n ? [...(this.rowsByVersionId.get(latestVersion?.versionId ?? \"\") ?? []), ...options.rows]\n : [...options.rows]\n\n const sizeBytes = new TextEncoder().encode(\n visibleRows.map((row) => JSON.stringify(row)).join(\"\\n\")\n ).byteLength\n\n const version: DatasetVersion = {\n datasetId: options.write.dataset.id,\n versionId,\n parentVersionId: mode === \"append\" ? latestVersion?.versionId : undefined,\n mode,\n createdAt: new Date(),\n schema: definition.schema,\n producer: options.write.producer ? structuredClone(options.write.producer) : undefined,\n inputs: options.write.inputs ? structuredClone(options.write.inputs) : undefined,\n rowCount: visibleRows.length,\n sizeBytes,\n }\n\n const versions = this.versionsByDataset.get(options.write.dataset.id) ?? []\n versions.push(version)\n this.versionsByDataset.set(options.write.dataset.id, versions)\n this.rowsByVersionId.set(\n versionId,\n visibleRows.map((row) => cloneRow(row))\n )\n this.latestVersionIdByDataset.set(options.write.dataset.id, versionId)\n\n return { ...cloneDatasetVersion(version), outcome: \"created\" }\n }\n\n private isUnchangedWrite(\n mode: DatasetWriteMode,\n latestVersion: DatasetVersion,\n rows: readonly DatasetRow[],\n schema: DatasetSchema\n ): boolean {\n if (mode === \"append\") {\n return rows.length === 0\n }\n\n const previousRows = this.rowsByVersionId.get(latestVersion.versionId) ?? []\n return sameRowContent(\n rows.map((row) => rowContentKey(row, schema)),\n previousRows.map((row) => rowContentKey(row, schema))\n )\n }\n\n private assertKeyedWriteIsUnique(\n mode: DatasetWriteMode,\n rows: readonly DatasetRow[],\n latestVersion: DatasetVersion | null,\n definition: DatasetDefinition\n ): void {\n if (getDatasetPrimaryKeyColumns(definition) === null) {\n return\n }\n\n const stagedByKey = this.rowsByPrimaryKey(rows, definition)\n if (mode !== \"append\" || latestVersion === null) {\n return\n }\n\n const previousRows = this.rowsByVersionId.get(latestVersion.versionId) ?? []\n const previousByKey = this.rowsByPrimaryKey(previousRows, definition)\n for (const primaryKey of stagedByKey.keys()) {\n if (previousByKey.has(primaryKey)) {\n throw new LakeStorageError(\n `[LakeStorage] Dataset '${definition.id}' append contains duplicate primary key ${primaryKey}.`\n )\n }\n }\n }\n\n private rowsByPrimaryKey(\n rows: readonly DatasetRow[],\n definition: DatasetDefinition\n ): Map<string, DatasetRow> {\n const byKey = new Map<string, DatasetRow>()\n for (const row of rows) {\n const primaryKey = encodeDatasetPrimaryKey(definition, row)\n if (byKey.has(primaryKey)) {\n throw new LakeStorageError(\n `[LakeStorage] Dataset '${definition.id}' contains duplicate primary key ${primaryKey}.`\n )\n }\n byKey.set(primaryKey, row)\n }\n return byKey\n }\n\n private sameKeyedRowContent(\n left: ReadonlyMap<string, DatasetRow>,\n right: ReadonlyMap<string, DatasetRow>,\n schema: DatasetSchema\n ): boolean {\n if (left.size !== right.size) {\n return false\n }\n for (const [primaryKey, leftRow] of left) {\n const rightRow = right.get(primaryKey)\n if (\n rightRow === undefined ||\n rowContentKey(leftRow, schema) !== rowContentKey(rightRow, schema)\n ) {\n return false\n }\n }\n return true\n }\n\n private async withDatasetCommitLock<T>(datasetId: string, run: () => Promise<T>): Promise<T> {\n const previous = this.commitLocks.get(datasetId) ?? Promise.resolve()\n const ready = previous.catch(() => {})\n let release!: () => void\n const next = new Promise<void>((resolve) => {\n release = resolve\n })\n const current = ready.then(() => next)\n this.commitLocks.set(datasetId, current)\n\n await ready\n try {\n return await run()\n } finally {\n release()\n if (this.commitLocks.get(datasetId) === current) {\n this.commitLocks.delete(datasetId)\n }\n }\n }\n}\n",
7
- "import type { DatasetDefinition, MergeChange } from \"../datasets\"\nimport { LakeConcurrencyError } from \"./errors\"\nimport type { DatasetProducer, DatasetRow, DatasetVersion, DatasetVersionRef } from \"./types\"\n\nexport interface BeginDatasetMergeInput {\n /** Stored definition for the keyed dataset whose latest version is captured by `beginMerge`. */\n readonly dataset: DatasetDefinition\n /** Optional caller guard checked against the same latest version captured by the session. */\n readonly expectedLatestVersionId?: string\n readonly producer?: DatasetProducer\n readonly inputs?: readonly DatasetVersionRef[]\n}\n\nexport interface CommitDatasetMergeInput {\n readonly commitMessage?: string\n /** Create an addressable first version even without changes; reuse an existing version on no-op. */\n readonly createInitialVersion?: boolean\n /** Retry sequenced merges up to three times total; ignored when an explicit version guard is set. */\n readonly retryOnConflict?: boolean\n /** Checked before each attempt; a durable commit is never cancelled retroactively. */\n readonly signal?: AbortSignal\n}\n\n/** Providers retain their staging session throughout this bounded commit loop. */\nexport async function retryDatasetMergeCommit(\n merge: BeginDatasetMergeInput,\n commit: CommitDatasetMergeInput | undefined,\n run: (rebase: boolean) => Promise<DatasetMergeCommitResult>\n): Promise<DatasetMergeCommitResult> {\n const attempts =\n commit?.retryOnConflict &&\n merge.dataset.sequenceBy !== undefined &&\n merge.expectedLatestVersionId === undefined\n ? 3\n : 1\n for (let attempt = 0; ; attempt += 1) {\n commit?.signal?.throwIfAborted()\n try {\n return await run(attempt > 0)\n } catch (error) {\n if (!(error instanceof LakeConcurrencyError) || attempts === 1) throw error\n if (attempt + 1 === attempts) {\n throw new LakeConcurrencyError(\n `[SixbLake] Dataset '${merge.dataset.id}' merge exhausted ${attempts} concurrency attempts. No changes from this operation were committed.`,\n { cause: error }\n )\n }\n }\n }\n}\n\n/**\n * A merge can be unchanged before the dataset has a first version, so its result carries the\n * version separately instead of extending `DatasetVersion` like ordinary write commits do.\n */\nexport type DatasetMergeCommitResult =\n | { readonly outcome: \"created\"; readonly version: DatasetVersion }\n | { readonly outcome: \"unchanged\"; readonly version: DatasetVersion | null }\n\nexport interface LakeMergeSession {\n /**\n * Stage ordered complete-row upserts and exact primary-key deletes. With sequenceBy, deletes\n * require a sequence, stale changes are ignored, and conflicting ties abort the whole merge.\n */\n writeChanges(\n changes:\n | Iterable<MergeChange<DatasetRow, DatasetRow>>\n | AsyncIterable<MergeChange<DatasetRow, DatasetRow>>\n ): Promise<void>\n /** Commit against the captured version; opt-in retries rebase sequenced changes on a fresh head. */\n commit(input?: CommitDatasetMergeInput): Promise<DatasetMergeCommitResult>\n abort(): Promise<void>\n}\n",
8
- "import { createHash } from \"node:crypto\"\nimport type { DatasetDefinition, MergeChange } from \"../datasets\"\nimport { datasetSequenceValue } from \"../datasets/sequence\"\nimport { stableJsonStringify } from \"../json\"\nimport { normalizeDecimalValue } from \"../ontology/decimal\"\nimport { LakeStorageError } from \"./errors\"\nimport { encodeDatasetPrimaryKey } from \"./merge-validation\"\nimport type { DatasetRow } from \"./types\"\n\n/** Current source revision; a null content digest is a deletion tombstone. */\nexport interface DatasetSequenceState {\n readonly sequence: string\n readonly content: string | null\n}\n\nexport interface DatasetSequenceChange extends DatasetSequenceState {\n readonly key: string\n}\n\nexport function datasetSequenceChange(\n dataset: DatasetDefinition,\n change: MergeChange<DatasetRow, DatasetRow>\n): DatasetSequenceChange {\n const value = change.kind === \"upsert\" ? change.row[dataset.sequenceBy ?? \"\"] : change.sequence\n return {\n key: encodeDatasetPrimaryKey(dataset, change.kind === \"upsert\" ? change.row : change.key),\n sequence: datasetSequenceValue(dataset, value).toString(),\n content: change.kind === \"delete\" ? null : rowDigest(dataset, change.row),\n }\n}\n\n/** Process in submission order against a private copy; conflicts publish no partial state. */\nexport function reconcileDatasetSequences(\n dataset: DatasetDefinition,\n previous: ReadonlyMap<string, DatasetSequenceState>,\n changes: readonly DatasetSequenceChange[]\n): { states: Map<string, DatasetSequenceState>; accepted: Map<string, number> } {\n const states = new Map(previous)\n const accepted = new Map<string, number>()\n for (const [index, change] of changes.entries()) {\n const current = states.get(change.key)\n if (current) {\n const difference = BigInt(change.sequence) - BigInt(current.sequence)\n if (difference < 0n) continue\n if (difference === 0n) {\n if (current.content !== change.content) {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${dataset.id}' has conflicting content at source sequence '${change.sequence}' for key ${change.key}.`\n )\n }\n continue\n }\n }\n states.set(change.key, { sequence: change.sequence, content: change.content })\n accepted.set(change.key, index)\n }\n return { states, accepted }\n}\n\nfunction rowDigest(dataset: DatasetDefinition, row: DatasetRow): string {\n const content: Record<string, unknown> = Object.create(null)\n for (const column of dataset.schema.columns) {\n const value = row[column.name]\n // Nullable additions and omitted/undefined/null values have identical content.\n if (value == null) continue\n switch (column.type) {\n case \"int64\":\n content[column.name] = BigInt(value as string | number).toString()\n break\n case \"timestamp\":\n content[column.name] = new Date(value as string | Date).toISOString()\n break\n case \"date\":\n content[column.name] = new Date(value as string | Date).toISOString().slice(0, 10)\n break\n case \"decimal\":\n content[column.name] = normalizeDecimalValue(value as string)\n break\n default:\n content[column.name] = value\n }\n }\n return createHash(\"sha256\")\n .update(stableJsonStringify(JSON.parse(JSON.stringify(content))))\n .digest(\"hex\")\n}\n\n/** Until row reconciliation is supported, replacement writes must not erase source history. */\nexport function assertUnsequencedDatasetWrite(dataset: DatasetDefinition): void {\n if (dataset.sequenceBy !== undefined) {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${dataset.id}' declares sequenceBy; use beginMerge with source-ordered changes.`\n )\n }\n}\n",
9
- "import type { DatasetVersionRef } from \"./types\"\n\n/** Input lineage participates in write identity when the caller supplies it. */\nexport function hasDatasetInputChanges(\n previous: readonly DatasetVersionRef[] | undefined,\n next: readonly DatasetVersionRef[] | undefined\n): boolean {\n if (next === undefined) return false\n const keys = (refs: readonly DatasetVersionRef[]) =>\n new Set(refs.map((ref) => JSON.stringify([ref.datasetId, ref.versionId])))\n const before = keys(previous ?? [])\n const after = keys(next)\n return before.size !== after.size || [...after].some((key) => !before.has(key))\n}\n"
10
- ],
11
- "mappings": "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",
12
- "debugId": "27F2E83DF00F5AF164756E2164756E21",
13
- "names": []
14
- }
@@ -1,11 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/queues/errors.ts", "../src/queues/in-memory.ts"],
4
- "sourcesContent": [
5
- "/**\n * Error for queue invariants and invalid queue operations.\n */\nexport class QueueError extends Error {\n readonly name = \"QueueError\"\n}\n",
6
- "import { randomUUID } from \"node:crypto\"\nimport type { SixbErrorCode } from \"../errors/types\"\nimport { QueueError } from \"./errors\"\nimport type {\n ActionQueueJobFailureCode,\n ActionRunRequestedQueueJob,\n AgentQueueJob,\n AgentQueueJobFailureCode,\n ClaimedQueueJob,\n NewQueueJob,\n PipelineQueueJobFailureCode,\n PipelineRunRequestedQueueJob,\n ProjectionQueueJobFailureCode,\n ProjectionRunRequestedQueueJob,\n Queue,\n QueueJob,\n QueueJobFailure,\n Queues,\n SubagentQueueJob,\n SyncQueueJobFailureCode,\n SyncRunRequestedQueueJob,\n WorkflowQueueJob,\n WorkflowQueueJobFailureCode,\n} from \"./types\"\n\ntype QueueRecordState = \"queued\" | \"completed\" | \"failed\"\n\ninterface QueueRecord<TQueueJob extends QueueJob = QueueJob> {\n readonly sequence: number\n readonly queueId: string\n job: TQueueJob\n // A leased job stays \"queued\" until a worker completes or fails it.\n state: QueueRecordState\n failure: QueueJobFailure | null\n leaseId: string | null\n claimedAt: string | null\n leaseExpiresAt: string | null\n}\n\nfunction assertNonEmpty(value: string, fieldName: string): void {\n if (value.trim().length === 0) {\n throw new QueueError(`[Sixb] Queue ${fieldName} must not be empty`)\n }\n}\n\nfunction parseTimestamp(value: string, fieldName: string): number {\n const timestamp = Date.parse(value)\n\n if (Number.isNaN(timestamp)) {\n throw new QueueError(`[Sixb] Queue ${fieldName} must be a valid timestamp`)\n }\n\n return timestamp\n}\n\nfunction assertPositiveNumber(value: number, fieldName: string): void {\n if (!Number.isFinite(value) || value <= 0) {\n throw new QueueError(`[Sixb] Queue ${fieldName} must be greater than 0`)\n }\n}\n\nfunction clearLease(record: QueueRecord): void {\n record.leaseId = null\n record.claimedAt = null\n record.leaseExpiresAt = null\n}\n\n// Best-effort ordering is part of the contract; this keeps the in-memory provider deterministic.\nfunction compareQueueRecords(left: QueueRecord, right: QueueRecord): number {\n const availableDifference =\n parseTimestamp(left.job.availableAt, \"job.availableAt\") -\n parseTimestamp(right.job.availableAt, \"job.availableAt\")\n\n if (availableDifference !== 0) {\n return availableDifference\n }\n\n const createdDifference =\n parseTimestamp(left.job.createdAt, \"job.createdAt\") -\n parseTimestamp(right.job.createdAt, \"job.createdAt\")\n\n if (createdDifference !== 0) {\n return createdDifference\n }\n\n return left.sequence - right.sequence\n}\n\nfunction createQueueJob<TQueueJob extends QueueJob>(\n projectId: string,\n newJob: NewQueueJob<TQueueJob>\n): TQueueJob {\n const createdAt = new Date().toISOString()\n const availableAt = newJob.availableAt ?? createdAt\n parseTimestamp(availableAt, \"availableAt\")\n\n return {\n id: newJob.id ?? randomUUID(),\n projectId,\n createdAt,\n availableAt,\n attempt: 0,\n metadata: newJob.metadata ? structuredClone(newJob.metadata) : undefined,\n type: newJob.type,\n payload: structuredClone(newJob.payload),\n } as TQueueJob\n}\n\nfunction leaseExpiresAtMs(record: QueueRecord): number | null {\n if (!record.leaseId || !record.leaseExpiresAt) {\n return null\n }\n\n return parseTimestamp(record.leaseExpiresAt, \"leaseExpiresAt\")\n}\n\nfunction toClaimedQueueJob<TQueueJob extends QueueJob>(\n record: QueueRecord<TQueueJob>\n): ClaimedQueueJob<TQueueJob> {\n if (!record.leaseId || !record.claimedAt || !record.leaseExpiresAt) {\n throw new QueueError(`[Sixb] Queue job '${record.job.id}' is not currently leased`)\n }\n\n return {\n leaseId: record.leaseId,\n claimedAt: record.claimedAt,\n leaseExpiresAt: record.leaseExpiresAt,\n job: structuredClone(record.job),\n }\n}\n\nclass InMemoryQueueStore {\n private readonly recordsByProject = new Map<string, QueueRecord[]>()\n private nextSequence = 1\n\n add<TQueueJob extends QueueJob>(projectId: string, queueId: string, job: TQueueJob): void {\n const records = this.getOrCreateRecords(projectId)\n records.push({\n sequence: this.nextSequence,\n queueId,\n job,\n state: \"queued\",\n failure: null,\n leaseId: null,\n claimedAt: null,\n leaseExpiresAt: null,\n })\n this.nextSequence += 1\n }\n\n list<TQueueJob extends QueueJob>(projectId: string, queueId: string): QueueRecord<TQueueJob>[] {\n const records = this.recordsByProject.get(projectId) ?? []\n return records.filter((record) => record.queueId === queueId) as QueueRecord<TQueueJob>[]\n }\n\n find<TQueueJob extends QueueJob>(\n projectId: string,\n queueId: string,\n jobId: string\n ): QueueRecord<TQueueJob> | null {\n return (\n this.list<TQueueJob>(projectId, queueId).find((record) => record.job.id === jobId) ?? null\n )\n }\n\n private getOrCreateRecords(projectId: string): QueueRecord[] {\n const existing = this.recordsByProject.get(projectId)\n if (existing) {\n return existing\n }\n\n const records: QueueRecord[] = []\n this.recordsByProject.set(projectId, records)\n return records\n }\n}\n\nclass InMemoryQueue<TQueueJob extends QueueJob, TFailureCode extends SixbErrorCode>\n implements Queue<TQueueJob, TFailureCode>\n{\n constructor(\n private readonly store: InMemoryQueueStore,\n private readonly queueId: string\n ) {\n assertNonEmpty(queueId, \"queueId\")\n }\n\n async enqueue(params: {\n projectId: string\n jobs: readonly NewQueueJob<TQueueJob>[]\n }): Promise<readonly TQueueJob[]> {\n assertNonEmpty(params.projectId, \"projectId\")\n\n if (params.jobs.length === 0) {\n return []\n }\n\n const createdJobs = params.jobs.map((job) => {\n if (job.id !== undefined) assertNonEmpty(job.id, \"job.id\")\n const existing = job.id\n ? this.store.find<TQueueJob>(params.projectId, this.queueId, job.id)\n : null\n if (existing) return existing.job\n\n const created = createQueueJob(params.projectId, job)\n this.store.add(params.projectId, this.queueId, created)\n return created\n })\n\n return createdJobs.map((job) => structuredClone(job))\n }\n\n async claim(params: {\n projectId: string\n workerId: string\n limit?: number\n leaseMs?: number\n }): Promise<readonly ClaimedQueueJob<TQueueJob>[]> {\n assertNonEmpty(params.projectId, \"projectId\")\n assertNonEmpty(params.workerId, \"workerId\")\n\n const limit = params.limit ?? 1\n if (limit <= 0) {\n return []\n }\n\n const leaseMs = params.leaseMs ?? 30_000\n assertPositiveNumber(leaseMs, \"leaseMs\")\n\n const now = Date.now()\n const claimable = this.store\n .list<TQueueJob>(params.projectId, this.queueId)\n .filter((record) => {\n if (record.state !== \"queued\") {\n return false\n }\n\n if (parseTimestamp(record.job.availableAt, \"job.availableAt\") > now) {\n return false\n }\n\n const expiresAt = leaseExpiresAtMs(record)\n return expiresAt === null || expiresAt <= now\n })\n .sort(compareQueueRecords)\n .slice(0, limit)\n\n const claimedAt = new Date(now).toISOString()\n\n return claimable.map((record) => {\n // Attempts count claims so redelivery after lease expiry or retry is visible to workers.\n record.job = {\n ...record.job,\n attempt: record.job.attempt + 1,\n }\n record.leaseId = randomUUID()\n record.claimedAt = claimedAt\n record.leaseExpiresAt = new Date(now + leaseMs).toISOString()\n\n return toClaimedQueueJob(record)\n })\n }\n\n async complete(params: { projectId: string; jobId: string; leaseId: string }): Promise<void> {\n const record = this.requireActiveLease(params)\n record.state = \"completed\"\n clearLease(record)\n }\n\n async retry(params: {\n projectId: string\n jobId: string\n leaseId: string\n availableAt?: string\n }): Promise<void> {\n const record = this.requireActiveLease(params)\n const availableAt = params.availableAt ?? new Date().toISOString()\n parseTimestamp(availableAt, \"availableAt\")\n\n record.job = {\n ...record.job,\n availableAt,\n }\n clearLease(record)\n }\n\n async fail(params: {\n projectId: string\n jobId: string\n leaseId: string\n failure: QueueJobFailure<TFailureCode>\n }): Promise<void> {\n const record = this.requireActiveLease(params)\n record.state = \"failed\"\n record.failure = structuredClone(params.failure)\n clearLease(record)\n }\n\n async renewLease(params: {\n projectId: string\n jobId: string\n leaseId: string\n leaseMs: number\n }): Promise<ClaimedQueueJob<TQueueJob> | null> {\n assertPositiveNumber(params.leaseMs, \"leaseMs\")\n\n const record = this.store.find<TQueueJob>(params.projectId, this.queueId, params.jobId)\n if (!record || record.state !== \"queued\") {\n return null\n }\n\n const now = Date.now()\n const expiresAt = leaseExpiresAtMs(record)\n if (record.leaseId !== params.leaseId || expiresAt === null) {\n return null\n }\n\n if (expiresAt <= now) {\n return null\n }\n\n record.leaseExpiresAt = new Date(now + params.leaseMs).toISOString()\n return toClaimedQueueJob(record)\n }\n\n private requireActiveLease(params: {\n projectId: string\n jobId: string\n leaseId: string\n }): QueueRecord<TQueueJob> {\n assertNonEmpty(params.projectId, \"projectId\")\n assertNonEmpty(params.jobId, \"jobId\")\n assertNonEmpty(params.leaseId, \"leaseId\")\n\n const record = this.store.find<TQueueJob>(params.projectId, this.queueId, params.jobId)\n\n if (!record) {\n throw new QueueError(`[Sixb] Unknown queue job '${params.jobId}'`)\n }\n\n if (record.state !== \"queued\") {\n throw new QueueError(`[Sixb] Queue job '${params.jobId}' is no longer active`)\n }\n\n if (record.leaseId !== params.leaseId || !record.leaseExpiresAt) {\n throw new QueueError(`[Sixb] Lease mismatch for queue job '${params.jobId}'`)\n }\n\n const expiresAt = leaseExpiresAtMs(record)\n if (expiresAt === null || expiresAt <= Date.now()) {\n throw new QueueError(`[Sixb] Lease for queue job '${params.jobId}' has expired`)\n }\n\n return record\n }\n}\n\nexport class InMemoryQueues implements Queues {\n readonly scope = \"process\" as const\n private readonly store = new InMemoryQueueStore()\n\n readonly syncRuns = new InMemoryQueue<SyncRunRequestedQueueJob, SyncQueueJobFailureCode>(\n this.store,\n \"sync.runs\"\n )\n readonly pipelines = new InMemoryQueue<PipelineRunRequestedQueueJob, PipelineQueueJobFailureCode>(\n this.store,\n \"pipeline.runs\"\n )\n readonly projections = new InMemoryQueue<\n ProjectionRunRequestedQueueJob,\n ProjectionQueueJobFailureCode\n >(this.store, \"projection.runs\")\n readonly workflows = new InMemoryQueue<WorkflowQueueJob, WorkflowQueueJobFailureCode>(\n this.store,\n \"workflow.runs\"\n )\n readonly actions = new InMemoryQueue<ActionRunRequestedQueueJob, ActionQueueJobFailureCode>(\n this.store,\n \"action.runs\"\n )\n readonly agents = new InMemoryQueue<AgentQueueJob, AgentQueueJobFailureCode>(\n this.store,\n \"agent.runs\"\n )\n readonly agentChildren = new InMemoryQueue<SubagentQueueJob, AgentQueueJobFailureCode>(\n this.store,\n \"agent.children\"\n )\n\n /** Nothing to reach: the store is a field of this object. */\n health(): Promise<void> {\n return Promise.resolve()\n }\n}\n"
7
- ],
8
- "mappings": "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",
9
- "debugId": "B9065A72B8FE84D764756E2164756E21",
10
- "names": []
11
- }