bind static method

Future<McpOAuthLoopbackCallbackListener> bind({
  1. InternetAddress? address,
  2. int port = 0,
  3. String path = _defaultCallbackPath,
})

Binds an RFC 8252 loopback redirect listener.

The default address tries the IPv4 loopback IP literal, then IPv6 when IPv4 is unavailable; the default port is ephemeral. Pass an explicit loopback address when one IP family is required.

Implementation

static Future<McpOAuthLoopbackCallbackListener> bind({
  InternetAddress? address,
  int port = 0,
  String path = _defaultCallbackPath,
}) async {
  if (address != null && !address.isLoopback) {
    throw ArgumentError.value(
      address,
      'address',
      'OAuth callbacks may bind only a loopback IP address.',
    );
  }
  if (port < 0 || port > 65535) {
    throw ArgumentError.value(port, 'port', 'Must be between 0 and 65535.');
  }
  if (!_validCallbackPath(path)) {
    throw ArgumentError.value(
      path,
      'path',
      'Must be an absolute, authority-free callback path without a query.',
    );
  }

  late final HttpServer server;
  if (address != null) {
    server = await HttpServer.bind(address, port, shared: false);
  } else {
    try {
      server = await HttpServer.bind(
        InternetAddress.loopbackIPv4,
        port,
        shared: false,
      );
    } on SocketException {
      server = await HttpServer.bind(
        InternetAddress.loopbackIPv6,
        port,
        shared: false,
      );
    }
  }
  final redirectUri = Uri(
    scheme: 'http',
    host: server.address.address,
    port: server.port,
    path: path,
  );
  return McpOAuthLoopbackCallbackListener._(server, redirectUri);
}