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

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 (390) hide show
  1. package/dist/interface/index.html +44 -44
  2. package/dist/interface/js/{@primevue.OhxoO3MD.0.0.50-internal.0.js → @primevue.BAIU_p3r.0.0.50-internal.2.js} +1 -1
  3. package/dist/interface/js/{@tanstack.D1IL6eOv.0.0.50-internal.0.js → @tanstack.mdCorqzE.0.0.50-internal.2.js} +1 -1
  4. package/dist/interface/js/{@vee-validate.BGPyWWTh.0.0.50-internal.0.js → @vee-validate.D0vsSsly.0.0.50-internal.2.js} +1 -1
  5. package/dist/interface/js/{@vueuse.BsKtqdiG.0.0.50-internal.0.js → @vueuse.we5ZpWr2.0.0.50-internal.2.js} +1 -1
  6. package/dist/interface/js/{Adminpanel.D93Kvbwp.0.0.50-internal.0.js → Adminpanel.9AEBJ3H1.0.0.50-internal.2.js} +1 -1
  7. package/dist/interface/js/{Camera.DF2l3OMA.0.0.50-internal.0.js → Camera.CZcnEH0C.0.0.50-internal.2.js} +1 -1
  8. package/dist/interface/js/{Cameras.YzvZccdv.0.0.50-internal.0.js → Cameras.DE0LkcGu.0.0.50-internal.2.js} +2 -2
  9. package/dist/interface/js/Cammesh.CVvmkelB.0.0.50-internal.2.js +1 -0
  10. package/dist/interface/js/{Camview.CB7_HnoQ.0.0.50-internal.0.js → Camview.CUr4pGoU.0.0.50-internal.2.js} +1 -1
  11. package/dist/interface/js/{Config.BwflsWTm.0.0.50-internal.0.js → Config.CaJhu4fF.0.0.50-internal.2.js} +2 -2
  12. package/dist/interface/js/{Console.DZM8pN8Q.0.0.50-internal.0.js → Console.5VUmgryj.0.0.50-internal.2.js} +1 -1
  13. package/dist/interface/js/{CuiConsole.BXXU7Gth.0.0.50-internal.0.js → CuiConsole.iYmUxAR5.0.0.50-internal.2.js} +1 -1
  14. package/dist/interface/js/{CuiPluginCard.YFOrpbVD.0.0.50-internal.0.js → CuiPluginCard.DXPyE5mF.0.0.50-internal.2.js} +1 -1
  15. package/dist/interface/js/{CuiTimeline.VV5KSJd5.0.0.50-internal.0.js → CuiTimeline.BqtlOFnV.0.0.50-internal.2.js} +1 -1
  16. package/dist/interface/js/{FirstSteps.b-nvymgb.0.0.50-internal.0.js → FirstSteps.C_RI-SDQ.0.0.50-internal.2.js} +1 -1
  17. package/dist/interface/js/{Plugin.BOMpVEwM.0.0.50-internal.0.js → Plugin.Ch_v02eN.0.0.50-internal.2.js} +1 -1
  18. package/dist/interface/js/{Plugins.DdPwaUDA.0.0.50-internal.0.js → Plugins.BpXAYgSG.0.0.50-internal.2.js} +1 -1
  19. package/dist/interface/js/Recordings.CIKHJytH.0.0.50-internal.2.js +1 -0
  20. package/dist/interface/js/{Settings.D24ttaPu.0.0.50-internal.0.js → Settings.BcLoGNEy.0.0.50-internal.2.js} +1 -1
  21. package/dist/interface/js/{SettingsAccount.ms3aqz4E.0.0.50-internal.0.js → SettingsAccount.DMROW8kx.0.0.50-internal.2.js} +1 -1
  22. package/dist/interface/js/SettingsAppearance.CUaHpihp.0.0.50-internal.2.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.BuKZ-Uco.0.0.50-internal.2.js} +1 -1
  24. package/dist/interface/js/{SettingsBackup.BPEc4Rjg.0.0.50-internal.0.js → SettingsBackup.0QdwFSpv.0.0.50-internal.2.js} +1 -1
  25. package/dist/interface/js/SettingsRecordings.B-aj0U8_.0.0.50-internal.2.js +1 -0
  26. package/dist/interface/js/{SettingsRemote.BL5nXbUT.0.0.50-internal.0.js → SettingsRemote.Bi1YAJ76.0.0.50-internal.2.js} +1 -1
  27. package/dist/interface/js/{SettingsSystem.D7T0AIpm.0.0.50-internal.0.js → SettingsSystem.CAx66Iir.0.0.50-internal.2.js} +1 -1
  28. package/dist/interface/js/{SettingsUsers.1u0vCOVG.0.0.50-internal.0.js → SettingsUsers.CQcDtGy1.0.0.50-internal.2.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.BhXMzIhV.0.0.50-internal.2.js} +1 -1
  30. package/dist/interface/js/{ace-builds.D1nmvCwb.0.0.50-internal.0.js → ace-builds.C0sCXSu5.0.0.50-internal.2.js} +2 -2
  31. package/dist/interface/js/{ace.config.G96T2z54.0.0.50-internal.0.js → ace.config.DNqPWa0Q.0.0.50-internal.2.js} +1 -1
  32. package/dist/interface/js/{backup.B_Gzxtp_.0.0.50-internal.0.js → backup.DAXgG3bP.0.0.50-internal.2.js} +1 -1
  33. package/dist/interface/js/{chart.js.CP_nMnnf.0.0.50-internal.0.js → chart.js.Bq3YocRX.0.0.50-internal.2.js} +1 -1
  34. package/dist/interface/js/{close-circle.DYLuVIOg.0.0.50-internal.0.js → close-circle.9rxyNw0z.0.0.50-internal.2.js} +1 -1
  35. package/dist/interface/js/{dnd-core.T9OeW7mu.0.0.50-internal.0.js → dnd-core.BuEvHAsS.0.0.50-internal.2.js} +1 -1
  36. package/dist/interface/js/{draggabilly.D3zGcBb3.0.0.50-internal.0.js → draggabilly.DUdE08x8.0.0.50-internal.2.js} +1 -1
  37. package/dist/interface/js/{engine.io-client.kITRnq-g.0.0.50-internal.0.js → engine.io-client.DWU6YI8o.0.0.50-internal.2.js} +1 -1
  38. package/dist/interface/js/{fast-deep-equal.Bpc9mIsj.0.0.50-internal.0.js → fast-deep-equal.BpPyC6E4.0.0.50-internal.2.js} +1 -1
  39. package/dist/interface/js/{highlight.js.BlSXU-Wb.0.0.50-internal.0.js → highlight.js.BoR2Rhdd.0.0.50-internal.2.js} +1 -1
  40. package/dist/interface/js/{linkify-it.C3N1lWsJ.0.0.50-internal.0.js → linkify-it.BXzPONHs.0.0.50-internal.2.js} +1 -1
  41. package/dist/interface/js/{main.D0YR3Jat.0.0.50-internal.0.js → main.DwcBYfWc.0.0.50-internal.2.js} +3 -3
  42. package/dist/interface/js/{markdown-it.Dj0dt5s2.0.0.50-internal.0.js → markdown-it.BUDVOjPt.0.0.50-internal.2.js} +1 -1
  43. package/dist/interface/js/{nprogress.BwQWDcGj.0.0.50-internal.0.js → nprogress.CsG-OBoI.0.0.50-internal.2.js} +1 -1
  44. package/dist/interface/js/{pinia.DRh7plEC.0.0.50-internal.0.js → pinia.CqEQao5R.0.0.50-internal.2.js} +1 -1
  45. package/dist/interface/js/{primevue.Cl58krXf.0.0.50-internal.0.js → primevue.D91sslRx.0.0.50-internal.2.js} +1 -1
  46. package/dist/interface/js/{qrcode.C1sDj6P8.0.0.50-internal.0.js → qrcode.SdSTPzZO.0.0.50-internal.2.js} +1 -1
  47. package/dist/interface/js/{react-dnd-touch-backend.BA4WhUJo.0.0.50-internal.0.js → react-dnd-touch-backend.BwroebQ4.0.0.50-internal.2.js} +1 -1
  48. package/dist/interface/js/{refresh-rounded.D_SmhhUf.0.0.50-internal.0.js → refresh-rounded.DxM48YSv.0.0.50-internal.2.js} +1 -1
  49. package/dist/interface/js/{rxjs.C-fTBwEO.0.0.50-internal.0.js → rxjs.Cmpbnzo4.0.0.50-internal.2.js} +1 -1
  50. package/dist/interface/js/{socket.io-client.DKrRxgjP.0.0.50-internal.0.js → socket.io-client.DF2YgZo1.0.0.50-internal.2.js} +1 -1
  51. package/dist/interface/js/{socket.io-parser.EXj3YDH2.0.0.50-internal.0.js → socket.io-parser.BUs2ineY.0.0.50-internal.2.js} +1 -1
  52. package/dist/interface/js/{system.CY8rGd-Q.0.0.50-internal.0.js → system.DmkT2LKx.0.0.50-internal.2.js} +1 -1
  53. package/dist/interface/js/{trash-fill.CMnCN3Oy.0.0.50-internal.0.js → trash-fill.dPzyZDVa.0.0.50-internal.2.js} +1 -1
  54. package/dist/interface/js/{unidragger.D0w6Tqtt.0.0.50-internal.0.js → unidragger.y2ZlFveS.0.0.50-internal.2.js} +1 -1
  55. package/dist/interface/js/{vee-validate.BeiObIH8.0.0.50-internal.0.js → vee-validate.Y-alCADW.0.0.50-internal.2.js} +1 -1
  56. package/dist/interface/js/{vue-chartjs.DtdZdiYw.0.0.50-internal.0.js → vue-chartjs.sRVFTqDf.0.0.50-internal.2.js} +1 -1
  57. package/dist/interface/js/{vue-i18n.BW2bx_6z.0.0.50-internal.0.js → vue-i18n.D5WrXOZa.0.0.50-internal.2.js} +1 -1
  58. package/dist/interface/js/{vue-inline-svg.BJkQGmKz.0.0.50-internal.0.js → vue-inline-svg.R0uz_abA.0.0.50-internal.2.js} +1 -1
  59. package/dist/interface/js/{vue-router.B2mOXHaC.0.0.50-internal.0.js → vue-router.65mnGy-o.0.0.50-internal.2.js} +1 -1
  60. package/dist/interface/js/{vue-zoomable.BKDyCJE7.0.0.50-internal.0.js → vue-zoomable.B1Qop6Uu.0.0.50-internal.2.js} +1 -1
  61. package/dist/interface/js/{vue3-dnd.DRK24CBp.0.0.50-internal.0.js → vue3-dnd.CwmyAcir.0.0.50-internal.2.js} +1 -1
  62. package/dist/interface/js/{zoom-out.DxvzgVEo.0.0.50-internal.0.js → zoom-out.CMPALvRh.0.0.50-internal.2.js} +1 -1
  63. package/dist/interface/sw.js +1 -1
  64. package/dist/server/package.json +1 -1
  65. package/dist/server/src/rpc/server.js +4 -1
  66. package/dist/server/src/rpc/server.js.map +1 -1
  67. package/package.json +1 -1
  68. package/.prettierignore +0 -12
  69. package/.prettierrc.json +0 -12
  70. package/artillery.yaml +0 -29
  71. package/bin/cameraui-server.ts +0 -11
  72. package/dist/interface/js/Cammesh.D-6dAROQ.0.0.50-internal.0.js +0 -1
  73. package/dist/interface/js/Recordings.DhxjIW7e.0.0.50-internal.0.js +0 -1
  74. package/dist/interface/js/SettingsAppearance.DsTjKXk1.0.0.50-internal.0.js +0 -1
  75. package/dist/interface/js/SettingsRecordings.DgW7M0jj.0.0.50-internal.0.js +0 -1
  76. package/eslint.config.js +0 -103
  77. package/localdeps.txt +0 -10
  78. package/mypy.ini +0 -30
  79. package/requirements.txt +0 -15
  80. package/ruff.toml +0 -90
  81. package/src/__init__.py +0 -0
  82. package/src/_camera_ui_tools/__init__.py +0 -0
  83. package/src/_camera_ui_tools/__pycache__/__init__.cpython-311.pyc +0 -0
  84. package/src/api/controllers/api.controller.ts +0 -19
  85. package/src/api/controllers/auth.controller.ts +0 -294
  86. package/src/api/controllers/backup.controller.ts +0 -72
  87. package/src/api/controllers/cameras.controller.ts +0 -1029
  88. package/src/api/controllers/config.controller.ts +0 -102
  89. package/src/api/controllers/files.controller.ts +0 -35
  90. package/src/api/controllers/frameWorkers.controller.ts +0 -109
  91. package/src/api/controllers/plugins.controller.ts +0 -1206
  92. package/src/api/controllers/system.controller.ts +0 -273
  93. package/src/api/controllers/users.controller.ts +0 -648
  94. package/src/api/database/checks.ts +0 -268
  95. package/src/api/database/constants.ts +0 -8
  96. package/src/api/database/index.ts +0 -262
  97. package/src/api/database/migration.ts +0 -62
  98. package/src/api/database/selfcheck.ts +0 -492
  99. package/src/api/database/types.ts +0 -104
  100. package/src/api/go2rtc/api/application.ts +0 -48
  101. package/src/api/go2rtc/api/config.ts +0 -61
  102. package/src/api/go2rtc/api/discover.ts +0 -197
  103. package/src/api/go2rtc/api/index.ts +0 -49
  104. package/src/api/go2rtc/api/snapshot.ts +0 -44
  105. package/src/api/go2rtc/api/streams.ts +0 -168
  106. package/src/api/go2rtc/index.ts +0 -43
  107. package/src/api/go2rtc/queue.ts +0 -50
  108. package/src/api/go2rtc/types.ts +0 -174
  109. package/src/api/index.ts +0 -286
  110. package/src/api/middlewares/authPermission.middleware.ts +0 -46
  111. package/src/api/middlewares/authValidation.middleware.ts +0 -160
  112. package/src/api/middlewares/pagination.middleware.ts +0 -67
  113. package/src/api/middlewares/socketAuth.middleware.ts +0 -136
  114. package/src/api/plugins/header.plugin.ts +0 -15
  115. package/src/api/plugins/logger.plugin.ts +0 -44
  116. package/src/api/plugins/proxy.plugin.ts +0 -255
  117. package/src/api/plugins/socket.plugin.ts +0 -28
  118. package/src/api/plugins/system.plugin.ts +0 -48
  119. package/src/api/plugins/useragent.plugin.ts +0 -19
  120. package/src/api/routes/api.routes.ts +0 -10
  121. package/src/api/routes/auth.routes.ts +0 -56
  122. package/src/api/routes/backup.routes.ts +0 -28
  123. package/src/api/routes/cameras.routes.ts +0 -281
  124. package/src/api/routes/config.routes.ts +0 -66
  125. package/src/api/routes/files.routes.ts +0 -15
  126. package/src/api/routes/frameWorkers.routes.ts +0 -39
  127. package/src/api/routes/index.ts +0 -37
  128. package/src/api/routes/plugins.routes.ts +0 -420
  129. package/src/api/routes/system.routes.ts +0 -101
  130. package/src/api/routes/users.routes.ts +0 -167
  131. package/src/api/schemas/backup.schema.ts +0 -112
  132. package/src/api/schemas/cameras.schema.ts +0 -479
  133. package/src/api/schemas/config.schema.ts +0 -38
  134. package/src/api/schemas/go2rtc.schema.ts +0 -189
  135. package/src/api/schemas/plugins.schema.ts +0 -126
  136. package/src/api/schemas/storage.schema.ts +0 -11
  137. package/src/api/schemas/system.schema.ts +0 -45
  138. package/src/api/schemas/users.schema.ts +0 -185
  139. package/src/api/services/auth.service.ts +0 -210
  140. package/src/api/services/backup.service.ts +0 -144
  141. package/src/api/services/cameras.service.ts +0 -671
  142. package/src/api/services/plugins.service.ts +0 -470
  143. package/src/api/services/system.service.ts +0 -85
  144. package/src/api/services/users.service.ts +0 -276
  145. package/src/api/types/index.ts +0 -675
  146. package/src/api/utils/cert.ts +0 -254
  147. package/src/api/utils/constants.ts +0 -17
  148. package/src/api/utils/fetch.ts +0 -21
  149. package/src/api/utils/moveFiles.ts +0 -45
  150. package/src/api/utils/parse.ts +0 -17
  151. package/src/api/websocket/index.ts +0 -110
  152. package/src/api/websocket/nsp/logs.ts +0 -240
  153. package/src/api/websocket/nsp/main.ts +0 -27
  154. package/src/api/websocket/nsp/metrics.ts +0 -301
  155. package/src/api/websocket/nsp/notifications.ts +0 -43
  156. package/src/api/websocket/nsp/plugins.ts +0 -37
  157. package/src/api/websocket/nsp/server.ts +0 -220
  158. package/src/api/websocket/nsp/status.ts +0 -77
  159. package/src/api/websocket/types.ts +0 -55
  160. package/src/api.ts +0 -163
  161. package/src/camera/classes.ts +0 -32
  162. package/src/camera/controller.ts +0 -579
  163. package/src/camera/device.ts +0 -422
  164. package/src/camera/frameWorker.ts +0 -403
  165. package/src/camera/index.ts +0 -679
  166. package/src/camera/interfaces.ts +0 -95
  167. package/src/camera/iou.ts +0 -153
  168. package/src/camera/polygon.ts +0 -226
  169. package/src/camera/python/__init__.py +0 -0
  170. package/src/camera/python/__pycache__/__init__.cpython-311.pyc +0 -0
  171. package/src/camera/python/__pycache__/classes.cpython-311.pyc +0 -0
  172. package/src/camera/python/__pycache__/delegate_controller.cpython-311.pyc +0 -0
  173. package/src/camera/python/__pycache__/interfaces.cpython-311.pyc +0 -0
  174. package/src/camera/python/__pycache__/iou.cpython-310.pyc +0 -0
  175. package/src/camera/python/__pycache__/iou.cpython-311.pyc +0 -0
  176. package/src/camera/python/__pycache__/iou2.cpython-310.pyc +0 -0
  177. package/src/camera/python/__pycache__/polygon.cpython-311.pyc +0 -0
  178. package/src/camera/python/__pycache__/typings.cpython-311.pyc +0 -0
  179. package/src/camera/python/__pycache__/video_frame.cpython-311.pyc +0 -0
  180. package/src/camera/python/classes.py +0 -41
  181. package/src/camera/python/interfaces.py +0 -130
  182. package/src/camera/python/iou.py +0 -158
  183. package/src/camera/python/polygon.py +0 -230
  184. package/src/camera/python/test/__pycache__/polygon.cpython-310.pyc +0 -0
  185. package/src/camera/python/test/iou_test.py +0 -799
  186. package/src/camera/python/test/polygon.py +0 -238
  187. package/src/camera/python/test/polygon_test.py +0 -256
  188. package/src/camera/python/test/polygon_test2.py +0 -484
  189. package/src/camera/python/typings.py +0 -50
  190. package/src/camera/python/video_frame.py +0 -143
  191. package/src/camera/session.ts +0 -192
  192. package/src/camera/streaming/fmp4-session.ts +0 -390
  193. package/src/camera/streaming/peer-connection.ts +0 -273
  194. package/src/camera/streaming/rtsp-session.ts +0 -331
  195. package/src/camera/streaming/webrtc-connection.ts +0 -260
  196. package/src/camera/streaming/werift-session.ts +0 -317
  197. package/src/camera/test/iou_test.ts +0 -761
  198. package/src/camera/test/polygon.test.ts +0 -611
  199. package/src/camera/test/polygon_test.ts +0 -210
  200. package/src/camera/types.ts +0 -48
  201. package/src/camera/utils.ts +0 -489
  202. package/src/camera/videoFrame.ts +0 -123
  203. package/src/cloud/index.ts +0 -61
  204. package/src/cloud/remote/cloudflare.ts +0 -18
  205. package/src/cloud/remote/upnp.ts +0 -18
  206. package/src/cloud/remote/utils.ts +0 -24
  207. package/src/cloud/types.ts +0 -16
  208. package/src/decoder/child.ts +0 -883
  209. package/src/decoder/imageUtils.ts +0 -275
  210. package/src/decoder/manager.ts +0 -251
  211. package/src/decoder/python/__init__.py +0 -0
  212. package/src/decoder/python/__pycache__/__init__.cpython-311.pyc +0 -0
  213. package/src/decoder/python/__pycache__/image_utils.cpython-311.pyc +0 -0
  214. package/src/decoder/python/__pycache__/typings.cpython-311.pyc +0 -0
  215. package/src/decoder/python/__pycache__/utils.cpython-311.pyc +0 -0
  216. package/src/decoder/python/child.py +0 -903
  217. package/src/decoder/python/image_utils.py +0 -196
  218. package/src/decoder/python/pool.py +0 -45
  219. package/src/decoder/python/test/group.py +0 -62
  220. package/src/decoder/python/test/motion.mp4 +0 -0
  221. package/src/decoder/python/test/motion2.mp4 +0 -0
  222. package/src/decoder/python/test/opencl.cl +0 -70
  223. package/src/decoder/python/test/opencl2.cl +0 -130
  224. package/src/decoder/python/test/test.py +0 -427
  225. package/src/decoder/python/test/test1.jpg +0 -0
  226. package/src/decoder/python/test/test1_resized.jpg +0 -0
  227. package/src/decoder/python/test/test2.jpg +0 -0
  228. package/src/decoder/python/test/test2.py +0 -451
  229. package/src/decoder/python/test/test2_resized.jpg +0 -0
  230. package/src/decoder/python/test/test3.jpg +0 -0
  231. package/src/decoder/python/test/utils.py +0 -50
  232. package/src/decoder/python/typings.py +0 -57
  233. package/src/decoder/python/utils.py +0 -70
  234. package/src/decoder/test/child.ts +0 -117
  235. package/src/decoder/test/ffmpeg.ts +0 -371
  236. package/src/decoder/test/test.ts +0 -182
  237. package/src/decoder/types.ts +0 -27
  238. package/src/decoder/utils.ts +0 -64
  239. package/src/decoder/wasm/asconfig.json +0 -28
  240. package/src/decoder/wasm/assembly/console.ts +0 -1
  241. package/src/decoder/wasm/assembly/index.ts +0 -890
  242. package/src/decoder/wasm/build/decoder.d.ts +0 -43
  243. package/src/decoder/wasm/build/decoder.js +0 -108
  244. package/src/decoder/wasm/build/decoder.wasm +0 -0
  245. package/src/decoder/wasm/tsconfig.json +0 -5
  246. package/src/decoder/worker.ts +0 -113
  247. package/src/go2rtc/index.ts +0 -324
  248. package/src/go2rtc/types.ts +0 -88
  249. package/src/main.ts +0 -267
  250. package/src/manager/coreManager.ts +0 -78
  251. package/src/manager/deviceManager.ts +0 -132
  252. package/src/manager/types.ts +0 -17
  253. package/src/plugins/index.ts +0 -443
  254. package/src/plugins/plugin.ts +0 -177
  255. package/src/plugins/runtime/base.ts +0 -282
  256. package/src/plugins/runtime/index.ts +0 -15
  257. package/src/plugins/runtime/node/child.ts +0 -193
  258. package/src/plugins/runtime/node/index.ts +0 -67
  259. package/src/plugins/runtime/node/plugin.ts +0 -122
  260. package/src/plugins/runtime/node/pluginApi.ts +0 -27
  261. package/src/plugins/runtime/node/proxy/cameraDevice.ts +0 -299
  262. package/src/plugins/runtime/node/proxy/coreManager.ts +0 -128
  263. package/src/plugins/runtime/node/proxy/deviceManager.ts +0 -187
  264. package/src/plugins/runtime/node/storage.ts +0 -312
  265. package/src/plugins/runtime/node/storageController.ts +0 -91
  266. package/src/plugins/runtime/python/__init__.py +0 -0
  267. package/src/plugins/runtime/python/__pycache__/__init__.cpython-311.pyc +0 -0
  268. package/src/plugins/runtime/python/__pycache__/camera_storage.cpython-311.pyc +0 -0
  269. package/src/plugins/runtime/python/__pycache__/config_service.cpython-311.pyc +0 -0
  270. package/src/plugins/runtime/python/__pycache__/constants.cpython-311.pyc +0 -0
  271. package/src/plugins/runtime/python/__pycache__/ipc.cpython-311.pyc +0 -0
  272. package/src/plugins/runtime/python/__pycache__/logger.cpython-311.pyc +0 -0
  273. package/src/plugins/runtime/python/__pycache__/message_queue.cpython-311.pyc +0 -0
  274. package/src/plugins/runtime/python/__pycache__/namespaces.cpython-311.pyc +0 -0
  275. package/src/plugins/runtime/python/__pycache__/plugin.cpython-311.pyc +0 -0
  276. package/src/plugins/runtime/python/__pycache__/plugin_api.cpython-311.pyc +0 -0
  277. package/src/plugins/runtime/python/__pycache__/plugin_logger.cpython-311.pyc +0 -0
  278. package/src/plugins/runtime/python/__pycache__/proxy_utils.cpython-311.pyc +0 -0
  279. package/src/plugins/runtime/python/__pycache__/schema.cpython-311.pyc +0 -0
  280. package/src/plugins/runtime/python/__pycache__/storage.cpython-311.pyc +0 -0
  281. package/src/plugins/runtime/python/__pycache__/storage_controller.cpython-311.pyc +0 -0
  282. package/src/plugins/runtime/python/__pycache__/typings.cpython-311.pyc +0 -0
  283. package/src/plugins/runtime/python/child.py +0 -248
  284. package/src/plugins/runtime/python/index.ts +0 -73
  285. package/src/plugins/runtime/python/namespaces.py +0 -101
  286. package/src/plugins/runtime/python/plugin.py +0 -155
  287. package/src/plugins/runtime/python/plugin_api.py +0 -29
  288. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-310.pyc +0 -0
  289. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-311.pyc +0 -0
  290. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-38.pyc +0 -0
  291. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-39.pyc +0 -0
  292. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-311.pyc +0 -0
  293. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-39.pyc +0 -0
  294. package/src/plugins/runtime/python/proxy/__pycache__/core_manager.cpython-311.pyc +0 -0
  295. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-310.pyc +0 -0
  296. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-311.pyc +0 -0
  297. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-38.pyc +0 -0
  298. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-39.pyc +0 -0
  299. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-310.pyc +0 -0
  300. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-311.pyc +0 -0
  301. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-38.pyc +0 -0
  302. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-39.pyc +0 -0
  303. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-310.pyc +0 -0
  304. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-311.pyc +0 -0
  305. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-38.pyc +0 -0
  306. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-39.pyc +0 -0
  307. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-310.pyc +0 -0
  308. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-311.pyc +0 -0
  309. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-38.pyc +0 -0
  310. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-39.pyc +0 -0
  311. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-310.pyc +0 -0
  312. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-311.pyc +0 -0
  313. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-38.pyc +0 -0
  314. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-39.pyc +0 -0
  315. package/src/plugins/runtime/python/proxy/camera_device.py +0 -1732
  316. package/src/plugins/runtime/python/proxy/core_manager.py +0 -126
  317. package/src/plugins/runtime/python/proxy/device_manager.py +0 -197
  318. package/src/plugins/runtime/python/schema.py +0 -99
  319. package/src/plugins/runtime/python/storage.py +0 -353
  320. package/src/plugins/runtime/python/storage_controller.py +0 -102
  321. package/src/plugins/runtime/python/typings.py +0 -195
  322. package/src/plugins/schema.ts +0 -472
  323. package/src/plugins/types.ts +0 -60
  324. package/src/plugins/worker.ts +0 -250
  325. package/src/rpc/index.ts +0 -149
  326. package/src/rpc/namespaces.ts +0 -79
  327. package/src/rpc/server.ts +0 -422
  328. package/src/rpc/types.ts +0 -119
  329. package/src/rpc/utils.ts +0 -16
  330. package/src/services/config/constants.ts +0 -47
  331. package/src/services/config/defaults.ts +0 -57
  332. package/src/services/config/index.ts +0 -744
  333. package/src/services/config/types.ts +0 -211
  334. package/src/services/logger/index.ts +0 -96
  335. package/src/types.ts +0 -47
  336. package/src/utils/path.ts +0 -16
  337. package/src/utils/pythonInstaller.ts +0 -597
  338. package/tsconfig.json +0 -37
  339. package/types/fastify.d.ts +0 -14
  340. package/updates.config.js +0 -3
  341. /package/dist/interface/assets/{@xterm.DYP7pi_n.0.0.50-internal.0.css → @xterm.DYP7pi_n.0.0.50-internal.2.css} +0 -0
  342. /package/dist/interface/assets/{Adminpanel.BKek2EMH.0.0.50-internal.0.css → Adminpanel.BKek2EMH.0.0.50-internal.2.css} +0 -0
  343. /package/dist/interface/assets/{Cameras.BDWZJqPN.0.0.50-internal.0.css → Cameras.BDWZJqPN.0.0.50-internal.2.css} +0 -0
  344. /package/dist/interface/assets/{Camview.BFUFMoNX.0.0.50-internal.0.css → Camview.BFUFMoNX.0.0.50-internal.2.css} +0 -0
  345. /package/dist/interface/assets/{CuiConsole.DCYyxdVg.0.0.50-internal.0.css → CuiConsole.DCYyxdVg.0.0.50-internal.2.css} +0 -0
  346. /package/dist/interface/assets/{CuiPluginCard.yF8V0SZY.0.0.50-internal.0.css → CuiPluginCard.yF8V0SZY.0.0.50-internal.2.css} +0 -0
  347. /package/dist/interface/assets/{CuiTimeline.BkIwlYtw.0.0.50-internal.0.css → CuiTimeline.BkIwlYtw.0.0.50-internal.2.css} +0 -0
  348. /package/dist/interface/assets/{Plugin.DJElsAn5.0.0.50-internal.0.css → Plugin.DJElsAn5.0.0.50-internal.2.css} +0 -0
  349. /package/dist/interface/assets/{Plugins.0h77qnmN.0.0.50-internal.0.css → Plugins.0h77qnmN.0.0.50-internal.2.css} +0 -0
  350. /package/dist/interface/assets/{Settings.CkgfRkQr.0.0.50-internal.0.css → Settings.CkgfRkQr.0.0.50-internal.2.css} +0 -0
  351. /package/dist/interface/assets/{SettingsAccount.DeFul3eQ.0.0.50-internal.0.css → SettingsAccount.DeFul3eQ.0.0.50-internal.2.css} +0 -0
  352. /package/dist/interface/assets/{SettingsBackup.CX0rT0QJ.0.0.50-internal.0.css → SettingsBackup.CX0rT0QJ.0.0.50-internal.2.css} +0 -0
  353. /package/dist/interface/assets/{highlight.Ch2EwETz.0.0.50-internal.0.css → highlight.Ch2EwETz.0.0.50-internal.2.css} +0 -0
  354. /package/dist/interface/assets/{logo-256.BCQk9H1-.0.0.50-internal.0.png → logo-256.BCQk9H1-.0.0.50-internal.2.png} +0 -0
  355. /package/dist/interface/assets/{logo-512.DLKVOU2S.0.0.50-internal.0.png → logo-512.DLKVOU2S.0.0.50-internal.2.png} +0 -0
  356. /package/dist/interface/assets/{logo.DmEiRk0z.0.0.50-internal.0.png → logo.DmEiRk0z.0.0.50-internal.2.png} +0 -0
  357. /package/dist/interface/assets/{main.Cip9LkS3.0.0.50-internal.0.css → main.Cip9LkS3.0.0.50-internal.2.css} +0 -0
  358. /package/dist/interface/assets/{mode-json.Br7xisR1.0.0.50-internal.0.js → mode-json.Br7xisR1.0.0.50-internal.2.js} +0 -0
  359. /package/dist/interface/assets/{mode-yaml.CIYL8U3d.0.0.50-internal.0.js → mode-yaml.CIYL8U3d.0.0.50-internal.2.js} +0 -0
  360. /package/dist/interface/assets/{worker-base.jEXLGV2h.0.0.50-internal.0.js → worker-base.jEXLGV2h.0.0.50-internal.2.js} +0 -0
  361. /package/dist/interface/assets/{worker-json.DgwNIOck.0.0.50-internal.0.js → worker-json.DgwNIOck.0.0.50-internal.2.js} +0 -0
  362. /package/dist/interface/assets/{worker-yaml.B3uUYINB.0.0.50-internal.0.js → worker-yaml.B3uUYINB.0.0.50-internal.2.js} +0 -0
  363. /package/dist/interface/js/{@babel.l0sNRNKZ.0.0.50-internal.0.js → @babel.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  364. /package/dist/interface/js/{@intlify.BkGPX90O.0.0.50-internal.0.js → @intlify.BkGPX90O.0.0.50-internal.2.js} +0 -0
  365. /package/dist/interface/js/{@kurkle.D8fDXNIl.0.0.50-internal.0.js → @kurkle.D8fDXNIl.0.0.50-internal.2.js} +0 -0
  366. /package/dist/interface/js/{@primeuix.BFAY2Bk9.0.0.50-internal.0.js → @primeuix.BFAY2Bk9.0.0.50-internal.2.js} +0 -0
  367. /package/dist/interface/js/{@react-dnd.CcwRs9xb.0.0.50-internal.0.js → @react-dnd.CcwRs9xb.0.0.50-internal.2.js} +0 -0
  368. /package/dist/interface/js/{@socket.io.Dkula2eQ.0.0.50-internal.0.js → @socket.io.Dkula2eQ.0.0.50-internal.2.js} +0 -0
  369. /package/dist/interface/js/{@vue.B5vqhCp2.0.0.50-internal.0.js → @vue.B5vqhCp2.0.0.50-internal.2.js} +0 -0
  370. /package/dist/interface/js/{@xterm.CAa7rpjv.0.0.50-internal.0.js → @xterm.C-5Lxnx_.0.0.50-internal.2.js} +0 -0
  371. /package/dist/interface/js/{axios.DHr9lByg.0.0.50-internal.0.js → axios.DHr9lByg.0.0.50-internal.2.js} +0 -0
  372. /package/dist/interface/js/{birpc.l0sNRNKZ.0.0.50-internal.0.js → birpc.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  373. /package/dist/interface/js/{compare-versions.DqEOhma6.0.0.50-internal.0.js → compare-versions.DqEOhma6.0.0.50-internal.2.js} +0 -0
  374. /package/dist/interface/js/{dijkstrajs.C00ieaqj.0.0.50-internal.0.js → dijkstrajs.C00ieaqj.0.0.50-internal.2.js} +0 -0
  375. /package/dist/interface/js/{engine.io-parser.BiEtp6m2.0.0.50-internal.0.js → engine.io-parser.BiEtp6m2.0.0.50-internal.2.js} +0 -0
  376. /package/dist/interface/js/{entities.C20TfXL6.0.0.50-internal.0.js → entities.C20TfXL6.0.0.50-internal.2.js} +0 -0
  377. /package/dist/interface/js/{ev-emitter.X5f1qa-c.0.0.50-internal.0.js → ev-emitter.X5f1qa-c.0.0.50-internal.2.js} +0 -0
  378. /package/dist/interface/js/{get-size.D1dS-IaP.0.0.50-internal.0.js → get-size.D1dS-IaP.0.0.50-internal.2.js} +0 -0
  379. /package/dist/interface/js/{hookable.l0sNRNKZ.0.0.50-internal.0.js → hookable.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  380. /package/dist/interface/js/{mdurl.k9Sl0PQj.0.0.50-internal.0.js → mdurl.k9Sl0PQj.0.0.50-internal.2.js} +0 -0
  381. /package/dist/interface/js/{perfect-debounce.l0sNRNKZ.0.0.50-internal.0.js → perfect-debounce.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  382. /package/dist/interface/js/{primelocale.Bga3dOQu.0.0.50-internal.0.js → primelocale.Bga3dOQu.0.0.50-internal.2.js} +0 -0
  383. /package/dist/interface/js/{punycode.js.Dj65hjkv.0.0.50-internal.0.js → punycode.js.Dj65hjkv.0.0.50-internal.2.js} +0 -0
  384. /package/dist/interface/js/{react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.0.js → react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.2.js} +0 -0
  385. /package/dist/interface/js/{redux.BFxtlG_c.0.0.50-internal.0.js → redux.BFxtlG_c.0.0.50-internal.2.js} +0 -0
  386. /package/dist/interface/js/{tslib.9k7AwCpt.0.0.50-internal.0.js → tslib.9k7AwCpt.0.0.50-internal.2.js} +0 -0
  387. /package/dist/interface/js/{uc.micro.kMc2yuuw.0.0.50-internal.0.js → uc.micro.kMc2yuuw.0.0.50-internal.2.js} +0 -0
  388. /package/dist/interface/js/{uuid.C6aID195.0.0.50-internal.0.js → uuid.C6aID195.0.0.50-internal.2.js} +0 -0
  389. /package/dist/interface/js/{vue.l0sNRNKZ.0.0.50-internal.0.js → vue.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  390. /package/dist/interface/js/{zod.SKKegNRO.0.0.50-internal.0.js → zod.SKKegNRO.0.0.50-internal.2.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
- }