cvmts: replace jpeg-turbo native module with new rust module

This module also does threadpooling internally, so we don't need Piscina anymore (which I'm pretty sure was actually bottlenecking.)
This commit is contained in:
modeco80
2024-06-20 03:20:56 -04:00
parent 39521a4b1d
commit 87a377a10f
17 changed files with 632 additions and 555 deletions

4
.gitignore vendored
View File

@@ -12,3 +12,7 @@ cvmts/attic
# Guac-rs # Guac-rs
guac-rs/target guac-rs/target
guac-rs/index.node guac-rs/index.node
# jpegturbo-rs
jpegturbo-rs/target
jpegturbo-rs/index.node

3
.gitmodules vendored
View File

@@ -1,6 +1,3 @@
[submodule "nodejs-rfb"] [submodule "nodejs-rfb"]
path = nodejs-rfb path = nodejs-rfb
url = https://github.com/computernewb/nodejs-rfb url = https://github.com/computernewb/nodejs-rfb
[submodule "jpeg-turbo"]
path = jpeg-turbo
url = https://github.com/computernewb/jpeg-turbo

View File

@@ -11,12 +11,11 @@
"author": "Elijah R, modeco80", "author": "Elijah R, modeco80",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"@computernewb/jpeg-turbo": "*",
"@cvmts/guac-rs": "*", "@cvmts/guac-rs": "*",
"@cvmts/jpegturbo-rs": "*",
"@cvmts/qemu": "*", "@cvmts/qemu": "*",
"execa": "^8.0.1", "execa": "^8.0.1",
"mnemonist": "^0.39.5", "mnemonist": "^0.39.5",
"piscina": "^4.4.0",
"sharp": "^0.33.3", "sharp": "^0.33.3",
"toml": "^3.0.0", "toml": "^3.0.0",
"ws": "^8.14.1" "ws": "^8.14.1"

View File

@@ -810,7 +810,7 @@ export default class CollabVMServer {
let display = this.VM.GetDisplay(); let display = this.VM.GetDisplay();
let displaySize = display.Size(); let displaySize = display.Size();
let encoded = await JPEGEncoder.EncodeJpeg(display.Buffer(), displaySize, rect); let encoded = await JPEGEncoder.Encode(display.Buffer(), displaySize, rect);
return encoded.toString('base64'); return encoded.toString('base64');
} }

View File

@@ -1,59 +1,52 @@
import path from 'node:path';
import Piscina from 'piscina';
import { Size, Rect } from '@cvmts/shared'; import { Size, Rect } from '@cvmts/shared';
import sharp from 'sharp';
const kMaxJpegThreads = 4; import * as jpeg from '@cvmts/jpegturbo-rs';
const kIdleTimeout = 25000;
// Thread pool for doing JPEG encoding for rects.
const TheJpegEncoderPool = new Piscina({
filename: path.join(import.meta.dirname + '/JPEGEncoderWorker.js'),
idleTimeout: kIdleTimeout,
maxThreads: kMaxJpegThreads
});
const TheThumbnailEncoderPool = new Piscina({
filename: path.join(import.meta.dirname + '/ThumbnailJPEGEncoderWorker.js'),
idleTimeout: kIdleTimeout,
maxThreads: kMaxJpegThreads
});
// A good balance. TODO: Configurable? // A good balance. TODO: Configurable?
let gJpegQuality = 35; let gJpegQuality = 35;
export class JPEGEncoder { const kThumbnailSize: Size = {
width: 400,
height: 300
};
// this returns appropiate Sharp options to deal with CVMTS raw framebuffers
// (which are RGBA bitmaps, essentially. We probably should abstract that out but
// that'd mean having to introduce that to rfb and oihwekjtgferklds;./tghnredsltg;erhds)
function GetRawSharpOptions(size: Size): sharp.CreateRaw {
return {
width: size.width,
height: size.height,
channels: 4
};
}
export class JPEGEncoder {
static SetQuality(quality: number) { static SetQuality(quality: number) {
gJpegQuality = quality; gJpegQuality = quality;
} }
static async EncodeJpeg(canvas: Buffer, displaySize: Size, rect: Rect): Promise<Buffer> { static async Encode(canvas: Buffer, displaySize: Size, rect: Rect): Promise<Buffer> {
let offset = (rect.y * displaySize.width + rect.x) * 4; let offset = (rect.y * displaySize.width + rect.x) * 4;
return jpeg.jpegEncode({
let res = await TheJpegEncoderPool.run({
buffer: canvas.subarray(offset),
width: rect.width, width: rect.width,
height: rect.height, height: rect.height,
stride: displaySize.width, stride: displaySize.width,
quality: gJpegQuality buffer: canvas.subarray(offset)
}); });
// TODO: There's probably (definitely) a better way to fix this
if (res == undefined) return Buffer.from([]);
// have to manually turn it back into a buffer because
// Piscina for some reason turns it into a Uint8Array
return Buffer.from(res);
} }
static async EncodeThumbnail(buffer: Buffer, size: Size) : Promise<Buffer> { static async EncodeThumbnail(buffer: Buffer, size: Size): Promise<Buffer> {
let res = await TheThumbnailEncoderPool.run({ let { data, info } = await sharp(buffer, { raw: GetRawSharpOptions(size) })
buffer: buffer, .resize(kThumbnailSize.width, kThumbnailSize.height, { fit: 'fill' })
size: size, .raw()
quality: gJpegQuality .toBuffer({ resolveWithObject: true });
});
return Buffer.from(res) return jpeg.jpegEncode({
width: kThumbnailSize.width,
height: kThumbnailSize.height,
stride: kThumbnailSize.width,
buffer: data
});
} }
} }

View File

