1: <?php
2:
3: declare(strict_types=1);
4:
5: /**
6: * This file is part of the Nexus MCP SDK package.
7: *
8: * (c) 2026 John Paul E. Balandan, CPA <paulbalandan@gmail.com>
9: *
10: * For the full copyright and license information, please view
11: * the LICENSE file that was distributed with this source code.
12: */
13:
14: namespace Nexus\Mcp\Server\Resource;
15:
16: use Nexus\Mcp\Core\Schema\Cursor;
17: use Nexus\Mcp\Core\Schema\Enum\CacheScope;
18: use Nexus\Mcp\Core\Schema\Resource\Resource;
19: use Nexus\Mcp\Core\Schema\Result\ListResourcesResult;
20: use Nexus\Mcp\Core\Schema\Result\ReadResourceResult;
21: use Nexus\Mcp\Server\AbstractPaginatedStore;
22: use Nexus\Mcp\Server\Exception\ResourceNotFoundException;
23: use Nexus\Mcp\Server\ServerContext;
24:
25: /**
26: * In-memory implementation of `ResourceStoreInterface`.
27: *
28: * @extends AbstractPaginatedStore<ResourceEntry>
29: */
30: final readonly class ResourceStore extends AbstractPaginatedStore implements ResourceStoreInterface
31: {
32: protected const string STORE_LABEL = 'Resource store';
33:
34: #[\Override]
35: public function list(?Cursor $cursor): ListResourcesResult
36: {
37: return $this->paginate(
38: $cursor,
39: static fn(ResourceEntry $entry): Resource => $entry->resource,
40: self::buildResult(...),
41: );
42: }
43:
44: #[\Override]
45: public function read(string $uri, ServerContext $context): ReadResourceResult
46: {
47: $entry = $this->entries[$uri] ?? throw new ResourceNotFoundException($uri, $context->requestId);
48:
49: return $entry->reader->read($uri, $context);
50: }
51:
52: /**
53: * @param list<Resource> $resources
54: */
55: private static function buildResult(array $resources, ?Cursor $nextCursor, int $ttlMs, CacheScope $cacheScope): ListResourcesResult
56: {
57: return new ListResourcesResult(
58: resources: $resources,
59: ttlMs: $ttlMs,
60: cacheScope: $cacheScope,
61: nextCursor: $nextCursor,
62: );
63: }
64: }
65: