Files
2026-07-10 10:24:29 +08:00

215 lines
6.2 KiB
JavaScript

import moduleHelper from './module-helper';
import { ResType } from './resType';
import { ResTypeOther } from './resTypeOther';
Object.assign(ResType, ResTypeOther);
function realUid(length = 20, char = true) {
const soup = `${char ? '' : '!#%()*+,-./:;=?@[]^_`{|}~'}ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`;
const soupLength = soup.length;
const id = [];
for (let i = 0; i < length; i++) {
id[i] = soup.charAt(Math.random() * soupLength);
}
return id.join('');
}
const identifierCache = [];
const tempCacheObj = {};
const typeMap = {
array: [],
arrayBuffer: [],
string: '',
number: 0,
bool: false,
object: {},
};
const interfaceTypeMap = {
array: 'object',
arrayBuffer: 'object',
string: 'string',
number: 'number',
bool: 'boolean',
object: 'object',
};
export const uid = () => realUid(20, true);
export function formatIdentifier(identifier) {
if (identifier >= 0 && Math.abs(identifier) < 2147483648) {
return Math.round(identifier);
}
for (const key in identifierCache) {
if (identifierCache[key] && identifierCache[key].key === identifier) {
return identifierCache[key].value;
}
}
let value = parseInt(`${Math.random() * 2147483648}`, 10);
while (identifierCache.some(v => v.value === value)) {
value += 1;
}
identifierCache.push({
key: identifier,
value,
});
if (identifierCache.length > 30) {
identifierCache.shift();
}
return value;
}
export function formatTouchEvent(v) {
return {
identifier: formatIdentifier(v.identifier),
clientX: v.clientX * window.devicePixelRatio,
clientY: (window.innerHeight - v.clientY) * window.devicePixelRatio,
pageX: v.pageX * window.devicePixelRatio,
pageY: (window.innerHeight - v.pageY) * window.devicePixelRatio,
};
}
export function formatResponse(type, data, id) {
if (!data) {
data = {};
}
if (typeof data !== 'object') {
return {};
}
const conf = ResType[type];
if (!conf) {
return data;
}
Object.keys(conf).forEach((key) => {
if (data[key] === null || typeof data[key] === 'undefined') {
if (typeof typeMap[conf[key]] === 'undefined') {
data[key] = {};
if (ResType[conf[key]]) {
formatResponse(conf[key], data[key]);
}
}
else {
data[key] = typeMap[conf[key]];
}
}
else if (conf[key] === 'long') {
data[key] = parseInt(data[key], 10);
}
else if (conf[key] === 'number' && typeof data[key] === 'string') {
data[key] = Number(data[key]);
}
else if (conf[key] === 'string' && typeof data[key] === 'number') {
data[key] = `${data[key]}`;
}
else if (conf[key] === 'bool' && (typeof data[key] === 'number' || typeof data[key] === 'string')) {
data[key] = !!data[key];
}
else if (conf[key] === 'arrayBuffer' && id) {
cacheArrayBuffer(id, data[key]);
data.arrayBufferLength = data[key].byteLength;
data[key] = [];
}
else if (typeof data[key] === 'object' && conf[key] === 'object') {
Object.keys(data[key]).forEach((v) => {
if (typeof data[key][v] === 'object') {
data[key][v] = JSON.stringify(data[key][v]);
}
else {
data[key][v] += '';
}
});
}
else if (typeof data[key] === 'object' && conf[key]) {
const array = conf[key].match(/(.+)\[\]/);
if (array) {
for (const itemKey of Object.keys(data[key])) {
if (array[1] === 'string') {
data[key][itemKey] = `${data[key][itemKey]}`;
}
else if (array[1] === 'number') {
data[key][itemKey] = Number(data[key][itemKey]);
}
else {
formatResponse(array[1], data[key][itemKey]);
}
}
}
else {
formatResponse(conf[key], data[key]);
}
}
});
if (conf.anyKeyWord) {
return data;
}
Object.keys(data).forEach((key) => {
if (typeof conf[key] === 'undefined') {
delete data[key];
}
else {
const getType = interfaceTypeMap[conf[key]];
if (getType && getType !== typeof data[key]) {
data[key] = typeMap[conf[key]];
}
}
});
return data;
}
export function formatJsonStr(str) {
if (!str) {
return {};
}
try {
const conf = JSON.parse(str);
const keys = Object.keys(conf);
keys.forEach((v) => {
if (conf[v] === null) {
delete conf[v];
}
});
return conf;
}
catch (e) {
return str;
}
}
export function cacheArrayBuffer(callbackId, data) {
tempCacheObj[callbackId] = data;
}
export function setArrayBuffer(buffer, offset, callbackId) {
buffer.set(new Uint8Array(tempCacheObj[callbackId]), offset);
delete tempCacheObj[callbackId];
}
export function getListObject(list, name) {
return (id) => {
if (!list) {
list = {};
}
const obj = list[id];
if (!obj) {
console.error(`${name} 不存在:`, id);
}
return obj;
};
}
export function onEventCallback(list, eventName, id, callbackId) {
if (!list[id]) {
list[id] = [];
}
const callback = (res) => {
const resStr = JSON.stringify({
callbackId: callbackId || id,
res: JSON.stringify(res),
});
moduleHelper.send(eventName, resStr);
};
list[id].push(callback);
return callback;
}
export function offEventCallback(list, callback, id) {
if (!list || !list[id]) {
return;
}
list[id].forEach(callback);
delete list[id];
}