47 lines
1.3 KiB
JavaScript
47 lines
1.3 KiB
JavaScript
// MARK: - Imports
|
|
// #region Imports
|
|
import { optimizeImage } from 'wasm-image-optimization';
|
|
import { encodeRGBA } from 'skelehash-wasm';
|
|
import { createLogger } from '../../util/logger.js';
|
|
// #endregion
|
|
|
|
const log = createLogger('import');
|
|
|
|
// MARK: - SkeleHash Computation
|
|
// #region SkeleHash Computation
|
|
|
|
/**
|
|
* Computes SkeleHash base62 hash for an image buffer or base64 string.
|
|
*
|
|
* @param {Buffer|string} buffer
|
|
* @returns {Promise<{base62: string, width: number, height: number, hashLength: number}|null>}
|
|
*/
|
|
export async function computeSkeleHash(buffer) {
|
|
if (!buffer) return null;
|
|
let input = buffer;
|
|
if (typeof input === 'string') {
|
|
const base64Data = input.includes(',') ? input.split(',')[1] : input;
|
|
input = Buffer.from(base64Data, 'base64');
|
|
}
|
|
const raw = await optimizeImage({
|
|
image: input,
|
|
width: 200,
|
|
height: 200,
|
|
fit: 'contain',
|
|
format: 'raw',
|
|
});
|
|
|
|
const result = await encodeRGBA(raw.width, raw.height, raw.data);
|
|
if (!result?.base62) {
|
|
throw new Error('encodeRGBA failed to produce a base62 skelehash');
|
|
}
|
|
return {
|
|
base62: result.base62,
|
|
width: raw.width,
|
|
height: raw.height,
|
|
hashLength: result.hash?.length ?? 0,
|
|
};
|
|
}
|
|
|
|
// #endregion
|