• foonyah のディレクトリ構造


            foonyah project structure:
            "git" ... public repository
            "svn" .. private sources
            │── etc
            │── lib
            │   │── engine
            │   │── etc
            │   └── web
            │       │── web-server
            │       └── websocket-server
            │── node_modules
            │   │── contextify
            │   │── express
            │   │── foonyah-cluster (svn: foonyah-cluster)
            │   │── foonyah-gridfs (svn: foonyah-gridfs)
            │   │── foonyah-libs (svn: foonyah-libs)
            │   │── foonyah-plugins (svn: foonyah-plugins)
            │   │── iconv
            │   │── jQuery (git: ystskm/jQuery)
            │   │── jsdom
            │   │── mime (git: ystskm/node-mime)
            │   │── mongo (git: ystskm/node-mongodb-native)
            │   │── spdy
            │   │── websockets (git: ystskm/node-websockets)
            │   └── xjQuery (git: ystskm/xjQuery)
            │── test
            └── tmp
          • データ関連

            • 暗黙的なデータ型変換

              Mongodb の特性を直感的に持ち入り易いよう、foonyah の標準DBへのアクセスにはいくつかの暗黙型変換とそれを回避する方法が備えられています。
              Nuber obj == "0" || /^[\-\+]?([1-9]\d*|^0\.\d+)$/.test(obj)
              Boolean "true" "false"
              ObjectId /^[0-9a-fA-F]{24}$/
              Long
              <=>
              String()
          • プラグイン関連

            • 汎用名前空間

              miscellaneous boxfoonyah 上に用意された自由なクロージャー空間です。
              非常に簡単に put および get が出来ます。
              // get
              foonyah.mbox([plugin-name]);
              // put
              foonyah.mbox([plugin-name], [something])
              プラグイン設計者はここに関数やオブジェクトを配置することで、それらをサーバーサイドでもブラウザサイドでも自由に呼び出すことが出来ます。
            • 自己参照の方法

              plugin には別名を付けることが出来ますが、前項「自分自身で受けるリクエスト」に対して自分自身を呼び出すときはどのように記述すべきでしょうか。これは通常の名前で呼び出されるべきです。
              foonyah.call('login')
              複数の同じモジュールがインポートされている場合等が考えられます。この場合、デフォルトでは最初に登録されたプラグインインスタンスがコールされています。変更したい場合は開発者が明示的にどれを標準呼び出し用とするか定義する必要があります。(TODO)
            • 自身から受けるリクエスト

              プラグインは時に自分自身でリクエストを受け、イベントによりアプリケーションに状況を通知することがあります。この場合、プラグインモジュールの返し方は統一されてなければいけません。これはプラグインユーザーの利便性を保つ為です。

              1)イベントは data, end または error です。
              data, end は処理の正常終了、errorは処理の異常終了に用いることとし、正常終了の中の異常終了(例えば「ログイン失敗」など)は end イベントで処理する必要があります。
              本当に分かりよい場合にだけ、イベントの追加の必要性が認められるかもしれません。

              2)end イベントの第一引数または error の第二引数に キーが "base"、res と callback を含むオブジェクトを返します。

              3)状態を渡したい場合は2)のオブジェクトの中に「state」キーを含ませます。値は自由です。ドキュメント等に記載してユーザーに対して開示してください。(参:login)

              ※ 附則:自身で受けるリクエストに関して、application がイベントを受け取れるようにする場合
              1)イベントは message を用いてください。(参:logger)
            • モジュール化のヒント

              ブラウザ内で window.foonyah 空間を曝け出すことはセキュリティ上望まれません。
              多くのアプリケーションではリリース時にこの空間を削除ないし隠蔽することが想定されます。
              プラグインはこの他愛無い且つとても重要な設計を考慮しなければなりません。
              例えば index.js の開始は前項と同じく統一されます。
              /***/
              /* foonyah-plugin sample index.js */
              (function(f) {
              f && f.prepare('sample');
              })(window.foonyah);

              これで最終的に window.foonyah がなくても動作する環境が出来ます。
              そしてプラグインモジュール内で window.foonyah を使うことは避けるべきです。もし複数の後読みを行うファイルに分ける場合は、miscellaneous box に格納するなどして、window.foonyah でない名前空間を通して受け渡すと良いでしょう。