@@ -1,19 +0,0 @@
import jpegTurbo from '@computernewb/jpeg-turbo';
import Piscina from 'piscina';
export default async (opts: any) => {
try {
let res = await jpegTurbo.compress(opts.buffer, {
format: jpegTurbo.FORMAT_RGBA,
width: opts.width,
height: opts.height,
subsampling: jpegTurbo.SAMP_422,
stride: opts.stride,
quality: opts.quality || 75
});
return Piscina.move(res);
} catch {
return;
}
};

View File

@@ -1,36 +0,0 @@
import { Size } from '@cvmts/shared';
import Piscina from 'piscina';
import sharp from 'sharp';
const kThumbnailSize: Size = {
width: 400,
height: 300
};
// this returns appropiate Sharp options to deal with CVMTS raw framebuffers
// (which are RGBA bitmaps, essentially. We probably should abstract that out but
// that'd mean having to introduce that to rfb and oihwekjtgferklds;./tghnredsltg;erhds)
function GetRawSharpOptions(size: Size): sharp.CreateRaw {
return {
width: size.width,
height: size.height,
channels: 4
};
}
export default async (opts: any) => {
try {
let out = await sharp(opts.buffer, { raw: GetRawSharpOptions(opts.size) })
.resize(kThumbnailSize.width, kThumbnailSize.height, { fit: 'fill' })
.jpeg({
quality: opts.quality || 75
})
.toFormat('jpeg')
.toBuffer();
return out;
} catch {
return;
}
};

Submodule jpeg-turbo deleted from 6718ec1fc1

350
jpegturbo-rs/Cargo.lock generated Normal file
View File

@@ -0,0 +1,350 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "addr2line"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "anyhow"
version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "backtrace"
version = "0.3.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
dependencies = [
"addr2line",
"cc",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
]
[[package]]
name = "cc"
version = "1.0.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cmake"
version = "0.1.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130"
dependencies = [
"cc",
]
[[package]]
name = "getrandom"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
name = "gimli"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
[[package]]
name = "hermit-abi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
[[package]]
name = "jpegturbo-rs"
version = "0.1.0"
dependencies = [
"neon",
"once_cell",
"tokio",
"turbojpeg-sys",
]
[[package]]
name = "libc"
version = "0.2.155"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
[[package]]
name = "libloading"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19"
dependencies = [
"cfg-if",
"windows-targets",
]
[[package]]
name = "memchr"
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "miniz_oxide"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
dependencies = [
"adler",
]
[[package]]
name = "neon"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d75440242411c87dc39847b0e33e961ec1f10326a9d8ecf9c1ea64a3b3c13dc"
dependencies = [
"getrandom",
"libloading",
"neon-macros",
"once_cell",
"semver",
"send_wrapper",
"smallvec",
]
[[package]]
name = "neon-macros"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6813fde79b646e47e7ad75f480aa80ef76a5d9599e2717407961531169ee38b"
dependencies = [
"quote",
"syn",
"syn-mid",
]
[[package]]
name = "num_cpus"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "object"
version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "pin-project-lite"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
[[package]]
name = "pkg-config"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
[[package]]
name = "proc-macro2"
version = "1.0.85"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rustc-demangle"
version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
name = "semver"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
[[package]]
name = "send_wrapper"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73"
[[package]]
name = "smallvec"
version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
[[package]]
name = "syn"
version = "2.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "syn-mid"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5dc35bb08dd1ca3dfb09dce91fd2d13294d6711c88897d9a9d60acf39bce049"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tokio"
version = "1.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a"
dependencies = [
"backtrace",
"num_cpus",
"pin-project-lite",
]
[[package]]
name = "turbojpeg-sys"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fa6daade3b979fb7454cce5ebcb9772ce7a1cf476ea27ed20ed06e13d9bc983"
dependencies = [
"anyhow",
"cmake",
"libc",
"pkg-config",
]
[[package]]
name = "unicode-ident"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "windows-targets"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_gnullvm",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
[[package]]
name = "windows_i686_gnu"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
[[package]]
name = "windows_i686_msvc"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"

15
jpegturbo-rs/Cargo.toml Normal file
View File

@@ -0,0 +1,15 @@
[package]
name = "jpegturbo-rs"
description = "Rust powered JPEGTurbo sex"
version = "0.1.0"
edition = "2021"
exclude = ["index.node"]
[lib]
crate-type = ["cdylib"]
[dependencies]
neon = "1"
once_cell = "1.19.0"
tokio = { version = "1.38.0", features = [ "rt", "rt-multi-thread" ] }
turbojpeg-sys = "1.0.0"

15
jpegturbo-rs/index.d.ts vendored Normal file
View File

@@ -0,0 +1,15 @@
interface JpegInputArgs {
width: number,
height: number,
stride: number, // The width of your input framebuffer OR your image width (if encoding a full image)
buffer: Buffer
// TODO: Allow different formats, or export a boxed ffi object which can store a format
// (i.e: new JpegEncoder(FORMAT_xxx)).
}
/// Performs JPEG encoding.
export function jpegEncode(input: JpegInputArgs) : Promise<Buffer>;
// TODO: Version that can downscale?

6
jpegturbo-rs/index.js Normal file
View File

@@ -0,0 +1,6 @@
// *sigh*
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
export let {jpegEncode} = require('./index.node');

16
jpegturbo-rs/package.json Normal file
View File

@@ -0,0 +1,16 @@
{
"name": "@cvmts/jpegturbo-rs",
"version": "0.1.0",
"packageManager": "yarn@4.1.1",
"type": "module",
"main": "index.js",
"types": "index.d.ts",
"scripts": {
"build": "cargo-cp-artifact -nc index.node -- cargo build --release --message-format=json-render-diagnostics",
"install": "yarn build",
"test": "cargo test"
},
"devDependencies": {
"cargo-cp-artifact": "^0.1"
}
}

