Merge pull request #196 from christianbundy/ssb-client-promises

Replace cooler methods with SSB-Client promises
This commit is contained in:
Cinnamon 2020-02-11 17:55:36 -08:00 committed by GitHub
commit 0cfd824677
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 119 additions and 111 deletions

48
package-lock.json generated
View File

@ -3162,9 +3162,9 @@
"integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw="
},
"highlight.js": {
"version": "9.18.0",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.0.tgz",
"integrity": "sha512-A97kI1KAUzKoAiEoaGcf2O9YPS8nbDTCRFokaaeBhnqjQTvbAuAJrQMm21zw8s8xzaMtCQBtgbyGXLGxdxQyqQ=="
"version": "9.18.1",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz",
"integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg=="
},
"hoox": {
"version": "0.0.1",
@ -7023,24 +7023,48 @@
"integrity": "sha512-qe3qpvchJ+gnH8M/ge4rpL+7eRbSmsEAzNwHkDdrW06OBcziQ6/KuAdmcR6joxCbNeoAXAZF+inkefgE16okXA=="
},
"ssb-client": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/ssb-client/-/ssb-client-4.8.0.tgz",
"integrity": "sha512-5nfx08Cgl176IyK1uQrHO3SBord1rUDKUJvrz9ddgYWIL78+/puk3zs26rt3BqDTPWBtd/Txdy9OLHBYNDhK8A==",
"version": "4.9.0",
"resolved": "https://registry.npmjs.org/ssb-client/-/ssb-client-4.9.0.tgz",
"integrity": "sha512-5wPrVA82Uk3deV2oiCZEbm1kMp9r/5xTT2VvwwMLZS3fDD9FnLOi0kjUUh3OTP+jGBK7bVHRmnvXIVy6ETnSpA==",
"requires": {
"explain-error": "^1.0.1",
"multicb": "^1.2.1",
"multiserver": "^3.1.2",
"muxrpc": "^6.4.8",
"muxrpc": "^6.5.0",
"pull-hash": "^1.0.0",
"pull-stream": "^3.6.0",
"ssb-config": "^3.2.5",
"ssb-keys": "^7.0.13"
"ssb-config": "^3.4.4",
"ssb-keys": "^7.2.1"
},
"dependencies": {
"muxrpc": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/muxrpc/-/muxrpc-6.5.0.tgz",
"integrity": "sha512-8kCo33LTYPYWAJGi2Ag2ukcluoNqJIe6Ay9QtGf7EXAUlTuMSA0HqR7jCbXt7DQPR4Alu/T3/mOguuERpDMGcw==",
"requires": {
"explain-error": "^1.0.1",
"packet-stream": "~2.0.0",
"packet-stream-codec": "^1.1.1",
"pull-goodbye": "0.0.2",
"pull-stream": "^3.6.10"
}
},
"ssb-keys": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/ssb-keys/-/ssb-keys-7.2.2.tgz",
"integrity": "sha512-FPeyYU/3LpxcagnbmVWE+Q/qzg6keqeOBPbD7sEH9UKixUASeufPKiORDgh8nVX7J9Z+0vUaHt/WG999kGjvVQ==",
"requires": {
"chloride": "^2.2.8",
"mkdirp": "~0.5.0",
"private-box": "^0.3.0"
}
}
}
},
"ssb-config": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/ssb-config/-/ssb-config-3.4.3.tgz",
"integrity": "sha512-qvutXHzW+KPhopVGAc8QYJ0jKorGVVYrZBbuyTGU1sCVdtXKGqOIQGJzpiwQUdLe2UM4Sc9WWWCAYTWlSSqhkA==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/ssb-config/-/ssb-config-3.4.4.tgz",
"integrity": "sha512-J3fsWb5nS6PqObZLW2tclEz/bkRQ5pcF9goXanYGVsoH71F6W4f5sOnck9szeubI8srNaiL9pa0kPRv/lojHiw==",
"requires": {
"deep-extend": "^0.6.0",
"ip": "^1.1.5",

View File

@ -24,7 +24,7 @@
"@fraction/base16-css": "^1.1.0",
"@fraction/flotilla": "^4.0.0",
"debug": "^4.1.1",
"highlight.js": "^9.18.0",
"highlight.js": "^9.18.1",
"hyperaxe": "^1.3.0",
"is-svg": "^4.2.1",
"koa": "^2.7.0",
@ -40,8 +40,8 @@
"pull-stream": "^3.6.12",
"require-style": "^1.1.0",
"sharp": "^0.23.0",
"ssb-client": "^4.8.0",
"ssb-config": "^3.4.3",
"ssb-client": "^4.9.0",
"ssb-config": "^3.4.4",
"ssb-markdown": "^6.0.3",
"ssb-mentions": "^0.5.0",
"ssb-msgs": "^5.2.0",

View File

@ -41,9 +41,9 @@ module.exports = ({ cooler, isPublic }) => {
* above problems. Maybe this should be moved somewhere else in the future?
*/
const getAbout = async ({ key, feedId }) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const source = await cooler.read(ssb.backlinks.read, {
const source = await ssb.backlinks.read({
reverse: true,
query: [
{
@ -128,31 +128,31 @@ module.exports = ({ cooler, isPublic }) => {
models.blob = {
get: async ({ blobId }) => {
debug("get blob: %s", blobId);
const ssb = await cooler.connect();
return cooler.read(ssb.blobs.get, blobId);
const ssb = await cooler.open();
return ssb.blobs.get(blobId);
},
want: async ({ blobId }) => {
debug("want blob: %s", blobId);
const ssb = await cooler.connect();
const ssb = await cooler.open();
// This does not wait for the blob.
cooler.get(ssb.blobs.want, blobId);
ssb.blobs.want(blobId);
}
};
models.friend = {
isFollowing: async feedId => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const { id } = ssb;
const isFollowing = await cooler.get(ssb.friends.isFollowing, {
const isFollowing = await ssb.friends.isFollowing({
source: id,
dest: feedId
});
return isFollowing;
},
setFollowing: async ({ feedId, following }) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const content = {
type: "contact",
@ -160,7 +160,7 @@ module.exports = ({ cooler, isPublic }) => {
following
};
return cooler.get(ssb.publish, content);
return ssb.publish(content);
},
follow: async feedId => {
const isFollowing = await models.friend.isFollowing(feedId);
@ -175,19 +175,19 @@ module.exports = ({ cooler, isPublic }) => {
}
},
getRelationship: async feedId => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const { id } = ssb;
if (feedId === id) {
return null;
}
const isFollowing = await cooler.get(ssb.friends.isFollowing, {
const isFollowing = await ssb.friends.isFollowing({
source: id,
dest: feedId
});
const isBlocking = await cooler.get(ssb.friends.isBlocking, {
const isBlocking = await ssb.friends.isBlocking({
source: id,
dest: feedId
});
@ -201,25 +201,25 @@ module.exports = ({ cooler, isPublic }) => {
models.meta = {
myFeedId: async () => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const { id } = ssb;
return id;
},
get: async msgId => {
const ssb = await cooler.connect();
return cooler.get(ssb.get, {
const ssb = await cooler.open();
return ssb.get({
id: msgId,
meta: true,
private: true
});
},
status: async () => {
const ssb = await cooler.connect();
return cooler.get(ssb.status);
const ssb = await cooler.open();
return ssb.status();
},
peers: async () => {
const ssb = await cooler.connect();
const peersSource = await cooler.read(ssb.conn.peers);
const ssb = await cooler.open();
const peersSource = await ssb.conn.peers();
return new Promise((resolve, reject) => {
pull(
@ -234,10 +234,10 @@ module.exports = ({ cooler, isPublic }) => {
});
},
connStop: async () => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
try {
const result = await cooler.get(ssb.conn.stop);
const result = await ssb.conn.stop();
return result;
} catch (e) {
const expectedName = "TypeError";
@ -251,8 +251,8 @@ module.exports = ({ cooler, isPublic }) => {
}
},
connStart: async () => {
const ssb = await cooler.connect();
const result = await cooler.get(ssb.conn.start);
const ssb = await cooler.open();
const result = await ssb.conn.start();
return result;
},
@ -261,8 +261,8 @@ module.exports = ({ cooler, isPublic }) => {
await models.meta.connStart();
},
acceptInvite: async invite => {
const ssb = await cooler.connect();
return await cooler.get(ssb.invite.accept, invite);
const ssb = await cooler.open();
return await ssb.invite.accept(invite);
}
};
@ -311,7 +311,7 @@ module.exports = ({ cooler, isPublic }) => {
}) => {
const options = configure({ query, index: "DTA" }, customOptions);
const source = await cooler.read(ssb.backlinks.read, options);
const source = await ssb.backlinks.read(options);
const basicSocialFilter = await socialFilter();
return new Promise((resolve, reject) => {
@ -349,9 +349,9 @@ module.exports = ({ cooler, isPublic }) => {
blocking = false,
me = null
} = {}) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const { id } = ssb;
const relationshipObject = await cooler.get(ssb.friends.get, {
const relationshipObject = await ssb.friends.get({
source: id
});
@ -391,7 +391,7 @@ module.exports = ({ cooler, isPublic }) => {
}
};
const referenceStream = await cooler.read(ssb.backlinks.read, {
const referenceStream = await ssb.backlinks.read({
query: [filterQuery],
index: "DTA", // use asserted timestamps
private: true,
@ -512,12 +512,12 @@ module.exports = ({ cooler, isPublic }) => {
const post = {
fromPublicFeed: async (feedId, customOptions = {}) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
const options = configure({ id: feedId }, customOptions);
const source = await cooler.read(ssb.createUserStream, options);
const source = await ssb.createUserStream(options);
const messages = await new Promise((resolve, reject) => {
pull(
@ -541,7 +541,7 @@ module.exports = ({ cooler, isPublic }) => {
return messages;
},
mentionsMe: async (customOptions = {}) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
@ -564,7 +564,7 @@ module.exports = ({ cooler, isPublic }) => {
return messages;
},
fromHashtag: async (hashtag, customOptions = {}) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
@ -586,7 +586,7 @@ module.exports = ({ cooler, isPublic }) => {
return messages;
},
threadReplies: async (rootId, customOptions = {}) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
@ -610,7 +610,7 @@ module.exports = ({ cooler, isPublic }) => {
return messages;
},
likes: async ({ feed }, customOptions = {}) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const query = [
{
@ -634,7 +634,7 @@ module.exports = ({ cooler, isPublic }) => {
customOptions
);
const source = await cooler.read(ssb.query.read, options);
const source = await ssb.query.read(options);
const messages = await new Promise((resolve, reject) => {
pull(
@ -665,7 +665,7 @@ module.exports = ({ cooler, isPublic }) => {
return messages;
},
search: async ({ query }) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
@ -673,7 +673,7 @@ module.exports = ({ cooler, isPublic }) => {
query
});
const source = await cooler.read(ssb.search.query, options);
const source = await ssb.search.query(options);
const messages = await new Promise((resolve, reject) => {
pull(
@ -697,7 +697,7 @@ module.exports = ({ cooler, isPublic }) => {
return messages;
},
latest: async () => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
@ -706,7 +706,7 @@ module.exports = ({ cooler, isPublic }) => {
private: false
});
const source = await cooler.read(ssb.messagesByType, options);
const source = await ssb.messagesByType(options);
const followingFilter = await socialFilter({ following: true });
const messages = await new Promise((resolve, reject) => {
@ -732,7 +732,7 @@ module.exports = ({ cooler, isPublic }) => {
return messages;
},
latestExtended: async () => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
@ -741,7 +741,7 @@ module.exports = ({ cooler, isPublic }) => {
private: false
});
const source = await cooler.read(ssb.messagesByType, options);
const source = await ssb.messagesByType(options);
const extendedFilter = await socialFilter({
following: false,
@ -767,7 +767,7 @@ module.exports = ({ cooler, isPublic }) => {
return messages;
},
latestTopics: async () => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
@ -776,7 +776,7 @@ module.exports = ({ cooler, isPublic }) => {
private: false
});
const source = await cooler.read(ssb.messagesByType, options);
const source = await ssb.messagesByType(options);
const extendedFilter = await socialFilter({
following: true
@ -805,7 +805,7 @@ module.exports = ({ cooler, isPublic }) => {
return messages;
},
popular: async ({ period }) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const periodDict = {
day: 1,
@ -829,7 +829,7 @@ module.exports = ({ cooler, isPublic }) => {
private: false
});
const source = await cooler.read(ssb.messagesByType, options);
const source = await ssb.messagesByType(options);
const followingFilter = await socialFilter({ following: true });
const messages = await new Promise((resolve, reject) => {
@ -928,13 +928,13 @@ module.exports = ({ cooler, isPublic }) => {
},
fromThread: async (msgId, customOptions) => {
debug("thread: %s", msgId);
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
const options = configure({ id: msgId }, customOptions);
return cooler
.get(ssb.get, options)
return ssb
.get(options)
.then(async rawMsg => {
debug("got raw message");
@ -963,8 +963,8 @@ module.exports = ({ cooler, isPublic }) => {
debug("reply, get the parent");
try {
// It's a message reply, get the parent!
cooler
.get(ssb.get, {
ssb
.get({
id: msg.value.content.fork,
meta: true,
private: true
@ -981,8 +981,8 @@ module.exports = ({ cooler, isPublic }) => {
debug("comment: %s", msg.value.content.root);
try {
// It's a thread reply, get the parent!
cooler
.get(ssb.get, {
ssb
.get({
id: msg.value.content.root,
meta: true,
private: true
@ -1018,8 +1018,8 @@ module.exports = ({ cooler, isPublic }) => {
}
};
cooler
.read(ssb.backlinks.read, {
ssb.backlinks
.read({
query: [filterQuery],
index: "DTA" // use asserted timestamps
})
@ -1125,12 +1125,12 @@ module.exports = ({ cooler, isPublic }) => {
},
get: async (msgId, customOptions) => {
debug("get: %s", msgId);
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
const options = configure({ id: msgId }, customOptions);
const rawMsg = await cooler.get(ssb.get, options);
const rawMsg = await ssb.get(options);
debug("got raw message");
const transformed = await transform(ssb, [rawMsg], myFeedId);
@ -1138,11 +1138,11 @@ module.exports = ({ cooler, isPublic }) => {
return transformed[0];
},
publish: async options => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const body = { type: "post", ...options };
debug("Published: %O", body);
return cooler.get(ssb.publish, body);
return ssb.publish(body);
},
reply: async ({ parent, message }) => {
message.root = parent.key;
@ -1214,13 +1214,13 @@ module.exports = ({ cooler, isPublic }) => {
return post.publish(message);
},
branch: async ({ root }) => {
const ssb = await cooler.connect();
const keys = await cooler.get(ssb.tangle.branch, root);
const ssb = await cooler.open();
const keys = await ssb.tangle.branch(root);
return keys;
},
inbox: async (customOptions = {}) => {
const ssb = await cooler.connect();
const ssb = await cooler.open();
const myFeedId = ssb.id;
@ -1231,7 +1231,7 @@ module.exports = ({ cooler, isPublic }) => {
customOptions
);
const source = await cooler.read(ssb.backlinks.read, options);
const source = await ssb.backlinks.read(options);
const messages = await new Promise((resolve, reject) => {
pull(
@ -1270,10 +1270,10 @@ module.exports = ({ cooler, isPublic }) => {
models.vote = {
/** @param {{messageKey: string, value: {}, recps: []}} input */
publish: async ({ messageKey, value, recps }) => {
const ssb = await cooler.connect();
const branch = await cooler.get(ssb.tangle.branch, messageKey);
const ssb = await cooler.open();
const branch = await ssb.tangle.branch(messageKey);
await cooler.get(ssb.publish, {
await ssb.publish({
type: "vote",
vote: {
link: messageKey,

View File

@ -1,8 +1,8 @@
"use strict";
// This module exports a function that connects to SSB and returns a "cooler"
// interface. This interface is poorly defined and should be replaced with
// native support for Promises in the MuxRPC module.
// This module exports a function that connects to SSB and returns an interface
// to call methods over MuxRPC. It's a thin wrapper around SSB-Client, which is
// a thin wrapper around the MuxRPC module.
const ssbClient = require("ssb-client");
const ssbConfig = require("ssb-config");
@ -21,10 +21,8 @@ const log = (...args) => {
const rawConnect = () =>
new Promise((resolve, reject) => {
ssbClient((err, api) => {
if (err) {
reject(err);
} else {
ssbClient()
.then(api => {
if (api.tangle === undefined) {
// HACK: SSB-Tangle isn't available in Patchwork, but we want that
// compatibility. This code automatically injects SSB-Tangle into our
@ -35,8 +33,8 @@ const rawConnect = () =>
}
resolve(api);
}
});
})
.catch(reject);
});
let handle;
@ -89,8 +87,13 @@ module.exports = ({ offline }) => {
};
createConnection(config);
/**
* This is "cooler", a tiny interface for opening or reusing an instance of
* SSB-Client.
*/
return {
connect() {
open() {
// This has interesting behavior that may be unexpected.
//
// If `handle` is already an active [non-closed] connection, return that.
@ -106,25 +109,6 @@ module.exports = ({ offline }) => {
resolve(handle);
});
});
},
/**
* @param {function} method
*/
get(method, ...opts) {
return new Promise((resolve, reject) => {
method(...opts, (err, val) => {
if (err) {
reject(err);
} else {
resolve(val);
}
});
});
},
read(method, ...args) {
return new Promise(resolve => {
resolve(method(...args));
});
}
};
};