@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.
- package/dist/interface/assets/{@tanstack-BqH4GyO-.js → @tanstack-B-9PO-kT.js} +1 -1
- package/dist/interface/assets/{@vee-validate-DCBdnGo-.js → @vee-validate-D_G0ehOl.js} +1 -1
- package/dist/interface/assets/{@vue-C7-KaDG4.js → @vue-C10tA4b9.js} +6 -6
- package/dist/interface/assets/{@vueform-arggO0eF.js → @vueform-Bj73kRPS.js} +1 -1
- package/dist/interface/assets/{@vueuse-C3WMTDqL.js → @vueuse-BPeqNGoM.js} +1 -1
- package/dist/interface/assets/Account-MEaGtu1D.js +1 -0
- package/dist/interface/assets/Adminpanel-D1ycltxf.js +1 -0
- package/dist/interface/assets/Appearance-Jlzp_P21.js +1 -0
- package/dist/interface/assets/Backup-1-ju9NDo.js +1 -0
- package/dist/interface/assets/Camera-BOu5dUel.js +1 -0
- package/dist/interface/assets/Cameras-C7eUXdZk.js +1 -0
- package/dist/interface/assets/Cameras-tmTzi1M6.css +1 -0
- package/dist/interface/assets/Camview-CEgwGCGR.js +1 -0
- package/dist/interface/assets/{Camview-vUAs5YHU.css → Camview-CWTrsoY0.css} +1 -1
- package/dist/interface/assets/Config-Dt-etQ3h.js +1 -0
- package/dist/interface/assets/{Console-Caz7y-T0.js → Console-FCve5CKy.js} +2 -2
- package/dist/interface/assets/FirstSteps-DLkKDSe9.js +1 -0
- package/dist/interface/assets/{NewCamera-B9t-0NCc.js → NewCamera-Cc1X79Ns.js} +2 -2
- package/dist/interface/assets/Plugin-CnQjafMC.js +1 -0
- package/dist/interface/assets/{Plugin-BSHKKjrl.css → Plugin-DzKKCoqQ.css} +1 -1
- package/dist/interface/assets/Plugins-B8gCgxOx.css +1 -0
- package/dist/interface/assets/Plugins-CwyUdMlv.js +1 -0
- package/dist/interface/assets/Recordings-Boeev1lV.js +1 -0
- package/dist/interface/assets/Recordings-D5ta7AYS.js +1 -0
- package/dist/interface/assets/Settings-Cvm2jnBr.js +1 -0
- package/dist/interface/assets/System-fHQ7XKri.js +1 -0
- package/dist/interface/assets/User-5o1VKizc.js +1 -0
- package/dist/interface/assets/VConfigEditor.vue_vue_type_script_setup_true_lang-C_95ELTZ.js +2 -0
- package/dist/interface/assets/VConsole-BHy92Ws0.js +1 -0
- package/dist/interface/assets/VConsole-MV9pQtJj.css +1 -0
- package/dist/interface/assets/{VPlayer-YdRn97Bs.js → VPlayer-LX5HGLrY.js} +1 -1
- package/dist/interface/assets/{VPluginCard--3bx6UJb.js → VPluginCard-CFpg0LM4.js} +2 -2
- package/dist/interface/assets/VPluginCard-Fl0AYmnF.css +1 -0
- package/dist/interface/assets/main-BCWSiwnj.js +9 -0
- package/dist/interface/assets/{main-B3IVLctZ.css → main-CQNVVncO.css} +1 -1
- package/dist/interface/assets/{pinia-D8MtiGcH.js → pinia-CitQ5b66.js} +2 -2
- package/dist/interface/assets/{plugins-Bf03y242.js → plugins-D80RNVmI.js} +1 -1
- package/dist/interface/assets/qrcode-SHonoxyK.js +8 -0
- package/dist/interface/assets/{system-BONnDA4y.js → system-CS_ZOs3_.js} +1 -1
- package/dist/interface/assets/{ui-CNpIJotI.js → ui-CHKoHLl-.js} +1 -1
- package/dist/interface/assets/{v-calendar-uh0aTGqP.js → v-calendar-C-8W4FeM.js} +1 -1
- package/dist/interface/assets/{vee-validate-D3FqbChK.js → vee-validate-Ck3I2guh.js} +1 -1
- package/dist/interface/assets/{vue-i18n-1AU8MPys.js → vue-i18n-DuCDz9TJ.js} +1 -1
- package/dist/interface/assets/{vue-inline-svg-2DDwYW6V.js → vue-inline-svg-C2gR6nRD.js} +1 -1
- package/dist/interface/assets/{vue-router-DfeQ8s4I.js → vue-router-OPGDMnws.js} +1 -1
- package/dist/interface/assets/{vue3-dnd-BwxcSU9Z.js → vue3-dnd-Hf295yge.js} +1 -1
- package/dist/interface/assets/{vue3-toastify-Ul-rf53I.js → vue3-toastify-DQr2dOCx.js} +1 -1
- package/dist/interface/assets/vuetify-CrcT8VHB.js +5 -0
- package/dist/interface/index.html +14 -15
- package/dist/interface/sw.js +1 -1
- package/dist/server/bin/cui-service.d.ts +1 -0
- package/dist/server/bin/cui-service.js +41 -9
- package/dist/server/bin/cui-service.js.map +1 -1
- package/dist/server/package.json +9 -8
- package/dist/server/requirements.txt +2 -3
- package/dist/server/src/api/controllers/cameras.controller.js +2 -2
- package/dist/server/src/api/controllers/cameras.controller.js.map +1 -1
- package/dist/server/src/api/controllers/plugins.controller.js +7 -6
- package/dist/server/src/api/controllers/plugins.controller.js.map +1 -1
- package/dist/server/src/api/go2rtc/api/streams.d.ts +4 -4
- package/dist/server/src/api/go2rtc/api/streams.js +2 -24
- package/dist/server/src/api/go2rtc/api/streams.js.map +1 -1
- package/dist/server/src/api/go2rtc/types.d.ts +6 -2
- package/dist/server/src/api/schemas/go2rtc.schema.d.ts +5 -5
- package/dist/server/src/api/services/cameras.service.d.ts +6 -5
- package/dist/server/src/api/services/cameras.service.js +72 -59
- package/dist/server/src/api/services/cameras.service.js.map +1 -1
- package/dist/server/src/api/services/plugins.service.js +11 -13
- package/dist/server/src/api/services/plugins.service.js.map +1 -1
- package/dist/server/src/api.d.ts +2 -2
- package/dist/server/src/camera/controller.d.ts +9 -4
- package/dist/server/src/camera/controller.js +21 -7
- package/dist/server/src/camera/controller.js.map +1 -1
- package/dist/server/src/camera/device.d.ts +15 -3
- package/dist/server/src/camera/device.js.map +1 -1
- package/dist/server/src/camera/index.d.ts +18 -39
- package/dist/server/src/camera/index.js +137 -165
- package/dist/server/src/camera/index.js.map +1 -1
- package/dist/server/src/camera/interfaces/camera.d.ts +0 -1
- package/dist/server/src/camera/interfaces/camera.js +0 -8
- package/dist/server/src/camera/interfaces/camera.js.map +1 -1
- package/dist/server/src/camera/streaming/werift-session.d.ts +10 -1
- package/dist/server/src/camera/streaming/werift-session.js +16 -1
- package/dist/server/src/camera/streaming/werift-session.js.map +1 -1
- package/dist/server/src/camera/types.d.ts +0 -1
- package/dist/server/src/camera/types.js.map +1 -1
- package/dist/server/src/camera/videoFrame.d.ts +3 -3
- package/dist/server/src/camera/videoFrame.js +6 -7
- package/dist/server/src/camera/videoFrame.js.map +1 -1
- package/dist/server/src/decoder/types.d.ts +4 -9
- package/dist/server/src/decoder/worker.d.ts +3 -5
- package/dist/server/src/decoder/worker.js +40 -64
- package/dist/server/src/decoder/worker.js.map +1 -1
- package/dist/server/src/go2rtc/index.js +1 -1
- package/dist/server/src/go2rtc/index.js.map +1 -1
- package/dist/server/src/index.d.ts +3 -3
- package/dist/server/src/main.js +1 -2
- package/dist/server/src/main.js.map +1 -1
- package/dist/server/src/nats/connection.d.ts +17 -0
- package/dist/server/src/nats/connection.js +66 -0
- package/dist/server/src/nats/connection.js.map +1 -0
- package/dist/server/src/nats/error.d.ts +9 -0
- package/dist/server/src/nats/error.js +11 -0
- package/dist/server/src/nats/error.js.map +1 -0
- package/dist/server/src/nats/index.d.ts +6 -4
- package/dist/server/src/nats/index.js +22 -17
- package/dist/server/src/nats/index.js.map +1 -1
- package/dist/server/src/nats/messageQueue.d.ts +7 -4
- package/dist/server/src/nats/messageQueue.js +43 -59
- package/dist/server/src/nats/messageQueue.js.map +1 -1
- package/dist/server/src/nats/proxy/cameraDevice.js +19 -24
- package/dist/server/src/nats/proxy/cameraDevice.js.map +1 -1
- package/dist/server/src/nats/proxy/deviceManager.d.ts +2 -2
- package/dist/server/src/nats/proxy/deviceManager.js +4 -14
- package/dist/server/src/nats/proxy/deviceManager.js.map +1 -1
- package/dist/server/src/nats/server.js +4 -10
- package/dist/server/src/nats/server.js.map +1 -1
- package/dist/server/src/nats/subscription.d.ts +12 -0
- package/dist/server/src/nats/subscription.js +21 -0
- package/dist/server/src/nats/subscription.js.map +1 -0
- package/dist/server/src/nats/types.d.ts +25 -40
- package/dist/server/src/nats/types.js +1 -10
- package/dist/server/src/nats/types.js.map +1 -1
- package/dist/server/src/nats/utils.d.ts +2 -4
- package/dist/server/src/nats/utils.js +3 -3
- package/dist/server/src/nats/utils.js.map +1 -1
- package/dist/server/src/plugins/index.d.ts +3 -5
- package/dist/server/src/plugins/index.js +54 -141
- package/dist/server/src/plugins/index.js.map +1 -1
- package/dist/server/src/plugins/plugin.d.ts +4 -13
- package/dist/server/src/plugins/plugin.js +40 -90
- package/dist/server/src/plugins/plugin.js.map +1 -1
- package/dist/server/src/plugins/types.d.ts +4 -0
- package/dist/server/src/plugins/types.js.map +1 -1
- package/dist/server/src/plugins/worker.d.ts +1 -1
- package/dist/server/src/plugins/worker.js +52 -66
- package/dist/server/src/plugins/worker.js.map +1 -1
- package/dist/server/src/polyglot/node/decoder/child.js +87 -159
- package/dist/server/src/polyglot/node/decoder/child.js.map +1 -1
- package/dist/server/src/polyglot/node/decoder/imageUtils.d.ts +1 -1
- package/dist/server/src/polyglot/node/plugins/cameraStorage.d.ts +2 -2
- package/dist/server/src/polyglot/node/plugins/cameraStorage.js.map +1 -1
- package/dist/server/src/polyglot/node/plugins/child.d.ts +1 -1
- package/dist/server/src/polyglot/node/plugins/child.js +34 -60
- package/dist/server/src/polyglot/node/plugins/child.js.map +1 -1
- package/dist/server/src/polyglot/node/plugins/{config.js → configService.js} +1 -1
- package/dist/server/src/polyglot/node/plugins/configService.js.map +1 -0
- package/dist/server/src/polyglot/node/plugins/{api.d.ts → pluginApi.d.ts} +9 -12
- package/dist/server/src/polyglot/node/plugins/pluginApi.js +34 -0
- package/dist/server/src/polyglot/node/plugins/pluginApi.js.map +1 -0
- package/dist/server/src/polyglot/node/plugins/{logger.d.ts → pluginLogger.d.ts} +2 -0
- package/dist/server/src/polyglot/node/plugins/pluginLogger.js +89 -0
- package/dist/server/src/polyglot/node/plugins/pluginLogger.js.map +1 -0
- package/dist/server/src/polyglot/node/plugins/proxy/cameraDevice.d.ts +8 -11
- package/dist/server/src/polyglot/node/plugins/proxy/cameraDevice.js +67 -129
- package/dist/server/src/polyglot/node/plugins/proxy/cameraDevice.js.map +1 -1
- package/dist/server/src/polyglot/node/plugins/proxy/deviceManager.d.ts +6 -8
- package/dist/server/src/polyglot/node/plugins/proxy/deviceManager.js +15 -43
- package/dist/server/src/polyglot/node/plugins/proxy/deviceManager.js.map +1 -1
- package/dist/server/src/polyglot/node/plugins/storageController.d.ts +2 -2
- package/dist/server/src/polyglot/node/plugins/storageController.js.map +1 -1
- package/dist/server/src/polyglot/python/camera/interfaces/camera.py +0 -6
- package/dist/server/src/polyglot/python/camera/video_frame.py +10 -18
- package/dist/server/src/polyglot/python/camera_ui_types/__init__.py +1 -5
- package/dist/server/src/polyglot/python/decoder/child.py +102 -161
- package/dist/server/src/polyglot/python/plugins/camera_storage.py +10 -23
- package/dist/server/src/polyglot/python/plugins/child.py +35 -60
- package/dist/server/src/polyglot/python/plugins/{proxy/message_queue.py → message_queue.py} +50 -81
- package/dist/server/src/polyglot/python/plugins/plugin_api.py +13 -21
- package/dist/server/src/polyglot/python/plugins/proxy/camera_device.py +90 -173
- package/dist/server/src/polyglot/python/plugins/proxy/device_manager.py +25 -64
- package/dist/server/src/polyglot/python/plugins/storage_controller.py +3 -4
- package/dist/server/src/polyglot/python/utilities/connection.py +86 -0
- package/dist/server/src/polyglot/python/utilities/object_path.py +12 -4
- package/dist/server/src/polyglot/python/utilities/subscriptions.py +20 -0
- package/dist/server/src/polyglot/python/utilities/task.py +11 -1
- package/dist/server/src/services/config/index.js +4 -2
- package/dist/server/src/services/config/index.js.map +1 -1
- package/dist/server/src/services/logger/index.js +11 -8
- package/dist/server/src/services/logger/index.js.map +1 -1
- package/dist/server/src/utils/ffmpeg.d.ts +2 -0
- package/dist/server/src/{decoder → utils}/ffmpeg.js +2 -2
- package/dist/server/src/utils/ffmpeg.js.map +1 -0
- package/dist/server/src/utils/pythonInstaller.d.ts +1 -1
- package/dist/server/src/utils/pythonInstaller.js +10 -4
- package/dist/server/src/utils/pythonInstaller.js.map +1 -1
- package/dist/server/src/utils/reader.js.map +1 -0
- package/dist/server/src/utils/subscribed.d.ts +4 -4
- package/dist/server/src/utils/subscribed.js.map +1 -1
- package/package.json +9 -8
- package/dist/interface/assets/@camera.ui-2NVnv26v.js +0 -8
- package/dist/interface/assets/Account-gJpkf0nE.js +0 -1
- package/dist/interface/assets/Adminpanel-Bge9nu5N.js +0 -1
- package/dist/interface/assets/Appearance-D22q-X_I.js +0 -1
- package/dist/interface/assets/Backup-pJm6s10G.js +0 -1
- package/dist/interface/assets/Camera-BgO2yRjb.js +0 -1
- package/dist/interface/assets/Cameras-BM3vSM_R.css +0 -1
- package/dist/interface/assets/Cameras-DjeKruR_.js +0 -1
- package/dist/interface/assets/Camview-DfzlprzN.js +0 -1
- package/dist/interface/assets/Config-BKIOIkjC.js +0 -1
- package/dist/interface/assets/FirstSteps-mQK4XFTs.js +0 -1
- package/dist/interface/assets/Plugin-Di_bBsg-.js +0 -1
- package/dist/interface/assets/Plugins-BsMITags.css +0 -1
- package/dist/interface/assets/Plugins-DhmzMNuO.js +0 -1
- package/dist/interface/assets/Recordings-Bu53bSBp.js +0 -1
- package/dist/interface/assets/Recordings-XY20w8yp.js +0 -1
- package/dist/interface/assets/Settings-gGRBRVST.js +0 -1
- package/dist/interface/assets/System-ZDrcLNk0.js +0 -1
- package/dist/interface/assets/User-D4vEhhzi.js +0 -1
- package/dist/interface/assets/VConfigEditor.vue_vue_type_script_setup_true_lang-CXFI-IeE.js +0 -2
- package/dist/interface/assets/VConsole-BHo3xprq.js +0 -1
- package/dist/interface/assets/VConsole-f-nUkOuD.css +0 -1
- package/dist/interface/assets/VPluginCard-BJYMuCLk.css +0 -1
- package/dist/interface/assets/encode-utf8-Cn5aGd7v.js +0 -1
- package/dist/interface/assets/main-C4rYiRNz.js +0 -2
- package/dist/interface/assets/qrcode-CGiDONbL.js +0 -8
- package/dist/interface/assets/vuetify-_-Oqac3B.js +0 -5
- package/dist/server/src/decoder/ffmpeg.d.ts +0 -2
- package/dist/server/src/decoder/ffmpeg.js.map +0 -1
- package/dist/server/src/nats/proxy/index.d.ts +0 -2
- package/dist/server/src/nats/proxy/index.js +0 -3
- package/dist/server/src/nats/proxy/index.js.map +0 -1
- package/dist/server/src/polyglot/node/decoder/reader.js.map +0 -1
- package/dist/server/src/polyglot/node/plugins/api.js +0 -34
- package/dist/server/src/polyglot/node/plugins/api.js.map +0 -1
- package/dist/server/src/polyglot/node/plugins/config.js.map +0 -1
- package/dist/server/src/polyglot/node/plugins/logger.js +0 -128
- package/dist/server/src/polyglot/node/plugins/logger.js.map +0 -1
- package/dist/server/src/polyglot/node/plugins/proxy/index.d.ts +0 -2
- package/dist/server/src/polyglot/node/plugins/proxy/index.js +0 -3
- package/dist/server/src/polyglot/node/plugins/proxy/index.js.map +0 -1
- package/dist/server/src/polyglot/node/plugins/proxy/messageQueue.d.ts +0 -20
- package/dist/server/src/polyglot/node/plugins/proxy/messageQueue.js +0 -152
- package/dist/server/src/polyglot/node/plugins/proxy/messageQueue.js.map +0 -1
- /package/dist/server/src/polyglot/node/plugins/{config.d.ts → configService.d.ts} +0 -0
- /package/dist/server/src/polyglot/python/plugins/{logger.py → plugin_logger.py} +0 -0
- /package/dist/server/src/{polyglot/node/decoder → utils}/reader.d.ts +0 -0
- /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
|
|
14
|
-
from
|
|
15
|
-
from nats.aio.
|
|
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.
|
|
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
|
-
"
|
|
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[
|
|
53
|
-
self.subscriber: Optional[
|
|
54
|
-
self.plugin_subscriber: Optional[
|
|
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[
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
self.publisher
|
|
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.
|
|
76
|
+
self.subscriber.on("message", self.on_worker_message)
|
|
87
77
|
|
|
88
|
-
self.
|
|
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
|
-
|
|
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(*(
|
|
109
|
+
await asyncio.gather(*(camera_device.init() for camera_device in cameras_devices))
|
|
122
110
|
|
|
123
|
-
self.api.device_manager.configure_cameras(
|
|
124
|
-
self.api.plugin.configure_cameras(cast(list[CameraDevice],
|
|
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,
|
|
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
|
|
202
|
-
if
|
|
203
|
-
|
|
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
|
-
|
|
193
|
+
message: ProcessMessage = unpack(msg.data)
|
|
214
194
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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
|
|
3
|
-
from typing import Any, Callable, Union, cast
|
|
2
|
+
from typing import Any, Callable, cast
|
|
4
3
|
|
|
5
|
-
from
|
|
6
|
-
from
|
|
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.
|
|
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
|
|
14
|
+
class MessageQueue:
|
|
15
15
|
def __init__(
|
|
16
16
|
self,
|
|
17
17
|
logger: PluginLogger,
|
|
18
|
-
publisher:
|
|
19
|
-
subscriber:
|
|
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"
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
|
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:
|
|
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
|
|
41
|
-
|
|
41
|
+
self.storage_controller = StorageController(self)
|
|
42
42
|
self.device_manager = DeviceManager(self, logger, plugin, proxy_endpoints, auth)
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|