1.0.2 • Published 5 years ago

treos-local-config v1.0.2

Weekly downloads
4
License
MIT
Repository
github
Last release
5 years ago

tre-msgpath

Like pathway, but for mutable ssb messages((https://www.npmjs.com/package/ssb-revisions) and with changes in real-time!

const Msgpath = require('tre-msgpath')
const collect = require('collect-mutations')
const client = require('tre-cli-client')

client( (err, ssb)=>{
  const msgpath = Msgpath(ssb)
  const webapps = MutantArray()
  pull( ssb.revisions.messagesByType('webapp'), collect(webapps))
  
  // webapps contains observablaes for the latest version of each webapp
  // Each webapp has a icon property which is a message reference to a message of type image
  // Images have a property file, which in turn has properties type and name.

  const icons = msgpath(webapps, [ ['icon'], ['file', /type|name/']])

License: MIT

const Msgpath = require('.') const test = require('tape') const Value = require('mutant/value')

test('simple', t=>{ t.plan(1) const ssb = {}

const root = Value() const msg = { key: 'foo', value: { content: { a: 'bar' } } }

const unsubscribe = msgpath(root, ['value', 'content', 'a'])(value => { t.deepEqual(value, msg, 'bar', 'chain of values') })

root.set(msg) })

test('message reference', t=>{ t.plan(3)

const ref = rndKey() const opts = {allowAllAuthors: true}

const ssb = { revisions: { heads: (key, o) => { t.equal(key, ref, 'ref matches') t.equal(o.allowAllAuthors, opts.allowAllAuthors, 'allowAllAuthors is passed through') return pull.values([{heads: msg2, meta}]) } } } const msgpath = Msgpath(ssb)

const root = Value() const msg = { key: 'foo1', value: { content: { a: ref } } } const msg2 = { key: 'foo2', value: { content: { b: 'baz' } } } const meta = { what: 'ever' }

const unsubscribe = msgpath(root, ['value', 'content', 'a', 'value', 'content', 'b'], opts )(value => { t.deepEqual(value, msg, Object.assign({}, msg2, {meta}), 'baz', 'chain of values') })

root.set(msg) })

test('function instead of path', t=>{ t.plan(3)

const msgpath = Msgpath()

const values = Value(), Value(), Value()

function f1(x, i) { t.equal(i, 0) return valuesx }

function f2(x, i) { t.equal(i, 1) return values-x }

msgpath(values0, f1, f2)(value => { t.deepEqual(value, 1, -2, 'hello', 'correct result') })

values2.set('hello') values1.set(-2) values0.set(1) })

test.only('multiple routes', t=>{ t.plan(3) const msgpath = Msgpath()

const values = Value(), Value(), Value() const obj = { x: 1.1, // rounds to 1 -> bar y: 1.6, // rounds to 2 -> foo a: 0 // ignored }

function roundRef(x, i) { t.equal(i, 1) const idx = Math.round(x) return valuesidx }

msgpath(values0, [[/xyz/], roundRef])(value => { console.log(value) t.deepEqual(value, [obj, obj.x, obj.y, 'bar', 'foo']) })

values2.set('foo') values1.set('bar') values0.set(obj) })

function rndKey() { return '%' + crypto.randomBytes(32).toString('base64') + '.sha256' }