Edited at

Gun.js/GunDB - Realtime, Distributed, Offline-first, Graph

More than 1 year has passed since last update.


Gun.js/GunDBとは?

Gun.js/GunDBこれまでで最も簡単なデータベースだそうです。端的に言うと以下のようなデータストアまわりの課題を解決するようです。

※以下の内容は公式に書かれていることと私が小一時間触っただけの体験をもとに書いてますので粗探しして事実と異なる点を見つけられる可能性は大いにありますので過信しないでください


リアルタイム

データストアへの更新をクライアントがSubscribeできます。これは、FirebaseとかPubNubとかMilkcocoaみたいな体験と同じです。これがオープンソースのデータストアで実現可能です。


分散

Gun.jsの初期化で以下のように複数のPeerを指定するだけでノード間のデータが同期されます。NoDBというコンセプトらしいですが、実際、LocalStorageに永続化したデータが勝手に複数のノードで同期されていく感じはDBがなくなったような体験でした。

var gun = Gun(['http://server1.com/gun', 'http://server2.com/gun']);


オフラインファースト

上述の通り、何も意識しなくてもクライアントとサーバ間の同期をシームレスに実現できますので、オフライン時、ブラウザの場合はlocalStorage、Node.jsの場合はJSONファイルに永続化され、オンラインと同時に初期化時にPeerとして設定しているノードにデータが同期されます。


グラフ

これは良く解らないですがグラフDBだってことですかね...?とりあえずデータ構造的に後方互換を強制されることはないということらしいです。


IoTのShadow的なことを試してみる

AWS IoTのShadowみたいなことができそうなので試してみました(とりあえず今は時間ないのでHerokuとPCでやってみます)


HerokuボタンでgunDBサーバを起動


ローカルのPCに以下のスクリプトを書いて起動


app.js

var Gun = require('gun');

var gun = Gun('http://<Heroku App Host>/gun');

gun.get('key').get('led').on(function(data, key){
console.log(data, key);
});


起動すると以下のような感じになります。

$ node app.js 

Hello wonderful person! :) Thanks for using GUN, feel free to ask for help on https://gitter.im/amark/gun and ask StackOverflow questions tagged with 'gun'!
WARNING! This `file.js` module for gun is intended for local development testing only!


JSFiddleで即試す

JSFiddleExternal resourceshttps://cdn.jsdelivr.net/npm/gun/gun.js を読み込んで手軽に試します。

以下のJavascriptを書いて実行します。

var gun = Gun('http://<Heroku App Host>/gun');

gun.get('key').get('led').put("on", function(ack) {
console.log(ack);
});

PCのコンソールに以下のように表示されました。 on のとこを off に切り替えることでLEDをon/offしてるイメージですね。

$ node app.js 

Hello wonderful person! :) Thanks for using GUN, feel free to ask for help on https://gitter.im/amark/gun and ask StackOverflow questions tagged with 'gun'!
WARNING! This `file.js` module for gun is intended for local development testing only!
on led
off led