@hot-updater/server 1.0.0-rc.14 → 1.0.0-rc.16

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 (514) hide show
  1. package/dist/adapters/drizzle.cjs +35 -74
  2. package/dist/adapters/drizzle.d.cts +13 -5
  3. package/dist/adapters/drizzle.d.mts +13 -5
  4. package/dist/adapters/drizzle.mjs +34 -75
  5. package/dist/adapters/drizzleExecutor.cjs +114 -0
  6. package/dist/adapters/drizzleExecutor.d.cts +9 -0
  7. package/dist/adapters/drizzleExecutor.d.mts +9 -0
  8. package/dist/adapters/drizzleExecutor.mjs +112 -0
  9. package/dist/adapters/kysely.cjs +25 -31
  10. package/dist/adapters/kysely.d.cts +10 -6
  11. package/dist/adapters/kysely.d.mts +10 -6
  12. package/dist/adapters/kysely.mjs +25 -32
  13. package/dist/adapters/kyselyExecutor.cjs +32 -0
  14. package/dist/adapters/kyselyExecutor.d.cts +12 -0
  15. package/dist/adapters/kyselyExecutor.d.mts +12 -0
  16. package/dist/adapters/kyselyExecutor.mjs +32 -0
  17. package/dist/adapters/mongodb.cjs +28 -62
  18. package/dist/adapters/mongodb.d.cts +10 -5
  19. package/dist/adapters/mongodb.d.mts +10 -5
  20. package/dist/adapters/mongodb.mjs +28 -63
  21. package/dist/adapters/mongodbAdapter.cjs +174 -0
  22. package/dist/adapters/mongodbAdapter.d.cts +9 -0
  23. package/dist/adapters/mongodbAdapter.d.mts +9 -0
  24. package/dist/adapters/mongodbAdapter.mjs +173 -0
  25. package/dist/adapters/prisma.cjs +38 -257
  26. package/dist/adapters/prisma.d.cts +12 -7
  27. package/dist/adapters/prisma.d.mts +12 -7
  28. package/dist/adapters/prisma.mjs +38 -257
  29. package/dist/adapters/prismaExecutor.cjs +64 -0
  30. package/dist/adapters/prismaExecutor.mjs +64 -0
  31. package/dist/adapters/sqlProviders.cjs +9 -0
  32. package/dist/adapters/sqlProviders.mjs +9 -0
  33. package/dist/apiKeys.cjs +2 -6
  34. package/dist/apiKeys.d.cts +1 -23
  35. package/dist/apiKeys.d.mts +1 -23
  36. package/dist/apiKeys.mjs +2 -6
  37. package/dist/assembly/assemblePlugins.cjs +147 -0
  38. package/dist/assembly/assemblePlugins.d.cts +12 -0
  39. package/dist/assembly/assemblePlugins.d.mts +12 -0
  40. package/dist/assembly/assemblePlugins.mjs +146 -0
  41. package/dist/assembly/databasePlugins.cjs +23 -0
  42. package/dist/assembly/databasePlugins.d.cts +43 -0
  43. package/dist/assembly/databasePlugins.d.mts +43 -0
  44. package/dist/assembly/databasePlugins.mjs +22 -0
  45. package/dist/core/api.cjs +91 -0
  46. package/dist/core/api.d.cts +65 -0
  47. package/dist/core/api.d.mts +65 -0
  48. package/dist/core/api.mjs +87 -0
  49. package/dist/core/baseCandidates.cjs +71 -0
  50. package/dist/core/baseCandidates.d.cts +17 -0
  51. package/dist/core/baseCandidates.d.mts +17 -0
  52. package/dist/core/baseCandidates.mjs +69 -0
  53. package/dist/core/operations.cjs +350 -0
  54. package/dist/core/operations.mjs +350 -0
  55. package/dist/core/reads.cjs +273 -0
  56. package/dist/core/reads.d.cts +48 -0
  57. package/dist/core/reads.d.mts +48 -0
  58. package/dist/core/reads.mjs +267 -0
  59. package/dist/core/releases.cjs +193 -0
  60. package/dist/core/releases.mjs +190 -0
  61. package/dist/core/schema.cjs +279 -0
  62. package/dist/core/schema.d.cts +307 -0
  63. package/dist/core/schema.d.mts +307 -0
  64. package/dist/core/schema.mjs +277 -0
  65. package/dist/core/writes.cjs +96 -0
  66. package/dist/core/writes.mjs +91 -0
  67. package/dist/createHotUpdaterCore.cjs +58 -75
  68. package/dist/createHotUpdaterCore.d.cts +52 -44
  69. package/dist/createHotUpdaterCore.d.mts +52 -44
  70. package/dist/createHotUpdaterCore.mjs +59 -75
  71. package/dist/database/cursor.cjs +44 -0
  72. package/dist/database/cursor.d.cts +7 -0
  73. package/dist/database/cursor.d.mts +7 -0
  74. package/dist/database/cursor.mjs +40 -0
  75. package/dist/database/database.cjs +44 -0
  76. package/dist/database/database.d.cts +123 -0
  77. package/dist/database/database.d.mts +123 -0
  78. package/dist/database/database.mjs +44 -0
  79. package/dist/database/definitions.d.cts +68 -0
  80. package/dist/database/definitions.d.mts +68 -0
  81. package/dist/database/engine.cjs +37 -0
  82. package/dist/database/engine.d.cts +40 -0
  83. package/dist/database/engine.d.mts +40 -0
  84. package/dist/database/engine.mjs +37 -0
  85. package/dist/database/engineAggregates.cjs +115 -0
  86. package/dist/database/engineAggregates.mjs +112 -0
  87. package/dist/database/engineReads.cjs +180 -0
  88. package/dist/database/engineReads.d.cts +35 -0
  89. package/dist/database/engineReads.d.mts +35 -0
  90. package/dist/database/engineReads.mjs +179 -0
  91. package/dist/database/engineTransaction.cjs +403 -0
  92. package/dist/database/engineTransaction.d.cts +26 -0
  93. package/dist/database/engineTransaction.d.mts +26 -0
  94. package/dist/database/engineTransaction.mjs +402 -0
  95. package/dist/database/errors.cjs +27 -0
  96. package/dist/database/errors.d.cts +21 -0
  97. package/dist/database/errors.d.mts +21 -0
  98. package/dist/database/errors.mjs +24 -0
  99. package/dist/database/fence.cjs +124 -0
  100. package/dist/database/fence.d.cts +42 -0
  101. package/dist/database/fence.d.mts +42 -0
  102. package/dist/database/fence.mjs +116 -0
  103. package/dist/database/index.cjs +127 -0
  104. package/dist/database/index.d.cts +17 -0
  105. package/dist/database/index.d.mts +17 -0
  106. package/dist/database/index.mjs +15 -0
  107. package/dist/database/kv/kvAdapter.cjs +273 -0
  108. package/dist/database/kv/kvAdapter.d.cts +101 -0
  109. package/dist/database/kv/kvAdapter.d.mts +101 -0
  110. package/dist/database/kv/kvAdapter.mjs +272 -0
  111. package/dist/database/resolveSchema.cjs +196 -0
  112. package/dist/database/resolveSchema.d.cts +42 -0
  113. package/dist/database/resolveSchema.d.mts +42 -0
  114. package/dist/database/resolveSchema.mjs +193 -0
  115. package/dist/database/schema.cjs +21 -0
  116. package/dist/database/schema.d.cts +61 -0
  117. package/dist/database/schema.d.mts +61 -0
  118. package/dist/database/schema.mjs +20 -0
  119. package/dist/database/sql/sqlAdapter.cjs +282 -0
  120. package/dist/database/sql/sqlAdapter.d.cts +46 -0
  121. package/dist/database/sql/sqlAdapter.d.mts +46 -0
  122. package/dist/database/sql/sqlAdapter.mjs +279 -0
  123. package/dist/database/sql/sqlSchema.cjs +115 -0
  124. package/dist/database/sql/sqlSchema.d.cts +8 -0
  125. package/dist/database/sql/sqlSchema.d.mts +8 -0
  126. package/dist/database/sql/sqlSchema.mjs +111 -0
  127. package/dist/db/builtInDatabase.cjs +104 -0
  128. package/dist/db/builtInDatabase.d.cts +38 -0
  129. package/dist/db/builtInDatabase.d.mts +38 -0
  130. package/dist/db/builtInDatabase.mjs +97 -0
  131. package/dist/db/createBundleDiff.cjs +4 -4
  132. package/dist/db/createBundleDiff.d.cts +3 -2
  133. package/dist/db/createBundleDiff.d.mts +3 -2
  134. package/dist/db/createBundleDiff.mjs +5 -5
  135. package/dist/db/engineDrizzleSchema.cjs +54 -0
  136. package/dist/db/engineDrizzleSchema.mjs +54 -0
  137. package/dist/db/engineMigrator.cjs +53 -0
  138. package/dist/db/engineMigrator.mjs +53 -0
  139. package/dist/db/enginePrismaSchema.cjs +85 -0
  140. package/dist/db/enginePrismaSchema.d.cts +5 -0
  141. package/dist/db/enginePrismaSchema.d.mts +5 -0
  142. package/dist/db/enginePrismaSchema.mjs +84 -0
  143. package/dist/db/engineSql.cjs +26 -0
  144. package/dist/db/engineSql.d.cts +17 -0
  145. package/dist/db/engineSql.d.mts +17 -0
  146. package/dist/db/engineSql.mjs +25 -0
  147. package/dist/db/engineSqlMigrator.cjs +66 -0
  148. package/dist/db/engineSqlMigrator.mjs +66 -0
  149. package/dist/db/fixedMigratorShared.cjs +0 -11
  150. package/dist/db/fixedMigratorShared.mjs +1 -8
  151. package/dist/db/index.cjs +23 -8
  152. package/dist/db/index.d.cts +10 -3
  153. package/dist/db/index.d.mts +10 -3
  154. package/dist/db/index.mjs +16 -8
  155. package/dist/db/releaseCatalog.cjs +20 -43
  156. package/dist/db/releaseCatalog.d.cts +2 -2
  157. package/dist/db/releaseCatalog.d.mts +2 -2
  158. package/dist/db/releaseCatalog.mjs +20 -44
  159. package/dist/db/schemaSettings.cjs +63 -0
  160. package/dist/db/schemaSettings.d.cts +12 -0
  161. package/dist/db/schemaSettings.d.mts +12 -0
  162. package/dist/db/schemaSettings.mjs +62 -0
  163. package/dist/db/settingsMigrator.cjs +92 -0
  164. package/dist/db/settingsMigrator.mjs +89 -0
  165. package/dist/db/types.cjs +1 -12
  166. package/dist/db/types.d.cts +26 -66
  167. package/dist/db/types.d.mts +26 -66
  168. package/dist/db/types.mjs +2 -11
  169. package/dist/db/updateArtifacts.cjs +38 -67
  170. package/dist/db/updateArtifacts.mjs +40 -69
  171. package/dist/handler.cjs +72 -43
  172. package/dist/handler.d.cts +3 -5
  173. package/dist/handler.d.mts +3 -5
  174. package/dist/handler.mjs +73 -43
  175. package/dist/handlerAdminRoutes.cjs +375 -0
  176. package/dist/handlerAdminRoutes.mjs +373 -0
  177. package/dist/handlerParameters.cjs +6 -11
  178. package/dist/handlerParameters.mjs +6 -10
  179. package/dist/handlerReleaseCatalogRoutes.cjs +11 -13
  180. package/dist/handlerReleaseCatalogRoutes.mjs +11 -13
  181. package/dist/handlerTypes.d.cts +2 -55
  182. package/dist/handlerTypes.d.mts +2 -55
  183. package/dist/handlerVersionRoutes.cjs +20 -4
  184. package/dist/handlerVersionRoutes.mjs +20 -4
  185. package/dist/index.cjs +4 -7
  186. package/dist/index.d.cts +8 -7
  187. package/dist/index.d.mts +8 -7
  188. package/dist/index.mjs +4 -4
  189. package/dist/insights/domain.d.cts +12 -0
  190. package/dist/insights/domain.d.mts +12 -0
  191. package/dist/insights/errors.cjs +34 -0
  192. package/dist/insights/errors.mjs +34 -1
  193. package/dist/insights/eventInput.cjs +14 -19
  194. package/dist/insights/eventInput.mjs +15 -20
  195. package/dist/insights/provider.cjs +47 -23
  196. package/dist/insights/provider.mjs +47 -24
  197. package/dist/insights/routes.cjs +79 -14
  198. package/dist/insights/routes.mjs +77 -14
  199. package/dist/node.d.cts +1 -1
  200. package/dist/node.d.mts +1 -1
  201. package/dist/package.cjs +1 -1
  202. package/dist/package.mjs +1 -1
  203. package/dist/plugins/api-keys/index.cjs +50 -0
  204. package/dist/plugins/api-keys/index.d.cts +85 -0
  205. package/dist/plugins/api-keys/index.d.mts +85 -0
  206. package/dist/plugins/api-keys/index.mjs +47 -0
  207. package/dist/plugins/api-keys/model.cjs +58 -0
  208. package/dist/plugins/api-keys/model.d.cts +8 -0
  209. package/dist/plugins/api-keys/model.d.mts +8 -0
  210. package/dist/plugins/api-keys/model.mjs +58 -0
  211. package/dist/plugins/api-keys/schema.cjs +38 -0
  212. package/dist/plugins/api-keys/schema.d.cts +44 -0
  213. package/dist/plugins/api-keys/schema.d.mts +44 -0
  214. package/dist/plugins/api-keys/schema.mjs +39 -0
  215. package/dist/plugins/builtIn.cjs +7 -0
  216. package/dist/plugins/builtIn.mjs +6 -0
  217. package/dist/plugins/definePlugin.cjs +5 -0
  218. package/dist/plugins/definePlugin.d.cts +73 -0
  219. package/dist/plugins/definePlugin.d.mts +73 -0
  220. package/dist/plugins/definePlugin.mjs +5 -0
  221. package/dist/plugins/index.cjs +17 -0
  222. package/dist/plugins/index.d.cts +9 -0
  223. package/dist/plugins/index.d.mts +9 -0
  224. package/dist/plugins/index.mjs +7 -0
  225. package/dist/plugins/insights/index.cjs +48 -0
  226. package/dist/plugins/insights/index.d.cts +295 -0
  227. package/dist/plugins/insights/index.d.mts +295 -0
  228. package/dist/plugins/insights/index.mjs +44 -0
  229. package/dist/plugins/insights/model.cjs +17 -0
  230. package/dist/plugins/insights/model.d.cts +10 -0
  231. package/dist/plugins/insights/model.d.mts +10 -0
  232. package/dist/plugins/insights/model.mjs +17 -0
  233. package/dist/plugins/insights/reads.cjs +471 -0
  234. package/dist/plugins/insights/reads.mjs +466 -0
  235. package/dist/plugins/insights/recordEvent.cjs +135 -0
  236. package/dist/plugins/insights/recordEvent.d.cts +13 -0
  237. package/dist/plugins/insights/recordEvent.d.mts +13 -0
  238. package/dist/plugins/insights/recordEvent.mjs +132 -0
  239. package/dist/plugins/insights/schema.cjs +347 -0
  240. package/dist/plugins/insights/schema.d.cts +258 -0
  241. package/dist/plugins/insights/schema.d.mts +258 -0
  242. package/dist/plugins/insights/schema.mjs +344 -0
  243. package/dist/types/index.d.cts +2 -28
  244. package/dist/types/index.d.mts +2 -28
  245. package/package.json +28 -5
  246. package/src/adapters/drizzle.conformance.integration.spec.ts +34 -0
  247. package/src/adapters/drizzle.readBudgets.integration.spec.ts +41 -0
  248. package/src/adapters/drizzle.spec.ts +270 -399
  249. package/src/adapters/drizzle.ts +48 -140
  250. package/src/adapters/drizzleExecutor.ts +166 -0
  251. package/src/adapters/kysely.conformance.integration.spec.ts +36 -0
  252. package/src/adapters/kysely.readBudgets.integration.spec.ts +42 -0
  253. package/src/adapters/kysely.spec.ts +204 -171
  254. package/src/adapters/kysely.ts +32 -93
  255. package/src/adapters/kyselyExecutor.ts +53 -0
  256. package/src/adapters/mongodb.integration.spec.ts +143 -446
  257. package/src/adapters/mongodb.readBudgets.integration.spec.ts +61 -0
  258. package/src/adapters/mongodb.ts +36 -123
  259. package/src/adapters/mongodbAdapter.ts +293 -0
  260. package/src/adapters/prisma.conformance.integration.spec.ts +36 -0
  261. package/src/adapters/prisma.integration.spec.ts +138 -0
  262. package/src/adapters/prisma.readBudgets.integration.spec.ts +40 -0
  263. package/src/adapters/prisma.spec.ts +216 -433
  264. package/src/adapters/prisma.ts +60 -524
  265. package/src/adapters/prismaExecutor.ts +107 -0
  266. package/src/adapters/prismaTestClients.ts +175 -0
  267. package/src/adapters/sqlProviders.ts +14 -0
  268. package/src/apiKeys.integration.spec.ts +19 -119
  269. package/src/apiKeys.spec.ts +39 -35
  270. package/src/apiKeys.ts +2 -8
  271. package/src/assembly/assemblePlugins.ts +269 -0
  272. package/src/assembly/assembly.spec.ts +325 -0
  273. package/src/assembly/assembly.types.spec.ts +155 -0
  274. package/src/assembly/builtInRoutes.spec.ts +213 -0
  275. package/src/assembly/databasePlugins.spec.ts +71 -0
  276. package/src/assembly/databasePlugins.ts +96 -0
  277. package/src/core/api.ts +139 -0
  278. package/src/core/baseCandidates.spec.ts +378 -0
  279. package/src/core/baseCandidates.ts +136 -0
  280. package/src/core/index.ts +44 -0
  281. package/src/core/operations.spec.ts +415 -0
  282. package/src/core/operations.ts +551 -0
  283. package/src/core/reads.spec.ts +300 -0
  284. package/src/core/reads.ts +417 -0
  285. package/src/core/releases.spec.ts +308 -0
  286. package/src/core/releases.ts +345 -0
  287. package/src/core/schema.ts +173 -0
  288. package/src/core/writes.ts +160 -0
  289. package/src/createHotUpdaterCore.ts +191 -181
  290. package/src/database/cursor.ts +65 -0
  291. package/src/database/database.ts +335 -0
  292. package/src/database/database.types.spec.ts +135 -0
  293. package/src/database/definitions.ts +72 -0
  294. package/src/database/engine.ts +62 -0
  295. package/src/database/engineAggregates.spec.ts +539 -0
  296. package/src/database/engineAggregates.ts +193 -0
  297. package/src/database/engineReads.spec.ts +219 -0
  298. package/src/database/engineReads.ts +302 -0
  299. package/src/database/engineTransaction.spec.ts +710 -0
  300. package/src/database/engineTransaction.ts +588 -0
  301. package/src/database/errors.ts +30 -0
  302. package/src/database/fence.spec.ts +223 -0
  303. package/src/database/fence.ts +171 -0
  304. package/src/database/index.ts +154 -0
  305. package/src/database/kv/kvAdapter.conformance.integration.spec.ts +17 -0
  306. package/src/database/kv/kvAdapter.readBudgets.integration.spec.ts +17 -0
  307. package/src/database/kv/kvAdapter.spec.ts +468 -0
  308. package/src/database/kv/kvAdapter.ts +450 -0
  309. package/src/database/kv/kvTestStore.ts +91 -0
  310. package/src/database/memory.readBudgets.integration.spec.ts +13 -0
  311. package/src/database/resolveSchema.spec.ts +230 -0
  312. package/src/database/resolveSchema.ts +372 -0
  313. package/src/database/schema.ts +169 -0
  314. package/src/database/schema.types.spec.ts +94 -0
  315. package/src/database/sql/docker-compose.yml +36 -0
  316. package/src/database/sql/sqlAdapter.integration.spec.ts +148 -0
  317. package/src/database/sql/sqlAdapter.readBudgets.integration.spec.ts +109 -0
  318. package/src/database/sql/sqlAdapter.spec.ts +255 -0
  319. package/src/database/sql/sqlAdapter.ts +532 -0
  320. package/src/database/sql/sqlSchema.ts +205 -0
  321. package/src/database/sql/sqlTestExecutors.ts +183 -0
  322. package/src/databaseTestSuite.spec.ts +39 -0
  323. package/src/db/builtInDatabase.ts +149 -0
  324. package/src/db/bundleRows.spec.ts +3 -3
  325. package/src/db/createBundleDiff.spec.ts +43 -29
  326. package/src/db/createBundleDiff.ts +13 -7
  327. package/src/db/engineDrizzleSchema.ts +72 -0
  328. package/src/db/engineMigrator.ts +105 -0
  329. package/src/db/enginePrismaSchema.ts +147 -0
  330. package/src/db/engineSql.spec.ts +129 -0
  331. package/src/db/engineSql.ts +48 -0
  332. package/src/db/engineSqlMigrator.ts +116 -0
  333. package/src/db/fixedMigratorShared.ts +1 -20
  334. package/src/db/index.spec.ts +116 -829
  335. package/src/db/index.ts +43 -14
  336. package/src/db/pluginTables.spec.ts +218 -0
  337. package/src/db/releaseCatalog.ts +48 -90
  338. package/src/db/schemaSettings.ts +104 -0
  339. package/src/db/settingsMigrator.spec.ts +65 -0
  340. package/src/db/settingsMigrator.ts +152 -0
  341. package/src/db/types.ts +25 -171
  342. package/src/db/updateArtifacts.spec.ts +170 -294
  343. package/src/db/updateArtifacts.ts +74 -142
  344. package/src/db/updateCheck.bench.ts +47 -0
  345. package/src/handler-standalone.integration.spec.ts +204 -410
  346. package/src/handler.spec.ts +134 -51
  347. package/src/handler.testFixtures.ts +14 -19
  348. package/src/handler.ts +163 -75
  349. package/src/handlerAdminRoutes.spec.ts +183 -0
  350. package/src/handlerAdminRoutes.ts +536 -0
  351. package/src/handlerAuth.integration.spec.ts +3 -3
  352. package/src/handlerManagement.spec.ts +136 -196
  353. package/src/handlerReleaseCatalogRoutes.ts +15 -17
  354. package/src/handlerTypes.ts +3 -80
  355. package/src/handlerVersionRoutes.ts +20 -7
  356. package/src/index.ts +5 -12
  357. package/src/insights/domain.ts +12 -0
  358. package/src/insights/errors.spec.ts +48 -0
  359. package/src/insights/errors.ts +51 -0
  360. package/src/insights/eventInput.ts +27 -24
  361. package/src/insights/insights.integration.spec.ts +228 -78
  362. package/src/insights/provider.spec.ts +203 -25
  363. package/src/insights/provider.ts +88 -32
  364. package/src/insights/routes.ts +95 -20
  365. package/src/lintRules.spec.ts +76 -0
  366. package/src/plugins/api-keys/apiKeysPlugin.spec.ts +172 -0
  367. package/src/plugins/api-keys/index.ts +66 -0
  368. package/src/plugins/api-keys/model.ts +69 -0
  369. package/src/plugins/api-keys/schema.ts +22 -0
  370. package/src/plugins/builtIn.ts +5 -0
  371. package/src/plugins/definePlugin.ts +100 -0
  372. package/src/plugins/index.ts +55 -0
  373. package/src/plugins/insights/index.ts +86 -0
  374. package/src/plugins/insights/insightsRollout.integration.spec.ts +187 -0
  375. package/src/plugins/insights/model.spec.ts +66 -0
  376. package/src/plugins/insights/model.ts +19 -0
  377. package/src/plugins/insights/reads.spec.ts +725 -0
  378. package/src/plugins/insights/reads.ts +707 -0
  379. package/src/plugins/insights/recordEvent.spec.ts +443 -0
  380. package/src/plugins/insights/recordEvent.ts +238 -0
  381. package/src/plugins/insights/schema.ts +229 -0
  382. package/src/plugins/pluginTestHarness.spec.ts +56 -0
  383. package/src/readBudgets.testFixtures.ts +15 -0
  384. package/src/releaseCatalogRoutes.integration.spec.ts +47 -92
  385. package/src/runtime.spec.ts +91 -77
  386. package/src/runtime.testFixtures.ts +28 -44
  387. package/src/runtimeBundles.integration.spec.ts +112 -0
  388. package/src/testUtilsMutation.integration.spec.ts +215 -0
  389. package/src/testUtilsPackage.integration.spec.ts +176 -0
  390. package/src/types/index.ts +0 -32
  391. package/dist/adapters/databaseConstraintErrors.cjs +0 -22
  392. package/dist/adapters/databaseConstraintErrors.mjs +0 -21
  393. package/dist/adapters/databasePluginUtils.cjs +0 -130
  394. package/dist/adapters/databasePluginUtils.mjs +0 -118
  395. package/dist/adapters/drizzleCrud.cjs +0 -340
  396. package/dist/adapters/drizzleCrud.mjs +0 -337
  397. package/dist/adapters/drizzleLazyDB.cjs +0 -103
  398. package/dist/adapters/drizzleLazyDB.mjs +0 -103
  399. package/dist/adapters/drizzleQuery.cjs +0 -69
  400. package/dist/adapters/drizzleQuery.mjs +0 -69
  401. package/dist/adapters/kyselyCrud.cjs +0 -293
  402. package/dist/adapters/kyselyCrud.mjs +0 -292
  403. package/dist/adapters/kyselyQuery.cjs +0 -56
  404. package/dist/adapters/kyselyQuery.mjs +0 -56
  405. package/dist/adapters/mongodbCollections.cjs +0 -38
  406. package/dist/adapters/mongodbCollections.mjs +0 -32
  407. package/dist/adapters/mongodbQuery.cjs +0 -90
  408. package/dist/adapters/mongodbQuery.mjs +0 -83
  409. package/dist/adapters/mongodbReads.cjs +0 -206
  410. package/dist/adapters/mongodbReads.mjs +0 -206
  411. package/dist/adapters/mongodbWrites.cjs +0 -133
  412. package/dist/adapters/mongodbWrites.mjs +0 -133
  413. package/dist/adapters/prismaInsights.cjs +0 -99
  414. package/dist/adapters/prismaInsights.mjs +0 -97
  415. package/dist/adapters/prismaQuery.cjs +0 -57
  416. package/dist/adapters/prismaQuery.mjs +0 -56
  417. package/dist/adapters/prismaRows.cjs +0 -197
  418. package/dist/adapters/prismaRows.mjs +0 -188
  419. package/dist/db/databasePluginCore.cjs +0 -137
  420. package/dist/db/databasePluginCore.mjs +0 -137
  421. package/dist/db/fixedMigrator.cjs +0 -79
  422. package/dist/db/fixedMigrator.mjs +0 -78
  423. package/dist/db/fixedMigratorMongo.cjs +0 -321
  424. package/dist/db/fixedMigratorMongo.mjs +0 -321
  425. package/dist/db/mongoMigrationExecution.cjs +0 -11
  426. package/dist/db/mongoMigrationExecution.mjs +0 -11
  427. package/dist/db/schema/insightsCollation.cjs +0 -14
  428. package/dist/db/schema/insightsCollation.mjs +0 -14
  429. package/dist/db/schema/mongodb.cjs +0 -25
  430. package/dist/db/schema/mongodb.mjs +0 -25
  431. package/dist/db/schema/registry.cjs +0 -21
  432. package/dist/db/schema/registry.mjs +0 -17
  433. package/dist/db/schema/sql.cjs +0 -105
  434. package/dist/db/schema/sql.mjs +0 -97
  435. package/dist/db/schema/sqlOperations.cjs +0 -27
  436. package/dist/db/schema/sqlOperations.mjs +0 -26
  437. package/dist/db/schemaGenerators.cjs +0 -276
  438. package/dist/db/schemaGenerators.mjs +0 -274
  439. package/dist/db/schemaReadiness.cjs +0 -26
  440. package/dist/db/schemaReadiness.d.cts +0 -9
  441. package/dist/db/schemaReadiness.d.mts +0 -9
  442. package/dist/db/schemaReadiness.mjs +0 -25
  443. package/dist/db/sqlMigrationExecution.cjs +0 -67
  444. package/dist/db/sqlMigrationExecution.mjs +0 -67
  445. package/dist/handlerBundleRoutes.cjs +0 -155
  446. package/dist/handlerBundleRoutes.mjs +0 -155
  447. package/dist/handlerReleaseManagementRoutes.cjs +0 -124
  448. package/dist/handlerReleaseManagementRoutes.mjs +0 -124
  449. package/dist/schema/dsl.cjs +0 -103
  450. package/dist/schema/dsl.mjs +0 -87
  451. package/dist/schema/index.cjs +0 -20
  452. package/dist/schema/index.mjs +0 -7
  453. package/dist/schema/settings.cjs +0 -9
  454. package/dist/schema/settings.mjs +0 -9
  455. package/dist/schema/types.cjs +0 -8
  456. package/dist/schema/types.mjs +0 -6
  457. package/dist/schema/v1_0_0.cjs +0 -393
  458. package/dist/schema/v1_0_0.mjs +0 -385
  459. package/src/adapters/databaseConstraintErrors.ts +0 -25
  460. package/src/adapters/databasePluginTestDatabase.ts +0 -116
  461. package/src/adapters/databasePluginUtils.spec.ts +0 -29
  462. package/src/adapters/databasePluginUtils.ts +0 -238
  463. package/src/adapters/drizzleCrud.ts +0 -610
  464. package/src/adapters/drizzleLazyDB.ts +0 -284
  465. package/src/adapters/drizzleQuery.ts +0 -164
  466. package/src/adapters/kyselyCrud.ts +0 -696
  467. package/src/adapters/kyselyInsights.spec.ts +0 -168
  468. package/src/adapters/kyselyQuery.ts +0 -128
  469. package/src/adapters/mongodb.spec.ts +0 -230
  470. package/src/adapters/mongodbCollections.ts +0 -78
  471. package/src/adapters/mongodbQuery.ts +0 -245
  472. package/src/adapters/mongodbReads.ts +0 -387
  473. package/src/adapters/mongodbRows.spec.ts +0 -64
  474. package/src/adapters/mongodbRows.ts +0 -118
  475. package/src/adapters/mongodbTestClient.ts +0 -443
  476. package/src/adapters/mongodbTestFilter.ts +0 -170
  477. package/src/adapters/mongodbWrites.ts +0 -261
  478. package/src/adapters/prismaInsights.ts +0 -190
  479. package/src/adapters/prismaQuery.ts +0 -129
  480. package/src/adapters/prismaRows.spec.ts +0 -98
  481. package/src/adapters/prismaRows.ts +0 -308
  482. package/src/adapters/prismaTestClient.ts +0 -478
  483. package/src/calculatePagination.ts +0 -34
  484. package/src/db/databasePluginCore.spec.ts +0 -62
  485. package/src/db/databasePluginCore.testFixtures.ts +0 -76
  486. package/src/db/databasePluginCore.ts +0 -185
  487. package/src/db/databasePluginUpdateCheck.bench.ts +0 -117
  488. package/src/db/fixedMigrator.spec.ts +0 -294
  489. package/src/db/fixedMigrator.ts +0 -147
  490. package/src/db/fixedMigratorMongo.spec.ts +0 -253
  491. package/src/db/fixedMigratorMongo.ts +0 -425
  492. package/src/db/hotUpdaterSchema.ts +0 -5
  493. package/src/db/mongoMigrationExecution.ts +0 -23
  494. package/src/db/schema/definitions.ts +0 -1
  495. package/src/db/schema/insightsCollation.ts +0 -21
  496. package/src/db/schema/mongodb.ts +0 -40
  497. package/src/db/schema/registry.ts +0 -55
  498. package/src/db/schema/sql.ts +0 -244
  499. package/src/db/schema/sqlOperations.ts +0 -63
  500. package/src/db/schema/types.ts +0 -1
  501. package/src/db/schemaGenerators.ts +0 -495
  502. package/src/db/schemaReadiness.ts +0 -34
  503. package/src/db/sqlMigrationExecution.spec.ts +0 -65
  504. package/src/db/sqlMigrationExecution.ts +0 -108
  505. package/src/db/types.spec.ts +0 -63
  506. package/src/handlerBundleRoutes.ts +0 -259
  507. package/src/handlerReleaseManagementRoutes.ts +0 -213
  508. package/src/schema/dsl-all-versions.spec.ts +0 -35
  509. package/src/schema/dsl.ts +0 -187
  510. package/src/schema/index.ts +0 -10
  511. package/src/schema/settings.ts +0 -15
  512. package/src/schema/types.ts +0 -79
  513. package/src/schema/v1_0_0.spec.ts +0 -220
  514. package/src/schema/v1_0_0.ts +0 -511
