handle function application
Last updated: 2026-03-03T18:32:34.140Z
Metrics
LOC: 100
Complexity: 24
Params: 1
Signature
handle(message: ExtensionMessage): : Promise<unknown>
Architecture violations
- [warning] max-cyclomatic-complexity: 'handle' has cyclomatic complexity 24 (max 10)
- [warning] max-lines: 'handle' has 100 lines (max 80)
Source Code
async function handle(message: ExtensionMessage): Promise<unknown> {
switch (message.type) {
case "AI_CHECK_AVAILABLE": {
// Also resets the classifier session failure cache so a new detection
// batch can retry session creation.
sessionFailedAt = null;
return isAvailable();
}
case "AI_CLASSIFY_FIELD": {
const payload = message.payload as FieldClassifierInput | undefined;
if (!payload?.elementHtml) {
log.warn("AI_CLASSIFY_FIELD recebido sem elementHtml.");
return null;
}
return classifyField(payload);
}
case "AI_GENERATE": {
const payload = message.payload as Record<string, unknown> | undefined;
if (!payload || typeof payload.fieldType !== "string") {
log.warn("AI_GENERATE recebido sem payload válido.");
return "";
}
return generateFieldValueFromInput(payload as unknown as FieldValueInput);
}
case "AI_OPTIMIZE_SCRIPT": {
const payload = message.payload as ScriptOptimizerInput | undefined;
if (!payload?.script || !payload?.framework) {
log.warn("AI_OPTIMIZE_SCRIPT recebido sem script ou framework.");
return null;
}
return optimizeScript(payload);
}
case "AI_GENERATE_FORM_CONTEXT": {
const raw = message.payload as
| {
fields?: FormContextFieldInput[];
userContext?: string;
imageDataUrl?: string;
pdfPageDataUrls?: string[];
}
| FormContextFieldInput[]
| undefined;
// Support both legacy array payload and new structured payload
const fields = Array.isArray(raw) ? raw : raw?.fields;
const userContext = Array.isArray(raw) ? undefined : raw?.userContext;
const imageDataUrl = Array.isArray(raw) ? undefined : raw?.imageDataUrl;
const pdfPageDataUrls = Array.isArray(raw)
? undefined
: raw?.pdfPageDataUrls;
if (!Array.isArray(fields) || fields.length === 0) {
log.warn("AI_GENERATE_FORM_CONTEXT recebido sem campos.");
return null;
}
// Convert all data URLs to Blobs for multimodal input (works in service workers)
const imageBlobs: Blob[] = [];
if (imageDataUrl) {
try {
const blob = await fetch(imageDataUrl).then((r) => r.blob());
imageBlobs.push(blob);
log.debug(
`Imagem convertida para Blob: ${blob.type} (${blob.size} bytes)`,
);
} catch (err) {
log.warn("Falha ao converter imageDataUrl para Blob:", err);
}
}
if (pdfPageDataUrls && pdfPageDataUrls.length > 0) {
for (const url of pdfPageDataUrls) {
try {
const blob = await fetch(url).then((r) => r.blob());
imageBlobs.push(blob);
log.debug(
`Página PDF convertida para Blob: ${blob.type} (${blob.size} bytes)`,
);
} catch (err) {
log.warn("Falha ao converter página PDF para Blob:", err);
}
}
}
return generateFormContextValues(
fields,
userContext,
imageBlobs.length > 0 ? imageBlobs : undefined,
);
}
default:
return { error: `Unhandled type in aiHandler: ${message.type}` };
}
}
Dependencies (Outgoing)
| Target | Type |
|---|---|
| classifyField | calls |
No incoming dependencies.