Table of Contents generated with DocToc
- 1. 包协议
- 2. 相关操作
- 2.1 大端编码
- 2.2 大端解码
- 2.3 string转utf8-uint8Array[], utf8-uint8Array转string
- 2.4 json序列化
- 2.5 uint8Array拼接和读取
- 3. js-api
- 3.1 编码
- 3.1.1 pack(messageID, header, body)
- 3.1.2 packURL(urlPattern, body)
- 3.1.3 packSerialURL(urlPattern, body)
- 3.1.4 packPipeURL(params)
- 3.2解码
- 3.2.1 lengthOf(stream)
- 3.2.2 messageIDOf(stream)
- 3.2.3 headerLengthOf(stream)
- 3.2.4 headerOf(stream)
- 3.2.5 urlPatternOf(stream)
- 3.2.6 bodyLengthOf(stream)
- 3.2.7 bodyOf(stream)
1. 包协议
// [4]byte -- length fixed_size,binary big endian encode
// [4]byte -- messageID fixed_size,binary big endian encode
// [4]byte -- headerLength fixed_size,binary big endian encode
// [4]byte -- bodyLength fixed_size,binary big endian encode
// []byte -- header marshal by json
// []byte -- body marshal by json
2. 相关操作
2.1 大端编码
- 将uint32的数字,转变成[4]byte。 []byte对应js里的uint8Array
// params:: uint32
// return uInt8Array[4]
function daduanbianma(params) {
var bytes = new ArrayBuffer(4)
var view = new DataView(bytes)
// 大端编码
var number = params
view.setUint32(0, number, false)
return new Uint8Array(bytes)
}
2.2 大端解码
// params: uint8Array[4]
// return uint32
function daduanjiema(params) {
const buf = Buffer.from(params);
return buf.readUInt32BE(0)
}
2.3 string转utf8-uint8Array[], utf8-uint8Array转string
- 对header,body这样的文本结构,需要使用utf8转换器,因为js默认的是utf16.
// params::string
// return uint8Array[]
function encodeUTF8(params) {
var encoder = new TextEncoder('utf-8')
var buf = encoder.encode(params)
return buf
}
// params:: 由go服务端产生的utf8编码的uint8Array[]
// return string
func decodeUTF8UintArray(params) {
var decoder = new TextDecoder('utf-8')
var jsonStr = decoder.decode(params)
return jsonStr
}
2.4 json序列化
// 将{}转化为json string
var jsonobj = {'name': 'ft'}
var jsonstr = JSON.stringify(jsonobj)
// 将json string 转 json obj
var obj = JSON.parse(jsonstr)
2.5 uint8Array拼接和读取
// 拼接
// xulieLength 和 messageId均为 Uint8Array
var concatArray = new Uint8Array([...xulieLength,...messageId])
// 截取
// buffer为ArrayBuffer类型,从流中读取出来的默认类型
// 该句表示,头长度记录在该段序列的第八位后4个长度
var headerLengthBytes = new Uint8Array(buffer, 8, 4);
3. js-api
地址: http://www.baidu.com, 待更
3.1 编码
3.1.1 pack(messageID, header, body)
- 编码全部,使用示例:
pack(0, {
Router-Type:'URL_PATTERN',
URL-Pattern-Value: '/user-pool/kf-user-info/login/',
}, {
chanel: 'web,
})
3.1.2 packURL(urlPattern, body)
- 等价于
pack(0, {
Router-Type:'URL_PATTERN',
URL-Pattern-Value: urlPattern,
}, body)
示例:
packURL('/user-pool/kf-user-info/login/', {chanel: 'web'})
3.1.3 packSerialURL(urlPattern, body)
- 发送的消息将被串行处理,该消息处理完毕以前,后续的消息会等待。
- 一般应用于登录,鉴权,验证等。
- 等价于
pack(2020, {
Router-Type:'URL_PATTERN',
URL-Pattern-Value: urlPattern,
}, body)
- 示例:
packSerialURL('/user-pool/kf-user-info/login/', {chanel: 'web'})
3.1.4 packPipeURL(params)
- 该串消息,将会同步按顺序执行,并且,params里的消息集互为串行,和其他的消息为并行。
params格式为:
[
{
urlPattern: '/user-pool/kf-user-info/login/',
body: {chanel: 'web'}
},
{
urlPattern: '/user-pool/kf-user-info/login/',
body: {chanel: 'web'}
},
]
3.2解码
3.2.1 lengthOf(stream)
• 获取#1的包协议中length,它比一个包协议长度少4
• stream 是 uint8Array类型,为一个包单位
• 返回uint32
var l = lengthOf(stream)
3.2.2 messageIDOf(stream)
• 获取包协议中的消息号
• stream是uint8Array类型,为一个包单位
• 返回uint32
var messageID = messageIDOf(stream)
3.2.3 headerLengthOf(stream)
• 获取包协议中的头部长度
• stream是uint8Array类型,为一个包单位
• 返回uint32
var headerLength = headerLengthOf(stream)
3.2.4 headerOf(stream)
• 获取包协议中的头部
• stream是uint8Array类型,为一个包单位
• 返回对象{}
var header = headerOf(stream)
3.2.5 urlPatternOf(stream)
• 获取包协议中的头部长度
• stream是uint8Array类型,为一个包单位
• 返回string
var urlPattern = urlPatternOf(stream)
3.2.6 bodyLengthOf(stream)
• 获取包协议中的body长度
• stream是uint8Array类型,为一个包单位
• 返回uint32
var bodyLength = bodyLengthOf(stream)
3.2.7 bodyOf(stream)
• 获取包协议中的body
• stream是uint8Array类型,为一个包单位
• 返回对象{}
var body = bodyOf(stream)