Merge pull request #1736 from NousResearch/fix/gateway-platform-hardening
fix(gateway): SMS session-per-send + Matrix bare media types break downstream processing
This commit is contained in:
commit
aea39eeafb
2 changed files with 22 additions and 5 deletions
|
|
@ -662,17 +662,24 @@ class MatrixAdapter(BasePlatformAdapter):
|
||||||
http_url = self._mxc_to_http(url)
|
http_url = self._mxc_to_http(url)
|
||||||
|
|
||||||
# Determine message type from event class.
|
# Determine message type from event class.
|
||||||
media_type = "document"
|
# Use the MIME type from the event's content info when available,
|
||||||
|
# falling back to category-level MIME types for downstream matching
|
||||||
|
# (gateway/run.py checks startswith("image/"), startswith("audio/"), etc.)
|
||||||
|
content_info = getattr(event, "content", {}) if isinstance(getattr(event, "content", None), dict) else {}
|
||||||
|
event_mimetype = (content_info.get("info") or {}).get("mimetype", "")
|
||||||
|
media_type = "application/octet-stream"
|
||||||
msg_type = MessageType.DOCUMENT
|
msg_type = MessageType.DOCUMENT
|
||||||
if isinstance(event, nio.RoomMessageImage):
|
if isinstance(event, nio.RoomMessageImage):
|
||||||
msg_type = MessageType.PHOTO
|
msg_type = MessageType.PHOTO
|
||||||
media_type = "image"
|
media_type = event_mimetype or "image/png"
|
||||||
elif isinstance(event, nio.RoomMessageAudio):
|
elif isinstance(event, nio.RoomMessageAudio):
|
||||||
msg_type = MessageType.AUDIO
|
msg_type = MessageType.AUDIO
|
||||||
media_type = "audio"
|
media_type = event_mimetype or "audio/ogg"
|
||||||
elif isinstance(event, nio.RoomMessageVideo):
|
elif isinstance(event, nio.RoomMessageVideo):
|
||||||
msg_type = MessageType.VIDEO
|
msg_type = MessageType.VIDEO
|
||||||
media_type = "video"
|
media_type = event_mimetype or "video/mp4"
|
||||||
|
elif event_mimetype:
|
||||||
|
media_type = event_mimetype
|
||||||
|
|
||||||
is_dm = self._dm_rooms.get(room.room_id, False)
|
is_dm = self._dm_rooms.get(room.room_id, False)
|
||||||
if not is_dm and room.member_count == 2:
|
if not is_dm and room.member_count == 2:
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ class SmsAdapter(BasePlatformAdapter):
|
||||||
os.getenv("SMS_WEBHOOK_PORT", str(DEFAULT_WEBHOOK_PORT))
|
os.getenv("SMS_WEBHOOK_PORT", str(DEFAULT_WEBHOOK_PORT))
|
||||||
)
|
)
|
||||||
self._runner = None
|
self._runner = None
|
||||||
|
self._http_session: Optional["aiohttp.ClientSession"] = None
|
||||||
|
|
||||||
def _basic_auth_header(self) -> str:
|
def _basic_auth_header(self) -> str:
|
||||||
"""Build HTTP Basic auth header value for Twilio."""
|
"""Build HTTP Basic auth header value for Twilio."""
|
||||||
|
|
@ -106,6 +107,7 @@ class SmsAdapter(BasePlatformAdapter):
|
||||||
await self._runner.setup()
|
await self._runner.setup()
|
||||||
site = web.TCPSite(self._runner, "0.0.0.0", self._webhook_port)
|
site = web.TCPSite(self._runner, "0.0.0.0", self._webhook_port)
|
||||||
await site.start()
|
await site.start()
|
||||||
|
self._http_session = aiohttp.ClientSession()
|
||||||
self._running = True
|
self._running = True
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
|
|
@ -116,6 +118,9 @@ class SmsAdapter(BasePlatformAdapter):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
async def disconnect(self) -> None:
|
async def disconnect(self) -> None:
|
||||||
|
if self._http_session:
|
||||||
|
await self._http_session.close()
|
||||||
|
self._http_session = None
|
||||||
if self._runner:
|
if self._runner:
|
||||||
await self._runner.cleanup()
|
await self._runner.cleanup()
|
||||||
self._runner = None
|
self._runner = None
|
||||||
|
|
@ -140,7 +145,8 @@ class SmsAdapter(BasePlatformAdapter):
|
||||||
"Authorization": self._basic_auth_header(),
|
"Authorization": self._basic_auth_header(),
|
||||||
}
|
}
|
||||||
|
|
||||||
async with aiohttp.ClientSession() as session:
|
session = self._http_session or aiohttp.ClientSession()
|
||||||
|
try:
|
||||||
for chunk in chunks:
|
for chunk in chunks:
|
||||||
form_data = aiohttp.FormData()
|
form_data = aiohttp.FormData()
|
||||||
form_data.add_field("From", self._from_number)
|
form_data.add_field("From", self._from_number)
|
||||||
|
|
@ -167,6 +173,10 @@ class SmsAdapter(BasePlatformAdapter):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error("[sms] send error to %s: %s", _redact_phone(chat_id), e)
|
logger.error("[sms] send error to %s: %s", _redact_phone(chat_id), e)
|
||||||
return SendResult(success=False, error=str(e))
|
return SendResult(success=False, error=str(e))
|
||||||
|
finally:
|
||||||
|
# Close session only if we created a fallback (no persistent session)
|
||||||
|
if not self._http_session and session:
|
||||||
|
await session.close()
|
||||||
|
|
||||||
return last_result
|
return last_result
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue