scuttle-invite-db
v0.0.7ssb-invites-db
A flumeview-reduce using scuttle-invite-schema for scuttle-invite ssb plugin. Allows for a polymorphic invitation/reply system to be used on-top of a root
record, such as a Gathering.
// Plug into a Scuttlebot server
Server.use(require('ssb-invites-db'))
// Initialise a server
var server = Server()
// Now call the API
server.invites
Opens up a set of lenses on the reduced data structure:
API
{
getInvite: 'async',
getReply: 'async',
invitesByRoot: 'async',
replysByRoot: 'async'
invitedByRoot: 'async'
}
Data Template
{
'%fAVwnIMv2ikGDNRxT8lNpzZSXHyrLJ5l38kl8ZJVBww=.sha256': {
invites: {
'%OuJYS+oDoyLwuMdTWPk9A39JRu1D//PfD5jzzMkgX6Y=.sha256': {
key:'%OuJYS+oDoyLwuMdTWPk9A39JRu1D//PfD5jzzMkgX6Y=.sha256',
value: {
author: '@cl1oUz84kJiHKttQiS87cHPEaiGv5I2lJPCfE9fy0fs=.ed25519',
content: {
type: 'invite',
version: 'v1',
root: '%fAVwnIMv2ikGDNRxT8lNpzZSXHyrLJ5l38kl8ZJVBww=.sha256'
body: "Yo @Derek, want to come over for some snackage?"
mentions: [Array],
recps: [Array],
accepted: true
}
}
timestamp: 1528703315721,
replys: {
// Here's Derek's first reply
'%Y4dJrHsmySSawl8WPk9A39JRiG4dK5LfDTT5jjMkgX6Y=.sha256': {
key: '%Y4dJrHsmySSawl8WPk9A39JRiG4dK5LfDTT5jjMkgX6Y=.sha256',
value: {
author: '@FMM+LUXFosOUtWm2cGHu5ptzgsxEtV6l9NImuL8ggYQ=.ed25519',
content: {
type: 'invite-reply',
version: 'v1',
body: "Thanks @Holga but I can't make it",
accepted: false,
mentions: [Array],
recps: [Array]
}
}
timestamp: 1528703315721,
invite: [Circular]
},
// Derek changes his mind...
'%SBwACwsjh9QY4/jsClOI0dSiQSAUrWiiDoTW7CEggSE=.sha256': {
key: '%SBwACwsjh9QY4/jsClOI0dSiQSAUrWiiDoTW7CEggSE=.sha256',
value: {
author: '@FMM+LUXFosOUtWm2cGHu5ptzgsxEtV6l9NImuL8ggYQ=.ed25519',
content: {
type: 'invite-reply',
version: 'v1',
body: "Scratch that, lets jam"
accepted: true,
recps: [Array]
}
}
timestamp: 1528703315744,
invite: [Circular]
}
},
},
'%to8Sb7bS2icz34sOuvkLmvuKcE/j5kGS7HrO+/c/pp0=.sha256': {
key: '%to8Sb7bS2icz34sOuvkLmvuKcE/j5kGS7HrO+/c/pp0=.sha256',
value: {
author: '@cl1oUz84kJiHKttQiS87cHPEaiGv5I2lJPCfE9fy0fs=.ed25519',
content: {
body: "Grace, come eat some tasty grub at yard"
recps: [Array]
}
}
// Grace hasn't responded yet...
}
}
},
replys: {
'%Y4dJrHsmySSawl8WPk9A39JRiG4dK5LfDTT5jjMkgX6Y=.sha256': {
key: '%Y4dJrHsmySSawl8WPk9A39JRiG4dK5LfDTT5jjMkgX6Y=.sha256',
value: {
author: '@FMM+LUXFosOUtWm2cGHu5ptzgsxEtV6l9NImuL8ggYQ=.ed25519',
content: {
type: 'invite-reply',
version: 'v1',
body: "Thanks @Holga but I can't make it",
accepted: false,
mentions: [Array],
recps: [Array]
}
}
timestamp: 1528703315721,
},
'%Y4dJrHsmySSawl8WPk9A39JRiG4dK5LfDTT5jjMkgX6Y=.sha256': {
key: '%Y4dJrHsmySSawl8WPk9A39JRiG4dK5LfDTT5jjMkgX6Y=.sha256',
value: {
author: '@FMM+LUXFosOUtWm2cGHu5ptzgsxEtV6l9NImuL8ggYQ=.ed25519',
content: {
type: 'invite-reply',
version: 'v1',
body: "Thanks @Holga but I can't make it",
accepted: false,
mentions: [Array],
recps: [Array]
}
}
timestamp: 1528703315721,
invite: {
key:'%OuJYS+oDoyLwuMdTWPk9A39JRu1D//PfD5jzzMkgX6Y=.sha256',
value: {
author: '@cl1oUz84kJiHKttQiS87cHPEaiGv5I2lJPCfE9fy0fs=.ed25519',
content: {
type: 'invite',
version: 'v1',
root: '%fAVwnIMv2ikGDNRxT8lNpzZSXHyrLJ5l38kl8ZJVBww=.sha256'
body: "Yo @Derek, want to come over for some snackage?"
mentions: [Array],
recps: [Array],
accepted: true
}
}
timestamp: 1528703315721,
replys: [Circular]
}
},
'%SBwACwsjh9QY4/jsClOI0dSiQSAUrWiiDoTW7CEggSE=.sha256': {
key: '%SBwACwsjh9QY4/jsClOI0dSiQSAUrWiiDoTW7CEggSE=.sha256',
value: {
author: '@FMM+LUXFosOUtWm2cGHu5ptzgsxEtV6l9NImuL8ggYQ=.ed25519',
content: {
type: 'invite-reply',
version: 'v1',
body: "Scratch that, lets jam"
accepted: true,
recps: [Array]
}
}
timestamp: 1528703315744,
invite: {
key:'%OuJYS+oDoyLwuMdTWPk9A39JRu1D//PfD5jzzMkgX6Y=.sha256',
value: {
author: '@cl1oUz84kJiHKttQiS87cHPEaiGv5I2lJPCfE9fy0fs=.ed25519',
content: {
type: 'invite',
version: 'v1',
root: '%fAVwnIMv2ikGDNRxT8lNpzZSXHyrLJ5l38kl8ZJVBww=.sha256'
body: "Yo @Derek, want to come over for some snackage?"
mentions: [Array],
recps: [Array],
accepted: true
}
}
timestamp: 1528703315721,
replys: [Circular]
}
}
}
}
This data structure allows the developer to access a set of invites based on its root
record, be that an event, a group, a cabal... and render them and their invites / replys appropriately.
TODO / THINK
- What
source
should look like for using pull-stream, or should we use ssb-backlinks?