diff --git a/.github/workflows/test-and-release.yml b/.github/workflows/test-and-release.yml index a71996ebff..7fad4183c3 100644 --- a/.github/workflows/test-and-release.yml +++ b/.github/workflows/test-and-release.yml @@ -28,7 +28,7 @@ jobs: steps: - uses: ioBroker/testing-action-check@v1 with: - node-version: '18.x' + node-version: '20.x' # Uncomment the following line if your adapter cannot be installed using 'npm ci' # install-command: 'npm install' lint: true @@ -40,7 +40,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - node-version: [18.x, 20.x, 22.x] + node-version: [20.x, 22.x] os: [ubuntu-latest, windows-latest] steps: @@ -70,7 +70,7 @@ jobs: steps: - uses: ioBroker/testing-action-deploy@v1 with: - node-version: '18.x' + node-version: '20.x' # Uncomment the following line if your adapter cannot be installed using 'npm ci' # install-command: 'npm install' npm-token: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/update_rr_zips.yml b/.github/workflows/update_rr_zips.yml index e4588a77ce..301fdbfb4b 100644 --- a/.github/workflows/update_rr_zips.yml +++ b/.github/workflows/update_rr_zips.yml @@ -44,7 +44,7 @@ jobs: - name: Create Pull Request if: steps.changes.outputs.changed == 'true' - uses: peter-evans/create-pull-request@v7 + uses: peter-evans/create-pull-request@v6 with: token: ${{ secrets.GITHUB_TOKEN }} title: "Updates for packages from roborock server" diff --git a/README.md b/README.md index f4c052bd61..a7b72e7977 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,8 @@ This adapter allows you the control, get states, cleaning history and view the m - Roborock Q8 Max - Roborock Q5 Pro - Roborock Q Revo Pro +- Roborock Qrevo S +- Roborock Qrevo Curve ## Zone cleaning This feature only works when map creation is enabled in the adapter options! @@ -53,6 +55,13 @@ This feature only works when map creation is enabled in the adapter options! Placeholder for the next version (at the beginning of the line): ### **WORK IN PROGRESS** --> +### **WORK IN PROGRESS** + * (copystring) Bugfixes + * (copystring) update test-and-release.yml + * (Black-Thunder) Fix S6 feature detection + * (copystring) Migrate from canvas to @napu-rs/canvas + * (copystring) Add Qrevo S & Qrevo Curve + ### 0.6.15 (2024-09-22) * (copystring) Refactor some code * (copystring) improve handling of online/offline detection and related logging diff --git a/lib/deviceFeatures.js b/lib/deviceFeatures.js index 6ff8db2ab2..7e34e64178 100644 --- a/lib/deviceFeatures.js +++ b/lib/deviceFeatures.js @@ -289,7 +289,16 @@ const actions = { }, set_clean_fluid: () => { deviceStates.clean_fluid = "number"; - } + }, + set_extra_time: () => { + cleaningRecordsString.extra_time = "number"; + }, + set_cleaning_info: () => { + deviceStates.cleaning_info = "string"; + }, + set_exit_dock: () => { + deviceStates.exit_dock = "number"; + }, }; class deviceFeatures { @@ -590,12 +599,13 @@ class deviceFeatures { "roborock.vacuum.a87", // Qrevo MaxV "roborock.vacuum.a101", // Q Revo Pro "roborock.vacuum.a97", // S8 MaxV (Ultra) + "roborock.vacuum.a104", // Roborock Qrevo S + "roborock.vacuum.a135" // Qrevo Curve ].includes(robotModel), // isShakeMopStrengthSupported: p.DMM.currentProduct == p.Products.TanosS || p.DMM.currentProduct == p.Products.TanosSPlus || p.DMM.isGarnet || p.DMM.isTopazSV || p.DMM.isPearlPlus || p.DMM.isCoral || p.DMM.isTopazS || p.DMM.isTopazSPlus || p.DMM.isTopazSC || p.DMM.isTopazSV || p.DMM.isPearlPlus || p.DMM.isTanosSMax || p.DMM.isUltron || p.DMM.isUltronSPlus || p.DMM.isUltronSMop || p.DMM.isUltronSV || p.DMM.isPearl isShakeMopStrengthSupported: [ "roborock.vacuum.a08", // S6 Pure "roborock.vacuum.a10", // S6 MaxV - "roborock.vacuum.s6", // S6 "roborock.vacuum.a62", // S7 Pro Ultra "roborock.vacuum.a51", // S8 "roborock.vacuum.a15", // S7 @@ -631,6 +641,8 @@ class deviceFeatures { "roborock.vacuum.a87", // Qrevo MaxV "roborock.vacuum.a101", // Q Revo Pro "roborock.vacuum.a97", // S8 MaxV (Ultra) + "roborock.vacuum.a104", // Roborock Qrevo S + "roborock.vacuum.a135" // Qrevo Curve ].includes(robotModel), isCustomWaterBoxDistanceSupported: !!(2147483648 & this.features), isBackChargeAutoWashSupported: this.featuresStr && !!(4096 & parseInt("0x" + this.featuresStr.slice(-8))), @@ -651,19 +663,22 @@ class deviceFeatures { "roborock.vacuum.a87", // Qrevo MaxV "roborock.vacuum.a101", // Q Revo Pro "roborock.vacuum.a97", // S8 MaxV (Ultra) + "roborock.vacuum.a104", // Roborock Qrevo S + "roborock.vacuum.a135" // Qrevo Curve ].includes(robotModel), // this isn't the correct way to use this. This code must be from a different robot // isVoiceControlSupported: !!(parseInt(`0x${this.featuresStr || "0"}`.slice(-10, -9)) & 2), isVoiceControlSupported: [ "roborock.vacuum.a27", // S7 MaxV (Ultra) ], - isElectronicWaterBoxSupported: [], // nothing for now. If this is needed, add the models here + isElectronicWaterBoxSupported: false, // nothing for now. If this is needed, add the models here isCleanRouteFastModeSupported: this.featuresStr && !!(256 & parseInt("0x" + this.featuresStr.slice(-8))), isVideoLiveCallSupported: [ "roborock.vacuum.a10", // S6 MaxV "roborock.vacuum.a27", // S7 MaxV (Ultra) "roborock.vacuum.a97", // S8 MaxV (Ultra) "roborock.vacuum.a87", // Qrevo MaxV + "roborock.vacuum.a135", // Qrevo Curve ].includes(robotModel), }; } @@ -841,6 +856,43 @@ class deviceFeatures { "set_map_flag", "set_task_id", ], + // Roborock Qrevo S + "roborock.vacuum.a104": [ + "setCleaningRecordsString", + "setConsumablesInt", + "set_in_warmup", + "set_charge_status", + "set_clean_percent", + "set_rss", + "set_dss", + "set_common_status", + "set_kct", + "set_switch_status", + "set_map_flag", + "set_cleaned_area", + + ], + // Roborock Qrevo Curve + "roborock.vacuum.a135": [ + "setCleaningRecordsString", + "setConsumablesInt", + "set_monitor_status", + "set_in_warmup", + "set_clean_percent", + "set_extra_time", + "set_rss", + "set_common_status", + "set_kct", + "set_switch_status", + "set_last_clean_t", + "set_cleaning_info", + "set_exit_dock", + "set_charge_status", + "set_map_flag", + "set_cleaned_area", + "set_task_id", + "set_extra_time", + ], }; // process modelConfig diff --git a/lib/mapCreator.js b/lib/mapCreator.js index 4bb80bc995..bcffee404c 100644 --- a/lib/mapCreator.js +++ b/lib/mapCreator.js @@ -1,7 +1,7 @@ "use strict"; -const { createCanvas } = require("canvas"); -const { Image } = require("canvas"); +const { createCanvas, loadImage } = require("@napi-rs/canvas"); +const { Image } = require("@napi-rs/canvas"); // Farben ändern const colors = { @@ -39,11 +39,9 @@ const go_to_pin = //const ctximg = canvasImg.getContext('2d'); -const img = new Image(); // Create a new Image -img.src = originalRobot; +let img = new Image(); // Create a new Image -const img_charger = new Image(); -img_charger.src = charger; +let img_charger = new Image(); const obstacleTitles = { 0: "Wire", @@ -140,26 +138,31 @@ class MapCreator { return `rgba(${r}, ${g}, ${b}, ${alpha})`; } - canvasMap(mapdata, duid, selectedMap, mappedRooms, options) { + async canvasMap(mapdata, duid, selectedMap, mappedRooms, options) { if (options) { colors.floor = options.FLOORCOLOR; colors.obstacle = options.WALLCOLOR; colors.path = options.PATHCOLOR; colors.newmap = options && options.newmap ? options.newmap : true; if (options.ROBOT === "robot") { - img.src = robot; + img = await loadImage(robot); } else if (options.ROBOT === "robot1") { - img.src = robot1; + img = await loadImage(robot1); } else if (options.ROBOT === "tank") { - img.src = tank; + img = await loadImage(tank); } else if (options.ROBOT === "spaceship") { - img.src = spaceship; + img = await loadImage(spaceship); } else if (options.ROBOT === "robot2") { - img.src = robot2; + img = await loadImage(robot2); } else if (options.ROBOT === "originalRobot") { - img.src = originalRobot; + img = await loadImage(originalRobot); } } + else { + img = await loadImage(originalRobot); + } + img_charger = await loadImage(charger); + let maxtop = 0; let maxleft = 0; let minleft = 0; @@ -168,524 +171,528 @@ class MapCreator { mapdata.IMAGE.dimensions.width = mapdata.IMAGE.dimensions.width * this.scaleFactor; mapdata.IMAGE.dimensions.height = mapdata.IMAGE.dimensions.height * this.scaleFactor; - const canvas = createCanvas(mapdata.IMAGE.dimensions.width, mapdata.IMAGE.dimensions.height); - const ctx = canvas.getContext("2d"); + if (mapdata.IMAGE.dimensions.height > 0 && mapdata.IMAGE.dimensions.width > 0) { + const canvas = createCanvas(mapdata.IMAGE.dimensions.width, mapdata.IMAGE.dimensions.height); + const ctx = canvas.getContext("2d"); - if (mapdata.IMAGE.pixels.floor && mapdata.IMAGE.pixels.floor.length !== 0) { - if (typeof mapdata.IMAGE.pixels.floor[0] === "number") { - // init min - minleft = mapdata.IMAGE.pixels.floor[0] % mapdata.IMAGE.dimensions.width; - mintop = mapdata.IMAGE.dimensions.height - 1 - Math.floor(mapdata.IMAGE.pixels.floor[0] / mapdata.IMAGE.dimensions.width); + if (mapdata.IMAGE.pixels.floor && mapdata.IMAGE.pixels.floor.length !== 0) { + if (typeof mapdata.IMAGE.pixels.floor[0] === "number") { + // init min + minleft = mapdata.IMAGE.pixels.floor[0] % mapdata.IMAGE.dimensions.width; + mintop = mapdata.IMAGE.dimensions.height - 1 - Math.floor(mapdata.IMAGE.pixels.floor[0] / mapdata.IMAGE.dimensions.width); - ["floor", "obstacle"].forEach((key) => { - ctx.beginPath(); - mapdata.IMAGE.pixels[key].forEach((px) => { - if (key === "obstacle") { - ctx.fillStyle = colors.newmap ? orgcolors[4] : colors.obstacle; - } else { - ctx.fillStyle = colors.newmap ? orgcolors[5] : colors.floor; - } - //ctx.fillStyle = colors[key]; - ctx.rect(this.getX(mapdata.IMAGE.dimensions, px), this.getY(mapdata.IMAGE.dimensions, px), this.scaleFactor, this.scaleFactor); - - maxtop = Math.max(maxtop, this.getY(mapdata.IMAGE.dimensions, px)); - maxleft = Math.max(maxleft, this.getX(mapdata.IMAGE.dimensions, px)); - minleft = Math.min(minleft, this.getX(mapdata.IMAGE.dimensions, px)); - mintop = Math.min(mintop, this.getY(mapdata.IMAGE.dimensions, px)); + ["floor", "obstacle"].forEach((key) => { + ctx.beginPath(); + mapdata.IMAGE.pixels[key].forEach((px) => { + if (key === "obstacle") { + ctx.fillStyle = colors.newmap ? orgcolors[4] : colors.obstacle; + } else { + ctx.fillStyle = colors.newmap ? orgcolors[5] : colors.floor; + } + //ctx.fillStyle = colors[key]; + ctx.rect(this.getX(mapdata.IMAGE.dimensions, px), this.getY(mapdata.IMAGE.dimensions, px), this.scaleFactor, this.scaleFactor); + + maxtop = Math.max(maxtop, this.getY(mapdata.IMAGE.dimensions, px)); + maxleft = Math.max(maxleft, this.getX(mapdata.IMAGE.dimensions, px)); + minleft = Math.min(minleft, this.getX(mapdata.IMAGE.dimensions, px)); + mintop = Math.min(mintop, this.getY(mapdata.IMAGE.dimensions, px)); + }); + ctx.fill(); }); - ctx.fill(); - }); + } } - } - // Zeichne Alle Räume - const segmentsData = {}; - const segmentsBounds = {}; - const assignedColors = {}; - const availableColors = [...orgcolors]; + // Zeichne Alle Räume + const segmentsData = {}; + const segmentsBounds = {}; + const assignedColors = {}; + const availableColors = [...orgcolors]; - if (mapdata.IMAGE.pixels.segments && !mapdata.CURRENTLY_CLEANED_BLOCKS && colors.newmap) { - mapdata.IMAGE.pixels.segments.forEach((px) => { - const segnum = (px >> 21); - const x = this.getX(mapdata.IMAGE.dimensions, px & 0xfffff); - const y = this.getY(mapdata.IMAGE.dimensions, px & 0xfffff); + if (mapdata.IMAGE.pixels.segments && !mapdata.CURRENTLY_CLEANED_BLOCKS && colors.newmap) { + mapdata.IMAGE.pixels.segments.forEach((px) => { + const segnum = (px >> 21); + const x = this.getX(mapdata.IMAGE.dimensions, px & 0xfffff); + const y = this.getY(mapdata.IMAGE.dimensions, px & 0xfffff); - if (!segmentsData[segnum]) { - segmentsData[segnum] = { points: [], minX: x, maxX: x, minY: y, maxY: y }; - } else { + if (!segmentsData[segnum]) { + segmentsData[segnum] = { points: [], minX: x, maxX: x, minY: y, maxY: y }; + } else { + const segment = segmentsData[segnum]; + segment.points.push({ x, y }); + segment.minX = Math.min(segment.minX, x); + segment.maxX = Math.max(segment.maxX, x); + segment.minY = Math.min(segment.minY, y); + segment.maxY = Math.max(segment.maxY, y); + } + }); + + Object.keys(segmentsData).forEach(segnum => { const segment = segmentsData[segnum]; - segment.points.push({ x, y }); - segment.minX = Math.min(segment.minX, x); - segment.maxX = Math.max(segment.maxX, x); - segment.minY = Math.min(segment.minY, y); - segment.maxY = Math.max(segment.maxY, y); - } - }); + segmentsBounds[segnum] = { + minX: segment.minX, + maxX: segment.maxX, + minY: segment.minY, + maxY: segment.maxY + }; + }); - Object.keys(segmentsData).forEach(segnum => { - const segment = segmentsData[segnum]; - segmentsBounds[segnum] = { - minX: segment.minX, - maxX: segment.maxX, - minY: segment.minY, - maxY: segment.maxY - }; - }); + Object.keys(segmentsBounds).forEach(segnum => { + const currentBounds = segmentsBounds[segnum]; + const adjacentSegments = Object.keys(segmentsBounds).filter(otherSegnum => { + const otherBounds = segmentsBounds[otherSegnum]; + return segnum !== otherSegnum && this.areRoomsAdjacent(currentBounds, otherBounds); + }); - Object.keys(segmentsBounds).forEach(segnum => { - const currentBounds = segmentsBounds[segnum]; - const adjacentSegments = Object.keys(segmentsBounds).filter(otherSegnum => { - const otherBounds = segmentsBounds[otherSegnum]; - return segnum !== otherSegnum && this.areRoomsAdjacent(currentBounds, otherBounds); + const usedColors = adjacentSegments.map(adjSegnum => assignedColors[adjSegnum]); + const availableColor = availableColors.find(color => !usedColors.includes(color)); + + if (availableColor) { + assignedColors[segnum] = availableColor; + } else { + assignedColors[segnum] = availableColors[Math.floor(Math.random() * availableColors.length)]; + } }); - const usedColors = adjacentSegments.map(adjSegnum => assignedColors[adjSegnum]); - const availableColor = availableColors.find(color => !usedColors.includes(color)); + Object.keys(segmentsData).forEach(segnum => { + const segment = segmentsData[segnum]; + ctx.fillStyle = assignedColors[segnum] || availableColors[0]; + ctx.beginPath(); + segment.points.forEach(point => { + ctx.rect(point.x, point.y, this.scaleFactor, this.scaleFactor); + }); + ctx.fill(); + }); - if (availableColor) { - assignedColors[segnum] = availableColor; - } else { - assignedColors[segnum] = availableColors[Math.floor(Math.random() * availableColors.length)]; - } - }); + ctx.closePath(); + } - Object.keys(segmentsData).forEach(segnum => { - const segment = segmentsData[segnum]; - ctx.fillStyle = assignedColors[segnum] || availableColors[0]; + if (mapdata.CURRENTLY_CLEANED_BLOCKS && colors.newmap) { + let segnum, lastcolor; ctx.beginPath(); - segment.points.forEach(point => { - ctx.rect(point.x, point.y, this.scaleFactor, this.scaleFactor); + mapdata.IMAGE.pixels.segments.forEach((px) => { + segnum = px >> 21; + if (mapdata.CURRENTLY_CLEANED_BLOCKS.includes(segnum)) { + if (segnum !== lastcolor) { + ctx.fill(); + ctx.beginPath(); + ctx.fillStyle = orgcolors[segnum % 4]; + lastcolor = segnum; + } + px = px & 0xfffff; + ctx.rect(this.getX(mapdata.IMAGE.dimensions, px), this.getY(mapdata.IMAGE.dimensions, px), this.scaleFactor, this.scaleFactor); + } }); ctx.fill(); - }); - - ctx.closePath(); - } + ctx.closePath(); + } - if (mapdata.CURRENTLY_CLEANED_BLOCKS && colors.newmap) { - let segnum, lastcolor; - ctx.beginPath(); - mapdata.IMAGE.pixels.segments.forEach((px) => { - segnum = px >> 21; - if (mapdata.CURRENTLY_CLEANED_BLOCKS.includes(segnum)) { - if (segnum !== lastcolor) { - ctx.fill(); - ctx.beginPath(); - ctx.fillStyle = orgcolors[segnum % 4]; - lastcolor = segnum; - } - px = px & 0xfffff; - ctx.rect(this.getX(mapdata.IMAGE.dimensions, px), this.getY(mapdata.IMAGE.dimensions, px), this.scaleFactor, this.scaleFactor); + // Zeichne Zonen active Zonen + if (mapdata.CURRENTLY_CLEANED_ZONES) { + if (mapdata.CURRENTLY_CLEANED_ZONES[0]) { + ctx.beginPath(); + mapdata.CURRENTLY_CLEANED_ZONES.forEach((coord) => { + ctx.fillStyle = "rgba(46,139,87,0.1)"; + ctx.fillRect( + this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50), + this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50), + this.robotXtoPixelX(mapdata.IMAGE, coord[2] / 50) - this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50), + this.robotYtoPixelY(mapdata.IMAGE, coord[3] / 50) - this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50) + ); + ctx.strokeStyle = "#2e8b57"; + ctx.lineWidth = 4; + ctx.strokeRect( + this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50), + this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50), + this.robotXtoPixelX(mapdata.IMAGE, coord[2] / 50) - this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50), + this.robotYtoPixelY(mapdata.IMAGE, coord[3] / 50) - this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50) + ); + }); } - }); - ctx.fill(); - ctx.closePath(); - } - - // Zeichne Zonen active Zonen - if (mapdata.CURRENTLY_CLEANED_ZONES) { - if (mapdata.CURRENTLY_CLEANED_ZONES[0]) { - ctx.beginPath(); - mapdata.CURRENTLY_CLEANED_ZONES.forEach((coord) => { - ctx.fillStyle = "rgba(46,139,87,0.1)"; - ctx.fillRect( - this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50), - this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50), - this.robotXtoPixelX(mapdata.IMAGE, coord[2] / 50) - this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50), - this.robotYtoPixelY(mapdata.IMAGE, coord[3] / 50) - this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50) - ); - ctx.strokeStyle = "#2e8b57"; - ctx.lineWidth = 4; - ctx.strokeRect( - this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50), - this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50), - this.robotXtoPixelX(mapdata.IMAGE, coord[2] / 50) - this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50), - this.robotYtoPixelY(mapdata.IMAGE, coord[3] / 50) - this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50) - ); - }); } - } - // Zeichne Teppich - if (mapdata.CARPET_MAP) { - const offset = 8 * this.scaleFactor; - ctx.fillStyle = "rgba(0,0,0,0.5)"; + // Zeichne Teppich + if (mapdata.CARPET_MAP) { + const offset = 8 * this.scaleFactor; + ctx.fillStyle = "rgba(0,0,0,0.5)"; - const imageData = ctx.getImageData(0, 0, mapdata.IMAGE.dimensions.width, mapdata.IMAGE.dimensions.height); - mapdata.CARPET_MAP.forEach((px) => { - const x2 = this.getX(mapdata.IMAGE.dimensions, px) - offset; - const y1 = this.getY(mapdata.IMAGE.dimensions, px); - const x1 = x2 + this.scaleFactor - 1; - const y2 = y1 + this.scaleFactor - 1; + const imageData = ctx.getImageData(0, 0, mapdata.IMAGE.dimensions.width, mapdata.IMAGE.dimensions.height); + mapdata.CARPET_MAP.forEach((px) => { + const x2 = this.getX(mapdata.IMAGE.dimensions, px) - offset; + const y1 = this.getY(mapdata.IMAGE.dimensions, px); + const x1 = x2 + this.scaleFactor - 1; + const y2 = y1 + this.scaleFactor - 1; - this.drawLineBresenham(imageData, x1, y1, x2, y2); - }); + this.drawLineBresenham(imageData, x1, y1, x2, y2); + }); - // Zeichne das ganze ImageData auf einmal - ctx.putImageData(imageData, 0, 0); - } + // Zeichne das ganze ImageData auf einmal + ctx.putImageData(imageData, 0, 0); + } - // Male den Wischpfad - if (mapdata.PATH && mapdata.MOP_PATH) { - const mopOffset = -12; // i dont know why this offset?? Maybe the value from the end - if (mapdata.PATH.points && mapdata.PATH.points.length !== 0) { - let startX, startY; // this is needed to avoid weird spikes in sharp corners! don't remove this ever! + // Male den Wischpfad + if (mapdata.PATH && mapdata.MOP_PATH) { + const mopOffset = -12; // i dont know why this offset?? Maybe the value from the end + if (mapdata.PATH.points && mapdata.PATH.points.length !== 0) { + let startX, startY; // this is needed to avoid weird spikes in sharp corners! don't remove this ever! - ctx.beginPath(); - ctx.lineWidth = 7 * this.scaleFactor; // 7 makes the mop path look the same as on the Roborock app - ctx.lineCap = "round"; - ctx.strokeStyle = "rgba(255,255,255,0.2)"; - - mapdata.PATH.points.forEach((coord, index) => { - if (mapdata.MOP_PATH && mapdata.MOP_PATH[index + mopOffset] !== 0) { - if (mapdata.MOP_PATH[index - 1 + mopOffset] === 0) { - startX = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50); - startY = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50); - ctx.moveTo(startX, startY); - if (mapdata.MOP_PATH[index + mopOffset] !== 1) { - // see value 9 and 12 in mop_path both in front of charger + ctx.beginPath(); + ctx.lineWidth = 7 * this.scaleFactor; // 7 makes the mop path look the same as on the Roborock app + ctx.lineCap = "round"; + ctx.strokeStyle = "rgba(255,255,255,0.2)"; + + mapdata.PATH.points.forEach((coord, index) => { + if (mapdata.MOP_PATH && mapdata.MOP_PATH[index + mopOffset] !== 0) { + if (mapdata.MOP_PATH[index - 1 + mopOffset] === 0) { + startX = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50); + startY = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50); + ctx.moveTo(startX, startY); + if (mapdata.MOP_PATH[index + mopOffset] !== 1) { + // see value 9 and 12 in mop_path both in front of charger + } + } else if (mapdata.MOP_PATH[index - 1 + mopOffset] === 1) { + ctx.moveTo(startX, startY); + ctx.lineTo(this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50), this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50)); + startX = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50); + startY = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50); + } + } else if (mapdata.MOP_PATH && mapdata.MOP_PATH[index + mopOffset] === 0) { + if (mapdata.MOP_PATH[index - 1 + mopOffset] !== 0) { + // do nothing ?? } - } else if (mapdata.MOP_PATH[index - 1 + mopOffset] === 1) { - ctx.moveTo(startX, startY); - ctx.lineTo(this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50), this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50)); - startX = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50); - startY = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50); - } - } else if (mapdata.MOP_PATH && mapdata.MOP_PATH[index + mopOffset] === 0) { - if (mapdata.MOP_PATH[index - 1 + mopOffset] !== 0) { - // do nothing ?? } - } - }); - ctx.stroke(); - ctx.closePath(); + }); + ctx.stroke(); + ctx.closePath(); + } } - } - // Male den Pfad - if (mapdata.PATH) { - if (mapdata.PATH.points && mapdata.PATH.points.length !== 0) { - ctx.fillStyle = colors.path; - let first = true; - let cold1, cold2; + // Male den Pfad + if (mapdata.PATH) { + if (mapdata.PATH.points && mapdata.PATH.points.length !== 0) { + ctx.fillStyle = colors.path; + let first = true; + let cold1, cold2; - ctx.beginPath(); - mapdata.PATH.points.forEach((coord) => { - if (first) { - (cold1 = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50)), - (cold2 = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50)), - ctx.fillRect(cold1, cold2, (1 * this.scaleFactor) / 2, (1 * this.scaleFactor) / 2); - first = false; - } else { - ctx.lineWidth = this.scaleFactor / 2; - ctx.strokeStyle = colors.path; + ctx.beginPath(); + mapdata.PATH.points.forEach((coord) => { + if (first) { + (cold1 = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50)), + (cold2 = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50)), + ctx.fillRect(cold1, cold2, (1 * this.scaleFactor) / 2, (1 * this.scaleFactor) / 2); + first = false; + } else { + ctx.lineWidth = this.scaleFactor / 2; + ctx.strokeStyle = colors.path; - ctx.moveTo(cold1, cold2); - (cold1 = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50)), (cold2 = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50)), ctx.lineTo(cold1, cold2); - // ctx.stroke(); - } - }); - ctx.stroke(); - ctx.closePath(); + ctx.moveTo(cold1, cold2); + (cold1 = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50)), (cold2 = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50)), ctx.lineTo(cold1, cold2); + // ctx.stroke(); + } + }); + ctx.stroke(); + ctx.closePath(); + } } - } - // Male geplanten Pfad - if (mapdata.GOTO_PREDICTED_PATH) { - if (mapdata.GOTO_PREDICTED_PATH.points && mapdata.GOTO_PREDICTED_PATH.points.length !== 0) { - let cold1, cold2; - ctx.lineWidth = (3 * this.scaleFactor) / 2; - ctx.strokeStyle = "rgba(255, 255, 255, 1)"; - ctx.setLineDash([3 * this.scaleFactor, 3 * this.scaleFactor]); - ctx.lineCap = "round"; - ctx.beginPath(); - mapdata.GOTO_PREDICTED_PATH.points.forEach((coord, index) => { - if (index === 0) { - cold1 = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50); - cold2 = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50); - ctx.fillStyle = "rgba(255, 255, 255, 1)"; - ctx.fillRect(cold1, cold2, (1 * this.scaleFactor) / 2, (1 * this.scaleFactor) / 2); - ctx.moveTo(cold1, cold2); - } else { - const newCold1 = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50); - const newCold2 = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50); - if (cold1 !== newCold1 || cold2 !== newCold2) { - ctx.lineTo(newCold1, newCold2); - cold1 = newCold1; - cold2 = newCold2; + // Male geplanten Pfad + if (mapdata.GOTO_PREDICTED_PATH) { + if (mapdata.GOTO_PREDICTED_PATH.points && mapdata.GOTO_PREDICTED_PATH.points.length !== 0) { + let cold1, cold2; + ctx.lineWidth = (3 * this.scaleFactor) / 2; + ctx.strokeStyle = "rgba(255, 255, 255, 1)"; + ctx.setLineDash([3 * this.scaleFactor, 3 * this.scaleFactor]); + ctx.lineCap = "round"; + ctx.beginPath(); + mapdata.GOTO_PREDICTED_PATH.points.forEach((coord, index) => { + if (index === 0) { + cold1 = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50); + cold2 = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50); + ctx.fillStyle = "rgba(255, 255, 255, 1)"; + ctx.fillRect(cold1, cold2, (1 * this.scaleFactor) / 2, (1 * this.scaleFactor) / 2); + ctx.moveTo(cold1, cold2); + } else { + const newCold1 = this.robotXtoPixelX(mapdata.IMAGE, coord[0] / 50); + const newCold2 = this.robotYtoPixelY(mapdata.IMAGE, coord[1] / 50); + if (cold1 !== newCold1 || cold2 !== newCold2) { + ctx.lineTo(newCold1, newCold2); + cold1 = newCold1; + cold2 = newCold2; + } } - } + }); + ctx.stroke(); + ctx.setLineDash([]); + ctx.lineCap = "butt"; + } + } + + if (mapdata.FORBIDDEN_ZONES) { + mapdata.FORBIDDEN_ZONES.forEach((zone) => { + const forbiddenMinX = Math.min(zone[0], zone[2], zone[4], zone[6]); + const forbiddenMinY = Math.min(zone[1], zone[3], zone[5], zone[7]); + const forbiddenMaxX = Math.max(zone[0], zone[2], zone[4], zone[6]); + const forbiddenMaxY = Math.max(zone[1], zone[3], zone[5], zone[7]); + + const forbiddenSizeX = forbiddenMaxX - forbiddenMinX; + const forbiddenSizeY = forbiddenMaxY - forbiddenMinY; + + ctx.fillStyle = "rgba(255, 0, 0, 0.5)"; + ctx.fillRect( + this.robotXtoPixelX(mapdata.IMAGE, forbiddenMinX / 50), + this.robotYtoPixelY(mapdata.IMAGE, forbiddenMaxY / 50), + (forbiddenSizeX / 50) * this.scaleFactor, + (forbiddenSizeY / 50) * this.scaleFactor + ); + ctx.lineWidth = (1 * this.scaleFactor) / 2; + ctx.strokeStyle = "rgba(255, 0, 0, 1)"; + ctx.strokeRect( + this.robotXtoPixelX(mapdata.IMAGE, forbiddenMinX / 50), + this.robotYtoPixelY(mapdata.IMAGE, forbiddenMaxY / 50), + (forbiddenSizeX / 50) * this.scaleFactor, + (forbiddenSizeY / 50) * this.scaleFactor + ); }); - ctx.stroke(); - ctx.setLineDash([]); - ctx.lineCap = "butt"; } - } - if (mapdata.FORBIDDEN_ZONES) { - mapdata.FORBIDDEN_ZONES.forEach((zone) => { - const forbiddenMinX = Math.min(zone[0], zone[2], zone[4], zone[6]); - const forbiddenMinY = Math.min(zone[1], zone[3], zone[5], zone[7]); - const forbiddenMaxX = Math.max(zone[0], zone[2], zone[4], zone[6]); - const forbiddenMaxY = Math.max(zone[1], zone[3], zone[5], zone[7]); - - const forbiddenSizeX = forbiddenMaxX - forbiddenMinX; - const forbiddenSizeY = forbiddenMaxY - forbiddenMinY; - - ctx.fillStyle = "rgba(255, 0, 0, 0.5)"; - ctx.fillRect( - this.robotXtoPixelX(mapdata.IMAGE, forbiddenMinX / 50), - this.robotYtoPixelY(mapdata.IMAGE, forbiddenMaxY / 50), - (forbiddenSizeX / 50) * this.scaleFactor, - (forbiddenSizeY / 50) * this.scaleFactor - ); - ctx.lineWidth = (1 * this.scaleFactor) / 2; - ctx.strokeStyle = "rgba(255, 0, 0, 1)"; - ctx.strokeRect( - this.robotXtoPixelX(mapdata.IMAGE, forbiddenMinX / 50), - this.robotYtoPixelY(mapdata.IMAGE, forbiddenMaxY / 50), - (forbiddenSizeX / 50) * this.scaleFactor, - (forbiddenSizeY / 50) * this.scaleFactor - ); - }); - } + if (mapdata.VIRTUAL_WALLS) { + mapdata.VIRTUAL_WALLS.forEach((wall) => { + const startX = this.robotXtoPixelX(mapdata.IMAGE, wall[0] / 50) + this.scaleFactor; + const startY = this.robotYtoPixelY(mapdata.IMAGE, wall[1] / 50) + this.scaleFactor; + const endX = this.robotXtoPixelX(mapdata.IMAGE, wall[2] / 50) + this.scaleFactor; + const endY = this.robotYtoPixelY(mapdata.IMAGE, wall[3] / 50) + this.scaleFactor; - if (mapdata.VIRTUAL_WALLS) { - mapdata.VIRTUAL_WALLS.forEach((wall) => { - const startX = this.robotXtoPixelX(mapdata.IMAGE, wall[0] / 50) + this.scaleFactor; - const startY = this.robotYtoPixelY(mapdata.IMAGE, wall[1] / 50) + this.scaleFactor; - const endX = this.robotXtoPixelX(mapdata.IMAGE, wall[2] / 50) + this.scaleFactor; - const endY = this.robotYtoPixelY(mapdata.IMAGE, wall[3] / 50) + this.scaleFactor; + // Calculate start end end of vector + let vecX = endX - startX; + let vecY = endY - startY; - // Calculate start end end of vector - let vecX = endX - startX; - let vecY = endY - startY; + // Normalize vector + const len = Math.sqrt(vecX * vecX + vecY * vecY); + vecX /= len; + vecY /= len; - // Normalize vector - const len = Math.sqrt(vecX * vecX + vecY * vecY); - vecX /= len; - vecY /= len; + // Line width + const lineWidth = 1 * this.scaleFactor; - // Line width - const lineWidth = 1 * this.scaleFactor; + // Adjust start and end of the line + const adjustedStartX = startX + vecX * (lineWidth / 2); + const adjustedStartY = startY + vecY * (lineWidth / 2); + const adjustedEndX = endX - vecX * (lineWidth / 2); + const adjustedEndY = endY - vecY * (lineWidth / 2); - // Adjust start and end of the line - const adjustedStartX = startX + vecX * (lineWidth / 2); - const adjustedStartY = startY + vecY * (lineWidth / 2); - const adjustedEndX = endX - vecX * (lineWidth / 2); - const adjustedEndY = endY - vecY * (lineWidth / 2); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = "rgba(255, 0, 0, 1)"; - ctx.lineWidth = lineWidth; - ctx.strokeStyle = "rgba(255, 0, 0, 1)"; + ctx.beginPath(); + ctx.moveTo(adjustedStartX, adjustedStartY); + ctx.lineTo(adjustedEndX, adjustedEndY); + ctx.stroke(); + }); + } - ctx.beginPath(); - ctx.moveTo(adjustedStartX, adjustedStartY); - ctx.lineTo(adjustedEndX, adjustedEndY); - ctx.stroke(); - }); - } + if (mapdata.NO_MOP_ZONE) { + mapdata.NO_MOP_ZONE.forEach((zone) => { + const noMopMinX = Math.min(zone[0], zone[2], zone[4], zone[6]); + const noMopMinY = Math.min(zone[1], zone[3], zone[5], zone[7]); + const noMopMaxX = Math.max(zone[0], zone[2], zone[4], zone[6]); + const noMopMaxY = Math.max(zone[1], zone[3], zone[5], zone[7]); - if (mapdata.NO_MOP_ZONE) { - mapdata.NO_MOP_ZONE.forEach((zone) => { - const noMopMinX = Math.min(zone[0], zone[2], zone[4], zone[6]); - const noMopMinY = Math.min(zone[1], zone[3], zone[5], zone[7]); - const noMopMaxX = Math.max(zone[0], zone[2], zone[4], zone[6]); - const noMopMaxY = Math.max(zone[1], zone[3], zone[5], zone[7]); - - const noMopSizeX = noMopMaxX - noMopMinX; - const noMopSizeY = noMopMaxY - noMopMinY; - - ctx.fillStyle = "rgba(0, 0, 255, 0.5)"; - ctx.fillRect( - this.robotXtoPixelX(mapdata.IMAGE, noMopMinX / 50), - this.robotYtoPixelY(mapdata.IMAGE, noMopMaxY / 50), - (noMopSizeX / 50) * this.scaleFactor, - (noMopSizeY / 50) * this.scaleFactor - ); - ctx.lineWidth = (1 * this.scaleFactor) / 2; - ctx.strokeStyle = "rgba(0, 0, 255, 1)"; - ctx.strokeRect( - this.robotXtoPixelX(mapdata.IMAGE, noMopMinX / 50), - this.robotYtoPixelY(mapdata.IMAGE, noMopMaxY / 50), - (noMopSizeX / 50) * this.scaleFactor, - (noMopSizeY / 50) * this.scaleFactor - ); - }); - } + const noMopSizeX = noMopMaxX - noMopMinX; + const noMopSizeY = noMopMaxY - noMopMinY; - if (mapdata.OBSTACLES2) { - mapdata.OBSTACLES2.forEach((obstacle) => { - const obstacleType = obstacle[2]; - const obstacleTitle = obstacleTitles[obstacleType] || "Unknown"; - const obstacleConfidence = Math.round(obstacle[3] / 100); - const obstacleText = obstacleTitle[obstacleType] ? obstacleTitle + "(" + obstacleConfidence + "%)" : obstacleTitle; + ctx.fillStyle = "rgba(0, 0, 255, 0.5)"; + ctx.fillRect( + this.robotXtoPixelX(mapdata.IMAGE, noMopMinX / 50), + this.robotYtoPixelY(mapdata.IMAGE, noMopMaxY / 50), + (noMopSizeX / 50) * this.scaleFactor, + (noMopSizeY / 50) * this.scaleFactor + ); + ctx.lineWidth = (1 * this.scaleFactor) / 2; + ctx.strokeStyle = "rgba(0, 0, 255, 1)"; + ctx.strokeRect( + this.robotXtoPixelX(mapdata.IMAGE, noMopMinX / 50), + this.robotYtoPixelY(mapdata.IMAGE, noMopMaxY / 50), + (noMopSizeX / 50) * this.scaleFactor, + (noMopSizeY / 50) * this.scaleFactor + ); + }); + } - const x = this.robotXtoPixelX(mapdata.IMAGE, obstacle[0] / 50); - const y = this.robotYtoPixelY(mapdata.IMAGE, obstacle[1] / 50); + if (mapdata.OBSTACLES2) { + mapdata.OBSTACLES2.forEach((obstacle) => { + const obstacleType = obstacle[2]; + const obstacleTitle = obstacleTitles[obstacleType] || "Unknown"; + const obstacleConfidence = Math.round(obstacle[3] / 100); + const obstacleText = obstacleTitle[obstacleType] ? obstacleTitle + "(" + obstacleConfidence + "%)" : obstacleTitle; - ctx.fillStyle = "red"; - ctx.beginPath(); - ctx.arc(x, y, 5, 0, 2 * Math.PI); - ctx.fill(); + const x = this.robotXtoPixelX(mapdata.IMAGE, obstacle[0] / 50); + const y = this.robotYtoPixelY(mapdata.IMAGE, obstacle[1] / 50); - // Set the text properties - ctx.font = "14px sans-serif"; - ctx.fillStyle = "white"; - ctx.textBaseline = "middle"; - ctx.textAlign = "center"; - - // Calculate the text width and height - const textWidth = ctx.measureText(obstacleText).width; - const textHeight = parseInt(ctx.font, 10); - - // Calculate the position and dimensions of the background rectangle - const padding = 5; - const borderRadius = 5; - const rectX = x - textWidth / 2 - padding; - const rectY = y + 5 + padding / 2; - const rectWidth = textWidth + 2 * padding; - const rectHeight = textHeight + padding; - - // Draw the background rectangle with rounded corners - ctx.fillStyle = "red"; - ctx.beginPath(); - ctx.moveTo(rectX + borderRadius, rectY); - ctx.lineTo(rectX + rectWidth - borderRadius, rectY); - ctx.quadraticCurveTo(rectX + rectWidth, rectY, rectX + rectWidth, rectY + borderRadius); - ctx.lineTo(rectX + rectWidth, rectY + rectHeight - borderRadius); - ctx.quadraticCurveTo(rectX + rectWidth, rectY + rectHeight, rectX + rectWidth - borderRadius, rectY + rectHeight); - ctx.lineTo(rectX + borderRadius, rectY + rectHeight); - ctx.quadraticCurveTo(rectX, rectY + rectHeight, rectX, rectY + rectHeight - borderRadius); - ctx.lineTo(rectX, rectY + borderRadius); - ctx.quadraticCurveTo(rectX, rectY, rectX + borderRadius, rectY); - ctx.closePath(); - ctx.fill(); + ctx.fillStyle = "red"; + ctx.beginPath(); + ctx.arc(x, y, 5, 0, 2 * Math.PI); + ctx.fill(); - // Draw the white text centered within the background rectangle - ctx.fillStyle = "white"; - ctx.fillText(obstacleText, x, y + 5 + padding + textHeight / 2); - }); - } + // Set the text properties + ctx.font = "14px sans-serif"; + ctx.fillStyle = "white"; + ctx.textBaseline = "middle"; + ctx.textAlign = "center"; - // Zeichne Ladestation wenn vorhanden - if (mapdata.CHARGER_LOCATION) { - if (mapdata.CHARGER_LOCATION.position[0] && mapdata.CHARGER_LOCATION.position[1]) { - ctx.beginPath(); - const img_charger_rotated = this.rotateCanvas(img_charger, mapdata.CHARGER_LOCATION.angle); - ctx.drawImage( - img_charger_rotated, - this.robotXtoPixelX(mapdata.IMAGE, mapdata.CHARGER_LOCATION.position[0] / 50) - img_charger_rotated.width / 2, - this.robotYtoPixelY(mapdata.IMAGE, mapdata.CHARGER_LOCATION.position[1] / 50) - img_charger_rotated.height / 2, - img_charger_rotated.width, - img_charger_rotated.height - ); + // Calculate the text width and height + const textWidth = ctx.measureText(obstacleText).width; + const textHeight = parseInt(ctx.font, 10); + + // Calculate the position and dimensions of the background rectangle + const padding = 5; + const borderRadius = 5; + const rectX = x - textWidth / 2 - padding; + const rectY = y + 5 + padding / 2; + const rectWidth = textWidth + 2 * padding; + const rectHeight = textHeight + padding; + + // Draw the background rectangle with rounded corners + ctx.fillStyle = "red"; + ctx.beginPath(); + ctx.moveTo(rectX + borderRadius, rectY); + ctx.lineTo(rectX + rectWidth - borderRadius, rectY); + ctx.quadraticCurveTo(rectX + rectWidth, rectY, rectX + rectWidth, rectY + borderRadius); + ctx.lineTo(rectX + rectWidth, rectY + rectHeight - borderRadius); + ctx.quadraticCurveTo(rectX + rectWidth, rectY + rectHeight, rectX + rectWidth - borderRadius, rectY + rectHeight); + ctx.lineTo(rectX + borderRadius, rectY + rectHeight); + ctx.quadraticCurveTo(rectX, rectY + rectHeight, rectX, rectY + rectHeight - borderRadius); + ctx.lineTo(rectX, rectY + borderRadius); + ctx.quadraticCurveTo(rectX, rectY, rectX + borderRadius, rectY); + ctx.closePath(); + ctx.fill(); + + // Draw the white text centered within the background rectangle + ctx.fillStyle = "white"; + ctx.fillText(obstacleText, x, y + 5 + padding + textHeight / 2); + }); } - } - // Zeichne Roboter - if (mapdata.ROBOT_POSITION) { - if (mapdata.PATH.current_angle && mapdata.ROBOT_POSITION[0] && mapdata.ROBOT_POSITION[1]) { - ctx.beginPath(); - const canvasImg = this.rotateCanvas(img, mapdata.PATH.current_angle); - ctx.drawImage( - canvasImg, - this.robotXtoPixelX(mapdata.IMAGE, mapdata.ROBOT_POSITION.position[0] / 50) - img.width / 4, - this.robotYtoPixelY(mapdata.IMAGE, mapdata.ROBOT_POSITION.position[1] / 50) - img.height / 4, - canvasImg.width / 2, - canvasImg.height / 2 - ); - } else { - const img_robot_rotated = this.rotateCanvas(img, mapdata.ROBOT_POSITION.angle); - ctx.drawImage( - img_robot_rotated, - this.robotXtoPixelX(mapdata.IMAGE, mapdata.ROBOT_POSITION.position[0] / 50) - img_robot_rotated.width / 4, - this.robotYtoPixelY(mapdata.IMAGE, mapdata.ROBOT_POSITION.position[1] / 50) - img_robot_rotated.height / 4, - img_robot_rotated.width / 2, - img_robot_rotated.height / 2 - ); + // Zeichne Ladestation wenn vorhanden + if (mapdata.CHARGER_LOCATION) { + if (mapdata.CHARGER_LOCATION.position[0] && mapdata.CHARGER_LOCATION.position[1]) { + ctx.beginPath(); + const img_charger_rotated = this.rotateCanvas(img_charger, mapdata.CHARGER_LOCATION.angle); + ctx.drawImage( + img_charger_rotated, + this.robotXtoPixelX(mapdata.IMAGE, mapdata.CHARGER_LOCATION.position[0] / 50) - img_charger_rotated.width / 2, + this.robotYtoPixelY(mapdata.IMAGE, mapdata.CHARGER_LOCATION.position[1] / 50) - img_charger_rotated.height / 2, + img_charger_rotated.width, + img_charger_rotated.height + ); + } + } + + // Zeichne Roboter + if (mapdata.ROBOT_POSITION) { + if (mapdata.PATH.current_angle && mapdata.ROBOT_POSITION[0] && mapdata.ROBOT_POSITION[1]) { + ctx.beginPath(); + const canvasImg = this.rotateCanvas(img, mapdata.PATH.current_angle); + ctx.drawImage( + canvasImg, + this.robotXtoPixelX(mapdata.IMAGE, mapdata.ROBOT_POSITION.position[0] / 50) - img.width / 4, + this.robotYtoPixelY(mapdata.IMAGE, mapdata.ROBOT_POSITION.position[1] / 50) - img.height / 4, + canvasImg.width / 2, + canvasImg.height / 2 + ); + } else { + const img_robot_rotated = this.rotateCanvas(img, mapdata.ROBOT_POSITION.angle); + ctx.drawImage( + img_robot_rotated, + this.robotXtoPixelX(mapdata.IMAGE, mapdata.ROBOT_POSITION.position[0] / 50) - img_robot_rotated.width / 4, + this.robotYtoPixelY(mapdata.IMAGE, mapdata.ROBOT_POSITION.position[1] / 50) - img_robot_rotated.height / 4, + img_robot_rotated.width / 2, + img_robot_rotated.height / 2 + ); + } } - } - // Zeichne Zielposition wenn vorhanden - if (mapdata.GOTO_TARGET) { - const go_to_pin_img = new Image(); - go_to_pin_img.src = go_to_pin; + // Zeichne Zielposition wenn vorhanden + if (mapdata.GOTO_TARGET) { + const go_to_pin_img = await loadImage(go_to_pin); - if (mapdata.GOTO_TARGET[0] && mapdata.GOTO_TARGET[1]) { - ctx.beginPath(); - ctx.drawImage( - go_to_pin_img, - this.robotXtoPixelX(mapdata.IMAGE, mapdata.GOTO_TARGET[0] / 50) - go_to_pin_img.width / 2, - this.robotYtoPixelY(mapdata.IMAGE, mapdata.GOTO_TARGET[1] / 50) - (go_to_pin_img.height + 6), - go_to_pin_img.width, - go_to_pin_img.height - ); + if (mapdata.GOTO_TARGET[0] && mapdata.GOTO_TARGET[1]) { + ctx.beginPath(); + ctx.drawImage( + go_to_pin_img, + this.robotXtoPixelX(mapdata.IMAGE, mapdata.GOTO_TARGET[0] / 50) - go_to_pin_img.width / 2, + this.robotYtoPixelY(mapdata.IMAGE, mapdata.GOTO_TARGET[1] / 50) - (go_to_pin_img.height + 6), + go_to_pin_img.width, + go_to_pin_img.height + ); + } } - } - // Draw room names with background - ctx.beginPath(); - Object.keys(segmentsData).forEach((segnum) => { - const segment = segmentsData[segnum]; + // Draw room names with background + ctx.beginPath(); + Object.keys(segmentsData).forEach((segnum) => { + const segment = segmentsData[segnum]; - let roomName = ""; + let roomName = ""; - if (typeof selectedMap != "undefined") { - // cannot get room name if map is from map history + if (typeof selectedMap != "undefined") { + // cannot get room name if map is from map history - for (const mappedRoom of mappedRooms) { - const segmentID = mappedRoom[0]; - const roomID = mappedRoom[1]; + for (const mappedRoom of mappedRooms) { + const segmentID = mappedRoom[0]; + const roomID = mappedRoom[1]; - if (segmentID == segnum) { - roomName = this.adapter.roomIDs[roomID]; - break; + if (segmentID == segnum) { + roomName = this.adapter.roomIDs[roomID]; + break; + } } - } - if (roomName != "") { - const centerX = segment.minX + (segment.maxX - segment.minX) / 2; - const centerY = segment.minY + (segment.maxY - segment.minY) / 2; - - ctx.font = "bold 16px Arial"; - const textWidth = ctx.measureText(roomName).width; - const textHeight = 16; - const padding = 10; - const backgroundWidth = textWidth + 2 * padding; - const backgroundHeight = textHeight + 2 * padding; - - // fake square for shadow - const imgdata = ctx.getImageData(centerX - backgroundWidth / 2, centerY - backgroundHeight / 2, backgroundWidth, backgroundHeight); - ctx.shadowOffsetX = 4; - ctx.shadowOffsetY = 4; - ctx.shadowBlur = 5; - ctx.shadowColor = "rgba(0, 0, 0, 0.5)"; - ctx.fillStyle = "rgba(0, 0, 0, 0)"; - ctx.fillRect(centerX - backgroundWidth / 2, centerY - backgroundHeight / 2, backgroundWidth, backgroundHeight); - ctx.putImageData(imgdata, centerX - backgroundWidth / 2, centerY - backgroundHeight / 2); - - // draw actual square over fake square to have a sharp shadow - ctx.shadowColor = "transparent"; - ctx.fillStyle = this.hexToRGBA(assignedColors[segnum], 0.75); - ctx.fillRect(centerX - backgroundWidth / 2, centerY - backgroundHeight / 2, backgroundWidth, backgroundHeight); - - ctx.fillStyle = "black"; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - ctx.fillText(roomName, centerX, centerY); + if (roomName != "") { + const centerX = segment.minX + (segment.maxX - segment.minX) / 2; + const centerY = segment.minY + (segment.maxY - segment.minY) / 2; + + ctx.font = "bold 16px Arial"; + const textWidth = ctx.measureText(roomName).width; + const textHeight = 16; + const padding = 10; + const backgroundWidth = textWidth + 2 * padding; + const backgroundHeight = textHeight + 2 * padding; + + // fake square for shadow + const imgdata = ctx.getImageData(centerX - backgroundWidth / 2, centerY - backgroundHeight / 2, backgroundWidth, backgroundHeight); + ctx.shadowOffsetX = 4; + ctx.shadowOffsetY = 4; + ctx.shadowBlur = 5; + ctx.shadowColor = "rgba(0, 0, 0, 0.5)"; + ctx.fillStyle = "rgba(0, 0, 0, 0)"; + ctx.fillRect(centerX - backgroundWidth / 2, centerY - backgroundHeight / 2, backgroundWidth, backgroundHeight); + ctx.putImageData(imgdata, centerX - backgroundWidth / 2, centerY - backgroundHeight / 2); + + // draw actual square over fake square to have a sharp shadow + ctx.shadowColor = "transparent"; + ctx.fillStyle = this.hexToRGBA(assignedColors[segnum], 0.75); + ctx.fillRect(centerX - backgroundWidth / 2, centerY - backgroundHeight / 2, backgroundWidth, backgroundHeight); + + ctx.fillStyle = "black"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(roomName, centerX, centerY); + } } - } - }); - ctx.closePath(); + }); + ctx.closePath(); - // crop image - const canvas_trimmed = createCanvas(maxleft - minleft + 2 * offset, maxtop - mintop + 2 * offset); - const ctx_trimmed = canvas_trimmed.getContext("2d"); - const trimmed = ctx.getImageData(minleft - offset, mintop - offset, maxleft - minleft + 2 * offset, maxtop - mintop + offset); + // crop image + const canvas_trimmed = createCanvas(maxleft - minleft + 2 * offset, maxtop - mintop + 2 * offset); + const ctx_trimmed = canvas_trimmed.getContext("2d"); + const trimmed = ctx.getImageData(minleft - offset, mintop - offset, maxleft - minleft + 2 * offset, maxtop - mintop + offset); - ctx_trimmed.putImageData(trimmed, 0, 0); + ctx_trimmed.putImageData(trimmed, 0, 0); + + return [canvas.toDataURL(), canvas_trimmed.toDataURL()]; + } else { + return [createCanvas(1, 1).toDataURL(), createCanvas(1, 1).toDataURL()]; // return empty canvas + } - return [canvas.toDataURL(), canvas_trimmed.toDataURL()]; } } diff --git a/lib/messageQueueHandler.js b/lib/messageQueueHandler.js index 249605ec3f..5430d4e5c3 100644 --- a/lib/messageQueueHandler.js +++ b/lib/messageQueueHandler.js @@ -39,7 +39,7 @@ class messageQueueHandler { this.adapter.log.debug(`Cloud connection not available. Not sending for method ${method} request!`); reject(); } - else if (!localConnectionState && !remoteConnection) { + else if (!localConnectionState && !remoteConnection && method != "get_network_info") { this.adapter.pendingRequests.delete(messageID); this.adapter.log.debug(`Adapter not connect locally to robot ${duid}. Not sending for method ${method} request!`); reject(); diff --git a/lib/vacuum.js b/lib/vacuum.js index fae5c2ec04..5c70edf5d4 100644 --- a/lib/vacuum.js +++ b/lib/vacuum.js @@ -81,7 +81,7 @@ class vacuum { const parsedData = await this.mapParser.parsedata(map); - const [mapBase64, mapBase64Truncated] = this.mapCreator.canvasMap(parsedData, duid, selectedMap, mappedRooms); + const [mapBase64, mapBase64Truncated] = await this.mapCreator.canvasMap(parsedData, duid, selectedMap, mappedRooms); await this.adapter.setStateAsync(`Devices.${duid}.map.mapData`, { val: JSON.stringify(parsedData), ack: true }); await this.adapter.setStateAsync(`Devices.${duid}.map.mapBase64`, { val: mapBase64, ack: true }); @@ -110,7 +110,7 @@ class vacuum { try { const cleaningRecordMap = await this.adapter.messageQueueHandler.sendRequest(duid, "get_clean_record_map", { start_time: startTime }, true); const parsedData = await this.mapParser.parsedata(cleaningRecordMap); - const [mapBase64, mapBase64Truncated] = this.mapCreator.canvasMap(parsedData, duid); + const [mapBase64, mapBase64Truncated] = await this.mapCreator.canvasMap(parsedData, duid); return { mapBase64: mapBase64, diff --git a/main.js b/main.js index d50e07a5f5..28ed104e02 100644 --- a/main.js +++ b/main.js @@ -308,7 +308,7 @@ class Roborock extends utils.Adapter { for (const device of devices) { const duid = device.duid; - const robotModel = this.getProductAttribute(duid); + const robotModel = this.getProductAttribute(duid, "model"); this.vacuums[duid].mainUpdateInterval = () => this.setInterval(this.updateDataMinimumData.bind(this), this.config.updateInterval * 1000, duid, this.vacuums[duid], robotModel); @@ -963,7 +963,7 @@ class Roborock extends utils.Adapter { const path = `Devices.${duid}.dockingStationStatus.${state}`; const name = this.translations[state]; - this.setObjectNotExistsAsync(path, { + await this.setObjectNotExistsAsync(path, { type: "state", common: { name: name, @@ -1325,23 +1325,38 @@ class Roborock extends utils.Adapter { try { const params = JSON.parse(state.val); - const isCorrectLength = - (command === "app_zoned_clean" && (params.length === 4 || params.length === 5)) || (command === "app_goto_target" && params.length === 2); - - const areAllNumbers = params.every((item) => typeof item === "number"); - - const isValidFifth = params.length !== 5 || (params[4] >= 1 && params[4] <= 3); - - if (isCorrectLength && areAllNumbers && isValidFifth) { - this.vacuums[duid].command(duid, command, params); - } else { - let expectedFormat = "[x1, y1, x2, y2]"; - if (command === "app_zoned_clean") { - expectedFormat += " or [x1, y1, x2, y2, repeat] (where repeat is between 1 and 3)"; - } else if (command === "app_goto_target") { - expectedFormat = "[x, y]"; + if (command === "app_zoned_clean") { + // Check if params is an array and contains multiple arrays + if (Array.isArray(params) && params.every(Array.isArray)) { + const allZonesValid = params.every((zone) => { + const isCorrectLength = zone.length === 4 || zone.length === 5; + const areAllNumbers = zone.every((item) => typeof item === "number"); + const isValidFifth = zone.length !== 5 || (zone[4] >= 1 && zone[4] <= 3); + return isCorrectLength && areAllNumbers && isValidFifth; + }); + + if (allZonesValid) { + this.vacuums[duid].command(duid, command, params); + } else { + this.log.error( + `Invalid command parameters for ${command}: ${state.val}. Expected format: [[x1, y1, x2, y2, repeat], [x1, y1, x2, y2, repeat], ...] (where repeat is between 1 and 3)` + ); + } + } else { + this.log.error( + `Invalid command parameters for ${command}: ${state.val}. Expected format: [[x1, y1, x2, y2, repeat], [x1, y1, x2, y2, repeat], ...] (where repeat is between 1 and 3)` + ); + } + } else if (command === "app_goto_target") { + // For app_goto_target, params should be an array with exactly two numbers + const isCorrectLength = params.length === 2; + const areAllNumbers = params.every((item) => typeof item === "number"); + + if (isCorrectLength && areAllNumbers) { + this.vacuums[duid].command(duid, command, params); + } else { + this.log.error(`Invalid command parameters for ${command}: ${state.val}. Expected format: [x, y]`); } - this.log.error(`Invalid command parameters for ${command}: ${state.val}. Expected format: ${expectedFormat}`); } } catch (error) { this.log.error(`Error parsing JSON for ${command}: ${error}`); diff --git a/package-lock.json b/package-lock.json index be2875087e..bd75df7f2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,12 +12,12 @@ "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.7.0", "@iobroker/adapter-core": "^3.1.6", - "@sentry/node": "^8.32.0", + "@napi-rs/canvas": "^0.1.56", + "@sentry/node": "^8.21.0", "@sentry/tracing": "^7.114.0", "@tsconfig/node18": "^18.2.4", "axios": "^1.7.7", "binary-parser": "^2.2.1", - "canvas": "^3.0.0-rc2", "crc-32": "^1.2.2", "esbuild": "^0.23.0", "eventemitter2": "^6.4.9", @@ -29,6 +29,8 @@ "mqtt": "^5.9.0", "npmlog": "^7.0.1", "rimraf": "^6.0.1", + "sinon": "^9.2.4", + "sinon-chai": "^3.5.0", "ws": "^8.18.0" }, "devDependencies": { @@ -41,19 +43,17 @@ "@types/chai": "^4.3.19", "@types/chai-as-promised": "^7.1.8", "@types/mocha": "^10.0.7", - "@types/node": "^22.7.4", + "@types/node": "^20.14.10", "@types/proxyquire": "^1.3.31", "@types/sinon": "^17.0.3", "@types/sinon-chai": "^3.2.12", "@types/ws": "^8.5.12", - "chai": "^5.1.1", + "chai": "^4.3.4", "chai-as-promised": "^8.0.0", "eslint": "^9.9.1", - "mocha": "^10.6.0", + "mocha": "^10.7.0", "proxyquire": "^2.1.3", - "sinon": "^18.0.0", - "sinon-chai": "^4.0.0", - "typescript": "~5.6.2" + "typescript": "~5.5.4" }, "engines": { "node": ">= 20" @@ -1460,15 +1460,6 @@ "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@iobroker/testing/node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/@iobroker/testing/node_modules/chai": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", @@ -1560,15 +1551,6 @@ "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", "dev": true }, - "node_modules/@iobroker/testing/node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/@iobroker/testing/node_modules/sinon": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", @@ -1708,6 +1690,170 @@ "node": ">=v12.0.0" } }, + "node_modules/@napi-rs/canvas": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.56.tgz", + "integrity": "sha512-SujSchzG6lLc/wT+Mwxam/w30Kk2sFTiU6bLFcidecKSmlhenAhGMQhZh2iGFfKoh2+8iit0jrt99n6TqReICQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@napi-rs/canvas-android-arm64": "0.1.56", + "@napi-rs/canvas-darwin-arm64": "0.1.56", + "@napi-rs/canvas-darwin-x64": "0.1.56", + "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.56", + "@napi-rs/canvas-linux-arm64-gnu": "0.1.56", + "@napi-rs/canvas-linux-arm64-musl": "0.1.56", + "@napi-rs/canvas-linux-x64-gnu": "0.1.56", + "@napi-rs/canvas-linux-x64-musl": "0.1.56", + "@napi-rs/canvas-win32-x64-msvc": "0.1.56" + } + }, + "node_modules/@napi-rs/canvas-android-arm64": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.56.tgz", + "integrity": "sha512-xBGqW2RZMAupkzar9t3gpbok9r524f3Wlk4PG2qnQdxbsiEND06OB8VxVtTcql6R02uJpXJGnyIhN02Te+GMVQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-darwin-arm64": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.56.tgz", + "integrity": "sha512-Pvuz6Ib9YZTB5MlGL9WSu9a2asUC0DZ1zBHozDiBXr/6Zurs9l/ZH5NxFYTM829BpkdkO8kuI8b8Rz7ek30zzQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-darwin-x64": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.56.tgz", + "integrity": "sha512-O393jWt7G6rg0X1ralbsbBeskSG0iwlkD7mEHhMLJxqRqe+eQn0/xnwhs9l6dUNFC+5dM8LOvfFca4o9Vs2Vww==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.56.tgz", + "integrity": "sha512-30NFb5lrF3YEwAO5XuATxpWDSXaBAgaFVswPJ+hYcAUyE3IkPPIFRY4ijQEh4frcSBvrzFGGYdNSoC18oLLWaQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-arm64-gnu": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.56.tgz", + "integrity": "sha512-ODbWH9TLvba+39UxFwPn2Hm1ImALmWOZ0pEv5do/pz0439326Oz49hlfGot4KmkSBeKK81knWxRj9EXMSPwXPg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-arm64-musl": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.56.tgz", + "integrity": "sha512-zqE4nz8CWiJJ0q5By7q9CDPicNkc0oyErgavK3ZV279zJL7Aapd3cIqayT6ynECArg7GgBl2WYSvr5AaRFmYgg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-gnu": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.56.tgz", + "integrity": "sha512-JTnGAtJBQMhfSpN8/rbMnf5oxuO/juUNa0n4LA0LlW0JS9UBpmsS2BwFNCakFqOeAPaqIM6sFFsK3M4hve+Esw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-musl": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.56.tgz", + "integrity": "sha512-mpws7DhVDIj8ZKa/qcnUVLAm0fxD9RK5ojfNNSI9TOzn2E0f+GUXx8sGsCxDpMVMtN+mtyrMwRqH3F3rTUMWXw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-win32-x64-msvc": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.56.tgz", + "integrity": "sha512-VKAAkgXF+lbFvRFawPOtkfV/P7ogAgWTu5FMCIiBn0Gc3vnkKFG2cLo/IHIJ7FuriToKEidkJGT88iAh7W7GDA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1872,9 +2018,9 @@ } }, "node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", + "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", "dependencies": { "@opentelemetry/api": "^1.0.0" }, @@ -1894,11 +2040,11 @@ } }, "node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { "node": ">=14" @@ -1908,12 +2054,12 @@ } }, "node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", + "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", + "@opentelemetry/api-logs": "0.52.1", + "@types/shimmer": "^1.0.2", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", @@ -1926,30 +2072,14 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-amqplib": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.42.0.tgz", - "integrity": "sha512-fiuU6OKsqHJiydHWgTRQ7MnIrJ2lEqsdgFtNIH4LbAUJl/5XmrIeoDzDnox+hfkgWK65jsleFuQDtYb5hW1koQ==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.39.0.tgz", - "integrity": "sha512-pGBiKevLq7NNglMgqzmeKczF4XQMTOUOTkK8afRHMZMnrK3fcETyTH7lVaSozwiOM3Ws+SuEmXZT7DYrrhxGlg==", + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.38.0.tgz", + "integrity": "sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", "@types/connect": "3.4.36" }, "engines": { @@ -1959,28 +2089,14 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.12.0.tgz", - "integrity": "sha512-pnPxatoFE0OXIZDQhL2okF//dmbiWFzcSc8pUg9TqofCLYZySSxDCgQc69CJBo5JnI3Gz1KP+mOjS4WAeRIH4g==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.42.0.tgz", - "integrity": "sha512-YNcy7ZfGnLsVEqGXQPT+S0G1AE46N21ORY7i7yUQyfhGAL4RBjnZUqefMI0NwqIl6nGbr1IpF0rZGoN8Q7x12Q==", + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.41.1.tgz", + "integrity": "sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" }, "engines": { "node": ">=14" @@ -1990,42 +2106,13 @@ } }, "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.39.0.tgz", - "integrity": "sha512-SS9uSlKcsWZabhBp2szErkeuuBDgxOUlllwkS92dVaWRnMmwysPhcEgHKB8rUe3BHg/GnZC1eo1hbTZv4YhfoA==", + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.38.0.tgz", + "integrity": "sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.15.0.tgz", - "integrity": "sha512-JWVKdNLpu1skqZQA//jKOcKdJC66TWKqa2FUFq70rKohvaSq47pmXlnabNO+B/BvLfmidfiaN35XakT5RyMl2Q==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-generic-pool": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.39.0.tgz", - "integrity": "sha512-y4v8Y+tSfRB3NNBvHjbjrn7rX/7sdARG7FuK6zR8PGb28CTa0kHpEGCJqvL9L8xkTNvTXo+lM36ajFGUaK1aNw==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" }, "engines": { "node": ">=14" @@ -2035,11 +2122,11 @@ } }, "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.43.0.tgz", - "integrity": "sha512-aI3YMmC2McGd8KW5du1a2gBA0iOMOGLqg4s9YjzwbjFwjlmMNFSK1P3AIg374GWg823RPUGfVTIgZ/juk9CVOA==", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.42.0.tgz", + "integrity": "sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.52.0" }, "engines": { "node": ">=14" @@ -2049,13 +2136,13 @@ } }, "node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.41.0.tgz", - "integrity": "sha512-jKDrxPNXDByPlYcMdZjNPYCvw0SQJjN+B1A+QH+sx+sAHsKSAf9hwFiJSrI6C4XdOls43V/f/fkp9ITkHhKFbQ==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.40.0.tgz", + "integrity": "sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" }, "engines": { "node": ">=14" @@ -2065,13 +2152,13 @@ } }, "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.53.0.tgz", - "integrity": "sha512-H74ErMeDuZfj7KgYCTOFGWF5W9AfaPnqLQQxeFq85+D29wwV2yqHbz2IKLYpkOh7EI6QwDEl7rZCIxjJLyc/CQ==", + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", + "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/instrumentation": "0.53.0", - "@opentelemetry/semantic-conventions": "1.27.0", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1", "semver": "^7.5.2" }, "engines": { @@ -2082,28 +2169,13 @@ } }, "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.43.0.tgz", - "integrity": "sha512-i3Dke/LdhZbiUAEImmRG3i7Dimm/BD7t8pDDzwepSvIQ6s2X6FPia7561gw+64w+nx0+G9X14D7rEfaMEmmjig==", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.42.0.tgz", + "integrity": "sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.52.0", "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.3.0.tgz", - "integrity": "sha512-UnkZueYK1ise8FXQeKlpBd7YYUtC7mM8J0wzUSccEfc/G8UqHQqAzIyYCUOUPUKp8GsjLnWOOK/3hJc4owb7Jg==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/semantic-conventions": "^1.23.0" }, "engines": { "node": ">=14" @@ -2113,13 +2185,13 @@ } }, "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.43.0.tgz", - "integrity": "sha512-lDAhSnmoTIN6ELKmLJBplXzT/Jqs5jGZehuG22EdSMaTwgjMpxMDI1YtlKEhiWPWkrz5LUsd0aOO0ZRc9vn3AQ==", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.42.0.tgz", + "integrity": "sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" }, "engines": { "node": ">=14" @@ -2129,13 +2201,13 @@ } }, "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.47.0.tgz", - "integrity": "sha512-yqyXRx2SulEURjgOQyJzhCECSh5i1uM49NUaq9TqLd6fA7g26OahyJfsr9NE38HFqGRHpi4loyrnfYGdrsoVjQ==", + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.46.0.tgz", + "integrity": "sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.52.0", "@opentelemetry/sdk-metrics": "^1.9.1", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/semantic-conventions": "^1.22.0" }, "engines": { "node": ">=14" @@ -2145,13 +2217,13 @@ } }, "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.42.0.tgz", - "integrity": "sha512-AnWv+RaR86uG3qNEMwt3plKX1ueRM7AspfszJYVkvkehiicC3bHQA6vWdb6Zvy5HAE14RyFbu9+2hUUjR2NSyg==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.40.0.tgz", + "integrity": "sha512-niRi5ZUnkgzRhIGMOozTyoZIvJKNJyhijQI4nF4iFSb+FUx2v5fngfR+8XLmdQAO7xmsD8E5vEGdDVYVtKbZew==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" }, "engines": { "node": ">=14" @@ -2161,13 +2233,13 @@ } }, "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.41.0.tgz", - "integrity": "sha512-jnvrV6BsQWyHS2qb2fkfbfSb1R/lmYwqEZITwufuRl37apTopswu9izc0b1CYRp/34tUG/4k/V39PND6eyiNvw==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.40.0.tgz", + "integrity": "sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/mysql": "2.15.26" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/mysql": "2.15.22" }, "engines": { "node": ">=14" @@ -2177,12 +2249,12 @@ } }, "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz", - "integrity": "sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.40.0.tgz", + "integrity": "sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", "@opentelemetry/sql-common": "^0.40.1" }, "engines": { @@ -2193,12 +2265,12 @@ } }, "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.40.0.tgz", - "integrity": "sha512-WF1hCUed07vKmf5BzEkL0wSPinqJgH7kGzOjjMAiTGacofNXjb/y4KQ8loj2sNsh5C/NN7s1zxQuCgbWbVTGKg==", + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.39.0.tgz", + "integrity": "sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.23.0" }, "engines": { "node": ">=14" @@ -2208,15 +2280,15 @@ } }, "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.44.0.tgz", - "integrity": "sha512-oTWVyzKqXud1BYEGX1loo2o4k4vaU1elr3vPO8NZolrBtFvQ34nx4HgUaexUDuEog00qQt+MLR5gws/p+JXMLQ==", + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.43.0.tgz", + "integrity": "sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", "@opentelemetry/sql-common": "^0.40.1", "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.6" + "@types/pg-pool": "2.0.4" }, "engines": { "node": ">=14" @@ -2226,13 +2298,13 @@ } }, "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.42.0.tgz", - "integrity": "sha512-NaD+t2JNcOzX/Qa7kMy68JbmoVIV37fT/fJYzLKu2Wwd+0NCxt+K2OOsOakA8GVg8lSpFdbx4V/suzZZ2Pvdjg==", + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.41.0.tgz", + "integrity": "sha512-H7IfGTqW2reLXqput4yzAe8YpDC0fmVNal95GHMLOrS89W+qWUKIqxolSh63hJyfmwPSFwXASzj7wpSk8Az+Dg==", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.52.0", "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/semantic-conventions": "^1.22.0" }, "engines": { "node": ">=14" @@ -2241,21 +2313,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-undici": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.6.0.tgz", - "integrity": "sha512-ABJBhm5OdhGmbh0S/fOTE4N69IZ00CsHC5ijMYfzbw3E5NwLgpQk5xsljaECrJ8wz1SfXbO03FiSuu5AyRAkvQ==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.7.0" - } - }, "node_modules/@opentelemetry/redis-common": { "version": "0.36.2", "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", @@ -2265,12 +2322,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", + "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { "node": ">=14" @@ -2280,12 +2337,13 @@ } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.26.0.tgz", - "integrity": "sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", + "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "lodash.merge": "^4.6.2" }, "engines": { "node": ">=14" @@ -2295,13 +2353,13 @@ } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { "node": ">=14" @@ -2311,9 +2369,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", "engines": { "node": ">=14" } @@ -2342,45 +2400,15 @@ } }, "node_modules/@prisma/instrumentation": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.19.1.tgz", - "integrity": "sha512-VLnzMQq7CWroL5AeaW0Py2huiNKeoMfCH3SUxstdzPrlWQi6UQ9UrfcbUkNHlVFqOMacqy8X/8YtE0kuKDpD9w==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.17.0.tgz", + "integrity": "sha512-c1Sle4ji8aasMcYfBBHFM56We4ljfenVtRmS8aY06BllS7SoU6SmJBwG7vil+GHiR0Yrh+t9iBwt4AY0Jr4KNQ==", "dependencies": { "@opentelemetry/api": "^1.8", "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51 || ^0.52.0", "@opentelemetry/sdk-trace-base": "^1.22" } }, - "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/api-logs": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", - "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/instrumentation": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", - "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -2496,69 +2524,66 @@ } }, "node_modules/@sentry/core": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.32.0.tgz", - "integrity": "sha512-+xidTr0lZ0c755tq4k75dXPEb8PA+qvIefW3U9+dQMORLokBrYoKYMf5zZTG2k/OfSJS6OSxatUj36NFuCs3aA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.21.0.tgz", + "integrity": "sha512-1eW0HKxpBz23oWR3yshl7kVpoJSq1DtqnSIRK3JkV72ytO+UD5sbGQ2iCzmXrefJHP555EOrui2eMm+akq2sDA==", "dependencies": { - "@sentry/types": "8.32.0", - "@sentry/utils": "8.32.0" + "@sentry/types": "8.21.0", + "@sentry/utils": "8.21.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/node": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.32.0.tgz", - "integrity": "sha512-a2PoFA9j/HmJVGF/zXJhLP6QhRHGye/2EznQdHOELsH1BkeMgBaXl7D52r2E/b7qki647lXrdbspB6jid8NycA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.21.0.tgz", + "integrity": "sha512-AIgRIAqkyIIvaDCO0HS7EsGYRfMra8rcTwmSS6kbJsi5Xo9LLSz7mAq5zUZ/YaqRz0Sn54P+JxryJgB6pZj0NA==", "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.25.1", "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/instrumentation-amqplib": "^0.42.0", - "@opentelemetry/instrumentation-connect": "0.39.0", - "@opentelemetry/instrumentation-dataloader": "0.12.0", - "@opentelemetry/instrumentation-express": "0.42.0", - "@opentelemetry/instrumentation-fastify": "0.39.0", - "@opentelemetry/instrumentation-fs": "0.15.0", - "@opentelemetry/instrumentation-generic-pool": "0.39.0", - "@opentelemetry/instrumentation-graphql": "0.43.0", - "@opentelemetry/instrumentation-hapi": "0.41.0", - "@opentelemetry/instrumentation-http": "0.53.0", - "@opentelemetry/instrumentation-ioredis": "0.43.0", - "@opentelemetry/instrumentation-kafkajs": "0.3.0", - "@opentelemetry/instrumentation-koa": "0.43.0", - "@opentelemetry/instrumentation-mongodb": "0.47.0", - "@opentelemetry/instrumentation-mongoose": "0.42.0", - "@opentelemetry/instrumentation-mysql": "0.41.0", - "@opentelemetry/instrumentation-mysql2": "0.41.0", - "@opentelemetry/instrumentation-nestjs-core": "0.40.0", - "@opentelemetry/instrumentation-pg": "0.44.0", - "@opentelemetry/instrumentation-redis-4": "0.42.0", - "@opentelemetry/instrumentation-undici": "0.6.0", - "@opentelemetry/resources": "^1.26.0", - "@opentelemetry/sdk-trace-base": "^1.26.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@prisma/instrumentation": "5.19.1", - "@sentry/core": "8.32.0", - "@sentry/opentelemetry": "8.32.0", - "@sentry/types": "8.32.0", - "@sentry/utils": "8.32.0", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.38.0", + "@opentelemetry/instrumentation-express": "0.41.1", + "@opentelemetry/instrumentation-fastify": "0.38.0", + "@opentelemetry/instrumentation-graphql": "0.42.0", + "@opentelemetry/instrumentation-hapi": "0.40.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.42.0", + "@opentelemetry/instrumentation-koa": "0.42.0", + "@opentelemetry/instrumentation-mongodb": "0.46.0", + "@opentelemetry/instrumentation-mongoose": "0.40.0", + "@opentelemetry/instrumentation-mysql": "0.40.0", + "@opentelemetry/instrumentation-mysql2": "0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "0.39.0", + "@opentelemetry/instrumentation-pg": "0.43.0", + "@opentelemetry/instrumentation-redis-4": "0.41.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.17.0", + "@sentry/core": "8.21.0", + "@sentry/opentelemetry": "8.21.0", + "@sentry/types": "8.21.0", + "@sentry/utils": "8.21.0", "import-in-the-middle": "^1.11.0" }, "engines": { "node": ">=14.18" + }, + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.3" } }, "node_modules/@sentry/opentelemetry": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.32.0.tgz", - "integrity": "sha512-YCD8EnwJJ2ab3zWWtu5VrvHP/6Ss6GGQH0TYx2cfeGG3c0wTA/5zYx9JR4i3hUtOh1pifN34HlY0yyQHD4yctg==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.21.0.tgz", + "integrity": "sha512-EDaHt1GSayCEMcRonYm+J/qf6HH+aZxoTeWxd27xlqUwIcALTo5OdGSk/JpJLQKlJO1WcxWzrpY8HWoZWwhdZw==", "dependencies": { - "@sentry/core": "8.32.0", - "@sentry/types": "8.32.0", - "@sentry/utils": "8.32.0" + "@sentry/core": "8.21.0", + "@sentry/types": "8.21.0", + "@sentry/utils": "8.21.0" }, "engines": { "node": ">=14.18" @@ -2566,9 +2591,9 @@ "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/sdk-trace-base": "^1.26.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1" } }, "node_modules/@sentry/tracing": { @@ -2583,19 +2608,19 @@ } }, "node_modules/@sentry/types": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.32.0.tgz", - "integrity": "sha512-hxckvN2MzS5SgGDgVQ0/QpZXk13Vrq4BtZLwXhPhyeTmZtUiUfWvcL5TFQqLinfKdTKPe9q2MxeAJ0D4LalhMg==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.21.0.tgz", + "integrity": "sha512-2hF7lhDCGBN8VkIkHTuh9pL3QnJ3QBkIDAcKosFCS5tHGp68zGJgE0VWg2yQvqjZM06DnFT9CUKF9ZGv45FS3w==", "engines": { "node": ">=14.18" } }, "node_modules/@sentry/utils": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.32.0.tgz", - "integrity": "sha512-t1WVERhgmYURxbBj9J4/H2P2X+VKqm7B3ce9iQyrZbdf5NekhcU4jHIecPUWCPHjQkFIqkVTorqeBmDTlg/UmQ==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.21.0.tgz", + "integrity": "sha512-Evq5goV8CKLISuULenqJm8VyIYaKa6wDAYIHfcDmSyCJIEDlEpRb8S7LcKdYsf6h0FdGy9ofv5ksgMPCqYq7eg==", "dependencies": { - "@sentry/types": "8.32.0" + "@sentry/types": "8.21.0" }, "engines": { "node": ">=14.18" @@ -2611,12 +2636,21 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", - "dev": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" } }, "node_modules/@sinonjs/samsam": { @@ -2642,8 +2676,7 @@ "node_modules/@sinonjs/text-encoding": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==" }, "node_modules/@tootallnate/once": { "version": "2.0.0", @@ -2738,19 +2771,19 @@ "dev": true }, "node_modules/@types/mysql": { - "version": "2.15.26", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", - "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { - "version": "22.7.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", - "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~5.26.4" } }, "node_modules/@types/pg": { @@ -2764,9 +2797,9 @@ } }, "node_modules/@types/pg-pool": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", - "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", + "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", "dependencies": { "@types/pg": "*" } @@ -2873,6 +2906,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "optional": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-import-attributes": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", @@ -3036,12 +3078,12 @@ } }, "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "license": "MIT", "engines": { - "node": ">=12" + "node": "*" } }, "node_modules/asynckit": { @@ -3329,21 +3371,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/canvas": { - "version": "3.0.0-rc2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.0.0-rc2.tgz", - "integrity": "sha512-esx4bYDznnqgRX4G8kaEaf0W3q8xIc51WpmrIitDzmcoEgwnv9wSKdzT6UxWZ4wkVu5+ileofppX0TpyviJRdQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1", - "simple-get": "^3.0.3" - }, - "engines": { - "node": "^18.12.0 || >= 20.9.0" - } - }, "node_modules/catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", @@ -3357,19 +3384,20 @@ } }, "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dev": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "license": "MIT", "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" }, "engines": { - "node": ">=12" + "node": ">=4" } }, "node_modules/chai-as-promised": { @@ -3384,6 +3412,18 @@ "chai": ">= 2.1.2 < 6" } }, + "node_modules/chai/node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3445,16 +3485,10 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, "node_modules/cliui": { "version": "8.0.1", @@ -3801,21 +3835,15 @@ } }, "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, "engines": { - "node": ">=4.0.0" + "node": ">=0.12" } }, "node_modules/deep-is": { @@ -3872,19 +3900,10 @@ "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { - "node": ">=8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/diff": { @@ -4612,15 +4631,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, "node_modules/express": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", @@ -5146,7 +5156,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, "engines": { "node": "*" } @@ -5181,12 +5190,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, "node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -5579,7 +5582,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -5807,9 +5809,9 @@ } }, "node_modules/import-in-the-middle": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz", - "integrity": "sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.0.tgz", + "integrity": "sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==", "dependencies": { "acorn": "^8.8.2", "acorn-import-attributes": "^1.9.5", @@ -5842,12 +5844,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/into-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", @@ -6269,14 +6265,12 @@ "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -6300,15 +6294,6 @@ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", "dev": true }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6492,17 +6477,12 @@ "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, "node_modules/mocha": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz", - "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.0.tgz", + "integrity": "sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", @@ -6682,12 +6662,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "license": "MIT" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6703,42 +6677,48 @@ } }, "node_modules/nise": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", - "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", + "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", + "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/text-encoding": "^0.7.2", - "just-extend": "^6.2.0", - "path-to-regexp": "^6.2.1" + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" } }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true - }, - "node_modules/node-abi": { - "version": "3.68.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", - "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", - "license": "MIT", + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "license": "BSD-3-Clause", "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" + "type-detect": "4.0.8" } }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "node_modules/nise/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/nise/node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "license": "MIT" }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -6874,6 +6854,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/opentelemetry-instrumentation-fetch-node": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/opentelemetry-instrumentation-fetch-node/-/opentelemetry-instrumentation-fetch-node-1.2.3.tgz", + "integrity": "sha512-Qb11T7KvoCevMaSeuamcLsAD+pZnavkhDnlVL0kRozfhl42dKG5Q3anUklAFKJZjY3twLR+BnRa6DlwwkIE/+A==", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.46.0", + "@opentelemetry/semantic-conventions": "^1.17.0" + }, + "engines": { + "node": ">18.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.6.0" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.46.0.tgz", + "integrity": "sha512-a9TijXZZbk0vI5TGLZl+0kxyFfrXHhX6Svtz7Pp2/VBlCSKrazuULEyoJQrOknJyFWNMEmbbJgOciHCCpQcisw==", + "optional": true, + "dependencies": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/import-in-the-middle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", + "optional": true, + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -7042,12 +7069,12 @@ "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "license": "MIT", "engines": { - "node": ">= 14.16" + "node": "*" } }, "node_modules/pend": { @@ -7064,9 +7091,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", - "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" }, "node_modules/pg-types": { "version": "2.2.0", @@ -7163,57 +7190,6 @@ "node": ">=0.10.0" } }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7486,30 +7462,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -7555,13 +7507,13 @@ } }, "node_modules/require-in-the-middle": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz", - "integrity": "sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz", + "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==", "dependencies": { - "debug": "^4.3.5", + "debug": "^4.1.1", "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" + "resolve": "^1.22.1" }, "engines": { "node": ">=8.6.0" @@ -7923,69 +7875,19 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/simple-get/node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/sinon": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", - "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", - "dev": true, + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", + "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", + "deprecated": "16.1.1", + "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^3.0.1", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/samsam": "^8.0.0", - "diff": "^5.2.0", - "nise": "^6.0.0", - "supports-color": "^7" + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/samsam": "^5.3.1", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" }, "funding": { "type": "opencollective", @@ -7993,13 +7895,42 @@ } }, "node_modules/sinon-chai": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-4.0.0.tgz", - "integrity": "sha512-cWqO7O2I4XfJDWyWElAQ9D/dtdh5Mo0RHndsfiiYyjWnlPzBJdIvjCVURO4EjyYaC3BjV+ISNXCfTXPXTEIEWA==", - "dev": true, + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.5.0.tgz", + "integrity": "sha512-IifbusYiQBpUxxFJkR3wTU68xzBN0+bxCScEaKMjBvAQERg6FnTTc1F17rseLb1tjmkJ23730AXpFI0c47FgAg==", + "license": "(BSD-2-Clause OR WTFPL)", "peerDependencies": { - "chai": "^5.0.0", - "sinon": ">=4.0.0" + "chai": "^4.0.0", + "sinon": ">=4.0.0 <10.0.0" + } + }, + "node_modules/sinon/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/sinon/node_modules/@sinonjs/samsam": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, "node_modules/sort-keys": { @@ -8197,7 +8128,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8216,69 +8146,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar-fs/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/tar-fs/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", @@ -8440,18 +8307,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8468,7 +8323,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, "engines": { "node": ">=4" } @@ -8503,9 +8357,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8572,9 +8426,9 @@ "dev": true }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/universal-user-agent": { "version": "6.0.1", diff --git a/package.json b/package.json index f38203fde9..13d6daa8dc 100644 --- a/package.json +++ b/package.json @@ -26,12 +26,12 @@ "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.7.0", "@iobroker/adapter-core": "^3.1.6", - "@sentry/node": "^8.32.0", + "@napi-rs/canvas": "^0.1.56", + "@sentry/node": "^8.21.0", "@sentry/tracing": "^7.114.0", "@tsconfig/node18": "^18.2.4", "axios": "^1.7.7", "binary-parser": "^2.2.1", - "canvas": "^3.0.0-rc2", "crc-32": "^1.2.2", "esbuild": "^0.23.0", "eventemitter2": "^6.4.9", @@ -43,6 +43,8 @@ "mqtt": "^5.9.0", "npmlog": "^7.0.1", "rimraf": "^6.0.1", + "sinon": "^9.2.4", + "sinon-chai": "^3.5.0", "ws": "^8.18.0" }, "devDependencies": { @@ -55,19 +57,17 @@ "@types/chai": "^4.3.19", "@types/chai-as-promised": "^7.1.8", "@types/mocha": "^10.0.7", - "@types/node": "^22.7.4", + "@types/node": "^20.14.10", "@types/proxyquire": "^1.3.31", "@types/sinon": "^17.0.3", "@types/sinon-chai": "^3.2.12", "@types/ws": "^8.5.12", - "chai": "^5.1.1", + "chai": "^4.3.4", "chai-as-promised": "^8.0.0", "eslint": "^9.9.1", - "mocha": "^10.6.0", + "mocha": "^10.7.0", "proxyquire": "^2.1.3", - "sinon": "^18.0.0", - "sinon-chai": "^4.0.0", - "typescript": "~5.6.2" + "typescript": "~5.5.4" }, "main": "main.js", "files": [