preflightSignaturesFast method

Future<PdfPreflightSignaturesFastReport> preflightSignaturesFast(
  1. Uint8List pdfBytes, {
  2. PdfSignaturePreparedContext? preparedContext,
  3. PdfValidationCacheHooks? cacheHooks,
  4. Duration cacheTtl = const Duration(minutes: 2),
  5. bool incremental = true,
})

Implementation

Future<PdfPreflightSignaturesFastReport> preflightSignaturesFast(
  Uint8List pdfBytes, {
  PdfSignaturePreparedContext? preparedContext,
  PdfValidationCacheHooks? cacheHooks,
  Duration cacheTtl = const Duration(minutes: 2),
  bool incremental = true,
}) async {
  final cacheKey = 'preflight-fast:${_sha256Hex(pdfBytes)}';
  final cached = await _cacheGet<PdfPreflightSignaturesFastReport>(
    cacheHooks,
    cacheKey,
    fromJson: (raw) => PdfPreflightSignaturesFastReport.fromJson(raw),
  );
  if (cached != null) {
    return cached;
  }

  if (incremental) {
    final quick = _preflightIncremental(
      pdfBytes,
      preparedContext: preparedContext,
    );
    await _cachePut(
      cacheHooks,
      cacheKey,
      quick,
      cacheTtl,
      toJson: (value) => value.toJson(),
    );
    return quick;
  }

  final extraction = await _extractor.extractSignatures(
    pdfBytes,
    includeCertificates: true,
    includeSignatureFields: true,
    preparedContext: preparedContext,
  );
  final akiBySignature = _extractAuthorityKeyIdentifiersFromCms(
    pdfBytes,
    preparedContext: preparedContext,
  );

  final signatures = extraction.signatures.map((sig) {
    final signer = sig.signerCertificate;
    final signerSerial = signer?.serial;
    final aki = akiBySignature[sig.signatureIndex];
    return PdfPreflightSignatureFastInfo(
      signatureIndex: sig.signatureIndex,
      fieldName: sig.signatureField?.fieldName ?? 'Signature',
      serialDecimal: signerSerial?.toString(),
      serialHex: signerSerial == null ? null : bigIntToHexUpper(signerSerial),
      issuerDn: signer?.issuer,
      policyOid: sig.signaturePolicyOid,
      signingTime: sig.signingTime,
      authorityKeyIdentifierHex: aki,
      notes: aki == null || aki.isEmpty
          ? 'AKI indisponível no certificado extraído.'
          : null,
    );
  }).toList(growable: false);

  final result = PdfPreflightSignaturesFastReport(signatures: signatures);
  await _cachePut(
    cacheHooks,
    cacheKey,
    result,
    cacheTtl,
    toJson: (value) => value.toJson(),
  );
  return result;
}