View File

@@ -0,0 +1,82 @@
use turbojpeg_sys::*;
pub struct Image<'a> {
pub buffer: &'a [u8],
pub width: u32,
pub height: u32,
pub stride: u32,
pub format: TJPF,
}
pub struct JpegCompressor {
handle: tjhandle,
subsamp: TJSAMP,
quality: u32,
}
unsafe impl Send for JpegCompressor {}
impl JpegCompressor {
pub fn new() -> Self {
unsafe {
let init = Self {
handle: tjInitCompress(),
subsamp: TJSAMP_TJSAMP_422,
quality: 95,
};
return init;
}
}
pub fn set_quality(&mut self, quality: u32) {
self.quality = quality;
}
pub fn set_subsamp(&mut self, samp: TJSAMP) {
self.subsamp = samp;
}
pub fn compress_buffer<'a>(&self, image: &Image<'a>) -> Vec<u8> {
unsafe {
let size: usize =
tjBufSize(image.width as i32, image.height as i32, self.subsamp) as usize;
let mut vec = Vec::with_capacity(size);
vec.resize(size, 0);
let mut ptr: *mut u8 = vec.as_mut_ptr();
let mut size: u64 = 0;
let res = tjCompress2(
self.handle,
image.buffer.as_ptr(),
image.width as i32,
image.stride as i32,
image.height as i32,
image.format,
std::ptr::addr_of_mut!(ptr),
std::ptr::addr_of_mut!(size),
self.subsamp,
self.quality as i32,
(TJFLAG_NOREALLOC) as i32,
);
// TODO: Result sex so we can actually notify failure
if res == -1 {
return Vec::new();
}
// Truncate down to the size we're given back
vec.truncate(size as usize);
return vec;
}
}
}
impl Drop for JpegCompressor {
fn drop(&mut self) {
unsafe {
tjDestroy(self.handle);
}
}
}

91
jpegturbo-rs/src/lib.rs Normal file
View File

@@ -0,0 +1,91 @@
use std::sync::{Arc, Mutex};
use neon::prelude::*;
use neon::types::buffer::TypedArray;
use once_cell::sync::OnceCell;
use tokio::runtime::Runtime;
use std::cell::RefCell;
mod jpeg_compressor;
fn runtime<'a, C: Context<'a>>(cx: &mut C) -> NeonResult<&'static Runtime> {
static RUNTIME: OnceCell<Runtime> = OnceCell::new();
RUNTIME
.get_or_try_init(Runtime::new)
.or_else(|err| cx.throw_error(&err.to_string()))
}
thread_local! {
static COMPRESSOR: RefCell<jpeg_compressor::JpegCompressor> = RefCell::new(jpeg_compressor::JpegCompressor::new());
}
fn jpeg_encode_impl<'a>(cx: &mut FunctionContext<'a>) -> JsResult<'a, JsPromise> {
let input = cx.argument::<JsObject>(0)?;
// Get our input arguments here
let width: u64 = input.get::<JsNumber, _, _>(cx, "width")?.value(cx) as u64;
let height: u64 = input.get::<JsNumber, _, _>(cx, "height")?.value(cx) as u64;
let stride: u64 = input.get::<JsNumber, _, _>(cx, "stride")?.value(cx) as u64;
let buffer: Handle<JsBuffer> = input.get(cx, "buffer")?;
let (deferred, promise) = cx.promise();
let channel = cx.channel();
let runtime = runtime(cx)?;
let buf = buffer.as_slice(cx);
let copy: Arc<Mutex<Vec<u8>>> = Arc::new(Mutex::new(Vec::with_capacity(buf.len())));
// Copy from the node buffer to our temporary buffer
{
let mut locked = copy.lock().unwrap();
let cap = locked.capacity();
locked.resize(cap, 0);
locked.copy_from_slice(buf);
}
// Spawn off a tokio blocking pool thread that will do the work for us
runtime.spawn_blocking(move || {
let clone = Arc::clone(&copy);
let locked = clone.lock().unwrap();
let image: jpeg_compressor::Image = jpeg_compressor::Image {
buffer: locked.as_slice(),
width: width as u32,
height: height as u32,
stride: (stride * 4u64) as u32, // I think?
format: turbojpeg_sys::TJPF_TJPF_RGBA,
};
let vec = COMPRESSOR.with(|lazy| {
let mut b = lazy.borrow_mut();
b.set_quality(35);
b.set_subsamp(turbojpeg_sys::TJSAMP_TJSAMP_420);
b.compress_buffer(&image)
});
// Fulfill the Javascript promise with our encoded buffer
deferred.settle_with(&channel, move |mut cx| {
let mut buf = cx.buffer(vec.len())?;
let slice = buf.as_mut_slice(&mut cx);
slice.copy_from_slice(vec.as_slice());
Ok(buf)
});
});
Ok(promise)
}
fn jpeg_encode(mut cx: FunctionContext) -> JsResult<JsPromise> {
jpeg_encode_impl(&mut cx)
}
#[neon::main]
fn main(mut cx: ModuleContext) -> NeonResult<()> {
cx.export_function("jpegEncode", jpeg_encode)?;
Ok(())
}

View File

