import { Buffer } from 'buffer'; import zlib from 'zlib'; import { STATUS_LIST } from '../config.js'; import { RevocationStatusList } from './revocationStatusList.js'; import InvalidCredentialIndexException from './exceptions/invalidCredentialIndexException.js'; import { BitSet } from 'bitset'; export class RevocationStatusListBitSet implements RevocationStatusList { private encodedList: BitSet; constructor() { this.encodedList = new BitSet(); } encoded(): string { const input = Buffer.from( this.encodedList .toString() .padStart(STATUS_LIST.MAX_CREDENTIAL_ID + 1, '0'), ); const compressedData = zlib.deflateSync(input); return Buffer.from(compressedData).toString('base64'); } static fromEncoded(encodedList: string): RevocationStatusListBitSet { const decodedFromBase64 = Buffer.from(encodedList, 'base64'); const uncompressedData = zlib.inflateSync(decodedFromBase64).toString(); const revocationList = new RevocationStatusListBitSet(); revocationList.encodedList = new BitSet(uncompressedData); return revocationList; } revokeCredential(credentialId: number): void { this.checkCredentialId(credentialId); this.encodedList.set(credentialId, 1); } checkCredentialId(credentialId: number): void { if (credentialId > STATUS_LIST.MAX_CREDENTIAL_ID || credentialId < 1) throw new InvalidCredentialIndexException(credentialId.toString()); } isRevoked(credentialId: number): boolean { this.checkCredentialId(credentialId); return this.encodedList.get(credentialId) === 1; } }