handle function application

Last updated: 2026-03-03T19:14:54.921Z

Metrics

LOC: 87 Complexity: 17 Params: 1

Signature

handle(message: ExtensionMessage): : Promise<unknown>

Architecture violations

View all

  • [warning] max-cyclomatic-complexity: 'handle' has cyclomatic complexity 17 (max 10)
  • [warning] max-lines: 'handle' has 87 lines (max 80)

Source Code

async function handle(message: ExtensionMessage): Promise<unknown> {
  switch (message.type) {
    case "GET_DATASET":
      return getDatasetEntries();

    case "ADD_DATASET_ENTRY": {
      const entry = message.payload as
        | Parameters<typeof addDatasetEntry>[0]
        | undefined;
      if (!entry?.signals || !entry?.type) {
        return { error: "Invalid payload for ADD_DATASET_ENTRY" };
      }
      const added = await addDatasetEntry(entry);
      if (!added) return { error: "Failed to add dataset entry" };
      // Sync to learning store so the classifier learns immediately (no retrain needed)
      await storeLearnedEntry(added.signals, added.type, undefined, "auto");
      void broadcastToAllTabs({ type: "INVALIDATE_CLASSIFIER" });
      return added;
    }

    case "REMOVE_DATASET_ENTRY": {
      const id = parseStringPayload(message.payload);
      if (!id) return { error: "Invalid payload for REMOVE_DATASET_ENTRY" };
      const allEntries = await getDatasetEntries();
      const entry = allEntries.find((e) => e.id === id);
      await removeDatasetEntry(id);
      if (entry) {
        await removeLearnedEntryBySignals(entry.signals);
        void broadcastToAllTabs({ type: "INVALIDATE_CLASSIFIER" });
      }
      return { success: true };
    }

    case "CLEAR_DATASET":
      await clearDataset();
      void broadcastToAllTabs({ type: "INVALIDATE_CLASSIFIER" });
      return { success: true };

    case "IMPORT_DATASET": {
      const entries = message.payload as
        | Parameters<typeof importDatasetEntries>[0]
        | undefined;
      if (!Array.isArray(entries))
        return { error: "Invalid payload for IMPORT_DATASET" };
      const addedCount = await importDatasetEntries(entries);
      if (addedCount > 0) {
        void broadcastToAllTabs({ type: "INVALIDATE_CLASSIFIER" });
      }
      return { success: true, added: addedCount };
    }

    case "SEED_DATASET": {
      const { TRAINING_SAMPLES } = await import("@/lib/dataset/training-data");
      const { buildFeatureText } =
        await import("@/lib/shared/structured-signals");
      const seeds = TRAINING_SAMPLES.map((sample) => ({
        signals: buildFeatureText(sample.signals, {
          category: sample.category,
          language: sample.language,
          domFeatures: sample.domFeatures,
        }),
        type: sample.type,
        source: "builtin" as const,
        difficulty: sample.difficulty,
      }));
      const addedCount = await importDatasetEntries(seeds);
      return { success: true, added: addedCount };
    }

    case "EXPORT_DATASET":
      return exportDatasetEntries();

    case "GET_RUNTIME_MODEL_META": {
      const meta = await getRuntimeModelMeta();
      const exists = await hasRuntimeModel();
      return { exists, meta };
    }

    case "DELETE_RUNTIME_MODEL":
      await deleteRuntimeModel();
      void broadcastToAllTabs({ type: "RELOAD_CLASSIFIER" });
      return { success: true };

    default:
      return { error: `Unhandled type in datasetHandler: ${message.type}` };
  }
}

Dependencies (Outgoing)

graph LR handle["handle"] MessageHandler["MessageHandler"] ExtensionMessage["ExtensionMessage"] MessageType["MessageType"] getDatasetEntries["getDatasetEntries"] addDatasetEntry["addDatasetEntry"] removeDatasetEntry["removeDatasetEntry"] clearDataset["clearDataset"] importDatasetEntries["importDatasetEntries"] exportDatasetEntries["exportDatasetEntries"] hasRuntimeModel["hasRuntimeModel"] getRuntimeModelMeta["getRuntimeModelMeta"] deleteRuntimeModel["deleteRuntimeModel"] storeLearnedEntry["storeLearnedEntry"] removeLearnedEntryBySignals["removeLearnedEntryBySignals"] parseStringPayload["parseStringPayload"] broadcastToAllTabs["broadcastToAllTabs"] handle -->|uses| MessageHandler handle -->|uses| ExtensionMessage handle -->|uses| MessageType handle -->|uses| getDatasetEntries handle -->|uses| addDatasetEntry handle -->|uses| removeDatasetEntry handle -->|uses| clearDataset handle -->|uses| importDatasetEntries handle -->|uses| exportDatasetEntries handle -->|uses| hasRuntimeModel handle -->|uses| getRuntimeModelMeta handle -->|uses| deleteRuntimeModel handle -->|uses| storeLearnedEntry handle -->|uses| removeLearnedEntryBySignals handle -->|uses| parseStringPayload handle -->|uses| broadcastToAllTabs style handle fill:#dbeafe,stroke:#2563eb,stroke-width:2px click handle "4ec56f844308ba0c.html" click MessageHandler "ab334f3bc9eb52d7.html" click ExtensionMessage "c70465261f6c12b8.html" click MessageType "2ef3f4e4b1044d26.html" click getDatasetEntries "b570d56d841d1c94.html" click addDatasetEntry "85b3f0de7e9f307e.html" click removeDatasetEntry "f288b2b0a1a6bde6.html" click clearDataset "36e74f24502e40ab.html" click importDatasetEntries "15410f4dc7e3ba80.html" click exportDatasetEntries "9338f62122b16a4c.html" click hasRuntimeModel "f159266e663b86e4.html" click getRuntimeModelMeta "86eb29679dc3224f.html" click deleteRuntimeModel "617743c800b09f33.html" click storeLearnedEntry "2904bc5fab5c017a.html" click removeLearnedEntryBySignals "ce27530daf2d979b.html" click parseStringPayload "a410bc3f13516882.html" click broadcastToAllTabs "33948cfdc4069058.html"

No incoming dependencies.