MilkcocoaをPubnub的な感じにする


Pubnubは"Publish Key"と"Subscribe Key"があり、Publish Keyがないとデータを送信できませんし、Subscribe Keyがないとデータを受け取れません。データを送信するだけのプログラムと、データを受け取るだけのプログラムを分けることができます。

今回はMilkcocoaで、これと同じことを実現してみます。Milkcocoaはアプリを作成した時は、基本的にセキュリティ的にオープンなので、以下のセットをテンプレート的に覚えておくと良いかもしれません。

管理画面での設定

1.認証タブの「認証済みクライアント以外を接続不可にする」をONにします。

2.API Keyを2つ作ってください。

3.セキュリティルールを設定します。

下記のように、sendができるのはAPI Keyの"ECENHDDHEILKACML"で接続しているのクライアントだけ、onでsendを監視できるのは、API Keyの"NIIBEALHBFFPGNAH"で接続しているクライアントだけ、というように設定します。

* {
    permit : send;
    rule : account.key == "ECENHDDHEILKACML";
}

* {
    permit : on(send);
    rule : account.key == "NIIBEALHBFFPGNAH";
}

設定はこれで終わりです。

プログラムを作る

次にpublisherとsubscriber用のプログラムを作成します。以下の二つは使用しているAPI Keyが違うだけです。

test_pub.js

var MilkCocoa = require('milkcocoa');
//先ほど作成したpublisher用のAPI Key
var milkcocoa = MilkCocoa.connectWithApiKey('{app_id}.mlkcca.com', 'ECENHDDHEILKACML', 'secret');
var ds = milkcocoa.dataStore('unity');

ds.on('send', function(e) {
  console.log(e);
});

setInterval(function() {
  ds.send({ message:"I'm publisher" });
}, 3000);

test_sub.js

var MilkCocoa = require('milkcocoa');
//先ほど作成したsubscriber用のAPI Key
var milkcocoa = MilkCocoa.connectWithApiKey('{app_id}.mlkcca.com', 'NIIBEALHBFFPGNAH', 'secret');
var ds = milkcocoa.dataStore('unity');

ds.on('send', function(e) {
  console.log(e);
});

setInterval(function() {
  ds.send({ message:"I'm subscriber" });
}, 3000);

この二つのプログラミを同時にを動かすと・・・

$ node test_sub.js 
{ path: 'unity', value: { message: 'I\'m publisher' } }
{ path: 'unity', value: { message: 'I\'m publisher' } }
{ path: 'unity', value: { message: 'I\'m publisher' } }
{ path: 'unity', value: { message: 'I\'m publisher' } }
{ path: 'unity', value: { message: 'I\'m publisher' } }
{ path: 'unity', value: { message: 'I\'m publisher' } }

$node test_pub.js 

以上のようにtest_sub.jsがtest_pub.jsのメッセージを受け取る形になります。test_sub.jsではメッセージのsendはできませんし、test_pub.jsではメッセージの受け取りはできません。

ちなみにAPI Keyを知らない人が繋ごうとしても…

test.js

var MilkCocoa = require('milkcocoa');
var milkcocoa = new MilkCocoa('uniib1d489g.mlkcca.com');

以下のようにコネクション数は全く増えません。