/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow strict-local
 * @format
 */

import type { CreateCustomMessageHandlerFn } from "./inspector-proxy/CustomMessageHandler";
import type { DevToolLauncher } from "./types/DevToolLauncher";
import type { EventReporter } from "./types/EventReporter";
import type { ExperimentsConfig } from "./types/Experiments";
import type { Logger } from "./types/Logger";
import type { ReadonlyURL } from "./types/ReadonlyURL";
import type { NextHandleFunction } from "connect";

type Options = Readonly<{
  /**
   * The base URL to the dev server, as reachable from the machine on which
   * dev-middleware is hosted. Typically `http://localhost:${metroPort}`.
   */
  serverBaseUrl: string | ReadonlyURL,

  /**
   * An implementation for logging messages to the terminal (recommended).
   *
   * In `@react-native/community-cli-plugin`, this reuses Metro's
   * 'unstable_server_log' event in `TerminalReporter`.
   */
  logger?: Logger,

  /**
   * An `EventReporter` implementation for logging structured events
   * (recommended).
   *
   * This is an unstable API with no semver guarantees.
   */
  unstable_eventReporter?: EventReporter,

  /**
   * The set of experimental features to enable.
   *
   * This is an unstable API with no semver guarantees.
   */
  unstable_experiments?: ExperimentsConfig,

  /**
   * Override the default handlers for launching external applications (the
   * debugger frontend) on the host machine (or target dev machine).
   *
   * This is an unstable API with no semver guarantees.
   */
  unstable_toolLauncher?: DevToolLauncher,

  /**
   * Create custom handler to add support for unsupported CDP events, or debuggers.
   * This handler is instantiated per logical device and debugger pair.
   *
   * This is an unstable API with no semver guarantees.
   */
  unstable_customInspectorMessageHandler?: CreateCustomMessageHandlerFn,

  /**
   * Whether to measure the event loop performance of inspector proxy and
   * report it via the event reporter.
   *
   * This is an unstable API with no semver guarantees.
   */
  unstable_trackInspectorProxyEventLoopPerf?: boolean,
}>;

type DevMiddlewareAPI = Readonly<{
  middleware: NextHandleFunction,
  websocketEndpoints: { [path: string]: ws$WebSocketServer },
}>;

declare export default function createDevMiddleware(
  $$PARAM_0$$: Options,
): DevMiddlewareAPI;
