@camera.ui/browser 0.0.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 (241) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE.md +22 -0
  3. package/README.md +1 -0
  4. package/dist/bundle.browser.js +1 -0
  5. package/dist/client/node/src/api.d.ts +5 -0
  6. package/dist/client/node/src/api.js +27 -0
  7. package/dist/client/node/src/api.js.map +1 -0
  8. package/dist/client/node/src/client.d.ts +20 -0
  9. package/dist/client/node/src/client.js +106 -0
  10. package/dist/client/node/src/client.js.map +1 -0
  11. package/dist/client/node/src/index.d.ts +2 -0
  12. package/dist/client/node/src/index.js +19 -0
  13. package/dist/client/node/src/index.js.map +1 -0
  14. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.browser.d.ts +48 -0
  15. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.browser.js +176 -0
  16. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.browser.js.map +1 -0
  17. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.mock.d.ts +1 -0
  18. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.mock.js +3 -0
  19. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.mock.js.map +1 -0
  20. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.node.d.ts +11 -0
  21. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.node.js +51 -0
  22. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.node.js.map +1 -0
  23. package/dist/client/node/src/proxy/cameraDevice/index.d.ts +6 -0
  24. package/dist/client/node/src/proxy/cameraDevice/index.js +11 -0
  25. package/dist/client/node/src/proxy/cameraDevice/index.js.map +1 -0
  26. package/dist/client/node/src/proxy/deviceManager.d.ts +15 -0
  27. package/dist/client/node/src/proxy/deviceManager.js +67 -0
  28. package/dist/client/node/src/proxy/deviceManager.js.map +1 -0
  29. package/dist/client/node/src/proxy/index.d.ts +4 -0
  30. package/dist/client/node/src/proxy/index.js +21 -0
  31. package/dist/client/node/src/proxy/index.js.map +1 -0
  32. package/dist/client/node/src/proxy/pluginsManager.d.ts +9 -0
  33. package/dist/client/node/src/proxy/pluginsManager.js +25 -0
  34. package/dist/client/node/src/proxy/pluginsManager.js.map +1 -0
  35. package/dist/client/node/src/proxy/systemManager.d.ts +9 -0
  36. package/dist/client/node/src/proxy/systemManager.js +25 -0
  37. package/dist/client/node/src/proxy/systemManager.js.map +1 -0
  38. package/dist/client/node/src/socket.d.ts +9 -0
  39. package/dist/client/node/src/socket.js +45 -0
  40. package/dist/client/node/src/socket.js.map +1 -0
  41. package/dist/client/node/src/types.d.ts +22 -0
  42. package/dist/client/node/src/types.js +3 -0
  43. package/dist/client/node/src/types.js.map +1 -0
  44. package/dist/package.json +149 -0
  45. package/dist/shared/common/utils.d.ts +6 -0
  46. package/dist/shared/common/utils.js +66 -0
  47. package/dist/shared/common/utils.js.map +1 -0
  48. package/dist/shared/types/index.d.ts +8 -0
  49. package/dist/shared/types/index.js +23 -0
  50. package/dist/shared/types/index.js.map +1 -0
  51. package/dist/src/api/database/index.d.ts +25 -0
  52. package/dist/src/api/database/index.js +203 -0
  53. package/dist/src/api/database/index.js.map +1 -0
  54. package/dist/src/api/database/types.d.ts +153 -0
  55. package/dist/src/api/database/types.js +3 -0
  56. package/dist/src/api/database/types.js.map +1 -0
  57. package/dist/src/api/go2rtc/api/application.d.ts +8 -0
  58. package/dist/src/api/go2rtc/api/application.js +32 -0
  59. package/dist/src/api/go2rtc/api/application.js.map +1 -0
  60. package/dist/src/api/go2rtc/api/index.d.ts +3 -0
  61. package/dist/src/api/go2rtc/api/index.js +33 -0
  62. package/dist/src/api/go2rtc/api/index.js.map +1 -0
  63. package/dist/src/api/go2rtc/api/snapshot.d.ts +6 -0
  64. package/dist/src/api/go2rtc/api/snapshot.js +22 -0
  65. package/dist/src/api/go2rtc/api/snapshot.js.map +1 -0
  66. package/dist/src/api/go2rtc/api/streams.d.ts +10 -0
  67. package/dist/src/api/go2rtc/api/streams.js +32 -0
  68. package/dist/src/api/go2rtc/api/streams.js.map +1 -0
  69. package/dist/src/api/go2rtc/index.d.ts +3 -0
  70. package/dist/src/api/go2rtc/index.js +13 -0
  71. package/dist/src/api/go2rtc/index.js.map +1 -0
  72. package/dist/src/api/go2rtc/types.d.ts +43 -0
  73. package/dist/src/api/go2rtc/types.js +3 -0
  74. package/dist/src/api/go2rtc/types.js.map +1 -0
  75. package/dist/src/api/middlewares/socketAuth.middleware.d.ts +41 -0
  76. package/dist/src/api/middlewares/socketAuth.middleware.js +90 -0
  77. package/dist/src/api/middlewares/socketAuth.middleware.js.map +1 -0
  78. package/dist/src/api/schemas/backup.schema.d.ts +220 -0
  79. package/dist/src/api/schemas/backup.schema.js +94 -0
  80. package/dist/src/api/schemas/backup.schema.js.map +1 -0
  81. package/dist/src/api/schemas/cameras.schema.d.ts +316 -0
  82. package/dist/src/api/schemas/cameras.schema.js +124 -0
  83. package/dist/src/api/schemas/cameras.schema.js.map +1 -0
  84. package/dist/src/api/schemas/config.schema.d.ts +202 -0
  85. package/dist/src/api/schemas/config.schema.js +94 -0
  86. package/dist/src/api/schemas/config.schema.js.map +1 -0
  87. package/dist/src/api/schemas/go2rtc.schema.d.ts +604 -0
  88. package/dist/src/api/schemas/go2rtc.schema.js +204 -0
  89. package/dist/src/api/schemas/go2rtc.schema.js.map +1 -0
  90. package/dist/src/api/schemas/users.schema.d.ts +515 -0
  91. package/dist/src/api/schemas/users.schema.js +131 -0
  92. package/dist/src/api/schemas/users.schema.js.map +1 -0
  93. package/dist/src/api/services/auth.service.d.ts +20 -0
  94. package/dist/src/api/services/auth.service.js +104 -0
  95. package/dist/src/api/services/auth.service.js.map +1 -0
  96. package/dist/src/api/services/cameras.service.d.ts +40 -0
  97. package/dist/src/api/services/cameras.service.js +535 -0
  98. package/dist/src/api/services/cameras.service.js.map +1 -0
  99. package/dist/src/api/services/plugins.service.d.ts +23 -0
  100. package/dist/src/api/services/plugins.service.js +115 -0
  101. package/dist/src/api/services/plugins.service.js.map +1 -0
  102. package/dist/src/api/services/users.service.d.ts +13 -0
  103. package/dist/src/api/services/users.service.js +54 -0
  104. package/dist/src/api/services/users.service.js.map +1 -0
  105. package/dist/src/api/types/index.d.ts +522 -0
  106. package/dist/src/api/types/index.js +12 -0
  107. package/dist/src/api/types/index.js.map +1 -0
  108. package/dist/src/api/utils/cert.d.ts +17 -0
  109. package/dist/src/api/utils/cert.js +437 -0
  110. package/dist/src/api/utils/cert.js.map +1 -0
  111. package/dist/src/api/ws/index.d.ts +15 -0
  112. package/dist/src/api/ws/index.js +89 -0
  113. package/dist/src/api/ws/index.js.map +1 -0
  114. package/dist/src/api/ws/nsp/logs.d.ts +11 -0
  115. package/dist/src/api/ws/nsp/logs.js +121 -0
  116. package/dist/src/api/ws/nsp/logs.js.map +1 -0
  117. package/dist/src/api/ws/nsp/main.d.ts +9 -0
  118. package/dist/src/api/ws/nsp/main.js +49 -0
  119. package/dist/src/api/ws/nsp/main.js.map +1 -0
  120. package/dist/src/api/ws/nsp/metrics.d.ts +33 -0
  121. package/dist/src/api/ws/nsp/metrics.js +225 -0
  122. package/dist/src/api/ws/nsp/metrics.js.map +1 -0
  123. package/dist/src/api/ws/nsp/notifications.d.ts +11 -0
  124. package/dist/src/api/ws/nsp/notifications.js +39 -0
  125. package/dist/src/api/ws/nsp/notifications.js.map +1 -0
  126. package/dist/src/api/ws/nsp/plugins.d.ts +13 -0
  127. package/dist/src/api/ws/nsp/plugins.js +33 -0
  128. package/dist/src/api/ws/nsp/plugins.js.map +1 -0
  129. package/dist/src/api/ws/nsp/status.d.ts +12 -0
  130. package/dist/src/api/ws/nsp/status.js +41 -0
  131. package/dist/src/api/ws/nsp/status.js.map +1 -0
  132. package/dist/src/api/ws/nsp/streams.d.ts +30 -0
  133. package/dist/src/api/ws/nsp/streams.js +140 -0
  134. package/dist/src/api/ws/nsp/streams.js.map +1 -0
  135. package/dist/src/api/ws/types.d.ts +82 -0
  136. package/dist/src/api/ws/types.js +3 -0
  137. package/dist/src/api/ws/types.js.map +1 -0
  138. package/dist/src/api.d.ts +60 -0
  139. package/dist/src/api.js +66 -0
  140. package/dist/src/api.js.map +1 -0
  141. package/dist/src/camera/index.d.ts +54 -0
  142. package/dist/src/camera/index.js +210 -0
  143. package/dist/src/camera/index.js.map +1 -0
  144. package/dist/src/camera/streaming/peer-connection.d.ts +31 -0
  145. package/dist/src/camera/streaming/peer-connection.js +157 -0
  146. package/dist/src/camera/streaming/peer-connection.js.map +1 -0
  147. package/dist/src/camera/streaming/streaming-session.d.ts +32 -0
  148. package/dist/src/camera/streaming/streaming-session.js +172 -0
  149. package/dist/src/camera/streaming/streaming-session.js.map +1 -0
  150. package/dist/src/camera/streaming/webrtc-connection.d.ts +33 -0
  151. package/dist/src/camera/streaming/webrtc-connection.js +156 -0
  152. package/dist/src/camera/streaming/webrtc-connection.js.map +1 -0
  153. package/dist/src/camera/subscribed.d.ts +6 -0
  154. package/dist/src/camera/subscribed.js +14 -0
  155. package/dist/src/camera/subscribed.js.map +1 -0
  156. package/dist/src/camera/types.d.ts +130 -0
  157. package/dist/src/camera/types.js +3 -0
  158. package/dist/src/camera/types.js.map +1 -0
  159. package/dist/src/go2rtc/index.d.ts +24 -0
  160. package/dist/src/go2rtc/index.js +220 -0
  161. package/dist/src/go2rtc/index.js.map +1 -0
  162. package/dist/src/go2rtc/types.d.ts +14 -0
  163. package/dist/src/go2rtc/types.js +76 -0
  164. package/dist/src/go2rtc/types.js.map +1 -0
  165. package/dist/src/plugins/base.d.ts +19 -0
  166. package/dist/src/plugins/base.js +26 -0
  167. package/dist/src/plugins/base.js.map +1 -0
  168. package/dist/src/plugins/cameraStorage.d.ts +97 -0
  169. package/dist/src/plugins/cameraStorage.js +290 -0
  170. package/dist/src/plugins/cameraStorage.js.map +1 -0
  171. package/dist/src/plugins/child.d.ts +18 -0
  172. package/dist/src/plugins/child.js +140 -0
  173. package/dist/src/plugins/child.js.map +1 -0
  174. package/dist/src/plugins/config.d.ts +113 -0
  175. package/dist/src/plugins/config.js +234 -0
  176. package/dist/src/plugins/config.js.map +1 -0
  177. package/dist/src/plugins/index.d.ts +36 -0
  178. package/dist/src/plugins/index.js +328 -0
  179. package/dist/src/plugins/index.js.map +1 -0
  180. package/dist/src/plugins/plugin.d.ts +47 -0
  181. package/dist/src/plugins/plugin.js +215 -0
  182. package/dist/src/plugins/plugin.js.map +1 -0
  183. package/dist/src/plugins/schema.d.ts +268 -0
  184. package/dist/src/plugins/schema.js +717 -0
  185. package/dist/src/plugins/schema.js.map +1 -0
  186. package/dist/src/plugins/storage.d.ts +28 -0
  187. package/dist/src/plugins/storage.js +45 -0
  188. package/dist/src/plugins/storage.js.map +1 -0
  189. package/dist/src/plugins/types.d.ts +162 -0
  190. package/dist/src/plugins/types.js +21 -0
  191. package/dist/src/plugins/types.js.map +1 -0
  192. package/dist/src/plugins/worker.d.ts +27 -0
  193. package/dist/src/plugins/worker.js +236 -0
  194. package/dist/src/plugins/worker.js.map +1 -0
  195. package/dist/src/proxy/client/cameraDevice.d.ts +29 -0
  196. package/dist/src/proxy/client/cameraDevice.js +171 -0
  197. package/dist/src/proxy/client/cameraDevice.js.map +1 -0
  198. package/dist/src/proxy/client/deviceManager.d.ts +40 -0
  199. package/dist/src/proxy/client/deviceManager.js +239 -0
  200. package/dist/src/proxy/client/deviceManager.js.map +1 -0
  201. package/dist/src/proxy/client/index.d.ts +4 -0
  202. package/dist/src/proxy/client/index.js +21 -0
  203. package/dist/src/proxy/client/index.js.map +1 -0
  204. package/dist/src/proxy/client/pluginsManager.d.ts +35 -0
  205. package/dist/src/proxy/client/pluginsManager.js +237 -0
  206. package/dist/src/proxy/client/pluginsManager.js.map +1 -0
  207. package/dist/src/proxy/client/systemManager.d.ts +29 -0
  208. package/dist/src/proxy/client/systemManager.js +163 -0
  209. package/dist/src/proxy/client/systemManager.js.map +1 -0
  210. package/dist/src/proxy/index.d.ts +20 -0
  211. package/dist/src/proxy/index.js +98 -0
  212. package/dist/src/proxy/index.js.map +1 -0
  213. package/dist/src/proxy/proxies/camera.d.ts +26 -0
  214. package/dist/src/proxy/proxies/camera.js +72 -0
  215. package/dist/src/proxy/proxies/camera.js.map +1 -0
  216. package/dist/src/proxy/proxies/plugin.d.ts +30 -0
  217. package/dist/src/proxy/proxies/plugin.js +110 -0
  218. package/dist/src/proxy/proxies/plugin.js.map +1 -0
  219. package/dist/src/proxy/proxies/server.d.ts +34 -0
  220. package/dist/src/proxy/proxies/server.js +92 -0
  221. package/dist/src/proxy/proxies/server.js.map +1 -0
  222. package/dist/src/proxy/types.d.ts +189 -0
  223. package/dist/src/proxy/types.js +3 -0
  224. package/dist/src/proxy/types.js.map +1 -0
  225. package/dist/src/proxy/utils/generateKeys.d.ts +5 -0
  226. package/dist/src/proxy/utils/generateKeys.js +13 -0
  227. package/dist/src/proxy/utils/generateKeys.js.map +1 -0
  228. package/dist/src/proxy/ws/index.d.ts +21 -0
  229. package/dist/src/proxy/ws/index.js +75 -0
  230. package/dist/src/proxy/ws/index.js.map +1 -0
  231. package/dist/src/services/config/index.d.ts +60 -0
  232. package/dist/src/services/config/index.js +319 -0
  233. package/dist/src/services/config/index.js.map +1 -0
  234. package/dist/src/services/config/types.d.ts +153 -0
  235. package/dist/src/services/config/types.js +13 -0
  236. package/dist/src/services/config/types.js.map +1 -0
  237. package/dist/src/services/logger/index.d.ts +37 -0
  238. package/dist/src/services/logger/index.js +181 -0
  239. package/dist/src/services/logger/index.js.map +1 -0
  240. package/package.json +46 -0
  241. package/webpack.config.js +29 -0
