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); app.whenReady().then(createWindow);

View File

@ -1,19 +1,28 @@
const express = require("express"); const express = require("express");
const app = express(); const app = express();
const port = 3000; const port = process.env.EXPRESS_PORT || 3000;
const bodyParser = require("body-parser"); const bodyParser = require("body-parser");
const pull = require("pull-stream"); const pull = require("pull-stream");
const Client = require("ssb-client"); const Client = require("ssb-client");
const ssbKeys = require("ssb-keys");
const ssbConfig = require("./ssb-config");
let ssbServer; let ssbServer;
let ssbKeys; let profile;
Client((err, server) => {
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; if (err) throw err;
ssbServer = server; ssbServer = server;
ssbServer.whoami((err, keys) => { ssbServer.whoami((err, keys) => {
if (err) throw err; if (err) throw err;
ssbKeys = keys; profile = keys;
}); });
console.log(ssbServer);
}); });
app.use(bodyParser.json()); app.use(bodyParser.json());
@ -24,10 +33,10 @@ app.use(express.static("public"));
app.get("/", (_req, res) => { app.get("/", (_req, res) => {
pull( pull(
ssbServer.createFeedStream(), ssbServer.createFeedStream(),
pull.collect((err, msgs) => { pull.collect((_err, msgs) => {
const posts = msgs.map((x) => x.value.content); 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, () => const expressServer = app.listen(port, () =>
console.log(`Example app listening at http://localhost:${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 Server = require("ssb-server");
const config = require("ssb-config");
const fs = require("fs"); const fs = require("fs");
const path = require("path"); const path = require("path");
const config = require("./ssb-config");
// add plugins // add plugins
Server.use(require("ssb-master")) Server.use(require("ssb-master"))
.use(require("ssb-gossip")) .use(require("ssb-gossip"))
.use(require("ssb-replicate")) .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); const server = Server(config);
console.log("SSB server started at", config.port); 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", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" "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": { "atomic-file": {
"version": "1.1.5", "version": "1.1.5",
"resolved": "https://registry.npmjs.org/atomic-file/-/atomic-file-1.1.5.tgz", "resolved": "https://registry.npmjs.org/atomic-file/-/atomic-file-1.1.5.tgz",
@ -498,6 +503,15 @@
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
"dev": true "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": { "ed2curve": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.1.4.tgz", "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": { "flumeview-level": {
"version": "3.0.14", "version": "3.0.14",
"resolved": "https://registry.npmjs.org/flumeview-level/-/flumeview-level-3.0.14.tgz", "resolved": "https://registry.npmjs.org/flumeview-level/-/flumeview-level-3.0.14.tgz",
@ -800,6 +829,46 @@
"pull-stream": "^3.4.0" "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": { "for-each": {
"version": "0.3.3", "version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "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", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
"integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" "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": { "http-cache-semantics": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "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" "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": { "ieee754": {
"version": "1.1.13", "version": "1.1.13",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", "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": { "level": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/level/-/level-5.0.1.tgz", "resolved": "https://registry.npmjs.org/level/-/level-5.0.1.tgz",
@ -1706,6 +1800,11 @@
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true "dev": true
}, },
"promisize": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/promisize/-/promisize-1.1.2.tgz",
"integrity": "sha1-m0fiyyrkl+seutwsQZHWTRXJSdE="
},
"proto-list": { "proto-list": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "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", "resolved": "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz",
"integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs=" "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": { "pull-defer": {
"version": "0.2.3", "version": "0.2.3",
"resolved": "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz", "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", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" "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": { "roarr": {
"version": "2.15.3", "version": "2.15.3",
"resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz",
@ -2269,6 +2378,14 @@
"dev": true, "dev": true,
"optional": 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": { "ssb-backlinks": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/ssb-backlinks/-/ssb-backlinks-1.0.0.tgz", "resolved": "https://registry.npmjs.org/ssb-backlinks/-/ssb-backlinks-1.0.0.tgz",
@ -2315,6 +2432,28 @@
"ssb-keys": "^7.1.4" "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": { "ssb-gossip": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/ssb-gossip/-/ssb-gossip-1.1.1.tgz", "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": { "statistics": {
"version": "3.3.0", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/statistics/-/statistics-3.3.0.tgz", "resolved": "https://registry.npmjs.org/statistics/-/statistics-3.3.0.tgz",

View File

@ -4,7 +4,8 @@
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"start": "electron ." "start": "electron .",
"start:user-2": "SSB_PORT=8009 EXPRESS_PORT=3001 CONFIG_FOLDER=ssb-user2 electron ."
}, },
"author": "", "author": "",
"license": "ISC", "license": "ISC",
@ -13,10 +14,14 @@
"ejs": "^3.0.2", "ejs": "^3.0.2",
"express": "^4.17.1", "express": "^4.17.1",
"pull-stream": "^3.6.14", "pull-stream": "^3.6.14",
"ssb-about": "^2.0.1",
"ssb-backlinks": "^1.0.0", "ssb-backlinks": "^1.0.0",
"ssb-client": "^4.9.0", "ssb-client": "^4.9.0",
"ssb-config": "^3.4.4", "ssb-config": "^3.4.4",
"ssb-contacts": "0.0.2",
"ssb-friends": "^4.1.4",
"ssb-gossip": "^1.1.1", "ssb-gossip": "^1.1.1",
"ssb-keys": "^7.2.2",
"ssb-master": "^1.0.3", "ssb-master": "^1.0.3",
"ssb-replicate": "^1.3.2", "ssb-replicate": "^1.3.2",
"ssb-server": "^15.2.0" "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> <%- include('_header') %>
<html lang="en">
<head> <form action="publish" method="POST">
<meta charset="UTF-8" /> <textarea name="message"></textarea>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <input type="submit" value="Send" />
<title>Social</title> </form>
</head> <p>
<body> Whoami: <%= profile.id %>
<form action="publish" method="POST"> </p>
<textarea name="message"></textarea> <% posts.map(post => { %>
<input type="submit" value="Send" /> <div><%= post.text %></div>
</form> <% }) %>
<p> <a href="new_invite">Create New Invite</a>
Whoami: <%= profile.id %>
</p> <form action="add_invite" method="POST">
<% posts.map(post => { %> <textarea name="invite_code"></textarea>
<div><%= post.text %></div> <input type="submit" value="Add Invite" />
<% }) %> </form>
</body>
</html> <%- 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