@camera.ui/camera-ui-eufy 0.0.20 → 0.0.21
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/bundle.zip +0 -0
- package/package.json +16 -27
- package/CHANGELOG.md +0 -8
- package/CONTRIBUTING.md +0 -1
- package/LICENSE.md +0 -22
- package/README.md +0 -1
- package/config.schema.json +0 -356
- package/dist/camera.d.ts +0 -23
- package/dist/camera.js +0 -132
- package/dist/camera.js.map +0 -1
- package/dist/eufy/LocalLiveStreamManager.d.ts +0 -31
- package/dist/eufy/LocalLiveStreamManager.js +0 -111
- package/dist/eufy/LocalLiveStreamManager.js.map +0 -1
- package/dist/eufy/Talkback.d.ts +0 -23
- package/dist/eufy/Talkback.js +0 -93
- package/dist/eufy/Talkback.js.map +0 -1
- package/dist/eufy/utils.d.ts +0 -22
- package/dist/eufy/utils.js +0 -102
- package/dist/eufy/utils.js.map +0 -1
- package/dist/index.d.ts +0 -31
- package/dist/index.js +0 -419
- package/dist/index.js.map +0 -1
- package/dist/types.d.ts +0 -37
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils.d.ts +0 -3
- package/dist/utils.js +0 -262
- package/dist/utils.js.map +0 -1
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'node:events';
|
|
2
|
-
// Define a class for the local livestream manager.
|
|
3
|
-
export class LocalLivestreamManager extends EventEmitter {
|
|
4
|
-
CONNECTION_ESTABLISHED_TIMEOUT = 5;
|
|
5
|
-
stationStream = null;
|
|
6
|
-
livestreamStartedAt = null;
|
|
7
|
-
livestreamIsStarting = false;
|
|
8
|
-
eufyClient;
|
|
9
|
-
cameraDevice;
|
|
10
|
-
home;
|
|
11
|
-
cameraLogger;
|
|
12
|
-
serial_number;
|
|
13
|
-
constructor(home, eufyClient, eufyDevice, cameraDevice, cameraLogger) {
|
|
14
|
-
super();
|
|
15
|
-
this.eufyClient = eufyClient;
|
|
16
|
-
this.serial_number = eufyDevice.getSerial();
|
|
17
|
-
this.cameraLogger = cameraLogger;
|
|
18
|
-
this.home = home;
|
|
19
|
-
this.cameraDevice = cameraDevice;
|
|
20
|
-
this.initialize();
|
|
21
|
-
this.eufyClient.on('station livestream start', this.onStationLivestreamStart.bind(this));
|
|
22
|
-
this.eufyClient.on('station livestream stop', this.onStationLivestreamStop.bind(this));
|
|
23
|
-
}
|
|
24
|
-
// Initialize the manager.
|
|
25
|
-
initialize() {
|
|
26
|
-
if (this.stationStream) {
|
|
27
|
-
this.stationStream.audiostream.unpipe();
|
|
28
|
-
this.stationStream.audiostream.destroy();
|
|
29
|
-
this.stationStream.videostream.unpipe();
|
|
30
|
-
this.stationStream.videostream.destroy();
|
|
31
|
-
}
|
|
32
|
-
this.stationStream = null;
|
|
33
|
-
this.livestreamStartedAt = null;
|
|
34
|
-
}
|
|
35
|
-
// Get the local livestream.
|
|
36
|
-
async getLocalLivestream() {
|
|
37
|
-
this.cameraLogger.debug(this.home.name, 'New instance requests livestream.');
|
|
38
|
-
if (this.stationStream) {
|
|
39
|
-
const runtime = (Date.now() - this.livestreamStartedAt) / 1000;
|
|
40
|
-
this.cameraLogger.debug(this.home.name, 'Using livestream that was started ' + runtime + ' seconds ago.');
|
|
41
|
-
return this.stationStream;
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
return await this.startAndGetLocalLiveStream();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
// Start and get the local livestream.
|
|
48
|
-
async startAndGetLocalLiveStream() {
|
|
49
|
-
return new Promise((resolve, reject) => {
|
|
50
|
-
this.cameraLogger.debug(this.home.name, 'Start new station livestream...');
|
|
51
|
-
if (!this.livestreamIsStarting) {
|
|
52
|
-
// prevent multiple stream starts from eufy station
|
|
53
|
-
this.livestreamIsStarting = true;
|
|
54
|
-
this.eufyClient.startStationLivestream(this.serial_number);
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
this.cameraLogger.debug(this.home.name, 'stream is already starting. waiting...');
|
|
58
|
-
}
|
|
59
|
-
// Hard stop
|
|
60
|
-
const hardStop = setTimeout(() => {
|
|
61
|
-
this.stopLocalLiveStream();
|
|
62
|
-
this.livestreamIsStarting = false;
|
|
63
|
-
reject('No livestream emited!');
|
|
64
|
-
}, 15 * 1000);
|
|
65
|
-
this.once('livestream start', async () => {
|
|
66
|
-
if (this.stationStream !== null) {
|
|
67
|
-
this.cameraLogger.debug(this.home.name, 'New livestream started.');
|
|
68
|
-
clearTimeout(hardStop);
|
|
69
|
-
this.livestreamIsStarting = false;
|
|
70
|
-
resolve(this.stationStream);
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
reject('no started livestream found');
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
// Stop the local livestream.
|
|
79
|
-
stopLocalLiveStream() {
|
|
80
|
-
this.cameraLogger.debug(this.home.name, 'Stopping station livestream.');
|
|
81
|
-
this.eufyClient.stopStationLivestream(this.serial_number);
|
|
82
|
-
this.initialize();
|
|
83
|
-
}
|
|
84
|
-
// Handle the station livestream stop event.
|
|
85
|
-
onStationLivestreamStop(station, device) {
|
|
86
|
-
if (device.getSerial() === this.serial_number) {
|
|
87
|
-
this.cameraLogger.debug(this.home.name, `${station.getName()} station livestream for ${device.getName()} has stopped.`);
|
|
88
|
-
this.initialize();
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
// Handle the station livestream start event.
|
|
92
|
-
async onStationLivestreamStart(station, device, metadata, videostream, audiostream) {
|
|
93
|
-
if (device.getSerial() === this.serial_number) {
|
|
94
|
-
if (this.stationStream) {
|
|
95
|
-
const diff = (Date.now() - this.stationStream.createdAt) / 1000;
|
|
96
|
-
if (diff < 5) {
|
|
97
|
-
this.cameraLogger.warn(this.home.name, 'Second livestream was started from station. Ignore.');
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
this.initialize(); // important to prevent unwanted behaviour when the eufy station emits the 'livestream start' event multiple times
|
|
102
|
-
this.cameraLogger.debug(this.home.name, station.getName() + ' station livestream (P2P session) for ' + device.getName() + ' has started.');
|
|
103
|
-
this.livestreamStartedAt = Date.now();
|
|
104
|
-
const createdAt = Date.now();
|
|
105
|
-
this.stationStream = { station, device, metadata, videostream, audiostream, createdAt };
|
|
106
|
-
this.cameraLogger.debug(this.home.name, 'Stream metadata: ', this.stationStream.metadata);
|
|
107
|
-
this.emit('livestream start');
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
//# sourceMappingURL=LocalLiveStreamManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LocalLiveStreamManager.js","sourceRoot":"","sources":["../../src/eufy/LocalLiveStreamManager.ts"],"names":[],"mappings":"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"}
|
package/dist/eufy/Talkback.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Duplex } from 'node:stream';
|
|
2
|
-
import type { CameraDevice, LoggerService } from '@camera.ui/types';
|
|
3
|
-
import type { Device, EufySecurity } from 'eufy-security-client';
|
|
4
|
-
import type { EufyHome } from '../types.js';
|
|
5
|
-
export declare class TalkbackStream extends Duplex {
|
|
6
|
-
private cacheData;
|
|
7
|
-
private talkbackStarted;
|
|
8
|
-
private stopTalkbackTimeout?;
|
|
9
|
-
private targetStream?;
|
|
10
|
-
private eufyClient;
|
|
11
|
-
private cameraSN;
|
|
12
|
-
private cameraLogger;
|
|
13
|
-
private home;
|
|
14
|
-
private cameraDevice;
|
|
15
|
-
constructor(home: EufyHome, eufyClient: EufySecurity, eufyDevice: Device, cameraDevice: CameraDevice, cameraLogger: LoggerService);
|
|
16
|
-
private onTalkbackStarted;
|
|
17
|
-
private onTalkbackStopped;
|
|
18
|
-
stopTalkbackStream(): void;
|
|
19
|
-
_read(): void;
|
|
20
|
-
_write(chunk: Buffer, encoding: BufferEncoding, callback: (error?: Error | null | undefined) => void): void;
|
|
21
|
-
private startTalkback;
|
|
22
|
-
private stopTalkback;
|
|
23
|
-
}
|
package/dist/eufy/Talkback.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { Duplex } from 'node:stream';
|
|
2
|
-
export class TalkbackStream extends Duplex {
|
|
3
|
-
cacheData = [];
|
|
4
|
-
talkbackStarted = false;
|
|
5
|
-
stopTalkbackTimeout;
|
|
6
|
-
targetStream;
|
|
7
|
-
eufyClient;
|
|
8
|
-
cameraSN;
|
|
9
|
-
cameraLogger;
|
|
10
|
-
home;
|
|
11
|
-
cameraDevice;
|
|
12
|
-
constructor(home, eufyClient, eufyDevice, cameraDevice, cameraLogger) {
|
|
13
|
-
super();
|
|
14
|
-
this.home = home;
|
|
15
|
-
this.eufyClient = eufyClient;
|
|
16
|
-
this.cameraLogger = cameraLogger;
|
|
17
|
-
this.cameraDevice = cameraDevice;
|
|
18
|
-
this.cameraSN = eufyDevice.getSerial();
|
|
19
|
-
this.eufyClient.on('station talkback start', this.onTalkbackStarted.bind(this));
|
|
20
|
-
this.eufyClient.on('station talkback stop', this.onTalkbackStopped.bind(this));
|
|
21
|
-
}
|
|
22
|
-
onTalkbackStarted(station, device, stream) {
|
|
23
|
-
if (device.getSerial() !== this.cameraSN) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
this.cameraLogger.debug(this.home.name, 'talkback started event from station ' + station.getName());
|
|
27
|
-
if (this.targetStream) {
|
|
28
|
-
this.unpipe(this.targetStream);
|
|
29
|
-
}
|
|
30
|
-
this.targetStream = stream;
|
|
31
|
-
this.pipe(this.targetStream);
|
|
32
|
-
}
|
|
33
|
-
onTalkbackStopped(station, device) {
|
|
34
|
-
if (device.getSerial() !== this.cameraSN) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
this.cameraLogger.debug(this.home.name, 'talkback stopped event from station ' + station.getName());
|
|
38
|
-
if (this.targetStream) {
|
|
39
|
-
this.unpipe(this.targetStream);
|
|
40
|
-
}
|
|
41
|
-
this.targetStream = undefined;
|
|
42
|
-
}
|
|
43
|
-
stopTalkbackStream() {
|
|
44
|
-
// remove event listeners
|
|
45
|
-
this.eufyClient.removeListener('station talkback start', this.onTalkbackStarted);
|
|
46
|
-
this.eufyClient.removeListener('station talkback stop', this.onTalkbackStopped);
|
|
47
|
-
this.stopTalkback();
|
|
48
|
-
this.unpipe();
|
|
49
|
-
this.destroy();
|
|
50
|
-
}
|
|
51
|
-
_read() {
|
|
52
|
-
let pushReturn = true;
|
|
53
|
-
while (this.cacheData.length > 0 && pushReturn) {
|
|
54
|
-
const data = this.cacheData.shift();
|
|
55
|
-
pushReturn = this.push(data);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
_write(chunk, encoding, callback) {
|
|
59
|
-
if (this.stopTalkbackTimeout) {
|
|
60
|
-
clearTimeout(this.stopTalkbackTimeout);
|
|
61
|
-
}
|
|
62
|
-
this.stopTalkbackTimeout = setTimeout(() => {
|
|
63
|
-
this.stopTalkback();
|
|
64
|
-
}, 2000);
|
|
65
|
-
if (this.targetStream) {
|
|
66
|
-
this.push(chunk);
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
this.cacheData.push(chunk);
|
|
70
|
-
this.startTalkback();
|
|
71
|
-
}
|
|
72
|
-
callback();
|
|
73
|
-
}
|
|
74
|
-
startTalkback() {
|
|
75
|
-
if (!this.talkbackStarted) {
|
|
76
|
-
this.talkbackStarted = true;
|
|
77
|
-
this.cameraLogger.debug(this.home.name, 'starting talkback');
|
|
78
|
-
this.eufyClient.startStationTalkback(this.cameraSN).catch((err) => {
|
|
79
|
-
this.cameraLogger.error(this.home.name, 'talkback could not be started: ' + err);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
stopTalkback() {
|
|
84
|
-
if (this.talkbackStarted) {
|
|
85
|
-
this.talkbackStarted = false;
|
|
86
|
-
this.cameraLogger.debug(this.home.name, 'stopping talkback');
|
|
87
|
-
this.eufyClient.stopStationTalkback(this.cameraSN).catch((err) => {
|
|
88
|
-
this.cameraLogger.error(this.home.name, 'talkback could not be stopped: ' + err);
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=Talkback.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Talkback.js","sourceRoot":"","sources":["../../src/eufy/Talkback.ts"],"names":[],"mappings":"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"}
|
package/dist/eufy/utils.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { Camera } from 'eufy-security-client';
|
|
2
|
-
export declare class Deferred<T> {
|
|
3
|
-
finished: boolean;
|
|
4
|
-
resolve: (value: T | PromiseLike<T>) => this;
|
|
5
|
-
reject: (error: Error) => this;
|
|
6
|
-
promise: Promise<T>;
|
|
7
|
-
}
|
|
8
|
-
export declare class UniversalStream {
|
|
9
|
-
url: string;
|
|
10
|
-
private static socks;
|
|
11
|
-
private server;
|
|
12
|
-
private sock_id;
|
|
13
|
-
private isWin32;
|
|
14
|
-
private readonly startTime;
|
|
15
|
-
private constructor();
|
|
16
|
-
private generateSockPath;
|
|
17
|
-
private generateUrl;
|
|
18
|
-
close(): void;
|
|
19
|
-
static StreamInput(namespace: string, stream: NodeJS.ReadableStream): UniversalStream;
|
|
20
|
-
static StreamOutput(namespace: string, stream: NodeJS.WritableStream): UniversalStream;
|
|
21
|
-
}
|
|
22
|
-
export declare const is_rtsp_ready: (device: Camera) => boolean;
|
package/dist/eufy/utils.js
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { PropertyName } from 'eufy-security-client';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import { createServer } from 'node:net';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { tmpdir } from 'os';
|
|
6
|
-
export class Deferred {
|
|
7
|
-
finished = false;
|
|
8
|
-
resolve;
|
|
9
|
-
reject;
|
|
10
|
-
promise = new Promise((resolve, reject) => {
|
|
11
|
-
this.resolve = (v) => {
|
|
12
|
-
this.finished = true;
|
|
13
|
-
resolve(v);
|
|
14
|
-
return this;
|
|
15
|
-
};
|
|
16
|
-
this.reject = (e) => {
|
|
17
|
-
this.finished = true;
|
|
18
|
-
reject(e);
|
|
19
|
-
return this;
|
|
20
|
-
};
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
export class UniversalStream {
|
|
24
|
-
url;
|
|
25
|
-
static socks = new Set();
|
|
26
|
-
server;
|
|
27
|
-
sock_id;
|
|
28
|
-
isWin32 = false;
|
|
29
|
-
startTime = Date.now();
|
|
30
|
-
constructor(namespace, onSocket) {
|
|
31
|
-
this.isWin32 = process.platform === 'win32'; // Cache platform check
|
|
32
|
-
const unique_sock_id = Math.min(...Array.from({ length: 100 }, (_, i) => i + 1).filter((i) => !UniversalStream.socks.has(i)));
|
|
33
|
-
UniversalStream.socks.add(unique_sock_id);
|
|
34
|
-
this.sock_id = unique_sock_id;
|
|
35
|
-
const sockpath = this.generateSockPath(namespace, unique_sock_id);
|
|
36
|
-
this.url = this.generateUrl(sockpath);
|
|
37
|
-
this.server = createServer(onSocket)
|
|
38
|
-
.on('error', () => {
|
|
39
|
-
this.close();
|
|
40
|
-
})
|
|
41
|
-
.listen(sockpath);
|
|
42
|
-
}
|
|
43
|
-
generateSockPath(namespace, unique_sock_id) {
|
|
44
|
-
let sockpath = '';
|
|
45
|
-
const pipeName = `${namespace}.${unique_sock_id}.sock`; // Use template literals
|
|
46
|
-
if (this.isWin32) {
|
|
47
|
-
const pipePrefix = '\\\\.\\pipe\\';
|
|
48
|
-
sockpath = join(pipePrefix, pipeName);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
sockpath = join(tmpdir(), pipeName);
|
|
52
|
-
// Use async file operations
|
|
53
|
-
if (fs.existsSync(sockpath)) {
|
|
54
|
-
fs.unlinkSync(sockpath);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return sockpath;
|
|
58
|
-
}
|
|
59
|
-
generateUrl(sockpath) {
|
|
60
|
-
return this.isWin32 ? sockpath : `unix:${sockpath}`; // Use template literals
|
|
61
|
-
}
|
|
62
|
-
close() {
|
|
63
|
-
try {
|
|
64
|
-
if (this.server) {
|
|
65
|
-
this.server.close();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
//
|
|
70
|
-
}
|
|
71
|
-
finally {
|
|
72
|
-
if (!this.isWin32 && this.url) {
|
|
73
|
-
try {
|
|
74
|
-
fs.unlinkSync(this.url.replace('unix:', ''));
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
//
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
UniversalStream.socks.delete(this.sock_id);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
static StreamInput(namespace, stream) {
|
|
84
|
-
return new UniversalStream(namespace, (socket) => stream.pipe(socket, { end: true }));
|
|
85
|
-
}
|
|
86
|
-
static StreamOutput(namespace, stream) {
|
|
87
|
-
return new UniversalStream(namespace, (socket) => socket.pipe(stream, { end: true }));
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
export const is_rtsp_ready = function (device) {
|
|
91
|
-
if (!device.hasProperty('rtspStream')) {
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
if (!device.getPropertyValue(PropertyName.DeviceRTSPStream)) {
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
if (device.getPropertyValue(PropertyName.DeviceRTSPStreamUrl) === '') {
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
return true;
|
|
101
|
-
};
|
|
102
|
-
//# sourceMappingURL=utils.js.map
|
package/dist/eufy/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/eufy/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { BasePlugin, CameraDevice, FormSubmitResponse, LoggerService, PluginAPI } from '@camera.ui/types';
|
|
2
|
-
import type { Config, EufyHome, FormAction } from './types.js';
|
|
3
|
-
export default class Eufy implements BasePlugin {
|
|
4
|
-
config: Config;
|
|
5
|
-
logger: LoggerService;
|
|
6
|
-
api: PluginAPI;
|
|
7
|
-
cameras: Map<string, CameraDevice>;
|
|
8
|
-
private eufyClients;
|
|
9
|
-
private eufyCameras;
|
|
10
|
-
private cleanOrphanedCamerasTimeout?;
|
|
11
|
-
constructor(logger: LoggerService, api: PluginAPI);
|
|
12
|
-
configureCameras(cameras: CameraDevice[]): void;
|
|
13
|
-
onFormSubmit(actionId: FormAction, home: EufyHome & {
|
|
14
|
-
twoFactorCode?: string;
|
|
15
|
-
} & {
|
|
16
|
-
captchaCode?: string;
|
|
17
|
-
captchaId: string;
|
|
18
|
-
}): Promise<FormSubmitResponse | undefined>;
|
|
19
|
-
private start;
|
|
20
|
-
private stop;
|
|
21
|
-
private closeClient;
|
|
22
|
-
private connectHome;
|
|
23
|
-
private deviceAdded;
|
|
24
|
-
private addOrUpdateDevice;
|
|
25
|
-
private deviceRemoved;
|
|
26
|
-
private checkOrphanedCameras;
|
|
27
|
-
private tryLogin;
|
|
28
|
-
private getClient;
|
|
29
|
-
private createFormResponse;
|
|
30
|
-
private refreshConfig;
|
|
31
|
-
}
|