Skip to content

Commit 2c884ff

Browse files
committed
Add functionality to copy feed and append to it.
1 parent 3ab64dc commit 2c884ff

File tree

4 files changed

+160
-1
lines changed

4 files changed

+160
-1
lines changed

index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var level = require('level')
22
var hypercore = require('hypercore')
33
var createImportPipeline = require('./lib/import.js')
4+
var feedOperations = require('./lib/feedOperations.js')
45

56
module.exports = Jawn
67

@@ -14,3 +15,8 @@ function Jawn (opts) {
1415
Jawn.prototype.createImportPipeline = function (opts) {
1516
return createImportPipeline(this, opts)
1617
}
18+
19+
Jawn.prototype.createAppendableFeed = function (feedId, data) {
20+
var feed = feedOperations.appendableFeed(this.core, feedId)
21+
return feed
22+
}

lib/feedOperations.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
2+
module.exports = {
3+
appendableFeed
4+
}
5+
6+
function appendableFeed (core, feedId) {
7+
var refFeed = core.get(feedId)
8+
var newFeed = core.add()
9+
var blockNumber = 0
10+
11+
var copyOriginal = function (resolve, reject) {
12+
for (var i = 0; i < refFeed.blocks; i++) {
13+
refFeed.get(i, function (err, block) {
14+
if (err) {
15+
console.log(err)
16+
reject()
17+
}
18+
19+
newFeed.append(block, function () {
20+
blockNumber++
21+
console.log('Copying block ' + blockNumber + '/' + newFeed.blocks + ' from original feed')
22+
23+
if (blockNumber === refFeed.blocks) {
24+
resolve()
25+
}
26+
})
27+
})
28+
}
29+
}
30+
31+
newFeed.append_p = function (data) {
32+
return new Promise(function (resolve, reject) {
33+
newFeed.append(data, resolve)
34+
})
35+
}
36+
37+
newFeed.finalize_p = function () {
38+
return new Promise(function (resolve, reject) {
39+
newFeed.finalize(resolve)
40+
})
41+
}
42+
43+
newFeed.initialize = function () {
44+
return new Promise(function (resolve, reject) {
45+
copyOriginal(resolve, reject)
46+
})
47+
}
48+
49+
return newFeed
50+
}

test/feedOperations.js

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
var test = require('tape')
2+
var Jawn = require('../')
3+
var memdb = require('memdb')
4+
var feedOps = require('../lib/feedOperations.js')
5+
6+
test('appendable feed', function (t) {
7+
var jawn = freshJawn()
8+
var feed = jawn.core.add()
9+
10+
feed.pappend = function (data) {
11+
return new Promise(function (resolve, reject) {
12+
feed.append(data, resolve)
13+
})
14+
}
15+
16+
feed.pfinalize = function () {
17+
return new Promise(function (resolve, reject) {
18+
feed.finalize(resolve)
19+
})
20+
}
21+
22+
feed.pappend('hello').then(function () {
23+
console.log('Appended')
24+
return feed
25+
})
26+
.then(function (feed) {
27+
return feed.pfinalize()
28+
})
29+
.then(function () {
30+
console.log('Finalized with id ' + feed.id.toString('hex'))
31+
var appfeed = feedOps.appendableFeed(jawn.core, feed.id)
32+
appfeed.initialize().then(function () {
33+
return appfeed.finalize_p()
34+
})
35+
.then(function () {
36+
t.same(appfeed.blocks, feed.blocks, 'testing')
37+
t.end()
38+
})
39+
})
40+
})
41+
42+
test('append to feed', function (t) {
43+
var jawn = freshJawn()
44+
var feed = jawn.core.add()
45+
var expected = ['hello', 'there', 'goodbye']
46+
47+
storeDataInFeed(feed, ['hello', 'there'])
48+
.then(function () {
49+
console.log('Finalized with id ' + feed.id.toString('hex'))
50+
51+
var appfeed = feedOps.appendableFeed(jawn.core, feed.id)
52+
53+
appfeed.initialize().then(function () {
54+
return appfeed.append_p('goodbye')
55+
})
56+
.then(function () {
57+
return appfeed.finalize_p()
58+
})
59+
.then(function () {
60+
t.same(appfeed.blocks, expected.length, 'Correct number of blocks')
61+
for (var i = 0; i < appfeed.blocks; i++) {
62+
appfeed.get(i, function (err, block) {
63+
if (err) {
64+
console.log(err)
65+
}
66+
t.same(block.toString(), expected.shift(), 'Feed block match')
67+
if (expected.length === 0) {
68+
t.end()
69+
}
70+
})
71+
}
72+
})
73+
})
74+
})
75+
76+
function storeDataInFeed (feed, data) {
77+
feed.pappend = function (data) {
78+
return new Promise(function (resolve, reject) {
79+
feed.append(data, resolve)
80+
})
81+
}
82+
83+
feed.pfinalize = function () {
84+
return new Promise(function (resolve, reject) {
85+
feed.finalize(resolve)
86+
})
87+
}
88+
89+
return new Promise(function (resolve, reject) {
90+
feed.pappend(data).then(function () {
91+
console.log('Appended')
92+
return feed
93+
})
94+
.then(function (feed) {
95+
return feed.pfinalize()
96+
})
97+
.then(resolve)
98+
})
99+
}
100+
101+
function freshJawn () {
102+
return new Jawn({db: memdb()})
103+
}

test/import.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ test('import json to jawn', function (t) {
3030
test('import csv to jawn', function (t) {
3131
var jawn = freshJawn()
3232
importFromFile(jawn, 'sample.csv', {'format': 'csv'})
33-
var importStream = importFromFile(jawn, 'sample.csv', {'format': 'csv'}, verify)
33+
var importStream = importFromFile(jawn, 'sample.csv', {'format': 'csv'})
3434
var expected = [
3535
'{"Type of Experience":"Writing software in any programming language","Little/No Experience":"1","Some Experience":"5","Very Familiar":"4"}',
3636
'{"Type of Experience":"Frontend Web Development","Little/No Experience":"4","Some Experience":"3","Very Familiar":"3"}',

0 commit comments

Comments
 (0)