gateway_session_store.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  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=2592000):
  6. self.client = client
  7. self.prefix = str(prefix or 'fms:mcp:gateway:')
  8. self.ttl_seconds = int(ttl_seconds or 2592000)
  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. self.client.set(
  15. self.key_for(gateway_session_id),
  16. json.dumps(payload, ensure_ascii=False),
  17. ex=self.ttl_seconds,
  18. )
  19. return payload
  20. def get(self, gateway_session_id):
  21. raw = self.client.get(self.key_for(gateway_session_id))
  22. if raw is None or raw == '':
  23. return None
  24. if isinstance(raw, bytes):
  25. raw = raw.decode('utf-8')
  26. return json.loads(raw)
  27. def touch_session(self, gateway_session_id):
  28. session = self.get(gateway_session_id)
  29. if not session:
  30. return None
  31. session['last_access_time'] = datetime.now(timezone.utc).isoformat().replace('+00:00', 'Z')
  32. return self.save(gateway_session_id, session)
  33. def delete(self, gateway_session_id):
  34. return self.client.delete(self.key_for(gateway_session_id))