├── .babelrc ├── .gitignore ├── .npmignore ├── Changelog.md ├── Map-Reduce.md ├── Readme.md ├── docs ├── Goal.md ├── LevelGraph.md ├── link.md └── traversal.md ├── edge ├── all.js ├── all.js.map ├── async │ ├── fields.js │ ├── fields.js.map │ ├── index.js │ ├── index.js.map │ ├── map-reduce.js │ ├── map-reduce.js.map │ ├── no.js │ ├── no.js.map │ ├── recurse.js │ ├── recurse.js.map │ ├── timed.js │ ├── timed.js.map │ ├── val.js │ ├── val.js.map │ ├── value.js │ └── value.js.map ├── channel │ ├── csp.js │ └── csp.js.map ├── count.js ├── count.js.map ├── date.js ├── date.js.map ├── each.js ├── each.js.map ├── edge.js ├── edge.js.map ├── fields.js ├── fields.js.map ├── filter.js ├── filter.js.map ├── gen │ ├── index.js │ ├── index.js.map │ ├── live.js │ ├── live.js.map │ ├── map.js │ ├── map.js.map │ ├── on.js │ └── on.js.map ├── index.js ├── index.js.map ├── live.js ├── live.js.map ├── local.js ├── local.js.map ├── map-reduce.js ├── map-reduce.js.map ├── no.js ├── no.js.map ├── observable │ ├── index.js │ ├── index.js.map │ ├── rx.js │ ├── rx.js.map │ ├── xstream.js │ ├── xstream.js.map │ ├── zen.js │ └── zen.js.map ├── out.js ├── out.js.map ├── print.js ├── print.js.map ├── promise │ ├── fields.js │ ├── fields.js.map │ ├── index.js │ ├── index.js.map │ ├── map-reduce.js │ ├── map-reduce.js.map │ ├── no.js │ ├── no.js.map │ ├── recurse.js │ ├── recurse.js.map │ ├── timed.js │ ├── timed.js.map │ ├── val.js │ ├── val.js.map │ ├── value.js │ └── value.js.map ├── put.js ├── put.js.map ├── recurse.js ├── recurse.js.map ├── set.js ├── set.js.map ├── soul.js ├── soul.js.map ├── timed.js ├── timed.js.map ├── utils │ ├── pubsub.js │ └── pubsub.js.map ├── value.js ├── value.js.map └── xstream │ ├── index.js │ └── index.js.map ├── examples └── app │ ├── css │ └── main.css │ └── index.html ├── gulpfile.js ├── package.json ├── sandbox ├── edge.test.js ├── edges.js ├── hello.html ├── hello.js ├── keys.test.js ├── level.json ├── map-reduce-simulator.html └── play.js ├── src ├── all.js ├── channel │ └── csp.js ├── count.js ├── date.js ├── each.js ├── edge.js ├── fields.js ├── filter.js ├── index.js ├── live.js ├── local.js ├── map-reduce.js ├── no.js ├── observable │ ├── index.js │ ├── rx.js │ ├── xstream.js │ └── zen.js ├── out.js ├── print.js ├── promise │ ├── fields.js │ ├── index.js │ ├── map-reduce.js │ ├── no.js │ ├── recurse.js │ ├── timed.js │ ├── val.js │ └── value.js ├── put.js ├── recurse.js ├── set.js ├── soul.js ├── timed.js ├── utils │ └── pubsub.js └── value.js └── test ├── channel └── csp.test.js ├── count.test.js ├── date.test.js ├── each.test.js ├── fields.test.js ├── live.test.js ├── local.test.js ├── no.test.js ├── observable ├── rx.test.js ├── xstream.test.js └── zen.test.js ├── promise └── map-reduce.test.js ├── put-at.test.js ├── set-at.test.js ├── soul.test.js ├── timed.test.js └── value.test.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "latest" 4 | ], 5 | "plugins": [ 6 | "transform-runtime" 7 | ] 8 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | .vscode 3 | node_modules 4 | data.json 5 | play -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test 2 | *.test.js 3 | *.ts 4 | *.html 5 | css 6 | gulpfile 7 | .babelrc 8 | sandbox 9 | play 10 | examples 11 | docs 12 | -------------------------------------------------------------------------------- /Changelog.md: -------------------------------------------------------------------------------- 1 | ## Changelog 2 | 3 | ### 0.8.0 4 | 5 | - Added `context` option for more fine-control 6 | - Renamed `deleteFromBucket` to `filterBucket` 7 | - Added more options to `ctx` 8 | - pass `ctx` to all internal functions so they are independent of internal scope 9 | - fix `.value` chain method to work with Gun `0.6.x` and higher, by using: `Gun.obj.copy(val)` 10 | 11 | ### 0.7.7 12 | 13 | - `mapReduce` has loads of more options to customize. 14 | - introduced more Promise based API chain methods 15 | 16 | ### 0.7.0 17 | 18 | First release 19 | -------------------------------------------------------------------------------- /Map-Reduce.md: -------------------------------------------------------------------------------- 1 | ## mapReduce 2 | 3 | Iterate and transform all the properties of a bucket! 4 | The `mapReduce` chain function takes the following `options` map and a `cb` function 5 | that receives the map-reduced (ie. transformed) bucket. 6 | 7 | ```js 8 | .mapReduce({ 9 | iterator: 'val', // default 10 | // processWhile: function({field, val}) 11 | // updateWhen: function({field, val}) 12 | logging: false, // default 13 | newField: reverse, // or string 14 | newValue: 'ready', // or function(val, field) 15 | value: (val, field) => 'done', // or string 16 | // transform: function (field, val) => Object 17 | 18 | filter: noColor('blue'), 19 | filters: [noColor('red'), noColor('green')], 20 | // ... many more options 21 | context 22 | }, cb, [putCb], [opt]) 23 | ``` 24 | 25 | ### Arguments 26 | 27 | The callback `cb` is called when done. Arguments: `putCb` and `opt` are optional. 28 | `putCb` is used on any internal `put`, including delete (ie. `put(null)`) 29 | `opt` is the typical Gun opt for controlling sync/storage. 30 | 31 | #### ctx 32 | 33 | All of the internal functions are both called with a context object: 34 | 35 | ```js 36 | { 37 | oldProps: {}, 38 | newProps: {}, 39 | filteredFields: {}, 40 | visited: {}, 41 | updated: false, 42 | processedFields: 0, 43 | fields: [], // to process 44 | ignoreFields: [], // to ignore 45 | allFields: [ 46 | //'red', 'blue', ... 47 | ], 48 | // putCb, 49 | // opt, 50 | // context: {} 51 | } 52 | ``` 53 | 54 | #### processWhile 55 | 56 | The default `processWhile` function: 57 | 58 | ```js 59 | function defaultProcessWhile({field, val, ctx}) { 60 | // ie. not a revisited field 61 | return !ctx.visited[field] 62 | } 63 | ``` 64 | 65 | Which means it stops iterating once it encounters a field it has already visited. 66 | 67 | #### updateWhen 68 | 69 | ```js 70 | function defaultUpdateWhen({field, val, ctx}) { 71 | let processedAll = (processedFields >= ctx.allFields.length) 72 | let visitedAll = ctx.allFields.every(f => ctx.visited[f]) 73 | return visitedAll && processedAll 74 | } 75 | ``` 76 | 77 | #### saveChanges 78 | 79 | Function to save any changes in the bucket 80 | 81 | ```js 82 | function defaultSaveChanges(bucket, changesObj, ctx) { 83 | bucket.put(changesObj, ctx.putCb, ctx.opt) 84 | } 85 | ``` 86 | 87 | #### updateBucket 88 | 89 | Default function to update bucket. 90 | Override by supplying `updateBucket` function option 91 | 92 | ```js 93 | function defaultUpdateBucket(bucket, ctx) { 94 | log('UPDATE', props) 95 | let props = Object.assign(ctx.oldProps, ctx.newProps) 96 | ctx.saveChanges(bucket, props, ctx) 97 | } 98 | ``` 99 | 100 | #### filterBucket 101 | 102 | Default function to delete items from bucket. 103 | Override by supplying `filterBucket` function option 104 | 105 | ```js 106 | function defaultFilterBucket(bucket, ctx) { 107 | let deleteKeys = Object.keys(ctx.filteredFields) 108 | if (deleteKeys.length > 0) { 109 | log('FILTER', deleteKeys) 110 | let deleteObj = deleteKeys.reduce((obj, key) => { 111 | obj[key] = null 112 | return obj 113 | }, {}) 114 | log('deleteObj', deleteObj) 115 | ctx.saveChanges(bucket, deleteObj, ctx) 116 | } 117 | } 118 | ``` 119 | 120 | #### done 121 | 122 | Default `done` function which calls the `cb` with the transformed bucket 123 | Override by supplying `done` function option 124 | 125 | ```js 126 | function defaultDone(bucket, cb, ctx) { 127 | log('DONE') 128 | if (cb) { 129 | cb(bucket, ctx) 130 | } else { 131 | throw Error(`${ctx.iterator}: missing callback (in done)`) 132 | } 133 | } 134 | ``` 135 | 136 | ## Usage Examples: mapReduce 137 | 138 | ### Callbacks 139 | 140 | ```js 141 | import 'gun-edge/dist/map-reduce' 142 | 143 | // where str is the property field name in this case 144 | function reverse(str, val) { 145 | return str ? str.split('').reverse().join('') : str 146 | } 147 | 148 | async function cb(bucket) { 149 | let violet = await bucket.$valueAt('violet') 150 | console.log('colors::', await bucket.$value()) 151 | console.log('violet::', violet) 152 | t.is(violet, 'violet') 153 | } 154 | 155 | let cols = gun.get('colors') 156 | 157 | let colors = cols.put({ 158 | violet: true, 159 | red: true, 160 | green: false 161 | }) 162 | 163 | // remove a color field 164 | const noColor = (color) => { 165 | return (field, value) => { 166 | return field === color 167 | } 168 | } 169 | 170 | cols.mapReduce({ 171 | newField: reverse, 172 | newValue: 'ready', 173 | value: (v) => 'done', 174 | filters: [noColor('red'), noColor('green')] 175 | }, cb) 176 | 177 | /* 178 | colors:: { violet: 'done', 179 | red: null, 180 | green: null, 181 | teloiv: 'ready', 182 | der: 'ready' } 183 | violet:: done 184 | */ 185 | ``` 186 | 187 | ### Promise async/await: mapReduce 188 | 189 | ```js 190 | import 'gun-edge/dist/async/map-reduce' 191 | 192 | // add status created to each existing user 193 | let result = await users.$mapReduce({ 194 | value: (v) => Object.assign(v, { 195 | status: 'created' 196 | }) 197 | }) 198 | ``` 199 | 200 | Example usage, assuming we supply some of our own overrides and customization options 201 | 202 | ```js 203 | let logger = new Logger(opts) 204 | let reducedCols = await cols.$mapReduce({ 205 | newField: reverse, 206 | newValue: 'ready', 207 | value: (v) => 'done', 208 | // transform // function(field, val) => Object 209 | 210 | filters: [noColor('red'), noColor('green')], 211 | // fields = ['red', 'green'], // only process these fields 212 | // ignoreFields = ['pink'], // skip these fields 213 | // validField: function(field, ctx) // determine to process this field or not 214 | processWhile, // function(field, val, ctx) 215 | updateBucket, // function(bucket, ctx) 216 | filterBucket, // function(bucket, ctx) 217 | // saveChanges // function(bucket, changesObj, ctx) 218 | // example of override 219 | done: (bucket, cb) => { 220 | logger.log('COLORS UPDATED') 221 | cb(bucket) 222 | } 223 | }) 224 | ``` -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Gun edge 2 | 3 | Extra DSL extensions for [Gun.js](http://gun.js.org/) 4 | 5 | Many of the snippets were extracted from [Gun Snippets 0.3.x](https://github.com/amark/gun/wiki/Snippets-(v0.3.x)) and upgraded to work with Gun +0.6 6 | 7 | Some extra chain methods have been added, such as `mapReduce` and `iterator`. 8 | 9 | Most async methods now come with a ES6 Promises or async/await (ES7) variant. 10 | The Promise methods are prefixed with `$`. 11 | 12 | ## Maturity 13 | 14 | As of version 0.8.x, not all of the chain methods have been fully tested yet. 15 | Please help test them out and/or add more tests. Thanks. 16 | 17 | ## Install 18 | 19 | `npm i -S gun-edge` 20 | 21 | ## Use 22 | 23 | Assuming Babel or similar transpiler setup (2017) 24 | 25 | To add all chain methods: 26 | 27 | ```js 28 | import Gun from 'gun/gun' 29 | import chain from 'gun-edge' 30 | chain(Gun) 31 | ``` 32 | 33 | To control which chain methods to add: 34 | 35 | ```js 36 | import { 37 | add 38 | } from 'gun-edge' 39 | add(Gun, 'date', 'fields') 40 | ``` 41 | 42 | Import individual chain modules 43 | 44 | ```js 45 | import { 46 | inspect, 47 | addInspect 48 | } from 'gun-edge/edge/inspect' 49 | addInspect(Gun.chain) 50 | ``` 51 | 52 | ### Require (Node.js) 53 | 54 | Using `require` 55 | 56 | ```js 57 | const Gun = require('gun/gun') 58 | require('gun-edge')(Gun) 59 | ``` 60 | 61 | ## API extensions 62 | 63 | Chain methods available: 64 | 65 | **Iteration** 66 | 67 | - `.each()` - see [each](https://github.com/amark/gun/wiki/Snippets-(v0.3.x)#guneach) 68 | - `.timed(opts)` - interval based recursive iteration on node (see `timed-iterator.test.js`) 69 | - `.mapReduce(options, cb, putCb, opt)` - mapReduce on a bucket (see below) 70 | - `.recurse(cb, filter)` - recursively navigate bucket graph/tree structure 71 | 72 | **Operations** 73 | 74 | - `.count(numFun)` - create a [CRDT](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type) counter, see [counter](https://github.com/amark/gun/wiki/Snippets-(v0.3.x)#-crdt-counter) 75 | - `.copy(val)` - make a copy/clone of a value 76 | - `.date(dateValue)` - date field, see [date](https://github.com/amark/gun/wiki/Snippets-(v0.3.x)#date) 77 | - `.local(data, cb, opt)` - store locally only, no peer sync 78 | - `.no(cb)` - see [no](https://github.com/amark/gun/wiki/Snippets-(v0.3.x)#-no) 79 | - `.value(cb, opt)` - get the node value (no meta) 80 | - `.valueAt(path, cb, opt)` : get value at the `path` (no meta) 81 | - `.valAt(path, cb, opt)` : get value at the `path` 82 | - `.setAt(path, cb, opt)` : set value at the `path` 83 | - `.putAt(path, cb, opt)` : put value at the `path` 84 | - `.localFields()` - get list of *local* field names (keys) in the bucket 85 | - `.fields(cb)` - return fields to cb 86 | - `.soul()` - return the soul (id) of the node 87 | - `.print(label)` - print value to console (no meta). Note: You can set `Gun.log`, by default: `console.log` 88 | 89 | **Promise enabled methods** 90 | 91 | ES6 `Promise` or ES7 `async/await`), always prefixed with `$` 92 | 93 | - `.$fields(opt)` - get fields (ie. property names) 94 | - `.$iterate(opts)` - iterate 95 | - `.$mapReduce(options, putCb, opt)` - map/reduce 96 | - `.$no(opt)` - blocks if no data, see [no](https://github.com/amark/gun/wiki/Snippets-(v0.3.x)#-no) 97 | - `.$val(opt)` - full value (with meta) 98 | - `.$value(opt)` - get value (no meta) 99 | - `.$valueAt(path, opt)` - get value at the `path` (no meta) 100 | - `.$recurse(filter)` - recursive filter 101 | - `.$timed(opts)` - timed recursion 102 | 103 | **Observable streams for superior Async flow control** 104 | 105 | Observable methods are also (currently) prefixed with `$` 106 | 107 | [Observable](https://tc39.github.io/proposal-observable/) stream support is included for: 108 | - [Rx](http://reactivex.io/rxjs/) 109 | - [Zen](https://github.com/zenparsing/zen-observable) 110 | - [Xstream](http://staltz.com/xstream/) for [Cycle.js](cycle.js.org) 111 | 112 | Example: Rx.js 113 | 114 | ```js 115 | // optional 116 | let options = { 117 | log: true, 118 | op: 'live' 119 | } 120 | 121 | // or simply $rx(node) or even node.$rx() 122 | let obs = $rx(node, options) 123 | 124 | let subscription = obs 125 | .subscribe(x => { 126 | console.log({received: x}) 127 | }) 128 | ``` 129 | 130 | ### Useful internal Gun functions 131 | 132 | `Gun.obj.copy(val)` - copy a value 133 | `Gun.obj.map(data, function(val, field){ ... }` - map over a node 134 | `Gun.fn.is` - check if something is a function 135 | `Gun.text.random()` - generate random text 136 | `Gun.is.node.soul(data)` - test if data has a soul (ie. is a Gun node) 137 | `Gun.node.soul(data)` - return id of Gun node 138 | 139 | Please add more internal Gun functions to this list for reference ;) 140 | 141 | ## Useful chain methods 142 | 143 | `node.back()` - go one level back/up in the graph 144 | 145 | **WIP** 146 | 147 | - `.out(navOpts, cb)` - traverse edge (WIP) 148 | - `.edge(navOpts/data)` or `link` - for linking nodes and traversing links/edges 149 | - `.filter(filterFun, cb)` - filter fields 150 | 151 | ### CSP Channels: WIP 152 | 153 | [CSP channel](https://github.com/ubolonton/js-csp/blob/master/doc/basic.md) also included :) 154 | 155 | The main idea is outlined [here](http://swannodette.github.io/2013/08/24/es6-generators-and-csp) 156 | 157 | CSP learning resources: 158 | 159 | - [Introduction To CSP In Javascript](http://lucasmreis.github.io/blog/quick-introduction-to-csp-in-javascript/) 160 | - [Using CSP As Application Architecture](http://lucasmreis.github.io/blog/using-csp-as-application-architecture/) 161 | 162 | 163 | To start a process just pass a *generator* as a parameter to the `go` function. 164 | By using the `yield` keyword, you can pause a process, freeing the main thread 165 | Channels are queues. Whenever a process calls `take` on a channel, it pauses until a value is `put` into that channel. 166 | 167 | Processes that put a value on a channel also pause until some other process uses take. 168 | Because channels are queues, when a process takes from a channel, the value will not be available for other processes to take. One process puts, one process takes. 169 | A channel can be buffered, which means that, for a given number of puts, a put will not make the process pause. 170 | 171 | If the channel has a buffer of size 2, the third put will block the process, until someone takes from it. 172 | 173 | See the `test/channel/` folder for some test examples: 174 | 175 | ```js 176 | let size = 2 177 | let buffer = csp.buffers.fixed(size) 178 | // let buffer = csp.buffers.sliding(size) 179 | // let buffer = csp.buffers.dropping(size) 180 | // const promiseCh = csp.promiseChan(); 181 | 182 | // NOTE: optionally customize channel and buffer used 183 | // let promiseCh = csp.chan(buffer) 184 | 185 | promiseCh = $csp(node, { 186 | // channel: promiseCh, // will use fixed(2) buffer by default 187 | // log: true, 188 | op: 'live', 189 | // only put on channel when node value has a num field 190 | condition: (val) => val.num 191 | }) 192 | 193 | node.timed({ 194 | maxNum, 195 | logging: true, 196 | cb: resolve 197 | }) 198 | 199 | let num = 0 200 | let condition = () => num < 5 201 | 202 | // Please help improved this!!! 203 | csp.go(function* () { 204 | while (condition()) { 205 | const value = yield csp.take(promiseCh) 206 | console.log('value', value) 207 | } 208 | }) 209 | ``` 210 | 211 | ## mapReduce 212 | 213 | See full [mapReduce guide](https://github.com/kristianmandrup/gun-edge/Map-Reduce.md) 214 | 215 | ## Contributing 216 | 217 | ### Compile/Build 218 | 219 | The project includes a `gulpfile` configured to use Babel 6. 220 | All `/src` files are compiled to `/dist` including source maps. 221 | 222 | Scripts: 223 | 224 | - start: `npm start` 225 | - build: `npm run build` (ie. compile) 226 | - watch and start: `npm run watch` 227 | - watch and build: `npm run watch:b` 228 | 229 | ### Run Tests 230 | 231 | `npm test` or simply `ava test` 232 | 233 | ## Examples 234 | 235 | The `/examples` folder will at some point include some example projects, including a web page (with live reload) 236 | 237 | ## Sandbox 238 | 239 | For playing around... 240 | 241 | ## Docs 242 | 243 | Various ideas sketched out in `/docs` 244 | 245 | ## License 246 | 247 | MIT Kristian Mandrup -------------------------------------------------------------------------------- /docs/Goal.md: -------------------------------------------------------------------------------- 1 | ## Goal 2 | 3 | ```js 4 | edge.get('inout').put(amber); 5 | edge.get('outin').put(mark); 6 | amber.get('spouse').put(edge); 7 | mark.get('spouse').put(edge); 8 | 9 | // now that will let you traverse with the raw gun API any direction: 10 | 11 | gun.get('amber').get('spouse').get('outin').val(cb) // mark 12 | gun.get('mark').get('spouse').get('inout').val(cb) // amber. 13 | 14 | // The goal of a gun extension is to make this 15 | // process easier - rather than writing those 7 or 9 lines of code every time 16 | // for everything, you just call the extension and it does it 17 | // for you. 18 | // And the most important piece with the extension, 19 | // would be to intelligently determine that "mark.spouse" 20 | // means inout, and "amber.spouse" means outin. 21 | // I propose the methods are named like this: 22 | gun.get('mark').edge('spouse', amber) 23 | 24 | // where amber is a gun reference. 25 | gun.get('mark').edge('spouse', { 26 | married: 2014 27 | }) 28 | 29 | // where second parameter is a plain object, it updates the edge itself 30 | // (not what the edge is pointing to). 31 | gun.get('mark').edge('spouse') // winds up returning a reference to amber. 32 | gun.get('mark').edge('spouse', function () {}) // winds up getting called with the edge data itself. 33 | ``` -------------------------------------------------------------------------------- /docs/LevelGraph.md: -------------------------------------------------------------------------------- 1 | ## LevelGraph IO 2 | 3 | Add transformation to LevelGraph (likely in another plugin) 4 | 5 | The soul (ie. `node._.#`) could just be transformed to `@id` as expected by 6 | [Level-JSONLD](https://github.com/mcollina/levelgraph-jsonld) 7 | 8 | Gun Graph JSON 9 | 10 | ```js 11 | "_": { 12 | "#": "persons/mateo" 13 | // ... 14 | }, 15 | "name": "Matteo", 16 | "knows": [{ 17 | "_": { 18 | "#": "persons/daniele" 19 | }, 20 | "name": "Daniele" 21 | }, { 22 | "_": { 23 | "#": "persons/lucio" 24 | }, 25 | "name": "Lucio" 26 | }] 27 | ``` 28 | 29 | Level-JSONLD format 30 | 31 | ```js 32 | var nested = { 33 | "@context": { 34 | "name": "http://xmlns.com/foaf/0.1/name", 35 | "knows": "http://xmlns.com/foaf/0.1/knows" 36 | }, 37 | "@id": "persons/mateo", 38 | "name": "Matteo", 39 | "knows": [{ 40 | "@id": "persons/daniele", 41 | "name": "Daniele" 42 | }, { 43 | "@id": "persons/lucio", 44 | "name": "Lucio" 45 | }] 46 | }; 47 | 48 | // store it in Level DB :) 49 | 50 | db.jsonld.put(nested, function(err, obj) { 51 | // do something... 52 | }); 53 | 54 | 55 | // Do advanced triplet search!! 56 | // ... 57 | ``` 58 | 59 | There is also a [gun-level](https://github.com/PsychoLlama/gun-level) and even [level.js](https://github.com/maxogden/level.js) 60 | 61 | [Level storage-back-ends](https://github.com/Level/levelup/wiki/Modules#storage-back-ends) 62 | -------------------------------------------------------------------------------- /docs/link.md: -------------------------------------------------------------------------------- 1 | ## Link DSL 2 | 3 | ```js 4 | // We could also have the "Join node" instead have meaningful back references (edges) 5 | // - bride 6 | // - groom 7 | // But then how could we navigate? Then we would have to traverse all paths 8 | // pointing to objects that are not back to self and return first one! 9 | 10 | // create marriage link node 11 | marriage.get('bride').put(amber); 12 | marriage.get('groom').put(mark); 13 | 14 | // details on marriage 15 | amber.get('marriage').put(marriage); 16 | mark.get('marriage').put(marriage); 17 | 18 | // direct links 19 | amber.get('spouse').put(mark) 20 | mark.get('spouse').put(amber) 21 | 22 | // Much more meaningful! 23 | 24 | // TODO... 25 | 26 | gun.get('mark').link('married', marriage, {bride: amber}) 27 | gun.get('amber').link('married', marriage, {groom: mark}) 28 | 29 | // The full monty! 30 | gun.link(['mark', 'amber'], { 31 | married: { 32 | // link node to be used/created 33 | in: { year: 2014 }, // alternative using: node 34 | with: { 35 | // back references from link node 36 | bride: 'amber', 37 | groom: 'mark' 38 | } 39 | } 40 | }) 41 | 42 | let marriage = gun.put({ 43 | married: 2014 44 | }) 45 | 46 | // or [mark, amber] 47 | let sources = ['mark', 'amber'] 48 | 49 | gun.link(sources, { 50 | married: { 51 | // link node to be used/created 52 | using: marriage, 53 | with: { 54 | // back references from link node 55 | bride: 'amber', // or bride: amber 56 | groom: 'mark' // or bride: mark 57 | } 58 | } 59 | }) 60 | ``` 61 | -------------------------------------------------------------------------------- /docs/traversal.md: -------------------------------------------------------------------------------- 1 | ## Link traversal (out) 2 | 3 | `Mark` and `Amber` were `married in 2014` 4 | 5 | Here we explore first: 6 | - how we can model the graph 7 | - how we can traverse the relationship efficiently 8 | 9 | ```js 10 | import Gun from 'gun/gun' 11 | import 'gun-edge' 12 | 13 | // Create a new gun instance 14 | var gun = Gun(); 15 | 16 | var amber = gun.get('amber').put({ 17 | name: "amber" 18 | }); 19 | var mark = gun.get('mark').put({ 20 | name: "mark" 21 | }); 22 | var link = gun.put({ 23 | married: 2014 24 | }); 25 | 26 | link.get('inout').put(amber); 27 | link.get('outin').put(mark); 28 | amber.get('spouse').put(link); 29 | mark.get('spouse').put(link); 30 | 31 | // now that will let you traverse with the raw gun API any direction: 32 | 33 | await gun.get('amber').get('spouse').get('outin').valAsync() // mark 34 | gun.get('mark').get('spouse').get('inout').valAsync() // amber. 35 | 36 | // Added val and value methods to work with async/await and ES6 Promise 37 | 38 | // WORKS 39 | let amberAwait = await gun.get('mark').get('spouse').get('inout').valueAsync() 40 | gun.get('mark').get('spouse').get('inout').valueAsync() 41 | .then(node => { 42 | t.is(amberAwait, node) 43 | }) 44 | 45 | // WORKS 46 | test('out', async t => { 47 | let amberLong = await gun.get('mark').get('spouse').get('inout').valueAsync() 48 | // shorthand 49 | let amberShort = await gun.get('mark').out({spouse: 'inout'}) 50 | // same result :) 51 | t.is(amberLong, amberShort) 52 | }) 53 | ``` -------------------------------------------------------------------------------- /edge/all.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.addValue = exports.addSet = exports.addRecurse = exports.addPut = exports.addNo = exports.addMapReduce = exports.addLocal = exports.addTimed = exports.addLive = exports.addPrint = exports.addFields = exports.addEach = exports.addDate = exports.addCsp = exports.addObservable = exports.addPromise = undefined; 7 | exports.add = add; 8 | 9 | exports.default = function (Gun) { 10 | return add.apply(undefined, [Gun].concat(allNames)); 11 | }; 12 | 13 | var _promise = require('./promise'); 14 | 15 | var _promise2 = _interopRequireDefault(_promise); 16 | 17 | var _observable = require('./observable'); 18 | 19 | var _observable2 = _interopRequireDefault(_observable); 20 | 21 | var _csp = require('./channel/csp'); 22 | 23 | var _count = require('./count'); 24 | 25 | var _date = require('./date'); 26 | 27 | var _each = require('./each'); 28 | 29 | var _fields = require('./fields'); 30 | 31 | var _print = require('./print'); 32 | 33 | var _live = require('./live'); 34 | 35 | var _timed = require('./timed'); 36 | 37 | var _local = require('./local'); 38 | 39 | var _mapReduce = require('./map-reduce'); 40 | 41 | var _no = require('./no'); 42 | 43 | var _recurse = require('./recurse'); 44 | 45 | var _put = require('./put'); 46 | 47 | var _set = require('./set'); 48 | 49 | var _soul = require('./soul'); 50 | 51 | var _value = require('./value'); 52 | 53 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 54 | 55 | // import { addEdge } from './edge' 56 | 57 | var chains = { 58 | addPromise: _promise2.default, 59 | addObservable: _observable2.default, 60 | addCsp: _csp.addCsp, 61 | addCount: _count.addCount, 62 | addDate: _date.addDate, 63 | addEach: _each.addEach, 64 | addFields: _fields.addFields, 65 | addPrint: _print.addPrint, 66 | addLive: _live.addLive, 67 | addTimed: _timed.addTimed, 68 | addLocal: _local.addLocal, 69 | addMapReduce: _mapReduce.addMapReduce, 70 | addNo: _no.addNo, 71 | addPut: _put.addPut, 72 | addRecurse: _recurse.addRecurse, 73 | addSet: _set.addSet, 74 | addSoul: _soul.addSoul, 75 | addValue: _value.addValue 76 | }; 77 | // import { 78 | // addOut 79 | // } from './out' 80 | 81 | // import { 82 | // addFilter 83 | // } from './filter' 84 | 85 | 86 | function capitalize(str) { 87 | return str.charAt(0).toUpperCase() + str.slice(1); 88 | } 89 | 90 | function add(Gun) { 91 | for (var _len = arguments.length, names = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 92 | names[_key - 1] = arguments[_key]; 93 | } 94 | 95 | names.forEach(function (name) { 96 | var nameCap = capitalize(name); 97 | var fun = 'add' + nameCap; 98 | chains[fun]({ 99 | chain: Gun.chain, 100 | Gun: Gun 101 | }); 102 | }); 103 | return Gun; 104 | } 105 | 106 | var allNames = ['promise', 'observable', 'csp', 'date', 'each', 'fields', 107 | // 'filter', 108 | 'print', 'live', 'timed', 'local', 'mapReduce', 'no', 109 | // 'out', 110 | 'put', 'recurse', 'set', 'soul', 'value']; 111 | 112 | exports.addPromise = _promise2.default; 113 | exports.addObservable = _observable2.default; 114 | exports.addCsp = _csp.addCsp; 115 | exports.addDate = _date.addDate; 116 | exports.addEach = _each.addEach; 117 | exports.addFields = _fields.addFields; 118 | exports.addPrint = _print.addPrint; 119 | exports.addLive = _live.addLive; 120 | exports.addTimed = _timed.addTimed; 121 | exports.addLocal = _local.addLocal; 122 | exports.addMapReduce = _mapReduce.addMapReduce; 123 | exports.addNo = _no.addNo; 124 | exports.addPut = _put.addPut; 125 | exports.addRecurse = _recurse.addRecurse; 126 | exports.addSet = _set.addSet; 127 | exports.addValue = _value.addValue; 128 | //# sourceMappingURL=all.js.map 129 | -------------------------------------------------------------------------------- /edge/all.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["all.js"],"names":["add","Gun","allNames","chains","addPromise","addObservable","addCsp","addCount","addDate","addEach","addFields","addPrint","addLive","addTimed","addLocal","addMapReduce","addNo","addPut","addRecurse","addSet","addSoul","addValue","capitalize","str","charAt","toUpperCase","slice","names","forEach","nameCap","name","fun","chain"],"mappings":";;;;;;QAoFgBA,G,GAAAA,G;;kBAuDD,UAAUC,GAAV,EAAe;AAC5B,SAAOD,sBAAIC,GAAJ,SAAYC,QAAZ,EAAP;AACD,C;;AA7ID;;;;AACA;;;;AACA;;AAGA;;AAGA;;AAGA;;AAKA;;AAMA;;AAGA;;AAGA;;AAGA;;AAGA;;AAGA;;AAMA;;AAGA;;AAGA;;AAGA;;AAGA;;;;AAzCA;;AA6CA,IAAMC,SAAS;AACbC,+BADa;AAEbC,qCAFa;AAGbC,qBAHa;AAIbC,2BAJa;AAKbC,wBALa;AAMbC,wBANa;AAObC,8BAPa;AAQbC,2BARa;AASbC,wBATa;AAUbC,2BAVa;AAWbC,2BAXa;AAYbC,uCAZa;AAabC,kBAba;AAcbC,qBAda;AAebC,iCAfa;AAgBbC,qBAhBa;AAiBbC,wBAjBa;AAkBbC;AAlBa,CAAf;AAnBA;AACA;AACA;;AAvBA;AACA;AACA;;;AA2DA,SAASC,UAAT,CAAoBC,GAApB,EAAyB;AACvB,SAAOA,IAAIC,MAAJ,CAAW,CAAX,EAAcC,WAAd,KAA8BF,IAAIG,KAAJ,CAAU,CAAV,CAArC;AACD;;AAEM,SAAS1B,GAAT,CAAaC,GAAb,EAA4B;AAAA,oCAAP0B,KAAO;AAAPA,SAAO;AAAA;;AACjCA,QAAMC,OAAN,CAAc,gBAAQ;AACpB,QAAIC,UAAUP,WAAWQ,IAAX,CAAd;AACA,QAAIC,MAAM,QAAQF,OAAlB;AACA1B,WAAO4B,GAAP,EAAY;AACVC,aAAO/B,IAAI+B,KADD;AAEV/B;AAFU,KAAZ;AAID,GAPD;AAQA,SAAOA,GAAP;AACD;;AAED,IAAMC,WAAW,CACf,SADe,EAEf,YAFe,EAGf,KAHe,EAIf,MAJe,EAKf,MALe,EAMf,QANe;AAOf;AACA,OARe,EASf,MATe,EAUf,OAVe,EAWf,OAXe,EAYf,WAZe,EAaf,IAbe;AAcf;AACA,KAfe,EAgBf,SAhBe,EAiBf,KAjBe,EAkBf,MAlBe,EAmBf,OAnBe,CAAjB;;QAuBEE,U;QACAC,a;QACAC,M;QACAE,O;QACAC,O;QACAC,S;QAEAC,Q;QACAC,O;QACAC,Q;QACAC,Q;QACAC,Y;QACAC,K;QAEAC,M;QACAC,U;QACAC,M;QACAE,Q","file":"all.js","sourcesContent":["import addPromise from './promise'\nimport addObservable from './observable'\nimport {\n addCsp\n} from './channel/csp'\nimport {\n addCount\n} from './count'\nimport {\n addDate\n} from './date'\nimport {\n addEach\n} from './each'\n// import { addEdge } from './edge'\n\nimport {\n addFields\n} from './fields'\n// import {\n// addFilter\n// } from './filter'\nimport {\n addPrint\n} from './print'\nimport {\n addLive\n} from './live'\nimport {\n addTimed\n} from './timed'\nimport {\n addLocal\n} from './local'\nimport {\n addMapReduce\n} from './map-reduce'\nimport {\n addNo\n} from './no'\n// import {\n// addOut\n// } from './out'\nimport {\n addRecurse\n} from './recurse'\nimport {\n addPut\n} from './put'\nimport {\n addSet\n} from './set'\nimport {\n addSoul\n} from './soul'\nimport {\n addValue\n} from './value'\n\nconst chains = {\n addPromise,\n addObservable,\n addCsp,\n addCount,\n addDate,\n addEach,\n addFields,\n addPrint,\n addLive,\n addTimed,\n addLocal,\n addMapReduce,\n addNo,\n addPut,\n addRecurse,\n addSet,\n addSoul,\n addValue\n}\n\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function add(Gun, ...names) {\n names.forEach(name => {\n let nameCap = capitalize(name)\n let fun = 'add' + nameCap\n chains[fun]({\n chain: Gun.chain,\n Gun\n })\n })\n return Gun\n}\n\nconst allNames = [\n 'promise',\n 'observable',\n 'csp',\n 'date',\n 'each',\n 'fields',\n // 'filter',\n 'print',\n 'live',\n 'timed',\n 'local',\n 'mapReduce',\n 'no',\n // 'out',\n 'put',\n 'recurse',\n 'set',\n 'soul',\n 'value'\n]\n\nexport {\n addPromise,\n addObservable,\n addCsp,\n addDate,\n addEach,\n addFields,\n // addFilter,\n addPrint,\n addLive,\n addTimed,\n addLocal,\n addMapReduce,\n addNo,\n // addOut,\n addPut,\n addRecurse,\n addSet,\n addValue\n}\n\nexport default function (Gun) {\n return add(Gun, ...allNames)\n}"]} -------------------------------------------------------------------------------- /edge/async/fields.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$fields = $fields; 7 | exports.$addFields = $addFields; 8 | 9 | var _value = require('../value'); 10 | 11 | function $fields(node) { 12 | return new Promise(function (resolve, reject) { 13 | node.value(function (v) { 14 | return resolve(Object.keys(v)); 15 | }); 16 | }); 17 | } 18 | 19 | function $addFields(_ref) { 20 | var chain = _ref.chain; 21 | 22 | (0, _value.addValue)({ 23 | chain: chain 24 | }); 25 | 26 | chain.$fields = function (cb, opt) { 27 | return $fields(this, cb, opt); 28 | }; 29 | return chain; 30 | } 31 | //# sourceMappingURL=fields.js.map 32 | -------------------------------------------------------------------------------- /edge/async/fields.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["async/fields.js"],"names":["$fields","$addFields","node","Promise","resolve","reject","value","Object","keys","v","chain","cb","opt"],"mappings":";;;;;QAAgBA,O,GAAAA,O;QAUAC,U,GAAAA,U;;AAJhB;;AANO,SAASD,OAAT,CAAiBE,IAAjB,EAAuB;AAC5B,SAAO,IAAIC,OAAJ,CAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CH,SAAKI,KAAL,CAAW;AAAA,aAAKF,QAAQG,OAAOC,IAAP,CAAYC,CAAZ,CAAR,CAAL;AAAA,KAAX;AACD,GAFM,CAAP;AAGD;;AAMM,SAASR,UAAT,OAEJ;AAAA,MADDS,KACC,QADDA,KACC;;AACD,uBAAS;AACPA;AADO,GAAT;;AAIAA,QAAMV,OAAN,GAAgB,UAAUW,EAAV,EAAcC,GAAd,EAAmB;AACjC,WAAOZ,QAAQ,IAAR,EAAcW,EAAd,EAAkBC,GAAlB,CAAP;AACD,GAFD;AAGA,SAAOF,KAAP;AACD","file":"fields.js","sourcesContent":["export function $fields(node) {\n return new Promise(function (resolve, reject) {\n node.value(v => resolve(Object.keys(v)))\n });\n}\n\nimport {\n addValue\n} from '../value'\n\nexport function $addFields({\n chain,\n}) {\n addValue({\n chain\n })\n\n chain.$fields = function (cb, opt) {\n return $fields(this, cb, opt)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/async/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.add = add; 7 | exports.$addAll = $addAll; 8 | 9 | var _fields = require('./fields'); 10 | 11 | var _mapReduce = require('./map-reduce'); 12 | 13 | var _val = require('./val'); 14 | 15 | var _value = require('./value'); 16 | 17 | var _timed = require('./timed'); 18 | 19 | var _no = require('./no'); 20 | 21 | var _recurse = require('./recurse'); 22 | 23 | var chains = { 24 | $addFields: _fields.$addFields, 25 | $addMapReduce: _mapReduce.$addMapReduce, 26 | $addNo: _no.$addNo, 27 | $addRecurse: _recurse.$addRecurse, 28 | $addVal: _val.$addVal, 29 | $addValue: _value.$addValue, 30 | $addTimed: _timed.$addTimed 31 | }; 32 | 33 | function capitalize(str) { 34 | return str.charAt(0).toUpperCase() + str.slice(1); 35 | } 36 | 37 | function add(Gun) { 38 | for (var _len = arguments.length, names = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 39 | names[_key - 1] = arguments[_key]; 40 | } 41 | 42 | names.forEach(function (name) { 43 | var nameCap = capitalize(name); 44 | var fun = '$add' + nameCap; 45 | chains[fun]({ 46 | chain: Gun.chain, 47 | Gun: Gun 48 | }); 49 | }); 50 | } 51 | 52 | var allNames = ['fields', 'mapReduce', 'val', 'value', 'timed', 'no', 'recurse']; 53 | 54 | function $addAll(_ref) { 55 | var Gun = _ref.Gun; 56 | 57 | add.apply(undefined, [Gun].concat(allNames)); 58 | } 59 | 60 | exports.default = $addAll; 61 | //# sourceMappingURL=index.js.map 62 | -------------------------------------------------------------------------------- /edge/async/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["async/index.js"],"names":["add","$addAll","chains","$addFields","$addMapReduce","$addNo","$addRecurse","$addVal","$addValue","$addTimed","capitalize","str","charAt","toUpperCase","slice","Gun","names","forEach","nameCap","name","fun","chain","allNames"],"mappings":";;;;;QAoCgBA,G,GAAAA,G;QAqBAC,O,GAAAA,O;;AAzDhB;;AAGA;;AAGA;;AAGA;;AAGA;;AAGA;;AAGA;;AAIA,IAAMC,SAAS;AACbC,gCADa;AAEbC,yCAFa;AAGbC,oBAHa;AAIbC,mCAJa;AAKbC,uBALa;AAMbC,6BANa;AAObC;AAPa,CAAf;;AAUA,SAASC,UAAT,CAAoBC,GAApB,EAAyB;AACvB,SAAOA,IAAIC,MAAJ,CAAW,CAAX,EAAcC,WAAd,KAA8BF,IAAIG,KAAJ,CAAU,CAAV,CAArC;AACD;;AAEM,SAASd,GAAT,CAAae,GAAb,EAA4B;AAAA,oCAAPC,KAAO;AAAPA,SAAO;AAAA;;AACjCA,QAAMC,OAAN,CAAc,gBAAQ;AACpB,QAAIC,UAAUR,WAAWS,IAAX,CAAd;AACA,QAAIC,MAAM,SAASF,OAAnB;AACAhB,WAAOkB,GAAP,EAAY;AACVC,aAAON,IAAIM,KADD;AAEVN;AAFU,KAAZ;AAID,GAPD;AAQD;;AAED,IAAMO,WAAW,CACf,QADe,EAEf,WAFe,EAGf,KAHe,EAIf,OAJe,EAKf,OALe,EAMf,IANe,EAOf,SAPe,CAAjB;;AAUO,SAASrB,OAAT,OAEJ;AAAA,MADDc,GACC,QADDA,GACC;;AACDf,wBAAIe,GAAJ,SAAYO,QAAZ;AACD;;kBAEcrB,O","file":"index.js","sourcesContent":["import {\n $addFields\n} from './fields'\nimport {\n $addMapReduce\n} from './map-reduce'\nimport {\n $addVal\n} from './val'\nimport {\n $addValue\n} from './value'\nimport {\n $addTimed\n} from './timed'\nimport {\n $addNo\n} from './no'\nimport {\n $addRecurse\n} from './recurse'\n\nconst chains = {\n $addFields,\n $addMapReduce,\n $addNo,\n $addRecurse,\n $addVal,\n $addValue,\n $addTimed\n}\n\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function add(Gun, ...names) {\n names.forEach(name => {\n let nameCap = capitalize(name)\n let fun = '$add' + nameCap\n chains[fun]({\n chain: Gun.chain,\n Gun\n })\n })\n}\n\nconst allNames = [\n 'fields',\n 'mapReduce',\n 'val',\n 'value',\n 'timed',\n 'no',\n 'recurse'\n]\n\nexport function $addAll({\n Gun\n}) {\n add(Gun, ...allNames)\n}\n\nexport default $addAll"]} -------------------------------------------------------------------------------- /edge/async/map-reduce.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$mapReduce = $mapReduce; 7 | exports.$addMapReduce = $addMapReduce; 8 | 9 | var _mapReduce = require('../map-reduce'); 10 | 11 | function $mapReduce(node, options, putCb, opt) { 12 | return new Promise(function (resolve, reject) { 13 | node.mapReduce(options, resolve, putCb, opt); 14 | }); 15 | } 16 | 17 | function $addMapReduce(_ref) { 18 | var chain = _ref.chain; 19 | 20 | (0, _mapReduce.addMapReduce)({ 21 | chain: chain 22 | }); 23 | 24 | chain.$mapReduce = async function (options, putCb, opt) { 25 | return await $mapReduce(this, options, putCb, opt); 26 | }; 27 | return chain; 28 | } 29 | //# sourceMappingURL=map-reduce.js.map 30 | -------------------------------------------------------------------------------- /edge/async/map-reduce.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["async/map-reduce.js"],"names":["$mapReduce","$addMapReduce","node","options","putCb","opt","Promise","resolve","reject","mapReduce","chain"],"mappings":";;;;;QAIgBA,U,GAAAA,U;QAMAC,a,GAAAA,a;;AAVhB;;AAIO,SAASD,UAAT,CAAoBE,IAApB,EAA0BC,OAA1B,EAAmCC,KAAnC,EAA0CC,GAA1C,EAA+C;AACpD,SAAO,IAAIC,OAAJ,CAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CN,SAAKO,SAAL,CAAeN,OAAf,EAAwBI,OAAxB,EAAiCH,KAAjC,EAAwCC,GAAxC;AACD,GAFM,CAAP;AAGD;;AAEM,SAASJ,aAAT,OAEJ;AAAA,MADDS,KACC,QADDA,KACC;;AACD,+BAAa;AACXA;AADW,GAAb;;AAIAA,QAAMV,UAAN,GAAmB,gBAAgBG,OAAhB,EAAyBC,KAAzB,EAAgCC,GAAhC,EAAqC;AACtD,WAAO,MAAML,WAAW,IAAX,EAAiBG,OAAjB,EAA0BC,KAA1B,EAAiCC,GAAjC,CAAb;AACD,GAFD;AAGA,SAAOK,KAAP;AACD","file":"map-reduce.js","sourcesContent":["import {\n addMapReduce\n} from '../map-reduce'\n\nexport function $mapReduce(node, options, putCb, opt) {\n return new Promise(function (resolve, reject) {\n node.mapReduce(options, resolve, putCb, opt)\n })\n}\n\nexport function $addMapReduce({\n chain\n}) {\n addMapReduce({\n chain\n })\n\n chain.$mapReduce = async function (options, putCb, opt) {\n return await $mapReduce(this, options, putCb, opt)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/async/no.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$no = $no; 7 | exports.$addNo = $addNo; 8 | function $no(node) { 9 | return new Promise(function (resolve, reject) { 10 | node.no(resolve); 11 | }); 12 | } 13 | 14 | function $addNo(_ref) { 15 | var chain = _ref.chain; 16 | 17 | chain.$no = async function () { 18 | return await $no(this); 19 | }; 20 | return chain; 21 | } 22 | //# sourceMappingURL=no.js.map 23 | -------------------------------------------------------------------------------- /edge/async/no.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["async/no.js"],"names":["$no","$addNo","node","Promise","resolve","reject","no","chain"],"mappings":";;;;;QAAgBA,G,GAAAA,G;QAMAC,M,GAAAA,M;AANT,SAASD,GAAT,CAAaE,IAAb,EAAmB;AACxB,SAAO,IAAIC,OAAJ,CAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CH,SAAKI,EAAL,CAAQF,OAAR;AACD,GAFM,CAAP;AAGD;;AAEM,SAASH,MAAT,OAEJ;AAAA,MADDM,KACC,QADDA,KACC;;AACDA,QAAMP,GAAN,GAAY,kBAAkB;AAC5B,WAAO,MAAMA,IAAI,IAAJ,CAAb;AACD,GAFD;AAGA,SAAOO,KAAP;AACD","file":"no.js","sourcesContent":["export function $no(node) {\n return new Promise(function (resolve, reject) {\n node.no(resolve)\n })\n}\n\nexport function $addNo({\n chain\n}) {\n chain.$no = async function () {\n return await $no(this)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/async/recurse.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$recurse = $recurse; 7 | exports.$addRecurse = $addRecurse; 8 | function $recurse(node, filter) { 9 | return new Promise(function (resolve, reject) { 10 | node.recurse(resolve, filter); 11 | }); 12 | } 13 | 14 | function $addRecurse(_ref) { 15 | var chain = _ref.chain; 16 | 17 | chain.$recurse = async function (filter) { 18 | return await $recurse(this, filter); 19 | }; 20 | return chain; 21 | } 22 | //# sourceMappingURL=recurse.js.map 23 | -------------------------------------------------------------------------------- /edge/async/recurse.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["async/recurse.js"],"names":["$recurse","$addRecurse","node","filter","Promise","resolve","reject","recurse","chain"],"mappings":";;;;;QAAgBA,Q,GAAAA,Q;QAMAC,W,GAAAA,W;AANT,SAASD,QAAT,CAAkBE,IAAlB,EAAwBC,MAAxB,EAAgC;AACrC,SAAO,IAAIC,OAAJ,CAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CJ,SAAKK,OAAL,CAAaF,OAAb,EAAsBF,MAAtB;AACD,GAFM,CAAP;AAGD;;AAEM,SAASF,WAAT,OAEJ;AAAA,MADDO,KACC,QADDA,KACC;;AACDA,QAAMR,QAAN,GAAiB,gBAAgBG,MAAhB,EAAwB;AACvC,WAAO,MAAMH,SAAS,IAAT,EAAeG,MAAf,CAAb;AACD,GAFD;AAGA,SAAOK,KAAP;AACD","file":"recurse.js","sourcesContent":["export function $recurse(node, filter) {\n return new Promise(function (resolve, reject) {\n node.recurse(resolve, filter)\n })\n}\n\nexport function $addRecurse({\n chain\n}) {\n chain.$recurse = async function (filter) {\n return await $recurse(this, filter)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/async/timed.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$timed = $timed; 7 | exports.$addTimed = $addTimed; 8 | 9 | var _timed = require('../timed'); 10 | 11 | function $timed(node, opts) { 12 | return new Promise(function (resolve, reject) { 13 | opts = Object.assign(opts, { 14 | cb: resolve 15 | }); 16 | (0, _timed.timed)(node, opts); 17 | }); 18 | } 19 | 20 | function $addTimed(_ref) { 21 | var chain = _ref.chain; 22 | 23 | chain.$timed = async function (opts) { 24 | return await $timed(this, opts); 25 | }; 26 | return chain; 27 | } 28 | //# sourceMappingURL=timed.js.map 29 | -------------------------------------------------------------------------------- /edge/async/timed.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["async/timed.js"],"names":["$timed","$addTimed","node","opts","Promise","resolve","reject","Object","assign","cb","chain"],"mappings":";;;;;QAIgBA,M,GAAAA,M;QASAC,S,GAAAA,S;;AAbhB;;AAIO,SAASD,MAAT,CAAgBE,IAAhB,EAAsBC,IAAtB,EAA4B;AACjC,SAAO,IAAIC,OAAJ,CAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CH,WAAOI,OAAOC,MAAP,CAAcL,IAAd,EAAoB;AACzBM,UAAIJ;AADqB,KAApB,CAAP;AAGA,sBAAMH,IAAN,EAAYC,IAAZ;AACD,GALM,CAAP;AAMD;;AAEM,SAASF,SAAT,OAEJ;AAAA,MADDS,KACC,QADDA,KACC;;AACDA,QAAMV,MAAN,GAAe,gBAAgBG,IAAhB,EAAsB;AACnC,WAAO,MAAMH,OAAO,IAAP,EAAaG,IAAb,CAAb;AACD,GAFD;AAGA,SAAOO,KAAP;AACD","file":"timed.js","sourcesContent":["import {\n timed\n} from '../timed'\n\nexport function $timed(node, opts) {\n return new Promise(function (resolve, reject) {\n opts = Object.assign(opts, {\n cb: resolve\n })\n timed(node, opts)\n })\n}\n\nexport function $addTimed({\n chain\n}) {\n chain.$timed = async function (opts) {\n return await $timed(this, opts)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/async/val.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$val = $val; 7 | exports.$addVal = $addVal; 8 | function $val(node, opt) { 9 | return new Promise(function (resolve, reject) { 10 | node.val(resolve, opt); 11 | }); 12 | } 13 | 14 | function $addVal(_ref) { 15 | var chain = _ref.chain; 16 | 17 | chain.$val = async function (opt) { 18 | return await $val(this, opt); 19 | }; 20 | 21 | return chain; 22 | } 23 | //# sourceMappingURL=val.js.map 24 | -------------------------------------------------------------------------------- /edge/async/val.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["async/val.js"],"names":["$val","$addVal","node","opt","Promise","resolve","reject","val","chain"],"mappings":";;;;;QAAgBA,I,GAAAA,I;QAMAC,O,GAAAA,O;AANT,SAASD,IAAT,CAAcE,IAAd,EAAoBC,GAApB,EAAyB;AAC9B,SAAO,IAAIC,OAAJ,CAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CJ,SAAKK,GAAL,CAASF,OAAT,EAAkBF,GAAlB;AACD,GAFM,CAAP;AAGD;;AAEM,SAASF,OAAT,OAEJ;AAAA,MADDO,KACC,QADDA,KACC;;AACDA,QAAMR,IAAN,GAAa,gBAAgBG,GAAhB,EAAqB;AAChC,WAAO,MAAMH,KAAK,IAAL,EAAWG,GAAX,CAAb;AACD,GAFD;;AAIA,SAAOK,KAAP;AACD","file":"val.js","sourcesContent":["export function $val(node, opt) {\n return new Promise(function (resolve, reject) {\n node.val(resolve, opt)\n })\n}\n\nexport function $addVal({\n chain\n}) {\n chain.$val = async function (opt) {\n return await $val(this, opt)\n }\n\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/async/value.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$value = $value; 7 | exports.$valueAt = $valueAt; 8 | exports.$addValue = $addValue; 9 | 10 | var _gun = require('gun/gun'); 11 | 12 | var _gun2 = _interopRequireDefault(_gun); 13 | 14 | var _value = require('../value'); 15 | 16 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 17 | 18 | async function $value(node, opt) { 19 | return new Promise(function (resolve, reject) { 20 | node.value(resolve, opt); 21 | }); 22 | } 23 | 24 | async function $valueAt(node, at, opt, Gun) { 25 | var path = node.path(at); 26 | if (path) { 27 | return path.$value(opt, Gun); 28 | } else { 29 | throw new Error('No such path ' + at); 30 | } 31 | } 32 | 33 | function $addValue(_ref) { 34 | var chain = _ref.chain; 35 | 36 | (0, _value.addValue)({ 37 | chain: chain 38 | }); 39 | 40 | chain.$value = async function (opt) { 41 | return await $value(this, opt); 42 | }; 43 | 44 | chain.$valueAt = async function (opt) { 45 | return await $valueAt(this, opt); 46 | }; 47 | 48 | return chain; 49 | } 50 | //# sourceMappingURL=value.js.map 51 | -------------------------------------------------------------------------------- /edge/async/value.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["async/value.js"],"names":["$value","$valueAt","$addValue","node","opt","Promise","resolve","reject","value","at","Gun","path","Error","chain"],"mappings":";;;;;QAEsBA,M,GAAAA,M;QAMAC,Q,GAAAA,Q;QAaNC,S,GAAAA,S;;AArBhB;;;;AAiBA;;;;AAfO,eAAeF,MAAf,CAAsBG,IAAtB,EAA4BC,GAA5B,EAAiC;AACtC,SAAO,IAAIC,OAAJ,CAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CJ,SAAKK,KAAL,CAAWF,OAAX,EAAoBF,GAApB;AACD,GAFM,CAAP;AAGD;;AAEM,eAAeH,QAAf,CAAwBE,IAAxB,EAA8BM,EAA9B,EAAkCL,GAAlC,EAAuCM,GAAvC,EAA4C;AACjD,MAAIC,OAAOR,KAAKQ,IAAL,CAAUF,EAAV,CAAX;AACA,MAAIE,IAAJ,EAAU;AACR,WAAOA,KAAKX,MAAL,CAAYI,GAAZ,EAAiBM,GAAjB,CAAP;AACD,GAFD,MAEO;AACL,UAAM,IAAIE,KAAJ,mBAA0BH,EAA1B,CAAN;AACD;AACF;;AAMM,SAASP,SAAT,OAEJ;AAAA,MADDW,KACC,QADDA,KACC;;AACD,uBAAS;AACPA;AADO,GAAT;;AAIAA,QAAMb,MAAN,GAAe,gBAAgBI,GAAhB,EAAqB;AAClC,WAAO,MAAMJ,OAAO,IAAP,EAAaI,GAAb,CAAb;AACD,GAFD;;AAIAS,QAAMZ,QAAN,GAAiB,gBAAgBG,GAAhB,EAAqB;AACpC,WAAO,MAAMH,SAAS,IAAT,EAAeG,GAAf,CAAb;AACD,GAFD;;AAIA,SAAOS,KAAP;AACD","file":"value.js","sourcesContent":["import Gun from 'gun/gun'\n\nexport async function $value(node, opt) {\n return new Promise(function (resolve, reject) {\n node.value(resolve, opt)\n })\n}\n\nexport async function $valueAt(node, at, opt, Gun) {\n let path = node.path(at)\n if (path) {\n return path.$value(opt, Gun)\n } else {\n throw new Error(`No such path ${at}`)\n }\n}\n\nimport {\n addValue\n} from '../value'\n\nexport function $addValue({\n chain\n}) {\n addValue({\n chain\n })\n\n chain.$value = async function (opt) {\n return await $value(this, opt)\n }\n\n chain.$valueAt = async function (opt) {\n return await $valueAt(this, opt)\n }\n\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/channel/csp.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _regenerator = require('babel-runtime/regenerator'); 8 | 9 | var _regenerator2 = _interopRequireDefault(_regenerator); 10 | 11 | exports.$csp = $csp; 12 | exports.addCsp = addCsp; 13 | 14 | var _gun = require('gun/gun'); 15 | 16 | var _gun2 = _interopRequireDefault(_gun); 17 | 18 | var _jsCsp = require('js-csp'); 19 | 20 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 21 | 22 | var csp = require('js-csp'); 23 | 24 | // See https://github.com/ubolonton/js-csp/blob/master/doc/basic.md 25 | 26 | // See https://github.com/staltz/xstream 27 | 28 | // import csp from 'js-csp' 29 | function $csp(node) { 30 | var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 31 | 32 | var id = void 0; 33 | 34 | var channel = opts.channel, 35 | buffer = opts.buffer, 36 | name = opts.name, 37 | condition = opts.condition, 38 | _opts$op = opts.op, 39 | op = _opts$op === undefined ? 'on' : _opts$op, 40 | _opts$putOp = opts.putOp, 41 | putOp = _opts$putOp === undefined ? 'put' : _opts$putOp; 42 | 43 | 44 | var bufferSize = 2; 45 | var bufferType = 'fixed'; 46 | 47 | if (buffer) { 48 | bufferSize = buffer.size || bufferSize; 49 | bufferType = buffer.type || bufferType; 50 | } 51 | 52 | buffer = buffer || csp.buffers[bufferType](bufferSize); 53 | 54 | var defaultChannel = function defaultChannel(buffer) { 55 | return csp.chan(buffer); 56 | }; 57 | 58 | channel = channel || defaultChannel(buffer); 59 | 60 | node.val(function (data) { 61 | id = _gun2.default.node.soul(data); 62 | name = name || id || 'unknown'; 63 | }); 64 | 65 | var log = function log() { 66 | if (opts.log) { 67 | var _console; 68 | 69 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 70 | args[_key] = arguments[_key]; 71 | } 72 | 73 | (_console = console).log.apply(_console, ['rx:', name].concat(args)); 74 | } 75 | }; 76 | 77 | var defaultPutCb = function defaultPutCb(event) { 78 | log('event was put on channel :)'); 79 | }; 80 | var putCb = opts.putCb || defaultPutCb; 81 | 82 | var defaultCondition = function defaultCondition() { 83 | return true; 84 | }; 85 | condition = condition || defaultCondition; 86 | 87 | var eventListener = function eventListener(event) { 88 | if (condition(event)) { 89 | log('Channel PUT', event); 90 | (0, _jsCsp.go)(_regenerator2.default.mark(function _callee() { 91 | return _regenerator2.default.wrap(function _callee$(_context) { 92 | while (1) { 93 | switch (_context.prev = _context.next) { 94 | case 0: 95 | _context.next = 2; 96 | return csp[putOp](channel, event, putCb); 97 | 98 | case 2: 99 | case 'end': 100 | return _context.stop(); 101 | } 102 | } 103 | }, _callee, this); 104 | })); 105 | } 106 | }; 107 | 108 | var lastValue = void 0; 109 | node[op](function (value) { 110 | if (value !== lastValue) { 111 | log(op, 'new', value); 112 | eventListener(value); 113 | } else { 114 | log('.'); 115 | } 116 | }); 117 | 118 | return channel; 119 | } 120 | 121 | function addCsp(_ref) { 122 | var chain = _ref.chain; 123 | 124 | chain.$csp = function (opts) { 125 | return $csp(this, opts); 126 | }; 127 | return chain; 128 | } 129 | //# sourceMappingURL=csp.js.map 130 | -------------------------------------------------------------------------------- /edge/channel/csp.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["channel/csp.js"],"names":["$csp","addCsp","csp","require","node","opts","id","channel","buffer","name","condition","op","putOp","bufferSize","bufferType","size","type","buffers","defaultChannel","chan","val","soul","data","log","args","defaultPutCb","event","putCb","defaultCondition","eventListener","lastValue","value","chain"],"mappings":";;;;;;;;;;QAagBA,I,GAAAA,I;QAqEAC,M,GAAAA,M;;AAlFhB;;;;AAEA;;;;AAMA,IAAMC,MAAMC,QAAQ,QAAR,CAAZ;;AAEA;;AAEA;;AAXA;AAYO,SAASH,IAAT,CAAcI,IAAd,EAA+B;AAAA,MAAXC,IAAW,uEAAJ,EAAI;;AACpC,MAAIC,WAAJ;;AADoC,MAMlCC,OANkC,GAYhCF,IAZgC,CAMlCE,OANkC;AAAA,MAOlCC,MAPkC,GAYhCH,IAZgC,CAOlCG,MAPkC;AAAA,MAQlCC,IARkC,GAYhCJ,IAZgC,CAQlCI,IARkC;AAAA,MASlCC,SATkC,GAYhCL,IAZgC,CASlCK,SATkC;AAAA,iBAYhCL,IAZgC,CAUlCM,EAVkC;AAAA,MAUlCA,EAVkC,4BAU7B,IAV6B;AAAA,oBAYhCN,IAZgC,CAWlCO,KAXkC;AAAA,MAWlCA,KAXkC,+BAW1B,KAX0B;;;AAcpC,MAAIC,aAAa,CAAjB;AACA,MAAIC,aAAa,OAAjB;;AAEA,MAAIN,MAAJ,EAAY;AACVK,iBAAaL,OAAOO,IAAP,IAAeF,UAA5B;AACAC,iBAAaN,OAAOQ,IAAP,IAAeF,UAA5B;AACD;;AAEDN,WAASA,UAAUN,IAAIe,OAAJ,CAAYH,UAAZ,EAAwBD,UAAxB,CAAnB;;AAEA,MAAIK,iBAAiB,SAAjBA,cAAiB,CAACV,MAAD;AAAA,WAAYN,IAAIiB,IAAJ,CAASX,MAAT,CAAZ;AAAA,GAArB;;AAEAD,YAAUA,WAAWW,eAAeV,MAAf,CAArB;;AAEAJ,OAAKgB,GAAL,CAAS,gBAAQ;AACfd,SAAK,cAAIF,IAAJ,CAASiB,IAAT,CAAcC,IAAd,CAAL;AACAb,WAAOA,QAAQH,EAAR,IAAc,SAArB;AACD,GAHD;;AAKA,MAAMiB,MAAM,SAANA,GAAM,GAAmB;AAC7B,QAAIlB,KAAKkB,GAAT,EAAc;AAAA;;AAAA,wCADSC,IACT;AADSA,YACT;AAAA;;AACZ,2BAAQD,GAAR,kBAAY,KAAZ,EAAmBd,IAAnB,SAA4Be,IAA5B;AACD;AACF,GAJD;;AAMA,MAAIC,eAAe,SAAfA,YAAe,CAACC,KAAD,EAAW;AAC5BH,QAAI,6BAAJ;AACD,GAFD;AAGA,MAAII,QAAQtB,KAAKsB,KAAL,IAAcF,YAA1B;;AAEA,MAAIG,mBAAmB,SAAnBA,gBAAmB;AAAA,WAAM,IAAN;AAAA,GAAvB;AACAlB,cAAYA,aAAakB,gBAAzB;;AAEA,MAAIC,gBAAgB,SAAhBA,aAAgB,CAAUH,KAAV,EAAiB;AACnC,QAAIhB,UAAUgB,KAAV,CAAJ,EAAsB;AACpBH,UAAI,aAAJ,EAAmBG,KAAnB;AACA,gDAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBACKxB,IAAIU,KAAJ,EAAWL,OAAX,EAAoBmB,KAApB,EAA2BC,KAA3B,CADL;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAH;AAGD;AACF,GAPD;;AASA,MAAIG,kBAAJ;AACA1B,OAAKO,EAAL,EAAS,UAACoB,KAAD,EAAW;AAClB,QAAIA,UAAUD,SAAd,EAAyB;AACvBP,UAAIZ,EAAJ,EAAQ,KAAR,EAAeoB,KAAf;AACAF,oBAAcE,KAAd;AACD,KAHD,MAGO;AACLR,UAAI,GAAJ;AACD;AACF,GAPD;;AASA,SAAOhB,OAAP;AACD;;AAEM,SAASN,MAAT,OAEJ;AAAA,MADD+B,KACC,QADDA,KACC;;AACDA,QAAMhC,IAAN,GAAa,UAAUK,IAAV,EAAgB;AAC3B,WAAOL,KAAK,IAAL,EAAWK,IAAX,CAAP;AACD,GAFD;AAGA,SAAO2B,KAAP;AACD","file":"csp.js","sourcesContent":["import Gun from 'gun/gun';\n// import csp from 'js-csp'\nimport {\n go\n // put,\n // putAsync\n} from 'js-csp'\n\nconst csp = require('js-csp')\n\n// See https://github.com/ubolonton/js-csp/blob/master/doc/basic.md\n\n// See https://github.com/staltz/xstream\nexport function $csp(node, opts = {}) {\n let id\n\n\n\n let {\n channel,\n buffer,\n name,\n condition,\n op = 'on',\n putOp = 'put'\n } = opts\n\n let bufferSize = 2\n let bufferType = 'fixed'\n\n if (buffer) {\n bufferSize = buffer.size || bufferSize\n bufferType = buffer.type || bufferType\n }\n\n buffer = buffer || csp.buffers[bufferType](bufferSize)\n\n let defaultChannel = (buffer) => csp.chan(buffer)\n\n channel = channel || defaultChannel(buffer)\n\n node.val(data => {\n id = Gun.node.soul(data)\n name = name || id || 'unknown'\n })\n\n const log = function (...args) {\n if (opts.log) {\n console.log('rx:', name, ...args)\n }\n }\n\n let defaultPutCb = (event) => {\n log('event was put on channel :)')\n }\n let putCb = opts.putCb || defaultPutCb\n\n let defaultCondition = () => true\n condition = condition || defaultCondition\n\n let eventListener = function (event) {\n if (condition(event)) {\n log('Channel PUT', event)\n go(function* () {\n yield csp[putOp](channel, event, putCb)\n })\n }\n }\n\n let lastValue\n node[op]((value) => {\n if (value !== lastValue) {\n log(op, 'new', value)\n eventListener(value)\n } else {\n log('.')\n }\n });\n\n return channel\n}\n\nexport function addCsp({\n chain\n}) {\n chain.$csp = function (opts) {\n return $csp(this, opts)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/count.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.count = count; 7 | exports.addCount = addCount; 8 | function count(node, num) { 9 | if (typeof num === 'number') { 10 | node.path(Gun.text.random()).put(num); 11 | } 12 | if (typeof num === 'function') { 13 | var sum = 0; 14 | node.map().val(function (val) { 15 | num(sum += val); 16 | }); 17 | } 18 | return node; 19 | } 20 | 21 | function addCount(_ref) { 22 | var chain = _ref.chain, 23 | Gun = _ref.Gun; 24 | 25 | chain.count = function (num) { 26 | return count(this, num); 27 | }; 28 | return chain; 29 | } 30 | //# sourceMappingURL=count.js.map 31 | -------------------------------------------------------------------------------- /edge/count.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["count.js"],"names":["count","addCount","node","num","path","Gun","text","random","put","sum","map","val","chain"],"mappings":";;;;;QAAgBA,K,GAAAA,K;QAaAC,Q,GAAAA,Q;AAbT,SAASD,KAAT,CAAeE,IAAf,EAAqBC,GAArB,EAA0B;AAC/B,MAAI,OAAOA,GAAP,KAAe,QAAnB,EAA6B;AAC3BD,SAAKE,IAAL,CAAUC,IAAIC,IAAJ,CAASC,MAAT,EAAV,EAA6BC,GAA7B,CAAiCL,GAAjC;AACD;AACD,MAAI,OAAOA,GAAP,KAAe,UAAnB,EAA+B;AAC7B,QAAIM,MAAM,CAAV;AACAP,SAAKQ,GAAL,GAAWC,GAAX,CAAe,UAAUA,GAAV,EAAe;AAC5BR,UAAIM,OAAOE,GAAX;AACD,KAFD;AAGD;AACD,SAAOT,IAAP;AACD;;AAEM,SAASD,QAAT,OAGJ;AAAA,MAFDW,KAEC,QAFDA,KAEC;AAAA,MADDP,GACC,QADDA,GACC;;AACDO,QAAMZ,KAAN,GAAc,UAAUG,GAAV,EAAe;AAC3B,WAAOH,MAAM,IAAN,EAAYG,GAAZ,CAAP;AACD,GAFD;AAGA,SAAOS,KAAP;AACD","file":"count.js","sourcesContent":["export function count(node, num) {\n if (typeof num === 'number') {\n node.path(Gun.text.random()).put(num);\n }\n if (typeof num === 'function') {\n var sum = 0;\n node.map().val(function (val) {\n num(sum += val);\n });\n }\n return node;\n}\n\nexport function addCount({\n chain,\n Gun\n}) {\n chain.count = function (num) {\n return count(this, num)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/date.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.date = date; 7 | exports.addDate = addDate; 8 | 9 | var _gun = require('gun/gun'); 10 | 11 | var _gun2 = _interopRequireDefault(_gun); 12 | 13 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 14 | 15 | function date(node, data) { 16 | if (_gun2.default.fns.is(data)) { 17 | return node.val(function (val) { 18 | data.call(this, new Date(val)); 19 | }); 20 | } 21 | return node.put(data.getTime()); 22 | } 23 | 24 | function addDate(_ref) { 25 | var chain = _ref.chain; 26 | 27 | chain.date = function (data) { 28 | return date(node, data); 29 | }; 30 | 31 | return chain; 32 | } 33 | //# sourceMappingURL=date.js.map 34 | -------------------------------------------------------------------------------- /edge/date.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["date.js"],"names":["date","addDate","node","data","fns","is","val","call","Date","put","getTime","chain"],"mappings":";;;;;QAEgBA,I,GAAAA,I;QASAC,O,GAAAA,O;;AAXhB;;;;;;AAEO,SAASD,IAAT,CAAcE,IAAd,EAAoBC,IAApB,EAA0B;AAC/B,MAAI,cAAIC,GAAJ,CAAQC,EAAR,CAAWF,IAAX,CAAJ,EAAsB;AACpB,WAAOD,KAAKI,GAAL,CAAS,UAAUA,GAAV,EAAe;AAC7BH,WAAKI,IAAL,CAAU,IAAV,EAAgB,IAAIC,IAAJ,CAASF,GAAT,CAAhB;AACD,KAFM,CAAP;AAGD;AACD,SAAOJ,KAAKO,GAAL,CAASN,KAAKO,OAAL,EAAT,CAAP;AACD;;AAEM,SAAST,OAAT,OAEJ;AAAA,MADDU,KACC,QADDA,KACC;;AACDA,QAAMX,IAAN,GAAa,UAAUG,IAAV,EAAgB;AAC3B,WAAOH,KAAKE,IAAL,EAAWC,IAAX,CAAP;AACD,GAFD;;AAIA,SAAOQ,KAAP;AACD","file":"date.js","sourcesContent":["import Gun from 'gun/gun'\n\nexport function date(node, data) {\n if (Gun.fns.is(data)) {\n return node.val(function (val) {\n data.call(this, new Date(val));\n })\n }\n return node.put(data.getTime());\n}\n\nexport function addDate({\n chain\n}) {\n chain.date = function (data) {\n return date(node, data)\n }\n\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/each.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.each = each; 7 | exports.addEach = addEach; 8 | function each(node) { 9 | var each = node.map(); 10 | return node.val.apply(each, arguments); 11 | } 12 | 13 | function addEach(_ref) { 14 | var chain = _ref.chain; 15 | 16 | chain.each = function (cb, opt) { 17 | return each(this); 18 | }; 19 | return chain; 20 | } 21 | //# sourceMappingURL=each.js.map 22 | -------------------------------------------------------------------------------- /edge/each.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["each.js"],"names":["each","addEach","node","map","val","apply","arguments","chain","cb","opt"],"mappings":";;;;;QAAgBA,I,GAAAA,I;QAKAC,O,GAAAA,O;AALT,SAASD,IAAT,CAAcE,IAAd,EAAoB;AACzB,MAAIF,OAAOE,KAAKC,GAAL,EAAX;AACA,SAAOD,KAAKE,GAAL,CAASC,KAAT,CAAeL,IAAf,EAAqBM,SAArB,CAAP;AACD;;AAEM,SAASL,OAAT,OAEJ;AAAA,MADDM,KACC,QADDA,KACC;;AACDA,QAAMP,IAAN,GAAa,UAAUQ,EAAV,EAAcC,GAAd,EAAmB;AAC9B,WAAOT,KAAK,IAAL,CAAP;AACD,GAFD;AAGA,SAAOO,KAAP;AACD","file":"each.js","sourcesContent":["export function each(node) {\n var each = node.map();\n return node.val.apply(each, arguments)\n}\n\nexport function addEach({\n chain\n}) {\n chain.each = function (cb, opt) {\n return each(this)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/edge.js: -------------------------------------------------------------------------------- 1 | // all you have to do in the out extension is case detect to traverse 2 | // to inout or outin based on where you came in from 3 | // (probably by checking the UUID/soul of the out node and making 4 | // sure it is !== to where you just came from) 5 | // and of course having another wrapper method around 6 | // setting/adding edges would be nice too, maybe like gun.edge(data) 7 | // to complement gun.out(property) 8 | 9 | // oh, and of course don't forget to mark.spouse = edge; amber.spouse = edge 10 | // (oh, and stupid comment, make sure to make edge have a edge.type = "edge" 11 | // so you can type check against it internally and know it is an edge "node" not a 12 | // regular node) 13 | // (this is the primary reason edges aren't built into gun, cause there 14 | // is nothing inherently "special" about them to warrant the entire database 15 | // always having the overhead of an extra edge it has to jump through 16 | // [slows down performance just slightly] unless it is explicitly needed/wanted) 17 | 18 | // travels an edge to another node 19 | // tests that the property is an edge 20 | 21 | // gun.get('amber').get('spouse').get('outin').val(cb) 22 | 23 | // shorthand 24 | // gun.get('amber').out('spouse') 25 | 26 | // export const edge = (property, edge) => { 27 | // const gun = this 28 | 29 | // const name = edge.name 30 | // const from = edge.from 31 | // const to = edge.outin 32 | // console.log('add edge', edge, 'from', from, 'to', to) 33 | 34 | // from.put({ 35 | // [name]: edge 36 | // }) 37 | 38 | // to.put({ 39 | // [name]: edge 40 | // }) 41 | // } 42 | "use strict"; 43 | //# sourceMappingURL=edge.js.map 44 | -------------------------------------------------------------------------------- /edge/edge.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["edge.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA","file":"edge.js","sourcesContent":["// all you have to do in the out extension is case detect to traverse\n// to inout or outin based on where you came in from\n// (probably by checking the UUID/soul of the out node and making\n// sure it is !== to where you just came from)\n// and of course having another wrapper method around\n// setting/adding edges would be nice too, maybe like gun.edge(data)\n// to complement gun.out(property)\n\n// oh, and of course don't forget to mark.spouse = edge; amber.spouse = edge\n// (oh, and stupid comment, make sure to make edge have a edge.type = \"edge\"\n// so you can type check against it internally and know it is an edge \"node\" not a\n// regular node)\n// (this is the primary reason edges aren't built into gun, cause there\n// is nothing inherently \"special\" about them to warrant the entire database\n// always having the overhead of an extra edge it has to jump through\n// [slows down performance just slightly] unless it is explicitly needed/wanted)\n\n// travels an edge to another node\n// tests that the property is an edge\n\n// gun.get('amber').get('spouse').get('outin').val(cb)\n\n// shorthand\n// gun.get('amber').out('spouse')\n\n// export const edge = (property, edge) => {\n// const gun = this\n\n// const name = edge.name\n// const from = edge.from\n// const to = edge.outin\n// console.log('add edge', edge, 'from', from, 'to', to)\n\n// from.put({\n// [name]: edge\n// })\n\n// to.put({\n// [name]: edge\n// })\n// }"]} -------------------------------------------------------------------------------- /edge/fields.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _keys = require("babel-runtime/core-js/object/keys"); 8 | 9 | var _keys2 = _interopRequireDefault(_keys); 10 | 11 | var _values = require("babel-runtime/core-js/object/values"); 12 | 13 | var _values2 = _interopRequireDefault(_values); 14 | 15 | exports.localFields = localFields; 16 | exports.fields = fields; 17 | exports.addFields = addFields; 18 | 19 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 20 | 21 | function localFields(node) { 22 | var mp = node.map().val(function (v) { 23 | return v; 24 | }); 25 | var map = (0, _values2.default)(mp._.map); 26 | return (0, _values2.default)(map).map(function (v) { 27 | return v.at.field; 28 | }); 29 | } 30 | 31 | function fields(node, cb, opt) { 32 | node.value(function (v) { 33 | return cb((0, _keys2.default)(v)); 34 | }, opt); 35 | } 36 | 37 | function addFields(_ref) { 38 | var chain = _ref.chain; 39 | 40 | chain.fields = function (cb, opt) { 41 | return fields(this, cb, opt); 42 | }; 43 | return chain; 44 | } 45 | //# sourceMappingURL=fields.js.map 46 | -------------------------------------------------------------------------------- /edge/fields.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["fields.js"],"names":["localFields","fields","addFields","node","mp","map","val","v","_","at","field","cb","opt","value","chain"],"mappings":";;;;;;;;;;;;;;QAAgBA,W,GAAAA,W;QAMAC,M,GAAAA,M;QAIAC,S,GAAAA,S;;;;AAVT,SAASF,WAAT,CAAqBG,IAArB,EAA2B;AAChC,MAAIC,KAAKD,KAAKE,GAAL,GAAWC,GAAX,CAAe;AAAA,WAAKC,CAAL;AAAA,GAAf,CAAT;AACA,MAAIF,MAAM,sBAAcD,GAAGI,CAAH,CAAKH,GAAnB,CAAV;AACA,SAAO,sBAAcA,GAAd,EAAmBA,GAAnB,CAAuB;AAAA,WAAKE,EAAEE,EAAF,CAAKC,KAAV;AAAA,GAAvB,CAAP;AACD;;AAEM,SAAST,MAAT,CAAgBE,IAAhB,EAAsBQ,EAAtB,EAA0BC,GAA1B,EAA+B;AACpCT,OAAKU,KAAL,CAAW;AAAA,WAAKF,GAAG,oBAAYJ,CAAZ,CAAH,CAAL;AAAA,GAAX,EAAoCK,GAApC;AACD;;AAEM,SAASV,SAAT,OAEJ;AAAA,MADDY,KACC,QADDA,KACC;;AACDA,QAAMb,MAAN,GAAe,UAAUU,EAAV,EAAcC,GAAd,EAAmB;AAChC,WAAOX,OAAO,IAAP,EAAaU,EAAb,EAAiBC,GAAjB,CAAP;AACD,GAFD;AAGA,SAAOE,KAAP;AACD","file":"fields.js","sourcesContent":["export function localFields(node) {\n var mp = node.map().val(v => v)\n var map = Object.values(mp._.map)\n return Object.values(map).map(v => v.at.field)\n}\n\nexport function fields(node, cb, opt) {\n node.value(v => cb(Object.keys(v)), opt)\n}\n\nexport function addFields({\n chain\n}) {\n chain.fields = function (cb, opt) {\n return fields(this, cb, opt)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/filter.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.filter = filter; 7 | function filter(node, filter) { 8 | // map and filter 9 | } 10 | //# sourceMappingURL=filter.js.map 11 | -------------------------------------------------------------------------------- /edge/filter.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["filter.js"],"names":["filter","node"],"mappings":";;;;;QAAgBA,M,GAAAA,M;AAAT,SAASA,MAAT,CAAgBC,IAAhB,EAAsBD,MAAtB,EAA8B;AACnC;AACD","file":"filter.js","sourcesContent":["export function filter(node, filter) {\n // map and filter\n}"]} -------------------------------------------------------------------------------- /edge/gen/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.add = add; 7 | exports.$addGen = $addGen; 8 | 9 | var _live = require('./live'); 10 | 11 | var _on = require('./on'); 12 | 13 | var _map = require('./map'); 14 | 15 | var chains = { 16 | $addLive: _live.$addLive, 17 | $addMap: _map.$addMap, 18 | $addOn: _on.$addOn 19 | }; 20 | 21 | function capitalize(str) { 22 | return str.charAt(0).toUpperCase() + str.slice(1); 23 | } 24 | 25 | function add(Gun) { 26 | for (var _len = arguments.length, names = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 27 | names[_key - 1] = arguments[_key]; 28 | } 29 | 30 | names.forEach(function (name) { 31 | var nameCap = capitalize(name); 32 | var fun = '$add' + nameCap; 33 | chains[fun]({ 34 | chain: Gun.chain, 35 | Gun: Gun 36 | }); 37 | }); 38 | } 39 | 40 | var allNames = ['live', 'map', 'on']; 41 | 42 | function $addGen(_ref) { 43 | var Gun = _ref.Gun; 44 | 45 | add.apply(undefined, [Gun].concat(allNames)); 46 | } 47 | 48 | exports.default = $addGen; 49 | //# sourceMappingURL=index.js.map 50 | -------------------------------------------------------------------------------- /edge/gen/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["gen/index.js"],"names":["add","$addGen","chains","$addLive","$addMap","$addOn","capitalize","str","charAt","toUpperCase","slice","Gun","names","forEach","nameCap","name","fun","chain","allNames"],"mappings":";;;;;QAoBgBA,G,GAAAA,G;QAiBAC,O,GAAAA,O;;AArChB;;AAGA;;AAGA;;AAIA,IAAMC,SAAS;AACbC,0BADa;AAEbC,uBAFa;AAGbC;AAHa,CAAf;;AAMA,SAASC,UAAT,CAAoBC,GAApB,EAAyB;AACvB,SAAOA,IAAIC,MAAJ,CAAW,CAAX,EAAcC,WAAd,KAA8BF,IAAIG,KAAJ,CAAU,CAAV,CAArC;AACD;;AAEM,SAASV,GAAT,CAAaW,GAAb,EAA4B;AAAA,oCAAPC,KAAO;AAAPA,SAAO;AAAA;;AACjCA,QAAMC,OAAN,CAAc,gBAAQ;AACpB,QAAIC,UAAUR,WAAWS,IAAX,CAAd;AACA,QAAIC,MAAM,SAASF,OAAnB;AACAZ,WAAOc,GAAP,EAAY;AACVC,aAAON,IAAIM,KADD;AAEVN;AAFU,KAAZ;AAID,GAPD;AAQD;;AAED,IAAMO,WAAW,CACf,MADe,EAEf,KAFe,EAGf,IAHe,CAAjB;;AAMO,SAASjB,OAAT,OAEJ;AAAA,MADDU,GACC,QADDA,GACC;;AACDX,wBAAIW,GAAJ,SAAYO,QAAZ;AACD;;kBAEcjB,O","file":"index.js","sourcesContent":["import {\n $addLive\n} from './live'\nimport {\n $addOn\n} from './on'\nimport {\n $addMap\n} from './map'\n\nconst chains = {\n $addLive,\n $addMap,\n $addOn,\n}\n\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function add(Gun, ...names) {\n names.forEach(name => {\n let nameCap = capitalize(name)\n let fun = '$add' + nameCap\n chains[fun]({\n chain: Gun.chain,\n Gun\n })\n })\n}\n\nconst allNames = [\n 'live',\n 'map',\n 'on'\n]\n\nexport function $addGen({\n Gun\n}) {\n add(Gun, ...allNames)\n}\n\nexport default $addGen"]} -------------------------------------------------------------------------------- /edge/gen/live.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$live = $live; 7 | exports.$addLive = $addLive; 8 | 9 | var _marked = [$live].map(regeneratorRuntime.mark); 10 | 11 | function $live(node) { 12 | var nextResolve, promise, resolveAndReload; 13 | return regeneratorRuntime.wrap(function $live$(_context) { 14 | while (1) { 15 | switch (_context.prev = _context.next) { 16 | case 0: 17 | nextResolve = void 0, promise = void 0; 18 | 19 | resolveAndReload = function resolveAndReload(value) { 20 | if (nextResolve) nextResolve({ 21 | value: value, 22 | next: function next() { 23 | return promise; 24 | } 25 | }); 26 | promise = new Promise(function (resolve) { 27 | return nextResolve = resolve; 28 | }); 29 | return promise; 30 | }; 31 | 32 | resolveAndReload(); 33 | gun.live(resolveAndReload); 34 | 35 | case 4: 36 | case "end": 37 | return _context.stop(); 38 | } 39 | } 40 | }, _marked[0], this); 41 | } 42 | 43 | function $addLive(_ref) { 44 | var chain = _ref.chain; 45 | 46 | chain.$live = regeneratorRuntime.mark(function _callee() { 47 | return regeneratorRuntime.wrap(function _callee$(_context2) { 48 | while (1) { 49 | switch (_context2.prev = _context2.next) { 50 | case 0: 51 | _context2.next = 2; 52 | return $live(this); 53 | 54 | case 2: 55 | case "end": 56 | return _context2.stop(); 57 | } 58 | } 59 | }, _callee, this); 60 | }); 61 | return chain; 62 | } 63 | //# sourceMappingURL=live.js.map 64 | -------------------------------------------------------------------------------- /edge/gen/live.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["gen/live.js"],"names":["$live","$addLive","node","nextResolve","promise","resolveAndReload","value","next","Promise","resolve","gun","live","chain"],"mappings":";;;;;QAAiBA,K,GAAAA,K;QAcDC,Q,GAAAA,Q;;eAdCD,K;;AAAV,SAAUA,KAAV,CAAgBE,IAAhB;AAAA;AAAA;AAAA;AAAA;AAAA;AACDC,qBADC,WACYC,OADZ;;AAECC,0BAFD,GAEoB,SAAnBA,gBAAmB,CAACC,KAAD,EAAW;AAClC,gBAAIH,WAAJ,EAAiBA,YAAY;AAC3BG,0BAD2B;AAE3BC,oBAAO;AAAA,uBAAMH,OAAN;AAAA;AAFoB,aAAZ;AAIjBA,sBAAU,IAAII,OAAJ,CAAY,UAACC,OAAD;AAAA,qBAAaN,cAAcM,OAA3B;AAAA,aAAZ,CAAV;AACA,mBAAOL,OAAP;AACD,WATI;;AAULC;AACAK,cAAIC,IAAJ,CAASN,gBAAT;;AAXK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAcA,SAASJ,QAAT,OAEJ;AAAA,MADDW,KACC,QADDA,KACC;;AACDA,QAAMZ,KAAN,2BAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBACNA,MAAM,IAAN,CADM;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAd;AAGA,SAAOY,KAAP;AACD","file":"live.js","sourcesContent":["export function* $live(node) {\n let nextResolve, promise;\n const resolveAndReload = (value) => {\n if (nextResolve) nextResolve({\n value,\n next: (() => promise)\n });\n promise = new Promise((resolve) => nextResolve = resolve);\n return promise;\n }\n resolveAndReload();\n gun.live(resolveAndReload)\n}\n\nexport function $addLive({\n chain\n}) {\n chain.$live = function* () {\n yield $live(this)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/gen/map.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$map = $map; 7 | exports.$addMap = $addMap; 8 | 9 | var _marked = [$map].map(regeneratorRuntime.mark); 10 | 11 | function $map(node, _ref) { 12 | var transform = _ref.transform, 13 | _ref$operator = _ref.operator, 14 | operator = _ref$operator === undefined ? 'val' : _ref$operator, 15 | opt = _ref.opt; 16 | var nextResolve, promise, resolveAndReload; 17 | return regeneratorRuntime.wrap(function $map$(_context) { 18 | while (1) { 19 | switch (_context.prev = _context.next) { 20 | case 0: 21 | nextResolve = void 0, promise = void 0; 22 | 23 | resolveAndReload = function resolveAndReload(value) { 24 | if (nextResolve) nextResolve({ 25 | value: value, 26 | next: function next() { 27 | return promise; 28 | } 29 | }); 30 | promise = new Promise(function (resolve) { 31 | return nextResolve = resolve; 32 | }); 33 | return promise; 34 | }; 35 | 36 | resolveAndReload(); 37 | node.map(transform, opt)[operator](resolveAndReload); 38 | 39 | case 4: 40 | case 'end': 41 | return _context.stop(); 42 | } 43 | } 44 | }, _marked[0], this); 45 | } 46 | 47 | function $addMap(_ref2) { 48 | var chain = _ref2.chain; 49 | 50 | chain.$map = regeneratorRuntime.mark(function _callee(_ref3) { 51 | var _ref3$operator = _ref3.operator, 52 | operator = _ref3$operator === undefined ? 'val' : _ref3$operator, 53 | transform = _ref3.transform, 54 | opt = _ref3.opt; 55 | return regeneratorRuntime.wrap(function _callee$(_context2) { 56 | while (1) { 57 | switch (_context2.prev = _context2.next) { 58 | case 0: 59 | _context2.next = 2; 60 | return $map(this, { 61 | operator: operator, 62 | condition: condition, 63 | transform: transform, 64 | opt: opt 65 | }); 66 | 67 | case 2: 68 | case 'end': 69 | return _context2.stop(); 70 | } 71 | } 72 | }, _callee, this); 73 | }); 74 | return chain; 75 | } 76 | //# sourceMappingURL=map.js.map 77 | -------------------------------------------------------------------------------- /edge/gen/map.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["gen/map.js"],"names":["$map","$addMap","node","transform","operator","opt","nextResolve","promise","resolveAndReload","value","next","Promise","resolve","map","chain","condition"],"mappings":";;;;;QAAiBA,I,GAAAA,I;QAkBDC,O,GAAAA,O;;eAlBCD,I;;AAAV,SAAUA,IAAV,CAAeE,IAAf;AAAA,MACLC,SADK,QACLA,SADK;AAAA,2BAELC,QAFK;AAAA,MAELA,QAFK,iCAEM,KAFN;AAAA,MAGLC,GAHK,QAGLA,GAHK;AAAA;AAAA;AAAA;AAAA;AAAA;AAKDC,qBALC,WAKYC,OALZ;;AAMCC,0BAND,GAMoB,SAAnBA,gBAAmB,CAACC,KAAD,EAAW;AAClC,gBAAIH,WAAJ,EAAiBA,YAAY;AAC3BG,0BAD2B;AAE3BC,oBAAO;AAAA,uBAAMH,OAAN;AAAA;AAFoB,aAAZ;AAIjBA,sBAAU,IAAII,OAAJ,CAAY,UAACC,OAAD;AAAA,qBAAaN,cAAcM,OAA3B;AAAA,aAAZ,CAAV;AACA,mBAAOL,OAAP;AACD,WAbI;;AAcLC;AACAN,eAAKW,GAAL,CAASV,SAAT,EAAoBE,GAApB,EAAyBD,QAAzB,EAAmCI,gBAAnC;;AAfK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAkBA,SAASP,OAAT,QAEJ;AAAA,MADDa,KACC,SADDA,KACC;;AACDA,QAAMd,IAAN,2BAAa;AAAA,+BACXI,QADW;AAAA,QACXA,QADW,kCACA,KADA;AAAA,QAEXD,SAFW,SAEXA,SAFW;AAAA,QAGXE,GAHW,SAGXA,GAHW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKLL,KAAK,IAAL,EAAW;AACfI,gCADe;AAEfW,kCAFe;AAGfZ,kCAHe;AAIfE;AAJe,aAAX,CALK;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAb;AAYA,SAAOS,KAAP;AACD","file":"map.js","sourcesContent":["export function* $map(node, {\n transform,\n operator = 'val',\n opt\n}) {\n let nextResolve, promise;\n const resolveAndReload = (value) => {\n if (nextResolve) nextResolve({\n value,\n next: (() => promise)\n });\n promise = new Promise((resolve) => nextResolve = resolve);\n return promise;\n }\n resolveAndReload();\n node.map(transform, opt)[operator](resolveAndReload)\n}\n\nexport function $addMap({\n chain\n}) {\n chain.$map = function* ({\n operator = 'val',\n transform,\n opt\n }) {\n yield $map(this, {\n operator,\n condition,\n transform,\n opt\n })\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/gen/on.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$on = $on; 7 | exports.$addOn = $addOn; 8 | 9 | var _marked = [$on].map(regeneratorRuntime.mark); 10 | 11 | function $on(node) { 12 | var nextResolve, promise, resolveAndReload; 13 | return regeneratorRuntime.wrap(function $on$(_context) { 14 | while (1) { 15 | switch (_context.prev = _context.next) { 16 | case 0: 17 | nextResolve = void 0, promise = void 0; 18 | 19 | resolveAndReload = function resolveAndReload(value) { 20 | if (nextResolve) nextResolve({ 21 | value: value, 22 | next: function next() { 23 | return promise; 24 | } 25 | }); 26 | promise = new Promise(function (resolve) { 27 | return nextResolve = resolve; 28 | }); 29 | return promise; 30 | }; 31 | 32 | resolveAndReload(); 33 | node.on(resolveAndReload); 34 | 35 | case 4: 36 | case "end": 37 | return _context.stop(); 38 | } 39 | } 40 | }, _marked[0], this); 41 | } 42 | 43 | function $addOn(_ref) { 44 | var chain = _ref.chain; 45 | 46 | chain.$on = regeneratorRuntime.mark(function _callee() { 47 | return regeneratorRuntime.wrap(function _callee$(_context2) { 48 | while (1) { 49 | switch (_context2.prev = _context2.next) { 50 | case 0: 51 | _context2.next = 2; 52 | return $on(this); 53 | 54 | case 2: 55 | case "end": 56 | return _context2.stop(); 57 | } 58 | } 59 | }, _callee, this); 60 | }); 61 | return chain; 62 | } 63 | //# sourceMappingURL=on.js.map 64 | -------------------------------------------------------------------------------- /edge/gen/on.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["gen/on.js"],"names":["$on","$addOn","node","nextResolve","promise","resolveAndReload","value","next","Promise","resolve","on","chain"],"mappings":";;;;;QAAiBA,G,GAAAA,G;QAcDC,M,GAAAA,M;;eAdCD,G;;AAAV,SAAUA,GAAV,CAAcE,IAAd;AAAA;AAAA;AAAA;AAAA;AAAA;AACDC,qBADC,WACYC,OADZ;;AAECC,0BAFD,GAEoB,SAAnBA,gBAAmB,CAACC,KAAD,EAAW;AAClC,gBAAIH,WAAJ,EAAiBA,YAAY;AAC3BG,0BAD2B;AAE3BC,oBAAO;AAAA,uBAAMH,OAAN;AAAA;AAFoB,aAAZ;AAIjBA,sBAAU,IAAII,OAAJ,CAAY,UAACC,OAAD;AAAA,qBAAaN,cAAcM,OAA3B;AAAA,aAAZ,CAAV;AACA,mBAAOL,OAAP;AACD,WATI;;AAULC;AACAH,eAAKQ,EAAL,CAAQL,gBAAR;;AAXK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAcA,SAASJ,MAAT,OAEJ;AAAA,MADDU,KACC,QADDA,KACC;;AACDA,QAAMX,GAAN,2BAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBACJA,IAAI,IAAJ,CADI;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAZ;AAGA,SAAOW,KAAP;AACD","file":"on.js","sourcesContent":["export function* $on(node) {\n let nextResolve, promise;\n const resolveAndReload = (value) => {\n if (nextResolve) nextResolve({\n value,\n next: (() => promise)\n });\n promise = new Promise((resolve) => nextResolve = resolve);\n return promise;\n }\n resolveAndReload();\n node.on(resolveAndReload)\n}\n\nexport function $addOn({\n chain\n}) {\n chain.$on = function* () {\n yield $on(this)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.addAll = exports.add = undefined; 7 | 8 | exports.default = function (Gun) { 9 | Gun.chainAll = function () { 10 | for (var _len = arguments.length, funs = Array(_len), _key = 0; _key < _len; _key++) { 11 | funs[_key] = arguments[_key]; 12 | } 13 | 14 | funs.forEach(function (fun) { 15 | return fun(Gun.chain, Gun); 16 | }); 17 | }; 18 | return (0, _all2.default)(Gun); 19 | }; 20 | 21 | var _all = require('./all'); 22 | 23 | var _all2 = _interopRequireDefault(_all); 24 | 25 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 26 | 27 | exports.add = _all.add; 28 | exports.addAll = _all2.default; 29 | //# sourceMappingURL=index.js.map 30 | -------------------------------------------------------------------------------- /edge/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["index.js"],"names":["Gun","chainAll","funs","forEach","fun","chain","add","addAll"],"mappings":";;;;;;;kBAUe,UAAUA,GAAV,EAAe;AAC5BA,MAAIC,QAAJ,GAAe,YAAmB;AAAA,sCAANC,IAAM;AAANA,UAAM;AAAA;;AAChCA,SAAKC,OAAL,CAAa;AAAA,aAAOC,IAAIJ,IAAIK,KAAR,EAAeL,GAAf,CAAP;AAAA,KAAb;AACD,GAFD;AAGA,SAAO,mBAAOA,GAAP,CAAP;AACD,C;;AAfD;;;;;;QAMEM,G;QACAC,M","file":"index.js","sourcesContent":["import {\n add,\n default as addAll\n} from './all'\n\nexport {\n add,\n addAll\n}\n\nexport default function (Gun) {\n Gun.chainAll = function (...funs) {\n funs.forEach(fun => fun(Gun.chain, Gun))\n }\n return addAll(Gun)\n}"]} -------------------------------------------------------------------------------- /edge/live.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.live = live; 7 | exports.addLive = addLive; 8 | 9 | var _gun = require('gun/gun'); 10 | 11 | var _gun2 = _interopRequireDefault(_gun); 12 | 13 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 14 | 15 | function live(node, cb, opt) { 16 | return node.on(function (val, field) { 17 | var v = _gun2.default.obj.copy(val); 18 | if (v) { 19 | delete v._; 20 | } 21 | cb.call(this, v, field); 22 | }, opt); 23 | } 24 | 25 | function addLive(_ref) { 26 | var chain = _ref.chain; 27 | 28 | chain.live = function (cb, opt) { 29 | return live(this, cb, opt); 30 | }; 31 | 32 | return chain; 33 | } 34 | //# sourceMappingURL=live.js.map 35 | -------------------------------------------------------------------------------- /edge/live.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["live.js"],"names":["live","addLive","node","cb","opt","on","val","field","v","obj","copy","_","call","chain"],"mappings":";;;;;QAEgBA,I,GAAAA,I;QAUAC,O,GAAAA,O;;AAZhB;;;;;;AAEO,SAASD,IAAT,CAAcE,IAAd,EAAoBC,EAApB,EAAwBC,GAAxB,EAA6B;AAClC,SAAOF,KAAKG,EAAL,CAAQ,UAAUC,GAAV,EAAeC,KAAf,EAAsB;AACnC,QAAIC,IAAI,cAAIC,GAAJ,CAAQC,IAAR,CAAaJ,GAAb,CAAR;AACA,QAAIE,CAAJ,EAAO;AACL,aAAOA,EAAEG,CAAT;AACD;AACDR,OAAGS,IAAH,CAAQ,IAAR,EAAcJ,CAAd,EAAiBD,KAAjB;AACD,GANM,EAMJH,GANI,CAAP;AAOD;;AAEM,SAASH,OAAT,OAEJ;AAAA,MADDY,KACC,QADDA,KACC;;AACDA,QAAMb,IAAN,GAAa,UAAUG,EAAV,EAAcC,GAAd,EAAmB;AAC9B,WAAOJ,KAAK,IAAL,EAAWG,EAAX,EAAeC,GAAf,CAAP;AACD,GAFD;;AAIA,SAAOS,KAAP;AACD","file":"live.js","sourcesContent":["import Gun from 'gun/gun'\n\nexport function live(node, cb, opt) {\n return node.on(function (val, field) {\n let v = Gun.obj.copy(val)\n if (v) {\n delete v._;\n }\n cb.call(this, v, field);\n }, opt);\n}\n\nexport function addLive({\n chain\n}) {\n chain.live = function (cb, opt) {\n return live(this, cb, opt)\n }\n\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/local.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.local = local; 7 | exports.addLocal = addLocal; 8 | function local(node, data, cb, opt) { 9 | opt = opt || {}; 10 | opt.peers = {}; 11 | return node.put(data, cb, opt); 12 | } 13 | 14 | function addLocal(_ref) { 15 | var chain = _ref.chain; 16 | 17 | chain.local = function (data, cb, opt) { 18 | return local(this, data, cb, opt); 19 | }; 20 | 21 | return chain; 22 | } 23 | //# sourceMappingURL=local.js.map 24 | -------------------------------------------------------------------------------- /edge/local.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["local.js"],"names":["local","addLocal","node","data","cb","opt","peers","put","chain"],"mappings":";;;;;QAAgBA,K,GAAAA,K;QAMAC,Q,GAAAA,Q;AANT,SAASD,KAAT,CAAeE,IAAf,EAAqBC,IAArB,EAA2BC,EAA3B,EAA+BC,GAA/B,EAAoC;AACzCA,QAAMA,OAAO,EAAb;AACAA,MAAIC,KAAJ,GAAY,EAAZ;AACA,SAAOJ,KAAKK,GAAL,CAASJ,IAAT,EAAeC,EAAf,EAAmBC,GAAnB,CAAP;AACD;;AAEM,SAASJ,QAAT,OAEJ;AAAA,MADDO,KACC,QADDA,KACC;;AACDA,QAAMR,KAAN,GAAc,UAAUG,IAAV,EAAgBC,EAAhB,EAAoBC,GAApB,EAAyB;AACrC,WAAOL,MAAM,IAAN,EAAYG,IAAZ,EAAkBC,EAAlB,EAAsBC,GAAtB,CAAP;AACD,GAFD;;AAIA,SAAOG,KAAP;AACD","file":"local.js","sourcesContent":["export function local(node, data, cb, opt) {\n opt = opt || {};\n opt.peers = {};\n return node.put(data, cb, opt)\n}\n\nexport function addLocal({\n chain\n}) {\n chain.local = function (data, cb, opt) {\n return local(this, data, cb, opt)\n }\n\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/map-reduce.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _keys = require('babel-runtime/core-js/object/keys'); 8 | 9 | var _keys2 = _interopRequireDefault(_keys); 10 | 11 | var _assign = require('babel-runtime/core-js/object/assign'); 12 | 13 | var _assign2 = _interopRequireDefault(_assign); 14 | 15 | exports.addMapReduce = addMapReduce; 16 | exports.mapReduce = mapReduce; 17 | 18 | var _gun = require('gun/gun'); 19 | 20 | var _gun2 = _interopRequireDefault(_gun); 21 | 22 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 23 | 24 | function addMapReduce(_ref) { 25 | var chain = _ref.chain; 26 | 27 | chain.mapReduce = function (opts, cb, putCb, opt) { 28 | mapReduce(this, opts, cb, putCb, opt); 29 | }; 30 | return chain; 31 | } 32 | 33 | function mapReduce(bucket) { 34 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 35 | var cb = arguments[2]; 36 | var putCb = arguments[3]; 37 | var opt = arguments[4]; 38 | 39 | bucket.fields(function (allFields) { 40 | options = (0, _assign2.default)(options, { 41 | allFields: allFields 42 | }); 43 | doMapReduce(bucket, options, cb, putCb, opt); 44 | }); 45 | } 46 | 47 | function defaultLogger(fun, logging) { 48 | return function () { 49 | var _console; 50 | 51 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 52 | args[_key] = arguments[_key]; 53 | } 54 | 55 | if (logging) (_console = console).log.apply(_console, [fun].concat(args)); 56 | }; 57 | } 58 | 59 | function doMapReduce(bucket, _ref2, cb, putCb, opt) { 60 | var newField = _ref2.newField, 61 | newValue = _ref2.newValue, 62 | value = _ref2.value, 63 | transform = _ref2.transform, 64 | filter = _ref2.filter, 65 | filters = _ref2.filters, 66 | _ref2$fields = _ref2.fields, 67 | fields = _ref2$fields === undefined ? [] : _ref2$fields, 68 | _ref2$ignoreFields = _ref2.ignoreFields, 69 | ignoreFields = _ref2$ignoreFields === undefined ? [] : _ref2$ignoreFields, 70 | allFields = _ref2.allFields, 71 | _ref2$iterator = _ref2.iterator, 72 | iterator = _ref2$iterator === undefined ? 'val' : _ref2$iterator, 73 | validField = _ref2.validField, 74 | processWhile = _ref2.processWhile, 75 | updateWhen = _ref2.updateWhen, 76 | updateBucket = _ref2.updateBucket, 77 | filterBucket = _ref2.filterBucket, 78 | saveChanges = _ref2.saveChanges, 79 | done = _ref2.done, 80 | _ref2$logging = _ref2.logging, 81 | logging = _ref2$logging === undefined ? false : _ref2$logging, 82 | logger = _ref2.logger, 83 | context = _ref2.context; 84 | 85 | 86 | var ctx = { 87 | oldProps: {}, 88 | newProps: {}, 89 | filteredFields: {}, 90 | visited: {}, 91 | updated: false, 92 | processedFields: 0, 93 | allFields: allFields, 94 | fields: fields, 95 | ignoreFields: ignoreFields, 96 | iterator: iterator, 97 | context: context, 98 | putCb: putCb, 99 | opt: opt 100 | }; 101 | 102 | transform = transform || function (field, val) { 103 | return {}; 104 | }; 105 | 106 | logger = logger || defaultLogger; 107 | 108 | var log = logger(iterator, logging); 109 | 110 | log('ctx', ctx); 111 | 112 | function defaultProcessWhile(_ref3) { 113 | var field = _ref3.field, 114 | val = _ref3.val, 115 | ctx = _ref3.ctx; 116 | 117 | var reVisit = ctx.visited[field]; 118 | var decision = !reVisit; 119 | log('processWhile', reVisit, decision); 120 | return decision; 121 | } 122 | 123 | function defaultValidField(field, ctx) { 124 | var fields = ctx.fields, 125 | ignoreFields = ctx.ignoreFields; 126 | 127 | var valid = fields.length === 0 || fields.length > 0 && fields.indexOf(field) >= 0; 128 | var invalid = ignoreFields.length > 0 && ignoreFields.indexOf(field) >= 0; 129 | return valid && !invalid; 130 | } 131 | 132 | function defaultUpdateWhen(_ref4) { 133 | var field = _ref4.field, 134 | val = _ref4.val, 135 | ctx = _ref4.ctx; 136 | 137 | var processedAll = ctx.processedFields >= ctx.allFields.length; 138 | var visitedAll = ctx.allFields.every(function (f) { 139 | return ctx.visited[f]; 140 | }); 141 | var decision = visitedAll && processedAll; 142 | log('updateWhen', visitedAll, processedAll, decision); 143 | return decision; 144 | } 145 | 146 | function defaultSaveChanges(bucket, changesObj, ctx) { 147 | bucket.put(changesObj, ctx.putCb, ctx.opt); 148 | } 149 | 150 | function defaultFilterBucket(bucket, ctx) { 151 | var deleteKeys = (0, _keys2.default)(ctx.filteredFields); 152 | if (deleteKeys.length > 0) { 153 | log('FILTER', deleteKeys); 154 | var deleteObj = deleteKeys.reduce(function (obj, key) { 155 | obj[key] = null; 156 | return obj; 157 | }, {}); 158 | log('deleteObj', deleteObj); 159 | ctx.saveChanges(bucket, deleteObj, ctx); 160 | } 161 | } 162 | 163 | function defaultUpdateBucket(bucket, ctx) { 164 | log('UPDATE', props); 165 | var props = (0, _assign2.default)(ctx.oldProps, ctx.newProps); 166 | ctx.saveChanges(bucket, props, ctx); 167 | } 168 | 169 | function defaultDone(bucket, cb, ctx) { 170 | log('DONE'); 171 | if (cb) { 172 | cb(bucket, ctx); 173 | } else { 174 | throw Error(ctx.iterator + ': missing callback (in done)'); 175 | } 176 | } 177 | 178 | validField = validField || defaultValidField; 179 | processWhile = processWhile || defaultProcessWhile; 180 | updateWhen = updateWhen || defaultUpdateWhen; 181 | updateBucket = updateBucket || defaultUpdateBucket; 182 | filterBucket = filterBucket || defaultFilterBucket; 183 | saveChanges = saveChanges || defaultSaveChanges; 184 | done = done || defaultDone; 185 | 186 | ctx.saveChanges = saveChanges; 187 | 188 | function ensureFun(fun) { 189 | if (fun && typeof fun !== 'function') { 190 | return function (v) { 191 | return fun; 192 | }; 193 | } else { 194 | return fun; 195 | } 196 | } 197 | 198 | var newFieldFun = ensureFun(newField); 199 | var newValueFun = ensureFun(newValue); 200 | var oldValueFun = ensureFun(value); 201 | 202 | log(allFields); 203 | 204 | // processWhile = processWhile.bind(this) 205 | // updateWhen = updateWhen.bind(this) 206 | 207 | bucket.map()[iterator](function (val, field) { 208 | log('iterate', { 209 | field: field, 210 | val: val 211 | }); 212 | if (!validField(field, ctx)) return; 213 | 214 | var newKey = newFieldFun ? newFieldFun(field, val, ctx) : field; 215 | var newValue = newValueFun ? newValueFun(val, field, ctx) : val; 216 | var newObj = transform(field, val, ctx); 217 | 218 | var oldValue = oldValueFun ? oldValueFun(val, field, ctx) : val; 219 | var doFilter = false; 220 | 221 | if (filters) { 222 | log('process filters', filters.length); 223 | doFilter = filters.reduce(function (filtered, filter) { 224 | return !filtered ? filter(field, val, ctx) : filtered; 225 | }, false); 226 | } 227 | 228 | if (filter && filter(field, val)) { 229 | doFilter = true; 230 | } 231 | 232 | log({ 233 | newKey: newKey, 234 | newValue: newValue, 235 | oldValue: oldValue, 236 | doFilter: doFilter 237 | }); 238 | 239 | var doReduce = processWhile({ 240 | field: field, 241 | val: val, 242 | ctx: ctx 243 | }); 244 | log('doReduce', doReduce); 245 | 246 | if (doReduce) { 247 | log('reduce', { 248 | field: field, 249 | val: val, 250 | processedFields: ctx.processedFields 251 | }); 252 | if (doFilter) { 253 | ctx.filteredFields[field] = true; 254 | } else { 255 | ctx.newProps = (0, _assign2.default)(ctx.newProps, newObj); 256 | ctx.newProps[newKey] = newValue; 257 | 258 | ctx.oldProps[field] = oldValue; 259 | } 260 | ctx.visited[field] = true; 261 | ctx.visited[newKey] = true; 262 | ctx.processedFields++; 263 | } 264 | var doUpdate = updateWhen({ 265 | field: field, 266 | val: val, 267 | ctx: ctx 268 | }); 269 | log('doUpdate', doUpdate, ctx.processedFields); 270 | if (doUpdate) { 271 | if (!ctx.updated) { 272 | log('UPDATE BUCKET'); 273 | ctx.updated = true; 274 | updateBucket(bucket, ctx); 275 | filterBucket(bucket, ctx); 276 | done(bucket, cb, ctx); 277 | } else { 278 | log('ignore update'); 279 | } 280 | } 281 | }); 282 | } 283 | //# sourceMappingURL=map-reduce.js.map 284 | -------------------------------------------------------------------------------- /edge/no.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.no = no; 7 | exports.addNo = addNo; 8 | function no(node, cb) { 9 | var chain = node.chain(), 10 | flag; 11 | 12 | node.not(function (a, b, c) { 13 | flag = true; 14 | if (!cb) { 15 | return; 16 | } 17 | cb.call(this, a, b, c); 18 | }); 19 | 20 | node.get(function (at, ev) { 21 | if (flag) { 22 | return ev.off(); 23 | } 24 | chain._.on('in', at); 25 | }); 26 | return chain; 27 | } 28 | 29 | function addNo(_ref) { 30 | var chain = _ref.chain; 31 | 32 | chain.no = function (cb) { 33 | return no(this, cb); 34 | }; 35 | 36 | return chain; 37 | } 38 | //# sourceMappingURL=no.js.map 39 | -------------------------------------------------------------------------------- /edge/no.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["no.js"],"names":["no","addNo","node","cb","chain","flag","not","a","b","c","call","get","at","ev","off","_","on"],"mappings":";;;;;QAAgBA,E,GAAAA,E;QAqBAC,K,GAAAA,K;AArBT,SAASD,EAAT,CAAYE,IAAZ,EAAkBC,EAAlB,EAAsB;AAC3B,MAAIC,QAAQF,KAAKE,KAAL,EAAZ;AAAA,MACEC,IADF;;AAGAH,OAAKI,GAAL,CAAS,UAAUC,CAAV,EAAaC,CAAb,EAAgBC,CAAhB,EAAmB;AAC1BJ,WAAO,IAAP;AACA,QAAI,CAACF,EAAL,EAAS;AACP;AACD;AACDA,OAAGO,IAAH,CAAQ,IAAR,EAAcH,CAAd,EAAiBC,CAAjB,EAAoBC,CAApB;AACD,GAND;;AAQAP,OAAKS,GAAL,CAAS,UAAUC,EAAV,EAAcC,EAAd,EAAkB;AACzB,QAAIR,IAAJ,EAAU;AACR,aAAOQ,GAAGC,GAAH,EAAP;AACD;AACDV,UAAMW,CAAN,CAAQC,EAAR,CAAW,IAAX,EAAiBJ,EAAjB;AACD,GALD;AAMA,SAAOR,KAAP;AACD;;AAEM,SAASH,KAAT,OAEJ;AAAA,MADDG,KACC,QADDA,KACC;;AACDA,QAAMJ,EAAN,GAAW,UAAUG,EAAV,EAAc;AACvB,WAAOH,GAAG,IAAH,EAASG,EAAT,CAAP;AACD,GAFD;;AAIA,SAAOC,KAAP;AACD","file":"no.js","sourcesContent":["export function no(node, cb) {\n var chain = node.chain(),\n flag;\n\n node.not(function (a, b, c) {\n flag = true;\n if (!cb) {\n return\n }\n cb.call(this, a, b, c)\n });\n\n node.get(function (at, ev) {\n if (flag) {\n return ev.off()\n }\n chain._.on('in', at);\n });\n return chain;\n}\n\nexport function addNo({\n chain\n}) {\n chain.no = function (cb) {\n return no(this, cb)\n }\n\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/observable/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.add = add; 7 | exports.$addObservable = $addObservable; 8 | 9 | var _rx = require('./rx'); 10 | 11 | var _xstream = require('./xstream'); 12 | 13 | var _zen = require('./zen'); 14 | 15 | var chains = { 16 | addXStream: _xstream.addXStream, 17 | addRx: _rx.addRx, 18 | addZen: _zen.addZen 19 | }; 20 | 21 | function capitalize(str) { 22 | return str.charAt(0).toUpperCase() + str.slice(1); 23 | } 24 | 25 | function add(Gun) { 26 | for (var _len = arguments.length, names = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 27 | names[_key - 1] = arguments[_key]; 28 | } 29 | 30 | names.forEach(function (name) { 31 | var nameCap = capitalize(name); 32 | var fun = 'add' + nameCap; 33 | chains[fun]({ 34 | chain: Gun.chain, 35 | Gun: Gun 36 | }); 37 | }); 38 | } 39 | 40 | var allNames = ['rx', 'xStream', 'zen']; 41 | 42 | function $addObservable(_ref) { 43 | var Gun = _ref.Gun; 44 | 45 | add.apply(undefined, [Gun].concat(allNames)); 46 | } 47 | 48 | exports.default = $addObservable; 49 | //# sourceMappingURL=index.js.map 50 | -------------------------------------------------------------------------------- /edge/observable/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["observable/index.js"],"names":["add","$addObservable","chains","addXStream","addRx","addZen","capitalize","str","charAt","toUpperCase","slice","Gun","names","forEach","nameCap","name","fun","chain","allNames"],"mappings":";;;;;QAoBgBA,G,GAAAA,G;QAiBAC,c,GAAAA,c;;AArChB;;AAGA;;AAGA;;AAIA,IAAMC,SAAS;AACbC,iCADa;AAEbC,kBAFa;AAGbC;AAHa,CAAf;;AAMA,SAASC,UAAT,CAAoBC,GAApB,EAAyB;AACvB,SAAOA,IAAIC,MAAJ,CAAW,CAAX,EAAcC,WAAd,KAA8BF,IAAIG,KAAJ,CAAU,CAAV,CAArC;AACD;;AAEM,SAASV,GAAT,CAAaW,GAAb,EAA4B;AAAA,oCAAPC,KAAO;AAAPA,SAAO;AAAA;;AACjCA,QAAMC,OAAN,CAAc,gBAAQ;AACpB,QAAIC,UAAUR,WAAWS,IAAX,CAAd;AACA,QAAIC,MAAM,QAAQF,OAAlB;AACAZ,WAAOc,GAAP,EAAY;AACVC,aAAON,IAAIM,KADD;AAEVN;AAFU,KAAZ;AAID,GAPD;AAQD;;AAED,IAAMO,WAAW,CACf,IADe,EAEf,SAFe,EAGf,KAHe,CAAjB;;AAMO,SAASjB,cAAT,OAEJ;AAAA,MADDU,GACC,QADDA,GACC;;AACDX,wBAAIW,GAAJ,SAAYO,QAAZ;AACD;;kBAEcjB,c","file":"index.js","sourcesContent":["import {\n addRx\n} from './rx'\nimport {\n addXStream\n} from './xstream'\nimport {\n addZen\n} from './zen'\n\nconst chains = {\n addXStream,\n addRx,\n addZen\n}\n\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function add(Gun, ...names) {\n names.forEach(name => {\n let nameCap = capitalize(name)\n let fun = 'add' + nameCap\n chains[fun]({\n chain: Gun.chain,\n Gun\n })\n })\n}\n\nconst allNames = [\n 'rx',\n 'xStream',\n 'zen'\n]\n\nexport function $addObservable({\n Gun\n}) {\n add(Gun, ...allNames)\n}\n\nexport default $addObservable"]} -------------------------------------------------------------------------------- /edge/observable/rx.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$rx = $rx; 7 | exports.addRx = addRx; 8 | 9 | var _rxjs = require('rxjs'); 10 | 11 | var _gun = require('gun/gun'); 12 | 13 | var _gun2 = _interopRequireDefault(_gun); 14 | 15 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 16 | 17 | // See https://github.com/staltz/xstream 18 | function $rx(node) { 19 | var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 20 | 21 | var id = void 0, 22 | name = void 0; 23 | node.val(function (data) { 24 | id = _gun2.default.node.soul(data); 25 | name = opts.name || id || 'unknown'; 26 | }); 27 | var op = opts.op || 'on'; 28 | var log = function log() { 29 | if (opts.log) { 30 | var _console; 31 | 32 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 33 | args[_key] = arguments[_key]; 34 | } 35 | 36 | (_console = console).log.apply(_console, ['rx:', name].concat(args)); 37 | } 38 | }; 39 | 40 | // see Producer https://github.com/staltz/xstream#producer 41 | 42 | var observer = function observer(listener) { 43 | log('start'); 44 | var eventListener = function eventListener(event) { 45 | if (listener.next) { 46 | log(event); 47 | listener.next(event); 48 | } else { 49 | throw new Error('Listener missing next(event) method'); 50 | } 51 | }; 52 | node[op](eventListener); 53 | }; 54 | 55 | return _rxjs.Observable.create(observer); 56 | }; 57 | 58 | function addRx(_ref) { 59 | var chain = _ref.chain; 60 | 61 | chain.$rx = function (opts) { 62 | return $rx(this, opts); 63 | }; 64 | return chain; 65 | } 66 | //# sourceMappingURL=rx.js.map 67 | -------------------------------------------------------------------------------- /edge/observable/rx.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["observable/rx.js"],"names":["$rx","addRx","node","opts","id","name","val","soul","data","op","log","args","observer","listener","eventListener","event","next","Error","create","chain"],"mappings":";;;;;QAMgBA,G,GAAAA,G;QA+BAC,K,GAAAA,K;;AArChB;;AAGA;;;;;;AAEA;AACO,SAASD,GAAT,CAAaE,IAAb,EAA8B;AAAA,MAAXC,IAAW,uEAAJ,EAAI;;AACnC,MAAIC,WAAJ;AAAA,MAAQC,aAAR;AACAH,OAAKI,GAAL,CAAS,gBAAQ;AACfF,SAAK,cAAIF,IAAJ,CAASK,IAAT,CAAcC,IAAd,CAAL;AACAH,WAAOF,KAAKE,IAAL,IAAaD,EAAb,IAAmB,SAA1B;AACD,GAHD;AAIA,MAAMK,KAAKN,KAAKM,EAAL,IAAW,IAAtB;AACA,MAAMC,MAAM,SAANA,GAAM,GAAmB;AAC7B,QAAIP,KAAKO,GAAT,EAAc;AAAA;;AAAA,wCADSC,IACT;AADSA,YACT;AAAA;;AACZ,2BAAQD,GAAR,kBAAY,KAAZ,EAAmBL,IAAnB,SAA4BM,IAA5B;AACD;AACF,GAJD;;AAMA;;AAEA,MAAMC,WAAW,SAAXA,QAAW,CAACC,QAAD,EAAc;AAC7BH,QAAI,OAAJ;AACA,QAAII,gBAAgB,SAAhBA,aAAgB,CAACC,KAAD,EAAW;AAC7B,UAAIF,SAASG,IAAb,EAAmB;AACjBN,YAAIK,KAAJ;AACAF,iBAASG,IAAT,CAAcD,KAAd;AACD,OAHD,MAGO;AACL,cAAM,IAAIE,KAAJ,CAAU,qCAAV,CAAN;AACD;AACF,KAPD;AAQAf,SAAKO,EAAL,EAASK,aAAT;AACD,GAXD;;AAaA,SAAO,iBAAWI,MAAX,CAAkBN,QAAlB,CAAP;AACD;;AAEM,SAASX,KAAT,OAEJ;AAAA,MADDkB,KACC,QADDA,KACC;;AACDA,QAAMnB,GAAN,GAAY,UAAUG,IAAV,EAAgB;AAC1B,WAAOH,IAAI,IAAJ,EAAUG,IAAV,CAAP;AACD,GAFD;AAGA,SAAOgB,KAAP;AACD","file":"rx.js","sourcesContent":["import {\n Observable\n} from 'rxjs';\nimport Gun from 'gun/gun';\n\n// See https://github.com/staltz/xstream\nexport function $rx(node, opts = {}) {\n let id, name\n node.val(data => {\n id = Gun.node.soul(data)\n name = opts.name || id || 'unknown'\n })\n const op = opts.op || 'on'\n const log = function (...args) {\n if (opts.log) {\n console.log('rx:', name, ...args)\n }\n }\n\n // see Producer https://github.com/staltz/xstream#producer\n\n const observer = (listener) => {\n log('start')\n let eventListener = (event) => {\n if (listener.next) {\n log(event)\n listener.next(event)\n } else {\n throw new Error('Listener missing next(event) method')\n }\n }\n node[op](eventListener);\n }\n\n return Observable.create(observer)\n};\n\nexport function addRx({\n chain\n}) {\n chain.$rx = function (opts) {\n return $rx(this, opts)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/observable/xstream.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$xstream = $xstream; 7 | exports.addXStream = addXStream; 8 | 9 | var _xstream = require('xstream'); 10 | 11 | var _xstream2 = _interopRequireDefault(_xstream); 12 | 13 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 14 | 15 | // See https://github.com/staltz/xstream 16 | function $xstream(node) { 17 | var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 18 | 19 | var id = void 0, 20 | name = void 0; 21 | node.val(function (data) { 22 | id = Gun.node.soul(data); 23 | name = opts.name || id || 'unknown'; 24 | }); 25 | 26 | var op = opts.op || 'on'; 27 | var log = function log() { 28 | if (opts.log) { 29 | var _console; 30 | 31 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 32 | args[_key] = arguments[_key]; 33 | } 34 | 35 | (_console = console).log.apply(_console, ['xstream:', name].concat(args)); 36 | } 37 | }; 38 | 39 | // see Producer https://github.com/staltz/xstream#producer 40 | 41 | var producer = { 42 | start: function start(listener) { 43 | log('start'); 44 | var eventListener = function eventListener(event) { 45 | if (listener.next) { 46 | log('event', event); 47 | listener.next(event); 48 | } else { 49 | throw new Error('Listener missing next(event) method'); 50 | } 51 | }; 52 | node[op](eventListener); 53 | }, 54 | stop: function stop() {} 55 | }; 56 | 57 | return _xstream2.default.create(producer); 58 | }; 59 | 60 | function addXStream(_ref) { 61 | var chain = _ref.chain; 62 | 63 | chain.$xstream = function (opts) { 64 | return $xstream(this, opts); 65 | }; 66 | return chain; 67 | } 68 | //# sourceMappingURL=xstream.js.map 69 | -------------------------------------------------------------------------------- /edge/observable/xstream.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["observable/xstream.js"],"names":["$xstream","addXStream","node","opts","id","name","val","Gun","soul","data","op","log","args","producer","start","listener","eventListener","event","next","Error","stop","create","chain"],"mappings":";;;;;QAIgBA,Q,GAAAA,Q;QAmCAC,U,GAAAA,U;;AAvChB;;;;;;AAGA;AACO,SAASD,QAAT,CAAkBE,IAAlB,EAAmC;AAAA,MAAXC,IAAW,uEAAJ,EAAI;;AACxC,MAAIC,WAAJ;AAAA,MAAQC,aAAR;AACAH,OAAKI,GAAL,CAAS,gBAAQ;AACfF,SAAKG,IAAIL,IAAJ,CAASM,IAAT,CAAcC,IAAd,CAAL;AACAJ,WAAOF,KAAKE,IAAL,IAAaD,EAAb,IAAmB,SAA1B;AACD,GAHD;;AAKA,MAAMM,KAAKP,KAAKO,EAAL,IAAW,IAAtB;AACA,MAAMC,MAAM,SAANA,GAAM,GAAmB;AAC7B,QAAIR,KAAKQ,GAAT,EAAc;AAAA;;AAAA,wCADSC,IACT;AADSA,YACT;AAAA;;AACZ,2BAAQD,GAAR,kBAAY,UAAZ,EAAwBN,IAAxB,SAAiCO,IAAjC;AACD;AACF,GAJD;;AAMA;;AAEA,MAAMC,WAAW;AACfC,WAAO,eAACC,QAAD,EAAc;AACnBJ,UAAI,OAAJ;AACA,UAAIK,gBAAgB,SAAhBA,aAAgB,CAACC,KAAD,EAAW;AAC7B,YAAIF,SAASG,IAAb,EAAmB;AACjBP,cAAI,OAAJ,EAAaM,KAAb;AACAF,mBAASG,IAAT,CAAcD,KAAd;AACD,SAHD,MAGO;AACL,gBAAM,IAAIE,KAAJ,CAAU,qCAAV,CAAN;AACD;AACF,OAPD;AAQAjB,WAAKQ,EAAL,EAASM,aAAT;AACD,KAZc;AAafI,UAAM,gBAAM,CAAE;AAbC,GAAjB;;AAgBA,SAAO,kBAAGC,MAAH,CAAUR,QAAV,CAAP;AACD;;AAEM,SAASZ,UAAT,OAEJ;AAAA,MADDqB,KACC,QADDA,KACC;;AACDA,QAAMtB,QAAN,GAAiB,UAAUG,IAAV,EAAgB;AAC/B,WAAOH,SAAS,IAAT,EAAeG,IAAf,CAAP;AACD,GAFD;AAGA,SAAOmB,KAAP;AACD","file":"xstream.js","sourcesContent":["import xs from 'xstream';\n\n\n// See https://github.com/staltz/xstream\nexport function $xstream(node, opts = {}) {\n let id, name\n node.val(data => {\n id = Gun.node.soul(data)\n name = opts.name || id || 'unknown'\n })\n\n const op = opts.op || 'on'\n const log = function (...args) {\n if (opts.log) {\n console.log('xstream:', name, ...args)\n }\n }\n\n // see Producer https://github.com/staltz/xstream#producer\n\n const producer = {\n start: (listener) => {\n log('start')\n let eventListener = (event) => {\n if (listener.next) {\n log('event', event)\n listener.next(event)\n } else {\n throw new Error('Listener missing next(event) method')\n }\n }\n node[op](eventListener);\n },\n stop: () => {}\n }\n\n return xs.create(producer)\n};\n\nexport function addXStream({\n chain\n}) {\n chain.$xstream = function (opts) {\n return $xstream(this, opts)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/observable/zen.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.$zen = $zen; 7 | exports.addZen = addZen; 8 | 9 | var _zenObservable = require('zen-observable'); 10 | 11 | var _zenObservable2 = _interopRequireDefault(_zenObservable); 12 | 13 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 14 | 15 | // See https://github.com/staltz/xstream 16 | function $zen(node) { 17 | var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 18 | 19 | var id = void 0, 20 | name = void 0; 21 | node.val(function (data) { 22 | id = Gun.node.soul(data); 23 | name = opts.name || id || 'unknown'; 24 | }); 25 | 26 | var op = opts.op || 'on'; 27 | var log = function log() { 28 | if (opts.log) { 29 | var _console; 30 | 31 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 32 | args[_key] = arguments[_key]; 33 | } 34 | 35 | (_console = console).log.apply(_console, ['zen:', name].concat(args)); 36 | } 37 | }; 38 | 39 | // see Producer https://github.com/staltz/xstream#producer 40 | 41 | var observer = function observer(listener) { 42 | log('start'); 43 | var eventListener = function eventListener(event) { 44 | if (listener.next) { 45 | log('event', event); 46 | listener.next(event); 47 | } else { 48 | throw new Error('Listener missing next(event) method'); 49 | } 50 | }; 51 | node[op](eventListener); 52 | }; 53 | 54 | return new _zenObservable2.default(observer); 55 | }; 56 | 57 | function addZen(_ref) { 58 | var chain = _ref.chain; 59 | 60 | chain.$zen = function (opts) { 61 | return $zen(this, opts); 62 | }; 63 | return chain; 64 | } 65 | //# sourceMappingURL=zen.js.map 66 | -------------------------------------------------------------------------------- /edge/observable/zen.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["observable/zen.js"],"names":["$zen","addZen","node","opts","id","name","val","Gun","soul","data","op","log","args","observer","listener","eventListener","event","next","Error","chain"],"mappings":";;;;;QAGgBA,I,GAAAA,I;QAgCAC,M,GAAAA,M;;AAnChB;;;;;;AAEA;AACO,SAASD,IAAT,CAAcE,IAAd,EAA+B;AAAA,MAAXC,IAAW,uEAAJ,EAAI;;AACpC,MAAIC,WAAJ;AAAA,MAAQC,aAAR;AACAH,OAAKI,GAAL,CAAS,gBAAQ;AACfF,SAAKG,IAAIL,IAAJ,CAASM,IAAT,CAAcC,IAAd,CAAL;AACAJ,WAAOF,KAAKE,IAAL,IAAaD,EAAb,IAAmB,SAA1B;AACD,GAHD;;AAKA,MAAMM,KAAKP,KAAKO,EAAL,IAAW,IAAtB;AACA,MAAMC,MAAM,SAANA,GAAM,GAAmB;AAC7B,QAAIR,KAAKQ,GAAT,EAAc;AAAA;;AAAA,wCADSC,IACT;AADSA,YACT;AAAA;;AACZ,2BAAQD,GAAR,kBAAY,MAAZ,EAAoBN,IAApB,SAA6BO,IAA7B;AACD;AACF,GAJD;;AAMA;;AAEA,MAAMC,WAAW,SAAXA,QAAW,CAACC,QAAD,EAAc;AAC7BH,QAAI,OAAJ;AACA,QAAII,gBAAgB,SAAhBA,aAAgB,CAACC,KAAD,EAAW;AAC7B,UAAIF,SAASG,IAAb,EAAmB;AACjBN,YAAI,OAAJ,EAAaK,KAAb;AACAF,iBAASG,IAAT,CAAcD,KAAd;AACD,OAHD,MAGO;AACL,cAAM,IAAIE,KAAJ,CAAU,qCAAV,CAAN;AACD;AACF,KAPD;AAQAhB,SAAKQ,EAAL,EAASK,aAAT;AACD,GAXD;;AAaA,SAAO,4BAAeF,QAAf,CAAP;AACD;;AAEM,SAASZ,MAAT,OAEJ;AAAA,MADDkB,KACC,QADDA,KACC;;AACDA,QAAMnB,IAAN,GAAa,UAAUG,IAAV,EAAgB;AAC3B,WAAOH,KAAK,IAAL,EAAWG,IAAX,CAAP;AACD,GAFD;AAGA,SAAOgB,KAAP;AACD","file":"zen.js","sourcesContent":["import Observable from 'zen-observable';\n\n// See https://github.com/staltz/xstream\nexport function $zen(node, opts = {}) {\n let id, name\n node.val(data => {\n id = Gun.node.soul(data)\n name = opts.name || id || 'unknown'\n })\n\n const op = opts.op || 'on'\n const log = function (...args) {\n if (opts.log) {\n console.log('zen:', name, ...args)\n }\n }\n\n // see Producer https://github.com/staltz/xstream#producer\n\n const observer = (listener) => {\n log('start')\n let eventListener = (event) => {\n if (listener.next) {\n log('event', event)\n listener.next(event)\n } else {\n throw new Error('Listener missing next(event) method')\n }\n }\n node[op](eventListener);\n }\n\n return new Observable(observer)\n};\n\nexport function addZen({\n chain\n}) {\n chain.$zen = function (opts) {\n return $zen(this, opts)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/out.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _value = require('./value'); 4 | 5 | var instOf = function instOf() { 6 | var clazz = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Object; 7 | 8 | return function (val) { 9 | return val instanceof clazz; 10 | }; 11 | }; 12 | 13 | var notOriginator = function notOriginator(node, selfId) { 14 | return function (data) { 15 | return selfid !== node.soul(data); 16 | }; 17 | }; 18 | 19 | // // get('spouse').get('inout').val(cb) 20 | // async function calcOut(node, selfId, out, edge, v) { 21 | // const def = edge.get(out) 22 | // const propId = node.soul(v) 23 | // // // only if not referencing to self 24 | // if (propId !== selfId) { 25 | // return def 26 | // } else { 27 | // // find first other property that references a valid Object 28 | // let targetNode = await 29 | // return node.$mapReduce({ 30 | // filters: [ 31 | // instOf(Object), 32 | // notOriginator(node, selfId) 33 | // // type? 34 | // ] 35 | // }) 36 | 37 | // // return first field of filtered ones 38 | // let fields = await targetNode.$fields() 39 | // return fields[0] 40 | // } 41 | // } 42 | 43 | // /* 44 | // await gun.get('mark').out({ 45 | // spouse: 'bride' 46 | // }) 47 | // */ 48 | // export async function out(node, navigation) { 49 | // if (typeof navigation === 'string') { 50 | // navigation = { 51 | // [navigation]: navigation 52 | // } 53 | // } 54 | // const key = Object.keys(navigation)[0] 55 | // const out = Object.values(navigation)[0] 56 | 57 | // const selfId = node.soul(this) 58 | // const edge = this.get(key) 59 | 60 | // const edgeNode = await edge.valAsync() 61 | // let res = calcOut(node, selfId, out, edge, edgeNode) 62 | // return await res.valueAsync() 63 | // } 64 | //# sourceMappingURL=out.js.map 65 | -------------------------------------------------------------------------------- /edge/out.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["out.js"],"names":["instOf","clazz","Object","val","notOriginator","node","selfId","selfid","soul","data"],"mappings":";;AAAA;;AAIA,IAAMA,SAAS,SAATA,MAAS,GAAoB;AAAA,MAAnBC,KAAmB,uEAAXC,MAAW;;AACjC,SAAO,UAACC,GAAD,EAAS;AACd,WAAOA,eAAeF,KAAtB;AACD,GAFD;AAGD,CAJD;;AAMA,IAAMG,gBAAgB,SAAhBA,aAAgB,CAACC,IAAD,EAAOC,MAAP,EAAkB;AACtC,SAAO;AAAA,WAAQC,WAAWF,KAAKG,IAAL,CAAUC,IAAV,CAAnB;AAAA,GAAP;AACD,CAFD;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA","file":"out.js","sourcesContent":["import {\n addValue\n} from './value'\n\nconst instOf = (clazz = Object) => {\n return (val) => {\n return val instanceof clazz\n }\n}\n\nconst notOriginator = (node, selfId) => {\n return data => selfid !== node.soul(data)\n}\n\n// // get('spouse').get('inout').val(cb)\n// async function calcOut(node, selfId, out, edge, v) {\n// const def = edge.get(out)\n// const propId = node.soul(v)\n// // // only if not referencing to self\n// if (propId !== selfId) {\n// return def\n// } else {\n// // find first other property that references a valid Object\n// let targetNode = await\n// return node.$mapReduce({\n// filters: [\n// instOf(Object),\n// notOriginator(node, selfId)\n// // type?\n// ]\n// })\n\n// // return first field of filtered ones\n// let fields = await targetNode.$fields()\n// return fields[0]\n// }\n// }\n\n// /*\n// await gun.get('mark').out({\n// spouse: 'bride'\n// })\n// */\n// export async function out(node, navigation) {\n// if (typeof navigation === 'string') {\n// navigation = {\n// [navigation]: navigation\n// }\n// }\n// const key = Object.keys(navigation)[0]\n// const out = Object.values(navigation)[0]\n\n// const selfId = node.soul(this)\n// const edge = this.get(key)\n\n// const edgeNode = await edge.valAsync()\n// let res = calcOut(node, selfId, out, edge, edgeNode)\n// return await res.valueAsync()\n// }"]} -------------------------------------------------------------------------------- /edge/print.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.print = print; 7 | exports.addPrint = addPrint; 8 | 9 | var _value = require('./value'); 10 | 11 | function print(node, label, opt, log) { 12 | node.value(function (val) { 13 | label ? log(label, val) : log(val); 14 | }, opt); 15 | } 16 | 17 | function addPrint(_ref) { 18 | var chain = _ref.chain, 19 | Gun = _ref.Gun; 20 | 21 | (0, _value.addValue)(chain, Gun); 22 | var log = Gun.log || console.log; 23 | 24 | chain.print = function (label, opt) { 25 | print(this, label, opt, log); 26 | }; 27 | 28 | return chain; 29 | } 30 | //# sourceMappingURL=print.js.map 31 | -------------------------------------------------------------------------------- /edge/print.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["print.js"],"names":["print","addPrint","node","label","opt","log","value","val","chain","Gun","console"],"mappings":";;;;;QAIgBA,K,GAAAA,K;QAMAC,Q,GAAAA,Q;;AAVhB;;AAIO,SAASD,KAAT,CAAeE,IAAf,EAAqBC,KAArB,EAA4BC,GAA5B,EAAiCC,GAAjC,EAAsC;AAC3CH,OAAKI,KAAL,CAAW,eAAO;AAChBH,YAAQE,IAAIF,KAAJ,EAAWI,GAAX,CAAR,GAA0BF,IAAIE,GAAJ,CAA1B;AACD,GAFD,EAEGH,GAFH;AAGD;;AAEM,SAASH,QAAT,OAGJ;AAAA,MAFDO,KAEC,QAFDA,KAEC;AAAA,MADDC,GACC,QADDA,GACC;;AACD,uBAASD,KAAT,EAAgBC,GAAhB;AACA,MAAMJ,MAAMI,IAAIJ,GAAJ,IAAWK,QAAQL,GAA/B;;AAEAG,QAAMR,KAAN,GAAc,UAAUG,KAAV,EAAiBC,GAAjB,EAAsB;AAClCJ,UAAM,IAAN,EAAYG,KAAZ,EAAmBC,GAAnB,EAAwBC,GAAxB;AACD,GAFD;;AAIA,SAAOG,KAAP;AACD","file":"print.js","sourcesContent":["import {\n addValue\n} from './value'\n\nexport function print(node, label, opt, log) {\n node.value(val => {\n label ? log(label, val) : log(val)\n }, opt)\n}\n\nexport function addPrint({\n chain,\n Gun\n}) {\n addValue(chain, Gun)\n const log = Gun.log || console.log\n\n chain.print = function (label, opt) {\n print(this, label, opt, log)\n }\n\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/promise/fields.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _keys = require('babel-runtime/core-js/object/keys'); 8 | 9 | var _keys2 = _interopRequireDefault(_keys); 10 | 11 | var _promise = require('babel-runtime/core-js/promise'); 12 | 13 | var _promise2 = _interopRequireDefault(_promise); 14 | 15 | exports.$fields = $fields; 16 | exports.$addFields = $addFields; 17 | 18 | var _value = require('../value'); 19 | 20 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 21 | 22 | function $fields(node) { 23 | return new _promise2.default(function (resolve, reject) { 24 | node.value(function (v) { 25 | return resolve((0, _keys2.default)(v)); 26 | }); 27 | }); 28 | } 29 | 30 | function $addFields(_ref) { 31 | var chain = _ref.chain; 32 | 33 | (0, _value.addValue)({ 34 | chain: chain 35 | }); 36 | 37 | chain.$fields = function (cb, opt) { 38 | return $fields(this, cb, opt); 39 | }; 40 | return chain; 41 | } 42 | //# sourceMappingURL=fields.js.map 43 | -------------------------------------------------------------------------------- /edge/promise/fields.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["promise/fields.js"],"names":["$fields","$addFields","node","resolve","reject","value","v","chain","cb","opt"],"mappings":";;;;;;;;;;;;;;QAAgBA,O,GAAAA,O;QAUAC,U,GAAAA,U;;AAJhB;;;;AANO,SAASD,OAAT,CAAiBE,IAAjB,EAAuB;AAC5B,SAAO,sBAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CF,SAAKG,KAAL,CAAW;AAAA,aAAKF,QAAQ,oBAAYG,CAAZ,CAAR,CAAL;AAAA,KAAX;AACD,GAFM,CAAP;AAGD;;AAMM,SAASL,UAAT,OAEJ;AAAA,MADDM,KACC,QADDA,KACC;;AACD,uBAAS;AACPA;AADO,GAAT;;AAIAA,QAAMP,OAAN,GAAgB,UAAUQ,EAAV,EAAcC,GAAd,EAAmB;AACjC,WAAOT,QAAQ,IAAR,EAAcQ,EAAd,EAAkBC,GAAlB,CAAP;AACD,GAFD;AAGA,SAAOF,KAAP;AACD","file":"fields.js","sourcesContent":["export function $fields(node) {\n return new Promise(function (resolve, reject) {\n node.value(v => resolve(Object.keys(v)))\n });\n}\n\nimport {\n addValue\n} from '../value'\n\nexport function $addFields({\n chain,\n}) {\n addValue({\n chain\n })\n\n chain.$fields = function (cb, opt) {\n return $fields(this, cb, opt)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/promise/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.add = add; 7 | exports.$addPromise = $addPromise; 8 | 9 | var _fields = require('./fields'); 10 | 11 | var _mapReduce = require('./map-reduce'); 12 | 13 | var _val = require('./val'); 14 | 15 | var _value = require('./value'); 16 | 17 | var _timed = require('./timed'); 18 | 19 | var _no = require('./no'); 20 | 21 | var _recurse = require('./recurse'); 22 | 23 | var chains = { 24 | $addFields: _fields.$addFields, 25 | $addMapReduce: _mapReduce.$addMapReduce, 26 | $addNo: _no.$addNo, 27 | $addRecurse: _recurse.$addRecurse, 28 | $addVal: _val.$addVal, 29 | $addValue: _value.$addValue, 30 | $addTimed: _timed.$addTimed 31 | }; 32 | 33 | function capitalize(str) { 34 | return str.charAt(0).toUpperCase() + str.slice(1); 35 | } 36 | 37 | function add(Gun) { 38 | for (var _len = arguments.length, names = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 39 | names[_key - 1] = arguments[_key]; 40 | } 41 | 42 | names.forEach(function (name) { 43 | var nameCap = capitalize(name); 44 | var fun = '$add' + nameCap; 45 | chains[fun]({ 46 | chain: Gun.chain, 47 | Gun: Gun 48 | }); 49 | }); 50 | } 51 | 52 | var allNames = ['fields', 'mapReduce', 'val', 'value', 'timed', 'no', 'recurse']; 53 | 54 | function $addPromise(_ref) { 55 | var Gun = _ref.Gun; 56 | 57 | add.apply(undefined, [Gun].concat(allNames)); 58 | } 59 | 60 | exports.default = $addPromise; 61 | //# sourceMappingURL=index.js.map 62 | -------------------------------------------------------------------------------- /edge/promise/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["promise/index.js"],"names":["add","$addPromise","chains","$addFields","$addMapReduce","$addNo","$addRecurse","$addVal","$addValue","$addTimed","capitalize","str","charAt","toUpperCase","slice","Gun","names","forEach","nameCap","name","fun","chain","allNames"],"mappings":";;;;;QAoCgBA,G,GAAAA,G;QAqBAC,W,GAAAA,W;;AAzDhB;;AAGA;;AAGA;;AAGA;;AAGA;;AAGA;;AAGA;;AAIA,IAAMC,SAAS;AACbC,gCADa;AAEbC,yCAFa;AAGbC,oBAHa;AAIbC,mCAJa;AAKbC,uBALa;AAMbC,6BANa;AAObC;AAPa,CAAf;;AAUA,SAASC,UAAT,CAAoBC,GAApB,EAAyB;AACvB,SAAOA,IAAIC,MAAJ,CAAW,CAAX,EAAcC,WAAd,KAA8BF,IAAIG,KAAJ,CAAU,CAAV,CAArC;AACD;;AAEM,SAASd,GAAT,CAAae,GAAb,EAA4B;AAAA,oCAAPC,KAAO;AAAPA,SAAO;AAAA;;AACjCA,QAAMC,OAAN,CAAc,gBAAQ;AACpB,QAAIC,UAAUR,WAAWS,IAAX,CAAd;AACA,QAAIC,MAAM,SAASF,OAAnB;AACAhB,WAAOkB,GAAP,EAAY;AACVC,aAAON,IAAIM,KADD;AAEVN;AAFU,KAAZ;AAID,GAPD;AAQD;;AAED,IAAMO,WAAW,CACf,QADe,EAEf,WAFe,EAGf,KAHe,EAIf,OAJe,EAKf,OALe,EAMf,IANe,EAOf,SAPe,CAAjB;;AAUO,SAASrB,WAAT,OAEJ;AAAA,MADDc,GACC,QADDA,GACC;;AACDf,wBAAIe,GAAJ,SAAYO,QAAZ;AACD;;kBAEcrB,W","file":"index.js","sourcesContent":["import {\n $addFields\n} from './fields'\nimport {\n $addMapReduce\n} from './map-reduce'\nimport {\n $addVal\n} from './val'\nimport {\n $addValue\n} from './value'\nimport {\n $addTimed\n} from './timed'\nimport {\n $addNo\n} from './no'\nimport {\n $addRecurse\n} from './recurse'\n\nconst chains = {\n $addFields,\n $addMapReduce,\n $addNo,\n $addRecurse,\n $addVal,\n $addValue,\n $addTimed\n}\n\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function add(Gun, ...names) {\n names.forEach(name => {\n let nameCap = capitalize(name)\n let fun = '$add' + nameCap\n chains[fun]({\n chain: Gun.chain,\n Gun\n })\n })\n}\n\nconst allNames = [\n 'fields',\n 'mapReduce',\n 'val',\n 'value',\n 'timed',\n 'no',\n 'recurse'\n]\n\nexport function $addPromise({\n Gun\n}) {\n add(Gun, ...allNames)\n}\n\nexport default $addPromise"]} -------------------------------------------------------------------------------- /edge/promise/map-reduce.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _regenerator = require('babel-runtime/regenerator'); 8 | 9 | var _regenerator2 = _interopRequireDefault(_regenerator); 10 | 11 | var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); 12 | 13 | var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); 14 | 15 | var _promise = require('babel-runtime/core-js/promise'); 16 | 17 | var _promise2 = _interopRequireDefault(_promise); 18 | 19 | exports.$mapReduce = $mapReduce; 20 | exports.$addMapReduce = $addMapReduce; 21 | 22 | var _mapReduce = require('../map-reduce'); 23 | 24 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 25 | 26 | function $mapReduce(node, options, putCb, opt) { 27 | return new _promise2.default(function (resolve, reject) { 28 | node.mapReduce(options, resolve, putCb, opt); 29 | }); 30 | } 31 | 32 | function $addMapReduce(_ref) { 33 | var chain = _ref.chain; 34 | 35 | (0, _mapReduce.addMapReduce)({ 36 | chain: chain 37 | }); 38 | 39 | chain.$mapReduce = function () { 40 | var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(options, putCb, opt) { 41 | return _regenerator2.default.wrap(function _callee$(_context) { 42 | while (1) { 43 | switch (_context.prev = _context.next) { 44 | case 0: 45 | _context.next = 2; 46 | return $mapReduce(this, options, putCb, opt); 47 | 48 | case 2: 49 | return _context.abrupt('return', _context.sent); 50 | 51 | case 3: 52 | case 'end': 53 | return _context.stop(); 54 | } 55 | } 56 | }, _callee, this); 57 | })); 58 | 59 | return function (_x, _x2, _x3) { 60 | return _ref2.apply(this, arguments); 61 | }; 62 | }(); 63 | return chain; 64 | } 65 | //# sourceMappingURL=map-reduce.js.map 66 | -------------------------------------------------------------------------------- /edge/promise/map-reduce.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["promise/map-reduce.js"],"names":["$mapReduce","$addMapReduce","node","options","putCb","opt","resolve","reject","mapReduce","chain"],"mappings":";;;;;;;;;;;;;;;;;;QAIgBA,U,GAAAA,U;QAMAC,a,GAAAA,a;;AAVhB;;;;AAIO,SAASD,UAAT,CAAoBE,IAApB,EAA0BC,OAA1B,EAAmCC,KAAnC,EAA0CC,GAA1C,EAA+C;AACpD,SAAO,sBAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CL,SAAKM,SAAL,CAAeL,OAAf,EAAwBG,OAAxB,EAAiCF,KAAjC,EAAwCC,GAAxC;AACD,GAFM,CAAP;AAGD;;AAEM,SAASJ,aAAT,OAEJ;AAAA,MADDQ,KACC,QADDA,KACC;;AACD,+BAAa;AACXA;AADW,GAAb;;AAIAA,QAAMT,UAAN;AAAA,2EAAmB,iBAAgBG,OAAhB,EAAyBC,KAAzB,EAAgCC,GAAhC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBACJL,WAAW,IAAX,EAAiBG,OAAjB,EAA0BC,KAA1B,EAAiCC,GAAjC,CADI;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAnB;;AAAA;AAAA;AAAA;AAAA;AAGA,SAAOI,KAAP;AACD","file":"map-reduce.js","sourcesContent":["import {\n addMapReduce\n} from '../map-reduce'\n\nexport function $mapReduce(node, options, putCb, opt) {\n return new Promise(function (resolve, reject) {\n node.mapReduce(options, resolve, putCb, opt)\n })\n}\n\nexport function $addMapReduce({\n chain\n}) {\n addMapReduce({\n chain\n })\n\n chain.$mapReduce = async function (options, putCb, opt) {\n return await $mapReduce(this, options, putCb, opt)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/promise/no.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _regenerator = require("babel-runtime/regenerator"); 8 | 9 | var _regenerator2 = _interopRequireDefault(_regenerator); 10 | 11 | var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator"); 12 | 13 | var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); 14 | 15 | var _promise = require("babel-runtime/core-js/promise"); 16 | 17 | var _promise2 = _interopRequireDefault(_promise); 18 | 19 | exports.$no = $no; 20 | exports.$addNo = $addNo; 21 | 22 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 23 | 24 | function $no(node) { 25 | return new _promise2.default(function (resolve, reject) { 26 | node.no(resolve); 27 | }); 28 | } 29 | 30 | function $addNo(_ref) { 31 | var chain = _ref.chain; 32 | 33 | chain.$no = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() { 34 | return _regenerator2.default.wrap(function _callee$(_context) { 35 | while (1) { 36 | switch (_context.prev = _context.next) { 37 | case 0: 38 | _context.next = 2; 39 | return $no(this); 40 | 41 | case 2: 42 | return _context.abrupt("return", _context.sent); 43 | 44 | case 3: 45 | case "end": 46 | return _context.stop(); 47 | } 48 | } 49 | }, _callee, this); 50 | })); 51 | return chain; 52 | } 53 | //# sourceMappingURL=no.js.map 54 | -------------------------------------------------------------------------------- /edge/promise/no.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["promise/no.js"],"names":["$no","$addNo","node","resolve","reject","no","chain"],"mappings":";;;;;;;;;;;;;;;;;;QAAgBA,G,GAAAA,G;QAMAC,M,GAAAA,M;;;;AANT,SAASD,GAAT,CAAaE,IAAb,EAAmB;AACxB,SAAO,sBAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CF,SAAKG,EAAL,CAAQF,OAAR;AACD,GAFM,CAAP;AAGD;;AAEM,SAASF,MAAT,OAEJ;AAAA,MADDK,KACC,QADDA,KACC;;AACDA,QAAMN,GAAN,8DAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBACGA,IAAI,IAAJ,CADH;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAZ;AAGA,SAAOM,KAAP;AACD","file":"no.js","sourcesContent":["export function $no(node) {\n return new Promise(function (resolve, reject) {\n node.no(resolve)\n })\n}\n\nexport function $addNo({\n chain\n}) {\n chain.$no = async function () {\n return await $no(this)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/promise/recurse.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _regenerator = require("babel-runtime/regenerator"); 8 | 9 | var _regenerator2 = _interopRequireDefault(_regenerator); 10 | 11 | var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator"); 12 | 13 | var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); 14 | 15 | var _promise = require("babel-runtime/core-js/promise"); 16 | 17 | var _promise2 = _interopRequireDefault(_promise); 18 | 19 | exports.$recurse = $recurse; 20 | exports.$addRecurse = $addRecurse; 21 | 22 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 23 | 24 | function $recurse(node, filter) { 25 | return new _promise2.default(function (resolve, reject) { 26 | node.recurse(resolve, filter); 27 | }); 28 | } 29 | 30 | function $addRecurse(_ref) { 31 | var chain = _ref.chain; 32 | 33 | chain.$recurse = function () { 34 | var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(filter) { 35 | return _regenerator2.default.wrap(function _callee$(_context) { 36 | while (1) { 37 | switch (_context.prev = _context.next) { 38 | case 0: 39 | _context.next = 2; 40 | return $recurse(this, filter); 41 | 42 | case 2: 43 | return _context.abrupt("return", _context.sent); 44 | 45 | case 3: 46 | case "end": 47 | return _context.stop(); 48 | } 49 | } 50 | }, _callee, this); 51 | })); 52 | 53 | return function (_x) { 54 | return _ref2.apply(this, arguments); 55 | }; 56 | }(); 57 | return chain; 58 | } 59 | //# sourceMappingURL=recurse.js.map 60 | -------------------------------------------------------------------------------- /edge/promise/recurse.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["promise/recurse.js"],"names":["$recurse","$addRecurse","node","filter","resolve","reject","recurse","chain"],"mappings":";;;;;;;;;;;;;;;;;;QAAgBA,Q,GAAAA,Q;QAMAC,W,GAAAA,W;;;;AANT,SAASD,QAAT,CAAkBE,IAAlB,EAAwBC,MAAxB,EAAgC;AACrC,SAAO,sBAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CH,SAAKI,OAAL,CAAaF,OAAb,EAAsBD,MAAtB;AACD,GAFM,CAAP;AAGD;;AAEM,SAASF,WAAT,OAEJ;AAAA,MADDM,KACC,QADDA,KACC;;AACDA,QAAMP,QAAN;AAAA,2EAAiB,iBAAgBG,MAAhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBACFH,SAAS,IAAT,EAAeG,MAAf,CADE;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAjB;;AAAA;AAAA;AAAA;AAAA;AAGA,SAAOI,KAAP;AACD","file":"recurse.js","sourcesContent":["export function $recurse(node, filter) {\n return new Promise(function (resolve, reject) {\n node.recurse(resolve, filter)\n })\n}\n\nexport function $addRecurse({\n chain\n}) {\n chain.$recurse = async function (filter) {\n return await $recurse(this, filter)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/promise/timed.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _assign = require('babel-runtime/core-js/object/assign'); 8 | 9 | var _assign2 = _interopRequireDefault(_assign); 10 | 11 | var _promise = require('babel-runtime/core-js/promise'); 12 | 13 | var _promise2 = _interopRequireDefault(_promise); 14 | 15 | exports.$timed = $timed; 16 | exports.$addTimed = $addTimed; 17 | 18 | var _timed = require('../timed'); 19 | 20 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 21 | 22 | function $timed(node) { 23 | var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 24 | 25 | return new _promise2.default(function (resolve, reject) { 26 | opts = (0, _assign2.default)(opts, { 27 | cb: resolve 28 | }); 29 | (0, _timed.timed)(node, opts); 30 | }); 31 | } 32 | 33 | function $addTimed(_ref) { 34 | var chain = _ref.chain; 35 | 36 | chain.$timed = function (opts) { 37 | return $timed(this, opts); 38 | }; 39 | return chain; 40 | } 41 | //# sourceMappingURL=timed.js.map 42 | -------------------------------------------------------------------------------- /edge/promise/timed.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["promise/timed.js"],"names":["$timed","$addTimed","node","opts","resolve","reject","cb","chain"],"mappings":";;;;;;;;;;;;;;QAIgBA,M,GAAAA,M;QASAC,S,GAAAA,S;;AAbhB;;;;AAIO,SAASD,MAAT,CAAgBE,IAAhB,EAAiC;AAAA,MAAXC,IAAW,uEAAJ,EAAI;;AACtC,SAAO,sBAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CF,WAAO,sBAAcA,IAAd,EAAoB;AACzBG,UAAIF;AADqB,KAApB,CAAP;AAGA,sBAAMF,IAAN,EAAYC,IAAZ;AACD,GALM,CAAP;AAMD;;AAEM,SAASF,SAAT,OAEJ;AAAA,MADDM,KACC,QADDA,KACC;;AACDA,QAAMP,MAAN,GAAe,UAAUG,IAAV,EAAgB;AAC7B,WAAOH,OAAO,IAAP,EAAaG,IAAb,CAAP;AACD,GAFD;AAGA,SAAOI,KAAP;AACD","file":"timed.js","sourcesContent":["import {\n timed\n} from '../timed'\n\nexport function $timed(node, opts = {}) {\n return new Promise(function (resolve, reject) {\n opts = Object.assign(opts, {\n cb: resolve\n })\n timed(node, opts)\n })\n}\n\nexport function $addTimed({\n chain\n}) {\n chain.$timed = function (opts) {\n return $timed(this, opts)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/promise/val.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _promise = require("babel-runtime/core-js/promise"); 8 | 9 | var _promise2 = _interopRequireDefault(_promise); 10 | 11 | exports.$val = $val; 12 | exports.$addVal = $addVal; 13 | 14 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 15 | 16 | function $val(node, opt) { 17 | return new _promise2.default(function (resolve, reject) { 18 | node.val(resolve, opt); 19 | }); 20 | } 21 | 22 | function $addVal(_ref) { 23 | var chain = _ref.chain; 24 | 25 | chain.$val = function (opt) { 26 | return $val(this, opt); 27 | }; 28 | return chain; 29 | } 30 | //# sourceMappingURL=val.js.map 31 | -------------------------------------------------------------------------------- /edge/promise/val.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["promise/val.js"],"names":["$val","$addVal","node","opt","resolve","reject","val","chain"],"mappings":";;;;;;;;;;QAAgBA,I,GAAAA,I;QAMAC,O,GAAAA,O;;;;AANT,SAASD,IAAT,CAAcE,IAAd,EAAoBC,GAApB,EAAyB;AAC9B,SAAO,sBAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CH,SAAKI,GAAL,CAASF,OAAT,EAAkBD,GAAlB;AACD,GAFM,CAAP;AAGD;;AAEM,SAASF,OAAT,OAEJ;AAAA,MADDM,KACC,QADDA,KACC;;AACDA,QAAMP,IAAN,GAAa,UAAUG,GAAV,EAAe;AAC1B,WAAOH,KAAK,IAAL,EAAWG,GAAX,CAAP;AACD,GAFD;AAGA,SAAOI,KAAP;AACD","file":"val.js","sourcesContent":["export function $val(node, opt) {\n return new Promise(function (resolve, reject) {\n node.val(resolve, opt)\n })\n}\n\nexport function $addVal({\n chain\n}) {\n chain.$val = function (opt) {\n return $val(this, opt)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/promise/value.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _promise = require('babel-runtime/core-js/promise'); 8 | 9 | var _promise2 = _interopRequireDefault(_promise); 10 | 11 | exports.$value = $value; 12 | exports.$valueAt = $valueAt; 13 | exports.$addValue = $addValue; 14 | 15 | var _gun = require('gun/gun'); 16 | 17 | var _gun2 = _interopRequireDefault(_gun); 18 | 19 | var _value = require('../value'); 20 | 21 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 22 | 23 | function $value(node, opt) { 24 | return new _promise2.default(function (resolve, reject) { 25 | node.value(resolve, opt); 26 | }); 27 | } 28 | 29 | function $valueAt(node, at, opt) { 30 | var path = node.path(at); 31 | if (path) { 32 | return path.$value(opt); 33 | } else { 34 | throw new Error('No such path ' + at); 35 | } 36 | } 37 | 38 | function $addValue(_ref) { 39 | var chain = _ref.chain; 40 | 41 | (0, _value.addValue)({ 42 | chain: chain 43 | }); 44 | 45 | chain.$value = function (opt) { 46 | return $value(this, opt); 47 | }; 48 | 49 | chain.$valueAt = function (opt) { 50 | return $valueAt(this, opt); 51 | }; 52 | return chain; 53 | } 54 | //# sourceMappingURL=value.js.map 55 | -------------------------------------------------------------------------------- /edge/promise/value.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["promise/value.js"],"names":["$value","$valueAt","$addValue","node","opt","resolve","reject","value","at","path","Error","chain"],"mappings":";;;;;;;;;;QAEgBA,M,GAAAA,M;QAMAC,Q,GAAAA,Q;QAaAC,S,GAAAA,S;;AArBhB;;;;AAiBA;;;;AAfO,SAASF,MAAT,CAAgBG,IAAhB,EAAsBC,GAAtB,EAA2B;AAChC,SAAO,sBAAY,UAAUC,OAAV,EAAmBC,MAAnB,EAA2B;AAC5CH,SAAKI,KAAL,CAAWF,OAAX,EAAoBD,GAApB;AACD,GAFM,CAAP;AAGD;;AAEM,SAASH,QAAT,CAAkBE,IAAlB,EAAwBK,EAAxB,EAA4BJ,GAA5B,EAAiC;AACtC,MAAIK,OAAON,KAAKM,IAAL,CAAUD,EAAV,CAAX;AACA,MAAIC,IAAJ,EAAU;AACR,WAAOA,KAAKT,MAAL,CAAYI,GAAZ,CAAP;AACD,GAFD,MAEO;AACL,UAAM,IAAIM,KAAJ,mBAA0BF,EAA1B,CAAN;AACD;AACF;;AAMM,SAASN,SAAT,OAEJ;AAAA,MADDS,KACC,QADDA,KACC;;AACD,uBAAS;AACPA;AADO,GAAT;;AAIAA,QAAMX,MAAN,GAAe,UAAUI,GAAV,EAAe;AAC5B,WAAOJ,OAAO,IAAP,EAAaI,GAAb,CAAP;AACD,GAFD;;AAIAO,QAAMV,QAAN,GAAiB,UAAUG,GAAV,EAAe;AAC9B,WAAOH,SAAS,IAAT,EAAeG,GAAf,CAAP;AACD,GAFD;AAGA,SAAOO,KAAP;AACD","file":"value.js","sourcesContent":["import Gun from 'gun/gun'\n\nexport function $value(node, opt) {\n return new Promise(function (resolve, reject) {\n node.value(resolve, opt)\n })\n}\n\nexport function $valueAt(node, at, opt) {\n let path = node.path(at)\n if (path) {\n return path.$value(opt)\n } else {\n throw new Error(`No such path ${at}`)\n }\n}\n\nimport {\n addValue\n} from '../value'\n\nexport function $addValue({\n chain\n}) {\n addValue({\n chain\n })\n\n chain.$value = function (opt) {\n return $value(this, opt)\n }\n\n chain.$valueAt = function (opt) {\n return $valueAt(this, opt)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/put.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.putAt = putAt; 7 | exports.addPut = addPut; 8 | function putAt(node, at, obj, cb, opt) { 9 | var pathNode = node.path(at); 10 | if (pathNode) { 11 | node._.paths = node._.paths || []; 12 | pathNode.put(obj, cb, opt); 13 | node._.paths.push(at); 14 | } else { 15 | throw new Error("No such path " + at); 16 | } 17 | } 18 | 19 | function addPut(_ref) { 20 | var chain = _ref.chain; 21 | 22 | chain.putAt = function (at, obj, cb, opt) { 23 | return putAt(this, at, obj, cb, opt); 24 | }; 25 | 26 | chain.paths = function () { 27 | return this._.paths || []; 28 | }; 29 | 30 | return chain; 31 | } 32 | //# sourceMappingURL=put.js.map 33 | -------------------------------------------------------------------------------- /edge/put.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["put.js"],"names":["putAt","addPut","node","at","obj","cb","opt","pathNode","path","_","paths","put","push","Error","chain"],"mappings":";;;;;QAAgBA,K,GAAAA,K;QAWAC,M,GAAAA,M;AAXT,SAASD,KAAT,CAAeE,IAAf,EAAqBC,EAArB,EAAyBC,GAAzB,EAA8BC,EAA9B,EAAkCC,GAAlC,EAAuC;AAC5C,MAAIC,WAAWL,KAAKM,IAAL,CAAUL,EAAV,CAAf;AACA,MAAII,QAAJ,EAAc;AACZL,SAAKO,CAAL,CAAOC,KAAP,GAAeR,KAAKO,CAAL,CAAOC,KAAP,IAAgB,EAA/B;AACAH,aAASI,GAAT,CAAaP,GAAb,EAAkBC,EAAlB,EAAsBC,GAAtB;AACAJ,SAAKO,CAAL,CAAOC,KAAP,CAAaE,IAAb,CAAkBT,EAAlB;AACD,GAJD,MAIO;AACL,UAAM,IAAIU,KAAJ,mBAA0BV,EAA1B,CAAN;AACD;AACF;;AAEM,SAASF,MAAT,OAEJ;AAAA,MADDa,KACC,QADDA,KACC;;AACDA,QAAMd,KAAN,GAAc,UAAUG,EAAV,EAAcC,GAAd,EAAmBC,EAAnB,EAAuBC,GAAvB,EAA4B;AACxC,WAAON,MAAM,IAAN,EAAYG,EAAZ,EAAgBC,GAAhB,EAAqBC,EAArB,EAAyBC,GAAzB,CAAP;AACD,GAFD;;AAIAQ,QAAMJ,KAAN,GAAc,YAAY;AACxB,WAAO,KAAKD,CAAL,CAAOC,KAAP,IAAgB,EAAvB;AACD,GAFD;;AAIA,SAAOI,KAAP;AACD","file":"put.js","sourcesContent":["export function putAt(node, at, obj, cb, opt) {\n let pathNode = node.path(at)\n if (pathNode) {\n node._.paths = node._.paths || []\n pathNode.put(obj, cb, opt)\n node._.paths.push(at)\n } else {\n throw new Error(`No such path ${at}`)\n }\n}\n\nexport function addPut({\n chain\n}) {\n chain.putAt = function (at, obj, cb, opt) {\n return putAt(this, at, obj, cb, opt)\n }\n\n chain.paths = function () {\n return this._.paths || []\n }\n\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/recurse.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.recurse = recurse; 7 | exports.addRecurse = addRecurse; 8 | function recurse(node, cb, filter) { 9 | if (!(filter instanceof Object)) { 10 | filter = {}; 11 | } 12 | node.val(cb); 13 | node.map().val(function (data) { 14 | if (!(data instanceof Object)) { 15 | return; 16 | } 17 | var soul = node.soul(data); 18 | if (filter[soul]) { 19 | return; 20 | } 21 | filter[soul] = true; 22 | this.recurse(cb, filter); 23 | }); 24 | return node; 25 | }; 26 | 27 | function addRecurse(_ref) { 28 | var chain = _ref.chain; 29 | 30 | chain.recurse = function (cb, filter) { 31 | return recurse(this, cb, filter); 32 | }; 33 | 34 | return chain; 35 | } 36 | //# sourceMappingURL=recurse.js.map 37 | -------------------------------------------------------------------------------- /edge/recurse.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["recurse.js"],"names":["recurse","addRecurse","node","cb","filter","Object","val","map","data","soul","chain"],"mappings":";;;;;QAAgBA,O,GAAAA,O;QAmBAC,U,GAAAA,U;AAnBT,SAASD,OAAT,CAAiBE,IAAjB,EAAuBC,EAAvB,EAA2BC,MAA3B,EAAmC;AACxC,MAAI,EAAEA,kBAAkBC,MAApB,CAAJ,EAAiC;AAC/BD,aAAS,EAAT;AACD;AACDF,OAAKI,GAAL,CAASH,EAAT;AACAD,OAAKK,GAAL,GAAWD,GAAX,CAAe,UAAUE,IAAV,EAAgB;AAC7B,QAAI,EAAEA,gBAAgBH,MAAlB,CAAJ,EAA+B;AAC7B;AACD;AACD,QAAII,OAAOP,KAAKO,IAAL,CAAUD,IAAV,CAAX;AACA,QAAIJ,OAAOK,IAAP,CAAJ,EAAkB;AAChB;AACD;AACDL,WAAOK,IAAP,IAAe,IAAf;AACA,SAAKT,OAAL,CAAaG,EAAb,EAAiBC,MAAjB;AACD,GAVD;AAWA,SAAOF,IAAP;AACD;;AAEM,SAASD,UAAT,OAEJ;AAAA,MADDS,KACC,QADDA,KACC;;AACDA,QAAMV,OAAN,GAAgB,UAAUG,EAAV,EAAcC,MAAd,EAAsB;AACpC,WAAOJ,QAAQ,IAAR,EAAcG,EAAd,EAAkBC,MAAlB,CAAP;AACD,GAFD;;AAIA,SAAOM,KAAP;AACD","file":"recurse.js","sourcesContent":["export function recurse(node, cb, filter) {\n if (!(filter instanceof Object)) {\n filter = {};\n }\n node.val(cb);\n node.map().val(function (data) {\n if (!(data instanceof Object)) {\n return;\n }\n var soul = node.soul(data);\n if (filter[soul]) {\n return;\n }\n filter[soul] = true;\n this.recurse(cb, filter);\n });\n return node;\n};\n\nexport function addRecurse({\n chain\n}) {\n chain.recurse = function (cb, filter) {\n return recurse(this, cb, filter)\n }\n\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/set.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.setAt = setAt; 7 | exports.addSet = addSet; 8 | function setAt(node, at, cb, opt) { 9 | var pathNode = node.path(at); 10 | if (pathNode) { 11 | pathNode.set(cb, opt); 12 | } else { 13 | throw new Error("No such path " + at); 14 | } 15 | } 16 | 17 | function addSet(_ref) { 18 | var chain = _ref.chain; 19 | 20 | chain.setAt = function (cb, opt) { 21 | return setAt(this, cb, opt); 22 | }; 23 | return chain; 24 | } 25 | //# sourceMappingURL=set.js.map 26 | -------------------------------------------------------------------------------- /edge/set.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["set.js"],"names":["setAt","addSet","node","at","cb","opt","pathNode","path","set","Error","chain"],"mappings":";;;;;QAAgBA,K,GAAAA,K;QASAC,M,GAAAA,M;AATT,SAASD,KAAT,CAAeE,IAAf,EAAqBC,EAArB,EAAyBC,EAAzB,EAA6BC,GAA7B,EAAkC;AACvC,MAAIC,WAAWJ,KAAKK,IAAL,CAAUJ,EAAV,CAAf;AACA,MAAIG,QAAJ,EAAc;AACZA,aAASE,GAAT,CAAaJ,EAAb,EAAiBC,GAAjB;AACD,GAFD,MAEO;AACL,UAAM,IAAII,KAAJ,mBAA0BN,EAA1B,CAAN;AACD;AACF;;AAEM,SAASF,MAAT,OAEJ;AAAA,MADDS,KACC,QADDA,KACC;;AACDA,QAAMV,KAAN,GAAc,UAAUI,EAAV,EAAcC,GAAd,EAAmB;AAC/B,WAAOL,MAAM,IAAN,EAAYI,EAAZ,EAAgBC,GAAhB,CAAP;AACD,GAFD;AAGA,SAAOK,KAAP;AACD","file":"set.js","sourcesContent":["export function setAt(node, at, cb, opt) {\n let pathNode = node.path(at)\n if (pathNode) {\n pathNode.set(cb, opt)\n } else {\n throw new Error(`No such path ${at}`)\n }\n}\n\nexport function addSet({\n chain\n}) {\n chain.setAt = function (cb, opt) {\n return setAt(this, cb, opt)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/soul.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.addSoul = addSoul; 7 | 8 | var _gun = require('gun/gun'); 9 | 10 | var _gun2 = _interopRequireDefault(_gun); 11 | 12 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 13 | 14 | function addSoul(_ref) { 15 | var chain = _ref.chain; 16 | 17 | chain.soul = function () { 18 | return _gun2.default.node.soul(this); 19 | }; 20 | return chain; 21 | } 22 | //# sourceMappingURL=soul.js.map 23 | -------------------------------------------------------------------------------- /edge/soul.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["soul.js"],"names":["addSoul","chain","soul","node"],"mappings":";;;;;QAEgBA,O,GAAAA,O;;AAFhB;;;;;;AAEO,SAASA,OAAT,OAEJ;AAAA,MADDC,KACC,QADDA,KACC;;AACDA,QAAMC,IAAN,GAAa,YAAY;AACvB,WAAO,cAAIC,IAAJ,CAASD,IAAT,CAAc,IAAd,CAAP;AACD,GAFD;AAGA,SAAOD,KAAP;AACD","file":"soul.js","sourcesContent":["import Gun from 'gun/gun'\n\nexport function addSoul({\n chain\n}) {\n chain.soul = function () {\n return Gun.node.soul(this)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/timed.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _assign = require('babel-runtime/core-js/object/assign'); 8 | 9 | var _assign2 = _interopRequireDefault(_assign); 10 | 11 | exports.timed = timed; 12 | exports.addTimed = addTimed; 13 | 14 | var _gun = require('gun/gun'); 15 | 16 | var _gun2 = _interopRequireDefault(_gun); 17 | 18 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 19 | 20 | function timed(node) { 21 | var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 22 | 23 | var id = void 0, 24 | name = void 0; 25 | node.val(function (data) { 26 | id = _gun2.default.node.soul(data); 27 | name = opts.name || id || 'unknown'; 28 | }); 29 | 30 | console.log('TIMED', opts); 31 | 32 | var log = function log() { 33 | if (opts.log || opts.logging) { 34 | var _console; 35 | 36 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 37 | args[_key] = arguments[_key]; 38 | } 39 | 40 | (_console = console).log.apply(_console, ['timed:', name].concat(args)); 41 | } 42 | }; 43 | 44 | if (typeof opts === 'function') { 45 | opts = { 46 | cb: opts 47 | }; 48 | } 49 | 50 | recurseTimed(opts); 51 | 52 | function recurseTimed(opts) { 53 | var cb = opts.cb, 54 | nextObj = opts.nextObj, 55 | nextOpts = opts.nextOpts, 56 | stopCondition = opts.stopCondition, 57 | operation = opts.operation, 58 | logging = opts.logging, 59 | _opts$interval = opts.interval, 60 | interval = _opts$interval === undefined ? 100 : _opts$interval, 61 | _opts$num = opts.num, 62 | num = _opts$num === undefined ? 0 : _opts$num, 63 | _opts$maxNum = opts.maxNum, 64 | maxNum = _opts$maxNum === undefined ? 10 : _opts$maxNum; 65 | 66 | 67 | var defaultStop = function defaultStop(_ref, opts) { 68 | var num = _ref.num; 69 | 70 | return num > maxNum; 71 | }; 72 | var defaultNextObj = function defaultNextObj(num, opts) { 73 | return { 74 | num: num + 1 75 | }; 76 | }; 77 | 78 | var defaultNextOpts = function defaultNextOpts(opts, num) { 79 | return (0, _assign2.default)(opts, { 80 | num: num 81 | }); 82 | }; 83 | 84 | var defaultOp = function defaultOp(node, obj, opts) { 85 | log('put', obj); 86 | node.put(obj); 87 | }; 88 | 89 | nextObj = nextObj || defaultNextObj; 90 | nextOpts = nextOpts || defaultNextOpts; 91 | stopCondition = stopCondition || defaultStop; 92 | operation = operation || defaultOp; 93 | 94 | setTimeout(function () { 95 | var obj = (0, _assign2.default)(nextObj(num, opts)); 96 | operation(node, obj, opts); 97 | if (stopCondition(obj, opts)) { 98 | if (cb) { 99 | cb(num); 100 | } else { 101 | console.error('timed: Missing cb to stop', opts); 102 | process.exit(1); 103 | } 104 | } 105 | 106 | recurseTimed(nextOpts(opts, obj.num)); 107 | }, interval); 108 | } 109 | } 110 | 111 | function addTimed(_ref2) { 112 | var chain = _ref2.chain; 113 | 114 | chain.timed = function (opts) { 115 | return timed(this, opts); 116 | }; 117 | return chain; 118 | } 119 | //# sourceMappingURL=timed.js.map 120 | -------------------------------------------------------------------------------- /edge/timed.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["timed.js"],"names":["timed","addTimed","node","opts","id","name","val","soul","data","console","log","logging","args","cb","recurseTimed","nextObj","nextOpts","stopCondition","operation","interval","num","maxNum","defaultStop","defaultNextObj","defaultNextOpts","defaultOp","obj","put","setTimeout","error","process","exit","chain"],"mappings":";;;;;;;;;;QAEgBA,K,GAAAA,K;QAiFAC,Q,GAAAA,Q;;AAnFhB;;;;;;AAEO,SAASD,KAAT,CAAeE,IAAf,EAAgC;AAAA,MAAXC,IAAW,uEAAJ,EAAI;;AACrC,MAAIC,WAAJ;AAAA,MAAQC,aAAR;AACAH,OAAKI,GAAL,CAAS,gBAAQ;AACfF,SAAK,cAAIF,IAAJ,CAASK,IAAT,CAAcC,IAAd,CAAL;AACAH,WAAOF,KAAKE,IAAL,IAAaD,EAAb,IAAmB,SAA1B;AACD,GAHD;;AAKAK,UAAQC,GAAR,CAAY,OAAZ,EAAqBP,IAArB;;AAEA,MAAMO,MAAM,SAANA,GAAM,GAAmB;AAC7B,QAAIP,KAAKO,GAAL,IAAYP,KAAKQ,OAArB,EAA8B;AAAA;;AAAA,wCADPC,IACO;AADPA,YACO;AAAA;;AAC5B,2BAAQF,GAAR,kBAAY,QAAZ,EAAsBL,IAAtB,SAA+BO,IAA/B;AACD;AACF,GAJD;;AAMA,MAAI,OAAOT,IAAP,KAAgB,UAApB,EAAgC;AAC9BA,WAAO;AACLU,UAAIV;AADC,KAAP;AAGD;;AAEDW,eAAaX,IAAb;;AAEA,WAASW,YAAT,CAAsBX,IAAtB,EAA4B;AAAA,QAGxBU,EAHwB,GAYtBV,IAZsB,CAGxBU,EAHwB;AAAA,QAIxBE,OAJwB,GAYtBZ,IAZsB,CAIxBY,OAJwB;AAAA,QAKxBC,QALwB,GAYtBb,IAZsB,CAKxBa,QALwB;AAAA,QAMxBC,aANwB,GAYtBd,IAZsB,CAMxBc,aANwB;AAAA,QAOxBC,SAPwB,GAYtBf,IAZsB,CAOxBe,SAPwB;AAAA,QAQxBP,OARwB,GAYtBR,IAZsB,CAQxBQ,OARwB;AAAA,yBAYtBR,IAZsB,CASxBgB,QATwB;AAAA,QASxBA,QATwB,kCASb,GATa;AAAA,oBAYtBhB,IAZsB,CAUxBiB,GAVwB;AAAA,QAUxBA,GAVwB,6BAUlB,CAVkB;AAAA,uBAYtBjB,IAZsB,CAWxBkB,MAXwB;AAAA,QAWxBA,MAXwB,gCAWf,EAXe;;;AAc1B,QAAIC,cAAc,SAAdA,WAAc,OAEfnB,IAFe,EAEN;AAAA,UADViB,GACU,QADVA,GACU;;AACV,aAAOA,MAAMC,MAAb;AACD,KAJD;AAKA,QAAIE,iBAAiB,SAAjBA,cAAiB,CAACH,GAAD,EAAMjB,IAAN,EAAe;AAClC,aAAO;AACLiB,aAAKA,MAAM;AADN,OAAP;AAGD,KAJD;;AAMA,QAAII,kBAAkB,SAAlBA,eAAkB,CAACrB,IAAD,EAAOiB,GAAP,EAAe;AACnC,aAAO,sBAAcjB,IAAd,EAAoB;AACzBiB;AADyB,OAApB,CAAP;AAGD,KAJD;;AAMA,QAAIK,YAAY,SAAZA,SAAY,CAACvB,IAAD,EAAOwB,GAAP,EAAYvB,IAAZ,EAAqB;AACnCO,UAAI,KAAJ,EAAWgB,GAAX;AACAxB,WAAKyB,GAAL,CAASD,GAAT;AACD,KAHD;;AAKAX,cAAUA,WAAWQ,cAArB;AACAP,eAAWA,YAAYQ,eAAvB;AACAP,oBAAgBA,iBAAiBK,WAAjC;AACAJ,gBAAYA,aAAaO,SAAzB;;AAEAG,eAAW,YAAM;AACf,UAAIF,MAAM,sBAAcX,QAAQK,GAAR,EAAajB,IAAb,CAAd,CAAV;AACAe,gBAAUhB,IAAV,EAAgBwB,GAAhB,EAAqBvB,IAArB;AACA,UAAIc,cAAcS,GAAd,EAAmBvB,IAAnB,CAAJ,EAA8B;AAC5B,YAAIU,EAAJ,EAAQ;AACNA,aAAGO,GAAH;AACD,SAFD,MAEO;AACLX,kBAAQoB,KAAR,CAAc,2BAAd,EAA2C1B,IAA3C;AACA2B,kBAAQC,IAAR,CAAa,CAAb;AACD;AACF;;AAEDjB,mBAAaE,SAASb,IAAT,EAAeuB,IAAIN,GAAnB,CAAb;AACD,KAbD,EAaGD,QAbH;AAcD;AACF;;AAEM,SAASlB,QAAT,QAEJ;AAAA,MADD+B,KACC,SADDA,KACC;;AACDA,QAAMhC,KAAN,GAAc,UAAUG,IAAV,EAAgB;AAC5B,WAAOH,MAAM,IAAN,EAAYG,IAAZ,CAAP;AACD,GAFD;AAGA,SAAO6B,KAAP;AACD","file":"timed.js","sourcesContent":["import Gun from 'gun/gun';\n\nexport function timed(node, opts = {}) {\n let id, name\n node.val(data => {\n id = Gun.node.soul(data)\n name = opts.name || id || 'unknown'\n })\n\n console.log('TIMED', opts)\n\n const log = function (...args) {\n if (opts.log || opts.logging) {\n console.log('timed:', name, ...args)\n }\n }\n\n if (typeof opts === 'function') {\n opts = {\n cb: opts\n }\n }\n\n recurseTimed(opts)\n\n function recurseTimed(opts) {\n\n let {\n cb,\n nextObj,\n nextOpts,\n stopCondition,\n operation,\n logging,\n interval = 100,\n num = 0,\n maxNum = 10\n } = opts\n\n let defaultStop = ({\n num\n }, opts) => {\n return num > maxNum\n }\n let defaultNextObj = (num, opts) => {\n return {\n num: num + 1\n }\n }\n\n let defaultNextOpts = (opts, num) => {\n return Object.assign(opts, {\n num\n })\n }\n\n let defaultOp = (node, obj, opts) => {\n log('put', obj)\n node.put(obj)\n }\n\n nextObj = nextObj || defaultNextObj\n nextOpts = nextOpts || defaultNextOpts\n stopCondition = stopCondition || defaultStop\n operation = operation || defaultOp\n\n setTimeout(() => {\n let obj = Object.assign(nextObj(num, opts))\n operation(node, obj, opts)\n if (stopCondition(obj, opts)) {\n if (cb) {\n cb(num)\n } else {\n console.error('timed: Missing cb to stop', opts)\n process.exit(1)\n }\n }\n\n recurseTimed(nextOpts(opts, obj.num))\n }, interval)\n }\n}\n\nexport function addTimed({\n chain\n}) {\n chain.timed = function (opts) {\n return timed(this, opts)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/utils/pubsub.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | var events = exports.events = function () { 7 | var topics = {}; 8 | var hOP = topics.hasOwnProperty; 9 | 10 | return { 11 | subscribe: function subscribe(topic, listener) { 12 | // Create the topic's object if not yet created 13 | if (!hOP.call(topics, topic)) topics[topic] = []; 14 | 15 | // Add the listener to queue 16 | var index = topics[topic].push(listener) - 1; 17 | 18 | // Provide handle back for removal of topic 19 | return { 20 | remove: function remove() { 21 | delete topics[topic][index]; 22 | } 23 | }; 24 | }, 25 | publish: function publish(topic, info) { 26 | // If the topic doesn't exist, or there's no listeners in queue, just leave 27 | if (!hOP.call(topics, topic)) return; 28 | 29 | // Cycle through topics queue, fire! 30 | topics[topic].forEach(function (item) { 31 | item(info != undefined ? info : {}); 32 | }); 33 | } 34 | }; 35 | }(); 36 | //# sourceMappingURL=pubsub.js.map 37 | -------------------------------------------------------------------------------- /edge/utils/pubsub.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["utils/pubsub.js"],"names":["events","topics","hOP","hasOwnProperty","subscribe","topic","listener","call","index","push","remove","publish","info","forEach","item","undefined"],"mappings":";;;;;AAAO,IAAMA,0BAAU,YAAY;AACjC,MAAIC,SAAS,EAAb;AACA,MAAIC,MAAMD,OAAOE,cAAjB;;AAEA,SAAO;AACLC,eAAW,mBAAUC,KAAV,EAAiBC,QAAjB,EAA2B;AACpC;AACA,UAAI,CAACJ,IAAIK,IAAJ,CAASN,MAAT,EAAiBI,KAAjB,CAAL,EAA8BJ,OAAOI,KAAP,IAAgB,EAAhB;;AAE9B;AACA,UAAIG,QAAQP,OAAOI,KAAP,EAAcI,IAAd,CAAmBH,QAAnB,IAA+B,CAA3C;;AAEA;AACA,aAAO;AACLI,gBAAQ,kBAAY;AAClB,iBAAOT,OAAOI,KAAP,EAAcG,KAAd,CAAP;AACD;AAHI,OAAP;AAKD,KAdI;AAeLG,aAAS,iBAAUN,KAAV,EAAiBO,IAAjB,EAAuB;AAC9B;AACA,UAAI,CAACV,IAAIK,IAAJ,CAASN,MAAT,EAAiBI,KAAjB,CAAL,EAA8B;;AAE9B;AACAJ,aAAOI,KAAP,EAAcQ,OAAd,CAAsB,UAAUC,IAAV,EAAgB;AACpCA,aAAKF,QAAQG,SAAR,GAAoBH,IAApB,GAA2B,EAAhC;AACD,OAFD;AAGD;AAvBI,GAAP;AAyBD,CA7BqB,EAAf","file":"pubsub.js","sourcesContent":["export const events = (function () {\n var topics = {};\n var hOP = topics.hasOwnProperty;\n\n return {\n subscribe: function (topic, listener) {\n // Create the topic's object if not yet created\n if (!hOP.call(topics, topic)) topics[topic] = [];\n\n // Add the listener to queue\n var index = topics[topic].push(listener) - 1;\n\n // Provide handle back for removal of topic\n return {\n remove: function () {\n delete topics[topic][index];\n }\n };\n },\n publish: function (topic, info) {\n // If the topic doesn't exist, or there's no listeners in queue, just leave\n if (!hOP.call(topics, topic)) return;\n\n // Cycle through topics queue, fire!\n topics[topic].forEach(function (item) {\n item(info != undefined ? info : {});\n });\n }\n };\n})();"]} -------------------------------------------------------------------------------- /edge/value.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.value = value; 7 | exports.valueAt = valueAt; 8 | exports.valAt = valAt; 9 | exports.addValue = addValue; 10 | 11 | var _gun = require('gun/gun'); 12 | 13 | var _gun2 = _interopRequireDefault(_gun); 14 | 15 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 16 | 17 | function value(node, cb, opt) { 18 | return node.val(function (val, field) { 19 | var v = _gun2.default.obj.copy(val); 20 | delete v._; 21 | cb.call(this, v, field); 22 | }, opt); 23 | } 24 | 25 | function valueAt(node, at, cb, opt) { 26 | var pathNode = node.path(at); 27 | if (pathNode) { 28 | value(pathNode, cb, opt); 29 | } else { 30 | throw new Error('No such path ' + at); 31 | } 32 | } 33 | 34 | function valAt(node, at, cb, opt) { 35 | var pathNode = node.path(at); 36 | if (pathNode) { 37 | pathNode.val(cb, opt); 38 | } else { 39 | throw new Error('No such path ' + at); 40 | } 41 | } 42 | 43 | function addValue(_ref) { 44 | var chain = _ref.chain; 45 | 46 | chain.value = function (cb, opt) { 47 | return value(this, cb, opt); 48 | }; 49 | 50 | chain.valueAt = function (at, cb, opt) { 51 | return valueAt(this, at, cb, opt); 52 | }; 53 | 54 | chain.valAt = function (at, cb, opt) { 55 | return valAt(this, at, cb, opt); 56 | }; 57 | 58 | return chain; 59 | } 60 | //# sourceMappingURL=value.js.map 61 | -------------------------------------------------------------------------------- /edge/value.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["value.js"],"names":["value","valueAt","valAt","addValue","node","cb","opt","val","field","v","obj","copy","_","call","at","pathNode","path","Error","chain"],"mappings":";;;;;QAEgBA,K,GAAAA,K;QAQAC,O,GAAAA,O;QASAC,K,GAAAA,K;QASAC,Q,GAAAA,Q;;AA5BhB;;;;;;AAEO,SAASH,KAAT,CAAeI,IAAf,EAAqBC,EAArB,EAAyBC,GAAzB,EAA8B;AACnC,SAAOF,KAAKG,GAAL,CAAS,UAAUA,GAAV,EAAeC,KAAf,EAAsB;AACpC,QAAIC,IAAI,cAAIC,GAAJ,CAAQC,IAAR,CAAaJ,GAAb,CAAR;AACA,WAAOE,EAAEG,CAAT;AACAP,OAAGQ,IAAH,CAAQ,IAAR,EAAcJ,CAAd,EAAiBD,KAAjB;AACD,GAJM,EAIJF,GAJI,CAAP;AAKD;;AAEM,SAASL,OAAT,CAAiBG,IAAjB,EAAuBU,EAAvB,EAA2BT,EAA3B,EAA+BC,GAA/B,EAAoC;AACzC,MAAIS,WAAWX,KAAKY,IAAL,CAAUF,EAAV,CAAf;AACA,MAAIC,QAAJ,EAAc;AACZf,UAAMe,QAAN,EAAgBV,EAAhB,EAAoBC,GAApB;AACD,GAFD,MAEO;AACL,UAAM,IAAIW,KAAJ,mBAA0BH,EAA1B,CAAN;AACD;AACF;;AAEM,SAASZ,KAAT,CAAeE,IAAf,EAAqBU,EAArB,EAAyBT,EAAzB,EAA6BC,GAA7B,EAAkC;AACvC,MAAIS,WAAWX,KAAKY,IAAL,CAAUF,EAAV,CAAf;AACA,MAAIC,QAAJ,EAAc;AACZA,aAASR,GAAT,CAAaF,EAAb,EAAiBC,GAAjB;AACD,GAFD,MAEO;AACL,UAAM,IAAIW,KAAJ,mBAA0BH,EAA1B,CAAN;AACD;AACF;;AAEM,SAASX,QAAT,OAEJ;AAAA,MADDe,KACC,QADDA,KACC;;AACDA,QAAMlB,KAAN,GAAc,UAAUK,EAAV,EAAcC,GAAd,EAAmB;AAC/B,WAAON,MAAM,IAAN,EAAYK,EAAZ,EAAgBC,GAAhB,CAAP;AACD,GAFD;;AAIAY,QAAMjB,OAAN,GAAgB,UAAUa,EAAV,EAAcT,EAAd,EAAkBC,GAAlB,EAAuB;AACrC,WAAOL,QAAQ,IAAR,EAAca,EAAd,EAAkBT,EAAlB,EAAsBC,GAAtB,CAAP;AACD,GAFD;;AAIAY,QAAMhB,KAAN,GAAc,UAAUY,EAAV,EAAcT,EAAd,EAAkBC,GAAlB,EAAuB;AACnC,WAAOJ,MAAM,IAAN,EAAYY,EAAZ,EAAgBT,EAAhB,EAAoBC,GAApB,CAAP;AACD,GAFD;;AAIA,SAAOY,KAAP;AACD","file":"value.js","sourcesContent":["import Gun from 'gun/gun'\n\nexport function value(node, cb, opt) {\n return node.val(function (val, field) {\n let v = Gun.obj.copy(val)\n delete v._\n cb.call(this, v, field)\n }, opt);\n}\n\nexport function valueAt(node, at, cb, opt) {\n let pathNode = node.path(at)\n if (pathNode) {\n value(pathNode, cb, opt)\n } else {\n throw new Error(`No such path ${at}`)\n }\n}\n\nexport function valAt(node, at, cb, opt) {\n let pathNode = node.path(at)\n if (pathNode) {\n pathNode.val(cb, opt)\n } else {\n throw new Error(`No such path ${at}`)\n }\n}\n\nexport function addValue({\n chain\n}) {\n chain.value = function (cb, opt) {\n return value(this, cb, opt)\n }\n\n chain.valueAt = function (at, cb, opt) {\n return valueAt(this, at, cb, opt)\n }\n\n chain.valAt = function (at, cb, opt) {\n return valAt(this, at, cb, opt)\n }\n\n return chain\n}"]} -------------------------------------------------------------------------------- /edge/xstream/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.stream = stream; 7 | exports.addStream = addStream; 8 | 9 | var _xstream = require('xstream'); 10 | 11 | var _xstream2 = _interopRequireDefault(_xstream); 12 | 13 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 14 | 15 | function stream(node) { 16 | return _xstream2.default.create({ 17 | start: function start(listener) { 18 | var eventListener = function eventListener(event) { 19 | return listener.next(event); 20 | }; 21 | node.on(eventListener); 22 | }, 23 | stop: function stop() {} 24 | }); 25 | }; 26 | 27 | function addStream(_ref) { 28 | var chain = _ref.chain; 29 | 30 | chain.stream = function () { 31 | return stream(this); 32 | }; 33 | return chain; 34 | } 35 | //# sourceMappingURL=index.js.map 36 | -------------------------------------------------------------------------------- /edge/xstream/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["xstream/index.js"],"names":["stream","addStream","node","create","start","listener","eventListener","event","next","on","stop","chain"],"mappings":";;;;;QAEgBA,M,GAAAA,M;QAYAC,S,GAAAA,S;;AAdhB;;;;;;AAEO,SAASD,MAAT,CAAgBE,IAAhB,EAAsB;AAC3B,SAAO,kBAAGC,MAAH,CAAU;AACfC,WAAO,eAACC,QAAD,EAAc;AACnB,UAAIC,gBAAgB,SAAhBA,aAAgB,CAACC,KAAD,EAAW;AAC7B,eAAOF,SAASG,IAAT,CAAcD,KAAd,CAAP;AACD,OAFD;AAGAL,WAAKO,EAAL,CAAQH,aAAR;AACD,KANc;AAOfI,UAAM,gBAAM,CAAE;AAPC,GAAV,CAAP;AASD;;AAEM,SAAST,SAAT,OAEJ;AAAA,MADDU,KACC,QADDA,KACC;;AACDA,QAAMX,MAAN,GAAe,YAAY;AACzB,WAAOA,OAAO,IAAP,CAAP;AACD,GAFD;AAGA,SAAOW,KAAP;AACD","file":"index.js","sourcesContent":["import xs from 'xstream';\n\nexport function stream(node) {\n return xs.create({\n start: (listener) => {\n let eventListener = (event) => {\n return listener.next(event);\n };\n node.on(eventListener);\n },\n stop: () => {}\n })\n};\n\nexport function addStream({\n chain\n}) {\n chain.stream = function () {\n return stream(this)\n }\n return chain\n}"]} -------------------------------------------------------------------------------- /examples/app/css/main.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | font-family: monospace; 4 | padding: 0; 5 | margin: 0; 6 | } 7 | 8 | html { 9 | background: #333; 10 | } 11 | 12 | ul { 13 | list-style-type: none; 14 | } -------------------------------------------------------------------------------- /examples/app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Gun edge 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require("gulp"); 2 | var babel = require("gulp-babel"); 3 | var livereload = require('gulp-livereload'); 4 | var sourcemaps = require('gulp-sourcemaps'); 5 | 6 | gulp.task('build', function () { 7 | return gulp.src('src/**/*.js') 8 | .pipe(sourcemaps.init()) 9 | .pipe(babel()) 10 | .pipe(sourcemaps.write('.')) 11 | .pipe(gulp.dest('edge')) 12 | }); 13 | 14 | gulp.task('build:play', function () { 15 | return gulp.src('play/es6/*.js') 16 | .pipe(sourcemaps.init()) 17 | .pipe(babel()) 18 | .pipe(sourcemaps.write('.')) 19 | .pipe(gulp.dest('play/es5')) 20 | }); 21 | 22 | gulp.task('watch:play', function () { 23 | livereload.listen(); 24 | gulp.watch('play/es6/*.js', ['build:play']); 25 | }); 26 | 27 | gulp.task('start', function () { 28 | return gulp.src('src/**/*.js') 29 | .pipe(sourcemaps.init()) 30 | .pipe(babel()) 31 | .pipe(sourcemaps.write('.')) 32 | .pipe(gulp.dest('edge')) 33 | .pipe(livereload()); 34 | }); 35 | 36 | gulp.task('watch', function () { 37 | livereload.listen(); 38 | gulp.watch('src/*.js', ['start']); 39 | }); 40 | 41 | gulp.task('watch:b', function () { 42 | livereload.listen(); 43 | gulp.watch('src/*.js', ['build']); 44 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gun-edge", 3 | "version": "0.8.8", 4 | "description": "Gun chain extensions for a higher level DSL and API", 5 | "main": "edge/index.js", 6 | "scripts": { 7 | "test": "ava", 8 | "watch": "gulp watch", 9 | "watch:b": "gulp watch:b", 10 | "start": "gulp start", 11 | "build": "gulp build", 12 | "watch:play": "gulp watch:play", 13 | "build:play": "gulp build:play" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/kristianmandrup/gun-edge.git" 18 | }, 19 | "keywords": [ 20 | "gun", 21 | "edge", 22 | "db", 23 | "dsl", 24 | "api", 25 | "extension", 26 | "chaining" 27 | ], 28 | "author": "Kristian Mandrup ", 29 | "license": "MIT", 30 | "dependencies": { 31 | "gun": "^0.6.6" 32 | }, 33 | "devDependencies": { 34 | "ava": "^0.18.2", 35 | "babel-cli": "^6.24.0", 36 | "babel-plugin-transform-runtime": "^6.23.0", 37 | "babel-preset-es2015": "^6.22.0", 38 | "babel-preset-latest": "^6.24.0", 39 | "gulp": "^3.9.1", 40 | "gulp-babel": "^6.1.2", 41 | "gulp-livereload": "^3.8.1", 42 | "gulp-sourcemaps": "^2.4.0", 43 | "js-csp": "^0.9.2", 44 | "rxjs": "^5.2.0", 45 | "transducers-js": "^0.4.174", 46 | "xstream": "^10.3.0", 47 | "zen-observable": "^0.5.1" 48 | }, 49 | "ava": { 50 | "source": [ 51 | "src/**/*.{js}", 52 | "!dist/**/*" 53 | ], 54 | "modules": false, 55 | "require": [ 56 | "babel-register" 57 | ], 58 | "babel": "inherit" 59 | } 60 | } -------------------------------------------------------------------------------- /sandbox/edge.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | import '../src' 4 | 5 | const gun = Gun(); 6 | 7 | var amber = gun.get('amber').put({ 8 | name: "amber" 9 | }); 10 | var mark = gun.get('mark').put({ 11 | name: "mark" 12 | }); 13 | var edge = gun.put({ 14 | married: 2014 15 | }); 16 | 17 | import '../src/value' 18 | import '../src/async/val' 19 | 20 | const cb = node => node 21 | 22 | edge.get('inout').put(amber); 23 | edge.get('outin').put(mark); 24 | amber.get('spouse').put(edge); 25 | mark.get('spouse').put(edge); 26 | 27 | Gun.chain.valAsync = function (opt) { 28 | var self = this 29 | return new Promise(function (resolve, reject) { 30 | self.val(resolve, opt) 31 | }); 32 | } 33 | 34 | Gun.chain.valueAsync = function (opt) { 35 | var self = this 36 | return new Promise(function (resolve, reject) { 37 | self.value(resolve, opt) 38 | }); 39 | } 40 | 41 | // test('valueAsync', async t => { 42 | // let amberAwait = await gun.get('mark').get('spouse').get('inout').valueAsync() 43 | // let amberThen = gun.get('mark').get('spouse').get('inout').valueAsync() 44 | // .then(v => { 45 | // console.log('value', v) 46 | // t.is(amberAwait, v) 47 | // }) 48 | // console.log('amberAwait', amberAwait) 49 | // t.is(amberAwait.name, 'amber') 50 | // }) 51 | 52 | // import '../src/filter' 53 | 54 | // test('filter', async t => { 55 | // // return a reference to amber. 56 | // let colors = gun.get('colors').put({ 57 | // violet: true, 58 | // red: true, 59 | // green: false 60 | // }) //.valueAsync() 61 | 62 | // let goodColors = await colors.filter(c => c === true) 63 | // console.log('goodColors', goodColors) 64 | 65 | // }) 66 | 67 | // test('out', async t => { 68 | // // return a reference to amber. 69 | // let amberLong = await gun.get('mark').get('spouse').get('inout').valueAsync() 70 | // let amberShort = await gun.get('mark').out({ 71 | // spouse: 'inout' 72 | // }) 73 | // console.log('long', amberLong) 74 | // console.log('short', amberShort) 75 | // t.is(amberLong, amberShort) 76 | // }) -------------------------------------------------------------------------------- /sandbox/edges.js: -------------------------------------------------------------------------------- 1 | // Import the gun library 2 | var Gun = require('gun'); 3 | 4 | // Create a new gun instance 5 | var gun = Gun(); 6 | 7 | var amber = gun.get('amber').put({ 8 | name: "amber" 9 | }); 10 | var mark = gun.get('mark').put({ 11 | name: "mark" 12 | }); 13 | var edge = gun.put({ 14 | married: 2014 15 | }); 16 | edge.get('inout').put(amber); 17 | edge.get('outin').put(mark); 18 | amber.get('spouse').put(edge); 19 | mark.get('spouse').put(edge); 20 | 21 | console.log('AMBER', amber) 22 | console.log('EDGE', edge) 23 | console.log('MARK', mark) 24 | 25 | const cb = (val) => { 26 | console.log(val) 27 | } 28 | 29 | gun.get('amber').get('spouse').get('outin').val(cb) 30 | 31 | // shorthand 32 | // gun.get('amber').out('spouse') 33 | 34 | gun.get('mark').get('spouse').get('inout').val(cb) 35 | // shorthand 36 | // gun.get('mark').out('spouse') -------------------------------------------------------------------------------- /sandbox/hello.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Hello World - GUN 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /sandbox/hello.js: -------------------------------------------------------------------------------- 1 | // Import the gun library 2 | var Gun = require('gun'); 3 | 4 | // Create a new gun instance 5 | var gun = Gun(); 6 | 7 | // Read `greetings`, saving it to a variable. 8 | var greetings = gun.get('greetings'); 9 | 10 | // Update the value on `greetings`. 11 | greetings.put({ 12 | hello: 'world', 13 | }) 14 | 15 | // Print the value! 16 | greetings.on(function (update) { 17 | console.log('Update:', update) 18 | }) -------------------------------------------------------------------------------- /sandbox/keys.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | const gun = Gun(); 5 | 6 | test('keys', t => { 7 | var data = gun.get('data').put({ 8 | violet: true, 9 | green: false 10 | }) 11 | console.log('data', data) 12 | 13 | data.map().on(msg => { 14 | console.log(Object.keys(msg)) 15 | }) 16 | }) -------------------------------------------------------------------------------- /sandbox/level.json: -------------------------------------------------------------------------------- 1 | { 2 | // package.json 3 | "dependencies": { 4 | "gun-level": "^4.0.1", 5 | "level": "^1.6.0", 6 | "levelgraph": "^2.0.1", 7 | "levelgraph-jsonld": "^1.0.3" 8 | } 9 | } -------------------------------------------------------------------------------- /sandbox/map-reduce-simulator.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | JS Bin 8 | 9 | 10 | 11 | JSBin example 12 | 13 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /sandbox/play.js: -------------------------------------------------------------------------------- 1 | localStorage.clear(); 2 | // Read https://github.com/amark/gun/wiki/Graphs 3 | 4 | var gun = Gun(); 5 | 6 | var alice = gun.get('person/alice').put({ 7 | name: 'alice', 8 | age: 22 9 | }); 10 | var bob = gun.get('person/bob').put({ 11 | name: 'bob', 12 | age: 24 13 | }); 14 | var carl = gun.get('person/carl').put({ 15 | name: 'carl', 16 | age: 16 17 | }); 18 | var dave = gun.get('person/dave').put({ 19 | name: 'dave', 20 | age: 42 21 | }); 22 | 23 | alice.on(function (node) { 24 | //console.log('Subscribed to Alice!', node); 25 | }); 26 | 27 | gun.get('person/bob').val(function (node) { 28 | //console.log('Bob!', node); 29 | }); 30 | 31 | var people = gun.get('people'); 32 | people.set(alice); 33 | people.set(bob); 34 | people.set(carl); 35 | people.set(dave); 36 | 37 | people.map().val(function (person) { 38 | //console.log("The person is", person); 39 | }); 40 | 41 | var company = gun.get('startup/hype').put({ 42 | name: "hype", 43 | profitable: false, 44 | address: { 45 | street: "123 Hipster Lane", 46 | city: "San Francisco", 47 | state: "CA", 48 | country: "USA" 49 | } 50 | }); 51 | 52 | company.val(function (startup) { 53 | //console.log("The startup:", startup); 54 | }); 55 | 56 | company.path('address.city').val(function (value, field) { 57 | //console.log("What is the city?", value); 58 | }); 59 | 60 | gun.get('startup/hype').put({ // or you could do `company.put({` instead. 61 | funded: true, 62 | address: { 63 | street: "999 Expensive Boulevard" 64 | } 65 | }); 66 | 67 | var employees = company.path('employees'); 68 | employees.set(dave); 69 | employees.set(alice); 70 | employees.set(bob); 71 | 72 | alice.path('spouse').put(bob); 73 | bob.path('spouse').put(alice); 74 | 75 | alice.path('spouse').path('employer').put(company); 76 | alice.path('employer').put(company); 77 | 78 | dave.path('kids').set(carl); 79 | carl.path('dad').put(dave); 80 | 81 | carl.path('friends').set(alice); 82 | carl.path('friends').set(bob); 83 | 84 | gun.get('person/alice').path('spouse.employer.employees').map().path('name').val(function (data, key) { 85 | console.log("The employee's", key, data); 86 | }); -------------------------------------------------------------------------------- /src/all.js: -------------------------------------------------------------------------------- 1 | import addPromise from './promise' 2 | import addObservable from './observable' 3 | import { 4 | addCsp 5 | } from './channel/csp' 6 | import { 7 | addCount 8 | } from './count' 9 | import { 10 | addDate 11 | } from './date' 12 | import { 13 | addEach 14 | } from './each' 15 | // import { addEdge } from './edge' 16 | 17 | import { 18 | addFields 19 | } from './fields' 20 | // import { 21 | // addFilter 22 | // } from './filter' 23 | import { 24 | addPrint 25 | } from './print' 26 | import { 27 | addLive 28 | } from './live' 29 | import { 30 | addTimed 31 | } from './timed' 32 | import { 33 | addLocal 34 | } from './local' 35 | import { 36 | addMapReduce 37 | } from './map-reduce' 38 | import { 39 | addNo 40 | } from './no' 41 | // import { 42 | // addOut 43 | // } from './out' 44 | import { 45 | addRecurse 46 | } from './recurse' 47 | import { 48 | addPut 49 | } from './put' 50 | import { 51 | addSet 52 | } from './set' 53 | import { 54 | addSoul 55 | } from './soul' 56 | import { 57 | addValue 58 | } from './value' 59 | 60 | const chains = { 61 | addPromise, 62 | addObservable, 63 | addCsp, 64 | addCount, 65 | addDate, 66 | addEach, 67 | addFields, 68 | addPrint, 69 | addLive, 70 | addTimed, 71 | addLocal, 72 | addMapReduce, 73 | addNo, 74 | addPut, 75 | addRecurse, 76 | addSet, 77 | addSoul, 78 | addValue 79 | } 80 | 81 | function capitalize(str) { 82 | return str.charAt(0).toUpperCase() + str.slice(1); 83 | } 84 | 85 | export function add(Gun, ...names) { 86 | names.forEach(name => { 87 | let nameCap = capitalize(name) 88 | let fun = 'add' + nameCap 89 | chains[fun]({ 90 | chain: Gun.chain, 91 | Gun 92 | }) 93 | }) 94 | return Gun 95 | } 96 | 97 | const allNames = [ 98 | 'promise', 99 | 'observable', 100 | 'csp', 101 | 'date', 102 | 'each', 103 | 'fields', 104 | // 'filter', 105 | 'print', 106 | 'live', 107 | 'timed', 108 | 'local', 109 | 'mapReduce', 110 | 'no', 111 | // 'out', 112 | 'put', 113 | 'recurse', 114 | 'set', 115 | 'soul', 116 | 'value' 117 | ] 118 | 119 | export { 120 | addPromise, 121 | addObservable, 122 | addCsp, 123 | addDate, 124 | addEach, 125 | addFields, 126 | // addFilter, 127 | addPrint, 128 | addLive, 129 | addTimed, 130 | addLocal, 131 | addMapReduce, 132 | addNo, 133 | // addOut, 134 | addPut, 135 | addRecurse, 136 | addSet, 137 | addValue 138 | } 139 | 140 | export default function (Gun) { 141 | return add(Gun, ...allNames) 142 | } -------------------------------------------------------------------------------- /src/channel/csp.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun'; 2 | // import csp from 'js-csp' 3 | import { 4 | go 5 | // put, 6 | // putAsync 7 | } from 'js-csp' 8 | 9 | const csp = require('js-csp') 10 | 11 | // See https://github.com/ubolonton/js-csp/blob/master/doc/basic.md 12 | 13 | // See https://github.com/staltz/xstream 14 | export function $csp(node, opts = {}) { 15 | let id 16 | 17 | let { 18 | channel, 19 | buffer, 20 | name, 21 | condition, 22 | op = 'on', 23 | putOp = 'put' 24 | } = opts 25 | 26 | let bufferSize = 2 27 | let bufferType = 'fixed' 28 | 29 | if (buffer) { 30 | bufferSize = buffer.size || bufferSize 31 | bufferType = buffer.type || bufferType 32 | } 33 | 34 | buffer = buffer || csp.buffers[bufferType](bufferSize) 35 | 36 | let defaultChannel = (buffer) => csp.chan(buffer) 37 | 38 | channel = channel || defaultChannel(buffer) 39 | 40 | node.val(data => { 41 | id = Gun.node.soul(data) 42 | name = name || id || 'unknown' 43 | }) 44 | 45 | const log = function (...args) { 46 | if (opts.log) { 47 | console.log('rx:', name, ...args) 48 | } 49 | } 50 | 51 | let defaultPutCb = (event) => { 52 | log('event was put on channel :)') 53 | } 54 | let putCb = opts.putCb || defaultPutCb 55 | 56 | let defaultCondition = () => true 57 | condition = condition || defaultCondition 58 | 59 | let eventListener = function (event) { 60 | if (condition(event)) { 61 | log('Channel PUT', event) 62 | go(function* () { 63 | yield csp[putOp](channel, event, putCb) 64 | }) 65 | } 66 | } 67 | 68 | let lastValue 69 | node[op]((value) => { 70 | if (value !== lastValue) { 71 | log(op, 'new', value) 72 | eventListener(value) 73 | } else { 74 | log('.') 75 | } 76 | }); 77 | 78 | return channel 79 | } 80 | 81 | export function addCsp({ 82 | chain 83 | }) { 84 | chain.$csp = function (opts) { 85 | return $csp(this, opts) 86 | } 87 | return chain 88 | } -------------------------------------------------------------------------------- /src/count.js: -------------------------------------------------------------------------------- 1 | export function count(node, num) { 2 | if (typeof num === 'number') { 3 | node.path(Gun.text.random()).put(num); 4 | } 5 | if (typeof num === 'function') { 6 | var sum = 0; 7 | node.map().val(function (val) { 8 | num(sum += val); 9 | }); 10 | } 11 | return node; 12 | } 13 | 14 | export function addCount({ 15 | chain, 16 | Gun 17 | }) { 18 | chain.count = function (num) { 19 | return count(this, num) 20 | } 21 | return chain 22 | } -------------------------------------------------------------------------------- /src/date.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | 3 | export function date(node, data) { 4 | if (Gun.fns.is(data)) { 5 | return node.val(function (val) { 6 | data.call(this, new Date(val)); 7 | }) 8 | } 9 | return node.put(data.getTime()); 10 | } 11 | 12 | export function addDate({ 13 | chain 14 | }) { 15 | chain.date = function (data) { 16 | return date(node, data) 17 | } 18 | 19 | return chain 20 | } -------------------------------------------------------------------------------- /src/each.js: -------------------------------------------------------------------------------- 1 | export function each(node) { 2 | var each = node.map(); 3 | return node.val.apply(each, arguments) 4 | } 5 | 6 | export function addEach({ 7 | chain 8 | }) { 9 | chain.each = function (cb, opt) { 10 | return each(this) 11 | } 12 | return chain 13 | } -------------------------------------------------------------------------------- /src/edge.js: -------------------------------------------------------------------------------- 1 | // all you have to do in the out extension is case detect to traverse 2 | // to inout or outin based on where you came in from 3 | // (probably by checking the UUID/soul of the out node and making 4 | // sure it is !== to where you just came from) 5 | // and of course having another wrapper method around 6 | // setting/adding edges would be nice too, maybe like gun.edge(data) 7 | // to complement gun.out(property) 8 | 9 | // oh, and of course don't forget to mark.spouse = edge; amber.spouse = edge 10 | // (oh, and stupid comment, make sure to make edge have a edge.type = "edge" 11 | // so you can type check against it internally and know it is an edge "node" not a 12 | // regular node) 13 | // (this is the primary reason edges aren't built into gun, cause there 14 | // is nothing inherently "special" about them to warrant the entire database 15 | // always having the overhead of an extra edge it has to jump through 16 | // [slows down performance just slightly] unless it is explicitly needed/wanted) 17 | 18 | // travels an edge to another node 19 | // tests that the property is an edge 20 | 21 | // gun.get('amber').get('spouse').get('outin').val(cb) 22 | 23 | // shorthand 24 | // gun.get('amber').out('spouse') 25 | 26 | // export const edge = (property, edge) => { 27 | // const gun = this 28 | 29 | // const name = edge.name 30 | // const from = edge.from 31 | // const to = edge.outin 32 | // console.log('add edge', edge, 'from', from, 'to', to) 33 | 34 | // from.put({ 35 | // [name]: edge 36 | // }) 37 | 38 | // to.put({ 39 | // [name]: edge 40 | // }) 41 | // } -------------------------------------------------------------------------------- /src/fields.js: -------------------------------------------------------------------------------- 1 | export function localFields(node) { 2 | var mp = node.map().val(v => v) 3 | var map = Object.values(mp._.map) 4 | return Object.values(map).map(v => v.at.field) 5 | } 6 | 7 | export function fields(node, cb, opt) { 8 | node.value(v => cb(Object.keys(v)), opt) 9 | } 10 | 11 | export function addFields({ 12 | chain 13 | }) { 14 | chain.fields = function (cb, opt) { 15 | return fields(this, cb, opt) 16 | } 17 | return chain 18 | } -------------------------------------------------------------------------------- /src/filter.js: -------------------------------------------------------------------------------- 1 | export function filter(node, filter) { 2 | // map and filter 3 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | add, 3 | default as addAll 4 | } from './all' 5 | 6 | export { 7 | add, 8 | addAll 9 | } 10 | 11 | export default function (Gun) { 12 | Gun.chainAll = function (...funs) { 13 | funs.forEach(fun => fun(Gun.chain, Gun)) 14 | } 15 | return addAll(Gun) 16 | } -------------------------------------------------------------------------------- /src/live.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | 3 | export function live(node, cb, opt) { 4 | return node.on(function (val, field) { 5 | let v = Gun.obj.copy(val) 6 | if (v) { 7 | delete v._; 8 | } 9 | cb.call(this, v, field); 10 | }, opt); 11 | } 12 | 13 | export function addLive({ 14 | chain 15 | }) { 16 | chain.live = function (cb, opt) { 17 | return live(this, cb, opt) 18 | } 19 | 20 | return chain 21 | } -------------------------------------------------------------------------------- /src/local.js: -------------------------------------------------------------------------------- 1 | export function local(node, data, cb, opt) { 2 | opt = opt || {}; 3 | opt.peers = {}; 4 | return node.put(data, cb, opt) 5 | } 6 | 7 | export function addLocal({ 8 | chain 9 | }) { 10 | chain.local = function (data, cb, opt) { 11 | return local(this, data, cb, opt) 12 | } 13 | 14 | return chain 15 | } -------------------------------------------------------------------------------- /src/map-reduce.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | 3 | export function addMapReduce({ 4 | chain 5 | }) { 6 | chain.mapReduce = function (opts, cb, putCb, opt) { 7 | mapReduce(this, opts, cb, putCb, opt) 8 | } 9 | return chain 10 | } 11 | 12 | export function mapReduce(bucket, options = {}, cb, putCb, opt) { 13 | bucket.fields((allFields) => { 14 | options = Object.assign(options, { 15 | allFields 16 | }) 17 | doMapReduce(bucket, options, cb, putCb, opt) 18 | }) 19 | } 20 | 21 | function defaultLogger(fun, logging) { 22 | return function (...args) { 23 | if (logging) 24 | console.log(fun, ...args) 25 | } 26 | } 27 | 28 | function doMapReduce(bucket, { 29 | newField, 30 | newValue, 31 | value, 32 | transform, 33 | filter, 34 | filters, 35 | fields = [], 36 | ignoreFields = [], 37 | allFields, 38 | iterator = 'val', 39 | validField, 40 | processWhile, 41 | updateWhen, 42 | updateBucket, 43 | filterBucket, 44 | saveChanges, 45 | done, 46 | logging = false, 47 | logger, 48 | context 49 | }, cb, putCb, opt) { 50 | 51 | let ctx = { 52 | oldProps: {}, 53 | newProps: {}, 54 | filteredFields: {}, 55 | visited: {}, 56 | updated: false, 57 | processedFields: 0, 58 | allFields, 59 | fields, 60 | ignoreFields, 61 | iterator, 62 | context, 63 | putCb, 64 | opt 65 | } 66 | 67 | transform = transform || function (field, val) { 68 | return {} 69 | } 70 | 71 | logger = logger || defaultLogger 72 | 73 | const log = logger(iterator, logging) 74 | 75 | log('ctx', ctx) 76 | 77 | function defaultProcessWhile({ 78 | field, 79 | val, 80 | ctx 81 | }) { 82 | let reVisit = ctx.visited[field] 83 | let decision = !reVisit 84 | log('processWhile', reVisit, decision) 85 | return decision 86 | } 87 | 88 | function defaultValidField(field, ctx) { 89 | let { 90 | fields, 91 | ignoreFields 92 | } = ctx 93 | let valid = fields.length === 0 || fields.length > 0 && fields.indexOf(field) >= 0 94 | let invalid = ignoreFields.length > 0 && ignoreFields.indexOf(field) >= 0 95 | return valid && !invalid 96 | } 97 | 98 | function defaultUpdateWhen({ 99 | field, 100 | val, 101 | ctx 102 | }) { 103 | let processedAll = (ctx.processedFields >= ctx.allFields.length) 104 | let visitedAll = ctx.allFields.every(f => ctx.visited[f]) 105 | let decision = visitedAll && processedAll 106 | log('updateWhen', visitedAll, processedAll, decision) 107 | return decision 108 | } 109 | 110 | function defaultSaveChanges(bucket, changesObj, ctx) { 111 | bucket.put(changesObj, ctx.putCb, ctx.opt) 112 | } 113 | 114 | function defaultFilterBucket(bucket, ctx) { 115 | let deleteKeys = Object.keys(ctx.filteredFields) 116 | if (deleteKeys.length > 0) { 117 | log('FILTER', deleteKeys) 118 | let deleteObj = deleteKeys.reduce((obj, key) => { 119 | obj[key] = null 120 | return obj 121 | }, {}) 122 | log('deleteObj', deleteObj) 123 | ctx.saveChanges(bucket, deleteObj, ctx) 124 | } 125 | } 126 | 127 | function defaultUpdateBucket(bucket, ctx) { 128 | log('UPDATE', props) 129 | let props = Object.assign(ctx.oldProps, ctx.newProps) 130 | ctx.saveChanges(bucket, props, ctx) 131 | } 132 | 133 | function defaultDone(bucket, cb, ctx) { 134 | log('DONE') 135 | if (cb) { 136 | cb(bucket, ctx) 137 | } else { 138 | throw Error(`${ctx.iterator}: missing callback (in done)`) 139 | } 140 | } 141 | 142 | validField = validField || defaultValidField 143 | processWhile = processWhile || defaultProcessWhile 144 | updateWhen = updateWhen || defaultUpdateWhen 145 | updateBucket = updateBucket || defaultUpdateBucket 146 | filterBucket = filterBucket || defaultFilterBucket 147 | saveChanges = saveChanges || defaultSaveChanges 148 | done = done || defaultDone 149 | 150 | ctx.saveChanges = saveChanges 151 | 152 | function ensureFun(fun) { 153 | if (fun && typeof fun !== 'function') { 154 | return (v) => fun 155 | } else { 156 | return fun 157 | } 158 | } 159 | 160 | let newFieldFun = ensureFun(newField) 161 | let newValueFun = ensureFun(newValue) 162 | let oldValueFun = ensureFun(value) 163 | 164 | log(allFields) 165 | 166 | // processWhile = processWhile.bind(this) 167 | // updateWhen = updateWhen.bind(this) 168 | 169 | bucket.map()[iterator](function (val, field) { 170 | log('iterate', { 171 | field, 172 | val 173 | }) 174 | if (!validField(field, ctx)) return 175 | 176 | let newKey = newFieldFun ? newFieldFun(field, val, ctx) : field 177 | let newValue = newValueFun ? newValueFun(val, field, ctx) : val 178 | let newObj = transform(field, val, ctx) 179 | 180 | let oldValue = oldValueFun ? oldValueFun(val, field, ctx) : val 181 | let doFilter = false 182 | 183 | if (filters) { 184 | log('process filters', filters.length) 185 | doFilter = filters.reduce((filtered, filter) => { 186 | return !filtered ? filter(field, val, ctx) : filtered 187 | }, false) 188 | } 189 | 190 | if (filter && filter(field, val)) { 191 | doFilter = true 192 | } 193 | 194 | log({ 195 | newKey, 196 | newValue, 197 | oldValue, 198 | doFilter 199 | }) 200 | 201 | let doReduce = processWhile({ 202 | field, 203 | val, 204 | ctx 205 | }) 206 | log('doReduce', doReduce) 207 | 208 | if (doReduce) { 209 | log('reduce', { 210 | field, 211 | val, 212 | processedFields: ctx.processedFields 213 | }) 214 | if (doFilter) { 215 | ctx.filteredFields[field] = true 216 | } else { 217 | ctx.newProps = Object.assign(ctx.newProps, newObj) 218 | ctx.newProps[newKey] = newValue 219 | 220 | ctx.oldProps[field] = oldValue 221 | } 222 | ctx.visited[field] = true 223 | ctx.visited[newKey] = true 224 | ctx.processedFields++ 225 | } 226 | let doUpdate = updateWhen({ 227 | field, 228 | val, 229 | ctx 230 | }) 231 | log('doUpdate', doUpdate, ctx.processedFields) 232 | if (doUpdate) { 233 | if (!ctx.updated) { 234 | log('UPDATE BUCKET') 235 | ctx.updated = true 236 | updateBucket(bucket, ctx) 237 | filterBucket(bucket, ctx) 238 | done(bucket, cb, ctx) 239 | } else { 240 | log('ignore update') 241 | } 242 | } 243 | }) 244 | } -------------------------------------------------------------------------------- /src/no.js: -------------------------------------------------------------------------------- 1 | export function no(node, cb) { 2 | var chain = node.chain(), 3 | flag; 4 | 5 | node.not(function (a, b, c) { 6 | flag = true; 7 | if (!cb) { 8 | return 9 | } 10 | cb.call(this, a, b, c) 11 | }); 12 | 13 | node.get(function (at, ev) { 14 | if (flag) { 15 | return ev.off() 16 | } 17 | chain._.on('in', at); 18 | }); 19 | return chain; 20 | } 21 | 22 | export function addNo({ 23 | chain 24 | }) { 25 | chain.no = function (cb) { 26 | return no(this, cb) 27 | } 28 | 29 | return chain 30 | } -------------------------------------------------------------------------------- /src/observable/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | addRx 3 | } from './rx' 4 | import { 5 | addXStream 6 | } from './xstream' 7 | import { 8 | addZen 9 | } from './zen' 10 | 11 | const chains = { 12 | addXStream, 13 | addRx, 14 | addZen 15 | } 16 | 17 | function capitalize(str) { 18 | return str.charAt(0).toUpperCase() + str.slice(1); 19 | } 20 | 21 | export function add(Gun, ...names) { 22 | names.forEach(name => { 23 | let nameCap = capitalize(name) 24 | let fun = 'add' + nameCap 25 | chains[fun]({ 26 | chain: Gun.chain, 27 | Gun 28 | }) 29 | }) 30 | } 31 | 32 | const allNames = [ 33 | 'rx', 34 | 'xStream', 35 | 'zen' 36 | ] 37 | 38 | export function $addObservable({ 39 | Gun 40 | }) { 41 | add(Gun, ...allNames) 42 | } 43 | 44 | export default $addObservable -------------------------------------------------------------------------------- /src/observable/rx.js: -------------------------------------------------------------------------------- 1 | import { 2 | Observable 3 | } from 'rxjs'; 4 | import Gun from 'gun/gun'; 5 | 6 | // See https://github.com/staltz/xstream 7 | export function $rx(node, opts = {}) { 8 | let id, name 9 | node.val(data => { 10 | id = Gun.node.soul(data) 11 | name = opts.name || id || 'unknown' 12 | }) 13 | const op = opts.op || 'on' 14 | const log = function (...args) { 15 | if (opts.log) { 16 | console.log('rx:', name, ...args) 17 | } 18 | } 19 | 20 | // see Producer https://github.com/staltz/xstream#producer 21 | 22 | const observer = (listener) => { 23 | log('start') 24 | let eventListener = (event) => { 25 | if (listener.next) { 26 | log(event) 27 | listener.next(event) 28 | } else { 29 | throw new Error('Listener missing next(event) method') 30 | } 31 | } 32 | node[op](eventListener); 33 | } 34 | 35 | return Observable.create(observer) 36 | }; 37 | 38 | export function addRx({ 39 | chain 40 | }) { 41 | chain.$rx = function (opts) { 42 | return $rx(this, opts) 43 | } 44 | return chain 45 | } -------------------------------------------------------------------------------- /src/observable/xstream.js: -------------------------------------------------------------------------------- 1 | import xs from 'xstream'; 2 | 3 | 4 | // See https://github.com/staltz/xstream 5 | export function $xstream(node, opts = {}) { 6 | let id, name 7 | node.val(data => { 8 | id = Gun.node.soul(data) 9 | name = opts.name || id || 'unknown' 10 | }) 11 | 12 | const op = opts.op || 'on' 13 | const log = function (...args) { 14 | if (opts.log) { 15 | console.log('xstream:', name, ...args) 16 | } 17 | } 18 | 19 | // see Producer https://github.com/staltz/xstream#producer 20 | 21 | const producer = { 22 | start: (listener) => { 23 | log('start') 24 | let eventListener = (event) => { 25 | if (listener.next) { 26 | log('event', event) 27 | listener.next(event) 28 | } else { 29 | throw new Error('Listener missing next(event) method') 30 | } 31 | } 32 | node[op](eventListener); 33 | }, 34 | stop: () => {} 35 | } 36 | 37 | return xs.create(producer) 38 | }; 39 | 40 | export function addXStream({ 41 | chain 42 | }) { 43 | chain.$xstream = function (opts) { 44 | return $xstream(this, opts) 45 | } 46 | return chain 47 | } -------------------------------------------------------------------------------- /src/observable/zen.js: -------------------------------------------------------------------------------- 1 | import Observable from 'zen-observable'; 2 | 3 | // See https://github.com/staltz/xstream 4 | export function $zen(node, opts = {}) { 5 | let id, name 6 | node.val(data => { 7 | id = Gun.node.soul(data) 8 | name = opts.name || id || 'unknown' 9 | }) 10 | 11 | const op = opts.op || 'on' 12 | const log = function (...args) { 13 | if (opts.log) { 14 | console.log('zen:', name, ...args) 15 | } 16 | } 17 | 18 | // see Producer https://github.com/staltz/xstream#producer 19 | 20 | const observer = (listener) => { 21 | log('start') 22 | let eventListener = (event) => { 23 | if (listener.next) { 24 | log('event', event) 25 | listener.next(event) 26 | } else { 27 | throw new Error('Listener missing next(event) method') 28 | } 29 | } 30 | node[op](eventListener); 31 | } 32 | 33 | return new Observable(observer) 34 | }; 35 | 36 | export function addZen({ 37 | chain 38 | }) { 39 | chain.$zen = function (opts) { 40 | return $zen(this, opts) 41 | } 42 | return chain 43 | } -------------------------------------------------------------------------------- /src/out.js: -------------------------------------------------------------------------------- 1 | import { 2 | addValue 3 | } from './value' 4 | 5 | const instOf = (clazz = Object) => { 6 | return (val) => { 7 | return val instanceof clazz 8 | } 9 | } 10 | 11 | const notOriginator = (node, selfId) => { 12 | return data => selfid !== node.soul(data) 13 | } 14 | 15 | // // get('spouse').get('inout').val(cb) 16 | // async function calcOut(node, selfId, out, edge, v) { 17 | // const def = edge.get(out) 18 | // const propId = node.soul(v) 19 | // // // only if not referencing to self 20 | // if (propId !== selfId) { 21 | // return def 22 | // } else { 23 | // // find first other property that references a valid Object 24 | // let targetNode = await 25 | // return node.$mapReduce({ 26 | // filters: [ 27 | // instOf(Object), 28 | // notOriginator(node, selfId) 29 | // // type? 30 | // ] 31 | // }) 32 | 33 | // // return first field of filtered ones 34 | // let fields = await targetNode.$fields() 35 | // return fields[0] 36 | // } 37 | // } 38 | 39 | // /* 40 | // await gun.get('mark').out({ 41 | // spouse: 'bride' 42 | // }) 43 | // */ 44 | // export async function out(node, navigation) { 45 | // if (typeof navigation === 'string') { 46 | // navigation = { 47 | // [navigation]: navigation 48 | // } 49 | // } 50 | // const key = Object.keys(navigation)[0] 51 | // const out = Object.values(navigation)[0] 52 | 53 | // const selfId = node.soul(this) 54 | // const edge = this.get(key) 55 | 56 | // const edgeNode = await edge.valAsync() 57 | // let res = calcOut(node, selfId, out, edge, edgeNode) 58 | // return await res.valueAsync() 59 | // } -------------------------------------------------------------------------------- /src/print.js: -------------------------------------------------------------------------------- 1 | import { 2 | addValue 3 | } from './value' 4 | 5 | export function print(node, label, opt, log) { 6 | node.value(val => { 7 | label ? log(label, val) : log(val) 8 | }, opt) 9 | } 10 | 11 | export function addPrint({ 12 | chain, 13 | Gun 14 | }) { 15 | addValue(chain, Gun) 16 | const log = Gun.log || console.log 17 | 18 | chain.print = function (label, opt) { 19 | print(this, label, opt, log) 20 | } 21 | 22 | return chain 23 | } -------------------------------------------------------------------------------- /src/promise/fields.js: -------------------------------------------------------------------------------- 1 | export function $fields(node) { 2 | return new Promise(function (resolve, reject) { 3 | node.value(v => resolve(Object.keys(v))) 4 | }); 5 | } 6 | 7 | import { 8 | addValue 9 | } from '../value' 10 | 11 | export function $addFields({ 12 | chain, 13 | }) { 14 | addValue({ 15 | chain 16 | }) 17 | 18 | chain.$fields = function (cb, opt) { 19 | return $fields(this, cb, opt) 20 | } 21 | return chain 22 | } -------------------------------------------------------------------------------- /src/promise/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | $addFields 3 | } from './fields' 4 | import { 5 | $addMapReduce 6 | } from './map-reduce' 7 | import { 8 | $addVal 9 | } from './val' 10 | import { 11 | $addValue 12 | } from './value' 13 | import { 14 | $addTimed 15 | } from './timed' 16 | import { 17 | $addNo 18 | } from './no' 19 | import { 20 | $addRecurse 21 | } from './recurse' 22 | 23 | const chains = { 24 | $addFields, 25 | $addMapReduce, 26 | $addNo, 27 | $addRecurse, 28 | $addVal, 29 | $addValue, 30 | $addTimed 31 | } 32 | 33 | function capitalize(str) { 34 | return str.charAt(0).toUpperCase() + str.slice(1); 35 | } 36 | 37 | export function add(Gun, ...names) { 38 | names.forEach(name => { 39 | let nameCap = capitalize(name) 40 | let fun = '$add' + nameCap 41 | chains[fun]({ 42 | chain: Gun.chain, 43 | Gun 44 | }) 45 | }) 46 | } 47 | 48 | const allNames = [ 49 | 'fields', 50 | 'mapReduce', 51 | 'val', 52 | 'value', 53 | 'timed', 54 | 'no', 55 | 'recurse' 56 | ] 57 | 58 | export function $addPromise({ 59 | Gun 60 | }) { 61 | add(Gun, ...allNames) 62 | } 63 | 64 | export default $addPromise -------------------------------------------------------------------------------- /src/promise/map-reduce.js: -------------------------------------------------------------------------------- 1 | import { 2 | addMapReduce 3 | } from '../map-reduce' 4 | 5 | export function $mapReduce(node, options, putCb, opt) { 6 | return new Promise(function (resolve, reject) { 7 | node.mapReduce(options, resolve, putCb, opt) 8 | }) 9 | } 10 | 11 | export function $addMapReduce({ 12 | chain 13 | }) { 14 | addMapReduce({ 15 | chain 16 | }) 17 | 18 | chain.$mapReduce = async function (options, putCb, opt) { 19 | return await $mapReduce(this, options, putCb, opt) 20 | } 21 | return chain 22 | } -------------------------------------------------------------------------------- /src/promise/no.js: -------------------------------------------------------------------------------- 1 | export function $no(node) { 2 | return new Promise(function (resolve, reject) { 3 | node.no(resolve) 4 | }) 5 | } 6 | 7 | export function $addNo({ 8 | chain 9 | }) { 10 | chain.$no = async function () { 11 | return await $no(this) 12 | } 13 | return chain 14 | } -------------------------------------------------------------------------------- /src/promise/recurse.js: -------------------------------------------------------------------------------- 1 | export function $recurse(node, filter) { 2 | return new Promise(function (resolve, reject) { 3 | node.recurse(resolve, filter) 4 | }) 5 | } 6 | 7 | export function $addRecurse({ 8 | chain 9 | }) { 10 | chain.$recurse = async function (filter) { 11 | return await $recurse(this, filter) 12 | } 13 | return chain 14 | } -------------------------------------------------------------------------------- /src/promise/timed.js: -------------------------------------------------------------------------------- 1 | import { 2 | timed 3 | } from '../timed' 4 | 5 | export function $timed(node, opts = {}) { 6 | return new Promise(function (resolve, reject) { 7 | opts = Object.assign(opts, { 8 | cb: resolve 9 | }) 10 | timed(node, opts) 11 | }) 12 | } 13 | 14 | export function $addTimed({ 15 | chain 16 | }) { 17 | chain.$timed = function (opts) { 18 | return $timed(this, opts) 19 | } 20 | return chain 21 | } -------------------------------------------------------------------------------- /src/promise/val.js: -------------------------------------------------------------------------------- 1 | export function $val(node, opt) { 2 | return new Promise(function (resolve, reject) { 3 | node.val(resolve, opt) 4 | }) 5 | } 6 | 7 | export function $addVal({ 8 | chain 9 | }) { 10 | chain.$val = function (opt) { 11 | return $val(this, opt) 12 | } 13 | return chain 14 | } -------------------------------------------------------------------------------- /src/promise/value.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | 3 | export function $value(node, opt) { 4 | return new Promise(function (resolve, reject) { 5 | node.value(resolve, opt) 6 | }) 7 | } 8 | 9 | export function $valueAt(node, at, opt) { 10 | let path = node.path(at) 11 | if (path) { 12 | return path.$value(opt) 13 | } else { 14 | throw new Error(`No such path ${at}`) 15 | } 16 | } 17 | 18 | import { 19 | addValue 20 | } from '../value' 21 | 22 | export function $addValue({ 23 | chain 24 | }) { 25 | addValue({ 26 | chain 27 | }) 28 | 29 | chain.$value = function (opt) { 30 | return $value(this, opt) 31 | } 32 | 33 | chain.$valueAt = function (opt) { 34 | return $valueAt(this, opt) 35 | } 36 | return chain 37 | } -------------------------------------------------------------------------------- /src/put.js: -------------------------------------------------------------------------------- 1 | export function putAt(node, at, obj, cb, opt) { 2 | let pathNode = node.path(at) 3 | if (pathNode) { 4 | node._.paths = node._.paths || [] 5 | pathNode.put(obj, cb, opt) 6 | node._.paths.push(at) 7 | } else { 8 | throw new Error(`No such path ${at}`) 9 | } 10 | } 11 | 12 | export function addPut({ 13 | chain 14 | }) { 15 | chain.putAt = function (at, obj, cb, opt) { 16 | return putAt(this, at, obj, cb, opt) 17 | } 18 | 19 | chain.paths = function () { 20 | return this._.paths || [] 21 | } 22 | 23 | return chain 24 | } -------------------------------------------------------------------------------- /src/recurse.js: -------------------------------------------------------------------------------- 1 | export function recurse(node, cb, filter) { 2 | if (!(filter instanceof Object)) { 3 | filter = {}; 4 | } 5 | node.val(cb); 6 | node.map().val(function (data) { 7 | if (!(data instanceof Object)) { 8 | return; 9 | } 10 | var soul = node.soul(data); 11 | if (filter[soul]) { 12 | return; 13 | } 14 | filter[soul] = true; 15 | this.recurse(cb, filter); 16 | }); 17 | return node; 18 | }; 19 | 20 | export function addRecurse({ 21 | chain 22 | }) { 23 | chain.recurse = function (cb, filter) { 24 | return recurse(this, cb, filter) 25 | } 26 | 27 | return chain 28 | } -------------------------------------------------------------------------------- /src/set.js: -------------------------------------------------------------------------------- 1 | export function setAt(node, at, cb, opt) { 2 | let pathNode = node.path(at) 3 | if (pathNode) { 4 | pathNode.set(cb, opt) 5 | } else { 6 | throw new Error(`No such path ${at}`) 7 | } 8 | } 9 | 10 | export function addSet({ 11 | chain 12 | }) { 13 | chain.setAt = function (cb, opt) { 14 | return setAt(this, cb, opt) 15 | } 16 | return chain 17 | } -------------------------------------------------------------------------------- /src/soul.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | 3 | export function addSoul({ 4 | chain 5 | }) { 6 | chain.soul = function () { 7 | return Gun.node.soul(this) 8 | } 9 | return chain 10 | } -------------------------------------------------------------------------------- /src/timed.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun'; 2 | 3 | export function timed(node, opts = {}) { 4 | let id, name 5 | node.val(data => { 6 | id = Gun.node.soul(data) 7 | name = opts.name || id || 'unknown' 8 | }) 9 | 10 | console.log('TIMED', opts) 11 | 12 | const log = function (...args) { 13 | if (opts.log || opts.logging) { 14 | console.log('timed:', name, ...args) 15 | } 16 | } 17 | 18 | if (typeof opts === 'function') { 19 | opts = { 20 | cb: opts 21 | } 22 | } 23 | 24 | recurseTimed(opts) 25 | 26 | function recurseTimed(opts) { 27 | 28 | let { 29 | cb, 30 | nextObj, 31 | nextOpts, 32 | stopCondition, 33 | operation, 34 | logging, 35 | interval = 100, 36 | num = 0, 37 | maxNum = 10 38 | } = opts 39 | 40 | let defaultStop = ({ 41 | num 42 | }, opts) => { 43 | return num > maxNum 44 | } 45 | let defaultNextObj = (num, opts) => { 46 | return { 47 | num: num + 1 48 | } 49 | } 50 | 51 | let defaultNextOpts = (opts, num) => { 52 | return Object.assign(opts, { 53 | num 54 | }) 55 | } 56 | 57 | let defaultOp = (node, obj, opts) => { 58 | log('put', obj) 59 | node.put(obj) 60 | } 61 | 62 | nextObj = nextObj || defaultNextObj 63 | nextOpts = nextOpts || defaultNextOpts 64 | stopCondition = stopCondition || defaultStop 65 | operation = operation || defaultOp 66 | 67 | setTimeout(() => { 68 | let obj = Object.assign(nextObj(num, opts)) 69 | operation(node, obj, opts) 70 | if (stopCondition(obj, opts)) { 71 | if (cb) { 72 | cb(num) 73 | } else { 74 | console.error('timed: Missing cb to stop', opts) 75 | process.exit(1) 76 | } 77 | } 78 | 79 | recurseTimed(nextOpts(opts, obj.num)) 80 | }, interval) 81 | } 82 | } 83 | 84 | export function addTimed({ 85 | chain 86 | }) { 87 | chain.timed = function (opts) { 88 | return timed(this, opts) 89 | } 90 | return chain 91 | } -------------------------------------------------------------------------------- /src/utils/pubsub.js: -------------------------------------------------------------------------------- 1 | export const events = (function () { 2 | var topics = {}; 3 | var hOP = topics.hasOwnProperty; 4 | 5 | return { 6 | subscribe: function (topic, listener) { 7 | // Create the topic's object if not yet created 8 | if (!hOP.call(topics, topic)) topics[topic] = []; 9 | 10 | // Add the listener to queue 11 | var index = topics[topic].push(listener) - 1; 12 | 13 | // Provide handle back for removal of topic 14 | return { 15 | remove: function () { 16 | delete topics[topic][index]; 17 | } 18 | }; 19 | }, 20 | publish: function (topic, info) { 21 | // If the topic doesn't exist, or there's no listeners in queue, just leave 22 | if (!hOP.call(topics, topic)) return; 23 | 24 | // Cycle through topics queue, fire! 25 | topics[topic].forEach(function (item) { 26 | item(info != undefined ? info : {}); 27 | }); 28 | } 29 | }; 30 | })(); -------------------------------------------------------------------------------- /src/value.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | 3 | export function value(node, cb, opt) { 4 | return node.val(function (val, field) { 5 | let v = Gun.obj.copy(val) 6 | delete v._ 7 | cb.call(this, v, field) 8 | }, opt); 9 | } 10 | 11 | export function valueAt(node, at, cb, opt) { 12 | let pathNode = node.path(at) 13 | if (pathNode) { 14 | value(pathNode, cb, opt) 15 | } else { 16 | throw new Error(`No such path ${at}`) 17 | } 18 | } 19 | 20 | export function valAt(node, at, cb, opt) { 21 | let pathNode = node.path(at) 22 | if (pathNode) { 23 | pathNode.val(cb, opt) 24 | } else { 25 | throw new Error(`No such path ${at}`) 26 | } 27 | } 28 | 29 | export function addValue({ 30 | chain 31 | }) { 32 | chain.value = function (cb, opt) { 33 | return value(this, cb, opt) 34 | } 35 | 36 | chain.valueAt = function (at, cb, opt) { 37 | return valueAt(this, at, cb, opt) 38 | } 39 | 40 | chain.valAt = function (at, cb, opt) { 41 | return valAt(this, at, cb, opt) 42 | } 43 | 44 | return chain 45 | } -------------------------------------------------------------------------------- /test/channel/csp.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import { 5 | $csp 6 | } from '../../src/channel/csp' 7 | 8 | // import csp from 'js-csp' 9 | const csp = require('js-csp') 10 | 11 | import edge from '../../src' 12 | edge(Gun) 13 | 14 | const gun = Gun(); 15 | const log = console.log 16 | 17 | // See Go Channels: http://swannodette.github.io/2013/08/24/es6-generators-and-csp 18 | 19 | test('$csp', async t => { 20 | let cols = gun.get('colors') 21 | cols.put({ 22 | violet: true, 23 | red: true, 24 | green: false 25 | }) 26 | 27 | // https://github.com/zenparsing/zen-observable 28 | function doLive(node) { 29 | 30 | // TESTING basic CSP 31 | const ch = csp.chan(); 32 | 33 | csp.takeAsync(ch, function (value) { 34 | return console.log("Got ", value); 35 | }); 36 | 37 | // After the put, the pending take will happen 38 | csp.putAsync(ch, 42); 39 | //=> "Got 42" 40 | 41 | return new Promise(function (resolve, reject) { 42 | let maxNum = 4 43 | 44 | let size = 2 45 | let buffer = csp.buffers.fixed(size) 46 | // let buffer = csp.buffers.sliding(size) 47 | // let buffer = csp.buffers.dropping(size) 48 | // const promiseCh = csp.promiseChan(); 49 | 50 | let promiseCh = csp.chan(buffer) 51 | 52 | promiseCh = $csp(node, { 53 | // channel: promiseCh, 54 | // log: true, 55 | op: 'live', 56 | // only when node value has a num field 57 | condition: (val) => val.num 58 | }) 59 | 60 | node.timed({ 61 | maxNum, 62 | logging: true, 63 | cb: resolve 64 | }) 65 | 66 | let num = 0 67 | let condition = () => num < 5 68 | 69 | // Please help improved this!!! 70 | csp.go(function* () { 71 | while (condition()) { 72 | const value = yield csp.take(promiseCh) 73 | console.log('value', value) 74 | } 75 | }) 76 | }) 77 | } 78 | 79 | await doLive(cols) 80 | }) -------------------------------------------------------------------------------- /test/count.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import edge from '../src' 5 | edge(Gun) 6 | 7 | const gun = Gun(); 8 | 9 | import { 10 | date 11 | } from '../src/date' 12 | 13 | test('date', async t => { 14 | // todo 15 | }) -------------------------------------------------------------------------------- /test/date.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import edge from '../src' 5 | edge(Gun) 6 | 7 | const gun = Gun(); 8 | 9 | import { 10 | date 11 | } from '../src/date' 12 | 13 | test('date', async t => { 14 | // todo 15 | }) -------------------------------------------------------------------------------- /test/each.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import edge from '../src' 5 | edge(Gun) 6 | 7 | const gun = Gun(); 8 | 9 | import { 10 | each 11 | } from '../src/each' 12 | 13 | test('each', async t => { 14 | // todo 15 | }) -------------------------------------------------------------------------------- /test/fields.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import edge from '../src' 5 | edge(Gun) 6 | 7 | const gun = Gun(); 8 | 9 | import { 10 | fields 11 | } from '../src/fields' 12 | 13 | test('fields', async t => { 14 | // todo 15 | }) -------------------------------------------------------------------------------- /test/live.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import edge from '../src' 5 | edge(Gun) 6 | 7 | const gun = Gun(); 8 | 9 | import { 10 | live 11 | } from '../src/live' 12 | 13 | test('live', async t => { 14 | // todo 15 | }) -------------------------------------------------------------------------------- /test/local.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import edge from '../src' 5 | edge(Gun) 6 | 7 | const gun = Gun(); 8 | 9 | import { 10 | local 11 | } from '../src/local' 12 | 13 | test('local', async t => { 14 | // todo 15 | }) -------------------------------------------------------------------------------- /test/no.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import edge from '../src' 5 | edge(Gun) 6 | 7 | const gun = Gun(); 8 | 9 | import { 10 | no 11 | } from '../src/no' 12 | 13 | test('no', async t => { 14 | // todo 15 | }) -------------------------------------------------------------------------------- /test/observable/rx.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import { 5 | $rx 6 | } from '../../src/observable/rx' 7 | 8 | import edge from '../../src' 9 | edge(Gun) 10 | 11 | const gun = Gun(); 12 | const log = console.log 13 | 14 | test('$rx', async t => { 15 | let cols = gun.get('colors') 16 | cols.put({ 17 | violet: true, 18 | red: true, 19 | green: false 20 | }) 21 | 22 | // https://github.com/zenparsing/zen-observable 23 | function doLive(node) { 24 | log(node) 25 | 26 | return new Promise(function (resolve, reject) { 27 | let obs = $rx(node, { 28 | log: true, 29 | op: 'live' 30 | }) 31 | 32 | let subscription = obs 33 | .subscribe(x => { 34 | log('sub', x) 35 | resolve() 36 | }) 37 | 38 | node.timed({ 39 | maxNum: 2, 40 | logging: true, 41 | cb: resolve 42 | }) 43 | }) 44 | } 45 | 46 | await doLive(cols) 47 | }) -------------------------------------------------------------------------------- /test/observable/xstream.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import { 5 | $xstream 6 | } from '../../src/observable/xstream' 7 | 8 | import edge from '../../src' 9 | edge(Gun) 10 | 11 | const gun = Gun(); 12 | const log = console.log 13 | 14 | test('$xstream', async t => { 15 | let cols = gun.get('colors') 16 | cols.put({ 17 | violet: true, 18 | red: true, 19 | green: false 20 | }) 21 | 22 | // https://github.com/zenparsing/zen-observable 23 | function doLive(node) { 24 | log(node) 25 | 26 | return new Promise(function (resolve, reject) { 27 | let obs = $xstream(node, { 28 | log: true 29 | }) 30 | obs.addListener({ 31 | next: (v) => log('listen', v) 32 | }) 33 | 34 | let subscription = obs 35 | .subscribe({ 36 | next: x => { 37 | log('sub', x) 38 | resolve() 39 | } 40 | }) 41 | 42 | node.timed({ 43 | maxNum: 2, 44 | logging: true, 45 | cb: resolve 46 | }) 47 | }) 48 | } 49 | 50 | await doLive(cols) 51 | }) -------------------------------------------------------------------------------- /test/observable/zen.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import { 5 | $zen 6 | } from '../../src/observable/zen' 7 | 8 | import edge from '../../src' 9 | edge(Gun) 10 | 11 | const gun = Gun(); 12 | const log = console.log 13 | 14 | test('$zen', async t => { 15 | let cols = gun.get('colors') 16 | cols.put({ 17 | violet: true, 18 | red: true, 19 | green: false 20 | }) 21 | 22 | // https://github.com/zenparsing/zen-observable 23 | function doLive(node) { 24 | log(node) 25 | 26 | return new Promise(function (resolve, reject) { 27 | let obs = $zen(node, { 28 | log: true, 29 | op: 'live' 30 | }) 31 | 32 | let subscription = obs 33 | .subscribe(x => { 34 | log('sub', x) 35 | resolve() 36 | }) 37 | 38 | node.timed({ 39 | maxNum: 2, 40 | logging: true, 41 | cb: resolve 42 | }) 43 | }) 44 | } 45 | 46 | await doLive(cols) 47 | }) -------------------------------------------------------------------------------- /test/promise/map-reduce.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | Gun.chainAll = function (...funs) { 5 | funs.forEach(fun => fun(Gun.chain, Gun)) 6 | } 7 | 8 | import { 9 | addValue 10 | } from '../src/value' 11 | 12 | import { 13 | $addAll 14 | } from '../src/async' 15 | 16 | Gun.chainAll(addValue, $addAll) 17 | 18 | function reverse(str, val) { 19 | return str ? str.split('').reverse().join('') : str 20 | } 21 | 22 | // remove a color field 23 | const noColor = (color) => { 24 | return (field, value) => { 25 | return field === color 26 | } 27 | } 28 | 29 | const gun = Gun(); 30 | 31 | test('$mapReduce async/await', async t => { 32 | async function handleResult(bucket) { 33 | // let violet = await bucket.$valueAt('violet') 34 | // let teloiv = await bucket.$valueAt('teloiv') 35 | let violet = await bucket.path('violet').$value() 36 | let teloiv = await bucket.path('teloiv').$value() 37 | 38 | let colors = await bucket.$value() 39 | console.log('colors::', colors) 40 | console.log('violet::', violet) 41 | console.log('teloiv::', teloiv) 42 | t.is(violet, 'done') 43 | t.is(teloiv, 'ready') 44 | } 45 | 46 | let cols = gun.get('colors') 47 | let colors = cols.put({ 48 | violet: true, 49 | red: true, 50 | green: false 51 | }) 52 | 53 | let cfields = await cols.$fields() 54 | console.log('color fields', cfields) 55 | 56 | let reducedCols = await cols.$mapReduce({ 57 | logging: true, 58 | newField: reverse, 59 | newValue: 'ready', 60 | value: (v) => 'done', 61 | filters: [noColor('red'), noColor('green')] 62 | }) 63 | 64 | await handleResult(reducedCols) 65 | }) -------------------------------------------------------------------------------- /test/put-at.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | 4 | import edge from '../src' 5 | edge(Gun) 6 | 7 | const gun = Gun(); 8 | 9 | test('putAt simple', async t => { 10 | let cols = gun.get('colors') 11 | cols.put({ 12 | violet: true, 13 | red: true, 14 | green: false 15 | }) 16 | 17 | let _path = 'violet' 18 | 19 | cols.putAt(_path, { 20 | light: true 21 | }) 22 | 23 | let color = await cols.$valueAt(_path) 24 | 25 | t.is(color, true) 26 | t.is(cols.paths()[0], _path) 27 | }) 28 | 29 | test('putAt nodes', async t => { 30 | let mark = gun.get('mark') 31 | let amber = gun.get('amber') 32 | 33 | amber.put({ 34 | name: 'amber', 35 | gender: 'female' 36 | }) 37 | 38 | mark.put({ 39 | name: 'mark', 40 | gender: 'male', 41 | }) 42 | 43 | mark.path('wife').put(amber) 44 | mark.path('self').put(mark) 45 | 46 | let _path = 'spouse' 47 | 48 | mark.putAt(_path, amber) 49 | let spouse = await mark.$valueAt(_path) 50 | 51 | t.is(spouse.name, 'amber') 52 | }) -------------------------------------------------------------------------------- /test/set-at.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | import chain from '../src' 4 | chain(Gun) 5 | const gun = Gun(); 6 | 7 | import { 8 | setAt 9 | } from '../src/set' 10 | 11 | test('setAt', async t => { 12 | let cols = gun.get('colors') 13 | cols.put({ 14 | violet: true, 15 | red: true, 16 | green: false 17 | }) 18 | 19 | let _path = 'violet' 20 | 21 | cols.setAt(_path, { 22 | light: true 23 | }) 24 | 25 | // TODO 26 | // let color = await cols.$valueAt(_path) 27 | 28 | // t.is(color, true) 29 | // t.is(cols.paths()[0], _path) 30 | }) -------------------------------------------------------------------------------- /test/soul.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | import chain from '../src' 4 | chain(Gun) 5 | const gun = Gun(); 6 | 7 | import { 8 | soul 9 | } from '../src/soul' 10 | 11 | test('soul', async t => { 12 | // todo 13 | }) -------------------------------------------------------------------------------- /test/timed.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | import chain from '../src' 4 | chain(Gun) 5 | const gun = Gun(); 6 | 7 | import { 8 | timed 9 | } from '../src/timed' 10 | 11 | test('timed iterator', async t => { 12 | let name = 'mark' 13 | let mark = gun.get('mark') 14 | 15 | function doLive(node) { 16 | return new Promise(function (resolve, reject) { 17 | timed(node, resolve) 18 | 19 | // Alternative pass options for fine control 20 | // iterate(node, { 21 | // cb: resolve, 22 | // num: 10 23 | // }) 24 | 25 | node.live((val) => { 26 | console.log(val) 27 | }) 28 | }) 29 | } 30 | 31 | await doLive(mark) 32 | }) -------------------------------------------------------------------------------- /test/value.test.js: -------------------------------------------------------------------------------- 1 | import Gun from 'gun/gun' 2 | import test from 'ava' 3 | import chain from '../src' 4 | chain(Gun) 5 | const gun = Gun(); 6 | 7 | import { 8 | value 9 | } from '../src/value' 10 | 11 | test('value', async t => { 12 | // todo 13 | }) --------------------------------------------------------------------------------