fasthttp-websocket-example via flatbuffers ( in go / javascript)
a example for websocket via
chinese README / 中文说明
1. flatbuffers IDL example
xone.fbs example from https://www.cnblogs.com/sevenstar/p/FlatBuffer.html, thanks
namespace xone.genflat;
table LoginRequest{
msgID:int=1;
username:string;
password:string;
}
table LoginResponse{
msgID:int=2;
uid:string;
}
//root_type非必须。
//root_type LoginRequest;
//root_type LoginRespons
2. flatc
generate javascript
flatc -s --gen-mutable ./*.fbs
generate golang
flatc --go --gen-object-api --gen-all --gen-compare --raw-binary ./*.fbs
3. some code explain
./cmd/wsserver/main.go ----- websocket server
./cmd/wsclient/main.go ----- websocket client
./ws/... ------------------- websocket go code for websocket handler and websocket client
./jsclient/ws.js ---------- javascript client code , please check-out package.json for depends
4. javascript
// ------------ ./jsclient/index.js
const flatbuffers = require('./flatbuffers').flatbuffers;
const xone = require('./xone_generated').xone; //Generated by `flatc`.
//-------------------------------------------
// serialized
//-------------------------------------------
let b = new flatbuffers.Builder(1);
let username = b.createString("zlssssssssssssh");
let password = b.createString("xxxxxxxxxxxxxxxxxxx");
xone.genflat.LoginRequest.startLoginRequest(b);
xone.genflat.LoginRequest.addUsername(b, username);
xone.genflat.LoginRequest.addPassword(b, password);
xone.genflat.LoginRequest.addMsgID(b, 5);
let req = xone.genflat.LoginRequest.endLoginRequest(b);
b.finish(req); //创建结束时记得调用这个finish方法。
let uint8Array = b.asUint8Array();
console.log(uint8Array);
// console.log(b.dataBuffer() );
//-------------------------------------------
// un-serialized
//-------------------------------------------
let bb = new flatbuffers.ByteBuffer(uint8Array);
let lgg = xone.genflat.LoginRequest.getRootAsLoginRequest(bb);
console.log("username: ", lgg.username());
console.log("password", lgg.password());
console.log("msgID: ", lgg.msgID());
5. flatbuffers serialized / un-serialized in golang
// ------ ./apis/genflat/model.go
func (a *LoginRequestT) Byte() []byte {
b := flatbuffers.NewBuilder(0)
b.Finish(LoginRequestPack(b, a))
return b.FinishedBytes()
}
func ByteLoginRequestT(b []byte) *LoginRequestT {
return GetRootAsLoginRequest(b, 0).UnPack()
}
// ------- ./apis/genflat/model_test.go
func TestLoginRequestT_Byte(t *testing.T) {
as := assert.New(t)
// serialized
l := &LoginRequestT{
MsgID: 1,
Username: "1",
Password: "1",
}
b := l.Byte()
// un-serialized
c := ByteLoginRequestT(b)
if l.MsgID > 0 {
fmt.Println(" id > ", c.MsgID, " u > ", c.Username, " pw > ", c.Password)
}
as.Equal(l.Password, c.Password)
}
6. websocket Code
ws.onmessage = (event) => {
//-------------------------------------------------------------------
// read from websocket and un-serialized via flatbuffers
//--------------------------------------------------------------------
let aa = str2ab(event.data);
let bb = new flatbuffers.ByteBuffer(aa);
let lgg = xone.genflat.LoginRequest.getRootAsLoginRequest(bb);
let pw = lgg.password();
if (typeof pw === 'string') {
console.log("----------------------------------------------");
console.log("username: ", lgg.username());
console.log("password", lgg.password());
console.log("msgID: ", lgg.msgID());
} else {
console.log("=================================");
console.log(event.data);
}
// console.log(`Roundtrip time: ${Date.now() }` , ab2str(d ));
setTimeout(function timeout() {
//-------------------------------------------------------------------
// serialized via flatbuffers and send to websocket
//--------------------------------------------------------------------
let b = new flatbuffers.Builder(1);
let username = b.createString("zlssssssssssssh");
let password = b.createString("xxxxxxxxxxxxxxxxxxx");
xone.genflat.LoginRequest.startLoginRequest(b);
xone.genflat.LoginRequest.addUsername(b, username);
xone.genflat.LoginRequest.addPassword(b, password);
xone.genflat.LoginRequest.addMsgID(b, 5);
let req = xone.genflat.LoginRequest.endLoginRequest(b);
b.finish(req); //创建结束时记得调用这个finish方法。
let uint8Array = b.asUint8Array();
ws.send(uint8Array);
}, 500);
};
function str2ab(str) {
let array = new Uint8Array(str.length);
for (let i = 0; i < str.length; i++) {
array[i] = str.charCodeAt(i);
}
return array
}
6. un-serialized refence
8. License
MIT
code by tsingson