@camera.ui/server 0.0.50-internal.0 → 0.0.50-internal.1

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 (387) hide show
  1. package/dist/interface/index.html +44 -44
  2. package/dist/interface/js/{@primevue.OhxoO3MD.0.0.50-internal.0.js → @primevue.CiB2EGly.0.0.50-internal.1.js} +1 -1
  3. package/dist/interface/js/{@tanstack.D1IL6eOv.0.0.50-internal.0.js → @tanstack.DxMw_rJn.0.0.50-internal.1.js} +1 -1
  4. package/dist/interface/js/{@vee-validate.BGPyWWTh.0.0.50-internal.0.js → @vee-validate.RxZ3hn6V.0.0.50-internal.1.js} +1 -1
  5. package/dist/interface/js/{@vueuse.BsKtqdiG.0.0.50-internal.0.js → @vueuse.C-k73ACm.0.0.50-internal.1.js} +1 -1
  6. package/dist/interface/js/{Adminpanel.D93Kvbwp.0.0.50-internal.0.js → Adminpanel.DumNu6GD.0.0.50-internal.1.js} +1 -1
  7. package/dist/interface/js/{Camera.DF2l3OMA.0.0.50-internal.0.js → Camera.BuosoqFl.0.0.50-internal.1.js} +1 -1
  8. package/dist/interface/js/{Cameras.YzvZccdv.0.0.50-internal.0.js → Cameras.A7NJflGG.0.0.50-internal.1.js} +2 -2
  9. package/dist/interface/js/Cammesh.Dv3C0UiR.0.0.50-internal.1.js +1 -0
  10. package/dist/interface/js/{Camview.CB7_HnoQ.0.0.50-internal.0.js → Camview.GgjJp7JR.0.0.50-internal.1.js} +1 -1
  11. package/dist/interface/js/{Config.BwflsWTm.0.0.50-internal.0.js → Config.BL3L-BFE.0.0.50-internal.1.js} +2 -2
  12. package/dist/interface/js/{Console.DZM8pN8Q.0.0.50-internal.0.js → Console.CxwRmUVF.0.0.50-internal.1.js} +1 -1
  13. package/dist/interface/js/{CuiConsole.BXXU7Gth.0.0.50-internal.0.js → CuiConsole.D16kkT6R.0.0.50-internal.1.js} +1 -1
  14. package/dist/interface/js/{CuiPluginCard.YFOrpbVD.0.0.50-internal.0.js → CuiPluginCard.Bkp__d8n.0.0.50-internal.1.js} +1 -1
  15. package/dist/interface/js/{CuiTimeline.VV5KSJd5.0.0.50-internal.0.js → CuiTimeline.C9HKvo0G.0.0.50-internal.1.js} +1 -1
  16. package/dist/interface/js/{FirstSteps.b-nvymgb.0.0.50-internal.0.js → FirstSteps.QuJjtAtF.0.0.50-internal.1.js} +1 -1
  17. package/dist/interface/js/{Plugin.BOMpVEwM.0.0.50-internal.0.js → Plugin.BLUUbEej.0.0.50-internal.1.js} +1 -1
  18. package/dist/interface/js/{Plugins.DdPwaUDA.0.0.50-internal.0.js → Plugins.DviCIk7w.0.0.50-internal.1.js} +1 -1
  19. package/dist/interface/js/Recordings.Dsp07cHs.0.0.50-internal.1.js +1 -0
  20. package/dist/interface/js/{Settings.D24ttaPu.0.0.50-internal.0.js → Settings.Clx4y9gP.0.0.50-internal.1.js} +1 -1
  21. package/dist/interface/js/{SettingsAccount.ms3aqz4E.0.0.50-internal.0.js → SettingsAccount.cfY4-PYd.0.0.50-internal.1.js} +1 -1
  22. package/dist/interface/js/SettingsAppearance.CBGZAazb.0.0.50-internal.1.js +1 -0
  23. package/dist/interface/js/{SettingsAppearance.vue_vue_type_script_setup_true_lang.CBQ6lL3T.0.0.50-internal.0.js → SettingsAppearance.vue_vue_type_script_setup_true_lang.kxAPXcBy.0.0.50-internal.1.js} +1 -1
  24. package/dist/interface/js/{SettingsBackup.BPEc4Rjg.0.0.50-internal.0.js → SettingsBackup.DOaJA4pp.0.0.50-internal.1.js} +1 -1
  25. package/dist/interface/js/SettingsRecordings.BGcwL6tk.0.0.50-internal.1.js +1 -0
  26. package/dist/interface/js/{SettingsRemote.BL5nXbUT.0.0.50-internal.0.js → SettingsRemote.BVU_w1Jm.0.0.50-internal.1.js} +1 -1
  27. package/dist/interface/js/{SettingsSystem.D7T0AIpm.0.0.50-internal.0.js → SettingsSystem.P0vy90vA.0.0.50-internal.1.js} +1 -1
  28. package/dist/interface/js/{SettingsUsers.1u0vCOVG.0.0.50-internal.0.js → SettingsUsers.DaP5m7eo.0.0.50-internal.1.js} +1 -1
  29. package/dist/interface/js/{VersionsHandler.vue_vue_type_script_setup_true_lang.xDishkkS.0.0.50-internal.0.js → VersionsHandler.vue_vue_type_script_setup_true_lang.MmrWYW3K.0.0.50-internal.1.js} +1 -1
  30. package/dist/interface/js/{ace-builds.D1nmvCwb.0.0.50-internal.0.js → ace-builds.C0aqA_3x.0.0.50-internal.1.js} +2 -2
  31. package/dist/interface/js/{ace.config.G96T2z54.0.0.50-internal.0.js → ace.config.C9wgzklI.0.0.50-internal.1.js} +1 -1
  32. package/dist/interface/js/{backup.B_Gzxtp_.0.0.50-internal.0.js → backup.BeH6lJ5t.0.0.50-internal.1.js} +1 -1
  33. package/dist/interface/js/{chart.js.CP_nMnnf.0.0.50-internal.0.js → chart.js.BQHSWV_g.0.0.50-internal.1.js} +1 -1
  34. package/dist/interface/js/{close-circle.DYLuVIOg.0.0.50-internal.0.js → close-circle.DDKMxauw.0.0.50-internal.1.js} +1 -1
  35. package/dist/interface/js/{dnd-core.T9OeW7mu.0.0.50-internal.0.js → dnd-core.dWz9rJqH.0.0.50-internal.1.js} +1 -1
  36. package/dist/interface/js/{draggabilly.D3zGcBb3.0.0.50-internal.0.js → draggabilly.D-iZIS1n.0.0.50-internal.1.js} +1 -1
  37. package/dist/interface/js/{engine.io-client.kITRnq-g.0.0.50-internal.0.js → engine.io-client.BwxOddB_.0.0.50-internal.1.js} +1 -1
  38. package/dist/interface/js/{fast-deep-equal.Bpc9mIsj.0.0.50-internal.0.js → fast-deep-equal.Dz96RC_N.0.0.50-internal.1.js} +1 -1
  39. package/dist/interface/js/{highlight.js.BlSXU-Wb.0.0.50-internal.0.js → highlight.js.CmcM8OM6.0.0.50-internal.1.js} +1 -1
  40. package/dist/interface/js/{linkify-it.C3N1lWsJ.0.0.50-internal.0.js → linkify-it.BgLcBzlw.0.0.50-internal.1.js} +1 -1
  41. package/dist/interface/js/{main.D0YR3Jat.0.0.50-internal.0.js → main.6bOgRV7D.0.0.50-internal.1.js} +3 -3
  42. package/dist/interface/js/{markdown-it.Dj0dt5s2.0.0.50-internal.0.js → markdown-it.CTgfs-3p.0.0.50-internal.1.js} +1 -1
  43. package/dist/interface/js/{nprogress.BwQWDcGj.0.0.50-internal.0.js → nprogress.CMhnq8jS.0.0.50-internal.1.js} +1 -1
  44. package/dist/interface/js/{pinia.DRh7plEC.0.0.50-internal.0.js → pinia.CuC5ZfNs.0.0.50-internal.1.js} +1 -1
  45. package/dist/interface/js/{primevue.Cl58krXf.0.0.50-internal.0.js → primevue.DmwjJ4xV.0.0.50-internal.1.js} +1 -1
  46. package/dist/interface/js/{qrcode.C1sDj6P8.0.0.50-internal.0.js → qrcode.DGZO3j1c.0.0.50-internal.1.js} +1 -1
  47. package/dist/interface/js/{react-dnd-touch-backend.BA4WhUJo.0.0.50-internal.0.js → react-dnd-touch-backend.CEGHlD-T.0.0.50-internal.1.js} +1 -1
  48. package/dist/interface/js/{refresh-rounded.D_SmhhUf.0.0.50-internal.0.js → refresh-rounded.D0keXzBc.0.0.50-internal.1.js} +1 -1
  49. package/dist/interface/js/{rxjs.C-fTBwEO.0.0.50-internal.0.js → rxjs.CiDbFOB0.0.0.50-internal.1.js} +1 -1
  50. package/dist/interface/js/{socket.io-client.DKrRxgjP.0.0.50-internal.0.js → socket.io-client.BPcXPAHG.0.0.50-internal.1.js} +1 -1
  51. package/dist/interface/js/{socket.io-parser.EXj3YDH2.0.0.50-internal.0.js → socket.io-parser.DSGzrW_l.0.0.50-internal.1.js} +1 -1
  52. package/dist/interface/js/{system.CY8rGd-Q.0.0.50-internal.0.js → system.BKlEObmx.0.0.50-internal.1.js} +1 -1
  53. package/dist/interface/js/{trash-fill.CMnCN3Oy.0.0.50-internal.0.js → trash-fill.BDFILs86.0.0.50-internal.1.js} +1 -1
  54. package/dist/interface/js/{unidragger.D0w6Tqtt.0.0.50-internal.0.js → unidragger.DcxsxHCS.0.0.50-internal.1.js} +1 -1
  55. package/dist/interface/js/{vee-validate.BeiObIH8.0.0.50-internal.0.js → vee-validate.BGRg3oQ8.0.0.50-internal.1.js} +1 -1
  56. package/dist/interface/js/{vue-chartjs.DtdZdiYw.0.0.50-internal.0.js → vue-chartjs.B9yk2de7.0.0.50-internal.1.js} +1 -1
  57. package/dist/interface/js/{vue-i18n.BW2bx_6z.0.0.50-internal.0.js → vue-i18n.DXDZITpf.0.0.50-internal.1.js} +1 -1
  58. package/dist/interface/js/{vue-inline-svg.BJkQGmKz.0.0.50-internal.0.js → vue-inline-svg.BDYaTfbi.0.0.50-internal.1.js} +1 -1
  59. package/dist/interface/js/{vue-router.B2mOXHaC.0.0.50-internal.0.js → vue-router.CFEDA008.0.0.50-internal.1.js} +1 -1
  60. package/dist/interface/js/{vue-zoomable.BKDyCJE7.0.0.50-internal.0.js → vue-zoomable.zqTafMgD.0.0.50-internal.1.js} +1 -1
  61. package/dist/interface/js/{vue3-dnd.DRK24CBp.0.0.50-internal.0.js → vue3-dnd.BxM3dbYs.0.0.50-internal.1.js} +1 -1
  62. package/dist/interface/js/{zoom-out.DxvzgVEo.0.0.50-internal.0.js → zoom-out.B6SY9IIj.0.0.50-internal.1.js} +1 -1
  63. package/dist/interface/sw.js +1 -1
  64. package/dist/server/package.json +1 -1
  65. package/package.json +1 -1
  66. package/.prettierignore +0 -12
  67. package/.prettierrc.json +0 -12
  68. package/artillery.yaml +0 -29
  69. package/bin/cameraui-server.ts +0 -11
  70. package/dist/interface/js/Cammesh.D-6dAROQ.0.0.50-internal.0.js +0 -1
  71. package/dist/interface/js/Recordings.DhxjIW7e.0.0.50-internal.0.js +0 -1
  72. package/dist/interface/js/SettingsAppearance.DsTjKXk1.0.0.50-internal.0.js +0 -1
  73. package/dist/interface/js/SettingsRecordings.DgW7M0jj.0.0.50-internal.0.js +0 -1
  74. package/eslint.config.js +0 -103
  75. package/localdeps.txt +0 -10
  76. package/mypy.ini +0 -30
  77. package/requirements.txt +0 -15
  78. package/ruff.toml +0 -90
  79. package/src/__init__.py +0 -0
  80. package/src/_camera_ui_tools/__init__.py +0 -0
  81. package/src/_camera_ui_tools/__pycache__/__init__.cpython-311.pyc +0 -0
  82. package/src/api/controllers/api.controller.ts +0 -19
  83. package/src/api/controllers/auth.controller.ts +0 -294
  84. package/src/api/controllers/backup.controller.ts +0 -72
  85. package/src/api/controllers/cameras.controller.ts +0 -1029
  86. package/src/api/controllers/config.controller.ts +0 -102
  87. package/src/api/controllers/files.controller.ts +0 -35
  88. package/src/api/controllers/frameWorkers.controller.ts +0 -109
  89. package/src/api/controllers/plugins.controller.ts +0 -1206
  90. package/src/api/controllers/system.controller.ts +0 -273
  91. package/src/api/controllers/users.controller.ts +0 -648
  92. package/src/api/database/checks.ts +0 -268
  93. package/src/api/database/constants.ts +0 -8
  94. package/src/api/database/index.ts +0 -262
  95. package/src/api/database/migration.ts +0 -62
  96. package/src/api/database/selfcheck.ts +0 -492
  97. package/src/api/database/types.ts +0 -104
  98. package/src/api/go2rtc/api/application.ts +0 -48
  99. package/src/api/go2rtc/api/config.ts +0 -61
  100. package/src/api/go2rtc/api/discover.ts +0 -197
  101. package/src/api/go2rtc/api/index.ts +0 -49
  102. package/src/api/go2rtc/api/snapshot.ts +0 -44
  103. package/src/api/go2rtc/api/streams.ts +0 -168
  104. package/src/api/go2rtc/index.ts +0 -43
  105. package/src/api/go2rtc/queue.ts +0 -50
  106. package/src/api/go2rtc/types.ts +0 -174
  107. package/src/api/index.ts +0 -286
  108. package/src/api/middlewares/authPermission.middleware.ts +0 -46
  109. package/src/api/middlewares/authValidation.middleware.ts +0 -160
  110. package/src/api/middlewares/pagination.middleware.ts +0 -67
  111. package/src/api/middlewares/socketAuth.middleware.ts +0 -136
  112. package/src/api/plugins/header.plugin.ts +0 -15
  113. package/src/api/plugins/logger.plugin.ts +0 -44
  114. package/src/api/plugins/proxy.plugin.ts +0 -255
  115. package/src/api/plugins/socket.plugin.ts +0 -28
  116. package/src/api/plugins/system.plugin.ts +0 -48
  117. package/src/api/plugins/useragent.plugin.ts +0 -19
  118. package/src/api/routes/api.routes.ts +0 -10
  119. package/src/api/routes/auth.routes.ts +0 -56
  120. package/src/api/routes/backup.routes.ts +0 -28
  121. package/src/api/routes/cameras.routes.ts +0 -281
  122. package/src/api/routes/config.routes.ts +0 -66
  123. package/src/api/routes/files.routes.ts +0 -15
  124. package/src/api/routes/frameWorkers.routes.ts +0 -39
  125. package/src/api/routes/index.ts +0 -37
  126. package/src/api/routes/plugins.routes.ts +0 -420
  127. package/src/api/routes/system.routes.ts +0 -101
  128. package/src/api/routes/users.routes.ts +0 -167
  129. package/src/api/schemas/backup.schema.ts +0 -112
  130. package/src/api/schemas/cameras.schema.ts +0 -479
  131. package/src/api/schemas/config.schema.ts +0 -38
  132. package/src/api/schemas/go2rtc.schema.ts +0 -189
  133. package/src/api/schemas/plugins.schema.ts +0 -126
  134. package/src/api/schemas/storage.schema.ts +0 -11
  135. package/src/api/schemas/system.schema.ts +0 -45
  136. package/src/api/schemas/users.schema.ts +0 -185
  137. package/src/api/services/auth.service.ts +0 -210
  138. package/src/api/services/backup.service.ts +0 -144
  139. package/src/api/services/cameras.service.ts +0 -671
  140. package/src/api/services/plugins.service.ts +0 -470
  141. package/src/api/services/system.service.ts +0 -85
  142. package/src/api/services/users.service.ts +0 -276
  143. package/src/api/types/index.ts +0 -675
  144. package/src/api/utils/cert.ts +0 -254
  145. package/src/api/utils/constants.ts +0 -17
  146. package/src/api/utils/fetch.ts +0 -21
  147. package/src/api/utils/moveFiles.ts +0 -45
  148. package/src/api/utils/parse.ts +0 -17
  149. package/src/api/websocket/index.ts +0 -110
  150. package/src/api/websocket/nsp/logs.ts +0 -240
  151. package/src/api/websocket/nsp/main.ts +0 -27
  152. package/src/api/websocket/nsp/metrics.ts +0 -301
  153. package/src/api/websocket/nsp/notifications.ts +0 -43
  154. package/src/api/websocket/nsp/plugins.ts +0 -37
  155. package/src/api/websocket/nsp/server.ts +0 -220
  156. package/src/api/websocket/nsp/status.ts +0 -77
  157. package/src/api/websocket/types.ts +0 -55
  158. package/src/api.ts +0 -163
  159. package/src/camera/classes.ts +0 -32
  160. package/src/camera/controller.ts +0 -579
  161. package/src/camera/device.ts +0 -422
  162. package/src/camera/frameWorker.ts +0 -403
  163. package/src/camera/index.ts +0 -679
  164. package/src/camera/interfaces.ts +0 -95
  165. package/src/camera/iou.ts +0 -153
  166. package/src/camera/polygon.ts +0 -226
  167. package/src/camera/python/__init__.py +0 -0
  168. package/src/camera/python/__pycache__/__init__.cpython-311.pyc +0 -0
  169. package/src/camera/python/__pycache__/classes.cpython-311.pyc +0 -0
  170. package/src/camera/python/__pycache__/delegate_controller.cpython-311.pyc +0 -0
  171. package/src/camera/python/__pycache__/interfaces.cpython-311.pyc +0 -0
  172. package/src/camera/python/__pycache__/iou.cpython-310.pyc +0 -0
  173. package/src/camera/python/__pycache__/iou.cpython-311.pyc +0 -0
  174. package/src/camera/python/__pycache__/iou2.cpython-310.pyc +0 -0
  175. package/src/camera/python/__pycache__/polygon.cpython-311.pyc +0 -0
  176. package/src/camera/python/__pycache__/typings.cpython-311.pyc +0 -0
  177. package/src/camera/python/__pycache__/video_frame.cpython-311.pyc +0 -0
  178. package/src/camera/python/classes.py +0 -41
  179. package/src/camera/python/interfaces.py +0 -130
  180. package/src/camera/python/iou.py +0 -158
  181. package/src/camera/python/polygon.py +0 -230
  182. package/src/camera/python/test/__pycache__/polygon.cpython-310.pyc +0 -0
  183. package/src/camera/python/test/iou_test.py +0 -799
  184. package/src/camera/python/test/polygon.py +0 -238
  185. package/src/camera/python/test/polygon_test.py +0 -256
  186. package/src/camera/python/test/polygon_test2.py +0 -484
  187. package/src/camera/python/typings.py +0 -50
  188. package/src/camera/python/video_frame.py +0 -143
  189. package/src/camera/session.ts +0 -192
  190. package/src/camera/streaming/fmp4-session.ts +0 -390
  191. package/src/camera/streaming/peer-connection.ts +0 -273
  192. package/src/camera/streaming/rtsp-session.ts +0 -331
  193. package/src/camera/streaming/webrtc-connection.ts +0 -260
  194. package/src/camera/streaming/werift-session.ts +0 -317
  195. package/src/camera/test/iou_test.ts +0 -761
  196. package/src/camera/test/polygon.test.ts +0 -611
  197. package/src/camera/test/polygon_test.ts +0 -210
  198. package/src/camera/types.ts +0 -48
  199. package/src/camera/utils.ts +0 -489
  200. package/src/camera/videoFrame.ts +0 -123
  201. package/src/cloud/index.ts +0 -61
  202. package/src/cloud/remote/cloudflare.ts +0 -18
  203. package/src/cloud/remote/upnp.ts +0 -18
  204. package/src/cloud/remote/utils.ts +0 -24
  205. package/src/cloud/types.ts +0 -16
  206. package/src/decoder/child.ts +0 -883
  207. package/src/decoder/imageUtils.ts +0 -275
  208. package/src/decoder/manager.ts +0 -251
  209. package/src/decoder/python/__init__.py +0 -0
  210. package/src/decoder/python/__pycache__/__init__.cpython-311.pyc +0 -0
  211. package/src/decoder/python/__pycache__/image_utils.cpython-311.pyc +0 -0
  212. package/src/decoder/python/__pycache__/typings.cpython-311.pyc +0 -0
  213. package/src/decoder/python/__pycache__/utils.cpython-311.pyc +0 -0
  214. package/src/decoder/python/child.py +0 -903
  215. package/src/decoder/python/image_utils.py +0 -196
  216. package/src/decoder/python/pool.py +0 -45
  217. package/src/decoder/python/test/group.py +0 -62
  218. package/src/decoder/python/test/motion.mp4 +0 -0
  219. package/src/decoder/python/test/motion2.mp4 +0 -0
  220. package/src/decoder/python/test/opencl.cl +0 -70
  221. package/src/decoder/python/test/opencl2.cl +0 -130
  222. package/src/decoder/python/test/test.py +0 -427
  223. package/src/decoder/python/test/test1.jpg +0 -0
  224. package/src/decoder/python/test/test1_resized.jpg +0 -0
  225. package/src/decoder/python/test/test2.jpg +0 -0
  226. package/src/decoder/python/test/test2.py +0 -451
  227. package/src/decoder/python/test/test2_resized.jpg +0 -0
  228. package/src/decoder/python/test/test3.jpg +0 -0
  229. package/src/decoder/python/test/utils.py +0 -50
  230. package/src/decoder/python/typings.py +0 -57
  231. package/src/decoder/python/utils.py +0 -70
  232. package/src/decoder/test/child.ts +0 -117
  233. package/src/decoder/test/ffmpeg.ts +0 -371
  234. package/src/decoder/test/test.ts +0 -182
  235. package/src/decoder/types.ts +0 -27
  236. package/src/decoder/utils.ts +0 -64
  237. package/src/decoder/wasm/asconfig.json +0 -28
  238. package/src/decoder/wasm/assembly/console.ts +0 -1
  239. package/src/decoder/wasm/assembly/index.ts +0 -890
  240. package/src/decoder/wasm/build/decoder.d.ts +0 -43
  241. package/src/decoder/wasm/build/decoder.js +0 -108
  242. package/src/decoder/wasm/build/decoder.wasm +0 -0
  243. package/src/decoder/wasm/tsconfig.json +0 -5
  244. package/src/decoder/worker.ts +0 -113
  245. package/src/go2rtc/index.ts +0 -324
  246. package/src/go2rtc/types.ts +0 -88
  247. package/src/main.ts +0 -267
  248. package/src/manager/coreManager.ts +0 -78
  249. package/src/manager/deviceManager.ts +0 -132
  250. package/src/manager/types.ts +0 -17
  251. package/src/plugins/index.ts +0 -443
  252. package/src/plugins/plugin.ts +0 -177
  253. package/src/plugins/runtime/base.ts +0 -282
  254. package/src/plugins/runtime/index.ts +0 -15
  255. package/src/plugins/runtime/node/child.ts +0 -193
  256. package/src/plugins/runtime/node/index.ts +0 -67
  257. package/src/plugins/runtime/node/plugin.ts +0 -122
  258. package/src/plugins/runtime/node/pluginApi.ts +0 -27
  259. package/src/plugins/runtime/node/proxy/cameraDevice.ts +0 -299
  260. package/src/plugins/runtime/node/proxy/coreManager.ts +0 -128
  261. package/src/plugins/runtime/node/proxy/deviceManager.ts +0 -187
  262. package/src/plugins/runtime/node/storage.ts +0 -312
  263. package/src/plugins/runtime/node/storageController.ts +0 -91
  264. package/src/plugins/runtime/python/__init__.py +0 -0
  265. package/src/plugins/runtime/python/__pycache__/__init__.cpython-311.pyc +0 -0
  266. package/src/plugins/runtime/python/__pycache__/camera_storage.cpython-311.pyc +0 -0
  267. package/src/plugins/runtime/python/__pycache__/config_service.cpython-311.pyc +0 -0
  268. package/src/plugins/runtime/python/__pycache__/constants.cpython-311.pyc +0 -0
  269. package/src/plugins/runtime/python/__pycache__/ipc.cpython-311.pyc +0 -0
  270. package/src/plugins/runtime/python/__pycache__/logger.cpython-311.pyc +0 -0
  271. package/src/plugins/runtime/python/__pycache__/message_queue.cpython-311.pyc +0 -0
  272. package/src/plugins/runtime/python/__pycache__/namespaces.cpython-311.pyc +0 -0
  273. package/src/plugins/runtime/python/__pycache__/plugin.cpython-311.pyc +0 -0
  274. package/src/plugins/runtime/python/__pycache__/plugin_api.cpython-311.pyc +0 -0
  275. package/src/plugins/runtime/python/__pycache__/plugin_logger.cpython-311.pyc +0 -0
  276. package/src/plugins/runtime/python/__pycache__/proxy_utils.cpython-311.pyc +0 -0
  277. package/src/plugins/runtime/python/__pycache__/schema.cpython-311.pyc +0 -0
  278. package/src/plugins/runtime/python/__pycache__/storage.cpython-311.pyc +0 -0
  279. package/src/plugins/runtime/python/__pycache__/storage_controller.cpython-311.pyc +0 -0
  280. package/src/plugins/runtime/python/__pycache__/typings.cpython-311.pyc +0 -0
  281. package/src/plugins/runtime/python/child.py +0 -248
  282. package/src/plugins/runtime/python/index.ts +0 -73
  283. package/src/plugins/runtime/python/namespaces.py +0 -101
  284. package/src/plugins/runtime/python/plugin.py +0 -155
  285. package/src/plugins/runtime/python/plugin_api.py +0 -29
  286. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-310.pyc +0 -0
  287. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-311.pyc +0 -0
  288. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-38.pyc +0 -0
  289. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-39.pyc +0 -0
  290. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-311.pyc +0 -0
  291. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-39.pyc +0 -0
  292. package/src/plugins/runtime/python/proxy/__pycache__/core_manager.cpython-311.pyc +0 -0
  293. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-310.pyc +0 -0
  294. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-311.pyc +0 -0
  295. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-38.pyc +0 -0
  296. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-39.pyc +0 -0
  297. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-310.pyc +0 -0
  298. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-311.pyc +0 -0
  299. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-38.pyc +0 -0
  300. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-39.pyc +0 -0
  301. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-310.pyc +0 -0
  302. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-311.pyc +0 -0
  303. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-38.pyc +0 -0
  304. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-39.pyc +0 -0
  305. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-310.pyc +0 -0
  306. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-311.pyc +0 -0
  307. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-38.pyc +0 -0
  308. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-39.pyc +0 -0
  309. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-310.pyc +0 -0
  310. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-311.pyc +0 -0
  311. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-38.pyc +0 -0
  312. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-39.pyc +0 -0
  313. package/src/plugins/runtime/python/proxy/camera_device.py +0 -1732
  314. package/src/plugins/runtime/python/proxy/core_manager.py +0 -126
  315. package/src/plugins/runtime/python/proxy/device_manager.py +0 -197
  316. package/src/plugins/runtime/python/schema.py +0 -99
  317. package/src/plugins/runtime/python/storage.py +0 -353
  318. package/src/plugins/runtime/python/storage_controller.py +0 -102
  319. package/src/plugins/runtime/python/typings.py +0 -195
  320. package/src/plugins/schema.ts +0 -472
  321. package/src/plugins/types.ts +0 -60
  322. package/src/plugins/worker.ts +0 -250
  323. package/src/rpc/index.ts +0 -149
  324. package/src/rpc/namespaces.ts +0 -79
  325. package/src/rpc/server.ts +0 -422
  326. package/src/rpc/types.ts +0 -119
  327. package/src/rpc/utils.ts +0 -16
  328. package/src/services/config/constants.ts +0 -47
  329. package/src/services/config/defaults.ts +0 -57
  330. package/src/services/config/index.ts +0 -744
  331. package/src/services/config/types.ts +0 -211
  332. package/src/services/logger/index.ts +0 -96
  333. package/src/types.ts +0 -47
  334. package/src/utils/path.ts +0 -16
  335. package/src/utils/pythonInstaller.ts +0 -597
  336. package/tsconfig.json +0 -37
  337. package/updates.config.js +0 -3
  338. /package/dist/interface/assets/{@xterm.DYP7pi_n.0.0.50-internal.0.css → @xterm.DYP7pi_n.0.0.50-internal.1.css} +0 -0
  339. /package/dist/interface/assets/{Adminpanel.BKek2EMH.0.0.50-internal.0.css → Adminpanel.BKek2EMH.0.0.50-internal.1.css} +0 -0
  340. /package/dist/interface/assets/{Cameras.BDWZJqPN.0.0.50-internal.0.css → Cameras.BDWZJqPN.0.0.50-internal.1.css} +0 -0
  341. /package/dist/interface/assets/{Camview.BFUFMoNX.0.0.50-internal.0.css → Camview.BFUFMoNX.0.0.50-internal.1.css} +0 -0
  342. /package/dist/interface/assets/{CuiConsole.DCYyxdVg.0.0.50-internal.0.css → CuiConsole.DCYyxdVg.0.0.50-internal.1.css} +0 -0
  343. /package/dist/interface/assets/{CuiPluginCard.yF8V0SZY.0.0.50-internal.0.css → CuiPluginCard.yF8V0SZY.0.0.50-internal.1.css} +0 -0
  344. /package/dist/interface/assets/{CuiTimeline.BkIwlYtw.0.0.50-internal.0.css → CuiTimeline.BkIwlYtw.0.0.50-internal.1.css} +0 -0
  345. /package/dist/interface/assets/{Plugin.DJElsAn5.0.0.50-internal.0.css → Plugin.DJElsAn5.0.0.50-internal.1.css} +0 -0
  346. /package/dist/interface/assets/{Plugins.0h77qnmN.0.0.50-internal.0.css → Plugins.0h77qnmN.0.0.50-internal.1.css} +0 -0
  347. /package/dist/interface/assets/{Settings.CkgfRkQr.0.0.50-internal.0.css → Settings.CkgfRkQr.0.0.50-internal.1.css} +0 -0
  348. /package/dist/interface/assets/{SettingsAccount.DeFul3eQ.0.0.50-internal.0.css → SettingsAccount.DeFul3eQ.0.0.50-internal.1.css} +0 -0
  349. /package/dist/interface/assets/{SettingsBackup.CX0rT0QJ.0.0.50-internal.0.css → SettingsBackup.CX0rT0QJ.0.0.50-internal.1.css} +0 -0
  350. /package/dist/interface/assets/{highlight.Ch2EwETz.0.0.50-internal.0.css → highlight.Ch2EwETz.0.0.50-internal.1.css} +0 -0
  351. /package/dist/interface/assets/{logo-256.BCQk9H1-.0.0.50-internal.0.png → logo-256.BCQk9H1-.0.0.50-internal.1.png} +0 -0
  352. /package/dist/interface/assets/{logo-512.DLKVOU2S.0.0.50-internal.0.png → logo-512.DLKVOU2S.0.0.50-internal.1.png} +0 -0
  353. /package/dist/interface/assets/{logo.DmEiRk0z.0.0.50-internal.0.png → logo.DmEiRk0z.0.0.50-internal.1.png} +0 -0
  354. /package/dist/interface/assets/{main.Cip9LkS3.0.0.50-internal.0.css → main.Cip9LkS3.0.0.50-internal.1.css} +0 -0
  355. /package/dist/interface/assets/{mode-json.Br7xisR1.0.0.50-internal.0.js → mode-json.Br7xisR1.0.0.50-internal.1.js} +0 -0
  356. /package/dist/interface/assets/{mode-yaml.CIYL8U3d.0.0.50-internal.0.js → mode-yaml.CIYL8U3d.0.0.50-internal.1.js} +0 -0
  357. /package/dist/interface/assets/{worker-base.jEXLGV2h.0.0.50-internal.0.js → worker-base.jEXLGV2h.0.0.50-internal.1.js} +0 -0
  358. /package/dist/interface/assets/{worker-json.DgwNIOck.0.0.50-internal.0.js → worker-json.DgwNIOck.0.0.50-internal.1.js} +0 -0
  359. /package/dist/interface/assets/{worker-yaml.B3uUYINB.0.0.50-internal.0.js → worker-yaml.B3uUYINB.0.0.50-internal.1.js} +0 -0
  360. /package/dist/interface/js/{@babel.l0sNRNKZ.0.0.50-internal.0.js → @babel.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  361. /package/dist/interface/js/{@intlify.BkGPX90O.0.0.50-internal.0.js → @intlify.BkGPX90O.0.0.50-internal.1.js} +0 -0
  362. /package/dist/interface/js/{@kurkle.D8fDXNIl.0.0.50-internal.0.js → @kurkle.D8fDXNIl.0.0.50-internal.1.js} +0 -0
  363. /package/dist/interface/js/{@primeuix.BFAY2Bk9.0.0.50-internal.0.js → @primeuix.BFAY2Bk9.0.0.50-internal.1.js} +0 -0
  364. /package/dist/interface/js/{@react-dnd.CcwRs9xb.0.0.50-internal.0.js → @react-dnd.CcwRs9xb.0.0.50-internal.1.js} +0 -0
  365. /package/dist/interface/js/{@socket.io.Dkula2eQ.0.0.50-internal.0.js → @socket.io.Dkula2eQ.0.0.50-internal.1.js} +0 -0
  366. /package/dist/interface/js/{@vue.B5vqhCp2.0.0.50-internal.0.js → @vue.B5vqhCp2.0.0.50-internal.1.js} +0 -0
  367. /package/dist/interface/js/{@xterm.CAa7rpjv.0.0.50-internal.0.js → @xterm.DIUBesyz.0.0.50-internal.1.js} +0 -0
  368. /package/dist/interface/js/{axios.DHr9lByg.0.0.50-internal.0.js → axios.DHr9lByg.0.0.50-internal.1.js} +0 -0
  369. /package/dist/interface/js/{birpc.l0sNRNKZ.0.0.50-internal.0.js → birpc.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  370. /package/dist/interface/js/{compare-versions.DqEOhma6.0.0.50-internal.0.js → compare-versions.DqEOhma6.0.0.50-internal.1.js} +0 -0
  371. /package/dist/interface/js/{dijkstrajs.C00ieaqj.0.0.50-internal.0.js → dijkstrajs.C00ieaqj.0.0.50-internal.1.js} +0 -0
  372. /package/dist/interface/js/{engine.io-parser.BiEtp6m2.0.0.50-internal.0.js → engine.io-parser.BiEtp6m2.0.0.50-internal.1.js} +0 -0
  373. /package/dist/interface/js/{entities.C20TfXL6.0.0.50-internal.0.js → entities.C20TfXL6.0.0.50-internal.1.js} +0 -0
  374. /package/dist/interface/js/{ev-emitter.X5f1qa-c.0.0.50-internal.0.js → ev-emitter.X5f1qa-c.0.0.50-internal.1.js} +0 -0
  375. /package/dist/interface/js/{get-size.D1dS-IaP.0.0.50-internal.0.js → get-size.D1dS-IaP.0.0.50-internal.1.js} +0 -0
  376. /package/dist/interface/js/{hookable.l0sNRNKZ.0.0.50-internal.0.js → hookable.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  377. /package/dist/interface/js/{mdurl.k9Sl0PQj.0.0.50-internal.0.js → mdurl.k9Sl0PQj.0.0.50-internal.1.js} +0 -0
  378. /package/dist/interface/js/{perfect-debounce.l0sNRNKZ.0.0.50-internal.0.js → perfect-debounce.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  379. /package/dist/interface/js/{primelocale.Bga3dOQu.0.0.50-internal.0.js → primelocale.Bga3dOQu.0.0.50-internal.1.js} +0 -0
  380. /package/dist/interface/js/{punycode.js.Dj65hjkv.0.0.50-internal.0.js → punycode.js.Dj65hjkv.0.0.50-internal.1.js} +0 -0
  381. /package/dist/interface/js/{react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.0.js → react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.1.js} +0 -0
  382. /package/dist/interface/js/{redux.BFxtlG_c.0.0.50-internal.0.js → redux.BFxtlG_c.0.0.50-internal.1.js} +0 -0
  383. /package/dist/interface/js/{tslib.9k7AwCpt.0.0.50-internal.0.js → tslib.9k7AwCpt.0.0.50-internal.1.js} +0 -0
  384. /package/dist/interface/js/{uc.micro.kMc2yuuw.0.0.50-internal.0.js → uc.micro.kMc2yuuw.0.0.50-internal.1.js} +0 -0
  385. /package/dist/interface/js/{uuid.C6aID195.0.0.50-internal.0.js → uuid.C6aID195.0.0.50-internal.1.js} +0 -0
  386. /package/dist/interface/js/{vue.l0sNRNKZ.0.0.50-internal.0.js → vue.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  387. /package/dist/interface/js/{zod.SKKegNRO.0.0.50-internal.0.js → zod.SKKegNRO.0.0.50-internal.1.js} +0 -0
@@ -1,282 +0,0 @@
1
- import { Logger } from '@camera.ui/common';
2
- import { pathExists } from 'fs-extra';
3
- import { EventEmitter } from 'node:events';
4
- import { createWriteStream, ftruncate, read, rmSync } from 'node:fs';
5
- import { open, stat } from 'node:fs/promises';
6
- import { join } from 'node:path';
7
- import { promisify } from 'node:util';
8
- import { container } from 'tsyringe';
9
-
10
- import { API_EVENT } from '../../api.js';
11
-
12
- import type { ChildProcess } from 'node:child_process';
13
- import type { WriteStream } from 'node:fs';
14
- import type { CameraUiAPI } from '../../api.js';
15
- import type { ProcInfo } from '../../api/database/checks.js';
16
- import type { SocketService } from '../../api/websocket/index.js';
17
- import type { ProxyServer } from '../../rpc/index.js';
18
- import type { ConfigService } from '../../services/config/index.js';
19
- import type { LoggerService } from '../../services/logger/index.js';
20
- import type { PluginManager } from '../index.js';
21
- import type { Plugin } from '../plugin.js';
22
-
23
- const truncatePromise = promisify(ftruncate);
24
- const readPromise = promisify(read);
25
-
26
- export declare interface BasePluginRuntime {
27
- on(event: 'exit', listener: () => void): this;
28
- once(event: 'exit', listener: () => void): this;
29
- off(event: 'exit', listener: () => void): this;
30
- emit(event: 'exit'): boolean;
31
- removeListener(event: 'exit', listener: () => void): this;
32
- }
33
-
34
- export abstract class BasePluginRuntime extends EventEmitter {
35
- public readonly logger: Logger;
36
-
37
- protected api: CameraUiAPI;
38
- protected configService: ConfigService;
39
- protected socketService: SocketService;
40
- protected pluginManager: PluginManager;
41
- protected proxyServer: ProxyServer;
42
-
43
- protected worker?: ChildProcess;
44
- protected processInfo?: ProcInfo;
45
-
46
- private loggerService: LoggerService;
47
- private processLogger: Logger;
48
-
49
- private logStream?: WriteStream;
50
- private truncateInterval?: NodeJS.Timeout;
51
- private truncateIntervalMs: number = 1000 * 60 * 60 * 2;
52
- private logBuffer = '';
53
-
54
- constructor(protected plugin: Plugin) {
55
- super();
56
-
57
- this.api = container.resolve<CameraUiAPI>('api');
58
- this.loggerService = container.resolve<LoggerService>('logger');
59
- this.configService = container.resolve<ConfigService>('configService');
60
- this.socketService = container.resolve<SocketService>('socketService');
61
- this.pluginManager = container.resolve<PluginManager>('pluginManager');
62
- this.proxyServer = container.resolve<ProxyServer>('proxy');
63
-
64
- this.logger = this.loggerService.createLogger({ prefix: plugin.displayName, logStream: this.logStream });
65
- this.processLogger = this.loggerService.createLogger({
66
- ...this.configService.loggerOptions,
67
- disablePrefix: true,
68
- disableTimestamps: true,
69
- prefix: undefined,
70
- suffix: undefined,
71
- });
72
-
73
- this.logStream = createWriteStream(this.plugin.logPath, { flags: 'a' });
74
- this.truncateInterval = setInterval(() => this.truncateLog(), this.truncateIntervalMs);
75
- this.truncateLog();
76
-
77
- this.api.setMaxListeners(this.api.getMaxListeners() + 1);
78
- this.api.once(API_EVENT.SHUTDOWN, () => {
79
- this.closeLogStream();
80
- });
81
- }
82
-
83
- public abstract start(): Promise<void>;
84
-
85
- public stop(): Promise<void> {
86
- return new Promise<void>((resolve) => {
87
- if (!this.worker || this.worker.killed) {
88
- resolve();
89
- return;
90
- }
91
-
92
- const killTimeout = setTimeout(() => {
93
- this.logger.warn(`Plugin ${this.plugin.displayName} did not terminate gracefully. Forcing closure.`);
94
- this.worker?.kill('SIGKILL');
95
- resolve();
96
- }, 3000);
97
-
98
- this.worker.once('close', (code, signal) => {
99
- clearTimeout(killTimeout);
100
- this.logger.log(`Plugin ${this.plugin.displayName} closed. Code: ${code}, Signal: ${signal}`);
101
- this.worker = undefined;
102
- resolve();
103
- });
104
-
105
- this.worker.kill('SIGTERM');
106
- });
107
- }
108
-
109
- public kill(): void {
110
- this.worker?.kill('SIGKILL');
111
- }
112
-
113
- public getPID(): number {
114
- return this.worker?.pid ?? 0;
115
- }
116
-
117
- public isRunning(): boolean {
118
- return !!this.worker && !this.worker?.killed;
119
- }
120
-
121
- public writeLog(...args: any[]): void {
122
- this.safeWriteLog(args.join(' ').replace(/\r?\n*$/, '\n'));
123
- }
124
-
125
- public writeHeader(): void {
126
- const date = new Date().toLocaleString('en-US');
127
- const pluginInfo = `${this.plugin.pluginName}@${this.plugin.info.installedVersion}`;
128
- const content = `${date}: ${pluginInfo}`;
129
- const lineLength = content.length + 3;
130
- const line = '-'.repeat(lineLength);
131
-
132
- this.safeWriteLog(`\n${line}\n`);
133
- this.safeWriteLog(content.padEnd(lineLength));
134
- this.safeWriteLog(`\n${line}\n\n`);
135
- }
136
-
137
- public cleanup(): void {
138
- this.removeLogStream();
139
- this.removeAllListeners();
140
- }
141
-
142
- protected onSpawn(pid: number, command: string, args: string[], titles: string[], resolve: (value: void | PromiseLike<void>) => void): void {
143
- this.logger.log(`Initializing process with PID: ${pid}`);
144
-
145
- this.processInfo = this.configService.addProcess({
146
- pid,
147
- command,
148
- args,
149
- titles,
150
- startTime: Date.now(),
151
- });
152
-
153
- resolve();
154
- }
155
-
156
- protected onError(reject: (reason?: any) => void, error: Error): void {
157
- this.logger.error(`The plugin process for "${this.plugin.pluginName}" failed to start/stop!`, error);
158
- reject(error);
159
- }
160
-
161
- protected onExit(): void {
162
- this.logger.log(`Plugin ${this.plugin.displayName} exited`);
163
- const cameras = this.api.getCameras();
164
- cameras.forEach((camera) => camera.removePluginCapabilities(this.plugin.id));
165
- this.configService.removeProcessByPID(this.processInfo?.pid);
166
- this.worker = undefined;
167
- this.processInfo = undefined;
168
- this.emit('exit');
169
- }
170
-
171
- protected onData(data: Buffer): void {
172
- const rawData = data.toString();
173
- this.logBuffer += rawData;
174
-
175
- let endIndex: number;
176
- while ((endIndex = this.logBuffer.indexOf(Logger.LOGGER_END)) !== -1) {
177
- const logEntry = this.logBuffer.slice(0, endIndex);
178
- this.processLogEntry(logEntry, true);
179
- this.logBuffer = this.logBuffer.slice(endIndex + Logger.LOGGER_END.length);
180
- }
181
-
182
- const remainingLines = this.logBuffer.split('\n');
183
- this.logBuffer = remainingLines.pop() ?? '';
184
- remainingLines.forEach((line) => this.processLogEntry(line, false));
185
- }
186
-
187
- protected getEnv(): Record<string, string> {
188
- return {
189
- WORKER_NAME: this.plugin.displayName,
190
- PLUGIN_ID: this.plugin.id,
191
- PLUGIN_NAME: this.plugin.pluginName,
192
- FORCE_COLOR: '1',
193
- PROXY_USER: this.proxyServer.auth.server.user,
194
- PROXY_PASSWORD: this.proxyServer.auth.server.password,
195
- PROXY_ENDPOINTS: this.proxyServer.server.endpoints.join(','),
196
- PROXY_CERT: this.configService.ssl.cert.toString('utf-8'),
197
- PROXY_KEY: this.configService.ssl.key.toString('utf-8'),
198
- PROXY_CA: this.configService.ssl.ca.toString('utf-8'),
199
- LOGGER_LEVEL: this.configService.config.logger.level,
200
- LOGGER_DISABLE_TIMESTAMPS: this.configService.config.logger.disableTimestamps ? '1' : '0',
201
- MODULE_PATH: join(this.plugin.installPath, this.plugin.main),
202
- };
203
- }
204
-
205
- private processLogEntry(logEntry: string, hasLoggerId: boolean): void {
206
- if (hasLoggerId) {
207
- const { loggerId, content } = this.processLogger.extractLoggerIdAndContent(logEntry);
208
- if (loggerId) {
209
- this.api.writeCameraLog(loggerId, content);
210
- }
211
- this.writeProcessLog(content);
212
- } else {
213
- this.writeProcessLog(logEntry);
214
- }
215
- }
216
-
217
- private writeProcessLog(content: string): void {
218
- if (content.trim() && !content.includes('returning true from eof_received')) {
219
- this.processLogger.log(content);
220
- this.safeWriteLog(content + '\n');
221
- }
222
- }
223
-
224
- private closeLogStream(): void {
225
- clearInterval(this.truncateInterval);
226
- this.logStream?.close();
227
- this.logStream = undefined;
228
- this.logger.logStream = undefined;
229
- this.logBuffer = '';
230
- }
231
-
232
- private removeLogStream(): void {
233
- this.closeLogStream();
234
- rmSync(this.plugin.logPath);
235
- }
236
-
237
- private async truncateLog(): Promise<void> {
238
- if (!(await pathExists(this.plugin.logPath))) {
239
- return;
240
- }
241
-
242
- const maxSize = 1000000; // ~1 MB
243
- const truncateSize = 200000; // ~0.2 MB
244
-
245
- try {
246
- const logStats = await stat(this.plugin.logPath);
247
-
248
- if (logStats.size < maxSize) {
249
- // this.logger.debug(`Log file size is less than ${maxSize} bytes, skipping truncate`);
250
- return;
251
- }
252
-
253
- // this.logger.debug(`Truncating log file to ${truncateSize} bytes...`);
254
-
255
- const logStartPosition = logStats.size - truncateSize;
256
- const logBuffer = Buffer.alloc(truncateSize);
257
- const fileHandle = await open(this.plugin.logPath, 'r+');
258
-
259
- try {
260
- await readPromise(fileHandle.fd, logBuffer, 0, truncateSize, logStartPosition);
261
- await truncatePromise(fileHandle.fd, 0);
262
- await fileHandle.write(logBuffer, 0, truncateSize, 0);
263
- } finally {
264
- await fileHandle.close();
265
- }
266
-
267
- // this.logger.debug('Log file truncated successfully');
268
- } catch (e) {
269
- this.logger.error(`Failed to truncate log file: ${e.message}`);
270
- }
271
- }
272
-
273
- private safeWriteLog(message: string): void {
274
- if (this.logStream?.writable) {
275
- try {
276
- this.logStream?.write(message);
277
- } catch {
278
- // Ignore
279
- }
280
- }
281
- }
282
- }
@@ -1,15 +0,0 @@
1
- import { NodePluginRuntime } from './node/index.js';
2
- import { PythonPluginRuntime } from './python/index.js';
3
-
4
- import type { Plugin } from '../plugin.js';
5
- import type { BasePluginRuntime } from './base.js';
6
-
7
- export class RuntimeFactory {
8
- static createRuntime(plugin: Plugin): BasePluginRuntime {
9
- if (plugin.isPython) {
10
- return new PythonPluginRuntime(plugin);
11
- } else {
12
- return new NodePluginRuntime(plugin);
13
- }
14
- }
15
- }
@@ -1,193 +0,0 @@
1
- import { Logger, SignalHandler, sleep } from '@camera.ui/common';
2
- import { ClientInstance } from '@camera.ui/rpc-client';
3
- import { open } from 'lmdb';
4
- import { fileURLToPath } from 'node:url';
5
-
6
- import { API_EVENT } from '../../../api.js';
7
- import { NamespaceManager } from '../../../rpc/namespaces.js';
8
- import { PLUGIN_COMMAND, PLUGIN_STATUS } from '../../types.js';
9
- import { Plugin } from './plugin.js';
10
- import { PluginAPI } from './pluginApi.js';
11
- import { CameraDeviceProxy } from './proxy/cameraDevice.js';
12
-
13
- import type { LoggerOptions } from '@camera.ui/common';
14
- import type { SubscriptionWrapper } from '@camera.ui/rpc-common';
15
- import type { Camera } from '@camera.ui/types';
16
- import type { RootDatabase } from 'lmdb';
17
- import type { PluginInfo, ProcessLoadMessage, ProcessMessage, ProcessResponse } from '../../types.js';
18
-
19
- const processName = process.argv[3] || process.argv[2] || 'Plugin';
20
- process.title = `camera.ui - ${processName}`;
21
-
22
- export class PluginChild extends ClientInstance {
23
- private displayName: string;
24
- private api?: PluginAPI;
25
- private plugin?: Plugin;
26
- private pluginDb?: RootDatabase<Record<string, any>, 'config'>;
27
- private signalHandler: SignalHandler;
28
-
29
- private logger: Logger;
30
- private loggerOptions: LoggerOptions;
31
-
32
- private subscription?: SubscriptionWrapper;
33
-
34
- private stopped = false;
35
-
36
- constructor() {
37
- super('plugin', {
38
- endpoints: process.env.PROXY_ENDPOINTS!.split(','),
39
- auth: {
40
- user: process.env.PROXY_USER!,
41
- password: process.env.PROXY_PASSWORD!,
42
- },
43
- tls: {
44
- cert: process.env.PROXY_CERT!,
45
- key: process.env.PROXY_KEY!,
46
- ca: process.env.PROXY_CA!,
47
- },
48
- metadata: {
49
- id: NamespaceManager.pluginNamespaces(process.env.PLUGIN_ID!).pluginChild,
50
- name: process.env.PLUGIN_NAME!,
51
- },
52
- connect: {
53
- waitForServer: true,
54
- },
55
- reconnect: {
56
- enabled: true,
57
- },
58
- bundledConnection: false,
59
- });
60
-
61
- delete process.env.PROXY_USER;
62
- delete process.env.PROXY_PASSWORD;
63
- delete process.env.PROXY_ENDPOINTS;
64
- delete process.env.PROXY_CERT;
65
- delete process.env.PROXY_KEY;
66
- delete process.env.PROXY_CA;
67
-
68
- this.displayName = processName;
69
-
70
- this.loggerOptions = {
71
- prefix: this.displayName,
72
- disableTimestamps: process.env.LOGGER_DISABLE_TIMESTAMPS === '1',
73
- debugEnabled: process.env.LOGGER_LEVEL === 'debug' || process.env.LOGGER_LEVEL === 'trace',
74
- traceEnabled: process.env.LOGGER_LEVEL === 'trace',
75
- };
76
-
77
- this.logger = new Logger(this.loggerOptions);
78
-
79
- this.signalHandler = new SignalHandler({
80
- displayName: '[Signal]',
81
- timeoutDuration: 3000,
82
- logger: this.logger,
83
- closeFunction: this.stopPlugin.bind(this),
84
- });
85
-
86
- this.start();
87
- }
88
-
89
- protected async onStart(): Promise<void> {
90
- this.subscription = this.onServerMessage<ProcessMessage>(this.onMessage.bind(this));
91
- this.sendMessage({ type: PLUGIN_STATUS.READY });
92
- }
93
-
94
- protected async onBeforeStop(): Promise<void> {
95
- await this.stopPlugin();
96
- }
97
-
98
- protected async onStop(): Promise<void> {}
99
-
100
- private async startPlugin(data: ProcessLoadMessage): Promise<void> {
101
- try {
102
- const storagePath = data.storage.storagePath;
103
- const pluginInfo = data.plugin;
104
- const cameras = data.cameras;
105
-
106
- this.pluginDb = await this.configurePluginDB(storagePath);
107
- this.api = new PluginAPI(this, pluginInfo, storagePath, this.logger, this.pluginDb);
108
- this.plugin = new Plugin(this, this.api, pluginInfo, this.logger);
109
-
110
- await this.api.deviceManager.init();
111
- await this.api.coreManager.init();
112
- await this.plugin.load();
113
- await this.configureCameras(this.api, pluginInfo, cameras);
114
-
115
- this.sendMessage({ type: PLUGIN_STATUS.STARTED });
116
-
117
- setImmediate(() => {
118
- this.api?.emit(API_EVENT.FINISH_LAUNCHING);
119
- });
120
- } catch (error: any) {
121
- this.sendMessage({ type: PLUGIN_STATUS.ERROR, error: error.message });
122
- }
123
- }
124
-
125
- private async stopPlugin(): Promise<void> {
126
- if (this.stopped) {
127
- return;
128
- }
129
-
130
- this.stopped = true;
131
-
132
- this.api?.emit(API_EVENT.SHUTDOWN);
133
-
134
- await sleep(500);
135
- await this.pluginDb?.close();
136
-
137
- this.subscription?.unsubscribe();
138
- this.subscription = undefined;
139
-
140
- await this.stop();
141
- }
142
-
143
- private sendMessage(message: ProcessResponse): void {
144
- this.sendToServer<ProcessResponse>(message);
145
- }
146
-
147
- private async onMessage(message: ProcessMessage): Promise<void> {
148
- if (this.stopped) {
149
- return;
150
- }
151
-
152
- switch (message.type) {
153
- case PLUGIN_COMMAND.START:
154
- if (!message.data) {
155
- this.sendMessage({ type: PLUGIN_STATUS.ERROR, error: 'No data provided' });
156
- return;
157
- }
158
-
159
- this.startPlugin(message.data);
160
- break;
161
- case PLUGIN_COMMAND.STOP:
162
- this.stopPlugin();
163
- break;
164
- }
165
- }
166
-
167
- private async configurePluginDB(storagePath: string): Promise<RootDatabase<Record<string, any>, 'config'>> {
168
- const pluginDb = open(`${storagePath}/volume`, {
169
- name: 'plugins',
170
- });
171
-
172
- const pluginConfig = pluginDb.get('config');
173
- if (!pluginConfig) {
174
- await pluginDb.put('config', {});
175
- }
176
-
177
- return pluginDb as RootDatabase<Record<string, any>, 'config'>;
178
- }
179
-
180
- private async configureCameras(api: PluginAPI, pluginInfo: PluginInfo, cameras: Camera[]): Promise<void> {
181
- const cameraDevices = cameras.map((camera) => {
182
- const cameraLogger = this.logger.createLogger({ suffix: camera.name, loggerId: camera._id });
183
- return new CameraDeviceProxy(this, api, camera, pluginInfo, cameraLogger);
184
- });
185
-
186
- await this.api?.deviceManager.configureCameras(cameraDevices);
187
- await this.plugin?.configureCameras(cameraDevices);
188
- }
189
- }
190
-
191
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
192
- new PluginChild();
193
- }
@@ -1,67 +0,0 @@
1
- import { fork } from 'child_process';
2
- import { nodePluginPath } from '../../../utils/path.js';
3
-
4
- import { BasePluginRuntime } from '../base.js';
5
-
6
- import { IS_DEV } from '@camera.ui/common';
7
- import type { Plugin } from '../../plugin.js';
8
-
9
- export class NodePluginRuntime extends BasePluginRuntime {
10
- constructor(plugin: Plugin) {
11
- super(plugin);
12
- }
13
-
14
- public async start(): Promise<void> {
15
- if (this.isRunning()) {
16
- return;
17
- }
18
-
19
- return new Promise<void>((resolve, reject) => {
20
- this.logger.log(`Starting plugin: ${this.plugin.displayName} (${this.plugin.pluginName}.${this.plugin.info.installedVersion})...`);
21
-
22
- const command = process.execPath;
23
- const processNames = [this.plugin.pluginName, this.plugin.displayName];
24
- const args: string[] = [nodePluginPath, ...processNames];
25
-
26
- this.logger.debug(`Forking plugin: ${this.plugin.pluginName}`);
27
-
28
- this.worker = fork(nodePluginPath, [...processNames], {
29
- env: {
30
- ...this.cleanedProcessEnv(),
31
- ...this.getEnv(),
32
- },
33
- cwd: this.plugin.mainPath,
34
- silent: true,
35
- execArgv: IS_DEV ? ['--import=tsx'] : undefined,
36
- });
37
-
38
- this.worker.once('spawn', this.onSpawn.bind(this, this.worker.pid!, command, args, processNames, resolve));
39
- this.worker.once('error', this.onError.bind(this, reject));
40
- this.worker.once('exit', this.onExit.bind(this));
41
-
42
- this.worker.stdout?.on('data', this.onData.bind(this));
43
- this.worker.stderr?.on('data', this.onData.bind(this));
44
- });
45
- }
46
-
47
- private cleanedProcessEnv(): Record<string, string> {
48
- const env = { ...process.env } as Record<string, string>;
49
-
50
- delete env.CAMERA_UI_STORAGE_PATH;
51
- delete env.CAMERA_UI_DATABASE_PATH;
52
- delete env.CAMERA_UI_USERS_STORAGE_PATH;
53
- delete env.CAMERA_UI_PLUGINS_STORAGE_PATH;
54
- delete env.CAMERA_UI_PLUGINS_INSTALL_PATH;
55
- delete env.CAMERA_UI_PLUGINS_PJSON_FILE;
56
- delete env.CAMERA_UI_CONFIG_FILE;
57
- delete env.CAMERA_UI_SECRETS_FILE;
58
- delete env.CAMERA_UI_LOG_FILE;
59
- delete env.CAMERA_UI_GO2RTC_CONFIG_FILE;
60
- delete env.CAMERA_UI_GO2RTC_BINARY;
61
- delete env.CAMERA_UI_DEV_PORT;
62
- delete env.CAMERA_UI_DEV_WS_PORT;
63
- delete env.CAMERA_UI_DEV_UI_PORT;
64
-
65
- return env;
66
- }
67
- }
@@ -1,122 +0,0 @@
1
- import { rpc } from '@camera.ui/rpc-common';
2
- import { pathToFileURL } from 'node:url';
3
- import { isPromise } from 'node:util/types';
4
-
5
- import { NamespaceManager } from '../../../rpc/namespaces.js';
6
-
7
- import type { Logger } from '@camera.ui/common';
8
- import type { ClientInstance } from '@camera.ui/rpc-client';
9
- import type {
10
- AudioDetectionPluginResponse,
11
- AudioMetadata,
12
- CuiPlugin,
13
- CuiPluginCapability,
14
- DeviceStorage,
15
- ImageMetadata,
16
- JsonSchema,
17
- MotionDetectionPluginResponse,
18
- ObjectDetectionPluginResponse,
19
- } from '@camera.ui/types';
20
- import type { PluginNamespaces } from '../../../rpc/namespaces.js';
21
- import type { PluginInfo } from '../../types.js';
22
- import type { PluginAPI } from './pluginApi.js';
23
- import type { CameraDeviceProxy } from './proxy/cameraDevice.js';
24
-
25
- export type PluginConstructor = new (logger: Logger, api: PluginAPI, storage: DeviceStorage<Record<string, any>>) => CuiPlugin;
26
-
27
- export class Plugin implements CuiPlugin {
28
- private plugin?: CuiPlugin;
29
- private namespaces: PluginNamespaces;
30
-
31
- constructor(
32
- private proxy: ClientInstance,
33
- private api: PluginAPI,
34
- private pluginInfo: PluginInfo,
35
- private logger: Logger,
36
- ) {
37
- this.namespaces = NamespaceManager.pluginNamespaces(this.pluginInfo.id);
38
- }
39
-
40
- public async load(): Promise<void> {
41
- const PluginConstructor = await this.loadPlugin();
42
- const pluginStorage = await this.api.storageController.createStorage('plugin');
43
- this.plugin = new PluginConstructor(this.logger, this.api, pluginStorage);
44
- await this.proxy.registerRPCHandler(this.namespaces.pluginChildRpc, this);
45
- }
46
-
47
- @rpc({ public: true })
48
- public async configureCameras(cameraDevices: CameraDeviceProxy[]): Promise<void> {
49
- if (!this.plugin) {
50
- throw new Error('Plugin not loaded');
51
- }
52
-
53
- await this.plugin.configureCameras(cameraDevices);
54
- }
55
-
56
- @rpc({ public: true })
57
- public getCapabilities(): Promise<CuiPluginCapability[]> {
58
- if (!this.plugin) {
59
- throw new Error('Plugin not loaded');
60
- }
61
-
62
- return this.plugin.getCapabilities();
63
- }
64
-
65
- @rpc({ public: true })
66
- public async interfaceSchema(): Promise<JsonSchema[] | undefined> {
67
- if (!this.plugin) {
68
- throw new Error('Plugin not loaded');
69
- }
70
-
71
- return this.plugin.interfaceSchema?.();
72
- }
73
-
74
- @rpc({ public: true })
75
- public async detectAudio(audioData: Buffer | Uint8Array, metadata: AudioMetadata, config: Record<string, any>): Promise<AudioDetectionPluginResponse | undefined> {
76
- if (!this.plugin) {
77
- throw new Error('Plugin not loaded');
78
- }
79
-
80
- return this.plugin.detectAudio?.(audioData, metadata, config);
81
- }
82
-
83
- @rpc({ public: true })
84
- public async detectMotion(videoData: Buffer | Uint8Array, config: Record<string, any>): Promise<MotionDetectionPluginResponse | undefined> {
85
- if (!this.plugin) {
86
- throw new Error('Plugin not loaded');
87
- }
88
-
89
- return this.plugin.detectMotion?.(videoData, config);
90
- }
91
-
92
- @rpc({ public: true })
93
- public async detectObjects(imageData: Buffer | Uint8Array, metadata: ImageMetadata, config: Record<string, any>): Promise<ObjectDetectionPluginResponse | undefined> {
94
- if (!this.plugin) {
95
- throw new Error('Plugin not loaded');
96
- }
97
-
98
- return this.plugin.detectObjects?.(imageData, metadata, config);
99
- }
100
-
101
- private async loadPlugin(): Promise<PluginConstructor> {
102
- const moduleUrl = pathToFileURL(process.env.MODULE_PATH!).href;
103
- const mod = await import(moduleUrl);
104
- const isDefaultPromise = isPromise(mod.default);
105
-
106
- let defaultModule: any;
107
-
108
- if (isDefaultPromise) {
109
- defaultModule = await mod.default;
110
- } else {
111
- defaultModule = mod.default;
112
- }
113
-
114
- if (defaultModule && typeof defaultModule.default === 'function') {
115
- return defaultModule.default;
116
- } else if (typeof defaultModule === 'function') {
117
- return defaultModule;
118
- } else {
119
- throw new Error(`Plugin ${process.env.MODULE_PATH} does not export a initializer function from main.`);
120
- }
121
- }
122
- }