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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (605) hide show
  1. package/dist/interface/assets/@xterm.DYP7pi_n.0.0.50-internal.1.css +32 -0
  2. package/dist/interface/assets/Adminpanel.BKek2EMH.0.0.50-internal.1.css +1 -0
  3. package/dist/interface/assets/Cameras.BDWZJqPN.0.0.50-internal.1.css +1 -0
  4. package/dist/interface/assets/Camview.BFUFMoNX.0.0.50-internal.1.css +1 -0
  5. package/dist/interface/assets/CuiConsole.DCYyxdVg.0.0.50-internal.1.css +1 -0
  6. package/dist/interface/assets/CuiPluginCard.yF8V0SZY.0.0.50-internal.1.css +1 -0
  7. package/dist/interface/assets/CuiTimeline.BkIwlYtw.0.0.50-internal.1.css +1 -0
  8. package/dist/interface/assets/Plugin.DJElsAn5.0.0.50-internal.1.css +1 -0
  9. package/dist/interface/assets/Plugins.0h77qnmN.0.0.50-internal.1.css +1 -0
  10. package/dist/interface/assets/Settings.CkgfRkQr.0.0.50-internal.1.css +1 -0
  11. package/dist/interface/assets/SettingsAccount.DeFul3eQ.0.0.50-internal.1.css +1 -0
  12. package/dist/interface/assets/main.Cip9LkS3.0.0.50-internal.1.css +1 -0
  13. package/dist/interface/assets/worker-base.jEXLGV2h.0.0.50-internal.1.js +1332 -0
  14. package/dist/interface/assets/worker-json.DgwNIOck.0.0.50-internal.1.js +1626 -0
  15. package/dist/interface/assets/worker-yaml.B3uUYINB.0.0.50-internal.1.js +5819 -0
  16. package/dist/interface/fonts/InterVariable.woff2 +0 -0
  17. package/dist/interface/index.html +48 -38
  18. package/dist/interface/js/@intlify.BkGPX90O.0.0.50-internal.1.js +15 -0
  19. package/dist/interface/js/@kurkle.D8fDXNIl.0.0.50-internal.1.js +6 -0
  20. package/dist/interface/js/@primeuix.BFAY2Bk9.0.0.50-internal.1.js +5722 -0
  21. package/dist/interface/js/@primevue.CiB2EGly.0.0.50-internal.1.js +57 -0
  22. package/dist/interface/js/@tanstack.DxMw_rJn.0.0.50-internal.1.js +1 -0
  23. package/dist/interface/{@vee-validate.DHkwupr6.0.0.49.js → js/@vee-validate.RxZ3hn6V.0.0.50-internal.1.js} +2 -2
  24. package/dist/interface/js/@vue.B5vqhCp2.0.0.50-internal.1.js +17 -0
  25. package/dist/interface/js/@vueuse.C-k73ACm.0.0.50-internal.1.js +1 -0
  26. package/dist/interface/{@xterm.D6R4zI7m.0.0.49.js → js/@xterm.DIUBesyz.0.0.50-internal.1.js} +8 -8
  27. package/dist/interface/js/Adminpanel.DumNu6GD.0.0.50-internal.1.js +1 -0
  28. package/dist/interface/js/Camera.BuosoqFl.0.0.50-internal.1.js +1 -0
  29. package/dist/interface/js/Cameras.A7NJflGG.0.0.50-internal.1.js +482 -0
  30. package/dist/interface/js/Cammesh.Dv3C0UiR.0.0.50-internal.1.js +1 -0
  31. package/dist/interface/js/Camview.GgjJp7JR.0.0.50-internal.1.js +1 -0
  32. package/dist/interface/js/Config.BL3L-BFE.0.0.50-internal.1.js +2 -0
  33. package/dist/interface/js/Console.CxwRmUVF.0.0.50-internal.1.js +4 -0
  34. package/dist/interface/js/CuiConsole.D16kkT6R.0.0.50-internal.1.js +1 -0
  35. package/dist/interface/js/CuiPluginCard.Bkp__d8n.0.0.50-internal.1.js +4 -0
  36. package/dist/interface/js/CuiTimeline.C9HKvo0G.0.0.50-internal.1.js +1 -0
  37. package/dist/interface/js/FirstSteps.QuJjtAtF.0.0.50-internal.1.js +1 -0
  38. package/dist/interface/js/Plugin.BLUUbEej.0.0.50-internal.1.js +1 -0
  39. package/dist/interface/js/Plugins.DviCIk7w.0.0.50-internal.1.js +1 -0
  40. package/dist/interface/js/Recordings.Dsp07cHs.0.0.50-internal.1.js +1 -0
  41. package/dist/interface/js/Settings.Clx4y9gP.0.0.50-internal.1.js +1 -0
  42. package/dist/interface/js/SettingsAccount.cfY4-PYd.0.0.50-internal.1.js +1 -0
  43. package/dist/interface/js/SettingsAppearance.CBGZAazb.0.0.50-internal.1.js +1 -0
  44. package/dist/interface/js/SettingsAppearance.vue_vue_type_script_setup_true_lang.kxAPXcBy.0.0.50-internal.1.js +1 -0
  45. package/dist/interface/js/SettingsBackup.DOaJA4pp.0.0.50-internal.1.js +1 -0
  46. package/dist/interface/js/SettingsRecordings.BGcwL6tk.0.0.50-internal.1.js +1 -0
  47. package/dist/interface/js/SettingsRemote.BVU_w1Jm.0.0.50-internal.1.js +1 -0
  48. package/dist/interface/js/SettingsSystem.P0vy90vA.0.0.50-internal.1.js +1 -0
  49. package/dist/interface/js/SettingsUsers.DaP5m7eo.0.0.50-internal.1.js +1 -0
  50. package/dist/interface/js/VersionsHandler.vue_vue_type_script_setup_true_lang.MmrWYW3K.0.0.50-internal.1.js +4 -0
  51. package/dist/interface/js/ace-builds.C0aqA_3x.0.0.50-internal.1.js +1090 -0
  52. package/dist/interface/js/ace.config.C9wgzklI.0.0.50-internal.1.js +1 -0
  53. package/dist/interface/js/axios.DHr9lByg.0.0.50-internal.1.js +6 -0
  54. package/dist/interface/js/backup.BeH6lJ5t.0.0.50-internal.1.js +1 -0
  55. package/dist/interface/js/chart.js.BQHSWV_g.0.0.50-internal.1.js +13 -0
  56. package/dist/interface/js/close-circle.DDKMxauw.0.0.50-internal.1.js +1 -0
  57. package/dist/interface/js/dnd-core.dWz9rJqH.0.0.50-internal.1.js +1 -0
  58. package/dist/interface/{draggabilly.C0hZWkL0.0.0.49.js → js/draggabilly.D-iZIS1n.0.0.50-internal.1.js} +1 -1
  59. package/dist/interface/js/engine.io-client.BwxOddB_.0.0.50-internal.1.js +1 -0
  60. package/dist/interface/js/fast-deep-equal.Dz96RC_N.0.0.50-internal.1.js +1 -0
  61. package/dist/interface/js/highlight.js.CmcM8OM6.0.0.50-internal.1.js +3 -0
  62. package/dist/interface/js/linkify-it.BgLcBzlw.0.0.50-internal.1.js +1 -0
  63. package/dist/interface/js/main.6bOgRV7D.0.0.50-internal.1.js +31 -0
  64. package/dist/interface/{markdown-it.64FJJcTG.0.0.49.js → js/markdown-it.CTgfs-3p.0.0.50-internal.1.js} +1 -1
  65. package/dist/interface/{nprogress.DkWvUoHh.0.0.49.js → js/nprogress.CMhnq8jS.0.0.50-internal.1.js} +1 -1
  66. package/dist/interface/js/perfect-debounce.l0sNRNKZ.0.0.50-internal.1.js +1 -0
  67. package/dist/interface/js/pinia.CuC5ZfNs.0.0.50-internal.1.js +5 -0
  68. package/dist/interface/js/primelocale.Bga3dOQu.0.0.50-internal.1.js +1 -0
  69. package/dist/interface/js/primevue.DmwjJ4xV.0.0.50-internal.1.js +142 -0
  70. package/dist/interface/{qrcode.BixA_YE2.0.0.49.js → js/qrcode.DGZO3j1c.0.0.50-internal.1.js} +1 -1
  71. package/dist/interface/js/react-dnd-touch-backend.CEGHlD-T.0.0.50-internal.1.js +1 -0
  72. package/dist/interface/js/refresh-rounded.D0keXzBc.0.0.50-internal.1.js +1 -0
  73. package/dist/interface/js/rxjs.CiDbFOB0.0.0.50-internal.1.js +3 -0
  74. package/dist/interface/js/socket.io-client.BPcXPAHG.0.0.50-internal.1.js +1 -0
  75. package/dist/interface/js/socket.io-parser.DSGzrW_l.0.0.50-internal.1.js +1 -0
  76. package/dist/interface/js/system.BKlEObmx.0.0.50-internal.1.js +1 -0
  77. package/dist/interface/js/trash-fill.BDFILs86.0.0.50-internal.1.js +1 -0
  78. package/dist/interface/{unidragger.C8ueS-PW.0.0.49.js → js/unidragger.DcxsxHCS.0.0.50-internal.1.js} +1 -1
  79. package/dist/interface/js/uuid.C6aID195.0.0.50-internal.1.js +1 -0
  80. package/dist/interface/js/vee-validate.BGRg3oQ8.0.0.50-internal.1.js +5 -0
  81. package/dist/interface/js/vue-chartjs.B9yk2de7.0.0.50-internal.1.js +1 -0
  82. package/dist/interface/js/vue-i18n.DXDZITpf.0.0.50-internal.1.js +5 -0
  83. package/dist/interface/js/vue-inline-svg.BDYaTfbi.0.0.50-internal.1.js +1 -0
  84. package/dist/interface/js/vue-router.CFEDA008.0.0.50-internal.1.js +5 -0
  85. package/dist/interface/js/vue-zoomable.zqTafMgD.0.0.50-internal.1.js +1 -0
  86. package/dist/interface/js/vue.l0sNRNKZ.0.0.50-internal.1.js +1 -0
  87. package/dist/interface/js/vue3-dnd.BxM3dbYs.0.0.50-internal.1.js +1 -0
  88. package/dist/interface/js/zod.SKKegNRO.0.0.50-internal.1.js +1 -0
  89. package/dist/interface/js/zoom-out.B6SY9IIj.0.0.50-internal.1.js +1 -0
  90. package/dist/interface/manifest.webmanifest +1 -1
  91. package/dist/interface/pwa/favicon-32.ico +0 -0
  92. package/dist/interface/pwa/favicon-48.ico +0 -0
  93. package/dist/interface/sw.js +1 -1
  94. package/dist/server/package.json +57 -45
  95. package/dist/server/requirements.txt +12 -11
  96. package/dist/server/src/__init__.py +0 -0
  97. package/dist/server/src/_camera_ui_tools/__init__.py +0 -0
  98. package/dist/server/src/_camera_ui_tools/camera_ui_common/__init__.py +28 -0
  99. package/dist/server/src/_camera_ui_tools/camera_ui_common/camera_utils/utils.py +52 -0
  100. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/__init__.py +0 -0
  101. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/object_path.py +198 -0
  102. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/reactive.py +42 -0
  103. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/signal_handler.py +92 -0
  104. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/subscribed.py +21 -0
  105. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/task.py +39 -0
  106. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/thread.py +10 -0
  107. package/dist/server/src/_camera_ui_tools/camera_ui_common/common_utils/utils.py +91 -0
  108. package/dist/server/src/_camera_ui_tools/camera_ui_common/logger_service/__init__.py +0 -0
  109. package/dist/server/src/_camera_ui_tools/camera_ui_common/logger_service/ansicolor.py +62 -0
  110. package/dist/server/src/_camera_ui_tools/camera_ui_common/logger_service/logger.py +178 -0
  111. package/dist/server/src/_camera_ui_tools/camera_ui_common/logger_service/test.py +116 -0
  112. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/__init__.py +350 -0
  113. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/__init__.py +0 -0
  114. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/base.py +237 -0
  115. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/client.py +256 -0
  116. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/connection.py +784 -0
  117. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/errors.py +745 -0
  118. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/messaging.py +57 -0
  119. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/rpc.py +227 -0
  120. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/base/rpc_generator.py +584 -0
  121. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/constants.py +96 -0
  122. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/typings.py +218 -0
  123. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/__init__.py +0 -0
  124. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/connection_state.py +86 -0
  125. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/logger.py +30 -0
  126. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/metrics.py +152 -0
  127. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/packer.py +20 -0
  128. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/routing.py +75 -0
  129. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/rpc.py +177 -0
  130. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/subscriptions.py +24 -0
  131. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/tasks.py +39 -0
  132. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/uid.py +37 -0
  133. package/dist/server/src/_camera_ui_tools/camera_ui_rpc_client/utils/validate.py +119 -0
  134. package/dist/server/src/_camera_ui_tools/camera_ui_types/__init__.py +1360 -0
  135. package/dist/server/src/_camera_ui_tools/camera_ui_types/hybrid_observer.py +338 -0
  136. package/dist/server/src/_camera_ui_tools/camera_ui_types/test.py +196 -0
  137. package/dist/server/src/api/controllers/auth.controller.d.ts +2 -2
  138. package/dist/server/src/api/controllers/auth.controller.js +49 -43
  139. package/dist/server/src/api/controllers/auth.controller.js.map +1 -1
  140. package/dist/server/src/api/controllers/backup.controller.js +1 -2
  141. package/dist/server/src/api/controllers/backup.controller.js.map +1 -1
  142. package/dist/server/src/api/controllers/cameras.controller.d.ts +13 -11
  143. package/dist/server/src/api/controllers/cameras.controller.js +314 -105
  144. package/dist/server/src/api/controllers/cameras.controller.js.map +1 -1
  145. package/dist/server/src/api/controllers/plugins.controller.d.ts +8 -8
  146. package/dist/server/src/api/controllers/plugins.controller.js +208 -244
  147. package/dist/server/src/api/controllers/plugins.controller.js.map +1 -1
  148. package/dist/server/src/api/controllers/system.controller.d.ts +1 -0
  149. package/dist/server/src/api/controllers/system.controller.js +22 -8
  150. package/dist/server/src/api/controllers/system.controller.js.map +1 -1
  151. package/dist/server/src/api/controllers/users.controller.d.ts +2 -2
  152. package/dist/server/src/api/controllers/users.controller.js +13 -25
  153. package/dist/server/src/api/controllers/users.controller.js.map +1 -1
  154. package/dist/server/src/api/database/checks.js +2 -2
  155. package/dist/server/src/api/database/checks.js.map +1 -1
  156. package/dist/server/src/api/database/index.d.ts +4 -7
  157. package/dist/server/src/api/database/index.js +59 -86
  158. package/dist/server/src/api/database/index.js.map +1 -1
  159. package/dist/server/src/api/database/migration.js +5 -141
  160. package/dist/server/src/api/database/migration.js.map +1 -1
  161. package/dist/server/src/api/database/selfcheck.js +5 -5
  162. package/dist/server/src/api/database/selfcheck.js.map +1 -1
  163. package/dist/server/src/api/database/types.d.ts +17 -25
  164. package/dist/server/src/api/go2rtc/api/discover.d.ts +30 -0
  165. package/dist/server/src/api/go2rtc/api/discover.js +162 -0
  166. package/dist/server/src/api/go2rtc/api/discover.js.map +1 -0
  167. package/dist/server/src/api/go2rtc/api/index.d.ts +1 -1
  168. package/dist/server/src/api/go2rtc/api/index.js +15 -4
  169. package/dist/server/src/api/go2rtc/api/index.js.map +1 -1
  170. package/dist/server/src/api/go2rtc/api/streams.d.ts +3 -1
  171. package/dist/server/src/api/go2rtc/api/streams.js +66 -9
  172. package/dist/server/src/api/go2rtc/api/streams.js.map +1 -1
  173. package/dist/server/src/api/go2rtc/index.d.ts +2 -0
  174. package/dist/server/src/api/go2rtc/index.js +3 -0
  175. package/dist/server/src/api/go2rtc/index.js.map +1 -1
  176. package/dist/server/src/api/go2rtc/queue.js +3 -3
  177. package/dist/server/src/api/go2rtc/queue.js.map +1 -1
  178. package/dist/server/src/api/go2rtc/types.d.ts +66 -11
  179. package/dist/server/src/api/index.d.ts +4 -0
  180. package/dist/server/src/api/index.js +45 -9
  181. package/dist/server/src/api/index.js.map +1 -1
  182. package/dist/server/src/api/middlewares/authPermission.middleware.d.ts +1 -0
  183. package/dist/server/src/api/middlewares/authPermission.middleware.js +11 -2
  184. package/dist/server/src/api/middlewares/authPermission.middleware.js.map +1 -1
  185. package/dist/server/src/api/middlewares/authValidation.middleware.js +20 -12
  186. package/dist/server/src/api/middlewares/authValidation.middleware.js.map +1 -1
  187. package/dist/server/src/api/middlewares/pagination.middleware.js +45 -53
  188. package/dist/server/src/api/middlewares/pagination.middleware.js.map +1 -1
  189. package/dist/server/src/api/plugins/proxy.plugin.d.ts +14 -0
  190. package/dist/server/src/api/plugins/proxy.plugin.js +200 -0
  191. package/dist/server/src/api/plugins/proxy.plugin.js.map +1 -0
  192. package/dist/server/src/api/routes/cameras.routes.js +56 -30
  193. package/dist/server/src/api/routes/cameras.routes.js.map +1 -1
  194. package/dist/server/src/api/routes/plugins.routes.js +65 -63
  195. package/dist/server/src/api/routes/plugins.routes.js.map +1 -1
  196. package/dist/server/src/api/routes/system.routes.js +7 -1
  197. package/dist/server/src/api/routes/system.routes.js.map +1 -1
  198. package/dist/server/src/api/routes/users.routes.js +8 -8
  199. package/dist/server/src/api/routes/users.routes.js.map +1 -1
  200. package/dist/server/src/api/schemas/backup.schema.d.ts +3 -3
  201. package/dist/server/src/api/schemas/backup.schema.js +1 -1
  202. package/dist/server/src/api/schemas/backup.schema.js.map +1 -1
  203. package/dist/server/src/api/schemas/cameras.schema.d.ts +1413 -529
  204. package/dist/server/src/api/schemas/cameras.schema.js +228 -182
  205. package/dist/server/src/api/schemas/cameras.schema.js.map +1 -1
  206. package/dist/server/src/api/schemas/config.schema.d.ts +29 -41
  207. package/dist/server/src/api/schemas/config.schema.js +10 -21
  208. package/dist/server/src/api/schemas/config.schema.js.map +1 -1
  209. package/dist/server/src/api/schemas/go2rtc.schema.d.ts +194 -162
  210. package/dist/server/src/api/schemas/go2rtc.schema.js +33 -58
  211. package/dist/server/src/api/schemas/go2rtc.schema.js.map +1 -1
  212. package/dist/server/src/api/schemas/plugins.schema.d.ts +17 -17
  213. package/dist/server/src/api/schemas/plugins.schema.js +1 -1
  214. package/dist/server/src/api/schemas/plugins.schema.js.map +1 -1
  215. package/dist/server/src/api/schemas/storage.schema.d.ts +22 -0
  216. package/dist/server/src/api/schemas/storage.schema.js +5 -0
  217. package/dist/server/src/api/schemas/storage.schema.js.map +1 -0
  218. package/dist/server/src/api/schemas/system.schema.d.ts +171 -3
  219. package/dist/server/src/api/schemas/system.schema.js +30 -3
  220. package/dist/server/src/api/schemas/system.schema.js.map +1 -1
  221. package/dist/server/src/api/schemas/users.schema.d.ts +98 -254
  222. package/dist/server/src/api/schemas/users.schema.js +6 -6
  223. package/dist/server/src/api/schemas/users.schema.js.map +1 -1
  224. package/dist/server/src/api/services/auth.service.d.ts +5 -5
  225. package/dist/server/src/api/services/auth.service.js +26 -35
  226. package/dist/server/src/api/services/auth.service.js.map +1 -1
  227. package/dist/server/src/api/services/cameras.service.d.ts +11 -16
  228. package/dist/server/src/api/services/cameras.service.js +143 -310
  229. package/dist/server/src/api/services/cameras.service.js.map +1 -1
  230. package/dist/server/src/api/services/plugins.service.d.ts +3 -1
  231. package/dist/server/src/api/services/plugins.service.js +48 -50
  232. package/dist/server/src/api/services/plugins.service.js.map +1 -1
  233. package/dist/server/src/api/services/users.service.d.ts +1 -0
  234. package/dist/server/src/api/services/users.service.js +20 -14
  235. package/dist/server/src/api/services/users.service.js.map +1 -1
  236. package/dist/server/src/api/types/index.d.ts +57 -46
  237. package/dist/server/src/api/types/index.js +0 -4
  238. package/dist/server/src/api/types/index.js.map +1 -1
  239. package/dist/server/src/api/utils/cert.d.ts +5 -1
  240. package/dist/server/src/api/utils/cert.js +24 -26
  241. package/dist/server/src/api/utils/cert.js.map +1 -1
  242. package/dist/server/src/api/utils/constants.d.ts +4 -2
  243. package/dist/server/src/api/utils/constants.js +4 -2
  244. package/dist/server/src/api/utils/constants.js.map +1 -1
  245. package/dist/server/src/api/utils/fetch.d.ts +1 -1
  246. package/dist/server/src/api/utils/fetch.js +2 -2
  247. package/dist/server/src/api/utils/fetch.js.map +1 -1
  248. package/dist/server/src/api/websocket/index.d.ts +1 -0
  249. package/dist/server/src/api/websocket/index.js +14 -9
  250. package/dist/server/src/api/websocket/index.js.map +1 -1
  251. package/dist/server/src/api/websocket/nsp/logs.d.ts +10 -2
  252. package/dist/server/src/api/websocket/nsp/logs.js +75 -27
  253. package/dist/server/src/api/websocket/nsp/logs.js.map +1 -1
  254. package/dist/server/src/api/websocket/nsp/metrics.d.ts +20 -12
  255. package/dist/server/src/api/websocket/nsp/metrics.js +188 -117
  256. package/dist/server/src/api/websocket/nsp/metrics.js.map +1 -1
  257. package/dist/server/src/api/websocket/nsp/plugins.d.ts +1 -1
  258. package/dist/server/src/api/websocket/nsp/plugins.js +3 -5
  259. package/dist/server/src/api/websocket/nsp/plugins.js.map +1 -1
  260. package/dist/server/src/api/websocket/nsp/server.js +6 -0
  261. package/dist/server/src/api/websocket/nsp/server.js.map +1 -1
  262. package/dist/server/src/api/websocket/types.d.ts +4 -2
  263. package/dist/server/src/api.d.ts +3 -4
  264. package/dist/server/src/api.js +13 -13
  265. package/dist/server/src/api.js.map +1 -1
  266. package/dist/server/src/camera/classes.d.ts +2 -0
  267. package/dist/server/src/camera/classes.js +24 -0
  268. package/dist/server/src/camera/classes.js.map +1 -0
  269. package/dist/server/src/camera/controller.d.ts +30 -18
  270. package/dist/server/src/camera/controller.js +236 -202
  271. package/dist/server/src/camera/controller.js.map +1 -1
  272. package/dist/server/src/camera/device.d.ts +34 -0
  273. package/dist/server/src/camera/device.js +327 -0
  274. package/dist/server/src/camera/device.js.map +1 -0
  275. package/dist/server/src/camera/frameWorker.d.ts +32 -31
  276. package/dist/server/src/camera/frameWorker.js +257 -247
  277. package/dist/server/src/camera/frameWorker.js.map +1 -1
  278. package/dist/server/src/camera/index.d.ts +92 -0
  279. package/dist/server/src/camera/index.js +531 -0
  280. package/dist/server/src/camera/index.js.map +1 -0
  281. package/dist/server/src/camera/interfaces.d.ts +17 -0
  282. package/dist/server/src/camera/interfaces.js +99 -0
  283. package/dist/server/src/camera/interfaces.js.map +1 -0
  284. package/dist/server/src/camera/iou.d.ts +2 -0
  285. package/dist/server/src/camera/iou.js +123 -0
  286. package/dist/server/src/camera/iou.js.map +1 -0
  287. package/dist/server/src/camera/polygon.d.ts +4 -0
  288. package/dist/server/src/camera/polygon.js +192 -0
  289. package/dist/server/src/camera/polygon.js.map +1 -0
  290. package/dist/server/src/camera/python/__init__.py +0 -0
  291. package/dist/server/src/camera/python/classes.py +41 -0
  292. package/dist/server/src/camera/python/interfaces.py +130 -0
  293. package/dist/server/src/camera/python/iou.py +158 -0
  294. package/dist/server/src/camera/python/polygon.py +230 -0
  295. package/dist/server/src/camera/python/typings.py +50 -0
  296. package/dist/server/src/camera/python/video_frame.py +143 -0
  297. package/dist/server/src/camera/session.d.ts +37 -0
  298. package/dist/server/src/camera/session.js +160 -0
  299. package/dist/server/src/camera/session.js.map +1 -0
  300. package/dist/server/src/camera/streaming/fmp4-session.d.ts +17 -0
  301. package/dist/server/src/camera/streaming/fmp4-session.js +308 -0
  302. package/dist/server/src/camera/streaming/fmp4-session.js.map +1 -0
  303. package/dist/server/src/camera/streaming/peer-connection.d.ts +26 -0
  304. package/dist/server/src/camera/streaming/peer-connection.js +213 -0
  305. package/dist/server/src/camera/streaming/peer-connection.js.map +1 -0
  306. package/dist/server/src/camera/streaming/rtsp-session.d.ts +19 -0
  307. package/dist/server/src/camera/streaming/rtsp-session.js +253 -0
  308. package/dist/server/src/camera/streaming/rtsp-session.js.map +1 -0
  309. package/dist/server/src/camera/streaming/webrtc-connection.d.ts +44 -0
  310. package/dist/server/src/camera/streaming/webrtc-connection.js +177 -0
  311. package/dist/server/src/camera/streaming/webrtc-connection.js.map +1 -0
  312. package/dist/server/src/camera/streaming/werift-session.d.ts +19 -0
  313. package/dist/server/src/camera/streaming/werift-session.js +246 -0
  314. package/dist/server/src/camera/streaming/werift-session.js.map +1 -0
  315. package/dist/server/src/camera/types.d.ts +16 -10
  316. package/dist/server/src/camera/utils.d.ts +9 -0
  317. package/dist/server/src/camera/utils.js +416 -0
  318. package/dist/server/src/camera/utils.js.map +1 -0
  319. package/dist/server/src/camera/videoFrame.d.ts +18 -0
  320. package/dist/server/src/camera/videoFrame.js +88 -0
  321. package/dist/server/src/camera/videoFrame.js.map +1 -0
  322. package/dist/server/src/cloud/index.d.ts +12 -0
  323. package/dist/server/src/cloud/index.js +49 -0
  324. package/dist/server/src/cloud/index.js.map +1 -0
  325. package/dist/server/src/cloud/remote/cloudflare.d.ts +7 -0
  326. package/dist/server/src/cloud/remote/cloudflare.js +12 -0
  327. package/dist/server/src/cloud/remote/cloudflare.js.map +1 -0
  328. package/dist/server/src/cloud/remote/upnp.d.ts +7 -0
  329. package/dist/server/src/cloud/remote/upnp.js +12 -0
  330. package/dist/server/src/cloud/remote/upnp.js.map +1 -0
  331. package/dist/server/src/cloud/remote/utils.d.ts +3 -0
  332. package/dist/server/src/cloud/remote/utils.js +20 -0
  333. package/dist/server/src/cloud/remote/utils.js.map +1 -0
  334. package/dist/server/src/cloud/types.d.ts +15 -0
  335. package/dist/server/src/cloud/types.js +11 -0
  336. package/dist/server/src/cloud/types.js.map +1 -0
  337. package/dist/server/src/decoder/child.d.ts +1 -0
  338. package/dist/server/src/decoder/child.js +749 -0
  339. package/dist/server/src/decoder/child.js.map +1 -0
  340. package/dist/server/src/decoder/imageUtils.d.ts +22 -0
  341. package/dist/server/src/decoder/imageUtils.js +196 -0
  342. package/dist/server/src/decoder/imageUtils.js.map +1 -0
  343. package/dist/server/src/decoder/manager.d.ts +19 -0
  344. package/dist/server/src/decoder/manager.js +208 -0
  345. package/dist/server/src/decoder/manager.js.map +1 -0
  346. package/dist/server/src/decoder/python/__init__.py +0 -0
  347. package/dist/server/src/decoder/python/child.py +903 -0
  348. package/dist/server/src/decoder/python/image_utils.py +196 -0
  349. package/dist/server/src/decoder/python/pool.py +45 -0
  350. package/dist/server/src/decoder/python/typings.py +57 -0
  351. package/dist/server/src/decoder/python/utils.py +70 -0
  352. package/dist/server/src/decoder/types.d.ts +23 -0
  353. package/dist/server/src/decoder/types.js.map +1 -0
  354. package/dist/server/src/decoder/utils.d.ts +13 -0
  355. package/dist/server/src/decoder/utils.js +45 -0
  356. package/dist/server/src/decoder/utils.js.map +1 -0
  357. package/dist/server/src/decoder/wasm/build/decoder.d.ts +43 -0
  358. package/dist/server/src/decoder/wasm/build/decoder.js +108 -0
  359. package/dist/server/src/decoder/wasm/build/decoder.wasm +0 -0
  360. package/dist/server/src/decoder/worker.d.ts +1 -0
  361. package/dist/server/src/decoder/worker.js +79 -0
  362. package/dist/server/src/decoder/worker.js.map +1 -0
  363. package/dist/server/src/go2rtc/index.d.ts +1 -0
  364. package/dist/server/src/go2rtc/index.js +27 -9
  365. package/dist/server/src/go2rtc/index.js.map +1 -1
  366. package/dist/server/src/go2rtc/types.d.ts +5 -4
  367. package/dist/server/src/go2rtc/types.js +6 -2
  368. package/dist/server/src/go2rtc/types.js.map +1 -1
  369. package/dist/server/src/main.js +19 -5
  370. package/dist/server/src/main.js.map +1 -1
  371. package/dist/server/src/manager/coreManager.d.ts +16 -0
  372. package/dist/server/src/manager/coreManager.js +95 -0
  373. package/dist/server/src/manager/coreManager.js.map +1 -0
  374. package/dist/server/src/manager/deviceManager.d.ts +12 -0
  375. package/dist/server/src/manager/deviceManager.js +130 -0
  376. package/dist/server/src/manager/deviceManager.js.map +1 -0
  377. package/dist/server/src/manager/types.d.ts +15 -0
  378. package/dist/server/src/manager/types.js +2 -0
  379. package/dist/server/src/manager/types.js.map +1 -0
  380. package/dist/server/src/plugins/index.d.ts +3 -1
  381. package/dist/server/src/plugins/index.js +42 -21
  382. package/dist/server/src/plugins/index.js.map +1 -1
  383. package/dist/server/src/plugins/plugin.d.ts +3 -3
  384. package/dist/server/src/plugins/plugin.js +13 -20
  385. package/dist/server/src/plugins/plugin.js.map +1 -1
  386. package/dist/server/src/plugins/runtime/base.d.ts +54 -0
  387. package/dist/server/src/plugins/runtime/base.js +223 -0
  388. package/dist/server/src/plugins/runtime/base.js.map +1 -0
  389. package/dist/server/src/plugins/runtime/index.d.ts +5 -0
  390. package/dist/server/src/plugins/runtime/index.js +13 -0
  391. package/dist/server/src/plugins/runtime/index.js.map +1 -0
  392. package/dist/server/src/plugins/runtime/node/child.d.ts +22 -0
  393. package/dist/server/src/plugins/runtime/node/child.js +152 -0
  394. package/dist/server/src/plugins/runtime/node/child.js.map +1 -0
  395. package/dist/server/src/plugins/runtime/node/index.d.ts +7 -0
  396. package/dist/server/src/plugins/runtime/node/index.js +54 -0
  397. package/dist/server/src/plugins/runtime/node/index.js.map +1 -0
  398. package/dist/server/src/plugins/runtime/node/plugin.d.ts +24 -0
  399. package/dist/server/src/plugins/runtime/node/plugin.js +128 -0
  400. package/dist/server/src/plugins/runtime/node/plugin.js.map +1 -0
  401. package/dist/server/src/plugins/runtime/node/pluginApi.d.ts +16 -0
  402. package/dist/server/src/plugins/runtime/node/pluginApi.js +18 -0
  403. package/dist/server/src/plugins/runtime/node/pluginApi.js.map +1 -0
  404. package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.d.ts +25 -0
  405. package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js +230 -0
  406. package/dist/server/src/plugins/runtime/node/proxy/cameraDevice.js.map +1 -0
  407. package/dist/server/src/plugins/runtime/node/proxy/coreManager.d.ts +16 -0
  408. package/dist/server/src/plugins/runtime/node/proxy/coreManager.js +98 -0
  409. package/dist/server/src/plugins/runtime/node/proxy/coreManager.js.map +1 -0
  410. package/dist/server/src/plugins/runtime/node/proxy/deviceManager.d.ts +19 -0
  411. package/dist/server/src/plugins/runtime/node/proxy/deviceManager.js +144 -0
  412. package/dist/server/src/plugins/runtime/node/proxy/deviceManager.js.map +1 -0
  413. package/dist/server/src/plugins/runtime/node/storage.d.ts +34 -0
  414. package/dist/server/src/plugins/runtime/node/storage.js +313 -0
  415. package/dist/server/src/plugins/runtime/node/storage.js.map +1 -0
  416. package/dist/server/src/plugins/runtime/node/storageController.d.ts +18 -0
  417. package/dist/server/src/plugins/runtime/node/storageController.js +67 -0
  418. package/dist/server/src/plugins/runtime/node/storageController.js.map +1 -0
  419. package/dist/server/src/plugins/runtime/python/__init__.py +0 -0
  420. package/dist/server/src/plugins/runtime/python/child.py +248 -0
  421. package/dist/server/src/plugins/runtime/python/index.d.ts +9 -0
  422. package/dist/server/src/plugins/runtime/python/index.js +57 -0
  423. package/dist/server/src/plugins/runtime/python/index.js.map +1 -0
  424. package/dist/server/src/plugins/runtime/python/namespaces.py +101 -0
  425. package/dist/server/src/plugins/runtime/python/plugin.py +155 -0
  426. package/dist/server/src/plugins/runtime/python/plugin_api.py +29 -0
  427. package/dist/server/src/plugins/runtime/python/proxy/camera_device.py +1732 -0
  428. package/dist/server/src/plugins/runtime/python/proxy/core_manager.py +126 -0
  429. package/dist/server/src/plugins/runtime/python/proxy/device_manager.py +197 -0
  430. package/dist/server/src/plugins/runtime/python/schema.py +99 -0
  431. package/dist/server/src/plugins/runtime/python/storage.py +353 -0
  432. package/dist/server/src/plugins/runtime/python/storage_controller.py +102 -0
  433. package/dist/server/src/plugins/runtime/python/typings.py +195 -0
  434. package/dist/server/src/plugins/schema.d.ts +27 -34
  435. package/dist/server/src/plugins/schema.js +358 -369
  436. package/dist/server/src/plugins/schema.js.map +1 -1
  437. package/dist/server/src/plugins/types.d.ts +43 -1
  438. package/dist/server/src/plugins/types.js +16 -0
  439. package/dist/server/src/plugins/types.js.map +1 -1
  440. package/dist/server/src/plugins/worker.d.ts +12 -31
  441. package/dist/server/src/plugins/worker.js +89 -343
  442. package/dist/server/src/plugins/worker.js.map +1 -1
  443. package/dist/server/src/rpc/index.d.ts +32 -0
  444. package/dist/server/src/rpc/index.js +103 -0
  445. package/dist/server/src/rpc/index.js.map +1 -0
  446. package/dist/server/src/rpc/namespaces.d.ts +35 -0
  447. package/dist/server/src/rpc/namespaces.js +42 -0
  448. package/dist/server/src/rpc/namespaces.js.map +1 -0
  449. package/dist/server/src/{nats → rpc}/server.d.ts +6 -2
  450. package/dist/server/src/{nats → rpc}/server.js +76 -55
  451. package/dist/server/src/rpc/server.js.map +1 -0
  452. package/dist/server/src/rpc/types.d.ts +111 -0
  453. package/dist/server/src/rpc/types.js +2 -0
  454. package/dist/server/src/{nats → rpc}/types.js.map +1 -1
  455. package/dist/server/src/{nats → rpc}/utils.d.ts +1 -1
  456. package/dist/server/src/rpc/utils.js.map +1 -0
  457. package/dist/server/src/services/config/constants.js +12 -48
  458. package/dist/server/src/services/config/constants.js.map +1 -1
  459. package/dist/server/src/services/config/defaults.d.ts +12 -0
  460. package/dist/server/src/services/config/defaults.js +55 -0
  461. package/dist/server/src/services/config/defaults.js.map +1 -0
  462. package/dist/server/src/services/config/index.d.ts +57 -9
  463. package/dist/server/src/services/config/index.js +277 -130
  464. package/dist/server/src/services/config/index.js.map +1 -1
  465. package/dist/server/src/services/config/types.d.ts +10 -4
  466. package/dist/server/src/types.d.ts +3 -0
  467. package/dist/server/src/utils/path.d.ts +5 -0
  468. package/dist/server/src/utils/path.js +12 -0
  469. package/dist/server/src/utils/path.js.map +1 -0
  470. package/dist/server/src/utils/pythonInstaller.d.ts +46 -0
  471. package/dist/server/src/utils/pythonInstaller.js +463 -0
  472. package/dist/server/src/utils/pythonInstaller.js.map +1 -0
  473. package/package.json +57 -45
  474. package/types/fastify.d.ts +14 -0
  475. package/dist/interface/@intlify.Do1-T-x0.0.0.49.js +0 -15
  476. package/dist/interface/@mdi.CbjpODVZ.0.0.49.js +0 -1
  477. package/dist/interface/@tanstack.CgZ4BVuY.0.0.49.js +0 -1
  478. package/dist/interface/@vue.DeX8WChi.0.0.49.js +0 -17
  479. package/dist/interface/@vueform.WCJNykTK.0.0.49.js +0 -1
  480. package/dist/interface/@vueuse.fmA4o7MO.0.0.49.js +0 -1
  481. package/dist/interface/Account.D_hgF7as.0.0.49.js +0 -1
  482. package/dist/interface/Adminpanel.Cr2ysRnk.0.0.49.js +0 -2
  483. package/dist/interface/Appearance.DJPnnakw.0.0.49.js +0 -1
  484. package/dist/interface/Backup.DWrnTw65.0.0.49.js +0 -1
  485. package/dist/interface/Camera.Cm8bv5Jw.0.0.49.js +0 -1
  486. package/dist/interface/Cameras.BdMnnB_B.0.0.49.js +0 -1
  487. package/dist/interface/Camview.CvyTACeS.0.0.49.js +0 -1
  488. package/dist/interface/Config.R58trs6R.0.0.49.js +0 -1
  489. package/dist/interface/Console.ByS6OcfG.0.0.49.js +0 -4
  490. package/dist/interface/FirstSteps.BSZVBND8.0.0.49.js +0 -1
  491. package/dist/interface/NewCamera.CpKY8-_z.0.0.49.js +0 -469
  492. package/dist/interface/Plugin.ucDXXC6d.0.0.49.js +0 -1
  493. package/dist/interface/Plugins.Bl6Yy3fd.0.0.49.js +0 -1
  494. package/dist/interface/Recordings.Bm-_HDqk.0.0.49.js +0 -1
  495. package/dist/interface/Recordings.CVFqRJTQ.0.0.49.js +0 -1
  496. package/dist/interface/Settings.ClbXnv3j.0.0.49.js +0 -1
  497. package/dist/interface/System.BE0hX95Q.0.0.49.js +0 -4
  498. package/dist/interface/User.Ih1R_8u4.0.0.49.js +0 -1
  499. package/dist/interface/VConfigEditor.vue_vue_type_script_setup_true_lang.CAHg6HiL.0.0.49.js +0 -2
  500. package/dist/interface/VConsole.B9yVZ89i.0.0.49.js +0 -1
  501. package/dist/interface/VPlayer.DWJVzwuw.0.0.49.js +0 -4
  502. package/dist/interface/VPluginCard.pJNHjHpP.0.0.49.js +0 -4
  503. package/dist/interface/ace-builds.S1varnlI.0.0.49.js +0 -970
  504. package/dist/interface/apexcharts.BQn4Fbzn.0.0.49.js +0 -838
  505. package/dist/interface/assets/@vueform.0.0.49.CroAHJs8.css +0 -1
  506. package/dist/interface/assets/@xterm.0.0.49.CFbL2ovg.css +0 -32
  507. package/dist/interface/assets/Account.0.0.49.Bnw6Lbtd.css +0 -1
  508. package/dist/interface/assets/Adminpanel.0.0.49.a3t1v3MB.css +0 -1
  509. package/dist/interface/assets/Camera.0.0.49.Br9s6-lM.css +0 -1
  510. package/dist/interface/assets/Cameras.0.0.49.Buf1Dgce.css +0 -1
  511. package/dist/interface/assets/Camview.0.0.49.B7Cja2ry.css +0 -1
  512. package/dist/interface/assets/Config.0.0.49.DNGo2krN.css +0 -1
  513. package/dist/interface/assets/Console.0.0.49.Bh8l9QnM.css +0 -1
  514. package/dist/interface/assets/FirstSteps.0.0.49.Mu8VPl13.css +0 -1
  515. package/dist/interface/assets/NewCamera.0.0.49.DtjxW0Pf.css +0 -1
  516. package/dist/interface/assets/Plugin.0.0.49.YIpAU1_n.css +0 -1
  517. package/dist/interface/assets/Plugins.0.0.49.DXSoO9M1.css +0 -1
  518. package/dist/interface/assets/Settings.0.0.49.CVmui2kE.css +0 -1
  519. package/dist/interface/assets/User.0.0.49.BiGtIFqt.css +0 -1
  520. package/dist/interface/assets/VConsole.0.0.49.BCqKHpmJ.css +0 -1
  521. package/dist/interface/assets/VPlayer.0.0.49.C4lm2rVR.css +0 -1
  522. package/dist/interface/assets/VPluginCard.0.0.49.C8Lj6X-J.css +0 -1
  523. package/dist/interface/assets/main.0.0.49.OJngntGT.css +0 -1
  524. package/dist/interface/assets/vue3-toastify.0.0.49.DHXAGmwn.css +0 -1
  525. package/dist/interface/assets/vuetify.0.0.49.Dua9WSqa.css +0 -5
  526. package/dist/interface/axios.DIsA03vz.0.0.49.js +0 -6
  527. package/dist/interface/backup.DO02r0Uq.0.0.49.js +0 -1
  528. package/dist/interface/dnd-core.De50QAoi.0.0.49.js +0 -1
  529. package/dist/interface/engine.io-client.BkCVneko.0.0.49.js +0 -1
  530. package/dist/interface/fast-deep-equal.Cba0yG7P.0.0.49.js +0 -1
  531. package/dist/interface/fonts/Inter/Inter-Regular.ttf +0 -0
  532. package/dist/interface/highlight.js.B_E0LW5C.0.0.49.js +0 -2
  533. package/dist/interface/hookable.B8xFkYCm.0.0.49.js +0 -1
  534. package/dist/interface/linkify-it.B6s2BWlj.0.0.49.js +0 -1
  535. package/dist/interface/main.BBe3SGhH.0.0.49.js +0 -4
  536. package/dist/interface/perfect-debounce.Cp2ysxOb.0.0.49.js +0 -1
  537. package/dist/interface/pinia.ggULzsrQ.0.0.49.js +0 -5
  538. package/dist/interface/plugins.D11FBqVV.0.0.49.js +0 -1
  539. package/dist/interface/react-dnd-touch-backend.Bu6wFEmw.0.0.49.js +0 -1
  540. package/dist/interface/rxjs.BoFuGUYG.0.0.49.js +0 -3
  541. package/dist/interface/socket.io-client.DkEQDv7C.0.0.49.js +0 -1
  542. package/dist/interface/socket.io-parser.DIURoCw8.0.0.49.js +0 -1
  543. package/dist/interface/system.D_LabhBl.0.0.49.js +0 -1
  544. package/dist/interface/types.Cz9TaZAP.0.0.49.js +0 -1
  545. package/dist/interface/utils.mAKpSMLY.0.0.49.js +0 -1
  546. package/dist/interface/uuid.Ch9TGLTe.0.0.49.js +0 -1
  547. package/dist/interface/vee-validate.8pUAwQ7T.0.0.49.js +0 -5
  548. package/dist/interface/vue-i18n.CBqdKRmG.0.0.49.js +0 -5
  549. package/dist/interface/vue-inline-svg.ZWpe_tFT.0.0.49.js +0 -1
  550. package/dist/interface/vue-router.DvFvaoP2.0.0.49.js +0 -5
  551. package/dist/interface/vue3-apexcharts.BHSDC9pf.0.0.49.js +0 -1
  552. package/dist/interface/vue3-dnd.DbCy3Qbj.0.0.49.js +0 -1
  553. package/dist/interface/vue3-toastify.JJyrPHKk.0.0.49.js +0 -1
  554. package/dist/interface/vuetify.kkqUjVJA.0.0.49.js +0 -5
  555. package/dist/interface/zod.bkdEMpUp.0.0.49.js +0 -1
  556. package/dist/server/src/api/utils/cameraSource.d.ts +0 -6
  557. package/dist/server/src/api/utils/cameraSource.js +0 -51
  558. package/dist/server/src/api/utils/cameraSource.js.map +0 -1
  559. package/dist/server/src/api/websocket/go2rtc.d.ts +0 -21
  560. package/dist/server/src/api/websocket/go2rtc.js +0 -88
  561. package/dist/server/src/api/websocket/go2rtc.js.map +0 -1
  562. package/dist/server/src/api/websocket/nsp/proxy.d.ts +0 -27
  563. package/dist/server/src/api/websocket/nsp/proxy.js +0 -127
  564. package/dist/server/src/api/websocket/nsp/proxy.js.map +0 -1
  565. package/dist/server/src/nats/index.d.ts +0 -40
  566. package/dist/server/src/nats/index.js +0 -164
  567. package/dist/server/src/nats/index.js.map +0 -1
  568. package/dist/server/src/nats/proxy/cameraDevice.d.ts +0 -22
  569. package/dist/server/src/nats/proxy/cameraDevice.js +0 -249
  570. package/dist/server/src/nats/proxy/cameraDevice.js.map +0 -1
  571. package/dist/server/src/nats/proxy/coreManager.d.ts +0 -14
  572. package/dist/server/src/nats/proxy/coreManager.js +0 -68
  573. package/dist/server/src/nats/proxy/coreManager.js.map +0 -1
  574. package/dist/server/src/nats/proxy/deviceManager.d.ts +0 -14
  575. package/dist/server/src/nats/proxy/deviceManager.js +0 -101
  576. package/dist/server/src/nats/proxy/deviceManager.js.map +0 -1
  577. package/dist/server/src/nats/server.js.map +0 -1
  578. package/dist/server/src/nats/types.d.ts +0 -18
  579. package/dist/server/src/nats/utils.js.map +0 -1
  580. /package/dist/interface/assets/{Backup.0.0.49.CX0rT0QJ.css → SettingsBackup.CX0rT0QJ.0.0.50-internal.1.css} +0 -0
  581. /package/dist/interface/assets/{highlight.0.0.49.Ch2EwETz.css → highlight.Ch2EwETz.0.0.50-internal.1.css} +0 -0
  582. /package/dist/interface/assets/{logo-256.0.0.49.BCQk9H1-.png → logo-256.BCQk9H1-.0.0.50-internal.1.png} +0 -0
  583. /package/dist/interface/assets/{logo-512.0.0.49.DLKVOU2S.png → logo-512.DLKVOU2S.0.0.50-internal.1.png} +0 -0
  584. /package/dist/interface/assets/{logo.0.0.49.DmEiRk0z.png → logo.DmEiRk0z.0.0.50-internal.1.png} +0 -0
  585. /package/dist/interface/assets/{mode-json.0.0.49.Br7xisR1.js → mode-json.Br7xisR1.0.0.50-internal.1.js} +0 -0
  586. /package/dist/interface/assets/{mode-yaml.0.0.49.CIYL8U3d.js → mode-yaml.CIYL8U3d.0.0.50-internal.1.js} +0 -0
  587. /package/dist/interface/{@babel.l0sNRNKZ.0.0.49.js → js/@babel.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  588. /package/dist/interface/{@react-dnd.CcwRs9xb.0.0.49.js → js/@react-dnd.CcwRs9xb.0.0.50-internal.1.js} +0 -0
  589. /package/dist/interface/{@socket.io.Dkula2eQ.0.0.49.js → js/@socket.io.Dkula2eQ.0.0.50-internal.1.js} +0 -0
  590. /package/dist/interface/{birpc.l0sNRNKZ.0.0.49.js → js/birpc.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  591. /package/dist/interface/{compare-versions.DqEOhma6.0.0.49.js → js/compare-versions.DqEOhma6.0.0.50-internal.1.js} +0 -0
  592. /package/dist/interface/{dijkstrajs.C00ieaqj.0.0.49.js → js/dijkstrajs.C00ieaqj.0.0.50-internal.1.js} +0 -0
  593. /package/dist/interface/{engine.io-parser.BiEtp6m2.0.0.49.js → js/engine.io-parser.BiEtp6m2.0.0.50-internal.1.js} +0 -0
  594. /package/dist/interface/{entities.C20TfXL6.0.0.49.js → js/entities.C20TfXL6.0.0.50-internal.1.js} +0 -0
  595. /package/dist/interface/{ev-emitter.X5f1qa-c.0.0.49.js → js/ev-emitter.X5f1qa-c.0.0.50-internal.1.js} +0 -0
  596. /package/dist/interface/{get-size.D1dS-IaP.0.0.49.js → js/get-size.D1dS-IaP.0.0.50-internal.1.js} +0 -0
  597. /package/dist/interface/{vue.l0sNRNKZ.0.0.49.js → js/hookable.l0sNRNKZ.0.0.50-internal.1.js} +0 -0
  598. /package/dist/interface/{mdurl.k9Sl0PQj.0.0.49.js → js/mdurl.k9Sl0PQj.0.0.50-internal.1.js} +0 -0
  599. /package/dist/interface/{punycode.js.Dj65hjkv.0.0.49.js → js/punycode.js.Dj65hjkv.0.0.50-internal.1.js} +0 -0
  600. /package/dist/interface/{react-dnd-html5-backend.1HQjlkwI.0.0.49.js → js/react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.1.js} +0 -0
  601. /package/dist/interface/{redux.BFxtlG_c.0.0.49.js → js/redux.BFxtlG_c.0.0.50-internal.1.js} +0 -0
  602. /package/dist/interface/{tslib.9k7AwCpt.0.0.49.js → js/tslib.9k7AwCpt.0.0.50-internal.1.js} +0 -0
  603. /package/dist/interface/{uc.micro.kMc2yuuw.0.0.49.js → js/uc.micro.kMc2yuuw.0.0.50-internal.1.js} +0 -0
  604. /package/dist/server/src/{nats → decoder}/types.js +0 -0
  605. /package/dist/server/src/{nats → rpc}/utils.js +0 -0
@@ -0,0 +1,584 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import contextlib
5
+ import logging
6
+ from collections.abc import AsyncGenerator, Awaitable, Callable
7
+ from dataclasses import dataclass
8
+ from functools import partial
9
+ from typing import Any
10
+
11
+ from ..typings import (
12
+ BroadcastMessage,
13
+ ClientConnectionOptions,
14
+ GeneratorControl,
15
+ GeneratorMessage,
16
+ GeneratorResult,
17
+ )
18
+ from ..utils.logger import setup_logger
19
+ from ..utils.subscriptions import SubscriptionWrapper
20
+ from ..utils.uid import uid
21
+ from .connection import RPCConnectionManager
22
+ from .errors import ErrorFactory, NatsError
23
+
24
+ logger: logging.Logger = setup_logger("camera:ui:rpc:generator")
25
+
26
+
27
+ @dataclass
28
+ class ConsumerGeneratorState:
29
+ """State for the consumer side of the generator."""
30
+
31
+ message_queue: list[GeneratorResult]
32
+ resolve_next: asyncio.Future[Any] | None
33
+ stream_subscription: SubscriptionWrapper
34
+ control_subject: str
35
+ dedicated_connection: RPCConnectionManager
36
+ error: Exception | None = None
37
+ is_done: bool = False
38
+ last_processed_time: float = 0.0
39
+ is_processing: bool = False
40
+
41
+ def __post_init__(self) -> None:
42
+ self.last_processed_time = asyncio.get_event_loop().time()
43
+
44
+
45
+ @dataclass
46
+ class ProducerGeneratorState:
47
+ """State for the producer side of the generator."""
48
+
49
+ stream_subject: str
50
+ control_subject: str
51
+ request_id: str
52
+ stream_id: str
53
+ generator: AsyncGenerator[Any, None]
54
+ dedicated_connection: RPCConnectionManager
55
+ control_subscription: SubscriptionWrapper
56
+ is_waiting_for_client: bool = False
57
+ last_sent_time: float = 0.0
58
+
59
+ def __post_init__(self) -> None:
60
+ self.last_sent_time = asyncio.get_event_loop().time()
61
+
62
+
63
+ class RPCGeneratorManager:
64
+ def __init__(
65
+ self, namespace: str, main_connection: RPCConnectionManager, options: ClientConnectionOptions
66
+ ):
67
+ self._namespace: str = namespace
68
+ self._main_connection: RPCConnectionManager = main_connection
69
+ self._options: ClientConnectionOptions = options
70
+ self._consumer_generator_states: dict[str, ConsumerGeneratorState] = {}
71
+ self._producer_generator_states: dict[str, ProducerGeneratorState] = {}
72
+ self._handler_subscriptions: dict[str, SubscriptionWrapper] = {}
73
+ self._pending_ready_signals: dict[str, set[asyncio.Future[Any]]] = {}
74
+ self._MAX_QUEUE_SIZE: int = 100
75
+
76
+ async def create_generator(self, method: str, *args: Any) -> AsyncGenerator[Any, None]:
77
+ """Client-side: Create and consume a remote generator stream with dedicated connection."""
78
+
79
+ stream_id = uid()
80
+ subject = f"{self._namespace}.{method}.generator"
81
+ stream_subject = f"{subject}.stream.{stream_id}"
82
+ control_subject = f"{subject}.control.{stream_id}"
83
+
84
+ logger.debug(f"[C:{stream_id}] Starting generator stream for {method}")
85
+
86
+ consumer_connection: RPCConnectionManager | None = None
87
+ consumer_state: ConsumerGeneratorState | None = None
88
+
89
+ try:
90
+ # 1. Create and connect consumer connection
91
+ logger.debug(f"[C:{stream_id}] Creating dedicated consumer connection...")
92
+
93
+ consumer_connection = RPCConnectionManager(
94
+ self._main_connection.type,
95
+ {
96
+ **self._options,
97
+ "metadata": {
98
+ **self._options.get("metadata", {}),
99
+ "id": f"{self._options.get('metadata', {}).get('id', 'rpc')}-cg-{stream_id[:8]}",
100
+ },
101
+ "bundled_connection": False,
102
+ "timeout": self._options.get("timeout", {}),
103
+ },
104
+ )
105
+
106
+ await consumer_connection.connect()
107
+
108
+ logger.debug(f"[C:{stream_id}] Dedicated consumer connection established.")
109
+
110
+ # 2. Subscribe to data stream (using dedicated connection)
111
+ stream_subscription = await consumer_connection.subscribe(
112
+ stream_subject, partial(self._handle_stream_message, stream_id), None, "generator"
113
+ )
114
+
115
+ logger.debug(f"[C:{stream_id}] Subscribed to data stream: {stream_subject}")
116
+
117
+ # 3. Initialize consumer state
118
+ consumer_state = ConsumerGeneratorState(
119
+ message_queue=[],
120
+ resolve_next=None,
121
+ stream_subscription=stream_subscription,
122
+ control_subject=control_subject,
123
+ dedicated_connection=consumer_connection,
124
+ )
125
+
126
+ self._consumer_generator_states[stream_id] = consumer_state
127
+
128
+ # 4. Send initiation request (using main connection)
129
+ logger.debug(f"[C:{stream_id}] Sending initiation request via main connection to {subject}")
130
+ await self._main_connection.publish(
131
+ subject,
132
+ {
133
+ "streamId": stream_id,
134
+ "args": args,
135
+ },
136
+ )
137
+
138
+ # 5. Consumption loop
139
+ while not consumer_state.is_done:
140
+ if consumer_state.error:
141
+ raise consumer_state.error
142
+
143
+ # Process queued messages first
144
+ if consumer_state.message_queue:
145
+ response = consumer_state.message_queue.pop(0)
146
+ consumer_state.is_processing = True
147
+
148
+ try:
149
+ yield response.get("value")
150
+ finally:
151
+ consumer_state.is_processing = False
152
+ consumer_state.last_processed_time = asyncio.get_event_loop().time()
153
+ await self._send_ready_signal(
154
+ stream_id, consumer_state.control_subject, consumer_state.dedicated_connection
155
+ )
156
+ continue
157
+
158
+ # Wait for next value
159
+ consumer_state.is_processing = False
160
+
161
+ # We need to re-check state for safety
162
+ next_future: asyncio.Future[Any] = asyncio.Future()
163
+ current_state = self._consumer_generator_states.get(stream_id)
164
+ if current_state:
165
+ current_state.resolve_next = next_future
166
+ next_result = await next_future
167
+ else:
168
+ break # State was removed
169
+
170
+ consumer_generator = self._consumer_generator_states.get(stream_id)
171
+ if next_result["done"] or consumer_generator and consumer_generator.is_done:
172
+ break
173
+
174
+ # Ensure state is current
175
+ consumer_state = self._consumer_generator_states[stream_id]
176
+ consumer_state.is_processing = True
177
+
178
+ try:
179
+ yield next_result["value"].get("value")
180
+ finally:
181
+ consumer_state.is_processing = False
182
+ consumer_state.last_processed_time = asyncio.get_event_loop().time()
183
+ await self._send_ready_signal(
184
+ stream_id, consumer_state.control_subject, consumer_state.dedicated_connection
185
+ )
186
+
187
+ logger.debug(f"[C:{stream_id}] Consumption loop finished.")
188
+
189
+ finally:
190
+ # Cleanup
191
+ logger.debug(f"[C:{stream_id}] Cleaning up consumer side...")
192
+
193
+ final_state = self._consumer_generator_states.get(stream_id)
194
+
195
+ if final_state:
196
+ await self._cleanup_consumer_generator(stream_id, final_state)
197
+ elif consumer_connection and not consumer_connection.is_closed():
198
+ potential_control_subject = f"{self._namespace}.{method}.generator.control.{stream_id}"
199
+ await self._cleanup_consumer_connection(
200
+ stream_id, consumer_connection, potential_control_subject
201
+ )
202
+
203
+ self._consumer_generator_states.pop(stream_id, None)
204
+ logger.debug(f"[C:{stream_id}] Consumer cleanup finished.")
205
+
206
+ async def handle_generator(self, method: str, handler: Callable[..., AsyncGenerator[Any, None]]) -> None:
207
+ """Producer: Register handler (subscribes on main connection)"""
208
+
209
+ init_subject = f"{self._namespace}.{method}.generator"
210
+ logger.debug(f"[P] Setting up generator handler for: {init_subject}")
211
+
212
+ # Cleanup any existing subscription
213
+ if init_subject in self._handler_subscriptions:
214
+ await self._handler_subscriptions[init_subject].unsubscribe()
215
+
216
+ # Create new subscription using main connection
217
+ subscription = await self._main_connection.subscribe(
218
+ init_subject,
219
+ partial(self._handle_generator_request_wrapper, method, handler),
220
+ None,
221
+ "generator",
222
+ )
223
+
224
+ self._handler_subscriptions[init_subject] = subscription
225
+
226
+ async def _handle_generator_request_wrapper(
227
+ self,
228
+ method: str,
229
+ handler: Callable[..., AsyncGenerator[Any, None]],
230
+ message: BroadcastMessage[GeneratorMessage],
231
+ ) -> None:
232
+ """Wrapper to handle exceptions at the top level of generator request handling"""
233
+ try:
234
+ await self._handle_generator_request(method, handler, message)
235
+ except Exception as error:
236
+ stream_id = message["data"].get("streamId", "unknown")
237
+ logger.debug(f"[P:{stream_id}] Critical error setting up generator handler for {method}: {error}")
238
+
239
+ async def _handle_generator_request(
240
+ self,
241
+ method: str,
242
+ handler: Callable[..., AsyncGenerator[Any, None]],
243
+ message: BroadcastMessage[GeneratorMessage],
244
+ ) -> None:
245
+ """Producer: Handle specific request, create dedicated connection"""
246
+ stream_id = message["data"].get("streamId")
247
+ if not stream_id:
248
+ logger.debug(f"[P:unknown] Received generator request for {method} without streamId. Discarding.")
249
+ return
250
+
251
+ subject = f"{self._namespace}.{method}.generator"
252
+ stream_subject = f"{subject}.stream.{stream_id}"
253
+ control_subject = f"{subject}.control.{stream_id}"
254
+ logger.debug(f"[P:{stream_id}] Received generator request for {method}")
255
+
256
+ producer_connection: RPCConnectionManager | None = None
257
+ producer_state: ProducerGeneratorState | None = None
258
+ generator: AsyncGenerator[Any, None] | None = None
259
+
260
+ try:
261
+ # 1. Create and connect producer connection
262
+ logger.debug(f"[P:{stream_id}] Creating dedicated producer connection...")
263
+
264
+ producer_connection = RPCConnectionManager(
265
+ self._main_connection.type,
266
+ {
267
+ **self._options,
268
+ "metadata": {
269
+ **self._options.get("metadata", {}),
270
+ "id": f"{self._options.get('metadata', {}).get('id', 'rpc')}-pg-{stream_id[:8]}",
271
+ },
272
+ "bundled_connection": False,
273
+ "timeout": self._options.get("timeout", {}),
274
+ },
275
+ )
276
+
277
+ await producer_connection.connect()
278
+
279
+ logger.debug(f"[P:{stream_id}] Dedicated producer connection established.")
280
+
281
+ # 2. Setup ready signal map entry
282
+ if stream_id not in self._pending_ready_signals:
283
+ self._pending_ready_signals[stream_id] = set()
284
+
285
+ # 3. Subscribe to control messages (using dedicated connection)
286
+ control_subscription = await producer_connection.subscribe(
287
+ control_subject, partial(self._handle_control_message, stream_id), None, "generator"
288
+ )
289
+
290
+ logger.debug(f"[P:{stream_id}] Subscribed to control subject: {control_subject}")
291
+
292
+ # 4. Invoke user generator
293
+ args = tuple(message["data"].get("args", ()))
294
+
295
+ generator = handler(*args)
296
+
297
+ # 5. Initialize producer state
298
+ producer_state = ProducerGeneratorState(
299
+ stream_subject=stream_subject,
300
+ control_subject=control_subject,
301
+ request_id=message["id"],
302
+ stream_id=stream_id,
303
+ generator=generator,
304
+ dedicated_connection=producer_connection,
305
+ control_subscription=control_subscription,
306
+ )
307
+
308
+ self._producer_generator_states[stream_id] = producer_state
309
+ logger.debug(f"[P:{stream_id}] Generator handler invoked. Processing frames...")
310
+
311
+ try:
312
+ next_result = await generator.__anext__()
313
+
314
+ while True:
315
+ if self._producer_generator_states.get(stream_id) != producer_state:
316
+ logger.debug(f"[P:{stream_id}] Producer state removed. Aborting loop.")
317
+ break
318
+
319
+ # If done (end of generator), send done message
320
+ if next_result is None: # stop iteration will be raised automatically
321
+ await producer_connection.publish(
322
+ stream_subject, {"requestId": message["id"], "streamId": stream_id, "done": True}
323
+ )
324
+ logger.debug(f"[P:{stream_id}] Generator completed normally.")
325
+ break
326
+
327
+ # Send via dedicated connection
328
+ await producer_connection.publish(
329
+ stream_subject,
330
+ {
331
+ "requestId": message["id"],
332
+ "streamId": stream_id,
333
+ "value": next_result,
334
+ "done": False,
335
+ },
336
+ )
337
+
338
+ producer_state.last_sent_time = asyncio.get_event_loop().time()
339
+
340
+ # Wait for ready signal
341
+ producer_state.is_waiting_for_client = True
342
+
343
+ wait_future: asyncio.Future[Any] = asyncio.Future()
344
+ ready_signals = self._pending_ready_signals.get(stream_id, set())
345
+ ready_signals.add(wait_future)
346
+
347
+ try:
348
+ # 10s timeout
349
+ await asyncio.wait_for(wait_future, 10.0)
350
+ except asyncio.TimeoutError:
351
+ logger.debug(f"[P:{stream_id}] Ready signal timeout.")
352
+ ready_signals.discard(wait_future)
353
+
354
+ if self._producer_generator_states.get(stream_id) != producer_state:
355
+ logger.debug(f"[P:{stream_id}] Producer state changed during wait. Aborting loop.")
356
+ break
357
+
358
+ try:
359
+ next_result = await generator.__anext__()
360
+ except StopAsyncIteration:
361
+ await producer_connection.publish(
362
+ stream_subject,
363
+ {
364
+ "requestId": message["id"],
365
+ "streamId": stream_id,
366
+ "done": True,
367
+ },
368
+ )
369
+ logger.debug(f"[P:{stream_id}] Generator completed normally.")
370
+ break
371
+
372
+ except StopAsyncIteration:
373
+ # Generator is empty
374
+ await producer_connection.publish(
375
+ stream_subject,
376
+ {
377
+ "requestId": message["id"],
378
+ "streamId": stream_id,
379
+ "done": True,
380
+ },
381
+ )
382
+ logger.debug(f"[P:{stream_id}] Generator is empty (StopAsyncIteration on first next).")
383
+
384
+ except Exception as error:
385
+ # Error handling
386
+ logger.debug(f"[P:{stream_id}] Error during generator execution: {error}")
387
+ if producer_connection and stream_id in self._producer_generator_states:
388
+ nats_error = ErrorFactory.rpc.internal_error(
389
+ error, {"description": "Error processing generator request"}
390
+ )
391
+ try:
392
+ await producer_connection.publish(
393
+ stream_subject,
394
+ {
395
+ "requestId": message["id"],
396
+ "streamId": stream_id,
397
+ "done": True,
398
+ "error": nats_error.to_json(),
399
+ },
400
+ )
401
+ except Exception as publish_error:
402
+ logger.debug(f"[P:{stream_id}] Error sending error message: {publish_error}")
403
+
404
+ finally:
405
+ # Cleanup
406
+ logger.debug(f"[P:{stream_id}] Cleaning up producer side...")
407
+ final_state = self._producer_generator_states.get(stream_id)
408
+
409
+ if final_state:
410
+ await self._cleanup_producer_generator(stream_id, final_state)
411
+ elif producer_connection and not producer_connection.is_closed():
412
+ await self._cleanup_producer_connection(producer_connection, None)
413
+
414
+ self._producer_generator_states.pop(stream_id, None)
415
+ self._pending_ready_signals.pop(stream_id, None)
416
+ logger.debug(f"[P:{stream_id}] Producer side cleanup finished.")
417
+
418
+ async def dispose(self) -> None:
419
+ """Dispose all resources"""
420
+ logger.debug("Disposing RPCGeneratorManager...")
421
+
422
+ # Create cleanup tasks
423
+ cleanup_tasks: list[Awaitable[Any]] = []
424
+
425
+ # Clean up consumer generators
426
+ for stream_id, state in list(self._consumer_generator_states.items()):
427
+ cleanup_tasks.append(self._cleanup_consumer_generator(stream_id, state))
428
+
429
+ # Clean up producer generators
430
+ for stream_id, state in list(self._producer_generator_states.items()):
431
+ cleanup_tasks.append(self._cleanup_producer_generator(stream_id, state))
432
+
433
+ # Wait for all cleanup to complete
434
+ if cleanup_tasks:
435
+ await asyncio.gather(*cleanup_tasks, return_exceptions=True)
436
+
437
+ # Clear all state
438
+ self._consumer_generator_states.clear()
439
+ self._producer_generator_states.clear()
440
+ self._pending_ready_signals.clear()
441
+
442
+ # Unsubscribe all handlers
443
+ for subscription in list(self._handler_subscriptions.values()):
444
+ await subscription.unsubscribe()
445
+
446
+ self._handler_subscriptions.clear()
447
+ logger.debug("RPCGeneratorManager disposed.")
448
+
449
+ async def _handle_stream_message(
450
+ self, stream_id: str, message: BroadcastMessage[GeneratorResult]
451
+ ) -> None:
452
+ """Consumer: Handles incoming stream messages"""
453
+ state = self._consumer_generator_states.get(stream_id)
454
+ if not state:
455
+ return
456
+
457
+ if "error" in message and message["error"]:
458
+ # Handle error
459
+ state.error = NatsError.from_json(message["error"])
460
+ state.is_done = True
461
+ if state.resolve_next and not state.resolve_next.done():
462
+ state.resolve_next.set_result({"done": True, "value": None})
463
+ state.resolve_next = None
464
+ return
465
+
466
+ if message["data"].get("done"):
467
+ # Handle completion
468
+ state.is_done = True
469
+ if state.resolve_next and not state.resolve_next.done():
470
+ state.resolve_next.set_result({"done": True, "value": message["data"]})
471
+ state.resolve_next = None
472
+ return
473
+
474
+ if state.resolve_next and not state.resolve_next.done():
475
+ # Resolve waiting consumer
476
+ state.resolve_next.set_result({"done": False, "value": message["data"]})
477
+ state.resolve_next = None
478
+ else:
479
+ # Queue message
480
+ if len(state.message_queue) >= self._MAX_QUEUE_SIZE:
481
+ state.message_queue.pop(0) # Remove oldest
482
+ state.message_queue.append(message["data"])
483
+
484
+ async def _handle_control_message(
485
+ self, stream_id: str, control_message: BroadcastMessage[GeneratorControl]
486
+ ) -> None:
487
+ """Producer: Handles incoming control messages"""
488
+ producer_state = self._producer_generator_states.get(stream_id)
489
+ if not producer_state:
490
+ return
491
+
492
+ if control_message["data"]["type"] in ("return", "throw"):
493
+ # Client requested termination
494
+ await self._cleanup_producer_generator(stream_id, producer_state)
495
+ elif control_message["data"]["type"] == "ready":
496
+ # Client is ready for next message
497
+ producer_state.is_waiting_for_client = False
498
+ ready_signals = self._pending_ready_signals.get(stream_id, set())
499
+
500
+ # Resolve all waiting futures
501
+ for future in list(ready_signals):
502
+ if not future.done():
503
+ future.set_result(None)
504
+
505
+ ready_signals.clear()
506
+
507
+ async def _send_ready_signal(
508
+ self, stream_id: str, control_subject: str, connection: RPCConnectionManager
509
+ ) -> None:
510
+ """Consumer: Sends 'ready' signal via dedicated connection"""
511
+ if connection.is_closed():
512
+ return
513
+
514
+ try:
515
+ await connection.publish(control_subject, {"type": "ready"})
516
+ logger.debug(f"[C:{stream_id}] Sent ready signal")
517
+ except Exception as error:
518
+ logger.debug(f"[C:{stream_id}] Error sending ready signal: {error}")
519
+
520
+ async def _cleanup_consumer_generator(self, stream_id: str, state: ConsumerGeneratorState) -> None:
521
+ """Consumer: Initiates cleanup"""
522
+ if stream_id not in self._consumer_generator_states:
523
+ return
524
+
525
+ self._consumer_generator_states.pop(stream_id, None)
526
+ logger.debug(f"[C:{stream_id}] Cleaning up consumer generator...")
527
+
528
+ # Unsubscribe from data stream
529
+ await state.stream_subscription.unsubscribe()
530
+
531
+ # Clean up connection
532
+ await self._cleanup_consumer_connection(stream_id, state.dedicated_connection, state.control_subject)
533
+
534
+ async def _cleanup_consumer_connection(
535
+ self, stream_id: str, connection: RPCConnectionManager, control_subject: str | None
536
+ ) -> None:
537
+ """Consumer: Cleans up connection"""
538
+ logger.debug(f"[C:{stream_id}] Cleaning up consumer connection...")
539
+
540
+ # Send return signal if possible
541
+ if control_subject and not connection.is_closed():
542
+ with contextlib.suppress(Exception):
543
+ await connection.publish(control_subject, {"type": "return"})
544
+
545
+ # Disconnect
546
+ if not connection.is_closed():
547
+ try:
548
+ await connection.disconnect()
549
+ except Exception as error:
550
+ logger.debug(f"[C:{stream_id}] Error disconnecting consumer connection: {error}")
551
+
552
+ async def _cleanup_producer_generator(self, stream_id: str, state: ProducerGeneratorState) -> None:
553
+ """Producer: Initiates cleanup"""
554
+ if stream_id not in self._producer_generator_states:
555
+ return
556
+
557
+ self._producer_generator_states.pop(stream_id, None)
558
+ self._pending_ready_signals.pop(stream_id, None)
559
+ logger.debug(f"[P:{stream_id}] Cleaning up producer generator...")
560
+
561
+ # Close generator
562
+ with contextlib.suppress(Exception):
563
+ await state.generator.aclose()
564
+
565
+ # Clean up connection
566
+ await self._cleanup_producer_connection(state.dedicated_connection, state.control_subscription)
567
+
568
+ async def _cleanup_producer_connection(
569
+ self, connection: RPCConnectionManager, control_subscription: SubscriptionWrapper | None
570
+ ) -> None:
571
+ """Producer: Cleans up connection"""
572
+ conn_id = connection.options.get("metadata", {}).get("id", "unknown-producer")
573
+ logger.debug(f"[P:{conn_id}] Cleaning up producer connection...")
574
+
575
+ # Unsubscribe from control channel
576
+ if control_subscription:
577
+ await control_subscription.unsubscribe()
578
+
579
+ # Disconnect
580
+ if not connection.is_closed():
581
+ try:
582
+ await connection.disconnect()
583
+ except Exception as error:
584
+ logger.debug(f"[P:{conn_id}] Error disconnecting producer connection: {error}")
@@ -0,0 +1,96 @@
1
+ from datetime import datetime
2
+ from typing import Any, Final, Literal
3
+
4
+ from .typings import ClientMetrics
5
+
6
+
7
+ class SUBJECTS:
8
+ class HEALTH:
9
+ PING: Literal["health.ping"] = "health.ping"
10
+ PONG: Literal["health.pong"] = "health.pong"
11
+
12
+ class SERVER:
13
+ STATUS: Literal["server.status"] = "server.status"
14
+ BROADCAST: Literal["server.broadcast"] = "server.broadcast"
15
+
16
+ class PLUGIN:
17
+ REGISTER: Literal["plugin.register"] = "plugin.register"
18
+ UNREGISTER: Literal["plugin.unregister"] = "plugin.unregister"
19
+ STATUS: Literal["plugin.status"] = "plugin.status"
20
+
21
+ class SERVICE:
22
+ REGISTER: Literal["service.register"] = "service.register"
23
+ UNREGISTER: Literal["service.unregister"] = "service.unregister"
24
+ STATUS: Literal["service.status"] = "service.status"
25
+
26
+ class METRICS:
27
+ UPDATE: Literal["metrics.update"] = "metrics.update"
28
+
29
+
30
+ class MESSAGE:
31
+ class TYPES:
32
+ REQUEST: Literal["request"] = "request"
33
+ RESPONSE: Literal["response"] = "response"
34
+ BROADCAST: Literal["broadcast"] = "broadcast"
35
+ RPC_REQUEST: Literal["rpcrequest"] = "rpcrequest"
36
+ RPC_RESPONSE: Literal["rpcresponse"] = "rpcresponse"
37
+ RPC_STREAM_REQUEST: Literal["rpcstreamrequest"] = "rpcstreamrequest"
38
+
39
+ class PRIORITIES:
40
+ HIGH: Literal["high"] = "high"
41
+ NORMAL: Literal["normal"] = "normal"
42
+ LOW: Literal["low"] = "low"
43
+
44
+ class HEADERS:
45
+ CORRELATION_ID: Literal["correlation-id"] = "correlation-id"
46
+ REQUEST_ID: Literal["request-id"] = "request-id"
47
+ TIMESTAMP: Literal["timestamp"] = "timestamp"
48
+ PRIORITY: Literal["priority"] = "priority"
49
+ TTL: Literal["ttl"] = "ttl"
50
+
51
+
52
+ class DEFAULTS:
53
+ class TIMEOUTS:
54
+ CONNECTION: Final[int] = 5000 # 5 seconds
55
+ REQUEST: Final[int] = 5000 # 5 seconds
56
+ RPC: Final[int] = 5000 # 5 seconds
57
+
58
+ class INTERVALS:
59
+ HEARTBEAT: Final[int] = 15000 # 10 seconds
60
+ CLEANUP: Final[int] = 60000 # 1 minute
61
+ METRICS: Final[int] = 60000 # 1 minute
62
+
63
+ class RETRY:
64
+ MAX_RECONNECT_ATTEMPTS: Final[int] = -1 # Infinite retries
65
+ DELAY: Final[int] = 1000 # 1 second
66
+
67
+ class METRICS:
68
+ TTL: Final[int] = 60000 # 1 minute
69
+
70
+
71
+ DEFAULT_CLIENT_METRICS: ClientMetrics = {
72
+ "timestamp": int(datetime.now().timestamp() * 1000),
73
+ "startTime": int(datetime.now().timestamp() * 1000),
74
+ "requests": {"total": 0, "active": 0, "errors": 0, "perSecond": 0, "avgResponseTime": 0},
75
+ "messages": {"published": 0, "received": 0, "errors": 0},
76
+ "rpc": {"total": 0, "active": 0, "errors": 0},
77
+ "subscriptions": {"active": 0, "messageHandlers": 0, "requestHandlers": 0, "rpcHandlers": 0},
78
+ }
79
+
80
+ BASE_METRICS: dict[str, Any] = {
81
+ "requests": {
82
+ "total": 0,
83
+ "active": 0,
84
+ "errors": 0,
85
+ "timings": {},
86
+ "in_window": {
87
+ "count": 0,
88
+ "errors": 0,
89
+ "response_times": [],
90
+ "start_time": int(datetime.now().timestamp() * 1000),
91
+ },
92
+ },
93
+ "messages": {"published": 0, "received": 0, "errors": 0},
94
+ "rpc": {"total": 0, "active": 0, "errors": 0},
95
+ "subscriptions": {"active": 0, "message_handlers": 0, "request_handlers": 0, "rpc_handlers": 0},
96
+ }