Meteorでユーザのオンライン状態を取得するためのパッケージ
Meteorではクライアントは常にサーバに接続しているため、クライアント(ユーザ)の状態を取得することが容易であるはずです。本記事では、それを簡単に行うためのパッケージを紹介します。
user-status
mizzao:user-statusは、ユーザの接続状態を取得するパッケージです。ユーザの接続状態とは、IPアドレスやブラウザの種類(user-agent)やクライアントでの活動などです。これらの情報が通常のMeteor.usersでアクセスできるようになります。
具体的に何ができるかは、デモやソースコードを参照するとよいでしょう。
インストール方法
いつも通り、
$ meteor add mizzao:user-status
としてパッケージをインストールします。
リバースプロクシを設置している場合は、クライアントの正しいIPアドレスを取得するためにHTTP_FORWARDED_COUNT環境変数を設定しなければなりません。詳しくは、ドキュメントを参照のこと。
基本的な使い方
Meteor.usersにstatusフィールドが追加され、ユーザの接続状態が自動で更新されます。userIdに対応する接続が一つでもあればそのユーザは接続しているとみなされます。statusには下記のフィールドがあります。
online: このユーザに対応するコネクションが一つでもあればtrueになりますlastLogin: このユーザが最も最近ログインした情報がdateとipAddrとuserAgentで指定されますidle: このユーザに対応するすべてのコネクションがアイドル状態の場合trueになりますlastActivity: このユーザがアイドル状態の場合、最後にアクションがあった時刻で、ユーザがオンラインかつアイドルの場合にのみ利用可能です
このstatusフィールドをクライアント側からもアクセスできるようにするには、例えば次のようにサーバでpublishします。
  | 
  | 
必要に応じてfieldsオプションでpublish範囲を制限してください。
もしくは、次のように個別にオンラインやオフラインになった時の処理を記述することもできます。
  | 
  | 
Meteor.usersをクライアントで使う場合は、例えば、テンプレートのヘルパーに設定します。
  | 
  | 
高度な使い方
Client API
クライアントではUserStatusというオブジェクトでクライアント活動のモニタリングを行います。デフォルトでは、windowのクリックイベントとキーイベント(keypress)を監視してアクションの有無を判定します。UserStatusには下記の関数が設定されています。
startMonitor: アイドル判定を開始する関数です。引数は、threshold(アイドルとみなすまでの時間)、interval(アイドル判定をする頻度)、idleOnBlur(windowのblurイベントをアイドルとみなすか)の3つですstopMonitor: 監視を止める関数ですpingMonitor: 手動で一度だけ監視するための関数ですisIdle: 現在アイドル状態かを示すリアクティブ変数ですlastActivity: 最後にアクション(クリックもしくはキー)が起こった時刻を保持するリアクティブ変数です。これを使うと再計算が頻繁に発生するため、デバッグなどの用途に留めるべきです
Server API
UserStatus.connectionsというインメモリコレクションがすべてのコネクションの情報を保持します。各情報には下記のフィールドがあります。
_id: コネクションIDですuserId: 認証している場合のユーザIDですipAddr: クライアントのIPアドレスですuserAgent: ブラウザのUser-AgentですloginTime: 認証している場合のログイン時刻ですidle: アイドル監視をしていて、クライアントがアイドル状態になるとtrueになります
UserStatus.eventsオブジェクトはEventEmitterでユーザのログイン/ログアウトの変更を受け取れます。ブラウザの終了はログアウトとみなされ、新しいブラウザウィンドウは新しいログインとみなされます。下記のイベントがサポートされています。
  | 
  | 
感想
以上で紹介したように、アイドル判定はそれなりに苦労しているものの、全体としてはMeteorとうまく融合した便利なパッケージになっていると思います。Meteorの魅力の一つは豊富なパッケージなので、ぜひ活用したいところです。