read method

  1. @override
Future<Session> read(
  1. Request request,
  2. String name
)
override

Retrieves a session based on the request and session name. If no session exists, a new one is created.

Implementation

@override
Future<Session> read(Request request, String name) async {
  final cookie = request.cookies.firstWhere(
    (c) => c.name == name,
    orElse: () => Cookie(name, ''),
  );
  final session = Session(name: name, options: defaultOptions, values: {});

  if (cookie.value.isEmpty) {
    session.id = _generateSessionId();
    return session;
  }

  for (final codec in codecs) {
    try {
      final data = codec.decode(name, cookie.value);
      final sid = data['id'] as String?;
      if (sid != null) {
        session.id = sid;
        session.isNew = false;
        final loaded = await _loadFromFile(sid);
        if (loaded != null) {
          session.values.addAll(loaded);
        }
        break;
      }
    } catch (_) {
      // continue trying other codecs
    }
  }

  if (session.id.isEmpty) {
    session.id = _generateSessionId();
  }
  return session;
}