feat(server): worker improve (#10176)

fix AF-2225
This commit is contained in:
darkskygit
2025-02-14 09:47:57 +00:00
parent 1bf1832211
commit 981b4efecf
6 changed files with 207 additions and 10 deletions

View File

@@ -0,0 +1,45 @@
import { HTMLRewriter } from 'htmlrewriter';
import { LinkPreviewResponse } from '../types';
export async function decodeWithCharset(
response: Response,
res: LinkPreviewResponse
): Promise<Response> {
let charset: string | undefined;
const rewriter = new HTMLRewriter()
.on('html', {
element(element) {
charset = element.getAttribute('lang') || undefined;
},
})
.on('meta', {
element(element) {
const property =
element.getAttribute('property') ??
element.getAttribute('name') ??
element.getAttribute('http-equiv');
const content = element.getAttribute('content');
if (property && content) {
switch (property.toLowerCase()) {
case 'content-type':
charset = content
.split(';')
.find(x => x.includes('charset='))
?.trim()
?.split('=')[1];
break;
}
}
},
});
const body = await rewriter.transform(response).arrayBuffer();
if (charset) {
const decoder = new TextDecoder(charset);
res.charset = decoder.encoding;
return new Response(decoder.decode(body), response);
} else {
return new Response(body, response);
}
}