Joyent SmartMachinesでserver.js以外で動かす

表題通りです。
SocketStreamはsocketstream startというコマンドで起動するので、Expressのときのように
単純にserver.jsにリネームするだけでは出来ません。
そこで設定を変えることによりスタートアップコマンドを"node server.js"というデフォルト値から
"socketstream start"に書き換えます。
とりあえず成功したやつを先に書いときます。

成功バージョン

http://wiki.joyent.com/display/node/npm+Integration
ここのscripts.startという項に書かれています。
つまり、package.jsonにscriptsという項を増やせばいい。

"dependencies": {
  "request": ">=1.9.5",
  "socketstream": ">=0.2.1"
},
"scripts": { "start": "socketstream start"  }

これでおk
あとはgit pushすれば使えるようになります。
socketchatをアップしたのですが、読み込みが遅い。
これはサーバの遠さに起因するのかどうかを検証するために、次はさくらVPSで試してみます。
それでもダメだったら、Socket.IOのままで使うしか無いですね。
さて、普通の方はここで終わり。あとは反省会です。

失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した

単純にserver.jsからsocketstream startと呼べばいいじゃんって思ったんだよ

上記のやつを見つけるまではJoyentというPaaSは固くて、server.jsとしか呼べないんだと思っていました。
だから、server.jsからsocketstreamっていうコマンドを実行するしか無いと。

GitHub - node-ffi/node-ffi: Node.js Foreign Function Interface
node.jsから他の言語の関数を呼び出すライブラリです。贅沢にもこれからシステムコマンドをコールします。
coffeescriptシンタックスハイライトに対応していないのね
参考:javascript - node.js execute system command synchronously - Stack Overflow

FFI = require "node-ffi"
libc = new FFI.Library(null, {
  "system": ["int32", ["string"]]
})

run = libc.system
run("socketstream s")

これをjsにコンパイルしてnode server.jsすると、わーぉ、socketstreamが走ってる。
さてさて、満足げな顔してgit pushすると怒られた……。node-ffiのインストールが通らないみたいだ。
これに関しては1時間ぐらいねばってみたものの分からず。お蔵入りです。

  • child_processes

こんな凝ったことしなくても、node.jsに用意されたAPIでコールできるようです。ただし非同期。
child_processes - Node.js v0.4.11 Manual & Documentation
参考:http://snippets.dzone.com/posts/show/12069

sys = require "sys"
exec = require("child_process").exec

child = exec "socketstream s", (error, stdout, stderr) ->
  sys.print("stdout: #{stdout}")
  sys.print("stderr: #{error}")
  unless error?
    console.log("exec error: #{error}")

デバッグメッセージは出なくなったけれど確かに動いてはいる。
ほくほく顔でgit push。すんなり起動した! と思ったらなんかreturn 0が帰ってきたとかで死んだ?
ここは深く追求せずに終わってしまった。

収穫

とりあえず子プロセスを動かす方法が分かってよかったです。まる