gzip.ts•1.49 kB
import { SupportedFileType } from '@superglue/shared';
import { promisify } from 'util';
import { gunzip } from 'zlib';
import { DetectionPriority, FileParsingStrategy } from '../strategy.js';
const gunzipAsync = promisify(gunzip);
type ParseFileFunction = (buffer: Buffer, fileType: SupportedFileType) => Promise<any>;
// Store parseFile function to avoid circular import (set by index.ts)
let parseFileFunction: ParseFileFunction | null = null;
export function setGzipParseFileFunction(fn: ParseFileFunction): void {
parseFileFunction = fn;
}
export class GZIPStrategy implements FileParsingStrategy {
readonly fileType = SupportedFileType.RAW; // GZIP is a container, not a final type
readonly priority = DetectionPriority.GZIP;
canHandle(buffer: Buffer): boolean {
// GZIP files start with 1f8b signature
if (buffer.length < 2) return false;
const signature = buffer.subarray(0, 2).toString('hex');
return signature === '1f8b';
}
async parse(buffer: Buffer): Promise<any> {
return parseGZIP(buffer);
}
}
export async function parseGZIP(buffer: Buffer): Promise<any> {
const decompressed = await gunzipAsync(buffer);
// Recursively parse the decompressed content using the injected parseFile function
if (parseFileFunction) {
return parseFileFunction(decompressed, SupportedFileType.AUTO);
}
// Fallback: return raw buffer if parseFile function not set
return decompressed;
}