Resolve AT Protocol DIDs, handles, and schemas with intelligent caching for Laravel

Change namespace to be more consistent across `atp` packages

+7 -7
README.md
··· 32 ## Quick Example 33 34 ```php 35 - use SocialDept\Resolver\Facades\Resolver; 36 37 // Resolve a DID to its document 38 $document = Resolver::resolveDid('did:plc:ewvi7nxzyoun6zhxrhs64oiz'); ··· 70 Resolver supports both `did:plc` and `did:web` methods: 71 72 ```php 73 - use SocialDept\Resolver\Facades\Resolver; 74 75 // PLC directory resolution 76 $document = Resolver::resolveDid('did:plc:ewvi7nxzyoun6zhxrhs64oiz'); ··· 165 Beacon includes static helper methods to validate DIDs and handles: 166 167 ```php 168 - use SocialDept\Resolver\Support\Identity; 169 170 // Validate handles 171 Identity::isHandle('alice.bsky.social'); // true ··· 270 Beacon throws descriptive exceptions when resolution fails: 271 272 ```php 273 - use SocialDept\Resolver\Exceptions\DidResolutionException; 274 - use SocialDept\Resolver\Exceptions\HandleResolutionException; 275 276 try { 277 $document = Resolver::resolveDid('did:invalid:format'); ··· 328 ### Input Validation 329 330 ```php 331 - use SocialDept\Resolver\Support\Identity; 332 - use SocialDept\Resolver\Facades\Resolver; 333 334 // Validate user input before resolving 335 $actor = request()->input('actor');
··· 32 ## Quick Example 33 34 ```php 35 + use SocialDept\AtpResolver\Facades\Resolver; 36 37 // Resolve a DID to its document 38 $document = Resolver::resolveDid('did:plc:ewvi7nxzyoun6zhxrhs64oiz'); ··· 70 Resolver supports both `did:plc` and `did:web` methods: 71 72 ```php 73 + use SocialDept\AtpResolver\Facades\Resolver; 74 75 // PLC directory resolution 76 $document = Resolver::resolveDid('did:plc:ewvi7nxzyoun6zhxrhs64oiz'); ··· 165 Beacon includes static helper methods to validate DIDs and handles: 166 167 ```php 168 + use SocialDept\AtpResolver\Support\Identity; 169 170 // Validate handles 171 Identity::isHandle('alice.bsky.social'); // true ··· 270 Beacon throws descriptive exceptions when resolution fails: 271 272 ```php 273 + use SocialDept\AtpResolver\Exceptions\DidResolutionException; 274 + use SocialDept\AtpResolver\Exceptions\HandleResolutionException; 275 276 try { 277 $document = Resolver::resolveDid('did:invalid:format'); ··· 328 ### Input Validation 329 330 ```php 331 + use SocialDept\AtpResolver\Support\Identity; 332 + use SocialDept\AtpResolver\Facades\Resolver; 333 334 // Validate user input before resolving 335 $actor = request()->input('actor');
+4 -4
composer.json
··· 18 }, 19 "autoload": { 20 "psr-4": { 21 - "SocialDept\\Resolver\\": "src/" 22 } 23 }, 24 "autoload-dev": { 25 "psr-4": { 26 - "SocialDept\\Resolver\\Tests\\": "tests/" 27 } 28 }, 29 "extra": { 30 "laravel": { 31 "providers": [ 32 - "SocialDept\\Resolver\\ResolverServiceProvider" 33 ], 34 "aliases": { 35 - "Resolver": "SocialDept\\Resolver\\Facades\\Resolver" 36 } 37 } 38 }
··· 18 }, 19 "autoload": { 20 "psr-4": { 21 + "SocialDept\\AtpResolver\\": "src/" 22 } 23 }, 24 "autoload-dev": { 25 "psr-4": { 26 + "SocialDept\\AtpResolver\\Tests\\": "tests/" 27 } 28 }, 29 "extra": { 30 "laravel": { 31 "providers": [ 32 + "SocialDept\\AtpResolver\\ResolverServiceProvider" 33 ], 34 "aliases": { 35 + "Resolver": "SocialDept\\AtpResolver\\Facades\\Resolver" 36 } 37 } 38 }
+2 -2
src/Cache/LaravelCacheStore.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Cache; 4 5 use Illuminate\Contracts\Cache\Repository; 6 - use SocialDept\Resolver\Contracts\CacheStore; 7 8 class LaravelCacheStore implements CacheStore 9 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Cache; 4 5 use Illuminate\Contracts\Cache\Repository; 6 + use SocialDept\AtpResolver\Contracts\CacheStore; 7 8 class LaravelCacheStore implements CacheStore 9 {
+1 -1
src/Contracts/CacheStore.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Contracts; 4 5 interface CacheStore 6 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Contracts; 4 5 interface CacheStore 6 {
+3 -3
src/Contracts/DidResolver.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Contracts; 4 5 - use SocialDept\Resolver\Data\DidDocument; 6 7 interface DidResolver 8 { ··· 12 * @param string $did The DID to resolve (e.g., "did:plc:abc123" or "did:web:example.com") 13 * @return DidDocument 14 * 15 - * @throws \SocialDept\Resolver\Exceptions\DidResolutionException 16 */ 17 public function resolve(string $did): DidDocument; 18
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Contracts; 4 5 + use SocialDept\AtpResolver\Data\DidDocument; 6 7 interface DidResolver 8 { ··· 12 * @param string $did The DID to resolve (e.g., "did:plc:abc123" or "did:web:example.com") 13 * @return DidDocument 14 * 15 + * @throws \SocialDept\AtpResolver\Exceptions\DidResolutionException 16 */ 17 public function resolve(string $did): DidDocument; 18
+2 -2
src/Contracts/HandleResolver.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Contracts; 4 5 interface HandleResolver 6 { ··· 10 * @param string $handle The handle to resolve (e.g., "user.bsky.social") 11 * @return string The resolved DID 12 * 13 - * @throws \SocialDept\Resolver\Exceptions\HandleResolutionException 14 */ 15 public function resolve(string $handle): string; 16 }
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Contracts; 4 5 interface HandleResolver 6 { ··· 10 * @param string $handle The handle to resolve (e.g., "user.bsky.social") 11 * @return string The resolved DID 12 * 13 + * @throws \SocialDept\AtpResolver\Exceptions\HandleResolutionException 14 */ 15 public function resolve(string $handle): string; 16 }
+1 -1
src/Data/DidDocument.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Data; 4 5 class DidDocument 6 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Data; 4 5 class DidDocument 6 {
+1 -1
src/Exceptions/DidResolutionException.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Exceptions; 4 5 class DidResolutionException extends ResolverException 6 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Exceptions; 4 5 class DidResolutionException extends ResolverException 6 {
+1 -1
src/Exceptions/HandleResolutionException.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Exceptions; 4 5 class HandleResolutionException extends ResolverException 6 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Exceptions; 4 5 class HandleResolutionException extends ResolverException 6 {
+1 -1
src/Exceptions/ResolverException.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Exceptions; 4 5 use Exception; 6
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Exceptions; 4 5 use Exception; 6
+1 -1
src/Facades/Resolver.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Facades; 4 5 use Illuminate\Support\Facades\Facade; 6
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Facades; 4 5 use Illuminate\Support\Facades\Facade; 6
+9 -9
src/Resolver.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver; 4 5 - use SocialDept\Resolver\Contracts\CacheStore; 6 - use SocialDept\Resolver\Contracts\DidResolver; 7 - use SocialDept\Resolver\Contracts\HandleResolver; 8 - use SocialDept\Resolver\Data\DidDocument; 9 - use SocialDept\Resolver\Exceptions\DidResolutionException; 10 - use SocialDept\Resolver\Exceptions\HandleResolutionException; 11 - use SocialDept\Resolver\Support\Concerns\HasConfig; 12 - use SocialDept\Resolver\Support\Identity; 13 14 class Resolver 15 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver; 4 5 + use SocialDept\AtpResolver\Contracts\CacheStore; 6 + use SocialDept\AtpResolver\Contracts\DidResolver; 7 + use SocialDept\AtpResolver\Contracts\HandleResolver; 8 + use SocialDept\AtpResolver\Data\DidDocument; 9 + use SocialDept\AtpResolver\Exceptions\DidResolutionException; 10 + use SocialDept\AtpResolver\Exceptions\HandleResolutionException; 11 + use SocialDept\AtpResolver\Support\Concerns\HasConfig; 12 + use SocialDept\AtpResolver\Support\Identity; 13 14 class Resolver 15 {
+7 -7
src/ResolverServiceProvider.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver; 4 5 use Illuminate\Support\ServiceProvider; 6 - use SocialDept\Resolver\Cache\LaravelCacheStore; 7 - use SocialDept\Resolver\Contracts\CacheStore; 8 - use SocialDept\Resolver\Contracts\DidResolver; 9 - use SocialDept\Resolver\Contracts\HandleResolver; 10 - use SocialDept\Resolver\Resolvers\AtProtoHandleResolver; 11 - use SocialDept\Resolver\Resolvers\DidResolverManager; 12 13 class ResolverServiceProvider extends ServiceProvider 14 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver; 4 5 use Illuminate\Support\ServiceProvider; 6 + use SocialDept\AtpResolver\Cache\LaravelCacheStore; 7 + use SocialDept\AtpResolver\Contracts\CacheStore; 8 + use SocialDept\AtpResolver\Contracts\DidResolver; 9 + use SocialDept\AtpResolver\Contracts\HandleResolver; 10 + use SocialDept\AtpResolver\Resolvers\AtProtoHandleResolver; 11 + use SocialDept\AtpResolver\Resolvers\DidResolverManager; 12 13 class ResolverServiceProvider extends ServiceProvider 14 {
+4 -4
src/Resolvers/AtProtoHandleResolver.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Resolvers; 4 5 use GuzzleHttp\Client; 6 use GuzzleHttp\Exception\GuzzleException; 7 - use SocialDept\Resolver\Contracts\HandleResolver; 8 - use SocialDept\Resolver\Exceptions\HandleResolutionException; 9 - use SocialDept\Resolver\Support\Concerns\HasConfig; 10 11 class AtProtoHandleResolver implements HandleResolver 12 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Resolvers; 4 5 use GuzzleHttp\Client; 6 use GuzzleHttp\Exception\GuzzleException; 7 + use SocialDept\AtpResolver\Contracts\HandleResolver; 8 + use SocialDept\AtpResolver\Exceptions\HandleResolutionException; 9 + use SocialDept\AtpResolver\Support\Concerns\HasConfig; 10 11 class AtProtoHandleResolver implements HandleResolver 12 {
+5 -5
src/Resolvers/DidResolverManager.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Resolvers; 4 5 - use SocialDept\Resolver\Contracts\DidResolver; 6 - use SocialDept\Resolver\Data\DidDocument; 7 - use SocialDept\Resolver\Exceptions\DidResolutionException; 8 - use SocialDept\Resolver\Support\Concerns\ParsesDid; 9 10 class DidResolverManager implements DidResolver 11 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Resolvers; 4 5 + use SocialDept\AtpResolver\Contracts\DidResolver; 6 + use SocialDept\AtpResolver\Data\DidDocument; 7 + use SocialDept\AtpResolver\Exceptions\DidResolutionException; 8 + use SocialDept\AtpResolver\Support\Concerns\ParsesDid; 9 10 class DidResolverManager implements DidResolver 11 {
+6 -6
src/Resolvers/PlcDidResolver.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Resolvers; 4 5 use GuzzleHttp\Client; 6 use GuzzleHttp\Exception\GuzzleException; 7 - use SocialDept\Resolver\Contracts\DidResolver; 8 - use SocialDept\Resolver\Data\DidDocument; 9 - use SocialDept\Resolver\Exceptions\DidResolutionException; 10 - use SocialDept\Resolver\Support\Concerns\HasConfig; 11 - use SocialDept\Resolver\Support\Concerns\ParsesDid; 12 13 class PlcDidResolver implements DidResolver 14 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Resolvers; 4 5 use GuzzleHttp\Client; 6 use GuzzleHttp\Exception\GuzzleException; 7 + use SocialDept\AtpResolver\Contracts\DidResolver; 8 + use SocialDept\AtpResolver\Data\DidDocument; 9 + use SocialDept\AtpResolver\Exceptions\DidResolutionException; 10 + use SocialDept\AtpResolver\Support\Concerns\HasConfig; 11 + use SocialDept\AtpResolver\Support\Concerns\ParsesDid; 12 13 class PlcDidResolver implements DidResolver 14 {
+6 -6
src/Resolvers/WebDidResolver.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Resolvers; 4 5 use GuzzleHttp\Client; 6 use GuzzleHttp\Exception\GuzzleException; 7 - use SocialDept\Resolver\Contracts\DidResolver; 8 - use SocialDept\Resolver\Data\DidDocument; 9 - use SocialDept\Resolver\Exceptions\DidResolutionException; 10 - use SocialDept\Resolver\Support\Concerns\HasConfig; 11 - use SocialDept\Resolver\Support\Concerns\ParsesDid; 12 13 class WebDidResolver implements DidResolver 14 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Resolvers; 4 5 use GuzzleHttp\Client; 6 use GuzzleHttp\Exception\GuzzleException; 7 + use SocialDept\AtpResolver\Contracts\DidResolver; 8 + use SocialDept\AtpResolver\Data\DidDocument; 9 + use SocialDept\AtpResolver\Exceptions\DidResolutionException; 10 + use SocialDept\AtpResolver\Support\Concerns\HasConfig; 11 + use SocialDept\AtpResolver\Support\Concerns\ParsesDid; 12 13 class WebDidResolver implements DidResolver 14 {
+1 -1
src/Support/Concerns/HasConfig.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Support\Concerns; 4 5 trait HasConfig 6 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Support\Concerns; 4 5 trait HasConfig 6 {
+2 -2
src/Support/Concerns/ParsesDid.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Support\Concerns; 4 5 - use SocialDept\Resolver\Exceptions\DidResolutionException; 6 7 trait ParsesDid 8 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Support\Concerns; 4 5 + use SocialDept\AtpResolver\Exceptions\DidResolutionException; 6 7 trait ParsesDid 8 {
+1 -1
src/Support/Identity.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Support; 4 5 class Identity 6 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Support; 4 5 class Identity 6 {
+2 -2
tests/Unit/DidDocumentTest.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 - use SocialDept\Resolver\Data\DidDocument; 7 8 class DidDocumentTest extends TestCase 9 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 + use SocialDept\AtpResolver\Data\DidDocument; 7 8 class DidDocumentTest extends TestCase 9 {
+5 -5
tests/Unit/DidResolverManagerTest.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 - use SocialDept\Resolver\Contracts\DidResolver; 7 - use SocialDept\Resolver\Data\DidDocument; 8 - use SocialDept\Resolver\Exceptions\DidResolutionException; 9 - use SocialDept\Resolver\Resolvers\DidResolverManager; 10 11 class DidResolverManagerTest extends TestCase 12 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 + use SocialDept\AtpResolver\Contracts\DidResolver; 7 + use SocialDept\AtpResolver\Data\DidDocument; 8 + use SocialDept\AtpResolver\Exceptions\DidResolutionException; 9 + use SocialDept\AtpResolver\Resolvers\DidResolverManager; 10 11 class DidResolverManagerTest extends TestCase 12 {
+2 -2
tests/Unit/IdentityTest.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 - use SocialDept\Resolver\Support\Identity; 7 8 class IdentityTest extends TestCase 9 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 + use SocialDept\AtpResolver\Support\Identity; 7 8 class IdentityTest extends TestCase 9 {
+3 -3
tests/Unit/PlcDidResolverTest.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 - use SocialDept\Resolver\Exceptions\DidResolutionException; 7 - use SocialDept\Resolver\Resolvers\PlcDidResolver; 8 9 class PlcDidResolverTest extends TestCase 10 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 + use SocialDept\AtpResolver\Exceptions\DidResolutionException; 7 + use SocialDept\AtpResolver\Resolvers\PlcDidResolver; 8 9 class PlcDidResolverTest extends TestCase 10 {
+6 -6
tests/Unit/ResolverIdentityTest.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 - use SocialDept\Resolver\Contracts\CacheStore; 7 - use SocialDept\Resolver\Contracts\DidResolver; 8 - use SocialDept\Resolver\Contracts\HandleResolver; 9 - use SocialDept\Resolver\Data\DidDocument; 10 - use SocialDept\Resolver\Resolver; 11 12 class ResolverIdentityTest extends TestCase 13 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 + use SocialDept\AtpResolver\Contracts\CacheStore; 7 + use SocialDept\AtpResolver\Contracts\DidResolver; 8 + use SocialDept\AtpResolver\Contracts\HandleResolver; 9 + use SocialDept\AtpResolver\Data\DidDocument; 10 + use SocialDept\AtpResolver\Resolver; 11 12 class ResolverIdentityTest extends TestCase 13 {
+6 -6
tests/Unit/ResolverTest.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 - use SocialDept\Resolver\Contracts\CacheStore; 7 - use SocialDept\Resolver\Contracts\DidResolver; 8 - use SocialDept\Resolver\Contracts\HandleResolver; 9 - use SocialDept\Resolver\Data\DidDocument; 10 - use SocialDept\Resolver\Resolver; 11 12 class ResolverTest extends TestCase 13 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 + use SocialDept\AtpResolver\Contracts\CacheStore; 7 + use SocialDept\AtpResolver\Contracts\DidResolver; 8 + use SocialDept\AtpResolver\Contracts\HandleResolver; 9 + use SocialDept\AtpResolver\Data\DidDocument; 10 + use SocialDept\AtpResolver\Resolver; 11 12 class ResolverTest extends TestCase 13 {
+3 -3
tests/Unit/WebDidResolverTest.php
··· 1 <?php 2 3 - namespace SocialDept\Resolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 - use SocialDept\Resolver\Exceptions\DidResolutionException; 7 - use SocialDept\Resolver\Resolvers\WebDidResolver; 8 9 class WebDidResolverTest extends TestCase 10 {
··· 1 <?php 2 3 + namespace SocialDept\AtpResolver\Tests\Unit; 4 5 use PHPUnit\Framework\TestCase; 6 + use SocialDept\AtpResolver\Exceptions\DidResolutionException; 7 + use SocialDept\AtpResolver\Resolvers\WebDidResolver; 8 9 class WebDidResolverTest extends TestCase 10 {