@e-mc/compress
Interface
import type { IModule, ModuleConstructor } from "./index";
import type { BrotliCompressLevel, BufferResult, CompressFormat, CompressLevel, TryFileCompressor } from "./compress";
import type { CompressModule, CompressSettings } from "./settings";
import type { WriteStream } from "node:fs";
import type { Readable } from "node:stream";
import type { BrotliCompress, BrotliOptions, Gzip, ZlibOptions } from "node:zlib";
interface ICompress extends IModule {
module: CompressModule;
level: Record<string, number>;
compressors: Record<string, TryFileCompressor>;
init(...args: unknown[]): this;
register(format: string, callback: TryFileCompressor): void;
getLevel(value: string, fallback?: number): number | undefined;
getReadable(file: string | URL | Buffer): Readable;
createGzip(file: string | Buffer, options?: CompressLevel): Gzip;
createBrotliCompress(file: string | Buffer, options?: BrotliCompressLevel): BrotliCompress;
createWriteStreamAsGzip(file: string | Buffer, output: string, options?: CompressLevel): WriteStream;
createWriteStreamAsBrotli(file: string | Buffer, output: string, options?: BrotliCompressLevel): WriteStream;
intoGzipStream(output: string, options?: ZlibOptions): WriteStream;
intoBrotliStream(output: string, options?: BrotliOptions): WriteStream;
writeGzip(file: string | Buffer, output: string, options?: CompressLevel): Promise<void>;
writeBrotli(file: string | Buffer, output: string, options?: CompressLevel): Promise<void>;
tryFile(file: string | Buffer, options: CompressFormat): Promise<BufferResult>;
tryFile(file: string | Buffer, output: string, options?: CompressFormat): Promise<BufferResult>;
tryImage(file: string, options: CompressFormat): Promise<BufferResult>;
tryImage(file: string | Buffer, output: string, options?: CompressFormat): Promise<BufferResult>;
hasPermission(type: string, options?: unknown): boolean;
set chunkSize(value: number | string | undefined): void;
get chunkSize(): number | undefined;
get settings(): CompressSettings;
}
interface CompressConstructor extends ModuleConstructor {
singleton(): ICompress;
asBuffer(data: Buffer | Uint8Array): Buffer;
readonly prototype: ICompress;
new(module?: CompressModule): ICompress;
}
Changelog
Added in version 0.14.0:
ICompress function tryFile options property format as zst is conditionally supported.
Note
NodeJS 22.15
Removed in version 0.14.0:
ICompress compression format zopfli as gzip is no longer supported.
Added in version 0.13.0:
ICompress interface CompressLevel has extended ZlibOptions.
ICompress interface BrotliCompressLevel has extended BrotliOptions.
Added in version 0.12.0:
ICompress function intoGzipStream | intoBrotliStream were created.
CompressConstructor function asBuffer was created.
Changed in version 0.12.0:
ICompress function tryFile | tryImage enforce read (file) and write (output) permissions.
BREAKINGtype PluginCompressor argument mimeType as string was replaced with metadata as PlainObject.
Changed in version 0.10.0:
ICompress property chunkSize was converted into a 1KB aligned accessor.
Added in version 0.9.0:
ICompress function writeGzip | writeBrotli were created.
Removed in version 0.9.0:
ICompress function tryFile | tryImage argument callback as function is no longer available.
Settings
import type { CacheDirAction } from "./settings";
import type { BrotliOptions, ZlibOptions, ZstdOptions } from "node:zlib";
interface CompressModule {
gzip?: ZlibOptions;
brotli?: BrotliOptions;
zstd?: ZstdOptions;
settings?: {
broadcast_id?: string | string[];
cache?: boolean | CacheDirAction & { font?: string | number | boolean; image?: string | number | boolean; };
cache_expires?: number | string;
gzip_level?: number;
brotli_quality?: number;
zstd_compression_level?: number | string;
chunk_size?: number | string;
};
}
Changelog
Added in version 0.14.0:
CompressModule settings for Zstandard compression format (experimental) is supported.
Removed in version 0.14.0:
CompressModule settings for zopfli compression format were deleted.
Changed in version 0.13.0:
CompressModule settings property cache as CacheDirAction for categorized cache expiration was implemented.
Removed in version 0.10.0:
Tinify was converted into an optional plugin named @pi-r/tinify.
interface CompressModule {
tinify?: {
api_key?: string;
proxy?: string;
};
}
Example usage
const Compress = require("@e-mc/compress");
const instance = new Compress({
gzip: {
memLevel: 1,
windowBits: 16
},
tinify: {
api_key: "**********"
},
settings: {
gzip_level: 9, // Lowest priority
brotli_quality: 11,
chunk_size: "16kb" // All compression types
}
});
instance.init();
const stream = instance.createWriteStreamAsGzip("/tmp/archive.tar", "/path/output/archive.tar.gz", { level: 5, chunkSize: 4 * 1024 }); // Override settings
stream
.on("finish", () => console.log("finish"))
.on("error", err => console.error(err));
const options = {
plugin: "@pi-r/tinify",
format: "png", // Optional with extension
timeout: 60 * 1000, // 1m
options: {
apiKey: "**********" // Override settings
}
};
instance.tryImage("/tmp/image.png", "/path/output/compressed.png", options)
.then(data => {
console.log(Buffer.byteLength(data));
})
.catch(err => console.error(err));