feat: scaffold meshnet monorepo
This commit is contained in:
3
packages/node/meshnet_node/__init__.py
Normal file
3
packages/node/meshnet_node/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
"""meshnet_node — Distributed Inference Network node client."""
|
||||
|
||||
__version__ = "0.1.0"
|
||||
39
packages/node/meshnet_node/cli.py
Normal file
39
packages/node/meshnet_node/cli.py
Normal file
@@ -0,0 +1,39 @@
|
||||
"""meshnet-node CLI entry point."""
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="meshnet-node",
|
||||
description="Distributed Inference Network node client",
|
||||
)
|
||||
subparsers = parser.add_subparsers(dest="command")
|
||||
|
||||
start_cmd = subparsers.add_parser("start", help="Start the node server")
|
||||
start_cmd.add_argument("--tracker", default="http://localhost:8080", help="Tracker URL")
|
||||
start_cmd.add_argument("--port", type=int, default=7000, help="Port to listen on")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.command == "start":
|
||||
from meshnet_node.server import StubNodeServer
|
||||
|
||||
node = StubNodeServer(port=args.port)
|
||||
port = node.start()
|
||||
print(f"meshnet-node listening on port {port}")
|
||||
print(f"Tracker URL: {args.tracker}")
|
||||
try:
|
||||
import time
|
||||
while True:
|
||||
time.sleep(1)
|
||||
except KeyboardInterrupt:
|
||||
node.stop()
|
||||
sys.exit(0)
|
||||
else:
|
||||
parser.print_help()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
59
packages/node/meshnet_node/server.py
Normal file
59
packages/node/meshnet_node/server.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""Stub node HTTP server for the Distributed Inference Network."""
|
||||
|
||||
import http.server
|
||||
import json
|
||||
import threading
|
||||
|
||||
|
||||
class _StubHandler(http.server.BaseHTTPRequestHandler):
|
||||
def log_message(self, fmt, *args): # noqa: suppress request logs in tests
|
||||
pass
|
||||
|
||||
def do_POST(self):
|
||||
if self.path == "/v1/infer":
|
||||
length = int(self.headers.get("Content-Length", 0))
|
||||
body = json.loads(self.rfile.read(length))
|
||||
messages = body.get("messages", [])
|
||||
last_content = messages[-1]["content"] if messages else ""
|
||||
payload = json.dumps({"text": f"stub response to: {last_content}"}).encode()
|
||||
self.send_response(200)
|
||||
self.send_header("Content-Type", "application/json")
|
||||
self.send_header("Content-Length", str(len(payload)))
|
||||
self.end_headers()
|
||||
self.wfile.write(payload)
|
||||
else:
|
||||
self.send_response(404)
|
||||
self.end_headers()
|
||||
|
||||
|
||||
class StubNodeServer:
|
||||
"""Single-process stub node that returns fixed inference responses."""
|
||||
|
||||
def __init__(self, host: str = "127.0.0.1", port: int = 0):
|
||||
self._host = host
|
||||
self._requested_port = port
|
||||
self._server: http.server.HTTPServer | None = None
|
||||
self._thread: threading.Thread | None = None
|
||||
self.port: int | None = None
|
||||
|
||||
def start(self) -> int:
|
||||
if self._server is not None:
|
||||
raise RuntimeError("StubNodeServer is already running")
|
||||
|
||||
self._server = http.server.HTTPServer((self._host, self._requested_port), _StubHandler)
|
||||
self.port = self._server.server_address[1]
|
||||
self._thread = threading.Thread(target=self._server.serve_forever, daemon=True)
|
||||
self._thread.start()
|
||||
return self.port
|
||||
|
||||
def stop(self) -> None:
|
||||
if self._server is None:
|
||||
return
|
||||
|
||||
self._server.shutdown()
|
||||
self._server.server_close()
|
||||
if self._thread is not None:
|
||||
self._thread.join(timeout=1)
|
||||
self._server = None
|
||||
self._thread = None
|
||||
self.port = None
|
||||
16
packages/node/pyproject.toml
Normal file
16
packages/node/pyproject.toml
Normal file
@@ -0,0 +1,16 @@
|
||||
[build-system]
|
||||
requires = ["setuptools>=64"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "meshnet-node"
|
||||
version = "0.1.0"
|
||||
description = "Distributed Inference Network node client"
|
||||
requires-python = ">=3.10"
|
||||
|
||||
[project.scripts]
|
||||
meshnet-node = "meshnet_node.cli:main"
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["."]
|
||||
include = ["meshnet_node*"]
|
||||
Reference in New Issue
Block a user