pauls-dat-api
Version:
Library of functions that make working with dat / hyperdrive easier.
111 lines (95 loc) • 4.93 kB
JavaScript
function _asyncToGenerator(fn) {return function () {var gen = fn.apply(this, arguments);return new Promise(function (resolve, reject) {function step(key, arg) {try {var info = gen[key](arg);var value = info.value;} catch (error) {reject(error);return;}if (info.done) {resolve(value);} else {return Promise.resolve(value).then(function (value) {step("next", value);}, function (err) {step("throw", err);});}}return step("next");});};}var _require = require('./const'),DAT_MANIFEST_FILENAME = _require.DAT_MANIFEST_FILENAME,DAT_HASH_REGEX = _require.DAT_HASH_REGEX;var _require2 =
require('./common'),maybe = _require2.maybe;var _require3 =
require('./read'),readFile = _require3.readFile;var _require4 =
require('./write'),writeFile = _require4.writeFile;
// helper to read the manifest into an object
function readManifest(archive, cb) {
return maybe(cb, _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {var data;return regeneratorRuntime.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:_context.next = 2;return (
readFile(archive, DAT_MANIFEST_FILENAME));case 2:data = _context.sent;
data = JSON.parse(data.toString());
if (data.links) data.links = massageLinks(data.links);return _context.abrupt('return',
data);case 6:case 'end':return _context.stop();}}}, _callee, this);})));
}
// helper to write a manifest object
function writeManifest(archive, manifest, cb) {
manifest = generateManifest(manifest);
return writeFile(archive, DAT_MANIFEST_FILENAME, JSON.stringify(manifest, null, 2), cb);
}
// helper to write updates to a manifest object
function updateManifest(archive, updates, cb) {
return maybe(cb, _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {var manifest;return regeneratorRuntime.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:_context2.prev = 0;_context2.next = 3;return (
readManifest(archive));case 3:manifest = _context2.sent;_context2.next = 9;break;case 6:_context2.prev = 6;_context2.t0 = _context2['catch'](0);
manifest = {};case 9:
Object.assign(manifest, generateManifest(updates));return _context2.abrupt('return',
writeManifest(archive, manifest));case 11:case 'end':return _context2.stop();}}}, _callee2, this, [[0, 6]]);})));
}
// helper to generate a new dat.json object
function generateManifest() {var manifest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};var
url = manifest.url,title = manifest.title,description = manifest.description,type = manifest.type,author = manifest.author,links = manifest.links,web_root = manifest.web_root,fallback_page = manifest.fallback_page;
if (isString(url)) manifest.url = url;else
delete manifest.url;
if (isString(title)) manifest.title = title;else
delete manifest.title;
if (isString(description)) manifest.description = description;else
delete manifest.description;
if (isString(type)) type = type.split(' ');
if (isArrayOfStrings(type)) manifest.type = type;else
delete manifest.type;
if (isObject(links)) manifest.links = massageLinks(links);else
delete manifest.links;
if (isString(web_root)) manifest.web_root = web_root;else
delete manifest.web_root;
if (isString(fallback_page)) manifest.fallback_page = fallback_page;else
delete manifest.fallback_page;
if (isString(author)) {
if (author.startsWith('dat://') || DAT_HASH_REGEX.test(author)) {
author = { url: author };
} else {
author = { name: author };
}
}
if (isObject(author)) {
manifest.author = {};
if (isString(author.name)) manifest.author.name = author.name;
if (isString(author.url) && (author.url.startsWith('dat://') || DAT_HASH_REGEX.test(author.url))) {
manifest.author.url = author.url;
}
} else {
delete manifest.author;
}
return manifest;
}
function massageLinks(links) {
if (!links || typeof links !== 'object') return {};
for (var rel in links) {
// make each value an array
links[rel] = Array.isArray(links[rel]) ? links[rel] : [links[rel]];
// link-objects only
links[rel] = links[rel].
map(function (link) {
if (isString(link)) {
return { href: link };
}
return link;
}).
filter(isLinkObject);
// remove empty arrays
if (links[rel].length === 0) {
delete links[rel];
}
}
return links;
}
function isString(v) {
return typeof v === 'string';
}
function isArrayOfStrings(v) {
return Array.isArray(v) && v.every(isString);
}
function isLinkObject(v) {
return isObject(v) && v.href && typeof v.href === 'string';
}
function isObject(v) {
return !!v && typeof v === 'object' && !Array.isArray(v);
}
module.exports = { readManifest, generateManifest, writeManifest, updateManifest };
;