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

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 (873) hide show
  1. package/.prettierignore +12 -0
  2. package/.prettierrc.json +12 -0
  3. package/artillery.yaml +29 -0
  4. package/bin/cameraui-server.ts +11 -0
  5. package/dist/interface/assets/@xterm.DYP7pi_n.0.0.50-internal.0.css +32 -0
  6. package/dist/interface/assets/Adminpanel.BKek2EMH.0.0.50-internal.0.css +1 -0
  7. package/dist/interface/assets/Cameras.BDWZJqPN.0.0.50-internal.0.css +1 -0
  8. package/dist/interface/assets/Camview.BFUFMoNX.0.0.50-internal.0.css +1 -0
  9. package/dist/interface/assets/CuiConsole.DCYyxdVg.0.0.50-internal.0.css +1 -0
  10. package/dist/interface/assets/CuiPluginCard.yF8V0SZY.0.0.50-internal.0.css +1 -0
  11. package/dist/interface/assets/CuiTimeline.BkIwlYtw.0.0.50-internal.0.css +1 -0
  12. package/dist/interface/assets/Plugin.DJElsAn5.0.0.50-internal.0.css +1 -0
  13. package/dist/interface/assets/Plugins.0h77qnmN.0.0.50-internal.0.css +1 -0
  14. package/dist/interface/assets/Settings.CkgfRkQr.0.0.50-internal.0.css +1 -0
  15. package/dist/interface/assets/SettingsAccount.DeFul3eQ.0.0.50-internal.0.css +1 -0
  16. package/dist/interface/assets/main.Cip9LkS3.0.0.50-internal.0.css +1 -0
  17. package/dist/interface/assets/worker-base.jEXLGV2h.0.0.50-internal.0.js +1332 -0
  18. package/dist/interface/assets/worker-json.DgwNIOck.0.0.50-internal.0.js +1626 -0
  19. package/dist/interface/assets/worker-yaml.B3uUYINB.0.0.50-internal.0.js +5819 -0
  20. package/dist/interface/fonts/InterVariable.woff2 +0 -0
  21. package/dist/interface/index.html +48 -38
  22. package/dist/interface/js/@intlify.BkGPX90O.0.0.50-internal.0.js +15 -0
  23. package/dist/interface/js/@kurkle.D8fDXNIl.0.0.50-internal.0.js +6 -0
  24. package/dist/interface/js/@primeuix.BFAY2Bk9.0.0.50-internal.0.js +5722 -0
  25. package/dist/interface/js/@primevue.OhxoO3MD.0.0.50-internal.0.js +57 -0
  26. package/dist/interface/js/@tanstack.D1IL6eOv.0.0.50-internal.0.js +1 -0
  27. package/dist/interface/{@vee-validate.BEda0VqZ.0.0.48.js → js/@vee-validate.BGPyWWTh.0.0.50-internal.0.js} +2 -2
  28. package/dist/interface/js/@vue.B5vqhCp2.0.0.50-internal.0.js +17 -0
  29. package/dist/interface/js/@vueuse.BsKtqdiG.0.0.50-internal.0.js +1 -0
  30. package/dist/interface/{@xterm.Ct1qg4AD.0.0.48.js → js/@xterm.CAa7rpjv.0.0.50-internal.0.js} +8 -8
  31. package/dist/interface/js/Adminpanel.D93Kvbwp.0.0.50-internal.0.js +1 -0
  32. package/dist/interface/js/Camera.DF2l3OMA.0.0.50-internal.0.js +1 -0
  33. package/dist/interface/js/Cameras.YzvZccdv.0.0.50-internal.0.js +482 -0
  34. package/dist/interface/js/Cammesh.D-6dAROQ.0.0.50-internal.0.js +1 -0
  35. package/dist/interface/js/Camview.CB7_HnoQ.0.0.50-internal.0.js +1 -0
  36. package/dist/interface/js/Config.BwflsWTm.0.0.50-internal.0.js +2 -0
  37. package/dist/interface/js/Console.DZM8pN8Q.0.0.50-internal.0.js +4 -0
  38. package/dist/interface/js/CuiConsole.BXXU7Gth.0.0.50-internal.0.js +1 -0
  39. package/dist/interface/js/CuiPluginCard.YFOrpbVD.0.0.50-internal.0.js +4 -0
  40. package/dist/interface/js/CuiTimeline.VV5KSJd5.0.0.50-internal.0.js +1 -0
  41. package/dist/interface/js/FirstSteps.b-nvymgb.0.0.50-internal.0.js +1 -0
  42. package/dist/interface/js/Plugin.BOMpVEwM.0.0.50-internal.0.js +1 -0
  43. package/dist/interface/js/Plugins.DdPwaUDA.0.0.50-internal.0.js +1 -0
  44. package/dist/interface/js/Recordings.DhxjIW7e.0.0.50-internal.0.js +1 -0
  45. package/dist/interface/js/Settings.D24ttaPu.0.0.50-internal.0.js +1 -0
  46. package/dist/interface/js/SettingsAccount.ms3aqz4E.0.0.50-internal.0.js +1 -0
  47. package/dist/interface/js/SettingsAppearance.DsTjKXk1.0.0.50-internal.0.js +1 -0
  48. package/dist/interface/js/SettingsAppearance.vue_vue_type_script_setup_true_lang.CBQ6lL3T.0.0.50-internal.0.js +1 -0
  49. package/dist/interface/js/SettingsBackup.BPEc4Rjg.0.0.50-internal.0.js +1 -0
  50. package/dist/interface/js/SettingsRecordings.DgW7M0jj.0.0.50-internal.0.js +1 -0
  51. package/dist/interface/js/SettingsRemote.BL5nXbUT.0.0.50-internal.0.js +1 -0
  52. package/dist/interface/js/SettingsSystem.D7T0AIpm.0.0.50-internal.0.js +1 -0
  53. package/dist/interface/js/SettingsUsers.1u0vCOVG.0.0.50-internal.0.js +1 -0
  54. package/dist/interface/js/VersionsHandler.vue_vue_type_script_setup_true_lang.xDishkkS.0.0.50-internal.0.js +4 -0
  55. package/dist/interface/js/ace-builds.D1nmvCwb.0.0.50-internal.0.js +1090 -0
  56. package/dist/interface/js/ace.config.G96T2z54.0.0.50-internal.0.js +1 -0
  57. package/dist/interface/js/axios.DHr9lByg.0.0.50-internal.0.js +6 -0
  58. package/dist/interface/js/backup.B_Gzxtp_.0.0.50-internal.0.js +1 -0
  59. package/dist/interface/js/chart.js.CP_nMnnf.0.0.50-internal.0.js +13 -0
  60. package/dist/interface/js/close-circle.DYLuVIOg.0.0.50-internal.0.js +1 -0
  61. package/dist/interface/js/dnd-core.T9OeW7mu.0.0.50-internal.0.js +1 -0
  62. package/dist/interface/{draggabilly.PrP7w5-3.0.0.48.js → js/draggabilly.D3zGcBb3.0.0.50-internal.0.js} +1 -1
  63. package/dist/interface/js/engine.io-client.kITRnq-g.0.0.50-internal.0.js +1 -0
  64. package/dist/interface/js/fast-deep-equal.Bpc9mIsj.0.0.50-internal.0.js +1 -0
  65. package/dist/interface/js/highlight.js.BlSXU-Wb.0.0.50-internal.0.js +3 -0
  66. package/dist/interface/js/linkify-it.C3N1lWsJ.0.0.50-internal.0.js +1 -0
  67. package/dist/interface/js/main.D0YR3Jat.0.0.50-internal.0.js +31 -0
  68. package/dist/interface/{markdown-it.DU7e183f.0.0.48.js → js/markdown-it.Dj0dt5s2.0.0.50-internal.0.js} +1 -1
  69. package/dist/interface/{nprogress.DTGXmkhG.0.0.48.js → js/nprogress.BwQWDcGj.0.0.50-internal.0.js} +1 -1
  70. package/dist/interface/js/perfect-debounce.l0sNRNKZ.0.0.50-internal.0.js +1 -0
  71. package/dist/interface/js/pinia.DRh7plEC.0.0.50-internal.0.js +5 -0
  72. package/dist/interface/js/primelocale.Bga3dOQu.0.0.50-internal.0.js +1 -0
  73. package/dist/interface/js/primevue.Cl58krXf.0.0.50-internal.0.js +142 -0
  74. package/dist/interface/{qrcode.Bdg1zKx6.0.0.48.js → js/qrcode.C1sDj6P8.0.0.50-internal.0.js} +1 -1
  75. package/dist/interface/js/react-dnd-touch-backend.BA4WhUJo.0.0.50-internal.0.js +1 -0
  76. package/dist/interface/js/refresh-rounded.D_SmhhUf.0.0.50-internal.0.js +1 -0
  77. package/dist/interface/js/rxjs.C-fTBwEO.0.0.50-internal.0.js +3 -0
  78. package/dist/interface/js/socket.io-client.DKrRxgjP.0.0.50-internal.0.js +1 -0
  79. package/dist/interface/js/socket.io-parser.EXj3YDH2.0.0.50-internal.0.js +1 -0
  80. package/dist/interface/js/system.CY8rGd-Q.0.0.50-internal.0.js +1 -0
  81. package/dist/interface/js/trash-fill.CMnCN3Oy.0.0.50-internal.0.js +1 -0
  82. package/dist/interface/{unidragger.3FW7TOUy.0.0.48.js → js/unidragger.D0w6Tqtt.0.0.50-internal.0.js} +1 -1
  83. package/dist/interface/js/uuid.C6aID195.0.0.50-internal.0.js +1 -0
  84. package/dist/interface/js/vee-validate.BeiObIH8.0.0.50-internal.0.js +5 -0
  85. package/dist/interface/js/vue-chartjs.DtdZdiYw.0.0.50-internal.0.js +1 -0
  86. package/dist/interface/js/vue-i18n.BW2bx_6z.0.0.50-internal.0.js +5 -0
  87. package/dist/interface/js/vue-inline-svg.BJkQGmKz.0.0.50-internal.0.js +1 -0
  88. package/dist/interface/js/vue-router.B2mOXHaC.0.0.50-internal.0.js +5 -0
  89. package/dist/interface/js/vue-zoomable.BKDyCJE7.0.0.50-internal.0.js +1 -0
  90. package/dist/interface/js/vue.l0sNRNKZ.0.0.50-internal.0.js +1 -0
  91. package/dist/interface/js/vue3-dnd.DRK24CBp.0.0.50-internal.0.js +1 -0
  92. package/dist/interface/js/zod.SKKegNRO.0.0.50-internal.0.js +1 -0
  93. package/dist/interface/js/zoom-out.DxvzgVEo.0.0.50-internal.0.js +1 -0
  94. package/dist/interface/manifest.webmanifest +1 -1
  95. package/dist/interface/pwa/favicon-32.ico +0 -0
  96. package/dist/interface/pwa/favicon-48.ico +0 -0
  97. package/dist/interface/sw.js +1 -1
  98. package/dist/server/package.json +57 -45
  99. package/dist/server/requirements.txt +12 -11
  100. package/dist/server/src/__init__.py +0 -0
  101. package/dist/server/src/_camera_ui_tools/__init__.py +0 -0
  102. package/dist/server/src/_camera_ui_tools/camera_ui_common/__init__.py +28 -0
  103. package/dist/server/src/_camera_ui_tools/camera_ui_common/camera_utils/utils.py +52 -0
  104. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/__init__.py +0 -0
  105. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/object_path.py +198 -0
  106. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/reactive.py +42 -0
  107. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/signal_handler.py +92 -0
  108. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/subscribed.py +21 -0
  109. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/task.py +39 -0
  110. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/thread.py +10 -0
  111. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/utils.py +91 -0
  112. package/dist/server/src/_camera_ui_tools/camera_ui_common/logger_service/__init__.py +0 -0
  113. package/dist/server/src/_camera_ui_tools/camera_ui_common/logger_service/ansicolor.py +62 -0
  114. package/dist/server/src/_camera_ui_tools/camera_ui_common/logger_service/logger.py +178 -0
  115. package/dist/server/src/_camera_ui_tools/camera_ui_common/logger_service/test.py +116 -0
  116. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/__init__.py +350 -0
  117. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/__init__.py +0 -0
  118. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/base.py +237 -0
  119. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/client.py +256 -0
  120. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/connection.py +784 -0
  121. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/errors.py +745 -0
  122. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/messaging.py +57 -0
  123. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/rpc.py +227 -0
  124. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/rpc_generator.py +584 -0
  125. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/constants.py +96 -0
  126. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/typings.py +218 -0
  127. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/__init__.py +0 -0
  128. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/connection_state.py +86 -0
  129. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/logger.py +30 -0
  130. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/metrics.py +152 -0
  131. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/packer.py +20 -0
  132. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/routing.py +75 -0
  133. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/rpc.py +177 -0
  134. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/subscriptions.py +24 -0
  135. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/tasks.py +39 -0
  136. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/uid.py +37 -0
  137. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/validate.py +119 -0
  138. package/dist/server/src/_camera_ui_tools/camera_ui_types/__init__.py +1360 -0
  139. package/dist/server/src/_camera_ui_tools/camera_ui_types/hybrid_observer.py +338 -0
  140. package/dist/server/src/_camera_ui_tools/camera_ui_types/test.py +196 -0
  141. package/dist/server/src/api/controllers/auth.controller.d.ts +2 -2
  142. package/dist/server/src/api/controllers/auth.controller.js +49 -43
  143. package/dist/server/src/api/controllers/auth.controller.js.map +1 -1
  144. package/dist/server/src/api/controllers/backup.controller.js +1 -2
  145. package/dist/server/src/api/controllers/backup.controller.js.map +1 -1
  146. package/dist/server/src/api/controllers/cameras.controller.d.ts +13 -11
  147. package/dist/server/src/api/controllers/cameras.controller.js +314 -105
  148. package/dist/server/src/api/controllers/cameras.controller.js.map +1 -1
  149. package/dist/server/src/api/controllers/plugins.controller.d.ts +8 -8
  150. package/dist/server/src/api/controllers/plugins.controller.js +208 -244
  151. package/dist/server/src/api/controllers/plugins.controller.js.map +1 -1
  152. package/dist/server/src/api/controllers/system.controller.d.ts +1 -0
  153. package/dist/server/src/api/controllers/system.controller.js +22 -8
  154. package/dist/server/src/api/controllers/system.controller.js.map +1 -1
  155. package/dist/server/src/api/controllers/users.controller.d.ts +2 -2
  156. package/dist/server/src/api/controllers/users.controller.js +13 -25
  157. package/dist/server/src/api/controllers/users.controller.js.map +1 -1
  158. package/dist/server/src/api/database/checks.js +2 -2
  159. package/dist/server/src/api/database/checks.js.map +1 -1
  160. package/dist/server/src/api/database/index.d.ts +4 -7
  161. package/dist/server/src/api/database/index.js +59 -86
  162. package/dist/server/src/api/database/index.js.map +1 -1
  163. package/dist/server/src/api/database/migration.js +5 -141
  164. package/dist/server/src/api/database/migration.js.map +1 -1
  165. package/dist/server/src/api/database/selfcheck.js +5 -5
  166. package/dist/server/src/api/database/selfcheck.js.map +1 -1
  167. package/dist/server/src/api/database/types.d.ts +17 -25
  168. package/dist/server/src/api/go2rtc/api/discover.d.ts +30 -0
  169. package/dist/server/src/api/go2rtc/api/discover.js +162 -0
  170. package/dist/server/src/api/go2rtc/api/discover.js.map +1 -0
  171. package/dist/server/src/api/go2rtc/api/index.d.ts +1 -1
  172. package/dist/server/src/api/go2rtc/api/index.js +15 -4
  173. package/dist/server/src/api/go2rtc/api/index.js.map +1 -1
  174. package/dist/server/src/api/go2rtc/api/streams.d.ts +3 -1
  175. package/dist/server/src/api/go2rtc/api/streams.js +66 -9
  176. package/dist/server/src/api/go2rtc/api/streams.js.map +1 -1
  177. package/dist/server/src/api/go2rtc/index.d.ts +2 -0
  178. package/dist/server/src/api/go2rtc/index.js +3 -0
  179. package/dist/server/src/api/go2rtc/index.js.map +1 -1
  180. package/dist/server/src/api/go2rtc/queue.js +3 -3
  181. package/dist/server/src/api/go2rtc/queue.js.map +1 -1
  182. package/dist/server/src/api/go2rtc/types.d.ts +66 -11
  183. package/dist/server/src/api/index.d.ts +4 -0
  184. package/dist/server/src/api/index.js +45 -9
  185. package/dist/server/src/api/index.js.map +1 -1
  186. package/dist/server/src/api/middlewares/authPermission.middleware.d.ts +1 -0
  187. package/dist/server/src/api/middlewares/authPermission.middleware.js +11 -2
  188. package/dist/server/src/api/middlewares/authPermission.middleware.js.map +1 -1
  189. package/dist/server/src/api/middlewares/authValidation.middleware.js +20 -12
  190. package/dist/server/src/api/middlewares/authValidation.middleware.js.map +1 -1
  191. package/dist/server/src/api/middlewares/pagination.middleware.js +45 -53
  192. package/dist/server/src/api/middlewares/pagination.middleware.js.map +1 -1
  193. package/dist/server/src/api/plugins/proxy.plugin.d.ts +14 -0
  194. package/dist/server/src/api/plugins/proxy.plugin.js +200 -0
  195. package/dist/server/src/api/plugins/proxy.plugin.js.map +1 -0
  196. package/dist/server/src/api/routes/cameras.routes.js +56 -30
  197. package/dist/server/src/api/routes/cameras.routes.js.map +1 -1
  198. package/dist/server/src/api/routes/plugins.routes.js +65 -63
  199. package/dist/server/src/api/routes/plugins.routes.js.map +1 -1
  200. package/dist/server/src/api/routes/system.routes.js +7 -1
  201. package/dist/server/src/api/routes/system.routes.js.map +1 -1
  202. package/dist/server/src/api/routes/users.routes.js +8 -8
  203. package/dist/server/src/api/routes/users.routes.js.map +1 -1
  204. package/dist/server/src/api/schemas/backup.schema.d.ts +3 -3
  205. package/dist/server/src/api/schemas/backup.schema.js +1 -1
  206. package/dist/server/src/api/schemas/backup.schema.js.map +1 -1
  207. package/dist/server/src/api/schemas/cameras.schema.d.ts +1413 -529
  208. package/dist/server/src/api/schemas/cameras.schema.js +229 -182
  209. package/dist/server/src/api/schemas/cameras.schema.js.map +1 -1
  210. package/dist/server/src/api/schemas/config.schema.d.ts +29 -41
  211. package/dist/server/src/api/schemas/config.schema.js +10 -21
  212. package/dist/server/src/api/schemas/config.schema.js.map +1 -1
  213. package/dist/server/src/api/schemas/go2rtc.schema.d.ts +194 -162
  214. package/dist/server/src/api/schemas/go2rtc.schema.js +33 -58
  215. package/dist/server/src/api/schemas/go2rtc.schema.js.map +1 -1
  216. package/dist/server/src/api/schemas/plugins.schema.d.ts +17 -17
  217. package/dist/server/src/api/schemas/plugins.schema.js +1 -1
  218. package/dist/server/src/api/schemas/plugins.schema.js.map +1 -1
  219. package/dist/server/src/api/schemas/storage.schema.d.ts +22 -0
  220. package/dist/server/src/api/schemas/storage.schema.js +5 -0
  221. package/dist/server/src/api/schemas/storage.schema.js.map +1 -0
  222. package/dist/server/src/api/schemas/system.schema.d.ts +171 -3
  223. package/dist/server/src/api/schemas/system.schema.js +30 -3
  224. package/dist/server/src/api/schemas/system.schema.js.map +1 -1
  225. package/dist/server/src/api/schemas/users.schema.d.ts +98 -254
  226. package/dist/server/src/api/schemas/users.schema.js +6 -6
  227. package/dist/server/src/api/schemas/users.schema.js.map +1 -1
  228. package/dist/server/src/api/services/auth.service.d.ts +5 -5
  229. package/dist/server/src/api/services/auth.service.js +26 -35
  230. package/dist/server/src/api/services/auth.service.js.map +1 -1
  231. package/dist/server/src/api/services/cameras.service.d.ts +11 -15
  232. package/dist/server/src/api/services/cameras.service.js +143 -274
  233. package/dist/server/src/api/services/cameras.service.js.map +1 -1
  234. package/dist/server/src/api/services/plugins.service.d.ts +3 -1
  235. package/dist/server/src/api/services/plugins.service.js +48 -50
  236. package/dist/server/src/api/services/plugins.service.js.map +1 -1
  237. package/dist/server/src/api/services/users.service.d.ts +1 -0
  238. package/dist/server/src/api/services/users.service.js +20 -14
  239. package/dist/server/src/api/services/users.service.js.map +1 -1
  240. package/dist/server/src/api/types/index.d.ts +57 -46
  241. package/dist/server/src/api/types/index.js +0 -4
  242. package/dist/server/src/api/types/index.js.map +1 -1
  243. package/dist/server/src/api/utils/cert.d.ts +5 -1
  244. package/dist/server/src/api/utils/cert.js +24 -26
  245. package/dist/server/src/api/utils/cert.js.map +1 -1
  246. package/dist/server/src/api/utils/constants.d.ts +4 -2
  247. package/dist/server/src/api/utils/constants.js +4 -2
  248. package/dist/server/src/api/utils/constants.js.map +1 -1
  249. package/dist/server/src/api/utils/fetch.d.ts +1 -1
  250. package/dist/server/src/api/utils/fetch.js +2 -2
  251. package/dist/server/src/api/utils/fetch.js.map +1 -1
  252. package/dist/server/src/api/websocket/index.d.ts +1 -0
  253. package/dist/server/src/api/websocket/index.js +14 -9
  254. package/dist/server/src/api/websocket/index.js.map +1 -1
  255. package/dist/server/src/api/websocket/nsp/logs.d.ts +10 -2
  256. package/dist/server/src/api/websocket/nsp/logs.js +75 -27
  257. package/dist/server/src/api/websocket/nsp/logs.js.map +1 -1
  258. package/dist/server/src/api/websocket/nsp/metrics.d.ts +20 -12
  259. package/dist/server/src/api/websocket/nsp/metrics.js +188 -117
  260. package/dist/server/src/api/websocket/nsp/metrics.js.map +1 -1
  261. package/dist/server/src/api/websocket/nsp/plugins.d.ts +1 -1
  262. package/dist/server/src/api/websocket/nsp/plugins.js +3 -5
  263. package/dist/server/src/api/websocket/nsp/plugins.js.map +1 -1
  264. package/dist/server/src/api/websocket/nsp/server.js +6 -0
  265. package/dist/server/src/api/websocket/nsp/server.js.map +1 -1
  266. package/dist/server/src/api/websocket/types.d.ts +4 -2
  267. package/dist/server/src/api.d.ts +3 -4
  268. package/dist/server/src/api.js +13 -13
  269. package/dist/server/src/api.js.map +1 -1
  270. package/dist/server/src/camera/classes.d.ts +2 -0
  271. package/dist/server/src/camera/classes.js +24 -0
  272. package/dist/server/src/camera/classes.js.map +1 -0
  273. package/dist/server/src/camera/controller.d.ts +30 -18
  274. package/dist/server/src/camera/controller.js +236 -202
  275. package/dist/server/src/camera/controller.js.map +1 -1
  276. package/dist/server/src/camera/device.d.ts +34 -0
  277. package/dist/server/src/camera/device.js +327 -0
  278. package/dist/server/src/camera/device.js.map +1 -0
  279. package/dist/server/src/camera/frameWorker.d.ts +32 -31
  280. package/dist/server/src/camera/frameWorker.js +257 -247
  281. package/dist/server/src/camera/frameWorker.js.map +1 -1
  282. package/dist/server/src/camera/index.d.ts +92 -0
  283. package/dist/server/src/camera/index.js +531 -0
  284. package/dist/server/src/camera/index.js.map +1 -0
  285. package/dist/server/src/camera/interfaces.d.ts +17 -0
  286. package/dist/server/src/camera/interfaces.js +99 -0
  287. package/dist/server/src/camera/interfaces.js.map +1 -0
  288. package/dist/server/src/camera/iou.d.ts +2 -0
  289. package/dist/server/src/camera/iou.js +123 -0
  290. package/dist/server/src/camera/iou.js.map +1 -0
  291. package/dist/server/src/camera/polygon.d.ts +4 -0
  292. package/dist/server/src/camera/polygon.js +192 -0
  293. package/dist/server/src/camera/polygon.js.map +1 -0
  294. package/dist/server/src/camera/python/__init__.py +0 -0
  295. package/dist/server/src/camera/python/classes.py +41 -0
  296. package/dist/server/src/camera/python/interfaces.py +130 -0
  297. package/dist/server/src/camera/python/iou.py +158 -0
  298. package/dist/server/src/camera/python/polygon.py +230 -0
  299. package/dist/server/src/camera/python/typings.py +50 -0
  300. package/dist/server/src/camera/python/video_frame.py +143 -0
  301. package/dist/server/src/camera/session.d.ts +37 -0
  302. package/dist/server/src/camera/session.js +160 -0
  303. package/dist/server/src/camera/session.js.map +1 -0
  304. package/dist/server/src/camera/streaming/fmp4-session.d.ts +17 -0
  305. package/dist/server/src/camera/streaming/fmp4-session.js +308 -0
  306. package/dist/server/src/camera/streaming/fmp4-session.js.map +1 -0
  307. package/dist/server/src/camera/streaming/peer-connection.d.ts +26 -0
  308. package/dist/server/src/camera/streaming/peer-connection.js +213 -0
  309. package/dist/server/src/camera/streaming/peer-connection.js.map +1 -0
  310. package/dist/server/src/camera/streaming/rtsp-session.d.ts +19 -0
  311. package/dist/server/src/camera/streaming/rtsp-session.js +253 -0
  312. package/dist/server/src/camera/streaming/rtsp-session.js.map +1 -0
  313. package/dist/server/src/camera/streaming/webrtc-connection.d.ts +44 -0
  314. package/dist/server/src/camera/streaming/webrtc-connection.js +177 -0
  315. package/dist/server/src/camera/streaming/webrtc-connection.js.map +1 -0
  316. package/dist/server/src/camera/streaming/werift-session.d.ts +19 -0
  317. package/dist/server/src/camera/streaming/werift-session.js +246 -0
  318. package/dist/server/src/camera/streaming/werift-session.js.map +1 -0
  319. package/dist/server/src/camera/types.d.ts +16 -10
  320. package/dist/server/src/camera/utils.d.ts +9 -0
  321. package/dist/server/src/camera/utils.js +416 -0
  322. package/dist/server/src/camera/utils.js.map +1 -0
  323. package/dist/server/src/camera/videoFrame.d.ts +18 -0
  324. package/dist/server/src/camera/videoFrame.js +88 -0
  325. package/dist/server/src/camera/videoFrame.js.map +1 -0
  326. package/dist/server/src/cloud/index.d.ts +12 -0
  327. package/dist/server/src/cloud/index.js +49 -0
  328. package/dist/server/src/cloud/index.js.map +1 -0
  329. package/dist/server/src/cloud/remote/cloudflare.d.ts +7 -0
  330. package/dist/server/src/cloud/remote/cloudflare.js +12 -0
  331. package/dist/server/src/cloud/remote/cloudflare.js.map +1 -0
  332. package/dist/server/src/cloud/remote/upnp.d.ts +7 -0
  333. package/dist/server/src/cloud/remote/upnp.js +12 -0
  334. package/dist/server/src/cloud/remote/upnp.js.map +1 -0
  335. package/dist/server/src/cloud/remote/utils.d.ts +3 -0
  336. package/dist/server/src/cloud/remote/utils.js +20 -0
  337. package/dist/server/src/cloud/remote/utils.js.map +1 -0
  338. package/dist/server/src/cloud/types.d.ts +15 -0
  339. package/dist/server/src/cloud/types.js +11 -0
  340. package/dist/server/src/cloud/types.js.map +1 -0
  341. package/dist/server/src/decoder/child.d.ts +1 -0
  342. package/dist/server/src/decoder/child.js +749 -0
  343. package/dist/server/src/decoder/child.js.map +1 -0
  344. package/dist/server/src/decoder/imageUtils.d.ts +22 -0
  345. package/dist/server/src/decoder/imageUtils.js +196 -0
  346. package/dist/server/src/decoder/imageUtils.js.map +1 -0
  347. package/dist/server/src/decoder/manager.d.ts +19 -0
  348. package/dist/server/src/decoder/manager.js +208 -0
  349. package/dist/server/src/decoder/manager.js.map +1 -0
  350. package/dist/server/src/decoder/python/__init__.py +0 -0
  351. package/dist/server/src/decoder/python/child.py +903 -0
  352. package/dist/server/src/decoder/python/image_utils.py +196 -0
  353. package/dist/server/src/decoder/python/pool.py +45 -0
  354. package/dist/server/src/decoder/python/typings.py +57 -0
  355. package/dist/server/src/decoder/python/utils.py +70 -0
  356. package/dist/server/src/decoder/types.d.ts +23 -0
  357. package/dist/server/src/decoder/types.js.map +1 -0
  358. package/dist/server/src/decoder/utils.d.ts +13 -0
  359. package/dist/server/src/decoder/utils.js +45 -0
  360. package/dist/server/src/decoder/utils.js.map +1 -0
  361. package/dist/server/src/decoder/wasm/build/decoder.d.ts +43 -0
  362. package/dist/server/src/decoder/wasm/build/decoder.js +108 -0
  363. package/dist/server/src/decoder/wasm/build/decoder.wasm +0 -0
  364. package/dist/server/src/decoder/worker.d.ts +1 -0
  365. package/dist/server/src/decoder/worker.js +79 -0
  366. package/dist/server/src/decoder/worker.js.map +1 -0
  367. package/dist/server/src/go2rtc/index.d.ts +1 -0
  368. package/dist/server/src/go2rtc/index.js +27 -9
  369. package/dist/server/src/go2rtc/index.js.map +1 -1
  370. package/dist/server/src/go2rtc/types.d.ts +5 -4
  371. package/dist/server/src/go2rtc/types.js +7 -2
  372. package/dist/server/src/go2rtc/types.js.map +1 -1
  373. package/dist/server/src/main.js +19 -5
  374. package/dist/server/src/main.js.map +1 -1
  375. package/dist/server/src/manager/coreManager.d.ts +16 -0
  376. package/dist/server/src/manager/coreManager.js +95 -0
  377. package/dist/server/src/manager/coreManager.js.map +1 -0
  378. package/dist/server/src/manager/deviceManager.d.ts +12 -0
  379. package/dist/server/src/manager/deviceManager.js +130 -0
  380. package/dist/server/src/manager/deviceManager.js.map +1 -0
  381. package/dist/server/src/manager/types.d.ts +15 -0
  382. package/dist/server/src/manager/types.js +2 -0
  383. package/dist/server/src/manager/types.js.map +1 -0
  384. package/dist/server/src/plugins/index.d.ts +3 -1
  385. package/dist/server/src/plugins/index.js +42 -21
  386. package/dist/server/src/plugins/index.js.map +1 -1
  387. package/dist/server/src/plugins/plugin.d.ts +3 -3
  388. package/dist/server/src/plugins/plugin.js +13 -20
  389. package/dist/server/src/plugins/plugin.js.map +1 -1
  390. package/dist/server/src/plugins/runtime/base.d.ts +54 -0
  391. package/dist/server/src/plugins/runtime/base.js +223 -0
  392. package/dist/server/src/plugins/runtime/base.js.map +1 -0
  393. package/dist/server/src/plugins/runtime/index.d.ts +5 -0
  394. package/dist/server/src/plugins/runtime/index.js +13 -0
  395. package/dist/server/src/plugins/runtime/index.js.map +1 -0
  396. package/dist/server/src/plugins/runtime/node/child.d.ts +22 -0
  397. package/dist/server/src/plugins/runtime/node/child.js +152 -0
  398. package/dist/server/src/plugins/runtime/node/child.js.map +1 -0
  399. package/dist/server/src/plugins/runtime/node/index.d.ts +7 -0
  400. package/dist/server/src/plugins/runtime/node/index.js +54 -0
  401. package/dist/server/src/plugins/runtime/node/index.js.map +1 -0
  402. package/dist/server/src/plugins/runtime/node/plugin.d.ts +24 -0
  403. package/dist/server/src/plugins/runtime/node/plugin.js +128 -0
  404. package/dist/server/src/plugins/runtime/node/plugin.js.map +1 -0
  405. package/dist/server/src/plugins/runtime/node/pluginApi.d.ts +16 -0
  406. package/dist/server/src/plugins/runtime/node/pluginApi.js +18 -0
  407. package/dist/server/src/plugins/runtime/node/pluginApi.js.map +1 -0
  408. package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.d.ts +25 -0
  409. package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js +230 -0
  410. package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js.map +1 -0
  411. package/dist/server/src/plugins/runtime/node/proxy/coreManager.d.ts +16 -0
  412. package/dist/server/src/plugins/runtime/node/proxy/coreManager.js +98 -0
  413. package/dist/server/src/plugins/runtime/node/proxy/coreManager.js.map +1 -0
  414. package/dist/server/src/plugins/runtime/node/proxy/deviceManager.d.ts +19 -0
  415. package/dist/server/src/plugins/runtime/node/proxy/deviceManager.js +144 -0
  416. package/dist/server/src/plugins/runtime/node/proxy/deviceManager.js.map +1 -0
  417. package/dist/server/src/plugins/runtime/node/storage.d.ts +34 -0
  418. package/dist/server/src/plugins/runtime/node/storage.js +313 -0
  419. package/dist/server/src/plugins/runtime/node/storage.js.map +1 -0
  420. package/dist/server/src/plugins/runtime/node/storageController.d.ts +18 -0
  421. package/dist/server/src/plugins/runtime/node/storageController.js +67 -0
  422. package/dist/server/src/plugins/runtime/node/storageController.js.map +1 -0
  423. package/dist/server/src/plugins/runtime/python/__init__.py +0 -0
  424. package/dist/server/src/plugins/runtime/python/child.py +248 -0
  425. package/dist/server/src/plugins/runtime/python/index.d.ts +9 -0
  426. package/dist/server/src/plugins/runtime/python/index.js +57 -0
  427. package/dist/server/src/plugins/runtime/python/index.js.map +1 -0
  428. package/dist/server/src/plugins/runtime/python/namespaces.py +101 -0
  429. package/dist/server/src/plugins/runtime/python/plugin.py +155 -0
  430. package/dist/server/src/plugins/runtime/python/plugin_api.py +29 -0
  431. package/dist/server/src/plugins/runtime/python/proxy/camera_device.py +1732 -0
  432. package/dist/server/src/plugins/runtime/python/proxy/core_manager.py +126 -0
  433. package/dist/server/src/plugins/runtime/python/proxy/device_manager.py +197 -0
  434. package/dist/server/src/plugins/runtime/python/schema.py +99 -0
  435. package/dist/server/src/plugins/runtime/python/storage.py +353 -0
  436. package/dist/server/src/plugins/runtime/python/storage_controller.py +102 -0
  437. package/dist/server/src/plugins/runtime/python/typings.py +195 -0
  438. package/dist/server/src/plugins/schema.d.ts +27 -34
  439. package/dist/server/src/plugins/schema.js +358 -369
  440. package/dist/server/src/plugins/schema.js.map +1 -1
  441. package/dist/server/src/plugins/types.d.ts +43 -1
  442. package/dist/server/src/plugins/types.js +16 -0
  443. package/dist/server/src/plugins/types.js.map +1 -1
  444. package/dist/server/src/plugins/worker.d.ts +12 -31
  445. package/dist/server/src/plugins/worker.js +89 -343
  446. package/dist/server/src/plugins/worker.js.map +1 -1
  447. package/dist/server/src/rpc/index.d.ts +32 -0
  448. package/dist/server/src/rpc/index.js +103 -0
  449. package/dist/server/src/rpc/index.js.map +1 -0
  450. package/dist/server/src/rpc/namespaces.d.ts +35 -0
  451. package/dist/server/src/rpc/namespaces.js +42 -0
  452. package/dist/server/src/rpc/namespaces.js.map +1 -0
  453. package/dist/server/src/{nats → rpc}/server.d.ts +6 -2
  454. package/dist/server/src/{nats → rpc}/server.js +76 -55
  455. package/dist/server/src/rpc/server.js.map +1 -0
  456. package/dist/server/src/rpc/types.d.ts +111 -0
  457. package/dist/server/src/rpc/types.js +2 -0
  458. package/dist/server/src/{nats → rpc}/types.js.map +1 -1
  459. package/dist/server/src/{nats → rpc}/utils.d.ts +1 -1
  460. package/dist/server/src/rpc/utils.js.map +1 -0
  461. package/dist/server/src/services/config/constants.js +12 -48
  462. package/dist/server/src/services/config/constants.js.map +1 -1
  463. package/dist/server/src/services/config/defaults.d.ts +12 -0
  464. package/dist/server/src/services/config/defaults.js +55 -0
  465. package/dist/server/src/services/config/defaults.js.map +1 -0
  466. package/dist/server/src/services/config/index.d.ts +57 -9
  467. package/dist/server/src/services/config/index.js +277 -130
  468. package/dist/server/src/services/config/index.js.map +1 -1
  469. package/dist/server/src/services/config/types.d.ts +10 -4
  470. package/dist/server/src/types.d.ts +3 -0
  471. package/dist/server/src/utils/path.d.ts +5 -0
  472. package/dist/server/src/utils/path.js +12 -0
  473. package/dist/server/src/utils/path.js.map +1 -0
  474. package/dist/server/src/utils/pythonInstaller.d.ts +46 -0
  475. package/dist/server/src/utils/pythonInstaller.js +463 -0
  476. package/dist/server/src/utils/pythonInstaller.js.map +1 -0
  477. package/eslint.config.js +103 -0
  478. package/localdeps.txt +10 -0
  479. package/mypy.ini +30 -0
  480. package/package.json +57 -45
  481. package/requirements.txt +15 -0
  482. package/ruff.toml +90 -0
  483. package/src/__init__.py +0 -0
  484. package/src/_camera_ui_tools/__init__.py +0 -0
  485. package/src/_camera_ui_tools/__pycache__/__init__.cpython-311.pyc +0 -0
  486. package/src/api/controllers/api.controller.ts +19 -0
  487. package/src/api/controllers/auth.controller.ts +294 -0
  488. package/src/api/controllers/backup.controller.ts +72 -0
  489. package/src/api/controllers/cameras.controller.ts +1029 -0
  490. package/src/api/controllers/config.controller.ts +102 -0
  491. package/src/api/controllers/files.controller.ts +35 -0
  492. package/src/api/controllers/frameWorkers.controller.ts +109 -0
  493. package/src/api/controllers/plugins.controller.ts +1206 -0
  494. package/src/api/controllers/system.controller.ts +273 -0
  495. package/src/api/controllers/users.controller.ts +648 -0
  496. package/src/api/database/checks.ts +268 -0
  497. package/src/api/database/constants.ts +8 -0
  498. package/src/api/database/index.ts +262 -0
  499. package/src/api/database/migration.ts +62 -0
  500. package/src/api/database/selfcheck.ts +492 -0
  501. package/src/api/database/types.ts +104 -0
  502. package/src/api/go2rtc/api/application.ts +48 -0
  503. package/src/api/go2rtc/api/config.ts +61 -0
  504. package/src/api/go2rtc/api/discover.ts +197 -0
  505. package/src/api/go2rtc/api/index.ts +49 -0
  506. package/src/api/go2rtc/api/snapshot.ts +44 -0
  507. package/src/api/go2rtc/api/streams.ts +168 -0
  508. package/src/api/go2rtc/index.ts +43 -0
  509. package/src/api/go2rtc/queue.ts +50 -0
  510. package/src/api/go2rtc/types.ts +174 -0
  511. package/src/api/index.ts +286 -0
  512. package/src/api/middlewares/authPermission.middleware.ts +46 -0
  513. package/src/api/middlewares/authValidation.middleware.ts +160 -0
  514. package/src/api/middlewares/pagination.middleware.ts +67 -0
  515. package/src/api/middlewares/socketAuth.middleware.ts +136 -0
  516. package/src/api/plugins/header.plugin.ts +15 -0
  517. package/src/api/plugins/logger.plugin.ts +44 -0
  518. package/src/api/plugins/proxy.plugin.ts +255 -0
  519. package/src/api/plugins/socket.plugin.ts +28 -0
  520. package/src/api/plugins/system.plugin.ts +48 -0
  521. package/src/api/plugins/useragent.plugin.ts +19 -0
  522. package/src/api/routes/api.routes.ts +10 -0
  523. package/src/api/routes/auth.routes.ts +56 -0
  524. package/src/api/routes/backup.routes.ts +28 -0
  525. package/src/api/routes/cameras.routes.ts +281 -0
  526. package/src/api/routes/config.routes.ts +66 -0
  527. package/src/api/routes/files.routes.ts +15 -0
  528. package/src/api/routes/frameWorkers.routes.ts +39 -0
  529. package/src/api/routes/index.ts +37 -0
  530. package/src/api/routes/plugins.routes.ts +420 -0
  531. package/src/api/routes/system.routes.ts +101 -0
  532. package/src/api/routes/users.routes.ts +167 -0
  533. package/src/api/schemas/backup.schema.ts +112 -0
  534. package/src/api/schemas/cameras.schema.ts +479 -0
  535. package/src/api/schemas/config.schema.ts +38 -0
  536. package/src/api/schemas/go2rtc.schema.ts +189 -0
  537. package/src/api/schemas/plugins.schema.ts +126 -0
  538. package/src/api/schemas/storage.schema.ts +11 -0
  539. package/src/api/schemas/system.schema.ts +45 -0
  540. package/src/api/schemas/users.schema.ts +185 -0
  541. package/src/api/services/auth.service.ts +210 -0
  542. package/src/api/services/backup.service.ts +144 -0
  543. package/src/api/services/cameras.service.ts +671 -0
  544. package/src/api/services/plugins.service.ts +470 -0
  545. package/src/api/services/system.service.ts +85 -0
  546. package/src/api/services/users.service.ts +276 -0
  547. package/src/api/types/index.ts +675 -0
  548. package/src/api/utils/cert.ts +254 -0
  549. package/src/api/utils/constants.ts +17 -0
  550. package/src/api/utils/fetch.ts +21 -0
  551. package/src/api/utils/moveFiles.ts +45 -0
  552. package/src/api/utils/parse.ts +17 -0
  553. package/src/api/websocket/index.ts +110 -0
  554. package/src/api/websocket/nsp/logs.ts +240 -0
  555. package/src/api/websocket/nsp/main.ts +27 -0
  556. package/src/api/websocket/nsp/metrics.ts +301 -0
  557. package/src/api/websocket/nsp/notifications.ts +43 -0
  558. package/src/api/websocket/nsp/plugins.ts +37 -0
  559. package/src/api/websocket/nsp/server.ts +220 -0
  560. package/src/api/websocket/nsp/status.ts +77 -0
  561. package/src/api/websocket/types.ts +55 -0
  562. package/src/api.ts +163 -0
  563. package/src/camera/classes.ts +32 -0
  564. package/src/camera/controller.ts +579 -0
  565. package/src/camera/device.ts +422 -0
  566. package/src/camera/frameWorker.ts +403 -0
  567. package/src/camera/index.ts +679 -0
  568. package/src/camera/interfaces.ts +95 -0
  569. package/src/camera/iou.ts +153 -0
  570. package/src/camera/polygon.ts +226 -0
  571. package/src/camera/python/__init__.py +0 -0
  572. package/src/camera/python/__pycache__/__init__.cpython-311.pyc +0 -0
  573. package/src/camera/python/__pycache__/classes.cpython-311.pyc +0 -0
  574. package/src/camera/python/__pycache__/delegate_controller.cpython-311.pyc +0 -0
  575. package/src/camera/python/__pycache__/interfaces.cpython-311.pyc +0 -0
  576. package/src/camera/python/__pycache__/iou.cpython-310.pyc +0 -0
  577. package/src/camera/python/__pycache__/iou.cpython-311.pyc +0 -0
  578. package/src/camera/python/__pycache__/iou2.cpython-310.pyc +0 -0
  579. package/src/camera/python/__pycache__/polygon.cpython-311.pyc +0 -0
  580. package/src/camera/python/__pycache__/typings.cpython-311.pyc +0 -0
  581. package/src/camera/python/__pycache__/video_frame.cpython-311.pyc +0 -0
  582. package/src/camera/python/classes.py +41 -0
  583. package/src/camera/python/interfaces.py +130 -0
  584. package/src/camera/python/iou.py +158 -0
  585. package/src/camera/python/polygon.py +230 -0
  586. package/src/camera/python/test/__pycache__/polygon.cpython-310.pyc +0 -0
  587. package/src/camera/python/test/iou_test.py +799 -0
  588. package/src/camera/python/test/polygon.py +238 -0
  589. package/src/camera/python/test/polygon_test.py +256 -0
  590. package/src/camera/python/test/polygon_test2.py +484 -0
  591. package/src/camera/python/typings.py +50 -0
  592. package/src/camera/python/video_frame.py +143 -0
  593. package/src/camera/session.ts +192 -0
  594. package/src/camera/streaming/fmp4-session.ts +390 -0
  595. package/src/camera/streaming/peer-connection.ts +273 -0
  596. package/src/camera/streaming/rtsp-session.ts +331 -0
  597. package/src/camera/streaming/webrtc-connection.ts +260 -0
  598. package/src/camera/streaming/werift-session.ts +317 -0
  599. package/src/camera/test/iou_test.ts +761 -0
  600. package/src/camera/test/polygon.test.ts +611 -0
  601. package/src/camera/test/polygon_test.ts +210 -0
  602. package/src/camera/types.ts +48 -0
  603. package/src/camera/utils.ts +489 -0
  604. package/src/camera/videoFrame.ts +123 -0
  605. package/src/cloud/index.ts +61 -0
  606. package/src/cloud/remote/cloudflare.ts +18 -0
  607. package/src/cloud/remote/upnp.ts +18 -0
  608. package/src/cloud/remote/utils.ts +24 -0
  609. package/src/cloud/types.ts +16 -0
  610. package/src/decoder/child.ts +883 -0
  611. package/src/decoder/imageUtils.ts +275 -0
  612. package/src/decoder/manager.ts +251 -0
  613. package/src/decoder/python/__init__.py +0 -0
  614. package/src/decoder/python/__pycache__/__init__.cpython-311.pyc +0 -0
  615. package/src/decoder/python/__pycache__/image_utils.cpython-311.pyc +0 -0
  616. package/src/decoder/python/__pycache__/typings.cpython-311.pyc +0 -0
  617. package/src/decoder/python/__pycache__/utils.cpython-311.pyc +0 -0
  618. package/src/decoder/python/child.py +903 -0
  619. package/src/decoder/python/image_utils.py +196 -0
  620. package/src/decoder/python/pool.py +45 -0
  621. package/src/decoder/python/test/group.py +62 -0
  622. package/src/decoder/python/test/motion.mp4 +0 -0
  623. package/src/decoder/python/test/motion2.mp4 +0 -0
  624. package/src/decoder/python/test/opencl.cl +70 -0
  625. package/src/decoder/python/test/opencl2.cl +130 -0
  626. package/src/decoder/python/test/test.py +427 -0
  627. package/src/decoder/python/test/test1.jpg +0 -0
  628. package/src/decoder/python/test/test1_resized.jpg +0 -0
  629. package/src/decoder/python/test/test2.jpg +0 -0
  630. package/src/decoder/python/test/test2.py +451 -0
  631. package/src/decoder/python/test/test2_resized.jpg +0 -0
  632. package/src/decoder/python/test/test3.jpg +0 -0
  633. package/src/decoder/python/test/utils.py +50 -0
  634. package/src/decoder/python/typings.py +57 -0
  635. package/src/decoder/python/utils.py +70 -0
  636. package/src/decoder/test/child.ts +117 -0
  637. package/src/decoder/test/ffmpeg.ts +371 -0
  638. package/src/decoder/test/test.ts +182 -0
  639. package/src/decoder/types.ts +27 -0
  640. package/src/decoder/utils.ts +64 -0
  641. package/src/decoder/wasm/asconfig.json +28 -0
  642. package/src/decoder/wasm/assembly/console.ts +1 -0
  643. package/src/decoder/wasm/assembly/index.ts +890 -0
  644. package/src/decoder/wasm/build/decoder.d.ts +43 -0
  645. package/src/decoder/wasm/build/decoder.js +108 -0
  646. package/src/decoder/wasm/build/decoder.wasm +0 -0
  647. package/src/decoder/wasm/tsconfig.json +5 -0
  648. package/src/decoder/worker.ts +113 -0
  649. package/src/go2rtc/index.ts +324 -0
  650. package/src/go2rtc/types.ts +88 -0
  651. package/src/main.ts +267 -0
  652. package/src/manager/coreManager.ts +78 -0
  653. package/src/manager/deviceManager.ts +132 -0
  654. package/src/manager/types.ts +17 -0
  655. package/src/plugins/index.ts +443 -0
  656. package/src/plugins/plugin.ts +177 -0
  657. package/src/plugins/runtime/base.ts +282 -0
  658. package/src/plugins/runtime/index.ts +15 -0
  659. package/src/plugins/runtime/node/child.ts +193 -0
  660. package/src/plugins/runtime/node/index.ts +67 -0
  661. package/src/plugins/runtime/node/plugin.ts +122 -0
  662. package/src/plugins/runtime/node/pluginApi.ts +27 -0
  663. package/src/plugins/runtime/node/proxy/cameraDevice.ts +299 -0
  664. package/src/plugins/runtime/node/proxy/coreManager.ts +128 -0
  665. package/src/plugins/runtime/node/proxy/deviceManager.ts +187 -0
  666. package/src/plugins/runtime/node/storage.ts +312 -0
  667. package/src/plugins/runtime/node/storageController.ts +91 -0
  668. package/src/plugins/runtime/python/__init__.py +0 -0
  669. package/src/plugins/runtime/python/__pycache__/__init__.cpython-311.pyc +0 -0
  670. package/src/plugins/runtime/python/__pycache__/camera_storage.cpython-311.pyc +0 -0
  671. package/src/plugins/runtime/python/__pycache__/config_service.cpython-311.pyc +0 -0
  672. package/src/plugins/runtime/python/__pycache__/constants.cpython-311.pyc +0 -0
  673. package/src/plugins/runtime/python/__pycache__/ipc.cpython-311.pyc +0 -0
  674. package/src/plugins/runtime/python/__pycache__/logger.cpython-311.pyc +0 -0
  675. package/src/plugins/runtime/python/__pycache__/message_queue.cpython-311.pyc +0 -0
  676. package/src/plugins/runtime/python/__pycache__/namespaces.cpython-311.pyc +0 -0
  677. package/src/plugins/runtime/python/__pycache__/plugin.cpython-311.pyc +0 -0
  678. package/src/plugins/runtime/python/__pycache__/plugin_api.cpython-311.pyc +0 -0
  679. package/src/plugins/runtime/python/__pycache__/plugin_logger.cpython-311.pyc +0 -0
  680. package/src/plugins/runtime/python/__pycache__/proxy_utils.cpython-311.pyc +0 -0
  681. package/src/plugins/runtime/python/__pycache__/schema.cpython-311.pyc +0 -0
  682. package/src/plugins/runtime/python/__pycache__/storage.cpython-311.pyc +0 -0
  683. package/src/plugins/runtime/python/__pycache__/storage_controller.cpython-311.pyc +0 -0
  684. package/src/plugins/runtime/python/__pycache__/typings.cpython-311.pyc +0 -0
  685. package/src/plugins/runtime/python/child.py +248 -0
  686. package/src/plugins/runtime/python/index.ts +73 -0
  687. package/src/plugins/runtime/python/namespaces.py +101 -0
  688. package/src/plugins/runtime/python/plugin.py +155 -0
  689. package/src/plugins/runtime/python/plugin_api.py +29 -0
  690. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-310.pyc +0 -0
  691. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-311.pyc +0 -0
  692. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-38.pyc +0 -0
  693. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-39.pyc +0 -0
  694. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-311.pyc +0 -0
  695. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-39.pyc +0 -0
  696. package/src/plugins/runtime/python/proxy/__pycache__/core_manager.cpython-311.pyc +0 -0
  697. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-310.pyc +0 -0
  698. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-311.pyc +0 -0
  699. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-38.pyc +0 -0
  700. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-39.pyc +0 -0
  701. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-310.pyc +0 -0
  702. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-311.pyc +0 -0
  703. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-38.pyc +0 -0
  704. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-39.pyc +0 -0
  705. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-310.pyc +0 -0
  706. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-311.pyc +0 -0
  707. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-38.pyc +0 -0
  708. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-39.pyc +0 -0
  709. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-310.pyc +0 -0
  710. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-311.pyc +0 -0
  711. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-38.pyc +0 -0
  712. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-39.pyc +0 -0
  713. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-310.pyc +0 -0
  714. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-311.pyc +0 -0
  715. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-38.pyc +0 -0
  716. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-39.pyc +0 -0
  717. package/src/plugins/runtime/python/proxy/camera_device.py +1732 -0
  718. package/src/plugins/runtime/python/proxy/core_manager.py +126 -0
  719. package/src/plugins/runtime/python/proxy/device_manager.py +197 -0
  720. package/src/plugins/runtime/python/schema.py +99 -0
  721. package/src/plugins/runtime/python/storage.py +353 -0
  722. package/src/plugins/runtime/python/storage_controller.py +102 -0
  723. package/src/plugins/runtime/python/typings.py +195 -0
  724. package/src/plugins/schema.ts +472 -0
  725. package/src/plugins/types.ts +60 -0
  726. package/src/plugins/worker.ts +250 -0
  727. package/src/rpc/index.ts +149 -0
  728. package/src/rpc/namespaces.ts +79 -0
  729. package/src/rpc/server.ts +422 -0
  730. package/src/rpc/types.ts +119 -0
  731. package/src/rpc/utils.ts +16 -0
  732. package/src/services/config/constants.ts +47 -0
  733. package/src/services/config/defaults.ts +57 -0
  734. package/src/services/config/index.ts +744 -0
  735. package/src/services/config/types.ts +211 -0
  736. package/src/services/logger/index.ts +96 -0
  737. package/src/types.ts +47 -0
  738. package/src/utils/path.ts +16 -0
  739. package/src/utils/pythonInstaller.ts +597 -0
  740. package/tsconfig.json +37 -0
  741. package/types/fastify.d.ts +14 -0
  742. package/updates.config.js +3 -0
  743. package/dist/interface/@intlify.Do1-T-x0.0.0.48.js +0 -15
  744. package/dist/interface/@mdi.CbjpODVZ.0.0.48.js +0 -1
  745. package/dist/interface/@tanstack.B7j0RsPf.0.0.48.js +0 -1
  746. package/dist/interface/@vue.DRcZ6uZO.0.0.48.js +0 -17
  747. package/dist/interface/@vueform.B6V1sb13.0.0.48.js +0 -1
  748. package/dist/interface/@vueuse.C65DwZuy.0.0.48.js +0 -1
  749. package/dist/interface/Account.SjrtJ2E-.0.0.48.js +0 -1
  750. package/dist/interface/Adminpanel.2cW-TEJR.0.0.48.js +0 -2
  751. package/dist/interface/Appearance.BCjcy9_6.0.0.48.js +0 -1
  752. package/dist/interface/Backup.DPajlOJy.0.0.48.js +0 -1
  753. package/dist/interface/Camera.DL2k_Ka4.0.0.48.js +0 -1
  754. package/dist/interface/Cameras.Dfo9jtEF.0.0.48.js +0 -1
  755. package/dist/interface/Camview.D65EW1lh.0.0.48.js +0 -1
  756. package/dist/interface/Config.CN7-dqYR.0.0.48.js +0 -1
  757. package/dist/interface/Console.CR82nS2O.0.0.48.js +0 -4
  758. package/dist/interface/FirstSteps.CB5GkCCn.0.0.48.js +0 -1
  759. package/dist/interface/NewCamera.DZmwbpbF.0.0.48.js +0 -448
  760. package/dist/interface/Plugin.CFkM1eRw.0.0.48.js +0 -1
  761. package/dist/interface/Plugins.LYJU4g0H.0.0.48.js +0 -1
  762. package/dist/interface/Recordings.BxmCtPDw.0.0.48.js +0 -1
  763. package/dist/interface/Recordings.UIpgTeCh.0.0.48.js +0 -1
  764. package/dist/interface/Settings.BxGxkxQ-.0.0.48.js +0 -1
  765. package/dist/interface/System.HucLWbQx.0.0.48.js +0 -4
  766. package/dist/interface/User.BB8i1tjm.0.0.48.js +0 -1
  767. package/dist/interface/VConfigEditor.vue_vue_type_script_setup_true_lang._4BVZ2To.0.0.48.js +0 -2
  768. package/dist/interface/VConsole.wv8VCqg-.0.0.48.js +0 -1
  769. package/dist/interface/VPlayer.DyeXezbn.0.0.48.js +0 -4
  770. package/dist/interface/VPluginCard.B_Gjjpzq.0.0.48.js +0 -4
  771. package/dist/interface/ace-builds.DPqPJOIH.0.0.48.js +0 -970
  772. package/dist/interface/apexcharts.C_nN6CT2.0.0.48.js +0 -838
  773. package/dist/interface/assets/@vueform.0.0.48.CroAHJs8.css +0 -1
  774. package/dist/interface/assets/@xterm.0.0.48.CFbL2ovg.css +0 -32
  775. package/dist/interface/assets/Account.0.0.48.Bnw6Lbtd.css +0 -1
  776. package/dist/interface/assets/Adminpanel.0.0.48.a3t1v3MB.css +0 -1
  777. package/dist/interface/assets/Camera.0.0.48.Br9s6-lM.css +0 -1
  778. package/dist/interface/assets/Cameras.0.0.48.Buf1Dgce.css +0 -1
  779. package/dist/interface/assets/Camview.0.0.48.B7Cja2ry.css +0 -1
  780. package/dist/interface/assets/Config.0.0.48.DNGo2krN.css +0 -1
  781. package/dist/interface/assets/Console.0.0.48.Bh8l9QnM.css +0 -1
  782. package/dist/interface/assets/FirstSteps.0.0.48.Mu8VPl13.css +0 -1
  783. package/dist/interface/assets/NewCamera.0.0.48.B36nuN1T.css +0 -1
  784. package/dist/interface/assets/Plugin.0.0.48.YIpAU1_n.css +0 -1
  785. package/dist/interface/assets/Plugins.0.0.48.DXSoO9M1.css +0 -1
  786. package/dist/interface/assets/Settings.0.0.48.CVmui2kE.css +0 -1
  787. package/dist/interface/assets/User.0.0.48.BiGtIFqt.css +0 -1
  788. package/dist/interface/assets/VConsole.0.0.48.BCqKHpmJ.css +0 -1
  789. package/dist/interface/assets/VPlayer.0.0.48.C4lm2rVR.css +0 -1
  790. package/dist/interface/assets/VPluginCard.0.0.48.C8Lj6X-J.css +0 -1
  791. package/dist/interface/assets/main.0.0.48.OJngntGT.css +0 -1
  792. package/dist/interface/assets/vue3-toastify.0.0.48.DHXAGmwn.css +0 -1
  793. package/dist/interface/assets/vuetify.0.0.48.Dua9WSqa.css +0 -5
  794. package/dist/interface/axios.DIsA03vz.0.0.48.js +0 -6
  795. package/dist/interface/backup.Bk4AzYLT.0.0.48.js +0 -1
  796. package/dist/interface/dnd-core.Dmh1w8XK.0.0.48.js +0 -1
  797. package/dist/interface/engine.io-client.DRzsVXts.0.0.48.js +0 -1
  798. package/dist/interface/fast-deep-equal.BuOg6xuK.0.0.48.js +0 -1
  799. package/dist/interface/fonts/Inter/Inter-Regular.ttf +0 -0
  800. package/dist/interface/highlight.js.Cg6c_cCL.0.0.48.js +0 -2
  801. package/dist/interface/hookable.B8xFkYCm.0.0.48.js +0 -1
  802. package/dist/interface/linkify-it.D_vNtISo.0.0.48.js +0 -1
  803. package/dist/interface/main.mlm94TYK.0.0.48.js +0 -4
  804. package/dist/interface/perfect-debounce.Cp2ysxOb.0.0.48.js +0 -1
  805. package/dist/interface/pinia.BL6apvtP.0.0.48.js +0 -5
  806. package/dist/interface/plugins.Ch_0cv_L.0.0.48.js +0 -1
  807. package/dist/interface/react-dnd-touch-backend.BVVlM5Mg.0.0.48.js +0 -1
  808. package/dist/interface/rxjs.MDPuHaHC.0.0.48.js +0 -3
  809. package/dist/interface/socket.io-client.Bc7OYr1V.0.0.48.js +0 -1
  810. package/dist/interface/socket.io-parser.DPrtWC9i.0.0.48.js +0 -1
  811. package/dist/interface/system.C-onsBEc.0.0.48.js +0 -1
  812. package/dist/interface/types.Cz9TaZAP.0.0.48.js +0 -1
  813. package/dist/interface/utils.mAKpSMLY.0.0.48.js +0 -1
  814. package/dist/interface/uuid.Ch9TGLTe.0.0.48.js +0 -1
  815. package/dist/interface/vee-validate.Dzj4dBd6.0.0.48.js +0 -5
  816. package/dist/interface/vue-i18n.DtBWXzdw.0.0.48.js +0 -5
  817. package/dist/interface/vue-inline-svg.CPcaXOwr.0.0.48.js +0 -1
  818. package/dist/interface/vue-router.S61oR9AT.0.0.48.js +0 -5
  819. package/dist/interface/vue3-apexcharts.Dvg57mTV.0.0.48.js +0 -1
  820. package/dist/interface/vue3-dnd.CA2xeH6p.0.0.48.js +0 -1
  821. package/dist/interface/vue3-toastify.nL-I4C--.0.0.48.js +0 -1
  822. package/dist/interface/vuetify.DlOnqSL1.0.0.48.js +0 -5
  823. package/dist/interface/zod.bkdEMpUp.0.0.48.js +0 -1
  824. package/dist/server/src/api/utils/cameraSource.d.ts +0 -6
  825. package/dist/server/src/api/utils/cameraSource.js +0 -51
  826. package/dist/server/src/api/utils/cameraSource.js.map +0 -1
  827. package/dist/server/src/api/websocket/go2rtc.d.ts +0 -21
  828. package/dist/server/src/api/websocket/go2rtc.js +0 -88
  829. package/dist/server/src/api/websocket/go2rtc.js.map +0 -1
  830. package/dist/server/src/api/websocket/nsp/proxy.d.ts +0 -27
  831. package/dist/server/src/api/websocket/nsp/proxy.js +0 -127
  832. package/dist/server/src/api/websocket/nsp/proxy.js.map +0 -1
  833. package/dist/server/src/nats/index.d.ts +0 -40
  834. package/dist/server/src/nats/index.js +0 -164
  835. package/dist/server/src/nats/index.js.map +0 -1
  836. package/dist/server/src/nats/proxy/cameraDevice.d.ts +0 -22
  837. package/dist/server/src/nats/proxy/cameraDevice.js +0 -249
  838. package/dist/server/src/nats/proxy/cameraDevice.js.map +0 -1
  839. package/dist/server/src/nats/proxy/coreManager.d.ts +0 -14
  840. package/dist/server/src/nats/proxy/coreManager.js +0 -68
  841. package/dist/server/src/nats/proxy/coreManager.js.map +0 -1
  842. package/dist/server/src/nats/proxy/deviceManager.d.ts +0 -14
  843. package/dist/server/src/nats/proxy/deviceManager.js +0 -101
  844. package/dist/server/src/nats/proxy/deviceManager.js.map +0 -1
  845. package/dist/server/src/nats/server.js.map +0 -1
  846. package/dist/server/src/nats/types.d.ts +0 -18
  847. package/dist/server/src/nats/utils.js.map +0 -1
  848. /package/dist/interface/assets/{Backup.0.0.48.CX0rT0QJ.css → SettingsBackup.CX0rT0QJ.0.0.50-internal.0.css} +0 -0
  849. /package/dist/interface/assets/{highlight.0.0.48.Ch2EwETz.css → highlight.Ch2EwETz.0.0.50-internal.0.css} +0 -0
  850. /package/dist/interface/assets/{logo-256.0.0.48.BCQk9H1-.png → logo-256.BCQk9H1-.0.0.50-internal.0.png} +0 -0
  851. /package/dist/interface/assets/{logo-512.0.0.48.DLKVOU2S.png → logo-512.DLKVOU2S.0.0.50-internal.0.png} +0 -0
  852. /package/dist/interface/assets/{logo.0.0.48.DmEiRk0z.png → logo.DmEiRk0z.0.0.50-internal.0.png} +0 -0
  853. /package/dist/interface/assets/{mode-json.0.0.48.Br7xisR1.js → mode-json.Br7xisR1.0.0.50-internal.0.js} +0 -0
  854. /package/dist/interface/assets/{mode-yaml.0.0.48.CIYL8U3d.js → mode-yaml.CIYL8U3d.0.0.50-internal.0.js} +0 -0
  855. /package/dist/interface/{@babel.l0sNRNKZ.0.0.48.js → js/@babel.l0sNRNKZ.0.0.50-internal.0.js} +0 -0
  856. /package/dist/interface/{@react-dnd.CcwRs9xb.0.0.48.js → js/@react-dnd.CcwRs9xb.0.0.50-internal.0.js} +0 -0
  857. /package/dist/interface/{@socket.io.Dkula2eQ.0.0.48.js → js/@socket.io.Dkula2eQ.0.0.50-internal.0.js} +0 -0
  858. /package/dist/interface/{birpc.l0sNRNKZ.0.0.48.js → js/birpc.l0sNRNKZ.0.0.50-internal.0.js} +0 -0
  859. /package/dist/interface/{compare-versions.DqEOhma6.0.0.48.js → js/compare-versions.DqEOhma6.0.0.50-internal.0.js} +0 -0
  860. /package/dist/interface/{dijkstrajs.C00ieaqj.0.0.48.js → js/dijkstrajs.C00ieaqj.0.0.50-internal.0.js} +0 -0
  861. /package/dist/interface/{engine.io-parser.BiEtp6m2.0.0.48.js → js/engine.io-parser.BiEtp6m2.0.0.50-internal.0.js} +0 -0
  862. /package/dist/interface/{entities.C20TfXL6.0.0.48.js → js/entities.C20TfXL6.0.0.50-internal.0.js} +0 -0
  863. /package/dist/interface/{ev-emitter.X5f1qa-c.0.0.48.js → js/ev-emitter.X5f1qa-c.0.0.50-internal.0.js} +0 -0
  864. /package/dist/interface/{get-size.D1dS-IaP.0.0.48.js → js/get-size.D1dS-IaP.0.0.50-internal.0.js} +0 -0
  865. /package/dist/interface/{vue.l0sNRNKZ.0.0.48.js → js/hookable.l0sNRNKZ.0.0.50-internal.0.js} +0 -0
  866. /package/dist/interface/{mdurl.k9Sl0PQj.0.0.48.js → js/mdurl.k9Sl0PQj.0.0.50-internal.0.js} +0 -0
  867. /package/dist/interface/{punycode.js.Dj65hjkv.0.0.48.js → js/punycode.js.Dj65hjkv.0.0.50-internal.0.js} +0 -0
  868. /package/dist/interface/{react-dnd-html5-backend.1HQjlkwI.0.0.48.js → js/react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.0.js} +0 -0
  869. /package/dist/interface/{redux.BFxtlG_c.0.0.48.js → js/redux.BFxtlG_c.0.0.50-internal.0.js} +0 -0
  870. /package/dist/interface/{tslib.9k7AwCpt.0.0.48.js → js/tslib.9k7AwCpt.0.0.50-internal.0.js} +0 -0
  871. /package/dist/interface/{uc.micro.kMc2yuuw.0.0.48.js → js/uc.micro.kMc2yuuw.0.0.50-internal.0.js} +0 -0
  872. /package/dist/server/src/{nats → decoder}/types.js +0 -0
  873. /package/dist/server/src/{nats → rpc}/utils.js +0 -0
