feat(channels): add hook channel
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
"""Hook channel — receives outbound messages from hook-initiated conversations."""
|
||||
|
||||
from loguru import logger
|
||||
|
||||
from nanobot.bus.events import OutboundMessage
|
||||
from nanobot.bus.queue import MessageBus
|
||||
|
||||
|
||||
class HookChannel:
|
||||
"""
|
||||
Minimal channel for hook-initiated conversations.
|
||||
|
||||
The hook HTTP server publishes InboundMessages to the bus.
|
||||
Responses come back as OutboundMessages routed here.
|
||||
send() is a no-op because the HTTP caller gets the response
|
||||
via bus correlation, not channel delivery.
|
||||
"""
|
||||
|
||||
name = "hook"
|
||||
|
||||
def __init__(self, bus: MessageBus):
|
||||
self.bus = bus
|
||||
self._running = False
|
||||
|
||||
async def start(self) -> None:
|
||||
self._running = True
|
||||
logger.info("Hook channel started")
|
||||
|
||||
async def stop(self) -> None:
|
||||
self._running = False
|
||||
|
||||
async def send(self, msg: OutboundMessage) -> None:
|
||||
"""No-op — response is returned via bus correlation to the HTTP caller."""
|
||||
logger.debug(f"Hook channel received outbound for {msg.chat_id} (no-op)")
|
||||
|
||||
@property
|
||||
def is_running(self) -> bool:
|
||||
return self._running
|
||||
@@ -0,0 +1,37 @@
|
||||
"""Tests for the hook channel."""
|
||||
|
||||
import pytest
|
||||
from unittest.mock import MagicMock
|
||||
from nanobot.channels.hook import HookChannel
|
||||
from nanobot.bus.queue import MessageBus
|
||||
from nanobot.bus.events import OutboundMessage
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def bus():
|
||||
return MessageBus()
|
||||
|
||||
|
||||
def test_hook_channel_name():
|
||||
bus = MessageBus()
|
||||
channel = HookChannel(bus)
|
||||
assert channel.name == "hook"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_hook_channel_send_is_noop():
|
||||
"""send() should not raise and should not do anything."""
|
||||
bus = MessageBus()
|
||||
channel = HookChannel(bus)
|
||||
msg = OutboundMessage(channel="hook", chat_id="test", content="hello")
|
||||
await channel.send(msg) # Should not raise
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_hook_channel_start_stop():
|
||||
bus = MessageBus()
|
||||
channel = HookChannel(bus)
|
||||
await channel.start()
|
||||
assert channel.is_running
|
||||
await channel.stop()
|
||||
assert not channel.is_running
|
||||
Reference in New Issue
Block a user