Skip to content

Commit a043492

Browse files
substacksubstack
substack
authored and
substack
committed
p2p wiki example
1 parent 5f48d54 commit a043492

File tree

3 files changed

+90
-1
lines changed

3 files changed

+90
-1
lines changed

node/package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22
"dependencies": {
33
"bel": "^5.0.0",
44
"choo": "^5.6.2",
5+
"concat-stream": "^1.6.0",
56
"content-addressable-blob-store": "^4.5.1",
67
"ecstatic": "^2.2.1",
8+
"filereader-stream": "^1.0.0",
79
"hypercore": "^6.6.0",
810
"hyperdrive": "^9.4.1",
911
"hyperlog": "^4.12.1",
1012
"level": "^1.7.0",
11-
"routes": "^2.1.0"
13+
"routes": "^2.1.0",
14+
"xhr": "^2.4.0"
1215
}
1316
}

p2pwiki/p2pwiki.js

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
var level = require('level-browserify')
2+
var hyperlog = require('hyperlog')
3+
var hyperkv = require('hyperkv')
4+
var log = hyperlog(level('kvlog.db'), { valueEncoding: 'json' })
5+
var kv = hyperkv({
6+
log: log,
7+
db: level('kvstore.db')
8+
})
9+
10+
var wswarm = require('webrtc-swarm')
11+
var signalhub = require('signalhub')
12+
13+
var app = require('choo')()
14+
var html = require('choo/html')
15+
var to = require('to2')
16+
17+
app.use(function (state, emitter) {
18+
var swarm = wswarm(signalhub('kvswarm',
19+
['https://signalhub.mafintosh.com']))
20+
swarm.on('peer', function (peer) {
21+
peer.pipe(log.replicate({ live: true })).pipe(peer)
22+
})
23+
})
24+
app.use(function (state, emitter) {
25+
state.page = {}
26+
emitter.on('open', function (title) {
27+
kv.get(title, function (err, values) {
28+
state.page = values
29+
emitter.emit('render')
30+
})
31+
})
32+
emitter.on('save', function (edit) {
33+
kv.put(edit.title, edit.body, function (err, node) {
34+
console.log(err, node)
35+
})
36+
})
37+
})
38+
39+
app.route('/', function (state, emit) {
40+
return html`<body>
41+
<h1>p2p social network log</h1>
42+
<form onsubmit=${onsubmit}>
43+
<div><input type="text" name="title"></div>
44+
<textarea name="body"></textarea>
45+
<div><button type="submit">POST</button></div>
46+
</form>
47+
<hr>
48+
<form onsubmit=${read}>
49+
<input type="text" name="title">
50+
<button type="submit">open</button>
51+
</form>
52+
${Object.keys(state.page).map(function (key) {
53+
return html`<div>
54+
<hr>
55+
<div>${key}</div>
56+
<pre>${state.page[key].value}</pre>
57+
</div>`
58+
})}
59+
</body>`
60+
function read (ev) {
61+
ev.preventDefault()
62+
emit('open', ev.target.title.value)
63+
}
64+
function onsubmit (ev) {
65+
ev.preventDefault()
66+
emit('save', {
67+
title: ev.target.title.value,
68+
body: ev.target.body.value
69+
})
70+
ev.target.reset()
71+
}
72+
})
73+
app.mount('body')

p2pwiki/package.json

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"dependencies": {
3+
"choo": "^5.6.2",
4+
"hyperkv": "^2.0.3",
5+
"hyperlog": "^4.12.1",
6+
"level": "^1.7.0",
7+
"signalhub": "^4.8.0",
8+
"subleveldown": "^2.1.0",
9+
"to2": "^1.0.0",
10+
"webrtc-swarm": "^2.8.0",
11+
"websocket-stream": "^5.0.0"
12+
}
13+
}

0 commit comments

Comments
 (0)