@hot-updater/server 1.0.0-rc.18 → 1.0.0-rc.21

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 (485) hide show
  1. package/LICENSE +12 -14
  2. package/dist/adapters/drizzle.cjs +6 -8
  3. package/dist/adapters/drizzle.d.cts +2 -2
  4. package/dist/adapters/drizzle.d.mts +2 -2
  5. package/dist/adapters/drizzle.mjs +1 -3
  6. package/dist/adapters/drizzleExecutor.d.cts +1 -1
  7. package/dist/adapters/drizzleExecutor.d.mts +1 -1
  8. package/dist/adapters/kysely.cjs +4 -6
  9. package/dist/adapters/kysely.d.cts +3 -3
  10. package/dist/adapters/kysely.d.mts +3 -3
  11. package/dist/adapters/kysely.mjs +1 -3
  12. package/dist/adapters/kyselyExecutor.d.cts +1 -2
  13. package/dist/adapters/kyselyExecutor.d.mts +1 -2
  14. package/dist/adapters/mongodb.cjs +10 -21
  15. package/dist/adapters/mongodb.d.cts +1 -1
  16. package/dist/adapters/mongodb.d.mts +1 -1
  17. package/dist/adapters/mongodb.mjs +9 -20
  18. package/dist/adapters/mongodbAdapter.cjs +11 -11
  19. package/dist/adapters/mongodbAdapter.d.cts +1 -1
  20. package/dist/adapters/mongodbAdapter.d.mts +1 -1
  21. package/dist/adapters/mongodbAdapter.mjs +1 -1
  22. package/dist/adapters/prisma.cjs +7 -9
  23. package/dist/adapters/prisma.d.cts +1 -1
  24. package/dist/adapters/prisma.d.mts +1 -1
  25. package/dist/adapters/prisma.mjs +1 -3
  26. package/dist/adapters/prismaExecutor.cjs +2 -3
  27. package/dist/adapters/prismaExecutor.mjs +1 -2
  28. package/dist/adapters/sqlProviders.cjs +7 -2
  29. package/dist/adapters/sqlProviders.mjs +6 -1
  30. package/dist/assembly/assemblePlugins.cjs +26 -48
  31. package/dist/assembly/assemblePlugins.d.cts +2 -5
  32. package/dist/assembly/assemblePlugins.d.mts +2 -5
  33. package/dist/assembly/assemblePlugins.mjs +19 -45
  34. package/dist/assembly/clientPlugins.cjs +6 -4
  35. package/dist/assembly/clientPlugins.mjs +2 -0
  36. package/dist/assembly/configError.d.cts +1 -6
  37. package/dist/assembly/configError.d.mts +1 -6
  38. package/dist/assembly/configError.mjs +1 -6
  39. package/dist/core/api.cjs +0 -40
  40. package/dist/core/api.d.cts +5 -16
  41. package/dist/core/api.d.mts +5 -16
  42. package/dist/core/api.mjs +1 -37
  43. package/dist/core/baseCandidates.cjs +0 -43
  44. package/dist/core/baseCandidates.mjs +2 -43
  45. package/dist/core/operations.cjs +13 -12
  46. package/dist/core/operations.mjs +6 -5
  47. package/dist/core/reads.cjs +4 -4
  48. package/dist/core/reads.d.cts +2 -41
  49. package/dist/core/reads.d.mts +2 -41
  50. package/dist/core/reads.mjs +3 -3
  51. package/dist/core/releases.cjs +6 -6
  52. package/dist/core/releases.mjs +1 -1
  53. package/dist/core/writes.cjs +2 -2
  54. package/dist/core/writes.mjs +1 -1
  55. package/dist/createHotUpdaterCore.cjs +39 -39
  56. package/dist/createHotUpdaterCore.d.cts +61 -8
  57. package/dist/createHotUpdaterCore.d.mts +61 -8
  58. package/dist/createHotUpdaterCore.mjs +35 -32
  59. package/dist/db/engineDrizzleSchema.cjs +3 -4
  60. package/dist/db/engineDrizzleSchema.mjs +1 -2
  61. package/dist/db/enginePrismaSchema.cjs +4 -5
  62. package/dist/db/enginePrismaSchema.d.cts +1 -1
  63. package/dist/db/enginePrismaSchema.d.mts +1 -1
  64. package/dist/db/enginePrismaSchema.mjs +1 -2
  65. package/dist/db/releaseCatalog.cjs +6 -6
  66. package/dist/db/releaseCatalog.mjs +1 -1
  67. package/dist/db/updateArtifacts.cjs +6 -6
  68. package/dist/db/updateArtifacts.mjs +1 -1
  69. package/dist/handler.cjs +3 -4
  70. package/dist/handler.mjs +1 -1
  71. package/dist/handlerAdminRoutes.cjs +1 -2
  72. package/dist/handlerAdminRoutes.mjs +1 -2
  73. package/dist/handlerVersionRoutes.cjs +2 -2
  74. package/dist/handlerVersionRoutes.mjs +2 -2
  75. package/dist/index.cjs +9 -2
  76. package/dist/index.d.cts +4 -3
  77. package/dist/index.d.mts +4 -3
  78. package/dist/index.mjs +2 -1
  79. package/dist/node.cjs +3 -6
  80. package/dist/node.d.cts +3 -3
  81. package/dist/node.d.mts +3 -3
  82. package/dist/node.mjs +4 -4
  83. package/dist/package.cjs +1 -1
  84. package/dist/package.mjs +1 -1
  85. package/dist/plugins/api-keys/index.cjs +8 -52
  86. package/dist/plugins/api-keys/index.d.cts +1 -84
  87. package/dist/plugins/api-keys/index.d.mts +1 -84
  88. package/dist/plugins/api-keys/index.mjs +2 -49
  89. package/dist/plugins/definePlugin.d.cts +2 -200
  90. package/dist/plugins/definePlugin.d.mts +2 -200
  91. package/dist/plugins/insights/index.cjs +7 -126
  92. package/dist/plugins/insights/index.d.cts +1 -398
  93. package/dist/plugins/insights/index.d.mts +1 -398
  94. package/dist/plugins/insights/index.mjs +2 -121
  95. package/dist/plugins/official.cjs +30 -0
  96. package/dist/plugins/official.mjs +29 -0
  97. package/dist/storageAccess.cjs +13 -10
  98. package/dist/storageAccess.mjs +13 -10
  99. package/dist/types/index.d.cts +1 -1
  100. package/dist/types/index.d.mts +1 -1
  101. package/package.json +15 -37
  102. package/dist/_virtual/_rolldown/runtime.cjs +0 -23
  103. package/dist/assembly/clientPlugins.d.cts +0 -16
  104. package/dist/assembly/clientPlugins.d.mts +0 -16
  105. package/dist/assembly/configError.cjs +0 -7
  106. package/dist/assembly/databasePlugins.cjs +0 -27
  107. package/dist/assembly/databasePlugins.d.cts +0 -43
  108. package/dist/assembly/databasePlugins.d.mts +0 -43
  109. package/dist/assembly/databasePlugins.mjs +0 -26
  110. package/dist/assembly/pluginCli.cjs +0 -125
  111. package/dist/assembly/pluginCli.d.cts +0 -59
  112. package/dist/assembly/pluginCli.d.mts +0 -59
  113. package/dist/assembly/pluginCli.mjs +0 -121
  114. package/dist/core/baseCandidates.d.cts +0 -17
  115. package/dist/core/baseCandidates.d.mts +0 -17
  116. package/dist/core/schema.cjs +0 -279
  117. package/dist/core/schema.d.cts +0 -307
  118. package/dist/core/schema.d.mts +0 -307
  119. package/dist/core/schema.mjs +0 -277
  120. package/dist/database/aggregateBatching.cjs +0 -626
  121. package/dist/database/aggregateBatching.d.cts +0 -10
  122. package/dist/database/aggregateBatching.d.mts +0 -10
  123. package/dist/database/aggregateBatching.mjs +0 -625
  124. package/dist/database/busy.cjs +0 -36
  125. package/dist/database/busy.d.cts +0 -12
  126. package/dist/database/busy.d.mts +0 -12
  127. package/dist/database/busy.mjs +0 -36
  128. package/dist/database/cursor.cjs +0 -44
  129. package/dist/database/cursor.d.cts +0 -7
  130. package/dist/database/cursor.d.mts +0 -7
  131. package/dist/database/cursor.mjs +0 -40
  132. package/dist/database/database.cjs +0 -63
  133. package/dist/database/database.d.cts +0 -136
  134. package/dist/database/database.d.mts +0 -136
  135. package/dist/database/database.mjs +0 -63
  136. package/dist/database/definitions.d.cts +0 -78
  137. package/dist/database/definitions.d.mts +0 -78
  138. package/dist/database/engine.cjs +0 -37
  139. package/dist/database/engine.d.cts +0 -41
  140. package/dist/database/engine.d.mts +0 -41
  141. package/dist/database/engine.mjs +0 -37
  142. package/dist/database/engineAggregates.cjs +0 -118
  143. package/dist/database/engineAggregates.mjs +0 -115
  144. package/dist/database/engineReads.cjs +0 -182
  145. package/dist/database/engineReads.d.cts +0 -35
  146. package/dist/database/engineReads.d.mts +0 -35
  147. package/dist/database/engineReads.mjs +0 -181
  148. package/dist/database/engineTransaction.cjs +0 -399
  149. package/dist/database/engineTransaction.d.cts +0 -26
  150. package/dist/database/engineTransaction.d.mts +0 -26
  151. package/dist/database/engineTransaction.mjs +0 -398
  152. package/dist/database/errors.cjs +0 -27
  153. package/dist/database/errors.d.cts +0 -21
  154. package/dist/database/errors.d.mts +0 -21
  155. package/dist/database/errors.mjs +0 -24
  156. package/dist/database/fence.cjs +0 -125
  157. package/dist/database/fence.d.cts +0 -42
  158. package/dist/database/fence.d.mts +0 -42
  159. package/dist/database/fence.mjs +0 -117
  160. package/dist/database/index.cjs +0 -136
  161. package/dist/database/index.d.cts +0 -18
  162. package/dist/database/index.d.mts +0 -18
  163. package/dist/database/index.mjs +0 -16
  164. package/dist/database/kv/kvAdapter.cjs +0 -285
  165. package/dist/database/kv/kvAdapter.d.cts +0 -109
  166. package/dist/database/kv/kvAdapter.d.mts +0 -109
  167. package/dist/database/kv/kvAdapter.mjs +0 -284
  168. package/dist/database/resolveSchema.cjs +0 -199
  169. package/dist/database/resolveSchema.d.cts +0 -42
  170. package/dist/database/resolveSchema.d.mts +0 -42
  171. package/dist/database/resolveSchema.mjs +0 -196
  172. package/dist/database/retention.cjs +0 -92
  173. package/dist/database/retention.mjs +0 -90
  174. package/dist/database/schema.cjs +0 -24
  175. package/dist/database/schema.d.cts +0 -90
  176. package/dist/database/schema.d.mts +0 -90
  177. package/dist/database/schema.mjs +0 -23
  178. package/dist/database/sql/sqlAdapter.cjs +0 -290
  179. package/dist/database/sql/sqlAdapter.d.cts +0 -46
  180. package/dist/database/sql/sqlAdapter.d.mts +0 -46
  181. package/dist/database/sql/sqlAdapter.mjs +0 -287
  182. package/dist/database/sql/sqlSchema.cjs +0 -171
  183. package/dist/database/sql/sqlSchema.d.cts +0 -8
  184. package/dist/database/sql/sqlSchema.d.mts +0 -8
  185. package/dist/database/sql/sqlSchema.mjs +0 -165
  186. package/dist/db/coreDatabase.cjs +0 -85
  187. package/dist/db/coreDatabase.d.cts +0 -57
  188. package/dist/db/coreDatabase.d.mts +0 -57
  189. package/dist/db/coreDatabase.mjs +0 -78
  190. package/dist/db/createBundleDiff.cjs +0 -144
  191. package/dist/db/createBundleDiff.d.cts +0 -17
  192. package/dist/db/createBundleDiff.d.mts +0 -17
  193. package/dist/db/createBundleDiff.mjs +0 -141
  194. package/dist/db/engineMigrator.cjs +0 -53
  195. package/dist/db/engineMigrator.mjs +0 -53
  196. package/dist/db/engineSql.cjs +0 -26
  197. package/dist/db/engineSql.d.cts +0 -17
  198. package/dist/db/engineSql.d.mts +0 -17
  199. package/dist/db/engineSql.mjs +0 -25
  200. package/dist/db/engineSqlMigrator.cjs +0 -66
  201. package/dist/db/engineSqlMigrator.mjs +0 -66
  202. package/dist/db/fixedMigratorShared.cjs +0 -12
  203. package/dist/db/fixedMigratorShared.mjs +0 -11
  204. package/dist/db/index.cjs +0 -50
  205. package/dist/db/index.d.cts +0 -23
  206. package/dist/db/index.d.mts +0 -23
  207. package/dist/db/index.mjs +0 -33
  208. package/dist/db/releaseCatalog.d.cts +0 -16
  209. package/dist/db/releaseCatalog.d.mts +0 -16
  210. package/dist/db/schemaSettings.cjs +0 -63
  211. package/dist/db/schemaSettings.d.cts +0 -12
  212. package/dist/db/schemaSettings.d.mts +0 -12
  213. package/dist/db/schemaSettings.mjs +0 -62
  214. package/dist/db/settingsMigrator.cjs +0 -92
  215. package/dist/db/settingsMigrator.mjs +0 -89
  216. package/dist/db/types.cjs +0 -11
  217. package/dist/db/types.d.cts +0 -78
  218. package/dist/db/types.d.mts +0 -78
  219. package/dist/db/types.mjs +0 -10
  220. package/dist/diff.cjs +0 -3
  221. package/dist/diff.d.cts +0 -2
  222. package/dist/diff.d.mts +0 -2
  223. package/dist/diff.mjs +0 -2
  224. package/dist/plugins/api-keys/apiKeys.cjs +0 -139
  225. package/dist/plugins/api-keys/apiKeys.d.cts +0 -27
  226. package/dist/plugins/api-keys/apiKeys.d.mts +0 -27
  227. package/dist/plugins/api-keys/apiKeys.mjs +0 -129
  228. package/dist/plugins/api-keys/cli.cjs +0 -115
  229. package/dist/plugins/api-keys/cli.mjs +0 -114
  230. package/dist/plugins/api-keys/model.cjs +0 -58
  231. package/dist/plugins/api-keys/model.d.cts +0 -26
  232. package/dist/plugins/api-keys/model.d.mts +0 -26
  233. package/dist/plugins/api-keys/model.mjs +0 -58
  234. package/dist/plugins/api-keys/schema.cjs +0 -38
  235. package/dist/plugins/api-keys/schema.d.cts +0 -44
  236. package/dist/plugins/api-keys/schema.d.mts +0 -44
  237. package/dist/plugins/api-keys/schema.mjs +0 -39
  238. package/dist/plugins/definePlugin.cjs +0 -5
  239. package/dist/plugins/definePlugin.mjs +0 -5
  240. package/dist/plugins/index.cjs +0 -38
  241. package/dist/plugins/index.d.cts +0 -12
  242. package/dist/plugins/index.d.mts +0 -12
  243. package/dist/plugins/index.mjs +0 -9
  244. package/dist/plugins/insights/contract.cjs +0 -193
  245. package/dist/plugins/insights/contract.mjs +0 -189
  246. package/dist/plugins/insights/domain.d.cts +0 -149
  247. package/dist/plugins/insights/domain.d.mts +0 -149
  248. package/dist/plugins/insights/errors.cjs +0 -15
  249. package/dist/plugins/insights/errors.mjs +0 -14
  250. package/dist/plugins/insights/eventInput.cjs +0 -284
  251. package/dist/plugins/insights/eventInput.mjs +0 -282
  252. package/dist/plugins/insights/eventRow.cjs +0 -49
  253. package/dist/plugins/insights/eventRow.d.cts +0 -64
  254. package/dist/plugins/insights/eventRow.d.mts +0 -64
  255. package/dist/plugins/insights/eventRow.mjs +0 -47
  256. package/dist/plugins/insights/model.cjs +0 -17
  257. package/dist/plugins/insights/model.d.cts +0 -10
  258. package/dist/plugins/insights/model.d.mts +0 -10
  259. package/dist/plugins/insights/model.mjs +0 -17
  260. package/dist/plugins/insights/modelTypes.d.cts +0 -176
  261. package/dist/plugins/insights/modelTypes.d.mts +0 -176
  262. package/dist/plugins/insights/overview.cjs +0 -109
  263. package/dist/plugins/insights/overview.d.cts +0 -15
  264. package/dist/plugins/insights/overview.d.mts +0 -15
  265. package/dist/plugins/insights/overview.mjs +0 -107
  266. package/dist/plugins/insights/provider.cjs +0 -375
  267. package/dist/plugins/insights/provider.d.cts +0 -6
  268. package/dist/plugins/insights/provider.d.mts +0 -6
  269. package/dist/plugins/insights/provider.mjs +0 -374
  270. package/dist/plugins/insights/queryInput.cjs +0 -93
  271. package/dist/plugins/insights/queryInput.mjs +0 -91
  272. package/dist/plugins/insights/reads.cjs +0 -681
  273. package/dist/plugins/insights/reads.d.cts +0 -61
  274. package/dist/plugins/insights/reads.d.mts +0 -61
  275. package/dist/plugins/insights/reads.mjs +0 -674
  276. package/dist/plugins/insights/recordEvent.cjs +0 -319
  277. package/dist/plugins/insights/recordEvent.d.cts +0 -18
  278. package/dist/plugins/insights/recordEvent.d.mts +0 -18
  279. package/dist/plugins/insights/recordEvent.mjs +0 -316
  280. package/dist/plugins/insights/routes.cjs +0 -96
  281. package/dist/plugins/insights/routes.mjs +0 -95
  282. package/dist/plugins/insights/schema.cjs +0 -489
  283. package/dist/plugins/insights/schema.d.cts +0 -698
  284. package/dist/plugins/insights/schema.d.mts +0 -698
  285. package/dist/plugins/insights/schema.mjs +0 -483
  286. package/dist/plugins/insights/testing/eventRow.d.mts +0 -64
  287. package/dist/plugins/insights/testing/expectInsightsIndex.mjs +0 -18
  288. package/dist/plugins/insights/testing/fixtures.d.mts +0 -8
  289. package/dist/plugins/insights/testing/fixtures.mjs +0 -25
  290. package/dist/plugins/insights/testing/index.d.mts +0 -24
  291. package/dist/plugins/insights/testing/index.mjs +0 -25
  292. package/dist/plugins/insights/testing/insightsModelTests.mjs +0 -714
  293. package/dist/plugins/insights/testing/modelTypes.d.mts +0 -176
  294. package/dist/plugins/insights/testing/setupInsightsHttpTestSuite.d.mts +0 -11
  295. package/dist/plugins/insights/testing/setupInsightsHttpTestSuite.mjs +0 -107
  296. package/dist/plugins/insights/testing/setupInsightsModelTestSuite.d.mts +0 -11
  297. package/dist/plugins/insights/testing/setupInsightsModelTestSuite.mjs +0 -31
  298. package/dist/plugins/insights/testing/types.d.mts +0 -26
  299. package/dist/plugins/insights/types.d.cts +0 -33
  300. package/dist/plugins/insights/types.d.mts +0 -33
  301. package/src/adapters/drizzle.conformance.integration.spec.ts +0 -34
  302. package/src/adapters/drizzle.readBudgets.integration.spec.ts +0 -43
  303. package/src/adapters/drizzle.spec.ts +0 -314
  304. package/src/adapters/drizzle.ts +0 -64
  305. package/src/adapters/drizzleExecutor.ts +0 -166
  306. package/src/adapters/kysely.conformance.integration.spec.ts +0 -36
  307. package/src/adapters/kysely.readBudgets.integration.spec.ts +0 -44
  308. package/src/adapters/kysely.spec.ts +0 -244
  309. package/src/adapters/kysely.ts +0 -46
  310. package/src/adapters/kyselyExecutor.ts +0 -53
  311. package/src/adapters/mongodb.integration.spec.ts +0 -271
  312. package/src/adapters/mongodb.readBudgets.integration.spec.ts +0 -61
  313. package/src/adapters/mongodb.ts +0 -45
  314. package/src/adapters/mongodbAdapter.ts +0 -307
  315. package/src/adapters/prisma.conformance.integration.spec.ts +0 -36
  316. package/src/adapters/prisma.integration.spec.ts +0 -146
  317. package/src/adapters/prisma.readBudgets.integration.spec.ts +0 -43
  318. package/src/adapters/prisma.spec.ts +0 -257
  319. package/src/adapters/prisma.ts +0 -74
  320. package/src/adapters/prismaExecutor.ts +0 -107
  321. package/src/adapters/prismaTestClients.ts +0 -182
  322. package/src/adapters/sqlProviders.ts +0 -14
  323. package/src/assembly/assemblePlugins.ts +0 -302
  324. package/src/assembly/assembly.spec.ts +0 -377
  325. package/src/assembly/assembly.types.spec.ts +0 -203
  326. package/src/assembly/clientPlugins.ts +0 -113
  327. package/src/assembly/configError.ts +0 -4
  328. package/src/assembly/databasePlugins.spec.ts +0 -71
  329. package/src/assembly/databasePlugins.ts +0 -102
  330. package/src/assembly/pluginCli.spec.ts +0 -254
  331. package/src/assembly/pluginCli.ts +0 -248
  332. package/src/assembly/pluginRoutes.spec.ts +0 -186
  333. package/src/core/api.ts +0 -139
  334. package/src/core/baseCandidates.spec.ts +0 -378
  335. package/src/core/baseCandidates.ts +0 -136
  336. package/src/core/index.ts +0 -44
  337. package/src/core/operations.spec.ts +0 -415
  338. package/src/core/operations.ts +0 -551
  339. package/src/core/reads.spec.ts +0 -300
  340. package/src/core/reads.ts +0 -417
  341. package/src/core/releases.spec.ts +0 -308
  342. package/src/core/releases.ts +0 -345
  343. package/src/core/schema.ts +0 -173
  344. package/src/core/writes.ts +0 -160
  345. package/src/createHotUpdaterCore.ts +0 -260
  346. package/src/database/aggregateBatching.spec.ts +0 -577
  347. package/src/database/aggregateBatching.ts +0 -803
  348. package/src/database/busy.spec.ts +0 -45
  349. package/src/database/busy.ts +0 -50
  350. package/src/database/cursor.ts +0 -65
  351. package/src/database/database.ts +0 -366
  352. package/src/database/database.types.spec.ts +0 -135
  353. package/src/database/definitions.ts +0 -76
  354. package/src/database/engine.ts +0 -62
  355. package/src/database/engineAggregates.spec.ts +0 -536
  356. package/src/database/engineAggregates.ts +0 -189
  357. package/src/database/engineReads.spec.ts +0 -219
  358. package/src/database/engineReads.ts +0 -304
  359. package/src/database/engineTransaction.spec.ts +0 -710
  360. package/src/database/engineTransaction.ts +0 -582
  361. package/src/database/errors.ts +0 -30
  362. package/src/database/fence.spec.ts +0 -223
  363. package/src/database/fence.ts +0 -175
  364. package/src/database/index.ts +0 -160
  365. package/src/database/kv/kvAdapter.batching.integration.spec.ts +0 -15
  366. package/src/database/kv/kvAdapter.conformance.integration.spec.ts +0 -19
  367. package/src/database/kv/kvAdapter.readBudgets.integration.spec.ts +0 -17
  368. package/src/database/kv/kvAdapter.spec.ts +0 -595
  369. package/src/database/kv/kvAdapter.ts +0 -479
  370. package/src/database/kv/kvTestStore.ts +0 -118
  371. package/src/database/memory.readBudgets.integration.spec.ts +0 -13
  372. package/src/database/resolveSchema.spec.ts +0 -230
  373. package/src/database/resolveSchema.ts +0 -375
  374. package/src/database/retention.spec.ts +0 -314
  375. package/src/database/retention.ts +0 -129
  376. package/src/database/schema.ts +0 -213
  377. package/src/database/schema.types.spec.ts +0 -94
  378. package/src/database/sql/docker-compose.yml +0 -36
  379. package/src/database/sql/sqlAdapter.integration.spec.ts +0 -145
  380. package/src/database/sql/sqlAdapter.readBudgets.integration.spec.ts +0 -123
  381. package/src/database/sql/sqlAdapter.spec.ts +0 -343
  382. package/src/database/sql/sqlAdapter.ts +0 -552
  383. package/src/database/sql/sqlSchema.ts +0 -286
  384. package/src/database/sql/sqlTestExecutors.ts +0 -183
  385. package/src/databaseTestSuite.spec.ts +0 -44
  386. package/src/db/bundleRows.spec.ts +0 -164
  387. package/src/db/bundleRows.ts +0 -10
  388. package/src/db/coreDatabase.ts +0 -153
  389. package/src/db/createBundleDiff.spec.ts +0 -464
  390. package/src/db/createBundleDiff.ts +0 -370
  391. package/src/db/engineDrizzleSchema.ts +0 -72
  392. package/src/db/engineMigrator.ts +0 -105
  393. package/src/db/enginePrismaSchema.ts +0 -147
  394. package/src/db/engineSql.spec.ts +0 -130
  395. package/src/db/engineSql.ts +0 -48
  396. package/src/db/engineSqlMigrator.ts +0 -116
  397. package/src/db/fixedMigratorShared.ts +0 -17
  398. package/src/db/index.spec.ts +0 -554
  399. package/src/db/index.ts +0 -93
  400. package/src/db/node-sqlite.d.ts +0 -25
  401. package/src/db/pluginTables.spec.ts +0 -248
  402. package/src/db/releaseCatalog.ts +0 -106
  403. package/src/db/schemaSettings.ts +0 -104
  404. package/src/db/settingsMigrator.spec.ts +0 -65
  405. package/src/db/settingsMigrator.ts +0 -152
  406. package/src/db/types.ts +0 -82
  407. package/src/db/updateArtifacts.spec.ts +0 -235
  408. package/src/db/updateArtifacts.ts +0 -473
  409. package/src/db/updateCheck.bench.ts +0 -47
  410. package/src/diff.ts +0 -6
  411. package/src/handler-standalone.integration.spec.ts +0 -321
  412. package/src/handler.spec.ts +0 -273
  413. package/src/handler.testFixtures.ts +0 -25
  414. package/src/handler.ts +0 -302
  415. package/src/handlerAdminRoutes.spec.ts +0 -183
  416. package/src/handlerAdminRoutes.ts +0 -536
  417. package/src/handlerAuth.integration.spec.ts +0 -33
  418. package/src/handlerErrors.ts +0 -7
  419. package/src/handlerManagement.spec.ts +0 -202
  420. package/src/handlerParameters.ts +0 -105
  421. package/src/handlerReleaseCatalogRoutes.ts +0 -176
  422. package/src/handlerTypes.ts +0 -19
  423. package/src/handlerVersionRoutes.ts +0 -25
  424. package/src/index.ts +0 -13
  425. package/src/internalRouter.ts +0 -104
  426. package/src/lintRules.spec.ts +0 -76
  427. package/src/node.spec.ts +0 -119
  428. package/src/node.ts +0 -111
  429. package/src/plugins/api-keys/apiKeys.integration.spec.ts +0 -92
  430. package/src/plugins/api-keys/apiKeys.spec.ts +0 -166
  431. package/src/plugins/api-keys/apiKeys.ts +0 -214
  432. package/src/plugins/api-keys/apiKeysPlugin.spec.ts +0 -168
  433. package/src/plugins/api-keys/cli.spec.ts +0 -187
  434. package/src/plugins/api-keys/cli.ts +0 -140
  435. package/src/plugins/api-keys/index.ts +0 -73
  436. package/src/plugins/api-keys/model.ts +0 -88
  437. package/src/plugins/api-keys/schema.ts +0 -22
  438. package/src/plugins/definePlugin.ts +0 -242
  439. package/src/plugins/index.ts +0 -73
  440. package/src/plugins/insights/contract.spec.ts +0 -285
  441. package/src/plugins/insights/contract.ts +0 -372
  442. package/src/plugins/insights/domain.ts +0 -176
  443. package/src/plugins/insights/errors.ts +0 -11
  444. package/src/plugins/insights/eventInput.ts +0 -381
  445. package/src/plugins/insights/eventRow.ts +0 -209
  446. package/src/plugins/insights/index.ts +0 -222
  447. package/src/plugins/insights/insights.integration.spec.ts +0 -921
  448. package/src/plugins/insights/insightsRollout.integration.spec.ts +0 -186
  449. package/src/plugins/insights/model.spec.ts +0 -64
  450. package/src/plugins/insights/model.ts +0 -18
  451. package/src/plugins/insights/modelTypes.ts +0 -197
  452. package/src/plugins/insights/overview.spec.ts +0 -64
  453. package/src/plugins/insights/overview.ts +0 -214
  454. package/src/plugins/insights/provider.spec.ts +0 -585
  455. package/src/plugins/insights/provider.ts +0 -704
  456. package/src/plugins/insights/queryInput.ts +0 -142
  457. package/src/plugins/insights/reads.spec.ts +0 -1013
  458. package/src/plugins/insights/reads.ts +0 -1037
  459. package/src/plugins/insights/recordEvent.spec.ts +0 -897
  460. package/src/plugins/insights/recordEvent.ts +0 -476
  461. package/src/plugins/insights/retention.spec.ts +0 -115
  462. package/src/plugins/insights/routes.ts +0 -149
  463. package/src/plugins/insights/schema.ts +0 -409
  464. package/src/plugins/insights/testing/expectInsightsIndex.spec.ts +0 -42
  465. package/src/plugins/insights/testing/expectInsightsIndex.ts +0 -20
  466. package/src/plugins/insights/testing/fixtures.ts +0 -30
  467. package/src/plugins/insights/testing/index.ts +0 -45
  468. package/src/plugins/insights/testing/insightsModelTests.ts +0 -860
  469. package/src/plugins/insights/testing/setupInsightsHttpTestSuite.ts +0 -152
  470. package/src/plugins/insights/testing/setupInsightsModelTestSuite.ts +0 -36
  471. package/src/plugins/insights/testing/types.ts +0 -30
  472. package/src/plugins/insights/types.ts +0 -55
  473. package/src/plugins/pluginTestHarness.spec.ts +0 -56
  474. package/src/readBudgets.testFixtures.ts +0 -15
  475. package/src/releaseCatalogRoutes.integration.spec.ts +0 -200
  476. package/src/retention.spec.ts +0 -73
  477. package/src/runtime.spec.ts +0 -207
  478. package/src/runtime.testFixtures.ts +0 -60
  479. package/src/runtimeBundles.integration.spec.ts +0 -112
  480. package/src/storageAccess.spec.ts +0 -152
  481. package/src/storageAccess.ts +0 -141
  482. package/src/testUtilsMutation.integration.spec.ts +0 -216
  483. package/src/testUtilsPackage.integration.spec.ts +0 -180
  484. package/src/types/index.ts +0 -2
  485. package/src/version.ts +0 -3
