Realtime sync means data changes are instantly propagated to all connected peers. When one user modifies data, all other users see the update immediately - no polling, no refresh needed.GUN makes realtime sync automatic and effortless:
var gun = Gun();// Listen for updates (realtime subscription)gun.get('temperature').on((data, key) => { console.log('Temperature is now:', data);});// Update from anywhere - all subscribers get notified instantlygun.get('temperature').put(72);// Console logs: "Temperature is now: 72"setInterval(() => { gun.get('temperature').put(Math.random() * 100);}, 1000);// Console updates every second automatically!
GUN’s realtime sync works across devices and networks. Update on your phone, see it instantly on your laptop.
// Subscribe to a nodegun.get('user/alice').on((data, key) => { console.log('Alice data:', data);});// Triggers immediately with current value// Then triggers again on every update
// Listen to a specific propertygun.get('user').get('name').on(name => { console.log('Name changed to:', name);});// Update itgun.get('user').put({name: 'Bob'});// Console: "Name changed to: Bob"
// Multiple callbacks can listen to the same datagun.get('counter').on(val => { document.getElementById('display1').textContent = val;});gun.get('counter').on(val => { document.getElementById('display2').textContent = val;});gun.get('counter').on(val => { console.log('Counter:', val);});// All three trigger when counter updatesgun.get('counter').put(42);
.on() triggers immediately with the current value, then continues to trigger on every update.
// Start listeningvar ref = gun.get('live-data').on(data => { console.log(data);});// Stop listeningref.off();// No more updates will trigger the callback
Unlike traditional pub/sub systems (Redis, RabbitMQ), GUN’s pub/sub is distributed:
// User A publishes from BrowsergunA.get('chat').set({msg: 'Hello!'});// User B subscribes from MobilegunB.get('chat').map().on(msg => { displayMessage(msg);});// User C subscribes from ServergunC.get('chat').map().on(msg => { archiveMessage(msg);});// All subscribers notified via mesh network// No central message broker needed!
If two peers write simultaneously, GUN uses state vectors (CRDTs) to resolve:
// Peer A writes at time 1000gunA.get('x').put('A');// Peer B writes at time 1001 gunB.get('x').put('B');// Higher timestamp wins// All peers converge to 'B'
Learn more about conflict resolution in CRDT Concepts.
var gun = Gun();var game = gun.get('game/123');// Subscribe to player positionsgame.get('players').map().on((player, id) => { updatePlayerPosition(id, player.x, player.y);});// Update your positionfunction movePlayer(x, y) { game.get('players').get(myPlayerId).put({x, y});}// All players see updates in realtime
// Bad: Subscribe to everythinggun.get('users').map().on(user => { // Triggers for ALL users});// Good: Subscribe to specific usersgun.get('users').get(currentUserId).on(user => { // Only triggers for current user});
// Use GUN as reactive state storeconst state = gun.get('app-state');state.get('user').on(user => { updateUserUI(user);});state.get('theme').on(theme => { applyTheme(theme);});// Update state anywherestate.get('theme').put('dark');