@camera.ui/server 0.0.5 → 0.0.8

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 (238) hide show
  1. package/dist/interface/assets/{@tanstack-BqH4GyO-.js → @tanstack-B-9PO-kT.js} +1 -1
  2. package/dist/interface/assets/{@vee-validate-DCBdnGo-.js → @vee-validate-D_G0ehOl.js} +1 -1
  3. package/dist/interface/assets/{@vue-C7-KaDG4.js → @vue-C10tA4b9.js} +6 -6
  4. package/dist/interface/assets/{@vueform-arggO0eF.js → @vueform-Bj73kRPS.js} +1 -1
  5. package/dist/interface/assets/{@vueuse-C3WMTDqL.js → @vueuse-BPeqNGoM.js} +1 -1
  6. package/dist/interface/assets/Account-MEaGtu1D.js +1 -0
  7. package/dist/interface/assets/Adminpanel-D1ycltxf.js +1 -0
  8. package/dist/interface/assets/Appearance-Jlzp_P21.js +1 -0
  9. package/dist/interface/assets/Backup-1-ju9NDo.js +1 -0
  10. package/dist/interface/assets/Camera-BOu5dUel.js +1 -0
  11. package/dist/interface/assets/Cameras-C7eUXdZk.js +1 -0
  12. package/dist/interface/assets/Cameras-tmTzi1M6.css +1 -0
  13. package/dist/interface/assets/Camview-CEgwGCGR.js +1 -0
  14. package/dist/interface/assets/{Camview-vUAs5YHU.css → Camview-CWTrsoY0.css} +1 -1
  15. package/dist/interface/assets/Config-Dt-etQ3h.js +1 -0
  16. package/dist/interface/assets/{Console-Caz7y-T0.js → Console-FCve5CKy.js} +2 -2
  17. package/dist/interface/assets/FirstSteps-DLkKDSe9.js +1 -0
  18. package/dist/interface/assets/{NewCamera-B9t-0NCc.js → NewCamera-Cc1X79Ns.js} +2 -2
  19. package/dist/interface/assets/Plugin-CnQjafMC.js +1 -0
  20. package/dist/interface/assets/{Plugin-BSHKKjrl.css → Plugin-DzKKCoqQ.css} +1 -1
  21. package/dist/interface/assets/Plugins-B8gCgxOx.css +1 -0
  22. package/dist/interface/assets/Plugins-CwyUdMlv.js +1 -0
  23. package/dist/interface/assets/Recordings-Boeev1lV.js +1 -0
  24. package/dist/interface/assets/Recordings-D5ta7AYS.js +1 -0
  25. package/dist/interface/assets/Settings-Cvm2jnBr.js +1 -0
  26. package/dist/interface/assets/System-fHQ7XKri.js +1 -0
  27. package/dist/interface/assets/User-5o1VKizc.js +1 -0
  28. package/dist/interface/assets/VConfigEditor.vue_vue_type_script_setup_true_lang-C_95ELTZ.js +2 -0
  29. package/dist/interface/assets/VConsole-BHy92Ws0.js +1 -0
  30. package/dist/interface/assets/VConsole-MV9pQtJj.css +1 -0
  31. package/dist/interface/assets/{VPlayer-YdRn97Bs.js → VPlayer-LX5HGLrY.js} +1 -1
  32. package/dist/interface/assets/{VPluginCard--3bx6UJb.js → VPluginCard-CFpg0LM4.js} +2 -2
  33. package/dist/interface/assets/VPluginCard-Fl0AYmnF.css +1 -0
  34. package/dist/interface/assets/main-BCWSiwnj.js +9 -0
  35. package/dist/interface/assets/{main-B3IVLctZ.css → main-CQNVVncO.css} +1 -1
  36. package/dist/interface/assets/{pinia-D8MtiGcH.js → pinia-CitQ5b66.js} +2 -2
  37. package/dist/interface/assets/{plugins-Bf03y242.js → plugins-D80RNVmI.js} +1 -1
  38. package/dist/interface/assets/qrcode-SHonoxyK.js +8 -0
  39. package/dist/interface/assets/{system-BONnDA4y.js → system-CS_ZOs3_.js} +1 -1
  40. package/dist/interface/assets/{ui-CNpIJotI.js → ui-CHKoHLl-.js} +1 -1
  41. package/dist/interface/assets/{v-calendar-uh0aTGqP.js → v-calendar-C-8W4FeM.js} +1 -1
  42. package/dist/interface/assets/{vee-validate-D3FqbChK.js → vee-validate-Ck3I2guh.js} +1 -1
  43. package/dist/interface/assets/{vue-i18n-1AU8MPys.js → vue-i18n-DuCDz9TJ.js} +1 -1
  44. package/dist/interface/assets/{vue-inline-svg-2DDwYW6V.js → vue-inline-svg-C2gR6nRD.js} +1 -1
  45. package/dist/interface/assets/{vue-router-DfeQ8s4I.js → vue-router-OPGDMnws.js} +1 -1
  46. package/dist/interface/assets/{vue3-dnd-BwxcSU9Z.js → vue3-dnd-Hf295yge.js} +1 -1
  47. package/dist/interface/assets/{vue3-toastify-Ul-rf53I.js → vue3-toastify-DQr2dOCx.js} +1 -1
  48. package/dist/interface/assets/vuetify-CrcT8VHB.js +5 -0
  49. package/dist/interface/index.html +14 -15
  50. package/dist/interface/sw.js +1 -1
  51. package/dist/server/bin/cui-service.d.ts +1 -0
  52. package/dist/server/bin/cui-service.js +41 -9
  53. package/dist/server/bin/cui-service.js.map +1 -1
  54. package/dist/server/package.json +9 -8
  55. package/dist/server/requirements.txt +2 -3
  56. package/dist/server/src/api/controllers/cameras.controller.js +2 -2
  57. package/dist/server/src/api/controllers/cameras.controller.js.map +1 -1
  58. package/dist/server/src/api/controllers/plugins.controller.js +7 -6
  59. package/dist/server/src/api/controllers/plugins.controller.js.map +1 -1
  60. package/dist/server/src/api/go2rtc/api/streams.d.ts +4 -4
  61. package/dist/server/src/api/go2rtc/api/streams.js +2 -24
  62. package/dist/server/src/api/go2rtc/api/streams.js.map +1 -1
  63. package/dist/server/src/api/go2rtc/types.d.ts +6 -2
  64. package/dist/server/src/api/schemas/go2rtc.schema.d.ts +5 -5
  65. package/dist/server/src/api/services/cameras.service.d.ts +6 -5
  66. package/dist/server/src/api/services/cameras.service.js +72 -59
  67. package/dist/server/src/api/services/cameras.service.js.map +1 -1
  68. package/dist/server/src/api/services/plugins.service.js +11 -13
  69. package/dist/server/src/api/services/plugins.service.js.map +1 -1
  70. package/dist/server/src/api.d.ts +2 -2
  71. package/dist/server/src/camera/controller.d.ts +9 -4
  72. package/dist/server/src/camera/controller.js +21 -7
  73. package/dist/server/src/camera/controller.js.map +1 -1
  74. package/dist/server/src/camera/device.d.ts +15 -3
  75. package/dist/server/src/camera/device.js.map +1 -1
  76. package/dist/server/src/camera/index.d.ts +18 -39
  77. package/dist/server/src/camera/index.js +137 -165
  78. package/dist/server/src/camera/index.js.map +1 -1
  79. package/dist/server/src/camera/interfaces/camera.d.ts +0 -1
  80. package/dist/server/src/camera/interfaces/camera.js +0 -8
  81. package/dist/server/src/camera/interfaces/camera.js.map +1 -1
  82. package/dist/server/src/camera/streaming/werift-session.d.ts +10 -1
  83. package/dist/server/src/camera/streaming/werift-session.js +16 -1
  84. package/dist/server/src/camera/streaming/werift-session.js.map +1 -1
  85. package/dist/server/src/camera/types.d.ts +0 -1
  86. package/dist/server/src/camera/types.js.map +1 -1
  87. package/dist/server/src/camera/videoFrame.d.ts +3 -3
  88. package/dist/server/src/camera/videoFrame.js +6 -7
  89. package/dist/server/src/camera/videoFrame.js.map +1 -1
  90. package/dist/server/src/decoder/types.d.ts +4 -9
  91. package/dist/server/src/decoder/worker.d.ts +3 -5
  92. package/dist/server/src/decoder/worker.js +40 -64
  93. package/dist/server/src/decoder/worker.js.map +1 -1
  94. package/dist/server/src/go2rtc/index.js +1 -1
  95. package/dist/server/src/go2rtc/index.js.map +1 -1
  96. package/dist/server/src/index.d.ts +3 -3
  97. package/dist/server/src/main.js +1 -2
  98. package/dist/server/src/main.js.map +1 -1
  99. package/dist/server/src/nats/connection.d.ts +17 -0
  100. package/dist/server/src/nats/connection.js +66 -0
  101. package/dist/server/src/nats/connection.js.map +1 -0
  102. package/dist/server/src/nats/error.d.ts +9 -0
  103. package/dist/server/src/nats/error.js +11 -0
  104. package/dist/server/src/nats/error.js.map +1 -0
  105. package/dist/server/src/nats/index.d.ts +6 -4
  106. package/dist/server/src/nats/index.js +22 -17
  107. package/dist/server/src/nats/index.js.map +1 -1
  108. package/dist/server/src/nats/messageQueue.d.ts +7 -4
  109. package/dist/server/src/nats/messageQueue.js +43 -59
  110. package/dist/server/src/nats/messageQueue.js.map +1 -1
  111. package/dist/server/src/nats/proxy/cameraDevice.js +19 -24
  112. package/dist/server/src/nats/proxy/cameraDevice.js.map +1 -1
  113. package/dist/server/src/nats/proxy/deviceManager.d.ts +2 -2
  114. package/dist/server/src/nats/proxy/deviceManager.js +4 -14
  115. package/dist/server/src/nats/proxy/deviceManager.js.map +1 -1
  116. package/dist/server/src/nats/server.js +4 -10
  117. package/dist/server/src/nats/server.js.map +1 -1
  118. package/dist/server/src/nats/subscription.d.ts +12 -0
  119. package/dist/server/src/nats/subscription.js +21 -0
  120. package/dist/server/src/nats/subscription.js.map +1 -0
  121. package/dist/server/src/nats/types.d.ts +25 -40
  122. package/dist/server/src/nats/types.js +1 -10
  123. package/dist/server/src/nats/types.js.map +1 -1
  124. package/dist/server/src/nats/utils.d.ts +2 -4
  125. package/dist/server/src/nats/utils.js +3 -3
  126. package/dist/server/src/nats/utils.js.map +1 -1
  127. package/dist/server/src/plugins/index.d.ts +3 -5
  128. package/dist/server/src/plugins/index.js +54 -141
  129. package/dist/server/src/plugins/index.js.map +1 -1
  130. package/dist/server/src/plugins/plugin.d.ts +4 -13
  131. package/dist/server/src/plugins/plugin.js +40 -90
  132. package/dist/server/src/plugins/plugin.js.map +1 -1
  133. package/dist/server/src/plugins/types.d.ts +4 -0
  134. package/dist/server/src/plugins/types.js.map +1 -1
  135. package/dist/server/src/plugins/worker.d.ts +1 -1
  136. package/dist/server/src/plugins/worker.js +52 -66
  137. package/dist/server/src/plugins/worker.js.map +1 -1
  138. package/dist/server/src/polyglot/node/decoder/child.js +87 -159
  139. package/dist/server/src/polyglot/node/decoder/child.js.map +1 -1
  140. package/dist/server/src/polyglot/node/decoder/imageUtils.d.ts +1 -1
  141. package/dist/server/src/polyglot/node/plugins/cameraStorage.d.ts +2 -2
  142. package/dist/server/src/polyglot/node/plugins/cameraStorage.js.map +1 -1
  143. package/dist/server/src/polyglot/node/plugins/child.d.ts +1 -1
  144. package/dist/server/src/polyglot/node/plugins/child.js +34 -60
  145. package/dist/server/src/polyglot/node/plugins/child.js.map +1 -1
  146. package/dist/server/src/polyglot/node/plugins/{config.js → configService.js} +1 -1
  147. package/dist/server/src/polyglot/node/plugins/configService.js.map +1 -0
  148. package/dist/server/src/polyglot/node/plugins/{api.d.ts → pluginApi.d.ts} +9 -12
  149. package/dist/server/src/polyglot/node/plugins/pluginApi.js +34 -0
  150. package/dist/server/src/polyglot/node/plugins/pluginApi.js.map +1 -0
  151. package/dist/server/src/polyglot/node/plugins/{logger.d.ts → pluginLogger.d.ts} +2 -0
  152. package/dist/server/src/polyglot/node/plugins/pluginLogger.js +89 -0
  153. package/dist/server/src/polyglot/node/plugins/pluginLogger.js.map +1 -0
  154. package/dist/server/src/polyglot/node/plugins/proxy/cameraDevice.d.ts +8 -11
  155. package/dist/server/src/polyglot/node/plugins/proxy/cameraDevice.js +67 -129
  156. package/dist/server/src/polyglot/node/plugins/proxy/cameraDevice.js.map +1 -1
  157. package/dist/server/src/polyglot/node/plugins/proxy/deviceManager.d.ts +6 -8
  158. package/dist/server/src/polyglot/node/plugins/proxy/deviceManager.js +15 -43
  159. package/dist/server/src/polyglot/node/plugins/proxy/deviceManager.js.map +1 -1
  160. package/dist/server/src/polyglot/node/plugins/storageController.d.ts +2 -2
  161. package/dist/server/src/polyglot/node/plugins/storageController.js.map +1 -1
  162. package/dist/server/src/polyglot/python/camera/interfaces/camera.py +0 -6
  163. package/dist/server/src/polyglot/python/camera/video_frame.py +10 -18
  164. package/dist/server/src/polyglot/python/camera_ui_types/__init__.py +1 -5
  165. package/dist/server/src/polyglot/python/decoder/child.py +102 -161
  166. package/dist/server/src/polyglot/python/plugins/camera_storage.py +10 -23
  167. package/dist/server/src/polyglot/python/plugins/child.py +35 -60
  168. package/dist/server/src/polyglot/python/plugins/{proxy/message_queue.py → message_queue.py} +50 -81
  169. package/dist/server/src/polyglot/python/plugins/plugin_api.py +13 -21
  170. package/dist/server/src/polyglot/python/plugins/proxy/camera_device.py +90 -173
  171. package/dist/server/src/polyglot/python/plugins/proxy/device_manager.py +25 -64
  172. package/dist/server/src/polyglot/python/plugins/storage_controller.py +3 -4
  173. package/dist/server/src/polyglot/python/utilities/connection.py +86 -0
  174. package/dist/server/src/polyglot/python/utilities/object_path.py +12 -4
  175. package/dist/server/src/polyglot/python/utilities/subscriptions.py +20 -0
  176. package/dist/server/src/polyglot/python/utilities/task.py +11 -1
  177. package/dist/server/src/services/config/index.js +4 -2
  178. package/dist/server/src/services/config/index.js.map +1 -1
  179. package/dist/server/src/services/logger/index.js +11 -8
  180. package/dist/server/src/services/logger/index.js.map +1 -1
  181. package/dist/server/src/utils/ffmpeg.d.ts +2 -0
  182. package/dist/server/src/{decoder → utils}/ffmpeg.js +2 -2
  183. package/dist/server/src/utils/ffmpeg.js.map +1 -0
  184. package/dist/server/src/utils/pythonInstaller.d.ts +1 -1
  185. package/dist/server/src/utils/pythonInstaller.js +10 -4
  186. package/dist/server/src/utils/pythonInstaller.js.map +1 -1
  187. package/dist/server/src/utils/reader.js.map +1 -0
  188. package/dist/server/src/utils/subscribed.d.ts +4 -4
  189. package/dist/server/src/utils/subscribed.js.map +1 -1
  190. package/package.json +9 -8
  191. package/dist/interface/assets/@camera.ui-2NVnv26v.js +0 -8
  192. package/dist/interface/assets/Account-gJpkf0nE.js +0 -1
  193. package/dist/interface/assets/Adminpanel-Bge9nu5N.js +0 -1
  194. package/dist/interface/assets/Appearance-D22q-X_I.js +0 -1
  195. package/dist/interface/assets/Backup-pJm6s10G.js +0 -1
  196. package/dist/interface/assets/Camera-BgO2yRjb.js +0 -1
  197. package/dist/interface/assets/Cameras-BM3vSM_R.css +0 -1
  198. package/dist/interface/assets/Cameras-DjeKruR_.js +0 -1
  199. package/dist/interface/assets/Camview-DfzlprzN.js +0 -1
  200. package/dist/interface/assets/Config-BKIOIkjC.js +0 -1
  201. package/dist/interface/assets/FirstSteps-mQK4XFTs.js +0 -1
  202. package/dist/interface/assets/Plugin-Di_bBsg-.js +0 -1
  203. package/dist/interface/assets/Plugins-BsMITags.css +0 -1
  204. package/dist/interface/assets/Plugins-DhmzMNuO.js +0 -1
  205. package/dist/interface/assets/Recordings-Bu53bSBp.js +0 -1
  206. package/dist/interface/assets/Recordings-XY20w8yp.js +0 -1
  207. package/dist/interface/assets/Settings-gGRBRVST.js +0 -1
  208. package/dist/interface/assets/System-ZDrcLNk0.js +0 -1
  209. package/dist/interface/assets/User-D4vEhhzi.js +0 -1
  210. package/dist/interface/assets/VConfigEditor.vue_vue_type_script_setup_true_lang-CXFI-IeE.js +0 -2
  211. package/dist/interface/assets/VConsole-BHo3xprq.js +0 -1
  212. package/dist/interface/assets/VConsole-f-nUkOuD.css +0 -1
  213. package/dist/interface/assets/VPluginCard-BJYMuCLk.css +0 -1
  214. package/dist/interface/assets/encode-utf8-Cn5aGd7v.js +0 -1
  215. package/dist/interface/assets/main-C4rYiRNz.js +0 -2
  216. package/dist/interface/assets/qrcode-CGiDONbL.js +0 -8
  217. package/dist/interface/assets/vuetify-_-Oqac3B.js +0 -5
  218. package/dist/server/src/decoder/ffmpeg.d.ts +0 -2
  219. package/dist/server/src/decoder/ffmpeg.js.map +0 -1
  220. package/dist/server/src/nats/proxy/index.d.ts +0 -2
  221. package/dist/server/src/nats/proxy/index.js +0 -3
  222. package/dist/server/src/nats/proxy/index.js.map +0 -1
  223. package/dist/server/src/polyglot/node/decoder/reader.js.map +0 -1
  224. package/dist/server/src/polyglot/node/plugins/api.js +0 -34
  225. package/dist/server/src/polyglot/node/plugins/api.js.map +0 -1
  226. package/dist/server/src/polyglot/node/plugins/config.js.map +0 -1
  227. package/dist/server/src/polyglot/node/plugins/logger.js +0 -128
  228. package/dist/server/src/polyglot/node/plugins/logger.js.map +0 -1
  229. package/dist/server/src/polyglot/node/plugins/proxy/index.d.ts +0 -2
  230. package/dist/server/src/polyglot/node/plugins/proxy/index.js +0 -3
  231. package/dist/server/src/polyglot/node/plugins/proxy/index.js.map +0 -1
  232. package/dist/server/src/polyglot/node/plugins/proxy/messageQueue.d.ts +0 -20
  233. package/dist/server/src/polyglot/node/plugins/proxy/messageQueue.js +0 -152
  234. package/dist/server/src/polyglot/node/plugins/proxy/messageQueue.js.map +0 -1
  235. /package/dist/server/src/polyglot/node/plugins/{config.d.ts → configService.d.ts} +0 -0
  236. /package/dist/server/src/polyglot/python/plugins/{logger.py → plugin_logger.py} +0 -0
  237. /package/dist/server/src/{polyglot/node/decoder → utils}/reader.d.ts +0 -0
  238. /package/dist/server/src/{polyglot/node/decoder → utils}/reader.js +0 -0
