>0.2020.520
may break in-process gun1
gun2
message passing. Check test/common.js
"Check multi instance message passing" for a hint and/or complain on community chat.
- No breaking changes to core API.
- Storage adapter
put
event breaking change (temporary?), RAD is official now and storage adapters should be RAD plugins instead of GUN adapters. - GUN soul format changed from being a random UUID to being a more predictable graph path (of where initially created) to support even better offline behavior. This means
null
ing & replacing an object will not create a new but re-merge. - Pretty much all internal GUN utility will be deleted, these are mostly undocumented but will affect some people - they will still be available as a separate file but deprecated.
- As the DHT gets implemented, your relay peers may automatically connect to it, so do not assume your peer is standalone.
Gun({axe: false
should help prevent this but loses you most scaling properties. - The 2019 -> 2020 "changes" are happening gradually, based on experimental in-production tests.
- As always, most important is to ask in the community chat if you have any issues, and to keep up to date with changes.
Some RAD & SEA data format changes, but with as much backward compatibility as possible, tho ideally should be dropped.
No breaking changes, but the new Radix Storage Engine (RSE) has been finally integrated and works with S3 as a backup.
// Edit: commentary removed.
Adapter interfaces have changed from Gun.on('event', cb)
to gun.on('event', cb)
, this will force adapters to be instance specific.
.path()
and .not()
have been officially removed from the core bundle, you can bundle them yourself at lib/path.js
and lib/not.js
if you still need them.
Small breaking change to .val(cb)
:
Previously .val(cb)
would ONLY be called when data exists, like .on(cb)
.
However, due to popular demand, people wanted .val(cb)
to also get called for .not(cb)
rather than (before) it would "wait" until data arrived.
NOTE: For dynamic paths, .val(cb)
will still wait, like:
gun.get('users').map().val(cb)
because the behavior of the map()
is simply to not fire anything down the chain unless items are found.
Introduced experimental features, chaining .val()
(no callback) and .map(cb)
behaving as a map/reduce function.
It also upgraded the socket adapters and did end-to-end load testing and correctness testing.
GUN 0.3 -> 0.4 -> 0.5 Migration Guide:
gun.back
-> gun.back()
;
gun.get(key, cb)
-> cb(err, data) -> cb(at) at.err, at.put;
gun.map(cb)
-> gun.map().on(cb)
;
gun.init
-> deprecated;
gun.put(data, cb)
-> cb(err, ok) -> cb(ack) ack.err, ack.ok;
gun.get(key)
global/absolute -> gun.back(-1).get(key)
;
gun.key(key)
-> temporarily broken;
- Catch localStorage errors.
- Fixed S3 typo.
- Fixed server push.
- Breaking Change!
list.set(item)
returns the item's chain now, not the list chain. - Client and Server GUN servers are now more up to spec, trimmed excess HTTP/REST header data.
- Gun.is.lex added.
- You can now link nodes natively,
gun.get('mark').path('owner').put(gun.get('cat'))
! - Sets (or tables, collections, lists) are now easily done with
gun.get('users').set(gun.get('person/mark'))
.
Bug fixes.
Bug fixes.
Migration Guide! Migrate by changing .attach(
to .wsp(
on your server if you have one with gun. Remove .set()
(delete it), and change .set($DATA)
(where you call set with something) to .path('I' + Date.now() + 'R' + Gun.text.random(5)).put($DATA)
. If you have NodeJS style callbacks in your .get
(which documentation previously recommended that you shouldn't) they previous took err, graph
and now they take err, node
(which means now using callback style is fine to use). Inside of .not()
no longer use return
or this
, instead (probably) use gun
and no return
. If you are a module developer, use opt.wire
now instead of opt.hooks
and message Mark since he needs to talk to you since the wire protocol has changed.
- Server side default
.wsp()
renamed from.attach()
. .set()
deprecated because it did a bunch of random inconsistent things. Its useful behavior has now become implicit (see below) or can be done explicitly..not()
it was previously common toreturn
the chain inside of .not, beware that if you have code likegun.get(key).not(function(){ return this.put({}).key(key) }).val()
cause.val()
to be triggered twice (this is intentional, because it funnels two separate chains together) which previously didn't happen. To fix this, just don't return the chain..put()
and.path()
do implicit.init()
by default, turn on explicit behavior withGun({init: true})
..get(soul, cb)
cb is called back witherr, node
rather thanerr, graph
.- Options
opt.wire
renamed fromopt.hooks
. .val()
when called empty automatically cleanly logs for convenience purposes..init()
added.Gun.is.val
renamed fromGun.is.value
.Gun.is.rel
renamed fromGun.is.soul
.Gun.is.node.soul
renamed fromGun.is.soul.on
.Gun.union.ify
renamed fromGun.union.pseudo
.Gun.union.HAM
renamed fromGun.HAM
.Gun.HAM
is now the actual HAM function for conflict resolution.Gun._.state
renamed fromGun._.HAM
.- Maximum Callstack Exceeded is less problematic now, unless you intentionally choke the thread. #95
- Putting a regex or Date or NaN is actually detected and causes an error now while before it was silent. #122 #123
.on()
gets called when a key is later newly made while before it did not. #116.val()
should not ever get called with a relation alone (internals should resolve it), this is fixed. #132