tildefriends/apps/web/handler.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

64 lines
1.6 KiB
JavaScript
Raw Normal View History

2025-04-02 18:07:25 -04:00
async function query(sql, params) {
let results = [];
2025-04-05 22:05:26 -04:00
await ssb.sqlAsync(sql, params, function (row) {
2025-04-02 18:07:25 -04:00
results.push(row);
});
return results;
}
function guess_content_type(name) {
if (name.endsWith('.html')) {
return 'text/html; charset=UTF-8';
} else if (name.endsWith('.js') || name.endsWith('.mjs')) {
return 'text/javascript; charset=UTF-8';
} else if (name.endsWith('.css')) {
return 'text/stylesheet; charset=UTF-8';
} else {
return 'application/binary';
}
}
async function main() {
2025-04-05 22:05:26 -04:00
let path = request.path.replaceAll(/(%[0-9a-fA-F]{2})/g, (x) =>
String.fromCharCode(parseInt(x.substring(1), 16))
);
2025-04-02 18:07:25 -04:00
let match = path.match(/^(%.{44}\.sha256)(?:\/)?(.*)$/);
let content_type = guess_content_type(request.path);
2025-04-05 22:05:26 -04:00
let root = await query(
`
2025-04-02 18:07:25 -04:00
SELECT root.content ->> 'root' AS root
FROM messages site
JOIN messages root
ON site.id = ? AND root.author = site.author AND root.content ->> 'site' = site.id
ORDER BY root.sequence DESC LIMIT 1
2025-04-05 22:05:26 -04:00
`,
[match[1]]
);
2025-04-02 18:07:25 -04:00
let root_id = root[0]['root'];
let last_id = root_id;
let blob = await ssb.blobGet(root_id);
try {
for (let part of match[2]?.split('/')) {
let dir = JSON.parse(utf8Decode(blob));
last_id = dir?.links[part];
blob = await ssb.blobGet(dir?.links[part]);
content_type = guess_content_type(part);
}
2025-04-05 22:05:26 -04:00
} catch {}
2025-04-02 18:07:25 -04:00
respond({
status_code: 200,
data: blob ? utf8Decode(blob) : `${last_id} not found`,
content_type: content_type,
});
}
2025-04-05 22:05:26 -04:00
main().catch(function (e) {
2025-04-02 18:07:25 -04:00
respond({
status_code: 200,
data: `${e.message}\n${e.stack}`,
content_type: 'text/plain',
});
2025-04-05 22:05:26 -04:00
});