mirror of
https://github.com/dograh-hq/dograh.git
synced 2026-06-22 08:38:13 +02:00
refactor: add call strategies, cleanup transfer events
This commit is contained in:
parent
e1d8b52b42
commit
99ebede3e3
9 changed files with 154 additions and 177 deletions
|
|
@ -284,7 +284,7 @@ class ARIConnection:
|
|||
f"channel={channel_id}, transfer_id={transfer_id}"
|
||||
)
|
||||
asyncio.create_task(
|
||||
self._handle_transfer_answered(transfer_id, channel_id)
|
||||
self._handle_destination_answered(transfer_id, channel_id)
|
||||
)
|
||||
return
|
||||
|
||||
|
|
@ -753,7 +753,7 @@ class ARIConnection:
|
|||
)
|
||||
return None
|
||||
|
||||
async def _handle_transfer_answered(
|
||||
async def _handle_destination_answered(
|
||||
self, transfer_id: str, destination_channel_id: str
|
||||
):
|
||||
"""Handle transfer destination channel answered - publish success event."""
|
||||
|
|
@ -780,16 +780,16 @@ class ARIConnection:
|
|||
f"caller={context.original_call_sid} -> destination={destination_channel_id}"
|
||||
)
|
||||
|
||||
# Publish transfer success event - this will trigger the bridge swap in serializer
|
||||
# Publish destination answered event - this will trigger the bridge swap in serializer
|
||||
success_event = TransferEvent(
|
||||
type=TransferEventType.TRANSFER_ANSWERED,
|
||||
type=TransferEventType.DESTINATION_ANSWERED,
|
||||
transfer_id=transfer_id,
|
||||
original_call_sid=context.original_call_sid,
|
||||
transfer_call_sid=destination_channel_id,
|
||||
conference_name=context.conference_name,
|
||||
message="Transfer destination answered",
|
||||
status="success",
|
||||
action="transfer_success",
|
||||
action="destination_answered",
|
||||
end_call=True,
|
||||
timestamp=time.time(),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -158,16 +158,10 @@ class CallTransferManager:
|
|||
)
|
||||
|
||||
# Check if this is a completion event
|
||||
if (
|
||||
event.type
|
||||
in [
|
||||
TransferEventType.TRANSFER_ANSWERED, # Call answered = transfer successful
|
||||
TransferEventType.TRANSFER_COMPLETED,
|
||||
TransferEventType.TRANSFER_FAILED,
|
||||
TransferEventType.TRANSFER_CANCELLED,
|
||||
TransferEventType.TRANSFER_TIMEOUT,
|
||||
]
|
||||
):
|
||||
if event.type in [
|
||||
TransferEventType.DESTINATION_ANSWERED,
|
||||
TransferEventType.TRANSFER_FAILED,
|
||||
]:
|
||||
return event
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to parse transfer event: {e}")
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ The ARI WebSocket event listener runs as a separate process (ari_manager.py).
|
|||
"""
|
||||
|
||||
import json
|
||||
import time
|
||||
from typing import TYPE_CHECKING, Any, Dict, List, Optional
|
||||
from urllib.parse import urlparse
|
||||
|
||||
|
|
@ -393,20 +392,9 @@ class ARIProvider(TelephonyProvider):
|
|||
from api.services.telephony.call_transfer_manager import (
|
||||
get_call_transfer_manager,
|
||||
)
|
||||
from api.services.telephony.transfer_event_protocol import TransferContext
|
||||
|
||||
# Store transfer context for event correlation
|
||||
# Get call transfer manager for event correlation mapping
|
||||
call_transfer_manager = await get_call_transfer_manager()
|
||||
context = TransferContext(
|
||||
transfer_id=transfer_id,
|
||||
call_sid=None, # Will be updated after channel creation
|
||||
target_number=destination,
|
||||
tool_uuid=kwargs.get("tool_uuid", ""),
|
||||
original_call_sid=kwargs.get("original_call_sid", ""),
|
||||
conference_name=conference_name,
|
||||
initiated_at=time.time(),
|
||||
)
|
||||
await call_transfer_manager.store_transfer_context(context, ttl=timeout + 10)
|
||||
|
||||
# Build SIP endpoint
|
||||
if destination.startswith("SIP/") or destination.startswith("PJSIP/"):
|
||||
|
|
@ -450,12 +438,6 @@ class ARIProvider(TelephonyProvider):
|
|||
await call_transfer_manager.remove_transfer_context(transfer_id)
|
||||
raise Exception("Failed to create destination channel")
|
||||
|
||||
# Update transfer context with destination channel ID
|
||||
context.call_sid = destination_channel_id
|
||||
await call_transfer_manager.store_transfer_context(
|
||||
context, ttl=timeout + 10
|
||||
)
|
||||
|
||||
# Store transfer channel mapping for event correlation
|
||||
await call_transfer_manager.store_transfer_channel_mapping(
|
||||
destination_channel_id, transfer_id
|
||||
|
|
|
|||
|
|
@ -13,12 +13,8 @@ from typing import Any, Dict, Optional
|
|||
class TransferEventType(str, Enum):
|
||||
"""Types of transfer events sent between instances."""
|
||||
|
||||
TRANSFER_INITIATED = "transfer_initiated"
|
||||
TRANSFER_ANSWERED = "transfer_answered"
|
||||
TRANSFER_COMPLETED = "transfer_completed"
|
||||
DESTINATION_ANSWERED = "destination_answered"
|
||||
TRANSFER_FAILED = "transfer_failed"
|
||||
TRANSFER_CANCELLED = "transfer_cancelled"
|
||||
TRANSFER_TIMEOUT = "transfer_timeout"
|
||||
|
||||
|
||||
@dataclass
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue