@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.
- package/dist/interface/{@mdi.C1UTQKuc.0.0.25.js → @mdi.D-fmakQN.0.0.27.js} +1 -1
- package/dist/interface/{@tanstack.DS6S0aUw.0.0.25.js → @tanstack.Bm3cSvpy.0.0.27.js} +1 -1
- package/dist/interface/{@vee-validate.Ck7LlKb4.0.0.25.js → @vee-validate.DLrUjipo.0.0.27.js} +1 -1
- package/dist/interface/{@vue.Cps6vB1j.0.0.25.js → @vue.Ddz2NYqM.0.0.27.js} +1 -1
- package/dist/interface/{@vueform.BdiHuFyw.0.0.25.js → @vueform.Bsdz6Sjj.0.0.27.js} +1 -1
- package/dist/interface/{@vueuse.C_FaY5AU.0.0.25.js → @vueuse.D0Q3b7aI.0.0.27.js} +1 -1
- package/dist/interface/{Account.BKFUF_1I.0.0.25.js → Account.Bt1PPTrH.0.0.27.js} +1 -1
- package/dist/interface/{Adminpanel.DrVGmhuD.0.0.25.js → Adminpanel.B3TDnuln.0.0.27.js} +2 -2
- package/dist/interface/{Appearance.C3Aonbm5.0.0.25.js → Appearance.BCEXPIo-.0.0.27.js} +1 -1
- package/dist/interface/Backup.wTP3FHTG.0.0.27.js +1 -0
- package/dist/interface/Camera.DBN_IYRw.0.0.27.js +1 -0
- package/dist/interface/Cameras.D0Uxx50g.0.0.27.js +1 -0
- package/dist/interface/{Camview.soVYCi4c.0.0.25.js → Camview.BJZZ90Mk.0.0.27.js} +1 -1
- package/dist/interface/Config.obFokUV3.0.0.27.js +1 -0
- package/dist/interface/Console.CYG9NwGE.0.0.27.js +4 -0
- package/dist/interface/FirstSteps.f8NWGktM.0.0.27.js +1 -0
- package/dist/interface/{NewCamera.Do0JsE9j.0.0.25.js → NewCamera.B5LfyCGA.0.0.27.js} +2 -2
- package/dist/interface/{Plugin.lTbk0yju.0.0.25.js → Plugin.CYOwdXoP.0.0.27.js} +1 -1
- package/dist/interface/{Plugins.CfqUIlTL.0.0.25.js → Plugins.HVavkzPy.0.0.27.js} +1 -1
- package/dist/interface/Recordings.DJ_Yg9BF.0.0.27.js +1 -0
- package/dist/interface/Recordings.X74Lf9uI.0.0.27.js +1 -0
- package/dist/interface/{Settings.BOvuxTQb.0.0.25.js → Settings.Bx_yejjH.0.0.27.js} +1 -1
- package/dist/interface/{System.BNvNnXLG.0.0.25.js → System.Dzred1Li.0.0.27.js} +2 -2
- package/dist/interface/{User.O9lM6tnQ.0.0.25.js → User.DUMD0zOF.0.0.27.js} +1 -1
- 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
- package/dist/interface/{VConsole.Bh0BYQl5.0.0.25.js → VConsole.NTILyp-m.0.0.27.js} +1 -1
- package/dist/interface/{VPlayer.CIerrnIA.0.0.25.js → VPlayer.DL37B_OL.0.0.27.js} +2 -2
- package/dist/interface/{VPluginCard.CspT3Ib0.0.0.25.js → VPluginCard.CrFn_CDt.0.0.27.js} +2 -2
- package/dist/interface/{ace-builds.XYfkWb88.0.0.25.js → ace-builds.BFkjIdtB.0.0.27.js} +1 -1
- package/dist/interface/{apexcharts.BL-vEXry.0.0.25.js → apexcharts.Dx0G2irl.0.0.27.js} +1 -1
- package/dist/interface/assets/Camera.0.0.27.DurX54CO.css +1 -0
- package/dist/interface/assets/FirstSteps.0.0.27.BHh3CorE.css +1 -0
- package/dist/interface/assets/{main.0.0.25.DNhh__S1.css → main.0.0.27.k2hmg3ho.css} +1 -1
- package/dist/interface/backup.C_RMOdcs.0.0.27.js +1 -0
- package/dist/interface/{dnd-core.B11Qy5OS.0.0.25.js → dnd-core.DGhTBgTz.0.0.27.js} +1 -1
- package/dist/interface/{draggabilly.Dgm1b25J.0.0.25.js → draggabilly.De9lRZQ1.0.0.27.js} +1 -1
- package/dist/interface/{engine.io-client.D0e_hPTL.0.0.25.js → engine.io-client.4V7g_fDW.0.0.27.js} +1 -1
- package/dist/interface/{ev-emitter.Bx2XssKf.0.0.25.js → ev-emitter.plEcNLrI.0.0.27.js} +1 -1
- package/dist/interface/{fast-deep-equal.B1d0tCKF.0.0.25.js → fast-deep-equal.CiFMNAjk.0.0.27.js} +1 -1
- package/dist/interface/{highlight.js.Djovyq4W.0.0.25.js → highlight.js.D7RMSaM-.0.0.27.js} +1 -1
- package/dist/interface/index.html +32 -32
- package/dist/interface/{linkify-it.BPW1TjDb.0.0.25.js → linkify-it.Calax-6O.0.0.27.js} +1 -1
- package/dist/interface/main.BXOJy68s.0.0.27.js +5 -0
- package/dist/interface/{markdown-it.BI1ojV5J.0.0.25.js → markdown-it.lwcVlCWR.0.0.27.js} +1 -1
- package/dist/interface/{nprogress.jHQGJjg9.0.0.25.js → nprogress.Dro1FQza.0.0.27.js} +1 -1
- package/dist/interface/{pinia.DVJV3DUJ.0.0.25.js → pinia.B6vj0NYr.0.0.27.js} +1 -1
- package/dist/interface/{plugins.B9YdMqtM.0.0.25.js → plugins.C3CWZVgs.0.0.27.js} +1 -1
- package/dist/interface/{qrcode.CAZtYnFa.0.0.25.js → qrcode.BQXbEKE5.0.0.27.js} +1 -1
- package/dist/interface/{react-dnd-touch-backend.DE6tNgWC.0.0.25.js → react-dnd-touch-backend.OwiLGVtH.0.0.27.js} +1 -1
- package/dist/interface/{rxjs.BMKzkXQf.0.0.25.js → rxjs.BEfAF_vM.0.0.27.js} +1 -1
- package/dist/interface/{socket.io-client.J9R2OCKo.0.0.25.js → socket.io-client.CBJOn-57.0.0.27.js} +1 -1
- package/dist/interface/{socket.io-parser.D6J01YxN.0.0.25.js → socket.io-parser.CEFWw8jT.0.0.27.js} +1 -1
- package/dist/interface/sw.js +1 -1
- package/dist/interface/{system.CR11-k1L.0.0.25.js → system.l1x-e9Wo.0.0.27.js} +1 -1
- package/dist/interface/{unidragger.DRwD7wmc.0.0.25.js → unidragger.BXH5FbO6.0.0.27.js} +1 -1
- package/dist/interface/{vee-validate.4fr978O8.0.0.25.js → vee-validate.C3HAoDnO.0.0.27.js} +1 -1
- package/dist/interface/{vue-i18n.BOZgCyg9.0.0.25.js → vue-i18n.BGb0iC47.0.0.27.js} +1 -1
- package/dist/interface/{vue-inline-svg.CE-o9lK4.0.0.25.js → vue-inline-svg.Bpl1FbWF.0.0.27.js} +1 -1
- package/dist/interface/{vue-router.Bz4d7Nhi.0.0.25.js → vue-router.BAOHLc3X.0.0.27.js} +1 -1
- package/dist/interface/{vue3-apexcharts.Dy2eUw3m.0.0.25.js → vue3-apexcharts.L2GUpfG8.0.0.27.js} +1 -1
- package/dist/interface/{vue3-dnd.B89OIvTY.0.0.25.js → vue3-dnd.DzHpcZOS.0.0.27.js} +1 -1
- package/dist/interface/{vue3-toastify.CQ8OELFA.0.0.25.js → vue3-toastify.B5nE8tfx.0.0.27.js} +1 -1
- package/dist/interface/{vuetify.CUVKBXL8.0.0.25.js → vuetify.CcSBzYNW.0.0.27.js} +2 -2
- package/dist/server/package.json +4 -4
- package/dist/server/src/api/controllers/backup.controller.js +1 -1
- package/dist/server/src/api/controllers/backup.controller.js.map +1 -1
- package/dist/server/src/api/controllers/plugins.controller.d.ts +0 -9
- package/dist/server/src/api/controllers/plugins.controller.js +21 -242
- package/dist/server/src/api/controllers/plugins.controller.js.map +1 -1
- package/dist/server/src/api/controllers/system.controller.d.ts +0 -4
- package/dist/server/src/api/controllers/system.controller.js +1 -30
- package/dist/server/src/api/controllers/system.controller.js.map +1 -1
- package/dist/server/src/api/database/types.d.ts +0 -4
- package/dist/server/src/api/index.d.ts +3 -1
- package/dist/server/src/api/index.js.map +1 -1
- package/dist/server/src/api/services/backup.service.d.ts +4 -4
- package/dist/server/src/api/services/backup.service.js +32 -29
- package/dist/server/src/api/services/backup.service.js.map +1 -1
- package/dist/server/src/api/services/plugins.service.d.ts +16 -4
- package/dist/server/src/api/services/plugins.service.js +250 -17
- package/dist/server/src/api/services/plugins.service.js.map +1 -1
- package/dist/server/src/api/services/system.service.d.ts +6 -0
- package/dist/server/src/api/services/system.service.js +41 -1
- package/dist/server/src/api/services/system.service.js.map +1 -1
- package/dist/server/src/api/types/index.d.ts +13 -0
- package/dist/server/src/api/utils/cameraSource.d.ts +1 -1
- package/dist/server/src/api/utils/cameraSource.js +2 -2
- package/dist/server/src/api/utils/cameraSource.js.map +1 -1
- package/dist/server/src/api/utils/cert.js +1 -1
- package/dist/server/src/api/utils/cert.js.map +1 -1
- package/dist/server/src/api/utils/fetch.d.ts +1 -2
- package/dist/server/src/api/utils/fetch.js +2 -3
- package/dist/server/src/api/utils/fetch.js.map +1 -1
- package/dist/server/src/api/utils/moveFiles.d.ts +4 -1
- package/dist/server/src/api/utils/moveFiles.js +33 -35
- package/dist/server/src/api/utils/moveFiles.js.map +1 -1
- package/dist/server/src/api/utils/parse.d.ts +1 -1
- package/dist/server/src/api/utils/parse.js +2 -2
- package/dist/server/src/api/utils/parse.js.map +1 -1
- package/dist/server/src/api/websocket/nsp/main.d.ts +2 -0
- package/dist/server/src/api/websocket/nsp/main.js +11 -0
- package/dist/server/src/api/websocket/nsp/main.js.map +1 -1
- package/dist/server/src/api/websocket/nsp/server.js +3 -3
- package/dist/server/src/api/websocket/nsp/server.js.map +1 -1
- package/dist/server/src/main.d.ts +3 -0
- package/dist/server/src/main.js +13 -2
- package/dist/server/src/main.js.map +1 -1
- package/dist/server/src/plugins/index.d.ts +3 -2
- package/dist/server/src/plugins/index.js +41 -5
- package/dist/server/src/plugins/index.js.map +1 -1
- package/dist/server/src/plugins/worker.js +102 -96
- package/dist/server/src/plugins/worker.js.map +1 -1
- package/dist/server/src/services/config/index.d.ts +1 -0
- package/dist/server/src/services/config/index.js +2 -0
- package/dist/server/src/services/config/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/interface/Backup.Dsc-sceS.0.0.25.js +0 -1
- package/dist/interface/Camera.BCWd9-aG.0.0.25.js +0 -1
- package/dist/interface/Cameras.C_aGXOwa.0.0.25.js +0 -1
- package/dist/interface/Config.Bea3MqDf.0.0.25.js +0 -1
- package/dist/interface/Console.Dj-P-HVt.0.0.25.js +0 -4
- package/dist/interface/FirstSteps.CbvZw0Je.0.0.25.js +0 -1
- package/dist/interface/Recordings.C6OuQL3F.0.0.25.js +0 -1
- package/dist/interface/Recordings.QS-T1p9q.0.0.25.js +0 -1
- package/dist/interface/assets/Camera.0.0.25.D1I-fW4q.css +0 -1
- package/dist/interface/assets/FirstSteps.0.0.25.sPEcItZ6.css +0 -1
- package/dist/interface/main.De33w7Bp.0.0.25.js +0 -5
- /package/dist/interface/{@babel.l0sNRNKZ.0.0.25.js → @babel.l0sNRNKZ.0.0.27.js} +0 -0
- /package/dist/interface/{@intlify.DXtFJcML.0.0.25.js → @intlify.DXtFJcML.0.0.27.js} +0 -0
- /package/dist/interface/{@react-dnd.CcwRs9xb.0.0.25.js → @react-dnd.CcwRs9xb.0.0.27.js} +0 -0
- /package/dist/interface/{@socket.io.Dkula2eQ.0.0.25.js → @socket.io.Dkula2eQ.0.0.27.js} +0 -0
- /package/dist/interface/{@turf.l0sNRNKZ.0.0.25.js → @turf.l0sNRNKZ.0.0.27.js} +0 -0
- /package/dist/interface/{@xterm.BVBmkLtp.0.0.25.js → @xterm.DQVEcgIz.0.0.27.js} +0 -0
- /package/dist/interface/assets/{@vueform.0.0.25.CroAHJs8.css → @vueform.0.0.27.CroAHJs8.css} +0 -0
- /package/dist/interface/assets/{@xterm.0.0.25.CFbL2ovg.css → @xterm.0.0.27.CFbL2ovg.css} +0 -0
- /package/dist/interface/assets/{Account.0.0.25.J7oAjogS.css → Account.0.0.27.J7oAjogS.css} +0 -0
- /package/dist/interface/assets/{Adminpanel.0.0.25.a3t1v3MB.css → Adminpanel.0.0.27.a3t1v3MB.css} +0 -0
- /package/dist/interface/assets/{Backup.0.0.25.CX0rT0QJ.css → Backup.0.0.27.CX0rT0QJ.css} +0 -0
- /package/dist/interface/assets/{Cameras.0.0.25.Buf1Dgce.css → Cameras.0.0.27.Buf1Dgce.css} +0 -0
- /package/dist/interface/assets/{Camview.0.0.25.B7Cja2ry.css → Camview.0.0.27.B7Cja2ry.css} +0 -0
- /package/dist/interface/assets/{Config.0.0.25.DNGo2krN.css → Config.0.0.27.DNGo2krN.css} +0 -0
- /package/dist/interface/assets/{Console.0.0.25.Bh8l9QnM.css → Console.0.0.27.Bh8l9QnM.css} +0 -0
- /package/dist/interface/assets/{NewCamera.0.0.25.Cq8GzeJ7.css → NewCamera.0.0.27.Cq8GzeJ7.css} +0 -0
- /package/dist/interface/assets/{Plugin.0.0.25.DJbgaQc1.css → Plugin.0.0.27.DJbgaQc1.css} +0 -0
- /package/dist/interface/assets/{Plugins.0.0.25.DXSoO9M1.css → Plugins.0.0.27.DXSoO9M1.css} +0 -0
- /package/dist/interface/assets/{Settings.0.0.25.CVmui2kE.css → Settings.0.0.27.CVmui2kE.css} +0 -0
- /package/dist/interface/assets/{User.0.0.25.BiGtIFqt.css → User.0.0.27.BiGtIFqt.css} +0 -0
- /package/dist/interface/assets/{VConsole.0.0.25.BCqKHpmJ.css → VConsole.0.0.27.BCqKHpmJ.css} +0 -0
- /package/dist/interface/assets/{VPlayer.0.0.25.DNtDNhfg.css → VPlayer.0.0.27.DNtDNhfg.css} +0 -0
- /package/dist/interface/assets/{VPluginCard.0.0.25.C8Lj6X-J.css → VPluginCard.0.0.27.C8Lj6X-J.css} +0 -0
- /package/dist/interface/assets/{highlight.0.0.25.Ch2EwETz.css → highlight.0.0.27.Ch2EwETz.css} +0 -0
- /package/dist/interface/assets/{logo-256.0.0.25.BCQk9H1-.png → logo-256.0.0.27.BCQk9H1-.png} +0 -0
- /package/dist/interface/assets/{logo-512.0.0.25.DLKVOU2S.png → logo-512.0.0.27.DLKVOU2S.png} +0 -0
- /package/dist/interface/assets/{logo.0.0.25.DmEiRk0z.png → logo.0.0.27.DmEiRk0z.png} +0 -0
- /package/dist/interface/assets/{mode-json.0.0.25.Br7xisR1.js → mode-json.0.0.27.Br7xisR1.js} +0 -0
- /package/dist/interface/assets/{mode-yaml.0.0.25.CIYL8U3d.js → mode-yaml.0.0.27.CIYL8U3d.js} +0 -0
- /package/dist/interface/assets/{vue3-toastify.0.0.25.DHXAGmwn.css → vue3-toastify.0.0.27.DHXAGmwn.css} +0 -0
- /package/dist/interface/assets/{vuetify.0.0.25.CgGsw6iO.css → vuetify.0.0.27.CgGsw6iO.css} +0 -0
- /package/dist/interface/{axios.C-n2IhIP.0.0.25.js → axios.C-n2IhIP.0.0.27.js} +0 -0
- /package/dist/interface/{birpc.l0sNRNKZ.0.0.25.js → birpc.l0sNRNKZ.0.0.27.js} +0 -0
- /package/dist/interface/{compare-versions.DqEOhma6.0.0.25.js → compare-versions.DqEOhma6.0.0.27.js} +0 -0
- /package/dist/interface/{dijkstrajs.D_NXgYpA.0.0.25.js → dijkstrajs.D_NXgYpA.0.0.27.js} +0 -0
- /package/dist/interface/{engine.io-parser.BiEtp6m2.0.0.25.js → engine.io-parser.BiEtp6m2.0.0.27.js} +0 -0
- /package/dist/interface/{entities.C20TfXL6.0.0.25.js → entities.C20TfXL6.0.0.27.js} +0 -0
- /package/dist/interface/{get-size.D1dS-IaP.0.0.25.js → get-size.D1dS-IaP.0.0.27.js} +0 -0
- /package/dist/interface/{hookable.B8xFkYCm.0.0.25.js → hookable.B8xFkYCm.0.0.27.js} +0 -0
- /package/dist/interface/{mdurl.k9Sl0PQj.0.0.25.js → mdurl.k9Sl0PQj.0.0.27.js} +0 -0
- /package/dist/interface/{perfect-debounce.Cp2ysxOb.0.0.25.js → perfect-debounce.Cp2ysxOb.0.0.27.js} +0 -0
- /package/dist/interface/{point-in-polygon-hao.l0sNRNKZ.0.0.25.js → point-in-polygon-hao.l0sNRNKZ.0.0.27.js} +0 -0
- /package/dist/interface/{punycode.js.Dj65hjkv.0.0.25.js → punycode.js.Dj65hjkv.0.0.27.js} +0 -0
- /package/dist/interface/{react-dnd-html5-backend.1HQjlkwI.0.0.25.js → react-dnd-html5-backend.1HQjlkwI.0.0.27.js} +0 -0
- /package/dist/interface/{redux.CuxFRhX_.0.0.25.js → redux.CuxFRhX_.0.0.27.js} +0 -0
- /package/dist/interface/{sweepline-intersections.l0sNRNKZ.0.0.25.js → sweepline-intersections.l0sNRNKZ.0.0.27.js} +0 -0
- /package/dist/interface/{tslib.9k7AwCpt.0.0.25.js → tslib.9k7AwCpt.0.0.27.js} +0 -0
- /package/dist/interface/{types.Cz9TaZAP.0.0.25.js → types.Cz9TaZAP.0.0.27.js} +0 -0
- /package/dist/interface/{uc.micro.kMc2yuuw.0.0.25.js → uc.micro.kMc2yuuw.0.0.27.js} +0 -0
- /package/dist/interface/{utils.mAKpSMLY.0.0.25.js → utils.mAKpSMLY.0.0.27.js} +0 -0
- /package/dist/interface/{uuid.Ch9TGLTe.0.0.25.js → uuid.Ch9TGLTe.0.0.27.js} +0 -0
- /package/dist/interface/{vue.l0sNRNKZ.0.0.25.js → vue.l0sNRNKZ.0.0.27.js} +0 -0
- /package/dist/interface/{zod.DnW1_kUe.0.0.25.js → zod.DnW1_kUe.0.0.27.js} +0 -0
package/dist/server/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camera.ui/server",
|
|
3
|
-
"version": "0.0.
|
|
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.
|
|
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.
|
|
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.
|
|
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',
|
|
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,
|
|
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 {
|
|
1
|
+
import { orderBy } from '@camera.ui/common';
|
|
2
2
|
import TTLCache from '@isaacs/ttlcache';
|
|
3
|
-
import {
|
|
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 {
|
|
11
|
-
import {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|