@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.
- package/CHANGELOG.md +8 -0
- package/LICENSE.md +22 -0
- package/README.md +1 -0
- package/dist/bundle.browser.js +1 -0
- package/dist/client/node/src/api.d.ts +5 -0
- package/dist/client/node/src/api.js +27 -0
- package/dist/client/node/src/api.js.map +1 -0
- package/dist/client/node/src/client.d.ts +20 -0
- package/dist/client/node/src/client.js +106 -0
- package/dist/client/node/src/client.js.map +1 -0
- package/dist/client/node/src/index.d.ts +2 -0
- package/dist/client/node/src/index.js +19 -0
- package/dist/client/node/src/index.js.map +1 -0
- package/dist/client/node/src/proxy/cameraDevice/cameraDevice.browser.d.ts +48 -0
- package/dist/client/node/src/proxy/cameraDevice/cameraDevice.browser.js +176 -0
- package/dist/client/node/src/proxy/cameraDevice/cameraDevice.browser.js.map +1 -0
- package/dist/client/node/src/proxy/cameraDevice/cameraDevice.mock.d.ts +1 -0
- package/dist/client/node/src/proxy/cameraDevice/cameraDevice.mock.js +3 -0
- package/dist/client/node/src/proxy/cameraDevice/cameraDevice.mock.js.map +1 -0
- package/dist/client/node/src/proxy/cameraDevice/cameraDevice.node.d.ts +11 -0
- package/dist/client/node/src/proxy/cameraDevice/cameraDevice.node.js +51 -0
- package/dist/client/node/src/proxy/cameraDevice/cameraDevice.node.js.map +1 -0
- package/dist/client/node/src/proxy/cameraDevice/index.d.ts +6 -0
- package/dist/client/node/src/proxy/cameraDevice/index.js +11 -0
- package/dist/client/node/src/proxy/cameraDevice/index.js.map +1 -0
- package/dist/client/node/src/proxy/deviceManager.d.ts +15 -0
- package/dist/client/node/src/proxy/deviceManager.js +67 -0
- package/dist/client/node/src/proxy/deviceManager.js.map +1 -0
- package/dist/client/node/src/proxy/index.d.ts +4 -0
- package/dist/client/node/src/proxy/index.js +21 -0
- package/dist/client/node/src/proxy/index.js.map +1 -0
- package/dist/client/node/src/proxy/pluginsManager.d.ts +9 -0
- package/dist/client/node/src/proxy/pluginsManager.js +25 -0
- package/dist/client/node/src/proxy/pluginsManager.js.map +1 -0
- package/dist/client/node/src/proxy/systemManager.d.ts +9 -0
- package/dist/client/node/src/proxy/systemManager.js +25 -0
- package/dist/client/node/src/proxy/systemManager.js.map +1 -0
- package/dist/client/node/src/socket.d.ts +9 -0
- package/dist/client/node/src/socket.js +45 -0
- package/dist/client/node/src/socket.js.map +1 -0
- package/dist/client/node/src/types.d.ts +22 -0
- package/dist/client/node/src/types.js +3 -0
- package/dist/client/node/src/types.js.map +1 -0
- package/dist/package.json +149 -0
- package/dist/shared/common/utils.d.ts +6 -0
- package/dist/shared/common/utils.js +66 -0
- package/dist/shared/common/utils.js.map +1 -0
- package/dist/shared/types/index.d.ts +8 -0
- package/dist/shared/types/index.js +23 -0
- package/dist/shared/types/index.js.map +1 -0
- package/dist/src/api/database/index.d.ts +25 -0
- package/dist/src/api/database/index.js +203 -0
- package/dist/src/api/database/index.js.map +1 -0
- package/dist/src/api/database/types.d.ts +153 -0
- package/dist/src/api/database/types.js +3 -0
- package/dist/src/api/database/types.js.map +1 -0
- package/dist/src/api/go2rtc/api/application.d.ts +8 -0
- package/dist/src/api/go2rtc/api/application.js +32 -0
- package/dist/src/api/go2rtc/api/application.js.map +1 -0
- package/dist/src/api/go2rtc/api/index.d.ts +3 -0
- package/dist/src/api/go2rtc/api/index.js +33 -0
- package/dist/src/api/go2rtc/api/index.js.map +1 -0
- package/dist/src/api/go2rtc/api/snapshot.d.ts +6 -0
- package/dist/src/api/go2rtc/api/snapshot.js +22 -0
- package/dist/src/api/go2rtc/api/snapshot.js.map +1 -0
- package/dist/src/api/go2rtc/api/streams.d.ts +10 -0
- package/dist/src/api/go2rtc/api/streams.js +32 -0
- package/dist/src/api/go2rtc/api/streams.js.map +1 -0
- package/dist/src/api/go2rtc/index.d.ts +3 -0
- package/dist/src/api/go2rtc/index.js +13 -0
- package/dist/src/api/go2rtc/index.js.map +1 -0
- package/dist/src/api/go2rtc/types.d.ts +43 -0
- package/dist/src/api/go2rtc/types.js +3 -0
- package/dist/src/api/go2rtc/types.js.map +1 -0
- package/dist/src/api/middlewares/socketAuth.middleware.d.ts +41 -0
- package/dist/src/api/middlewares/socketAuth.middleware.js +90 -0
- package/dist/src/api/middlewares/socketAuth.middleware.js.map +1 -0
- package/dist/src/api/schemas/backup.schema.d.ts +220 -0
- package/dist/src/api/schemas/backup.schema.js +94 -0
- package/dist/src/api/schemas/backup.schema.js.map +1 -0
- package/dist/src/api/schemas/cameras.schema.d.ts +316 -0
- package/dist/src/api/schemas/cameras.schema.js +124 -0
- package/dist/src/api/schemas/cameras.schema.js.map +1 -0
- package/dist/src/api/schemas/config.schema.d.ts +202 -0
- package/dist/src/api/schemas/config.schema.js +94 -0
- package/dist/src/api/schemas/config.schema.js.map +1 -0
- package/dist/src/api/schemas/go2rtc.schema.d.ts +604 -0
- package/dist/src/api/schemas/go2rtc.schema.js +204 -0
- package/dist/src/api/schemas/go2rtc.schema.js.map +1 -0
- package/dist/src/api/schemas/users.schema.d.ts +515 -0
- package/dist/src/api/schemas/users.schema.js +131 -0
- package/dist/src/api/schemas/users.schema.js.map +1 -0
- package/dist/src/api/services/auth.service.d.ts +20 -0
- package/dist/src/api/services/auth.service.js +104 -0
- package/dist/src/api/services/auth.service.js.map +1 -0
- package/dist/src/api/services/cameras.service.d.ts +40 -0
- package/dist/src/api/services/cameras.service.js +535 -0
- package/dist/src/api/services/cameras.service.js.map +1 -0
- package/dist/src/api/services/plugins.service.d.ts +23 -0
- package/dist/src/api/services/plugins.service.js +115 -0
- package/dist/src/api/services/plugins.service.js.map +1 -0
- package/dist/src/api/services/users.service.d.ts +13 -0
- package/dist/src/api/services/users.service.js +54 -0
- package/dist/src/api/services/users.service.js.map +1 -0
- package/dist/src/api/types/index.d.ts +522 -0
- package/dist/src/api/types/index.js +12 -0
- package/dist/src/api/types/index.js.map +1 -0
- package/dist/src/api/utils/cert.d.ts +17 -0
- package/dist/src/api/utils/cert.js +437 -0
- package/dist/src/api/utils/cert.js.map +1 -0
- package/dist/src/api/ws/index.d.ts +15 -0
- package/dist/src/api/ws/index.js +89 -0
- package/dist/src/api/ws/index.js.map +1 -0
- package/dist/src/api/ws/nsp/logs.d.ts +11 -0
- package/dist/src/api/ws/nsp/logs.js +121 -0
- package/dist/src/api/ws/nsp/logs.js.map +1 -0
- package/dist/src/api/ws/nsp/main.d.ts +9 -0
- package/dist/src/api/ws/nsp/main.js +49 -0
- package/dist/src/api/ws/nsp/main.js.map +1 -0
- package/dist/src/api/ws/nsp/metrics.d.ts +33 -0
- package/dist/src/api/ws/nsp/metrics.js +225 -0
- package/dist/src/api/ws/nsp/metrics.js.map +1 -0
- package/dist/src/api/ws/nsp/notifications.d.ts +11 -0
- package/dist/src/api/ws/nsp/notifications.js +39 -0
- package/dist/src/api/ws/nsp/notifications.js.map +1 -0
- package/dist/src/api/ws/nsp/plugins.d.ts +13 -0
- package/dist/src/api/ws/nsp/plugins.js +33 -0
- package/dist/src/api/ws/nsp/plugins.js.map +1 -0
- package/dist/src/api/ws/nsp/status.d.ts +12 -0
- package/dist/src/api/ws/nsp/status.js +41 -0
- package/dist/src/api/ws/nsp/status.js.map +1 -0
- package/dist/src/api/ws/nsp/streams.d.ts +30 -0
- package/dist/src/api/ws/nsp/streams.js +140 -0
- package/dist/src/api/ws/nsp/streams.js.map +1 -0
- package/dist/src/api/ws/types.d.ts +82 -0
- package/dist/src/api/ws/types.js +3 -0
- package/dist/src/api/ws/types.js.map +1 -0
- package/dist/src/api.d.ts +60 -0
- package/dist/src/api.js +66 -0
- package/dist/src/api.js.map +1 -0
- package/dist/src/camera/index.d.ts +54 -0
- package/dist/src/camera/index.js +210 -0
- package/dist/src/camera/index.js.map +1 -0
- package/dist/src/camera/streaming/peer-connection.d.ts +31 -0
- package/dist/src/camera/streaming/peer-connection.js +157 -0
- package/dist/src/camera/streaming/peer-connection.js.map +1 -0
- package/dist/src/camera/streaming/streaming-session.d.ts +32 -0
- package/dist/src/camera/streaming/streaming-session.js +172 -0
- package/dist/src/camera/streaming/streaming-session.js.map +1 -0
- package/dist/src/camera/streaming/webrtc-connection.d.ts +33 -0
- package/dist/src/camera/streaming/webrtc-connection.js +156 -0
- package/dist/src/camera/streaming/webrtc-connection.js.map +1 -0
- package/dist/src/camera/subscribed.d.ts +6 -0
- package/dist/src/camera/subscribed.js +14 -0
- package/dist/src/camera/subscribed.js.map +1 -0
- package/dist/src/camera/types.d.ts +130 -0
- package/dist/src/camera/types.js +3 -0
- package/dist/src/camera/types.js.map +1 -0
- package/dist/src/go2rtc/index.d.ts +24 -0
- package/dist/src/go2rtc/index.js +220 -0
- package/dist/src/go2rtc/index.js.map +1 -0
- package/dist/src/go2rtc/types.d.ts +14 -0
- package/dist/src/go2rtc/types.js +76 -0
- package/dist/src/go2rtc/types.js.map +1 -0
- package/dist/src/plugins/base.d.ts +19 -0
- package/dist/src/plugins/base.js +26 -0
- package/dist/src/plugins/base.js.map +1 -0
- package/dist/src/plugins/cameraStorage.d.ts +97 -0
- package/dist/src/plugins/cameraStorage.js +290 -0
- package/dist/src/plugins/cameraStorage.js.map +1 -0
- package/dist/src/plugins/child.d.ts +18 -0
- package/dist/src/plugins/child.js +140 -0
- package/dist/src/plugins/child.js.map +1 -0
- package/dist/src/plugins/config.d.ts +113 -0
- package/dist/src/plugins/config.js +234 -0
- package/dist/src/plugins/config.js.map +1 -0
- package/dist/src/plugins/index.d.ts +36 -0
- package/dist/src/plugins/index.js +328 -0
- package/dist/src/plugins/index.js.map +1 -0
- package/dist/src/plugins/plugin.d.ts +47 -0
- package/dist/src/plugins/plugin.js +215 -0
- package/dist/src/plugins/plugin.js.map +1 -0
- package/dist/src/plugins/schema.d.ts +268 -0
- package/dist/src/plugins/schema.js +717 -0
- package/dist/src/plugins/schema.js.map +1 -0
- package/dist/src/plugins/storage.d.ts +28 -0
- package/dist/src/plugins/storage.js +45 -0
- package/dist/src/plugins/storage.js.map +1 -0
- package/dist/src/plugins/types.d.ts +162 -0
- package/dist/src/plugins/types.js +21 -0
- package/dist/src/plugins/types.js.map +1 -0
- package/dist/src/plugins/worker.d.ts +27 -0
- package/dist/src/plugins/worker.js +236 -0
- package/dist/src/plugins/worker.js.map +1 -0
- package/dist/src/proxy/client/cameraDevice.d.ts +29 -0
- package/dist/src/proxy/client/cameraDevice.js +171 -0
- package/dist/src/proxy/client/cameraDevice.js.map +1 -0
- package/dist/src/proxy/client/deviceManager.d.ts +40 -0
- package/dist/src/proxy/client/deviceManager.js +239 -0
- package/dist/src/proxy/client/deviceManager.js.map +1 -0
- package/dist/src/proxy/client/index.d.ts +4 -0
- package/dist/src/proxy/client/index.js +21 -0
- package/dist/src/proxy/client/index.js.map +1 -0
- package/dist/src/proxy/client/pluginsManager.d.ts +35 -0
- package/dist/src/proxy/client/pluginsManager.js +237 -0
- package/dist/src/proxy/client/pluginsManager.js.map +1 -0
- package/dist/src/proxy/client/systemManager.d.ts +29 -0
- package/dist/src/proxy/client/systemManager.js +163 -0
- package/dist/src/proxy/client/systemManager.js.map +1 -0
- package/dist/src/proxy/index.d.ts +20 -0
- package/dist/src/proxy/index.js +98 -0
- package/dist/src/proxy/index.js.map +1 -0
- package/dist/src/proxy/proxies/camera.d.ts +26 -0
- package/dist/src/proxy/proxies/camera.js +72 -0
- package/dist/src/proxy/proxies/camera.js.map +1 -0
- package/dist/src/proxy/proxies/plugin.d.ts +30 -0
- package/dist/src/proxy/proxies/plugin.js +110 -0
- package/dist/src/proxy/proxies/plugin.js.map +1 -0
- package/dist/src/proxy/proxies/server.d.ts +34 -0
- package/dist/src/proxy/proxies/server.js +92 -0
- package/dist/src/proxy/proxies/server.js.map +1 -0
- package/dist/src/proxy/types.d.ts +189 -0
- package/dist/src/proxy/types.js +3 -0
- package/dist/src/proxy/types.js.map +1 -0
- package/dist/src/proxy/utils/generateKeys.d.ts +5 -0
- package/dist/src/proxy/utils/generateKeys.js +13 -0
- package/dist/src/proxy/utils/generateKeys.js.map +1 -0
- package/dist/src/proxy/ws/index.d.ts +21 -0
- package/dist/src/proxy/ws/index.js +75 -0
- package/dist/src/proxy/ws/index.js.map +1 -0
- package/dist/src/services/config/index.d.ts +60 -0
- package/dist/src/services/config/index.js +319 -0
- package/dist/src/services/config/index.js.map +1 -0
- package/dist/src/services/config/types.d.ts +153 -0
- package/dist/src/services/config/types.js +13 -0
- package/dist/src/services/config/types.js.map +1 -0
- package/dist/src/services/logger/index.d.ts +37 -0
- package/dist/src/services/logger/index.js +181 -0
- package/dist/src/services/logger/index.js.map +1 -0
- package/package.json +46 -0
- 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 @@
|
|
|
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
|
+
}
|
package/dist/src/api.js
ADDED
|
@@ -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
|