import { Buffer } from 'buffer'; import { gunzipSync, gzipSync } from 'zlib'; import { RevocationStatusList } from './revocationStatusList.js'; import { STATUS_LIST } from '../config.js'; import BitArray from './BitArray.js'; import InvalidCredentialIndexException from './exceptions/invalidCredentialIndexException.js'; export class RevocationStatusListArray implements RevocationStatusList { private encodedList: BitArray; constructor(bitArray?: BitArray) { this.encodedList = bitArray ?? new BitArray(STATUS_LIST.MAX_CREDENTIAL_ID / 8); } static fromEncoded(encodedList: string): RevocationStatusListArray { const decodedFromBase64 = Buffer.from(encodedList, 'base64'); const uncompressedData = gunzipSync(decodedFromBase64); return new RevocationStatusListArray(new BitArray(uncompressedData)); } encoded(): string { const compressedData = Buffer.from(gzipSync(this.encodedList.toArray())); return compressedData.toString('base64'); } revokeCredential(credentialId: number): void { this.checkCredentialId(credentialId); this.encodedList.set(credentialId); } checkCredentialId(credentialId: number): void { if (credentialId > STATUS_LIST.MAX_CREDENTIAL_ID || credentialId < 0) throw new InvalidCredentialIndexException(credentialId.toString()); } isRevoked(credentialId: number): boolean { return this.encodedList.get(credentialId) === 1; } }