can1357/oh-my-pi · error · ArchiveError

RPM package '${identity}' uses unsupported payload compresso

Error message

RPM package '${identity}' uses unsupported payload compressor '${method}'

What it means

decompressPayload's switch reached the default arm: the resolved method string (from sniffing or the declared payload compressor) is not one of gzip/bzip2/xz/zstd/zstdio/lzma/none. The library has no decompressor registered for it and throws with the package identity and the offending method.

Source

Thrown at packages/utils/src/ar/rpm.ts:241

		case "gz":
			return gzipDecompress(payload, maxOutput);
		case "bzip2":
		case "bzip":
			return bzip2Decompress(payload, maxOutput);
		case "xz":
			return xzDecompress(payload, maxOutput);
		case "zstd":
		case "zstdio":
			return zstdDecompress(payload, maxOutput);
		case "lzma":
			if (!sniffLzmaAlone(payload)) throw new ArchiveError(`RPM package '${identity}' has a malformed LZMA payload`);
			return lzmaAloneDecompress(payload, maxOutput);
		case "none":
			if (!sniffCpio(payload))
				throw new ArchiveError(`RPM package '${identity}' has an invalid uncompressed CPIO payload`);
			return payload;
		default:
			throw new ArchiveError(`RPM package '${identity}' uses unsupported payload compressor '${method}'`);
	}
}

async function readRpmArchive(source: ByteSource, options: FormatReadOptions): Promise<ArchiveIndexEntry[]> {
	const initial = await readExact(source, 0, RPM_LEAD_SIZE + RPM_HEADER_INTRO_SIZE, "lead and signature header");
	if (!sniffRpm(initial)) throw new ArchiveError("Invalid RPM package: bad lead magic");
	const major = initial[4]!;
	const packageType = (initial[6]! << 8) | initial[7]!;
	if (major < 3 || packageType > 1) throw new ArchiveError("Unsupported RPM package lead version or type");
	const signatureType = (initial[78]! << 8) | initial[79]!;
	if (signatureType !== RPM_SIGNATURE_TYPE_HEADER) {
		throw new ArchiveError(`Unsupported RPM signature type ${signatureType}; only header signatures are supported`);
	}
	const leadNameEnd = initial.subarray(10, 76).indexOf(0);
	const leadNameBytes = initial.subarray(10, leadNameEnd < 0 ? 76 : 10 + leadNameEnd);
	let leadName = "unknown package";
	try {
		const decoded = new TextDecoder("utf-8", { fatal: true }).decode(leadNameBytes);

View on GitHub (pinned to 9690622007)

Solutions

  1. Identify the actual payload format (hexdump the payload region) and confirm it is one the library supports (gzip/bzip2/xz/zstd/lzma/plain cpio).
  2. Convert the package first: rpm2archive or repack with a supported compressor (rpmbuild --define '%_binary_payload w.bzdio' etc.).
  3. Use system rpm2cpio | cpio -id to extract contents outside this library.
  4. If you control packaging, switch CI builds to gzip or xz payloads.

Example fix

// before: readArchive directly on a zck payload
const entries = await readArchive(zckRpm);
// after: normalize via system tooling when compressor is unsupported
if (!SUPPORTED_COMPRESSORS.includes(declaredCompressor)) rpmBuffer = await rpm2archiveConvert(file);
Defensive patterns

Strategy: try-catch

Validate before calling

const meta = await metadata(path);
const supported = new Set(['gzip','bzip2','xz','zstd','zstdio','lzma','none']);
if (meta.payloadCompressor && !supported.has(meta.payloadCompressor)) {
  console.warn(`compressor ${meta.payloadCompressor} unsupported; converting via rpm2archive`);
}

Try / catch

try {
  return await readRpm(path);
} catch (err) {
  if (err instanceof ArchiveError && err.message.includes('unsupported payload compressor')) {
    return await extractWithRpm2cpio(path); // system-tool fallback
  }
  throw err;
}

Prevention

When it happens

Trigger: The declared PayloadCompressor tag or sniffed method yields a value outside the supported switch set (e.g. 'zck', an empty/whitespace string, or an unexpected custom value) and it survives the sniff chain; raised at the switch default.

Common situations: Fedora/openSUSE packages using zchunk compression, vendor-patched rpms with experimental payload formats, or packages where the compressor tag holds an unexpected value the sniff chain did not intercept.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/5655163aac444d44. Report an issue: GitHub.