@@ -0,0 +1,1360 @@
1
+ from abc import ABCMeta, abstractmethod
2
+ from collections.abc import AsyncGenerator, Awaitable, Coroutine
3
+ from enum import Enum
4
+ from typing import Any, Callable, Generic, Optional, Union, overload, runtime_checkable
5
+
6
+ from PIL import Image
7
+ from typing_extensions import Literal, NotRequired, Protocol, TypedDict, TypeVar
8
+
9
+ from .hybrid_observer import HybridObservable
10
+
11
+ # Literals
12
+ FrameType = Literal["stream", "motion"]
13
+ CameraType = Literal["camera", "doorbell"]
14
+ ZoneType = Literal["intersect", "contain"]
15
+ ZoneFilter = Literal["include", "exclude"]
16
+ ObjectClass = Literal["person", "vehicle", "animal", "motion", "other"]
17
+ CameraRole = Literal["high-resolution", "mid-resolution", "low-resolution", "snapshot"]
18
+ StreamingRole = Literal["high-resolution", "mid-resolution", "low-resolution"]
19
+ VideoStreamingMode = Literal["auto", "webrtc", "mse", "webrtc/tcp"]
20
+ CameraAspectRatio = Literal["16:9", "8:3", "4:3", "auto"]
21
+ DecoderFormat = Literal["yuv420p", "rgb24", "nv12"]
22
+ ImageInputFormat = Literal["yuv420p", "nv12", "rgb", "rgba", "gray"]
23
+ ImageOutputFormat = Literal["rgb", "rgba", "gray"]
24
+ CameraExtension = Literal[
25
+ "cameraController", "hub", "motionDetection", "objectDetection", "audioDetection", "ptz"
26
+ ]
27
+ CameraFrameWorkerDecoder = Literal["pillow", "wasm", "rust", "gpu"]
28
+ CameraFrameWorkerResolution = Literal[
29
+ "640x480",
30
+ "640x360",
31
+ "320x240",
32
+ "320x180",
33
+ ]
34
+ AudioCodec = Literal[
35
+ "PCMU", "PCMA", "MPEG4-GENERIC", "opus", "G722", "MPA", "PCM", "FLAC", "ELD", "PCML", "L16"
36
+ ]
37
+ AudioFFmpegCodec = Literal[
38
+ "pcm_mulaw", "pcm_alaw", "aac", "libopus", "g722", "mp3", "pcm_s16be", "pcm_s16le", "flac"
39
+ ]
40
+ VideoCodec = Literal["H264", "H265", "VP8", "VP9", "AV1", "JPEG", "RAW"]
41
+ VideoFFmpegCodec = Literal["h264", "hevc", "vp8", "vp9", "av1", "mjpeg", "rawvideo"]
42
+ PythonVersion = Literal["3.9", "3.10", "3.11", "3.12"]
43
+ StateNames = Literal["light", "motion", "audio", "doorbell", "siren", "battery", "object"]
44
+ # See Camera
45
+ CameraPublicProperties = Literal[
46
+ "_id",
47
+ "nativeId",
48
+ "pluginId",
49
+ "name",
50
+ "disabled",
51
+ "isCloud",
52
+ "hasLight",
53
+ "hasSiren",
54
+ "hasBinarySensor",
55
+ "hasMotionDetection",
56
+ "hasObjectDetection",
57
+ "hasAudioDetection",
58
+ "hasPtz",
59
+ "hasBattery",
60
+ "info",
61
+ "type",
62
+ "snapshotTTL",
63
+ "detectionSettings",
64
+ "frameWorkerSettings",
65
+ "interface",
66
+ "recording",
67
+ "extensions",
68
+ "sources",
69
+ "detectionZones",
70
+ ]
71
+ DeviceManagerEventType = Literal[
72
+ "cameraSelected",
73
+ "cameraDeselected",
74
+ ]
75
+ JsonSchemaType = Literal["string", "number", "boolean", "array", "button", "submit"]
76
+ LoggerLevel = Literal["error", "warn", "info", "debug", "trace", "attention", "success"]
77
+ APIEventType = Literal["finishLaunching", "shutdown"]
78
+ PTZMovementType = Literal["absolute", "relative", "continuous", "home", "preset", "stop"]
79
+ RTSPAudioCodec = Literal["aac", "opus", "pcma"]
80
+ ProbeAudioCodec = Literal["aac", "opus", "pcma"]
81
+ HwAccelMethod = Literal[
82
+ "auto", "cuda", "vaapi", "videotoolbox", "qsv", "rkmpp", "v4l2m2m", "opencl", "vulkan", "amf", "jetson"
83
+ ]
84
+
85
+ # Basic types
86
+ Callback = Union[
87
+ Callable[..., Any],
88
+ Callable[..., Coroutine[Any, Any, Any]],
89
+ ]
90
+
91
+ JSONValue = Union[str, int, float, bool, dict[str, Any], list[Any]]
92
+ JSONObject = dict[str, JSONValue]
93
+ JSONArray = list[JSONValue]
94
+ Path = Union[list[Union[int, str]], int, str]
95
+
96
+
97
+ # Interfaces as TypedDict
98
+ class CameraInformation(TypedDict, total=False):
99
+ model: str
100
+ manufacturer: str
101
+ hardware: str
102
+ serialNumber: str
103
+ firmwareVersion: str
104
+ supportUrl: str
105
+
106
+
107
+ Point = tuple[float, float]
108
+ BoundingBox = tuple[float, float, float, float]
109
+
110
+
111
+ class Detection(TypedDict):
112
+ id: NotRequired[str]
113
+ label: ObjectClass
114
+ confidence: float
115
+ boundingBox: BoundingBox
116
+ inputWidth: int
117
+ inputHeight: int
118
+ origWidth: int
119
+ origHeight: int
120
+
121
+
122
+ class DetectionZone(TypedDict):
123
+ name: str
124
+ points: list[Point]
125
+ type: ZoneType
126
+ filter: ZoneFilter
127
+ classes: list[ObjectClass]
128
+ isPrivacyMask: bool
129
+ color: str
130
+
131
+
132
+ class MotionDetectionSettings(TypedDict):
133
+ timeout: int
134
+
135
+
136
+ class ObjectDetectionSettings(TypedDict):
137
+ confidence: float
138
+
139
+
140
+ class CameraDetectionSettings(TypedDict):
141
+ motion: MotionDetectionSettings
142
+ object: ObjectDetectionSettings
143
+
144
+
145
+ class CameraFrameWorkerSettings(TypedDict):
146
+ decoder: CameraFrameWorkerDecoder
147
+ fps: int
148
+ resolution: CameraFrameWorkerResolution
149
+
150
+
151
+ class CameraInput(TypedDict):
152
+ _id: str
153
+ name: str
154
+ role: CameraRole
155
+ useForSnapshot: bool
156
+ hotMode: bool
157
+ urls: "StreamUrls"
158
+
159
+
160
+ class RTPInfo(TypedDict):
161
+ payload: Optional[int]
162
+ codec: str
163
+ rate: Optional[int]
164
+ encoding: Optional[int]
165
+ profile: Optional[str]
166
+ level: Optional[int]
167
+
168
+
169
+ class FMTPInfo(TypedDict):
170
+ payload: int
171
+ config: str
172
+
173
+
174
+ class AudioCodecProperties(TypedDict):
175
+ sampleRate: int
176
+ channels: int
177
+ payloadType: int
178
+ fmtpInfo: Optional[FMTPInfo]
179
+
180
+
181
+ class VideoCodecProperties(TypedDict):
182
+ clockRate: int
183
+ payloadType: int
184
+ fmtpInfo: Optional[FMTPInfo]
185
+
186
+
187
+ class AudioStreamInfo(TypedDict):
188
+ codec: AudioCodec
189
+ ffmpegCodec: AudioFFmpegCodec
190
+ properties: AudioCodecProperties
191
+ direction: Literal["sendonly", "recvonly", "sendrecv", "inactive"]
192
+
193
+
194
+ class VideoStreamInfo(TypedDict):
195
+ codec: VideoCodec
196
+ ffmpegCodec: VideoFFmpegCodec
197
+ properties: VideoCodecProperties
198
+ direction: Literal["sendonly", "recvonly", "sendrecv", "inactive"]
199
+
200
+
201
+ class ProbeConfig(TypedDict, total=False):
202
+ video: bool
203
+ audio: Union[bool, Literal["all"], list[ProbeAudioCodec]]
204
+ microphone: bool
205
+
206
+
207
+ class ProbeStream(TypedDict):
208
+ sdp: str
209
+ audio: list[AudioStreamInfo]
210
+ video: list[VideoStreamInfo]
211
+
212
+
213
+ class StreamUrls(TypedDict):
214
+ ws: "Go2RtcWSSource"
215
+ rtsp: "Go2RtcRTSPSource"
216
+ snapshot: "Go2RtcSnapshotSource"
217
+
218
+
219
+ class Go2RtcWSSource(TypedDict):
220
+ webrtc: str
221
+ mse: str
222
+
223
+
224
+ class Go2RtcRTSPSource(TypedDict):
225
+ base: str
226
+ default: str
227
+ muted: str
228
+ aac: str
229
+ opus: str
230
+ pcma: str
231
+ onvif: str
232
+
233
+
234
+ class Go2RtcSnapshotSource(TypedDict):
235
+ mp4: str
236
+ jpeg: str
237
+ mjpeg: str
238
+
239
+
240
+ T = TypeVar(
241
+ "T",
242
+ bound=Union[
243
+ "LightStateWithoutLastEvent",
244
+ "AudioStateWithoutLastEvent",
245
+ "MotionStateWithoutLastEvent",
246
+ "ObjectStateWithoutLastEvent",
247
+ "SirenStateWithoutLastEvent",
248
+ "BatteryStateWithoutLastEvent",
249
+ "DoorbellStateWithoutLastEvent",
250
+ ],
251
+ )
252
+
253
+
254
+ class BaseState(TypedDict, Generic[T]):
255
+ timestamp: int
256
+ lastEvent: NotRequired[Optional[T]]
257
+
258
+
259
+ class BaseStateWithoutLastEvent(TypedDict):
260
+ timestamp: int
261
+
262
+
263
+ class MotionSetEvent(TypedDict):
264
+ state: bool
265
+ detections: NotRequired[Optional[list[Detection]]]
266
+
267
+
268
+ class AudioSetEvent(TypedDict):
269
+ state: bool
270
+ db: NotRequired[Optional[float]]
271
+
272
+
273
+ class ObjectSetEvent(TypedDict):
274
+ detections: list[Detection]
275
+
276
+
277
+ class LightSetEvent(TypedDict):
278
+ state: bool
279
+
280
+
281
+ class DoorbellSetEvent(TypedDict):
282
+ state: bool
283
+
284
+
285
+ class SirenSetEvent(TypedDict):
286
+ state: bool
287
+ level: NotRequired[Optional[int]]
288
+
289
+
290
+ class BatterySetEvent(TypedDict):
291
+ level: int
292
+ lowBattery: NotRequired[Optional[bool]]
293
+ charging: NotRequired[Optional[bool]]
294
+
295
+
296
+ class LightState(BaseState["LightStateWithoutLastEvent"], LightSetEvent):
297
+ pass
298
+
299
+
300
+ class LightStateWithoutLastEvent(BaseStateWithoutLastEvent, LightSetEvent):
301
+ pass
302
+
303
+
304
+ class MotionState(BaseState["MotionStateWithoutLastEvent"], MotionSetEvent):
305
+ pass
306
+
307
+
308
+ class MotionStateWithoutLastEvent(BaseStateWithoutLastEvent, MotionSetEvent):
309
+ pass
310
+
311
+
312
+ class AudioState(BaseState["AudioStateWithoutLastEvent"], AudioSetEvent):
313
+ pass
314
+
315
+
316
+ class AudioStateWithoutLastEvent(BaseStateWithoutLastEvent, AudioSetEvent):
317
+ pass
318
+
319
+
320
+ class DoorbellState(BaseState["DoorbellStateWithoutLastEvent"], DoorbellSetEvent):
321
+ pass
322
+
323
+
324
+ class DoorbellStateWithoutLastEvent(BaseStateWithoutLastEvent, DoorbellSetEvent):
325
+ pass
326
+
327
+
328
+ class SirenState(BaseState["SirenStateWithoutLastEvent"], SirenSetEvent):
329
+ pass
330
+
331
+
332
+ class SirenStateWithoutLastEvent(BaseStateWithoutLastEvent, SirenSetEvent):
333
+ pass
334
+
335
+
336
+ class ObjectState(BaseState["ObjectStateWithoutLastEvent"], ObjectSetEvent):
337
+ pass
338
+
339
+
340
+ class ObjectStateWithoutLastEvent(BaseStateWithoutLastEvent, ObjectSetEvent):
341
+ pass
342
+
343
+
344
+ class BatteryState(BaseState["BatteryStateWithoutLastEvent"], BatterySetEvent):
345
+ pass
346
+
347
+
348
+ class BatteryStateWithoutLastEvent(BaseStateWithoutLastEvent, BatterySetEvent):
349
+ pass
350
+
351
+
352
+ class StateValues(TypedDict):
353
+ light: LightState
354
+ motion: MotionState
355
+ audio: AudioState
356
+ object: ObjectState
357
+ doorbell: DoorbellState
358
+ siren: SirenState
359
+ battery: BatteryState
360
+
361
+
362
+ class SetValues(TypedDict):
363
+ light: LightSetEvent
364
+ motion: MotionSetEvent
365
+ audio: AudioSetEvent
366
+ object: ObjectSetEvent
367
+ doorbell: DoorbellSetEvent
368
+ siren: SirenSetEvent
369
+ battery: BatterySetEvent
370
+
371
+
372
+ class FrameData(TypedDict):
373
+ data: bytes
374
+ timestamp: int
375
+ metadata: "FrameMetadata"
376
+ info: "ImageInformation"
377
+
378
+
379
+ class FrameMetadata(TypedDict):
380
+ format: DecoderFormat
381
+ frameSize: Union[float, int]
382
+ width: int
383
+ origWidth: int
384
+ height: int
385
+ origHeight: int
386
+
387
+
388
+ class ImageInformation(TypedDict):
389
+ width: int
390
+ height: int
391
+ channels: float
392
+ format: ImageInputFormat
393
+
394
+
395
+ class ImageCrop(TypedDict):
396
+ top: int
397
+ left: int
398
+ width: int
399
+ height: int
400
+
401
+
402
+ class ImageResize(TypedDict):
403
+ width: int
404
+ height: int
405
+
406
+
407
+ class ImageFormat(TypedDict):
408
+ to: ImageOutputFormat
409
+
410
+
411
+ class ImageOptions(TypedDict, total=False):
412
+ format: ImageFormat
413
+ crop: ImageCrop
414
+ resize: ImageResize
415
+
416
+
417
+ class FrameImage(TypedDict):
418
+ image: Image.Image
419
+ info: ImageInformation
420
+
421
+
422
+ class FrameBuffer(TypedDict):
423
+ image: bytes
424
+ info: ImageInformation
425
+
426
+
427
+ class MotionDetectionFrame(TypedDict):
428
+ frame: FrameData
429
+ state: MotionSetEvent
430
+
431
+
432
+ class VideoFrame(Protocol):
433
+ @property
434
+ def data(self) -> bytes: ...
435
+ @property
436
+ def metadata(self) -> FrameMetadata: ...
437
+ @property
438
+ def info(self) -> ImageInformation: ...
439
+ @property
440
+ def timestamp(self) -> int: ...
441
+ @property
442
+ def motion(self) -> Optional[MotionSetEvent]: ...
443
+ @property
444
+ def input_width(self) -> int: ...
445
+ @property
446
+ def input_height(self) -> int: ...
447
+ @property
448
+ def input_format(self) -> DecoderFormat: ...
449
+
450
+ async def to_buffer(self, options: Optional[ImageOptions] = None) -> FrameBuffer: ...
451
+ async def to_image(self, options: Optional[ImageOptions] = None) -> FrameImage: ...
452
+ async def save(self, path: str, options: Optional[ImageOptions] = None) -> None: ...
453
+
454
+
455
+ class CameraInputSettings(TypedDict):
456
+ _id: str
457
+ name: str
458
+ role: CameraRole
459
+ useForSnapshot: bool
460
+ hotMode: bool
461
+ urls: list[str]
462
+
463
+
464
+ class CameraConfigInputSettings(TypedDict):
465
+ name: str
466
+ role: CameraRole
467
+ useForSnapshot: bool
468
+ hotMode: bool
469
+ urls: NotRequired[list[str]]
470
+
471
+
472
+ class BaseCameraConfig(TypedDict):
473
+ name: str
474
+ nativeId: Optional[str]
475
+ isCloud: Optional[bool]
476
+ disabled: Optional[bool]
477
+ info: Optional[CameraInformation]
478
+
479
+
480
+ class CameraConfig(BaseCameraConfig):
481
+ sources: list[CameraConfigInputSettings]
482
+
483
+
484
+ class PartialCameraConfig(BaseCameraConfig, total=False):
485
+ sources: NotRequired[list[CameraConfigInputSettings]]
486
+
487
+
488
+ class RTSPUrlOptions(TypedDict, total=False):
489
+ video: bool
490
+ audio: Union[bool, RTSPAudioCodec, list[RTSPAudioCodec]]
491
+ audioSingleTrack: bool
492
+ backchannel: bool
493
+ timeout: int
494
+
495
+
496
+ class CameraSource(Protocol):
497
+ # from CameraInput
498
+ id: str # _id
499
+ name: str
500
+ role: CameraRole
501
+ useForSnapshot: bool
502
+ hotMode: bool
503
+ urls: StreamUrls
504
+ # end CameraInput
505
+
506
+ async def snapshot(self, force_new: Optional[bool] = None) -> Optional[bytes]: ...
507
+
508
+ async def probe_stream(
509
+ self, probe_config: Optional[ProbeConfig] = None, refresh: Optional[bool] = None
510
+ ) -> Optional[ProbeStream]: ...
511
+
512
+
513
+ class CameraDeviceSource(CameraSource, Protocol):
514
+ def generate_rtsp_url(self, options: RTSPUrlOptions) -> str: ...
515
+ def create_webrtc_session(self, options: "WebRTCConnectionOptions") -> None: ...
516
+ def create_rtsp_session(self, options: "RTSPConnectionOptions") -> None: ...
517
+ def create_fmp4_session(self, options: "FMP4ConnectionOptions") -> None: ...
518
+
519
+
520
+ class WebRTCConnectionOptions(TypedDict, total=False):
521
+ iceServers: list["IceServer"]
522
+
523
+
524
+ class RTSPConnectionOptions(TypedDict, total=False):
525
+ url: str
526
+
527
+
528
+ class FMP4ConnectionOptions(TypedDict, total=False):
529
+ url: str
530
+
531
+
532
+ SpawnInput = Union[str, int]
533
+
534
+
535
+ class FfmpegOptions(TypedDict):
536
+ ffmpegPath: str
537
+ input: Optional[list[SpawnInput]]
538
+ video: Optional[list[SpawnInput]]
539
+ audio: Optional[list[SpawnInput]]
540
+ output: list[SpawnInput]
541
+ logger: Optional[dict[str, Any]]
542
+
543
+
544
+ class ReturnAudioFFmpegOptions(TypedDict):
545
+ ffmpegPath: str
546
+ input: list[SpawnInput]
547
+ logPrefix: Optional[str]
548
+
549
+
550
+ class CameraUiSettings(TypedDict):
551
+ streamingMode: VideoStreamingMode
552
+ streamingSource: Union[StreamingRole, Literal["auto"]]
553
+ aspectRatio: CameraAspectRatio
554
+
555
+
556
+ class CameraRecordingSettings(TypedDict):
557
+ enabled: bool
558
+
559
+
560
+ class Extension(TypedDict):
561
+ id: str
562
+ name: str
563
+
564
+
565
+ class CameraExtensions(TypedDict):
566
+ hub: NotRequired[list[Extension]]
567
+ cameraController: NotRequired[Extension]
568
+ motionDetection: NotRequired[Extension]
569
+ audioDetection: NotRequired[Extension]
570
+ objectDetection: NotRequired[Extension]
571
+ ptz: NotRequired[Extension]
572
+ plugins: list[Extension]
573
+
574
+
575
+ class Camera(TypedDict):
576
+ _id: str
577
+ nativeId: Optional[str]
578
+ pluginId: str
579
+ name: str
580
+ disabled: bool
581
+ isCloud: bool
582
+ info: CameraInformation
583
+ type: CameraType
584
+ snapshotTTL: int
585
+ detectionZones: list[DetectionZone]
586
+ detectionSettings: CameraDetectionSettings
587
+ frameWorkerSettings: CameraFrameWorkerSettings
588
+ interface: CameraUiSettings
589
+ recording: CameraRecordingSettings
590
+ extensions: CameraExtensions
591
+ sources: list[CameraInput]
592
+
593
+
594
+ class CameraDeviceCapability(str, Enum):
595
+ MotionSensor = "MotionSensor"
596
+ MotionDetector = "MotionDetector"
597
+
598
+ AudioSensor = "AudioSensor"
599
+
600
+ ObjectSensor = "ObjectSensor"
601
+ ObjectDetector = "ObjectDetector"
602
+
603
+ Light = "Light"
604
+ Siren = "Siren"
605
+ Doorbell = "Doorbell"
606
+
607
+ Battery = "Battery"
608
+
609
+ PTZ = "PTZ"
610
+ PTZZoom = "PTZZoom"
611
+ PTZHome = "PTZHome"
612
+ PTZPresets = "PTZPresets"
613
+
614
+ Snapshot = "Snapshot"
615
+ StreamUrl = "StreamUrl"
616
+
617
+ Reboot = "Reboot"
618
+
619
+
620
+ class PTZSpeed(TypedDict):
621
+ pan: NotRequired[float]
622
+ tilt: NotRequired[float]
623
+ zoom: NotRequired[float]
624
+
625
+
626
+ class PTZBaseCommand(TypedDict):
627
+ speed: NotRequired[PTZSpeed]
628
+
629
+
630
+ class PTZStopCommand(PTZBaseCommand):
631
+ type: Literal["stop"]
632
+
633
+
634
+ class PTZHomeCommand(PTZBaseCommand):
635
+ type: Literal["home"]
636
+
637
+
638
+ class PTZPresetCommand(PTZBaseCommand):
639
+ type: Literal["preset"]
640
+ preset: str
641
+
642
+
643
+ class PTZMoveCommand(PTZBaseCommand):
644
+ type: Literal["absolute", "relative"]
645
+ pan: NotRequired[float]
646
+ tilt: NotRequired[float]
647
+ zoom: NotRequired[float]
648
+
649
+
650
+ class PTZContinuousMoveCommand(PTZBaseCommand):
651
+ type: Literal["continuous"]
652
+ pan: NotRequired[float]
653
+ tilt: NotRequired[float]
654
+ zoom: NotRequired[float]
655
+ timeout: NotRequired[float]
656
+
657
+
658
+ PTZCommand = Union[PTZHomeCommand, PTZPresetCommand, PTZMoveCommand, PTZContinuousMoveCommand]
659
+
660
+
661
+ class PTZInterface(Protocol):
662
+ async def ptzCommand(self, command: PTZCommand) -> None: ...
663
+
664
+
665
+ class SnapshotInterface(Protocol):
666
+ async def snapshot(self, source_id: str, force_new: Optional[bool] = None) -> Optional[bytes]: ...
667
+
668
+
669
+ class StreamingInterface(Protocol):
670
+ async def streamUrl(self, source_name: str) -> str: ...
671
+
672
+
673
+ StateValue = Union[
674
+ LightState,
675
+ MotionState,
676
+ AudioState,
677
+ DoorbellState,
678
+ SirenState,
679
+ ObjectState,
680
+ BatteryState,
681
+ ]
682
+
683
+ SV = TypeVar("SV", bound=StateValue)
684
+
685
+
686
+ class CameraStateChangedObject(Generic[SV], TypedDict):
687
+ old_state: SV
688
+ new_state: SV
689
+
690
+
691
+ class CameraPropertyObservableObject(TypedDict):
692
+ property: str
693
+ old_state: Any
694
+ new_state: Any
695
+
696
+
697
+ class CameraCapabilitiesObservableObject(TypedDict):
698
+ old_capabilities: list[CameraDeviceCapability]
699
+ new_capabilities: list[CameraDeviceCapability]
700
+
701
+
702
+ class CameraConfigInputSettingsPartial(TypedDict, total=False):
703
+ # _id: str
704
+ name: str
705
+ role: CameraRole
706
+ useForSnapshot: bool
707
+ hotMode: bool
708
+ urls: list[str]
709
+
710
+
711
+ @runtime_checkable
712
+ class CameraDevice(Protocol):
713
+ @property
714
+ def id(self) -> str: ...
715
+ @property
716
+ def native_id(self) -> Optional[str]: ...
717
+ @property
718
+ def plugin_id(self) -> str: ...
719
+ @property
720
+ def connected(self) -> bool: ...
721
+ @property
722
+ def frameworker_connected(self) -> bool: ...
723
+ @property
724
+ def disabled(self) -> bool: ...
725
+ @property
726
+ def name(self) -> str: ...
727
+ @property
728
+ def type(self) -> CameraType: ...
729
+ @property
730
+ def snapshot_ttl(self) -> int: ...
731
+ @property
732
+ def info(self) -> CameraInformation: ...
733
+ @property
734
+ def is_cloud(self) -> bool: ...
735
+ @property
736
+ def has_light(self) -> bool: ...
737
+ @property
738
+ def has_siren(self) -> bool: ...
739
+ @property
740
+ def has_doorbell(self) -> bool: ...
741
+ @property
742
+ def has_battery(self) -> bool: ...
743
+ @property
744
+ def has_motion_detector(self) -> bool: ...
745
+ @property
746
+ def has_audio_detector(self) -> bool: ...
747
+ @property
748
+ def has_object_detector(self) -> bool: ...
749
+ @property
750
+ def has_ptz(self) -> bool: ...
751
+ @property
752
+ def detection_zones(self) -> list[DetectionZone]: ...
753
+ @property
754
+ def detection_settings(self) -> CameraDetectionSettings: ...
755
+ @property
756
+ def frameworker_settings(self) -> CameraFrameWorkerSettings: ...
757
+
758
+ @property
759
+ def sources(self) -> list[CameraDeviceSource]: ...
760
+ @property
761
+ def stream_source(self) -> CameraDeviceSource: ...
762
+ @property
763
+ def high_resolution_source(self) -> Optional[CameraDeviceSource]: ...
764
+ @property
765
+ def mid_resolution_source(self) -> Optional[CameraDeviceSource]: ...
766
+ @property
767
+ def low_resolution_source(self) -> Optional[CameraDeviceSource]: ...
768
+ @property
769
+ def snapshot_source(self) -> Optional[CameraSource]: ...
770
+
771
+ on_connected: HybridObservable[bool]
772
+ on_frameworker_connected: HybridObservable[bool]
773
+
774
+ on_light_switched: HybridObservable[LightState]
775
+ on_motion_detected: HybridObservable[MotionState]
776
+ on_audio_detected: HybridObservable[AudioState]
777
+ on_object_detected: HybridObservable[ObjectState]
778
+ on_doorbell_pressed: HybridObservable[DoorbellState]
779
+ on_siren_detected: HybridObservable[SirenState]
780
+ on_battery_changed: HybridObservable[BatteryState]
781
+
782
+ logger: "LoggerService"
783
+
784
+ @overload
785
+ def on_state_change(
786
+ self, state_name: Literal["light"]
787
+ ) -> HybridObservable[CameraStateChangedObject[LightState]]: ...
788
+ @overload
789
+ def on_state_change(
790
+ self, state_name: Literal["motion"]
791
+ ) -> HybridObservable[CameraStateChangedObject[MotionState]]: ...
792
+ @overload
793
+ def on_state_change(
794
+ self, state_name: Literal["audio"]
795
+ ) -> HybridObservable[CameraStateChangedObject[AudioState]]: ...
796
+ @overload
797
+ def on_state_change(
798
+ self, state_name: Literal["doorbell"]
799
+ ) -> HybridObservable[CameraStateChangedObject[DoorbellState]]: ...
800
+ @overload
801
+ def on_state_change(
802
+ self, state_name: Literal["siren"]
803
+ ) -> HybridObservable[CameraStateChangedObject[SirenState]]: ...
804
+ @overload
805
+ def on_state_change(
806
+ self, state_name: Literal["battery"]
807
+ ) -> HybridObservable[CameraStateChangedObject[BatteryState]]: ...
808
+ @overload
809
+ def on_state_change(
810
+ self, state_name: Literal["object"]
811
+ ) -> HybridObservable[CameraStateChangedObject[ObjectState]]: ...
812
+ def on_state_change(self, state_name: Any) -> Any: ...
813
+
814
+ def on_property_change(
815
+ self, property: Union[CameraPublicProperties, list[CameraPublicProperties]]
816
+ ) -> HybridObservable[CameraPropertyObservableObject]: ...
817
+
818
+ def on_capabilities_change(self) -> HybridObservable[CameraCapabilitiesObservableObject]: ...
819
+
820
+ @overload
821
+ def get_value(self, state_name: Literal["light"]) -> LightState: ...
822
+ @overload
823
+ def get_value(self, state_name: Literal["motion"]) -> MotionState: ...
824
+ @overload
825
+ def get_value(self, state_name: Literal["audio"]) -> AudioState: ...
826
+ @overload
827
+ def get_value(self, state_name: Literal["object"]) -> ObjectState: ...
828
+ @overload
829
+ def get_value(self, state_name: Literal["doorbell"]) -> DoorbellState: ...
830
+ @overload
831
+ def get_value(self, state_name: Literal["siren"]) -> SirenState: ...
832
+ @overload
833
+ def get_value(self, state_name: Literal["battery"]) -> BatteryState: ...
834
+ def get_value(
835
+ self, state_name: Literal["light", "motion", "audio", "object", "doorbell", "siren", "battery"]
836
+ ) -> Union[
837
+ LightState,
838
+ MotionState,
839
+ AudioState,
840
+ ObjectState,
841
+ DoorbellState,
842
+ SirenState,
843
+ BatteryState,
844
+ ]: ...
845
+
846
+ def extend(self, interfaces: Union[PTZInterface, SnapshotInterface, StreamingInterface]) -> None: ...
847
+
848
+ async def connect(self) -> None: ...
849
+ async def disconnect(self) -> None: ...
850
+
851
+ @overload
852
+ def get_frames(
853
+ self, frame_type: Literal["video"], options: Optional[ImageOptions] = None
854
+ ) -> AsyncGenerator[VideoFrame, None]: ...
855
+ @overload
856
+ def get_frames(
857
+ self, frame_type: Literal["motion"], options: Optional[ImageOptions] = None
858
+ ) -> AsyncGenerator[VideoFrame, None]: ...
859
+
860
+ @overload
861
+ async def update_state(
862
+ self,
863
+ state_name: Literal["light"],
864
+ event_data: LightSetEvent,
865
+ ) -> None: ...
866
+ @overload
867
+ async def update_state(
868
+ self,
869
+ state_name: Literal["motion"],
870
+ event_data: MotionSetEvent,
871
+ frame: Optional[VideoFrame] = None,
872
+ ) -> None: ...
873
+ @overload
874
+ async def update_state(
875
+ self,
876
+ state_name: Literal["audio"],
877
+ event_data: AudioSetEvent,
878
+ ) -> None: ...
879
+ @overload
880
+ async def update_state(
881
+ self,
882
+ state_name: Literal["object"],
883
+ event_data: ObjectSetEvent,
884
+ ) -> None: ...
885
+ @overload
886
+ async def update_state(
887
+ self,
888
+ state_name: Literal["doorbell"],
889
+ event_data: DoorbellSetEvent,
890
+ ) -> None: ...
891
+ @overload
892
+ async def update_state(
893
+ self,
894
+ state_name: Literal["siren"],
895
+ event_data: SirenSetEvent,
896
+ ) -> None: ...
897
+ @overload
898
+ async def update_state(
899
+ self,
900
+ state_name: Literal["battery"],
901
+ event_data: BatterySetEvent,
902
+ ) -> None: ...
903
+
904
+ def get_capabilities(self) -> list[CameraDeviceCapability]: ...
905
+ def has_capability(self, capability: CameraDeviceCapability) -> bool: ...
906
+ def add_capabilities(self, capabilities: list[CameraDeviceCapability]) -> None: ...
907
+ def remove_capabilities(self, capabilities: list[CameraDeviceCapability]) -> None: ...
908
+
909
+
910
+ CameraSelectedCallback = Union[
911
+ Callable[[CameraDevice, CameraExtension], None],
912
+ Callable[[CameraDevice, CameraExtension], Coroutine[None, None, None]],
913
+ ]
914
+ CameraDeselectedCallback = Union[
915
+ Callable[[str, CameraExtension], None],
916
+ Callable[[str, CameraExtension], Coroutine[None, None, None]],
917
+ ]
918
+
919
+
920
+ @runtime_checkable
921
+ class DeviceManager(Protocol):
922
+ async def create_camera(self, camera_config: CameraConfig) -> CameraDevice: ...
923
+ async def update_camera(
924
+ self, camera_id_or_name: str, camera_config: PartialCameraConfig
925
+ ) -> CameraDevice: ...
926
+ async def get_camera(self, camera_id_or_name: str) -> Optional[CameraDevice]: ...
927
+ async def remove_camera(self, camera_id_or_name: str) -> None: ...
928
+
929
+ @overload
930
+ def on(self, event: Literal["cameraSelected"], f: CameraSelectedCallback) -> Any: ...
931
+ @overload
932
+ def on(self, event: Literal["cameraDeselected"], f: CameraDeselectedCallback) -> Any: ...
933
+
934
+ @overload
935
+ def once(self, event: Literal["cameraSelected"], f: CameraSelectedCallback) -> Any: ...
936
+ @overload
937
+ def once(self, event: Literal["cameraDeselected"], f: CameraDeselectedCallback) -> Any: ...
938
+
939
+ @overload
940
+ def remove_listener(self, event: Literal["cameraSelected"], f: CameraSelectedCallback) -> None: ...
941
+ @overload
942
+ def remove_listener(self, event: Literal["cameraDeselected"], f: CameraDeselectedCallback) -> None: ...
943
+
944
+ def remove_all_listeners(self, event: Optional[DeviceManagerEventType] = None) -> None: ...
945
+
946
+
947
+ @runtime_checkable
948
+ class CoreManager(Protocol):
949
+ async def connect_to_plugin(self, plugin_name: str) -> "Optional[CuiPlugin]": ...
950
+ async def get_ffmpeg_path(self) -> str: ...
951
+ async def get_hwaccel_info(self, options: "HWAccelOptions") -> "list[FfmpegArgs]": ...
952
+ async def get_server_addresses(self) -> list[str]: ...
953
+ async def get_ice_servers(self) -> list["IceServer"]: ...
954
+
955
+
956
+ class HWAccelScale(TypedDict):
957
+ width: int
958
+ height: int
959
+
960
+
961
+ class HWAccelOptions(TypedDict):
962
+ targetCodec: Union[Literal["h264"], Literal["h265"]]
963
+ keepOnHardware: NotRequired[Optional[bool]]
964
+ pixelFormat: NotRequired[Optional[str]]
965
+ scale: NotRequired[Optional[HWAccelScale]]
966
+
967
+
968
+ class FfmpegArgs(TypedDict):
969
+ codec: str
970
+ hwaccel: HwAccelMethod
971
+ hwaccelArgs: list[str]
972
+ hwaccelFilters: list[str]
973
+ hwDeviceArgs: list[str]
974
+ supported: bool
975
+
976
+
977
+ class IceServer(TypedDict):
978
+ urls: list[str]
979
+ username: Optional[str]
980
+ credential: Optional[str]
981
+
982
+
983
+ # Schema related types and interfaces
984
+ PluginConfig = dict[str, Any]
985
+
986
+ J = TypeVar("J", bound=Union[str, list[str], float, list[float], bool, list[bool], Any])
987
+
988
+
989
+ class JsonFactorySchema(TypedDict):
990
+ key: str
991
+ title: str
992
+ description: str
993
+ group: NotRequired[str]
994
+
995
+
996
+ class JsonBaseSchmaWithoutCallbacks(JsonFactorySchema, Generic[J]):
997
+ hidden: NotRequired[bool]
998
+ required: NotRequired[bool]
999
+ readonly: NotRequired[bool]
1000
+ placeholder: NotRequired[str]
1001
+ defaultValue: NotRequired[J]
1002
+
1003
+
1004
+ class JsonBaseSchema(JsonBaseSchmaWithoutCallbacks[J], Generic[J]):
1005
+ store: NotRequired[bool]
1006
+ onSet: NotRequired[
1007
+ Union[
1008
+ Callable[[Any, Any], None | Any],
1009
+ Callable[[Any, Any], Awaitable[None | Any]],
1010
+ Callable[[Any, Any], Coroutine[Any, Any, None | Any]],
1011
+ ]
1012
+ ]
1013
+ onGet: NotRequired[
1014
+ Union[
1015
+ Callable[..., Union[Any, None]],
1016
+ Callable[..., Awaitable[Union[Any, None]]],
1017
+ Callable[..., Coroutine[Any, Any, Union[Any, None]]],
1018
+ ]
1019
+ ]
1020
+
1021
+
1022
+ class JsonStringSchema(TypedDict):
1023
+ type: Literal["string"]
1024
+ format: NotRequired[
1025
+ Literal["date-time", "date", "time", "email", "uuid", "ipv4", "ipv6", "password", "qrCode", "image"]
1026
+ ]
1027
+ minLength: NotRequired[int]
1028
+ maxLength: NotRequired[int]
1029
+
1030
+
1031
+ class JsonNumberSchema(TypedDict):
1032
+ type: Literal["number"]
1033
+ minimum: NotRequired[int]
1034
+ maximum: NotRequired[int]
1035
+ step: NotRequired[float]
1036
+
1037
+
1038
+ class JsonBooleanSchema(TypedDict):
1039
+ type: Literal["boolean"]
1040
+
1041
+
1042
+ class JsonEnumSchema(TypedDict):
1043
+ type: Literal["string"]
1044
+ enum: list[str]
1045
+ multiple: NotRequired[bool]
1046
+
1047
+
1048
+ class JsonArraySchema(TypedDict):
1049
+ type: Literal["array"]
1050
+ opened: NotRequired[bool]
1051
+ items: "JsonSchemaWithoutCallbacksAndKey"
1052
+
1053
+
1054
+ class JsonSchemaString(JsonBaseSchema[str], JsonStringSchema):
1055
+ pass
1056
+
1057
+
1058
+ class JsonSchemaStringWithoutCallbacks(JsonBaseSchmaWithoutCallbacks[str], JsonStringSchema):
1059
+ pass
1060
+
1061
+
1062
+ class JsonSchemaNumber(JsonBaseSchema[float], JsonNumberSchema):
1063
+ pass
1064
+
1065
+
1066
+ class JsonSchemaNumberWithoutCallbacks(JsonBaseSchmaWithoutCallbacks[float], JsonNumberSchema):
1067
+ pass
1068
+
1069
+
1070
+ class JsonSchemaBoolean(JsonBaseSchema[bool], JsonBooleanSchema):
1071
+ pass
1072
+
1073
+
1074
+ class JsonSchemaBooleanWithoutCallbacks(JsonBaseSchmaWithoutCallbacks[bool], JsonBooleanSchema):
1075
+ pass
1076
+
1077
+
1078
+ class JsonSchemaEnum(JsonBaseSchema[Union[str, list[str]]], JsonEnumSchema):
1079
+ pass
1080
+
1081
+
1082
+ class JsonSchemaEnumWithoutCallbacks(JsonBaseSchmaWithoutCallbacks[Union[str, list[str]]], JsonEnumSchema):
1083
+ pass
1084
+
1085
+
1086
+ class JsonSchemaArray(JsonBaseSchema[Union[list[str], list[float], list[bool]]], JsonArraySchema):
1087
+ pass
1088
+
1089
+
1090
+ class JsonSchemaArrayWithoutCallbacks(
1091
+ JsonBaseSchmaWithoutCallbacks[Union[list[str], list[float], list[bool]]], JsonArraySchema
1092
+ ):
1093
+ pass
1094
+
1095
+
1096
+ class JsonSchemaButton(JsonFactorySchema):
1097
+ type: Literal["button"]
1098
+ color: NotRequired[Literal["success", "info", "warn", "danger"]]
1099
+ onSet: Union[
1100
+ Callable[[Any, Any], None | Any],
1101
+ Callable[[Any, Any], Awaitable[None | Any]],
1102
+ Callable[[Any, Any], Coroutine[Any, Any, None | Any]],
1103
+ ]
1104
+
1105
+
1106
+ class JsonSchemaSubmit(JsonFactorySchema):
1107
+ type: Literal["submit"]
1108
+ color: NotRequired[Literal["success", "info", "warn", "danger"]]
1109
+ onClick: Union[
1110
+ Callable[[Any], "Optional[FormSubmitResponse]"],
1111
+ Callable[[Any], Awaitable["Optional[FormSubmitResponse]"]],
1112
+ Callable[[Any], Coroutine[Any, Any, "Optional[FormSubmitResponse]"]],
1113
+ ]
1114
+
1115
+
1116
+ class JsonSchemaStringWithoutCallbacksAndKey(TypedDict):
1117
+ type: Literal["string"]
1118
+ title: str
1119
+ description: str
1120
+ group: NotRequired[str]
1121
+ hidden: NotRequired[bool]
1122
+ required: NotRequired[bool]
1123
+ readonly: NotRequired[bool]
1124
+ placeholder: NotRequired[str]
1125
+ defaultValue: NotRequired[str]
1126
+ format: NotRequired[
1127
+ Literal["date-time", "date", "time", "email", "uuid", "ipv4", "ipv6", "password", "qrCode", "image"]
1128
+ ]
1129
+ minLength: NotRequired[int]
1130
+ maxLength: NotRequired[int]
1131
+
1132
+
1133
+ class JsonSchemaNumberWithoutCallbacksAndKey(TypedDict):
1134
+ type: Literal["number"]
1135
+ title: str
1136
+ description: str
1137
+ group: NotRequired[str]
1138
+ hidden: NotRequired[bool]
1139
+ required: NotRequired[bool]
1140
+ readonly: NotRequired[bool]
1141
+ placeholder: NotRequired[str]
1142
+ defaultValue: NotRequired[float]
1143
+ minimum: NotRequired[int]
1144
+ maximum: NotRequired[int]
1145
+ step: NotRequired[float]
1146
+
1147
+
1148
+ class JsonSchemaBooleanWithoutCallbacksAndKey(TypedDict):
1149
+ type: Literal["boolean"]
1150
+ title: str
1151
+ description: str
1152
+ group: NotRequired[str]
1153
+ hidden: NotRequired[bool]
1154
+ required: NotRequired[bool]
1155
+ readonly: NotRequired[bool]
1156
+ placeholder: NotRequired[str]
1157
+ defaultValue: NotRequired[bool]
1158
+
1159
+
1160
+ class JsonSchemaEnumWithoutCallbacksAndKey(TypedDict):
1161
+ type: Literal["string"]
1162
+ title: str
1163
+ description: str
1164
+ group: NotRequired[str]
1165
+ hidden: NotRequired[bool]
1166
+ required: NotRequired[bool]
1167
+ readonly: NotRequired[bool]
1168
+ placeholder: NotRequired[str]
1169
+ defaultValue: NotRequired[Union[str, list[str]]]
1170
+ enum: list[str]
1171
+ multiple: NotRequired[bool]
1172
+
1173
+
1174
+ class JsonSchemaArrayWithoutCallbacksAndKey(TypedDict):
1175
+ type: Literal["array"]
1176
+ title: str
1177
+ description: str
1178
+ group: NotRequired[str]
1179
+ hidden: NotRequired[bool]
1180
+ required: NotRequired[bool]
1181
+ readonly: NotRequired[bool]
1182
+ placeholder: NotRequired[str]
1183
+ defaultValue: NotRequired[Union[list[str], list[float], list[bool]]]
1184
+ opened: NotRequired[bool]
1185
+ items: "JsonSchemaWithoutCallbacksAndKey"
1186
+
1187
+
1188
+ JsonSchema = Union[
1189
+ JsonSchemaString,
1190
+ JsonSchemaNumber,
1191
+ JsonSchemaBoolean,
1192
+ JsonSchemaEnum,
1193
+ JsonSchemaArray,
1194
+ JsonSchemaButton,
1195
+ JsonSchemaSubmit,
1196
+ ]
1197
+
1198
+ JsonSchemaWithoutCallbacks = Union[
1199
+ JsonSchemaStringWithoutCallbacks,
1200
+ JsonSchemaNumberWithoutCallbacks,
1201
+ JsonSchemaBooleanWithoutCallbacks,
1202
+ JsonSchemaEnumWithoutCallbacks,
1203
+ JsonSchemaArrayWithoutCallbacks,
1204
+ ]
1205
+
1206
+ JsonSchemaWithoutCallbacksAndKey = Union[
1207
+ JsonSchemaStringWithoutCallbacksAndKey,
1208
+ JsonSchemaNumberWithoutCallbacksAndKey,
1209
+ JsonSchemaBooleanWithoutCallbacksAndKey,
1210
+ JsonSchemaEnumWithoutCallbacksAndKey,
1211
+ JsonSchemaArrayWithoutCallbacksAndKey,
1212
+ ]
1213
+
1214
+
1215
+ class ToastMessage(TypedDict):
1216
+ type: Literal["info", "success", "warning", "error"]
1217
+ message: str
1218
+
1219
+
1220
+ class FormSubmitSchema(TypedDict):
1221
+ config: dict[str, Any]
1222
+
1223
+
1224
+ class FormSubmitResponse(TypedDict, total=False):
1225
+ toast: NotRequired[ToastMessage]
1226
+ schema: NotRequired[list[JsonSchemaWithoutCallbacks]]
1227
+
1228
+
1229
+ class SchemaConfig(TypedDict):
1230
+ schema: list[JsonSchema]
1231
+ config: dict[str, Any]
1232
+
1233
+
1234
+ # Plugin related interfaces
1235
+ class ImageMetadata(TypedDict):
1236
+ width: int
1237
+ height: int
1238
+
1239
+
1240
+ class AudioMetadata(TypedDict):
1241
+ mimeType: Literal["audio/mpeg", "audio/wav", "audio/ogg"]
1242
+
1243
+
1244
+ class MotionDetectionPluginResponse(TypedDict):
1245
+ videoData: bytes
1246
+
1247
+
1248
+ class ObjectDetectionPluginResponse(TypedDict):
1249
+ detections: list[Detection]
1250
+
1251
+
1252
+ class AudioDetectionPluginResponse(TypedDict):
1253
+ detected: bool
1254
+
1255
+
1256
+ class CuiPluginCapability(str, Enum):
1257
+ MotionDetector = "MotionDetector"
1258
+ ObjectDetector = "ObjectDetector"
1259
+ AudioDetector = "AudioDetector"
1260
+
1261
+
1262
+ class CuiPlugin(metaclass=ABCMeta):
1263
+ @abstractmethod
1264
+ def __init__(self, logger: "LoggerService", api: "PluginAPI") -> None: ...
1265
+ @abstractmethod
1266
+ async def configureCameras(self, cameras: list[CameraDevice]) -> None: ...
1267
+ @abstractmethod
1268
+ async def getCapabilities(self) -> list[CuiPluginCapability]: ...
1269
+
1270
+ async def interfaceSchema(self) -> Optional[list[JsonSchema]]:
1271
+ return None
1272
+
1273
+ async def detectAudio(
1274
+ self, audio_data: bytes, metadata: AudioMetadata, config: dict[str, Any]
1275
+ ) -> Optional[AudioDetectionPluginResponse]:
1276
+ return None
1277
+
1278
+ async def detectMotion(
1279
+ self, video_data: bytes, config: dict[str, Any]
1280
+ ) -> Optional[MotionDetectionPluginResponse]:
1281
+ return None
1282
+
1283
+ async def detectObjects(
1284
+ self, image_data: bytes, metadata: ImageMetadata, config: dict[str, Any]
1285
+ ) -> Optional[ObjectDetectionPluginResponse]:
1286
+ return None
1287
+
1288
+
1289
+ @runtime_checkable
1290
+ class LoggerService(Protocol):
1291
+ def log(self, *args: Any) -> None: ...
1292
+ def error(self, *args: Any) -> None: ...
1293
+ def warn(self, *args: Any) -> None: ...
1294
+ def debug(self, *args: Any) -> None: ...
1295
+ def trace(self, *args: Any) -> None: ...
1296
+ def attention(self, *args: Any) -> None: ...
1297
+ def success(self, *args: Any) -> None: ...
1298
+
1299
+
1300
+ PA = TypeVar("PA", bound="DeviceStorage[Any]", default="DeviceStorage[Any]")
1301
+
1302
+
1303
+ @runtime_checkable
1304
+ class PluginAPI(Protocol):
1305
+ core_manager: CoreManager
1306
+ device_manager: DeviceManager
1307
+ storage_controller: "StorageController"
1308
+ storage_path: str
1309
+
1310
+ def on(self, event: APIEventType, f: Callback) -> Any: ...
1311
+ def once(self, event: APIEventType, f: Callback) -> Any: ...
1312
+ def remove_listener(self, event: APIEventType, f: Callback) -> None: ...
1313
+ def remove_all_listeners(self, event: Optional[APIEventType] = None) -> None: ...
1314
+
1315
+
1316
+ V1 = TypeVar("V1", default=str)
1317
+ V2 = TypeVar("V2", default=dict[str, Any])
1318
+
1319
+
1320
+ @runtime_checkable
1321
+ class DeviceStorage(Protocol, Generic[V2]):
1322
+ values: V2
1323
+ schemas: list[JsonSchema]
1324
+
1325
+ @overload
1326
+ async def getValue(self, key: str) -> Union[V1, None]: ...
1327
+ @overload
1328
+ async def getValue(self, key: str, default_value: V1) -> V1: ...
1329
+ async def getValue(self, key: str, default_value: Optional[V1] = None) -> Union[V1, None]: ...
1330
+ async def setValue(self, path: str, new_value: Any) -> None: ...
1331
+ async def submitValue(self, key: str, new_value: Any) -> Union[FormSubmitResponse, None]: ...
1332
+ def hasValue(self, key: str) -> bool: ...
1333
+ async def getConfig(self) -> SchemaConfig: ...
1334
+ async def setConfig(self, new_config: V2) -> None: ...
1335
+ async def addSchema(self, schema: JsonSchema) -> None: ...
1336
+ def removeSchema(self, key: str) -> None: ...
1337
+ async def changeSchema(self, key: str, new_schema: dict[str, Any]) -> None: ...
1338
+ def getSchema(self, key: str) -> Optional[JsonSchema]: ...
1339
+ def hasSchema(self, key: str) -> bool: ...
1340
+ def save(self) -> None: ...
1341
+
1342
+
1343
+ S = TypeVar("S", default=DeviceStorage[Any], covariant=True)
1344
+
1345
+
1346
+ @runtime_checkable
1347
+ class StorageController(Protocol[S]):
1348
+ def create_camera_storage(
1349
+ self,
1350
+ instance: Any,
1351
+ camera_id: str,
1352
+ schemas: Optional[list[JsonSchema]] = None,
1353
+ ) -> S: ...
1354
+ def create_plugin_storage(
1355
+ self,
1356
+ instance: Any,
1357
+ schemas: Optional[list[JsonSchema]] = None,
1358
+ ) -> S: ...
1359
+ def get_camera_storage(self, camera_id: str) -> Optional[S]: ...
1360
+ def get_plugin_storage(self) -> Optional[S]: ...