@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,784 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import inspect
5
+ import logging
6
+ import os
7
+ import ssl
8
+ import tempfile
9
+ from collections.abc import Awaitable
10
+ from datetime import datetime
11
+ from pathlib import Path
12
+ from typing import Any, Callable, Literal, TypedDict, TypeVar, Union, cast
13
+
14
+ import nats
15
+ from nats.aio.client import Client as NatsConnection
16
+ from nats.aio.msg import Msg
17
+ from nats.aio.subscription import Subscription
18
+ from typing_extensions import NotRequired
19
+
20
+ from ..constants import DEFAULTS, MESSAGE
21
+ from ..typings import (
22
+ BroadcastMessage,
23
+ ClientConnectionOptions,
24
+ ClientMetrics,
25
+ ConnectOptions,
26
+ Message,
27
+ ReconnectOptions,
28
+ RequestMessage,
29
+ ResponseMessage,
30
+ RoutingMetadata,
31
+ RPCHandler,
32
+ RPCRequest,
33
+ RPCResponse,
34
+ SerializedError,
35
+ TimeoutOptions,
36
+ )
37
+ from ..utils.logger import setup_logger
38
+ from ..utils.metrics import ConnectionMetricsTracker
39
+ from ..utils.packer import pack, unpack
40
+ from ..utils.routing import EndpointType
41
+ from ..utils.subscriptions import SubscriptionWrapper
42
+ from ..utils.tasks import TaskSet
43
+ from ..utils.uid import uid
44
+ from ..utils.validate import ValidationUtils
45
+ from .errors import ERROR_CODES, ErrorFactory, NatsError
46
+
47
+ logger: logging.Logger = setup_logger("camera:ui:connection")
48
+
49
+ T = TypeVar("T")
50
+ R = TypeVar("R")
51
+
52
+
53
+ class GroupType:
54
+ subscription: Subscription
55
+ handlers: dict[str, Handlers[Any, Any]]
56
+ type_: Literal["message", "request", "rpc", "generator"]
57
+ ref_count: int
58
+
59
+ def __init__(self, subscription: Subscription):
60
+ self.subscription = subscription
61
+ self.handlers = {}
62
+ self.type_ = "message"
63
+ self.ref_count: int = 0
64
+
65
+
66
+ class MessageContext(TypedDict):
67
+ subject: str
68
+ timestamp: int
69
+ id: str
70
+ raw: NotRequired[Msg | None]
71
+
72
+
73
+ MessageHandler = Callable[[Message[T]], None]
74
+ AsyncMessageHandler = Callable[[Message[T]], Awaitable[None]]
75
+ MessageWithResponseHandler = Callable[[Message[T]], Awaitable[R]]
76
+ MessageHandlers = Union[MessageHandler[T], AsyncMessageHandler[T]]
77
+ Handlers = Union[MessageHandlers[T], MessageWithResponseHandler[T, R], RPCHandler]
78
+
79
+
80
+ class RPCConnectionManager:
81
+ options: ClientConnectionOptions
82
+
83
+ def __init__(self, type_: EndpointType, options: ClientConnectionOptions):
84
+ self.options: ClientConnectionOptions = options
85
+ self.type: EndpointType = type_
86
+ self._connection: NatsConnection | None = None
87
+ self._connection_promise: asyncio.Future[None] | None = None
88
+ self._subscription_groups: dict[str, GroupType] = {}
89
+ self._task_set: TaskSet = TaskSet("RPCConnectionManager")
90
+ self._metrics_tracker: ConnectionMetricsTracker = ConnectionMetricsTracker()
91
+ self._is_disconnected: bool = False
92
+
93
+ ValidationUtils.validate_connection_options(options)
94
+
95
+ async def connect(self) -> None:
96
+ if self.is_connected():
97
+ return
98
+
99
+ if self._connection_promise and not self._connection_promise.done():
100
+ await self._connection_promise
101
+ return
102
+
103
+ client_id = self.options["metadata"]["id"]
104
+ logger.debug(f"[{client_id}] Establishing connection...")
105
+
106
+ self._connection_promise = asyncio.Future()
107
+
108
+ try:
109
+ await self._establish_connection()
110
+ self._connection_promise.set_result(None)
111
+ current_promise = self._connection_promise
112
+ self._connection_promise = None
113
+ await current_promise
114
+
115
+ logger.debug(f"[{client_id}] Connection established successfully.")
116
+ except Exception as error:
117
+ client_id = self.options["metadata"]["id"]
118
+ logger.debug(f"[{client_id}] Connection failed during initial connect: {str(error)}")
119
+ if self._connection_promise and not self._connection_promise.done():
120
+ self._connection_promise.set_exception(error)
121
+ self._connection_promise = None
122
+ raise error
123
+
124
+ async def disconnect(self) -> None:
125
+ self._is_disconnected = True
126
+ client_id = self.options["metadata"]["id"]
127
+ logger.debug(f"[{client_id}] Disconnecting...")
128
+ await self._drain_connection()
129
+ self._connection = None
130
+ self._connection_promise = None
131
+ logger.debug(f"[{client_id}] Disconnected.")
132
+
133
+ def is_connected(self) -> bool:
134
+ return (
135
+ self._connection is not None
136
+ and not self._connection.is_closed
137
+ and not self._connection.is_draining
138
+ )
139
+
140
+ def is_closed(self) -> bool:
141
+ return self._connection is None or self._connection.is_closed or self._connection.is_draining
142
+
143
+ def get_connection(self) -> NatsConnection:
144
+ if not self.is_connected():
145
+ raise ErrorFactory.connection.invalid_state(
146
+ None,
147
+ {
148
+ "description": "Connection is not established",
149
+ "code": ERROR_CODES.CONNECTION.INVALID_STATE,
150
+ },
151
+ )
152
+ return cast(NatsConnection, self._connection)
153
+
154
+ async def publish(
155
+ self,
156
+ subject: str,
157
+ data: Any,
158
+ error: SerializedError | None = None,
159
+ routing: RoutingMetadata | None = None,
160
+ ) -> None:
161
+ client_id = self.options["metadata"]["id"]
162
+ if self.is_closed():
163
+ logger.debug(f"[{client_id}] Publish skipped: Connection closed or draining. Subject: {subject}")
164
+ raise ErrorFactory.connection.not_connected(
165
+ None,
166
+ {
167
+ "description": "Failed to publish message: Connection closed or draining",
168
+ "code": ERROR_CODES.CONNECTION.NOT_CONNECTED,
169
+ "subject": subject,
170
+ },
171
+ )
172
+
173
+ message: BroadcastMessage[Any] = {
174
+ "id": uid(),
175
+ "type": MESSAGE.TYPES.BROADCAST,
176
+ "data": data,
177
+ "metadata": self.options["metadata"],
178
+ "timestamp": int(datetime.now().timestamp() * 1000),
179
+ "routing": routing,
180
+ "error": error,
181
+ }
182
+
183
+ try:
184
+ await self.get_connection().publish(subject, self._pack_message(message))
185
+ self._metrics_tracker.track_publish()
186
+ logger.debug(f"Published message to {subject} {message['id']}")
187
+ except Exception as e:
188
+ self._metrics_tracker.track_message_error()
189
+ raise ErrorFactory.message.delivery_failed(
190
+ e,
191
+ {
192
+ "description": "Failed to publish message",
193
+ "code": ERROR_CODES.MESSAGE.DELIVERY_FAILED,
194
+ "subject": subject,
195
+ },
196
+ ) from e
197
+
198
+ async def request(
199
+ self,
200
+ subject: str,
201
+ data: Any,
202
+ timeout: int | None = None,
203
+ routing: RoutingMetadata | None = None,
204
+ ) -> ResponseMessage[Any]:
205
+ client_id = self.options["metadata"]["id"]
206
+ if self.is_closed():
207
+ logger.debug(f"[{client_id}] Request skipped: Connection closed or draining. Subject: {subject}")
208
+ raise ErrorFactory.connection.not_connected(
209
+ None,
210
+ {
211
+ "description": "Failed to send request: Connection closed or draining",
212
+ "code": ERROR_CODES.CONNECTION.NOT_CONNECTED,
213
+ "subject": subject,
214
+ },
215
+ )
216
+
217
+ if timeout is None:
218
+ timeout = self.get_timeout_options().get("request", DEFAULTS.TIMEOUTS.REQUEST)
219
+
220
+ request_id = uid()
221
+
222
+ request_msg: RequestMessage[Any] = {
223
+ "id": request_id,
224
+ "type": MESSAGE.TYPES.REQUEST,
225
+ "subject": subject,
226
+ "data": data,
227
+ "metadata": self.options["metadata"],
228
+ "timestamp": int(datetime.now().timestamp() * 1000),
229
+ "routing": routing,
230
+ }
231
+
232
+ self._metrics_tracker.track_request_start(request_id)
233
+
234
+ try:
235
+ response = await self.get_connection().request(
236
+ subject, self._pack_message(request_msg), timeout=timeout / 1000
237
+ )
238
+ result: ResponseMessage[Any] = self._unpack_message(response.data)
239
+
240
+ self._metrics_tracker.track_request_end(request_id, bool(result.get("error")))
241
+ if "error" in result and result["error"]:
242
+ raise NatsError.from_json(result["error"])
243
+
244
+ return result
245
+
246
+ except Exception as error:
247
+ self._metrics_tracker.track_request_end(request_id, True)
248
+ if isinstance(error, NatsError):
249
+ raise error
250
+ raise ErrorFactory.connection.request_failed(
251
+ error,
252
+ {
253
+ "description": "Failed to send request or process response",
254
+ "code": "CONNECTION_REQUEST_FAILED",
255
+ "subject": subject,
256
+ },
257
+ ) from error
258
+
259
+ async def request_rpc(self, subject: str, data: Any, timeout: int | None = None) -> RPCResponse[Any]:
260
+ client_id = self.options["metadata"]["id"]
261
+ if self.is_closed():
262
+ logger.debug(
263
+ f"[{client_id}] RPC Request skipped: Connection closed or draining. Subject: {subject}"
264
+ )
265
+ raise ErrorFactory.connection.not_connected(
266
+ None,
267
+ {
268
+ "description": "Failed to send RPC request: Connection closed or draining",
269
+ "code": ERROR_CODES.CONNECTION.NOT_CONNECTED,
270
+ "subject": subject,
271
+ },
272
+ )
273
+
274
+ if timeout is None:
275
+ timeout = self.get_timeout_options().get("rpc", DEFAULTS.TIMEOUTS.RPC)
276
+
277
+ request: RPCRequest[Any] = {
278
+ "id": uid(),
279
+ "type": MESSAGE.TYPES.RPC_REQUEST,
280
+ "subject": subject,
281
+ "data": data,
282
+ "metadata": self.options["metadata"],
283
+ "timestamp": int(datetime.now().timestamp() * 1000),
284
+ }
285
+
286
+ self._metrics_tracker.track_rpc_start()
287
+
288
+ try:
289
+ response = await self.get_connection().request(
290
+ subject, self._pack_message(request), timeout=timeout / 1000
291
+ )
292
+ result: RPCResponse[Any] = self._unpack_message(response.data)
293
+
294
+ self._metrics_tracker.track_rpc_end(bool(result.get("error")))
295
+ if "error" in result and result["error"]:
296
+ raise NatsError.from_json(result["error"])
297
+
298
+ return result
299
+
300
+ except Exception as error:
301
+ self._metrics_tracker.track_rpc_end(True)
302
+ if isinstance(error, NatsError):
303
+ raise error
304
+ raise ErrorFactory.rpc.request_failed(
305
+ error,
306
+ {
307
+ "description": "Failed to send RPC request or process response",
308
+ "code": "RPC_REQUEST_FAILED",
309
+ "subject": subject,
310
+ },
311
+ ) from error
312
+
313
+ async def handle_request(self, subject: str, handler: Handlers[Any, Any]) -> SubscriptionWrapper:
314
+ return await self.subscribe(subject, handler, None, type_="request")
315
+
316
+ async def subscribe(
317
+ self,
318
+ subject: str,
319
+ handler: Handlers[Any, Any],
320
+ handler_id: str | None = None,
321
+ type_: Literal["message", "request", "rpc", "generator"] = "message",
322
+ ) -> SubscriptionWrapper:
323
+ client_id = self.options["metadata"]["id"]
324
+ if self.is_closed():
325
+ logger.debug(
326
+ f"[{client_id}] Subscribe skipped: Connection closed or draining. Subject: {subject}"
327
+ )
328
+ raise ErrorFactory.connection.not_connected(
329
+ None,
330
+ {
331
+ "description": "Failed to subscribe: Connection closed or draining",
332
+ "code": ERROR_CODES.CONNECTION.NOT_CONNECTED,
333
+ "subject": subject,
334
+ },
335
+ )
336
+
337
+ if handler_id is None:
338
+ handler_id = uid()
339
+
340
+ group = self._subscription_groups.get(subject)
341
+
342
+ if not group:
343
+ try:
344
+ subscription = await self.get_connection().subscribe(subject)
345
+ except Exception as error:
346
+ raise ErrorFactory.connection.subscribe_failed(
347
+ error,
348
+ {
349
+ "description": f"Failed to create NATS subscription for subject {subject}",
350
+ "code": "CONNECTION_SUBSCRIBE_FAILED",
351
+ "subject": subject,
352
+ "metadata": {"type": type_},
353
+ },
354
+ ) from error
355
+
356
+ group = GroupType(subscription)
357
+ group.type_ = type_
358
+ self._subscription_groups[subject] = group
359
+ self._task_set.add(self._handle_subscription(subscription, subject, group))
360
+ logger.debug(f"[{client_id}] Created subscription group for {subject}")
361
+ else:
362
+ if group.type_ != type_:
363
+ raise ValueError(f"Cannot mix handlers on subject {subject}")
364
+
365
+ if (type_ == "request" or type_ == "rpc" or type_ == "generator") and len(group.handlers) > 0:
366
+ raise ValueError(f"Request/RPC/Generator handler already registered for subject {subject}")
367
+
368
+ if handler_id in group.handlers:
369
+ logger.debug(f"[{client_id}] Handler {handler_id} already registered for subject {subject}")
370
+
371
+ group.handlers[handler_id] = handler
372
+ group.ref_count += 1
373
+
374
+ self._metrics_tracker.track_subscription_change(+1, type_)
375
+
376
+ logger.debug(
377
+ f"[{client_id}] Subscribed to {subject} (handler: {handler_id}, type: {type_}, refCount: {group.ref_count})"
378
+ )
379
+
380
+ return SubscriptionWrapper(subject, handler_id, self.unsubscribe)
381
+
382
+ async def unsubscribe(self, subject: str, handler_id: str) -> None:
383
+ group = self._subscription_groups.get(subject)
384
+ if not group:
385
+ return
386
+
387
+ if handler_id in group.handlers:
388
+ del group.handlers[handler_id]
389
+ group.ref_count -= 1
390
+ self._metrics_tracker.track_subscription_change(-1, group.type_)
391
+
392
+ if group.ref_count <= 0:
393
+ try:
394
+ await group.subscription.unsubscribe()
395
+ del self._subscription_groups[subject]
396
+ except Exception:
397
+ del self._subscription_groups[subject]
398
+
399
+ def get_metrics(self) -> ClientMetrics:
400
+ return self._metrics_tracker.get_metrics()
401
+
402
+ async def _establish_connection(self) -> None:
403
+ self._is_disconnected = False
404
+
405
+ time_options = self.get_timeout_options()
406
+ connect_options = self.get_connect_options()
407
+ reconnect_options = self.get_reconnect_options()
408
+
409
+ wait_for_server = connect_options.get("wait_for_server", False)
410
+ max_attempts = reconnect_options.get("max_attempts", DEFAULTS.RETRY.MAX_RECONNECT_ATTEMPTS)
411
+ delay = reconnect_options.get("delay", DEFAULTS.RETRY.DELAY)
412
+ reconnect_enabled = reconnect_options.get("enabled", False)
413
+
414
+ attempts = 0
415
+
416
+ while not self._is_disconnected:
417
+ attempts += 1
418
+ try:
419
+ client_id = self.options["metadata"]["id"]
420
+ logger.debug(f"[{client_id}] Connection attempt {attempts}...")
421
+
422
+ ssl_ctx = None
423
+ if "tls" in self.options and self.options["tls"]:
424
+ ssl_ctx = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH)
425
+ if "ca" in self.options["tls"]:
426
+ ssl_ctx.load_verify_locations(cadata=self.options["tls"]["ca"])
427
+
428
+ if "cert" in self.options["tls"] and "key" in self.options["tls"]:
429
+ unique_id = uid()
430
+ cert_path = Path(tempfile.gettempdir()) / f"cert_{os.getpid()}_{unique_id}.pem"
431
+ key_path = Path(tempfile.gettempdir()) / f"key_{os.getpid()}_{unique_id}.pem"
432
+
433
+ try:
434
+ cert_path.write_text(self.options["tls"]["cert"], encoding="utf-8")
435
+ key_path.write_text(self.options["tls"]["key"], encoding="utf-8")
436
+
437
+ cert_path.chmod(0o600)
438
+ key_path.chmod(0o600)
439
+
440
+ ssl_ctx.load_cert_chain(certfile=str(cert_path), keyfile=str(key_path))
441
+ finally:
442
+ try:
443
+ if cert_path.exists():
444
+ cert_path.unlink()
445
+ if key_path.exists():
446
+ key_path.unlink()
447
+ except Exception:
448
+ pass # Ignore
449
+
450
+ async def reconnect_callback() -> None:
451
+ client_id = self.options["metadata"]["id"]
452
+ logger.debug(f"[{client_id}] Connection reconnected.")
453
+
454
+ async def closed_callback(error: Exception | None = None) -> None:
455
+ client_id = self.options["metadata"]["id"]
456
+ logger.debug(f"[{client_id}] Connection closed: {error if error else ''}")
457
+ self._subscription_groups.clear()
458
+ self._metrics_tracker.reset_metrics()
459
+ self._is_disconnected = True
460
+ self._connection = None
461
+
462
+ async def ignore_cb(e: Any | None = None) -> None:
463
+ pass
464
+
465
+ connect_timeout = time_options.get("connection", DEFAULTS.TIMEOUTS.CONNECTION)
466
+
467
+ connection = await nats.connect(
468
+ name=self.options["metadata"]["id"],
469
+ servers=self.options["endpoints"],
470
+ **self._get_nats_auth_options(),
471
+ allow_reconnect=reconnect_enabled,
472
+ connect_timeout=connect_timeout,
473
+ max_reconnect_attempts=max_attempts if reconnect_enabled else 0,
474
+ reconnect_time_wait=delay,
475
+ pending_size=6 * 1024 * 1024,
476
+ flush_timeout=5.0,
477
+ no_echo=True,
478
+ tls=ssl_ctx,
479
+ error_cb=ignore_cb,
480
+ disconnected_cb=ignore_cb,
481
+ closed_cb=closed_callback,
482
+ reconnected_cb=reconnect_callback,
483
+ discovered_server_cb=ignore_cb,
484
+ )
485
+
486
+ client_id = self.options["metadata"]["id"]
487
+ logger.debug(f"[{client_id}] NATS connect() successful.")
488
+
489
+ self._connection = connection
490
+ return
491
+
492
+ except Exception as error:
493
+ if self._is_disconnected:
494
+ return
495
+
496
+ if not wait_for_server:
497
+ client_id = self.options["metadata"]["id"]
498
+ logger.debug(f"[{client_id}] Connection attempt {attempts} failed: {str(error)}")
499
+ raise ErrorFactory.connection.connection_failed(
500
+ error,
501
+ {
502
+ "description": "Failed to connect to NATS server",
503
+ "code": ERROR_CODES.CONNECTION.FAILED,
504
+ "metadata": {"attempts": attempts},
505
+ },
506
+ ) from error
507
+
508
+ client_id = self.options["metadata"]["id"]
509
+ logger.debug(f"[{client_id}] Connection attempt {attempts} failed: {str(error)}")
510
+ await asyncio.sleep(delay / 1000)
511
+
512
+ async def _drain_connection(self) -> None:
513
+ if self._connection and not self._connection.is_closed:
514
+ try:
515
+ await self._connection.drain()
516
+ except Exception:
517
+ logger.error("Error draining connection", exc_info=True)
518
+
519
+ async def _handle_subscription(self, subscription: Subscription, subject: str, group: GroupType) -> None:
520
+ client_id = self.options["metadata"]["id"]
521
+ logger.debug(f"[{client_id}] Starting message loop for subscription {subject}")
522
+
523
+ async for msg in subscription.messages:
524
+ if subject not in self._subscription_groups:
525
+ logger.debug(f"[{client_id}] Message loop for {subject} exiting: Group removed.")
526
+ break
527
+
528
+ try:
529
+ decoded_message = self._unpack_message(msg.data)
530
+ context: MessageContext = {
531
+ "subject": msg.subject,
532
+ "id": decoded_message["id"],
533
+ "timestamp": int(datetime.now().timestamp() * 1000),
534
+ "raw": msg,
535
+ }
536
+
537
+ self._metrics_tracker.track_receive()
538
+
539
+ if group.type_ == "request":
540
+ self._task_set.add(self._handle_request_message(msg, decoded_message, group))
541
+ elif group.type_ == "rpc":
542
+ self._task_set.add(self._handle_rpc_message(msg, decoded_message, group))
543
+ elif group.type_ == "generator":
544
+ self._task_set.add(self._handle_generator_initiation_message(msg, decoded_message, group))
545
+ else:
546
+ self._task_set.add(self._handle_normal_message(decoded_message, context, group))
547
+
548
+ except Exception:
549
+ self._metrics_tracker.track_message_error()
550
+ logger.error(f"[{client_id}] Error processing message for {subject}", exc_info=True)
551
+
552
+ logger.debug(f"[{client_id}] Message loop for subscription {subject} terminated.")
553
+ if subject in self._subscription_groups:
554
+ del self._subscription_groups[subject]
555
+
556
+ async def _handle_request_message(self, msg: Msg, message: Message[Any], group: GroupType) -> None:
557
+ handler = next(iter(group.handlers.values()), None)
558
+ if not handler:
559
+ return
560
+
561
+ try:
562
+ if inspect.iscoroutinefunction(handler) or inspect.isawaitable(handler):
563
+ result = await handler(message)
564
+ else:
565
+ result = await asyncio.to_thread(handler, message)
566
+
567
+ await self._respond_to(msg, result, message["id"])
568
+ except Exception as error:
569
+ self._metrics_tracker.track_message_error()
570
+ nats_error = ErrorFactory.message.execution_failed(
571
+ error,
572
+ {
573
+ "description": "Handler execution failed",
574
+ "code": ERROR_CODES.MESSAGE.EXECUTION_FAILED,
575
+ "subject": msg.subject,
576
+ },
577
+ )
578
+ await self._respond_to(msg, None, message["id"], nats_error.to_json())
579
+
580
+ async def _handle_rpc_message(self, msg: Msg, message: Message[Any], group: GroupType) -> None:
581
+ handler = next(iter(group.handlers.values()), None)
582
+ if not handler:
583
+ return
584
+
585
+ try:
586
+ args: list[Any] = (
587
+ message["data"]
588
+ if isinstance(message["data"], list)
589
+ else [message["data"]]
590
+ if message.get("data") is not None
591
+ else []
592
+ )
593
+
594
+ if inspect.iscoroutinefunction(handler) or inspect.isawaitable(handler):
595
+ result = await handler(*args)
596
+ else:
597
+ result = await asyncio.to_thread(handler, *args)
598
+
599
+ await self._respond_to_rpc(msg, result, message["id"])
600
+ except Exception as error:
601
+ self._metrics_tracker.track_message_error()
602
+ nats_error = ErrorFactory.rpc.execution_failed(
603
+ error,
604
+ {
605
+ "description": "RPC handler execution failed",
606
+ "code": ERROR_CODES.MESSAGE.EXECUTION_FAILED,
607
+ "subject": msg.subject,
608
+ },
609
+ )
610
+ await self._respond_to_rpc(msg, None, message["id"], None, True, nats_error.to_json())
611
+
612
+ async def _handle_generator_initiation_message(
613
+ self, msg: Msg, message: Message[Any], group: GroupType
614
+ ) -> None:
615
+ handler = next(iter(group.handlers.values()), None)
616
+ if not handler:
617
+ return
618
+
619
+ try:
620
+ if inspect.iscoroutinefunction(handler) or inspect.isawaitable(handler):
621
+ await handler(message)
622
+ else:
623
+ await asyncio.to_thread(handler, message)
624
+ except Exception:
625
+ self._metrics_tracker.track_message_error()
626
+ logger.error("Error processing generator request", exc_info=True)
627
+
628
+ async def _handle_normal_message(
629
+ self, message: Message[Any], context: MessageContext, group: GroupType
630
+ ) -> None:
631
+ tasks = [self._execute_handler(handler, message, context) for handler in group.handlers.values()]
632
+ await asyncio.gather(*tasks, return_exceptions=True)
633
+
634
+ async def _execute_handler(
635
+ self, handler: Handlers[Any, Any], message: Message[Any], context: MessageContext
636
+ ) -> None:
637
+ try:
638
+ if inspect.iscoroutinefunction(handler) or inspect.isawaitable(handler):
639
+ await handler(message)
640
+ else:
641
+ await asyncio.to_thread(handler, message)
642
+ except Exception:
643
+ self._metrics_tracker.track_message_error()
644
+ logger.error("Error executing handler", exc_info=True)
645
+
646
+ async def _respond_to(
647
+ self,
648
+ msg: Msg,
649
+ data: Any,
650
+ request_id: str,
651
+ error: SerializedError | None = None,
652
+ ) -> None:
653
+ try:
654
+ if self.is_closed():
655
+ client_id = self.options["metadata"]["id"]
656
+ logger.debug(
657
+ f"[{client_id}] Respond skipped: Connection closed or draining. Subject: {msg.subject}"
658
+ )
659
+ raise ErrorFactory.connection.not_connected(
660
+ None,
661
+ {
662
+ "description": "Failed to respond: Connection closed or draining",
663
+ "code": ERROR_CODES.CONNECTION.NOT_CONNECTED,
664
+ "subject": msg.subject,
665
+ },
666
+ )
667
+
668
+ response: ResponseMessage[Any] = {
669
+ "id": uid(),
670
+ "type": MESSAGE.TYPES.RESPONSE,
671
+ "requestId": request_id,
672
+ "data": data,
673
+ "metadata": self.options["metadata"],
674
+ "error": error,
675
+ "timestamp": int(datetime.now().timestamp() * 1000),
676
+ }
677
+
678
+ if msg.reply:
679
+ await msg.respond(self._pack_message(response))
680
+ except Exception:
681
+ self._metrics_tracker.track_message_error()
682
+ logger.error("Error sending request response", exc_info=True)
683
+
684
+ async def _respond_to_rpc(
685
+ self,
686
+ msg: Msg,
687
+ data: Any,
688
+ request_id: str,
689
+ stream_id: str | None = None,
690
+ done: bool | None = None,
691
+ error: SerializedError | None = None,
692
+ ) -> None:
693
+ try:
694
+ if self.is_closed():
695
+ client_id = self.options["metadata"]["id"]
696
+ logger.debug(
697
+ f"[{client_id}] RPC Respond skipped: Connection closed or draining. Subject: {msg.subject}"
698
+ )
699
+ raise ErrorFactory.connection.not_connected(
700
+ None,
701
+ {
702
+ "description": "Failed to respond: Connection closed or draining",
703
+ "code": ERROR_CODES.CONNECTION.NOT_CONNECTED,
704
+ "subject": msg.subject,
705
+ },
706
+ )
707
+
708
+ response: RPCResponse[Any] = {
709
+ "id": uid(),
710
+ "type": MESSAGE.TYPES.RPC_RESPONSE,
711
+ "requestId": request_id,
712
+ "data": data,
713
+ "metadata": self.options["metadata"],
714
+ "streamId": stream_id,
715
+ "done": done,
716
+ "error": error,
717
+ "timestamp": int(datetime.now().timestamp() * 1000),
718
+ }
719
+
720
+ await msg.respond(self._pack_message(response))
721
+ except Exception:
722
+ self._metrics_tracker.track_message_error()
723
+ logger.error("Error sending RPC response", exc_info=True)
724
+
725
+ def _pack_message(self, msg: Any) -> bytes:
726
+ try:
727
+ return pack(msg)
728
+ except Exception as error:
729
+ self._metrics_tracker.track_message_error()
730
+ raise ErrorFactory.message.invalid_format(
731
+ error,
732
+ {
733
+ "description": "Failed to pack message",
734
+ "code": ERROR_CODES.MESSAGE.INVALID_FORMAT,
735
+ "metadata": {"raw": msg},
736
+ },
737
+ ) from error
738
+
739
+ def _unpack_message(self, data: bytes) -> Any:
740
+ try:
741
+ return unpack(data)
742
+ except Exception as error:
743
+ raise ErrorFactory.message.invalid_format(
744
+ error,
745
+ {
746
+ "description": "Failed to parse message",
747
+ "code": ERROR_CODES.MESSAGE.INVALID_FORMAT,
748
+ "metadata": {"raw": data},
749
+ },
750
+ ) from error
751
+
752
+ def _get_nats_auth_options(self) -> dict[str, str]:
753
+ if "server" in self.options["auth"]:
754
+ return {
755
+ "user": self.options["auth"]["server"]["user"],
756
+ "password": self.options["auth"]["server"]["password"],
757
+ }
758
+ return {
759
+ "user": self.options["auth"]["user"],
760
+ "password": self.options["auth"]["password"],
761
+ }
762
+
763
+ def get_connect_options(self) -> ConnectOptions:
764
+ default_options: ConnectOptions = {
765
+ "wait_for_server": False,
766
+ }
767
+ return {**default_options, **(self.options.get("connect", {}) or {})}
768
+
769
+ def get_reconnect_options(self) -> ReconnectOptions:
770
+ default_options: ReconnectOptions = {
771
+ "enabled": False,
772
+ "max_attempts": DEFAULTS.RETRY.MAX_RECONNECT_ATTEMPTS,
773
+ "delay": DEFAULTS.RETRY.DELAY,
774
+ }
775
+ return {**default_options, **(self.options.get("reconnect", {}) or {})}
776
+
777
+ def get_timeout_options(self) -> TimeoutOptions:
778
+ default_options: TimeoutOptions = {
779
+ "rpc": DEFAULTS.TIMEOUTS.RPC,
780
+ "request": DEFAULTS.TIMEOUTS.REQUEST,
781
+ "connection": DEFAULTS.TIMEOUTS.CONNECTION,
782
+ }
783
+
784
+ return {**default_options, **(self.options.get("timeout", {}) or {})}