Skip to content

Commit 59e595b

Browse files
committed
Add functionality to copy feed and append to it.
Change module export name. Squash commits for appending feed
1 parent 3ab64dc commit 59e595b

File tree

4 files changed

+158
-1
lines changed

4 files changed

+158
-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.appendTo(this.core, feedId)
21+
return feed
22+
}

lib/feedOperations.js

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

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.appendTo(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.appendTo(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)