feedless/app/lib/utils.js

105 lines
2.7 KiB
JavaScript
Raw Normal View History

const fs = require("fs");
2020-04-11 13:02:05 +02:00
const leftpad = require("left-pad"); // I don't believe I'm depending on this
2020-04-11 13:23:17 +02:00
const pull = require("pull-stream");
const split = require("split-buffer");
2020-04-15 20:02:13 +02:00
const metrics = require("./metrics");
module.exports.asyncRouter = (app) => {
const debug = require("debug")("router");
2020-04-15 20:02:13 +02:00
let wrapper = (method, path, fn) => async (req, res, next) => {
try {
2020-04-15 20:02:13 +02:00
debug(`${method} ${path}`);
metrics.router.inc({ method, path });
await fn(req, res);
} catch (e) {
next(e);
}
};
return {
get: (path, fn) => {
2020-04-15 20:02:13 +02:00
app.get(path, wrapper("GET", path, fn));
},
post: (path, fn) => {
debug(`POST ${path}`);
2020-04-15 20:02:13 +02:00
app.post(path, wrapper("POST", path, fn));
},
};
};
2020-04-11 13:02:05 +02:00
const ssbFolder = () => {
let homeFolder =
process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
2020-04-11 13:02:05 +02:00
return `${homeFolder}/.${process.env.CONFIG_FOLDER || "social"}`;
};
module.exports.ssbFolder = ssbFolder;
2020-04-11 13:02:05 +02:00
module.exports.writeKey = (key, path) => {
let secretPath = `${ssbFolder()}${path}`;
// Same options ssb-keys use
try {
fs.mkdirSync(ssbFolder(), { recursive: true });
} catch (e) {}
fs.writeFileSync(secretPath, key, { mode: 0x100, flag: "wx" });
};
2020-04-11 13:02:05 +02:00
module.exports.identityFilename = (index) => {
return "secret_" + leftpad(index, 2, "0") + ".butt";
};
2020-04-11 13:02:05 +02:00
module.exports.nextIdentityFilename = async (ssbServer) => {
const identities = await ssbServer.identities.list();
return module.exports.identityFilename(identities.length - 1);
2020-04-11 13:02:05 +02:00
};
// From ssb-keys
module.exports.reconstructKeys = (keyfile) => {
var privateKey = keyfile
.replace(/\s*\#[^\n]*/g, "")
.split("\n")
.filter((x) => x)
.join("");
var keys = JSON.parse(privateKey);
const hasSigil = (x) => /^(@|%|&)/.test(x);
if (!hasSigil(keys.id)) keys.id = "@" + keys.public;
return keys;
};
module.exports.readKey = (path) => {
let secretPath = `${ssbFolder()}${path}`;
let keyfile = fs.readFileSync(secretPath, "utf8");
return module.exports.reconstructKeys(keyfile);
};
2020-04-11 13:23:17 +02:00
module.exports.uploadPicture = async (ssbServer, picture) => {
const maxSize = 5 * 1024 * 1024; // 5 MB
if (picture.size > maxSize) throw "Max size exceeded";
return await new Promise((resolve, reject) =>
pull(
pull.values(split(picture.data, 64 * 1024)),
ssbServer.blobs.add((err, result) => {
if (err) return reject(err);
return resolve(result);
})
)
);
};
2020-04-12 12:13:01 +02:00
module.exports.promisePull = (...streams) =>
new Promise((resolve, reject) => {
pull(
...streams,
pull.collect((err, msgs) => {
if (err) return reject(err);
return resolve(msgs);
})
);
});
module.exports.mapValues = (x) => x.map((y) => y.value);