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

View all

  • [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)

graph LR handle["handle"] classifyField["classifyField"] handle -->|calls| classifyField style handle fill:#dbeafe,stroke:#2563eb,stroke-width:2px click handle "fd8235a9d9674da4.html" click classifyField "aa03a8b1140f5f42.html"
TargetType
classifyField calls

No incoming dependencies.