void FilelistApi::on(DirectoryListingManagerListener::ListingClosed, const DirectoryListingPtr& aList) noexcept {
    removeSubModule(aList->getUser()->getCID());

    if (!subscriptionActive("filelist_removed")) {
        return;
    }

    send("filelist_removed", {
        { "id", aList->getUser()->getCID().toBase32() }
    });
}
json FilelistApi::serializeList(const DirectoryListingPtr& aList) noexcept {
    int64_t totalSize = -1;
    size_t totalFiles = -1;
    aList->getPartialListInfo(totalSize, totalFiles);

    return{
        { "id", aList->getUser()->getCID().toBase32() },
        { "user", Serializer::serializeHintedUser(aList->getHintedUser()) },
        { "state", FilelistInfo::serializeState(aList) },
        { "location", FilelistInfo::serializeLocation(aList) },
        { "partial", aList->getPartialList() },
        { "total_files", totalFiles },
        { "total_size", totalSize },
        { "read", aList->isRead() },
        { "share_profile", aList->getIsOwnList() ? Serializer::serializeShareProfileSimple(aList->getShareProfile()) : json() },
    };
}