http2サーバーのtrusterdを共有ライブラリ化することで、mruby以外の言語から libffiを経由してhttp2サーバーを立ち上げ、http2サーバーでリクエストを受け付けた 際に、呼び出し元をコールバックする事を可能とするライブラリ。
git clone https://github.com/kjunichi/libtrusterd.git
cd libtrusterd
以下の環境変数の設定とlibopensslの有効化が必要。
brew install libev
brew install libxml2
brew install libevent
brew install zlib
brew install spdylay
export ACLOCAL_PATH=/usr/local/Cellar/libxml2/2.9.2/share/aclocal/
export PKG_CONFIG_PATH=/usr/local/Cellar/openssl/1.0.2/lib/pkgconfig:/usr/local/Cellar/zlib/1.2.8/lib/pkgconfig/
brew link openssl --force
作業終了後に
brew unlink openssl
git clone https://github.com/mruby/mruby.git
cd mruby
cp -f ../build_config.rb .
rake
cd ..
rake
なんとかして、SSLの証明書を用意するw。
以下の記事が多少参考になるかも。。
出来たら、 ssl配下に配置する。名前は以下の様にする。
- key.pem
- cert.pem
諦めが肝心w
trusterd.conf.rbを以下の様に編集することで、TLSを無効化出来る。
- # :tls => false,
+ :tls => false,
npm install kjunichi/node-ffi
npm install ref
var fs = require('fs');
var ref = require('ref');
var ffi = require('ffi');
var funcPtr = ffi.Function('int', ['string']);
var mylib = ffi.Library('./libtrusterd.dylib', {
'boot': ['int', ['string', funcPtr]]
});
var onResult = function(resultVal) {
console.log('Result is', resultVal);
return 0;
}
var script = fs.readFileSync("./trusterd.conf.rb",{encoding:"UTF-8"});
mylib.boot(script,onResult);
opam update
opam install ctypes
#use "topfind";;
#require "ctypes.foreign";;
#require "ctypes.top";;
open Ctypes;;
open PosixTypes;;
open Foreign;;
let cb_t = string @-> returning int;;
Dl.dlopen ~filename:"libtrusterd.dylib" ~flags:[Dl.RTLD_NOW];;
let boot = foreign "boot" (string @-> funptr cb_t @-> returning int);;
let f x =
begin
print_string x;
-1;
end;;
boot "puts 1+2;MyCall.my_exec('Hello,this is mruby!')" f;;
package main
// #cgo LDFLAGS: -L. -ltrusterd
/*
#include <stdlib.h>
#include <stdio.h>
typedef int (*FUNCPTR)(char *script);
int myCallback(char*);
int boot(char*, FUNCPTR);
static void testGoGo() {
boot("puts 1+2",(FUNCPTR)myCallback);
printf("%s","hello, Go!\n");
fflush(stdout);
}
*/
import "C"
import . "fmt"
//export myCallback
func myCallback(s *C.char) C.int {
//C.printf("%s\n",s)
Println(C.GoString(s))
return 0
}
func main() {
C.testGoGo()
}
go build trusterdGo.go
./trusterdGo