@@ -0,0 +1,350 @@
1
+ import { DatabaseConstraintError } from "../database/errors.mjs";
2
+ import { toBundleRow, toReleaseRow } from "./reads.mjs";
3
+ import { deleteBundle, deleteChannel, insertChannel, replaceBundlePatches, updateBundle } from "./writes.mjs";
4
+ import { changeRelease, changeReleases, readCatalog, rebuildScope } from "./releases.mjs";
5
+ import { DatabaseBundleNotFoundError, ReleaseCatalogMutationError, ReleaseManagementError, bundleToPatchRows, bundleToRow, createUUIDv7After, isUUIDv7, rowToBundle } from "@hot-updater/plugin-core";
6
+ import { DatabaseRowReferencedError } from "@hot-updater/plugin-core/internal";
7
+ import { createReleaseCatalogScopeKey, decodeChannelKey, encodeChannelKey } from "@hot-updater/core";
8
+ //#region src/core/operations.ts
9
+ /** Carries a preflight's result out of the transaction it stops, so nothing is written. */
10
+ var Preflight = class extends Error {
11
+ result;
12
+ constructor(result) {
13
+ super("preflight");
14
+ this.result = result;
15
+ }
16
+ };
17
+ const dryRun = async (db, read) => {
18
+ try {
19
+ await db.transaction(async (tx) => {
20
+ throw new Preflight(await read(tx));
21
+ });
22
+ } catch (error) {
23
+ if (error instanceof Preflight) return error.result;
24
+ throw error;
25
+ }
26
+ throw new Error("A preflight transaction returned without its result.");
27
+ };
28
+ /** A channel's catalog scope for a platform, and a fingerprint when it has one. */
29
+ const scopeOf = (channel, platform, fingerprintHash) => {
30
+ const channelKey = encodeChannelKey(channel.name);
31
+ return fingerprintHash === null ? {
32
+ channelId: channel.id,
33
+ channelName: channel.name,
34
+ fingerprintHash,
35
+ platform,
36
+ scopeKey: createReleaseCatalogScopeKey({
37
+ channelKey,
38
+ platform,
39
+ strategy: "APP_VERSION"
40
+ }),
41
+ strategy: "APP_VERSION"
42
+ } : {
43
+ channelId: channel.id,
44
+ channelName: channel.name,
45
+ fingerprintHash,
46
+ platform,
47
+ scopeKey: createReleaseCatalogScopeKey({
48
+ channelKey,
49
+ fingerprintHash,
50
+ platform,
51
+ strategy: "FINGERPRINT"
52
+ }),
53
+ strategy: "FINGERPRINT"
54
+ };
55
+ };
56
+ /** A release and its scope, checked against the revision the caller saw. */
57
+ const loadTarget = async (tx, { releaseId, expectedRevision }) => {
58
+ const row = await tx.findOne("releases", { id: releaseId });
59
+ if (row === null) throw new ReleaseManagementError("RELEASE_NOT_FOUND", `Release "${releaseId}" was not found.`);
60
+ const release = toReleaseRow(row);
61
+ if (expectedRevision !== void 0 && expectedRevision !== release.revision) throw new ReleaseManagementError("VERSION_CONFLICT", `Release "${release.id}" is revision ${release.revision}; expected ${expectedRevision}.`);
62
+ const catalog = await tx.findOne("release_catalogs", { scope_key: release.scope_key });
63
+ if (catalog === null) throw new ReleaseCatalogMutationError("INVALID_SCOPE", `Release "${release.id}" has no catalog projection.`);
64
+ return {
65
+ release,
66
+ scope: {
67
+ channelId: release.channel_id,
68
+ channelName: decodeChannelKey(catalog.channel_key),
69
+ fingerprintHash: release.fingerprint_hash,
70
+ platform: release.platform,
71
+ scopeKey: release.scope_key,
72
+ strategy: release.strategy
73
+ }
74
+ };
75
+ };
76
+ const policyUpdate = (release, patch, updatedAtMs) => {
77
+ if (patch.fingerprintHash !== void 0 && patch.fingerprintHash !== release.fingerprint_hash) throw new ReleaseManagementError("SCOPE_MOVE_UNSUPPORTED", "Changing a fingerprint target requires an atomic Release scope move.");
78
+ return {
79
+ ...patch.enabled === void 0 ? {} : { enabled: patch.enabled },
80
+ ...patch.message === void 0 ? {} : { message: patch.message },
81
+ ...patch.rolloutCohortCount === void 0 ? {} : { rollout_cohort_count: patch.rolloutCohortCount },
82
+ ...patch.shouldForceUpdate === void 0 ? {} : { should_force_update: patch.shouldForceUpdate },
83
+ ...patch.targetAppVersion === void 0 ? {} : { target_app_version: patch.targetAppVersion },
84
+ ...patch.targetCohorts === void 0 ? {} : { target_cohorts: [...patch.targetCohorts] },
85
+ updated_at_ms: updatedAtMs
86
+ };
87
+ };
88
+ const mutationResult = ({ catalog, release }) => ({
89
+ attempts: 1,
90
+ catalog,
91
+ release
92
+ });
93
+ /** The scope a catalog row names, for a rebuild. */
94
+ const catalogScope = async (tx, scopeKey) => {
95
+ const row = await tx.findOne("release_catalogs", { scope_key: scopeKey });
96
+ if (row === null) throw new Error(`Release catalog "${scopeKey}" was not found.`);
97
+ return {
98
+ channelId: row.channel_id,
99
+ channelName: decodeChannelKey(row.channel_key),
100
+ fingerprintHash: row.fingerprint_hash,
101
+ platform: row.platform,
102
+ scopeKey: row.scope_key,
103
+ strategy: row.strategy
104
+ };
105
+ };
106
+ /**
107
+ * Core's typed writes: each runs in one engine transaction rooted at the
108
+ * catalogs it changes, so a concurrent change reruns it instead of
109
+ * publishing a stale catalog.
110
+ */
111
+ const createCoreOperations = (db, { now = Date.now } = {}) => {
112
+ const ensureChannel = async (name) => (await insertChannel(db, {
113
+ id: `channel:${encodeChannelKey(name)}`,
114
+ name
115
+ })).row;
116
+ /**
117
+ * Runs a write that ensured its channels first. A channel deleted between
118
+ * that and the write refuses the write, so it runs again and ensures it anew.
119
+ */
120
+ const withChannels = async (write) => {
121
+ for (let attempt = 1;; attempt += 1) try {
122
+ return await write();
123
+ } catch (error) {
124
+ if (attempt < 3 && error instanceof DatabaseConstraintError && error.reason === "not_found" && error.model === "channels") continue;
125
+ throw error;
126
+ }
127
+ };
128
+ const deployOnce = async (deployments) => {
129
+ const channels = /* @__PURE__ */ new Map();
130
+ for (const { release } of deployments) if (!channels.has(release.channel)) channels.set(release.channel, await ensureChannel(release.channel));
131
+ const platforms = /* @__PURE__ */ new Map();
132
+ for (const deployment of deployments) {
133
+ if (!("bundleId" in deployment) || platforms.has(deployment.bundleId)) continue;
134
+ const row = await db.findOne("bundles", { id: deployment.bundleId });
135
+ if (row === null) throw new DatabaseBundleNotFoundError(deployment.bundleId);
136
+ platforms.set(deployment.bundleId, toBundleRow(row).platform);
137
+ }
138
+ const updatedAtMs = now();
139
+ return (await changeReleases(db, deployments.map((deployment) => {
140
+ const { release: policy } = deployment;
141
+ const stored = "bundleId" in deployment;
142
+ const bundleId = stored ? deployment.bundleId : deployment.bundle.id;
143
+ const platform = stored ? platforms.get(deployment.bundleId) : deployment.bundle.platform;
144
+ const scope = scopeOf(channels.get(policy.channel), platform, policy.fingerprintHash);
145
+ return {
146
+ scope,
147
+ ...stored ? {} : { bundle: {
148
+ row: bundleToRow(deployment.bundle),
149
+ patches: bundleToPatchRows(deployment.bundle)
150
+ } },
151
+ change: {
152
+ operation: "insert",
153
+ row: {
154
+ bundle_id: bundleId,
155
+ channel_id: scope.channelId,
156
+ created_at_ms: updatedAtMs,
157
+ enabled: policy.enabled,
158
+ fingerprint_hash: policy.fingerprintHash,
159
+ kind: "BUNDLE",
160
+ message: policy.message,
161
+ operation: "DEPLOY",
162
+ platform,
163
+ revision: 1,
164
+ rollout_cohort_count: policy.rolloutCohortCount ?? 1e3,
165
+ scope_key: scope.scopeKey,
166
+ should_force_update: policy.shouldForceUpdate,
167
+ source_release_id: null,
168
+ strategy: scope.strategy,
169
+ target_app_version: policy.targetAppVersion,
170
+ target_cohorts: policy.targetCohorts ?? [],
171
+ updated_at_ms: updatedAtMs
172
+ }
173
+ },
174
+ updatedAtMs
175
+ };
176
+ }))).map(mutationResult);
177
+ };
178
+ return {
179
+ deploy: (deployments) => withChannels(() => deployOnce(deployments)),
180
+ updateReleasePolicy: (input) => {
181
+ const updatedAtMs = now();
182
+ return db.transaction(async (tx) => {
183
+ const { release, scope } = await loadTarget(tx, input);
184
+ return mutationResult(await changeRelease(tx, {
185
+ scope,
186
+ change: {
187
+ operation: "update",
188
+ id: release.id,
189
+ update: policyUpdate(release, input.patch, updatedAtMs)
190
+ },
191
+ updatedAtMs
192
+ }));
193
+ });
194
+ },
195
+ preflightReleasePolicy: (input) => {
196
+ const updatedAtMs = now();
197
+ return dryRun(db, async (tx) => {
198
+ const { release, scope } = await loadTarget(tx, input);
199
+ const stored = await readCatalog(tx, scope.scopeKey);
200
+ const changed = await changeRelease(tx, {
201
+ scope,
202
+ change: {
203
+ operation: "update",
204
+ id: release.id,
205
+ update: policyUpdate(release, input.patch, updatedAtMs)
206
+ },
207
+ updatedAtMs
208
+ });
209
+ return {
210
+ catalog: changed.catalog,
211
+ currentCatalog: stored.catalog,
212
+ diagnostics: changed.diagnostics,
213
+ expectedReleaseRevision: release.revision,
214
+ release: changed.release
215
+ };
216
+ });
217
+ },
218
+ deleteRelease: (input) => db.transaction(async (tx) => {
219
+ const { release, scope } = await loadTarget(tx, input);
220
+ if (release.enabled) throw new ReleaseManagementError("ENABLED_RELEASE", `Disable Release "${release.id}" before hard deletion.`);
221
+ return mutationResult(await changeRelease(tx, {
222
+ scope,
223
+ change: {
224
+ operation: "delete",
225
+ id: release.id
226
+ },
227
+ updatedAtMs: now()
228
+ }));
229
+ }),
230
+ promoteRelease: (input) => withChannels(async () => {
231
+ const checkSource = (source) => {
232
+ if (source.kind !== "BUNDLE" || source.bundle_id === null) throw new ReleaseManagementError("TARGET_RELEASE_INVALID", "Only a Bundle Release can be promoted.");
233
+ };
234
+ checkSource((await db.transaction((tx) => loadTarget(tx, input))).release);
235
+ const targetChannel = input.targetChannel.trim();
236
+ if (targetChannel.length === 0) throw new ReleaseManagementError("TARGET_RELEASE_INVALID", "Promotion requires a target channel.");
237
+ const channel = await ensureChannel(targetChannel);
238
+ const updatedAtMs = now();
239
+ return db.transaction(async (tx) => {
240
+ const { release: source, scope: sourceScope } = await loadTarget(tx, input);
241
+ checkSource(source);
242
+ const targetScope = scopeOf(channel, source.platform, source.fingerprint_hash);
243
+ if (targetScope.scopeKey === sourceScope.scopeKey) throw new ReleaseManagementError("TARGET_RELEASE_INVALID", "Source and target Release scopes are the same.");
244
+ const { rows } = await tx.findMany("releases", {
245
+ index: "byScope",
246
+ where: { scope_key: targetScope.scopeKey },
247
+ order: "desc",
248
+ limit: 1
249
+ });
250
+ const floor = [
251
+ rows[0]?.id ?? null,
252
+ source.id,
253
+ source.bundle_id
254
+ ].filter((id) => id !== null && isUUIDv7(id)).sort().at(-1);
255
+ const moved = input.action === "move" ? await changeRelease(tx, {
256
+ scope: sourceScope,
257
+ change: {
258
+ operation: "update",
259
+ id: source.id,
260
+ update: {
261
+ enabled: false,
262
+ updated_at_ms: updatedAtMs
263
+ }
264
+ },
265
+ updatedAtMs
266
+ }) : null;
267
+ const target = await changeRelease(tx, {
268
+ scope: targetScope,
269
+ change: {
270
+ operation: "insert",
271
+ row: {
272
+ ...source,
273
+ id: createUUIDv7After(floor ?? null, updatedAtMs),
274
+ revision: 1,
275
+ scope_key: targetScope.scopeKey,
276
+ channel_id: targetScope.channelId,
277
+ enabled: true,
278
+ rollout_cohort_count: 1e3,
279
+ target_cohorts: [],
280
+ operation: "PROMOTE",
281
+ source_release_id: source.id,
282
+ created_at_ms: updatedAtMs,
283
+ updated_at_ms: updatedAtMs
284
+ }
285
+ },
286
+ updatedAtMs
287
+ });
288
+ return {
289
+ source: moved === null ? null : mutationResult(moved),
290
+ target: mutationResult(target)
291
+ };
292
+ });
293
+ }),
294
+ rebuildReleaseCatalog: (scopeKey) => {
295
+ const updatedAtMs = now();
296
+ return db.transaction(async (tx) => {
297
+ const { current: _current, ...rebuilt } = await rebuildScope(tx, await catalogScope(tx, scopeKey), updatedAtMs);
298
+ return {
299
+ attempts: 1,
300
+ ...rebuilt
301
+ };
302
+ });
303
+ },
304
+ preflightReleaseCatalogRebuild: (scopeKey) => {
305
+ const updatedAtMs = now();
306
+ return dryRun(db, async (tx) => {
307
+ const rebuilt = await rebuildScope(tx, await catalogScope(tx, scopeKey), updatedAtMs);
308
+ return {
309
+ changed: rebuilt.changed,
310
+ currentCatalog: rebuilt.current,
311
+ diagnostics: rebuilt.diagnostics,
312
+ projectedCatalog: rebuilt.catalog
313
+ };
314
+ });
315
+ },
316
+ ensureChannel,
317
+ deleteChannel: (id) => deleteChannel(db, id),
318
+ updateBundle: (id, update) => db.transaction(async (tx) => {
319
+ const current = await tx.findOne("bundles", { id });
320
+ if (current === null) throw new DatabaseBundleNotFoundError(id);
321
+ const { patches, ...fields } = update;
322
+ const next = {
323
+ ...rowToBundle(toBundleRow(current)),
324
+ ...fields,
325
+ id
326
+ };
327
+ const { id: _id, ...set } = bundleToRow(next);
328
+ updateBundle(tx, current, set);
329
+ if (patches !== void 0) await replaceBundlePatches(tx, current, bundleToPatchRows({
330
+ ...next,
331
+ patches
332
+ }));
333
+ }),
334
+ deleteBundles: async (ids) => {
335
+ try {
336
+ await db.transaction(async (tx) => {
337
+ for (const id of new Set(ids)) {
338
+ const current = await tx.findOne("bundles", { id });
339
+ if (current !== null) await deleteBundle(tx, current);
340
+ }
341
+ });
342
+ } catch (error) {
343
+ if (error instanceof DatabaseConstraintError && error.reason === "referenced") throw new DatabaseRowReferencedError();
344
+ throw error;
345
+ }
346
+ }
347
+ };
348
+ };
349
+ //#endregion
350
+ export { createCoreOperations };
@@ -0,0 +1,273 @@
1
+ const require_releaseCatalog = require("../db/releaseCatalog.cjs");
2
+ const require_updateArtifacts = require("../db/updateArtifacts.cjs");
3
+ const require_baseCandidates = require("./baseCandidates.cjs");
4
+ let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
5
+ let _hot_updater_core = require("@hot-updater/core");
6
+ //#region src/core/reads.ts
7
+ const PAGE = 500;
8
+ const pick = (fields) => (row) => Object.fromEntries(fields.map((field) => [field, row[field]]));
9
+ const toBundleRow = pick([
10
+ "id",
11
+ "platform",
12
+ "git_commit_hash",
13
+ "metadata",
14
+ "manifest_storage_uri",
15
+ "manifest_file_hash",
16
+ "asset_base_storage_uri"
17
+ ]);
18
+ const toPatchRow = pick([
19
+ "id",
20
+ "bundle_id",
21
+ "base_bundle_id",
22
+ "base_file_hash",
23
+ "patch_file_hash",
24
+ "patch_storage_uri",
25
+ "byte_size",
26
+ "order_index"
27
+ ]);
28
+ const toReleaseRow = pick([
29
+ "id",
30
+ "revision",
31
+ "scope_key",
32
+ "channel_id",
33
+ "platform",
34
+ "kind",
35
+ "bundle_id",
36
+ "strategy",
37
+ "target_app_version",
38
+ "fingerprint_hash",
39
+ "enabled",
40
+ "should_force_update",
41
+ "message",
42
+ "rollout_cohort_count",
43
+ "target_cohorts",
44
+ "operation",
45
+ "source_release_id",
46
+ "created_at_ms",
47
+ "updated_at_ms"
48
+ ]);
49
+ const toCatalogRow = pick([
50
+ "scope_key",
51
+ "catalog_id",
52
+ "strategy",
53
+ "channel_id",
54
+ "channel_key",
55
+ "platform",
56
+ "fingerprint_hash",
57
+ "generation",
58
+ "payload",
59
+ "catalog_hash",
60
+ "byte_size",
61
+ "is_tombstone",
62
+ "updated_at_ms"
63
+ ]);
64
+ const toChannelRow = pick(["id", "name"]);
65
+ /** Every page of one read, in order. */
66
+ const drain = async (read) => {
67
+ const rows = [];
68
+ let cursor;
69
+ do {
70
+ const page = await read(cursor === void 0 ? {} : { cursor });
71
+ rows.push(...page.rows);
72
+ cursor = page.next;
73
+ } while (cursor !== void 0);
74
+ return rows;
75
+ };
76
+ /** Core's reads, each through one declared index or key. */
77
+ const createCoreReads = (db, storage) => {
78
+ /** A bundle row's patches, exactly as many as its reference counter holds. */
79
+ const detail = async (row) => {
80
+ const count = row._refs_bundle_patches_bundle_id ?? 0;
81
+ const patches = [];
82
+ let cursor;
83
+ while (patches.length < count) {
84
+ const page = await db.findMany("bundle_patches", {
85
+ index: "byBundle",
86
+ where: { bundle_id: row.id },
87
+ limit: Math.min(count - patches.length, PAGE),
88
+ ...cursor === void 0 ? {} : { cursor }
89
+ });
90
+ patches.push(...page.rows.map(toPatchRow));
91
+ if (page.next === void 0) break;
92
+ cursor = page.next;
93
+ }
94
+ return {
95
+ bundle: toBundleRow(row),
96
+ patches,
97
+ childCount: row._refs_bundle_patches_base_bundle_id ?? 0
98
+ };
99
+ };
100
+ const after = (input) => input.after === void 0 ? {} : { range: (input.order ?? "asc") === "asc" ? { gt: input.after } : { lt: input.after } };
101
+ return {
102
+ /** The update check: one point read of its scope's catalog. */
103
+ async getReleaseCatalog(input) {
104
+ const scopeKey = require_releaseCatalog.releaseCatalogScopeKeyOf(input);
105
+ const row = await db.findOne("release_catalogs", { scope_key: scopeKey });
106
+ return require_releaseCatalog.projectReleaseCatalogRow(row === null ? null : toCatalogRow(row), input, scopeKey);
107
+ },
108
+ /** Artifact resolution: one batch read of both bundles and one unique read of their patch. */
109
+ async getArtifactInfo(targetBundleId, currentBundleId, artifactProtocolVersion) {
110
+ const { readStorageText } = storage;
111
+ if (artifactProtocolVersion !== _hot_updater_core.ARTIFACT_PROTOCOL_VERSION || readStorageText === void 0) return null;
112
+ const withCurrent = currentBundleId !== _hot_updater_core.NIL_UUID;
113
+ const [[target, current], patch] = await Promise.all([db.findByKeys("bundles", withCurrent ? [{ id: targetBundleId }, { id: currentBundleId }] : [{ id: targetBundleId }]), withCurrent ? db.findOne("bundle_patches", {
114
+ bundle_id: targetBundleId,
115
+ base_bundle_id: currentBundleId
116
+ }) : null]);
117
+ if (target === null || target === void 0) return null;
118
+ return require_updateArtifacts.resolveManifestArtifacts({
119
+ currentBundle: current ? (0, _hot_updater_plugin_core.rowToBundle)(toBundleRow(current)) : null,
120
+ readStorageText,
121
+ resolveFileUrl: storage.resolveFileUrl,
122
+ targetBundle: (0, _hot_updater_plugin_core.rowToBundle)(toBundleRow(target), patch === null ? [] : [toPatchRow(patch)])
123
+ });
124
+ },
125
+ /** A bundle, its patches, and how many patches start from it. */
126
+ async getBundle(id) {
127
+ const row = await db.findOne("bundles", { id });
128
+ return row === null ? null : detail(row);
129
+ },
130
+ /** One page of the patches that start from a bundle, by target bundle id. */
131
+ /** Each base bundle's reference counter: one batch read of the bundle rows, and no patches. */
132
+ async countBundleChildren(baseBundleIds) {
133
+ const ids = [...new Set(baseBundleIds)];
134
+ if (ids.length === 0) return {};
135
+ const rows = await db.findByKeys("bundles", ids.map((id) => ({ id })));
136
+ return Object.fromEntries(ids.map((id, position) => [id, rows[position]?._refs_bundle_patches_base_bundle_id ?? 0]));
137
+ },
138
+ async listPatchesFromBase(baseBundleId, input) {
139
+ return (await db.findMany("bundle_patches", {
140
+ index: "byBase",
141
+ where: { base_bundle_id: baseBundleId },
142
+ order: input.order ?? "asc",
143
+ limit: input.limit,
144
+ ...after(input)
145
+ })).rows.map(toPatchRow);
146
+ },
147
+ /** One page of bundles with their patches, oldest or newest first, optionally for one platform. */
148
+ async listBundles(input) {
149
+ const page = input.platform === void 0 ? await db.findMany("bundles", {
150
+ index: "all",
151
+ where: {},
152
+ order: input.order ?? "asc",
153
+ limit: input.limit,
154
+ ...after(input)
155
+ }) : await db.findMany("bundles", {
156
+ index: "byPlatform",
157
+ where: { platform: input.platform },
158
+ order: input.order ?? "asc",
159
+ limit: input.limit,
160
+ ...after(input)
161
+ });
162
+ return Promise.all(page.rows.map(detail));
163
+ },
164
+ /** Bundles in total or for one platform: one counter row. */
165
+ async countBundles(platform) {
166
+ const { rows } = await db.findAggregates("bundle_totals", {
167
+ index: "byPlatform",
168
+ where: { platform_key: platform ?? "*" },
169
+ limit: 1
170
+ });
171
+ return rows[0]?.bundles ?? 0;
172
+ },
173
+ /** Auto-patch bases for a new bundle: one point read of its scope's catalog. */
174
+ async findBaseBundleIds(candidateKey, bundleId, limit) {
175
+ const query = require_baseCandidates.parseBaseCandidateKey(candidateKey);
176
+ if (query === null) return [];
177
+ const row = await db.findOne("release_catalogs", { scope_key: query.scopeKey });
178
+ return row === null ? [] : require_baseCandidates.baseBundleIdsOf(toCatalogRow(row), query.range, bundleId, limit);
179
+ },
180
+ async getRelease(id) {
181
+ const row = await db.findOne("releases", { id });
182
+ return row === null ? null : toReleaseRow(row);
183
+ },
184
+ /** One page of releases through the index its filter names. */
185
+ async listReleases(input) {
186
+ const { filter } = input;
187
+ const options = {
188
+ order: input.order ?? "asc",
189
+ limit: input.limit,
190
+ ...after(input)
191
+ };
192
+ return (filter.kind === "all" ? await db.findMany("releases", {
193
+ index: "all",
194
+ where: {},
195
+ ...options
196
+ }) : filter.kind === "bundle" ? await db.findMany("releases", {
197
+ index: "byBundle",
198
+ where: { bundle_id: filter.bundleId },
199
+ ...options
200
+ }) : filter.kind === "scope" ? filter.enabled === void 0 ? await db.findMany("releases", {
201
+ index: "byScope",
202
+ where: { scope_key: filter.scopeKey },
203
+ ...options
204
+ }) : await db.findMany("releases", {
205
+ index: "byScopeEnabled",
206
+ where: {
207
+ scope_key: filter.scopeKey,
208
+ enabled: filter.enabled
209
+ },
210
+ ...options
211
+ }) : filter.enabled === void 0 ? await db.findMany("releases", {
212
+ index: "byChannelPlatform",
213
+ where: {
214
+ channel_id: filter.channelId,
215
+ platform: filter.platform
216
+ },
217
+ ...options
218
+ }) : await db.findMany("releases", {
219
+ index: "byChannelPlatformEnabled",
220
+ where: {
221
+ channel_id: filter.channelId,
222
+ platform: filter.platform,
223
+ enabled: filter.enabled
224
+ },
225
+ ...options
226
+ })).rows.map(toReleaseRow);
227
+ },
228
+ /** A scope's newest release id: `byScope` descending, limit 1. */
229
+ async latestReleaseId(scopeKey) {
230
+ const { rows } = await db.findMany("releases", {
231
+ index: "byScope",
232
+ where: { scope_key: scopeKey },
233
+ order: "desc",
234
+ limit: 1
235
+ });
236
+ return rows[0]?.id ?? null;
237
+ },
238
+ async getReleaseCatalogRow(scopeKey) {
239
+ const row = await db.findOne("release_catalogs", { scope_key: scopeKey });
240
+ return row === null ? null : toCatalogRow(row);
241
+ },
242
+ async listReleaseCatalogs(input) {
243
+ return (await db.findMany("release_catalogs", {
244
+ index: "all",
245
+ where: {},
246
+ order: input.order ?? "asc",
247
+ limit: input.limit,
248
+ ...after(input)
249
+ })).rows.map(toCatalogRow);
250
+ },
251
+ /** Every channel, by name. */
252
+ async listChannels() {
253
+ return (await drain((page) => db.findMany("channels", {
254
+ index: "all",
255
+ where: {},
256
+ limit: PAGE,
257
+ ...page
258
+ }))).map(toChannelRow);
259
+ },
260
+ async findChannelByName(name) {
261
+ const row = await db.findOne("channels", { name });
262
+ return row === null ? null : toChannelRow(row);
263
+ }
264
+ };
265
+ };
266
+ //#endregion
267
+ exports.createCoreReads = createCoreReads;
268
+ exports.drain = drain;
269
+ exports.toBundleRow = toBundleRow;
270
+ exports.toCatalogRow = toCatalogRow;
271
+ exports.toChannelRow = toChannelRow;
272
+ exports.toPatchRow = toPatchRow;
273
+ exports.toReleaseRow = toReleaseRow;
@@ -0,0 +1,48 @@
1
+ import "../database/engineReads.cjs";
2
+ import { HotUpdaterDatabase } from "../database/database.cjs";
3
+ import { ReleaseCatalogRequest } from "../db/releaseCatalog.cjs";
4
+ import { CoreSchema } from "./schema.cjs";
5
+ import { BundleDetail, BundlePatchRow, ChannelRow, KeysetInput, ReleaseCatalogRow, ReleaseFilter, ReleaseRow } from "@hot-updater/plugin-core";
6
+ import { ArtifactInfo, ReleaseCatalog } from "@hot-updater/core";
7
+ //#region src/core/reads.d.ts
8
+ type CoreDatabase = HotUpdaterDatabase<CoreSchema>;
9
+ interface CoreStorage {
10
+ readonly readStorageText?: (storageUri: string) => Promise<string | null>;
11
+ readonly resolveFileUrl: (storageUri: string | null) => Promise<string | null>;
12
+ }
13
+ /** Core's reads, each through one declared index or key. */
14
+ declare const createCoreReads: (db: CoreDatabase, storage: CoreStorage) => {
15
+ /** The update check: one point read of its scope's catalog. */
16
+ getReleaseCatalog(input: ReleaseCatalogRequest): Promise<ReleaseCatalog | null>;
17
+ /** Artifact resolution: one batch read of both bundles and one unique read of their patch. */
18
+ getArtifactInfo(targetBundleId: string, currentBundleId: string, artifactProtocolVersion: 1): Promise<ArtifactInfo | null>;
19
+ /** A bundle, its patches, and how many patches start from it. */
20
+ getBundle(id: string): Promise<BundleDetail | null>;
21
+ /** One page of the patches that start from a bundle, by target bundle id. */
22
+ /** Each base bundle's reference counter: one batch read of the bundle rows, and no patches. */
23
+ countBundleChildren(baseBundleIds: readonly string[]): Promise<Record<string, number>>;
24
+ listPatchesFromBase(baseBundleId: string, input: KeysetInput): Promise<BundlePatchRow[]>;
25
+ /** One page of bundles with their patches, oldest or newest first, optionally for one platform. */
26
+ listBundles(input: KeysetInput & {
27
+ readonly platform?: "ios" | "android";
28
+ }): Promise<BundleDetail[]>;
29
+ /** Bundles in total or for one platform: one counter row. */
30
+ countBundles(platform?: "ios" | "android"): Promise<number>;
31
+ /** Auto-patch bases for a new bundle: one point read of its scope's catalog. */
32
+ findBaseBundleIds(candidateKey: string, bundleId: string, limit: number): Promise<string[]>;
33
+ getRelease(id: string): Promise<ReleaseRow | null>;
34
+ /** One page of releases through the index its filter names. */
35
+ listReleases(input: KeysetInput & {
36
+ readonly filter: ReleaseFilter;
37
+ }): Promise<ReleaseRow[]>;
38
+ /** A scope's newest release id: `byScope` descending, limit 1. */
39
+ latestReleaseId(scopeKey: string): Promise<string | null>;
40
+ getReleaseCatalogRow(scopeKey: string): Promise<ReleaseCatalogRow | null>;
41
+ listReleaseCatalogs(input: KeysetInput): Promise<ReleaseCatalogRow[]>;
42
+ /** Every channel, by name. */
43
+ listChannels(): Promise<ChannelRow[]>;
44
+ findChannelByName(name: string): Promise<ChannelRow | null>;
45
+ };
46
+ type CoreReads = ReturnType<typeof createCoreReads>;
47
+ //#endregion
48
+ export { type BundleDetail, CoreDatabase, CoreReads, CoreStorage, type KeysetInput, type ReleaseFilter, createCoreReads };