storage: Add a little app to show something about feed sizes.
This commit is contained in:
parent
595f14d98d
commit
4350c7b7a9
5
apps/storage.json
Normal file
5
apps/storage.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"type": "tildefriends-app",
|
||||||
|
"emoji": "💾",
|
||||||
|
"previous": "&vC6kbwiCRkFMMrapQEQ+SprSbItL/+Tm9AC4eigk48I=.sha256"
|
||||||
|
}
|
72
apps/storage/app.js
Normal file
72
apps/storage/app.js
Normal 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); });
|
Loading…
Reference in New Issue
Block a user