@@ -3,7 +3,7 @@
"workspaces": [ "workspaces": [
"shared", "shared",
"guac-rs", "guac-rs",
"jpeg-turbo", "jpegturbo-rs",
"nodejs-rfb", "nodejs-rfb",
"qemu", "qemu",
"cvmts" "cvmts"

471
yarn.lock
View File

@@ -34,15 +34,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@computernewb/jpeg-turbo@npm:*, @computernewb/jpeg-turbo@workspace:jpeg-turbo":
version: 0.0.0-use.local
resolution: "@computernewb/jpeg-turbo@workspace:jpeg-turbo"
dependencies:
cmake-js: "npm:^7.2.0"
node-addon-api: "npm:^6.0.0"
languageName: unknown
linkType: soft
"@computernewb/nodejs-rfb@npm:*, @computernewb/nodejs-rfb@workspace:nodejs-rfb": "@computernewb/nodejs-rfb@npm:*, @computernewb/nodejs-rfb@workspace:nodejs-rfb":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@computernewb/nodejs-rfb@workspace:nodejs-rfb" resolution: "@computernewb/nodejs-rfb@workspace:nodejs-rfb"
@@ -60,14 +51,13 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@cvmts/cvmts@workspace:cvmts" resolution: "@cvmts/cvmts@workspace:cvmts"
dependencies: dependencies:
"@computernewb/jpeg-turbo": "npm:*"
"@cvmts/guac-rs": "npm:*" "@cvmts/guac-rs": "npm:*"
"@cvmts/jpegturbo-rs": "npm:*"
"@cvmts/qemu": "npm:*" "@cvmts/qemu": "npm:*"
"@types/node": "npm:^20.12.5" "@types/node": "npm:^20.12.5"
"@types/ws": "npm:^8.5.5" "@types/ws": "npm:^8.5.5"
execa: "npm:^8.0.1" execa: "npm:^8.0.1"
mnemonist: "npm:^0.39.5" mnemonist: "npm:^0.39.5"
piscina: "npm:^4.4.0"
prettier: "npm:^3.2.5" prettier: "npm:^3.2.5"
sharp: "npm:^0.33.3" sharp: "npm:^0.33.3"
toml: "npm:^3.0.0" toml: "npm:^3.0.0"
@@ -84,6 +74,14 @@ __metadata:
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"@cvmts/jpegturbo-rs@npm:*, @cvmts/jpegturbo-rs@workspace:jpegturbo-rs":
version: 0.0.0-use.local
resolution: "@cvmts/jpegturbo-rs@workspace:jpegturbo-rs"
dependencies:
cargo-cp-artifact: "npm:^0.1"
languageName: unknown
linkType: soft
"@cvmts/qemu@npm:*, @cvmts/qemu@workspace:qemu": "@cvmts/qemu@npm:*, @cvmts/qemu@workspace:qemu":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@cvmts/qemu@workspace:qemu" resolution: "@cvmts/qemu@workspace:qemu"
@@ -1643,23 +1641,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"aproba@npm:^1.0.3 || ^2.0.0":
version: 2.0.0
resolution: "aproba@npm:2.0.0"
checksum: 10c0/d06e26384a8f6245d8c8896e138c0388824e259a329e0c9f196b4fa533c82502a6fd449586e3604950a0c42921832a458bb3aa0aa9f0ba449cfd4f50fd0d09b5
languageName: node
linkType: hard
"are-we-there-yet@npm:^3.0.0":
version: 3.0.1
resolution: "are-we-there-yet@npm:3.0.1"
dependencies:
delegates: "npm:^1.0.0"
readable-stream: "npm:^3.6.0"
checksum: 10c0/8373f289ba42e4b5ec713bb585acdac14b5702c75f2a458dc985b9e4fa5762bc5b46b40a21b72418a3ed0cfb5e35bdc317ef1ae132f3035f633d581dd03168c3
languageName: node
linkType: hard
"argparse@npm:^2.0.1": "argparse@npm:^2.0.1":
version: 2.0.1 version: 2.0.1
resolution: "argparse@npm:2.0.1" resolution: "argparse@npm:2.0.1"
@@ -1667,24 +1648,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"asynckit@npm:^0.4.0":
version: 0.4.0
resolution: "asynckit@npm:0.4.0"
checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d
languageName: node
linkType: hard
"axios@npm:^1.6.5":
version: 1.6.8
resolution: "axios@npm:1.6.8"
dependencies:
follow-redirects: "npm:^1.15.6"
form-data: "npm:^4.0.0"
proxy-from-env: "npm:^1.1.0"
checksum: 10c0/0f22da6f490335479a89878bc7d5a1419484fbb437b564a80c34888fc36759ae4f56ea28d55a191695e5ed327f0bad56e7ff60fb6770c14d1be6501505d47ab9
languageName: node
linkType: hard
"balanced-match@npm:^1.0.0": "balanced-match@npm:^1.0.0":
version: 1.0.2 version: 1.0.2
resolution: "balanced-match@npm:1.0.2" resolution: "balanced-match@npm:1.0.2"
@@ -1851,17 +1814,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"cliui@npm:^8.0.1":
version: 8.0.1
resolution: "cliui@npm:8.0.1"
dependencies:
string-width: "npm:^4.2.0"
strip-ansi: "npm:^6.0.1"
wrap-ansi: "npm:^7.0.0"
checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5
languageName: node
linkType: hard
"clone@npm:^2.1.1": "clone@npm:^2.1.1":
version: 2.1.2 version: 2.1.2
resolution: "clone@npm:2.1.2" resolution: "clone@npm:2.1.2"
@@ -1869,29 +1821,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"cmake-js@npm:^7.2.0":
version: 7.3.0
resolution: "cmake-js@npm:7.3.0"
dependencies:
axios: "npm:^1.6.5"
debug: "npm:^4"
fs-extra: "npm:^11.2.0"
lodash.isplainobject: "npm:^4.0.6"
memory-stream: "npm:^1.0.0"
node-api-headers: "npm:^1.1.0"
npmlog: "npm:^6.0.2"
rc: "npm:^1.2.7"
semver: "npm:^7.5.4"
tar: "npm:^6.2.0"
url-join: "npm:^4.0.1"
which: "npm:^2.0.2"
yargs: "npm:^17.7.2"
bin:
cmake-js: bin/cmake-js
checksum: 10c0/8aa3839603578e3f40bff55a3b7cb962682223ab91bab82501289d6ee0b84246c22ecdc01381b38079a0f20fd5c6ca01068e928bf399f8054a19a7cdaab1060c
languageName: node
linkType: hard
"color-convert@npm:^1.9.0": "color-convert@npm:^1.9.0":
version: 1.9.3 version: 1.9.3
resolution: "color-convert@npm:1.9.3" resolution: "color-convert@npm:1.9.3"
@@ -1934,15 +1863,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"color-support@npm:^1.1.3":
version: 1.1.3
resolution: "color-support@npm:1.1.3"
bin:
color-support: bin.js
checksum: 10c0/8ffeaa270a784dc382f62d9be0a98581db43e11eee301af14734a6d089bd456478b1a8b3e7db7ca7dc5b18a75f828f775c44074020b51c05fc00e6d0992b1cc6
languageName: node
linkType: hard
"color@npm:^4.2.3": "color@npm:^4.2.3":
version: 4.2.3 version: 4.2.3
resolution: "color@npm:4.2.3" resolution: "color@npm:4.2.3"
@@ -1953,15 +1873,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"combined-stream@npm:^1.0.8":
version: 1.0.8
resolution: "combined-stream@npm:1.0.8"
dependencies:
delayed-stream: "npm:~1.0.0"
checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5
languageName: node
linkType: hard
"commander@npm:^7.0.0, commander@npm:^7.2.0": "commander@npm:^7.0.0, commander@npm:^7.2.0":
version: 7.2.0 version: 7.2.0
resolution: "commander@npm:7.2.0" resolution: "commander@npm:7.2.0"
@@ -1969,13 +1880,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"console-control-strings@npm:^1.1.0":
version: 1.1.0
resolution: "console-control-strings@npm:1.1.0"
checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50
languageName: node
linkType: hard
"cosmiconfig@npm:^8.0.0": "cosmiconfig@npm:^8.0.0":
version: 8.3.6 version: 8.3.6
resolution: "cosmiconfig@npm:8.3.6" resolution: "cosmiconfig@npm:8.3.6"
@@ -2057,7 +1961,7 @@ __metadata:
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"debug@npm:4, debug@npm:^4, debug@npm:^4.3.4": "debug@npm:4, debug@npm:^4.3.4":
version: 4.3.4 version: 4.3.4
resolution: "debug@npm:4.3.4" resolution: "debug@npm:4.3.4"
dependencies: dependencies:
@@ -2069,27 +1973,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"deep-extend@npm:^0.6.0":
version: 0.6.0
resolution: "deep-extend@npm:0.6.0"
checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566
languageName: node
linkType: hard
"delayed-stream@npm:~1.0.0":
version: 1.0.0
resolution: "delayed-stream@npm:1.0.0"
checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19
languageName: node
linkType: hard
"delegates@npm:^1.0.0":
version: 1.0.0
resolution: "delegates@npm:1.0.0"
checksum: 10c0/ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5
languageName: node
linkType: hard
"detect-libc@npm:^1.0.3": "detect-libc@npm:^1.0.3":
version: 1.0.3 version: 1.0.3
resolution: "detect-libc@npm:1.0.3" resolution: "detect-libc@npm:1.0.3"
@@ -2279,16 +2162,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"follow-redirects@npm:^1.15.6":
version: 1.15.6
resolution: "follow-redirects@npm:1.15.6"
peerDependenciesMeta:
debug:
optional: true
checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071
languageName: node
linkType: hard
"foreground-child@npm:^3.1.0": "foreground-child@npm:^3.1.0":
version: 3.1.1 version: 3.1.1
resolution: "foreground-child@npm:3.1.1" resolution: "foreground-child@npm:3.1.1"
@@ -2299,28 +2172,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"form-data@npm:^4.0.0":
version: 4.0.0
resolution: "form-data@npm:4.0.0"
dependencies:
asynckit: "npm:^0.4.0"
combined-stream: "npm:^1.0.8"
mime-types: "npm:^2.1.12"
checksum: 10c0/cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e
languageName: node
linkType: hard
"fs-extra@npm:^11.2.0":
version: 11.2.0
resolution: "fs-extra@npm:11.2.0"
dependencies:
graceful-fs: "npm:^4.2.0"
jsonfile: "npm:^6.0.1"
universalify: "npm:^2.0.0"
checksum: 10c0/d77a9a9efe60532d2e790e938c81a02c1b24904ef7a3efb3990b835514465ba720e99a6ea56fd5e2db53b4695319b644d76d5a0e9988a2beef80aa7b1da63398
languageName: node
linkType: hard
"fs-minipass@npm:^2.0.0": "fs-minipass@npm:^2.0.0":
version: 2.1.0 version: 2.1.0
resolution: "fs-minipass@npm:2.1.0" resolution: "fs-minipass@npm:2.1.0"
@@ -2358,29 +2209,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"gauge@npm:^4.0.3":
version: 4.0.4
resolution: "gauge@npm:4.0.4"
dependencies:
aproba: "npm:^1.0.3 || ^2.0.0"
color-support: "npm:^1.1.3"
console-control-strings: "npm:^1.1.0"
has-unicode: "npm:^2.0.1"
signal-exit: "npm:^3.0.7"
string-width: "npm:^4.2.3"
strip-ansi: "npm:^6.0.1"
wide-align: "npm:^1.1.5"
checksum: 10c0/ef10d7981113d69225135f994c9f8c4369d945e64a8fc721d655a3a38421b738c9fe899951721d1b47b73c41fdb5404ac87cc8903b2ecbed95d2800363e7e58c
languageName: node
linkType: hard
"get-caller-file@npm:^2.0.5":
version: 2.0.5
resolution: "get-caller-file@npm:2.0.5"
checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde
languageName: node
linkType: hard
"get-port@npm:^4.2.0": "get-port@npm:^4.2.0":
version: 4.2.0 version: 4.2.0
resolution: "get-port@npm:4.2.0" resolution: "get-port@npm:4.2.0"
@@ -2428,7 +2256,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": "graceful-fs@npm:^4.2.6":
version: 4.2.11 version: 4.2.11
resolution: "graceful-fs@npm:4.2.11" resolution: "graceful-fs@npm:4.2.11"
checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2
@@ -2449,13 +2277,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"has-unicode@npm:^2.0.1":
version: 2.0.1
resolution: "has-unicode@npm:2.0.1"
checksum: 10c0/ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c
languageName: node
linkType: hard
"htmlnano@npm:^2.0.0": "htmlnano@npm:^2.0.0":
version: 2.1.0 version: 2.1.0
resolution: "htmlnano@npm:2.1.0" resolution: "htmlnano@npm:2.1.0"
@@ -2579,20 +2400,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"inherits@npm:^2.0.3":
version: 2.0.4
resolution: "inherits@npm:2.0.4"
checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2
languageName: node
linkType: hard
"ini@npm:~1.3.0":
version: 1.3.8
resolution: "ini@npm:1.3.8"
checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a
languageName: node
linkType: hard
"ip-address@npm:^9.0.5": "ip-address@npm:^9.0.5":
version: 9.0.5 version: 9.0.5
resolution: "ip-address@npm:9.0.5" resolution: "ip-address@npm:9.0.5"
@@ -2745,19 +2552,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"jsonfile@npm:^6.0.1":
version: 6.1.0
resolution: "jsonfile@npm:6.1.0"
dependencies:
graceful-fs: "npm:^4.1.6"
universalify: "npm:^2.0.0"
dependenciesMeta:
graceful-fs:
optional: true
checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865
languageName: node
linkType: hard
"lightningcss-darwin-arm64@npm:1.24.1": "lightningcss-darwin-arm64@npm:1.24.1":
version: 1.24.1 version: 1.24.1
resolution: "lightningcss-darwin-arm64@npm:1.24.1" resolution: "lightningcss-darwin-arm64@npm:1.24.1"
@@ -2900,13 +2694,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"lodash.isplainobject@npm:^4.0.6":
version: 4.0.6
resolution: "lodash.isplainobject@npm:4.0.6"
checksum: 10c0/afd70b5c450d1e09f32a737bed06ff85b873ecd3d3d3400458725283e3f2e0bb6bf48e67dbe7a309eb371a822b16a26cca4a63c8c52db3fc7dc9d5f9dd324cbb
languageName: node
linkType: hard
"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0":
version: 10.2.0 version: 10.2.0
resolution: "lru-cache@npm:10.2.0" resolution: "lru-cache@npm:10.2.0"
@@ -2949,15 +2736,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"memory-stream@npm:^1.0.0":
version: 1.0.0
resolution: "memory-stream@npm:1.0.0"
dependencies:
readable-stream: "npm:^3.4.0"
checksum: 10c0/a2d9abd35845b228055ce5424dbdd8478711ba41325d02e6c8ef9baeba557287d4493a6e74d3db5c9849c58ea13fdc1dd445c96f469cbd02f47d22cfba930306
languageName: node
linkType: hard
"merge-stream@npm:^2.0.0": "merge-stream@npm:^2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "merge-stream@npm:2.0.0" resolution: "merge-stream@npm:2.0.0"
@@ -2975,22 +2753,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"mime-db@npm:1.52.0":
version: 1.52.0
resolution: "mime-db@npm:1.52.0"
checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa
languageName: node
linkType: hard
"mime-types@npm:^2.1.12":
version: 2.1.35
resolution: "mime-types@npm:2.1.35"
dependencies:
mime-db: "npm:1.52.0"
checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2
languageName: node
linkType: hard
"mimic-fn@npm:^4.0.0": "mimic-fn@npm:^4.0.0":
version: 4.0.0 version: 4.0.0
resolution: "mimic-fn@npm:4.0.0" resolution: "mimic-fn@npm:4.0.0"
@@ -3007,13 +2769,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"minimist@npm:^1.2.0":
version: 1.2.8
resolution: "minimist@npm:1.2.8"
checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6
languageName: node
linkType: hard
"minipass-collect@npm:^2.0.1": "minipass-collect@npm:^2.0.1":
version: 2.0.1 version: 2.0.1
resolution: "minipass-collect@npm:2.0.1" resolution: "minipass-collect@npm:2.0.1"
@@ -3173,27 +2928,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"nice-napi@npm:^1.0.2": "node-addon-api@npm:^6.1.0":
version: 1.0.2
resolution: "nice-napi@npm:1.0.2"
dependencies:
node-addon-api: "npm:^3.0.0"
node-gyp: "npm:latest"
node-gyp-build: "npm:^4.2.2"
conditions: "!os=win32"
languageName: node
linkType: hard
"node-addon-api@npm:^3.0.0":
version: 3.2.1
resolution: "node-addon-api@npm:3.2.1"
dependencies:
node-gyp: "npm:latest"
checksum: 10c0/41f21c9d12318875a2c429befd06070ce367065a3ef02952cfd4ea17ef69fa14012732f510b82b226e99c254da8d671847ea018cad785f839a5366e02dd56302
languageName: node
linkType: hard
"node-addon-api@npm:^6.0.0, node-addon-api@npm:^6.1.0":
version: 6.1.0 version: 6.1.0
resolution: "node-addon-api@npm:6.1.0" resolution: "node-addon-api@npm:6.1.0"
dependencies: dependencies:
@@ -3211,13 +2946,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"node-api-headers@npm:^1.1.0":
version: 1.1.0
resolution: "node-api-headers@npm:1.1.0"
checksum: 10c0/7806d71077348ea199034e8c90a9147038d37fcccc1b85717e48c095fe31783a4f909f5daced4506e6cbce93fba91220bb3fc8626ee0640d26de9860f6500174
languageName: node
linkType: hard
"node-gyp-build-optional-packages@npm:5.0.7": "node-gyp-build-optional-packages@npm:5.0.7":
version: 5.0.7 version: 5.0.7
resolution: "node-gyp-build-optional-packages@npm:5.0.7" resolution: "node-gyp-build-optional-packages@npm:5.0.7"
@@ -3242,17 +2970,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"node-gyp-build@npm:^4.2.2":
version: 4.8.0
resolution: "node-gyp-build@npm:4.8.0"
bin:
node-gyp-build: bin.js
node-gyp-build-optional: optional.js
node-gyp-build-test: build-test.js
checksum: 10c0/85324be16f81f0235cbbc42e3eceaeb1b5ab94c8d8f5236755e1435b4908338c65a4e75f66ee343cbcb44ddf9b52a428755bec16dcd983295be4458d95c8e1ad
languageName: node
linkType: hard
"node-gyp@npm:latest": "node-gyp@npm:latest":
version: 10.1.0 version: 10.1.0
resolution: "node-gyp@npm:10.1.0" resolution: "node-gyp@npm:10.1.0"
@@ -3307,18 +3024,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"npmlog@npm:^6.0.2":
version: 6.0.2
resolution: "npmlog@npm:6.0.2"
dependencies:
are-we-there-yet: "npm:^3.0.0"
console-control-strings: "npm:^1.1.0"
gauge: "npm:^4.0.3"
set-blocking: "npm:^2.0.0"
checksum: 10c0/0cacedfbc2f6139c746d9cd4a85f62718435ad0ca4a2d6459cd331dd33ae58206e91a0742c1558634efcde3f33f8e8e7fd3adf1bfe7978310cf00bd55cccf890
languageName: node
linkType: hard
"nth-check@npm:^2.0.1": "nth-check@npm:^2.0.1":
version: 2.1.1 version: 2.1.1
resolution: "nth-check@npm:2.1.1" resolution: "nth-check@npm:2.1.1"
@@ -3457,18 +3162,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"piscina@npm:^4.4.0":
version: 4.4.0
resolution: "piscina@npm:4.4.0"
dependencies:
nice-napi: "npm:^1.0.2"
dependenciesMeta:
nice-napi:
optional: true
checksum: 10c0/df6c2a2b673b0633a625f8dfc32f4519155e74ee24e31be9e69d2937e76d6cec8640278b4a50195652a943cccf8c634ed406f08598933c57e959d242b5fe5d1d
languageName: node
linkType: hard
"postcss-value-parser@npm:^4.2.0": "postcss-value-parser@npm:^4.2.0":
version: 4.2.0 version: 4.2.0
resolution: "postcss-value-parser@npm:4.2.0" resolution: "postcss-value-parser@npm:4.2.0"
@@ -3539,27 +3232,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"proxy-from-env@npm:^1.1.0":
version: 1.1.0
resolution: "proxy-from-env@npm:1.1.0"
checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b
languageName: node
linkType: hard
"rc@npm:^1.2.7":
version: 1.2.8
resolution: "rc@npm:1.2.8"
dependencies:
deep-extend: "npm:^0.6.0"
ini: "npm:~1.3.0"
minimist: "npm:^1.2.0"
strip-json-comments: "npm:~2.0.1"
bin:
rc: ./cli.js
checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15
languageName: node
linkType: hard
"react-error-overlay@npm:6.0.9": "react-error-overlay@npm:6.0.9":
version: 6.0.9 version: 6.0.9
resolution: "react-error-overlay@npm:6.0.9" resolution: "react-error-overlay@npm:6.0.9"
@@ -3574,17 +3246,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0":
version: 3.6.2
resolution: "readable-stream@npm:3.6.2"
dependencies:
inherits: "npm:^2.0.3"
string_decoder: "npm:^1.1.1"
util-deprecate: "npm:^1.0.1"
checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7
languageName: node
linkType: hard
"readdirp@npm:~3.6.0": "readdirp@npm:~3.6.0":
version: 3.6.0 version: 3.6.0
resolution: "readdirp@npm:3.6.0" resolution: "readdirp@npm:3.6.0"
@@ -3601,13 +3262,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"require-directory@npm:^2.1.1":
version: 2.1.1
resolution: "require-directory@npm:2.1.1"
checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99
languageName: node
linkType: hard
"resolve-from@npm:^4.0.0": "resolve-from@npm:^4.0.0":
version: 4.0.0 version: 4.0.0
resolution: "resolve-from@npm:4.0.0" resolution: "resolve-from@npm:4.0.0"
@@ -3622,7 +3276,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": "safe-buffer@npm:^5.0.1":
version: 5.2.1 version: 5.2.1
resolution: "safe-buffer@npm:5.2.1" resolution: "safe-buffer@npm:5.2.1"
checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3
@@ -3649,7 +3303,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"semver@npm:^7.3.5, semver@npm:^7.5.2, semver@npm:^7.5.4, semver@npm:^7.6.0": "semver@npm:^7.3.5, semver@npm:^7.5.2, semver@npm:^7.6.0":
version: 7.6.0 version: 7.6.0
resolution: "semver@npm:7.6.0" resolution: "semver@npm:7.6.0"
dependencies: dependencies:
@@ -3660,13 +3314,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"set-blocking@npm:^2.0.0":
version: 2.0.0
resolution: "set-blocking@npm:2.0.0"
checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454
languageName: node
linkType: hard
"sharp@npm:^0.33.3": "sharp@npm:^0.33.3":
version: 0.33.3 version: 0.33.3
resolution: "sharp@npm:0.33.3" resolution: "sharp@npm:0.33.3"
@@ -3752,13 +3399,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"signal-exit@npm:^3.0.7":
version: 3.0.7
resolution: "signal-exit@npm:3.0.7"
checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912
languageName: node
linkType: hard
"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": "signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0":
version: 4.1.0 version: 4.1.0
resolution: "signal-exit@npm:4.1.0" resolution: "signal-exit@npm:4.1.0"
@@ -3856,7 +3496,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0":
version: 4.2.3 version: 4.2.3
resolution: "string-width@npm:4.2.3" resolution: "string-width@npm:4.2.3"
dependencies: dependencies:
@@ -3878,15 +3518,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"string_decoder@npm:^1.1.1":
version: 1.3.0
resolution: "string_decoder@npm:1.3.0"
dependencies:
safe-buffer: "npm:~5.2.0"
checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d
languageName: node
linkType: hard
"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1":
version: 6.0.1 version: 6.0.1
resolution: "strip-ansi@npm:6.0.1" resolution: "strip-ansi@npm:6.0.1"
@@ -3912,13 +3543,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"strip-json-comments@npm:~2.0.1":
version: 2.0.1
resolution: "strip-json-comments@npm:2.0.1"
checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43
languageName: node
linkType: hard
"supports-color@npm:^5.3.0": "supports-color@npm:^5.3.0":
version: 5.5.0 version: 5.5.0
resolution: "supports-color@npm:5.5.0" resolution: "supports-color@npm:5.5.0"
@@ -3954,7 +3578,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.0": "tar@npm:^6.1.11, tar@npm:^6.1.2":
version: 6.2.1 version: 6.2.1
resolution: "tar@npm:6.2.1" resolution: "tar@npm:6.2.1"
dependencies: dependencies:
@@ -4084,13 +3708,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"universalify@npm:^2.0.0":
version: 2.0.1
resolution: "universalify@npm:2.0.1"
checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a
languageName: node
linkType: hard
"update-browserslist-db@npm:^1.0.13": "update-browserslist-db@npm:^1.0.13":
version: 1.0.13 version: 1.0.13
resolution: "update-browserslist-db@npm:1.0.13" resolution: "update-browserslist-db@npm:1.0.13"
@@ -4105,20 +3722,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"url-join@npm:^4.0.1":
version: 4.0.1
resolution: "url-join@npm:4.0.1"
checksum: 10c0/ac65e2c7c562d7b49b68edddcf55385d3e922bc1dd5d90419ea40b53b6de1607d1e45ceb71efb9d60da02c681d13c6cb3a1aa8b13fc0c989dfc219df97ee992d
languageName: node
linkType: hard
"util-deprecate@npm:^1.0.1":
version: 1.0.2
resolution: "util-deprecate@npm:1.0.2"
checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942
languageName: node
linkType: hard
"utility-types@npm:^3.10.0": "utility-types@npm:^3.10.0":
version: 3.11.0 version: 3.11.0
resolution: "utility-types@npm:3.11.0" resolution: "utility-types@npm:3.11.0"
@@ -4133,7 +3736,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"which@npm:^2.0.1, which@npm:^2.0.2": "which@npm:^2.0.1":
version: 2.0.2 version: 2.0.2
resolution: "which@npm:2.0.2" resolution: "which@npm:2.0.2"
dependencies: dependencies:
@@ -4155,16 +3758,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"wide-align@npm:^1.1.5": "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version: 1.1.5
resolution: "wide-align@npm:1.1.5"
dependencies:
string-width: "npm:^1.0.2 || 2 || 3 || 4"
checksum: 10c0/1d9c2a3e36dfb09832f38e2e699c367ef190f96b82c71f809bc0822c306f5379df87bab47bed27ea99106d86447e50eb972d3c516c2f95782807a9d082fbea95
languageName: node
linkType: hard
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0":
version: 7.0.0 version: 7.0.0
resolution: "wrap-ansi@npm:7.0.0" resolution: "wrap-ansi@npm:7.0.0"
dependencies: dependencies:
@@ -4201,38 +3795,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"y18n@npm:^5.0.5":
version: 5.0.8
resolution: "y18n@npm:5.0.8"
checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249
languageName: node
linkType: hard
"yallist@npm:^4.0.0": "yallist@npm:^4.0.0":
version: 4.0.0 version: 4.0.0
resolution: "yallist@npm:4.0.0" resolution: "yallist@npm:4.0.0"
checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a
languageName: node languageName: node
linkType: hard linkType: hard
"yargs-parser@npm:^21.1.1":
version: 21.1.1
resolution: "yargs-parser@npm:21.1.1"
checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2
languageName: node
linkType: hard
"yargs@npm:^17.7.2":
version: 17.7.2
resolution: "yargs@npm:17.7.2"
dependencies:
cliui: "npm:^8.0.1"
escalade: "npm:^3.1.1"
get-caller-file: "npm:^2.0.5"
require-directory: "npm:^2.1.1"
string-width: "npm:^4.2.3"
y18n: "npm:^5.0.5"
yargs-parser: "npm:^21.1.1"
checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05
languageName: node
linkType: hard