SoftwareAsset.fromEvent constructor

SoftwareAsset.fromEvent(
  1. Nip01Event event
)

Implementation

factory SoftwareAsset.fromEvent(Nip01Event event) {
  if (event.kind != softwareAssetKind) {
    throw SoftwareParseException('expected kind $softwareAssetKind');
  }
  if (event.content.isNotEmpty) {
    throw const SoftwareParseException('asset content must be empty');
  }
  final mimeType = _requiredTag(event, 'm');
  final hash = _normalizedHash(_requiredTag(event, 'x'));
  if (!RegExp(r'^[0-9a-f]{64}$').hasMatch(hash)) {
    throw const SoftwareParseException('asset x tag must be a SHA-256 hash');
  }
  int? parseIntTag(String name) {
    final value = _optionalTag(event, name);
    if (value == null) return null;
    final parsed = int.tryParse(value);
    if (parsed == null || parsed < 0) {
      throw SoftwareParseException(
          'asset $name must be a non-negative integer');
    }
    return parsed;
  }

  final versionCode = parseIntTag('version_code');
  final certificates = _tags(event, 'apk_certificate_hash')
      .map(_normalizedHash)
      .toList(growable: false);
  if (mimeType == androidPackageMimeType &&
      (versionCode == null ||
          certificates.isEmpty ||
          certificates.any((hash) => hash.length != 64))) {
    throw const SoftwareParseException(
      'Android asset requires version_code and apk_certificate_hash',
    );
  }
  return SoftwareAsset(
    identifier: _requiredTag(event, 'i'),
    version: _requiredTag(event, 'version'),
    mimeType: mimeType,
    sha256: hash,
    urls: _tags(event, 'url'),
    size: parseIntTag('size'),
    platforms: _tags(event, 'f'),
    minPlatformVersion: parseIntTag('min_platform_version'),
    versionCode: versionCode,
    minAllowedVersionCode: parseIntTag('min_allowed_version_code'),
    certificateHashes: certificates,
    variant: _optionalTag(event, 'variant'),
    event: event,
  );
}