UNPKG

commonui-lib-test

Version:

"#common ui lib test"

120 lines (119 loc) 5.67 kB
"use strict"; /*! * 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();