From faad4c1c4f0e040585c95f1641be98a7334e2aa3 Mon Sep 17 00:00:00 2001 From: haad Date: Sun, 27 Dec 2015 18:25:23 +0200 Subject: [PATCH] Add setMode() for settings channel read and write (ops) modes. --- OrbitClient.js | 30 ++++++++++--- README.md | 10 ++++- test/orbit-client-tests.js | 87 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 117 insertions(+), 10 deletions(-) diff --git a/OrbitClient.js b/OrbitClient.js index 1632a9f..0bb68aa 100644 --- a/OrbitClient.js +++ b/OrbitClient.js @@ -19,6 +19,8 @@ class OrbitClient { constructor(ipfs) { this.sequences = {}; this.ipfs = ipfs; + this.network = {}; + this.user = null; } channel(hash, password) { @@ -29,7 +31,7 @@ class OrbitClient { return this._send(hash, password, text, options); }, delete: () => this._delete(hash, password), - setMode: (mode) => this._setMode(hash, modes) + setMode: (mode) => this._setMode(hash, password, mode) } } @@ -43,7 +45,7 @@ class OrbitClient { return seq; } - _iterator(channel, password, options) { + _getMessages(channel, password, options) { var currentIndex = 0; var messages = []; @@ -69,13 +71,13 @@ class OrbitClient { if(startFromHash) { // Get messages - messages = this._fetchRecursive(startFromHash, password, limit, gte ? gte : gt, 0); + messages = this._fetchRecursive(startFromHash, password, limit, gte ? gte : gt); // Slice the array var startIndex = 0; var endIndex = messages.length; if(limit > -1) { - startIndex = Math.max(messages.length - limit, 0); + startIndex = Math.max(0, messages.length - limit); endIndex = messages.length - ((gt || lt) ? 1 : 0); } else if(limit === -1) { endIndex = messages.length - (gt ? 1 : 0); @@ -86,6 +88,9 @@ class OrbitClient { if(reverse) messages.reverse(); + _iterator(channel, password, options) { + var messages = this._getMessages(channel, password, options); + // Iterator interface implementation let iterator = { [Symbol.iterator]() { @@ -130,6 +135,8 @@ class OrbitClient { _fetchRecursive(hash, password, amount, last, currentDepth) { var res = []; + if(!currentDepth) currentDepth = 0; + if(!last && amount > -1 && currentDepth >= amount) return res; @@ -188,12 +195,23 @@ class OrbitClient { return true; } - _setMode(channel, modes) { - /* TODO */ + _setMode(channel, password, modes) { + var m = [] + if(typeof modes !== 'Array') + m.push(modes); + else + m = modes; + return await(this.client.linkedList(channel, password).setMode(m)) } _connect(host, username, password) { this.client = await(HashCache.connect(host, username, password)); + this.user = this.client.info.user; + this.network = { + id: this.client.info.networkId, + name: this.client.info.name, + config: this.client.info.config + }; return; } diff --git a/README.md b/README.md index 1303978..758e175 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,15 @@ async(() => { // for(let i of iter) // console.log(i.hash, i.item.Data.seq); - // delete channel + // Set modes + var password = 'hello'; + var channelModes; + channelModes = orbit.channel(channel, channelPwd).setMode({ mode: "+r", params: { password: password } }); // { modes: { r: { password: 'hello' } } } + channelModes = orbit.channel(channel, password).setMode({ mode: "+w", params: { ops: [orbit.user.id] } }); // { modes: { ... } } + channelModes = orbit.channel(channel, password).setMode({ mode: "-r" }); // { modes: { ... } } + channelModes = orbit.channel(channel, '').setMode({ mode: "-w" }); // { modes: {} } + + // Delete channel var result = orbit.channel(channelName, channelPwd).delete(); // true | false })(); ``` diff --git a/test/orbit-client-tests.js b/test/orbit-client-tests.js index 70d0ff2..7684075 100644 --- a/test/orbit-client-tests.js +++ b/test/orbit-client-tests.js @@ -35,7 +35,7 @@ describe('Orbit Client', () => { let head = ''; let second = ''; let items = []; - let channel = 'abc'; + let channel = 'abc1'; before(function(done) { // logger.setLevel('ERROR'); @@ -58,6 +58,7 @@ describe('Orbit Client', () => { // } var start = () => new Promise(async((resolve, reject) => { orbit = OrbitClient.connect(host, username, password); + orbit.channel(channel, 'hello').setMode({ mode: "-r" }) resolve(); })); start().then(done); @@ -75,12 +76,17 @@ describe('Orbit Client', () => { it('connects to hash-cache-server', async((done) => { assert.notEqual(orbit, null); assert.notEqual(orbit.client, null); + assert.equal(orbit.user.id, 'QmcLzfQBKuvBYLsmgt4nkaUM7i7LNL37dPtnBZWgGpjPRW'); + assert.equal(orbit.network.id, 'anon-test'); + assert.equal(orbit.network.name, 'Anonymous Networks TEST'); + assert.notEqual(orbit.network.config.SupernodeRouting, null); + assert.equal(orbit.network.config.Bootstrap.length, 3); done(); })); }); - describe('Delete channel', function() { - it('deletes a channel', async((done) => { + describe('Delete', function() { + it('deletes a channel from the database', async((done) => { var result = orbit.channel(channel, '').delete(); assert.equal(result, true); var iter = orbit.channel(channel, '').iterator(); @@ -440,6 +446,81 @@ describe('Orbit Client', () => { }); + + describe('Modes', function() { + var password = 'hello'; + + it('sets read mode', async((done) => { + try { + var mode = { + mode: "+r", + params: { + password: password + } + }; + var res = orbit.channel(channel, '').setMode(mode) + assert.notEqual(res.modes.r, null); + assert.equal(res.modes.r.password, password); + } catch(e) { + assert.equal(e, null); + } + done(); + })); + + it('can\'t read with wrong password', async((done) => { + try { + var res = orbit.channel(channel, '').iterator(); + assert.equal(true, false); + } catch(e) { + assert.equal(e, 'Unauthorized'); + } + done(); + })); + + it('sets write mode', async((done) => { + try { + var mode = { + mode: "+w", + params: { + ops: [orbit.user.id] + } + }; + var res = orbit.channel(channel, password).setMode(mode); + assert.notEqual(res.modes.w, null); + assert.equal(res.modes.w.ops[0], orbit.user.id); + } catch(e) { + assert.equal(e, null); + } + done(); + })); + + it('can\'t write when user not an op', async((done) => { + // TODO + done(); + })); + + it('removes write mode', async((done) => { + try { + var res = orbit.channel(channel, password).setMode({ mode: "-w" }); + assert.equal(res.modes.w, null); + } catch(e) { + assert.equal(e, null); + } + done(); + })); + + it('removes read mode', async((done) => { + try { + var res = orbit.channel(channel, password).setMode({ mode: "-r" }); + assert.equal(res.modes.r, null); + } catch(e) { + assert.equal(e, null); + } + done(); + })); + + }); + }); // let rmDir = function(dirPath) {