SoftwareAsset.fromEvent constructor
SoftwareAsset.fromEvent(
- 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,
);
}