@camera.ui/server 0.0.25 → 0.0.27

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 (180) hide show
  1. package/dist/interface/{@mdi.C1UTQKuc.0.0.25.js → @mdi.D-fmakQN.0.0.27.js} +1 -1
  2. package/dist/interface/{@tanstack.DS6S0aUw.0.0.25.js → @tanstack.Bm3cSvpy.0.0.27.js} +1 -1
  3. package/dist/interface/{@vee-validate.Ck7LlKb4.0.0.25.js → @vee-validate.DLrUjipo.0.0.27.js} +1 -1
  4. package/dist/interface/{@vue.Cps6vB1j.0.0.25.js → @vue.Ddz2NYqM.0.0.27.js} +1 -1
  5. package/dist/interface/{@vueform.BdiHuFyw.0.0.25.js → @vueform.Bsdz6Sjj.0.0.27.js} +1 -1
  6. package/dist/interface/{@vueuse.C_FaY5AU.0.0.25.js → @vueuse.D0Q3b7aI.0.0.27.js} +1 -1
  7. package/dist/interface/{Account.BKFUF_1I.0.0.25.js → Account.Bt1PPTrH.0.0.27.js} +1 -1
  8. package/dist/interface/{Adminpanel.DrVGmhuD.0.0.25.js → Adminpanel.B3TDnuln.0.0.27.js} +2 -2
  9. package/dist/interface/{Appearance.C3Aonbm5.0.0.25.js → Appearance.BCEXPIo-.0.0.27.js} +1 -1
  10. package/dist/interface/Backup.wTP3FHTG.0.0.27.js +1 -0
  11. package/dist/interface/Camera.DBN_IYRw.0.0.27.js +1 -0
  12. package/dist/interface/Cameras.D0Uxx50g.0.0.27.js +1 -0
  13. package/dist/interface/{Camview.soVYCi4c.0.0.25.js → Camview.BJZZ90Mk.0.0.27.js} +1 -1
  14. package/dist/interface/Config.obFokUV3.0.0.27.js +1 -0
  15. package/dist/interface/Console.CYG9NwGE.0.0.27.js +4 -0
  16. package/dist/interface/FirstSteps.f8NWGktM.0.0.27.js +1 -0
  17. package/dist/interface/{NewCamera.Do0JsE9j.0.0.25.js → NewCamera.B5LfyCGA.0.0.27.js} +2 -2
  18. package/dist/interface/{Plugin.lTbk0yju.0.0.25.js → Plugin.CYOwdXoP.0.0.27.js} +1 -1
  19. package/dist/interface/{Plugins.CfqUIlTL.0.0.25.js → Plugins.HVavkzPy.0.0.27.js} +1 -1
  20. package/dist/interface/Recordings.DJ_Yg9BF.0.0.27.js +1 -0
  21. package/dist/interface/Recordings.X74Lf9uI.0.0.27.js +1 -0
  22. package/dist/interface/{Settings.BOvuxTQb.0.0.25.js → Settings.Bx_yejjH.0.0.27.js} +1 -1
  23. package/dist/interface/{System.BNvNnXLG.0.0.25.js → System.Dzred1Li.0.0.27.js} +2 -2
  24. package/dist/interface/{User.O9lM6tnQ.0.0.25.js → User.DUMD0zOF.0.0.27.js} +1 -1
  25. package/dist/interface/{VConfigEditor.vue_vue_type_script_setup_true_lang.370H2C51.0.0.25.js → VConfigEditor.vue_vue_type_script_setup_true_lang.DXHkH97r.0.0.27.js} +2 -2
  26. package/dist/interface/{VConsole.Bh0BYQl5.0.0.25.js → VConsole.NTILyp-m.0.0.27.js} +1 -1
  27. package/dist/interface/{VPlayer.CIerrnIA.0.0.25.js → VPlayer.DL37B_OL.0.0.27.js} +2 -2
  28. package/dist/interface/{VPluginCard.CspT3Ib0.0.0.25.js → VPluginCard.CrFn_CDt.0.0.27.js} +2 -2
  29. package/dist/interface/{ace-builds.XYfkWb88.0.0.25.js → ace-builds.BFkjIdtB.0.0.27.js} +1 -1
  30. package/dist/interface/{apexcharts.BL-vEXry.0.0.25.js → apexcharts.Dx0G2irl.0.0.27.js} +1 -1
  31. package/dist/interface/assets/Camera.0.0.27.DurX54CO.css +1 -0
  32. package/dist/interface/assets/FirstSteps.0.0.27.BHh3CorE.css +1 -0
  33. package/dist/interface/assets/{main.0.0.25.DNhh__S1.css → main.0.0.27.k2hmg3ho.css} +1 -1
  34. package/dist/interface/backup.C_RMOdcs.0.0.27.js +1 -0
  35. package/dist/interface/{dnd-core.B11Qy5OS.0.0.25.js → dnd-core.DGhTBgTz.0.0.27.js} +1 -1
  36. package/dist/interface/{draggabilly.Dgm1b25J.0.0.25.js → draggabilly.De9lRZQ1.0.0.27.js} +1 -1
  37. package/dist/interface/{engine.io-client.D0e_hPTL.0.0.25.js → engine.io-client.4V7g_fDW.0.0.27.js} +1 -1
  38. package/dist/interface/{ev-emitter.Bx2XssKf.0.0.25.js → ev-emitter.plEcNLrI.0.0.27.js} +1 -1
  39. package/dist/interface/{fast-deep-equal.B1d0tCKF.0.0.25.js → fast-deep-equal.CiFMNAjk.0.0.27.js} +1 -1
  40. package/dist/interface/{highlight.js.Djovyq4W.0.0.25.js → highlight.js.D7RMSaM-.0.0.27.js} +1 -1
  41. package/dist/interface/index.html +32 -32
  42. package/dist/interface/{linkify-it.BPW1TjDb.0.0.25.js → linkify-it.Calax-6O.0.0.27.js} +1 -1
  43. package/dist/interface/main.BXOJy68s.0.0.27.js +5 -0
  44. package/dist/interface/{markdown-it.BI1ojV5J.0.0.25.js → markdown-it.lwcVlCWR.0.0.27.js} +1 -1
  45. package/dist/interface/{nprogress.jHQGJjg9.0.0.25.js → nprogress.Dro1FQza.0.0.27.js} +1 -1
  46. package/dist/interface/{pinia.DVJV3DUJ.0.0.25.js → pinia.B6vj0NYr.0.0.27.js} +1 -1
  47. package/dist/interface/{plugins.B9YdMqtM.0.0.25.js → plugins.C3CWZVgs.0.0.27.js} +1 -1
  48. package/dist/interface/{qrcode.CAZtYnFa.0.0.25.js → qrcode.BQXbEKE5.0.0.27.js} +1 -1
  49. package/dist/interface/{react-dnd-touch-backend.DE6tNgWC.0.0.25.js → react-dnd-touch-backend.OwiLGVtH.0.0.27.js} +1 -1
  50. package/dist/interface/{rxjs.BMKzkXQf.0.0.25.js → rxjs.BEfAF_vM.0.0.27.js} +1 -1
  51. package/dist/interface/{socket.io-client.J9R2OCKo.0.0.25.js → socket.io-client.CBJOn-57.0.0.27.js} +1 -1
  52. package/dist/interface/{socket.io-parser.D6J01YxN.0.0.25.js → socket.io-parser.CEFWw8jT.0.0.27.js} +1 -1
  53. package/dist/interface/sw.js +1 -1
  54. package/dist/interface/{system.CR11-k1L.0.0.25.js → system.l1x-e9Wo.0.0.27.js} +1 -1
  55. package/dist/interface/{unidragger.DRwD7wmc.0.0.25.js → unidragger.BXH5FbO6.0.0.27.js} +1 -1
  56. package/dist/interface/{vee-validate.4fr978O8.0.0.25.js → vee-validate.C3HAoDnO.0.0.27.js} +1 -1
  57. package/dist/interface/{vue-i18n.BOZgCyg9.0.0.25.js → vue-i18n.BGb0iC47.0.0.27.js} +1 -1
  58. package/dist/interface/{vue-inline-svg.CE-o9lK4.0.0.25.js → vue-inline-svg.Bpl1FbWF.0.0.27.js} +1 -1
  59. package/dist/interface/{vue-router.Bz4d7Nhi.0.0.25.js → vue-router.BAOHLc3X.0.0.27.js} +1 -1
  60. package/dist/interface/{vue3-apexcharts.Dy2eUw3m.0.0.25.js → vue3-apexcharts.L2GUpfG8.0.0.27.js} +1 -1
  61. package/dist/interface/{vue3-dnd.B89OIvTY.0.0.25.js → vue3-dnd.DzHpcZOS.0.0.27.js} +1 -1
  62. package/dist/interface/{vue3-toastify.CQ8OELFA.0.0.25.js → vue3-toastify.B5nE8tfx.0.0.27.js} +1 -1
  63. package/dist/interface/{vuetify.CUVKBXL8.0.0.25.js → vuetify.CcSBzYNW.0.0.27.js} +2 -2
  64. package/dist/server/package.json +4 -4
  65. package/dist/server/src/api/controllers/backup.controller.js +1 -1
  66. package/dist/server/src/api/controllers/backup.controller.js.map +1 -1
  67. package/dist/server/src/api/controllers/plugins.controller.d.ts +0 -9
  68. package/dist/server/src/api/controllers/plugins.controller.js +21 -242
  69. package/dist/server/src/api/controllers/plugins.controller.js.map +1 -1
  70. package/dist/server/src/api/controllers/system.controller.d.ts +0 -4
  71. package/dist/server/src/api/controllers/system.controller.js +1 -30
  72. package/dist/server/src/api/controllers/system.controller.js.map +1 -1
  73. package/dist/server/src/api/database/types.d.ts +0 -4
  74. package/dist/server/src/api/index.d.ts +3 -1
  75. package/dist/server/src/api/index.js.map +1 -1
  76. package/dist/server/src/api/services/backup.service.d.ts +4 -4
  77. package/dist/server/src/api/services/backup.service.js +32 -29
  78. package/dist/server/src/api/services/backup.service.js.map +1 -1
  79. package/dist/server/src/api/services/plugins.service.d.ts +16 -4
  80. package/dist/server/src/api/services/plugins.service.js +250 -17
  81. package/dist/server/src/api/services/plugins.service.js.map +1 -1
  82. package/dist/server/src/api/services/system.service.d.ts +6 -0
  83. package/dist/server/src/api/services/system.service.js +41 -1
  84. package/dist/server/src/api/services/system.service.js.map +1 -1
  85. package/dist/server/src/api/types/index.d.ts +13 -0
  86. package/dist/server/src/api/utils/cameraSource.d.ts +1 -1
  87. package/dist/server/src/api/utils/cameraSource.js +2 -2
  88. package/dist/server/src/api/utils/cameraSource.js.map +1 -1
  89. package/dist/server/src/api/utils/cert.js +1 -1
  90. package/dist/server/src/api/utils/cert.js.map +1 -1
  91. package/dist/server/src/api/utils/fetch.d.ts +1 -2
  92. package/dist/server/src/api/utils/fetch.js +2 -3
  93. package/dist/server/src/api/utils/fetch.js.map +1 -1
  94. package/dist/server/src/api/utils/moveFiles.d.ts +4 -1
  95. package/dist/server/src/api/utils/moveFiles.js +33 -35
  96. package/dist/server/src/api/utils/moveFiles.js.map +1 -1
  97. package/dist/server/src/api/utils/parse.d.ts +1 -1
  98. package/dist/server/src/api/utils/parse.js +2 -2
  99. package/dist/server/src/api/utils/parse.js.map +1 -1
  100. package/dist/server/src/api/websocket/nsp/main.d.ts +2 -0
  101. package/dist/server/src/api/websocket/nsp/main.js +11 -0
  102. package/dist/server/src/api/websocket/nsp/main.js.map +1 -1
  103. package/dist/server/src/api/websocket/nsp/server.js +3 -3
  104. package/dist/server/src/api/websocket/nsp/server.js.map +1 -1
  105. package/dist/server/src/main.d.ts +3 -0
  106. package/dist/server/src/main.js +13 -2
  107. package/dist/server/src/main.js.map +1 -1
  108. package/dist/server/src/plugins/index.d.ts +3 -2
  109. package/dist/server/src/plugins/index.js +41 -5
  110. package/dist/server/src/plugins/index.js.map +1 -1
  111. package/dist/server/src/plugins/worker.js +102 -96
  112. package/dist/server/src/plugins/worker.js.map +1 -1
  113. package/dist/server/src/services/config/index.d.ts +1 -0
  114. package/dist/server/src/services/config/index.js +2 -0
  115. package/dist/server/src/services/config/index.js.map +1 -1
  116. package/package.json +4 -4
  117. package/dist/interface/Backup.Dsc-sceS.0.0.25.js +0 -1
  118. package/dist/interface/Camera.BCWd9-aG.0.0.25.js +0 -1
  119. package/dist/interface/Cameras.C_aGXOwa.0.0.25.js +0 -1
  120. package/dist/interface/Config.Bea3MqDf.0.0.25.js +0 -1
  121. package/dist/interface/Console.Dj-P-HVt.0.0.25.js +0 -4
  122. package/dist/interface/FirstSteps.CbvZw0Je.0.0.25.js +0 -1
  123. package/dist/interface/Recordings.C6OuQL3F.0.0.25.js +0 -1
  124. package/dist/interface/Recordings.QS-T1p9q.0.0.25.js +0 -1
  125. package/dist/interface/assets/Camera.0.0.25.D1I-fW4q.css +0 -1
  126. package/dist/interface/assets/FirstSteps.0.0.25.sPEcItZ6.css +0 -1
  127. package/dist/interface/main.De33w7Bp.0.0.25.js +0 -5
  128. /package/dist/interface/{@babel.l0sNRNKZ.0.0.25.js → @babel.l0sNRNKZ.0.0.27.js} +0 -0
  129. /package/dist/interface/{@intlify.DXtFJcML.0.0.25.js → @intlify.DXtFJcML.0.0.27.js} +0 -0
  130. /package/dist/interface/{@react-dnd.CcwRs9xb.0.0.25.js → @react-dnd.CcwRs9xb.0.0.27.js} +0 -0
  131. /package/dist/interface/{@socket.io.Dkula2eQ.0.0.25.js → @socket.io.Dkula2eQ.0.0.27.js} +0 -0
  132. /package/dist/interface/{@turf.l0sNRNKZ.0.0.25.js → @turf.l0sNRNKZ.0.0.27.js} +0 -0
  133. /package/dist/interface/{@xterm.BVBmkLtp.0.0.25.js → @xterm.DQVEcgIz.0.0.27.js} +0 -0
  134. /package/dist/interface/assets/{@vueform.0.0.25.CroAHJs8.css → @vueform.0.0.27.CroAHJs8.css} +0 -0
  135. /package/dist/interface/assets/{@xterm.0.0.25.CFbL2ovg.css → @xterm.0.0.27.CFbL2ovg.css} +0 -0
  136. /package/dist/interface/assets/{Account.0.0.25.J7oAjogS.css → Account.0.0.27.J7oAjogS.css} +0 -0
  137. /package/dist/interface/assets/{Adminpanel.0.0.25.a3t1v3MB.css → Adminpanel.0.0.27.a3t1v3MB.css} +0 -0
  138. /package/dist/interface/assets/{Backup.0.0.25.CX0rT0QJ.css → Backup.0.0.27.CX0rT0QJ.css} +0 -0
  139. /package/dist/interface/assets/{Cameras.0.0.25.Buf1Dgce.css → Cameras.0.0.27.Buf1Dgce.css} +0 -0
  140. /package/dist/interface/assets/{Camview.0.0.25.B7Cja2ry.css → Camview.0.0.27.B7Cja2ry.css} +0 -0
  141. /package/dist/interface/assets/{Config.0.0.25.DNGo2krN.css → Config.0.0.27.DNGo2krN.css} +0 -0
  142. /package/dist/interface/assets/{Console.0.0.25.Bh8l9QnM.css → Console.0.0.27.Bh8l9QnM.css} +0 -0
  143. /package/dist/interface/assets/{NewCamera.0.0.25.Cq8GzeJ7.css → NewCamera.0.0.27.Cq8GzeJ7.css} +0 -0
  144. /package/dist/interface/assets/{Plugin.0.0.25.DJbgaQc1.css → Plugin.0.0.27.DJbgaQc1.css} +0 -0
  145. /package/dist/interface/assets/{Plugins.0.0.25.DXSoO9M1.css → Plugins.0.0.27.DXSoO9M1.css} +0 -0
  146. /package/dist/interface/assets/{Settings.0.0.25.CVmui2kE.css → Settings.0.0.27.CVmui2kE.css} +0 -0
  147. /package/dist/interface/assets/{User.0.0.25.BiGtIFqt.css → User.0.0.27.BiGtIFqt.css} +0 -0
  148. /package/dist/interface/assets/{VConsole.0.0.25.BCqKHpmJ.css → VConsole.0.0.27.BCqKHpmJ.css} +0 -0
  149. /package/dist/interface/assets/{VPlayer.0.0.25.DNtDNhfg.css → VPlayer.0.0.27.DNtDNhfg.css} +0 -0
  150. /package/dist/interface/assets/{VPluginCard.0.0.25.C8Lj6X-J.css → VPluginCard.0.0.27.C8Lj6X-J.css} +0 -0
  151. /package/dist/interface/assets/{highlight.0.0.25.Ch2EwETz.css → highlight.0.0.27.Ch2EwETz.css} +0 -0
  152. /package/dist/interface/assets/{logo-256.0.0.25.BCQk9H1-.png → logo-256.0.0.27.BCQk9H1-.png} +0 -0
  153. /package/dist/interface/assets/{logo-512.0.0.25.DLKVOU2S.png → logo-512.0.0.27.DLKVOU2S.png} +0 -0
  154. /package/dist/interface/assets/{logo.0.0.25.DmEiRk0z.png → logo.0.0.27.DmEiRk0z.png} +0 -0
  155. /package/dist/interface/assets/{mode-json.0.0.25.Br7xisR1.js → mode-json.0.0.27.Br7xisR1.js} +0 -0
  156. /package/dist/interface/assets/{mode-yaml.0.0.25.CIYL8U3d.js → mode-yaml.0.0.27.CIYL8U3d.js} +0 -0
  157. /package/dist/interface/assets/{vue3-toastify.0.0.25.DHXAGmwn.css → vue3-toastify.0.0.27.DHXAGmwn.css} +0 -0
  158. /package/dist/interface/assets/{vuetify.0.0.25.CgGsw6iO.css → vuetify.0.0.27.CgGsw6iO.css} +0 -0
  159. /package/dist/interface/{axios.C-n2IhIP.0.0.25.js → axios.C-n2IhIP.0.0.27.js} +0 -0
  160. /package/dist/interface/{birpc.l0sNRNKZ.0.0.25.js → birpc.l0sNRNKZ.0.0.27.js} +0 -0
  161. /package/dist/interface/{compare-versions.DqEOhma6.0.0.25.js → compare-versions.DqEOhma6.0.0.27.js} +0 -0
  162. /package/dist/interface/{dijkstrajs.D_NXgYpA.0.0.25.js → dijkstrajs.D_NXgYpA.0.0.27.js} +0 -0
  163. /package/dist/interface/{engine.io-parser.BiEtp6m2.0.0.25.js → engine.io-parser.BiEtp6m2.0.0.27.js} +0 -0
  164. /package/dist/interface/{entities.C20TfXL6.0.0.25.js → entities.C20TfXL6.0.0.27.js} +0 -0
  165. /package/dist/interface/{get-size.D1dS-IaP.0.0.25.js → get-size.D1dS-IaP.0.0.27.js} +0 -0
  166. /package/dist/interface/{hookable.B8xFkYCm.0.0.25.js → hookable.B8xFkYCm.0.0.27.js} +0 -0
  167. /package/dist/interface/{mdurl.k9Sl0PQj.0.0.25.js → mdurl.k9Sl0PQj.0.0.27.js} +0 -0
  168. /package/dist/interface/{perfect-debounce.Cp2ysxOb.0.0.25.js → perfect-debounce.Cp2ysxOb.0.0.27.js} +0 -0
  169. /package/dist/interface/{point-in-polygon-hao.l0sNRNKZ.0.0.25.js → point-in-polygon-hao.l0sNRNKZ.0.0.27.js} +0 -0
  170. /package/dist/interface/{punycode.js.Dj65hjkv.0.0.25.js → punycode.js.Dj65hjkv.0.0.27.js} +0 -0
  171. /package/dist/interface/{react-dnd-html5-backend.1HQjlkwI.0.0.25.js → react-dnd-html5-backend.1HQjlkwI.0.0.27.js} +0 -0
  172. /package/dist/interface/{redux.CuxFRhX_.0.0.25.js → redux.CuxFRhX_.0.0.27.js} +0 -0
  173. /package/dist/interface/{sweepline-intersections.l0sNRNKZ.0.0.25.js → sweepline-intersections.l0sNRNKZ.0.0.27.js} +0 -0
  174. /package/dist/interface/{tslib.9k7AwCpt.0.0.25.js → tslib.9k7AwCpt.0.0.27.js} +0 -0
  175. /package/dist/interface/{types.Cz9TaZAP.0.0.25.js → types.Cz9TaZAP.0.0.27.js} +0 -0
  176. /package/dist/interface/{uc.micro.kMc2yuuw.0.0.25.js → uc.micro.kMc2yuuw.0.0.27.js} +0 -0
  177. /package/dist/interface/{utils.mAKpSMLY.0.0.25.js → utils.mAKpSMLY.0.0.27.js} +0 -0
  178. /package/dist/interface/{uuid.Ch9TGLTe.0.0.25.js → uuid.Ch9TGLTe.0.0.27.js} +0 -0
  179. /package/dist/interface/{vue.l0sNRNKZ.0.0.25.js → vue.l0sNRNKZ.0.0.27.js} +0 -0
  180. /package/dist/interface/{zod.DnW1_kUe.0.0.25.js → zod.DnW1_kUe.0.0.27.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camera.ui/server",
3
- "version": "0.0.25",
3
+ "version": "0.0.27",
4
4
  "description": "camera.ui",
5
5
  "author": "seydx (https://github.com/seydx/camera.ui)",
6
6
  "type": "module",
@@ -74,7 +74,7 @@
74
74
  "@types/fs-extra": "^11.0.4",
75
75
  "@types/js-yaml": "^4.0.9",
76
76
  "@types/jsonwebtoken": "^9.0.7",
77
- "@types/node": "^22.8.1",
77
+ "@types/node": "^22.8.2",
78
78
  "@types/node-forge": "^1.3.11",
79
79
  "@types/object-path": "^0.11.4",
80
80
  "@types/safe-timers": "^1.1.2",
@@ -83,7 +83,7 @@
83
83
  "@types/tar": "^6.1.13",
84
84
  "@types/uuid": "^10.0.0",
85
85
  "@types/ws": "^8.5.12",
86
- "@typescript-eslint/parser": "^8.12.0",
86
+ "@typescript-eslint/parser": "^8.12.1",
87
87
  "assemblyscript": "^0.27.30",
88
88
  "copyfiles": "^2.4.1",
89
89
  "cross-env": "^7.0.3",
@@ -92,7 +92,7 @@
92
92
  "prettier": "^3.3.3",
93
93
  "rimraf": "^6.0.1",
94
94
  "typescript": "^5.6.3",
95
- "typescript-eslint": "^8.12.0",
95
+ "typescript-eslint": "^8.12.1",
96
96
  "updates": "^16.4.0"
97
97
  },