@@ -0,0 +1,30 @@
1
+ import ws from 'ws';
2
+ import type { Server, Namespace } from 'socket.io';
3
+ import type { SocketNsp } from '../types';
4
+ import type { VideoStreamingMode } from '../../database/types';
5
+ export interface StreamPayload {
6
+ type: VideoStreamingMode;
7
+ value: string;
8
+ }
9
+ export type Go2RtcWsState = 'open' | 'closed' | 'connecting';
10
+ export interface Go2RtcWs {
11
+ id: string;
12
+ ws?: ws;
13
+ state: Go2RtcWsState;
14
+ connect: () => void;
15
+ reconnect: () => void;
16
+ close: (destroy?: boolean) => void;
17
+ }
18
+ export declare class Streams {
19
+ nsp: Namespace;
20
+ nspName: SocketNsp;
21
+ private go2rtcWsMap;
22
+ private logger;
23
+ private configService;
24
+ constructor(io: Server);
25
+ private go2rtcWsConnect;
26
+ private go2rtcWsSendMessage;
27
+ private go2rtcClose;
28
+ private onEnd;
29
+ private onDestroy;
30
+ }
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Streams = void 0;
7
+ const ws_1 = __importDefault(require("ws"));
8
+ const tsyringe_1 = require("tsyringe");
9
+ class Streams {
10
+ nsp;
11
+ nspName = '/streams';
12
+ go2rtcWsMap = new Map();
13
+ logger;
14
+ configService;
15
+ constructor(io) {
16
+ this.logger = tsyringe_1.container.resolve('logger');
17
+ this.configService = tsyringe_1.container.resolve('configService');
18
+ this.nsp = io.of(this.nspName);
19
+ this.nsp.on('connection', (socket) => {
20
+ socket.on('ws-open', this.go2rtcWsConnect.bind(this, socket));
21
+ socket.on('ws-close', this.go2rtcClose.bind(this, socket, true));
22
+ socket.on('ws-pause', this.go2rtcClose.bind(this, socket, false));
23
+ socket.on('stream-payload', this.go2rtcWsSendMessage.bind(this, socket));
24
+ socket.on('end', this.onEnd.bind(this, socket, true));
25
+ socket.on('disconnect', this.onDestroy.bind(this, socket));
26
+ });
27
+ }
28
+ go2rtcWsConnect(socket, { id, cameraSource }) {
29
+ const wsInstance = this.go2rtcWsMap.get(`${socket.encodedToken}-${id}`);
30
+ if (wsInstance) {
31
+ if (wsInstance.state === 'open') {
32
+ socket.emit('ws-open', { id });
33
+ }
34
+ else if (wsInstance.state === 'closed') {
35
+ wsInstance.reconnect();
36
+ }
37
+ else {
38
+ // connecting already
39
+ return;
40
+ }
41
+ }
42
+ const self = this;
43
+ const url = `ws://localhost${this.configService.go2rtcConfig.api.listen}/api/ws?src=${cameraSource}`;
44
+ const connection = {
45
+ id: `${socket.encodedToken}-${id}`,
46
+ ws: new ws_1.default(url),
47
+ state: 'closed',
48
+ connect: function () {
49
+ this.state = 'connecting';
50
+ self.logger.debug('Opening new go2rtc websocket connection to', url);
51
+ this.ws = new ws_1.default(url);
52
+ this.ws.binaryType = 'arraybuffer';
53
+ this.ws.on('open', () => {
54
+ this.state = 'open';
55
+ self.logger.debug(`Websocket connection to ${url} opened`);
56
+ socket.emit('ws-open', { id });
57
+ });
58
+ this.ws.on('close', () => {
59
+ this.state = 'closed';
60
+ self.logger.debug(`Websocket connection to ${url} closed`);
61
+ socket.emit('ws-close', { id });
62
+ });
63
+ this.ws.on('error', (error) => {
64
+ this.state = 'closed';
65
+ self.logger.error(`Can not connect to go2rtc websocket: ${url} - ${error.message}`);
66
+ });
67
+ this.ws.on('message', (data) => {
68
+ const stringMsg = data.toString();
69
+ if (!stringMsg.includes('ArrayBuffer')) {
70
+ // this.logger.verbose('Received payload:', stringMsg);
71
+ const msg = JSON.parse(data);
72
+ msg.wsURL = url;
73
+ socket.emit('ws-message', { id, data: msg });
74
+ }
75
+ else {
76
+ const msg = {
77
+ type: 'binary',
78
+ wsURL: url,
79
+ value: data,
80
+ };
81
+ socket.emit('ws-message', { id, data: msg });
82
+ }
83
+ });
84
+ },
85
+ reconnect: function () {
86
+ this.close(false);
87
+ this.connect();
88
+ },
89
+ close: function (destroy) {
90
+ this.ws?.removeAllListeners();
91
+ this.ws?.once('error', () => { });
92
+ this.ws?.close();
93
+ this.state = 'closed';
94
+ if (destroy) {
95
+ self.logger.debug(`Websocket connection to ${url} closed and removed`);
96
+ self.go2rtcWsMap?.delete(`${socket.encodedToken}-${id}`);
97
+ }
98
+ else {
99
+ self.logger.debug(`Websocket connection to ${url} closed`);
100
+ }
101
+ },
102
+ };
103
+ connection.connect();
104
+ this.go2rtcWsMap.set(connection.id, connection);
105
+ }
106
+ async go2rtcWsSendMessage(socket, { id, data }) {
107
+ // this.logger.verbose('Sending payload:', id, JSON.stringify(data));
108
+ const wsInstance = this.go2rtcWsMap.get(`${socket.encodedToken}-${id}`);
109
+ if (wsInstance && wsInstance.state !== 'open') {
110
+ wsInstance.reconnect();
111
+ wsInstance.ws?.once('open', () => {
112
+ wsInstance?.ws?.send(JSON.stringify(data));
113
+ });
114
+ return;
115
+ }
116
+ wsInstance?.ws?.send(JSON.stringify(data));
117
+ }
118
+ go2rtcClose(socket, remove, data) {
119
+ for (const [name, wsInstance] of this.go2rtcWsMap) {
120
+ if (data?.id) {
121
+ if (name === `${socket.encodedToken}-${data?.id}`) {
122
+ wsInstance.close(remove);
123
+ }
124
+ }
125
+ else if (name.startsWith(socket.encodedToken)) {
126
+ wsInstance.close(remove);
127
+ }
128
+ }
129
+ }
130
+ onEnd(socket, remove, id) {
131
+ this.go2rtcClose(socket, remove, id ? { id } : undefined);
132
+ socket.removeAllListeners('end');
133
+ }
134
+ onDestroy(socket) {
135
+ this.onEnd(socket, true);
136
+ socket.removeAllListeners('disconnect');
137
+ }
138
+ }
139
+ exports.Streams = Streams;
140
+ //# sourceMappingURL=streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.js","sourceRoot":"","sources":["../../../../../../../src/api/ws/nsp/streams.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { PLUGIN_STATUS } from '../../plugins/types';
2
+ import type { Namespace } from 'socket.io';
3
+ export type SocketNsp = '/camera.ui' | '/metrics' | '/logs' | '/status' | '/notifications' | '/streams' | '/plugins' | '/proxy';
4
+ export interface SocketNspMap {
5
+ nsp: Namespace;
6
+ [key: string]: any;
7
+ }
8
+ export interface CpuTemperatureData {
9
+ main: number;
10
+ cores: number[];
11
+ max: number;
12
+ socket?: number[];
13
+ chipset?: number;
14
+ }
15
+ export interface MemData {
16
+ total: number;
17
+ free: number;
18
+ used: number;
19
+ active: number;
20
+ available: number;
21
+ buffcache: number;
22
+ buffers: number;
23
+ cached: number;
24
+ slab: number;
25
+ swaptotal: number;
26
+ swapused: number;
27
+ swapfree: number;
28
+ writeback: number | null;
29
+ dirty: number | null;
30
+ }
31
+ export interface NetworkStatsData {
32
+ iface: string;
33
+ operstate: string;
34
+ rx_bytes: number;
35
+ rx_dropped: number;
36
+ rx_errors: number;
37
+ tx_bytes: number;
38
+ tx_dropped: number;
39
+ tx_errors: number;
40
+ rx_sec: number;
41
+ tx_sec: number;
42
+ ms: number;
43
+ }
44
+ export interface ProcessInfo {
45
+ name: string;
46
+ pid?: number;
47
+ cpuLoad: number;
48
+ memLoad: number;
49
+ }
50
+ export interface ProcessesInfo {
51
+ server: ProcessInfo;
52
+ go2rtc: ProcessInfo;
53
+ }
54
+ export interface PluginProcessesInfo {
55
+ plugins: ProcessInfo[];
56
+ }
57
+ export interface AllProcessesInfo extends ProcessesInfo, PluginProcessesInfo {
58
+ }
59
+ export interface CpuInfo {
60
+ currentLoad: number;
61
+ cpuHistory: number[];
62
+ }
63
+ export interface CpuTempInfo {
64
+ currentTemperature: CpuTemperatureData;
65
+ cpuTempHistory: CpuTemperatureData[];
66
+ }
67
+ export interface MemoryInfo {
68
+ memoryInfo?: MemData;
69
+ memHistory: number[];
70
+ }
71
+ export interface NetworkData {
72
+ net: NetworkStatsData;
73
+ point: number;
74
+ }
75
+ export interface NetworkInfo {
76
+ currentNetworkLoad: NetworkData;
77
+ networkHistory: NetworkData[];
78
+ }
79
+ export interface PluginRuntime {
80
+ name: string;
81
+ status: PLUGIN_STATUS;
82
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/api/ws/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ /// <reference types="node" />
2
+ import EventEmitter from 'events';
3
+ import type { PluginLogger } from './services/logger';
4
+ import type { PluginContract } from './plugins/types';
5
+ import type { PluginConfigService } from './plugins/config';
6
+ import type { BasePlugin } from './plugins/base';
7
+ import type { Storage } from './plugins/storage';
8
+ import type { Camera } from './api/database/types';
9
+ import type { DeviceManager, PluginsManager, SystemManager } from './proxy/client';
10
+ import type { CameraDevice } from './camera/types';
11
+ export interface PluginInitializer {
12
+ (api: API): void | Promise<void>;
13
+ }
14
+ export interface PluginConstructor {
15
+ new (pluginId: string, log: PluginLogger, config: PluginConfigService, storage: Storage, api: API): BasePlugin;
16
+ }
17
+ export declare const enum API_EVENT {
18
+ FINISH_LAUNCHING = "finishLaunching",
19
+ SHUTDOWN = "shutdown"
20
+ }
21
+ export declare const enum INTERNAL_API_EVENT {
22
+ REGISTER_PLUGIN = "registerPlugin"
23
+ }
24
+ export interface API {
25
+ on(event: 'finishLaunching', listener: () => void): this;
26
+ on(event: 'shutdown', listener: () => void): this;
27
+ deviceManager: DeviceManager;
28
+ pluginsManager: PluginsManager;
29
+ systemManager: SystemManager;
30
+ registerPlugin(constructor: PluginConstructor, contract: PluginContract): void;
31
+ storage(): {
32
+ storagePath: string;
33
+ configFile: string;
34
+ };
35
+ }
36
+ export declare interface CameraUiAPI {
37
+ on(event: 'finishLaunching', listener: () => void): this;
38
+ on(event: 'shutdown', listener: () => void): this;
39
+ deviceManager: DeviceManager;
40
+ pluginsManager: PluginsManager;
41
+ systemManager: SystemManager;
42
+ registerPlugin(constructor: PluginConstructor, contract: PluginContract): void;
43
+ storage(): {
44
+ storagePath: string;
45
+ configFile: string;
46
+ };
47
+ on(event: INTERNAL_API_EVENT.REGISTER_PLUGIN, listener: (constructor: PluginConstructor, contract: PluginContract) => void): this;
48
+ emit(event: 'finishLaunching'): boolean;
49
+ emit(event: 'shutdown'): boolean;
50
+ emit(event: INTERNAL_API_EVENT.REGISTER_PLUGIN, constructor: PluginConstructor, contract: PluginContract): boolean;
51
+ }
52
+ export declare class CameraUiAPI extends EventEmitter implements API {
53
+ private devices;
54
+ constructor();
55
+ configureCameras(): Promise<void>;
56
+ addCamera(camera: Camera): void;
57
+ getCamera(cameraId: string): CameraDevice | undefined;
58
+ updateCamera(cameraData: Camera): Promise<void>;
59
+ removeCamera(cameraId: string): Promise<void>;
60
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CameraUiAPI = exports.INTERNAL_API_EVENT = exports.API_EVENT = void 0;
16
+ const events_1 = __importDefault(require("events"));
17
+ const tsyringe_1 = require("tsyringe");
18
+ const cameras_service_1 = __importDefault(require("./api/services/cameras.service"));
19
+ const camera_1 = require("./camera");
20
+ var API_EVENT;
21
+ (function (API_EVENT) {
22
+ API_EVENT["FINISH_LAUNCHING"] = "finishLaunching";
23
+ API_EVENT["SHUTDOWN"] = "shutdown";
24
+ })(API_EVENT || (exports.API_EVENT = API_EVENT = {}));
25
+ var INTERNAL_API_EVENT;
26
+ (function (INTERNAL_API_EVENT) {
27
+ INTERNAL_API_EVENT["REGISTER_PLUGIN"] = "registerPlugin";
28
+ })(INTERNAL_API_EVENT || (exports.INTERNAL_API_EVENT = INTERNAL_API_EVENT = {}));
29
+ let CameraUiAPI = class CameraUiAPI extends events_1.default {
30
+ devices = new Map();
31
+ constructor() {
32
+ super();
33
+ tsyringe_1.container.register('api', { useValue: this });
34
+ }
35
+ registerPlugin(constructor, contract) {
36
+ this.emit("registerPlugin" /* INTERNAL_API_EVENT.REGISTER_PLUGIN */, constructor, contract);
37
+ }
38
+ async configureCameras() {
39
+ const camerasService = new cameras_service_1.default();
40
+ const cameras = await camerasService.listTransformed();
41
+ cameras.forEach((camera) => this.addCamera(camera));
42
+ }
43
+ addCamera(camera) {
44
+ if (!this.devices.has(camera._id)) {
45
+ this.devices.set(camera._id, new camera_1.CameraDeviceHub(camera, tsyringe_1.container.resolve('logger')));
46
+ }
47
+ }
48
+ getCamera(cameraId) {
49
+ return this.devices.get(cameraId);
50
+ }
51
+ async updateCamera(cameraData) {
52
+ const camera = this.devices.get(cameraData._id);
53
+ camera?.updateCamera(cameraData);
54
+ }
55
+ async removeCamera(cameraId) {
56
+ const camera = this.devices.get(cameraId);
57
+ camera?.removeCamera();
58
+ this.devices.delete(cameraId);
59
+ }
60
+ };
61
+ exports.CameraUiAPI = CameraUiAPI;
62
+ exports.CameraUiAPI = CameraUiAPI = __decorate([
63
+ (0, tsyringe_1.scoped)(tsyringe_1.Lifecycle.ContainerScoped),
64
+ __metadata("design:paramtypes", [])
65
+ ], CameraUiAPI);
66
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,uCAAwD;AAExD,qFAA4D;AAC5D,qCAA2C;AAmB3C,IAAkB,SAGjB;AAHD,WAAkB,SAAS;IACzB,iDAAoC,CAAA;IACpC,kCAAqB,CAAA;AACvB,CAAC,EAHiB,SAAS,yBAAT,SAAS,QAG1B;AAED,IAAkB,kBAEjB;AAFD,WAAkB,kBAAkB;IAClC,wDAAkC,CAAA;AACpC,CAAC,EAFiB,kBAAkB,kCAAlB,kBAAkB,QAEnC;AAmCM,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,gBAAY;IACnC,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAErD;QACE,KAAK,EAAE,CAAC;QAER,oBAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAEM,cAAc,CAAC,WAA8B,EAAE,QAAwB;QAC5E,IAAI,CAAC,IAAI,4DAAqC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;IAEM,KAAK,CAAC,gBAAgB;QAC3B,MAAM,cAAc,GAAG,IAAI,yBAAc,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,eAAe,EAAE,CAAC;QAEvD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;IAEM,SAAS,CAAC,MAAc;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,wBAAe,CAAC,MAAM,EAAE,oBAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEM,SAAS,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,UAAkB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,QAAgB;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,EAAE,YAAY,EAAE,CAAC;QAEvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;CACF,CAAA;AAzCY,kCAAW;sBAAX,WAAW;IADvB,IAAA,iBAAM,EAAC,oBAAS,CAAC,eAAe,CAAC;;GACrB,WAAW,CAyCvB"}
@@ -0,0 +1,54 @@
1
+ import 'reflect-metadata';
2
+ import { Observable } from 'rxjs';
3
+ import { StreamingSession } from './streaming/streaming-session';
4
+ import type { Camera, CameraInput } from '../api/database/types';
5
+ import type { StateValues, OnSetEvent, LightState, MotionState, AudioState, ObjectState, DoorbellState, SirenState, StreamingConnectionOptions, FfmpegOptions } from './types';
6
+ import type { CameraDevice } from './types';
7
+ import type { Logger, PluginLogger } from '../services/logger';
8
+ export declare class CameraDeviceHub implements CameraDevice {
9
+ private isWorker;
10
+ private ffmpegPath;
11
+ private logger;
12
+ private proxy?;
13
+ private cameraSubject;
14
+ private lightState;
15
+ private motionState;
16
+ private audioState;
17
+ private objectState;
18
+ private doorbellState;
19
+ private sirenState;
20
+ onLightDetected: Observable<LightState>;
21
+ onMotionDetected: Observable<MotionState>;
22
+ onAudioDetected: Observable<AudioState>;
23
+ onObjectDetected: Observable<ObjectState>;
24
+ onDoorbellPressed: Observable<DoorbellState>;
25
+ onSirenDetected: Observable<SirenState>;
26
+ get id(): string;
27
+ get nativeId(): string | undefined;
28
+ get pluginId(): string;
29
+ get name(): string;
30
+ get type(): string;
31
+ get model(): string;
32
+ get sources(): CameraInput[];
33
+ constructor(camera: Camera, logger: Logger | PluginLogger | Console);
34
+ getValue<T extends keyof StateValues>(stateName: T): StateValues[T];
35
+ createSession(cameraInput: CameraInput, options?: StreamingConnectionOptions): Promise<StreamingSession>;
36
+ streamVideo(cameraInput: CameraInput, options: FfmpegOptions): Promise<StreamingSession>;
37
+ recordToFile(cameraInput: CameraInput, outputPath: string, duration?: number): Promise<void>;
38
+ updateState<T extends keyof StateValues>(stateName: T, eventData: OnSetEvent<T>): void;
39
+ onStateChange<T extends keyof StateValues>(stateName: T): Observable<{
40
+ newState: StateValues[T];
41
+ oldState: StateValues[T];
42
+ }>;
43
+ onPropertyChange<T extends keyof Camera>(property: T): Observable<{
44
+ oldState: Camera[T];
45
+ newState: Camera[T];
46
+ }>;
47
+ updateCamera(camera: Camera): void;
48
+ removeCamera(): void;
49
+ removeAllListeners(): void;
50
+ private createStateObservable;
51
+ private subscribeToCameraChanges;
52
+ private subscribeToStateChanges;
53
+ private triggerProxyEvent;
54
+ }
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CameraDeviceHub = void 0;
4
+ require("reflect-metadata");
5
+ const tsyringe_1 = require("tsyringe");
6
+ const rxjs_1 = require("rxjs");
7
+ const operators_1 = require("rxjs/operators");
8
+ const webrtc_connection_1 = require("./streaming/webrtc-connection");
9
+ const streaming_session_1 = require("./streaming/streaming-session");
10
+ class CameraDeviceHub {
11
+ isWorker = process.env.IS_WORKER === 'true';
12
+ ffmpegPath = process.env.CAMERA_UI_FFMPEG_BINARY;
13
+ logger;
14
+ proxy;
15
+ cameraSubject;
16
+ lightState = new rxjs_1.BehaviorSubject({ state: false, timestamp: 0, lastTriggered: 0 });
17
+ motionState = new rxjs_1.BehaviorSubject({ state: false, timestamp: 0, lastTriggered: 0 });
18
+ audioState = new rxjs_1.BehaviorSubject({ state: false, timestamp: 0, lastTriggered: 0 });
19
+ objectState = new rxjs_1.BehaviorSubject({ state: false, timestamp: 0, lastTriggered: 0, detections: [] });
20
+ doorbellState = new rxjs_1.BehaviorSubject({ state: false, timestamp: 0, lastTriggered: 0 });
21
+ sirenState = new rxjs_1.BehaviorSubject({ state: false, timestamp: 0, lastTriggered: 0 });
22
+ onLightDetected = this.createStateObservable(this.lightState);
23
+ onMotionDetected = this.createStateObservable(this.motionState);
24
+ onAudioDetected = this.createStateObservable(this.audioState);
25
+ onObjectDetected = this.createStateObservable(this.objectState);
26
+ onDoorbellPressed = this.createStateObservable(this.doorbellState);
27
+ onSirenDetected = this.createStateObservable(this.sirenState);
28
+ get id() {
29
+ return this.cameraSubject.getValue()._id;
30
+ }
31
+ get nativeId() {
32
+ return this.cameraSubject.getValue().nativeId;
33
+ }
34
+ get pluginId() {
35
+ return this.cameraSubject.getValue().pluginId;
36
+ }
37
+ get name() {
38
+ return this.cameraSubject.getValue().name;
39
+ }
40
+ get type() {
41
+ return this.cameraSubject.getValue().type;
42
+ }
43
+ get model() {
44
+ return this.cameraSubject.getValue().model;
45
+ }
46
+ get sources() {
47
+ return this.cameraSubject.getValue().sources;
48
+ }
49
+ constructor(camera, logger) {
50
+ this.proxy = !this.isWorker ? tsyringe_1.container.resolve('proxy') : undefined;
51
+ this.logger = logger;
52
+ this.cameraSubject = new rxjs_1.BehaviorSubject(camera);
53
+ if (!this.isWorker) {
54
+ this.subscribeToCameraChanges();
55
+ this.subscribeToStateChanges('light', this.lightState);
56
+ this.subscribeToStateChanges('motion', this.motionState);
57
+ this.subscribeToStateChanges('audio', this.audioState);
58
+ this.subscribeToStateChanges('object', this.objectState);
59
+ this.subscribeToStateChanges('doorbell', this.doorbellState);
60
+ this.subscribeToStateChanges('siren', this.sirenState);
61
+ }
62
+ }
63
+ getValue(stateName) {
64
+ switch (stateName) {
65
+ case 'light':
66
+ return this.lightState.getValue();
67
+ case 'motion':
68
+ return this.motionState.getValue();
69
+ case 'audio':
70
+ return this.audioState.getValue();
71
+ case 'object':
72
+ return this.objectState.getValue();
73
+ case 'doorbell':
74
+ return this.doorbellState.getValue();
75
+ case 'siren':
76
+ return this.sirenState.getValue();
77
+ default:
78
+ throw new Error(`Unknown state: ${stateName}`);
79
+ }
80
+ }
81
+ async createSession(cameraInput, options = {}) {
82
+ const connection = new webrtc_connection_1.WebrtcConnection(this.cameraSubject.getValue().name, cameraInput, options, this.logger);
83
+ return new streaming_session_1.StreamingSession(this.cameraSubject.getValue().name, this.ffmpegPath || 'ffmpeg', connection, this.logger);
84
+ }
85
+ async streamVideo(cameraInput, options) {
86
+ const liveCall = await this.createSession(cameraInput);
87
+ await liveCall.startTranscoding(options);
88
+ return liveCall;
89
+ }
90
+ async recordToFile(cameraInput, outputPath, duration = 60) {
91
+ const liveCall = await this.streamVideo(cameraInput, {
92
+ output: ['-t', duration.toString(), outputPath],
93
+ });
94
+ await (0, rxjs_1.firstValueFrom)(liveCall.onCallEnded);
95
+ }
96
+ updateState(stateName, eventData) {
97
+ const timestamp = Date.now();
98
+ let newState;
99
+ switch (stateName) {
100
+ case 'light':
101
+ newState = {
102
+ ...eventData,
103
+ timestamp,
104
+ lastTriggered: eventData.state ? timestamp : this.lightState.getValue().lastTriggered,
105
+ };
106
+ this.lightState.next(this.isWorker ? eventData : newState);
107
+ break;
108
+ case 'motion':
109
+ newState = {
110
+ ...eventData,
111
+ timestamp,
112
+ lastTriggered: eventData.state ? timestamp : this.motionState.getValue().lastTriggered,
113
+ };
114
+ this.motionState.next(this.isWorker ? eventData : newState);
115
+ break;
116
+ case 'audio':
117
+ newState = {
118
+ ...eventData,
119
+ timestamp,
120
+ lastTriggered: eventData.state ? timestamp : this.audioState.getValue().lastTriggered,
121
+ };
122
+ this.audioState.next(this.isWorker ? eventData : newState);
123
+ break;
124
+ case 'object':
125
+ newState = {
126
+ ...eventData,
127
+ timestamp,
128
+ lastTriggered: eventData.state ? timestamp : this.objectState.getValue().lastTriggered,
129
+ };
130
+ this.objectState.next(this.isWorker ? eventData : newState);
131
+ break;
132
+ case 'doorbell':
133
+ newState = {
134
+ ...eventData,
135
+ timestamp,
136
+ lastTriggered: eventData.state ? timestamp : this.doorbellState.getValue().lastTriggered,
137
+ };
138
+ this.doorbellState.next(this.isWorker ? eventData : newState);
139
+ break;
140
+ case 'siren':
141
+ newState = {
142
+ ...eventData,
143
+ timestamp,
144
+ lastTriggered: eventData.state ? timestamp : this.sirenState.getValue().lastTriggered,
145
+ };
146
+ this.sirenState.next(this.isWorker ? eventData : newState);
147
+ break;
148
+ default:
149
+ throw new Error(`Unbekannter Zustand: ${stateName}`);
150
+ }
151
+ }
152
+ onStateChange(stateName) {
153
+ const state = this[`${stateName}State`];
154
+ return state.pipe((0, operators_1.pairwise)(), (0, operators_1.filter)(([oldState, newState]) => oldState.state !== newState.state), (0, operators_1.map)(([oldState, newState]) => ({ oldState, newState })), (0, operators_1.share)({ connector: () => new rxjs_1.ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false }));
155
+ }
156
+ onPropertyChange(property) {
157
+ return this.cameraSubject.pipe((0, operators_1.pairwise)(), (0, operators_1.filter)(([oldCamera, newCamera]) => oldCamera[property] !== newCamera[property]), (0, operators_1.map)(([oldCamera, newCamera]) => ({ oldState: oldCamera[property], newState: newCamera[property] })), (0, operators_1.share)({ connector: () => new rxjs_1.ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false }));
158
+ }
159
+ updateCamera(camera) {
160
+ this.cameraSubject.next(camera);
161
+ }
162
+ removeCamera() {
163
+ this.removeAllListeners();
164
+ this.triggerProxyEvent('removed');
165
+ }
166
+ removeAllListeners() {
167
+ this.lightState.complete();
168
+ this.motionState.complete();
169
+ this.audioState.complete();
170
+ this.objectState.complete();
171
+ this.doorbellState.complete();
172
+ this.sirenState.complete();
173
+ }
174
+ createStateObservable(stateSubject) {
175
+ return stateSubject.pipe((0, operators_1.distinctUntilChanged)(), (0, operators_1.share)({ connector: () => new rxjs_1.ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false }));
176
+ }
177
+ subscribeToCameraChanges() {
178
+ this.cameraSubject
179
+ .pipe((0, operators_1.pairwise)(), (0, operators_1.filter)(([oldCamera, newCamera]) => JSON.stringify(oldCamera) !== JSON.stringify(newCamera)))
180
+ .subscribe({
181
+ next: ([, newCamera]) => {
182
+ this.triggerProxyEvent('updated', newCamera);
183
+ },
184
+ error: (error) => this.logger.error(this.name, 'Error subscribing to camera subject:', error),
185
+ });
186
+ }
187
+ subscribeToStateChanges(stateName, stateSubject) {
188
+ stateSubject
189
+ .pipe((0, operators_1.pairwise)(), (0, operators_1.filter)(([oldState, newState]) => oldState.state !== newState.state))
190
+ .subscribe({
191
+ next: ([oldState, newState]) => {
192
+ this.triggerProxyEvent(stateName, newState, oldState);
193
+ },
194
+ error: (error) => this.logger.error(this.name, `Error subscribing '${stateName}':`, error),
195
+ });
196
+ }
197
+ async triggerProxyEvent(stateName, newEvent, oldEvent) {
198
+ if (stateName === 'updated') {
199
+ await this.proxy?.camera?.publishCameraMessage(this.cameraSubject.getValue()._id, stateName, newEvent);
200
+ }
201
+ else if (stateName === 'removed') {
202
+ await this.proxy?.camera?.publishCameraMessage(this.cameraSubject.getValue()._id, stateName);
203
+ }
204
+ else {
205
+ await this.proxy?.camera?.publishCameraMessage(this.cameraSubject.getValue()._id, stateName, { newEvent, oldEvent });
206
+ }
207
+ }
208
+ }
209
+ exports.CameraDeviceHub = CameraDeviceHub;
210
+ //# sourceMappingURL=index.js.map