Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

- Requires PHP `8.4`
- Requires `innmind/foundation:~2.1`
- `Innmind\HttpSession\Manager::start()`, `::save()` and `::close()` now return a `Innmind\Immutable\Attempt`

## 4.1.0 - 2025-07-30

Expand Down
14 changes: 7 additions & 7 deletions src/Manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,27 @@

use Innmind\Http\ServerRequest;
use Innmind\Immutable\{
Maybe,
Attempt,
SideEffect,
};

interface Manager
{
/**
* @return Maybe<Session>
* @return Attempt<Session>
*/
#[\NoDiscard]
public function start(ServerRequest $request): Maybe;
public function start(ServerRequest $request): Attempt;

/**
* @return Maybe<SideEffect>
* @return Attempt<SideEffect>
*/
#[\NoDiscard]
public function save(Session $session): Maybe;
public function save(Session $session): Attempt;

/**
* @return Maybe<SideEffect>
* @return Attempt<SideEffect>
*/
#[\NoDiscard]
public function close(Session $session): Maybe;
public function close(Session $session): Attempt;
}
38 changes: 20 additions & 18 deletions src/Manager/Native.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Innmind\Url\Path;
use Innmind\Immutable\{
Map,
Attempt,
Maybe,
SideEffect,
};
Expand All @@ -39,18 +40,18 @@ public static function of(?Path $save = null): self
}

#[\Override]
public function start(ServerRequest $request): Maybe
public function start(ServerRequest $request): Attempt
{
if ($this->session instanceof Id) {
/** @var Maybe<Session> */
return Maybe::nothing();
/** @var Attempt<Session> */
return Attempt::error(new \LogicException('Session already started'));
}

$this->configureSessionId($request);

if (\session_start(['use_cookies' => false]) === false) {
/** @var Maybe<Session> */
return Maybe::nothing();
/** @var Attempt<Session> */
return Attempt::error(new \RuntimeException('Failed to start session'));
}

/** @var Map<string, mixed> */
Expand All @@ -77,15 +78,16 @@ public function start(ServerRequest $request): Maybe
$this->session = $session->id();

return $session;
});
})
->attempt(static fn() => new \RuntimeException('Session id or name is invalid'));
}

#[\Override]
public function save(Session $session): Maybe
public function save(Session $session): Attempt
{
if ($this->session !== $session->id()) {
/** @var Maybe<SideEffect> */
return Maybe::nothing();
/** @var Attempt<SideEffect> */
return Attempt::error(new \LogicException('Trying to save a different session than the started one'));
}

$_ = $session
Expand All @@ -96,32 +98,32 @@ public function save(Session $session): Maybe
});

if (\session_write_close() === false) {
/** @var Maybe<SideEffect> */
return Maybe::nothing();
/** @var Attempt<SideEffect> */
return Attempt::error(new \RuntimeException('Failed to persist the session data'));
}

$this->session = null;
$_SESSION = [];

return Maybe::just(SideEffect::identity);
return Attempt::result(SideEffect::identity);
}

#[\Override]
public function close(Session $session): Maybe
public function close(Session $session): Attempt
{
if ($this->session !== $session->id()) {
/** @var Maybe<SideEffect> */
return Maybe::nothing();
/** @var Attempt<SideEffect> */
return Attempt::error(new \LogicException('Trying to close a different session than the started one'));
}

if (\session_destroy() === false) {
/** @var Maybe<SideEffect> */
return Maybe::nothing();
/** @var Attempt<SideEffect> */
return Attempt::error(new \RuntimeException('Failed to close the session'));
}

$this->session = null;

return Maybe::just(SideEffect::identity);
return Attempt::result(SideEffect::identity);
}

private function configureSessionId(ServerRequest $request): void
Expand Down