From 7b18bf91ce3ca263aa1eba3ddad5b337d666a7f2 Mon Sep 17 00:00:00 2001 From: ansuz Date: Thu, 27 Jun 2019 11:11:22 +0200 Subject: [PATCH] implement functions for iterating over metadata logs --- lib/metadata.js | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 lib/metadata.js diff --git a/lib/metadata.js b/lib/metadata.js new file mode 100644 index 000000000..b4e9f918c --- /dev/null +++ b/lib/metadata.js @@ -0,0 +1,99 @@ +var Meta = module.exports; + +/* Metadata fields: + + * channel + * validateKey + * owners + * ADD_OWNERS + * RM_OWNERS + * expire + +*/ + +var commands = {}; + +// ["ADD_OWNERS", ["7eEqelGso3EBr5jHlei6av4r9w2B9XZiGGwA1EgZ-5I="], 1561623438989] +commands.ADD_OWNERS = function (meta, args) { + if (!Array.isArray(args)) { + throw new Error('METADATA_INVALID_OWNERS'); + } + if (!Array.isArray(meta.owners)) { + throw new Error("METADATA_NONSENSE_OWNERS"); + } + + args.forEach(function (owner) { + if (meta.owners.indexOf(owner) >= 0) { return; } + meta.owners.push(owner); + }); +}; + +// ["RM_OWNERS", ["CrufexqXcY-z+eKJlEbNELVy5Sb7E-EAAEFI8GnEtZ0="], 1561623439989] +commands.RM_OWNERS = function (meta, args) { + if (!Array.isArray(args)) { + throw new Error('METADATA_INVALID_OWNERS'); + } + if (!Array.isArray(meta.owners)) { + throw new Error("METADATA_NONSENSE_OWNERS"); + } + + args.forEach(function (owner) { + var index = meta.owners.indexOf(owner); + meta.owners.splice(index, 1); + }); +}; + +commands.UPDATE_EXPIRATION = function () { + +}; + +var handleCommand = function (meta, line) { + var command = line[0]; + var args = line[1]; + //var time = line[2]; + + if (typeof(commands[command]) !== 'function') { + throw new Error("METADATA_UNSUPPORTED_COMMAND"); + } + + commands[command](meta, args); +}; + +Meta.createLineHandler = function (ref, errorHandler) { + ref.meta = {}; + + errorHandler = errorHandler; + + return function (err, line, index) { + if (err) { + return void errorHandler('METADATA_HANDLER_LINE_ERR', { + error: err, + index: index, + line: JSON.stringify(line), + }); + } + + if (Array.isArray(line)) { + try { + handleCommand(ref.meta, line); + } catch (err) { + errorHandler("METADATA_COMMAND_ERR", { + error: err.stack, + line: line, + }); + } + return; + } + + if (index === 0 && typeof(line) === 'object') { + // special case! + ref.meta = line; + return; + } + + errorHandler("METADATA_HANDLER_WEIRDLINE", { + line: line, + index: index + }); + }; +};