@@ -1,47 +1,6 @@
1
1
  import { parseCompiledCatalog } from "../db/releaseCatalog.mjs";
2
- import { createReleaseCatalogScopeKey, encodeChannelKey, parseReleaseCatalogScopeKey } from "@hot-updater/core";
3
- import { normalizeRange, rangesIntersect } from "verkit";
2
+ import { rangesIntersect } from "verkit";
4
3
  //#region src/core/baseCandidates.ts
5
- /**
6
- * A new bundle's base-candidate key: the Release Catalog scope its devices
7
- * update from, and for an app version its normalized range; null for a
8
- * target without a valid range.
9
- */
10
- const targetBaseCandidateKey = (target) => {
11
- const channelKey = encodeChannelKey(target.channel);
12
- if (target.fingerprintHash) return JSON.stringify([createReleaseCatalogScopeKey({
13
- channelKey,
14
- fingerprintHash: target.fingerprintHash,
15
- platform: target.platform,
16
- strategy: "FINGERPRINT"
17
- })]);
18
- const range = target.appVersion === null ? null : normalizeRange(target.appVersion);
19
- return range === null ? null : JSON.stringify([createReleaseCatalogScopeKey({
20
- channelKey,
21
- platform: target.platform,
22
- strategy: "APP_VERSION"
23
- }), range]);
24
- };
25
- /** The scope and range a base-candidate key names; null for any other string. */
26
- const parseBaseCandidateKey = (key) => {
27
- try {
28
- const parsed = JSON.parse(key);
29
- if (!Array.isArray(parsed) || typeof parsed[0] !== "string") return null;
30
- const [scopeKey, text] = parsed;
31
- const { strategy } = parseReleaseCatalogScopeKey(scopeKey);
32
- if (strategy === "FINGERPRINT") return parsed.length === 1 ? {
33
- scopeKey,
34
- range: null
35
- } : null;
36
- const range = parsed.length === 2 && typeof text === "string" ? normalizeRange(text) : null;
37
- return range === null ? null : {
38
- scopeKey,
39
- range
40
- };
41
- } catch {
42
- return null;
43
- }
44
- };
45
4
  /** A compiled segment as a range: its version when it holds exactly one. */