98
98
  "bugs": {
@@ -22,7 +22,7 @@ export class BackupController {
22
22
  reply.send(error ?? fileBuffer);
23
23
  });
24
24
  reply.header('Content-Type', 'application/octet-stream');
25
- reply.header('Content-Disposition', 'attachment; filename=camera.ui.log.txt');
25
+ reply.header('Content-Disposition', `attachment; filename=${backup.backupFileName}`);
26
26
  return reply;
27
27
  }
28
28
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"backup.controller.js","sourceRoot":"","sources":["../../../../../src/api/controllers/backup.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAM9D,MAAM,OAAO,gBAAgB;IACnB,GAAG,CAAkB;IACrB,MAAM,CAAgB;IACtB,OAAO,CAAgB;IAE/B,YAAY,GAAoB;QAC9B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAgB,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,GAA2D,EAAE,KAAmB;QACpG,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAEtE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;gBAChD,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC;gBAED,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YACzD,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC,CAAC;YAE9E,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAA4D,EAAE,KAAmB;QACpG,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;YAE5E,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,UAAU,EAAE,GAAG;oBACf,OAAO,EAAE,kBAAkB;iBAC5B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE5D,sBAAsB;YACtB,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC;YAE3B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"backup.controller.js","sourceRoot":"","sources":["../../../../../src/api/controllers/backup.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAM9D,MAAM,OAAO,gBAAgB;IACnB,GAAG,CAAkB;IACrB,MAAM,CAAgB;IACtB,OAAO,CAAgB;IAE/B,YAAY,GAAoB;QAC9B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAgB,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,GAA2D,EAAE,KAAmB;QACpG,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAEtE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;gBAChD,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC;gBAED,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YACzD,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YAErF,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAA4D,EAAE,KAAmB;QACpG,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;YAE5E,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,UAAU,EAAE,GAAG;oBACf,OAAO,EAAE,kBAAkB;iBAC5B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE5D,sBAAsB;YACtB,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC;YAE3B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
@@ -40,18 +40,9 @@ export declare class PluginsController {
40
40
  installOrUpdate(req: FastifyRequest<AuthLoginRequest & PluginsInsertRequest>, reply: FastifyReply): Promise<FastifyReply>;
41
41
  uninstallByName(req: FastifyRequest<AuthLoginRequest & PluginsParamsNameRequest & PluginsParamsRemoveRequest>, reply: FastifyReply): Promise<FastifyReply>;
42
42
  uninstallAll(req: FastifyRequest<AuthLoginRequest & PluginsParamsRemoveRequest>, reply: FastifyReply): Promise<FastifyReply>;
43
- private manage;
44
- private installPlugin;
45
- private updatePlugin;
46
- private uninstallPlugin;
47
- private installProductionDependencies;
48
- private extrackBundeledPlugin;
49
43
  private getAvailablePluginVersions;
50
44
  private getPluginFromNpm;
51
45
  private searchNpmRegistrySingle;
52
46
  private resolvePluginName;
53
47
  private isScopedPlugin;
54
- private downloadWithProgress;
55
- private getProgressBar;
56
- private emitProgress;
57
48
  }
@@ -1,24 +1,19 @@
1
- import { getNpmPath, orderBy } from '@camera.ui/common';
1
+ import { orderBy } from '@camera.ui/common';
2
2
  import TTLCache from '@isaacs/ttlcache';
3
- import { spawn as spawnPty } from '@scrypted/node-pty';
4
- import AdmZip from 'adm-zip';
5
- import { cyan, green, red } from 'ansicolor';
6
- import { ensureDir, move, pathExists, readJSON, readJson, remove, writeJson } from 'fs-extra/esm';
7
- import { createHash } from 'node:crypto';
3
+ import { pathExists, readJSON, readJson, writeJson } from 'fs-extra/esm';
8
4
  import { createReadStream, readFile as readFileSync, truncate } from 'node:fs';
9
5
  import { mkdtemp, readFile, rmdir, unlink, writeFile } from 'node:fs/promises';
10
- import { platform, tmpdir, userInfo } from 'node:os';
11
- import { basename, dirname, join } from 'node:path';
6
+ import { tmpdir } from 'node:os';
7
+ import { join } from 'node:path';
12
8
  import { Readable } from 'node:stream';
13
9
  import { gt, parse as parseVersion } from 'semver';
14
10
  import sharp from 'sharp';
15
- import { x as extract } from 'tar';
16
11
  import { container } from 'tsyringe';
17
12
  import { PluginManager } from '../../plugins/index.js';
13
+ import { MAX_AUDIO_FILE_SIZE, MAX_MOTION_FILE_SIZE, MAX_OBJECT_FILE_SIZE } from '../schemas/plugins.schema.js';
18
14
  import { CamerasService } from '../services/cameras.service.js';
19
15
  import { PluginsService } from '../services/plugins.service.js';
20
- import fetchInstance from '../utils/fetch.js';
21
- import { MAX_AUDIO_FILE_SIZE, MAX_MOTION_FILE_SIZE, MAX_OBJECT_FILE_SIZE } from '../schemas/plugins.schema.js';
16
+ import { fetchWithTimeout } from '../utils/fetch.js';
22
17
  const npmPluginCache = new TTLCache({ ttl: 300, max: 100 });
23
18
  const searchResultBlacklist = new Set(['camera.ui', 'homebridge-camera-ui']);
24
19
  const pluginLogoCache = new TTLCache({ max: 100, ttl: 1000 * 60 * 60 * 24 });
@@ -178,7 +173,7 @@ export class PluginsController {
178
173
  //
179
174
  }
180
175
  const version = plugin.info.installedVersion ?? 'latest';
181
- const response = await fetchInstance(`https://unpkg.com/${plugin.pluginName}@${version}/CHANGELOG.md`, {
176
+ const response = await fetchWithTimeout(`https://unpkg.com/${plugin.pluginName}@${version}/CHANGELOG.md`, {
182
177
  method: 'GET',
183
178
  });
184
179
  const data = await response.text();
@@ -516,7 +511,7 @@ export class PluginsController {
516
511
  //
517
512
  }
518
513
  const version = plugin.info.installedVersion ?? 'latest';
519
- const response = await fetchInstance(`https://unpkg.com/${plugin.pluginName}@${version}/README.md`, {
514
+ const response = await fetchWithTimeout(`https://unpkg.com/${plugin.pluginName}@${version}/README.md`, {
520
515
  method: 'GET',
521
516
  });
522
517
  const data = await response.text();
@@ -546,7 +541,7 @@ export class PluginsController {
546
541
  message: '"homepage" not exists in package.json or is not a github repo',
547
542
  });
548
543
  }
549
- const response = await fetchInstance(`https://api.github.com/repos/${repoMatch[1]}/${repoMatch[2]}/releases/latest`, {
544
+ const response = await fetchWithTimeout(`https://api.github.com/repos/${repoMatch[1]}/${repoMatch[2]}/releases/latest`, {
550
545
  method: 'GET',
551
546
  });
552
547
  const data = await response.json();
@@ -564,7 +559,7 @@ export class PluginsController {
564
559
  }
565
560
  list(req, reply) {
566
561
  try {
567
- const installedPlugins = this.service.installedPlugins();
562
+ const installedPlugins = this.service.listPlugins();
568
563
  const plugins = installedPlugins.map((plugin) => plugin.info);
569
564
  return orderBy(plugins, ['displayName'], ['asc']);
570
565
  // return orderBy(plugins, ['disabled', 'displayName'], ['asc', 'asc']);
@@ -578,7 +573,7 @@ export class PluginsController {
578
573
  }
579
574
  listExtensions(req, reply) {
580
575
  try {
581
- const installedPlugins = this.service.installedPlugins();
576
+ const installedPlugins = this.service.listPlugins();
582
577
  const allExtensions = installedPlugins
583
578
  .filter((plugin) => plugin.contract.extension ?? plugin.contract.supportAdditionalCameras)
584
579
  .map((plugin) => ({
@@ -716,7 +711,7 @@ export class PluginsController {
716
711
  const q = (!query?.length ? '' : query + '+') + 'keywords:camera-ui-plugin+not:deprecated&size=30';
717
712
  let searchResults;
718
713
  try {
719
- const response = await fetchInstance(`https://registry.npmjs.org/-/v1/search?text=${q}`, {
714
+ const response = await fetchWithTimeout(`https://registry.npmjs.org/-/v1/search?text=${q}`, {
720
715
  method: 'GET',
721
716
  });
722
717
  searchResults = await response.json();
@@ -736,7 +731,7 @@ export class PluginsController {
736
731
  isPython: false,
737
732
  isNode: true,
738
733
  };
739
- const installedPlugins = this.service.installedPlugins();
734
+ const installedPlugins = this.service.listPlugins();
740
735
  const isInstalled = installedPlugins.find((installedPlugin) => installedPlugin.pluginName === plugin.pluginName);
741
736
  if (isInstalled) {
742
737
  plugin = isInstalled.info;
@@ -824,7 +819,7 @@ export class PluginsController {
824
819
  let plugin = this.pluginManager.plugins.get(req.body.pluginname);
825
820
  const command = plugin ? 'update' : 'install';
826
821
  this.logger.log(`${plugin ? 'Updating' : 'Installing'} plugin: ${req.body.pluginname}@${req.body.pluginversion}`);
827
- const installPath = await this.manage(req.body.pluginname, command, req.body.pluginversion, plugin?.id);
822
+ const installPath = await this.service.manage(req.body.pluginname, command, req.body.pluginversion, plugin?.id);
828
823
  if (!plugin) {
829
824
  plugin = await this.pluginManager.loadPlugin(installPath);
830
825
  this.logger.log(`Plugin installed: ${plugin.pluginName}.${plugin.displayName} (${plugin.info.installedVersion})`);
@@ -859,7 +854,7 @@ export class PluginsController {
859
854
  });
860
855
  }
861
856
  this.logger.log(`Uninstalling plugin: ${plugin.pluginName}.${plugin.displayName} (${plugin.info.installedVersion})`);
862
- await this.manage(plugin.pluginName, 'uninstall', undefined, plugin.id);
857
+ await this.service.manage(plugin.pluginName, 'uninstall', undefined, plugin.id);
863
858
  await this.pluginManager.removePlugin(plugin, req.query.removeStorage);
864
859
  npmPluginCache.delete(plugin.pluginName);
865
860
  npmPluginCache.delete(`lookup-${plugin.pluginName}`);
@@ -876,9 +871,9 @@ export class PluginsController {
876
871
  async uninstallAll(req, reply) {
877
872
  try {
878
873
  this.logger.log('Uninstalling all plugins');
879
- const plugins = this.service.installedPlugins();
874
+ const plugins = this.service.listPlugins();
880
875
  const pluginNames = plugins.map((plugin) => plugin.pluginName);
881
- await Promise.all(plugins.map((plugin) => this.manage(plugin.pluginName, 'uninstall', undefined, plugin.id)));
876
+ await Promise.all(plugins.map((plugin) => this.service.manage(plugin.pluginName, 'uninstall', undefined, plugin.id)));
882
877
  for (const plugin of plugins) {
883
878
  await this.pluginManager.removePlugin(plugin, req.query.removeStorage);
884
879
  }
@@ -894,196 +889,12 @@ export class PluginsController {
894
889
  });
895
890
  }
896
891
  }
897
- async manage(pluginName, action, version, pluginId) {
898
- const targetDir = join(this.configService.PLUGINS_INSTALL_PATH, pluginName);
899
- this.emitProgress(pluginName, `\r\nUSER: ${userInfo().username}\r\n`, cyan);
900
- this.emitProgress(pluginName, `DIR: ${targetDir}\r\n`, cyan);
901
- this.emitProgress(pluginName, `ACTION: ${action}\r\r\n\n`, cyan);
902
- switch (action) {
903
- case 'install':
904
- await this.installPlugin(pluginName, version ?? 'latest', targetDir);
905
- break;
906
- case 'update':
907
- await this.updatePlugin(pluginName, version ?? 'latest', targetDir);
908
- break;
909
- case 'uninstall':
910
- await this.uninstallPlugin(pluginName, targetDir);
911
- if (pluginId) {
912
- await this.camerasService.removeByPluginId(pluginId);
913
- }
914
- break;
915
- default:
916
- throw new Error(`Unknown action: ${action}`);
917
- }
918
- return targetDir;
919
- }
920
- async installPlugin(pluginName, version, targetDir, update) {
921
- const backupTempDir = join(tmpdir(), `${pluginName}_backup`);
922
- try {
923
- const npmRegistry = 'https://registry.npmjs.org';
924
- const packageUrl = `${npmRegistry}/${pluginName}/${version}`;
925
- this.emitProgress(pluginName, '> Fetching package information...');
926
- const response = await fetch(packageUrl);
927
- if (!response.ok) {
928
- throw new Error(`HTTP error! status: ${response.status}`);
929
- }
930
- const packageInfo = await response.json();
931
- const tarballUrl = packageInfo.dist.tarball;
932
- const expectedShasum = packageInfo.dist.shasum;
933
- this.emitProgress(pluginName, ' Done\r\n\r\n', green);
934
- const tarballData = await this.downloadWithProgress(tarballUrl, pluginName, version);
935
- this.emitProgress(pluginName, ' - Done\r\n\r\n', green);
936
- this.emitProgress(pluginName, '> Verifying package integrity...');
937
- const computedShasum = createHash('sha1').update(Buffer.from(tarballData)).digest('hex');
938
- if (computedShasum !== expectedShasum) {
939
- throw new Error(`SHA checksum mismatch. Expected: ${expectedShasum}, Got: ${computedShasum}`);
940
- }
941
- this.emitProgress(pluginName, ' Done\r\n\r\n', green);
942
- if (await pathExists(targetDir)) {
943
- this.emitProgress(pluginName, '> Backing up existing installation...');
944
- await move(targetDir, backupTempDir);
945
- this.emitProgress(pluginName, ' Done\r\n\r\n', green);
946
- }
947
- await ensureDir(targetDir);
948
- this.emitProgress(pluginName, '> Extracting package...');
949
- await new Promise((_resolve, _reject) => {
950
- const extractStream = extract({
951
- cwd: targetDir,
952
- strip: 1,
953
- });
954
- extractStream.on('error', _reject);
955
- extractStream.on('end', () => {
956
- this.emitProgress(pluginName, ' Done\r\n\r\n', green);
957
- _resolve();
958
- });
959
- extractStream.write(Buffer.from(tarballData));
960
- extractStream.end();
961
- });
962
- await this.installProductionDependencies(targetDir, pluginName);
963
- await this.extrackBundeledPlugin(targetDir, pluginName);
964
- this.emitProgress(pluginName, '\r\n> Cleaning up...');
965
- await remove(backupTempDir);
966
- this.emitProgress(pluginName, ' Done\r\n\r\n', green);
967
- this.emitProgress(pluginName, `Plugin ${pluginName}@${version} has been successfully ${update ? 'updated' : 'installed'}.\r\n\r\n`, green);
968
- }
969
- catch (error) {
970
- this.emitProgress(pluginName, `\r\nError during ${update ? 'update' : 'installation'} of ${pluginName}@${version}.\r\n\r\n`, red);
971
- try {
972
- this.emitProgress(pluginName, '> Restoring previous version...');
973
- await remove(targetDir);
974
- await move(backupTempDir, targetDir);
975
- this.emitProgress(pluginName, ' Done\r\n\r\n', green);
976
- }
977
- catch (error) {
978
- this.emitProgress(pluginName, `\r\n\r\nError: ${error.message}\r\n`, red);
979
- this.emitProgress(pluginName, 'Failed to restore previous version.\r\n\r\n', red);
980
- }
981
- throw error;
982
- }
983
- }
984
- async updatePlugin(pluginName, version, targetDir) {
985
- try {
986
- this.emitProgress(pluginName, '> Preparing update...');
987
- const packageJsonPath = join(targetDir, 'package.json');
988
- const packageJson = await readJson(packageJsonPath);
989
- const currentVersion = packageJson.version;
990
- if (currentVersion === version) {
991
- this.emitProgress(pluginName, `Plugin ${pluginName} is already up to date.\r\n\r\n`, green);
992
- return;
993
- }
994
- this.emitProgress(pluginName, ' Done\r\n\r\n', green);
995
- await this.installPlugin(pluginName, version, targetDir, true);
996
- }
997
- catch (error) {
998
- this.emitProgress(pluginName, `\r\nError during update of ${pluginName}@${version}.\r\n\r\n`, red);
999
- throw error;
1000
- }
1001
- }
1002
- async uninstallPlugin(pluginName, targetDir) {
1003
- try {
1004
- this.emitProgress(pluginName, '> Removing plugin...');
1005
- await remove(targetDir);
1006
- this.emitProgress(pluginName, ' Done\r\n\r\n', green);
1007
- this.emitProgress(pluginName, `Plugin ${pluginName} has been successfully uninstalled.\r\n`, green);
1008
- }
1009
- catch (error) {
1010
- this.emitProgress(pluginName, ' Error\r\n\r\n', red);
1011
- this.emitProgress(pluginName, `\r\nError during uninstallation of ${pluginName}.\r\n\r\n`, red);
1012
- throw error;
1013
- }
1014
- }
1015
- async installProductionDependencies(packageDir, pluginName) {
1016
- await new Promise((_resolve, _reject) => {
1017
- this.emitProgress(pluginName, '> Installing dependencies...\r\n\r\n');
1018
- const command = [...getNpmPath(), 'install', '--omit=dev', '--include=prod', '--loglevel', 'info'];
1019
- const env = {};
1020
- Object.assign(env, process.env);
1021
- Object.assign(env, {
1022
- // npm_config_global_style: 'false',
1023
- // npm_config_install_strategy: 'shallow',
1024
- NODE_ENV: 'production',
1025
- npm_config_unsafe_perm: 'true',
1026
- npm_config_update_notifier: 'false',
1027
- npm_config_prefer_online: 'true',
1028
- // npm_config_foreground_scripts: 'true',
1029
- npm_config_loglevel: 'info',
1030
- npm_config_prefix: packageDir,
1031
- });
1032
- // set global prefix for unix based systems
1033
- if (platform() !== 'win32') {
1034
- if (basename(packageDir) === 'lib') {
1035
- packageDir = dirname(packageDir);
1036
- Object.assign(env, {
1037
- npm_config_prefix: packageDir,
1038
- });
1039
- }
1040
- }
1041
- this.logger.log(`Running Command: ${command.join(' ')}`);
1042
- const term = spawnPty(command.shift(), command, {
1043
- name: 'xterm-color',
1044
- cols: 80,
1045
- rows: 30,
1046
- cwd: packageDir,
1047
- env,
1048
- });
1049
- // send stdout data from the process to all clients
1050
- term.onData((data) => {
1051
- this.emitProgress(pluginName, data);
1052
- });
1053
- // send an error message to the client if the command does not exit with code 0
1054
- term.onExit((error) => {
1055
- clearTimeout(timeoutTimer);
1056
- if (error.exitCode === 0) {
1057
- _resolve(null);
1058
- }
1059
- else {
1060
- _reject(new Error('Operation failed. Please review log for details.'));
1061
- }
1062
- });
1063
- // if the command spends to long trying to execute kill it after 5 minutes
1064
- const timeoutTimer = setTimeout(() => {
1065
- term.kill('SIGTERM');
1066
- }, 300000);
1067
- });
1068
- }
1069
- async extrackBundeledPlugin(packageDir, pluginName) {
1070
- const bundlePath = join(packageDir, 'bundle.zip');
1071
- const isBundeledPlugin = await pathExists(bundlePath);
1072
- if (!isBundeledPlugin) {
1073
- return;
1074
- }
1075
- this.emitProgress(pluginName, '\r\n> Extracting bundled plugin...');
1076
- const zip = new AdmZip(bundlePath);
1077
- zip.extractAllTo(packageDir, true);
1078
- await remove(bundlePath);
1079
- this.emitProgress(pluginName, ' Done', green);
1080
- }
1081
892
  async getAvailablePluginVersions(pluginName) {
1082
893
  npmPluginCache.purgeStale();
1083
894
  const fromCache = npmPluginCache.get(`lookup-${pluginName}`);
1084
895
  let pkg = fromCache;
1085
896
  if (!pkg) {
1086
- const response = await fetchInstance(`https://registry.npmjs.org/${encodeURIComponent(pluginName).replace(/%40/g, '@')}`, {
897
+ const response = await fetchWithTimeout(`https://registry.npmjs.org/${encodeURIComponent(pluginName).replace(/%40/g, '@')}`, {
1087
898
  method: 'GET',
1088
899
  headers: {
1089
900
  accept: 'application/vnd.npm.install-v1+json', // only return minimal information
@@ -1110,7 +921,7 @@ export class PluginsController {
1110
921
  const fromCache = npmPluginCache.get(plugin.pluginName);
1111
922
  let pkg = fromCache;
1112
923
  if (!pkg) {
1113
- const response = await fetchInstance(`https://registry.npmjs.org/${encodeURIComponent(plugin.pluginName).replace(/%40/g, '@')}/latest`, {
924
+ const response = await fetchWithTimeout(`https://registry.npmjs.org/${encodeURIComponent(plugin.pluginName).replace(/%40/g, '@')}/latest`, {
1114
925
  method: 'GET',
1115
926
  });
1116
927
  pkg = (await response.json());
@@ -1149,7 +960,7 @@ export class PluginsController {
1149
960
  const fromCache = npmPluginCache.get(`lookup-${query}`);
1150
961
  let pkg = fromCache;
1151
962
  if (!pkg) {
1152
- const response = await fetchInstance(`https://registry.npmjs.org/${encodeURIComponent(query).replace(/%40/g, '@')}`, {
963
+ const response = await fetchWithTimeout(`https://registry.npmjs.org/${encodeURIComponent(query).replace(/%40/g, '@')}`, {
1153
964
  method: 'GET',
1154
965
  });
1155
966
  pkg = (await response.json());
@@ -1161,7 +972,7 @@ export class PluginsController {
1161
972
  return [];
1162
973
  }
1163
974
  let plugin;
1164
- const installedPlugins = this.service.installedPlugins();
975
+ const installedPlugins = this.service.listPlugins();
1165
976
  const isInstalled = installedPlugins.find((installedPlugin) => installedPlugin.pluginName === pkg.name);
1166
977
  if (isInstalled) {
1167
978
  plugin = isInstalled.info;
@@ -1206,37 +1017,5 @@ export class PluginsController {
1206
1017
  isScopedPlugin(pluginName) {
1207
1018
  return pluginName.startsWith('@') && pluginName.split('/').length > 0 && pluginName.split('/')[1]?.startsWith('camera-ui-');
1208
1019
  }
1209
- async downloadWithProgress(url, pluginName, version) {
1210
- const response = await fetch(url);
1211
- if (!response.ok) {
1212
- throw new Error(`HTTP error! status: ${response.status}`);
1213
- }
1214
- const contentLength = Number(response.headers.get('Content-Length'));
1215
- let receivedLength = 0;
1216
- const chunks = [];
1217
- const reader = response.body.getReader();
1218
- this.emitProgress(pluginName, `> Downloading ${pluginName}@${version}...\r\n`);
1219
- while (true) {
1220
- const { done, value } = await reader.read();
1221
- if (done) {
1222
- break;
1223
- }
1224
- chunks.push(value);
1225
- receivedLength += value.length;
1226
- const percentComplete = Math.round((receivedLength / contentLength) * 100);
1227
- const progressBar = this.getProgressBar(percentComplete);
1228
- this.emitProgress(pluginName, `\r${progressBar} ${percentComplete}%`, cyan);
1229
- }
1230
- return await new Blob(chunks).arrayBuffer();
1231
- }
1232
- getProgressBar(percent) {
1233
- const width = 50;
1234
- const complete = Math.round(width * (percent / 100));
1235
- const incomplete = width - complete;
1236
- return `[${'='.repeat(complete)}${'-'.repeat(incomplete)}]`;
1237
- }
1238
- emitProgress(pluginName, message, color) {
1239
- this.io.of('/logs').emit(`stdout/${pluginName}`, color ? color(message) : message);
1240
- }
1241
1020
  }
1242
1021
  //# sourceMappingURL=plugins.controller.js.map