Concierge-Sessions
view release on metacpan or search on metacpan
lib/Concierge/Sessions/File.pm view on Meta::CPAN
return { success => 0, message => "Cannot close session file: $!" };
}
return { success => 1, session_id => $session_id };
}
sub get_session_info {
my ($self, $session_id) = @_;
unless ($session_id) {
return { success => 0, message => "Session ID required to retrieve session from File backend" };
}
my $session_file = File::Spec->catfile($self->{storage_dir}, $session_id);
unless (-f $session_file) {
return { success => 0, message => "Session file not found" };
}
my $fh;
unless (open $fh, '<', $session_file) {
return { success => 0, message => "Cannot read session file: $!" };
}
# Read entire file (pretty JSON spans multiple lines)
local $/;
my $json = <$fh>;
unless (close $fh) {
return { success => 0, message => "Error closing session file: $!" };
}
unless (defined $json) {
close $fh;
return { success => 0, message => "Session file is empty" };
}
# Decode JSON
my $session_info;
eval {
$session_info = JSON::PP->new->utf8->decode($json);
};
if ($@) {
return { success => 0, message => "Invalid JSON in session file: $@" };
}
unless ($session_info->{session_id} && $session_info->{created_at} && $session_info->{expires_at}) {
return { success => 0, message => "Invalid session file: missing system status fields" };
}
# Check expiration (skip if indefinite)
if ($session_info->{expires_at} ne 'indefinite' && time() > $session_info->{expires_at}) {
return { success => 0, message => "Session expired" };
}
return {
success => 1,
message => "Session info retrieved",
info => $session_info
};
}
sub update_session {
my ($self, $session_id, $updates) = @_;
unless ($session_id) {
return { success => 0, message => "Session ID required to update session in File backend" };
}
unless ($updates) {
return { success => 1, message => "No updates specified for File backend session update" };
}
my $session_file = File::Spec->catfile($self->{storage_dir}, $session_id);
my $fh;
unless (open $fh, '+<', $session_file) {
return { success => 0, message => "Cannot open or update session file: $!" };
}
# Read entire file (pretty JSON spans multiple lines)
local $/;
my $json = <$fh>;
my $session_info;
if ($json) {
eval {
$session_info = JSON::PP->new->utf8->decode($json);
};
if ($@) {
return { success => 0, message => "Invalid JSON in session file: $@" };
}
}
# Apply updates
if (exists $updates->{data}) {
$session_info->{data} = $updates->{data} || {};
}
if (exists $updates->{expires_at}) {
$session_info->{expires_at} = $updates->{expires_at};
}
# Always update last_updated timestamp
$session_info->{last_updated} = time();
# Encode to JSON with pretty formatting and write to file with trailing newline
my $new_json = JSON::PP->new->utf8->pretty->encode($session_info);
$fh->truncate(0);
seek $fh, 0, 0;
unless (print $fh $new_json, "\n") {
close $fh;
return { success => 0, message => "Cannot write to session file: $!" };
}
unless (close $fh) {
return { success => 0, message => "Cannot close session file: $!" };
}
return { success => 1 };
}
sub delete_session {
my ($self, $session_id) = @_;
( run in 1.186 second using v1.01-cache-2.11-cpan-39bf76dae61 )