2025-05-05 15:45:51 -04:00
2025-05-05 15:33:09 -04:00
2025-04-10 19:02:43 +00:00
2025-04-10 18:39:54 -04:00
2025-04-10 18:39:54 -04:00
2025-04-10 19:02:43 +00:00
2025-05-05 15:34:08 -04:00
2025-04-10 19:05:32 -04:00

go-meta-listener

A Go package that implements a unified network listener interface capable of simultaneously handling connections from multiple underlying transport protocols.

Go Reference License: MIT

Overview

go-meta-listener provides a "meta listener" implementation that:

  • Manages multiple network listeners through a single interface
  • Supports any net.Listener implementation (TCP, Unix sockets, TLS, etc.)
  • Handles connections and errors from all managed listeners
  • Enables graceful shutdown across all listeners

The package also includes a specialized mirror implementation for multi-protocol network services supporting:

  • TLS-secured clearnet connections
  • Tor onion services
  • I2P garlic services

Installation

# Install core package
go get github.com/go-i2p/go-meta-listener

# For multi-protocol mirror functionality
go get github.com/go-i2p/go-meta-listener/mirror

Basic Usage

package main

import (
    "log"
    "net"
    "net/http"

    "github.com/go-i2p/go-meta-listener"
)

func main() {
    // Create a new meta listener
    metaListener := meta.NewMetaListener()
    defer metaListener.Close()

    // Add a TCP listener
    tcpListener, _ := net.Listen("tcp", ":8080")
    metaListener.AddListener("tcp", tcpListener)

    // Add a TLS listener
    tlsListener, _ := tls.Listen("tcp", ":8443", tlsConfig)
    metaListener.AddListener("tls", tlsListener)

    // Use with standard http server
    http.Serve(metaListener, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello from any protocol!"))
    }))
}

Mirror Functionality

The mirror package provides a simpler interface for creating services available on clearnet, Tor, and I2P simultaneously:

import "github.com/go-i2p/go-meta-listener/mirror"

// Create a multi-protocol listener
listener, err := mirror.Listen(
    "yourdomain.com",        // Domain name for TLS
    "your.email@example.com", // Email for Let's Encrypt
    "./certs",               // Certificate directory
    false                    // Enable/disable TLS on hidden services
)
defer listener.Close()

// Use with standard library
http.Serve(listener, yourHandler)

Examples

See the example directory for complete HTTP server examples and the mirror/metaproxy directory for multi-protocol connection forwarding.

License

MIT License - Copyright (c) 2025 I2P For Go

Description
A "Proxy Listener" that listens and responds on multiple addresses at the same time.
Readme MIT 77 KiB
Languages
Go 99.7%
Makefile 0.3%