46
5
  const segmentRange = ({ lower, upper }) => lower?.inclusive && upper?.inclusive && lower.version === upper.version ? lower.version : [lower === null ? "" : `${lower.inclusive ? ">=" : ">"}${lower.version}`, upper === null ? "" : `${upper.inclusive ? "<=" : "<"}${upper.version}`].join(" ").trim() || "*";
47
6
  /**
@@ -66,4 +25,4 @@ const baseBundleIdsOf = (row, range, bundleId, limit) => {
66
25
  return ids;
67
26
  };
68
27
  //#endregion
69
- export { baseBundleIdsOf, parseBaseCandidateKey, targetBaseCandidateKey };
28
+ export { baseBundleIdsOf };
@@ -1,10 +1,8 @@
1
- const require_errors = require("../database/errors.cjs");
2
1
  const require_reads = require("./reads.cjs");
3
2
  const require_writes = require("./writes.cjs");
4
3
  const require_releases = require("./releases.cjs");
5
4
  let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
6
- let _hot_updater_plugin_core_internal = require("@hot-updater/plugin-core/internal");
7
- let _hot_updater_core = require("@hot-updater/core");
5
+ let _hot_updater_protocol = require("@hot-updater/protocol");
8
6
  //#region src/core/operations.ts
9
7
  /** Carries a preflight's result out of the transaction it stops, so nothing is written. */
