@hot-updater/console 1.0.0-rc.2 → 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 (285) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/ConsoleFeatureUnavailable-D0LPL1Gy.js +1 -0
  3. package/.output/public/assets/HashValueDisplay-BmuB4FW-.js +1 -0
  4. package/.output/public/assets/InsightsInfo--v4SC07c.js +1 -0
  5. package/.output/public/assets/InsightsPageHeader-dU83CAQY.js +1 -0
  6. package/.output/public/assets/NotFoundPage-B5mhGG2a.js +1 -0
  7. package/.output/public/assets/api-D-vOVlQ4.js +1 -0
  8. package/.output/public/assets/api-keys-Csh8ARKU.js +1 -0
  9. package/.output/public/assets/api-keys-OMPUoA_A.js +1 -0
  10. package/.output/public/assets/arrow-left-Bwq9X1eS.js +1 -0
  11. package/.output/public/assets/arrow-up-right-BkOVn4if.js +1 -0
  12. package/.output/public/assets/card-C_7d6O9a.js +1 -0
  13. package/.output/public/assets/console-features-api-C1jRZTGw.js +1 -0
  14. package/.output/public/assets/dialog-DE8wFN_P.js +1 -0
  15. package/.output/public/assets/dist-C7ENGzpS.js +1 -0
  16. package/.output/public/assets/empty-CVd5NlQD.js +1 -0
  17. package/.output/public/assets/field-C06q1iC9.js +1 -0
  18. package/.output/public/assets/index-BeWlQtO6.js +11 -0
  19. package/.output/public/assets/input-group-Bi61biIA.js +1 -0
  20. package/.output/public/assets/insights-BjnAtC0f.js +2 -0
  21. package/.output/public/assets/insights-D86m11yH.js +42 -0
  22. package/.output/public/assets/insights-DpYstMoY.js +1 -0
  23. package/.output/public/assets/insights-recovery-rpc-BIm5_ALc.js +1 -0
  24. package/.output/public/assets/insights-search-KIF7mRtB.js +1 -0
  25. package/.output/public/assets/insights-usage-rpc-VHj8vyBt.js +1 -0
  26. package/.output/public/assets/insights_.distribution-ADcrX48c.js +2 -0
  27. package/.output/public/assets/insights_.distribution-CuuJUN6Y.js +1 -0
  28. package/.output/public/assets/insights_.distribution-DJRjuXsO.js +1 -0
  29. package/.output/public/assets/installations-BSBBzqWs.js +2 -0
  30. package/.output/public/assets/installations-DqIE6WcO.js +1 -0
  31. package/.output/public/assets/installations-UsELbDvw.js +1 -0
  32. package/.output/public/assets/loader-circle-CnCBxzHp.js +1 -0
  33. package/.output/public/assets/mutation-Csp7xUNh.js +1 -0
  34. package/.output/public/assets/preload-helper-B-cOmpLH.js +1 -0
  35. package/.output/public/assets/refresh-cw-FF1NtzlQ.js +1 -0
  36. package/.output/public/assets/routes-CoN9XHP_.js +2 -0
  37. package/.output/public/assets/routes-DT1jB0Zi.js +1 -0
  38. package/.output/public/assets/sidebar-D8mJRF15.js +3 -0
  39. package/.output/public/assets/styles-Bwt7v6U5.css +2 -0
  40. package/.output/public/assets/table-WBgfvgXg.js +1 -0
  41. package/.output/public/assets/useCompositeListItem-CloBmDwn.js +1 -0
  42. package/.output/public/assets/useMutation-DO8cvsTx.js +1 -0
  43. package/.output/public/assets/useOpenInteractionType-ReGr9GzJ.js +1 -0
  44. package/.output/public/assets/valueToPercent-BvPAi4bP.js +1 -0
  45. package/.output/server/{__23tanstack-start-server-fn-resolver-B7ioJhtE.mjs → __23tanstack-start-server-fn-resolver-DMRD4e4f.mjs} +51 -47
  46. package/.output/server/_libs/@base-ui/react+[...].mjs +7044 -3622
  47. package/.output/server/_libs/@reduxjs/toolkit+[...].mjs +1554 -0
  48. package/.output/server/_libs/@tanstack/react-router+[...].mjs +3803 -4023
  49. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +141 -98
  50. package/.output/server/_libs/d3-array.mjs +231 -0
  51. package/.output/server/_libs/d3-color.mjs +330 -0
  52. package/.output/server/_libs/d3-format.mjs +252 -0
  53. package/.output/server/_libs/d3-interpolate.mjs +207 -0
  54. package/.output/server/_libs/d3-path.mjs +77 -0
  55. package/.output/server/_libs/d3-scale+[...].mjs +1907 -0
  56. package/.output/server/_libs/d3-shape.mjs +818 -0
  57. package/.output/server/_libs/decimal.js-light.mjs +884 -0
  58. package/.output/server/_libs/es-toolkit.mjs +1159 -0
  59. package/.output/server/_libs/eventemitter3.mjs +236 -0
  60. package/.output/server/_libs/immer.mjs +532 -0
  61. package/.output/server/_libs/lucide-react.mjs +46 -32
  62. package/.output/server/_libs/next-themes.mjs +2 -2
  63. package/.output/server/_libs/react-redux+[...].mjs +205 -0
  64. package/.output/server/_libs/recharts+[...].mjs +14350 -0
  65. package/.output/server/_libs/sonner.mjs +2 -2
  66. package/.output/server/_libs/tanstack__history.mjs +68 -41
  67. package/.output/server/_libs/tanstack__query-core.mjs +1618 -309
  68. package/.output/server/_libs/tanstack__react-query.mjs +262 -22
  69. package/.output/server/_libs/verkit.mjs +99 -1
  70. package/.output/server/_runtime.mjs +10 -1
  71. package/.output/server/_ssr/ConsoleFeatureUnavailable-Du7jNPNS.mjs +58 -0
  72. package/.output/server/_ssr/{HashValueDisplay-DwpGLfrl.mjs → HashValueDisplay-GQvFkXoi.mjs} +3 -3
  73. package/.output/server/_ssr/InsightsInfo-Do7QSaFR.mjs +37 -0
  74. package/.output/server/_ssr/InsightsPageHeader-DSUWUWRc.mjs +154 -0
  75. package/.output/server/_ssr/NotFoundPage-DsF4Vrhg.mjs +37 -0
  76. package/.output/server/_ssr/api-BEiVs0H7.mjs +203 -0
  77. package/.output/server/_ssr/api-keys-BrvBWGRf.mjs +5 -0
  78. package/.output/server/_ssr/{api-keys-CZeTPQys.mjs → api-keys-K5v32nf7.mjs} +49 -9
  79. package/.output/server/_ssr/api-keys-rpc-B96bBllm.mjs +52 -0
  80. package/.output/server/_ssr/api-rpc-DcUe280B.mjs +296 -0
  81. package/.output/server/_ssr/{auth-rpc-DUaeOWKK.mjs → auth-rpc-C68W56DP.mjs} +6 -6
  82. package/.output/server/_ssr/auth.server-DM1J6NwR.mjs +5712 -0
  83. package/.output/server/_ssr/bundleActivity-CpuY9CTP.mjs +19 -0
  84. package/.output/server/_ssr/card-CPAEKx0w.mjs +49 -0
  85. package/.output/server/_ssr/config-nsIcsHh8.mjs +15 -0
  86. package/.output/server/_ssr/config.server-DDCZk3Sq.mjs +36 -0
  87. package/.output/server/_ssr/console-access-Da-2Qd7q.mjs +17 -0
  88. package/.output/server/_ssr/console-features-Dzu2iUGD.mjs +55 -0
  89. package/.output/server/_ssr/console-features-api-xAsSgFa_.mjs +43 -0
  90. package/.output/server/_ssr/console-features-rpc-qARGpB24.mjs +19 -0
  91. package/.output/server/_ssr/{createServerFn-B2hcXoPM.mjs → createMiddleware-BdBf_ezN.mjs} +67 -56
  92. package/.output/server/_ssr/{createServerRpc-DB29C_5p.mjs → createServerRpc-B_y2lrwA.mjs} +2 -2
  93. package/.output/server/_ssr/{databaseJsonValue-d6I3nAS4.mjs → databaseJsonValue-Bhxciy7Z.mjs} +28 -5
  94. package/.output/server/_ssr/databaseRows-DwMAjaF8.mjs +74 -0
  95. package/.output/server/_ssr/{dialog-DS-nw-pA.mjs → dialog-q__BJ7mQ.mjs} +2 -2
  96. package/.output/server/_ssr/{dist-CyzPaI5v.mjs → dist-Cxo9ghYv.mjs} +140 -6
  97. package/.output/server/_ssr/{downloadBundle-CNnYxYO2.mjs → downloadBundle-BW9I-pMQ.mjs} +10 -10
  98. package/.output/server/_ssr/empty-DcBTAooP.mjs +49 -0
  99. package/.output/server/_ssr/{empty-plugin-adapters-B5QvGpEl.mjs → empty-plugin-adapters-CYdinE-i.mjs} +1 -1
  100. package/.output/server/_ssr/{table-CnZmon_Z.mjs → field-QCDBVpXA.mjs} +63 -51
  101. package/.output/server/_ssr/getBundleChildren-DIAGCF4a.mjs +22 -0
  102. package/.output/server/_ssr/{input-group-BpsnmvZw.mjs → input-group-hCk2nUoU.mjs} +2 -2
  103. package/.output/server/_ssr/insights-BfBO0RFr.mjs +1238 -0
  104. package/.output/server/_ssr/insights-DsAU3-TB.mjs +14 -0
  105. package/.output/server/_ssr/insights-RIfg447W.mjs +5 -0
  106. package/.output/server/_ssr/insights-api-CDn-QQHU.mjs +105 -0
  107. package/.output/server/_ssr/insights-failures-BBGMhuUr.mjs +44 -0
  108. package/.output/server/_ssr/insights-failures-rpc-rA2dctK2.mjs +21 -0
  109. package/.output/server/_ssr/insights-recovery-Dpk6Mfb9.mjs +28 -0
  110. package/.output/server/_ssr/insights-recovery-rpc-BCaF-xSd.mjs +46 -0
  111. package/.output/server/_ssr/insights-recovery-rpc-CcgYyUHk.mjs +20 -0
  112. package/.output/server/_ssr/{insights-rpc-38DujK0G.mjs → insights-rpc-keycmwzw.mjs} +22 -14
  113. package/.output/server/_ssr/insights-search-BRg5VsNe.mjs +25 -0
  114. package/.output/server/_ssr/insights-usage-cbw9n2Fq.mjs +29 -0
  115. package/.output/server/_ssr/insights-usage-rpc-BKgV1QDf.mjs +29 -0
  116. package/.output/server/_ssr/insights-usage-rpc-D-JYachy.mjs +41 -0
  117. package/.output/server/_ssr/insightsRecovery-B7oMc8d8.mjs +45 -0
  118. package/.output/server/_ssr/insightsUsage-Oa7kk5ek.mjs +56 -0
  119. package/.output/server/_ssr/insights_.distribution-BIqOqRW0.mjs +335 -0
  120. package/.output/server/_ssr/insights_.distribution-CuUrDa7P.mjs +5 -0
  121. package/.output/server/_ssr/insights_.distribution-RT_6x_ud.mjs +14 -0
  122. package/.output/server/_ssr/{installations-DiVKEF5T.mjs → installations-BO5CjX2z.mjs} +517 -54
  123. package/.output/server/_ssr/installations-BjaHiIfh.mjs +5 -0
  124. package/.output/server/_ssr/installations-Dt5luA-N.mjs +69 -0
  125. package/.output/server/_ssr/listReleases-BitHzOYB.mjs +79 -0
  126. package/.output/server/_ssr/releaseManagement-B3e7I8J9.mjs +11 -0
  127. package/.output/server/_ssr/{router-B9wG_9f8.mjs → router-DfVAixxe.mjs} +135 -139
  128. package/.output/server/_ssr/{routes-D7Yh_jfj.mjs → routes-C6LstNp8.mjs} +176 -455
  129. package/.output/server/_ssr/routes-Q3Uhmwwz.mjs +292 -0
  130. package/.output/server/_ssr/runtime.server-fL0o6I2b.mjs +1459 -0
  131. package/.output/server/_ssr/schema-BKY9SqaY.mjs +25 -0
  132. package/.output/server/_ssr/select-CUlInmjk.mjs +107 -0
  133. package/.output/server/_ssr/server-C43wq9ft.mjs +8330 -0
  134. package/.output/server/_ssr/{createSsrRpc-DjWNJ0uc.mjs → sidebar-DKbx2ach.mjs} +117 -63
  135. package/.output/server/_ssr/ssr.mjs +1 -1
  136. package/.output/server/_ssr/start-BXUOv_n8.mjs +4 -0
  137. package/.output/server/_ssr/table-NGWV8B-S.mjs +53 -0
  138. package/.output/server/_ssr/updateFailures-Jwe2Baab.mjs +24 -0
  139. package/.output/server/_ssr/{uuidv7-D0QFkPL_.mjs → uuidv7-C8bwiZr8.mjs} +2 -2
  140. package/.output/server/_tanstack-start-manifest_v-WQ5qGn8n.mjs +124 -0
  141. package/.output/server/index.mjs +267 -162
  142. package/LICENSE +13 -14
  143. package/README.md +82 -72
  144. package/lib/index.d.mts +23 -11
  145. package/lib/vite-internal.mjs +13 -3
  146. package/lib/vite.d.mts +2 -0
  147. package/package.json +14 -14
  148. package/src/components/AppSidebar.tsx +100 -71
  149. package/src/components/ConsoleAccessPage.tsx +5 -1
  150. package/src/components/ConsoleFeatureUnavailable.tsx +80 -0
  151. package/src/components/NotFoundPage.tsx +7 -7
  152. package/src/components/features/FeatureSlots.tsx +99 -0
  153. package/src/components/features/api-keys/apiKeysFeatureUi.tsx +15 -0
  154. package/src/components/features/bundles/BundleMetadata.tsx +8 -5
  155. package/src/components/features/bundles/RolloutCohortsDialog.tsx +1 -1
  156. package/src/components/features/channels/ChannelManagementDialog.tsx +2 -5
  157. package/src/components/features/insights/AppUsage.tsx +370 -0
  158. package/src/components/features/insights/EstimatedCount.tsx +18 -0
  159. package/src/components/features/insights/EventDetails.tsx +117 -37
  160. package/src/components/features/insights/EventHistoryCard.tsx +112 -26
  161. package/src/components/features/insights/EventHistoryList.tsx +2 -2
  162. package/src/components/features/insights/InsightsControls.tsx +265 -102
  163. package/src/components/features/insights/InsightsErrorAlert.tsx +14 -1
  164. package/src/components/features/insights/InsightsInfo.tsx +48 -0
  165. package/src/components/features/insights/InsightsOverview.tsx +176 -173
  166. package/src/components/features/insights/InsightsPageHeader.tsx +35 -20
  167. package/src/components/features/insights/InsightsPeriodSelector.tsx +89 -0
  168. package/src/components/features/insights/InstallationHistoryCard.tsx +52 -10
  169. package/src/components/features/insights/InstallationMatchesCard.tsx +1 -1
  170. package/src/components/features/insights/ReleaseActivity.tsx +188 -0
  171. package/src/components/features/insights/ReportingDevicesSummary.tsx +65 -0
  172. package/src/components/features/insights/UpdateFailures.tsx +319 -0
  173. package/src/components/features/insights/insightsFeatureUi.tsx +35 -0
  174. package/src/components/features/releases/ReleaseEditorSheet.tsx +30 -7
  175. package/src/components/ui/card.tsx +1 -1
  176. package/src/components/ui/empty.tsx +101 -0
  177. package/src/components/ui/scroll-area.tsx +52 -0
  178. package/src/components/ui/sidebar.tsx +22 -29
  179. package/src/components/ui/tabs.tsx +81 -0
  180. package/src/index.ts +26 -19
  181. package/src/lib/api-keys-api.ts +0 -28
  182. package/src/lib/api-keys-rpc.ts +27 -38
  183. package/src/lib/api-rpc.ts +189 -266
  184. package/src/lib/api.ts +19 -102
  185. package/src/lib/bundle-activity.ts +31 -0
  186. package/src/lib/console-access.ts +20 -0
  187. package/src/lib/console-features-api.ts +68 -0
  188. package/src/lib/console-features-rpc.ts +13 -0
  189. package/src/lib/console-features.ts +91 -0
  190. package/src/lib/insights-api.ts +37 -1
  191. package/src/lib/insights-failures-rpc.ts +21 -0
  192. package/src/lib/insights-failures.ts +129 -0
  193. package/src/lib/insights-recovery-rpc.ts +51 -0
  194. package/src/lib/insights-recovery.ts +68 -0
  195. package/src/lib/insights-retention.ts +21 -0
  196. package/src/lib/insights-rpc.ts +30 -12
  197. package/src/lib/insights-search.ts +58 -0
  198. package/src/lib/insights-usage-rpc.ts +29 -0
  199. package/src/lib/insights-usage.ts +74 -0
  200. package/src/lib/insights-view.ts +38 -2
  201. package/src/lib/scroll-restoration.ts +21 -0
  202. package/src/lib/server/adminInsights.ts +124 -0
  203. package/src/lib/server/auth.server.ts +13 -5
  204. package/src/lib/server/bundleActivity.ts +37 -0
  205. package/src/lib/server/config.server.ts +21 -74
  206. package/src/lib/server/console-feature-apis.ts +59 -0
  207. package/src/lib/server/console-runtime.server.ts +82 -38
  208. package/src/lib/server/downloadBundle.ts +16 -15
  209. package/src/lib/server/getBundleChildren.ts +31 -122
  210. package/src/lib/server/insightsRecovery.ts +55 -0
  211. package/src/lib/server/insightsUsage.ts +63 -0
  212. package/src/lib/server/listReleases.ts +109 -44
  213. package/src/lib/server/releaseReachability.ts +8 -7
  214. package/src/lib/server/runtime.server.ts +120 -31
  215. package/src/lib/server/updateFailures.ts +31 -0
  216. package/src/routeTree.gen.ts +44 -44
  217. package/src/router.tsx +3 -2
  218. package/src/routes/-installations-search.ts +32 -8
  219. package/src/routes/-releases-search.ts +76 -29
  220. package/src/routes/__root.tsx +10 -4
  221. package/src/routes/api/bundles/$bundleId/download.ts +2 -5
  222. package/src/routes/api-keys.tsx +5 -2
  223. package/src/routes/index.tsx +167 -104
  224. package/src/routes/insights.tsx +100 -59
  225. package/src/routes/insights_.distribution.tsx +398 -0
  226. package/src/routes/installations.tsx +98 -41
  227. package/src/vite-internal.ts +15 -3
  228. package/src/vite.ts +2 -0
  229. package/.output/public/assets/HashValueDisplay-CB0Eskit.js +0 -1
  230. package/.output/public/assets/InsightsPageHeader-Car5LNiZ.js +0 -1
  231. package/.output/public/assets/api-keys-BzKocqRy.js +0 -1
  232. package/.output/public/assets/api-keys-api-BHcODB7q.js +0 -1
  233. package/.output/public/assets/card-Dhr_eFYj.js +0 -1
  234. package/.output/public/assets/chart-no-axes-combined-Dy4WJv2U.js +0 -1
  235. package/.output/public/assets/composite-Bp98A0Ld.js +0 -1
  236. package/.output/public/assets/createServerFn-CA8fs7QD.js +0 -3
  237. package/.output/public/assets/dialog-CUTrcPlB.js +0 -1
  238. package/.output/public/assets/dist-C_NydL0e.js +0 -1
  239. package/.output/public/assets/index-DdAz-CXv.js +0 -10
  240. package/.output/public/assets/input-group-cSOG4wh_.js +0 -1
  241. package/.output/public/assets/insights-C0PBSZ-n.js +0 -1
  242. package/.output/public/assets/installations-CE33wgbY.js +0 -2
  243. package/.output/public/assets/installations-CStZja8x.js +0 -1
  244. package/.output/public/assets/lazyRouteComponent-Ccp3bwBY.js +0 -1
  245. package/.output/public/assets/link-CI8idAUi.js +0 -1
  246. package/.output/public/assets/loader-circle-BoxLrsOu.js +0 -1
  247. package/.output/public/assets/preload-helper-CQ36nxok.js +0 -1
  248. package/.output/public/assets/refresh-cw-Bqc72UZG.js +0 -1
  249. package/.output/public/assets/routes-DGVXdzpw.js +0 -2
  250. package/.output/public/assets/routes-DTlwOr8I.js +0 -1
  251. package/.output/public/assets/shield-check-uK3MHWJZ.js +0 -1
  252. package/.output/public/assets/signing-CMf4aqDO.js +0 -1
  253. package/.output/public/assets/styles-BCvbtKsm.css +0 -2
  254. package/.output/public/assets/table-2vcV89QB.js +0 -1
  255. package/.output/public/assets/useCompositeListItem-CHLITE_4.js +0 -1
  256. package/.output/public/assets/x-DCd0j8c6.js +0 -1
  257. package/.output/server/_ssr/InsightsPageHeader-Df4Brj8u.mjs +0 -484
  258. package/.output/server/_ssr/api-keys-api-BUPQVSpk.mjs +0 -60
  259. package/.output/server/_ssr/api-keys-rpc-Cs7tS5_j.mjs +0 -136
  260. package/.output/server/_ssr/api-rpc-tAupfGQm.mjs +0 -1399
  261. package/.output/server/_ssr/auth.server-DW71WzsD.mjs +0 -47
  262. package/.output/server/_ssr/bundle-signing-rpc-BhnBw0-d.mjs +0 -16
  263. package/.output/server/_ssr/bundle-signing.server-C4NW5mWx.mjs +0 -12
  264. package/.output/server/_ssr/card-BRiPmi0C.mjs +0 -108
  265. package/.output/server/_ssr/config-Dv8qLDZ0.mjs +0 -13
  266. package/.output/server/_ssr/config.server-afDuAwaG.mjs +0 -368
  267. package/.output/server/_ssr/databaseRows-5bCRTxm-.mjs +0 -126
  268. package/.output/server/_ssr/deleteBundle-BTGwBgzx.mjs +0 -66
  269. package/.output/server/_ssr/getBundleChildren-C0vh4ZvE.mjs +0 -50
  270. package/.output/server/_ssr/insights-BdS364Xu.mjs +0 -460
  271. package/.output/server/_ssr/insightsContract-fjJDBeEE.mjs +0 -303
  272. package/.output/server/_ssr/installations-CtA59MQG.mjs +0 -29
  273. package/.output/server/_ssr/routes-CKrrS2q2.mjs +0 -37
  274. package/.output/server/_ssr/runtime.server-DacU1TBV.mjs +0 -438
  275. package/.output/server/_ssr/server-D_C2rMzf.mjs +0 -7468
  276. package/.output/server/_ssr/signing-Dz1WkZOf.mjs +0 -133
  277. package/.output/server/_ssr/start-DpViQGnt.mjs +0 -4
  278. package/.output/server/_tanstack-start-manifest_v-2MjTyxil.mjs +0 -97
  279. package/src/components/features/insights/InsightsBundleReports.tsx +0 -51
  280. package/src/components/features/signing/BundleSigningPage.tsx +0 -139
  281. package/src/lib/bundle-signing-api.ts +0 -14
  282. package/src/lib/bundle-signing-rpc.ts +0 -16
  283. package/src/lib/server/bundle-signing.server.ts +0 -23
  284. package/src/lib/server/deleteBundle.ts +0 -145
  285. package/src/routes/signing.tsx +0 -37
