read method
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;
}