@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
@@ -1,37 +1,30 @@
1
- import { createKyselyMigrator } from "../db/fixedMigrator.mjs";
2
- import { createKyselyCrud, recordKyselyInsights } from "./kyselyCrud.mjs";
3
- import { createDatabasePlugin } from "@hot-updater/plugin-core";
4
- import { createDatabasePluginAdapter } from "@hot-updater/plugin-core/internal";
1
+ import { builtInTarget, createEngineDatabase } from "../db/builtInDatabase.mjs";
2
+ import { createSqlAdapter } from "../database/sql/sqlAdapter.mjs";
3
+ import { createEngineSqlMigrator } from "../db/engineSqlMigrator.mjs";
4
+ import { kyselyExecutor } from "./kyselyExecutor.mjs";
5
+ import { checkSqlProvider } from "./sqlProviders.mjs";
5
6
  //#region src/adapters/kysely.ts
6
- const createImplementation = (config) => {
7
- const db = config.db;
8
- const relationMode = config.relationMode ?? "foreign-keys";
9
- return {
10
- ...createKyselyCrud(db, config.provider, relationMode),
11
- recordInsights: (input) => db.transaction().execute((transaction) => recordKyselyInsights(transaction, config.provider, input)),
12
- deleteChannel: (input) => db.transaction().execute((transaction) => createKyselyCrud(transaction, config.provider, relationMode).deleteChannel(input)),
13
- create: (input) => db.transaction().execute((transaction) => createKyselyCrud(transaction, config.provider, relationMode).create(input)),
14
- update: (input) => db.transaction().execute((transaction) => createKyselyCrud(transaction, config.provider, relationMode).update(input)),
15
- delete: (input) => db.transaction().execute((transaction) => createKyselyCrud(transaction, config.provider, relationMode).delete(input)),
16
- transaction: (callback) => db.transaction().execute((transaction) => callback(createKyselyCrud(transaction, config.provider, relationMode)))
17
- };
18
- };
7
+ /**
8
+ * Hot Updater's database on a Kysely instance: the storage engine through the
9
+ * shared SQL core, fenced by the schema settings. `db migrate` and
10
+ * `db generate --sql` apply the engine's SQL schema.
11
+ */
19
12
  const kyselyAdapter = (config) => {
20
- const adapter = createDatabasePluginAdapter("kysely", createImplementation(config));
21
- const plugin = createDatabasePlugin({
22
- name: "kysely",
23
- models: adapter.models,
24
- commit: adapter.commit
25
- });
26
- return Object.assign(plugin, {
27
- adapterName: "kysely",
28
- provider: config.provider,
29
- createMigrator: () => createKyselyMigrator({
30
- db: config.db,
31
- provider: config.provider,
32
- relationMode: config.relationMode
13
+ const provider = checkSqlProvider("kyselyAdapter", config.provider);
14
+ const executor = kyselyExecutor(config.db, provider);
15
+ return {
16
+ ...createEngineDatabase({
17
+ name: "kysely",
18
+ adapter: createSqlAdapter({ executor })
19
+ }),
20
+ provider,
21
+ createMigrator: ({ schema, settings } = builtInTarget) => createEngineSqlMigrator({
22
+ adapterName: "kysely",
23
+ executor,
24
+ schema,
25
+ settings
33
26
  })
34
- });
27
+ };
35
28
  };
36
29
  //#endregion
37
- export { kyselyAdapter };
30
+ export { kyselyAdapter, kyselyExecutor };
@@ -0,0 +1,32 @@
1
+ let kysely = require("kysely");
2
+ //#region src/adapters/kyselyExecutor.ts
3
+ const over = (runner) => ({ async execute({ sql, params }) {
4
+ const result = await runner.executeQuery(kysely.CompiledQuery.raw(sql, [...params]));
5
+ return {
6
+ rows: result.rows,
7
+ changes: Number(result.numAffectedRows ?? 0n)
8
+ };
9
+ } });
10
+ const raw = (runner, sql) => runner.executeQuery(kysely.CompiledQuery.raw(sql));
11
+ /**
12
+ * The SQL core's executor over a Kysely instance: statements run as raw
13
+ * compiled queries. SQLite transactions begin with BEGIN IMMEDIATE on one
14
+ * connection; other dialects use Kysely's transactions.
15
+ */
16
+ const kyselyExecutor = (db, dialect) => ({
17
+ dialect,
18
+ ...over(db),
19
+ transaction: (fn) => dialect === "sqlite" ? db.connection().execute(async (connection) => {
20
+ await raw(connection, "BEGIN IMMEDIATE");
21
+ try {
22
+ const result = await fn(over(connection));
23
+ await raw(connection, "COMMIT");
24
+ return result;
25
+ } catch (error) {
26
+ await raw(connection, "ROLLBACK").catch(() => void 0);
27
+ throw error;
28
+ }
29
+ }) : db.transaction().execute((transaction) => fn(over(transaction)))
30
+ });
31
+ //#endregion
32
+ exports.kyselyExecutor = kyselyExecutor;
@@ -0,0 +1,12 @@
1
+ import { SqlDialect } from "../database/sql/sqlSchema.cjs";
2
+ import { SqlExecutor } from "../database/sql/sqlAdapter.cjs";
3
+ import { Kysely } from "kysely";
4
+ //#region src/adapters/kyselyExecutor.d.ts
5
+ /**
6
+ * The SQL core's executor over a Kysely instance: statements run as raw
7
+ * compiled queries. SQLite transactions begin with BEGIN IMMEDIATE on one
8
+ * connection; other dialects use Kysely's transactions.
9
+ */
10
+ declare const kyselyExecutor: (db: Kysely<object>, dialect: SqlDialect) => SqlExecutor;
11
+ //#endregion
12
+ export { kyselyExecutor };
@@ -0,0 +1,12 @@
1
+ import { SqlDialect } from "../database/sql/sqlSchema.mjs";
2
+ import { SqlExecutor } from "../database/sql/sqlAdapter.mjs";
3
+ import { Kysely } from "kysely";
4
+ //#region src/adapters/kyselyExecutor.d.ts
5
+ /**
6
+ * The SQL core's executor over a Kysely instance: statements run as raw
7
+ * compiled queries. SQLite transactions begin with BEGIN IMMEDIATE on one
8
+ * connection; other dialects use Kysely's transactions.
9
+ */
10
+ declare const kyselyExecutor: (db: Kysely<object>, dialect: SqlDialect) => SqlExecutor;
11
+ //#endregion
12
+ export { kyselyExecutor };
@@ -0,0 +1,32 @@
1
+ import { CompiledQuery } from "kysely";
2
+ //#region src/adapters/kyselyExecutor.ts
3
+ const over = (runner) => ({ async execute({ sql, params }) {
4
+ const result = await runner.executeQuery(CompiledQuery.raw(sql, [...params]));
5
+ return {
6
+ rows: result.rows,
7
+ changes: Number(result.numAffectedRows ?? 0n)
8
+ };
9
+ } });
10
+ const raw = (runner, sql) => runner.executeQuery(CompiledQuery.raw(sql));
11
+ /**
12
+ * The SQL core's executor over a Kysely instance: statements run as raw
13
+ * compiled queries. SQLite transactions begin with BEGIN IMMEDIATE on one
14
+ * connection; other dialects use Kysely's transactions.
15
+ */
16
+ const kyselyExecutor = (db, dialect) => ({
17
+ dialect,
18
+ ...over(db),
19
+ transaction: (fn) => dialect === "sqlite" ? db.connection().execute(async (connection) => {
20
+ await raw(connection, "BEGIN IMMEDIATE");
21
+ try {
22
+ const result = await fn(over(connection));
23
+ await raw(connection, "COMMIT");
24
+ return result;
25
+ } catch (error) {
26
+ await raw(connection, "ROLLBACK").catch(() => void 0);
27
+ throw error;
28
+ }
29
+ }) : db.transaction().execute((transaction) => fn(over(transaction)))
30
+ });
31
+ //#endregion
32
+ export { kyselyExecutor };
@@ -1,70 +1,36 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_fixedMigratorMongo = require("../db/fixedMigratorMongo.cjs");
3
- const require_mongodbCollections = require("./mongodbCollections.cjs");
4
- const require_mongodbReads = require("./mongodbReads.cjs");
5
- const require_mongodbWrites = require("./mongodbWrites.cjs");
6
- let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
7
- let _hot_updater_plugin_core_internal = require("@hot-updater/plugin-core/internal");
8
- let mongodb = require("mongodb");
2
+ const require_fence = require("../database/fence.cjs");
3
+ const require_engineMigrator = require("../db/engineMigrator.cjs");
4
+ const require_builtInDatabase = require("../db/builtInDatabase.cjs");
5
+ const require_mongodbAdapter = require("./mongodbAdapter.cjs");
9
6
  //#region src/adapters/mongodb.ts
10
- const createMongoImplementation = (client, session) => {
11
- const collections = require_mongodbCollections.createMongoCollections(client);
12
- return {
13
- recordInsights: async ({ event }) => {
14
- const record = () => client.withSession((insightsSession) => insightsSession.withTransaction(async () => {
15
- const insights = require_mongodbCollections.createMongoCollections(client);
16
- const options = {
17
- session: insightsSession,
18
- collation: { locale: "simple" }
19
- };
20
- if ((await insights.bundleEvents.updateOne({ id: event.id }, { $setOnInsert: event }, {
21
- ...options,
22
- upsert: true
23
- })).upsertedCount === 0) return;
24
- const current = await insights.bundleEventHeads.findOne({ install_id: event.install_id }, options);
25
- if (current !== null && (event.received_at_ms < current.received_at_ms || event.received_at_ms === current.received_at_ms && event.id <= current.id)) return;
26
- await insights.bundleEventHeads.updateOne({ install_id: event.install_id }, { $set: {
27
- install_id: event.install_id,
28
- id: event.id,
29
- received_at_ms: event.received_at_ms,
30
- user_id: event.user_id,
31
- platform: event.platform,
32
- channel: event.channel,
33
- type: event.type,
34
- from_bundle_id: event.from_bundle_id,
35
- to_bundle_id: event.to_bundle_id
36
- } }, {
37
- ...options,
38
- upsert: true
39
- });
40
- }));
41
- try {
42
- await record();
43
- } catch (error) {
44
- if (!(error instanceof mongodb.MongoServerError) || error.code !== 11e3) throw error;
45
- await record();
46
- }
47
- },
48
- ...require_mongodbWrites.createMongoWrites(collections, session),
49
- ...require_mongodbReads.createMongoReads(collections, session)
50
- };
7
+ /** Settings rows by their `key` field: the engine's rows and a v0 database's alike. */
8
+ const readSettings = (client) => async () => {
9
+ const rows = await client.db().collection(require_fence.SETTINGS_TABLE.name).find({ key: { $type: "string" } }).toArray();
10
+ return new Map(rows.map((row) => [String(row.key), row.value]));
51
11
  };
52
- const createTransactionalMongoImplementation = (client) => ({
53
- ...createMongoImplementation(client),
54
- deleteChannel: (input) => client.withSession((session) => session.withTransaction(() => createMongoImplementation(client, session).deleteChannel(input))),
55
- transaction: (callback) => client.withSession((session) => session.withTransaction(() => callback(createMongoImplementation(client, session))))
56
- });
12
+ /**
13
+ * Hot Updater's database on MongoDB: the storage engine's MongoDB adapter,
14
+ * fenced by the schema settings. `db migrate` creates the collections and
15
+ * indexes, then writes the settings.
16
+ */
57
17
  const mongoAdapter = (config) => {
58
- const adapter = (0, _hot_updater_plugin_core_internal.createDatabasePluginAdapter)("mongodb", config.transactions === true ? createTransactionalMongoImplementation(config.client) : createMongoImplementation(config.client));
59
- return Object.assign((0, _hot_updater_plugin_core.createDatabasePlugin)({
60
- name: "mongodb",
61
- models: adapter.models,
62
- commit: adapter.commit
63
- }), {
64
- adapterName: "mongodb",
18
+ const adapter = require_mongodbAdapter.createMongoAdapter({ client: config.client });
19
+ return {
20
+ ...require_builtInDatabase.createEngineDatabase({
21
+ name: "mongodb",
22
+ adapter
23
+ }),
65
24
  provider: "mongodb",
66
- createMigrator: () => require_fixedMigratorMongo.createMongoMigrator(config.client)
67
- });
25
+ createMigrator: ({ schema, settings } = require_builtInDatabase.builtInTarget) => require_engineMigrator.createEngineMigrator({
26
+ adapterName: "mongodb",
27
+ adapter,
28
+ schema,
29
+ settings,
30
+ readSettings: readSettings(config.client)
31
+ })
32
+ };
68
33
  };
69
34
  //#endregion
35
+ exports.MongoTransactionUnsupportedError = require_mongodbAdapter.MongoTransactionUnsupportedError;
70
36
  exports.mongoAdapter = mongoAdapter;
@@ -1,11 +1,16 @@
1
- import { DatabaseAdapterWithCapabilities } from "../db/types.cjs";
1
+ import { ToolingDatabase } from "../db/types.cjs";
2
+ import { MongoTransactionUnsupportedError } from "./mongodbAdapter.cjs";
2
3
  import { MongoClient } from "mongodb";
3
4
  //#region src/adapters/mongodb.d.ts
5
+ /** Every write runs in a transaction, which needs a replica set or a sharded cluster. */
4
6
  interface MongoDBConfig {
5
7
  readonly client: MongoClient;
6
- /** Enables atomic catalog commits. Insights always requires MongoDB 5+ on a replica set or sharded cluster. */
7
- readonly transactions?: boolean;
8
8
  }
9
- declare const mongoAdapter: (config: MongoDBConfig) => DatabaseAdapterWithCapabilities;
9
+ /**
10
+ * Hot Updater's database on MongoDB: the storage engine's MongoDB adapter,
11
+ * fenced by the schema settings. `db migrate` creates the collections and
12
+ * indexes, then writes the settings.
13
+ */
14
+ declare const mongoAdapter: (config: MongoDBConfig) => ToolingDatabase;
10
15
  //#endregion
11
- export { MongoDBConfig, mongoAdapter };
16
+ export { MongoDBConfig, MongoTransactionUnsupportedError, mongoAdapter };
@@ -1,11 +1,16 @@
1
- import { DatabaseAdapterWithCapabilities } from "../db/types.mjs";
1
+ import { ToolingDatabase } from "../db/types.mjs";
2
+ import { MongoTransactionUnsupportedError } from "./mongodbAdapter.mjs";
2
3
  import { MongoClient } from "mongodb";
3
4
  //#region src/adapters/mongodb.d.ts
5
+ /** Every write runs in a transaction, which needs a replica set or a sharded cluster. */
4
6
  interface MongoDBConfig {
5
7
  readonly client: MongoClient;
6
- /** Enables atomic catalog commits. Insights always requires MongoDB 5+ on a replica set or sharded cluster. */
7
- readonly transactions?: boolean;
8
8
  }
9
- declare const mongoAdapter: (config: MongoDBConfig) => DatabaseAdapterWithCapabilities;
9
+ /**
10
+ * Hot Updater's database on MongoDB: the storage engine's MongoDB adapter,
11
+ * fenced by the schema settings. `db migrate` creates the collections and
12
+ * indexes, then writes the settings.
13
+ */
14
+ declare const mongoAdapter: (config: MongoDBConfig) => ToolingDatabase;
10
15
  //#endregion
11
- export { MongoDBConfig, mongoAdapter };
16
+ export { MongoDBConfig, MongoTransactionUnsupportedError, mongoAdapter };
@@ -1,69 +1,34 @@
1
- import { createMongoMigrator } from "../db/fixedMigratorMongo.mjs";
2
- import { createMongoCollections } from "./mongodbCollections.mjs";
3
- import { createMongoReads } from "./mongodbReads.mjs";
4
- import { createMongoWrites } from "./mongodbWrites.mjs";
5
- import { createDatabasePlugin } from "@hot-updater/plugin-core";
6
- import { createDatabasePluginAdapter } from "@hot-updater/plugin-core/internal";
7
- import { MongoServerError } from "mongodb";
1
+ import { SETTINGS_TABLE } from "../database/fence.mjs";
2
+ import { createEngineMigrator } from "../db/engineMigrator.mjs";
3
+ import { builtInTarget, createEngineDatabase } from "../db/builtInDatabase.mjs";
4
+ import { MongoTransactionUnsupportedError, createMongoAdapter } from "./mongodbAdapter.mjs";
8
5
  //#region src/adapters/mongodb.ts
9
- const createMongoImplementation = (client, session) => {
10
- const collections = createMongoCollections(client);
11
- return {
12
- recordInsights: async ({ event }) => {
13
- const record = () => client.withSession((insightsSession) => insightsSession.withTransaction(async () => {
14
- const insights = createMongoCollections(client);
15
- const options = {
16
- session: insightsSession,
17
- collation: { locale: "simple" }
18
- };
19
- if ((await insights.bundleEvents.updateOne({ id: event.id }, { $setOnInsert: event }, {
20
- ...options,
21
- upsert: true
22
- })).upsertedCount === 0) return;
23
- const current = await insights.bundleEventHeads.findOne({ install_id: event.install_id }, options);
24
- if (current !== null && (event.received_at_ms < current.received_at_ms || event.received_at_ms === current.received_at_ms && event.id <= current.id)) return;
25
- await insights.bundleEventHeads.updateOne({ install_id: event.install_id }, { $set: {
26
- install_id: event.install_id,
27
- id: event.id,
28
- received_at_ms: event.received_at_ms,
29
- user_id: event.user_id,
30
- platform: event.platform,
31
- channel: event.channel,
32
- type: event.type,
33
- from_bundle_id: event.from_bundle_id,
34
- to_bundle_id: event.to_bundle_id
35
- } }, {
36
- ...options,
37
- upsert: true
38
- });
39
- }));
40
- try {
41
- await record();
42
- } catch (error) {
43
- if (!(error instanceof MongoServerError) || error.code !== 11e3) throw error;
44
- await record();
45
- }
46
- },
47
- ...createMongoWrites(collections, session),
48
- ...createMongoReads(collections, session)
49
- };
6
+ /** Settings rows by their `key` field: the engine's rows and a v0 database's alike. */
7
+ const readSettings = (client) => async () => {
8
+ const rows = await client.db().collection(SETTINGS_TABLE.name).find({ key: { $type: "string" } }).toArray();
9
+ return new Map(rows.map((row) => [String(row.key), row.value]));
50
10
  };
51
- const createTransactionalMongoImplementation = (client) => ({
52
- ...createMongoImplementation(client),
53
- deleteChannel: (input) => client.withSession((session) => session.withTransaction(() => createMongoImplementation(client, session).deleteChannel(input))),
54
- transaction: (callback) => client.withSession((session) => session.withTransaction(() => callback(createMongoImplementation(client, session))))
55
- });
11
+ /**
12
+ * Hot Updater's database on MongoDB: the storage engine's MongoDB adapter,
13
+ * fenced by the schema settings. `db migrate` creates the collections and
14
+ * indexes, then writes the settings.
15
+ */
56
16
  const mongoAdapter = (config) => {
57
- const adapter = createDatabasePluginAdapter("mongodb", config.transactions === true ? createTransactionalMongoImplementation(config.client) : createMongoImplementation(config.client));
58
- return Object.assign(createDatabasePlugin({
59
- name: "mongodb",
60
- models: adapter.models,
61
- commit: adapter.commit
62
- }), {
63
- adapterName: "mongodb",
17
+ const adapter = createMongoAdapter({ client: config.client });
18
+ return {
19
+ ...createEngineDatabase({
20
+ name: "mongodb",
21
+ adapter
22
+ }),
64
23
  provider: "mongodb",
65
- createMigrator: () => createMongoMigrator(config.client)
66
- });
24
+ createMigrator: ({ schema, settings } = builtInTarget) => createEngineMigrator({
25
+ adapterName: "mongodb",
26
+ adapter,
27
+ schema,
28
+ settings,
29
+ readSettings: readSettings(config.client)
30
+ })
31
+ };
67
32
  };
68
33
  //#endregion
69
- export { mongoAdapter };
34
+ export { MongoTransactionUnsupportedError, mongoAdapter };
@@ -0,0 +1,174 @@
1
+ let _hot_updater_plugin_core_internal = require("@hot-updater/plugin-core/internal");
2
+ let mongodb = require("mongodb");
3
+ //#region src/adapters/mongodbAdapter.ts
4
+ var MongoTransactionUnsupportedError = class extends Error {
5
+ name = "MongoTransactionUnsupportedError";
6
+ constructor(cause) {
7
+ super("Hot Updater writes in MongoDB transactions, which need a replica set or a sharded cluster.", { cause });
8
+ }
9
+ };
10
+ /** A single key column is the `_id`; a composite key is a document in key-column order. */
11
+ const idOf = (table, key) => table.key.length === 1 ? key[0] : Object.fromEntries(table.key.map((column, at) => [column, key[at]]));
12
+ /** A filter on `_id` (never an ObjectId), and on the version when given. */
13
+ const byId = (_id, v) => v === void 0 ? { _id } : {
14
+ _id,
15
+ [_hot_updater_plugin_core_internal.DATABASE_VERSION_COLUMN]: v
16
+ };
17
+ /** Null columns are left out, so unique indexes skip them as SQL's do. */
18
+ const toDocument = (table, row) => ({
19
+ _id: idOf(table, (0, _hot_updater_plugin_core_internal.rowKey)(table, row)),
20
+ ...Object.fromEntries(table.columns.flatMap(({ name }) => row[name] === null || row[name] === void 0 ? [] : [[name, row[name]]]))
21
+ });
22
+ /** `columns op bound` over a tuple prefix, expanded into ORs. */
23
+ const compare = (columns, { values, inclusive }, op) => {
24
+ const terms = values.map((value, position) => ({
25
+ ...Object.fromEntries(columns.slice(0, position).map((column, at) => [column, values[at]])),
26
+ [columns[position]]: { [position === values.length - 1 && inclusive ? `${op}e` : op]: value }
27
+ }));
28
+ return terms.length === 1 ? terms[0] : { $or: terms };
29
+ };
30
+ const indexDescription = (table, index) => {
31
+ const columns = index.unique ? index.eq : [...index.eq, ...(0, _hot_updater_plugin_core_internal.indexOrderColumns)(table, index)];
32
+ const exists = columns.filter((column) => (0, _hot_updater_plugin_core_internal.findPhysicalColumn)(table, column).nullable).map((column) => [column, { $exists: true }]);
33
+ return {
34
+ name: index.name,
35
+ key: Object.fromEntries(columns.map((column) => [column, 1])),
36
+ ...index.unique && { unique: true },
37
+ ...index.unique && exists.length > 0 && { partialFilterExpression: Object.fromEntries(exists) }
38
+ };
39
+ };
40
+ const mongoError = (error) => error instanceof mongodb.MongoError ? error : void 0;
41
+ /**
42
+ * The storage engine's adapter over MongoDB: one collection per table, the
43
+ * key as `_id`, and indexes as declared, with multi-valued fields as multikey
44
+ * indexes. A write runs in one transaction. Guards are conditional updates,
45
+ * and `check` is a conditional `$inc`: a real write, so a concurrent
46
+ * transaction on the document conflicts.
47
+ */
48
+ const createMongoAdapter = (options) => {
49
+ const { client, tablePrefix = "", maxOps = 1e3 } = options;
50
+ const collection = (table) => client.db().collection(tablePrefix + table.name);
51
+ const normalize = (table, document) => (0, _hot_updater_plugin_core_internal.normalizeStoredRow)(table, document, { jsonText: false });
52
+ /** Whether the op applied; a guard that no longer matches changes nothing. */
53
+ const apply = async (op, session) => {
54
+ const target = collection(op.table);
55
+ if (op.type === "insert") {
56
+ await target.insertOne(toDocument(op.table, op.row), { session });
57
+ return true;
58
+ }
59
+ const _id = idOf(op.table, op.key);
60
+ const update = async (filter, change) => (await target.updateOne(filter, change, { session })).matchedCount === 1;
61
+ switch (op.type) {
62
+ case "patch": {
63
+ const $set = { [_hot_updater_plugin_core_internal.DATABASE_VERSION_COLUMN]: op.guard.v + 1 };
64
+ const $unset = {};
65
+ for (const [name, value] of Object.entries(op.set)) if (value === null) $unset[name] = "";
66
+ else $set[name] = value;
67
+ return update(byId(_id, op.guard.v), {
68
+ $set,
69
+ $unset
70
+ });
71
+ }
72
+ case "delete": return (await target.deleteOne(byId(_id, op.guard.v), { session })).deletedCount === 1;
73
+ case "check": return update(byId(_id, op.guard.v), { $inc: { _checked: 1 } });
74
+ case "increment": {
75
+ if (op.init === void 0 || op.guard !== void 0) return update(byId(_id, op.guard?.v), { $inc: {
76
+ ...op.by,
77
+ [_hot_updater_plugin_core_internal.DATABASE_VERSION_COLUMN]: 1
78
+ } });
79
+ const set = {};
80
+ for (const { name } of op.table.columns) {
81
+ const start = op.init[name] ?? null;
82
+ const by = name === _hot_updater_plugin_core_internal.DATABASE_VERSION_COLUMN ? 1 : op.by[name];
83
+ const stored = { $ifNull: [`$${name}`, { $literal: start ?? 0 }] };
84
+ if (by !== void 0) set[name] = { $add: [stored, by] };
85
+ else if (start !== null) set[name] = stored;
86
+ }
87
+ await target.updateOne(byId(_id), [{ $set: set }], {
88
+ upsert: true,
89
+ session
90
+ });
91
+ return true;
92
+ }
93
+ }
94
+ };
95
+ return {
96
+ id: "mongodb",
97
+ fits: (ops) => ops.length <= maxOps,
98
+ async get(table, keys) {
99
+ if (keys.length === 0) return [];
100
+ const ids = keys.map((key) => idOf(table, key));
101
+ const documents = await collection(table).find(byId({ $in: ids })).toArray();
102
+ const found = new Map(documents.map((document) => [JSON.stringify(document._id), document]));
103
+ return ids.map((id) => {
104
+ const document = found.get(JSON.stringify(id));
105
+ return document === void 0 ? null : normalize(table, document);
106
+ });
107
+ },
108
+ async query(table, request) {
109
+ const index = (0, _hot_updater_plugin_core_internal.findPhysicalIndex)(table, request.index);
110
+ const columns = (0, _hot_updater_plugin_core_internal.indexOrderColumns)(table, index);
111
+ const bounds = [...request.lower ? [compare(columns, request.lower, "$gt")] : [], ...request.upper ? [compare(columns, request.upper, "$lt")] : []];
112
+ const direction = request.order === "asc" ? 1 : -1;
113
+ return (await collection(table).find({
114
+ ...Object.fromEntries(index.eq.map((column, at) => [column, request.eq[at]])),
115
+ ...bounds.length > 0 && { $and: bounds }
116
+ }, {
117
+ sort: Object.fromEntries(columns.map((column) => [column, direction])),
118
+ limit: request.limit,
119
+ ...options.batchSize && { batchSize: options.batchSize }
120
+ }).toArray()).map((document) => normalize(table, document));
121
+ },
122
+ async write(ops) {
123
+ const session = client.startSession();
124
+ let position = 0;
125
+ try {
126
+ session.startTransaction({
127
+ readConcern: { level: "snapshot" },
128
+ writeConcern: { w: "majority" }
129
+ });
130
+ for (; position < ops.length; position += 1) if (!await apply(ops[position], session)) {
131
+ await session.abortTransaction();
132
+ return {
133
+ ok: false,
134
+ failedOp: position
135
+ };
136
+ }
137
+ await session.commitTransaction().catch(async (error) => {
138
+ if (!mongoError(error)?.hasErrorLabel("UnknownTransactionCommitResult")) throw error;
139
+ await session.commitTransaction();
140
+ });
141
+ return { ok: true };
142
+ } catch (error) {
143
+ if (session.inTransaction()) await session.abortTransaction().catch(() => void 0);
144
+ const failure = mongoError(error);
145
+ if (failure?.hasErrorLabel("TransientTransactionError") || failure?.code === 112) return {
146
+ ok: false,
147
+ retry: true
148
+ };
149
+ if (failure?.code === 11e3 && position < ops.length) return ops[position].type === "increment" ? {
150
+ ok: false,
151
+ retry: true
152
+ } : {
153
+ ok: false,
154
+ failedOp: position
155
+ };
156
+ throw failure?.code === 20 ? new MongoTransactionUnsupportedError(error) : error;
157
+ } finally {
158
+ await session.endSession();
159
+ }
160
+ },
161
+ migrations: { async apply(tables) {
162
+ for (const table of tables) {
163
+ await client.db().createCollection(tablePrefix + table.name).catch((error) => {
164
+ if (mongoError(error)?.code !== 48) throw error;
165
+ });
166
+ if (table.indexes.length === 0) continue;
167
+ await collection(table).createIndexes(table.indexes.map((index) => indexDescription(table, index)));
168
+ }
169
+ } }
170
+ };
171
+ };
172
+ //#endregion
173
+ exports.MongoTransactionUnsupportedError = MongoTransactionUnsupportedError;
174
+ exports.createMongoAdapter = createMongoAdapter;
@@ -0,0 +1,9 @@
1
+ import { DatabaseAdapter } from "@hot-updater/plugin-core/internal";
2
+ import { MongoClient } from "mongodb";
3
+ //#region src/adapters/mongodbAdapter.d.ts
4
+ declare class MongoTransactionUnsupportedError extends Error {
5
+ readonly name = "MongoTransactionUnsupportedError";
6
+ constructor(cause: unknown);
7
+ }
8
+ //#endregion
9
+ export { MongoTransactionUnsupportedError };
@@ -0,0 +1,9 @@
1
+ import { DatabaseAdapter } from "@hot-updater/plugin-core/internal";
2
+ import { MongoClient } from "mongodb";
3
+ //#region src/adapters/mongodbAdapter.d.ts
4
+ declare class MongoTransactionUnsupportedError extends Error {
5
+ readonly name = "MongoTransactionUnsupportedError";
6
+ constructor(cause: unknown);
7
+ }
8
+ //#endregion
9
+ export { MongoTransactionUnsupportedError };