@@ -1,133 +0,0 @@
1
- import { c as createServerFn } from "./createServerFn-B2hcXoPM.mjs";
2
- import { q as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
- import { S as Info, c as ShieldCheck, d as RefreshCw, k as CircleCheck, n as TriangleAlert } from "../_libs/lucide-react.mjs";
4
- import { _ as Skeleton, g as SidebarTrigger, t as Button$1, w as createSsrRpc } from "./createSsrRpc-DjWNJ0uc.mjs";
5
- import { n as useQuery } from "../_libs/tanstack__react-query.mjs";
6
- import { a as Badge, c as CardDescription, d as CardTitle, i as AlertTitle, n as AlertAction, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./card-BRiPmi0C.mjs";
7
- //#region node_modules/.nitro/vite/services/ssr/assets/signing-Dz1WkZOf.js
8
- var import_jsx_runtime = require_jsx_runtime();
9
- var getBundleSigningInspectionRpc = createServerFn({ method: "GET" }).handler(createSsrRpc("662034966679a6d29db2b55e7ba665e26e6c9a58a5529f33aa857a2049616233"));
10
- var bundleSigningQueryKey = ["bundle-signing"];
11
- var getBundleSigningInspectionQueryOptions = () => ({
12
- queryFn: () => getBundleSigningInspectionRpc(),
13
- queryKey: bundleSigningQueryKey,
14
- staleTime: 3e4
15
- });
16
- var useBundleSigningInspectionQuery = () => useQuery(getBundleSigningInspectionQueryOptions());
17
- function InspectionLoading() {
18
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
19
- "aria-label": "Loading bundle signing",
20
- className: "flex flex-col gap-6",
21
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-4 w-36" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-3 w-4/5" })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
22
- className: "flex flex-col gap-4",
23
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-12 w-full" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-12 w-full" })]
24
- })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-4 w-28" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-3 w-3/5" })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardContent, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-56 w-full" }) })] })]
25
- });
26
- }
27
- function InspectionError({ refetch }) {
28
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, {
29
- variant: "destructive",
30
- children: [
31
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, { "aria-hidden": "true" }),
32
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "Bundle signing couldn't be loaded" }),
33
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDescription, { children: "Check the Console connection and try again." }),
34
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertAction, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button$1, {
35
- onClick: refetch,
36
- size: "xs",
37
- variant: "outline",
38
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RefreshCw, { "data-icon": "inline-start" }), "Retry"]
39
- }) })
40
- ]
41
- });
42
- }
43
- function SigningStatusCard({ inspection }) {
44
- const enabled = inspection.status === "enabled";
45
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
46
- className: "flex flex-wrap items-center justify-between gap-2",
47
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
48
- className: "text-sm font-medium",
49
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: "Signing status" })
50
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
51
- variant: enabled ? "default" : "outline",
52
- children: enabled ? "Enabled" : "Disabled"
53
- })]
54
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardDescription, { children: enabled ? "Bundle signing is enabled in the current Hot Updater configuration." : "Bundle signing is disabled in the current Hot Updater configuration." })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardContent, {
55
- className: "flex flex-col gap-5",
56
- children: inspection.status === "disabled" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, { children: [
57
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Info, { "aria-hidden": "true" }),
58
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "Configure signing outside the Console" }),
59
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDescription, { children: "Use your signing provider or the Hot Updater CLI to configure a key. The Console never creates or stores private keys." })
60
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dl", {
61
- className: "grid gap-4 sm:grid-cols-2",
62
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
63
- className: "flex min-w-0 flex-col gap-1",
64
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", {
65
- className: "text-xs text-muted-foreground",
66
- children: "Provider"
67
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
68
- className: "truncate text-sm font-medium",
69
- children: inspection.provider
70
- })]
71
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
72
- className: "flex min-w-0 flex-col gap-1",
73
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", {
74
- className: "text-xs text-muted-foreground",
75
- children: "Algorithm"
76
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
77
- className: "text-sm font-medium",
78
- children: inspection.algorithm
79
- })]
80
- })]
81
- })
82
- })] });
83
- }
84
- function BundleSigningPage() {
85
- const inspection = useBundleSigningInspectionQuery();
86
- if (inspection.isLoading) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InspectionLoading, {});
87
- if (inspection.isError || !inspection.data) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InspectionError, { refetch: () => void inspection.refetch() });
88
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
89
- className: "flex flex-col gap-6",
90
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(SigningStatusCard, { inspection: inspection.data }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, { children: [
91
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleCheck, { "aria-hidden": "true" }),
92
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "Read-only inspection" }),
93
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDescription, { children: "Configure or rotate signing keys through the provider or Hot Updater CLI. The Console never accesses signing credentials." })
94
- ] })]
95
- });
96
- }
97
- function BundleSigningRoute() {
98
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
99
- className: "flex h-svh min-h-0 flex-col",
100
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", {
101
- className: "sticky top-0 z-10 flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 border-b bg-background px-3 py-3 sm:min-h-12 sm:flex-nowrap sm:bg-card/70 sm:px-4 sm:backdrop-blur-sm",
102
- children: [
103
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SidebarTrigger, { className: "-ml-1" }),
104
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
105
- className: "flex items-center gap-1.5",
106
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(ShieldCheck, {
107
- "aria-hidden": "true",
108
- className: "size-3.5 text-muted-foreground"
109
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
110
- className: "text-sm font-medium",
111
- children: "Bundle signing"
112
- })]
113
- }),
114
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
115
- variant: "outline",
116
- children: "Read-only"
117
- }),
118
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
119
- className: "basis-full pl-9 text-xs text-muted-foreground sm:basis-auto sm:pl-0",
120
- children: "Inspect the public key used to verify signed updates."
121
- })
122
- ]
123
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
124
- className: "min-h-0 min-w-0 flex-1 overflow-y-auto bg-muted/5 p-3 sm:p-6",
125
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
126
- className: "mx-auto w-full max-w-5xl",
127
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleSigningPage, {})
128
- })
129
- })]
130
- });
131
- }
132
- //#endregion
133
- export { BundleSigningRoute as component };
@@ -1,4 +0,0 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/start-DpViQGnt.js
2
- var startInstance = void 0;
3
- //#endregion
4
- export { startInstance };
@@ -1,97 +0,0 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-2MjTyxil.js
2
- var tsrStartManifest = () => ({ routes: {
3
- __root__: {
4
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/__root.tsx",
5
- children: [
6
- "/",
7
- "/api-keys",
8
- "/insights",
9
- "/installations",
10
- "/signing",
11
- "/api/auth/$",
12
- "/api/bundles/$bundleId/download"
13
- ],
14
- preloads: [
15
- "/assets/index-DdAz-CXv.js",
16
- "/assets/createServerFn-CA8fs7QD.js",
17
- "/assets/preload-helper-CQ36nxok.js",
18
- "/assets/installations-CE33wgbY.js",
19
- "/assets/loader-circle-BoxLrsOu.js",
20
- "/assets/link-CI8idAUi.js",
21
- "/assets/lazyRouteComponent-Ccp3bwBY.js",
22
- "/assets/chart-no-axes-combined-Dy4WJv2U.js",
23
- "/assets/shield-check-uK3MHWJZ.js",
24
- "/assets/api-keys-api-BHcODB7q.js",
25
- "/assets/routes-DGVXdzpw.js",
26
- "/assets/dist-C_NydL0e.js"
27
- ],
28
- scripts: [{ attrs: {
29
- type: "module",
30
- async: !0,
31
- src: "/assets/index-DdAz-CXv.js"
32
- } }]
33
- },
34
- "/": {
35
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/index.tsx",
36
- children: void 0,
37
- preloads: [
38
- "/assets/routes-DTlwOr8I.js",
39
- "/assets/dialog-CUTrcPlB.js",
40
- "/assets/composite-Bp98A0Ld.js",
41
- "/assets/useCompositeListItem-CHLITE_4.js",
42
- "/assets/table-2vcV89QB.js",
43
- "/assets/HashValueDisplay-CB0Eskit.js",
44
- "/assets/x-DCd0j8c6.js",
45
- "/assets/card-Dhr_eFYj.js",
46
- "/assets/input-group-cSOG4wh_.js"
47
- ]
48
- },
49
- "/api-keys": {
50
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/api-keys.tsx",
51
- children: void 0,
52
- preloads: [
53
- "/assets/api-keys-BzKocqRy.js",
54
- "/assets/dialog-CUTrcPlB.js",
55
- "/assets/table-2vcV89QB.js",
56
- "/assets/refresh-cw-Bqc72UZG.js",
57
- "/assets/card-Dhr_eFYj.js"
58
- ]
59
- },
60
- "/insights": {
61
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/insights.tsx",
62
- children: void 0,
63
- preloads: [
64
- "/assets/insights-C0PBSZ-n.js",
65
- "/assets/composite-Bp98A0Ld.js",
66
- "/assets/useCompositeListItem-CHLITE_4.js",
67
- "/assets/InsightsPageHeader-Car5LNiZ.js",
68
- "/assets/table-2vcV89QB.js",
69
- "/assets/card-Dhr_eFYj.js"
70
- ]
71
- },
72
- "/installations": {
73
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/installations.tsx",
74
- children: void 0,
75
- preloads: [
76
- "/assets/installations-CStZja8x.js",
77
- "/assets/InsightsPageHeader-Car5LNiZ.js",
78
- "/assets/table-2vcV89QB.js",
79
- "/assets/HashValueDisplay-CB0Eskit.js",
80
- "/assets/refresh-cw-Bqc72UZG.js",
81
- "/assets/x-DCd0j8c6.js",
82
- "/assets/card-Dhr_eFYj.js",
83
- "/assets/input-group-cSOG4wh_.js"
84
- ]
85
- },
86
- "/signing": {
87
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/signing.tsx",
88
- children: void 0,
89
- preloads: [
90
- "/assets/signing-CMf4aqDO.js",
91
- "/assets/refresh-cw-Bqc72UZG.js",
92
- "/assets/card-Dhr_eFYj.js"
93
- ]
94
- }
95
- } });
96
- //#endregion
97
- export { tsrStartManifest };
@@ -1,51 +0,0 @@
1
- import type { InsightsBundleSelection } from "@hot-updater/server";
2
- import { useState } from "react";
3
-
4
- import { useInsightsEventsQuery } from "@/lib/insights-api";
5
- import { outcomeLabels } from "@/lib/insights-view";
6
-
7
- import { EventHistoryCard } from "./EventHistoryCard";
8
-
9
- export type InsightsReportSelection = {
10
- readonly bundle: InsightsBundleSelection;
11
- readonly sinceMs: number;
12
- readonly beforeReceivedAtMs: number;
13
- };
14
-
15
- export function InsightsBundleReports({
16
- selection,
17
- }: {
18
- readonly selection: InsightsReportSelection;
19
- }) {
20
- const [cursors, setCursors] = useState<readonly (string | undefined)[]>([
21
- undefined,
22
- ]);
23
- const events = useInsightsEventsQuery(
24
- { ...selection, cursor: cursors.at(-1), limit: 50 },
25
- true,
26
- );
27
- return (
28
- <EventHistoryCard
29
- title={outcomeLabels[selection.bundle.outcome]}
30
- error={events.error}
31
- eventsLocation={{ eventsBefore: selection.beforeReceivedAtMs }}
32
- history={events.data}
33
- isFetching={events.isFetching}
34
- isLoading={events.isLoading}
35
- onNext={() => {
36
- const cursor = events.data?.nextCursor;
37
- if (cursor) setCursors((previous) => [...previous, cursor]);
38
- }}
39
- onPrevious={() => setCursors((previous) => previous.slice(0, -1))}
40
- onRefresh={() => {
41
- void events.refetch();
42
- }}
43
- pageNumber={cursors.length}
44
- >
45
- <p className="text-sm text-muted-foreground">
46
- Reports for the selected bundle and the measured period. New reports
47
- appear after refreshing the overview.
48
- </p>
49
- </EventHistoryCard>
50
- );
51
- }
@@ -1,139 +0,0 @@
1
- import { AlertTriangle, CheckCircle2, Info, RefreshCw } from "lucide-react";
2
-
3
- import {
4
- Alert,
5
- AlertAction,
6
- AlertDescription,
7
- AlertTitle,
8
- } from "@/components/ui/alert";
9
- import { Badge } from "@/components/ui/badge";
10
- import { Button } from "@/components/ui/button";
11
- import {
12
- Card,
13
- CardContent,
14
- CardDescription,
15
- CardHeader,
16
- CardTitle,
17
- } from "@/components/ui/card";
18
- import { Skeleton } from "@/components/ui/skeleton";
19
- import { useBundleSigningInspectionQuery } from "@/lib/bundle-signing-api";
20
- import type { BundleSigningInspection } from "@/lib/bundle-signing-rpc";
21
-
22
- function InspectionLoading() {
23
- return (
24
- <div aria-label="Loading bundle signing" className="flex flex-col gap-6">
25
- <Card>
26
- <CardHeader>
27
- <Skeleton className="h-4 w-36" />
28
- <Skeleton className="h-3 w-4/5" />
29
- </CardHeader>
30
- <CardContent className="flex flex-col gap-4">
31
- <Skeleton className="h-12 w-full" />
32
- <Skeleton className="h-12 w-full" />
33
- </CardContent>
34
- </Card>
35
- <Card>
36
- <CardHeader>
37
- <Skeleton className="h-4 w-28" />
38
- <Skeleton className="h-3 w-3/5" />
39
- </CardHeader>
40
- <CardContent>
41
- <Skeleton className="h-56 w-full" />
42
- </CardContent>
43
- </Card>
44
- </div>
45
- );
46
- }
47
-
48
- function InspectionError({ refetch }: { readonly refetch: () => void }) {
49
- return (
50
- <Alert variant="destructive">
51
- <AlertTriangle aria-hidden="true" />
52
- <AlertTitle>Bundle signing couldn't be loaded</AlertTitle>
53
- <AlertDescription>
54
- Check the Console connection and try again.
55
- </AlertDescription>
56
- <AlertAction>
57
- <Button onClick={refetch} size="xs" variant="outline">
58
- <RefreshCw data-icon="inline-start" />
59
- Retry
60
- </Button>
61
- </AlertAction>
62
- </Alert>
63
- );
64
- }
65
-
66
- function SigningStatusCard({
67
- inspection,
68
- }: {
69
- readonly inspection: BundleSigningInspection;
70
- }) {
71
- const enabled = inspection.status === "enabled";
72
- const status = enabled ? "Enabled" : "Disabled";
73
-
74
- return (
75
- <Card>
76
- <CardHeader>
77
- <div className="flex flex-wrap items-center justify-between gap-2">
78
- <CardTitle className="text-sm font-medium">
79
- <h2>Signing status</h2>
80
- </CardTitle>
81
- <Badge variant={enabled ? "default" : "outline"}>{status}</Badge>
82
- </div>
83
- <CardDescription>
84
- {enabled
85
- ? "Bundle signing is enabled in the current Hot Updater configuration."
86
- : "Bundle signing is disabled in the current Hot Updater configuration."}
87
- </CardDescription>
88
- </CardHeader>
89
- <CardContent className="flex flex-col gap-5">
90
- {inspection.status === "disabled" ? (
91
- <Alert>
92
- <Info aria-hidden="true" />
93
- <AlertTitle>Configure signing outside the Console</AlertTitle>
94
- <AlertDescription>
95
- Use your signing provider or the Hot Updater CLI to configure a
96
- key. The Console never creates or stores private keys.
97
- </AlertDescription>
98
- </Alert>
99
- ) : (
100
- <dl className="grid gap-4 sm:grid-cols-2">
101
- <div className="flex min-w-0 flex-col gap-1">
102
- <dt className="text-xs text-muted-foreground">Provider</dt>
103
- <dd className="truncate text-sm font-medium">
104
- {inspection.provider}
105
- </dd>
106
- </div>
107
- <div className="flex min-w-0 flex-col gap-1">
108
- <dt className="text-xs text-muted-foreground">Algorithm</dt>
109
- <dd className="text-sm font-medium">{inspection.algorithm}</dd>
110
- </div>
111
- </dl>
112
- )}
113
- </CardContent>
114
- </Card>
115
- );
116
- }
117
-
118
- export function BundleSigningPage() {
119
- const inspection = useBundleSigningInspectionQuery();
120
-
121
- if (inspection.isLoading) return <InspectionLoading />;
122
- if (inspection.isError || !inspection.data) {
123
- return <InspectionError refetch={() => void inspection.refetch()} />;
124
- }
125
-
126
- return (
127
- <div className="flex flex-col gap-6">
128
- <SigningStatusCard inspection={inspection.data} />
129
- <Alert>
130
- <CheckCircle2 aria-hidden="true" />
131
- <AlertTitle>Read-only inspection</AlertTitle>
132
- <AlertDescription>
133
- Configure or rotate signing keys through the provider or Hot Updater
134
- CLI. The Console never accesses signing credentials.
135
- </AlertDescription>
136
- </Alert>
137
- </div>
138
- );
139
- }
@@ -1,14 +0,0 @@
1
- import { useQuery } from "@tanstack/react-query";
2
-
3
- import { getBundleSigningInspectionRpc } from "./bundle-signing-rpc";
4
-
5
- export const bundleSigningQueryKey = ["bundle-signing"] as const;
6
-
7
- export const getBundleSigningInspectionQueryOptions = () => ({
8
- queryFn: () => getBundleSigningInspectionRpc(),
9
- queryKey: bundleSigningQueryKey,
10
- staleTime: 30_000,
11
- });
12
-
13
- export const useBundleSigningInspectionQuery = () =>
14
- useQuery(getBundleSigningInspectionQueryOptions());
@@ -1,16 +0,0 @@
1
- import { createServerFn } from "@tanstack/react-start";
2
-
3
- export type { BundleSigningInspection } from "./server/bundle-signing.server";
4
-
5
- export const getBundleSigningInspection = async () => {
6
- const [{ prepareConfig }, { inspectBundleSigning }] = await Promise.all([
7
- import("./server/config.server"),
8
- import("./server/bundle-signing.server"),
9
- ]);
10
- const { config } = await prepareConfig();
11
- return inspectBundleSigning(config.signing);
12
- };
13
-
14
- export const getBundleSigningInspectionRpc = createServerFn({
15
- method: "GET",
16
- }).handler(getBundleSigningInspection);
@@ -1,23 +0,0 @@
1
- import type { ConsoleSigningConfig } from "../../index";
2
-
3
- const DEFAULT_PROVIDER = "Configured provider";
4
-
5
- export type BundleSigningInspection =
6
- | { readonly status: "disabled" }
7
- | {
8
- readonly status: "enabled";
9
- readonly provider: string;
10
- readonly algorithm: "RSA-SHA256";
11
- };
12
-
13
- export const inspectBundleSigning = async (
14
- signing: ConsoleSigningConfig | undefined,
15
- ): Promise<BundleSigningInspection> => {
16
- if (!signing?.enabled) return { status: "disabled" };
17
-
18
- return {
19
- algorithm: "RSA-SHA256",
20
- provider: signing.provider ?? DEFAULT_PROVIDER,
21
- status: "enabled",
22
- };
23
- };
@@ -1,145 +0,0 @@
1
- import {
2
- getBundlePatches,
3
- getManifestStorageUri,
4
- getPatchStorageUri,
5
- } from "@hot-updater/core";
6
- import type {
7
- Bundle,
8
- DatabaseClient,
9
- StoragePluginWith,
10
- } from "@hot-updater/plugin-core";
11
-
12
- interface DeleteBundleInput {
13
- bundleId: string;
14
- }
15
-
16
- interface DeleteBundlesInput {
17
- bundleIds: readonly string[];
18
- }
19
-
20
- interface DeleteBundleDependencies {
21
- databaseClient: DatabaseClient;
22
- storagePlugin: StoragePluginWith<"delete">;
23
- waitForStorageCleanup?: boolean;
24
- }
25
-
26
- function resolveStorageUriForDeletion(
27
- storageUri: string,
28
- storagePlugin: StoragePluginWith<"delete">,
29
- ) {
30
- const protocol = new URL(storageUri).protocol.replace(":", "");
31
-
32
- if (storagePlugin.protocol === protocol) {
33
- return storageUri;
34
- }
35
-
36
- if (protocol === "http" || protocol === "https") {
37
- return null;
38
- }
39
-
40
- throw new Error(`No storage plugin for protocol: ${protocol}`);
41
- }
42
-
43
- async function cleanupBundleStorage(
44
- bundle: Bundle,
45
- storagePlugin: StoragePluginWith<"delete">,
46
- ) {
47
- const cleanupUris = new Set<string>();
48
- const addCleanupUri = (storageUri: string | undefined) => {
49
- if (!storageUri) return;
50
- const resolvedStorageUri = resolveStorageUriForDeletion(
51
- storageUri,
52
- storagePlugin,
53
- );
54
- if (resolvedStorageUri) cleanupUris.add(resolvedStorageUri);
55
- };
56
-
57
- addCleanupUri(bundle.storageUri);
58
- addCleanupUri(getManifestStorageUri(bundle) ?? undefined);
59
- addCleanupUri(getPatchStorageUri(bundle) ?? undefined);
60
- for (const patch of getBundlePatches(bundle)) {
61
- addCleanupUri(patch.patchStorageUri);
62
- }
63
-
64
- for (const storageUri of cleanupUris) {
65
- try {
66
- await storagePlugin.delete({ storageUri });
67
- } catch (error) {
68
- console.error("Failed to delete bundle from storage:", error);
69
- }
70
- }
71
- }
72
-
73
- export async function deleteBundles(
74
- { bundleIds }: DeleteBundlesInput,
75
- {
76
- databaseClient,
77
- storagePlugin,
78
- waitForStorageCleanup = true,
79
- }: DeleteBundleDependencies,
80
- ) {
81
- const uniqueBundleIds = [...new Set(bundleIds)];
82
- const { data: matchedBundles } = await databaseClient.getBundles({
83
- where: { id: { in: uniqueBundleIds } },
84
- limit: uniqueBundleIds.length,
85
- });
86
- const matchedById = new Map(
87
- matchedBundles.map((bundle) => [bundle.id, bundle]),
88
- );
89
- const bundles = uniqueBundleIds.flatMap((bundleId) => {
90
- const bundle = matchedById.get(bundleId);
91
- return bundle ? [bundle] : [];
92
- });
93
- const missingBundleIds = uniqueBundleIds.filter(
94
- (bundleId) => !matchedById.has(bundleId),
95
- );
96
-
97
- for (const bundle of bundles) {
98
- const cleanupCandidates = [
99
- bundle.storageUri,
100
- getManifestStorageUri(bundle),
101
- getPatchStorageUri(bundle),
102
- ...getBundlePatches(bundle).map((patch) => patch.patchStorageUri),
103
- ].filter((value): value is string => Boolean(value));
104
- for (const candidate of cleanupCandidates) {
105
- resolveStorageUriForDeletion(candidate, storagePlugin);
106
- }
107
- }
108
-
109
- if (bundles.length > 0) {
110
- await databaseClient.mutate(async (mutation) => {
111
- for (const bundle of bundles) {
112
- await mutation.deleteBundleById(bundle.id);
113
- }
114
- });
115
- }
116
-
117
- const cleanupStorage = async () => {
118
- for (const bundle of bundles) {
119
- await cleanupBundleStorage(bundle, storagePlugin);
120
- }
121
- };
122
-
123
- if (waitForStorageCleanup) {
124
- await cleanupStorage();
125
- } else {
126
- void cleanupStorage().catch((error) => {
127
- console.error("Failed to clean up bundle storage:", error);
128
- });
129
- }
130
-
131
- return {
132
- deletedBundleIds: bundles.map((bundle) => bundle.id),
133
- missingBundleIds,
134
- };
135
- }
136
-
137
- export async function deleteBundle(
138
- { bundleId }: DeleteBundleInput,
139
- dependencies: DeleteBundleDependencies,
140
- ) {
141
- const result = await deleteBundles({ bundleIds: [bundleId] }, dependencies);
142
- if (result.missingBundleIds.length > 0) {
143
- throw new Error(`Bundle not found: ${bundleId}`);
144
- }
145
- }
@@ -1,37 +0,0 @@
1
- import { createFileRoute } from "@tanstack/react-router";
2
- import { ShieldCheck } from "lucide-react";
3
-
4
- import { BundleSigningPage } from "@/components/features/signing/BundleSigningPage";
5
- import { Badge } from "@/components/ui/badge";
6
- import { SidebarTrigger } from "@/components/ui/sidebar";
7
-
8
- export const Route = createFileRoute("/signing")({
9
- component: BundleSigningRoute,
10
- });
11
-
12
- function BundleSigningRoute() {
13
- return (
14
- <div className="flex h-svh min-h-0 flex-col">
15
- <header className="sticky top-0 z-10 flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 border-b bg-background px-3 py-3 sm:min-h-12 sm:flex-nowrap sm:bg-card/70 sm:px-4 sm:backdrop-blur-sm">
16
- <SidebarTrigger className="-ml-1" />
17
- <div className="flex items-center gap-1.5">
18
- <ShieldCheck
19
- aria-hidden="true"
20
- className="size-3.5 text-muted-foreground"
21
- />
22
- <h1 className="text-sm font-medium">Bundle signing</h1>
23
- </div>
24
- <Badge variant="outline">Read-only</Badge>
25
- <p className="basis-full pl-9 text-xs text-muted-foreground sm:basis-auto sm:pl-0">
26
- Inspect the public key used to verify signed updates.
27
- </p>
28
- </header>
29
-
30
- <div className="min-h-0 min-w-0 flex-1 overflow-y-auto bg-muted/5 p-3 sm:p-6">
31
- <div className="mx-auto w-full max-w-5xl">
32
- <BundleSigningPage />
33
- </div>
34
- </div>
35
- </div>
36
- );
37
- }