gateway_session_store.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import json
  2. from datetime import datetime, timezone
  3. from utils.security import hash_gateway_session_id
  4. class GatewaySessionStore:
  5. def __init__(self, client, prefix='fms:mcp:gateway:', ttl_seconds=0):
  6. self.client = client
  7. self.prefix = str(prefix or 'fms:mcp:gateway:')
  8. self.ttl_seconds = int(ttl_seconds or 0)
  9. def key_for(self, gateway_session_id):
  10. return self.prefix.rstrip(':') + ':session:' + hash_gateway_session_id(gateway_session_id)
  11. def save(self, gateway_session_id, session):
  12. payload = dict(session or {})
  13. payload['gateway_session_id_hash'] = hash_gateway_session_id(gateway_session_id)
  14. set_kwargs = {}
  15. if self.ttl_seconds > 0:
  16. set_kwargs['ex'] = self.ttl_seconds
  17. self.client.set(
  18. self.key_for(gateway_session_id),
  19. json.dumps(payload, ensure_ascii=False),
  20. **set_kwargs,
  21. )
  22. return payload
  23. def get(self, gateway_session_id):
  24. raw = self.client.get(self.key_for(gateway_session_id))
  25. if raw is None or raw == '':
  26. return None
  27. if isinstance(raw, bytes):
  28. raw = raw.decode('utf-8')
  29. return json.loads(raw)
  30. def touch_session(self, gateway_session_id):
  31. session = self.get(gateway_session_id)
  32. if not session:
  33. return None
  34. session['last_access_time'] = datetime.now(timezone.utc).isoformat().replace('+00:00', 'Z')
  35. return self.save(gateway_session_id, session)
  36. def delete(self, gateway_session_id):
  37. return self.client.delete(self.key_for(gateway_session_id))