14d6c458bSopenharmony_ci/* 24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License. 54d6c458bSopenharmony_ci * You may obtain a copy of the License at 64d6c458bSopenharmony_ci * 74d6c458bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84d6c458bSopenharmony_ci * 94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and 134d6c458bSopenharmony_ci * limitations under the License. 144d6c458bSopenharmony_ci */ 154d6c458bSopenharmony_ci 164d6c458bSopenharmony_cifunction getTypeName(obj: unknown): string { 174d6c458bSopenharmony_ci if (obj === null) { 184d6c458bSopenharmony_ci return 'null'; 194d6c458bSopenharmony_ci } 204d6c458bSopenharmony_ci if (typeof obj !== 'object') { 214d6c458bSopenharmony_ci return typeof obj; 224d6c458bSopenharmony_ci } 234d6c458bSopenharmony_ci if (obj != null && obj.constructor != null) { 244d6c458bSopenharmony_ci return obj.constructor.name; 254d6c458bSopenharmony_ci } 264d6c458bSopenharmony_ci return 'unknown'; 274d6c458bSopenharmony_ci} 284d6c458bSopenharmony_ci 294d6c458bSopenharmony_ciclass BusinessError extends Error { 304d6c458bSopenharmony_ci code: number; 314d6c458bSopenharmony_ci constructor(message: string, errorNumber: number) { 324d6c458bSopenharmony_ci super(message); 334d6c458bSopenharmony_ci this.name = 'BusinessError'; 344d6c458bSopenharmony_ci this.code = errorNumber; 354d6c458bSopenharmony_ci } 364d6c458bSopenharmony_ci} 374d6c458bSopenharmony_ci 384d6c458bSopenharmony_ciconst ERROR_CODES = { 394d6c458bSopenharmony_ci TYPE_ERROR: 401, // 401: TYPE_ ERROR code value 404d6c458bSopenharmony_ci RANGE_ERROR: 10200001, // 10200001: RANGE_ERROR code value 414d6c458bSopenharmony_ci BUFFER_SIZE_ERROR: 10200009, // 10200009: BUFFER_SIZE_ERROR code value 424d6c458bSopenharmony_ci PROPERTY_TYPE_ERROR: 10200013 // 10200013: TYPE_ ERROR code value 434d6c458bSopenharmony_ci}; 444d6c458bSopenharmony_ci 454d6c458bSopenharmony_cilet errorMap = { 464d6c458bSopenharmony_ci 'typeError': ERROR_CODES.TYPE_ERROR, 474d6c458bSopenharmony_ci 'rangeError': ERROR_CODES.RANGE_ERROR, 484d6c458bSopenharmony_ci 'bufferSizeError': ERROR_CODES.BUFFER_SIZE_ERROR, 494d6c458bSopenharmony_ci 'typeErrorForProperty': ERROR_CODES.PROPERTY_TYPE_ERROR 504d6c458bSopenharmony_ci}; 514d6c458bSopenharmony_ci 524d6c458bSopenharmony_cienum TypeErrorCategories { 534d6c458bSopenharmony_ci COMMON = 0, 544d6c458bSopenharmony_ci SIZE, 554d6c458bSopenharmony_ci ENCODING, 564d6c458bSopenharmony_ci PROPERTY 574d6c458bSopenharmony_ci}; 584d6c458bSopenharmony_cienum RangeErrorCategories { 594d6c458bSopenharmony_ci WHOLE = 0, 604d6c458bSopenharmony_ci LEFT 614d6c458bSopenharmony_ci}; 624d6c458bSopenharmony_ci 634d6c458bSopenharmony_ciconst UINT32MAX = 4294967296; 644d6c458bSopenharmony_ci 654d6c458bSopenharmony_ciclass ErrorMessage { 664d6c458bSopenharmony_ci public errorNumber: number = 0; 674d6c458bSopenharmony_ci public argument: string = ''; 684d6c458bSopenharmony_ci public types: string[] = []; 694d6c458bSopenharmony_ci public receivedObj: unknown = ''; 704d6c458bSopenharmony_ci public rangeLeft: string | bigint | number = 0; 714d6c458bSopenharmony_ci public rangeRight: string | bigint | number = 0; 724d6c458bSopenharmony_ci 734d6c458bSopenharmony_ci public typeErrorCat: TypeErrorCategories = TypeErrorCategories.COMMON; 744d6c458bSopenharmony_ci public rangeErrorCat: RangeErrorCategories = RangeErrorCategories.WHOLE; 754d6c458bSopenharmony_ci 764d6c458bSopenharmony_ci constructor(errNo: number, argument?: string) { 774d6c458bSopenharmony_ci this.errorNumber = errNo; 784d6c458bSopenharmony_ci this.argument = argument === undefined ? '' : argument; 794d6c458bSopenharmony_ci } 804d6c458bSopenharmony_ci 814d6c458bSopenharmony_ci public setTypeInfo(types: string[], receivedObj: unknown): ErrorMessage { 824d6c458bSopenharmony_ci this.types = types; 834d6c458bSopenharmony_ci this.receivedObj = receivedObj; 844d6c458bSopenharmony_ci return this; 854d6c458bSopenharmony_ci } 864d6c458bSopenharmony_ci 874d6c458bSopenharmony_ci public setSizeTypeInfo(types: string[], receivedObj: unknown): ErrorMessage { 884d6c458bSopenharmony_ci this.types = types; 894d6c458bSopenharmony_ci this.receivedObj = receivedObj; 904d6c458bSopenharmony_ci this.typeErrorCat = TypeErrorCategories.SIZE; 914d6c458bSopenharmony_ci return this; 924d6c458bSopenharmony_ci } 934d6c458bSopenharmony_ci 944d6c458bSopenharmony_ci public setEncodingTypeInfo(types: string[], receivedObj: unknown): ErrorMessage { 954d6c458bSopenharmony_ci this.types = types; 964d6c458bSopenharmony_ci this.receivedObj = receivedObj; 974d6c458bSopenharmony_ci this.typeErrorCat = TypeErrorCategories.ENCODING; 984d6c458bSopenharmony_ci return this; 994d6c458bSopenharmony_ci } 1004d6c458bSopenharmony_ci 1014d6c458bSopenharmony_ci public setProperty(argument: string): ErrorMessage { 1024d6c458bSopenharmony_ci this.typeErrorCat = TypeErrorCategories.PROPERTY; 1034d6c458bSopenharmony_ci this.argument = argument; 1044d6c458bSopenharmony_ci return this; 1054d6c458bSopenharmony_ci } 1064d6c458bSopenharmony_ci 1074d6c458bSopenharmony_ci public setRangeInfo(rangeLeft: string | bigint | number, rangeRight: string | bigint | number, receivedObj: unknown): ErrorMessage { 1084d6c458bSopenharmony_ci this.rangeLeft = rangeLeft; 1094d6c458bSopenharmony_ci this.rangeRight = rangeRight; 1104d6c458bSopenharmony_ci this.receivedObj = receivedObj; 1114d6c458bSopenharmony_ci return this; 1124d6c458bSopenharmony_ci } 1134d6c458bSopenharmony_ci 1144d6c458bSopenharmony_ci public setRangeLeftInfo(rangeLeft: string | number, receivedObj: unknown): ErrorMessage { 1154d6c458bSopenharmony_ci this.rangeLeft = rangeLeft; 1164d6c458bSopenharmony_ci this.receivedObj = receivedObj; 1174d6c458bSopenharmony_ci this.rangeErrorCat = RangeErrorCategories.LEFT; 1184d6c458bSopenharmony_ci return this; 1194d6c458bSopenharmony_ci } 1204d6c458bSopenharmony_ci 1214d6c458bSopenharmony_ci public setSizeInfo(receivedObj: string): ErrorMessage { 1224d6c458bSopenharmony_ci this.receivedObj = receivedObj; 1234d6c458bSopenharmony_ci return this; 1244d6c458bSopenharmony_ci } 1254d6c458bSopenharmony_ci 1264d6c458bSopenharmony_ci private getErrorTypeStrings(types: string[]): string { 1274d6c458bSopenharmony_ci let ret = types.join(', '); 1284d6c458bSopenharmony_ci ret = ret.replace(',', ' or'); 1294d6c458bSopenharmony_ci return ret; 1304d6c458bSopenharmony_ci } 1314d6c458bSopenharmony_ci 1324d6c458bSopenharmony_ci private getArgumentStr(flag: boolean): string { 1334d6c458bSopenharmony_ci if (flag) { 1344d6c458bSopenharmony_ci return 'Parameter error. The type of "' + this.argument + '" must be '; 1354d6c458bSopenharmony_ci } else { 1364d6c458bSopenharmony_ci return 'The type of "' + this.argument + '" must be '; 1374d6c458bSopenharmony_ci } 1384d6c458bSopenharmony_ci } 1394d6c458bSopenharmony_ci 1404d6c458bSopenharmony_ci private getTypeString(flag: boolean): string { 1414d6c458bSopenharmony_ci let str = ''; 1424d6c458bSopenharmony_ci switch (this.typeErrorCat) { 1434d6c458bSopenharmony_ci case TypeErrorCategories.COMMON: 1444d6c458bSopenharmony_ci str += this.getArgumentStr(flag) + this.getErrorTypeStrings(this.types) + 1454d6c458bSopenharmony_ci '. Received value is: ' + getTypeName(this.receivedObj); 1464d6c458bSopenharmony_ci break; 1474d6c458bSopenharmony_ci case TypeErrorCategories.SIZE: 1484d6c458bSopenharmony_ci str += this.getArgumentStr(flag) + this.getErrorTypeStrings(this.types) + 1494d6c458bSopenharmony_ci ' and the value cannot be negative. Received value is: ' + getTypeName(this.receivedObj); 1504d6c458bSopenharmony_ci break; 1514d6c458bSopenharmony_ci case TypeErrorCategories.ENCODING: 1524d6c458bSopenharmony_ci str += this.getArgumentStr(flag) + this.getErrorTypeStrings(this.types) + 1534d6c458bSopenharmony_ci '. the encoding ' + this.receivedObj + ' is unknown'; 1544d6c458bSopenharmony_ci break; 1554d6c458bSopenharmony_ci case TypeErrorCategories.PROPERTY: 1564d6c458bSopenharmony_ci str += this.argument + ' cannot be set for the buffer that has only a getter'; 1574d6c458bSopenharmony_ci default: 1584d6c458bSopenharmony_ci break; 1594d6c458bSopenharmony_ci } 1604d6c458bSopenharmony_ci return str; 1614d6c458bSopenharmony_ci } 1624d6c458bSopenharmony_ci 1634d6c458bSopenharmony_ci private getRangeString(): string { 1644d6c458bSopenharmony_ci let str = ''; 1654d6c458bSopenharmony_ci switch (this.rangeErrorCat) { 1664d6c458bSopenharmony_ci case RangeErrorCategories.WHOLE: 1674d6c458bSopenharmony_ci str += 'The value of "' + this.argument + '" is out of range. It must be >= ' + this.rangeLeft + 1684d6c458bSopenharmony_ci ' and <= ' + this.rangeRight + '. Received value is: ' + this.receivedObj; 1694d6c458bSopenharmony_ci break; 1704d6c458bSopenharmony_ci case RangeErrorCategories.LEFT: 1714d6c458bSopenharmony_ci str += 'The value of "' + this.argument + '" is out of range. It must be >= ' + this.rangeLeft + 1724d6c458bSopenharmony_ci '. Received value is: ' + this.receivedObj; 1734d6c458bSopenharmony_ci break; 1744d6c458bSopenharmony_ci default: 1754d6c458bSopenharmony_ci break; 1764d6c458bSopenharmony_ci } 1774d6c458bSopenharmony_ci return str; 1784d6c458bSopenharmony_ci } 1794d6c458bSopenharmony_ci 1804d6c458bSopenharmony_ci public getString(): string { 1814d6c458bSopenharmony_ci let str = ''; 1824d6c458bSopenharmony_ci switch (this.errorNumber) { 1834d6c458bSopenharmony_ci case ERROR_CODES.TYPE_ERROR: 1844d6c458bSopenharmony_ci str = this.getTypeString(true); 1854d6c458bSopenharmony_ci break; 1864d6c458bSopenharmony_ci case ERROR_CODES.PROPERTY_TYPE_ERROR: 1874d6c458bSopenharmony_ci str = this.getTypeString(false); 1884d6c458bSopenharmony_ci break; 1894d6c458bSopenharmony_ci case ERROR_CODES.RANGE_ERROR: 1904d6c458bSopenharmony_ci str = this.getRangeString(); 1914d6c458bSopenharmony_ci break; 1924d6c458bSopenharmony_ci case ERROR_CODES.BUFFER_SIZE_ERROR: 1934d6c458bSopenharmony_ci str = 'The buffer size must be a multiple of ' + this.receivedObj; 1944d6c458bSopenharmony_ci break; 1954d6c458bSopenharmony_ci default: 1964d6c458bSopenharmony_ci break; 1974d6c458bSopenharmony_ci } 1984d6c458bSopenharmony_ci return str; 1994d6c458bSopenharmony_ci } 2004d6c458bSopenharmony_ci} 2014d6c458bSopenharmony_ci 2024d6c458bSopenharmony_ciinterface NativeBuffer { 2034d6c458bSopenharmony_ci new(type: number, length: number): NativeBuffer; 2044d6c458bSopenharmony_ci new(type: number, array: number[]): NativeBuffer; 2054d6c458bSopenharmony_ci new(type: number, raw: NativeBuffer): NativeBuffer; 2064d6c458bSopenharmony_ci new(type: number, str: string, encoding: string): NativeBuffer; 2074d6c458bSopenharmony_ci new(type: number, arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): NativeBuffer; 2084d6c458bSopenharmony_ci new(type: number, pool: NativeBuffer, poolOffset: number, length: number): NativeBuffer; 2094d6c458bSopenharmony_ci setArray(array: Array<number>): undefined; 2104d6c458bSopenharmony_ci getLength(): number; 2114d6c458bSopenharmony_ci getByteOffset(): number; 2124d6c458bSopenharmony_ci writeString(value: string, offset: number, length: number, encoding: string): number; 2134d6c458bSopenharmony_ci fromString(str: string, encoding: string, size: number): NativeBuffer; 2144d6c458bSopenharmony_ci fillString(value: string, offset: number, end: number, encoding: string): undefined; 2154d6c458bSopenharmony_ci fillNumbers(value: number[], offset: number, end: number): undefined; 2164d6c458bSopenharmony_ci fillBuffer(value: NativeBuffer, offset: number, end: number): undefined; 2174d6c458bSopenharmony_ci writeInt32BE(value: number, offset: number): number; 2184d6c458bSopenharmony_ci readInt32BE(offset: number): number; 2194d6c458bSopenharmony_ci writeInt32LE(value: number, offset: number): number; 2204d6c458bSopenharmony_ci readInt32LE(offset: number): number; 2214d6c458bSopenharmony_ci writeUInt32BE(value: number, offset: number): number; 2224d6c458bSopenharmony_ci readUInt32BE(offset: number): number; 2234d6c458bSopenharmony_ci writeUInt32LE(value: number, offset: number): number; 2244d6c458bSopenharmony_ci readUInt32LE(offset: number): number; 2254d6c458bSopenharmony_ci getBufferData(): Array<number>; 2264d6c458bSopenharmony_ci getArrayBuffer(): ArrayBufferLike; 2274d6c458bSopenharmony_ci get(index: number): number; 2284d6c458bSopenharmony_ci set(index: number, value: number): undefined; 2294d6c458bSopenharmony_ci subBuffer(target: NativeBuffer, start: number, end: number): undefined; 2304d6c458bSopenharmony_ci copy(target: NativeBuffer, targetStart: number, sourceStart: number, sourceEnd: number): number; 2314d6c458bSopenharmony_ci compare(target: NativeBuffer, targetStart: number, sourceStart: number, length: number): number; 2324d6c458bSopenharmony_ci toUtf8(start: number, end: number): string; 2334d6c458bSopenharmony_ci toBase64(start: number, end: number): string; 2344d6c458bSopenharmony_ci indexOf(value: string, byteOffset: number, encoding: string, isReverse: boolean): number; 2354d6c458bSopenharmony_ci} 2364d6c458bSopenharmony_ciinterface NativeBlob { 2374d6c458bSopenharmony_ci new(src: Array<number>): NativeBlob; 2384d6c458bSopenharmony_ci new(blob: NativeBlob, start: number, end?: number): NativeBlob; 2394d6c458bSopenharmony_ci arraybuffer(): Promise<ArrayBuffer>; 2404d6c458bSopenharmony_ci text(): Promise<string>; 2414d6c458bSopenharmony_ci getBytes(): Array<number>; 2424d6c458bSopenharmony_ci} 2434d6c458bSopenharmony_ciinterface IBuffer { 2444d6c458bSopenharmony_ci Buffer: NativeBuffer; 2454d6c458bSopenharmony_ci Blob: NativeBlob; 2464d6c458bSopenharmony_ci utf8ByteLength(str: string): number; 2474d6c458bSopenharmony_ci utf8StringToNumbers(str: string): Array<number>; 2484d6c458bSopenharmony_ci} 2494d6c458bSopenharmony_ci 2504d6c458bSopenharmony_cideclare function requireInternal(s: string): IBuffer; 2514d6c458bSopenharmony_ciconst internalBuffer = requireInternal('buffer'); 2524d6c458bSopenharmony_ciconst bufferSymbol = Symbol('bufferClass'); 2534d6c458bSopenharmony_ciconst lengthSymbol = Symbol('bufferLength'); 2544d6c458bSopenharmony_ciconst bufferEncoding = ['ascii', 'utf8', 'utf-8', 'utf16le', 'utf-16le', 'ucs2', 'ucs-2', 2554d6c458bSopenharmony_ci 'base64', 'base64url', 'latin1', 'binary', 'hex']; 2564d6c458bSopenharmony_ci 2574d6c458bSopenharmony_cienum ParaType { 2584d6c458bSopenharmony_ci NUMBER = 0, 2594d6c458bSopenharmony_ci BUFFER, 2604d6c458bSopenharmony_ci UINT8ARRAY, 2614d6c458bSopenharmony_ci ARRAYBUFFER, 2624d6c458bSopenharmony_ci NUMBERS, 2634d6c458bSopenharmony_ci STRING 2644d6c458bSopenharmony_ci} 2654d6c458bSopenharmony_ciconst initialPoolSize: number = 8 * 1024; // 8 * 1024 : initialPoolSize number 2664d6c458bSopenharmony_cilet poolSize: number; 2674d6c458bSopenharmony_cilet poolOffset: number; 2684d6c458bSopenharmony_cilet pool: Buffer; 2694d6c458bSopenharmony_ciconst MAX_LENGTH: number = Math.pow(2, 32); // 2 : 32 : MAX_LENGTH code 2704d6c458bSopenharmony_ciconst TWO_POW_FIFTEEN: number = Math.pow(2, 15); // 2 : 15 : two to power of fifteen code 2714d6c458bSopenharmony_ciconst TWO_POW_SEVEN: number = Math.pow(2, 7); // 2 : 7 : two to power of seven code 2724d6c458bSopenharmony_ciconst oneByte: number = 1; // 1 : one Byte 2734d6c458bSopenharmony_ciconst twoBytes: number = 2; // 2 : two Bytes 2744d6c458bSopenharmony_ciconst threeBytes: number = 3; // 3 : three Bytes 2754d6c458bSopenharmony_ciconst fourBytes: number = 4; // 4 : four Bytes 2764d6c458bSopenharmony_ciconst fiveBytes: number = 5; // 5 : five Bytes 2774d6c458bSopenharmony_ciconst sixBytes: number = 6; // 6 : six Bytes 2784d6c458bSopenharmony_ciconst sevenBytes: number = 7; // 7 : seven Bytes 2794d6c458bSopenharmony_ciconst eightBytes: number = 8; // 8 : eight Bytes 2804d6c458bSopenharmony_ci 2814d6c458bSopenharmony_ci 2824d6c458bSopenharmony_citype TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | 2834d6c458bSopenharmony_ciInt32Array | Uint32Array | Float32Array | Float64Array; 2844d6c458bSopenharmony_citype BackingType = Buffer | TypedArray | DataView | ArrayBuffer | SharedArrayBuffer; 2854d6c458bSopenharmony_ciconst float64Array: Float64Array = new Float64Array(1); 2864d6c458bSopenharmony_ciconst uInt8Float64Array: Uint8Array = new Uint8Array(float64Array.buffer); 2874d6c458bSopenharmony_ciconst float32Array: Float32Array = new Float32Array(1); 2884d6c458bSopenharmony_ciconst uInt8Float32Array: Uint8Array = new Uint8Array(float32Array.buffer); 2894d6c458bSopenharmony_ci 2904d6c458bSopenharmony_cifunction createPool(): void { 2914d6c458bSopenharmony_ci poolSize = initialPoolSize; 2924d6c458bSopenharmony_ci pool = new Buffer(poolSize); 2934d6c458bSopenharmony_ci poolOffset = 0; 2944d6c458bSopenharmony_ci} 2954d6c458bSopenharmony_ci 2964d6c458bSopenharmony_cifunction alignPool(): void { 2974d6c458bSopenharmony_ci if (poolOffset & 0x7) { 2984d6c458bSopenharmony_ci poolOffset |= 0x7; // 0x7 : align offset based of 8-bits 2994d6c458bSopenharmony_ci poolOffset++; 3004d6c458bSopenharmony_ci } 3014d6c458bSopenharmony_ci} 3024d6c458bSopenharmony_citype Options = { 3034d6c458bSopenharmony_ci type: string, 3044d6c458bSopenharmony_ci endings: string 3054d6c458bSopenharmony_ci}; 3064d6c458bSopenharmony_ci 3074d6c458bSopenharmony_ciconst _log = console.log; 3084d6c458bSopenharmony_ci 3094d6c458bSopenharmony_ciconsole.log = function (...args) : void { 3104d6c458bSopenharmony_ci if (args.length === 1 && args[0] instanceof Buffer) { 3114d6c458bSopenharmony_ci let buf: Buffer = args[0]; 3124d6c458bSopenharmony_ci let bufArr: Array<number> = buf[bufferSymbol].getBufferData(); 3134d6c458bSopenharmony_ci let getStr = function (bufArr: Array<number>, len: number): string { 3144d6c458bSopenharmony_ci let str: string = ''; 3154d6c458bSopenharmony_ci for (let i = 0; i < len; i++) { 3164d6c458bSopenharmony_ci let strTemp: string = bufArr[i].toString(16); // 16 : convert the element to a hexadecimal string 3174d6c458bSopenharmony_ci strTemp = (strTemp.length === 1) ? `0${strTemp}` : strTemp; 3184d6c458bSopenharmony_ci str += ` ${strTemp}`; 3194d6c458bSopenharmony_ci } 3204d6c458bSopenharmony_ci return str; 3214d6c458bSopenharmony_ci }; 3224d6c458bSopenharmony_ci let msg: string = ''; 3234d6c458bSopenharmony_ci if (bufArr.length > 50) { 3244d6c458bSopenharmony_ci let bufStr: string = getStr(bufArr, 50); // 50: Maximum number of log displays 3254d6c458bSopenharmony_ci msg = bufStr + ` ... ${bufArr.length - 50} more bytes`; 3264d6c458bSopenharmony_ci } else { 3274d6c458bSopenharmony_ci msg = getStr(bufArr, bufArr.length); 3284d6c458bSopenharmony_ci } 3294d6c458bSopenharmony_ci _log.call(console, `<Buffer ${msg}>`); 3304d6c458bSopenharmony_ci } else { 3314d6c458bSopenharmony_ci _log(...args); 3324d6c458bSopenharmony_ci } 3334d6c458bSopenharmony_ci}; 3344d6c458bSopenharmony_ci 3354d6c458bSopenharmony_ciclass Blob { 3364d6c458bSopenharmony_ci blobClass: NativeBlob; 3374d6c458bSopenharmony_ci private _size: number; 3384d6c458bSopenharmony_ci private _type: string; 3394d6c458bSopenharmony_ci 3404d6c458bSopenharmony_ci public get size(): number { 3414d6c458bSopenharmony_ci return this._size; 3424d6c458bSopenharmony_ci } 3434d6c458bSopenharmony_ci 3444d6c458bSopenharmony_ci public get type(): string { 3454d6c458bSopenharmony_ci return this._type; 3464d6c458bSopenharmony_ci } 3474d6c458bSopenharmony_ci 3484d6c458bSopenharmony_ci constructor(sources: string[] | ArrayBuffer[] | TypedArray[] | DataView[] | Blob[], options: Options) { 3494d6c458bSopenharmony_ci if (options === undefined || options === null) { 3504d6c458bSopenharmony_ci options = { 3514d6c458bSopenharmony_ci type: '', 3524d6c458bSopenharmony_ci endings: 'transparent' 3534d6c458bSopenharmony_ci }; 3544d6c458bSopenharmony_ci } 3554d6c458bSopenharmony_ci typeErrorCheck(options, ['Object'], 'options'); 3564d6c458bSopenharmony_ci 3574d6c458bSopenharmony_ci let type = options.type ? options.type : ''; 3584d6c458bSopenharmony_ci let endings = options.endings ? options.endings : 'transparent'; 3594d6c458bSopenharmony_ci if (endings !== 'transparent' && endings !== 'native') { 3604d6c458bSopenharmony_ci throw new BusinessError('Parameter error. The value of endings is neither "transparent" nor "native"', 3614d6c458bSopenharmony_ci errorMap.typeError); 3624d6c458bSopenharmony_ci } 3634d6c458bSopenharmony_ci let arr: Array<number> = []; 3644d6c458bSopenharmony_ci if (sources instanceof Array || isTypedArray(sources)) { 3654d6c458bSopenharmony_ci for (const value of sources) { 3664d6c458bSopenharmony_ci arr = arr.concat(this.normalizeSource(value)); 3674d6c458bSopenharmony_ci } 3684d6c458bSopenharmony_ci } else { 3694d6c458bSopenharmony_ci throw typeError(sources, 'sources', ['Iterable']); 3704d6c458bSopenharmony_ci } 3714d6c458bSopenharmony_ci this._size = arr.length; 3724d6c458bSopenharmony_ci this._type = type; 3734d6c458bSopenharmony_ci this.blobClass = new internalBuffer.Blob(arr); 3744d6c458bSopenharmony_ci } 3754d6c458bSopenharmony_ci 3764d6c458bSopenharmony_ci normalizeSource(source: string | ArrayBuffer | TypedArray | DataView | Blob | Buffer): Array<number> { 3774d6c458bSopenharmony_ci let ret: Array<number> = []; 3784d6c458bSopenharmony_ci if (typeof source === 'string') { 3794d6c458bSopenharmony_ci return internalBuffer.utf8StringToNumbers(source); 3804d6c458bSopenharmony_ci } else if (source instanceof ArrayBuffer) { 3814d6c458bSopenharmony_ci return Array.prototype.slice.call(new Uint8Array(source)); 3824d6c458bSopenharmony_ci } else if (isTypedArray(source)) { 3834d6c458bSopenharmony_ci let numbers = Array.prototype.slice.call(source); 3844d6c458bSopenharmony_ci let str = ''; 3854d6c458bSopenharmony_ci for (let i = 0, len = numbers.length; i < len; i++) { 3864d6c458bSopenharmony_ci str += numbers[i].toString(); 3874d6c458bSopenharmony_ci } 3884d6c458bSopenharmony_ci let charCodeArr = []; 3894d6c458bSopenharmony_ci for (let i = 0, len = str.length; i < len; i++) { 3904d6c458bSopenharmony_ci let code = str.charCodeAt(i); 3914d6c458bSopenharmony_ci charCodeArr.push(code); 3924d6c458bSopenharmony_ci } 3934d6c458bSopenharmony_ci return charCodeArr; 3944d6c458bSopenharmony_ci } else if (source instanceof DataView) { 3954d6c458bSopenharmony_ci return Array.prototype.slice.call(new Uint8Array(source.buffer)); 3964d6c458bSopenharmony_ci } else if (source instanceof Blob) { 3974d6c458bSopenharmony_ci return source.blobClass.getBytes(); 3984d6c458bSopenharmony_ci } else if (source instanceof Buffer) { 3994d6c458bSopenharmony_ci for (let i = 0, len = source.length; i < len; i++) { 4004d6c458bSopenharmony_ci ret[i] = source[i]; 4014d6c458bSopenharmony_ci } 4024d6c458bSopenharmony_ci return ret; 4034d6c458bSopenharmony_ci } 4044d6c458bSopenharmony_ci return []; 4054d6c458bSopenharmony_ci } 4064d6c458bSopenharmony_ci 4074d6c458bSopenharmony_ci arrayBuffer(): Promise<ArrayBuffer> { 4084d6c458bSopenharmony_ci return this.blobClass.arraybuffer(); 4094d6c458bSopenharmony_ci } 4104d6c458bSopenharmony_ci 4114d6c458bSopenharmony_ci text(): Promise<string> { 4124d6c458bSopenharmony_ci return this.blobClass.text(); 4134d6c458bSopenharmony_ci } 4144d6c458bSopenharmony_ci 4154d6c458bSopenharmony_ci slice(start?: number, end?: number, type?: string): Blob { 4164d6c458bSopenharmony_ci let newBlob = Object.create(this); 4174d6c458bSopenharmony_ci if (type !== undefined) { 4184d6c458bSopenharmony_ci newBlob._type = type; 4194d6c458bSopenharmony_ci } 4204d6c458bSopenharmony_ci if (start === undefined || start === null) { 4214d6c458bSopenharmony_ci return newBlob; 4224d6c458bSopenharmony_ci } 4234d6c458bSopenharmony_ci if (end === undefined || end === null) { 4244d6c458bSopenharmony_ci newBlob.blobClass = new internalBuffer.Blob(this.blobClass, start); 4254d6c458bSopenharmony_ci return newBlob; 4264d6c458bSopenharmony_ci } 4274d6c458bSopenharmony_ci if (start > end) { 4284d6c458bSopenharmony_ci return newBlob; 4294d6c458bSopenharmony_ci } 4304d6c458bSopenharmony_ci if ((start > 0 && end < 0) || (start < 0 && end > 0)) { 4314d6c458bSopenharmony_ci return newBlob; 4324d6c458bSopenharmony_ci } 4334d6c458bSopenharmony_ci newBlob.blobClass = new internalBuffer.Blob(this.blobClass, start, end); 4344d6c458bSopenharmony_ci return newBlob; 4354d6c458bSopenharmony_ci } 4364d6c458bSopenharmony_ci} 4374d6c458bSopenharmony_ci 4384d6c458bSopenharmony_cilet utils = { 4394d6c458bSopenharmony_ci eightBits: 0xFF, 4404d6c458bSopenharmony_ci sixtyFourBit: 0xFFFFFFFFn, 4414d6c458bSopenharmony_ci 4424d6c458bSopenharmony_ci getLowerEight(value: number): number { 4434d6c458bSopenharmony_ci return value & this.eightBits; 4444d6c458bSopenharmony_ci }, 4454d6c458bSopenharmony_ci getLowerSixtyFour(value: bigint): bigint { 4464d6c458bSopenharmony_ci return value & this.sixtyFourBit; 4474d6c458bSopenharmony_ci } 4484d6c458bSopenharmony_ci}; 4494d6c458bSopenharmony_ci 4504d6c458bSopenharmony_cienum Style { 4514d6c458bSopenharmony_ci intBE = 0, 4524d6c458bSopenharmony_ci intLE, 4534d6c458bSopenharmony_ci uintBE, 4544d6c458bSopenharmony_ci uintLE 4554d6c458bSopenharmony_ci}; 4564d6c458bSopenharmony_ci 4574d6c458bSopenharmony_ciclass HandlerBuffer { 4584d6c458bSopenharmony_ci get(obj: Buffer, prop: string): number | undefined { 4594d6c458bSopenharmony_ci if (typeof prop === 'number') { 4604d6c458bSopenharmony_ci if (prop >= obj.length) { 4614d6c458bSopenharmony_ci return obj[prop]; 4624d6c458bSopenharmony_ci } 4634d6c458bSopenharmony_ci return obj[bufferSymbol].get(prop); 4644d6c458bSopenharmony_ci } 4654d6c458bSopenharmony_ci return obj[prop]; 4664d6c458bSopenharmony_ci } 4674d6c458bSopenharmony_ci set(obj: Buffer, prop: string | symbol, value: number): boolean { 4684d6c458bSopenharmony_ci if (typeof prop === 'number') { 4694d6c458bSopenharmony_ci if (prop >= obj.length) { 4704d6c458bSopenharmony_ci return false; 4714d6c458bSopenharmony_ci } 4724d6c458bSopenharmony_ci value = utils.getLowerEight(value); 4734d6c458bSopenharmony_ci obj[bufferSymbol].set(prop, value); 4744d6c458bSopenharmony_ci return true; 4754d6c458bSopenharmony_ci } 4764d6c458bSopenharmony_ci 4774d6c458bSopenharmony_ci if (prop === lengthSymbol || prop === bufferSymbol) { 4784d6c458bSopenharmony_ci obj[prop] = value; 4794d6c458bSopenharmony_ci return true; 4804d6c458bSopenharmony_ci } else if (prop === 'length' || prop === 'buffer' || prop === 'byteOffset') { 4814d6c458bSopenharmony_ci throw typeErrorForProperty(prop); 4824d6c458bSopenharmony_ci } 4834d6c458bSopenharmony_ci return false; 4844d6c458bSopenharmony_ci } 4854d6c458bSopenharmony_ci ownKeys(obj: Buffer): Array<string> { 4864d6c458bSopenharmony_ci let keys: Array<string> = []; 4874d6c458bSopenharmony_ci for (let i = 0, len = obj.length; i < len; i++) { 4884d6c458bSopenharmony_ci keys.push(i.toString()); 4894d6c458bSopenharmony_ci } 4904d6c458bSopenharmony_ci return keys; 4914d6c458bSopenharmony_ci } 4924d6c458bSopenharmony_ci} 4934d6c458bSopenharmony_ciclass Buffer { 4944d6c458bSopenharmony_ci private _arrayBuffer: ArrayBuffer | SharedArrayBuffer | undefined; 4954d6c458bSopenharmony_ci 4964d6c458bSopenharmony_ci public get length(): number { 4974d6c458bSopenharmony_ci return this[lengthSymbol]; 4984d6c458bSopenharmony_ci } 4994d6c458bSopenharmony_ci 5004d6c458bSopenharmony_ci public get byteOffset(): number { 5014d6c458bSopenharmony_ci return this[bufferSymbol].getByteOffset(); 5024d6c458bSopenharmony_ci } 5034d6c458bSopenharmony_ci 5044d6c458bSopenharmony_ci public get buffer(): ArrayBufferLike { 5054d6c458bSopenharmony_ci if (this._arrayBuffer) { 5064d6c458bSopenharmony_ci return this._arrayBuffer; 5074d6c458bSopenharmony_ci } 5084d6c458bSopenharmony_ci let arr = this[bufferSymbol].getArrayBuffer(); 5094d6c458bSopenharmony_ci return arr; 5104d6c458bSopenharmony_ci } 5114d6c458bSopenharmony_ci 5124d6c458bSopenharmony_ci constructor(value: number | Buffer | Uint8Array | ArrayBuffer | SharedArrayBuffer | Array<number> | string, 5134d6c458bSopenharmony_ci byteOffsetOrEncoding?: number | string, length?: number) { 5144d6c458bSopenharmony_ci if (arguments.length === 1) { 5154d6c458bSopenharmony_ci if (typeof value === 'number') { 5164d6c458bSopenharmony_ci this[bufferSymbol] = new internalBuffer.Buffer(ParaType.NUMBER, value); 5174d6c458bSopenharmony_ci } else if (value instanceof Buffer) { 5184d6c458bSopenharmony_ci this[bufferSymbol] = new internalBuffer.Buffer(ParaType.BUFFER, value[bufferSymbol]); 5194d6c458bSopenharmony_ci } else if (value instanceof Uint8Array) { 5204d6c458bSopenharmony_ci this[bufferSymbol] = new internalBuffer.Buffer(ParaType.UINT8ARRAY, value); 5214d6c458bSopenharmony_ci } else if (value instanceof Array) { 5224d6c458bSopenharmony_ci this[bufferSymbol] = new internalBuffer.Buffer(ParaType.NUMBERS, value); 5234d6c458bSopenharmony_ci } 5244d6c458bSopenharmony_ci } else if (arguments.length === 3 && typeof byteOffsetOrEncoding === 'number' && typeof length === 'number') { 5254d6c458bSopenharmony_ci if (value instanceof ArrayBuffer || value instanceof SharedArrayBuffer) { 5264d6c458bSopenharmony_ci this[bufferSymbol] = new internalBuffer.Buffer(ParaType.ARRAYBUFFER, value, byteOffsetOrEncoding, length); 5274d6c458bSopenharmony_ci this._arrayBuffer = value; 5284d6c458bSopenharmony_ci } else if (value instanceof Buffer) { 5294d6c458bSopenharmony_ci this[bufferSymbol] = new internalBuffer.Buffer(ParaType.BUFFER, value[bufferSymbol], byteOffsetOrEncoding, length); 5304d6c458bSopenharmony_ci } 5314d6c458bSopenharmony_ci } else if (arguments.length === twoBytes && typeof value === 'string' && typeof byteOffsetOrEncoding === 'string') { 5324d6c458bSopenharmony_ci this[bufferSymbol] = new internalBuffer.Buffer(ParaType.STRING, value, byteOffsetOrEncoding); 5334d6c458bSopenharmony_ci } else { 5344d6c458bSopenharmony_ci this[bufferSymbol] = new internalBuffer.Buffer(ParaType.NUMBER, 0); 5354d6c458bSopenharmony_ci } 5364d6c458bSopenharmony_ci this[lengthSymbol] = this[bufferSymbol].getLength(); 5374d6c458bSopenharmony_ci return new Proxy(this, new HandlerBuffer()); 5384d6c458bSopenharmony_ci } 5394d6c458bSopenharmony_ci 5404d6c458bSopenharmony_ci fillInner(value: string | Buffer | Uint8Array | number, offset: number = 0, end: number = this.length, 5414d6c458bSopenharmony_ci encoding: string = 'utf8'): Buffer { 5424d6c458bSopenharmony_ci const normalizedEncoding = encodingTypeErrorCheck(encoding); 5434d6c458bSopenharmony_ci 5444d6c458bSopenharmony_ci rangeErrorCheck(offset, 'offset', 0, UINT32MAX); 5454d6c458bSopenharmony_ci rangeErrorCheck(end, 'end', 0, this.length); 5464d6c458bSopenharmony_ci 5474d6c458bSopenharmony_ci if (offset > end - 1) { 5484d6c458bSopenharmony_ci return this; 5494d6c458bSopenharmony_ci } 5504d6c458bSopenharmony_ci if (typeof value === 'string') { 5514d6c458bSopenharmony_ci if (normalizedEncoding === 'hex') { 5524d6c458bSopenharmony_ci let numbers = hexStrtoNumbers(value); 5534d6c458bSopenharmony_ci this[bufferSymbol].fillNumbers(numbers, offset, end); 5544d6c458bSopenharmony_ci } else { 5554d6c458bSopenharmony_ci this[bufferSymbol].fillString(value, offset, end, normalizedEncoding); 5564d6c458bSopenharmony_ci } 5574d6c458bSopenharmony_ci } 5584d6c458bSopenharmony_ci if (typeof value === 'number') { 5594d6c458bSopenharmony_ci let nums: Array<number> = []; 5604d6c458bSopenharmony_ci nums.push(value & 0xFF); // 0xFF : get lower 8-bits 5614d6c458bSopenharmony_ci this[bufferSymbol].fillNumbers(nums, offset, end); 5624d6c458bSopenharmony_ci } 5634d6c458bSopenharmony_ci if (value instanceof Buffer) { 5644d6c458bSopenharmony_ci this[bufferSymbol].fillBuffer(value[bufferSymbol], offset, end); 5654d6c458bSopenharmony_ci } 5664d6c458bSopenharmony_ci if (value instanceof Uint8Array) { 5674d6c458bSopenharmony_ci let nums = Array.from(value); 5684d6c458bSopenharmony_ci this[bufferSymbol].fillNumbers(nums, offset, end); 5694d6c458bSopenharmony_ci } 5704d6c458bSopenharmony_ci return this; 5714d6c458bSopenharmony_ci } 5724d6c458bSopenharmony_ci /** 5734d6c458bSopenharmony_ci * Fills buf with the specified value. If the offset and end are not given, the entire buf will be filled. 5744d6c458bSopenharmony_ci * @since 9 5754d6c458bSopenharmony_ci * @syscap SystemCapability.Utils.Lang 5764d6c458bSopenharmony_ci * @param value The value with which to fill buf 5774d6c458bSopenharmony_ci * @param [offset = 0] Number of bytes to skip before starting to fill buf 5784d6c458bSopenharmony_ci * @param [end = buf.length] Where to stop filling buf (not inclusive) 5794d6c458bSopenharmony_ci * @param [encoding='utf8'] The encoding for value if value is a string 5804d6c458bSopenharmony_ci * @return A reference to buf 5814d6c458bSopenharmony_ci */ 5824d6c458bSopenharmony_ci fill(value: string | Buffer | Uint8Array | number, offset: number = 0, end: number = this.length, 5834d6c458bSopenharmony_ci encoding: string = 'utf8'): Buffer { 5844d6c458bSopenharmony_ci if (this.length === 0) { 5854d6c458bSopenharmony_ci return this; 5864d6c458bSopenharmony_ci } 5874d6c458bSopenharmony_ci if (offset === null) { 5884d6c458bSopenharmony_ci offset = 0; 5894d6c458bSopenharmony_ci } 5904d6c458bSopenharmony_ci if (end === null) { 5914d6c458bSopenharmony_ci end = this.length; 5924d6c458bSopenharmony_ci } 5934d6c458bSopenharmony_ci if (encoding === null) { 5944d6c458bSopenharmony_ci encoding = 'utf8'; 5954d6c458bSopenharmony_ci } 5964d6c458bSopenharmony_ci if (arguments.length === twoBytes) { 5974d6c458bSopenharmony_ci if (typeof offset === 'string') { 5984d6c458bSopenharmony_ci encoding = offset; 5994d6c458bSopenharmony_ci offset = 0; 6004d6c458bSopenharmony_ci } 6014d6c458bSopenharmony_ci } else if (arguments.length === 3) { 6024d6c458bSopenharmony_ci if (typeof end === 'string') { 6034d6c458bSopenharmony_ci encoding = end; 6044d6c458bSopenharmony_ci end = this.length; 6054d6c458bSopenharmony_ci } 6064d6c458bSopenharmony_ci } 6074d6c458bSopenharmony_ci if (typeof offset !== 'number') { 6084d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 6094d6c458bSopenharmony_ci } 6104d6c458bSopenharmony_ci if (typeof end === 'number') { 6114d6c458bSopenharmony_ci typeErrorCheck(end, ['number'], 'end'); 6124d6c458bSopenharmony_ci } 6134d6c458bSopenharmony_ci if (typeof encoding !== 'string') { 6144d6c458bSopenharmony_ci typeErrorCheck(encoding, ['string'], 'encoding'); 6154d6c458bSopenharmony_ci } 6164d6c458bSopenharmony_ci return this.fillInner(value, offset, end, encoding); 6174d6c458bSopenharmony_ci } 6184d6c458bSopenharmony_ci 6194d6c458bSopenharmony_ci write(str: string, offset: number = 0, length: number = this.length - offset, encoding: string = 'utf8'): number { 6204d6c458bSopenharmony_ci typeErrorCheck(str, ['string'], 'str'); 6214d6c458bSopenharmony_ci if (offset === null) { 6224d6c458bSopenharmony_ci offset = 0; 6234d6c458bSopenharmony_ci } 6244d6c458bSopenharmony_ci if (length === null) { 6254d6c458bSopenharmony_ci length = this.length - offset; 6264d6c458bSopenharmony_ci } 6274d6c458bSopenharmony_ci if (encoding === null) { 6284d6c458bSopenharmony_ci encoding = 'utf8'; 6294d6c458bSopenharmony_ci } 6304d6c458bSopenharmony_ci if (arguments.length === 1) { 6314d6c458bSopenharmony_ci return this[bufferSymbol].writeString(str, 0, length, 'utf8'); 6324d6c458bSopenharmony_ci } else if (arguments.length === twoBytes) { 6334d6c458bSopenharmony_ci if (typeof offset === 'string') { 6344d6c458bSopenharmony_ci encoding = offset; 6354d6c458bSopenharmony_ci let encode = encodingTypeErrorCheck(encoding); 6364d6c458bSopenharmony_ci return this[bufferSymbol].writeString(str, 0, this.length, encode); 6374d6c458bSopenharmony_ci } else if (typeof offset === 'number') { 6384d6c458bSopenharmony_ci rangeErrorCheck(offset, 'offset', 0, this.length - 1); 6394d6c458bSopenharmony_ci return this[bufferSymbol].writeString(str, offset, length, 'utf8'); 6404d6c458bSopenharmony_ci } else { 6414d6c458bSopenharmony_ci throw typeError(offset, 'offset', ['number']); 6424d6c458bSopenharmony_ci } 6434d6c458bSopenharmony_ci } else if (arguments.length === 3) { 6444d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 6454d6c458bSopenharmony_ci rangeErrorCheck(offset, 'offset', 0, this.length - 1); 6464d6c458bSopenharmony_ci if (typeof length === 'number') { 6474d6c458bSopenharmony_ci rangeErrorCheck(length, 'length', 0, this.length); 6484d6c458bSopenharmony_ci length = (length > this.length - offset) ? (this.length - offset) : length; 6494d6c458bSopenharmony_ci return this[bufferSymbol].writeString(str, offset, length, 'utf8'); 6504d6c458bSopenharmony_ci } else if (typeof length === 'string') { 6514d6c458bSopenharmony_ci encoding = length; 6524d6c458bSopenharmony_ci length = this.length - offset; 6534d6c458bSopenharmony_ci let encode = encodingTypeErrorCheck(encoding); 6544d6c458bSopenharmony_ci return this[bufferSymbol].writeString(str, offset, length, encode); 6554d6c458bSopenharmony_ci } else { 6564d6c458bSopenharmony_ci throw typeError(length, 'length', ['number']); 6574d6c458bSopenharmony_ci } 6584d6c458bSopenharmony_ci } else { 6594d6c458bSopenharmony_ci if (typeof offset !== 'number') { 6604d6c458bSopenharmony_ci throw typeError(offset, 'offset', ['number']); 6614d6c458bSopenharmony_ci } else if (typeof length !== 'number') { 6624d6c458bSopenharmony_ci throw typeError(length, 'length', ['number']); 6634d6c458bSopenharmony_ci } else { 6644d6c458bSopenharmony_ci rangeErrorCheck(offset, 'offset', 0, this.length - 1); 6654d6c458bSopenharmony_ci let encode = encodingTypeErrorCheck(encoding); 6664d6c458bSopenharmony_ci length = (length > this.length - offset) ? (this.length - offset) : length; 6674d6c458bSopenharmony_ci return this[bufferSymbol].writeString(str, offset, length, encode); 6684d6c458bSopenharmony_ci } 6694d6c458bSopenharmony_ci } 6704d6c458bSopenharmony_ci } 6714d6c458bSopenharmony_ci 6724d6c458bSopenharmony_ci convertToBig64BE(value: bigint, offset: number): number { 6734d6c458bSopenharmony_ci let byteValue = Number(utils.getLowerSixtyFour(value)); 6744d6c458bSopenharmony_ci let bitNum: number = eightBytes; 6754d6c458bSopenharmony_ci for (let i = bitNum - 1; i > 0; i--) { 6764d6c458bSopenharmony_ci this[offset + i] = byteValue; 6774d6c458bSopenharmony_ci if (i === fourBytes) { 6784d6c458bSopenharmony_ci byteValue = Number(utils.getLowerSixtyFour(value >> 32n)); 6794d6c458bSopenharmony_ci } else { 6804d6c458bSopenharmony_ci byteValue = byteValue >> eightBytes; 6814d6c458bSopenharmony_ci } 6824d6c458bSopenharmony_ci } 6834d6c458bSopenharmony_ci this[offset] = byteValue; 6844d6c458bSopenharmony_ci return offset + eightBytes; 6854d6c458bSopenharmony_ci } 6864d6c458bSopenharmony_ci 6874d6c458bSopenharmony_ci convertToBig64LE(value: bigint, offset: number): number { 6884d6c458bSopenharmony_ci let byteValue = Number(utils.getLowerSixtyFour(value)); 6894d6c458bSopenharmony_ci let bitNum = eightBytes; 6904d6c458bSopenharmony_ci for (let i = 0; i < bitNum - 1; i++) { 6914d6c458bSopenharmony_ci this[offset++] = byteValue; 6924d6c458bSopenharmony_ci if (i === 3) { 6934d6c458bSopenharmony_ci byteValue = Number(utils.getLowerSixtyFour(value >> 32n)); // 32 means offset 32-bits 6944d6c458bSopenharmony_ci } else { 6954d6c458bSopenharmony_ci byteValue = byteValue >> eightBytes; 6964d6c458bSopenharmony_ci } 6974d6c458bSopenharmony_ci } 6984d6c458bSopenharmony_ci this[offset++] = byteValue; 6994d6c458bSopenharmony_ci return offset; 7004d6c458bSopenharmony_ci } 7014d6c458bSopenharmony_ci 7024d6c458bSopenharmony_ci private readIntBEType(offset: number, byteLength: number): number | undefined { 7034d6c458bSopenharmony_ci switch (byteLength) { 7044d6c458bSopenharmony_ci case oneByte: 7054d6c458bSopenharmony_ci return this.readInt8(offset); 7064d6c458bSopenharmony_ci case twoBytes: 7074d6c458bSopenharmony_ci return this.readInt16BE(offset); 7084d6c458bSopenharmony_ci case threeBytes: 7094d6c458bSopenharmony_ci return this.readInt24BE(offset); 7104d6c458bSopenharmony_ci case fourBytes: 7114d6c458bSopenharmony_ci return this.readInt32BE(offset); 7124d6c458bSopenharmony_ci case fiveBytes: 7134d6c458bSopenharmony_ci return this.readInt40BE(offset); 7144d6c458bSopenharmony_ci case sixBytes: 7154d6c458bSopenharmony_ci return this.readInt48BE(offset); 7164d6c458bSopenharmony_ci default: 7174d6c458bSopenharmony_ci break; 7184d6c458bSopenharmony_ci } 7194d6c458bSopenharmony_ci return undefined; 7204d6c458bSopenharmony_ci } 7214d6c458bSopenharmony_ci 7224d6c458bSopenharmony_ci private readIntLEType(offset: number, byteLength: number): number | undefined { 7234d6c458bSopenharmony_ci switch (byteLength) { 7244d6c458bSopenharmony_ci case oneByte: 7254d6c458bSopenharmony_ci return this.readInt8(offset); 7264d6c458bSopenharmony_ci case twoBytes: 7274d6c458bSopenharmony_ci return this.readInt16LE(offset); 7284d6c458bSopenharmony_ci case threeBytes: 7294d6c458bSopenharmony_ci return this.readInt24LE(offset); 7304d6c458bSopenharmony_ci case fourBytes: 7314d6c458bSopenharmony_ci return this.readInt32LE(offset); 7324d6c458bSopenharmony_ci case fiveBytes: 7334d6c458bSopenharmony_ci return this.readInt40LE(offset); 7344d6c458bSopenharmony_ci case sixBytes: 7354d6c458bSopenharmony_ci return this.readInt48LE(offset); 7364d6c458bSopenharmony_ci default: 7374d6c458bSopenharmony_ci break; 7384d6c458bSopenharmony_ci } 7394d6c458bSopenharmony_ci return undefined; 7404d6c458bSopenharmony_ci } 7414d6c458bSopenharmony_ci 7424d6c458bSopenharmony_ci private readUIntBEType(offset: number, byteLength: number): number | undefined { 7434d6c458bSopenharmony_ci switch (byteLength) { 7444d6c458bSopenharmony_ci case oneByte: 7454d6c458bSopenharmony_ci return this.readUInt8(offset); 7464d6c458bSopenharmony_ci case twoBytes: 7474d6c458bSopenharmony_ci return this.readUInt16BE(offset); 7484d6c458bSopenharmony_ci case threeBytes: 7494d6c458bSopenharmony_ci return this.readUInt24BE(offset); 7504d6c458bSopenharmony_ci case fourBytes: 7514d6c458bSopenharmony_ci return this.readUInt32BE(offset); 7524d6c458bSopenharmony_ci case fiveBytes: 7534d6c458bSopenharmony_ci return this.readUInt40BE(offset); 7544d6c458bSopenharmony_ci case sixBytes: 7554d6c458bSopenharmony_ci return this.readUInt48BE(offset); 7564d6c458bSopenharmony_ci default: 7574d6c458bSopenharmony_ci break; 7584d6c458bSopenharmony_ci } 7594d6c458bSopenharmony_ci return undefined; 7604d6c458bSopenharmony_ci } 7614d6c458bSopenharmony_ci 7624d6c458bSopenharmony_ci private readUIntLEType(offset: number, byteLength: number): number | undefined { 7634d6c458bSopenharmony_ci switch (byteLength) { 7644d6c458bSopenharmony_ci case oneByte: 7654d6c458bSopenharmony_ci return this.readUInt8(offset); 7664d6c458bSopenharmony_ci case twoBytes: 7674d6c458bSopenharmony_ci return this.readUInt16LE(offset); 7684d6c458bSopenharmony_ci case threeBytes: 7694d6c458bSopenharmony_ci return this.readUInt24LE(offset); 7704d6c458bSopenharmony_ci case fourBytes: 7714d6c458bSopenharmony_ci return this.readUInt32LE(offset); 7724d6c458bSopenharmony_ci case fiveBytes: 7734d6c458bSopenharmony_ci return this.readUInt40LE(offset); 7744d6c458bSopenharmony_ci case sixBytes: 7754d6c458bSopenharmony_ci return this.readUInt48LE(offset); 7764d6c458bSopenharmony_ci default: 7774d6c458bSopenharmony_ci break; 7784d6c458bSopenharmony_ci } 7794d6c458bSopenharmony_ci return undefined; 7804d6c458bSopenharmony_ci } 7814d6c458bSopenharmony_ci 7824d6c458bSopenharmony_ci private readData(offset: number, byteLength: number, style: Style): number | undefined { 7834d6c458bSopenharmony_ci rangeErrorCheck(byteLength, 'byteLength', oneByte, sixBytes); 7844d6c458bSopenharmony_ci if (style === Style.intBE) { 7854d6c458bSopenharmony_ci return this.readIntBEType(offset, byteLength); 7864d6c458bSopenharmony_ci } else if (style === Style.intLE) { 7874d6c458bSopenharmony_ci return this.readIntLEType(offset, byteLength); 7884d6c458bSopenharmony_ci } else if (style === Style.uintLE) { 7894d6c458bSopenharmony_ci return this.readUIntLEType(offset, byteLength); 7904d6c458bSopenharmony_ci } else if (style === Style.uintBE) { 7914d6c458bSopenharmony_ci return this.readUIntBEType(offset, byteLength); 7924d6c458bSopenharmony_ci } 7934d6c458bSopenharmony_ci return undefined; 7944d6c458bSopenharmony_ci } 7954d6c458bSopenharmony_ci 7964d6c458bSopenharmony_ci private writeIntBEType(value: number, offset: number, byteLength: number): number | undefined { 7974d6c458bSopenharmony_ci switch (byteLength) { 7984d6c458bSopenharmony_ci case oneByte: 7994d6c458bSopenharmony_ci return this.writeInt8(value, offset); 8004d6c458bSopenharmony_ci case twoBytes: 8014d6c458bSopenharmony_ci return this.writeInt16BE(value, offset); 8024d6c458bSopenharmony_ci case threeBytes: 8034d6c458bSopenharmony_ci return this.writeUInt24BE(value, offset); 8044d6c458bSopenharmony_ci case fourBytes: 8054d6c458bSopenharmony_ci return this.writeInt32BE(value, offset); 8064d6c458bSopenharmony_ci case fiveBytes: 8074d6c458bSopenharmony_ci return this.writeUInt40BE(value, offset); 8084d6c458bSopenharmony_ci case sixBytes: 8094d6c458bSopenharmony_ci return this.writeUInt48BE(value, offset); 8104d6c458bSopenharmony_ci default: 8114d6c458bSopenharmony_ci break; 8124d6c458bSopenharmony_ci } 8134d6c458bSopenharmony_ci return undefined; 8144d6c458bSopenharmony_ci } 8154d6c458bSopenharmony_ci 8164d6c458bSopenharmony_ci private writeUIntBEType(value: number, offset: number, byteLength: number): number | undefined { 8174d6c458bSopenharmony_ci switch (byteLength) { 8184d6c458bSopenharmony_ci case oneByte: 8194d6c458bSopenharmony_ci return this.writeUInt8(value, offset); 8204d6c458bSopenharmony_ci case twoBytes: 8214d6c458bSopenharmony_ci return this.writeUInt16BE(value, offset); 8224d6c458bSopenharmony_ci case threeBytes: 8234d6c458bSopenharmony_ci return this.writeUInt24BE(value, offset); 8244d6c458bSopenharmony_ci case fourBytes: 8254d6c458bSopenharmony_ci return this.writeUInt32BE(value, offset); 8264d6c458bSopenharmony_ci case fiveBytes: 8274d6c458bSopenharmony_ci return this.writeUInt40BE(value, offset); 8284d6c458bSopenharmony_ci case sixBytes: 8294d6c458bSopenharmony_ci return this.writeUInt48BE(value, offset); 8304d6c458bSopenharmony_ci default: 8314d6c458bSopenharmony_ci break; 8324d6c458bSopenharmony_ci } 8334d6c458bSopenharmony_ci return undefined; 8344d6c458bSopenharmony_ci } 8354d6c458bSopenharmony_ci 8364d6c458bSopenharmony_ci private writeUIntLEType(value: number, offset: number, byteLength: number): number | undefined { 8374d6c458bSopenharmony_ci switch (byteLength) { 8384d6c458bSopenharmony_ci case oneByte: 8394d6c458bSopenharmony_ci return this.writeUInt8(value, offset); 8404d6c458bSopenharmony_ci case twoBytes: 8414d6c458bSopenharmony_ci return this.writeUInt16LE(value, offset); 8424d6c458bSopenharmony_ci case threeBytes: 8434d6c458bSopenharmony_ci return this.writeUInt24LE(value, offset); 8444d6c458bSopenharmony_ci case fourBytes: 8454d6c458bSopenharmony_ci return this.writeUInt32LE(value, offset); 8464d6c458bSopenharmony_ci case fiveBytes: 8474d6c458bSopenharmony_ci return this.writeUInt40LE(value, offset); 8484d6c458bSopenharmony_ci case sixBytes: 8494d6c458bSopenharmony_ci return this.writeUInt48LE(value, offset); 8504d6c458bSopenharmony_ci default: 8514d6c458bSopenharmony_ci break; 8524d6c458bSopenharmony_ci } 8534d6c458bSopenharmony_ci return undefined; 8544d6c458bSopenharmony_ci } 8554d6c458bSopenharmony_ci 8564d6c458bSopenharmony_ci private writeData(value: number, offset: number, byteLength: number, style: Style): number | undefined { 8574d6c458bSopenharmony_ci rangeErrorCheck(byteLength, 'byteLength', oneByte, sixBytes); 8584d6c458bSopenharmony_ci if (style === Style.intBE) { 8594d6c458bSopenharmony_ci return this.writeIntBEType(value, offset, byteLength); 8604d6c458bSopenharmony_ci } else if (style === Style.intLE || style === Style.uintLE) { 8614d6c458bSopenharmony_ci return this.writeUIntLEType(value, offset, byteLength); 8624d6c458bSopenharmony_ci } else if (style === Style.uintBE) { 8634d6c458bSopenharmony_ci return this.writeUIntBEType(value, offset, byteLength); 8644d6c458bSopenharmony_ci } 8654d6c458bSopenharmony_ci return undefined; 8664d6c458bSopenharmony_ci } 8674d6c458bSopenharmony_ci 8684d6c458bSopenharmony_ci writeBigInt64BE(value: bigint, offset: number = 0): number { 8694d6c458bSopenharmony_ci typeErrorCheck(value, ['bigint'], 'value'); 8704d6c458bSopenharmony_ci if (offset === null) { 8714d6c458bSopenharmony_ci offset = 0; 8724d6c458bSopenharmony_ci } 8734d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 8744d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 8754d6c458bSopenharmony_ci // 2n : 63n : 1n : The range of 64-bit BigInt value is from negative the 63st power of 2 to the 63st power of 2 minus 1 8764d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', -(2n ** 63n), 2n ** 63n, '-(2n ** 63n)', '2n ** 63n'); 8774d6c458bSopenharmony_ci return this.convertToBig64BE(value, offset); 8784d6c458bSopenharmony_ci } 8794d6c458bSopenharmony_ci 8804d6c458bSopenharmony_ci readBigInt64BE(offset: number = 0): bigint { 8814d6c458bSopenharmony_ci if (offset === null) { 8824d6c458bSopenharmony_ci offset = 0; 8834d6c458bSopenharmony_ci } 8844d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 8854d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 8864d6c458bSopenharmony_ci const val = (this[offset] << 24) + this.calculationBE(offset + 1, threeBytes); // 24 : the first val for this[offset] 8874d6c458bSopenharmony_ci return (BigInt(val) << 32n) + // 32 means offset 32-bits left 8884d6c458bSopenharmony_ci BigInt(this.calculationBE(offset + fourBytes, fourBytes)); 8894d6c458bSopenharmony_ci } 8904d6c458bSopenharmony_ci 8914d6c458bSopenharmony_ci writeBigInt64LE(value: bigint, offset: number = 0): number { 8924d6c458bSopenharmony_ci typeErrorCheck(value, ['bigint'], 'value'); 8934d6c458bSopenharmony_ci if (offset === null) { 8944d6c458bSopenharmony_ci offset = 0; 8954d6c458bSopenharmony_ci } 8964d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 8974d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 8984d6c458bSopenharmony_ci // 2n : 63n : 1n : The range of 64-bit BigInt value is from negative the 63st power of 2 to the 63st power of 2 minus 1 8994d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', -(2n ** 63n), 2n ** 63n, '-(2n ** 63n)', '2n ** 63n'); 9004d6c458bSopenharmony_ci 9014d6c458bSopenharmony_ci return this.convertToBig64LE(value, offset); 9024d6c458bSopenharmony_ci } 9034d6c458bSopenharmony_ci 9044d6c458bSopenharmony_ci private calculationLE(offset: number, count: number): number { 9054d6c458bSopenharmony_ci let result: number = 0; 9064d6c458bSopenharmony_ci for (let i = 0; i < count; i++) { 9074d6c458bSopenharmony_ci result += this[offset++] * Math.pow(twoBytes, eightBytes * i); 9084d6c458bSopenharmony_ci } 9094d6c458bSopenharmony_ci return result; 9104d6c458bSopenharmony_ci } 9114d6c458bSopenharmony_ci 9124d6c458bSopenharmony_ci private calculationBE(offset: number, count: number): number { 9134d6c458bSopenharmony_ci let result: number = 0; 9144d6c458bSopenharmony_ci for (let i = count - 1; i >= 0; i--) { 9154d6c458bSopenharmony_ci result += this[offset++] * Math.pow(twoBytes, eightBytes * i); 9164d6c458bSopenharmony_ci } 9174d6c458bSopenharmony_ci return result; 9184d6c458bSopenharmony_ci } 9194d6c458bSopenharmony_ci 9204d6c458bSopenharmony_ci readBigInt64LE(offset: number = 0): bigint { 9214d6c458bSopenharmony_ci if (offset === null) { 9224d6c458bSopenharmony_ci offset = 0; 9234d6c458bSopenharmony_ci } 9244d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 9254d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 9264d6c458bSopenharmony_ci const val = this.calculationLE(offset + fourBytes, threeBytes) + (this[offset + sevenBytes] << 24); // 24 means offset 24-bits left 9274d6c458bSopenharmony_ci return (BigInt(val) << 32n) + BigInt(this.calculationLE(offset, fourBytes)); // 32 means offset 32-bits left 9284d6c458bSopenharmony_ci } 9294d6c458bSopenharmony_ci 9304d6c458bSopenharmony_ci writeBigUInt64BE(value: bigint, offset: number = 0): number { 9314d6c458bSopenharmony_ci typeErrorCheck(value, ['bigint'], 'value'); 9324d6c458bSopenharmony_ci if (offset === null) { 9334d6c458bSopenharmony_ci offset = 0; 9344d6c458bSopenharmony_ci } 9354d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 9364d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 9374d6c458bSopenharmony_ci // 2n : 64n : 1n : The range of 64-bit BigUInt value is from 0 to the 64st power of 2 minus 1 9384d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, 2n ** 64n - 1n, '0', '2n ** 64n - 1n'); 9394d6c458bSopenharmony_ci 9404d6c458bSopenharmony_ci return this.convertToBig64BE(value, offset); 9414d6c458bSopenharmony_ci } 9424d6c458bSopenharmony_ci 9434d6c458bSopenharmony_ci readBigUInt64BE(offset: number = 0): bigint { 9444d6c458bSopenharmony_ci if (offset === null) { 9454d6c458bSopenharmony_ci offset = 0; 9464d6c458bSopenharmony_ci } 9474d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 9484d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 9494d6c458bSopenharmony_ci const hi = this.calculationBE(offset, fourBytes); 9504d6c458bSopenharmony_ci 9514d6c458bSopenharmony_ci const lo = this.calculationBE(offset + fourBytes, fourBytes); 9524d6c458bSopenharmony_ci return (BigInt(hi) << 32n) + BigInt(lo); // 32 means offset 32-bits left 9534d6c458bSopenharmony_ci } 9544d6c458bSopenharmony_ci 9554d6c458bSopenharmony_ci writeBigUInt64LE(value: bigint, offset: number = 0): number { 9564d6c458bSopenharmony_ci typeErrorCheck(value, ['bigint'], 'value'); 9574d6c458bSopenharmony_ci if (offset === null) { 9584d6c458bSopenharmony_ci offset = 0; 9594d6c458bSopenharmony_ci } 9604d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 9614d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 9624d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, 2n ** 64n - 1n, '0', '2n ** 64n - 1n'); // 2n : 64n : 1n : The range of BigUInt 9634d6c458bSopenharmony_ci 9644d6c458bSopenharmony_ci return this.convertToBig64LE(value, offset); 9654d6c458bSopenharmony_ci } 9664d6c458bSopenharmony_ci 9674d6c458bSopenharmony_ci readBigUInt64LE(offset: number = 0): bigint { 9684d6c458bSopenharmony_ci if (offset === null) { 9694d6c458bSopenharmony_ci offset = 0; 9704d6c458bSopenharmony_ci } 9714d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 9724d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 9734d6c458bSopenharmony_ci const lo = this.calculationLE(offset, fourBytes); 9744d6c458bSopenharmony_ci const hi = this.calculationLE(offset + fourBytes, fourBytes); 9754d6c458bSopenharmony_ci return BigInt(lo) + (BigInt(hi) << 32n); // 32 means offset 32-bits left 9764d6c458bSopenharmony_ci } 9774d6c458bSopenharmony_ci 9784d6c458bSopenharmony_ci writeInt8(value: number, offset: number = 0): number { 9794d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 9804d6c458bSopenharmony_ci if (offset === null) { 9814d6c458bSopenharmony_ci offset = 0; 9824d6c458bSopenharmony_ci } 9834d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 9844d6c458bSopenharmony_ci this.checkOffsetRange(offset, oneByte); 9854d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', - (TWO_POW_SEVEN), (TWO_POW_SEVEN - 1)); 9864d6c458bSopenharmony_ci value = +value; 9874d6c458bSopenharmony_ci 9884d6c458bSopenharmony_ci this[offset] = value; 9894d6c458bSopenharmony_ci return offset + 1; 9904d6c458bSopenharmony_ci } 9914d6c458bSopenharmony_ci 9924d6c458bSopenharmony_ci readInt8(offset: number = 0): number { 9934d6c458bSopenharmony_ci if (offset === null) { 9944d6c458bSopenharmony_ci offset = 0; 9954d6c458bSopenharmony_ci } 9964d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 9974d6c458bSopenharmony_ci this.checkOffsetRange(offset, oneByte); 9984d6c458bSopenharmony_ci const val = this[offset]; 9994d6c458bSopenharmony_ci 10004d6c458bSopenharmony_ci return val | (val & TWO_POW_SEVEN) * 0x1fffffe; // 0x1fffffe mean the decimal value is 33554430" 10014d6c458bSopenharmony_ci } 10024d6c458bSopenharmony_ci 10034d6c458bSopenharmony_ci writeInt16BE(value: number, offset: number = 0): number { 10044d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 10054d6c458bSopenharmony_ci if (offset === null) { 10064d6c458bSopenharmony_ci offset = 0; 10074d6c458bSopenharmony_ci } 10084d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 10094d6c458bSopenharmony_ci this.checkOffsetRange(offset, twoBytes); 10104d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', - (TWO_POW_FIFTEEN), (TWO_POW_FIFTEEN - 1)); 10114d6c458bSopenharmony_ci value = +value; 10124d6c458bSopenharmony_ci this[offset++] = (value >>> eightBytes); 10134d6c458bSopenharmony_ci this[offset++] = value; 10144d6c458bSopenharmony_ci return offset; 10154d6c458bSopenharmony_ci } 10164d6c458bSopenharmony_ci 10174d6c458bSopenharmony_ci readInt16BE(offset: number = 0): number { 10184d6c458bSopenharmony_ci if (offset === null) { 10194d6c458bSopenharmony_ci offset = 0; 10204d6c458bSopenharmony_ci } 10214d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 10224d6c458bSopenharmony_ci this.checkOffsetRange(offset, twoBytes); 10234d6c458bSopenharmony_ci const val = this.calculationBE(offset, twoBytes); 10244d6c458bSopenharmony_ci return val | (val & TWO_POW_FIFTEEN) * 0x1fffe; // 0x1fffe mean the decimal value is 131070" 10254d6c458bSopenharmony_ci } 10264d6c458bSopenharmony_ci 10274d6c458bSopenharmony_ci writeInt16LE(value: number, offset: number = 0): number { 10284d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 10294d6c458bSopenharmony_ci if (offset === null) { 10304d6c458bSopenharmony_ci offset = 0; 10314d6c458bSopenharmony_ci } 10324d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 10334d6c458bSopenharmony_ci this.checkOffsetRange(offset, twoBytes); 10344d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', -(TWO_POW_FIFTEEN), (TWO_POW_FIFTEEN - 1)); 10354d6c458bSopenharmony_ci value = +value; 10364d6c458bSopenharmony_ci this[offset++] = value; 10374d6c458bSopenharmony_ci this[offset++] = (value >>> eightBytes); 10384d6c458bSopenharmony_ci return offset; 10394d6c458bSopenharmony_ci } 10404d6c458bSopenharmony_ci 10414d6c458bSopenharmony_ci readInt16LE(offset: number = 0): number { 10424d6c458bSopenharmony_ci if (offset === null) { 10434d6c458bSopenharmony_ci offset = 0; 10444d6c458bSopenharmony_ci } 10454d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 10464d6c458bSopenharmony_ci this.checkOffsetRange(offset, twoBytes); 10474d6c458bSopenharmony_ci const val = this[offset] + this[offset + 1] * Math.pow(twoBytes, eightBytes); 10484d6c458bSopenharmony_ci return val | (val & TWO_POW_FIFTEEN) * 0x1fffe; // 0x1fffe mean the decimal value is 131070" 10494d6c458bSopenharmony_ci } 10504d6c458bSopenharmony_ci 10514d6c458bSopenharmony_ci readUInt16LE(offset: number = 0): number { 10524d6c458bSopenharmony_ci if (offset === null) { 10534d6c458bSopenharmony_ci offset = 0; 10544d6c458bSopenharmony_ci } 10554d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 10564d6c458bSopenharmony_ci this.checkOffsetRange(offset, twoBytes); 10574d6c458bSopenharmony_ci return this[offset] + this[offset + 1] * Math.pow(twoBytes, eightBytes); // 8 means offset 8 bits 10584d6c458bSopenharmony_ci } 10594d6c458bSopenharmony_ci 10604d6c458bSopenharmony_ci writeUInt8(value: number, offset: number = 0): number { 10614d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 10624d6c458bSopenharmony_ci if (offset === null) { 10634d6c458bSopenharmony_ci offset = 0; 10644d6c458bSopenharmony_ci } 10654d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 10664d6c458bSopenharmony_ci this.checkOffsetRange(offset, oneByte); 10674d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, 255); // 255 : The range of 8-bit UInt value is from 0 to the 255 10684d6c458bSopenharmony_ci value = +value; 10694d6c458bSopenharmony_ci 10704d6c458bSopenharmony_ci this[offset] = value; 10714d6c458bSopenharmony_ci return offset + 1; 10724d6c458bSopenharmony_ci } 10734d6c458bSopenharmony_ci 10744d6c458bSopenharmony_ci readUInt8(offset: number = 0): number { 10754d6c458bSopenharmony_ci if (offset === null) { 10764d6c458bSopenharmony_ci offset = 0; 10774d6c458bSopenharmony_ci } 10784d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 10794d6c458bSopenharmony_ci this.checkOffsetRange(offset, oneByte); 10804d6c458bSopenharmony_ci const val = this[offset]; 10814d6c458bSopenharmony_ci return val; 10824d6c458bSopenharmony_ci } 10834d6c458bSopenharmony_ci 10844d6c458bSopenharmony_ci writeIntBE(value: number, offset: number, byteLength: number): number | undefined { 10854d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 10864d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 10874d6c458bSopenharmony_ci typeErrorCheck(byteLength, ['number'], 'byteLength'); 10884d6c458bSopenharmony_ci return this.writeData(value, offset, byteLength, Style.intBE); 10894d6c458bSopenharmony_ci } 10904d6c458bSopenharmony_ci 10914d6c458bSopenharmony_ci private writeUInt24BE(value: number, offset: number = 0): number { 10924d6c458bSopenharmony_ci this.checkOffsetRange(offset, threeBytes); 10934d6c458bSopenharmony_ci // 24 : The range of 24-bit UInt value is from 0 to the 24st power of 2 minus 1 10944d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, twoBytes ** 24 - 1, '0', '2**24 - 1'); 10954d6c458bSopenharmony_ci value = +value; 10964d6c458bSopenharmony_ci for (let i: number = twoBytes; i > 0; i--) { 10974d6c458bSopenharmony_ci this[offset + i] = value; 10984d6c458bSopenharmony_ci value = value >>> eightBytes; 10994d6c458bSopenharmony_ci } 11004d6c458bSopenharmony_ci this[offset] = value; 11014d6c458bSopenharmony_ci return offset + threeBytes; 11024d6c458bSopenharmony_ci } 11034d6c458bSopenharmony_ci 11044d6c458bSopenharmony_ci private writeUInt40BE(value: number, offset: number = 0): number { 11054d6c458bSopenharmony_ci this.checkOffsetRange(offset, fiveBytes); 11064d6c458bSopenharmony_ci // 2 : 40 : The range of 40-bit UInt value is from 0 to the 40st power of 2 minus 1 11074d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, twoBytes ** 40 - 1, '0', '2**40 - 1'); 11084d6c458bSopenharmony_ci value = +value; 11094d6c458bSopenharmony_ci this[offset++] = Math.floor(value * Math.pow(twoBytes, -32)); // -32 means offset 32 bits to left 11104d6c458bSopenharmony_ci for (let i: number = 3; i > 0; i--) { // 3 is array->maxIndex 11114d6c458bSopenharmony_ci this[offset + i] = value; 11124d6c458bSopenharmony_ci value = value >>> eightBytes; 11134d6c458bSopenharmony_ci } 11144d6c458bSopenharmony_ci this[offset] = value; 11154d6c458bSopenharmony_ci return offset + fourBytes; 11164d6c458bSopenharmony_ci } 11174d6c458bSopenharmony_ci 11184d6c458bSopenharmony_ci private writeUInt48BE(value: number, offset: number = 0): number { 11194d6c458bSopenharmony_ci this.checkOffsetRange(offset, sixBytes); 11204d6c458bSopenharmony_ci // 48 : The range of 48-bit UInt value is from 0 to the 48st power of 2 minus 1 11214d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, twoBytes ** 48 - 1, '0', '2**48 - 1'); 11224d6c458bSopenharmony_ci value = +value; 11234d6c458bSopenharmony_ci const newVal = Math.floor(value * Math.pow(twoBytes, -32)); // -32 means offset 32 bits to left 11244d6c458bSopenharmony_ci this[offset++] = (newVal >>> eightBytes); 11254d6c458bSopenharmony_ci this[offset++] = newVal; 11264d6c458bSopenharmony_ci for (let i: number = 3; i > 0; i--) { // 3 is array->maxIndex 11274d6c458bSopenharmony_ci this[offset + i] = value; 11284d6c458bSopenharmony_ci value = value >>> eightBytes; 11294d6c458bSopenharmony_ci } 11304d6c458bSopenharmony_ci this[offset] = value; 11314d6c458bSopenharmony_ci return offset + fourBytes; 11324d6c458bSopenharmony_ci } 11334d6c458bSopenharmony_ci 11344d6c458bSopenharmony_ci readIntBE(offset: number, byteLength: number): number | undefined { 11354d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 11364d6c458bSopenharmony_ci typeErrorCheck(byteLength, ['number'], 'byteLength'); 11374d6c458bSopenharmony_ci return this.readData(offset, byteLength, Style.intBE); 11384d6c458bSopenharmony_ci } 11394d6c458bSopenharmony_ci 11404d6c458bSopenharmony_ci private readInt48BE(offset: number = 0): number { 11414d6c458bSopenharmony_ci this.checkOffsetRange(offset, sixBytes); 11424d6c458bSopenharmony_ci const val = this.calculationBE(offset, twoBytes); 11434d6c458bSopenharmony_ci return (val | (val & TWO_POW_FIFTEEN) * 0x1fffe) * MAX_LENGTH + this.calculationBE(offset + twoBytes, fourBytes); 11444d6c458bSopenharmony_ci } 11454d6c458bSopenharmony_ci 11464d6c458bSopenharmony_ci private readInt40BE(offset: number = 0): number { 11474d6c458bSopenharmony_ci this.checkOffsetRange(offset, fiveBytes); 11484d6c458bSopenharmony_ci const first = this[offset]; 11494d6c458bSopenharmony_ci const last = this[offset + fourBytes]; 11504d6c458bSopenharmony_ci return (this[offset] | (this[offset] & TWO_POW_SEVEN) * 0x1fffffe) * MAX_LENGTH + 11514d6c458bSopenharmony_ci this.calculationBE(++offset, fourBytes); 11524d6c458bSopenharmony_ci } 11534d6c458bSopenharmony_ci 11544d6c458bSopenharmony_ci 11554d6c458bSopenharmony_ci private readInt24BE(offset: number = 0): number { 11564d6c458bSopenharmony_ci this.checkOffsetRange(offset, threeBytes); 11574d6c458bSopenharmony_ci const val = this.calculationBE(offset, threeBytes); 11584d6c458bSopenharmony_ci // 23 : 0x1fe : The number of 3 bytes changes to 4 bytes, positive high fill 0, negative high fill 1. 11594d6c458bSopenharmony_ci return val | (val & Math.pow(twoBytes, 23)) * 0x1fe; 11604d6c458bSopenharmony_ci } 11614d6c458bSopenharmony_ci 11624d6c458bSopenharmony_ci writeIntLE(value: number, offset: number, byteLength: number): number | undefined { 11634d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 11644d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 11654d6c458bSopenharmony_ci typeErrorCheck(byteLength, ['number'], 'byteLength'); 11664d6c458bSopenharmony_ci return this.writeData(value, offset, byteLength, Style.intLE); 11674d6c458bSopenharmony_ci } 11684d6c458bSopenharmony_ci 11694d6c458bSopenharmony_ci private writeUInt48LE(value: number, offset: number = 0): number { 11704d6c458bSopenharmony_ci this.checkOffsetRange(offset, sixBytes); 11714d6c458bSopenharmony_ci // 2 : 48 : The range of 48-bit UInt value is from 0 to the 48st power of 2 minus 1 11724d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, twoBytes ** 48 - 1, '0', '2**48 - 1'); 11734d6c458bSopenharmony_ci value = +value; 11744d6c458bSopenharmony_ci const newVal = Math.floor(value * Math.pow(twoBytes, -32)); // -32 means offset 32 bits to left 11754d6c458bSopenharmony_ci for (let i: number = 3; i > 0; i--) { 11764d6c458bSopenharmony_ci this[offset++] = value; 11774d6c458bSopenharmony_ci value = value >>> eightBytes; 11784d6c458bSopenharmony_ci } 11794d6c458bSopenharmony_ci this[offset++] = value; 11804d6c458bSopenharmony_ci this[offset++] = newVal; 11814d6c458bSopenharmony_ci this[offset++] = (newVal >>> eightBytes); 11824d6c458bSopenharmony_ci return offset; 11834d6c458bSopenharmony_ci } 11844d6c458bSopenharmony_ci 11854d6c458bSopenharmony_ci private writeUInt40LE(value: number, offset: number = 0): number { 11864d6c458bSopenharmony_ci this.checkOffsetRange(offset, fiveBytes); 11874d6c458bSopenharmony_ci // 2 : 40 : The range of 40-bit UInt value is from 0 to the 40st power of 2 minus 1 11884d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, twoBytes ** 40 - 1, '0', '2**40 - 1'); 11894d6c458bSopenharmony_ci value = +value; 11904d6c458bSopenharmony_ci const newVal = value; 11914d6c458bSopenharmony_ci for (let i: number = 3; i > 0; i--) { 11924d6c458bSopenharmony_ci this[offset++] = value; 11934d6c458bSopenharmony_ci value = value >>> eightBytes; 11944d6c458bSopenharmony_ci } 11954d6c458bSopenharmony_ci this[offset++] = value; 11964d6c458bSopenharmony_ci this[offset++] = Math.floor(newVal * Math.pow(twoBytes, -32)); // -32 means offset 32 bits to left 11974d6c458bSopenharmony_ci return offset; 11984d6c458bSopenharmony_ci } 11994d6c458bSopenharmony_ci 12004d6c458bSopenharmony_ci private writeUInt24LE(value: number, offset: number = 0): number { 12014d6c458bSopenharmony_ci this.checkOffsetRange(offset, threeBytes); 12024d6c458bSopenharmony_ci // 2 : 24 : The range of 24-bit UInt value is from 0 to the 24st power of 2 minus 1 12034d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, twoBytes ** 24 - 1, '0', '2**24 - 1'); 12044d6c458bSopenharmony_ci value = +value; 12054d6c458bSopenharmony_ci for (let i: number = twoBytes; i > 0; i--) { 12064d6c458bSopenharmony_ci this[offset++] = value; 12074d6c458bSopenharmony_ci value = value >>> eightBytes; 12084d6c458bSopenharmony_ci } 12094d6c458bSopenharmony_ci this[offset++] = value; 12104d6c458bSopenharmony_ci return offset; 12114d6c458bSopenharmony_ci } 12124d6c458bSopenharmony_ci 12134d6c458bSopenharmony_ci readIntLE(offset: number, byteLength: number): number | undefined { 12144d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 12154d6c458bSopenharmony_ci typeErrorCheck(byteLength, ['number'], 'byteLength'); 12164d6c458bSopenharmony_ci return this.readData(offset, byteLength, Style.intLE); 12174d6c458bSopenharmony_ci } 12184d6c458bSopenharmony_ci 12194d6c458bSopenharmony_ci private readInt48LE(offset: number = 0): number { 12204d6c458bSopenharmony_ci this.checkOffsetRange(offset, sixBytes); 12214d6c458bSopenharmony_ci const val = this.calculationLE(offset + fourBytes, twoBytes); 12224d6c458bSopenharmony_ci return (val | (val & TWO_POW_FIFTEEN) * 0x1fffe) * MAX_LENGTH + this.calculationLE(offset, fourBytes); 12234d6c458bSopenharmony_ci } 12244d6c458bSopenharmony_ci 12254d6c458bSopenharmony_ci private readInt40LE(offset: number = 0): number { 12264d6c458bSopenharmony_ci this.checkOffsetRange(offset, fiveBytes); 12274d6c458bSopenharmony_ci return (this[offset + fourBytes] | (this[offset + fourBytes] & TWO_POW_SEVEN) * 0x1fffffe) * MAX_LENGTH + 12284d6c458bSopenharmony_ci this.calculationLE(offset, fourBytes); 12294d6c458bSopenharmony_ci } 12304d6c458bSopenharmony_ci 12314d6c458bSopenharmony_ci private readInt24LE(offset: number = 0): number { 12324d6c458bSopenharmony_ci this.checkOffsetRange(offset, threeBytes); 12334d6c458bSopenharmony_ci const val = this.calculationLE(offset, threeBytes); 12344d6c458bSopenharmony_ci // 2 : 23 : 0x1fe : The number of 3 bytes changes to 4 bytes, positive high fill 0, negative high fill 1. 12354d6c458bSopenharmony_ci return val | (val & Math.pow(twoBytes, 23)) * 0x1fe; 12364d6c458bSopenharmony_ci } 12374d6c458bSopenharmony_ci 12384d6c458bSopenharmony_ci writeUIntLE(value: number, offset: number, byteLength: number): number | undefined { 12394d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 12404d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 12414d6c458bSopenharmony_ci typeErrorCheck(byteLength, ['number'], 'byteLength'); 12424d6c458bSopenharmony_ci return this.writeData(value, offset, byteLength, Style.uintLE); 12434d6c458bSopenharmony_ci } 12444d6c458bSopenharmony_ci 12454d6c458bSopenharmony_ci readUIntLE(offset: number, byteLength: number): number | undefined { 12464d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 12474d6c458bSopenharmony_ci typeErrorCheck(byteLength, ['number'], 'byteLength'); 12484d6c458bSopenharmony_ci return this.readData(offset, byteLength, Style.uintLE); 12494d6c458bSopenharmony_ci } 12504d6c458bSopenharmony_ci 12514d6c458bSopenharmony_ci private readUInt48LE(offset: number = 0): number { 12524d6c458bSopenharmony_ci this.checkOffsetRange(offset, sixBytes); 12534d6c458bSopenharmony_ci return this.calculationLE(offset, fourBytes) + 12544d6c458bSopenharmony_ci (this.calculationLE(offset + fourBytes, twoBytes)) * MAX_LENGTH; 12554d6c458bSopenharmony_ci } 12564d6c458bSopenharmony_ci 12574d6c458bSopenharmony_ci private readUInt40LE(offset: number = 0): number { 12584d6c458bSopenharmony_ci this.checkOffsetRange(offset, fiveBytes); 12594d6c458bSopenharmony_ci return this.calculationLE(offset, fiveBytes); 12604d6c458bSopenharmony_ci } 12614d6c458bSopenharmony_ci 12624d6c458bSopenharmony_ci private readUInt24LE(offset: number = 0): number { 12634d6c458bSopenharmony_ci this.checkOffsetRange(offset, threeBytes); 12644d6c458bSopenharmony_ci return this.calculationLE(offset, threeBytes); 12654d6c458bSopenharmony_ci } 12664d6c458bSopenharmony_ci 12674d6c458bSopenharmony_ci writeUIntBE(value: number, offset: number, byteLength: number): number | undefined { 12684d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 12694d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 12704d6c458bSopenharmony_ci typeErrorCheck(byteLength, ['number'], 'byteLength'); 12714d6c458bSopenharmony_ci return this.writeData(value, offset, byteLength, Style.uintBE); 12724d6c458bSopenharmony_ci } 12734d6c458bSopenharmony_ci 12744d6c458bSopenharmony_ci readUIntBE(offset: number, byteLength: number): number | undefined { 12754d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 12764d6c458bSopenharmony_ci typeErrorCheck(byteLength, ['number'], 'byteLength'); 12774d6c458bSopenharmony_ci return this.readData(offset, byteLength, Style.uintBE); 12784d6c458bSopenharmony_ci } 12794d6c458bSopenharmony_ci 12804d6c458bSopenharmony_ci private readUInt48BE(offset: number = 0): number { 12814d6c458bSopenharmony_ci this.checkOffsetRange(offset, sixBytes); 12824d6c458bSopenharmony_ci return (this.calculationBE(offset, twoBytes)) * MAX_LENGTH + this.calculationBE(offset + twoBytes, fourBytes); 12834d6c458bSopenharmony_ci } 12844d6c458bSopenharmony_ci 12854d6c458bSopenharmony_ci private readUInt40BE(offset: number = 0): number { 12864d6c458bSopenharmony_ci this.checkOffsetRange(offset, fiveBytes); 12874d6c458bSopenharmony_ci return this.calculationBE(offset, fiveBytes); 12884d6c458bSopenharmony_ci } 12894d6c458bSopenharmony_ci 12904d6c458bSopenharmony_ci private readUInt24BE(offset: number = 0): number { 12914d6c458bSopenharmony_ci this.checkOffsetRange(offset, threeBytes); 12924d6c458bSopenharmony_ci return this.calculationBE(offset, threeBytes); 12934d6c458bSopenharmony_ci } 12944d6c458bSopenharmony_ci 12954d6c458bSopenharmony_ci writeInt32BE(value: number, offset: number = 0): number { 12964d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 12974d6c458bSopenharmony_ci if (offset === null) { 12984d6c458bSopenharmony_ci offset = 0; 12994d6c458bSopenharmony_ci } 13004d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 13014d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 13024d6c458bSopenharmony_ci // 2 : 31 : The range of 32-bit Int value is from negative the 31st power of 2 to the 31st power of 2 minus 1 13034d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', - (Math.pow(twoBytes, 31)), (Math.pow(twoBytes, 31) - 1)); 13044d6c458bSopenharmony_ci 13054d6c458bSopenharmony_ci value = +value; 13064d6c458bSopenharmony_ci this[bufferSymbol].writeInt32BE(value, offset); 13074d6c458bSopenharmony_ci return offset + fourBytes; 13084d6c458bSopenharmony_ci } 13094d6c458bSopenharmony_ci 13104d6c458bSopenharmony_ci private checkOffsetRange(offset: number, size: number): void { 13114d6c458bSopenharmony_ci rangeErrorCheck(offset, 'offset', 0, this.length - size); 13124d6c458bSopenharmony_ci } 13134d6c458bSopenharmony_ci 13144d6c458bSopenharmony_ci readInt32BE(offset: number = 0): number { 13154d6c458bSopenharmony_ci if (offset === null) { 13164d6c458bSopenharmony_ci offset = 0; 13174d6c458bSopenharmony_ci } 13184d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 13194d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 13204d6c458bSopenharmony_ci return this[bufferSymbol].readInt32BE(offset); 13214d6c458bSopenharmony_ci } 13224d6c458bSopenharmony_ci 13234d6c458bSopenharmony_ci writeInt32LE(value: number, offset: number = 0): number { 13244d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 13254d6c458bSopenharmony_ci if (offset === null) { 13264d6c458bSopenharmony_ci offset = 0; 13274d6c458bSopenharmony_ci } 13284d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 13294d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 13304d6c458bSopenharmony_ci // 2 : 31 : The range of 32-bit Int value is from negative the 31st power of 2 to the 31st power of 2 minus 1 13314d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', - (Math.pow(twoBytes, 31)), (Math.pow(twoBytes, 31) - 1)); 13324d6c458bSopenharmony_ci 13334d6c458bSopenharmony_ci value = +value; 13344d6c458bSopenharmony_ci this[bufferSymbol].writeInt32LE(value, offset); 13354d6c458bSopenharmony_ci return offset + fourBytes; 13364d6c458bSopenharmony_ci } 13374d6c458bSopenharmony_ci 13384d6c458bSopenharmony_ci readInt32LE(offset: number = 0): number { 13394d6c458bSopenharmony_ci if (offset === null) { 13404d6c458bSopenharmony_ci offset = 0; 13414d6c458bSopenharmony_ci } 13424d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 13434d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 13444d6c458bSopenharmony_ci return this[bufferSymbol].readInt32LE(offset); 13454d6c458bSopenharmony_ci } 13464d6c458bSopenharmony_ci 13474d6c458bSopenharmony_ci writeUInt32BE(value: number, offset: number = 0): number { 13484d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 13494d6c458bSopenharmony_ci if (offset === null) { 13504d6c458bSopenharmony_ci offset = 0; 13514d6c458bSopenharmony_ci } 13524d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 13534d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 13544d6c458bSopenharmony_ci // 2 : 32 : The range of 32-bit UInt value is from zero to the 32st power of 2 minus 1 13554d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, (MAX_LENGTH - 1)); 13564d6c458bSopenharmony_ci value = +value; 13574d6c458bSopenharmony_ci this[bufferSymbol].writeUInt32BE(value, offset); 13584d6c458bSopenharmony_ci return offset + fourBytes; 13594d6c458bSopenharmony_ci } 13604d6c458bSopenharmony_ci 13614d6c458bSopenharmony_ci readUInt32BE(offset: number = 0): number { 13624d6c458bSopenharmony_ci if (offset === null) { 13634d6c458bSopenharmony_ci offset = 0; 13644d6c458bSopenharmony_ci } 13654d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 13664d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 13674d6c458bSopenharmony_ci return this[bufferSymbol].readUInt32BE(offset); 13684d6c458bSopenharmony_ci } 13694d6c458bSopenharmony_ci 13704d6c458bSopenharmony_ci writeUInt32LE(value: number, offset: number = 0): number { 13714d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 13724d6c458bSopenharmony_ci if (offset === null) { 13734d6c458bSopenharmony_ci offset = 0; 13744d6c458bSopenharmony_ci } 13754d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 13764d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 13774d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, (MAX_LENGTH - 1)); 13784d6c458bSopenharmony_ci value = +value; 13794d6c458bSopenharmony_ci this[bufferSymbol].writeUInt32LE(value, offset); 13804d6c458bSopenharmony_ci return offset + fourBytes; 13814d6c458bSopenharmony_ci } 13824d6c458bSopenharmony_ci 13834d6c458bSopenharmony_ci readUInt32LE(offset: number = 0): number { 13844d6c458bSopenharmony_ci if (offset === null) { 13854d6c458bSopenharmony_ci offset = 0; 13864d6c458bSopenharmony_ci } 13874d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 13884d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 13894d6c458bSopenharmony_ci return this[bufferSymbol].readUInt32LE(offset); 13904d6c458bSopenharmony_ci } 13914d6c458bSopenharmony_ci 13924d6c458bSopenharmony_ci writeDoubleBE(value: number, offset: number = 0): number { 13934d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 13944d6c458bSopenharmony_ci if (offset === null) { 13954d6c458bSopenharmony_ci offset = 0; 13964d6c458bSopenharmony_ci } 13974d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 13984d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 13994d6c458bSopenharmony_ci 14004d6c458bSopenharmony_ci value = +value; 14014d6c458bSopenharmony_ci float64Array[0] = value; 14024d6c458bSopenharmony_ci let i: number = 7; // 7 is uInt8Float64Array->maxIndex 14034d6c458bSopenharmony_ci while (i >= 0) { 14044d6c458bSopenharmony_ci this[offset++] = uInt8Float64Array[i--]; 14054d6c458bSopenharmony_ci } 14064d6c458bSopenharmony_ci return offset; 14074d6c458bSopenharmony_ci } 14084d6c458bSopenharmony_ci 14094d6c458bSopenharmony_ci readDoubleBE(offset: number = 0): number { 14104d6c458bSopenharmony_ci if (offset === null) { 14114d6c458bSopenharmony_ci offset = 0; 14124d6c458bSopenharmony_ci } 14134d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 14144d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 14154d6c458bSopenharmony_ci 14164d6c458bSopenharmony_ci let i: number = 7; // 7 is uInt8Float64Array->maxIndex 14174d6c458bSopenharmony_ci while (i >= 0) { 14184d6c458bSopenharmony_ci uInt8Float64Array[i--] = this[offset++]; 14194d6c458bSopenharmony_ci } 14204d6c458bSopenharmony_ci return float64Array[0]; 14214d6c458bSopenharmony_ci } 14224d6c458bSopenharmony_ci 14234d6c458bSopenharmony_ci writeDoubleLE(value: number, offset: number = 0): number { 14244d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 14254d6c458bSopenharmony_ci if (offset === null) { 14264d6c458bSopenharmony_ci offset = 0; 14274d6c458bSopenharmony_ci } 14284d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 14294d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 14304d6c458bSopenharmony_ci 14314d6c458bSopenharmony_ci value = +value; 14324d6c458bSopenharmony_ci float64Array[0] = value; 14334d6c458bSopenharmony_ci let i: number = 0; 14344d6c458bSopenharmony_ci while (i <= 7) { // 7 is uInt8Float64Array->maxIndex 14354d6c458bSopenharmony_ci this[offset++] = uInt8Float64Array[i++]; 14364d6c458bSopenharmony_ci } 14374d6c458bSopenharmony_ci return offset; 14384d6c458bSopenharmony_ci } 14394d6c458bSopenharmony_ci 14404d6c458bSopenharmony_ci readDoubleLE(offset: number = 0): number { 14414d6c458bSopenharmony_ci if (offset === null) { 14424d6c458bSopenharmony_ci offset = 0; 14434d6c458bSopenharmony_ci } 14444d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 14454d6c458bSopenharmony_ci this.checkOffsetRange(offset, eightBytes); 14464d6c458bSopenharmony_ci 14474d6c458bSopenharmony_ci let i: number = 0; 14484d6c458bSopenharmony_ci while (i <= 7) { // 7 is uInt8Float64Array->maxIndex 14494d6c458bSopenharmony_ci uInt8Float64Array[i++] = this[offset++]; 14504d6c458bSopenharmony_ci } 14514d6c458bSopenharmony_ci return float64Array[0]; 14524d6c458bSopenharmony_ci } 14534d6c458bSopenharmony_ci 14544d6c458bSopenharmony_ci writeFloatBE(value: number, offset: number = 0): number { 14554d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 14564d6c458bSopenharmony_ci if (offset === null) { 14574d6c458bSopenharmony_ci offset = 0; 14584d6c458bSopenharmony_ci } 14594d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 14604d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 14614d6c458bSopenharmony_ci 14624d6c458bSopenharmony_ci value = +value; 14634d6c458bSopenharmony_ci float32Array[0] = value; 14644d6c458bSopenharmony_ci let i: number = 3; // 3 is uInt8Float32Array->maxIndex 14654d6c458bSopenharmony_ci while (i >= 0) { 14664d6c458bSopenharmony_ci this[offset++] = uInt8Float32Array[i--]; 14674d6c458bSopenharmony_ci } 14684d6c458bSopenharmony_ci return offset; 14694d6c458bSopenharmony_ci } 14704d6c458bSopenharmony_ci 14714d6c458bSopenharmony_ci readFloatBE(offset: number = 0): number { 14724d6c458bSopenharmony_ci if (offset === null) { 14734d6c458bSopenharmony_ci offset = 0; 14744d6c458bSopenharmony_ci } 14754d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 14764d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 14774d6c458bSopenharmony_ci 14784d6c458bSopenharmony_ci let i: number = 3; // 3 is uInt8Float32Array->maxIndex 14794d6c458bSopenharmony_ci while (i >= 0) { 14804d6c458bSopenharmony_ci uInt8Float32Array[i--] = this[offset++]; 14814d6c458bSopenharmony_ci } 14824d6c458bSopenharmony_ci return float32Array[0]; 14834d6c458bSopenharmony_ci } 14844d6c458bSopenharmony_ci 14854d6c458bSopenharmony_ci writeFloatLE(value: number, offset: number = 0): number { 14864d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 14874d6c458bSopenharmony_ci if (offset === null) { 14884d6c458bSopenharmony_ci offset = 0; 14894d6c458bSopenharmony_ci } 14904d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 14914d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 14924d6c458bSopenharmony_ci 14934d6c458bSopenharmony_ci value = +value; 14944d6c458bSopenharmony_ci float32Array[0] = value; 14954d6c458bSopenharmony_ci let i: number = 0; 14964d6c458bSopenharmony_ci while (i <= 3) { // 3 is uInt8Float32Array->maxIndex 14974d6c458bSopenharmony_ci this[offset++] = uInt8Float32Array[i++]; 14984d6c458bSopenharmony_ci } 14994d6c458bSopenharmony_ci return offset; 15004d6c458bSopenharmony_ci } 15014d6c458bSopenharmony_ci 15024d6c458bSopenharmony_ci readFloatLE(offset: number): number { 15034d6c458bSopenharmony_ci if (offset === undefined || offset === null) { 15044d6c458bSopenharmony_ci offset = 0; 15054d6c458bSopenharmony_ci } 15064d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 15074d6c458bSopenharmony_ci this.checkOffsetRange(offset, fourBytes); 15084d6c458bSopenharmony_ci let i: number = 0; 15094d6c458bSopenharmony_ci while (i <= 3) { // 3 is uInt8Float32Array->maxIndex 15104d6c458bSopenharmony_ci uInt8Float32Array[i++] = this[offset++]; 15114d6c458bSopenharmony_ci } 15124d6c458bSopenharmony_ci return float32Array[0]; 15134d6c458bSopenharmony_ci } 15144d6c458bSopenharmony_ci 15154d6c458bSopenharmony_ci writeUInt16BE(value: number, offset: number = 0): number { 15164d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 15174d6c458bSopenharmony_ci if (offset === null) { 15184d6c458bSopenharmony_ci offset = 0; 15194d6c458bSopenharmony_ci } 15204d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 15214d6c458bSopenharmony_ci this.checkOffsetRange(offset, twoBytes); 15224d6c458bSopenharmony_ci // 2 : 16 : The range of 32-bit Int value is from zero to the 16st power of 2 minus 1 15234d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, Math.pow(twoBytes, 16) - 1); 15244d6c458bSopenharmony_ci value = +value; 15254d6c458bSopenharmony_ci this[offset++] = (value >>> eightBytes); 15264d6c458bSopenharmony_ci this[offset++] = value; 15274d6c458bSopenharmony_ci return offset; 15284d6c458bSopenharmony_ci } 15294d6c458bSopenharmony_ci 15304d6c458bSopenharmony_ci readUInt16BE(offset: number = 0): number { 15314d6c458bSopenharmony_ci if (offset === null) { 15324d6c458bSopenharmony_ci offset = 0; 15334d6c458bSopenharmony_ci } 15344d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 15354d6c458bSopenharmony_ci this.checkOffsetRange(offset, twoBytes); 15364d6c458bSopenharmony_ci const first = this[offset]; 15374d6c458bSopenharmony_ci const last = this[offset + 1]; 15384d6c458bSopenharmony_ci return first * Math.pow(twoBytes, eightBytes) + last; 15394d6c458bSopenharmony_ci } 15404d6c458bSopenharmony_ci 15414d6c458bSopenharmony_ci writeUInt16LE(value: number, offset: number = 0): number { 15424d6c458bSopenharmony_ci typeErrorCheck(value, ['number'], 'value'); 15434d6c458bSopenharmony_ci if (offset === null) { 15444d6c458bSopenharmony_ci offset = 0; 15454d6c458bSopenharmony_ci } 15464d6c458bSopenharmony_ci typeErrorCheck(offset, ['number'], 'offset'); 15474d6c458bSopenharmony_ci this.checkOffsetRange(offset, twoBytes); 15484d6c458bSopenharmony_ci // 2 : 16 : The range of 32-bit Int value is from zero to the 16st power of 2 minus 1 15494d6c458bSopenharmony_ci rangeErrorCheck(value, 'value', 0, Math.pow(twoBytes, 16) - 1); 15504d6c458bSopenharmony_ci value = +value; 15514d6c458bSopenharmony_ci this[offset++] = value; 15524d6c458bSopenharmony_ci this[offset++] = (value >>> eightBytes); 15534d6c458bSopenharmony_ci return offset; 15544d6c458bSopenharmony_ci } 15554d6c458bSopenharmony_ci 15564d6c458bSopenharmony_ci compareInner(target: Buffer | Uint8Array, targetStart: number = 0, targetEnd: number = target.length, 15574d6c458bSopenharmony_ci sourceStart: number = 0, sourceEnd: number = this.length): number { 15584d6c458bSopenharmony_ci let length1: number = sourceEnd - sourceStart; 15594d6c458bSopenharmony_ci let length2: number = targetEnd - targetStart; 15604d6c458bSopenharmony_ci let length: number = length1 > length2 ? length2 : length1; 15614d6c458bSopenharmony_ci if (target instanceof Buffer) { 15624d6c458bSopenharmony_ci let val = this[bufferSymbol].compare(target[bufferSymbol], targetStart, sourceStart, length); 15634d6c458bSopenharmony_ci if (val === 0) { 15644d6c458bSopenharmony_ci if (length1 === length2) { 15654d6c458bSopenharmony_ci return 0; 15664d6c458bSopenharmony_ci } 15674d6c458bSopenharmony_ci return length1 < length2 ? -1 : 1; 15684d6c458bSopenharmony_ci } else { 15694d6c458bSopenharmony_ci return val < 0 ? 1 : -1; 15704d6c458bSopenharmony_ci } 15714d6c458bSopenharmony_ci } else { 15724d6c458bSopenharmony_ci let bufData1 = this[bufferSymbol].getBufferData(); 15734d6c458bSopenharmony_ci for (let i = 0; i < length; i++) { 15744d6c458bSopenharmony_ci let value1 = +bufData1[i + sourceStart]; 15754d6c458bSopenharmony_ci let value2 = +target[i + targetStart]; 15764d6c458bSopenharmony_ci if (value1 === value2) { 15774d6c458bSopenharmony_ci continue; 15784d6c458bSopenharmony_ci } 15794d6c458bSopenharmony_ci return value1 < value2 ? -1 : 1; 15804d6c458bSopenharmony_ci } 15814d6c458bSopenharmony_ci if (length1 === length2) { 15824d6c458bSopenharmony_ci return 0; 15834d6c458bSopenharmony_ci } 15844d6c458bSopenharmony_ci return length1 < length2 ? -1 : 1; 15854d6c458bSopenharmony_ci } 15864d6c458bSopenharmony_ci } 15874d6c458bSopenharmony_ci 15884d6c458bSopenharmony_ci compare(target: Buffer | Uint8Array, targetStart: number = 0, targetEnd: number = target.length, 15894d6c458bSopenharmony_ci sourceStart: number = 0, sourceEnd: number = this.length): number { 15904d6c458bSopenharmony_ci if (targetStart === null) { 15914d6c458bSopenharmony_ci targetStart = 0; 15924d6c458bSopenharmony_ci } 15934d6c458bSopenharmony_ci if (targetEnd === null) { 15944d6c458bSopenharmony_ci targetEnd = target.length; 15954d6c458bSopenharmony_ci } 15964d6c458bSopenharmony_ci if (sourceStart === null) { 15974d6c458bSopenharmony_ci sourceStart = 0; 15984d6c458bSopenharmony_ci } 15994d6c458bSopenharmony_ci if (sourceEnd === null) { 16004d6c458bSopenharmony_ci sourceEnd = this.length; 16014d6c458bSopenharmony_ci } 16024d6c458bSopenharmony_ci typeErrorCheck(target, ['Buffer', 'Uint8Array'], 'target'); 16034d6c458bSopenharmony_ci typeErrorCheck(targetStart, ['number'], 'targetStart'); 16044d6c458bSopenharmony_ci typeErrorCheck(targetEnd, ['number'], 'targetEnd'); 16054d6c458bSopenharmony_ci typeErrorCheck(sourceStart, ['number'], 'sourceStart'); 16064d6c458bSopenharmony_ci typeErrorCheck(sourceEnd, ['number'], 'sourceEnd'); 16074d6c458bSopenharmony_ci rangeErrorCheck(targetStart, 'targetStart', 0, UINT32MAX); 16084d6c458bSopenharmony_ci rangeErrorCheck(sourceStart, 'sourceStart', 0, UINT32MAX); 16094d6c458bSopenharmony_ci rangeErrorCheck(targetEnd, 'targetEnd', 0, target.length); 16104d6c458bSopenharmony_ci rangeErrorCheck(sourceEnd, 'sourceEnd', 0, this.length); 16114d6c458bSopenharmony_ci if (sourceStart >= sourceEnd) { 16124d6c458bSopenharmony_ci return (targetStart >= targetEnd ? 0 : -1); 16134d6c458bSopenharmony_ci } 16144d6c458bSopenharmony_ci if (targetStart >= targetEnd) { 16154d6c458bSopenharmony_ci return 1; 16164d6c458bSopenharmony_ci } 16174d6c458bSopenharmony_ci return this.compareInner(target, targetStart, targetEnd, sourceStart, sourceEnd); 16184d6c458bSopenharmony_ci } 16194d6c458bSopenharmony_ci 16204d6c458bSopenharmony_ci equals(otherBuffer: Uint8Array | Buffer): boolean { 16214d6c458bSopenharmony_ci typeErrorCheck(otherBuffer, ['Buffer', 'Uint8Array'], 'otherBuffer'); 16224d6c458bSopenharmony_ci let res = this.compare(otherBuffer, 0, otherBuffer.length, 0, this.length); 16234d6c458bSopenharmony_ci return res === 0 ? true : false; 16244d6c458bSopenharmony_ci } 16254d6c458bSopenharmony_ci 16264d6c458bSopenharmony_ci subarray(start: number = 0, end: number = this.length): Buffer { 16274d6c458bSopenharmony_ci let newBuf: Buffer = new Buffer(0); 16284d6c458bSopenharmony_ci start = isNaN(start) ? 0 : Number(start); 16294d6c458bSopenharmony_ci end = isNaN(end) ? 0 : Number(end); 16304d6c458bSopenharmony_ci end = (end > this.length) ? this.length : end; 16314d6c458bSopenharmony_ci if (start < 0 || end < 0 || end <= start) { 16324d6c458bSopenharmony_ci return newBuf; 16334d6c458bSopenharmony_ci } 16344d6c458bSopenharmony_ci newBuf[bufferSymbol].subBuffer(this[bufferSymbol], start, end); 16354d6c458bSopenharmony_ci newBuf[lengthSymbol] = (end - start); 16364d6c458bSopenharmony_ci return newBuf; 16374d6c458bSopenharmony_ci } 16384d6c458bSopenharmony_ci 16394d6c458bSopenharmony_ci copy(target: Buffer | Uint8Array, targetStart: number = 0, sourceStart: number = 0, 16404d6c458bSopenharmony_ci sourceEnd: number = this.length): number { 16414d6c458bSopenharmony_ci typeErrorCheck(target, ['Buffer', 'Uint8Array'], 'target'); 16424d6c458bSopenharmony_ci targetStart = isNaN(targetStart) ? 0 : Number(targetStart); 16434d6c458bSopenharmony_ci sourceStart = isNaN(sourceStart) ? 0 : Number(sourceStart); 16444d6c458bSopenharmony_ci sourceEnd = isNaN(sourceEnd) ? this.length : Number(sourceEnd); 16454d6c458bSopenharmony_ci rangeLeftErrorCheck(targetStart, 'targetStart', 0); 16464d6c458bSopenharmony_ci rangeLeftErrorCheck(sourceStart, 'sourceStart', 0); 16474d6c458bSopenharmony_ci rangeLeftErrorCheck(sourceEnd, 'sourceEnd', 0); 16484d6c458bSopenharmony_ci if (targetStart >= target.length) { 16494d6c458bSopenharmony_ci return 0; 16504d6c458bSopenharmony_ci } 16514d6c458bSopenharmony_ci if (sourceEnd <= sourceStart || sourceStart >= this.length) { 16524d6c458bSopenharmony_ci return 0; 16534d6c458bSopenharmony_ci } 16544d6c458bSopenharmony_ci if (target instanceof Buffer) { 16554d6c458bSopenharmony_ci sourceEnd = sourceEnd > this.length ? this.length : sourceEnd; 16564d6c458bSopenharmony_ci return this[bufferSymbol].copy(target[bufferSymbol], targetStart, sourceStart, sourceEnd); 16574d6c458bSopenharmony_ci } 16584d6c458bSopenharmony_ci if (sourceEnd - sourceStart > target.length - targetStart) { 16594d6c458bSopenharmony_ci sourceEnd = target.length - targetStart + sourceStart; 16604d6c458bSopenharmony_ci } 16614d6c458bSopenharmony_ci let sLength = sourceEnd - sourceStart; 16624d6c458bSopenharmony_ci let res = sLength > this.length - sourceStart ? this.length - sourceStart : sLength; 16634d6c458bSopenharmony_ci for (let i = 0; i < res; i++) { 16644d6c458bSopenharmony_ci target[targetStart++] = this[sourceStart++]; 16654d6c458bSopenharmony_ci } 16664d6c458bSopenharmony_ci return res; 16674d6c458bSopenharmony_ci } 16684d6c458bSopenharmony_ci 16694d6c458bSopenharmony_ci toString(encoding: string = 'utf8', start: number = 0, end: number = this.length): string { 16704d6c458bSopenharmony_ci if (encoding === null) { 16714d6c458bSopenharmony_ci encoding = 'utf8'; 16724d6c458bSopenharmony_ci } 16734d6c458bSopenharmony_ci let encodObj = getEncodingByType(encoding); 16744d6c458bSopenharmony_ci if (!encodObj) { 16754d6c458bSopenharmony_ci throw typeErrorForEncoding(encoding, 'encoding'); 16764d6c458bSopenharmony_ci } 16774d6c458bSopenharmony_ci start = isNaN(start) ? 0 : (Number(start) < 0 ? 0 : Number(start)); 16784d6c458bSopenharmony_ci end = isNaN(end) ? 0 : Number(end); 16794d6c458bSopenharmony_ci let bufLength = this.length; 16804d6c458bSopenharmony_ci if (start >= bufLength || start > end) { 16814d6c458bSopenharmony_ci return ''; 16824d6c458bSopenharmony_ci } 16834d6c458bSopenharmony_ci end = end > bufLength ? bufLength : end; 16844d6c458bSopenharmony_ci return encodObj.toString(this, start, end); 16854d6c458bSopenharmony_ci } 16864d6c458bSopenharmony_ci 16874d6c458bSopenharmony_ci toJSON(): Object { 16884d6c458bSopenharmony_ci if (this.length <= 0) { 16894d6c458bSopenharmony_ci return { type: 'Buffer', data: [] }; 16904d6c458bSopenharmony_ci } 16914d6c458bSopenharmony_ci let data = this[bufferSymbol].getBufferData(); 16924d6c458bSopenharmony_ci return { type: 'Buffer', data }; 16934d6c458bSopenharmony_ci } 16944d6c458bSopenharmony_ci 16954d6c458bSopenharmony_ci indexOf(value: string | number | Buffer | Uint8Array, byteOffset: number = 0, encoding: string = 'utf8'): number { 16964d6c458bSopenharmony_ci typeErrorCheck(value, ['string', 'number', 'Buffer', 'Uint8Array'], 'value'); 16974d6c458bSopenharmony_ci if (typeof value === 'string') { 16984d6c458bSopenharmony_ci const length = this[lengthSymbol]; 16994d6c458bSopenharmony_ci if (typeof byteOffset === 'string') { 17004d6c458bSopenharmony_ci encoding = byteOffset; 17014d6c458bSopenharmony_ci } 17024d6c458bSopenharmony_ci if (typeof byteOffset !== 'number') { 17034d6c458bSopenharmony_ci byteOffset = 0; 17044d6c458bSopenharmony_ci } 17054d6c458bSopenharmony_ci if (encoding === null) { 17064d6c458bSopenharmony_ci encoding = 'utf8'; 17074d6c458bSopenharmony_ci } 17084d6c458bSopenharmony_ci encoding = encodingTypeErrorCheck(encoding); 17094d6c458bSopenharmony_ci if (byteOffset > length) { 17104d6c458bSopenharmony_ci return -1; 17114d6c458bSopenharmony_ci } 17124d6c458bSopenharmony_ci if (byteOffset < 0) { 17134d6c458bSopenharmony_ci let offsetResult = Math.abs(byteOffset); 17144d6c458bSopenharmony_ci if (offsetResult > length) { 17154d6c458bSopenharmony_ci byteOffset = 0; 17164d6c458bSopenharmony_ci } else { 17174d6c458bSopenharmony_ci byteOffset = length - offsetResult; 17184d6c458bSopenharmony_ci } 17194d6c458bSopenharmony_ci } 17204d6c458bSopenharmony_ci return this[bufferSymbol].indexOf(value, byteOffset, encoding, false); 17214d6c458bSopenharmony_ci } else if (typeof value === 'number') { 17224d6c458bSopenharmony_ci value = +value; 17234d6c458bSopenharmony_ci if (value < 0 || value > utils.eightBits) { 17244d6c458bSopenharmony_ci return -1; 17254d6c458bSopenharmony_ci } 17264d6c458bSopenharmony_ci let data = this[bufferSymbol].getBufferData(); 17274d6c458bSopenharmony_ci return data.indexOf(value, byteOffset); 17284d6c458bSopenharmony_ci } else { 17294d6c458bSopenharmony_ci let sourceData = this[bufferSymbol].getBufferData(); 17304d6c458bSopenharmony_ci if (value instanceof Buffer) { 17314d6c458bSopenharmony_ci let targetData = value[bufferSymbol].getBufferData(); 17324d6c458bSopenharmony_ci return sourceData.join(',').indexOf(targetData.join(','), byteOffset); 17334d6c458bSopenharmony_ci } 17344d6c458bSopenharmony_ci return sourceData.join(',').indexOf(value.join(','), byteOffset); 17354d6c458bSopenharmony_ci } 17364d6c458bSopenharmony_ci } 17374d6c458bSopenharmony_ci 17384d6c458bSopenharmony_ci lastIndexOf(value: string | number | Buffer | Uint8Array, byteOffset: number = this.length, 17394d6c458bSopenharmony_ci encoding: string = 'utf8'): number { 17404d6c458bSopenharmony_ci typeErrorCheck(value, ['string', 'number', 'Buffer', 'Uint8Array'], 'value'); 17414d6c458bSopenharmony_ci if (typeof value === 'string') { 17424d6c458bSopenharmony_ci if (typeof byteOffset === null) { 17434d6c458bSopenharmony_ci byteOffset = 0; 17444d6c458bSopenharmony_ci } 17454d6c458bSopenharmony_ci if (encoding === null) { 17464d6c458bSopenharmony_ci encoding = 'utf8'; 17474d6c458bSopenharmony_ci } 17484d6c458bSopenharmony_ci encoding = encodingTypeErrorCheck(encoding); 17494d6c458bSopenharmony_ci let str = this.toString(encoding); 17504d6c458bSopenharmony_ci byteOffset = byteOffset < 0 ? str.length + byteOffset : byteOffset; 17514d6c458bSopenharmony_ci return str.lastIndexOf(value, byteOffset); 17524d6c458bSopenharmony_ci } else if (typeof value === 'number') { 17534d6c458bSopenharmony_ci value = +value; 17544d6c458bSopenharmony_ci if (value < 0 || value > utils.eightBits) { 17554d6c458bSopenharmony_ci return -1; 17564d6c458bSopenharmony_ci } 17574d6c458bSopenharmony_ci let data = this[bufferSymbol].getBufferData(); 17584d6c458bSopenharmony_ci return data.lastIndexOf(value, byteOffset); 17594d6c458bSopenharmony_ci } else { 17604d6c458bSopenharmony_ci let sourceData = this[bufferSymbol].getBufferData(); 17614d6c458bSopenharmony_ci if (value instanceof Buffer) { 17624d6c458bSopenharmony_ci let targetData = value[bufferSymbol].getBufferData(); 17634d6c458bSopenharmony_ci return sourceData.join(',').lastIndexOf(targetData.join(','), byteOffset); 17644d6c458bSopenharmony_ci } 17654d6c458bSopenharmony_ci return sourceData.join(',').lastIndexOf(value.join(','), byteOffset); 17664d6c458bSopenharmony_ci } 17674d6c458bSopenharmony_ci } 17684d6c458bSopenharmony_ci 17694d6c458bSopenharmony_ci includes(value: string | number | Buffer | Uint8Array, byteOffset: number = 0, encoding: string = 'utf8'): boolean { 17704d6c458bSopenharmony_ci typeErrorCheck(value, ['string', 'number', 'Buffer', 'Uint8Array'], 'value'); 17714d6c458bSopenharmony_ci if (encoding === null) { 17724d6c458bSopenharmony_ci encoding = 'utf8'; 17734d6c458bSopenharmony_ci } 17744d6c458bSopenharmony_ci encoding = encodingTypeErrorCheck(encoding); 17754d6c458bSopenharmony_ci if (typeof value === 'string') { 17764d6c458bSopenharmony_ci const length = this[lengthSymbol]; 17774d6c458bSopenharmony_ci if (byteOffset > length) { 17784d6c458bSopenharmony_ci return false; 17794d6c458bSopenharmony_ci } 17804d6c458bSopenharmony_ci if (byteOffset < 0) { 17814d6c458bSopenharmony_ci let byteOffsetAbs: number = Math.abs(byteOffset); 17824d6c458bSopenharmony_ci if (byteOffsetAbs <= length) { 17834d6c458bSopenharmony_ci byteOffset = length - byteOffsetAbs; 17844d6c458bSopenharmony_ci } else { 17854d6c458bSopenharmony_ci byteOffset = 0; 17864d6c458bSopenharmony_ci } 17874d6c458bSopenharmony_ci } 17884d6c458bSopenharmony_ci } 17894d6c458bSopenharmony_ci return this.indexOf(value, byteOffset, encoding) !== -1; 17904d6c458bSopenharmony_ci } 17914d6c458bSopenharmony_ci 17924d6c458bSopenharmony_ci reverseBits(dealNum: number): Buffer { 17934d6c458bSopenharmony_ci const len: number = this.length; 17944d6c458bSopenharmony_ci const dealLen: number = dealNum; 17954d6c458bSopenharmony_ci for (let i = 0; i < len / dealLen; i++) { 17964d6c458bSopenharmony_ci let times: number = 0; 17974d6c458bSopenharmony_ci let startIndex: number = dealLen * i; 17984d6c458bSopenharmony_ci let endIndex: number = startIndex + dealLen - 1; 17994d6c458bSopenharmony_ci while (times < dealLen / twoBytes) { 18004d6c458bSopenharmony_ci let tmp = this[startIndex + times]; 18014d6c458bSopenharmony_ci this[startIndex + times] = this[endIndex - times]; 18024d6c458bSopenharmony_ci this[endIndex - times] = tmp; 18034d6c458bSopenharmony_ci times++; 18044d6c458bSopenharmony_ci } 18054d6c458bSopenharmony_ci } 18064d6c458bSopenharmony_ci return this; 18074d6c458bSopenharmony_ci } 18084d6c458bSopenharmony_ci 18094d6c458bSopenharmony_ci swap16(): Buffer { 18104d6c458bSopenharmony_ci const len = this.length; 18114d6c458bSopenharmony_ci const dealLen: number = twoBytes; 18124d6c458bSopenharmony_ci if (len % dealLen !== 0) { 18134d6c458bSopenharmony_ci throw bufferSizeError('16-bits'); 18144d6c458bSopenharmony_ci } 18154d6c458bSopenharmony_ci return this.reverseBits(dealLen); 18164d6c458bSopenharmony_ci } 18174d6c458bSopenharmony_ci 18184d6c458bSopenharmony_ci swap32(): Buffer { 18194d6c458bSopenharmony_ci const len = this.length; 18204d6c458bSopenharmony_ci const dealLen: number = 4; // Process every 4 bits 18214d6c458bSopenharmony_ci if (len % dealLen !== 0) { 18224d6c458bSopenharmony_ci throw bufferSizeError('32-bits'); 18234d6c458bSopenharmony_ci } 18244d6c458bSopenharmony_ci return this.reverseBits(dealLen); 18254d6c458bSopenharmony_ci } 18264d6c458bSopenharmony_ci 18274d6c458bSopenharmony_ci swap64(): Buffer { 18284d6c458bSopenharmony_ci const len = this.length; 18294d6c458bSopenharmony_ci const dealLen: number = eightBytes; 18304d6c458bSopenharmony_ci if (len % dealLen !== 0) { 18314d6c458bSopenharmony_ci throw bufferSizeError('64-bits'); 18324d6c458bSopenharmony_ci } 18334d6c458bSopenharmony_ci return this.reverseBits(dealLen); 18344d6c458bSopenharmony_ci } 18354d6c458bSopenharmony_ci 18364d6c458bSopenharmony_ci keys(): IterableIterator<number> { 18374d6c458bSopenharmony_ci return this[bufferSymbol].getBufferData().keys(); 18384d6c458bSopenharmony_ci } 18394d6c458bSopenharmony_ci 18404d6c458bSopenharmony_ci values(): IterableIterator<number> { 18414d6c458bSopenharmony_ci return this[bufferSymbol].getBufferData().values(); 18424d6c458bSopenharmony_ci } 18434d6c458bSopenharmony_ci 18444d6c458bSopenharmony_ci entries(): IterableIterator<[number, number]> { 18454d6c458bSopenharmony_ci return this[bufferSymbol].getBufferData().entries(); 18464d6c458bSopenharmony_ci } 18474d6c458bSopenharmony_ci 18484d6c458bSopenharmony_ci [Symbol.iterator](): IterableIterator<[number, number]> { 18494d6c458bSopenharmony_ci return this[bufferSymbol].getBufferData().entries(); 18504d6c458bSopenharmony_ci } 18514d6c458bSopenharmony_ci} 18524d6c458bSopenharmony_ci 18534d6c458bSopenharmony_cifunction typeError(param: unknown, paramName: string, excludedTypes: string[]): BusinessError { 18544d6c458bSopenharmony_ci let msg = new ErrorMessage(errorMap.typeError, paramName).setTypeInfo(excludedTypes, param).getString(); 18554d6c458bSopenharmony_ci return new BusinessError(msg, errorMap.typeError); 18564d6c458bSopenharmony_ci} 18574d6c458bSopenharmony_ci 18584d6c458bSopenharmony_cifunction typeErrorForEncoding(param: unknown, paramName: string): BusinessError { 18594d6c458bSopenharmony_ci let msg = new ErrorMessage(errorMap.typeError, paramName).setEncodingTypeInfo(['BufferEncoding'], param).getString(); 18604d6c458bSopenharmony_ci return new BusinessError(msg, errorMap.typeError); 18614d6c458bSopenharmony_ci} 18624d6c458bSopenharmony_ci 18634d6c458bSopenharmony_cifunction typeErrorForProperty(typeName: string): BusinessError { 18644d6c458bSopenharmony_ci let msg = new ErrorMessage(errorMap.typeErrorForProperty).setProperty(typeName).getString(); 18654d6c458bSopenharmony_ci return new BusinessError(msg, errorMap.typeErrorForProperty); 18664d6c458bSopenharmony_ci} 18674d6c458bSopenharmony_ci 18684d6c458bSopenharmony_cifunction typeErrorForSize(param: unknown, paramName: string, excludedTypes: string[]): BusinessError { 18694d6c458bSopenharmony_ci let msg = new ErrorMessage(errorMap.typeError, paramName).setSizeTypeInfo(excludedTypes, param).getString(); 18704d6c458bSopenharmony_ci return new BusinessError(msg, errorMap.typeError); 18714d6c458bSopenharmony_ci} 18724d6c458bSopenharmony_ci 18734d6c458bSopenharmony_cifunction rangeError(paramName: string, rangeLeft: string | bigint | number, rangeRight: string | bigint | number, 18744d6c458bSopenharmony_ci receivedValue: number | bigint): BusinessError { 18754d6c458bSopenharmony_ci let msg = 18764d6c458bSopenharmony_ci new ErrorMessage(errorMap.rangeError, paramName).setRangeInfo(rangeLeft, rangeRight, receivedValue).getString(); 18774d6c458bSopenharmony_ci return new BusinessError(msg, errorMap.rangeError); 18784d6c458bSopenharmony_ci} 18794d6c458bSopenharmony_ci 18804d6c458bSopenharmony_cifunction rangeLeftError(paramName: string, rangeLeft: number, receivedValue: number): BusinessError { 18814d6c458bSopenharmony_ci let msg = new ErrorMessage(errorMap.rangeError, paramName).setRangeLeftInfo(rangeLeft, receivedValue).getString(); 18824d6c458bSopenharmony_ci return new BusinessError(msg, errorMap.rangeError); 18834d6c458bSopenharmony_ci} 18844d6c458bSopenharmony_ci 18854d6c458bSopenharmony_cifunction bufferSizeError(size: string): BusinessError { 18864d6c458bSopenharmony_ci let msg = new ErrorMessage(errorMap.bufferSizeError).setSizeInfo(size).getString(); 18874d6c458bSopenharmony_ci return new BusinessError(msg, errorMap.bufferSizeError); 18884d6c458bSopenharmony_ci} 18894d6c458bSopenharmony_ci 18904d6c458bSopenharmony_cifunction typeErrorCheck(param: unknown, types: string[], paramName: string): void { 18914d6c458bSopenharmony_ci let typeName = getTypeName(param); 18924d6c458bSopenharmony_ci if (!types.includes(typeName)) { 18934d6c458bSopenharmony_ci throw typeError(param, paramName, types); 18944d6c458bSopenharmony_ci } 18954d6c458bSopenharmony_ci} 18964d6c458bSopenharmony_ci 18974d6c458bSopenharmony_cifunction sizeErrorCheck(param: unknown, paramName: string, types: string[], 18984d6c458bSopenharmony_ci rangeLeft: number, rangeRight: number): void { 18994d6c458bSopenharmony_ci let typeName = getTypeName(param); 19004d6c458bSopenharmony_ci if (!types.includes(typeName)) { 19014d6c458bSopenharmony_ci throw typeErrorForSize(param, paramName, types); 19024d6c458bSopenharmony_ci } 19034d6c458bSopenharmony_ci if (Number(param) < rangeLeft || Number(param) > rangeRight) { 19044d6c458bSopenharmony_ci let typeString = types.join(', '); 19054d6c458bSopenharmony_ci typeString = typeString.replace(',', ' or'); 19064d6c458bSopenharmony_ci let msg = 'Parameter error. The type of "' + paramName + '" must be ' + typeString + 19074d6c458bSopenharmony_ci ' and the value cannot be negative. Received value is: ' + Number(param).toString(); 19084d6c458bSopenharmony_ci throw new BusinessError(msg, errorMap.typeError); 19094d6c458bSopenharmony_ci } 19104d6c458bSopenharmony_ci} 19114d6c458bSopenharmony_ci 19124d6c458bSopenharmony_cifunction encodingTypeErrorCheck(encoding: string): string { 19134d6c458bSopenharmony_ci const normalizedEncoding = normalizeEncoding(encoding); 19144d6c458bSopenharmony_ci if (normalizedEncoding === undefined) { 19154d6c458bSopenharmony_ci throw typeErrorForEncoding(encoding, 'encoding'); 19164d6c458bSopenharmony_ci } 19174d6c458bSopenharmony_ci return normalizedEncoding; 19184d6c458bSopenharmony_ci} 19194d6c458bSopenharmony_ci 19204d6c458bSopenharmony_cifunction rangeErrorCheck(param: number | bigint, paramName: string, rangeLeft: bigint | number, 19214d6c458bSopenharmony_ci rangeRight: bigint | number, rangeLeftExpr: string = '', rangeRightExpr: string = ''): void { 19224d6c458bSopenharmony_ci let left : bigint | number; 19234d6c458bSopenharmony_ci let right : bigint | number; 19244d6c458bSopenharmony_ci if (Number.isInteger(rangeLeft) && Number.isInteger(rangeRight)) { 19254d6c458bSopenharmony_ci left= BigInt(rangeLeft); 19264d6c458bSopenharmony_ci right = BigInt(rangeRight); 19274d6c458bSopenharmony_ci } else { 19284d6c458bSopenharmony_ci left = rangeLeft; 19294d6c458bSopenharmony_ci right = rangeRight; 19304d6c458bSopenharmony_ci } 19314d6c458bSopenharmony_ci if (param < left || param > right) { 19324d6c458bSopenharmony_ci throw rangeError(paramName, rangeLeftExpr === '' ? rangeLeft : rangeLeftExpr, 19334d6c458bSopenharmony_ci rangeRightExpr === '' ? rangeRight : rangeRightExpr, param); 19344d6c458bSopenharmony_ci } 19354d6c458bSopenharmony_ci} 19364d6c458bSopenharmony_ci 19374d6c458bSopenharmony_cifunction rangeLeftErrorCheck(param: number, paramName: string, rangeLeft: number): void { 19384d6c458bSopenharmony_ci if (param < rangeLeft) { 19394d6c458bSopenharmony_ci throw rangeLeftError(paramName, rangeLeft, param); 19404d6c458bSopenharmony_ci } 19414d6c458bSopenharmony_ci} 19424d6c458bSopenharmony_ci 19434d6c458bSopenharmony_cifunction concat(list: Buffer[] | Uint8Array[], totalLength?: number): Buffer { 19444d6c458bSopenharmony_ci typeErrorCheck(list, ['Array'], 'list'); 19454d6c458bSopenharmony_ci if (!(typeof totalLength === 'number' || typeof totalLength === 'undefined' || 'null')) { 19464d6c458bSopenharmony_ci throw typeError(totalLength, 'totalLength', ['number']); 19474d6c458bSopenharmony_ci } 19484d6c458bSopenharmony_ci if (list.length === 0) { 19494d6c458bSopenharmony_ci return new Buffer(0); 19504d6c458bSopenharmony_ci } 19514d6c458bSopenharmony_ci if (!totalLength) { 19524d6c458bSopenharmony_ci totalLength = 0; 19534d6c458bSopenharmony_ci for (let i = 0, len = list.length; i < len; i++) { 19544d6c458bSopenharmony_ci let buf = list[i]; 19554d6c458bSopenharmony_ci if (buf instanceof Uint8Array || buf instanceof Buffer) { 19564d6c458bSopenharmony_ci totalLength += list[i].length; 19574d6c458bSopenharmony_ci } 19584d6c458bSopenharmony_ci } 19594d6c458bSopenharmony_ci } 19604d6c458bSopenharmony_ci 19614d6c458bSopenharmony_ci rangeErrorCheck(totalLength, 'totalLength', 0, UINT32MAX); 19624d6c458bSopenharmony_ci 19634d6c458bSopenharmony_ci let buffer = allocUninitializedFromPool(totalLength); 19644d6c458bSopenharmony_ci let offset = 0; 19654d6c458bSopenharmony_ci for (let i = 0, len = list.length; i < len; i++) { 19664d6c458bSopenharmony_ci const buf = list[i]; 19674d6c458bSopenharmony_ci if (buf instanceof Uint8Array) { 19684d6c458bSopenharmony_ci buf.forEach((val) => buffer[offset++] = val); 19694d6c458bSopenharmony_ci } else if (buf instanceof Buffer) { 19704d6c458bSopenharmony_ci buf.copy(buffer, offset); 19714d6c458bSopenharmony_ci offset += buf.length; 19724d6c458bSopenharmony_ci } 19734d6c458bSopenharmony_ci } 19744d6c458bSopenharmony_ci return buffer; 19754d6c458bSopenharmony_ci} 19764d6c458bSopenharmony_ci 19774d6c458bSopenharmony_cifunction alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer { 19784d6c458bSopenharmony_ci sizeErrorCheck(size, 'size', ['number'], 0, MAX_LENGTH); 19794d6c458bSopenharmony_ci const buf = new Buffer(size); 19804d6c458bSopenharmony_ci buf.fill(0); 19814d6c458bSopenharmony_ci if (arguments.length === twoBytes && fill !== undefined && fill !== 0) { 19824d6c458bSopenharmony_ci buf.fill(fill); 19834d6c458bSopenharmony_ci } else if (arguments.length === 3) { // 3 is array->maxIndex 19844d6c458bSopenharmony_ci if (encoding === undefined || encoding === null) { 19854d6c458bSopenharmony_ci encoding = 'utf-8'; 19864d6c458bSopenharmony_ci } 19874d6c458bSopenharmony_ci typeErrorCheck(encoding, ['string'], 'encoding'); 19884d6c458bSopenharmony_ci if (fill !== undefined && fill !== 0) { 19894d6c458bSopenharmony_ci buf.fill(fill, undefined, undefined, encoding); 19904d6c458bSopenharmony_ci } 19914d6c458bSopenharmony_ci } 19924d6c458bSopenharmony_ci return buf; 19934d6c458bSopenharmony_ci} 19944d6c458bSopenharmony_ci 19954d6c458bSopenharmony_cifunction allocUninitializedFromPool(size: number): Buffer { 19964d6c458bSopenharmony_ci sizeErrorCheck(size, 'size', ['number'], 0, MAX_LENGTH); 19974d6c458bSopenharmony_ci if (!pool) { 19984d6c458bSopenharmony_ci createPool(); 19994d6c458bSopenharmony_ci } 20004d6c458bSopenharmony_ci if (size < (poolSize >>> 1)) { 20014d6c458bSopenharmony_ci if (size > (poolSize - poolOffset)) { 20024d6c458bSopenharmony_ci createPool(); 20034d6c458bSopenharmony_ci } 20044d6c458bSopenharmony_ci const b = new Buffer(pool, poolOffset, size); 20054d6c458bSopenharmony_ci poolOffset += size; 20064d6c458bSopenharmony_ci alignPool(); 20074d6c458bSopenharmony_ci return b; 20084d6c458bSopenharmony_ci } 20094d6c458bSopenharmony_ci return new Buffer(size); 20104d6c458bSopenharmony_ci} 20114d6c458bSopenharmony_ci 20124d6c458bSopenharmony_cifunction allocUninitialized(size: number): Buffer { 20134d6c458bSopenharmony_ci sizeErrorCheck(size, 'size', ['number'], 0, MAX_LENGTH); 20144d6c458bSopenharmony_ci const buf = new Buffer(size); 20154d6c458bSopenharmony_ci return buf; 20164d6c458bSopenharmony_ci} 20174d6c458bSopenharmony_ci 20184d6c458bSopenharmony_cifunction normalizeEncoding(enc: string): string | undefined { 20194d6c458bSopenharmony_ci enc = enc.toLowerCase(); 20204d6c458bSopenharmony_ci if (bufferEncoding.includes(enc)) { 20214d6c458bSopenharmony_ci if (enc === 'ucs2' || enc === 'ucs-2' || enc === 'utf-16le') { 20224d6c458bSopenharmony_ci enc = 'utf16le'; 20234d6c458bSopenharmony_ci } 20244d6c458bSopenharmony_ci if (enc === 'utf-8') { 20254d6c458bSopenharmony_ci enc = 'utf8'; 20264d6c458bSopenharmony_ci } 20274d6c458bSopenharmony_ci return enc; 20284d6c458bSopenharmony_ci } else { 20294d6c458bSopenharmony_ci return undefined; 20304d6c458bSopenharmony_ci } 20314d6c458bSopenharmony_ci} 20324d6c458bSopenharmony_ci 20334d6c458bSopenharmony_cifunction from(value: Buffer | Uint8Array | ArrayBuffer | SharedArrayBuffer | string | object | Array<number>, 20344d6c458bSopenharmony_ci offsetOrEncoding?: number | string, length?: number): Buffer { 20354d6c458bSopenharmony_ci if (value === null || value === undefined) { 20364d6c458bSopenharmony_ci throw typeError(value, 'value', ['Buffer', 'ArrayBuffer', 'Array', 'Array-like', 'string', 'object']); 20374d6c458bSopenharmony_ci } 20384d6c458bSopenharmony_ci if (value instanceof ArrayBuffer || value instanceof SharedArrayBuffer) { 20394d6c458bSopenharmony_ci return createBufferFromArrayBuffer(value, offsetOrEncoding, length); 20404d6c458bSopenharmony_ci } 20414d6c458bSopenharmony_ci if (value instanceof Buffer || value instanceof Uint8Array) { 20424d6c458bSopenharmony_ci return new Buffer(value); 20434d6c458bSopenharmony_ci } 20444d6c458bSopenharmony_ci if (value instanceof Array) { 20454d6c458bSopenharmony_ci return createBufferFromArray(value); 20464d6c458bSopenharmony_ci } 20474d6c458bSopenharmony_ci let encoding = checkEncodeing(value, offsetOrEncoding); 20484d6c458bSopenharmony_ci if (typeof value === 'string') { 20494d6c458bSopenharmony_ci return fromString(value, encoding); 20504d6c458bSopenharmony_ci } 20514d6c458bSopenharmony_ci if (typeof value === 'object' && value !== null) { 20524d6c458bSopenharmony_ci const valueOf = value.valueOf && value.valueOf(); 20534d6c458bSopenharmony_ci if (valueOf != null && valueOf !== value && 20544d6c458bSopenharmony_ci (typeof valueOf === 'string' || typeof valueOf === 'object')) { 20554d6c458bSopenharmony_ci return from(valueOf, offsetOrEncoding, length); 20564d6c458bSopenharmony_ci } 20574d6c458bSopenharmony_ci if (typeof value[Symbol.toPrimitive] === 'function') { 20584d6c458bSopenharmony_ci const primitive = value[Symbol.toPrimitive]('string'); 20594d6c458bSopenharmony_ci if (typeof primitive === 'string') { 20604d6c458bSopenharmony_ci return fromString(primitive, encoding); 20614d6c458bSopenharmony_ci } 20624d6c458bSopenharmony_ci } 20634d6c458bSopenharmony_ci } 20644d6c458bSopenharmony_ci throw typeError(value, 'value', ['Buffer', 'ArrayBuffer', 'Array', 'Array-like']); 20654d6c458bSopenharmony_ci} 20664d6c458bSopenharmony_ci 20674d6c458bSopenharmony_cifunction checkEncodeing(value: string | object, offsetOrEncoding: string | number | undefined): string { 20684d6c458bSopenharmony_ci if (typeof value === 'string' || typeof value[Symbol.toPrimitive] === 'function') { 20694d6c458bSopenharmony_ci offsetOrEncoding = offsetOrEncoding ? offsetOrEncoding : 'utf8'; 20704d6c458bSopenharmony_ci if (typeof offsetOrEncoding === 'number') { 20714d6c458bSopenharmony_ci offsetOrEncoding = 'utf8'; 20724d6c458bSopenharmony_ci } 20734d6c458bSopenharmony_ci return encodingTypeErrorCheck(offsetOrEncoding); 20744d6c458bSopenharmony_ci } 20754d6c458bSopenharmony_ci return ''; 20764d6c458bSopenharmony_ci} 20774d6c458bSopenharmony_ci 20784d6c458bSopenharmony_cifunction createBufferFromArrayBuffer(value: ArrayBuffer | SharedArrayBuffer, 20794d6c458bSopenharmony_ci offsetOrEncoding?: number | string, length?: number): Buffer { 20804d6c458bSopenharmony_ci offsetOrEncoding = isNaN(Number(offsetOrEncoding)) ? 0 : Number(offsetOrEncoding); 20814d6c458bSopenharmony_ci const maxLength: number = value.byteLength - offsetOrEncoding; 20824d6c458bSopenharmony_ci if (length === undefined) { 20834d6c458bSopenharmony_ci length = maxLength; 20844d6c458bSopenharmony_ci } else { 20854d6c458bSopenharmony_ci length = isNaN(Number(length)) ? 0 : Number(length); 20864d6c458bSopenharmony_ci } 20874d6c458bSopenharmony_ci rangeErrorCheck(offsetOrEncoding, 'byteOffset', 0, value.byteLength); 20884d6c458bSopenharmony_ci rangeErrorCheck(length, 'length', 0, maxLength); 20894d6c458bSopenharmony_ci return new Buffer(value, offsetOrEncoding, length); 20904d6c458bSopenharmony_ci} 20914d6c458bSopenharmony_ci 20924d6c458bSopenharmony_cifunction createBufferFromArray(value: Array<number>): Buffer { 20934d6c458bSopenharmony_ci if (value.length <= 0) { 20944d6c458bSopenharmony_ci return new Buffer(0); 20954d6c458bSopenharmony_ci } 20964d6c458bSopenharmony_ci const buffer = allocUninitializedFromPool(value.length); 20974d6c458bSopenharmony_ci buffer[bufferSymbol].setArray(value); 20984d6c458bSopenharmony_ci return buffer; 20994d6c458bSopenharmony_ci} 21004d6c458bSopenharmony_ci 21014d6c458bSopenharmony_cifunction hexStrtoNumbers(hex: string): Array<number> { 21024d6c458bSopenharmony_ci let arr = hex.split(''); 21034d6c458bSopenharmony_ci let nums: Array<number> = []; 21044d6c458bSopenharmony_ci for (let i = 0, len = arr.length; i < len / twoBytes; i++) { 21054d6c458bSopenharmony_ci let tmp = '0x' + arr[i * twoBytes] + arr[i * twoBytes + 1]; 21064d6c458bSopenharmony_ci let hexNum = Number(tmp); 21074d6c458bSopenharmony_ci if (isNaN(hexNum)) { 21084d6c458bSopenharmony_ci if (i === 0) { 21094d6c458bSopenharmony_ci throw new Error(`The argument 'value' is invalid. Received "${hex}"`); 21104d6c458bSopenharmony_ci } 21114d6c458bSopenharmony_ci break; 21124d6c458bSopenharmony_ci } 21134d6c458bSopenharmony_ci nums[i] = Number(tmp); 21144d6c458bSopenharmony_ci } 21154d6c458bSopenharmony_ci return nums; 21164d6c458bSopenharmony_ci} 21174d6c458bSopenharmony_ci 21184d6c458bSopenharmony_cifunction fromString(value: string, encoding: string): Buffer { 21194d6c458bSopenharmony_ci if (encoding === 'base64') { 21204d6c458bSopenharmony_ci value = value.replace(/[\r\n]/g, ''); 21214d6c458bSopenharmony_ci } 21224d6c458bSopenharmony_ci let enc = normalizeEncoding(encoding); 21234d6c458bSopenharmony_ci if (!enc) { 21244d6c458bSopenharmony_ci throw typeErrorForEncoding(encoding, 'encoding'); 21254d6c458bSopenharmony_ci } 21264d6c458bSopenharmony_ci let size = byteLength(value, enc); 21274d6c458bSopenharmony_ci let buffer = allocUninitializedFromPool(size); 21284d6c458bSopenharmony_ci buffer[bufferSymbol].fromString(value, enc, size); 21294d6c458bSopenharmony_ci buffer[lengthSymbol] = buffer[bufferSymbol].getLength(); 21304d6c458bSopenharmony_ci return buffer; 21314d6c458bSopenharmony_ci} 21324d6c458bSopenharmony_ci 21334d6c458bSopenharmony_cifunction isTypedArray(self: unknown): boolean { 21344d6c458bSopenharmony_ci let typeArr = [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, 21354d6c458bSopenharmony_ci Int32Array, Uint32Array, Float32Array, Float64Array]; 21364d6c458bSopenharmony_ci for (let i = 0, len = typeArr.length; i < len; i++) { 21374d6c458bSopenharmony_ci if (self instanceof typeArr[i]) { 21384d6c458bSopenharmony_ci return true; 21394d6c458bSopenharmony_ci } 21404d6c458bSopenharmony_ci } 21414d6c458bSopenharmony_ci return false; 21424d6c458bSopenharmony_ci} 21434d6c458bSopenharmony_ci 21444d6c458bSopenharmony_cifunction isBuffer(obj: Object): boolean { 21454d6c458bSopenharmony_ci return obj instanceof Buffer; 21464d6c458bSopenharmony_ci} 21474d6c458bSopenharmony_ci 21484d6c458bSopenharmony_cifunction isEncoding(encoding: string): boolean { 21494d6c458bSopenharmony_ci if (typeof encoding !== 'string' || encoding.length === 0) { 21504d6c458bSopenharmony_ci return false; 21514d6c458bSopenharmony_ci } 21524d6c458bSopenharmony_ci return getEncodingByType(encoding) ? true : false; 21534d6c458bSopenharmony_ci} 21544d6c458bSopenharmony_ci 21554d6c458bSopenharmony_cifunction byteLength(string: string | BackingType, encoding: string = 'utf8'): number { 21564d6c458bSopenharmony_ci if (typeof string === 'string' || isTypedArray(string) || string instanceof DataView || 21574d6c458bSopenharmony_ci string instanceof ArrayBuffer || string instanceof SharedArrayBuffer || string instanceof Buffer) { 21584d6c458bSopenharmony_ci if (string instanceof Buffer) { 21594d6c458bSopenharmony_ci return string.length; 21604d6c458bSopenharmony_ci } else if (typeof string === 'string') { 21614d6c458bSopenharmony_ci if (string.length === 0) { 21624d6c458bSopenharmony_ci return 0; 21634d6c458bSopenharmony_ci } 21644d6c458bSopenharmony_ci if (encoding === null) { 21654d6c458bSopenharmony_ci encoding = 'utf8'; 21664d6c458bSopenharmony_ci } 21674d6c458bSopenharmony_ci let encodRes = getEncodingByType(encoding); 21684d6c458bSopenharmony_ci if (!encodRes) { 21694d6c458bSopenharmony_ci return getUtf8ByteLength(string); 21704d6c458bSopenharmony_ci } 21714d6c458bSopenharmony_ci return encodRes.byteLength(string); 21724d6c458bSopenharmony_ci } else { 21734d6c458bSopenharmony_ci return string.byteLength; 21744d6c458bSopenharmony_ci } 21754d6c458bSopenharmony_ci } else { 21764d6c458bSopenharmony_ci throw typeError(string, 'string', ['string', 'Buffer', 'ArrayBuffer']); 21774d6c458bSopenharmony_ci } 21784d6c458bSopenharmony_ci} 21794d6c458bSopenharmony_ci 21804d6c458bSopenharmony_cifunction transcode(source: Buffer | Uint8Array, fromEnc: string, toEnc: string): Buffer { 21814d6c458bSopenharmony_ci typeErrorCheck(source, ['Buffer', 'Uint8Array'], 'source'); 21824d6c458bSopenharmony_ci typeErrorCheck(fromEnc, ['string'], 'fromEnc'); 21834d6c458bSopenharmony_ci typeErrorCheck(toEnc, ['string'], 'toEnc'); 21844d6c458bSopenharmony_ci let from = source.toString(fromEnc); 21854d6c458bSopenharmony_ci return fromString(from, toEnc); 21864d6c458bSopenharmony_ci} 21874d6c458bSopenharmony_ci 21884d6c458bSopenharmony_cifunction toUtf8(self: Buffer, start: number, end: number): string { 21894d6c458bSopenharmony_ci return self[bufferSymbol].toUtf8(start, end); 21904d6c458bSopenharmony_ci} 21914d6c458bSopenharmony_ci 21924d6c458bSopenharmony_cifunction toAscii(self: Buffer, start: number, end: number): string { 21934d6c458bSopenharmony_ci let bufData = self[bufferSymbol].getBufferData(); 21944d6c458bSopenharmony_ci let val = ''; 21954d6c458bSopenharmony_ci for (let i = start; i < end; i++) { 21964d6c458bSopenharmony_ci val += String.fromCharCode(+bufData[i] & 0x7F); // 0x7F : get the lower 15-bits 21974d6c458bSopenharmony_ci } 21984d6c458bSopenharmony_ci return val; 21994d6c458bSopenharmony_ci} 22004d6c458bSopenharmony_ci 22014d6c458bSopenharmony_cifunction toBinary(self: Buffer, start: number, end: number): string { 22024d6c458bSopenharmony_ci let bufData = self[bufferSymbol].getBufferData(); 22034d6c458bSopenharmony_ci let val = ''; 22044d6c458bSopenharmony_ci for (let i = start; i < end; i++) { 22054d6c458bSopenharmony_ci val += String.fromCharCode(+bufData[i]); 22064d6c458bSopenharmony_ci } 22074d6c458bSopenharmony_ci return val; 22084d6c458bSopenharmony_ci} 22094d6c458bSopenharmony_ci 22104d6c458bSopenharmony_cifunction toHex(self: Buffer, start: number, end: number): string { 22114d6c458bSopenharmony_ci let bufData = self[bufferSymbol].getBufferData(); 22124d6c458bSopenharmony_ci let str = ''; 22134d6c458bSopenharmony_ci for (let i = start, len = end; i < len; i++) { 22144d6c458bSopenharmony_ci let tmpstr = Number(bufData[i]).toString(16); // 16 : 16 decimal 22154d6c458bSopenharmony_ci tmpstr = (tmpstr.length === 1) ? `0${tmpstr}` : tmpstr; 22164d6c458bSopenharmony_ci str += tmpstr; 22174d6c458bSopenharmony_ci } 22184d6c458bSopenharmony_ci return str; 22194d6c458bSopenharmony_ci} 22204d6c458bSopenharmony_ci 22214d6c458bSopenharmony_cifunction toUtf16LE(self: Buffer, start: number, end: number): string { 22224d6c458bSopenharmony_ci let bufData: Array<number> = self[bufferSymbol].getBufferData(); 22234d6c458bSopenharmony_ci let val = ''; 22244d6c458bSopenharmony_ci for (let i = start; i + 1 < end; i += 2) { // 2 is array->NextIndex 22254d6c458bSopenharmony_ci val += String.fromCodePoint((bufData[i + 1] << eightBytes) + (bufData[i])); 22264d6c458bSopenharmony_ci } 22274d6c458bSopenharmony_ci return val; 22284d6c458bSopenharmony_ci} 22294d6c458bSopenharmony_ci 22304d6c458bSopenharmony_cifunction toBase64(self: Buffer, start: number, end: number): string { 22314d6c458bSopenharmony_ci let str = self[bufferSymbol].toBase64(start, end); 22324d6c458bSopenharmony_ci return str; 22334d6c458bSopenharmony_ci} 22344d6c458bSopenharmony_ci 22354d6c458bSopenharmony_cifunction toBase64Url(self: Buffer, start: number, end: number): string { 22364d6c458bSopenharmony_ci let str = self[bufferSymbol].toBase64Url(start, end); 22374d6c458bSopenharmony_ci return str; 22384d6c458bSopenharmony_ci} 22394d6c458bSopenharmony_ci 22404d6c458bSopenharmony_cifunction getEncodingByType(type: string): { 22414d6c458bSopenharmony_ci byteLength: (str: string) => number; 22424d6c458bSopenharmony_ci toString: (self: Buffer, start: number, end: number) => string; 22434d6c458bSopenharmony_ci} | undefined { 22444d6c458bSopenharmony_ci type = type.toLowerCase(); 22454d6c458bSopenharmony_ci switch (type) { 22464d6c458bSopenharmony_ci case 'utf8': 22474d6c458bSopenharmony_ci case 'utf-8': 22484d6c458bSopenharmony_ci return { 22494d6c458bSopenharmony_ci byteLength: getUtf8ByteLength, 22504d6c458bSopenharmony_ci toString: toUtf8 22514d6c458bSopenharmony_ci }; 22524d6c458bSopenharmony_ci case 'ucs2': 22534d6c458bSopenharmony_ci case 'ucs-2': 22544d6c458bSopenharmony_ci return { 22554d6c458bSopenharmony_ci byteLength: (str: string) => str.length * twoBytes, // 2 : 2 times of ascii 22564d6c458bSopenharmony_ci toString: toUtf16LE 22574d6c458bSopenharmony_ci }; 22584d6c458bSopenharmony_ci case 'ascii': 22594d6c458bSopenharmony_ci return { 22604d6c458bSopenharmony_ci byteLength: (str: string) => str.length, 22614d6c458bSopenharmony_ci toString: toAscii 22624d6c458bSopenharmony_ci }; 22634d6c458bSopenharmony_ci case 'binary': 22644d6c458bSopenharmony_ci case 'latin1': 22654d6c458bSopenharmony_ci return { 22664d6c458bSopenharmony_ci byteLength: (str: string) => str.length, 22674d6c458bSopenharmony_ci toString: toBinary 22684d6c458bSopenharmony_ci }; 22694d6c458bSopenharmony_ci case 'utf16le': 22704d6c458bSopenharmony_ci case 'utf-16le': 22714d6c458bSopenharmony_ci return { 22724d6c458bSopenharmony_ci byteLength: (str: string) => str.length * twoBytes, 22734d6c458bSopenharmony_ci toString: toUtf16LE 22744d6c458bSopenharmony_ci }; 22754d6c458bSopenharmony_ci case 'base64': 22764d6c458bSopenharmony_ci return { 22774d6c458bSopenharmony_ci byteLength: getBase64ByteLength, 22784d6c458bSopenharmony_ci toString: toBase64 22794d6c458bSopenharmony_ci }; 22804d6c458bSopenharmony_ci case 'base64url': 22814d6c458bSopenharmony_ci return { 22824d6c458bSopenharmony_ci byteLength: getBase64ByteLength, 22834d6c458bSopenharmony_ci toString: toBase64Url 22844d6c458bSopenharmony_ci }; 22854d6c458bSopenharmony_ci case 'hex': 22864d6c458bSopenharmony_ci return { 22874d6c458bSopenharmony_ci byteLength: (str: string) => str.length >>> 1, // 1 : one-half 22884d6c458bSopenharmony_ci toString: toHex 22894d6c458bSopenharmony_ci }; 22904d6c458bSopenharmony_ci default: 22914d6c458bSopenharmony_ci return undefined; 22924d6c458bSopenharmony_ci } 22934d6c458bSopenharmony_ci} 22944d6c458bSopenharmony_ci 22954d6c458bSopenharmony_cifunction getUtf8ByteLength(str: string): number { 22964d6c458bSopenharmony_ci return internalBuffer.utf8ByteLength(str); 22974d6c458bSopenharmony_ci} 22984d6c458bSopenharmony_ci 22994d6c458bSopenharmony_cifunction getBase64ByteLength(str: string): number { 23004d6c458bSopenharmony_ci let bytes = str.length; 23014d6c458bSopenharmony_ci let pos = 0; 23024d6c458bSopenharmony_ci while (bytes > 1 && (pos = str.indexOf('=', pos)) !== -1) { // Find '=' in str and calculate the length of str 23034d6c458bSopenharmony_ci bytes--; 23044d6c458bSopenharmony_ci pos++; 23054d6c458bSopenharmony_ci } 23064d6c458bSopenharmony_ci return (bytes * threeBytes) >>> twoBytes; 23074d6c458bSopenharmony_ci} 23084d6c458bSopenharmony_ci 23094d6c458bSopenharmony_cifunction compare(buf1: Buffer | Uint8Array, buf2: Buffer | Uint8Array): 1 | 0 | -1 { 23104d6c458bSopenharmony_ci if (!(buf1 instanceof Buffer) && !(buf1 instanceof Uint8Array)) { 23114d6c458bSopenharmony_ci throw new BusinessError(new ErrorMessage(errorMap.typeError, 'buf1').setTypeInfo(['Buffer', 'Uint8Array'], 23124d6c458bSopenharmony_ci getTypeName(buf1)).getString(), errorMap.typeError); 23134d6c458bSopenharmony_ci } 23144d6c458bSopenharmony_ci if (!(buf2 instanceof Buffer) && !(buf2 instanceof Uint8Array)) { 23154d6c458bSopenharmony_ci throw new BusinessError(new ErrorMessage(errorMap.typeError, 'buf2').setTypeInfo(['Buffer', 'Uint8Array'], 23164d6c458bSopenharmony_ci getTypeName(buf2)).getString(), errorMap.typeError); 23174d6c458bSopenharmony_ci } 23184d6c458bSopenharmony_ci 23194d6c458bSopenharmony_ci let bufData1: Array<number> | Uint8Array; 23204d6c458bSopenharmony_ci let bufData2: Array<number> | Uint8Array; 23214d6c458bSopenharmony_ci if (buf1 instanceof Buffer) { 23224d6c458bSopenharmony_ci bufData1 = buf1[bufferSymbol].getBufferData(); 23234d6c458bSopenharmony_ci } else { 23244d6c458bSopenharmony_ci bufData1 = buf1; 23254d6c458bSopenharmony_ci } 23264d6c458bSopenharmony_ci if (buf2 instanceof Buffer) { 23274d6c458bSopenharmony_ci bufData2 = buf2[bufferSymbol].getBufferData(); 23284d6c458bSopenharmony_ci } else { 23294d6c458bSopenharmony_ci bufData2 = buf2; 23304d6c458bSopenharmony_ci } 23314d6c458bSopenharmony_ci let length1: number = bufData1.length; 23324d6c458bSopenharmony_ci let length2: number = bufData2.length; 23334d6c458bSopenharmony_ci let length: number = length1 > length2 ? length2 : length1; 23344d6c458bSopenharmony_ci for (let i = 0; i < length; i++) { 23354d6c458bSopenharmony_ci let value1 = +bufData1[i]; 23364d6c458bSopenharmony_ci let value2 = +bufData2[i]; 23374d6c458bSopenharmony_ci if (value1 > value2) { 23384d6c458bSopenharmony_ci return 1; 23394d6c458bSopenharmony_ci } else if (value1 < value2) { 23404d6c458bSopenharmony_ci return -1; 23414d6c458bSopenharmony_ci } 23424d6c458bSopenharmony_ci } 23434d6c458bSopenharmony_ci if (length1 > length2) { 23444d6c458bSopenharmony_ci return 1; 23454d6c458bSopenharmony_ci } else if (length1 < length2) { 23464d6c458bSopenharmony_ci return -1; 23474d6c458bSopenharmony_ci } 23484d6c458bSopenharmony_ci return 0; 23494d6c458bSopenharmony_ci} 23504d6c458bSopenharmony_ci 23514d6c458bSopenharmony_ciexport default { 23524d6c458bSopenharmony_ci Buffer, 23534d6c458bSopenharmony_ci Blob, 23544d6c458bSopenharmony_ci from, 23554d6c458bSopenharmony_ci alloc, 23564d6c458bSopenharmony_ci allocUninitializedFromPool, 23574d6c458bSopenharmony_ci allocUninitialized, 23584d6c458bSopenharmony_ci byteLength, 23594d6c458bSopenharmony_ci isBuffer, 23604d6c458bSopenharmony_ci isEncoding, 23614d6c458bSopenharmony_ci compare, 23624d6c458bSopenharmony_ci concat, 23634d6c458bSopenharmony_ci transcode 23644d6c458bSopenharmony_ci}; 2365