import { type PlasmoMessaging } from "./index"
import { getExtRuntime } from "./utils"

export const listen = <RequestBody, ResponseBody>(
  handler: PlasmoMessaging.Handler<string, RequestBody, ResponseBody>
) => {
  const metaListener = async (
    req: any,
    sender: chrome.runtime.MessageSender,
    sendResponse: (response?: ResponseBody) => void
  ) => {
    await handler?.(
      {
        ...req,
        sender
      },
      {
        send: (p) => sendResponse(p)
      }
    )
  }

  const listener = (
    req: any,
    sender: chrome.runtime.MessageSender,
    sendResponse: (response?: ResponseBody) => void
  ) => {
    metaListener(req, sender, sendResponse)
    return true // Synchronous return to indicate this is an async listener
  }

  getExtRuntime().onMessage.addListener(listener)
  return () => {
    getExtRuntime().onMessage.removeListener(listener)
  }
}