From 31815a703c13e3b19d4743a396ee1ba2f3ef934f Mon Sep 17 00:00:00 2001 From: Pierre-Gilles Leymarie Date: Mon, 14 Oct 2024 15:00:43 +0900 Subject: [PATCH 1/8] Scene: Fix responsive on tablets for scheduled trigger (#2136) --- .../src/routes/scene/edit-scene/triggers/ScheduledTrigger.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/front/src/routes/scene/edit-scene/triggers/ScheduledTrigger.jsx b/front/src/routes/scene/edit-scene/triggers/ScheduledTrigger.jsx index e18fdb4378..59c0ac57ea 100644 --- a/front/src/routes/scene/edit-scene/triggers/ScheduledTrigger.jsx +++ b/front/src/routes/scene/edit-scene/triggers/ScheduledTrigger.jsx @@ -91,7 +91,7 @@ class TurnOnLight extends Component { return (
-
+
@@ -267,7 +267,7 @@ class TurnOnLight extends Component {
)} {this.props.trigger.scheduler_type === 'every-week' && ( -
+
From 8d2fc30d5a26019fcddf2a6b42656acc7e960fbf Mon Sep 17 00:00:00 2001 From: Pierre-Gilles Leymarie Date: Mon, 14 Oct 2024 15:00:57 +0900 Subject: [PATCH 2/8] Scene: Change log level for checkCalendarTrigger (#2137) --- server/lib/scene/scene.checkCalendarTriggers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/scene/scene.checkCalendarTriggers.js b/server/lib/scene/scene.checkCalendarTriggers.js index 540a508a61..1a2b6008e8 100644 --- a/server/lib/scene/scene.checkCalendarTriggers.js +++ b/server/lib/scene/scene.checkCalendarTriggers.js @@ -22,7 +22,7 @@ dayjs.extend(LocalizedFormat); async function checkCalendarTriggers() { // getting a fixed value for now, as soon as possible in the function const now = dayjs.tz(dayjs(), this.timezone); - logger.info(`Checking calendar triggers at ${now}`); + logger.debug(`Checking calendar triggers at ${now}`); // First, we try to constitute a list of triggers // related to calendars events const calendarEventTriggers = []; From a000b562b8ce46ab295f9c3956f8078c014579ae Mon Sep 17 00:00:00 2001 From: Pierre-Gilles Leymarie Date: Mon, 14 Oct 2024 15:01:29 +0900 Subject: [PATCH 3/8] Camera: Replace ffmpeg-fluent by native commands (#2132) --- server/services/rtsp-camera/index.js | 3 +- server/services/rtsp-camera/lib/getImage.js | 61 ++++++++++--------- server/services/rtsp-camera/lib/index.js | 6 +- server/services/rtsp-camera/package-lock.json | 61 ------------------- server/services/rtsp-camera/package.json | 1 - .../services/rtsp-camera/FfmpegMock.test.js | 33 ---------- .../rstp.convertLocalStreamToGateway.test.js | 8 +-- .../rstpCamera.onNewCameraFile.test.js | 15 +---- ...rtspCamera.sendCameraFileToGateway.test.js | 8 +-- .../rtsp-camera/rtspCamera.streaming.test.js | 57 +++-------------- .../services/rtsp-camera/rtspCamera.test.js | 31 +++++----- 11 files changed, 64 insertions(+), 220 deletions(-) delete mode 100644 server/test/services/rtsp-camera/FfmpegMock.test.js diff --git a/server/services/rtsp-camera/index.js b/server/services/rtsp-camera/index.js index 3277a1a127..2e87d75aaa 100644 --- a/server/services/rtsp-camera/index.js +++ b/server/services/rtsp-camera/index.js @@ -6,8 +6,7 @@ const RtspCameraHandler = require('./lib'); const RtspCameraController = require('./api/rtspCamera.controller'); module.exports = function RtspCameraService(gladys, serviceId) { - const ffmpeg = require('fluent-ffmpeg'); - const device = new RtspCameraHandler(gladys, ffmpeg, childProcess, serviceId); + const device = new RtspCameraHandler(gladys, childProcess, serviceId); /** * @public * @description This function starts service. diff --git a/server/services/rtsp-camera/lib/getImage.js b/server/services/rtsp-camera/lib/getImage.js index 45419c1665..63932ab8e5 100644 --- a/server/services/rtsp-camera/lib/getImage.js +++ b/server/services/rtsp-camera/lib/getImage.js @@ -38,55 +38,60 @@ async function getImage(device) { this.gladys.config.tempFolder, `camera-${device.id}-${now.getMilliseconds()}-${now.getSeconds()}-${now.getMinutes()}-${now.getHours()}.jpg`, ); - // we create a writestream - const writeStream = fse.createWriteStream(filePath); - const outputOptions = [ - '-vframes 1', - '-qscale:v 15', // Effective range for JPEG is 2-31 with 31 being the worst quality. - ]; + + const args = ['-i', cameraUrlParam.value, '-f', 'image2', '-vframes', '1', '-qscale:v', '15']; + + args.push('-vf'); switch (cameraRotationParam.value) { case DEVICE_ROTATION.DEGREES_90: - outputOptions.push('-vf scale=640:-1,transpose=1'); // Rotate 90 + args.push('scale=640:-1,transpose=1'); // Rotate 90 break; case DEVICE_ROTATION.DEGREES_180: - outputOptions.push('-vf scale=640:-1,transpose=1,transpose=1'); // Rotate 180 + args.push('scale=640:-1,transpose=1,transpose=1'); // Rotate 180 break; case DEVICE_ROTATION.DEGREES_270: - outputOptions.push('-vf scale=640:-1,transpose=2'); // Rotate 270 + args.push('scale=640:-1,transpose=2'); // Rotate 270 break; default: - outputOptions.push('-vf scale=640:-1'); // Rotate 0 + args.push('scale=640:-1'); // Rotate 0 break; } - // Send a camera thumbnail to this stream - // Add a timeout to prevent ffmpeg from running forever - this.ffmpeg(cameraUrlParam.value, { timeout: 10 }) - .format('image2') - .outputOptions(outputOptions) - .output(writeStream) - .on('end', async () => { + // add destination file path + args.push(filePath); + + logger.debug(`Getting camera image on URL ${cameraUrlParam.value}`); + this.childProcess.execFile( + 'ffmpeg', + args, + { + timeout: 10 * 1000, // 10 second max + }, + async (error, stdout, stderr) => { + if (error) { + logger.warn(error); + await fse.remove(filePath); + return reject(error); + } + logger.debug('Camera image saved to disk. Reading disk.'); let image; try { image = await fse.readFile(filePath); } catch (e) { - reject(e); - return; + await fse.remove(filePath); + return reject(e); } + logger.debug('Camera image read from disk, converting to base64'); // convert binary data to base64 encoded string const cameraImageBase = Buffer.from(image).toString('base64'); - const cameraImage = `image/png;base64,${cameraImageBase}`; + const cameraImage = `image/jpg;base64,${cameraImageBase}`; + logger.debug('Camera converted to base64, resolving.'); resolve(cameraImage); await fse.remove(filePath); - }) - .on('error', async (err, stdout, stderr) => { - logger.debug(`Cannot process video: ${err.message}`); - logger.debug(stderr); - reject(err.message); - await fse.remove(filePath); - }) - .run(); + return null; + }, + ); }); } diff --git a/server/services/rtsp-camera/lib/index.js b/server/services/rtsp-camera/lib/index.js index 8c1cedd950..d592a36745 100644 --- a/server/services/rtsp-camera/lib/index.js +++ b/server/services/rtsp-camera/lib/index.js @@ -12,15 +12,13 @@ const { stopStreaming } = require('./stopStreaming'); /** * @description Add ability to connect to RTSP camera. * @param {object} gladys - Gladys instance. - * @param {object} ffmpeg - Ffmpeg library. * @param {object} childProcess - ChildProcess library. * @param {string} serviceId - UUID of the service in DB. * @example - * const rtspCameraHandler = new RtspCameraHandler(gladys, ffmpeg, serviceId); + * const rtspCameraHandler = new RtspCameraHandler(gladys, childProcess, serviceId); */ -const RtspCameraHandler = function RtspCameraHandler(gladys, ffmpeg, childProcess, serviceId) { +const RtspCameraHandler = function RtspCameraHandler(gladys, childProcess, serviceId) { this.gladys = gladys; - this.ffmpeg = ffmpeg; this.childProcess = childProcess; this.serviceId = serviceId; this.checkIfLiveActiveFrequencyInSeconds = 10; diff --git a/server/services/rtsp-camera/package-lock.json b/server/services/rtsp-camera/package-lock.json index 4b1b925ea5..095bf65c32 100644 --- a/server/services/rtsp-camera/package-lock.json +++ b/server/services/rtsp-camera/package-lock.json @@ -20,15 +20,9 @@ "dependencies": { "bluebird": "^3.7.2", "bottleneck": "^2.19.5", - "fluent-ffmpeg": "^2.1.2", "fs-extra": "^8.0.1" } }, - "node_modules/async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.0.0.tgz", - "integrity": "sha512-LNZ6JSpKraIia6VZKKbKxmX6nWIdfsG7WqrOvKpCuDjH7BnGyQRFMTSXEe8to2WF/rqoAKgZvj+L5nnxe0suAg==" - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -39,18 +33,6 @@ "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" }, - "node_modules/fluent-ffmpeg": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", - "integrity": "sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ=", - "dependencies": { - "async": ">=0.2.9", - "which": "^1.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/fs-extra": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.0.1.tgz", @@ -69,11 +51,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -89,25 +66,9 @@ "engines": { "node": ">= 4.0.0" } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } } }, "dependencies": { - "async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.0.0.tgz", - "integrity": "sha512-LNZ6JSpKraIia6VZKKbKxmX6nWIdfsG7WqrOvKpCuDjH7BnGyQRFMTSXEe8to2WF/rqoAKgZvj+L5nnxe0suAg==" - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -118,15 +79,6 @@ "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" }, - "fluent-ffmpeg": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", - "integrity": "sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ=", - "requires": { - "async": ">=0.2.9", - "which": "^1.1.1" - } - }, "fs-extra": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.0.1.tgz", @@ -142,11 +94,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -159,14 +106,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } } } } diff --git a/server/services/rtsp-camera/package.json b/server/services/rtsp-camera/package.json index d0f7518997..7d25e38d9f 100644 --- a/server/services/rtsp-camera/package.json +++ b/server/services/rtsp-camera/package.json @@ -15,7 +15,6 @@ "dependencies": { "bluebird": "^3.7.2", "bottleneck": "^2.19.5", - "fluent-ffmpeg": "^2.1.2", "fs-extra": "^8.0.1" } } diff --git a/server/test/services/rtsp-camera/FfmpegMock.test.js b/server/test/services/rtsp-camera/FfmpegMock.test.js deleted file mode 100644 index 30def577e7..0000000000 --- a/server/test/services/rtsp-camera/FfmpegMock.test.js +++ /dev/null @@ -1,33 +0,0 @@ -const { fake } = require('sinon'); -const fse = require('fs-extra'); -const EventEmitter = require('events'); - -const FfmpegMock = (path) => { - let lastStream = null; - let func = new EventEmitter(); - func = Object.assign(func, { - format: fake.returns(func), - outputOptions: fake.returns(func), - output: (stream) => { - stream.write('image'); - stream.close(); - lastStream = stream; - return func; - }, - run: () => { - lastStream.on('finish', () => { - if (path === 'broken') { - func.emit('error', { message: 'broken' }); - } else if (path === 'no-image-written') { - fse.removeSync(lastStream.path); - func.emit('end'); - } else { - func.emit('end'); - } - }); - return func; - }, - }); - return func; -}; -module.exports = FfmpegMock; diff --git a/server/test/services/rtsp-camera/rstp.convertLocalStreamToGateway.test.js b/server/test/services/rtsp-camera/rstp.convertLocalStreamToGateway.test.js index 6ac28e5d9b..d5e518e1af 100644 --- a/server/test/services/rtsp-camera/rstp.convertLocalStreamToGateway.test.js +++ b/server/test/services/rtsp-camera/rstp.convertLocalStreamToGateway.test.js @@ -2,7 +2,6 @@ const { expect, assert } = require('chai'); const fse = require('fs-extra'); const path = require('path'); const { fake, assert: fakeAssert } = require('sinon'); -const FfmpegMock = require('./FfmpegMock.test'); const RtspCameraManager = require('../../../services/rtsp-camera/lib'); const { NotFoundError } = require('../../../utils/coreErrors'); @@ -41,12 +40,7 @@ describe('Camera.convertLocalStreamToGateway', () => { const indexFilePath = path.join(folderPath, 'index.m3u8'); const keyfilePath = path.join(folderPath, 'index.m3u8.key'); const videoFilePath = path.join(folderPath, 'index0.ts'); - const rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + const rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); before(async () => { await fse.ensureDir(folderPath); await fse.writeFile(indexFilePath, 'this is index'); diff --git a/server/test/services/rtsp-camera/rstpCamera.onNewCameraFile.test.js b/server/test/services/rtsp-camera/rstpCamera.onNewCameraFile.test.js index 3ebe5a9147..c419667a69 100644 --- a/server/test/services/rtsp-camera/rstpCamera.onNewCameraFile.test.js +++ b/server/test/services/rtsp-camera/rstpCamera.onNewCameraFile.test.js @@ -2,7 +2,6 @@ const { expect } = require('chai'); const fse = require('fs-extra'); const path = require('path'); const { fake, assert: fakeAssert } = require('sinon'); -const FfmpegMock = require('./FfmpegMock.test'); const RtspCameraManager = require('../../../services/rtsp-camera/lib'); const device = { @@ -51,12 +50,7 @@ describe('Camera.onNewCameraFile', () => { await fse.remove(folderPath); }); beforeEach(() => { - rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); rtspCameraManager.sendCameraFileToGatewayLimited = fake.resolves(null); }); it('should return directly, no live stream', async () => { @@ -111,12 +105,7 @@ describe('Camera.onNewCameraFile', () => { fakeAssert.calledWith(eventEmitter.emit, 'gateway-ready'); }); it('should upload a file that fail, and return null', async () => { - rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); rtspCameraManager.sendCameraFileToGatewayLimited = fake.rejects(null); rtspCameraManager.liveStreams.set('my-camera', { isGladysGateway: true, diff --git a/server/test/services/rtsp-camera/rtspCamera.sendCameraFileToGateway.test.js b/server/test/services/rtsp-camera/rtspCamera.sendCameraFileToGateway.test.js index 2883ea2cc3..c6fa799253 100644 --- a/server/test/services/rtsp-camera/rtspCamera.sendCameraFileToGateway.test.js +++ b/server/test/services/rtsp-camera/rtspCamera.sendCameraFileToGateway.test.js @@ -1,7 +1,6 @@ const fse = require('fs-extra'); const path = require('path'); const { fake, assert: fakeAssert } = require('sinon'); -const FfmpegMock = require('./FfmpegMock.test'); const RtspCameraManager = require('../../../services/rtsp-camera/lib'); const gladys = { @@ -23,12 +22,7 @@ describe('Camera.sendCameraFileToGateway', () => { const indexFilePath = path.join(folderPath, 'index.m3u8'); const keyfilePath = path.join(folderPath, 'index.m3u8.key'); const videoFilePath = path.join(folderPath, 'index0.ts'); - const rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + const rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); before(async () => { await fse.ensureDir(folderPath); await fse.writeFile(indexFilePath, 'this is index'); diff --git a/server/test/services/rtsp-camera/rtspCamera.streaming.test.js b/server/test/services/rtsp-camera/rtspCamera.streaming.test.js index 75602bcec5..0ef4023509 100644 --- a/server/test/services/rtsp-camera/rtspCamera.streaming.test.js +++ b/server/test/services/rtsp-camera/rtspCamera.streaming.test.js @@ -3,7 +3,6 @@ const { expect, assert } = require('chai'); const fse = require('fs-extra'); const path = require('path'); const { fake, assert: fakeAssert } = require('sinon'); -const FfmpegMock = require('./FfmpegMock.test'); const RtspCameraManager = require('../../../services/rtsp-camera/lib'); const { NotFoundError } = require('../../../utils/coreErrors'); const { DEVICE_ROTATION } = require('../../../utils/constants'); @@ -72,12 +71,7 @@ describe('Camera.streaming', () => { await fse.ensureDir(gladys.config.tempFolder); }); beforeEach(() => { - rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); }); afterEach(() => { // remove interval @@ -95,12 +89,7 @@ describe('Camera.streaming', () => { }), }, }; - rtspCameraManager = new RtspCameraManager( - wrongGladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + rtspCameraManager = new RtspCameraManager(wrongGladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); const promise = rtspCameraManager.startStreaming('my-camera', false, 1); await assert.isRejected(promise, NotFoundError); wrongGladys.device.getBySelector = fake.resolves({ @@ -158,7 +147,6 @@ describe('Camera.streaming', () => { }; rtspCameraManager = new RtspCameraManager( gladysDeviceWithRotation, - FfmpegMock, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc', ); @@ -194,7 +182,6 @@ describe('Camera.streaming', () => { }; rtspCameraManager = new RtspCameraManager( gladysDeviceWithRotation, - FfmpegMock, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc', ); @@ -230,7 +217,6 @@ describe('Camera.streaming', () => { }; rtspCameraManager = new RtspCameraManager( gladysDeviceWithRotation, - FfmpegMock, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc', ); @@ -262,7 +248,6 @@ describe('Camera.streaming', () => { }; rtspCameraManager = new RtspCameraManager( gladysDeviceWithRotation, - FfmpegMock, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc', ); @@ -299,12 +284,7 @@ describe('Camera.streaming', () => { await rtspCameraManager.stopStreaming('my-camera'); }); it('should start streaming only once', async () => { - rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); // @ts-ignore rtspCameraManager.startStreaming = fake.resolves({}); @@ -317,12 +297,7 @@ describe('Camera.streaming', () => { fakeAssert.calledOnce(rtspCameraManager.startStreaming); }); it('should start streaming if not started', async () => { - rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); // @ts-ignore rtspCameraManager.startStreaming = fake.rejects(new Error('test')); const promise = rtspCameraManager.startStreamingIfNotStarted('my-camera', false, 1); @@ -330,12 +305,7 @@ describe('Camera.streaming', () => { expect(rtspCameraManager.liveStreamsStarting.size).to.equal(0); }); it('should start streaming locally, then convert local stream to online stream during init', async () => { - rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); // @ts-ignore rtspCameraManager.convertLocalStreamToGateway = fake.resolves(null); const promise = rtspCameraManager.startStreamingIfNotStarted('my-camera', false, 1); @@ -345,12 +315,7 @@ describe('Camera.streaming', () => { fakeAssert.calledOnce(rtspCameraManager.convertLocalStreamToGateway); }); it('should start streaming locally, then convert local stream to online stream after stream started', async () => { - rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); // @ts-ignore rtspCameraManager.convertLocalStreamToGateway = fake.resolves(null); await rtspCameraManager.startStreamingIfNotStarted('my-camera', false, 1); @@ -382,7 +347,6 @@ describe('Camera.streaming', () => { }; rtspCameraManager = new RtspCameraManager( gladys, - FfmpegMock, childProcessMockWithCrash, 'de051f90-f34a-4fd5-be2e-e502339ec9bc', ); @@ -418,7 +382,6 @@ describe('Camera.streaming', () => { }; rtspCameraManager = new RtspCameraManager( gladys, - FfmpegMock, childProcessMockWithCrash, 'de051f90-f34a-4fd5-be2e-e502339ec9bc', ); @@ -443,7 +406,6 @@ describe('Camera.streaming', () => { }; rtspCameraManager = new RtspCameraManager( gladysWithFailClean, - FfmpegMock, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc', ); @@ -460,12 +422,7 @@ describe('Camera.streaming', () => { await rtspCameraManager.stopStreaming('my-camera'); }); it('should return even if stream does not exist in stopStreaming', async () => { - rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); await rtspCameraManager.stopStreaming('unknown stream'); }); }); diff --git a/server/test/services/rtsp-camera/rtspCamera.test.js b/server/test/services/rtsp-camera/rtspCamera.test.js index 20fc277df3..3ca9eef186 100644 --- a/server/test/services/rtsp-camera/rtspCamera.test.js +++ b/server/test/services/rtsp-camera/rtspCamera.test.js @@ -2,7 +2,6 @@ const { expect } = require('chai'); const fse = require('fs-extra'); const assertChai = require('chai').assert; const { fake, assert } = require('sinon'); -const FfmpegMock = require('./FfmpegMock.test'); const RtspCameraManager = require('../../../services/rtsp-camera/lib'); const RtspCameraService = require('../../../services/rtsp-camera'); @@ -101,6 +100,16 @@ const deviceThatResultInNoImage = { }; const childProcessMock = { + execFile: (prog, args, options, cb) => { + if (args[1] === 'broken') { + cb(new Error('broken url')); + } else if (args[1] === 'no-image-written') { + cb(null, '', ''); + } else { + fse.writeFileSync(args[args.length - 1], 'image'); + cb(null, '', ''); + } + }, spawn: (command, args, options) => { const writeFile = () => { fse.writeFileSync(args[args.length - 1], 'hello'); @@ -120,12 +129,7 @@ const childProcessMock = { }; describe('RtspCameraManager commands', () => { - const rtspCameraManager = new RtspCameraManager( - gladys, - FfmpegMock, - childProcessMock, - 'de051f90-f34a-4fd5-be2e-e502339ec9bc', - ); + const rtspCameraManager = new RtspCameraManager(gladys, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc'); before(async () => { await fse.ensureDir(gladys.config.tempFolder); }); @@ -135,19 +139,19 @@ describe('RtspCameraManager commands', () => { }); it('should getImage', async () => { const image = await rtspCameraManager.getImage(device); - expect(image).to.equal('image/png;base64,aW1hZ2U='); + expect(image).to.equal('image/jpg;base64,aW1hZ2U='); }); it('should getImage 90°', async () => { const image = await rtspCameraManager.getImage(deviceRotation90); - expect(image).to.equal('image/png;base64,aW1hZ2U='); + expect(image).to.equal('image/jpg;base64,aW1hZ2U='); }); it('should getImage 180°', async () => { const image = await rtspCameraManager.getImage(deviceRotation180); - expect(image).to.equal('image/png;base64,aW1hZ2U='); + expect(image).to.equal('image/jpg;base64,aW1hZ2U='); }); it('should getImage 270°', async () => { const image = await rtspCameraManager.getImage(deviceRotation270); - expect(image).to.equal('image/png;base64,aW1hZ2U='); + expect(image).to.equal('image/jpg;base64,aW1hZ2U='); }); it('should return error', async () => { const promise = rtspCameraManager.getImage(brokenDevice); @@ -174,16 +178,15 @@ describe('RtspCameraManager commands', () => { }); it('should poll', async () => { await rtspCameraManager.poll(device); - assert.calledWith(gladys.device.camera.setImage, 'my-camera', 'image/png;base64,aW1hZ2U='); + assert.calledWith(gladys.device.camera.setImage, 'my-camera', 'image/jpg;base64,aW1hZ2U='); }); it('should fail to poll, but not crash', async () => { const rtspCameraManagerBroken = new RtspCameraManager( gladys, - FfmpegMock, childProcessMock, 'de051f90-f34a-4fd5-be2e-e502339ec9bc', ); - rtspCameraManagerBroken.getImage = fake.rejects('NOT_WORKI?NG'); + rtspCameraManagerBroken.getImage = fake.rejects('NOT_WORKING'); await rtspCameraManagerBroken.poll(device); }); it('should stop service', async () => { From 749cfe18c1825bf4807ab8055425956c59f3bbbd Mon Sep 17 00:00:00 2001 From: Pierre-Gilles Leymarie Date: Fri, 25 Oct 2024 09:27:42 +0200 Subject: [PATCH 4/8] Upgrade DuckDB to 1.1.1 (#2144) --- server/package-lock.json | 14 +++++++------- server/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 4ccdff0528..d2c57bb2ac 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -21,7 +21,7 @@ "cross-env": "^7.0.3", "dayjs": "^1.11.6", "dockerode": "^3.3.4", - "duckdb": "^1.0.0", + "duckdb": "^1.1.1", "express": "^4.18.2", "express-rate-limit": "^6.7.0", "form-data": "^2.3.3", @@ -3800,9 +3800,9 @@ "integrity": "sha512-aw55FtZzT6AmiamEj2kvmR6BuFqvYgKZUkfQ7teqVRNqD5UE0rw8IeW/3gieHNKQ5sPuDKlljWEn4bzv5+1bHw==" }, "node_modules/duckdb": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/duckdb/-/duckdb-1.0.0.tgz", - "integrity": "sha512-QwpcIeN42A2lL19S70mUFibZgRcEcZpCkKHdzDgecHaYZhXj3+1i2cxSDyAk/RVg5CYnqj1Dp4jAuN4cc80udA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/duckdb/-/duckdb-1.1.1.tgz", + "integrity": "sha512-cFT+zsduuanxQsq7TlgIdmRREkRYb0EUQlj4hgilM0yBnJbt+i0r6Qu30aWd2gr9/bkmOuaamswBCroH/27LVA==", "hasInstallScript": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", @@ -15139,9 +15139,9 @@ "integrity": "sha512-aw55FtZzT6AmiamEj2kvmR6BuFqvYgKZUkfQ7teqVRNqD5UE0rw8IeW/3gieHNKQ5sPuDKlljWEn4bzv5+1bHw==" }, "duckdb": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/duckdb/-/duckdb-1.0.0.tgz", - "integrity": "sha512-QwpcIeN42A2lL19S70mUFibZgRcEcZpCkKHdzDgecHaYZhXj3+1i2cxSDyAk/RVg5CYnqj1Dp4jAuN4cc80udA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/duckdb/-/duckdb-1.1.1.tgz", + "integrity": "sha512-cFT+zsduuanxQsq7TlgIdmRREkRYb0EUQlj4hgilM0yBnJbt+i0r6Qu30aWd2gr9/bkmOuaamswBCroH/27LVA==", "requires": { "@mapbox/node-pre-gyp": "^1.0.0", "node-addon-api": "^7.0.0", diff --git a/server/package.json b/server/package.json index 0ff217627a..02f7035abc 100644 --- a/server/package.json +++ b/server/package.json @@ -86,7 +86,7 @@ "cross-env": "^7.0.3", "dayjs": "^1.11.6", "dockerode": "^3.3.4", - "duckdb": "^1.0.0", + "duckdb": "^1.1.1", "express": "^4.18.2", "express-rate-limit": "^6.7.0", "form-data": "^2.3.3", From 35864b5e158bbd96940f6075241c277464eecfad Mon Sep 17 00:00:00 2001 From: William Deren Date: Fri, 25 Oct 2024 09:28:38 +0200 Subject: [PATCH 5/8] Zigbee2mqtt: Add pilot wire mode (#2140) --- .../boxs/device-in-room/DeviceRow.jsx | 2 + .../device-in-room/SupportedFeatureTypes.jsx | 1 + .../PilotWireModeDeviceFeature.jsx | 52 +++++++++++++++++++ front/src/config/i18n/de.json | 14 +++++ front/src/config/i18n/en.json | 14 +++++ front/src/config/i18n/fr.json | 14 +++++ front/src/utils/consts.js | 3 ++ .../services/zigbee2mqtt/exposes/enumType.js | 14 +++++ server/utils/constants.js | 14 +++++ 9 files changed, 128 insertions(+) create mode 100644 front/src/components/boxs/device-in-room/device-features/PilotWireModeDeviceFeature.jsx diff --git a/front/src/components/boxs/device-in-room/DeviceRow.jsx b/front/src/components/boxs/device-in-room/DeviceRow.jsx index d4e3f32b1c..1edd1f5f72 100644 --- a/front/src/components/boxs/device-in-room/DeviceRow.jsx +++ b/front/src/components/boxs/device-in-room/DeviceRow.jsx @@ -12,6 +12,7 @@ import NumberDeviceFeature from './device-features/NumberDeviceFeature'; import CoverDeviceFeature from './device-features/CoverDeviceFeature'; import ThermostatDeviceFeature from './device-features/ThermostatDeviceFeature'; import AirConditioningModeDeviceFeature from './device-features/AirConditioningModeDeviceFeature'; +import PilotWireModeDeviceFeature from './device-features/PilotWireModeDeviceFeature'; import LMHVolumeDeviceFeature from './device-features/LMHVolumeDeviceFeature'; const ROW_TYPE_BY_FEATURE_TYPE = { @@ -29,6 +30,7 @@ const ROW_TYPE_BY_FEATURE_TYPE = { [DEVICE_FEATURE_TYPES.THERMOSTAT.TARGET_TEMPERATURE]: ThermostatDeviceFeature, [DEVICE_FEATURE_TYPES.AIR_CONDITIONING.MODE]: AirConditioningModeDeviceFeature, [DEVICE_FEATURE_TYPES.AIR_CONDITIONING.TARGET_TEMPERATURE]: ThermostatDeviceFeature, + [DEVICE_FEATURE_TYPES.HEATER.PILOT_WIRE_MODE]: PilotWireModeDeviceFeature, [DEVICE_FEATURE_TYPES.SIREN.LMH_VOLUME]: LMHVolumeDeviceFeature, [DEVICE_FEATURE_TYPES.SIREN.MELODY]: NumberDeviceFeature, [DEVICE_FEATURE_TYPES.DURATION.DECIMAL]: MultiLevelDeviceFeature diff --git a/front/src/components/boxs/device-in-room/SupportedFeatureTypes.jsx b/front/src/components/boxs/device-in-room/SupportedFeatureTypes.jsx index a4e8516a8b..eeb2419339 100644 --- a/front/src/components/boxs/device-in-room/SupportedFeatureTypes.jsx +++ b/front/src/components/boxs/device-in-room/SupportedFeatureTypes.jsx @@ -13,6 +13,7 @@ const SUPPORTED_FEATURE_TYPES = [ DEVICE_FEATURE_TYPES.THERMOSTAT.TARGET_TEMPERATURE, DEVICE_FEATURE_TYPES.AIR_CONDITIONING.MODE, DEVICE_FEATURE_TYPES.AIR_CONDITIONING.TARGET_TEMPERATURE, + DEVICE_FEATURE_TYPES.HEATER.PILOT_WIRE_MODE, DEVICE_FEATURE_TYPES.SIREN.LMH_VOLUME, DEVICE_FEATURE_TYPES.SIREN.MELODY, DEVICE_FEATURE_TYPES.DURATION.DECIMAL diff --git a/front/src/components/boxs/device-in-room/device-features/PilotWireModeDeviceFeature.jsx b/front/src/components/boxs/device-in-room/device-features/PilotWireModeDeviceFeature.jsx new file mode 100644 index 0000000000..71bdb51f71 --- /dev/null +++ b/front/src/components/boxs/device-in-room/device-features/PilotWireModeDeviceFeature.jsx @@ -0,0 +1,52 @@ +import get from 'get-value'; +import { Text } from 'preact-i18n'; + +import { DeviceFeatureCategoriesIcon } from '../../../../utils/consts'; +import { PILOT_WIRE_MODE } from '../../../../../../server/utils/constants'; + +const PilotWireModeDeviceFeature = ({ children, ...props }) => { + const { deviceFeature } = props; + const { category, type } = deviceFeature; + + function updateValue(e) { + props.updateValueWithDebounce(deviceFeature, e.currentTarget.value); + } + + return ( + + + + + {props.rowName} + + +
+
+ +
+
+ + + ); +}; + +export default PilotWireModeDeviceFeature; diff --git a/front/src/config/i18n/de.json b/front/src/config/i18n/de.json index 14bddbc4ae..ecb6580da5 100644 --- a/front/src/config/i18n/de.json +++ b/front/src/config/i18n/de.json @@ -2758,6 +2758,16 @@ "heating": "Heizen" } }, + "heater": { + "pilot-wire-mode": { + "comfort": "Komfort", + "eco": "Öko", + "off": "Aus", + "frost-protection": "Frostschutz", + "comfort_-1": "Komfort -1°C", + "comfort_-2": "Komfort -2°C" + } + }, "siren": { "lmh_volume": { "low": "Niedrig", @@ -3032,6 +3042,10 @@ "mode": "Modus", "target-temperature": "Temperatur" }, + "heater": { + "shortCategoryName": "Heizung", + "pilot-wire-mode": "Modus" + }, "tamper": { "shortCategoryName": "Manipulation", "binary": "Manipulation (ja/nein)" diff --git a/front/src/config/i18n/en.json b/front/src/config/i18n/en.json index 3e6c967fa8..85f1b09322 100644 --- a/front/src/config/i18n/en.json +++ b/front/src/config/i18n/en.json @@ -2758,6 +2758,16 @@ "heating": "Heat" } }, + "heater": { + "pilot-wire-mode": { + "comfort": "Comfort", + "eco": "Eco", + "off": "Off", + "frost-protection": "Frost Protection", + "comfort_-1": "Comfort -1°C", + "comfort_-2": "Comfort -2°C" + } + }, "siren": { "lmh_volume": { "low": "Low", @@ -3032,6 +3042,10 @@ "mode": "Mode", "target-temperature": "Temperature" }, + "heater": { + "shortCategoryName": "Heating", + "pilot-wire-mode": "Mode" + }, "tamper": { "shortCategoryName": "Tamper", "binary": "Tamper (yes/no)" diff --git a/front/src/config/i18n/fr.json b/front/src/config/i18n/fr.json index 872b3b67cd..dba32fdf4a 100644 --- a/front/src/config/i18n/fr.json +++ b/front/src/config/i18n/fr.json @@ -2758,6 +2758,16 @@ "heating": "Chauffage" } }, + "heater": { + "pilot-wire-mode": { + "comfort": "Confort", + "eco": "Eco", + "off": "Off", + "frost-protection": "Hors Gel", + "comfort_-1": "Confort -1°C", + "comfort_-2": "Confort -2°C" + } + }, "siren": { "lmh_volume": { "low": "Faible", @@ -3032,6 +3042,10 @@ "mode": "Mode", "target-temperature": "Température" }, + "heater": { + "shortCategoryName": "Chauffage", + "pilot-wire-mode": "Mode" + }, "tamper": { "shortCategoryName": "Détecteur de sabotage", "binary": "Détection sabotage (Oui/Non)" diff --git a/front/src/utils/consts.js b/front/src/utils/consts.js index 005c40e447..2f117262bb 100644 --- a/front/src/utils/consts.js +++ b/front/src/utils/consts.js @@ -172,6 +172,9 @@ export const DeviceFeatureCategoriesIcon = { [DEVICE_FEATURE_TYPES.AIR_CONDITIONING.MODE]: 'settings', [DEVICE_FEATURE_TYPES.AIR_CONDITIONING.TARGET_TEMPERATURE]: 'thermometer' }, + [DEVICE_FEATURE_CATEGORIES.HEATER]: { + [DEVICE_FEATURE_TYPES.HEATER.PILOT_WIRE_MODE]: 'thermometer' + }, [DEVICE_FEATURE_CATEGORIES.TELEVISION]: { [DEVICE_FEATURE_TYPES.TELEVISION.BINARY]: 'power', [DEVICE_FEATURE_TYPES.TELEVISION.SOURCE]: 'airplay', diff --git a/server/services/zigbee2mqtt/exposes/enumType.js b/server/services/zigbee2mqtt/exposes/enumType.js index 335cd216e9..8193ad5bc0 100644 --- a/server/services/zigbee2mqtt/exposes/enumType.js +++ b/server/services/zigbee2mqtt/exposes/enumType.js @@ -4,6 +4,7 @@ const { BUTTON_STATUS, COVER_STATE, SIREN_LMH_VOLUME, + PILOT_WIRE_MODE, } = require('../../../utils/constants'); const WRITE_VALUE_MAPPING = {}; @@ -85,6 +86,13 @@ addMapping('volume', SIREN_LMH_VOLUME.LOW, 'low'); addMapping('volume', SIREN_LMH_VOLUME.MEDIUM, 'medium'); addMapping('volume', SIREN_LMH_VOLUME.HIGH, 'high'); +addMapping('pilot_wire_mode', PILOT_WIRE_MODE.COMFORT, 'comfort'); +addMapping('pilot_wire_mode', PILOT_WIRE_MODE.ECO, 'eco'); +addMapping('pilot_wire_mode', PILOT_WIRE_MODE.FROST_PROTECTION, 'frost_protection'); +addMapping('pilot_wire_mode', PILOT_WIRE_MODE.OFF, 'off'); +addMapping('pilot_wire_mode', PILOT_WIRE_MODE.COMFORT_1, 'comfort_-1'); +addMapping('pilot_wire_mode', PILOT_WIRE_MODE.COMFORT_2, 'comfort_-2'); + module.exports = { type: 'enum', writeValue: (expose, value) => { @@ -143,6 +151,12 @@ module.exports = { type: DEVICE_FEATURE_TYPES.SIREN.MELODY, }, }, + pilot_wire_mode: { + feature: { + category: DEVICE_FEATURE_CATEGORIES.HEATER, + type: DEVICE_FEATURE_TYPES.HEATER.PILOT_WIRE_MODE, + }, + }, }, getFeatureIndexes: (values = []) => { const indexes = values diff --git a/server/utils/constants.js b/server/utils/constants.js index 9e8a7aa702..d17be5ae08 100644 --- a/server/utils/constants.js +++ b/server/utils/constants.js @@ -77,6 +77,15 @@ const AC_MODE = { FAN: 4, }; +const PILOT_WIRE_MODE = { + OFF: 0, + FROST_PROTECTION: 1, + ECO: 2, + COMFORT_1: 3, + COMFORT_2: 4, + COMFORT: 5, +}; + const MUSIC_PLAYBACK_STATE = { PLAYING: 1, PAUSED: 0, @@ -443,6 +452,7 @@ const DEVICE_FEATURE_CATEGORIES = { DISTANCE_SENSOR: 'distance-sensor', DURATION: 'duration', ENERGY_SENSOR: 'energy-sensor', + HEATER: 'heater', HUMIDITY_SENSOR: 'humidity-sensor', LEAK_SENSOR: 'leak-sensor', LIGHT: 'light', @@ -551,6 +561,9 @@ const DEVICE_FEATURE_TYPES = { MODE: 'mode', TARGET_TEMPERATURE: 'target-temperature', }, + HEATER: { + PILOT_WIRE_MODE: 'pilot-wire-mode', + }, SURFACE: { DECIMAL: 'decimal', }, @@ -1142,6 +1155,7 @@ module.exports.BUTTON_STATUS = BUTTON_STATUS; module.exports.COVER_STATE = COVER_STATE; module.exports.SIREN_LMH_VOLUME = SIREN_LMH_VOLUME; module.exports.AC_MODE = AC_MODE; +module.exports.PILOT_WIRE_MODE = PILOT_WIRE_MODE; module.exports.EVENTS = EVENTS; module.exports.LIFE_EVENTS = LIFE_EVENTS; module.exports.STATES = STATES; From e6d4272bb1b3ab6c22adb0266deb8a6f51eda405 Mon Sep 17 00:00:00 2001 From: Bertrand d'Aure Date: Fri, 25 Oct 2024 09:31:14 +0200 Subject: [PATCH 6/8] Homekit: Handle devices with multiple time the same features (#2139) --- server/services/homekit/lib/buildAccessory.js | 28 +- server/services/homekit/lib/buildService.js | 17 +- server/services/homekit/package-lock.json | 1209 +++++------------ server/services/homekit/package.json | 2 +- .../services/homekit/lib/buildService.test.js | 23 +- 5 files changed, 370 insertions(+), 909 deletions(-) diff --git a/server/services/homekit/lib/buildAccessory.js b/server/services/homekit/lib/buildAccessory.js index f13d7be96b..85f0a72535 100644 --- a/server/services/homekit/lib/buildAccessory.js +++ b/server/services/homekit/lib/buildAccessory.js @@ -24,8 +24,32 @@ function buildAccessory(device) { const accessory = new this.hap.Accessory(device.name, device.id); Object.keys(categories).forEach((category) => { - const service = this.buildService(device, categories[category], mappings[category]); - accessory.addService(service); + const serviceConfigs = []; + + categories[category].forEach((cat) => { + if ( + serviceConfigs.length > 0 && + !serviceConfigs[serviceConfigs.length - 1].find( + (config) => config.category === cat.category && config.type === cat.type, + ) + ) { + serviceConfigs[serviceConfigs.length - 1].push(cat); + + return; + } + + serviceConfigs.push([cat]); + }); + + serviceConfigs.forEach((config, i) => { + const service = this.buildService( + device, + config, + mappings[category], + serviceConfigs.length > 1 ? `${category} ${i + 1}` : undefined, + ); + accessory.addService(service); + }); }); return accessory.services.length <= 1 ? null : accessory; diff --git a/server/services/homekit/lib/buildService.js b/server/services/homekit/lib/buildService.js index 03409e1322..a7a91e35fd 100644 --- a/server/services/homekit/lib/buildService.js +++ b/server/services/homekit/lib/buildService.js @@ -18,14 +18,15 @@ const sleep = promisify(setTimeout); * @param {object} device - Gladys device to format as HomeKit accessory. * @param {object} features - Device features to associate to service. * @param {object} categoryMapping - Homekit mapping for the current device category. + * @param {string} subtype - Optional subtype if multiple same service. * @returns {object} HomeKit service to expose. * @example * buildService(device, features, categoryMapping) */ -function buildService(device, features, categoryMapping) { +function buildService(device, features, categoryMapping, subtype) { const { Characteristic, CharacteristicEventTypes, Perms, Service } = this.hap; - const service = new Service[categoryMapping.service](device.name); + const service = new Service[categoryMapping.service](subtype ? features[0].name : device.name, subtype); features.forEach((feature) => { switch (`${feature.category}:${feature.type}`) { @@ -51,8 +52,7 @@ function buildService(device, features, categoryMapping) { status: ACTIONS_STATUS.PENDING, value: value ? 1 : 0, device: device.selector, - feature_category: feature.category, - feature_type: feature.type, + device_feature: feature.selector, }; this.gladys.event.emit(EVENTS.ACTION.TRIGGERED, action); callback(); @@ -107,8 +107,7 @@ function buildService(device, features, categoryMapping) { ), ), device: device.selector, - feature_category: feature.category, - feature_type: feature.type, + device_feature: feature.selector, }; this.gladys.event.emit(EVENTS.ACTION.TRIGGERED, action); callback(); @@ -136,8 +135,7 @@ function buildService(device, features, categoryMapping) { status: ACTIONS_STATUS.PENDING, value: rgbToInt(rgb), device: device.selector, - feature_category: feature.category, - feature_type: feature.type, + device_feature: feature.selector, }; this.gladys.event.emit(EVENTS.ACTION.TRIGGERED, action); callback(); @@ -161,8 +159,7 @@ function buildService(device, features, categoryMapping) { status: ACTIONS_STATUS.PENDING, value: rgbToInt(rgb), device: device.selector, - feature_category: feature.category, - feature_type: feature.type, + device_feature: feature.selector, }; this.gladys.event.emit(EVENTS.ACTION.TRIGGERED, action); callback(); diff --git a/server/services/homekit/package-lock.json b/server/services/homekit/package-lock.json index faf9f457a7..8b2d841a05 100644 --- a/server/services/homekit/package-lock.json +++ b/server/services/homekit/package-lock.json @@ -1,6 +1,6 @@ { "name": "gladys-homekit", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -16,36 +16,39 @@ "win32" ], "dependencies": { - "hap-nodejs": "^0.11.1", + "hap-nodejs": "^0.12.2", "uuid": "^9.0.0" } }, "node_modules/@homebridge/ciao": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.1.5.tgz", - "integrity": "sha512-ZI9tcbPfX2d8oP1PNeLzrZLXISAIDUtJQWk4JVVJKCxktC6tQ3JyWXT9t1FbB5xtl82M1jdCgyAbWbjhUtRWcA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.3.1.tgz", + "integrity": "sha512-87tQCBNNnTymlbg8pKlQjRsk7a5uuqhWBpCbUriVYUebz3voJkLbbTmp0TQg7Sa6Jnpk/Uo6LA8zAOy2sbK9bw==", "dependencies": { - "debug": "^4.3.4", + "debug": "^4.3.6", "fast-deep-equal": "^3.1.3", "source-map-support": "^0.5.21", - "tslib": "^2.4.0" + "tslib": "^2.6.3" }, "bin": { "ciao-bcs": "lib/bonjour-conformance-testing.js" + }, + "engines": { + "node": "^18 || ^20 || ^22" } }, "node_modules/@homebridge/dbus-native": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@homebridge/dbus-native/-/dbus-native-0.5.1.tgz", - "integrity": "sha512-7xXz3R1W/kcbfQOGp32y4K7etqtowICR1vpx8j85KwPYXbNQrgiZ3zcwDYgDGBWq3FD9xzsW7h4YWJ4vTR2seQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@homebridge/dbus-native/-/dbus-native-0.6.0.tgz", + "integrity": "sha512-xObqQeYHTXmt6wsfj10+krTo4xbzR9BgUfX2aQ+edDC9nc4ojfzLScfXCh3zluAm6UCowKw+AFfXn6WLWUOPkg==", "dependencies": { "@homebridge/long": "^5.2.1", - "@homebridge/put": "~0.0.8", - "event-stream": "^4.0.0", - "hexy": "^0.2.10", + "@homebridge/put": "^0.0.8", + "event-stream": "^4.0.1", + "hexy": "^0.3.5", "minimist": "^1.2.6", - "safe-buffer": "^5.1.1", - "xml2js": "^0.5.0" + "safe-buffer": "^5.1.2", + "xml2js": "^0.6.2" }, "bin": { "dbus2js": "bin/dbus2js.js" @@ -65,31 +68,37 @@ } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -98,13 +107,12 @@ } }, "node_modules/bonjour-hap": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.6.4.tgz", - "integrity": "sha512-a76r95/qTAP5hOEZZhRoiosyFSVPPRSVev09Jh8yDf3JDKyrzELLf0vpQCuEXFueb9DcV9UJf2Jv3dktyuPBng==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.8.0.tgz", + "integrity": "sha512-l/Ptvrt/pjN2pCgiVyyA0EkE0uVoXXYZ4DW4xhL4kDVBaw0w54/3Jhdhzn5EyT1Z8YhNXiNhSX0uW6xz2zSxqQ==", "dependencies": { - "array-flatten": "^2.1.2", - "deep-equal": "^2.0.5", - "ip": "^1.1.8", + "array-flatten": "^3.0.0", + "deep-equal": "^2.2.3", "multicast-dns": "^7.2.5", "multicast-dns-service-types": "^1.1.0" } @@ -115,23 +123,29 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -143,14 +157,14 @@ } }, "node_modules/deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", "dependencies": { "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.2", "is-arguments": "^1.1.1", "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", @@ -160,21 +174,41 @@ "object-is": "^1.1.5", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", + "regexp.prototype.flags": "^1.5.1", "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -186,9 +220,9 @@ } }, "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -201,6 +235,25 @@ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-get-iterator": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", @@ -261,9 +314,12 @@ "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==" }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/functions-have-names": { "version": "1.2.3", @@ -274,22 +330,26 @@ } }, "node_modules/futoin-hkdf": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.4.3.tgz", - "integrity": "sha512-K4MIe2xSVRMYxsA4w0ap5fp1C2hA9StA2Ad1JZHX57VMCdHIRB5BSrd1FhuadTQG9MkjggaTCrw7v5XXFyY3/w==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz", + "integrity": "sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==", "engines": { "node": ">=8" } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -307,34 +367,23 @@ } }, "node_modules/hap-nodejs": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.11.1.tgz", - "integrity": "sha512-hJuGyjng2jlzhZsviWCldaokT7l7BE3iGmWdlE6DNmQFDTmiBN3deNksAZ2nt7qp5jYEv7ZUvW7WBZqJsLh3ww==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.12.2.tgz", + "integrity": "sha512-EAgcBOxxMaWKkRfuGc8FBVJO5/OCFM2jMt5+szkqazWLKANkRLrvf/GtQnPsl6GUuLiWYddLZ/zwasayU8ljQQ==", "dependencies": { - "@homebridge/ciao": "^1.1.5", - "@homebridge/dbus-native": "^0.5.1", - "bonjour-hap": "~3.6.4", - "debug": "^4.3.4", - "fast-srp-hap": "~2.0.4", - "futoin-hkdf": "~1.4.3", - "node-persist": "^0.0.11", + "@homebridge/ciao": "^1.2.0", + "@homebridge/dbus-native": "^0.6.0", + "bonjour-hap": "^3.7.2", + "debug": "^4.3.5", + "fast-srp-hap": "^2.0.4", + "futoin-hkdf": "^1.5.3", + "node-persist": "^0.0.12", "source-map-support": "^0.5.21", - "tslib": "^2.4.0", + "tslib": "^2.6.2", "tweetnacl": "^1.0.3" }, "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "node": "^18 || ^20" } }, "node_modules/has-bigints": { @@ -346,20 +395,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -379,11 +428,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -392,32 +441,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hexy": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz", - "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.3.5.tgz", + "integrity": "sha512-UCP7TIZPXz5kxYJnNOym+9xaenxCLor/JyhKieo8y8/bJWunGh9xbhy3YrgYJUQ87WwfXGm05X330DszOfINZw==", "bin": { "hexy": "bin/hexy_cmd.js" + }, + "engines": { + "node": ">=10.4" } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" - }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -434,13 +492,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -498,9 +558,12 @@ } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -535,19 +598,25 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -581,17 +650,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "engines": { "node": ">= 0.4" }, @@ -599,21 +661,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -630,9 +687,9 @@ "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==" }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -649,9 +706,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -671,29 +728,32 @@ "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==" }, "node_modules/node-persist": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", - "integrity": "sha512-J3EPzQDgPxPBID7TqHSd5KkpTULFqJUvYDoISfOWg9EihpeVCH3b6YQeDeubzVuc4e6+aiVmkz2sdkWI4K+ghA==", + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.12.tgz", + "integrity": "sha512-Fbia3FYnURzaql53wLu0t19dmAwQg/tXT6O7YPmdwNwysNKEyFmgoT2BQlPD3XXQnYeiQVNvR5lfvufGwKuxhg==", "dependencies": { "mkdirp": "~0.5.1", "q": "~1.1.1" } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -711,12 +771,12 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -735,23 +795,33 @@ "through": "~2.3" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/q": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", "integrity": "sha512-ROtylwux7Vkc4C07oKE/ReigUmb33kVoLtcR4SJ1QVqwaZkBEDL3vX4/kwFzIERQ5PfCl0XafbU8u2YUhyGgVA==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -780,18 +850,52 @@ ] }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -856,9 +960,9 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/tweetnacl": { "version": "1.0.3", @@ -866,9 +970,13 @@ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -889,30 +997,32 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -922,9 +1032,9 @@ } }, "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -941,674 +1051,5 @@ "node": ">=4.0" } } - }, - "dependencies": { - "@homebridge/ciao": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.1.5.tgz", - "integrity": "sha512-ZI9tcbPfX2d8oP1PNeLzrZLXISAIDUtJQWk4JVVJKCxktC6tQ3JyWXT9t1FbB5xtl82M1jdCgyAbWbjhUtRWcA==", - "requires": { - "debug": "^4.3.4", - "fast-deep-equal": "^3.1.3", - "source-map-support": "^0.5.21", - "tslib": "^2.4.0" - } - }, - "@homebridge/dbus-native": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@homebridge/dbus-native/-/dbus-native-0.5.1.tgz", - "integrity": "sha512-7xXz3R1W/kcbfQOGp32y4K7etqtowICR1vpx8j85KwPYXbNQrgiZ3zcwDYgDGBWq3FD9xzsW7h4YWJ4vTR2seQ==", - "requires": { - "@homebridge/long": "^5.2.1", - "@homebridge/put": "~0.0.8", - "event-stream": "^4.0.0", - "hexy": "^0.2.10", - "minimist": "^1.2.6", - "safe-buffer": "^5.1.1", - "xml2js": "^0.5.0" - } - }, - "@homebridge/long": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@homebridge/long/-/long-5.2.1.tgz", - "integrity": "sha512-i5Df8R63XNPCn+Nj1OgAoRdw9e+jHUQb3CNUbvJneI2iu3j4+OtzQj+5PA1Ce+747NR1SPqZSvyvD483dOT3AA==" - }, - "@homebridge/put": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@homebridge/put/-/put-0.0.8.tgz", - "integrity": "sha512-mwxLHHqKebOmOSU0tsPEWQSBHGApPhuaqtNpCe7U+AMdsduweANiu64E9SXXUtdpyTjsOpgSMLhD1+kbLHD2gA==" - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - }, - "bonjour-hap": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.6.4.tgz", - "integrity": "sha512-a76r95/qTAP5hOEZZhRoiosyFSVPPRSVev09Jh8yDf3JDKyrzELLf0vpQCuEXFueb9DcV9UJf2Jv3dktyuPBng==", - "requires": { - "array-flatten": "^2.1.2", - "deep-equal": "^2.0.5", - "ip": "^1.1.8", - "multicast-dns": "^7.2.5", - "multicast-dns-service-types": "^1.1.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - } - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - } - }, - "event-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", - "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-srp-hap": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-2.0.4.tgz", - "integrity": "sha512-lHRYYaaIbMrhZtsdGTwPN82UbqD9Bv8QfOlKs+Dz6YRnByZifOh93EYmf2iEWFtkOEIqR2IK8cFD0UN5wLIWBQ==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "futoin-hkdf": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.4.3.tgz", - "integrity": "sha512-K4MIe2xSVRMYxsA4w0ap5fp1C2hA9StA2Ad1JZHX57VMCdHIRB5BSrd1FhuadTQG9MkjggaTCrw7v5XXFyY3/w==" - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "hap-nodejs": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.11.1.tgz", - "integrity": "sha512-hJuGyjng2jlzhZsviWCldaokT7l7BE3iGmWdlE6DNmQFDTmiBN3deNksAZ2nt7qp5jYEv7ZUvW7WBZqJsLh3ww==", - "requires": { - "@homebridge/ciao": "^1.1.5", - "@homebridge/dbus-native": "^0.5.1", - "bonjour-hap": "~3.6.4", - "debug": "^4.3.4", - "fast-srp-hap": "~2.0.4", - "futoin-hkdf": "~1.4.3", - "node-persist": "^0.0.11", - "source-map-support": "^0.5.21", - "tslib": "^2.4.0", - "tweetnacl": "^1.0.3" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hexy": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz", - "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==" - }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==" - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==" - }, - "node-persist": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", - "integrity": "sha512-J3EPzQDgPxPBID7TqHSd5KkpTULFqJUvYDoISfOWg9EihpeVCH3b6YQeDeubzVuc4e6+aiVmkz2sdkWI4K+ghA==", - "requires": { - "mkdirp": "~0.5.1", - "q": "~1.1.1" - } - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "requires": { - "through": "~2.3" - } - }, - "q": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", - "integrity": "sha512-ROtylwux7Vkc4C07oKE/ReigUmb33kVoLtcR4SJ1QVqwaZkBEDL3vX4/kwFzIERQ5PfCl0XafbU8u2YUhyGgVA==" - }, - "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "requires": { - "through": "2" - } - }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "requires": { - "internal-slot": "^1.0.4" - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - } } } diff --git a/server/services/homekit/package.json b/server/services/homekit/package.json index adbd4d526d..7c54e90841 100644 --- a/server/services/homekit/package.json +++ b/server/services/homekit/package.json @@ -13,7 +13,7 @@ ], "scripts": {}, "dependencies": { - "hap-nodejs": "^0.11.1", + "hap-nodejs": "^0.12.2", "uuid": "^9.0.0" } } diff --git a/server/test/services/homekit/lib/buildService.test.js b/server/test/services/homekit/lib/buildService.test.js index 8b5cd0e798..d09dfaae42 100644 --- a/server/test/services/homekit/lib/buildService.test.js +++ b/server/test/services/homekit/lib/buildService.test.js @@ -115,11 +115,13 @@ describe('Build service', () => { const features = [ { name: 'onoff', + selector: 'lampe-onoff', category: DEVICE_FEATURE_CATEGORIES.LIGHT, type: DEVICE_FEATURE_TYPES.LIGHT.BINARY, }, { id: '31c6a4a7-9710-4951-bf34-04eeae5b9ff7', + selector: 'lampe-brightness', name: 'Luminosité', category: DEVICE_FEATURE_CATEGORIES.LIGHT, type: DEVICE_FEATURE_TYPES.LIGHT.BRIGHTNESS, @@ -128,12 +130,14 @@ describe('Build service', () => { }, { id: '81d2dc15-cb98-4235-96f4-5c12007b6ccd', + selector: 'lampe-color', name: 'Couleur', category: DEVICE_FEATURE_CATEGORIES.LIGHT, type: DEVICE_FEATURE_TYPES.LIGHT.COLOR, }, { id: '77f26d98-49a5-4338-97c8-ab51fb5d2164', + selector: 'lampe-temperature', name: 'Température', category: DEVICE_FEATURE_CATEGORIES.LIGHT, type: DEVICE_FEATURE_TYPES.LIGHT.TEMPERATURE, @@ -167,8 +171,7 @@ describe('Build service', () => { status: ACTIONS_STATUS.PENDING, value: 90, device: device.selector, - feature_category: DEVICE_FEATURE_CATEGORIES.LIGHT, - feature_type: DEVICE_FEATURE_TYPES.LIGHT.BRIGHTNESS, + device_feature: features[1].selector, }); expect(cb.args[2][1]).to.equal(222); expect(homekitHandler.gladys.event.emit.args[1][1]).to.eql({ @@ -176,8 +179,7 @@ describe('Build service', () => { status: ACTIONS_STATUS.PENDING, value: 14694112, device: device.selector, - feature_category: DEVICE_FEATURE_CATEGORIES.LIGHT, - feature_type: DEVICE_FEATURE_TYPES.LIGHT.COLOR, + device_feature: features[2].selector, }); expect(cb.args[4][1]).to.equal(76); expect(homekitHandler.gladys.event.emit.args[2][1]).to.eql({ @@ -185,8 +187,7 @@ describe('Build service', () => { status: ACTIONS_STATUS.PENDING, value: 14014944, device: device.selector, - feature_category: DEVICE_FEATURE_CATEGORIES.LIGHT, - feature_type: DEVICE_FEATURE_TYPES.LIGHT.COLOR, + device_feature: features[2].selector, }); expect(cb.args[6][1]).to.equal(500); expect(homekitHandler.gladys.event.emit.args[3][1]).to.eql({ @@ -194,8 +195,7 @@ describe('Build service', () => { status: ACTIONS_STATUS.PENDING, value: 0, device: device.selector, - feature_category: DEVICE_FEATURE_CATEGORIES.LIGHT, - feature_type: DEVICE_FEATURE_TYPES.LIGHT.TEMPERATURE, + device_feature: features[3].selector, }); }); @@ -204,8 +204,7 @@ describe('Build service', () => { features: [ { name: 'onoff', - category: DEVICE_FEATURE_CATEGORIES.SWITCH, - type: DEVICE_FEATURE_TYPES.SWITCH.BINARY, + device_feature: 'lampe-onoff', last_value: 1, }, ], @@ -242,6 +241,7 @@ describe('Build service', () => { const features = [ { name: 'onoff', + selector: 'switch-onoff', category: DEVICE_FEATURE_CATEGORIES.SWITCH, type: DEVICE_FEATURE_TYPES.SWITCH.BINARY, }, @@ -262,8 +262,7 @@ describe('Build service', () => { status: ACTIONS_STATUS.PENDING, value: 0, device: device.selector, - feature_category: DEVICE_FEATURE_CATEGORIES.SWITCH, - feature_type: DEVICE_FEATURE_TYPES.SWITCH.BINARY, + device_feature: features[0].selector, }); }); From 68cbddbd38eef800a9e0d8514745e15d46d2da00 Mon Sep 17 00:00:00 2001 From: Pierre-Gilles Leymarie Date: Fri, 25 Oct 2024 09:32:20 +0200 Subject: [PATCH 7/8] Backup : When restoring backup, clean DuckDB WAL file before writing new file (#2145) --- server/lib/gateway/gateway.restoreBackup.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/lib/gateway/gateway.restoreBackup.js b/server/lib/gateway/gateway.restoreBackup.js index 5a89e7d74b..6f7c08678a 100644 --- a/server/lib/gateway/gateway.restoreBackup.js +++ b/server/lib/gateway/gateway.restoreBackup.js @@ -47,9 +47,11 @@ async function restoreBackup(sqliteBackupFilePath, duckDbBackupFolderPath) { await new Promise((resolve) => { db.duckDb.close(() => resolve()); }); - // Delete current DuckDB file + // Delete current DuckDB files const duckDbFilePath = `${this.config.storage.replace('.db', '')}.duckdb`; + const duckDbWalFilePath = `${this.config.storage.replace('.db', '')}.duckdb.wal`; await fse.remove(duckDbFilePath); + await fse.remove(duckDbWalFilePath); const duckDb = new duckdb.Database(duckDbFilePath); const duckDbWriteConnection = duckDb.connect(); const duckDbWriteConnectionAllAsync = promisify(duckDbWriteConnection.all).bind(duckDbWriteConnection); From b8ab1332729ca64537911c60121970d731336acf Mon Sep 17 00:00:00 2001 From: Pierre-Gilles Leymarie Date: Fri, 25 Oct 2024 09:39:02 +0200 Subject: [PATCH 8/8] 4.47.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16086682d8..540ee8d7c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gladys", - "version": "4.46.2", + "version": "4.47.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "gladys", - "version": "4.46.2", + "version": "4.47.0", "hasInstallScript": true, "license": "Apache-2.0", "devDependencies": { diff --git a/package.json b/package.json index 088f55b0d8..18d9050330 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gladys", - "version": "4.46.2", + "version": "4.47.0", "description": "A privacy-first, open-source home assistant", "main": "index.js", "engines": {