Add invites and user 2

This commit is contained in:
Rogerio Chaves 2020-04-04 17:15:43 +02:00
parent eddd22fadb
commit 962c00e200
No known key found for this signature in database
GPG Key ID: E6AF5440509B1D94
12 changed files with 1415 additions and 30 deletions

1
.prettierignore Normal file
View File

@ -0,0 +1 @@
*.ejs

View File

@ -10,7 +10,7 @@ const createWindow = () => {
},
});
win.loadURL("http://localhost:3000");
win.loadURL(`http://localhost:${process.env.EXPRESS_PORT || 3000}`);
};
app.whenReady().then(createWindow);

View File

@ -1,19 +1,28 @@
const express = require("express");
const app = express();
const port = 3000;
const port = process.env.EXPRESS_PORT || 3000;
const bodyParser = require("body-parser");
const pull = require("pull-stream");
const Client = require("ssb-client");
const ssbKeys = require("ssb-keys");
const ssbConfig = require("./ssb-config");
let ssbServer;
let ssbKeys;
Client((err, server) => {
let profile;
let homeFolder =
process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
let ssbSecret = ssbKeys.loadOrCreateSync(
`${homeFolder}/.${process.env.CONFIG_FOLDER || "ssb"}/secret`
);
Client(ssbSecret, ssbConfig, (err, server) => {
if (err) throw err;
ssbServer = server;
ssbServer.whoami((err, keys) => {
if (err) throw err;
ssbKeys = keys;
profile = keys;
});
console.log(ssbServer);
});
app.use(bodyParser.json());
@ -24,10 +33,10 @@ app.use(express.static("public"));
app.get("/", (_req, res) => {
pull(
ssbServer.createFeedStream(),
pull.collect((err, msgs) => {
pull.collect((_err, msgs) => {
const posts = msgs.map((x) => x.value.content);
res.render("index", { posts, profile: ssbKeys });
res.render("index", { posts, profile });
})
);
});
@ -38,6 +47,26 @@ app.post("/publish", (req, res) => {
});
});
app.get("/new_invite", (_req, res) => {
ssbServer.invite.create({ uses: 10 }, (err, invite) => {
if (err) throw err;
console.log("invite", invite);
res.render("new_invite", { invite });
});
});
app.post("/add_invite", (req, res) => {
const inviteCode = req.body.invite_code;
ssbServer.invite.accept(inviteCode, (err, result) => {
if (err) throw err;
console.log("result", result);
res.redirect("/");
});
});
const expressServer = app.listen(port, () =>
console.log(`Example app listening at http://localhost:${port}`)
);

20
app/lib/ssb-config.js Normal file
View File

@ -0,0 +1,20 @@
const configInject = require("ssb-config/inject");
module.exports = configInject(process.env.CONFIG_FOLDER || "ssb", {
connections: {
incoming: {
net: [
{
scope: "public",
host: "0.0.0.0",
external: ["lvh.me"],
transform: "shs",
port: process.env.SSB_PORT || 8008,
},
],
},
outgoing: {
net: [{ transform: "shs" }],
},
},
});

View File

@ -1,13 +1,17 @@
const Server = require("ssb-server");
const config = require("ssb-config");
const fs = require("fs");
const path = require("path");
const config = require("./ssb-config");
// add plugins
Server.use(require("ssb-master"))
.use(require("ssb-gossip"))
.use(require("ssb-replicate"))
.use(require("ssb-backlinks"));
.use(require("ssb-backlinks"))
.use(require("ssb-about"))
.use(require("ssb-contacts"))
.use(require("ssb-invite"))
.use(require("ssb-friends"));
const server = Server(config);
console.log("SSB server started at", config.port);

150
app/package-lock.json generated
View File

@ -74,6 +74,11 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"async-single": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/async-single/-/async-single-1.0.5.tgz",
"integrity": "sha1-El3QneldPqMKN4rb7QIQkhebA8k="
},
"atomic-file": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/atomic-file/-/atomic-file-1.1.5.tgz",
@ -498,6 +503,15 @@
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
"dev": true
},
"dynamic-dijkstra": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/dynamic-dijkstra/-/dynamic-dijkstra-1.0.2.tgz",
"integrity": "sha512-1N+eCCrepIeK1+qtWrMEO1CV68Hn+TLbiR9c70VB3xnut3DmUxT+3T7sRHhb0mpK2F/74IfP+loQDriU2W9lkA==",
"requires": {
"heap": "^0.2.6",
"rng": "^0.2.2"
}
},
"ed2curve": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.1.4.tgz",
@ -769,6 +783,21 @@
}
}
},
"flumecodec": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/flumecodec/-/flumecodec-0.0.0.tgz",
"integrity": "sha1-Ns4Gq+Lg4BxE3WnyoWUwWiMgZJs=",
"requires": {
"level-codec": "^6.2.0"
},
"dependencies": {
"level-codec": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/level-codec/-/level-codec-6.2.0.tgz",
"integrity": "sha1-pLUkS7akwvcj1oodZOmAxTYn2dQ="
}
}
},
"flumeview-level": {
"version": "3.0.14",
"resolved": "https://registry.npmjs.org/flumeview-level/-/flumeview-level-3.0.14.tgz",
@ -800,6 +829,46 @@
"pull-stream": "^3.4.0"
}
},
"flumeview-reduce": {
"version": "1.3.16",
"resolved": "https://registry.npmjs.org/flumeview-reduce/-/flumeview-reduce-1.3.16.tgz",
"integrity": "sha512-4ATidV3QARML74eNdi+HPzGa4JtSZfnQpW6QQArlKZ6NRkjax3EFLt42hK2VJyADxnVnsVInt/ItqJL/4G1/5g==",
"requires": {
"async-single": "^1.0.5",
"atomic-file": "^2.0.0",
"deep-equal": "^1.0.1",
"flumecodec": "0.0.0",
"obv": "0.0.1",
"pull-notify": "^0.1.1",
"pull-stream": "^3.5.0"
},
"dependencies": {
"atomic-file": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/atomic-file/-/atomic-file-2.0.1.tgz",
"integrity": "sha512-9JCWojeLDF8UhEv2UJlLlPGsLEs+EBnfB+kOhsvmFI2QilVrnIsAwr7YnF8lLEVuxB+HxFhvGK+ax0Y8Eh/BKA==",
"requires": {
"flumecodec": "0.0.1",
"idb-kv-store": "^4.4.0"
},
"dependencies": {
"flumecodec": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/flumecodec/-/flumecodec-0.0.1.tgz",
"integrity": "sha1-rgSacUOGu4PjQmV6gpJLcDZKkNY=",
"requires": {
"level-codec": "^6.2.0"
}
}
}
},
"level-codec": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/level-codec/-/level-codec-6.2.0.tgz",
"integrity": "sha1-pLUkS7akwvcj1oodZOmAxTYn2dQ="
}
}
},
"for-each": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
@ -966,6 +1035,11 @@
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
"integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
},
"heap": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz",
"integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw="
},
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
@ -999,6 +1073,15 @@
"safer-buffer": ">= 2.1.2 < 3"
}
},
"idb-kv-store": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/idb-kv-store/-/idb-kv-store-4.4.0.tgz",
"integrity": "sha1-IsVqjV+QvYj4GKhZ25xYYn3ieL4=",
"requires": {
"inherits": "^2.0.3",
"promisize": "^1.1.2"
}
},
"ieee754": {
"version": "1.1.13",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
@ -1164,6 +1247,17 @@
}
}
},
"layered-graph": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/layered-graph/-/layered-graph-1.1.3.tgz",
"integrity": "sha512-0lACDagchA0cEiOxP90bLJm8Asxw5p089BozVvPAcKYPigQBxA1Ca4foEPBuz4x8RRZYybiksc/qBR1YurSUHA==",
"requires": {
"dynamic-dijkstra": "^1.0.0",
"pull-cont": "^0.1.1",
"pull-notify": "^0.1.1",
"pull-stream": "^3.6.9"
}
},
"level": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/level/-/level-5.0.1.tgz",
@ -1706,6 +1800,11 @@
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true
},
"promisize": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/promisize/-/promisize-1.1.2.tgz",
"integrity": "sha1-m0fiyyrkl+seutwsQZHWTRXJSdE="
},
"proto-list": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
@ -1745,6 +1844,11 @@
"resolved": "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz",
"integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs="
},
"pull-cont": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/pull-cont/-/pull-cont-0.1.1.tgz",
"integrity": "sha1-3x1YDicXV7qay666IN4kIdZg1hg="
},
"pull-defer": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz",
@ -2049,6 +2153,11 @@
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
},
"rng": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/rng/-/rng-0.2.2.tgz",
"integrity": "sha1-30PoDZvIKtRDC8/vA/SccX6LLow="
},
"roarr": {
"version": "2.15.3",
"resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz",
@ -2269,6 +2378,14 @@
"dev": true,
"optional": true
},
"ssb-about": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ssb-about/-/ssb-about-2.0.1.tgz",
"integrity": "sha512-j0inbLwsyQctspyW51eH7h+9rpLN7Mf8A2nNX4WIWWh3tjaqS7ZNec4W/Q/6bBaoJkgtMPKLNWvrPMQwYYT15g==",
"requires": {
"ssb-social-index": "^1.0.0"
}
},
"ssb-backlinks": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ssb-backlinks/-/ssb-backlinks-1.0.0.tgz",
@ -2315,6 +2432,28 @@
"ssb-keys": "^7.1.4"
}
},
"ssb-contacts": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/ssb-contacts/-/ssb-contacts-0.0.2.tgz",
"integrity": "sha1-2UUVYYOMzDWNMjF8DpnvhPNEmHA=",
"requires": {
"flumeview-reduce": "^1.1.0",
"ssb-ref": "^2.7.1"
}
},
"ssb-friends": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/ssb-friends/-/ssb-friends-4.1.4.tgz",
"integrity": "sha512-rjQP2rLocqnUoiI+SSUehLQwMB4H5TKD13hfnweGVIgAWw4mylbl9bPOuXtTU23ubPkdbSNadlp3uivsCkWLxw==",
"requires": {
"flumeview-reduce": "^1.3.0",
"layered-graph": "^1.1.1",
"pull-flatmap": "0.0.1",
"pull-notify": "^0.1.1",
"pull-stream": "^3.6.0",
"ssb-ref": "^2.7.1"
}
},
"ssb-gossip": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ssb-gossip/-/ssb-gossip-1.1.1.tgz",
@ -9183,6 +9322,17 @@
}
}
},
"ssb-social-index": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ssb-social-index/-/ssb-social-index-1.0.0.tgz",
"integrity": "sha512-yj1OKkbGbHiv7dMYod45RZIgQjgGjp1i5BMg5b/1YcYvlqfKgn5X//rs2cNhiCpF1T5AOVu/o776RB9mv5s+ZA==",
"requires": {
"flumeview-reduce": "^1.3.9",
"pull-defer": "^0.2.3",
"pull-stream": "^3.6.9",
"ssb-ref": "^2.7.1"
}
},
"statistics": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/statistics/-/statistics-3.3.0.tgz",

