camera.ui3 0.0.30-alpha.0 → 0.0.30-alpha.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 (320) hide show
  1. package/dist/interface/@camera.ui.KA9bRSoR.0.0.30-alpha.0.js +3 -0
  2. package/dist/interface/@tanstack.CTzdjGxD.0.0.30-alpha.0.js +1 -0
  3. package/dist/interface/{@vee-validate.0Cv0x9aN.0.0.30-alpha.0.js → @vee-validate.BJKTyKHK.0.0.30-alpha.0.js} +1 -1
  4. package/dist/interface/@vue.BeJw0wEm.0.0.30-alpha.0.js +17 -0
  5. package/dist/interface/{@vueform.Du_niMHk.0.0.30-alpha.0.js → @vueform.DIw88mcs.0.0.30-alpha.0.js} +1 -1
  6. package/dist/interface/{@vueuse.Dv9U068T.0.0.30-alpha.0.js → @vueuse.DK7Mz0BT.0.0.30-alpha.0.js} +1 -1
  7. package/dist/interface/Account.D23CSQgK.0.0.30-alpha.0.js +1 -0
  8. package/dist/interface/Adminpanel.CbDtQWxn.0.0.30-alpha.0.js +2 -0
  9. package/dist/interface/Appearance.az1S-8rV.0.0.30-alpha.0.js +1 -0
  10. package/dist/interface/Backup.BxjbY7JO.0.0.30-alpha.0.js +1 -0
  11. package/dist/interface/Camera.CWxxie6C.0.0.30-alpha.0.js +1 -0
  12. package/dist/interface/Cameras.Cs1dXd-W.0.0.30-alpha.0.js +1 -0
  13. package/dist/interface/Camview.uyIq-pxm.0.0.30-alpha.0.js +1 -0
  14. package/dist/interface/Config.DnuL5NIv.0.0.30-alpha.0.js +1 -0
  15. package/dist/interface/Console.C1dI5f9x.0.0.30-alpha.0.js +4 -0
  16. package/dist/interface/FirstSteps.C_TTm4lX.0.0.30-alpha.0.js +1 -0
  17. package/dist/interface/{NewCamera.Kn9biZIb.0.0.30-alpha.0.js → NewCamera.DjMFd-OB.0.0.30-alpha.0.js} +2 -2
  18. package/dist/interface/Plugin.rLO6u13g.0.0.30-alpha.0.js +1 -0
  19. package/dist/interface/Plugins.Dr-sUa9o.0.0.30-alpha.0.js +1 -0
  20. package/dist/interface/Recordings.4iG-hK8g.0.0.30-alpha.0.js +1 -0
  21. package/dist/interface/Recordings.Dxh2d-IQ.0.0.30-alpha.0.js +1 -0
  22. package/dist/interface/Settings.DAletWZO.0.0.30-alpha.0.js +1 -0
  23. package/dist/interface/System.Pv01yz8u.0.0.30-alpha.0.js +4 -0
  24. package/dist/interface/User.VLcbTFm_.0.0.30-alpha.0.js +1 -0
  25. package/dist/interface/{VConfigEditor.vue_vue_type_script_setup_true_lang.Br68bfQJ.0.0.30-alpha.0.js → VConfigEditor.vue_vue_type_script_setup_true_lang.pXHIBxVl.0.0.30-alpha.0.js} +1 -1
  26. package/dist/interface/{VConsole.BT0UxZb1.0.0.30-alpha.0.js → VConsole.BUZLhyeb.0.0.30-alpha.0.js} +1 -1
  27. package/dist/interface/VPlayer.DW5rNren.0.0.30-alpha.0.js +1 -0
  28. package/dist/interface/{VPluginCard.Bz3GmzAE.0.0.30-alpha.0.js → VPluginCard.D5f85QIk.0.0.30-alpha.0.js} +2 -2
  29. package/dist/interface/index.html +15 -14
  30. package/dist/interface/main.CNzh1Rg5.0.0.30-alpha.0.js +2 -0
  31. package/dist/interface/{pinia.DRjp4GU7.0.0.30-alpha.0.js → pinia.BPnxDxQ3.0.0.30-alpha.0.js} +2 -2
  32. package/dist/interface/{plugins.Ur_7V4x8.0.0.30-alpha.0.js → plugins.DIEspWyc.0.0.30-alpha.0.js} +1 -1
  33. package/dist/interface/sw.js +1 -1
  34. package/dist/interface/{system.CRn9Cy3C.0.0.30-alpha.0.js → system.23ZKsQ9W.0.0.30-alpha.0.js} +1 -1
  35. package/dist/interface/{ui.C-XbEPHk.0.0.30-alpha.0.js → ui.9t-Av5-L.0.0.30-alpha.0.js} +1 -1
  36. package/dist/interface/{v-calendar.CapJoEkJ.0.0.30-alpha.0.js → v-calendar.u5cKUC4g.0.0.30-alpha.0.js} +1 -1
  37. package/dist/interface/{vee-validate.DcgOEpak.0.0.30-alpha.0.js → vee-validate.DLoDjJ2f.0.0.30-alpha.0.js} +2 -2
  38. package/dist/interface/{vue-i18n.D2pqkMP3.0.0.30-alpha.0.js → vue-i18n.1W5jhc7l.0.0.30-alpha.0.js} +2 -2
  39. package/dist/interface/{vue-inline-svg.DorOTPIf.0.0.30-alpha.0.js → vue-inline-svg.Cc6uL4nI.0.0.30-alpha.0.js} +1 -1
  40. package/dist/interface/{vue-router.BVs4qaVs.0.0.30-alpha.0.js → vue-router.CgUDt9kL.0.0.30-alpha.0.js} +2 -2
  41. package/dist/interface/{vue3-apexcharts.CBV9x5vk.0.0.30-alpha.0.js → vue3-apexcharts.D8ONfVUq.0.0.30-alpha.0.js} +1 -1
  42. package/dist/interface/{vue3-dnd.CXMddGIZ.0.0.30-alpha.0.js → vue3-dnd.V9l5pvP2.0.0.30-alpha.0.js} +1 -1
  43. package/dist/interface/{vue3-toastify.DE7YmDSX.0.0.30-alpha.0.js → vue3-toastify.CjNgo6aC.0.0.30-alpha.0.js} +1 -1
  44. package/dist/interface/{vuetify.CYxxHEVN.0.0.30-alpha.0.js → vuetify.Box3fVLm.0.0.30-alpha.0.js} +1 -1
  45. package/dist/interface/zod.DnW1_kUe.0.0.30-alpha.0.js +1 -0
  46. package/dist/server/bin/cameraui.js +10 -7
  47. package/dist/server/bin/cameraui.js.map +1 -1
  48. package/dist/server/bin/fork.js +2 -2
  49. package/dist/server/bin/fork.js.map +1 -1
  50. package/dist/server/bin/installer/darwin.js +1 -1
  51. package/dist/server/bin/installer/darwin.js.map +1 -1
  52. package/dist/server/bin/installer/linux.js +1 -1
  53. package/dist/server/bin/installer/linux.js.map +1 -1
  54. package/dist/server/package.json +11 -15
  55. package/dist/server/src/api/controllers/backup.controller.js.map +1 -1
  56. package/dist/server/src/api/controllers/cameras.controller.js +1 -1
  57. package/dist/server/src/api/controllers/cameras.controller.js.map +1 -1
  58. package/dist/server/src/api/controllers/frameWorkers.controller.js +1 -1
  59. package/dist/server/src/api/controllers/frameWorkers.controller.js.map +1 -1
  60. package/dist/server/src/api/controllers/plugins.controller.js +1 -2
  61. package/dist/server/src/api/controllers/plugins.controller.js.map +1 -1
  62. package/dist/server/src/api/controllers/system.controller.js +1 -3
  63. package/dist/server/src/api/controllers/system.controller.js.map +1 -1
  64. package/dist/server/src/api/controllers/users.controller.js +2 -2
  65. package/dist/server/src/api/controllers/users.controller.js.map +1 -1
  66. package/dist/server/src/api/database/constants.d.ts +8 -0
  67. package/dist/server/src/api/database/constants.js +9 -0
  68. package/dist/server/src/api/database/constants.js.map +1 -0
  69. package/dist/server/src/api/database/index.d.ts +0 -8
  70. package/dist/server/src/api/database/index.js +14 -21
  71. package/dist/server/src/api/database/index.js.map +1 -1
  72. package/dist/server/src/api/database/migration.js +5 -4
  73. package/dist/server/src/api/database/migration.js.map +1 -1
  74. package/dist/server/src/api/database/types.d.ts +6 -6
  75. package/dist/server/src/api/go2rtc/api/application.js +1 -1
  76. package/dist/server/src/api/go2rtc/api/application.js.map +1 -1
  77. package/dist/server/src/api/index.js.map +1 -1
  78. package/dist/server/src/api/plugins/logger.plugin.js.map +1 -1
  79. package/dist/server/src/api/schemas/cameras.schema.d.ts +71 -71
  80. package/dist/server/src/api/schemas/config.schema.d.ts +6 -6
  81. package/dist/server/src/api/schemas/go2rtc.schema.d.ts +98 -98
  82. package/dist/server/src/api/schemas/users.schema.d.ts +116 -116
  83. package/dist/server/src/api/services/auth.service.js +1 -1
  84. package/dist/server/src/api/services/auth.service.js.map +1 -1
  85. package/dist/server/src/api/services/backup.service.js.map +1 -1
  86. package/dist/server/src/api/services/cameras.service.js +1 -1
  87. package/dist/server/src/api/services/cameras.service.js.map +1 -1
  88. package/dist/server/src/api/services/system.service.js +1 -1
  89. package/dist/server/src/api/services/system.service.js.map +1 -1
  90. package/dist/server/src/api/services/users.service.js +1 -1
  91. package/dist/server/src/api/services/users.service.js.map +1 -1
  92. package/dist/server/src/api/types/index.d.ts +2 -2
  93. package/dist/server/src/api/types/index.js.map +1 -1
  94. package/dist/server/src/api/utils/cert.js.map +1 -1
  95. package/dist/server/src/api/websocket/index.js.map +1 -1
  96. package/dist/server/src/api/websocket/nsp/notifications.js.map +1 -1
  97. package/dist/server/src/api/websocket/nsp/server.js +1 -1
  98. package/dist/server/src/api/websocket/nsp/server.js.map +1 -1
  99. package/dist/server/src/api.d.ts +1 -7
  100. package/dist/server/src/api.js.map +1 -1
  101. package/dist/server/src/camera/controller.d.ts +4 -6
  102. package/dist/server/src/camera/controller.js +5 -8
  103. package/dist/server/src/camera/controller.js.map +1 -1
  104. package/dist/server/src/camera/types.d.ts +140 -13
  105. package/dist/server/src/camera/types.js.map +1 -1
  106. package/dist/server/src/decoder/index.js.map +1 -1
  107. package/dist/server/src/decoder/types.d.ts +1 -18
  108. package/dist/server/src/decoder/worker.d.ts +3 -2
  109. package/dist/server/src/decoder/worker.js +10 -22
  110. package/dist/server/src/decoder/worker.js.map +1 -1
  111. package/dist/server/src/go2rtc/index.js +2 -3
  112. package/dist/server/src/go2rtc/index.js.map +1 -1
  113. package/dist/server/src/main.js +3 -3
  114. package/dist/server/src/main.js.map +1 -1
  115. package/dist/server/src/nats/index.d.ts +3 -4
  116. package/dist/server/src/nats/index.js +1 -3
  117. package/dist/server/src/nats/index.js.map +1 -1
  118. package/dist/server/src/nats/proxy/cameraDevice.d.ts +2 -2
  119. package/dist/server/src/nats/proxy/coreManager.d.ts +4 -2
  120. package/dist/server/src/nats/proxy/coreManager.js +7 -0
  121. package/dist/server/src/nats/proxy/coreManager.js.map +1 -1
  122. package/dist/server/src/nats/proxy/deviceManager.d.ts +5 -5
  123. package/dist/server/src/nats/proxy/deviceManager.js +4 -2
  124. package/dist/server/src/nats/proxy/deviceManager.js.map +1 -1
  125. package/dist/server/src/nats/server.js +2 -3
  126. package/dist/server/src/nats/server.js.map +1 -1
  127. package/dist/server/src/nats/types.d.ts +19 -32
  128. package/dist/server/src/nats/utils.d.ts +1 -1
  129. package/dist/server/src/nats/websocket.js.map +1 -1
  130. package/dist/server/src/plugins/index.js +11 -9
  131. package/dist/server/src/plugins/index.js.map +1 -1
  132. package/dist/server/src/plugins/interfaces/base.d.ts +1 -1
  133. package/dist/server/src/plugins/plugin.d.ts +1 -1
  134. package/dist/server/src/plugins/plugin.js +4 -4
  135. package/dist/server/src/plugins/plugin.js.map +1 -1
  136. package/dist/server/src/plugins/types.d.ts +36 -3
  137. package/dist/server/src/plugins/types.js.map +1 -1
  138. package/dist/server/src/plugins/worker.js +7 -16
  139. package/dist/server/src/plugins/worker.js.map +1 -1
  140. package/dist/server/src/services/config/constants.js +2 -2
  141. package/dist/server/src/services/config/constants.js.map +1 -1
  142. package/dist/server/src/services/config/index.d.ts +2 -0
  143. package/dist/server/src/services/config/index.js +10 -2
  144. package/dist/server/src/services/config/index.js.map +1 -1
  145. package/dist/server/src/services/logger/index.d.ts +4 -16
  146. package/dist/server/src/services/logger/index.js +4 -83
  147. package/dist/server/src/services/logger/index.js.map +1 -1
  148. package/dist/server/src/services/logger/types.d.ts +8 -0
  149. package/dist/server/src/services/logger/types.js +2 -0
  150. package/dist/server/src/services/logger/types.js.map +1 -0
  151. package/localdeps.txt +4 -0
  152. package/package.json +11 -15
  153. package/dist/interface/@tanstack.DYQ7Jj8U.0.0.30-alpha.0.js +0 -1
  154. package/dist/interface/@vue.CvjRlaU6.0.0.30-alpha.0.js +0 -17
  155. package/dist/interface/Account.Dm2FouAU.0.0.30-alpha.0.js +0 -1
  156. package/dist/interface/Adminpanel.B2Aiobnt.0.0.30-alpha.0.js +0 -2
  157. package/dist/interface/Appearance.EfH0tMdM.0.0.30-alpha.0.js +0 -1
  158. package/dist/interface/Backup.D8SRclhB.0.0.30-alpha.0.js +0 -1
  159. package/dist/interface/Camera.D-cOf4sS.0.0.30-alpha.0.js +0 -1
  160. package/dist/interface/Cameras.oolxbmXU.0.0.30-alpha.0.js +0 -1
  161. package/dist/interface/Camview.BHw8Pe3v.0.0.30-alpha.0.js +0 -1
  162. package/dist/interface/Config.DmPTI5iz.0.0.30-alpha.0.js +0 -1
  163. package/dist/interface/Console.Dq4khHFF.0.0.30-alpha.0.js +0 -4
  164. package/dist/interface/FirstSteps.Bo467abx.0.0.30-alpha.0.js +0 -1
  165. package/dist/interface/Plugin.BLTVcTt1.0.0.30-alpha.0.js +0 -1
  166. package/dist/interface/Plugins.Cp8mK__o.0.0.30-alpha.0.js +0 -1
  167. package/dist/interface/Recordings.B_JIFk_G.0.0.30-alpha.0.js +0 -1
  168. package/dist/interface/Recordings.gMbvwmk_.0.0.30-alpha.0.js +0 -1
  169. package/dist/interface/Settings.EhHJjGrl.0.0.30-alpha.0.js +0 -1
  170. package/dist/interface/System.VodoK0U6.0.0.30-alpha.0.js +0 -4
  171. package/dist/interface/User.DpcN7DEC.0.0.30-alpha.0.js +0 -1
  172. package/dist/interface/VPlayer.DYua3Eh_.0.0.30-alpha.0.js +0 -1
  173. package/dist/interface/main.19pRAqPU.0.0.30-alpha.0.js +0 -4
  174. package/dist/interface/zod.BaF2dDCd.0.0.30-alpha.0.js +0 -1
  175. package/dist/server/src/camera/device.d.ts +0 -29
  176. package/dist/server/src/camera/device.js +0 -20
  177. package/dist/server/src/camera/device.js.map +0 -1
  178. package/dist/server/src/camera/index.d.ts +0 -90
  179. package/dist/server/src/camera/index.js +0 -581
  180. package/dist/server/src/camera/index.js.map +0 -1
  181. package/dist/server/src/camera/interfaces/camera.d.ts +0 -10
  182. package/dist/server/src/camera/interfaces/camera.js +0 -23
  183. package/dist/server/src/camera/interfaces/camera.js.map +0 -1
  184. package/dist/server/src/camera/interfaces/prebuffer.d.ts +0 -11
  185. package/dist/server/src/camera/interfaces/prebuffer.js +0 -31
  186. package/dist/server/src/camera/interfaces/prebuffer.js.map +0 -1
  187. package/dist/server/src/camera/interfaces/ptz.d.ts +0 -13
  188. package/dist/server/src/camera/interfaces/ptz.js +0 -47
  189. package/dist/server/src/camera/interfaces/ptz.js.map +0 -1
  190. package/dist/server/src/camera/iou.d.ts +0 -2
  191. package/dist/server/src/camera/iou.js +0 -53
  192. package/dist/server/src/camera/iou.js.map +0 -1
  193. package/dist/server/src/camera/polygon.d.ts +0 -6
  194. package/dist/server/src/camera/polygon.js +0 -151
  195. package/dist/server/src/camera/polygon.js.map +0 -1
  196. package/dist/server/src/camera/streaming/peer-connection.d.ts +0 -55
  197. package/dist/server/src/camera/streaming/peer-connection.js +0 -203
  198. package/dist/server/src/camera/streaming/peer-connection.js.map +0 -1
  199. package/dist/server/src/camera/streaming/webrtc-connection.d.ts +0 -35
  200. package/dist/server/src/camera/streaming/webrtc-connection.js +0 -170
  201. package/dist/server/src/camera/streaming/webrtc-connection.js.map +0 -1
  202. package/dist/server/src/camera/streaming/werift-session.d.ts +0 -41
  203. package/dist/server/src/camera/streaming/werift-session.js +0 -179
  204. package/dist/server/src/camera/streaming/werift-session.js.map +0 -1
  205. package/dist/server/src/camera/videoFrame.d.ts +0 -24
  206. package/dist/server/src/camera/videoFrame.js +0 -104
  207. package/dist/server/src/camera/videoFrame.js.map +0 -1
  208. package/dist/server/src/index.d.ts +0 -18
  209. package/dist/server/src/index.js +0 -5
  210. package/dist/server/src/index.js.map +0 -1
  211. package/dist/server/src/nats/connection.d.ts +0 -17
  212. package/dist/server/src/nats/connection.js +0 -66
  213. package/dist/server/src/nats/connection.js.map +0 -1
  214. package/dist/server/src/nats/constants.d.ts +0 -1
  215. package/dist/server/src/nats/constants.js +0 -2
  216. package/dist/server/src/nats/constants.js.map +0 -1
  217. package/dist/server/src/nats/error.d.ts +0 -9
  218. package/dist/server/src/nats/error.js +0 -11
  219. package/dist/server/src/nats/error.js.map +0 -1
  220. package/dist/server/src/nats/messageQueue.d.ts +0 -20
  221. package/dist/server/src/nats/messageQueue.js +0 -132
  222. package/dist/server/src/nats/messageQueue.js.map +0 -1
  223. package/dist/server/src/nats/subscription.d.ts +0 -12
  224. package/dist/server/src/nats/subscription.js +0 -21
  225. package/dist/server/src/nats/subscription.js.map +0 -1
  226. package/dist/server/src/polyglot/node/decoder/child.d.ts +0 -1
  227. package/dist/server/src/polyglot/node/decoder/child.js +0 -644
  228. package/dist/server/src/polyglot/node/decoder/child.js.map +0 -1
  229. package/dist/server/src/polyglot/node/decoder/imageUtils.d.ts +0 -24
  230. package/dist/server/src/polyglot/node/decoder/imageUtils.js +0 -205
  231. package/dist/server/src/polyglot/node/decoder/imageUtils.js.map +0 -1
  232. package/dist/server/src/polyglot/node/decoder/wasm/build/decoder.d.ts +0 -144
  233. package/dist/server/src/polyglot/node/decoder/wasm/build/decoder.js +0 -65
  234. package/dist/server/src/polyglot/node/decoder/wasm/build/decoder.wasm +0 -0
  235. package/dist/server/src/polyglot/node/decoder/wasm/test/imageUtils.py +0 -106
  236. package/dist/server/src/polyglot/node/plugins/cameraStorage.d.ts +0 -107
  237. package/dist/server/src/polyglot/node/plugins/cameraStorage.js +0 -292
  238. package/dist/server/src/polyglot/node/plugins/cameraStorage.js.map +0 -1
  239. package/dist/server/src/polyglot/node/plugins/child.d.ts +0 -28
  240. package/dist/server/src/polyglot/node/plugins/child.js +0 -222
  241. package/dist/server/src/polyglot/node/plugins/child.js.map +0 -1
  242. package/dist/server/src/polyglot/node/plugins/configService.d.ts +0 -104
  243. package/dist/server/src/polyglot/node/plugins/configService.js +0 -213
  244. package/dist/server/src/polyglot/node/plugins/configService.js.map +0 -1
  245. package/dist/server/src/polyglot/node/plugins/pluginApi.d.ts +0 -35
  246. package/dist/server/src/polyglot/node/plugins/pluginApi.js +0 -23
  247. package/dist/server/src/polyglot/node/plugins/pluginApi.js.map +0 -1
  248. package/dist/server/src/polyglot/node/plugins/pluginLogger.d.ts +0 -18
  249. package/dist/server/src/polyglot/node/plugins/pluginLogger.js +0 -89
  250. package/dist/server/src/polyglot/node/plugins/pluginLogger.js.map +0 -1
  251. package/dist/server/src/polyglot/node/plugins/proxy/cameraDevice.d.ts +0 -69
  252. package/dist/server/src/polyglot/node/plugins/proxy/cameraDevice.js +0 -423
  253. package/dist/server/src/polyglot/node/plugins/proxy/cameraDevice.js.map +0 -1
  254. package/dist/server/src/polyglot/node/plugins/proxy/coreManager.d.ts +0 -40
  255. package/dist/server/src/polyglot/node/plugins/proxy/coreManager.js +0 -105
  256. package/dist/server/src/polyglot/node/plugins/proxy/coreManager.js.map +0 -1
  257. package/dist/server/src/polyglot/node/plugins/proxy/deviceManager.d.ts +0 -47
  258. package/dist/server/src/polyglot/node/plugins/proxy/deviceManager.js +0 -164
  259. package/dist/server/src/polyglot/node/plugins/proxy/deviceManager.js.map +0 -1
  260. package/dist/server/src/polyglot/node/plugins/schema.d.ts +0 -293
  261. package/dist/server/src/polyglot/node/plugins/schema.js +0 -740
  262. package/dist/server/src/polyglot/node/plugins/schema.js.map +0 -1
  263. package/dist/server/src/polyglot/node/plugins/storageController.d.ts +0 -30
  264. package/dist/server/src/polyglot/node/plugins/storageController.js +0 -40
  265. package/dist/server/src/polyglot/node/plugins/storageController.js.map +0 -1
  266. package/dist/server/src/polyglot/python/camera/interfaces/camera.py +0 -20
  267. package/dist/server/src/polyglot/python/camera/interfaces/prebuffer.py +0 -28
  268. package/dist/server/src/polyglot/python/camera/interfaces/ptz.py +0 -38
  269. package/dist/server/src/polyglot/python/camera/iou.py +0 -80
  270. package/dist/server/src/polyglot/python/camera/polygon.py +0 -173
  271. package/dist/server/src/polyglot/python/camera/video_frame.py +0 -188
  272. package/dist/server/src/polyglot/python/camera_ui_types/__init__.py +0 -1200
  273. package/dist/server/src/polyglot/python/decoder/child.py +0 -882
  274. package/dist/server/src/polyglot/python/decoder/image_utils.py +0 -149
  275. package/dist/server/src/polyglot/python/decoder/typings.py +0 -99
  276. package/dist/server/src/polyglot/python/plugins/camera_storage.py +0 -391
  277. package/dist/server/src/polyglot/python/plugins/child.py +0 -394
  278. package/dist/server/src/polyglot/python/plugins/config_service.py +0 -187
  279. package/dist/server/src/polyglot/python/plugins/constants.py +0 -1
  280. package/dist/server/src/polyglot/python/plugins/message_queue.py +0 -182
  281. package/dist/server/src/polyglot/python/plugins/plugin_api.py +0 -34
  282. package/dist/server/src/polyglot/python/plugins/plugin_logger.py +0 -111
  283. package/dist/server/src/polyglot/python/plugins/proxy/camera_device.py +0 -1599
  284. package/dist/server/src/polyglot/python/plugins/proxy/core_manager.py +0 -145
  285. package/dist/server/src/polyglot/python/plugins/proxy/device_manager.py +0 -226
  286. package/dist/server/src/polyglot/python/plugins/schema.py +0 -181
  287. package/dist/server/src/polyglot/python/plugins/storage_controller.py +0 -58
  288. package/dist/server/src/polyglot/python/plugins/typings.py +0 -253
  289. package/dist/server/src/polyglot/python/utilities/connection.py +0 -86
  290. package/dist/server/src/polyglot/python/utilities/json_lmdb.py +0 -19
  291. package/dist/server/src/polyglot/python/utilities/object_path.py +0 -195
  292. package/dist/server/src/polyglot/python/utilities/packer.py +0 -11
  293. package/dist/server/src/polyglot/python/utilities/subscriptions.py +0 -22
  294. package/dist/server/src/polyglot/python/utilities/task.py +0 -35
  295. package/dist/server/src/polyglot/python/utilities/thread.py +0 -10
  296. package/dist/server/src/polyglot/python/utilities/utils.py +0 -73
  297. package/dist/server/src/utils/ffmpeg.d.ts +0 -2
  298. package/dist/server/src/utils/ffmpeg.js +0 -61
  299. package/dist/server/src/utils/ffmpeg.js.map +0 -1
  300. package/dist/server/src/utils/network.d.ts +0 -12
  301. package/dist/server/src/utils/network.js +0 -92
  302. package/dist/server/src/utils/network.js.map +0 -1
  303. package/dist/server/src/utils/npm.d.ts +0 -4
  304. package/dist/server/src/utils/npm.js +0 -128
  305. package/dist/server/src/utils/npm.js.map +0 -1
  306. package/dist/server/src/utils/packer.d.ts +0 -2
  307. package/dist/server/src/utils/packer.js +0 -17
  308. package/dist/server/src/utils/packer.js.map +0 -1
  309. package/dist/server/src/utils/pythonInstaller.d.ts +0 -48
  310. package/dist/server/src/utils/pythonInstaller.js +0 -494
  311. package/dist/server/src/utils/pythonInstaller.js.map +0 -1
  312. package/dist/server/src/utils/reader.d.ts +0 -5
  313. package/dist/server/src/utils/reader.js +0 -41
  314. package/dist/server/src/utils/reader.js.map +0 -1
  315. package/dist/server/src/utils/subscribed.d.ts +0 -9
  316. package/dist/server/src/utils/subscribed.js +0 -17
  317. package/dist/server/src/utils/subscribed.js.map +0 -1
  318. package/dist/server/src/utils/utils.d.ts +0 -10
  319. package/dist/server/src/utils/utils.js +0 -165
  320. package/dist/server/src/utils/utils.js.map +0 -1
@@ -1,145 +0,0 @@
1
- from contextlib import suppress
2
- from datetime import datetime
3
- from typing import Any, Optional
4
- from uuid import uuid4
5
-
6
- from camera_ui_types import IceServer
7
- from decoder.typings import AuthConfig
8
- from message_queue import MessageQueue
9
- from nats.aio.msg import Msg
10
- from plugin_api import PluginAPI
11
- from plugin_logger import PluginLogger
12
- from pyeecui.asyncio import AsyncIOEventEmitter
13
- from typings import PluginInfo, ProxyMessageStructure
14
- from utilities.connection import ProxyConnection
15
- from utilities.packer import unpack
16
- from utilities.subscriptions import ProxySubscription
17
- from utilities.task import TaskSet
18
-
19
-
20
- class CoreManager(AsyncIOEventEmitter):
21
- def __init__(
22
- self,
23
- api: PluginAPI,
24
- logger: PluginLogger,
25
- plugin: PluginInfo,
26
- proxy_endpoints: list[str],
27
- auth: AuthConfig,
28
- ):
29
- super().__init__()
30
-
31
- self.initialized = False
32
-
33
- self.api = api
34
- self.logger = logger
35
-
36
- self.auth = auth
37
- self.proxy_endpoints = proxy_endpoints
38
- self.plugin = plugin
39
-
40
- self.subject = f"{self.plugin['id']}.coreManager"
41
- self.cm_subject = "coreManager.subscriber"
42
-
43
- self.publisher: Optional[ProxyConnection] = None
44
- self.cm_publisher: Optional[ProxyConnection] = None
45
-
46
- self.subscriber: Optional[ProxySubscription] = None
47
- self.cm_subscriber: Optional[ProxySubscription] = None
48
-
49
- self.tasks: TaskSet = TaskSet(f"{self.plugin['name']} CoreManager")
50
- self.message_queue: Optional[MessageQueue] = None
51
-
52
- # print("CoreManager", self.plugin["name"], self.dealer_id, self.subscriber_ids)
53
-
54
- self.api.once("shutdown", self.__close)
55
-
56
- async def init(self):
57
- if self.initialized:
58
- return
59
-
60
- self.initialized = True
61
-
62
- servers = [endpoint for endpoint in self.proxy_endpoints if endpoint.startswith("nats://")]
63
-
64
- self.publisher = ProxyConnection(self.subject, servers, self.auth)
65
- await self.publisher.connect()
66
-
67
- self.cm_publisher = ProxyConnection(self.cm_subject, servers, self.auth)
68
- await self.cm_publisher.connect()
69
-
70
- self.subscriber = await self.publisher.subscribe(subject=self.subject)
71
- self.message_queue = MessageQueue(
72
- self.logger,
73
- self.publisher,
74
- self.subscriber,
75
- self.__request_handler,
76
- )
77
-
78
- self.cm_subscriber = await self.cm_publisher.subscribe(subject=self.cm_subject)
79
- self.cm_subscriber.on("message", self.__on_proxy_message)
80
-
81
- async def get_ffmpeg_path(self) -> str:
82
- return await self.__on_request("getFFmpegPath")
83
-
84
- async def get_ice_servers(self) -> list[IceServer]:
85
- return await self.__on_request("getIceServers")
86
-
87
- async def get_server_addresses(self) -> list[str]:
88
- return await self.__on_request("getServerAddresses")
89
-
90
- def emit(self, event: str, *args: Any, **kwargs: Any) -> Any:
91
- pass
92
-
93
- async def __request_handler(self, message: ProxyMessageStructure):
94
- pass
95
-
96
- async def __emit_event(self, msg: Msg) -> None:
97
- message = unpack(msg.data)
98
-
99
- type = message.get("type")
100
- data = message.get("data", {})
101
- system = data.get("system", {})
102
-
103
- if type == "systemUpdated":
104
- super().emit(type, system)
105
-
106
- async def __on_proxy_message(self, msg: Msg) -> None:
107
- if not self.initialized:
108
- return
109
-
110
- self.tasks.add(self.__emit_event(msg))
111
-
112
- async def __on_request(self, fn: str, args: list[Any] = []) -> Any:
113
- if not self.message_queue:
114
- raise Exception("Message queue is not initialized")
115
-
116
- message: ProxyMessageStructure = {
117
- "requestId": str(uuid4()),
118
- "targetId": self.subject,
119
- "targetName": self.plugin["name"],
120
- "pluginId": self.plugin["id"],
121
- "type": "request",
122
- "proxy": "core",
123
- "client": "coreFn",
124
- "fn": fn,
125
- "args": args,
126
- "timestamp": int(datetime.now().timestamp() * 1000),
127
- "timeout": 5000,
128
- }
129
-
130
- return await self.message_queue.enqueue(message)
131
-
132
- async def __close(self) -> None:
133
- self.initialized = False
134
- self.remove_all_listeners()
135
- self.api.remove_listener("shutdown", self.__close)
136
-
137
- if self.message_queue:
138
- self.message_queue.abort_queue()
139
-
140
- with suppress(Exception):
141
- if self.publisher:
142
- await self.publisher.close()
143
-
144
- if self.cm_publisher:
145
- await self.cm_publisher.close()
@@ -1,226 +0,0 @@
1
- from contextlib import suppress
2
- from datetime import datetime
3
- from typing import Any, Optional, Union, cast
4
- from uuid import uuid4
5
-
6
- from camera_ui_types import Camera, CameraConfig
7
- from decoder.typings import AuthConfig
8
- from message_queue import MessageQueue
9
- from nats.aio.msg import Msg
10
- from plugin_api import PluginAPI
11
- from plugin_logger import PluginLogger
12
- from pyeecui.asyncio import AsyncIOEventEmitter
13
- from typings import PluginInfo, ProxyMessageStructure
14
- from utilities.connection import ProxyConnection
15
- from utilities.packer import unpack
16
- from utilities.subscriptions import ProxySubscription
17
- from utilities.task import TaskSet
18
-
19
- from .camera_device import CameraDeviceProxy
20
-
21
-
22
- class DeviceManager(AsyncIOEventEmitter):
23
- def __init__(
24
- self,
25
- api: PluginAPI,
26
- logger: PluginLogger,
27
- plugin: PluginInfo,
28
- proxy_endpoints: list[str],
29
- auth: AuthConfig,
30
- ):
31
- super().__init__()
32
-
33
- self.initialized = False
34
-
35
- self.devices: dict[str, CameraDeviceProxy] = {}
36
-
37
- self.api = api
38
- self.logger = logger
39
-
40
- self.auth = auth
41
- self.proxy_endpoints = proxy_endpoints
42
- self.plugin = plugin
43
-
44
- self.subject = f"{self.plugin['id']}.deviceManager"
45
- self.dm_subject = f"{self.plugin['id']}.deviceManager.subscriber"
46
-
47
- self.publisher: Optional[ProxyConnection] = None
48
- self.dm_publisher: Optional[ProxyConnection] = None
49
-
50
- self.subscriber: Optional[ProxySubscription] = None
51
- self.dm_subscriber: Optional[ProxySubscription] = None
52
-
53
- self.tasks: TaskSet = TaskSet(f"{self.plugin['name']} DeviceManager")
54
- self.message_queue: Optional[MessageQueue] = None
55
-
56
- # print("DeviceManager", self.plugin["name"], self.dealer_id, self.subscriber_ids)
57
-
58
- self.api.once("shutdown", self.__close)
59
-
60
- async def init(self):
61
- if self.initialized:
62
- return
63
-
64
- self.initialized = True
65
-
66
- servers = [endpoint for endpoint in self.proxy_endpoints if endpoint.startswith("nats://")]
67
-
68
- self.publisher = ProxyConnection(self.subject, servers, self.auth)
69
- await self.publisher.connect()
70
-
71
- self.dm_publisher = ProxyConnection(self.dm_subject, servers, self.auth)
72
- await self.dm_publisher.connect()
73
-
74
- self.subscriber = await self.publisher.subscribe(subject=self.subject)
75
- self.message_queue = MessageQueue(
76
- self.logger,
77
- self.publisher,
78
- self.subscriber,
79
- self.__request_handler,
80
- )
81
-
82
- self.dm_subscriber = await self.dm_publisher.subscribe(subject=self.dm_subject)
83
- self.dm_subscriber.on("message", self.__on_proxy_message)
84
-
85
- async def get_camera_by_id(self, id: str) -> Optional[CameraDeviceProxy]:
86
- camera_device = await self.__add_or_get_camera(id)
87
-
88
- if not camera_device:
89
- camera: Camera = await self.__on_request("getCameraById", [id])
90
-
91
- if camera:
92
- camera_device = await self.__add_or_get_camera(camera)
93
-
94
- return camera_device
95
-
96
- async def get_camera_by_name(self, name: str) -> Optional[CameraDeviceProxy]:
97
- camera_device = next((device for device in self.devices.values() if device.name == name), None)
98
-
99
- if not camera_device:
100
- camera: Camera = await self.__on_request("getCameraByName", [name])
101
-
102
- if camera:
103
- camera_device = await self.__add_or_get_camera(camera)
104
-
105
- return camera_device
106
-
107
- async def create_camera(self, camera_config: CameraConfig) -> CameraDeviceProxy:
108
- camera: Camera = await self.__on_request("createCamera", [camera_config])
109
- camera_device = cast(CameraDeviceProxy, await self.__add_or_get_camera(camera))
110
- return camera_device
111
-
112
- async def remove_camera_by_name(self, name: str) -> None:
113
- camera = await self.__on_request("getCameraByName", [name])
114
-
115
- if camera:
116
- await self.__on_request("removeCameraByName", [name])
117
- del self.devices[camera["_id"]]
118
-
119
- async def remove_camera_by_id(self, id: str) -> None:
120
- await self.__on_request("removeCameraById", [id])
121
- del self.devices[id]
122
-
123
- def configure_cameras(self, camera_devices: list[CameraDeviceProxy]) -> None:
124
- for camera_device in camera_devices:
125
- self.devices[camera_device.id] = camera_device
126
-
127
- def emit(self, event: str, *args: Any, **kwargs: Any) -> Any:
128
- pass
129
-
130
- async def __request_handler(self, message: ProxyMessageStructure):
131
- pass
132
-
133
- async def __emit_event(self, msg: Msg) -> None:
134
- message = unpack(msg.data)
135
-
136
- type = message.get("type")
137
- data = message.get("data", {})
138
- camera = data.get("camera")
139
- extension = data.get("extension")
140
-
141
- if type == "cameraSelected":
142
- camera_device = await self.__add_or_get_camera(camera)
143
-
144
- super().emit(type, camera_device, extension)
145
- elif type == "cameraDeselected":
146
- camera_device = self.devices.get(camera["_id"])
147
-
148
- if camera_device:
149
- await camera_device.cleanup()
150
-
151
- del self.devices[camera["_id"]]
152
-
153
- super().emit(type, camera["_id"], extension)
154
-
155
- async def __on_proxy_message(self, msg: Msg) -> None:
156
- if not self.initialized:
157
- return
158
-
159
- self.tasks.add(self.__emit_event(msg))
160
-
161
- async def __on_request(self, fn: str, args: list[Any] = []) -> Any:
162
- if not self.message_queue:
163
- raise Exception("Message queue is not initialized")
164
-
165
- message: ProxyMessageStructure = {
166
- "requestId": str(uuid4()),
167
- "targetId": self.subject,
168
- "targetName": self.plugin["name"],
169
- "pluginId": self.plugin["id"],
170
- "type": "request",
171
- "proxy": "device",
172
- "client": "deviceFn",
173
- "fn": fn,
174
- "args": args,
175
- "timestamp": int(datetime.now().timestamp() * 1000),
176
- "timeout": 5000,
177
- }
178
-
179
- return await self.message_queue.enqueue(message)
180
-
181
- async def __add_or_get_camera(self, camera_or_id: Union[Camera, str]) -> Optional[CameraDeviceProxy]:
182
- camera_device: Optional[CameraDeviceProxy] = None
183
-
184
- if isinstance(camera_or_id, str):
185
- id = camera_or_id
186
-
187
- camera_device: Optional[CameraDeviceProxy] = next(
188
- (device for device in self.devices.values() if device.id == id or device.name == id),
189
- None,
190
- )
191
- else:
192
- camera = camera_or_id
193
-
194
- if camera["_id"] in self.devices:
195
- camera_device = self.devices[camera["_id"]]
196
- else:
197
- camera_device = CameraDeviceProxy(
198
- self.api,
199
- self.logger,
200
- camera,
201
- self.plugin,
202
- self.proxy_endpoints,
203
- self.auth,
204
- )
205
-
206
- self.devices[camera["_id"]] = camera_device
207
-
208
- if camera_device:
209
- await camera_device.init()
210
-
211
- return camera_device
212
-
213
- async def __close(self) -> None:
214
- self.initialized = False
215
- self.remove_all_listeners()
216
- self.api.remove_listener("shutdown", self.__close)
217
-
218
- if self.message_queue:
219
- self.message_queue.abort_queue()
220
-
221
- with suppress(Exception):
222
- if self.publisher:
223
- await self.publisher.close()
224
-
225
- if self.dm_publisher:
226
- await self.dm_publisher.close()
@@ -1,181 +0,0 @@
1
- import re
2
- from typing import Any, cast
3
-
4
- from camera_ui_types import (
5
- JsonSchema,
6
- JsonSchemaForm,
7
- RootSchema,
8
- )
9
-
10
-
11
- def config_path_to_schema_path(config_path: str) -> str:
12
- """
13
- Converts a configuration path to a schema path by handling array indices and nested properties.
14
-
15
- This function transforms the config path to match the structure expected by a JSON schema. For instance, converting array
16
- indices and adding 'properties' keywords as needed to represent the hierarchical structure of the schema.
17
-
18
- :param config_path: A dot-separated path string representing the location of a configuration item.
19
- :return: A dot-separated path string adjusted to align with JSON schema structure.
20
- """
21
- path_parts = config_path.split(".")
22
- schema_path_parts: list[str] = []
23
-
24
- for index, part in enumerate(path_parts):
25
- is_numeric_index = bool(re.match(r"^\d+$", part))
26
- is_last_part = index == len(path_parts) - 1
27
-
28
- if is_numeric_index:
29
- schema_path_parts.extend(["items", "properties"])
30
- else:
31
- schema_path_parts.append(part)
32
- if not is_last_part and not re.match(r"^\d+$", path_parts[index + 1]):
33
- schema_path_parts.append("properties")
34
-
35
- return ".".join(schema_path_parts)
36
-
37
-
38
- def generate_json_from_root_schema(
39
- root_schema: RootSchema,
40
- ) -> dict[str, Any]:
41
- """
42
- Generates a default JSON object based on the provided root schema. This function iterates through the schema's properties,
43
- creating a nested JSON object that matches the structure of the schema with default values where specified.
44
-
45
- :param root_schema: The root schema object which defines the structure and default values for the JSON object.
46
- :return: A JSON object that conforms to the provided schema.
47
- """
48
- json_object: dict[str, Any] = {}
49
-
50
- for key, json_schema in root_schema["schema"].items():
51
- json_object[key] = generate_json_from_schema(json_schema)
52
-
53
- return json_object
54
-
55
-
56
- def generate_json_from_schema(
57
- json_schema: JsonSchema,
58
- ) -> Any:
59
- """
60
- Generates JSON data based on a single schema definition. Depending on the schema type, this may generate a string, number,
61
- boolean, object, or array, incorporating default values and nested structures as defined in the schema.
62
-
63
- :param json_schema: The JSON schema from which to generate data.
64
- :return: Generated JSON data that conforms to the specified schema.
65
- """
66
- schema_type = json_schema.get("type")
67
-
68
- if schema_type in ["string", "number", "boolean"]:
69
- if "enum" in json_schema:
70
- if json_schema.get("multiple"):
71
- return [json_schema.get("defaultValue")] if "defaultValue" in json_schema else []
72
- else:
73
- return json_schema.get(
74
- "defaultValue",
75
- json_schema["enum"][0] if json_schema.get("required", False) else None,
76
- )
77
- else:
78
- return json_schema.get("defaultValue")
79
- elif schema_type == "object":
80
- properties = json_schema.get("properties")
81
- if properties:
82
- return {k: generate_json_from_schema(v) for k, v in properties.items()}
83
- return {}
84
- elif schema_type == "array":
85
- items = json_schema.get("items")
86
- if items:
87
- return [generate_json_from_schema(items)]
88
- return []
89
- else:
90
- return None
91
-
92
-
93
- def get_value_by_path(obj: dict[str, Any], path: str) -> Any:
94
- """
95
- Retrieves a value from a nested object or a list based on a dot-separated path. If the path includes indices for accessing
96
- array elements, these are handled accordingly. If any part of the path is not found, None is returned.
97
-
98
- :param obj: The object or list from which to retrieve the value.
99
- :param path: A dot-separated path string representing the location of the item.
100
- :return: The value at the specified path, or None if the path is not found.
101
- """
102
-
103
- keys: list[str] = []
104
- for key in path.split("."):
105
- if "[" in key:
106
- path_key, index = key.split("[")
107
- keys.append(path_key)
108
- keys.append(index[:-1])
109
- else:
110
- keys.append(key)
111
-
112
- current = obj
113
- for key in keys:
114
- if current is None:
115
- return None
116
- current = current.get(key)
117
-
118
- return current
119
-
120
-
121
- def remove_functions_from_schema_form(
122
- schema_form: JsonSchemaForm,
123
- ) -> JsonSchemaForm:
124
- """
125
- Removes 'onSet' and 'onGet' functions from a schema form, making it suitable for serialization or scenarios where these
126
- executable functions should not be included. This is particularly useful for preparing a schema for transmission over a
127
- network or storing in a format that does not support functions.
128
-
129
- :param schema_form: The schema form from which to remove functions.
130
- :return: A new schema form with the functions removed.
131
- """
132
- filtered_schema_form: JsonSchemaForm = {}
133
-
134
- for key, json_schema in schema_form.items():
135
- filtered_schema_form[key] = remove_functions_from_schema(json_schema)
136
-
137
- return filtered_schema_form
138
-
139
-
140
- def remove_functions_from_schema(
141
- json_schema: JsonSchema,
142
- ) -> JsonSchema:
143
- """
144
- Similar to 'remove_functions_from_schema_form', but operates on a single schema object. It removes 'onSet' and 'onGet'
145
- functions if present.
146
-
147
- :param json_schema: The individual schema from which to remove functions.
148
- :return: A new schema with the functions removed.
149
- """
150
- json_schema_items = cast(dict[str, Any], json_schema.items()) # type: ignore
151
- filtered_schema = cast(JsonSchema, {k: v for k, v in json_schema_items if k not in ["onSet", "onGet"]})
152
-
153
- if filtered_schema["type"] == "object" and "properties" in filtered_schema:
154
- filtered_schema["properties"] = remove_functions_from_schema_form(filtered_schema["properties"])
155
- elif filtered_schema["type"] == "array" and "items" in filtered_schema:
156
- filtered_schema["items"] = remove_functions_from_schema(filtered_schema["items"])
157
-
158
- return filtered_schema
159
-
160
-
161
- def schema_path_to_config_path(schema_path: str) -> str:
162
- """
163
- Converts a schema path back to a configuration path by removing 'properties' and 'items' keywords, effectively reversing
164
- the operation performed by 'config_path_to_schema_path'. This is useful for mapping a location within a schema to a
165
- corresponding location in a configuration object or file.
166
-
167
- :param schema_path: A dot-separated path string representing the location within a schema.
168
- :return: A dot-separated path string representing the corresponding location within a configuration.
169
- """
170
- path_parts = schema_path.split(".")
171
- config_path_parts: list[str] = []
172
-
173
- for part in path_parts:
174
- if part != "properties" and part != "items":
175
- is_numeric_index = bool(re.match(r"^\d+$", part))
176
- if is_numeric_index:
177
- config_path_parts.append(f"[{part}]")
178
- else:
179
- config_path_parts.append(part)
180
-
181
- return ".".join(config_path_parts)
@@ -1,58 +0,0 @@
1
- from typing import Any, Literal, Optional
2
-
3
- from camera_storage import CameraStorage
4
- from camera_ui_types import JsonSchemaForm
5
- from lmdbm import Lmdb
6
- from plugin_api import PluginAPI
7
-
8
-
9
- class StorageController:
10
- def __init__(self, api: PluginAPI, plugin_db: Lmdb[Literal["config"], dict[str, Any]]) -> None:
11
- self.__api = api
12
- self.__camera_storages: dict[str, CameraStorage] = {}
13
- self.__plugin_db = plugin_db
14
-
15
- def create_camera_storage(
16
- self,
17
- instance: Any,
18
- camera_id: str,
19
- schema: Optional[JsonSchemaForm] = None,
20
- ) -> CameraStorage:
21
- """
22
- Creates or retrieves an existing camera storage instance for the specified camera ID. If a storage instance does not already exist, it is initialized and stored.
23
-
24
- :param instance: The plugin instance associated with this camera storage.
25
- :param camera_id: A unique identifier for the camera.
26
- :param schema: The JSON schema form defining the data structure for this camera's storage.
27
- :return: An instance of CameraStorage for the specified camera.
28
- """
29
- if schema is None:
30
- schema = {}
31
-
32
- camera_storage = self.__camera_storages.get(camera_id) or CameraStorage(
33
- self.__api, self.__plugin_db, instance, camera_id, schema
34
- )
35
-
36
- camera_storage.initializeStorage()
37
-
38
- self.__camera_storages[camera_id] = camera_storage
39
-
40
- return camera_storage
41
-
42
- def get_camera_storage(self, camera_id: str) -> Optional[CameraStorage]:
43
- """
44
- Retrieves a camera storage instance for the specified camera ID, if one exists.
45
-
46
- :param camera_id: The unique identifier for the camera whose storage instance is being requested.
47
- :return: The CameraStorage instance for the specified camera, or None if no such instance exists.
48
- """
49
- return self.__camera_storages.get(camera_id)
50
-
51
- def remove_camera_storage(self, camera_id: str) -> None:
52
- """
53
- Removes the camera storage instance associated with the specified camera ID, if it exists.
54
-
55
- :param camera_id: The unique identifier for the camera whose storage instance should be removed.
56
- """
57
- if camera_id in self.__camera_storages:
58
- del self.__camera_storages[camera_id]