VesperDownloadManagerEvent.fromMap constructor
Implementation
factory VesperDownloadManagerEvent.fromMap(Map<Object?, Object?> map) {
final normalized = vesperDecodeMap(map);
final type = normalized['type'] as String?;
final downloadId = normalized['downloadId'] as String? ?? '';
switch (type) {
case 'initialSnapshot':
return VesperDownloadInitialSnapshotEvent(
downloadId: downloadId,
snapshot: VesperDownloadSnapshot.fromMap(
vesperDecodeMap(normalized['snapshot']),
),
);
case 'downloadResync':
final droppedEvents = normalized['droppedEvents'];
if (droppedEvents is! int || droppedEvents < 0) {
throw const FormatException(
'downloadResync droppedEvents must be a non-negative integer.',
);
}
return VesperDownloadResyncEvent(
downloadId: downloadId,
snapshot: _decodeAuthoritativeDownloadSnapshot(
normalized['snapshot'],
),
droppedEvents: droppedEvents,
);
case 'downloadError':
final snapshot = VesperDownloadSnapshot.fromMap(
vesperDecodeMap(normalized['snapshot']),
);
final error = VesperDownloadError.fromMap(
vesperDecodeMap(normalized['error']),
);
return VesperDownloadErrorEvent(
downloadId: downloadId,
error: error,
snapshot: snapshot,
);
case 'exportProgress':
return VesperDownloadExportProgressEvent(
downloadId: downloadId,
taskId: (normalized['taskId'] as num?)?.toInt() ?? 0,
ratio: (normalized['ratio'] as num?)?.toDouble() ?? 0,
);
case 'taskCreated':
return VesperDownloadTaskCreatedEvent(
downloadId: downloadId,
task: VesperDownloadTaskSnapshot.fromMap(
vesperDecodeMap(normalized['task']),
),
);
case 'taskUpdated':
final rawTask = normalized['task'];
final rawPatch = normalized['patch'];
return VesperDownloadTaskUpdatedEvent(
downloadId: downloadId,
task: rawTask == null
? null
: VesperDownloadTaskSnapshot.fromMap(vesperDecodeMap(rawTask)),
patch: rawPatch == null
? null
: VesperDownloadTaskStatePatch.fromMap(
vesperDecodeMap(rawPatch),
),
progressPatch: normalized['progressPatch'] == null
? null
: VesperDownloadTaskProgressPatch.fromMap(
vesperDecodeMap(normalized['progressPatch']),
),
);
case 'taskRemoved':
return VesperDownloadTaskRemovedEvent(
downloadId: downloadId,
taskId: (normalized['taskId'] as num?)?.toInt() ?? 0,
);
case 'disposed':
return VesperDownloadDisposedEvent(downloadId: downloadId);
default:
return VesperDownloadUnknownEvent(
downloadId: downloadId,
type: type ?? '<missing>',
payload: vesperDecodeMap(normalized),
);
}
}