@@ -8,14 +8,13 @@ from asyncio import AbstractEventLoop
8
8
  from contextlib import suppress
9
9
  from typing import Any, Optional, cast
10
10
 
11
- import nats
12
11
  from camera_ui_types import CameraDevice
13
- from logger import PluginLogger
14
- from nats.aio.client import Client as NatsConnection
15
- from nats.aio.subscription import Subscription
12
+ from decoder.typings import AuthConfig
13
+ from message_queue import MessageQueue
14
+ from nats.aio.msg import Msg
16
15
  from plugin_api import PluginAPI
16
+ from plugin_logger import PluginLogger
17
17
  from proxy.camera_device import CameraDeviceProxy
18
- from proxy.message_queue import ClientMessageQueue
19
18
  from typings import (
20
19
  PLUGIN_COMMAND,
21
20
  PLUGIN_STATUS,
@@ -25,7 +24,9 @@ from typings import (
25
24
  ProcessResponse,
26
25
  ProxyMessageStructure,
27
26
  )
28
- from utilities.packer import pack, unpack
27
+ from utilities.connection import ProxyConnection
28
+ from utilities.packer import unpack
29
+ from utilities.subscriptions import ProxySubscription
29
30
  from utilities.task import TaskSet
30
31
 
31
32
 
@@ -33,9 +34,9 @@ class PluginChild:
33
34
  def __init__(self) -> None:
34
35
  self.proxy_endpoints = [endpoint for endpoint in os.environ["PROXY_ENDPOINTS"].split(",")]
35
36
 
36
- self.auth = {
37
+ self.auth: AuthConfig = {
37
38
  "user": os.environ["PROXY_USER"],
38
- "pass": os.environ["PROXY_PASSWORD"],
39
+ "password": os.environ["PROXY_PASSWORD"],
39
40
  }
40
41
 
41
42
  del os.environ["PROXY_USER"]
@@ -49,12 +50,12 @@ class PluginChild:
49
50
  self.plugin_subject = f"{os.environ['PLUGIN_ID']}.child"
50
51
  self.target_subject = f"{os.environ['WORKER_ID']}.ipc.publisher"
51
52
 
52
- self.publisher: Optional[NatsConnection] = None
53
- self.subscriber: Optional[Subscription] = None
54
- self.plugin_subscriber: Optional[Subscription] = None
53
+ self.publisher: Optional[ProxyConnection] = None
54
+ self.subscriber: Optional[ProxySubscription] = None
55
+ self.plugin_subscriber: Optional[ProxySubscription] = None
55
56
 
56
57
  self.tasks: TaskSet = TaskSet(f"{self.display_name} PluginChild")
57
- self.message_queue: Optional[ClientMessageQueue] = None
58
+ self.message_queue: Optional[MessageQueue] = None
58
59
 
59
60
  self.api = None
60
61
  self.stopped = False
@@ -66,35 +67,22 @@ class PluginChild:
66
67
  await self.shutdown_event.wait()
67
68
 
68
69
  async def init(self) -> None:
69
- async def ignore_cb(e: Optional[Any] = None):
70
- pass
71
-
72
- self.publisher = await nats.connect(
73
- servers=[endpoint for endpoint in self.proxy_endpoints if endpoint.startswith("nats://")],
74
- name=self.subject,
75
- user=self.auth["user"],
76
- password=self.auth["pass"],
77
- max_reconnect_attempts=-1,
78
- error_cb=ignore_cb,
79
- disconnected_cb=ignore_cb,
80
- closed_cb=ignore_cb,
81
- reconnected_cb=ignore_cb,
82
- discovered_server_cb=ignore_cb,
83
- )
70
+ servers = [endpoint for endpoint in self.proxy_endpoints if endpoint.startswith("nats://")]
71
+
72
+ self.publisher = ProxyConnection(self.subject, servers, self.auth)
73
+ await self.publisher.connect()
84
74
 
85
75
  self.subscriber = await self.publisher.subscribe(subject=self.subject)
86
- self.plugin_subscriber = await self.publisher.subscribe(subject=self.plugin_subject)
76
+ self.subscriber.on("message", self.on_worker_message)
87
77
 
88
- self.message_queue = ClientMessageQueue(
78
+ self.plugin_subscriber = await self.publisher.subscribe(subject=self.plugin_subject)
79
+ self.message_queue = MessageQueue(
89
80
  self.logger,
90
81
  self.publisher,
91
82
  self.plugin_subscriber,
92
83
  self.__request_handler,
93
84
  )
94
85
 
95
- self.tasks.add(self.message_queue.start())
96
- self.tasks.add(self.listen_to_messages())
97
-
98
86
  await self.send_message({"type": PLUGIN_STATUS.READY.value})
99
87
 
100
88
  async def start(self, data: ProcessLoadMessage) -> None:
@@ -104,9 +92,9 @@ class PluginChild:
104
92
  cameras = data["cameras"]
105
93
 
106
94
  self.api = PluginAPI(plugin, storage_path, config_file, self.logger, self.proxy_endpoints, self.auth)
107
- await self.api.init()
95
+ await self.api.device_manager.init()
108
96
 
109
- cameras = [
97
+ cameras_devices = [
110
98
  CameraDeviceProxy(
111
99
  self.api,
112
100
  self.logger,
@@ -118,10 +106,10 @@ class PluginChild:
118
106
  for camera in cameras
119
107
  ]
120
108
 
121
- await asyncio.gather(*(camera.init() for camera in cameras))
109
+ await asyncio.gather(*(camera_device.init() for camera_device in cameras_devices))
122
110
 
123
- self.api.device_manager.configure_cameras(cameras)
124
- self.api.plugin.configure_cameras(cast(list[CameraDevice], cameras))
111
+ self.api.device_manager.configure_cameras(cameras_devices)
112
+ self.api.plugin.configure_cameras(cast(list[CameraDevice], cameras_devices))
125
113
 
126
114
  await self.send_message({"type": PLUGIN_STATUS.STARTED.value})
127
115
 
@@ -149,7 +137,7 @@ class PluginChild:
149
137
  if not self.publisher:
150
138
  raise Exception("Publisher is not initialized")
151
139
 
152
- await self.publisher.publish(self.target_subject, pack(message))
140
+ await self.publisher.publish(self.target_subject, message)
153
141
 
154
142
  async def __request_handler(self, message: ProxyMessageStructure) -> None:
155
143
  if not self.message_queue:
@@ -198,30 +186,17 @@ class PluginChild:
198
186
 
199
187
  await self.message_queue.enqueue({**message, "type": "reply", "error": deserialized_error})
200
188
 
201
- async def listen_to_messages(self) -> None:
202
- if not self.subscriber:
203
- raise Exception("Subscriber is not initialized")
204
-
205
- async for msg in self.subscriber.messages:
206
- try:
207
- if self.stopped:
208
- break
209
-
210
- if len(msg.data) == 0:
211
- continue
189
+ async def on_worker_message(self, msg: Msg) -> None:
190
+ if self.stopped:
191
+ return
212
192
 
213
- message: ProcessMessage = unpack(msg.data)
193
+ message: ProcessMessage = unpack(msg.data)
214
194
 
215
- if "type" in message:
216
- if message["type"] == PLUGIN_COMMAND.START.value and "data" in message:
217
- self.tasks.add(self.start(message["data"]))
218
- elif message["type"] == PLUGIN_COMMAND.STOP.value:
219
- self.tasks.add(self.stop())
220
- except Exception as e:
221
- if not self.stopped:
222
- self.logger.error("Error while processing server message:", e)
223
- else:
224
- break
195
+ if "type" in message:
196
+ if message["type"] == PLUGIN_COMMAND.START.value and "data" in message:
197
+ self.tasks.add(self.start(message["data"]))
198
+ elif message["type"] == PLUGIN_COMMAND.STOP.value:
199
+ self.tasks.add(self.stop())
225
200
 
226
201
  def setup_signal_handlers(self):
227
202
  loop = asyncio.get_running_loop()
@@ -1,22 +1,22 @@
1
1
  import asyncio
2
- from contextlib import suppress
3
- from typing import Any, Callable, Union, cast
2
+ from typing import Any, Callable, cast
4
3
 
5
- from logger import PluginLogger
6
- from nats.aio.client import Client as NatsConnection
7
- from nats.aio.subscription import Subscription
4
+ from nats.aio.msg import Msg
5
+ from plugin_logger import PluginLogger
8
6
  from plugins.constants import NATS_SERVER_SUBJECT
9
7
  from typings import ProxyMessageStructure, QueueItem, RemoteError
10
- from utilities.packer import pack, unpack
8
+ from utilities.connection import ProxyConnection
9
+ from utilities.packer import unpack
10
+ from utilities.subscriptions import ProxySubscription
11
11
  from utilities.task import TaskSet
12
12
 
13
13
 
14
- class ClientMessageQueue:
14
+ class MessageQueue:
15
15
  def __init__(
16
16
  self,
17
17
  logger: PluginLogger,
18
- publisher: NatsConnection,
19
- subscriber: Subscription,
18
+ publisher: ProxyConnection,
19
+ subscriber: ProxySubscription,
20
20
  request_handler: Callable[[ProxyMessageStructure], Any],
21
21
  ):
22
22
  self.logger = logger
@@ -24,24 +24,16 @@ class ClientMessageQueue:
24
24
  self.subscriber = subscriber
25
25
  self.request_handler = request_handler
26
26
 
27
- self.started = False
28
27
  self.aborted = False
29
28
  self.is_processing = False
30
29
 
31
- self.tasks: TaskSet = TaskSet(f"ClientMessageQueue {self.publisher.options['name']}")
30
+ self.tasks: TaskSet = TaskSet(f"MessageQueue {self.publisher.name}")
32
31
  self.queue: list[QueueItem] = []
33
32
  self.pending_responses: dict[str, QueueItem] = {}
34
33
 
35
- async def start(self):
36
- if self.started:
37
- return
38
-
39
- with suppress(asyncio.CancelledError):
40
- self.started = True
41
- await self.__listen_to_messages()
34
+ self.subscriber.on("message", self.__on_message)
42
35
 
43
36
  def abort_queue(self) -> None:
44
- self.started = False
45
37
  self.aborted = True
46
38
  self.is_processing = False
47
39
 
@@ -74,7 +66,7 @@ class ClientMessageQueue:
74
66
  async def enqueue(self, message: ProxyMessageStructure) -> Any:
75
67
  if message["type"] == "request" and message["timeout"] > 0:
76
68
  # print(
77
- # "CLIENT => Enqueueing request message:", json.dumps(message, indent=4)
69
+ # "CLIENT => Enqueueing message:", json.dumps(message, indent=4)
78
70
  # )
79
71
 
80
72
  promise = asyncio.get_event_loop().create_future()
@@ -92,15 +84,7 @@ class ClientMessageQueue:
92
84
 
93
85
  return await promise
94
86
  else:
95
- # print(
96
- # "CLIENT => Sending reply to router:",
97
- # json.dumps(message, indent=4),
98
- # )
99
-
100
- await self.publisher.publish(
101
- NATS_SERVER_SUBJECT,
102
- pack(message),
103
- )
87
+ await self.publisher.publish(NATS_SERVER_SUBJECT, message)
104
88
 
105
89
  async def __process_queue(self) -> None:
106
90
  if self.is_processing or not self.queue or self.aborted:
@@ -113,7 +97,7 @@ class ClientMessageQueue:
113
97
  request_id: str = current_item["message"].get("requestId", "")
114
98
 
115
99
  # print(
116
- # "CLIENT => Sending request to router:",
100
+ # "CLIENT => Sending request to SERVER:",
117
101
  # json.dumps(current_item["message"], indent=4),
118
102
  # )
119
103
 
@@ -157,57 +141,42 @@ class ClientMessageQueue:
157
141
  "reject": reject,
158
142
  }
159
143
 
160
- await self.publisher.publish(
161
- NATS_SERVER_SUBJECT,
162
- pack(current_item["message"]),
163
- )
144
+ await self.publisher.publish(NATS_SERVER_SUBJECT, current_item["message"])
164
145
 
165
146
  self.is_processing = False
166
147
 
167
- async def __listen_to_messages(self) -> None:
168
- message: Union[ProxyMessageStructure, None] = None
169
-
170
- async for msg in self.subscriber.messages:
171
- try:
172
- if self.aborted:
173
- break
174
-
175
- if len(msg.data) == 0:
176
- continue
177
-
178
- message = cast(ProxyMessageStructure, unpack(msg.data))
179
-
180
- if message.get("type") == "reply":
181
- # print(
182
- # "CLIENT => Received reply from router:",
183
- # json.dumps(message, indent=4),
184
- # )
185
-
186
- request_id = message.get("requestId", "")
187
-
188
- current_item = self.pending_responses.get(request_id, None)
189
-
190
- if current_item is None:
191
- self.logger.error("Unknown reply from server:", message)
192
- continue
193
-
194
- if "error" in message:
195
- error = message.pop("error")
196
- cause: Any = {k: v for k, v in message.items()}
197
- current_item["reject"](RemoteError(error, cause))
198
- else:
199
- current_item["resolve"](message.get("response", {}))
200
- elif message.get("type") == "request":
201
- # print(
202
- # "CLIENT => Received request from router:",
203
- # json.dumps(message, indent=4),
204
- # )
205
-
206
- self.tasks.add(self.request_handler(message))
207
- else:
208
- raise Exception("Invalid message type received")
209
- except Exception as e:
210
- if not self.aborted:
211
- self.logger.error("Error while processing request:", message, e)
212
- else:
213
- break
148
+ async def __on_message(self, msg: Msg) -> None:
149
+ if self.aborted:
150
+ return
151
+
152
+ message = cast(ProxyMessageStructure, unpack(msg.data))
153
+
154
+ if message.get("type") == "reply":
155
+ # print(
156
+ # "CLIENT => Received reply from SERVER:",
157
+ # json.dumps(message, indent=4),
158
+ # )
159
+
160
+ request_id = message.get("requestId", "")
161
+
162
+ current_item = self.pending_responses.get(request_id, None)
163
+
164
+ if current_item is None:
165
+ self.logger.error("Unknown reply from server:", message)
166
+ return
167
+
168
+ if "error" in message:
169
+ error = message.pop("error")
170
+ cause: Any = {k: v for k, v in message.items()}
171
+ current_item["reject"](RemoteError(error, cause))
172
+ else:
173
+ current_item["resolve"](message.get("response", {}))
174
+ elif message.get("type") == "request":
175
+ # print(
176
+ # "CLIENT => Received request from SERVER:",
177
+ # json.dumps(message, indent=4),
178
+ # )
179
+
180
+ self.tasks.add(self.request_handler(message))
181
+ else:
182
+ raise Exception(f"Invalid message type received: {message['type']}")
@@ -9,7 +9,8 @@ from typing import Any, cast
9
9
  from camera_ui_types import BasePlugin
10
10
  from camera_ui_types import PluginAPI as IPluginAPI
11
11
  from config_service import PluginConfigService
12
- from logger import PluginLogger
12
+ from decoder.typings import AuthConfig
13
+ from plugin_logger import PluginLogger
13
14
  from pyeecui.asyncio import AsyncIOEventEmitter
14
15
  from typings import PluginInfo
15
16
 
@@ -22,7 +23,7 @@ class PluginAPI(AsyncIOEventEmitter):
22
23
  config_file: str,
23
24
  logger: PluginLogger,
24
25
  proxy_endpoints: list[str],
25
- auth: dict[str, str],
26
+ auth: AuthConfig,
26
27
  ) -> None:
27
28
  super().__init__()
28
29
 
@@ -37,25 +38,13 @@ class PluginAPI(AsyncIOEventEmitter):
37
38
  self.config_file = config_file
38
39
 
39
40
  self.config_service = PluginConfigService(config_file)
40
- self.storage_controller = StorageController(self, logger)
41
-
41
+ self.storage_controller = StorageController(self)
42
42
  self.device_manager = DeviceManager(self, logger, plugin, proxy_endpoints, auth)
43
43
 
44
- module = self.__load_module()
45
- plugin_class = self.__find_plugin_class(module)
46
- self.__check_plugin_class_methods(plugin_class)
47
-
48
- self.plugin: BasePlugin = plugin_class(logger, api_instance)
49
-
50
- async def init(self) -> None:
51
- if self.__initialized:
52
- return
44
+ plugin_constructor = self.__load_module()
45
+ self.plugin: BasePlugin = plugin_constructor(logger, api_instance)
53
46
 
54
- self.__initialized = True
55
-
56
- await self.device_manager.init()
57
-
58
- def __load_module(self) -> ModuleType:
47
+ def __load_module(self) -> Any:
59
48
  module_path = os.environ.get("MODULE_PATH")
60
49
 
61
50
  spec = importlib.util.spec_from_file_location("plugin_module", module_path)
@@ -70,9 +59,12 @@ class PluginAPI(AsyncIOEventEmitter):
70
59
 
71
60
  spec.loader.exec_module(module)
72
61
 
73
- return module
62
+ plugin_constructor = self.__find_plugin_constructor(module)
63
+ self.__check_plugin_class_methods(plugin_constructor)
64
+
65
+ return plugin_constructor
74
66
 
75
- def __find_plugin_class(self, module: ModuleType) -> Any:
67
+ def __find_plugin_constructor(self, module: ModuleType) -> Any:
76
68
  if hasattr(module, "__main__"):
77
69
  main_func = module.__main__
78
70
  if callable(main_func):
@@ -80,7 +72,7 @@ class PluginAPI(AsyncIOEventEmitter):
80
72
  if isinstance(plugin_base_class, type):
81
73
  return plugin_base_class
82
74
  else:
83
- raise Exception("Plugin's __main__ must return a class plugin class")
75
+ raise Exception("Plugin's __main__ must return a plugin constructor.")
84
76
  else:
85
77
  raise Exception("Plugin's __main__ is not callable.")
86
78