10
8
  var Preflight = class extends Error {
@@ -27,13 +25,13 @@ const dryRun = async (db, read) => {
27
25
  };
28
26
  /** A channel's catalog scope for a platform, and a fingerprint when it has one. */
29
27
  const scopeOf = (channel, platform, fingerprintHash) => {
30
- const channelKey = (0, _hot_updater_core.encodeChannelKey)(channel.name);
28
+ const channelKey = (0, _hot_updater_protocol.encodeChannelKey)(channel.name);
31
29
  return fingerprintHash === null ? {
32
30
  channelId: channel.id,
33
31
  channelName: channel.name,
34
32
  fingerprintHash,
35
33
  platform,
36
- scopeKey: (0, _hot_updater_core.createReleaseCatalogScopeKey)({
34
+ scopeKey: (0, _hot_updater_protocol.createReleaseCatalogScopeKey)({
37
35
  channelKey,
38
36
  platform,
39
37
  strategy: "APP_VERSION"
@@ -44,7 +42,7 @@ const scopeOf = (channel, platform, fingerprintHash) => {
44
42
  channelName: channel.name,
45
43
  fingerprintHash,
46
44
  platform,
47
- scopeKey: (0, _hot_updater_core.createReleaseCatalogScopeKey)({
45
+ scopeKey: (0, _hot_updater_protocol.createReleaseCatalogScopeKey)({
48
46
  channelKey,
49
47
  fingerprintHash,
50
48
  platform,
@@ -65,7 +63,7 @@ const loadTarget = async (tx, { releaseId, expectedRevision }) => {
65
63
  release,
66
64
  scope: {
67
65
  channelId: release.channel_id,
68
- channelName: (0, _hot_updater_core.decodeChannelKey)(catalog.channel_key),
66
+ channelName: (0, _hot_updater_protocol.decodeChannelKey)(catalog.channel_key),
69
67
  fingerprintHash: release.fingerprint_hash,
70
68
  platform: release.platform,
71
69
  scopeKey: release.scope_key,
@@ -96,7 +94,7 @@ const catalogScope = async (tx, scopeKey) => {
96
94
  if (row === null) throw new Error(`Release catalog "${scopeKey}" was not found.`);
97
95
  return {
98
96
  channelId: row.channel_id,
99
- channelName: (0, _hot_updater_core.decodeChannelKey)(row.channel_key),
97
+ channelName: (0, _hot_updater_protocol.decodeChannelKey)(row.channel_key),
100
98
  fingerprintHash: row.fingerprint_hash,
101
99
  platform: row.platform,
102
100
  scopeKey: row.scope_key,
@@ -110,7 +108,7 @@ const catalogScope = async (tx, scopeKey) => {
110
108
  */
111
109
  const createCoreOperations = (db, { now = Date.now } = {}) => {
112
110
  const ensureChannel = async (name) => (await require_writes.insertChannel(db, {
113
- id: `channel:${(0, _hot_updater_core.encodeChannelKey)(name)}`,
111
+ id: `channel:${(0, _hot_updater_protocol.encodeChannelKey)(name)}`,
114
112
  name
115
113
  })).row;
116
114
  /**
@@ -121,7 +119,7 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
121
119
  for (let attempt = 1;; attempt += 1) try {
122
120
  return await write();
123
121
  } catch (error) {
124
- if (attempt < 3 && error instanceof require_errors.DatabaseConstraintError && error.reason === "not_found" && error.model === "channels") continue;
122
+ if (attempt < 3 && error instanceof _hot_updater_plugin_core.DatabaseConstraintError && error.reason === "not_found" && error.model === "channels") continue;
125
123
  throw error;
126
124
  }
127
125
  };
@@ -218,7 +216,8 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
218
216
  deleteRelease: (input) => db.transaction(async (tx) => {
219
217
  const { release, scope } = await loadTarget(tx, input);
220
218
  if (release.enabled) throw new _hot_updater_plugin_core.ReleaseManagementError("ENABLED_RELEASE", `Disable Release "${release.id}" before hard deletion.`);
221
- return mutationResult(await require_releases.changeRelease(tx, {
219
+ const bundle = release.bundle_id === null ? null : await tx.findOne("bundles", { id: release.bundle_id });
220
+ const result = mutationResult(await require_releases.changeRelease(tx, {
222
221
  scope,
223
222
  change: {
224
223
  operation: "delete",
@@ -226,6 +225,8 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
226
225
  },
227
226
  updatedAtMs: now()
228
227
  }));
228
+ if (bundle !== null && (bundle._refs_releases_bundle_id ?? 0) <= 1) await require_writes.deleteBundle(tx, bundle);
229
+ return result;
229
230
  }),
230
231
  promoteRelease: (input) => withChannels(async () => {
231
232
  const checkSource = (source) => {
@@ -340,7 +341,7 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
340
341
  }
341
342
  });
342
343
  } catch (error) {
343
- if (error instanceof require_errors.DatabaseConstraintError && error.reason === "referenced") throw new _hot_updater_plugin_core_internal.DatabaseRowReferencedError();
344
+ if (error instanceof _hot_updater_plugin_core.DatabaseConstraintError && error.reason === "referenced") throw new _hot_updater_plugin_core.DatabaseRowReferencedError();
344
345
  throw error;
345
346
  }
346
347
  }
@@ -1,10 +1,8 @@
1
- import { DatabaseConstraintError } from "../database/errors.mjs";
2
1
  import { toBundleRow, toReleaseRow } from "./reads.mjs";
3
2
  import { deleteBundle, deleteChannel, insertChannel, replaceBundlePatches, updateBundle } from "./writes.mjs";
4
3
  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";
4
+ import { DatabaseBundleNotFoundError, DatabaseConstraintError, DatabaseRowReferencedError, ReleaseCatalogMutationError, ReleaseManagementError, bundleToPatchRows, bundleToRow, createUUIDv7After, isUUIDv7, rowToBundle } from "@hot-updater/plugin-core";
5
+ import { createReleaseCatalogScopeKey, decodeChannelKey, encodeChannelKey } from "@hot-updater/protocol";
8
6
  //#region src/core/operations.ts
9
7
  /** Carries a preflight's result out of the transaction it stops, so nothing is written. */
10
8
  var Preflight = class extends Error {
@@ -218,7 +216,8 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
218
216
  deleteRelease: (input) => db.transaction(async (tx) => {
219
217
  const { release, scope } = await loadTarget(tx, input);
220
218
  if (release.enabled) throw new ReleaseManagementError("ENABLED_RELEASE", `Disable Release "${release.id}" before hard deletion.`);
221
- return mutationResult(await changeRelease(tx, {
219
+ const bundle = release.bundle_id === null ? null : await tx.findOne("bundles", { id: release.bundle_id });
220
+ const result = mutationResult(await changeRelease(tx, {
222
221
  scope,
223
222
  change: {
224
223
  operation: "delete",
@@ -226,6 +225,8 @@ const createCoreOperations = (db, { now = Date.now } = {}) => {
226
225
  },
227
226
  updatedAtMs: now()
228
227
  }));
228
+ if (bundle !== null && (bundle._refs_releases_bundle_id ?? 0) <= 1) await deleteBundle(tx, bundle);
229
+ return result;
229
230
  }),
230
231
  promoteRelease: (input) => withChannels(async () => {
231
232
  const checkSource = (source) => {
@@ -2,7 +2,7 @@ const require_releaseCatalog = require("../db/releaseCatalog.cjs");
2
2
  const require_updateArtifacts = require("../db/updateArtifacts.cjs");
3
3
  const require_baseCandidates = require("./baseCandidates.cjs");
4
4
  let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
5
- let _hot_updater_core = require("@hot-updater/core");
5
+ let _hot_updater_protocol = require("@hot-updater/protocol");
6
6
  //#region src/core/reads.ts
7
7
  const PAGE = 500;
8
8
  const pick = (fields) => (row) => Object.fromEntries(fields.map((field) => [field, row[field]]));
@@ -108,8 +108,8 @@ const createCoreReads = (db, storage) => {
108
108
  /** Artifact resolution: one batch read of both bundles and one unique read of their patch. */
109
109
  async getArtifactInfo(targetBundleId, currentBundleId, artifactProtocolVersion) {
110
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;
111
+ if (artifactProtocolVersion !== _hot_updater_protocol.ARTIFACT_PROTOCOL_VERSION || readStorageText === void 0) return null;
112
+ const withCurrent = currentBundleId !== _hot_updater_protocol.NIL_UUID;
113
113
  const [[target, current], patch] = await Promise.all([db.findByKeys("bundles", withCurrent ? [{ id: targetBundleId }, { id: currentBundleId }] : [{ id: targetBundleId }]), withCurrent ? db.findOne("bundle_patches", {
114
114
  bundle_id: targetBundleId,
115
115
  base_bundle_id: currentBundleId
@@ -172,7 +172,7 @@ const createCoreReads = (db, storage) => {
172
172
  },
173
173
  /** Auto-patch bases for a new bundle: one point read of its scope's catalog. */
174
174
  async findBaseBundleIds(candidateKey, bundleId, limit) {
175
- const query = require_baseCandidates.parseBaseCandidateKey(candidateKey);
175
+ const query = (0, _hot_updater_plugin_core.parseBaseCandidateKey)(candidateKey);
176
176
  if (query === null) return [];
177
177
  const row = await db.findOne("release_catalogs", { scope_key: query.scopeKey });
178
178
  return row === null ? [] : require_baseCandidates.baseBundleIdsOf(toCatalogRow(row), query.range, bundleId, limit);
@@ -1,48 +1,9 @@
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";
1
+ import { CoreSchema, HotUpdaterDatabase } from "@hot-updater/plugin-core";
7
2
  //#region src/core/reads.d.ts
8
3
  type CoreDatabase = HotUpdaterDatabase<CoreSchema>;
9
4
  interface CoreStorage {
10
5
  readonly readStorageText?: (storageUri: string) => Promise<string | null>;
11
6
  readonly resolveFileUrl: (storageUri: string | null) => Promise<string | null>;
12
7
  }
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
8
  //#endregion
48
- export { type BundleDetail, CoreDatabase, CoreReads, CoreStorage, type KeysetInput, type ReleaseFilter, createCoreReads };
9
+ export { CoreDatabase, CoreStorage };
@@ -1,48 +1,9 @@
1
- import "../database/engineReads.mjs";
2
- import { HotUpdaterDatabase } from "../database/database.mjs";
3
- import { ReleaseCatalogRequest } from "../db/releaseCatalog.mjs";
4
- import { CoreSchema } from "./schema.mjs";
5
- import { BundleDetail, BundlePatchRow, ChannelRow, KeysetInput, ReleaseCatalogRow, ReleaseFilter, ReleaseRow } from "@hot-updater/plugin-core";
6
- import { ArtifactInfo, ReleaseCatalog } from "@hot-updater/core";
1
+ import { CoreSchema, HotUpdaterDatabase } from "@hot-updater/plugin-core";
7
2
  //#region src/core/reads.d.ts
8
3
  type CoreDatabase = HotUpdaterDatabase<CoreSchema>;
9
4
  interface CoreStorage {
10
5
  readonly readStorageText?: (storageUri: string) => Promise<string | null>;
11
6
  readonly resolveFileUrl: (storageUri: string | null) => Promise<string | null>;
12
7
  }
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
8
  //#endregion
48
- export { type BundleDetail, CoreDatabase, CoreReads, CoreStorage, type KeysetInput, type ReleaseFilter, createCoreReads };
9
+ export { CoreDatabase, CoreStorage };
@@ -1,8 +1,8 @@
1
1
  import { projectReleaseCatalogRow, releaseCatalogScopeKeyOf } from "../db/releaseCatalog.mjs";
2
2
  import { resolveManifestArtifacts } from "../db/updateArtifacts.mjs";
3
- import { baseBundleIdsOf, parseBaseCandidateKey } from "./baseCandidates.mjs";
4
- import { rowToBundle } from "@hot-updater/plugin-core";
5
- import { ARTIFACT_PROTOCOL_VERSION, NIL_UUID } from "@hot-updater/core";
3
+ import { baseBundleIdsOf } from "./baseCandidates.mjs";
4
+ import { parseBaseCandidateKey, rowToBundle } from "@hot-updater/plugin-core";
5
+ import { ARTIFACT_PROTOCOL_VERSION, NIL_UUID } from "@hot-updater/protocol";
6
6
  //#region src/core/reads.ts
7
7
  const PAGE = 500;
8
8
  const pick = (fields) => (row) => Object.fromEntries(fields.map((field) => [field, row[field]]));
@@ -1,19 +1,19 @@
1
1
  const require_reads = require("./reads.cjs");
2
2
  const require_writes = require("./writes.cjs");
3
3
  let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
4
- let _hot_updater_core = require("@hot-updater/core");
4
+ let _hot_updater_protocol = require("@hot-updater/protocol");
5
5
  //#region src/core/releases.ts
6
6
  const PAGE = 500;
7
7
  const fail = (code, message) => {
8
8
  throw new _hot_updater_plugin_core.ReleaseCatalogMutationError(code, message);
9
9
  };
10
10
  const checkScope = (scope) => {
11
- const channelKey = (0, _hot_updater_core.encodeChannelKey)(scope.channelName);
12
- const expected = scope.strategy === "APP_VERSION" ? (0, _hot_updater_core.createReleaseCatalogScopeKey)({
11
+ const channelKey = (0, _hot_updater_protocol.encodeChannelKey)(scope.channelName);
12
+ const expected = scope.strategy === "APP_VERSION" ? (0, _hot_updater_protocol.createReleaseCatalogScopeKey)({
13
13
  channelKey,
14
14
  platform: scope.platform,
15
15
  strategy: "APP_VERSION"
16
- }) : (0, _hot_updater_core.createReleaseCatalogScopeKey)({
16
+ }) : (0, _hot_updater_protocol.createReleaseCatalogScopeKey)({
17
17
  channelKey,
18
18
  fingerprintHash: scope.fingerprintHash ?? "",
19
19
  platform: scope.platform,
@@ -63,7 +63,7 @@ const writeCatalog = async (tx, scope, stored, enabled, updatedAtMs) => {
63
63
  catalog_id: stored.catalog?.catalog_id ?? (0, _hot_updater_plugin_core.createUUIDv7)(),
64
64
  strategy: scope.strategy,
65
65
  channel_id: scope.channelId,
66
- channel_key: (0, _hot_updater_core.encodeChannelKey)(scope.channelName),
66
+ channel_key: (0, _hot_updater_protocol.encodeChannelKey)(scope.channelName),
67
67
  platform: scope.platform,
68
68
  fingerprint_hash: scope.fingerprintHash,
69
69
  generation,
@@ -172,7 +172,7 @@ const rebuildScope = async (tx, scope, updatedAtMs) => {
172
172
  releases: enabled.map(_hot_updater_plugin_core.releaseRowToRelease)
173
173
  });
174
174
  const current = stored.catalog;
175
- if (current !== null && current.strategy === scope.strategy && current.channel_id === scope.channelId && current.channel_key === (0, _hot_updater_core.encodeChannelKey)(scope.channelName) && current.platform === scope.platform && current.fingerprint_hash === scope.fingerprintHash && current.catalog_hash === compilation.catalogHash) return {
175
+ if (current !== null && current.strategy === scope.strategy && current.channel_id === scope.channelId && current.channel_key === (0, _hot_updater_protocol.encodeChannelKey)(scope.channelName) && current.platform === scope.platform && current.fingerprint_hash === scope.fingerprintHash && current.catalog_hash === compilation.catalogHash) return {
176
176
  catalog: current,
177
177
  current,
178
178
  changed: false,
@@ -1,7 +1,7 @@
1
1
  import { toCatalogRow, toReleaseRow } from "./reads.mjs";
2
2
  import { insertBundle } from "./writes.mjs";
3
3
  import { ReleaseCatalogMutationError, compileReleaseCatalog, createUUIDv7, createUUIDv7After, isUUIDv7, releaseRowToRelease } from "@hot-updater/plugin-core";
4
- import { createReleaseCatalogScopeKey, encodeChannelKey } from "@hot-updater/core";
4
+ import { createReleaseCatalogScopeKey, encodeChannelKey } from "@hot-updater/protocol";
5
5
  //#region src/core/releases.ts
6
6
  const PAGE = 500;
7
7
  const fail = (code, message) => {
@@ -1,5 +1,5 @@
1
- const require_errors = require("../database/errors.cjs");
2
1
  const require_reads = require("./reads.cjs");
2
+ let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
3
3
  //#region src/core/writes.ts
4
4
  const PAGE = 500;
5
5
  /** Moves one bundle into or out of its platform's total and the overall total. */
@@ -69,7 +69,7 @@ const insertChannel = async (db, row) => {
69
69
  };
70
70
  });
71
71
  } catch (error) {
72
- if (attempt < 3 && error instanceof require_errors.DatabaseConstraintError && (error.reason === "unique" || error.reason === "exists")) continue;
72
+ if (attempt < 3 && error instanceof _hot_updater_plugin_core.DatabaseConstraintError && (error.reason === "unique" || error.reason === "exists")) continue;
73
73
  throw error;
74
74
  }
75
75
  };
@@ -1,5 +1,5 @@
1
- import { DatabaseConstraintError } from "../database/errors.mjs";
2
1
  import { toChannelRow } from "./reads.mjs";
2
+ import { DatabaseConstraintError } from "@hot-updater/plugin-core";
3
3
  //#region src/core/writes.ts
4
4
  const PAGE = 500;
5
5
  /** Moves one bundle into or out of its platform's total and the overall total. */
@@ -1,5 +1,4 @@
1
- const require_coreDatabase = require("./db/coreDatabase.cjs");
2
- const require_configError = require("./assembly/configError.cjs");
1
+ const require_clientPlugins = require("./assembly/clientPlugins.cjs");
3
2
  const require_assemblePlugins = require("./assembly/assemblePlugins.cjs");
4
3
  const require_handler = require("./handler.cjs");
5
4
  const require_storageAccess = require("./storageAccess.cjs");
@@ -16,42 +15,34 @@ const isAdapter = (value) => isRecord(value) && [
16
15
  const databaseOf = (value) => {
17
16
  if (isRecord(value) && typeof value.name === "string") {
18
17
  if (isAdapter(value.adapter)) return value;
19
- if ("core" in value && "fetchAdmin" in value) throw new require_configError.HotUpdaterConfigError("standaloneRepository reaches a server's admin API from the CLI and console. createHotUpdater needs the server's own database, such as kyselyAdapter(...).");
18
+ if ("core" in value && "fetchAdmin" in value) throw new _hot_updater_plugin_core.HotUpdaterConfigError("standaloneRepository reaches a server's admin API from the CLI and console. createHotUpdater needs the server's own database, such as kyselyAdapter(...).");
20
19
  }
21
- throw new require_configError.HotUpdaterConfigError("database must be a Hot Updater 1.0 database, such as kyselyAdapter(...) or postgres(...). Upgrade the provider package that created it.");
20
+ throw new _hot_updater_plugin_core.HotUpdaterConfigError("database must be a Hot Updater 1.0 database, such as kyselyAdapter(...) or postgres(...). Upgrade the provider package that created it.");
22
21
  };
23
22
  /** `"public"`, or nothing; a `clientAccess` object says what replaced it. */
24
23
  const isPublic = (value) => {
25
24
  if (value === void 0) return false;
26
25
  if (value === "public") return true;
27
- throw new require_configError.HotUpdaterConfigError(isRecord(value) ? "clientAccess objects were removed in 1.0. Set clientAccess: \"public\", or add a plugin that provides clientAuth to plugins." : "clientAccess must be \"public\"; to protect client routes, add a plugin that provides clientAuth to plugins.");
26
+ throw new _hot_updater_plugin_core.HotUpdaterConfigError(isRecord(value) ? "clientAccess objects were removed in 1.0. Set clientAccess: \"public\", or add a plugin that provides clientAuth to plugins." : "clientAccess must be \"public\"; to protect client routes, add a plugin that provides clientAuth to plugins.");
28
27
  };
29
- const hotUpdaterCoreMetadata = Symbol.for("@hot-updater/server/core-metadata");
30
- function getHotUpdaterCoreMetadata(hotUpdater) {
31
- return hotUpdater[hotUpdaterCoreMetadata];
32
- }
33
28
  function createHotUpdater(options) {
34
29
  for (const key of ["authorityId", "catalogId"]) if (Object.hasOwn(options, key)) throw new TypeError(`Remove ${key} from createHotUpdater options. Catalog identity is managed internally.`);
35
30
  const database = databaseOf(options.database);
36
- const storagePlugins = (options.storage ?? []).map((storage) => {
37
- (0, _hot_updater_plugin_core.assertStorageOperations)(storage, ["get", "getDownloadUrl"]);
38
- return storage;
39
- });
40
- const { downloadStorageObject, readStorageText, resolveFileUrl } = require_storageAccess.createStorageAccess(storagePlugins);
31
+ const storage = Object.freeze([...options.storage ?? []]);
32
+ const { downloadStorageObject, readStorageText, resolveFileUrl } = require_storageAccess.createStorageAccess(storage);
41
33
  const publicClients = isPublic(options.clientAccess);
42
- const plugins = require_assemblePlugins.assemblePlugins(options.plugins ?? [], database.adapter, {
43
- storage: {
44
- readStorageText,
45
- resolveFileUrl
46
- },
47
- ...database.onCachedRoutesChange === void 0 ? {} : { onCachedRoutesChange: () => database.onCachedRoutesChange() },
48
- ...database.aggregateBatching === void 0 ? {} : { batching: database.aggregateBatching }
49
- });
34
+ const configured = Object.freeze([...options.plugins ?? []]);
35
+ const plugins = require_assemblePlugins.assemblePlugins(configured, database, { storage: {
36
+ readStorageText,
37
+ resolveFileUrl
38
+ } });
39
+ const clientPlugins = Object.freeze(require_clientPlugins.clientPluginsOf(configured));
50
40
  const clientAuth = plugins.clientAuth;
51
- if (clientAuth !== void 0 && publicClients) throw new require_configError.HotUpdaterConfigError(`Plugin "${clientAuth.plugin}" provides clientAuth, so remove clientAccess.`);
52
- if (clientAuth === void 0 && !publicClients) throw new require_configError.HotUpdaterConfigError("Set clientAccess to \"public\", or add a plugin that provides clientAuth.");
41
+ if (clientAuth !== void 0 && publicClients) throw new _hot_updater_plugin_core.HotUpdaterConfigError(`Plugin "${clientAuth.plugin}" provides clientAuth, so remove clientAccess.`);
42
+ if (clientAuth === void 0 && !publicClients) throw new _hot_updater_plugin_core.HotUpdaterConfigError("Set clientAccess to \"public\", or add a plugin that provides clientAuth.");
43
+ const varyHeaders = Object.freeze((clientAuth?.varyHeaders ?? []).map((header) => header.toLowerCase()));
53
44
  const clientPolicy = clientAuth === void 0 ? void 0 : {
54
- varyHeaders: clientAuth.varyHeaders.map((header) => header.toLowerCase()),
45
+ varyHeaders,
55
46
  authenticate: (request) => clientAuth.authenticate(request.headers)
56
47
  };
57
48
  const handlers = require_handler.createHotUpdaterHandlers({
@@ -61,24 +52,33 @@ function createHotUpdater(options) {
61
52
  endpoints: plugins.endpoints,
62
53
  plugins: Object.keys(plugins.api)
63
54
  });
64
- const api = {
55
+ let serving = false;
56
+ return {
65
57
  adapterName: database.name,
66
- handlers,
58
+ get handlers() {
59
+ if (!serving) {
60
+ for (const adapter of storage) (0, _hot_updater_plugin_core.assertStorageOperations)(adapter, ["get", "getDownloadUrl"]);
61
+ serving = true;
62
+ }
63
+ return handlers;
64
+ },
67
65
  core: plugins.core,
68
66
  api: plugins.api,
69
- flush: plugins.flush
67
+ flush: plugins.flush,
68
+ database,
69
+ storage,
70
+ plugins: configured,
71
+ clientPlugins,
72
+ clientEndpoints: Object.freeze(plugins.endpoints.filter((endpoint) => endpoint.access === "client").map(({ plugin, method, path }) => Object.freeze({
73
+ plugin,
74
+ method,
75
+ path
76
+ }))),
77
+ ...clientAuth === void 0 ? {} : { clientAuth: Object.freeze({
78
+ plugin: clientAuth.plugin,
79
+ varyHeaders
80
+ }) }
70
81
  };
71
- Object.defineProperty(api, hotUpdaterCoreMetadata, {
72
- enumerable: false,
73
- value: {
74
- database,
75
- target: require_coreDatabase.toolingTargetOf(options.plugins ?? []),
76
- plugins: options.plugins ?? []
77
- }
78
- });
79
- return api;
80
82
  }
81
83
  //#endregion
82
84
  exports.createHotUpdater = createHotUpdater;
83
- exports.getHotUpdaterCoreMetadata = getHotUpdaterCoreMetadata;
84
- exports.hotUpdaterCoreMetadata = hotUpdaterCoreMetadata;
@@ -1,15 +1,43 @@
1
- import { ToolingDatabase } from "./db/types.cjs";
2
- import { AnyHotUpdaterPlugin, PluginApis } from "./plugins/definePlugin.cjs";
3
1
  import { CoreApi } from "./core/api.cjs";
2
+ import { AnyHotUpdaterPlugin, PluginApis } from "./plugins/definePlugin.cjs";
4
3
  import { HotUpdaterHandlers } from "./handlerTypes.cjs";
5
4
  import "./handler.cjs";
6
- import { StoragePlugin } from "@hot-updater/plugin-core";
5
+ import { PluginClientPlugin, StorageAdapter, ToolingDatabase } from "@hot-updater/plugin-core";
7
6
  //#region src/createHotUpdaterCore.d.ts
7
+ /** A plugin's endpoint on `handlers.client`. */
8
+ interface ClientEndpoint {
9
+ /** The id of the plugin that adds it. */
10
+ readonly plugin: string;
11
+ readonly method: string;
12
+ /** Relative to the handler's mount; `:name` segments are parameters. */
13
+ readonly path: string;
14
+ }
15
+ /** The plugin that decides who may call client routes. */
16
+ interface ClientAuthProvider {
17
+ /** Its id. */
18
+ readonly plugin: string;
19
+ /**
20
+ * The request headers its decision reads, lowercase: what a cache in
21
+ * front of the server, such as a CDN, keys client routes on.
22
+ */
23
+ readonly varyHeaders: readonly string[];
24
+ }
8
25
  type RuntimeHotUpdaterAPI<TPlugins extends readonly AnyHotUpdaterPlugin[] = readonly AnyHotUpdaterPlugin[]> = {
26
+ /**
27
+ * The routes a host mounts. On first access every storage adapter must
28
+ * serve downloads (`get` and `getDownloadUrl`), so a server fails where it
29
+ * mounts them, while tooling that only reads the definition, such as the
30
+ * CLI, can list storage that only uploads.
31
+ */
9
32
  readonly handlers: HotUpdaterHandlers;
10
- /** Core's reads and typed writes: bundles, Releases, Catalogs, and channels. */
33
+ /**
34
+ * Core's reads and typed writes: bundles, Releases, Catalogs, and
35
+ * channels. The CLI and the console write through it, so their writes
36
+ * take the server's path: the plugins' schema fence, pruning during
37
+ * writes, the storage's file URLs, and the database's CDN purge.
38
+ */
11
39
  readonly core: CoreApi;
12
- /** Each plugin's API by plugin id. */
40
+ /** Each plugin's API by plugin id, which the CLI's and the console's plugin features call. */
13
41
  readonly api: PluginApis<TPlugins>;
14
42
  /** The database's name, which `hot-updater db` commands read. */
15
43
  readonly adapterName: string;
@@ -20,6 +48,28 @@ type RuntimeHotUpdaterAPI<TPlugins extends readonly AnyHotUpdaterPlugin[] = read
20
48
  * it before it exits.
21
49
  */
22
50
  readonly flush: () => Promise<void>;
51
+ /**
52
+ * The database as configured. `hot-updater db` runs its tooling
53
+ * (`createMigrator`, `generateSchema`), and tooling done with the server
54
+ * closes it (`dispose`).
55
+ */
56
+ readonly database: ToolingDatabase;
57
+ /** The storage as configured, in order, as a frozen copy. */
58
+ readonly storage: readonly StorageAdapter[];
59
+ /** The plugins as configured, as a frozen copy, whose tables tooling creates. */
60
+ readonly plugins: TPlugins;
61
+ /**
62
+ * The client plugins an app adds to `HotUpdater.init`'s `plugins` for
63
+ * these plugins, each once, in plugin order: what init prints.
64
+ */
65
+ readonly clientPlugins: readonly PluginClientPlugin[];
66
+ /**
67
+ * The plugins' endpoints on `handlers.client`, which a host that routes
68
+ * by path, such as a CDN in front of the server, sends to it.
69
+ */
70
+ readonly clientEndpoints: readonly ClientEndpoint[];
71
+ /** The plugin that guards client routes; absent when they are public. */
72
+ readonly clientAuth?: ClientAuthProvider;
23
73
  };
24
74
  type HotUpdaterAPI = RuntimeHotUpdaterAPI;
25
75
  declare const REMOVED_CLIENT_ACCESS = "clientAccess objects were removed in 1.0: set clientAccess: \"public\", or add a plugin that provides clientAuth";
@@ -62,11 +112,14 @@ type ClientAccessRule<TPlugins extends readonly AnyHotUpdaterPlugin[]> = number
62
112
  type CreateHotUpdaterOptions<TPlugins extends readonly AnyHotUpdaterPlugin[] = readonly []> = {
63
113
  /** A provider's database on the storage engine, such as `kyselyAdapter(...)` or `postgres(...)`. */
64
114
  readonly database: ToolingDatabase;
65
- /** Storage implementations used to read provider-specific storage URIs. */
66
- readonly storage?: readonly StoragePlugin[];
115
+ /**
116
+ * Where bundles are stored: the server reads and signs the URIs of each
117
+ * adapter's protocol.
118
+ */
119
+ readonly storage?: readonly StorageAdapter[];
67
120
  /** The plugins the server runs; at most one provides clientAuth. Defaults to none. */
68
121
  readonly plugins?: TPlugins;
69
122
  } & ClientAccessRule<TPlugins>;
70
123
  declare function createHotUpdater<const TPlugins extends readonly AnyHotUpdaterPlugin[] = readonly []>(options: CreateHotUpdaterOptions<TPlugins>): RuntimeHotUpdaterAPI<NoInfer<TPlugins>>;
71
124
  //#endregion
72
- export { ClientAccessPolicy, ClientAccessRule, CreateHotUpdaterOptions, HotUpdaterAPI, RemovedClientAccess, RuntimeHotUpdaterAPI, createHotUpdater };
125
+ export { ClientAccessPolicy, ClientAccessRule, ClientAuthProvider, ClientEndpoint, CreateHotUpdaterOptions, HotUpdaterAPI, RemovedClientAccess, RuntimeHotUpdaterAPI, createHotUpdater };