storage: Add a little app to show something about feed sizes.

This commit is contained in:
Cory McWilliams 2024-11-26 15:59:02 -05:00
parent 595f14d98d
commit 4350c7b7a9
2 changed files with 77 additions and 0 deletions

5
apps/storage.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "💾",
"previous": "&vC6kbwiCRkFMMrapQEQ+SprSbItL/+Tm9AC4eigk48I=.sha256"
}

72
apps/storage/app.js Normal file
View File

@ -0,0 +1,72 @@
async function query(sql, args) {
let rows = [];
await ssb.sqlAsync(sql, args ?? [], function(row) {
rows.push(row);
});
return rows;;
}
async function get_biggest() {
return query(`
select author, sum(length(content)) as size from messages group by author order by size desc limit 10;
`);
}
async function get_names(identities) {
return query(`
SELECT author, name FROM (
SELECT
messages.author,
RANK() OVER (PARTITION BY messages.author ORDER BY messages.sequence DESC) AS author_rank,
messages.content ->> 'name' AS name
FROM messages
JOIN json_each(?) AS identities ON identities.value = messages.author
WHERE
json_extract(messages.content, '$.type') = 'about' AND
content ->> 'about' = messages.author AND name IS NOT NULL)
WHERE author_rank = 1
`, [JSON.stringify(identities)]);
}
function nice_size(bytes) {
let value = bytes;
let index = 0;
let units = ['B', 'kB', 'MB', 'GB'];
while (value > 1024 && index < units.length - 1) {
value /= 1024;
index++;
}
return `${Math.round(value * 10) / 10} ${units[index]}`;
}
async function main() {
await app.setDocument('<p style="color: #fff">Finding the top 10 largest feeds...</p>');
let identities = await ssb.getAllIdentities();
let following1 = await ssb.following(identities, 1);
let following2 = await ssb.following(identities, 2);
let biggest = await get_biggest();
let names = await get_names(biggest.map(x => x.author));
names = Object.fromEntries(names.map(x => [x.author, x.name]));
for (let item of biggest) {
item.name = names[item.author];
item.following =
identities.indexOf(item.author) != -1 ? 0 :
following1[item.author] !== undefined ? 1 :
following2[item.author] !== undefined ? 2 :
undefined;
}
let html = `<body style="color: #000; background-color: #ddd">\n
<h1>Top 10 Accounts by Size</h1>
<ol>`;
for (let item of biggest) {
html += `<li>
<span style="color: #888">${nice_size(item.size)}</span>
<a target="_top" href="/~core/ssb/#${encodeURI(item.author)}">${item.name ?? item.author}</a>
</li>\n`;
}
html += '</ol>\n';
await app.setDocument(html);
}
main().catch(function(e) { print(e); });