/*
* 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;
}