commonui-lib-test
Version:
"#common ui lib test"
120 lines (119 loc) • 5.67 kB
JavaScript
;
/*!
* protocolHandler.js
*
* tool for protocal encode & decode
*
* Includes buffer (for browser, except node.js)
* https://github.com/feross/buffer
*
* Released under the MIT license
*
* Author: Andersen
* Date: 2019/04/25
* Version: 0.0.1
*/
Object.defineProperty(exports, "__esModule", { value: true });
const buffer_1 = require("buffer");
exports.ProtocolBuilder = function () {
let self = this;
this.Encode_FromBinary = function (memoryStream, value) { encodeFrom('', 0, memoryStream, value); };
this.Encode_FromBool = function (memoryStream, value) { encodeFrom('writeUIntLE', 1, memoryStream, (value ? 1 : 0)); };
this.Encode_FromByte = function (memoryStream, value) { encodeFrom('writeUIntLE', 1, memoryStream, value); };
this.Encode_FromShort = function (memoryStream, value) { encodeFrom('writeIntLE', 2, memoryStream, value); };
this.Encode_FromUShort = function (memoryStream, value) { encodeFrom('writeUIntLE', 2, memoryStream, value); };
this.Encode_FromInt = function (memoryStream, value) { encodeFrom('writeIntLE', 4, memoryStream, value); };
this.Encode_FromInt64 = function (memoryStream, value) { encodeFrom('writeIntLE', 8, memoryStream, value); };
this.Encode_FromDouble = function (memoryStream, value) { encodeFrom('writeDoubleLE', 8, memoryStream, value); };
this.Encode_FromString = function (memoryStream, value) { encodeFrom('String', 4, memoryStream, value); };
this.Encode_FromEnum = function (memoryStream, value) {
self.Encode_FromString(memoryStream, 'u1');
encodeFrom('writeUIntLE', 1, memoryStream, value);
};
this.Decode_ToBool = function (memoryStream) { return !!decodeTo(1, 'readUIntLE', memoryStream); };
this.Decode_ToByte = function (memoryStream) { return decodeTo(1, 'readUIntLE', memoryStream); };
this.Decode_ToShort = function (memoryStream) { return decodeTo(2, 'readIntLE', memoryStream); };
this.Decode_ToUShort = function (memoryStream) { return decodeTo(2, 'readUIntLE', memoryStream); };
this.Decode_ToInt = function (memoryStream) { return decodeTo(4, 'readIntLE', memoryStream); };
this.Decode_ToInt64 = function (memoryStream) { return decodeTo(8, 'readIntLE', memoryStream); };
this.Decode_ToDouble = function (memoryStream) { return decodeTo(8, 'readDoubleLE', memoryStream); };
this.Decode_ToString = function (memoryStream) { return decodeTo(self.Decode_ToInt(memoryStream), 'String', memoryStream); };
this.Decode_ToEnum = function (memoryStream) {
let orignPart1 = memoryStream._buffer.slice(0, memoryStream._buffer.length - 1);
memoryStream._buffer = memoryStream._buffer.slice(memoryStream._buffer.length - 1, memoryStream._buffer.length);
let res = self.Decode_ToByte(memoryStream);
memoryStream._buffer = buffer_1.Buffer.concat([orignPart1, memoryStream._buffer]);
return res;
};
};
exports.MemoryStream = function (buffer) {
let self = this;
self._position = 0;
self._buffer = buffer_1.Buffer.from(buffer || []);
self.initialBuffer = function (buffer) {
self._buffer = buffer;
self._position = 0;
};
self.concatenate = function (newBuffer) {
self._buffer = buffer_1.Buffer.concat([self._buffer, newBuffer]);
self._position = this._buffer.length - 1;
};
self.getPosition = function () { return self._position; };
self.setPosition = function (p) { self._position = p; };
self.getData = function () { return self._buffer; };
self.getLength = function () { return self._buffer.length; };
};
function encodeFrom(bType, bSize, memoryStream, value) {
let bf;
if (buffer_1.Buffer.isBuffer(value)) {
bf = value;
}
else if (getType(value) === 'uint8array') {
bf = buffer_1.Buffer.from(value);
}
else if (getType(value) === 'number') {
bf = buffer_1.Buffer.from(new Array(bSize));
if (bType === 'writeUIntLE' || bType === 'writeIntLE') {
bf[bType](value, 0, bSize);
}
else {
bf[bType](value);
}
}
else if (getType(value) === 'string') {
let encodeString = encodeURIComponent(value);
let stringArray = [];
for (var i = 0; i < encodeString.length; i++) {
stringArray.push(encodeString.charCodeAt(i));
}
let len = encodeString.length;
bf = buffer_1.Buffer.from(new Array(bSize));
bf['writeUIntLE'](encodeString.length, 0, bSize);
let sBf = buffer_1.Buffer.from(stringArray);
bf = buffer_1.Buffer.concat([bf, sBf]);
}
memoryStream.concatenate(bf);
}
function decodeTo(bSize, decodeType, memoryStream) {
let res;
let startPosition = memoryStream.getPosition();
let endPosition = startPosition + bSize;
let mem = memoryStream.getData().slice(startPosition, endPosition);
if (decodeType === 'readUIntLE' || decodeType === 'readIntLE') {
res = mem[decodeType](0, bSize);
}
if (decodeType === 'readDoubleLE') {
res = mem[decodeType]();
}
if (decodeType === 'String') {
endPosition = startPosition + bSize;
mem = memoryStream.getData().slice(startPosition, endPosition);
let encodedString = String.fromCharCode.apply(null, mem);
let decodedString = decodeURIComponent(encodedString);
res = decodedString;
}
memoryStream.setPosition(endPosition);
return res;
}
// 檢查型別
let getType = data => Object.prototype.toString.call(data).slice(8, -1).toLowerCase();