diff --git a/lib/commands/linked.js b/lib/commands/linked.js index 95156c276..86a70de77 100644 --- a/lib/commands/linked.js +++ b/lib/commands/linked.js @@ -44,7 +44,12 @@ Linked.getLinkedDocuments = (Env, data, cb) => { }); }; -Linked.listLinkedDocuments = (Env, channel, cb) => { +Linked.listLinkedDocuments = (Env, channel, _cb) => { + const cb = Util.mkAsync(_cb); + if (channel.length !== HK.STANDARD_CHANNEL_LENGTH) { + return void cb(void 0, []); + } + const list = new Set(); Linked.getLinkedDocuments(Env, { channel }, (err, json) => { if (err) { return void cb(err); } @@ -54,7 +59,7 @@ Linked.listLinkedDocuments = (Env, channel, cb) => { if (!Array.isArray(data)) { return; } // Media or channel: if (type !== 'checkpoints') { - data.forEach(list.add); + data.forEach(id => { list.add(id); }); return; } // Checkpoint: diff --git a/lib/commands/pin-rpc.js b/lib/commands/pin-rpc.js index 78c360d9c..55b55f9c2 100644 --- a/lib/commands/pin-rpc.js +++ b/lib/commands/pin-rpc.js @@ -7,6 +7,7 @@ const Core = require("./core"); const Pinning = module.exports; const Util = require("../common-util"); const nThen = require("nthen"); +const Linked = require('./linked'); const escapeKeyCharacters = Util.escapeKeyCharacters; const unescapeKeyCharacters = Util.unescapeKeyCharacters; @@ -74,6 +75,25 @@ var getChannelList = Pinning.getChannelList = function (Env, safeKey, _cb) { }); }; +var addLinkedDocuments = (Env, channels, cb) => { + var arr = Array.from(channels); + var n = nThen; + arr.forEach(chan => { + // For each channel, add their linked documents + n = n(w => { + Linked.listLinkedDocuments(Env, chan, w((err, linked) => { + if (err || !linked) { return; } + linked.forEach(id => { + channels.add(id); + }); + })); + }).nThen; + }); + n(() => { + cb(); + }); +}; + Pinning.getTotalSize = function (Env, safeKey, cb) { var unsafeKey = unescapeKeyCharacters(safeKey); var limit = Env.limits[unsafeKey]; @@ -108,6 +128,8 @@ Pinning.getTotalSize = function (Env, safeKey, cb) { })); }); } + }).nThen(function (waitFor) { + addLinkedDocuments(Env, channels, waitFor()); }).nThen(function () { Env.getTotalSize(Array.from(channels), done); });