1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { WireType } from '../message/WireType';
17fb726d48Sopenharmony_ciimport { SessionHandShake } from '../message/SessionHandShake';
18fb726d48Sopenharmony_ciimport { PayloadProtect } from '../message/PayloadProtect';
19fb726d48Sopenharmony_ciimport { TransferConfig } from '../message/TransferConfig';
20fb726d48Sopenharmony_ciimport { TransferPayload } from '../message/TransferPayload';
21fb726d48Sopenharmony_ciimport { log } from '../../log/Log';
22fb726d48Sopenharmony_ci
23fb726d48Sopenharmony_ciexport class Serialize {
24fb726d48Sopenharmony_ci  static bannerByteLength: number = 8;
25fb726d48Sopenharmony_ci
26fb726d48Sopenharmony_ci  static serializeSessionHandShake(handShake: SessionHandShake): Uint8Array {
27fb726d48Sopenharmony_ci    let bannerValue = this.serializeToString(1, handShake.banner);
28fb726d48Sopenharmony_ci    let authTypeValue = this.serializeU8(2, handShake.authType);
29fb726d48Sopenharmony_ci    let sessionIdValue = this.serializeU32(3, handShake.sessionId);
30fb726d48Sopenharmony_ci    let connectKey = this.serializeToString(4, handShake.connectKey);
31fb726d48Sopenharmony_ci    let buf = this.serializeToString(5, handShake.buf);
32fb726d48Sopenharmony_ci    let version = this.serializeToString(6, handShake.version);
33fb726d48Sopenharmony_ci    let mergedArray = new Uint8Array(
34fb726d48Sopenharmony_ci      bannerValue.length + authTypeValue.length + sessionIdValue.length + connectKey.length + buf.length + version.length
35fb726d48Sopenharmony_ci    );
36fb726d48Sopenharmony_ci    mergedArray.set(bannerValue);
37fb726d48Sopenharmony_ci    mergedArray.set(authTypeValue, bannerValue.length);
38fb726d48Sopenharmony_ci    mergedArray.set(sessionIdValue, bannerValue.length + authTypeValue.length);
39fb726d48Sopenharmony_ci    mergedArray.set(connectKey, bannerValue.length + authTypeValue.length + sessionIdValue.length);
40fb726d48Sopenharmony_ci    mergedArray.set(buf, bannerValue.length + authTypeValue.length + sessionIdValue.length + connectKey.length);
41fb726d48Sopenharmony_ci    mergedArray.set(version, bannerValue.length + authTypeValue.length + sessionIdValue.length + connectKey.length + buf.length);
42fb726d48Sopenharmony_ci    return mergedArray;
43fb726d48Sopenharmony_ci  }
44fb726d48Sopenharmony_ci
45fb726d48Sopenharmony_ci  static serializePayloadProtect(payloadProtect: PayloadProtect): Uint8Array {
46fb726d48Sopenharmony_ci    let channelId = this.serializeU32(1, payloadProtect.channelId);
47fb726d48Sopenharmony_ci    let commandFlag = this.serializeU32(2, payloadProtect.commandFlag);
48fb726d48Sopenharmony_ci    let checkSum = this.serializeU8(3, payloadProtect.checkSum);
49fb726d48Sopenharmony_ci    let vCode = this.serializeU8(4, payloadProtect.vCode);
50fb726d48Sopenharmony_ci    let mergedArray = new Uint8Array(channelId.length + commandFlag.length + checkSum.length + vCode.length);
51fb726d48Sopenharmony_ci    mergedArray.set(channelId);
52fb726d48Sopenharmony_ci    mergedArray.set(commandFlag, channelId.length);
53fb726d48Sopenharmony_ci    mergedArray.set(checkSum, channelId.length + commandFlag.length);
54fb726d48Sopenharmony_ci    mergedArray.set(vCode, channelId.length + commandFlag.length + checkSum.length);
55fb726d48Sopenharmony_ci    return mergedArray;
56fb726d48Sopenharmony_ci  }
57fb726d48Sopenharmony_ci
58fb726d48Sopenharmony_ci  static serializeTransferConfig(transferConfig: TransferConfig): Uint8Array {
59fb726d48Sopenharmony_ci    let fileSizeValue = this.serializeU64(1, transferConfig.fileSize);
60fb726d48Sopenharmony_ci    let atimeValue = this.serializeU64(2, transferConfig.atime);
61fb726d48Sopenharmony_ci    let mtimeValue = this.serializeU64(3, transferConfig.mtime);
62fb726d48Sopenharmony_ci    let optionsValue = this.serializeToString(4, transferConfig.options);
63fb726d48Sopenharmony_ci    let pathValue = this.serializeToString(5, transferConfig.path);
64fb726d48Sopenharmony_ci    let optionalNameValue = this.serializeToString(6, transferConfig.optionalName);
65fb726d48Sopenharmony_ci    let updateIfNewValue = this.serializeU32(7, transferConfig.updateIfNew ? 1 : 0);
66fb726d48Sopenharmony_ci    let compressTypeValue = this.serializeU8(8, transferConfig.compressType);
67fb726d48Sopenharmony_ci    let holdTimestampValue = this.serializeU32(9, transferConfig.holdTimestamp ? 1 : 0);
68fb726d48Sopenharmony_ci    let functionNameValue = this.serializeToString(10, transferConfig.functionName);
69fb726d48Sopenharmony_ci    let clientCwdValue = this.serializeToString(11, transferConfig.clientCwd);
70fb726d48Sopenharmony_ci    let reserve1Value = this.serializeToString(12, transferConfig.reserve1);
71fb726d48Sopenharmony_ci    let reserve2Value = this.serializeToString(13, transferConfig.reserve2);
72fb726d48Sopenharmony_ci    let mergedArray = new Uint8Array(
73fb726d48Sopenharmony_ci      fileSizeValue.length +
74fb726d48Sopenharmony_ci        atimeValue.length +
75fb726d48Sopenharmony_ci        mtimeValue.length +
76fb726d48Sopenharmony_ci        optionsValue.length +
77fb726d48Sopenharmony_ci        pathValue.length +
78fb726d48Sopenharmony_ci        optionalNameValue.length +
79fb726d48Sopenharmony_ci        updateIfNewValue.length +
80fb726d48Sopenharmony_ci        compressTypeValue.length +
81fb726d48Sopenharmony_ci        holdTimestampValue.length +
82fb726d48Sopenharmony_ci        functionNameValue.length +
83fb726d48Sopenharmony_ci        clientCwdValue.length +
84fb726d48Sopenharmony_ci        reserve1Value.length +
85fb726d48Sopenharmony_ci        reserve2Value.length
86fb726d48Sopenharmony_ci    );
87fb726d48Sopenharmony_ci    let offset = 0;
88fb726d48Sopenharmony_ci    mergedArray.set(fileSizeValue);
89fb726d48Sopenharmony_ci    offset += fileSizeValue.length;
90fb726d48Sopenharmony_ci    mergedArray.set(atimeValue, offset);
91fb726d48Sopenharmony_ci    offset += atimeValue.length;
92fb726d48Sopenharmony_ci    mergedArray.set(mtimeValue, offset);
93fb726d48Sopenharmony_ci    offset += mtimeValue.length;
94fb726d48Sopenharmony_ci    mergedArray.set(optionsValue, offset);
95fb726d48Sopenharmony_ci    offset += optionsValue.length;
96fb726d48Sopenharmony_ci    mergedArray.set(pathValue, offset);
97fb726d48Sopenharmony_ci    offset += pathValue.length;
98fb726d48Sopenharmony_ci    mergedArray.set(optionalNameValue, offset);
99fb726d48Sopenharmony_ci    offset += optionalNameValue.length;
100fb726d48Sopenharmony_ci    mergedArray.set(updateIfNewValue, offset);
101fb726d48Sopenharmony_ci    offset += updateIfNewValue.length;
102fb726d48Sopenharmony_ci    mergedArray.set(compressTypeValue, offset);
103fb726d48Sopenharmony_ci    offset += compressTypeValue.length;
104fb726d48Sopenharmony_ci    mergedArray.set(holdTimestampValue, offset);
105fb726d48Sopenharmony_ci    offset += holdTimestampValue.length;
106fb726d48Sopenharmony_ci    mergedArray.set(functionNameValue, offset);
107fb726d48Sopenharmony_ci    offset += functionNameValue.length;
108fb726d48Sopenharmony_ci    mergedArray.set(clientCwdValue, offset);
109fb726d48Sopenharmony_ci    offset += clientCwdValue.length;
110fb726d48Sopenharmony_ci    mergedArray.set(reserve1Value, offset);
111fb726d48Sopenharmony_ci    offset += reserve1Value.length;
112fb726d48Sopenharmony_ci    mergedArray.set(reserve2Value, offset);
113fb726d48Sopenharmony_ci    return mergedArray;
114fb726d48Sopenharmony_ci  }
115fb726d48Sopenharmony_ci
116fb726d48Sopenharmony_ci  static serializeTransferPayload(transferPayload: TransferPayload): Uint8Array {
117fb726d48Sopenharmony_ci    let indexValue = this.serializeU64(1, transferPayload.index);
118fb726d48Sopenharmony_ci    let compressTypeValue = this.serializeU8(2, transferPayload.compressType);
119fb726d48Sopenharmony_ci    let compressSizeValue = this.serializeU32(3, transferPayload.compressSize);
120fb726d48Sopenharmony_ci    let uncompressSizeValue = this.serializeU32(4, transferPayload.uncompressSize);
121fb726d48Sopenharmony_ci    let mergedArray = new Uint8Array(
122fb726d48Sopenharmony_ci      indexValue.length + compressTypeValue.length + compressSizeValue.length + uncompressSizeValue.length
123fb726d48Sopenharmony_ci    );
124fb726d48Sopenharmony_ci    let offset = 0;
125fb726d48Sopenharmony_ci    mergedArray.set(indexValue);
126fb726d48Sopenharmony_ci    offset += indexValue.length;
127fb726d48Sopenharmony_ci    mergedArray.set(compressTypeValue, offset);
128fb726d48Sopenharmony_ci    offset += compressTypeValue.length;
129fb726d48Sopenharmony_ci    mergedArray.set(compressSizeValue, offset);
130fb726d48Sopenharmony_ci    offset += compressSizeValue.length;
131fb726d48Sopenharmony_ci    mergedArray.set(uncompressSizeValue, offset);
132fb726d48Sopenharmony_ci    return mergedArray;
133fb726d48Sopenharmony_ci  }
134fb726d48Sopenharmony_ci
135fb726d48Sopenharmony_ci  static serializeToString(tag: number, value: string): Uint8Array {
136fb726d48Sopenharmony_ci    let number = this.makeTagWireType(tag, WireType.LENGTH_DELIMETED);
137fb726d48Sopenharmony_ci    let data = this.writeVarIntU32(number);
138fb726d48Sopenharmony_ci    let dataLength = this.writeVarIntU32(value.length);
139fb726d48Sopenharmony_ci    const encoder = new TextEncoder();
140fb726d48Sopenharmony_ci    const buffer = encoder.encode(value);
141fb726d48Sopenharmony_ci    let stringValue = new Uint8Array(data.length + dataLength.length + buffer.length);
142fb726d48Sopenharmony_ci    stringValue.set(data);
143fb726d48Sopenharmony_ci    stringValue.set(dataLength, data.length);
144fb726d48Sopenharmony_ci    stringValue.set(buffer, data.length + dataLength.length);
145fb726d48Sopenharmony_ci    return stringValue;
146fb726d48Sopenharmony_ci  }
147fb726d48Sopenharmony_ci
148fb726d48Sopenharmony_ci  static serializeU8(tag: number, value: number): Uint8Array {
149fb726d48Sopenharmony_ci    return this.serializeU32(tag, value);
150fb726d48Sopenharmony_ci  }
151fb726d48Sopenharmony_ci
152fb726d48Sopenharmony_ci  static serializeU32(tag: number, value: number): Uint8Array {
153fb726d48Sopenharmony_ci    let makeTagWireType = this.writeTagWriteType(tag, WireType.VARINT);
154fb726d48Sopenharmony_ci    let writeVarInt = this.writeVarIntU32(value);
155fb726d48Sopenharmony_ci    let mergedArray = new Uint8Array(makeTagWireType.length + writeVarInt.length);
156fb726d48Sopenharmony_ci    mergedArray.set(makeTagWireType);
157fb726d48Sopenharmony_ci    mergedArray.set(writeVarInt, makeTagWireType.length);
158fb726d48Sopenharmony_ci    return mergedArray;
159fb726d48Sopenharmony_ci  }
160fb726d48Sopenharmony_ci
161fb726d48Sopenharmony_ci  static serializeU64(tag: number, value: number): Uint8Array {
162fb726d48Sopenharmony_ci    let makeTagWireType = this.writeTagWriteType(tag, WireType.VARINT);
163fb726d48Sopenharmony_ci    let writeVarInt = this.writeVarIntU64(value);
164fb726d48Sopenharmony_ci    let mergedArray = new Uint8Array(makeTagWireType.length + writeVarInt.length);
165fb726d48Sopenharmony_ci    mergedArray.set(makeTagWireType);
166fb726d48Sopenharmony_ci    mergedArray.set(writeVarInt, makeTagWireType.length);
167fb726d48Sopenharmony_ci    return mergedArray;
168fb726d48Sopenharmony_ci  }
169fb726d48Sopenharmony_ci
170fb726d48Sopenharmony_ci  static writeTagWriteType(tag: number, wireType: number): Uint8Array {
171fb726d48Sopenharmony_ci    let number = this.makeTagWireType(tag, wireType);
172fb726d48Sopenharmony_ci    return this.writeVarIntU32(number);
173fb726d48Sopenharmony_ci  }
174fb726d48Sopenharmony_ci
175fb726d48Sopenharmony_ci  static makeTagWireType(tag: number, wireType: number): number {
176fb726d48Sopenharmony_ci    return (tag << 3) | wireType;
177fb726d48Sopenharmony_ci  }
178fb726d48Sopenharmony_ci
179fb726d48Sopenharmony_ci  static writeVarIntU64(u64value: number): Uint8Array {
180fb726d48Sopenharmony_ci    let uint64buffer: number[] = [];
181fb726d48Sopenharmony_ci    for (let index = 0; index < 10; index++) {
182fb726d48Sopenharmony_ci      uint64buffer[index] = u64value & 0b01111111;
183fb726d48Sopenharmony_ci      u64value = u64value >> 7;
184fb726d48Sopenharmony_ci      if (u64value) {
185fb726d48Sopenharmony_ci        uint64buffer[index] = uint64buffer[index] | 0b10000000;
186fb726d48Sopenharmony_ci      } else {
187fb726d48Sopenharmony_ci        break;
188fb726d48Sopenharmony_ci      }
189fb726d48Sopenharmony_ci    }
190fb726d48Sopenharmony_ci    return new Uint8Array(uint64buffer);
191fb726d48Sopenharmony_ci  }
192fb726d48Sopenharmony_ci
193fb726d48Sopenharmony_ci  static writeVarIntU32(u32value: number): Uint8Array {
194fb726d48Sopenharmony_ci    let u32buffer: number[] = [];
195fb726d48Sopenharmony_ci    for (let index = 0; index < 5; index++) {
196fb726d48Sopenharmony_ci      u32buffer[index] = u32value & 0b01111111;
197fb726d48Sopenharmony_ci      u32value = u32value >> 7;
198fb726d48Sopenharmony_ci      if (u32value) {
199fb726d48Sopenharmony_ci        u32buffer[index] = u32buffer[index] | 0b10000000;
200fb726d48Sopenharmony_ci      } else {
201fb726d48Sopenharmony_ci        break;
202fb726d48Sopenharmony_ci      }
203fb726d48Sopenharmony_ci    }
204fb726d48Sopenharmony_ci    return new Uint8Array(u32buffer);
205fb726d48Sopenharmony_ci  }
206fb726d48Sopenharmony_ci
207fb726d48Sopenharmony_ci  static parseHandshake(data: Uint8Array): SessionHandShake {
208fb726d48Sopenharmony_ci    // banner
209fb726d48Sopenharmony_ci    let bannerBuffer = data.buffer;
210fb726d48Sopenharmony_ci    let bannerTag = this.getTag(WireType.LENGTH_DELIMETED, new DataView(bannerBuffer));
211fb726d48Sopenharmony_ci    let bannerLengthBuf = bannerBuffer.slice(this.writeVarIntU32(this.makeTagWireType(bannerTag, WireType.LENGTH_DELIMETED)).length);
212fb726d48Sopenharmony_ci    let bannerSize = this.readVarIntU32(new DataView(bannerLengthBuf));
213fb726d48Sopenharmony_ci    let bannerDataBuffer = bannerLengthBuf.slice(this.writeVarIntU32(bannerSize).length);
214fb726d48Sopenharmony_ci    let banner = this.parseString(bannerDataBuffer, bannerSize);
215fb726d48Sopenharmony_ci
216fb726d48Sopenharmony_ci    // authType
217fb726d48Sopenharmony_ci    let authBuffer = bannerDataBuffer.slice(bannerSize);
218fb726d48Sopenharmony_ci    let authTypeTag = this.getTag(WireType.VARINT, new DataView(authBuffer));
219fb726d48Sopenharmony_ci    let authDataBuffer = authBuffer.slice(this.writeVarIntU32(this.makeTagWireType(authTypeTag, WireType.VARINT)).length);
220fb726d48Sopenharmony_ci    let authType = this.parseU8(new DataView(authDataBuffer), 1);
221fb726d48Sopenharmony_ci    let authTypeLenth = this.writeVarIntU32(authType).length;
222fb726d48Sopenharmony_ci
223fb726d48Sopenharmony_ci    // sessionId
224fb726d48Sopenharmony_ci    let sessionIdBuffer = authDataBuffer.slice(authTypeLenth);
225fb726d48Sopenharmony_ci    let sessionIdTag = this.getTag(WireType.VARINT, new DataView(sessionIdBuffer));
226fb726d48Sopenharmony_ci    let sessionDataBuffer = sessionIdBuffer.slice(this.writeVarIntU32(this.makeTagWireType(sessionIdTag, WireType.VARINT)).length);
227fb726d48Sopenharmony_ci    let sessionId = this.parseU32(new DataView(sessionDataBuffer), 3);
228fb726d48Sopenharmony_ci    let sessionIdLenth = this.writeVarIntU32(sessionId).length;
229fb726d48Sopenharmony_ci
230fb726d48Sopenharmony_ci    // connectKey
231fb726d48Sopenharmony_ci    let connectKeyBuffer = sessionDataBuffer.slice(sessionIdLenth);
232fb726d48Sopenharmony_ci    let connectKeyTag = this.getTag(WireType.LENGTH_DELIMETED, new DataView(connectKeyBuffer));
233fb726d48Sopenharmony_ci    let connectLengthBuffer = connectKeyBuffer.slice(this.writeVarIntU32(this.makeTagWireType(connectKeyTag, WireType.LENGTH_DELIMETED)).length);
234fb726d48Sopenharmony_ci    let connectKeySize = this.readVarIntU32(new DataView(connectLengthBuffer));
235fb726d48Sopenharmony_ci    let connectDataBuffer = connectLengthBuffer.slice(this.writeVarIntU32(connectKeySize).length);
236fb726d48Sopenharmony_ci    let connectKey = this.parseString(connectDataBuffer, connectKeySize);
237fb726d48Sopenharmony_ci
238fb726d48Sopenharmony_ci    // buf
239fb726d48Sopenharmony_ci    let bufBuffer = connectDataBuffer.slice(connectKeySize);
240fb726d48Sopenharmony_ci    let bufTag = this.getTag(WireType.LENGTH_DELIMETED, new DataView(bufBuffer));
241fb726d48Sopenharmony_ci    let lengthBuffer = bufBuffer.slice(this.writeVarIntU32(this.makeTagWireType(bufTag, WireType.LENGTH_DELIMETED)).length);
242fb726d48Sopenharmony_ci    let bufSize = this.readVarIntU32(new DataView(lengthBuffer));
243fb726d48Sopenharmony_ci    let dataBuffer = lengthBuffer.slice(this.writeVarIntU32(bufSize).length);
244fb726d48Sopenharmony_ci    let buf = this.parseString(dataBuffer, bufSize);
245fb726d48Sopenharmony_ci
246fb726d48Sopenharmony_ci    // version
247fb726d48Sopenharmony_ci    let versionBuffer = dataBuffer.slice(bufSize);
248fb726d48Sopenharmony_ci    let versionTag = this.getTag(WireType.LENGTH_DELIMETED, new DataView(versionBuffer));
249fb726d48Sopenharmony_ci    let versionLengthBuffer = versionBuffer.slice(this.writeVarIntU32(this.makeTagWireType(versionTag, WireType.LENGTH_DELIMETED)).length);
250fb726d48Sopenharmony_ci    let versionSize = this.readVarIntU32(new DataView(versionLengthBuffer));
251fb726d48Sopenharmony_ci    let versionDataBuffer = versionLengthBuffer.slice(this.writeVarIntU32(versionSize).length);
252fb726d48Sopenharmony_ci    let version = this.parseString(versionDataBuffer, versionSize);
253fb726d48Sopenharmony_ci    return new SessionHandShake(banner, authType, sessionId, connectKey, buf, version);
254fb726d48Sopenharmony_ci  }
255fb726d48Sopenharmony_ci
256fb726d48Sopenharmony_ci  static parseTransferConfig(data: ArrayBuffer): TransferConfig {
257fb726d48Sopenharmony_ci    let uint8Array = new Uint8Array(data);
258fb726d48Sopenharmony_ci    // channelId
259fb726d48Sopenharmony_ci    let dataBuffer = uint8Array.buffer;
260fb726d48Sopenharmony_ci    let channelTag = this.getTag(WireType.VARINT, new DataView(dataBuffer));
261fb726d48Sopenharmony_ci    let channelDataBuffer = dataBuffer.slice(1);
262fb726d48Sopenharmony_ci    let channelDataView = new DataView(channelDataBuffer);
263fb726d48Sopenharmony_ci    let fileSize = this.parseU64(channelDataView, 1);
264fb726d48Sopenharmony_ci    return new TransferConfig(fileSize, 0, 0, '', '', '', false, 0, false, '', '', '', '');
265fb726d48Sopenharmony_ci  }
266fb726d48Sopenharmony_ci
267fb726d48Sopenharmony_ci  static parsePayloadProtect(data: ArrayBuffer): PayloadProtect {
268fb726d48Sopenharmony_ci    let uint8Array = new Uint8Array(data);
269fb726d48Sopenharmony_ci
270fb726d48Sopenharmony_ci    // channelId
271fb726d48Sopenharmony_ci    let dataBuffer = uint8Array.buffer;
272fb726d48Sopenharmony_ci    let channelTag = this.getTag(WireType.VARINT, new DataView(dataBuffer));
273fb726d48Sopenharmony_ci    let channelDataBuffer = dataBuffer.slice(1);
274fb726d48Sopenharmony_ci    let channelDataView = new DataView(channelDataBuffer);
275fb726d48Sopenharmony_ci    let channelId = this.parseU32(channelDataView, 1);
276fb726d48Sopenharmony_ci
277fb726d48Sopenharmony_ci    // commandFlag
278fb726d48Sopenharmony_ci    let commandTagBuffer = channelDataBuffer.slice(1);
279fb726d48Sopenharmony_ci    let commandTag = this.getTag(WireType.VARINT, new DataView(commandTagBuffer));
280fb726d48Sopenharmony_ci    let commandDataBuffer = commandTagBuffer.slice(1);
281fb726d48Sopenharmony_ci    let commandDataView = new DataView(commandDataBuffer);
282fb726d48Sopenharmony_ci    let commandFlag = this.parseU32(commandDataView, 1);
283fb726d48Sopenharmony_ci
284fb726d48Sopenharmony_ci    // checkSum
285fb726d48Sopenharmony_ci    let checkSumTagBuffer = commandDataBuffer.slice(1);
286fb726d48Sopenharmony_ci    let checkSumTag = this.getTag(WireType.VARINT, new DataView(checkSumTagBuffer));
287fb726d48Sopenharmony_ci    let checkSumDataBuffer = checkSumTagBuffer.slice(1);
288fb726d48Sopenharmony_ci    let checkSumDataView = new DataView(checkSumDataBuffer);
289fb726d48Sopenharmony_ci    let checkSum = this.parseU8(checkSumDataView, 1);
290fb726d48Sopenharmony_ci
291fb726d48Sopenharmony_ci    // vCode
292fb726d48Sopenharmony_ci    let vCodeTagBuffer = checkSumDataBuffer.slice(1);
293fb726d48Sopenharmony_ci    let vCodeTag = this.getTag(WireType.VARINT, new DataView(vCodeTagBuffer));
294fb726d48Sopenharmony_ci    let vCodeDataBuffer = vCodeTagBuffer.slice(1);
295fb726d48Sopenharmony_ci    let vCodeDataView = new DataView(vCodeDataBuffer);
296fb726d48Sopenharmony_ci    let vCode = this.parseU8(vCodeDataView, 1);
297fb726d48Sopenharmony_ci
298fb726d48Sopenharmony_ci    return new PayloadProtect(channelId, commandFlag, checkSum, vCode);
299fb726d48Sopenharmony_ci  }
300fb726d48Sopenharmony_ci
301fb726d48Sopenharmony_ci  static parseString(buffer: ArrayBuffer, size: number): string {
302fb726d48Sopenharmony_ci    let arrayBuffer = buffer.slice(0, size);
303fb726d48Sopenharmony_ci    let textDecoder = new TextDecoder();
304fb726d48Sopenharmony_ci    return textDecoder.decode(arrayBuffer);
305fb726d48Sopenharmony_ci  }
306fb726d48Sopenharmony_ci
307fb726d48Sopenharmony_ci  static parseU8(dataView: DataView, size: number): number {
308fb726d48Sopenharmony_ci    return this.parseU32(dataView, size);
309fb726d48Sopenharmony_ci  }
310fb726d48Sopenharmony_ci
311fb726d48Sopenharmony_ci  static parseU32(dataView: DataView, size: number): number {
312fb726d48Sopenharmony_ci    return this.readVarIntU32(dataView);
313fb726d48Sopenharmony_ci  }
314fb726d48Sopenharmony_ci
315fb726d48Sopenharmony_ci  static parseU64(dataView: DataView, size: number): number {
316fb726d48Sopenharmony_ci    return this.readVarIntU64(dataView);
317fb726d48Sopenharmony_ci  }
318fb726d48Sopenharmony_ci
319fb726d48Sopenharmony_ci  static readVarIntU32(dataView: DataView): number {
320fb726d48Sopenharmony_ci    let u32IntValue: number = 0;
321fb726d48Sopenharmony_ci    for (let u32IntIndex = 0; u32IntIndex < 5; u32IntIndex++) {
322fb726d48Sopenharmony_ci      if (dataView.byteLength < u32IntIndex + 1) {
323fb726d48Sopenharmony_ci        return -1;
324fb726d48Sopenharmony_ci      }
325fb726d48Sopenharmony_ci      let int8 = dataView.getUint8(u32IntIndex);
326fb726d48Sopenharmony_ci      let readValue = int8 & 0b01111111;
327fb726d48Sopenharmony_ci      u32IntValue |= readValue << (7 * u32IntIndex);
328fb726d48Sopenharmony_ci      if (!(int8 & 0b10000000)) {
329fb726d48Sopenharmony_ci        return u32IntValue;
330fb726d48Sopenharmony_ci      }
331fb726d48Sopenharmony_ci    }
332fb726d48Sopenharmony_ci    return -1;
333fb726d48Sopenharmony_ci  }
334fb726d48Sopenharmony_ci
335fb726d48Sopenharmony_ci  static readVarIntU64(dataView: DataView): number {
336fb726d48Sopenharmony_ci    let u62IntValue: number = 0;
337fb726d48Sopenharmony_ci    for (let u62IntIndex = 0; u62IntIndex < 10; u62IntIndex++) {
338fb726d48Sopenharmony_ci      if (dataView.byteLength < u62IntIndex + 1) {
339fb726d48Sopenharmony_ci        return -1;
340fb726d48Sopenharmony_ci      }
341fb726d48Sopenharmony_ci      let int8 = dataView.getUint8(u62IntIndex);
342fb726d48Sopenharmony_ci      let readValue = int8 & 0b01111111;
343fb726d48Sopenharmony_ci      u62IntValue |= readValue << (7 * u62IntIndex);
344fb726d48Sopenharmony_ci      if (!(int8 & 0b10000000)) {
345fb726d48Sopenharmony_ci        return u62IntValue;
346fb726d48Sopenharmony_ci      }
347fb726d48Sopenharmony_ci    }
348fb726d48Sopenharmony_ci    return -1;
349fb726d48Sopenharmony_ci  }
350fb726d48Sopenharmony_ci
351fb726d48Sopenharmony_ci  static readTagWireType(tagKey: number): number {
352fb726d48Sopenharmony_ci    let wireNewType: WireType = tagKey & 0b0111;
353fb726d48Sopenharmony_ci    return tagKey >> 3;
354fb726d48Sopenharmony_ci  }
355fb726d48Sopenharmony_ci
356fb726d48Sopenharmony_ci  static getTag(wireType: WireType, dataView: DataView): number {
357fb726d48Sopenharmony_ci    let tagKey = this.readVarIntU32(dataView);
358fb726d48Sopenharmony_ci    return this.readTagWireType(tagKey);
359fb726d48Sopenharmony_ci  }
360fb726d48Sopenharmony_ci}
361