View File

@ -4,7 +4,8 @@
"description": "",
"main": "index.js",
"scripts": {
"start": "electron ."
"start": "electron .",
"start:user-2": "SSB_PORT=8009 EXPRESS_PORT=3001 CONFIG_FOLDER=ssb-user2 electron ."
},
"author": "",
"license": "ISC",
@ -13,10 +14,14 @@
"ejs": "^3.0.2",
"express": "^4.17.1",
"pull-stream": "^3.6.14",
"ssb-about": "^2.0.1",
"ssb-backlinks": "^1.0.0",
"ssb-client": "^4.9.0",
"ssb-config": "^3.4.4",
"ssb-contacts": "0.0.2",
"ssb-friends": "^4.1.4",
"ssb-gossip": "^1.1.1",
"ssb-keys": "^7.2.2",
"ssb-master": "^1.0.3",
"ssb-replicate": "^1.3.2",
"ssb-server": "^15.2.0"

2
app/views/_footer.ejs Normal file
View File

@ -0,0 +1,2 @@
</body>
</html>

13
app/views/_header.ejs Normal file
View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Social</title>
</head>
<body>
<header>
<nav>
<a href="/">Home</a>
</nav>
</header>

View File

@ -1,20 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Social</title>
</head>
<body>
<form action="publish" method="POST">
<textarea name="message"></textarea>
<input type="submit" value="Send" />
</form>
<p>
Whoami: <%= profile.id %>
</p>
<% posts.map(post => { %>
<div><%= post.text %></div>
<% }) %>
</body>
</html>
<%- include('_header') %>
<form action="publish" method="POST">
<textarea name="message"></textarea>
<input type="submit" value="Send" />
</form>
<p>
Whoami: <%= profile.id %>
</p>
<% posts.map(post => { %>
<div><%= post.text %></div>
<% }) %>
<a href="new_invite">Create New Invite</a>
<form action="add_invite" method="POST">
<textarea name="invite_code"></textarea>
<input type="submit" value="Add Invite" />
</form>
<%- include('_footer') %>

7
app/views/new_invite.ejs Normal file
View File

@ -0,0 +1,7 @@
<%- include('_header') %>
Here is the invite, copy and send to friends:
<%= invite %>
<%- include('_footer') %>

1154
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff