"""CLI entry point for the SAM bridge: i2p-sam command.""" from __future__ import annotations import argparse import asyncio import logging import signal import sys from i2p_sam.bridge import SAMBridge def main() -> None: parser = argparse.ArgumentParser( prog="i2p-sam", description="I2P SAM bridge — language-agnostic socket API for I2P", ) parser.add_argument( "--host", default="127.0.0.1", help="Listen host (default: 127.0.0.1)", ) parser.add_argument( "--port", type=int, default=7656, help="Listen port (default: 7656)", ) parser.add_argument( "--log-level", default="INFO", choices=["DEBUG", "INFO", "WARNING", "ERROR"], help="Log level (default: INFO)", ) args = parser.parse_args() logging.basicConfig( level=getattr(logging, args.log_level), format="%(asctime)s %(levelname)-8s %(name)s: %(message)s", stream=sys.stdout, ) log = logging.getLogger(__name__) bridge = SAMBridge(host=args.host, port=args.port) async def run() -> None: await bridge.start() log.info("SAM bridge running on %s:%d", args.host, bridge.port) stop = asyncio.Event() loop = asyncio.get_event_loop() for sig in (signal.SIGTERM, signal.SIGINT): loop.add_signal_handler(sig, stop.set) await stop.wait() log.info("Signal received, shutting down...") await bridge.stop() asyncio.run(run()) if __name__ == "__main__": main()