Refactor pull queries promisification

This commit is contained in:
Rogerio Chaves 2020-04-12 12:13:01 +02:00
parent 938db34a11
commit 850147ea2f
No known key found for this signature in database
GPG Key ID: E6AF5440509B1D94
3 changed files with 229 additions and 269 deletions

View File

@ -7,50 +7,38 @@ const debugPosts = require("debug")("queries:posts"),
debugPeople = require("debug")("queries:people"), debugPeople = require("debug")("queries:people"),
debugProfile = require("debug")("queries:profile"); debugProfile = require("debug")("queries:profile");
const paramap = require("pull-paramap"); const paramap = require("pull-paramap");
const { promisePull, mapValues } = require("./utils");
const latestOwnerValue = (ssbServer, { key, dest }) => const latestOwnerValue = (ssbServer, { key, dest }) => {
new Promise((resolve, reject) => { return promisePull(
let value = null; ssbServer.query.read({
pull( reverse: true,
ssbServer.query.read({ query: [
reverse: true, {
query: [ $filter: {
{ value: {
$filter: { author: dest,
value: { content: { type: "about", about: dest },
author: dest,
content: { type: "about", about: dest },
},
}, },
}, },
],
}),
pull.filter((msg) => {
return (
msg.value.content &&
key in msg.value.content &&
!(msg.value.content[key] && msg.value.content[key].remove)
);
}),
pull.take(1),
pull.drain(
(msg) => {
value = msg.value.content[key];
}, },
(err) => { ],
if (err) return reject(err); }),
if (!value) { pull.filter((msg) => {
ssbServer.about return (
.latestValue({ key, dest }) msg.value.content &&
.then(resolve) key in msg.value.content &&
.catch(reject); !(msg.value.content[key] && msg.value.content[key].remove)
} else { );
resolve(value); }),
} pull.take(1)
} ).then(([entry]) => {
) if (entry) {
); return entry.value.content[key];
}
return ssbServer.about.latestValue({ key, dest });
}); });
};
const mapProfiles = (ssbServer) => (data, callback) => const mapProfiles = (ssbServer) => (data, callback) =>
getProfile(ssbServer, data.value.author) getProfile(ssbServer, data.value.author)
@ -60,115 +48,28 @@ const mapProfiles = (ssbServer) => (data, callback) =>
}) })
.catch((err) => callback(err, null)); .catch((err) => callback(err, null));
const getPosts = (ssbServer, profile) => const getPosts = async (ssbServer, profile) => {
debugPosts("Fetching") || debugPosts("Fetching");
new Promise((resolve, reject) => {
pull(
// @ts-ignore
cat([
ssbServer.query.read({
reverse: true,
query: [
{
$filter: {
value: {
private: { $not: true },
content: {
root: profile.id,
},
},
},
},
],
limit: 100,
}),
ssbServer.query.read({
reverse: true,
query: [
{
$filter: {
value: {
author: profile.id,
private: { $not: true },
content: {
type: "post",
root: { $not: true },
},
},
},
},
],
limit: 100,
}),
]),
pull.filter((msg) => msg.value.content.type == "post"),
paramap(mapProfiles(ssbServer)),
pull.collect((err, msgs) => {
debugPosts("Done");
const entries = msgs.map((x) => x.value);
if (err) return reject(err); const posts = await promisePull(
return resolve(entries); // @ts-ignore
}) cat([
); ssbServer.query.read({
}); reverse: true,
query: [
const getVanishingMessages = async (ssbServer, profile) => { {
debugMessages("Fetching"); $filter: {
const messagesPromise = new Promise((resolve, reject) => { value: {
pull( private: { $not: true },
// @ts-ignore content: {
cat([ root: profile.id,
ssbServer.query.read({
reverse: true,
query: [
{
$filter: {
value: {
private: true,
content: {
root: profile.id,
},
}, },
}, },
}, },
], },
limit: 100, ],
}), limit: 100,
ssbServer.query.read({ }),
reverse: true,
query: [
{
$filter: {
value: {
private: true,
content: {
type: "post",
root: { $not: true },
},
},
},
},
],
limit: 100,
}),
]),
pull.filter(
(msg) =>
msg.value.content.type == "post" &&
(msg.value.content.root ||
msg.value.content.recps.includes(profile.id))
),
paramap(mapProfiles(ssbServer)),
pull.collect((err, msgs) => {
if (err) return reject(err);
return resolve(msgs);
})
);
});
const deletedPromise = new Promise((resolve, reject) => {
pull(
ssbServer.query.read({ ssbServer.query.read({
reverse: true, reverse: true,
query: [ query: [
@ -176,20 +77,91 @@ const getVanishingMessages = async (ssbServer, profile) => {
$filter: { $filter: {
value: { value: {
author: profile.id, author: profile.id,
private: { $not: true },
content: { content: {
type: "delete", type: "post",
root: { $not: true },
}, },
}, },
}, },
}, },
], ],
limit: 100,
}), }),
pull.collect((err, msgs) => { ]),
if (err) return reject(err); pull.filter((msg) => msg.value.content.type == "post"),
return resolve(Object.values(msgs)); paramap(mapProfiles(ssbServer))
}) );
);
}); debugPosts("Done");
return mapValues(posts);
};
const getVanishingMessages = async (ssbServer, profile) => {
debugMessages("Fetching");
const messagesPromise = promisePull(
// @ts-ignore
cat([
ssbServer.query.read({
reverse: true,
query: [
{
$filter: {
value: {
private: true,
content: {
root: profile.id,
},
},
},
},
],
limit: 100,
}),
ssbServer.query.read({
reverse: true,
query: [
{
$filter: {
value: {
private: true,
content: {
type: "post",
root: { $not: true },
},
},
},
},
],
limit: 100,
}),
]),
pull.filter(
(msg) =>
msg.value.content.type == "post" &&
(msg.value.content.root || msg.value.content.recps.includes(profile.id))
),
paramap(mapProfiles(ssbServer))
);
const deletedPromise = promisePull(
ssbServer.query.read({
reverse: true,
query: [
{
$filter: {
value: {
author: profile.id,
content: {
type: "delete",
},
},
},
},
],
})
).then(Object.values);
const [messages, deleted] = await Promise.all([ const [messages, deleted] = await Promise.all([
messagesPromise, messagesPromise,
@ -200,10 +172,60 @@ const getVanishingMessages = async (ssbServer, profile) => {
return messages.filter((m) => !deletedIds.includes(m.key)); return messages.filter((m) => !deletedIds.includes(m.key));
}; };
const searchPeople = (ssbServer, search) => const searchPeople = async (ssbServer, search) => {
debugPeople("Fetching") || debugPeople("Fetching");
new Promise((resolve, reject) => {
pull( const people = await promisePull(
ssbServer.query.read({
reverse: true,
query: [
{
$filter: {
value: {
content: {
type: "about",
name: { $is: "string" },
},
},
},
},
],
}),
pull.filter((msg) => {
return (
msg.value.content &&
msg.value.author == msg.value.content.about &&
msg.value.content.name.includes(search)
);
})
);
debugPeople("Done");
return Object.values(mapValues(people));
};
const getFriends = async (ssbServer, profile) => {
debugFriends("Fetching");
let contacts = await promisePull(
// @ts-ignore
cat([
ssbServer.query.read({
reverse: true,
query: [
{
$filter: {
value: {
author: profile.id,
content: {
type: "contact",
},
},
},
},
],
limit: 100,
}),
ssbServer.query.read({ ssbServer.query.read({
reverse: true, reverse: true,
query: [ query: [
@ -211,79 +233,17 @@ const searchPeople = (ssbServer, search) =>
$filter: { $filter: {
value: { value: {
content: { content: {
type: "about", type: "contact",
name: { $is: "string" }, contact: profile.id,
}, },
}, },
}, },
}, },
], ],
limit: 100,
}), }),
pull.filter((msg) => { ])
return ( ).then(mapValues);
msg.value.content &&
msg.value.author == msg.value.content.about &&
msg.value.content.name.includes(search)
);
}),
pull.collect((err, msgs) => {
debugPeople("Done");
const entries = msgs.map((x) => x.value);
if (err) return reject(err);
return resolve(Object.values(entries));
})
);
});
const getFriends = async (ssbServer, profile) => {
debugFriends("Fetching");
let contacts = await new Promise((resolve, reject) => {
pull(
// @ts-ignore
cat([
ssbServer.query.read({
reverse: true,
query: [
{
$filter: {
value: {
author: profile.id,
content: {
type: "contact",
},
},
},
},
],
limit: 100,
}),
ssbServer.query.read({
reverse: true,
query: [
{
$filter: {
value: {
content: {
type: "contact",
contact: profile.id,
},
},
},
},
],
limit: 100,
}),
]),
pull.collect((err, msgs) => {
const entries = msgs.map((x) => x.value);
if (err) return reject(err);
return resolve(entries);
})
);
});
let network = {}; let network = {};
let requestRejections = []; let requestRejections = [];
@ -340,33 +300,25 @@ const getFriends = async (ssbServer, profile) => {
const getFriendshipStatus = async (ssbServer, source, dest) => { const getFriendshipStatus = async (ssbServer, source, dest) => {
debugFriendshipStatus("Fetching"); debugFriendshipStatus("Fetching");
let requestRejectionsPromise = new Promise((resolve, reject) => { let requestRejectionsPromise = promisePull(
pull( ssbServer.query.read({
ssbServer.query.read({ reverse: true,
reverse: true, query: [
query: [ {
{ $filter: {
$filter: { value: {
value: { author: source,
author: source, content: {
content: { type: "contact",
type: "contact", following: false,
following: false,
},
}, },
}, },
}, },
], },
limit: 100, ],
}), limit: 100,
pull.collect((err, msgs) => { })
const entries = msgs.map((x) => x.value); ).then(mapValues);
if (err) return reject(err);
return resolve(entries);
})
);
});
const [isFollowing, isFollowingBack, requestRejections] = await Promise.all([ const [isFollowing, isFollowingBack, requestRejections] = await Promise.all([
ssbServer.friends.isFollowing({ source: source, dest: dest }), ssbServer.friends.isFollowing({ source: source, dest: dest }),
@ -391,29 +343,24 @@ const getFriendshipStatus = async (ssbServer, source, dest) => {
return status; return status;
}; };
const getAllEntries = (ssbServer, query) => const getAllEntries = (ssbServer, query) => {
new Promise((resolve, reject) => { let queries = [];
let queries = []; if (query.author) {
if (query.author) { queries.push({ $filter: { value: { author: query.author } } });
queries.push({ $filter: { value: { author: query.author } } }); }
} if (query.type) {
if (query.type) { queries.push({ $filter: { value: { content: { type: query.type } } } });
queries.push({ $filter: { value: { content: { type: query.type } } } }); }
} const queryOpts = queries.length > 0 ? { query: queries } : {};
const queryOpts = queries.length > 0 ? { query: queries } : {};
pull( return promisePull(
ssbServer.query.read({ ssbServer.query.read({
reverse: true, reverse: true,
limit: 500, limit: 500,
...queryOpts, ...queryOpts,
}), })
pull.collect((err, msgs) => { );
if (err) return reject(err); };
return resolve(msgs);
})
);
});
let profileCache = {}; let profileCache = {};
const getProfile = async (ssbServer, id) => { const getProfile = async (ssbServer, id) => {

View File

@ -80,3 +80,16 @@ module.exports.uploadPicture = async (ssbServer, picture) => {
) )
); );
}; };
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);

View File

@ -17,7 +17,7 @@ messages.forEach((message) => {
const onClose = () => { const onClose = () => {
const parent = modal.parentElement; const parent = modal.parentElement;
parent.parentElement.removeChild(parent); parent.parentElement.removeChild(parent);
if (document.querySelectorAll(".vanishing-message").length == 0) { if (document.querySelectorAll(".js-vanishing-message").length == 0) {
document.querySelector(".js-vanishing-messages").style.display = "none"; document.querySelector(".js-vanishing-messages").style.display = "none";
} }
}; };