diff --git a/examples/readMessages.js b/examples/readMessages.js index 6294c89..7642c24 100644 --- a/examples/readMessages.js +++ b/examples/readMessages.js @@ -10,42 +10,56 @@ var password = ''; let run = (async(() => { try { - var channel = 'hello-world-test1' - // Connect var orbit = OrbitClient.connect(host, username, password); var timer = new Timer(true); - // Iterator options - var options = { - limit: -1, // fetch all - reverse: false, // latest first - // gte: // eg. 'QmQGa4Bsw3JxxydNNbbYnXfnW1BC54koTidHQ6Am2VM8Ep' - // lte: // eg. 'QmQGa4Bsw3JxxydNNbbYnXfnW1BC54koTidHQ6Am2VM8Ep' - } - - // Get all messages - var iter = orbit.channel(channel, '').iterator(options); - for(let i of iter) { - console.log(i.item.key); - console.log(i.item.seq, i.item.op, i.hash, "ts: " + i.item.meta.ts, i.item.Payload); - } - - console.log("Fetch messages took " + timer.stop() + "ms"); - console.log("-------- KV store -------") - orbit.channel(channel, '').put("key3", "this is the value you're looking for: " + new Date().getTime()); - var val = orbit.channel(channel, '').get("key3"); + var channel = 'keyspace1' + // orbit.channel(channel, '').delete(); + orbit.channel(channel).put("key3", "this is the value you're looking for: " + new Date().getTime()); + var val = orbit.channel(channel).get("key3"); console.log("key3:", val); - orbit.channel(channel, '').put("key4", "this will be deleted"); - var val2 = orbit.channel(channel, '').get("key4"); + orbit.channel(channel).put("key4", "this will be deleted"); + var val2 = orbit.channel(channel).get("key4"); console.log("key4:", val2); - orbit.channel(channel, '').remove({ key: "key4" }); - val2 = orbit.channel(channel, '').get("key4"); + orbit.channel(channel).remove({ key: "key4" }); + val2 = orbit.channel(channel).get("key4"); console.log("key4:", val2); + console.log("-------- EVENT log -------") + const c1 = 'c1'; + orbit.channel(c1).delete(); + var hash1 = orbit.channel(c1).add("hello1"); + var hash2 = orbit.channel(c1).add("hello2"); + + var items = orbit.channel(c1).iterator({ limit: -1 }).collect(); + items = items.map((e) => { + return { key: e.item.key, val: e.item.Payload }; + }); + console.log(JSON.stringify(items, null, 2)); + + console.log("--> remove", hash1); + orbit.channel(c1).remove({ key: hash1 }); + + items = orbit.channel(c1).iterator({ limit: -1 }).collect(); + items = items.map((e) => { + return { key: e.item.key, val: e.item.Payload }; + }); + console.log(JSON.stringify(items, null, 2)); + + // You can also get the event based on its hash + var value = orbit.channel(c1).get(hash2); + console.log("key:", hash2, "value:", value); + + console.log("--> remove", hash2); + orbit.channel(c1).remove({ key: hash2 }); + + items = orbit.channel(c1).iterator({ limit: -1 }).collect(); + console.log(JSON.stringify(items, null, 2)); + } catch(e) { console.error("error:", e); console.error(e.stack); diff --git a/src/Aggregator.js b/src/Aggregator.js index 8dcfa0a..2a6bafb 100644 --- a/src/Aggregator.js +++ b/src/Aggregator.js @@ -28,17 +28,14 @@ class Aggregator { const item = await (this._fetchOne(ipfs, hash, password)); if(item) { - if(item.op === HashCacheOps.Delete) { - handledItems.push(item.target); - } else if(item.op === HashCacheOps.Add && !this._contains(handledItems, hash)) { - res.push({ hash: hash, item: item }); - currentDepth ++; - } else if(item.op === HashCacheOps.Put && !this._contains(handledItems, item.key)) { + if((item.op === HashCacheOps.Put || item.op === HashCacheOps.Add) && !this._contains(handledItems, item.key)) { if(!opts.key || opts.key && opts.key === item.key) { res.push({ hash: hash, item: item }); currentDepth ++; - handledItems.push(item.key); + handledItems.push(item.target); } + } else if(item.op === HashCacheOps.Delete) { + handledItems.push(item.target); } if(opts.key && item.key === opts.key) diff --git a/src/OrbitClient.js b/src/OrbitClient.js index a4ce47a..bf9a21e 100644 --- a/src/OrbitClient.js +++ b/src/OrbitClient.js @@ -151,9 +151,10 @@ class OrbitClient { /* DB Operations */ _add(channel, password, data) { - const key = null; const post = this._publish(data); - return this._createOperation(channel, password, HashCacheOps.Add, key, post.Hash); + const key = post.Hash; + this._createOperation(channel, password, HashCacheOps.Add, key, post.Hash); + return key; } _put(channel, password, key, data) { diff --git a/src/Post.js b/src/Post.js index cf2b352..253c8d8 100644 --- a/src/Post.js +++ b/src/Post.js @@ -5,6 +5,7 @@ var encryption = require('./Encryption'); class Post { constructor(content) { this.content = content; + this.ts = new Date().getTime(); } encrypt(privkey, pubkey) { diff --git a/test/orbit-client-tests.js b/test/orbit-client-tests.js index 68c7dd7..862c24e 100644 --- a/test/orbit-client-tests.js +++ b/test/orbit-client-tests.js @@ -102,7 +102,7 @@ describe('Orbit Client', () => { var msg = orbit.channel(channel, '').add('hello'); var info = orbit.channel(channel, '').info(); assert.notEqual(info, null); - assert.equal(info.head, msg); + assert.notEqual(info.head, null); assert.notEqual(info.modes, null); assert.equal(info.modes.r, null); done(); @@ -154,7 +154,7 @@ describe('Orbit Client', () => { })); }); - describe('Insert', function() { + describe('Add events', function() { it('adds an item to an empty channel', async((done) => { try { orbit.channel(channel, '').delete(); @@ -238,7 +238,6 @@ describe('Orbit Client', () => { assert.notEqual(next.item, null); assert.notEqual(next.item.op, null); assert.equal(next.item.seq, 4); - assert.equal(next.item.key, null); assert.notEqual(next.item.target, null); assert.notEqual(next.item.next, null); assert.notEqual(next.item.Payload, null); @@ -261,7 +260,7 @@ describe('Orbit Client', () => { var iter = orbit.channel(channel, '').iterator(); var first = iter.next().value; var second = iter.next().value; - assert.equal(first.hash, items[items.length - 1]); + assert.equal(first.item.key, items[items.length - 1]); assert.equal(second, null); assert.equal(first.item.Payload, 'hello4'); done(); @@ -298,7 +297,7 @@ describe('Orbit Client', () => { var iter = orbit.channel(channel, '').iterator({ limit: 0 }); var first = iter.next().value; var second = iter.next().value; - assert.equal(first.hash, items[items.length - 1]); + assert.equal(first.item.key, items[items.length - 1]); assert.equal(second, null); done(); })); @@ -307,7 +306,7 @@ describe('Orbit Client', () => { var iter = orbit.channel(channel, '').iterator({ limit: 1 }); var first = iter.next().value; var second = iter.next().value; - assert.equal(first.hash, items[items.length - 1]); + assert.equal(first.item.key, items[items.length - 1]); assert.equal(second, null); done(); })); @@ -318,16 +317,16 @@ describe('Orbit Client', () => { var second = iter.next().value; var third = iter.next().value; var fourth = iter.next().value; - assert.equal(first.hash, items[items.length - 1]); - assert.equal(second.hash, items[items.length - 2]); - assert.equal(third.hash, items[items.length - 3]); + assert.equal(first.item.key, items[items.length - 1]); + assert.equal(second.item.key, items[items.length - 2]); + assert.equal(third.item.key, items[items.length - 3]); assert.equal(fourth, null); done(); })); it('returns all items', async((done) => { var iter = orbit.channel(channel, '').iterator({ limit: -1 }); - var messages = iter.collect().map((e) => e.hash); + var messages = iter.collect().map((e) => e.item.key); messages.reverse(); assert.equal(messages.length, items.length); @@ -337,17 +336,19 @@ describe('Orbit Client', () => { it('returns all items when limit is bigger than -1', async((done) => { var iter = orbit.channel(channel, '').iterator({ limit: -300 }); - var messages = iter.collect().map((e) => e.hash); + var messages = iter.collect().map((e) => e.item.key); assert.equal(messages.length, items.length); + assert.equal(messages[0], items[items.length - 1]); done(); })); it('returns all items when limit is bigger than number of items', async((done) => { var iter = orbit.channel(channel, '').iterator({ limit: 300 }); - var messages = iter.collect().map((e) => e.hash); + var messages = iter.collect().map((e) => e.item.key); assert.equal(messages.length, items.length); + assert.equal(messages[0], items[items.length - 1]); done(); })); }); @@ -355,7 +356,7 @@ describe('Orbit Client', () => { describe('Options: reverse', function() { it('returns all items reversed', async((done) => { var iter = orbit.channel(channel, '').iterator({ limit: -1, reverse: true }); - var messages = iter.collect().map((e) => e.hash); + var messages = iter.collect().map((e) => e.item.key); assert.equal(messages.length, items.length); assert.equal(messages[0], items[0]); @@ -364,20 +365,28 @@ describe('Orbit Client', () => { }); describe('Options: ranges', function() { + var all = []; + var head; + + before((done) => { + var fetchAll = () => new Promise(async((resolve, reject) => { + all = orbit.channel(channel, '').iterator({ limit: -1 }).collect(); + head = all[0]; + resolve(); + })); + fetchAll().then(done); + }); + describe('gt & gte', function() { it('returns 0 items when gt is the head', async((done) => { - var iter = orbit.channel(channel, '').iterator(); - var head = iter.next().value; - var iter2 = orbit.channel(channel, '').iterator({ gt: head.hash }); - var messages = iter2.collect().map((e) => e.hash); - + var messages = orbit.channel(channel, '').iterator({ gt: head.hash }).collect(); assert.equal(messages.length, 0); done(); })); it('returns 1 item when gte is the head', async((done) => { - var iter = orbit.channel(channel, '').iterator({ gte: items[items.length -1], limit: -1 }); - var messages = iter.collect().map((e) => e.hash); + var iter2 = orbit.channel(channel, '').iterator({ gte: head.hash, limit: -1 }); + var messages = iter2.collect().map((e) => e.item.key); assert.equal(messages.length, 1); assert.equal(messages[0], items[items.length -1]); @@ -385,26 +394,29 @@ describe('Orbit Client', () => { })); it('returns 2 item when gte is defined', async((done) => { - var iter = orbit.channel(channel, '').iterator({ gte: items[items.length - 2], limit: -1 }); + var gte = all[1].hash; + var iter = orbit.channel(channel, '').iterator({ gte: gte, limit: -1 }); var messages = iter.collect().map((e) => e.hash); assert.equal(messages.length, 2); - assert.equal(messages[0], items[items.length - 1]); - assert.equal(messages[1], items[items.length - 2]); + assert.equal(messages[0], all[0].hash); + assert.equal(messages[1], all[1].hash); done(); })); it('returns all items when gte is the root item', async((done) => { - var iter = orbit.channel(channel, '').iterator({ gte: items[0], limit: -1 }); - var messages = iter.collect().map((e) => e.hash); + var iter = orbit.channel(channel, '').iterator({ gte: all[all.length -1], limit: -1 }); + var messages = iter.collect().map((e) => e.item.key); assert.equal(messages.length, itemCount); + assert.equal(messages[0], items[items.length - 1]); + assert.equal(messages[messages.length - 1], items[0]); done(); })); it('returns items when gt is the root item', async((done) => { - var iter = orbit.channel(channel, '').iterator({ gt: items[0], limit: -1 }); - var messages = iter.collect().map((e) => e.hash); + var iter = orbit.channel(channel, '').iterator({ gt: all[all.length - 1], limit: -1 }); + var messages = iter.collect().map((e) => e.item.key); assert.equal(messages.length, itemCount - 1); assert.equal(messages[0], items[items.length - 1]); @@ -429,8 +441,6 @@ describe('Orbit Client', () => { describe('lt & lte', function() { it('returns one item when lt is the head', async((done) => { - var iter = orbit.channel(channel, '').iterator(); - var head = iter.next().value; var iter2 = orbit.channel(channel, '').iterator({ lt: head.hash }); var messages = iter2.collect().map((e) => e.hash); @@ -440,66 +450,58 @@ describe('Orbit Client', () => { })); it('returns all items when lt is head and limit is -1', async((done) => { - var iter = orbit.channel(channel, '').iterator(); - var head = iter.next().value; var iter2 = orbit.channel(channel, '').iterator({ lt: head.hash, limit: -1 }); var messages = iter2.collect().map((e) => e.hash); assert.equal(messages.length, itemCount); assert.equal(messages[0], head.hash); - assert.equal(messages[4], items[0]); + assert.equal(messages[4], all[all.length - 1].hash); done(); })); it('returns 3 items when lt is head and limit is 3', async((done) => { - var iter = orbit.channel(channel, '').iterator(); - var head = iter.next().value; var iter2 = orbit.channel(channel, '').iterator({ lt: head.hash, limit: 3 }); var messages = iter2.collect().map((e) => e.hash); assert.equal(messages.length, 3); assert.equal(messages[0], head.hash); - assert.equal(messages[2], items[2]); + assert.equal(messages[2], all[2].hash); done(); })); it('returns null when lt is the root item', async((done) => { - var iter = orbit.channel(channel, '').iterator({ lt: items[0] }); - var messages = iter.collect(); + var messages = orbit.channel(channel, '').iterator({ lt: all[all.length - 1].hash }).collect(); assert.equal(messages.length, 0); done(); })); it('returns one item when lte is the root item', async((done) => { - var iter = orbit.channel(channel, '').iterator({ lte: items[0] }); + var iter = orbit.channel(channel, '').iterator({ lte: all[all.length - 1].hash }); var messages = iter.collect().map((e) => e.hash); assert.equal(messages.length, 1); - assert.equal(messages[0], items[0]); + assert.equal(messages[0], all[all.length - 1].hash); done(); })); it('returns all items when lte is the head', async((done) => { - var iter = orbit.channel(channel, '').iterator(); - var head = iter.next().value; var iter2 = orbit.channel(channel, '').iterator({ lte: head.hash, limit: -1 }); var messages = iter2.collect().map((e) => e.hash); assert.equal(messages.length, itemCount); - assert.equal(messages[0], items[items.length - 1]); - assert.equal(messages[4], items[0]); + assert.equal(messages[0], all[0].hash); + assert.equal(messages[4], all[all.length - 1].hash); done(); })); it('returns 3 items when lte is the head', async((done) => { - var iter = orbit.channel(channel, '').iterator(); - var head = iter.next().value; - var iter2 = orbit.channel(channel, '').iterator({ lte: items[items.length - 2], limit: 3 }); + var iter2 = orbit.channel(channel, '').iterator({ lte: head.hash, limit: 3 }); var messages = iter2.collect().map((e) => e.hash); assert.equal(messages.length, 3); - assert.equal(messages[0], items[items.length - 2]); - assert.equal(messages[2], items[1]); + assert.equal(messages[0], all[0].hash); + assert.equal(messages[1], all[1].hash); + assert.equal(messages[2], all[2].hash); done(); })); });