/* * Copyright (C) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { getThreadPoolTraceBufferCacheKey } from './database/SqlLite'; export enum TraceMode { NORMAL, LONG_TRACE, DISTRIBUTED, } export const applicationHtml: string = `
`; export function readTraceFileBuffer(): Promise { return new Promise((resolve) => { caches.match(getThreadPoolTraceBufferCacheKey('1')).then((res) => { if (res) { res.arrayBuffer().then((buffer) => { resolve(buffer); }); } else { resolve(undefined); } }); }); } export function clearTraceFileCache(): void { caches.keys().then((keys) => { keys.forEach((key) => { if (key === getThreadPoolTraceBufferCacheKey('1')) { caches.delete(key).then(); } else if (key.includes('/') && key.includes('-')) { let splits = key.split('/'); let keyStr = splits[splits.length - 1]; let time = keyStr.split('-')[0]; let fileDate = new Date(parseInt(time)); if (fileDate.toLocaleDateString() !== new Date().toLocaleDateString()) { //如果不是当天的缓存则删去缓存文件 caches.delete(key).then(); } } else { caches.delete(key).then(); } }); }); } export function postLog(filename: string, fileSize: string): void { fetch(`https://${window.location.host.split(':')[0]}:${window.location.port}/logger`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ fileName: filename, fileSize: fileSize, }), }) .then((response) => response.json()) .then((data) => { }) .catch((error) => { }); } export function indexedDataToBufferData(sourceData: unknown): ArrayBuffer { let uintArrayLength = 0; //@ts-ignore let uintDataList = sourceData.map((item: unknown) => { //@ts-ignore let currentBufData = new Uint8Array(item.buf); uintArrayLength += currentBufData.length; return currentBufData; }); let resultArrayBuffer = new ArrayBuffer(uintArrayLength); let resultUintArray = new Uint8Array(resultArrayBuffer); let offset = 0; uintDataList.forEach((currentArray: Uint8Array) => { resultUintArray.set(currentArray, offset); offset += currentArray.length; }); return resultArrayBuffer; } export function findFreeSizeAlgorithm(numbers: Array, freeSize: number): Array { let closestSize = 0; let currentSize = 0; let finalIndex: Array = []; let currentSelectIndex: Array = []; function reBackFind(index: number): void { if (index === numbers.length) { const sumDifference = Math.abs(currentSize - freeSize); if (currentSize <= freeSize && sumDifference < Math.abs(closestSize - freeSize)) { closestSize = currentSize; finalIndex = [...currentSelectIndex]; } return; } currentSize += numbers[index]; currentSelectIndex.push(index); reBackFind(index + 1); currentSize -= numbers[index]; currentSelectIndex.pop(); reBackFind(index + 1); } reBackFind(0); return finalIndex; } export function getCurrentDataTime(): string[] { let current = new Date(); let year = '' + current.getFullYear(); let month = ('0' + (current.getMonth() + 1)).slice(-2); let day = ('0' + current.getDate()).slice(-2); let hours = ('0' + current.getHours()).slice(-2); let minutes = ('0' + current.getMinutes()).slice(-2); let seconds = ('0' + current.getSeconds()).slice(-2); return [year, month, day, hours, minutes, seconds]; } // 定义ZIP文件的文件头常量 const ZIP_HEADER = [0x50, 0x4B, 0x03, 0x04]; // 定义ZLIB文件的文件头常量 const ZLIB_HEADER = [0x78, 0x9c]; /** * 验证Uint8Array实例并检查长度是否满足要求 * @param uint8Array 待验证的Uint8Array实例 * @param requiredLength 所需的最小长度 * @returns 如果uint8Array是一个Uint8Array实例且长度大于等于requiredLength,则返回true,否则返回false */ function validateUint8Array(uint8Array: Uint8Array, requiredLength: number): boolean { return uint8Array instanceof Uint8Array && uint8Array.length >= requiredLength; } /** * 检查Uint8Array是否表示一个ZIP文件 * @param uint8Array 待检查的Uint8Array实例 * @returns 如果uint8Array表示的是一个ZIP文件,则返回true,否则返回false */ export function isZipFile(uint8Array: Uint8Array): boolean { if (!validateUint8Array(uint8Array, ZIP_HEADER.length)) { return false; } for (let i = 0; i < ZIP_HEADER.length; i++) { if (uint8Array[i] !== ZIP_HEADER[i]) { return false; } } return true; } /** * 检查Uint8Array是否表示一个ZLIB文件 * @param uint8Array 待检查的Uint8Array实例 * @returns 如果uint8Array表示的是一个ZLIB文件,则返回true,否则返回false */ export function isZlibFile(uint8Array: Uint8Array): boolean { if (!validateUint8Array(uint8Array, ZLIB_HEADER.length)) { return false; } for (let i = 0; i < ZLIB_HEADER.length; i++) { if (uint8Array[i] !== ZLIB_HEADER[i]) { return false; } } return true; }