@camera.ui/camera-ui-homekit 0.0.28 → 0.0.29
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 +17 -34
- package/CHANGELOG.md +0 -8
- package/CONTRIBUTING.md +0 -1
- package/LICENSE.md +0 -22
- package/README.md +0 -1
- package/dist/camera/accessory.d.ts +0 -28
- package/dist/camera/accessory.js +0 -380
- package/dist/camera/accessory.js.map +0 -1
- package/dist/camera/recordingDelegate.d.ts +0 -27
- package/dist/camera/recordingDelegate.js +0 -264
- package/dist/camera/recordingDelegate.js.map +0 -1
- package/dist/camera/services.d.ts +0 -28
- package/dist/camera/services.js +0 -202
- package/dist/camera/services.js.map +0 -1
- package/dist/camera/sessionWrapper.d.ts +0 -40
- package/dist/camera/sessionWrapper.js +0 -517
- package/dist/camera/sessionWrapper.js.map +0 -1
- package/dist/camera/streamingDelegate.d.ts +0 -14
- package/dist/camera/streamingDelegate.js +0 -100
- package/dist/camera/streamingDelegate.js.map +0 -1
- package/dist/camera/streamingServer.d.ts +0 -26
- package/dist/camera/streamingServer.js +0 -145
- package/dist/camera/streamingServer.js.map +0 -1
- package/dist/constants.d.ts +0 -1
- package/dist/constants.js +0 -7
- package/dist/constants.js.map +0 -1
- package/dist/crypto.d.ts +0 -1
- package/dist/crypto.js +0 -34
- package/dist/crypto.js.map +0 -1
- package/dist/index.d.ts +0 -16
- package/dist/index.js +0 -53
- package/dist/index.js.map +0 -1
- package/dist/types.d.ts +0 -16
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/mac.d.ts +0 -4
- package/dist/utils/mac.js +0 -19
- package/dist/utils/mac.js.map +0 -1
- package/dist/utils/opus-repacketizer.d.ts +0 -7
- package/dist/utils/opus-repacketizer.js +0 -163
- package/dist/utils/opus-repacketizer.js.map +0 -1
- package/dist/utils/processor.d.ts +0 -85
- package/dist/utils/processor.js +0 -475
- package/dist/utils/processor.js.map +0 -1
- package/dist/utils/return-audio-transcoder.d.ts +0 -39
- package/dist/utils/return-audio-transcoder.js +0 -82
- package/dist/utils/return-audio-transcoder.js.map +0 -1
- package/dist/utils/srtp.d.ts +0 -8
- package/dist/utils/srtp.js +0 -22
- package/dist/utils/srtp.js.map +0 -1
- package/dist/utils/utils.d.ts +0 -10
- package/dist/utils/utils.js +0 -38
- package/dist/utils/utils.js.map +0 -1
- package/media/cameraOffline.png +0 -0
- package/media/maxStreams.png +0 -0
- package/media/noSnapshot.png +0 -0
- package/media/privacyMode.png +0 -0
- package/scripts/install-optional-deps.js +0 -17
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { FFMpegHardware } from '@camera.ui/common/cameraUtils';
|
|
2
|
-
import { readFile } from 'node:fs';
|
|
3
|
-
import { dirname, resolve } from 'node:path';
|
|
4
|
-
import { fileURLToPath } from 'node:url';
|
|
5
|
-
import { promisify } from 'node:util';
|
|
6
|
-
import { StreamingSessionWrapper } from './sessionWrapper.js';
|
|
7
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
-
const __dirname = dirname(__filename);
|
|
9
|
-
function getDurationSeconds(start) {
|
|
10
|
-
return (Date.now() - start) / 1000;
|
|
11
|
-
}
|
|
12
|
-
const readFileAsync = promisify(readFile);
|
|
13
|
-
const noSnapshotPath = resolve(__dirname, '../../media/noSnapshot.png');
|
|
14
|
-
export class StreamingDelegate {
|
|
15
|
-
cameraAccessory;
|
|
16
|
-
cameraDevice;
|
|
17
|
-
cameraLogger;
|
|
18
|
-
sessions = {};
|
|
19
|
-
ffmpegHardware;
|
|
20
|
-
constructor(cameraAccessory, cameraDevice) {
|
|
21
|
-
this.cameraAccessory = cameraAccessory;
|
|
22
|
-
this.cameraDevice = cameraDevice;
|
|
23
|
-
this.cameraLogger = cameraDevice.logger;
|
|
24
|
-
this.ffmpegHardware = new FFMpegHardware();
|
|
25
|
-
}
|
|
26
|
-
async handleSnapshotRequest(request, callback) {
|
|
27
|
-
try {
|
|
28
|
-
this.cameraLogger.log('Fetching snapshot', request);
|
|
29
|
-
const snapshot = await this.cameraDevice.snapshot();
|
|
30
|
-
let snapshotBuffer = snapshot ? Buffer.from(snapshot) : undefined;
|
|
31
|
-
if (!snapshotBuffer || snapshotBuffer.length === 0) {
|
|
32
|
-
this.cameraLogger.log('No snapshot available, sending offline image');
|
|
33
|
-
snapshotBuffer = await readFileAsync(noSnapshotPath);
|
|
34
|
-
}
|
|
35
|
-
callback(undefined, snapshotBuffer);
|
|
36
|
-
}
|
|
37
|
-
catch (error) {
|
|
38
|
-
this.cameraLogger.error('Error fetching snapshot', error);
|
|
39
|
-
callback(error);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
async prepareStream(request, callback) {
|
|
43
|
-
const start = Date.now();
|
|
44
|
-
this.cameraLogger.debug('Preparing Stream');
|
|
45
|
-
const ffmpegPath = await this.cameraAccessory.api.coreManager.getFFmpegPath();
|
|
46
|
-
this.ffmpegHardware.setFfmpegPath(ffmpegPath);
|
|
47
|
-
try {
|
|
48
|
-
const session = new StreamingSessionWrapper(this.cameraAccessory, this.cameraDevice, request, start, this.ffmpegHardware);
|
|
49
|
-
await session.prepare();
|
|
50
|
-
this.sessions[request.sessionID] = session;
|
|
51
|
-
this.cameraLogger.debug(`Stream Prepared (${getDurationSeconds(start)}s)`);
|
|
52
|
-
callback(undefined, {
|
|
53
|
-
audio: {
|
|
54
|
-
port: session.audioSplitter.port,
|
|
55
|
-
ssrc: session.audioSsrc,
|
|
56
|
-
srtp_key: session.audioSrtp.srtpKey,
|
|
57
|
-
srtp_salt: session.audioSrtp.srtpSalt,
|
|
58
|
-
},
|
|
59
|
-
video: {
|
|
60
|
-
port: session.videoSplitter.port,
|
|
61
|
-
ssrc: session.videoSsrc,
|
|
62
|
-
srtp_key: session.videoSrtp.srtpKey,
|
|
63
|
-
srtp_salt: session.videoSrtp.srtpSalt,
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
this.cameraLogger.error(`Failed to prepare stream (${getDurationSeconds(start)}s)`, error);
|
|
69
|
-
callback(error);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
async handleStreamRequest(request, callback) {
|
|
73
|
-
const sessionID = request.sessionID;
|
|
74
|
-
const session = this.sessions[sessionID];
|
|
75
|
-
const requestType = request.type;
|
|
76
|
-
if (!session) {
|
|
77
|
-
callback(new Error('Cannot find session for stream ' + sessionID));
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
if (requestType === "start" /* StreamRequestTypes.START */) {
|
|
81
|
-
this.cameraLogger.debug(`Starting stream (${getDurationSeconds(session.start)}s)`);
|
|
82
|
-
try {
|
|
83
|
-
await session.activate(request);
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
this.cameraLogger.error('Failed to starting stream', error);
|
|
87
|
-
callback(new Error('Failed to activate stream'));
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
this.cameraLogger.log(`Streaming started (${getDurationSeconds(session.start)}s)`);
|
|
91
|
-
}
|
|
92
|
-
else if (requestType === "stop" /* StreamRequestTypes.STOP */) {
|
|
93
|
-
this.cameraLogger.log('Stopped Live Stream');
|
|
94
|
-
session.stop();
|
|
95
|
-
delete this.sessions[sessionID];
|
|
96
|
-
}
|
|
97
|
-
callback();
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=streamingDelegate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streamingDelegate.js","sourceRoot":"","sources":["../../src/camera/streamingDelegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { CameraDevice } from '@camera.ui/types';
|
|
2
|
-
import type { Accessory } from 'hap-nodejs';
|
|
3
|
-
import type { MP4Atom } from '../types.js';
|
|
4
|
-
import type { CameraAccessory } from './accessory.js';
|
|
5
|
-
export declare class MP4StreamingServer {
|
|
6
|
-
debugMode: boolean;
|
|
7
|
-
destroyed: boolean;
|
|
8
|
-
private cameraLogger;
|
|
9
|
-
private accessory;
|
|
10
|
-
private cameraAccessory;
|
|
11
|
-
private cameraDevice;
|
|
12
|
-
private server?;
|
|
13
|
-
private socket?;
|
|
14
|
-
private childProcess?;
|
|
15
|
-
private connectPromise?;
|
|
16
|
-
private connectResolve?;
|
|
17
|
-
private connectReject?;
|
|
18
|
-
private isRemoteServer;
|
|
19
|
-
constructor(accessory: Accessory, cameraAccessory: CameraAccessory, cameraDevice: CameraDevice);
|
|
20
|
-
createServer(ffmpegPath: string, ffmpegInput: Array<string>, videoOutputArgs: Array<string>, audioOutputArgs: Array<string>): Promise<void>;
|
|
21
|
-
connectToServer(prebufferUrl: string): Promise<void>;
|
|
22
|
-
destroy(): Promise<void>;
|
|
23
|
-
generator(): AsyncGenerator<MP4Atom>;
|
|
24
|
-
private handleConnection;
|
|
25
|
-
private read;
|
|
26
|
-
}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { once } from 'node:events';
|
|
3
|
-
import { createServer, Socket } from 'node:net';
|
|
4
|
-
export class MP4StreamingServer {
|
|
5
|
-
debugMode = false;
|
|
6
|
-
destroyed = false;
|
|
7
|
-
cameraLogger;
|
|
8
|
-
accessory;
|
|
9
|
-
cameraAccessory;
|
|
10
|
-
cameraDevice;
|
|
11
|
-
server;
|
|
12
|
-
socket;
|
|
13
|
-
childProcess;
|
|
14
|
-
connectPromise;
|
|
15
|
-
connectResolve;
|
|
16
|
-
connectReject;
|
|
17
|
-
isRemoteServer = false;
|
|
18
|
-
constructor(accessory, cameraAccessory, cameraDevice) {
|
|
19
|
-
this.cameraLogger = cameraDevice.logger;
|
|
20
|
-
this.accessory = accessory;
|
|
21
|
-
this.cameraAccessory = cameraAccessory;
|
|
22
|
-
this.cameraDevice = cameraDevice;
|
|
23
|
-
}
|
|
24
|
-
async createServer(ffmpegPath, ffmpegInput, videoOutputArgs, audioOutputArgs) {
|
|
25
|
-
this.isRemoteServer = false;
|
|
26
|
-
this.connectPromise = new Promise((resolve, reject) => {
|
|
27
|
-
this.connectResolve = resolve;
|
|
28
|
-
this.connectReject = reject;
|
|
29
|
-
});
|
|
30
|
-
this.server = createServer(this.handleConnection.bind(this));
|
|
31
|
-
const ffmpeg = ffmpegPath;
|
|
32
|
-
const args = [
|
|
33
|
-
...ffmpegInput,
|
|
34
|
-
...videoOutputArgs,
|
|
35
|
-
...audioOutputArgs,
|
|
36
|
-
'-fflags',
|
|
37
|
-
'+genpts',
|
|
38
|
-
'-reset_timestamps',
|
|
39
|
-
'1',
|
|
40
|
-
'-movflags',
|
|
41
|
-
'frag_keyframe+empty_moov+default_base_moof+skip_sidx+skip_trailer',
|
|
42
|
-
'-f',
|
|
43
|
-
'mp4',
|
|
44
|
-
];
|
|
45
|
-
const promise = once(this.server, 'listening');
|
|
46
|
-
this.server.listen(); // listen on random port
|
|
47
|
-
await promise;
|
|
48
|
-
if (this.destroyed) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
const port = this.server.address().port;
|
|
52
|
-
args.push('tcp://127.0.0.1:' + port);
|
|
53
|
-
this.cameraLogger.debug('Recording command:', args.join(' '));
|
|
54
|
-
this.childProcess = spawn(ffmpeg, args, { env: process.env, stdio: this.debugMode ? 'pipe' : 'ignore' });
|
|
55
|
-
if (this.debugMode) {
|
|
56
|
-
this.childProcess.stdout?.on('data', (data) => this.cameraLogger.debug(data.toString()));
|
|
57
|
-
this.childProcess.stderr?.on('data', (data) => this.cameraLogger.debug(data.toString()));
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
async connectToServer(prebufferUrl) {
|
|
61
|
-
this.isRemoteServer = true;
|
|
62
|
-
this.connectPromise = new Promise((resolve, reject) => {
|
|
63
|
-
this.connectResolve = resolve;
|
|
64
|
-
this.connectReject = reject;
|
|
65
|
-
});
|
|
66
|
-
const socketUrl = new URL(prebufferUrl);
|
|
67
|
-
const socket = new Socket();
|
|
68
|
-
this.handleConnection(socket);
|
|
69
|
-
const promise = once(socket, 'connect');
|
|
70
|
-
socket.connect(parseInt(socketUrl.port), socketUrl.hostname);
|
|
71
|
-
await promise;
|
|
72
|
-
this.cameraLogger.debug('Recording command: Remote server');
|
|
73
|
-
}
|
|
74
|
-
async destroy() {
|
|
75
|
-
this.socket?.destroy();
|
|
76
|
-
this.childProcess?.kill('SIGKILL');
|
|
77
|
-
this.server = undefined;
|
|
78
|
-
this.socket = undefined;
|
|
79
|
-
this.childProcess = undefined;
|
|
80
|
-
if (this.connectPromise) {
|
|
81
|
-
this.connectReject?.(new Error('Destroyed'));
|
|
82
|
-
this.connectPromise = undefined;
|
|
83
|
-
}
|
|
84
|
-
this.destroyed = true;
|
|
85
|
-
}
|
|
86
|
-
async *generator() {
|
|
87
|
-
await this.connectPromise;
|
|
88
|
-
this.connectPromise = undefined;
|
|
89
|
-
if (!this.socket || (!this.isRemoteServer && !this.childProcess)) {
|
|
90
|
-
throw new Error('Unexpected state!');
|
|
91
|
-
}
|
|
92
|
-
while (true) {
|
|
93
|
-
const header = await this.read(8);
|
|
94
|
-
const length = header.readInt32BE(0) - 8;
|
|
95
|
-
const type = header.subarray(4).toString();
|
|
96
|
-
const data = await this.read(length);
|
|
97
|
-
yield {
|
|
98
|
-
header: header,
|
|
99
|
-
length: length,
|
|
100
|
-
type: type,
|
|
101
|
-
data: data,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
handleConnection(socket) {
|
|
106
|
-
this.server?.close(); // don't accept any further clients
|
|
107
|
-
this.socket = socket;
|
|
108
|
-
this.connectResolve?.();
|
|
109
|
-
}
|
|
110
|
-
async read(length) {
|
|
111
|
-
if (!this.socket) {
|
|
112
|
-
throw Error('FFMPEG tried reading from closed socket!');
|
|
113
|
-
}
|
|
114
|
-
if (!length) {
|
|
115
|
-
return Buffer.alloc(0);
|
|
116
|
-
}
|
|
117
|
-
const value = this.socket.read(length);
|
|
118
|
-
if (value) {
|
|
119
|
-
return value;
|
|
120
|
-
}
|
|
121
|
-
return new Promise((resolve, reject) => {
|
|
122
|
-
const readHandler = () => {
|
|
123
|
-
const value = this.socket.read(length);
|
|
124
|
-
if (value) {
|
|
125
|
-
cleanup();
|
|
126
|
-
resolve(value);
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
const endHandler = () => {
|
|
130
|
-
cleanup();
|
|
131
|
-
reject(new Error(`FFMPEG socket closed during read for ${length} bytes!`));
|
|
132
|
-
};
|
|
133
|
-
const cleanup = () => {
|
|
134
|
-
this.socket?.removeListener('readable', readHandler);
|
|
135
|
-
this.socket?.removeListener('close', endHandler);
|
|
136
|
-
};
|
|
137
|
-
if (!this.socket) {
|
|
138
|
-
throw new Error('FFMPEG socket is closed now!');
|
|
139
|
-
}
|
|
140
|
-
this.socket.on('readable', readHandler);
|
|
141
|
-
this.socket.on('close', endHandler);
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
//# sourceMappingURL=streamingServer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streamingServer.js","sourceRoot":"","sources":["../../src/camera/streamingServer.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const baseAdvertiser: string[];
|
package/dist/constants.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export const baseAdvertiser = [
|
|
2
|
-
`${"ciao" /* MDNSAdvertiser.CIAO */} (recommended)`,
|
|
3
|
-
`${"avahi" /* MDNSAdvertiser.AVAHI */} (recommended, Linux only)`,
|
|
4
|
-
`${"bonjour-hap" /* MDNSAdvertiser.BONJOUR */} (deprecated)`,
|
|
5
|
-
`${"resolved" /* MDNSAdvertiser.RESOLVED */} (experimental)`,
|
|
6
|
-
];
|
|
7
|
-
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAa;IACtC,GAAG,gCAAmB,gBAAgB;IACtC,GAAG,kCAAoB,4BAA4B;IACnD,GAAG,0CAAsB,eAAe;IACxC,GAAG,wCAAuB,iBAAiB;CAC5C,CAAC"}
|
package/dist/crypto.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/crypto.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import crypto from 'node:crypto';
|
|
2
|
-
if (!crypto.getCiphers().includes('chacha20-poly1305')) {
|
|
3
|
-
try {
|
|
4
|
-
const { default: chacha } = await import('chacha');
|
|
5
|
-
const originalGetCiphers = crypto.getCiphers;
|
|
6
|
-
const originalCreateCipheriv = crypto.createCipheriv;
|
|
7
|
-
const originalCreateDecipheriv = crypto.createDecipheriv;
|
|
8
|
-
crypto.getCiphers = () => {
|
|
9
|
-
const ciphers = originalGetCiphers();
|
|
10
|
-
ciphers.push('chacha20-poly1305');
|
|
11
|
-
return ciphers;
|
|
12
|
-
};
|
|
13
|
-
crypto.createCipheriv = (algorithm, key, iv, options) => {
|
|
14
|
-
if (algorithm !== 'chacha20-poly1305') {
|
|
15
|
-
return originalCreateCipheriv(algorithm, key, iv, options);
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
return chacha.createCipher(key, iv);
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
crypto.createDecipheriv = (algorithm, key, iv, options) => {
|
|
22
|
-
if (algorithm !== 'chacha20-poly1305') {
|
|
23
|
-
return originalCreateDecipheriv(algorithm, key, iv, options);
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
return chacha.createDecipher(key, iv);
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
//
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=crypto.js.map
|
package/dist/crypto.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEnD,MAAM,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC;QAC7C,MAAM,sBAAsB,GAAG,MAAM,CAAC,cAAc,CAAC;QACrD,MAAM,wBAAwB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAEzD,MAAM,CAAC,UAAU,GAAG,GAAa,EAAE;YACjC,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAClC,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QAEF,MAAM,CAAC,cAAc,GAAG,CAAC,SAAc,EAAE,GAAQ,EAAE,EAAO,EAAE,OAAY,EAAE,EAAE;YAC1E,IAAI,SAAS,KAAK,mBAAmB,EAAE,CAAC;gBACtC,OAAO,sBAAsB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,OAAO,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,GAAG,CAAC,SAAc,EAAE,GAAQ,EAAE,EAAO,EAAE,OAAa,EAAE,EAAE;YAC7E,IAAI,SAAS,KAAK,mBAAmB,EAAE,CAAC;gBACtC,OAAO,wBAAwB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,OAAO,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,EAAE;IACJ,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { BasePlugin, CameraDevice, FormSubmitResponse, LoggerService, PluginAPI } from '@camera.ui/types';
|
|
2
|
-
import type { Accessory, MacAddress } from 'hap-nodejs';
|
|
3
|
-
export default class HomeKit implements BasePlugin {
|
|
4
|
-
publishedExternalAccessories: Map<MacAddress, Accessory>;
|
|
5
|
-
logger: LoggerService;
|
|
6
|
-
api: PluginAPI;
|
|
7
|
-
private readonly cameras;
|
|
8
|
-
private accessories;
|
|
9
|
-
constructor(logger: LoggerService, api: PluginAPI);
|
|
10
|
-
configureCameras(cameras: CameraDevice[]): void;
|
|
11
|
-
onFormSubmit(actionId: string, payload: any): Promise<FormSubmitResponse | void>;
|
|
12
|
-
private start;
|
|
13
|
-
private stop;
|
|
14
|
-
private configureCamera;
|
|
15
|
-
private removeCamera;
|
|
16
|
-
}
|
package/dist/index.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
await import('./crypto.js');
|
|
2
|
-
import { HAPStorage } from 'hap-nodejs';
|
|
3
|
-
import { resolve } from 'node:path';
|
|
4
|
-
import { CameraAccessory } from './camera/accessory.js';
|
|
5
|
-
export default class HomeKit {
|
|
6
|
-
publishedExternalAccessories = new Map();
|
|
7
|
-
logger;
|
|
8
|
-
api;
|
|
9
|
-
cameras = new Map();
|
|
10
|
-
accessories = new Map();
|
|
11
|
-
constructor(logger, api) {
|
|
12
|
-
this.logger = logger;
|
|
13
|
-
this.api = api;
|
|
14
|
-
HAPStorage.setCustomStoragePath(resolve(this.api.storagePath, 'accessories'));
|
|
15
|
-
this.api.on('finishLaunching', this.start.bind(this));
|
|
16
|
-
this.api.on('shutdown', this.stop.bind(this));
|
|
17
|
-
}
|
|
18
|
-
configureCameras(cameras) {
|
|
19
|
-
for (const camera of cameras) {
|
|
20
|
-
this.configureCamera(camera);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
24
|
-
async onFormSubmit(actionId, payload) { }
|
|
25
|
-
async start() {
|
|
26
|
-
this.api.deviceManager.on('cameraSelected', async (cameraDevice) => {
|
|
27
|
-
await this.configureCamera(cameraDevice);
|
|
28
|
-
});
|
|
29
|
-
this.api.deviceManager.on('cameraDeselected', async (cameraId) => {
|
|
30
|
-
await this.removeCamera(cameraId);
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
async stop() {
|
|
34
|
-
await Promise.all(Array.from(this.accessories.values()).map((accessory) => accessory.teardown()));
|
|
35
|
-
}
|
|
36
|
-
async configureCamera(cameraDevice) {
|
|
37
|
-
this.logger.log('Configuring camera:', cameraDevice.name);
|
|
38
|
-
const cameraAccessory = new CameraAccessory(this, cameraDevice);
|
|
39
|
-
this.cameras.set(cameraDevice.id, cameraDevice);
|
|
40
|
-
this.accessories.set(cameraDevice.id, cameraAccessory);
|
|
41
|
-
}
|
|
42
|
-
async removeCamera(cameraId) {
|
|
43
|
-
const cameraDevice = this.cameras.get(cameraId);
|
|
44
|
-
if (cameraDevice) {
|
|
45
|
-
this.logger.log('Removing camera:', cameraDevice.name);
|
|
46
|
-
await this.accessories.get(cameraId)?.teardown(true);
|
|
47
|
-
this.cameras.delete(cameraId);
|
|
48
|
-
this.accessories.delete(cameraId);
|
|
49
|
-
this.api.storageController.removeCameraStorage(cameraId);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export type MP4Atom = {
|
|
2
|
-
header: Buffer;
|
|
3
|
-
length: number;
|
|
4
|
-
type: string;
|
|
5
|
-
data: Buffer;
|
|
6
|
-
};
|
|
7
|
-
export interface CameraStorageValues {
|
|
8
|
-
accessoryPin: string;
|
|
9
|
-
accessoryPortOverride: number;
|
|
10
|
-
advertiseAddress?: string;
|
|
11
|
-
republishId: string;
|
|
12
|
-
useHardwareAcceleration: boolean;
|
|
13
|
-
transcodeStreaming: boolean;
|
|
14
|
-
transcodeRecording: boolean;
|
|
15
|
-
advertiser: string;
|
|
16
|
-
}
|
package/dist/types.js
DELETED
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils/mac.d.ts
DELETED
package/dist/utils/mac.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import crypto from 'node:crypto';
|
|
2
|
-
const validMac = /^([0-9A-F]{2}:){5}([0-9A-F]{2})$/;
|
|
3
|
-
function rd() {
|
|
4
|
-
return Math.round(Math.random() * 100000) % 10;
|
|
5
|
-
}
|
|
6
|
-
export function validMacAddress(address) {
|
|
7
|
-
return validMac.test(address);
|
|
8
|
-
}
|
|
9
|
-
export function generate(data) {
|
|
10
|
-
const sha1sum = crypto.createHash('sha1');
|
|
11
|
-
sha1sum.update(data);
|
|
12
|
-
const s = sha1sum.digest('hex');
|
|
13
|
-
let i = 0;
|
|
14
|
-
return 'xx:xx:xx:xx:xx:xx'.replace(/[x]/g, () => s[i++]).toUpperCase();
|
|
15
|
-
}
|
|
16
|
-
export function randomPinCode() {
|
|
17
|
-
return `${rd()}${rd()}${rd()}-${rd()}${rd()}-${rd()}${rd()}${rd()}`;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=mac.js.map
|
package/dist/utils/mac.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mac.js","sourceRoot":"","sources":["../../src/utils/mac.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AAEpD,SAAS,EAAE;IACT,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AACjD,CAAC;AAID,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAoD;IAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;AACtE,CAAC"}
|