Refactor pull queries promisification
This commit is contained in:
parent
938db34a11
commit
850147ea2f
|
@ -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) => {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue