{"_id":"@b9g/filesystem-s3","_rev":"10-4195f5a3fd98b5d4926a362aa5734d93","name":"@b9g/filesystem-s3","dist-tags":{"beta":"0.1.5","latest":"0.2.0"},"versions":{"0.1.0":{"name":"@b9g/filesystem-s3","version":"0.1.0","keywords":["filesystem","s3","aws","storage","web-standards"],"_id":"@b9g/filesystem-s3@0.1.0","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"28400a9a7403cc8f9a9a6d913e2fdd4e0c0f484b","tarball":"https://registry.npmjs.org/@b9g/filesystem-s3/-/filesystem-s3-0.1.0.tgz","fileCount":3,"integrity":"sha512-IlqisDReOxoPtN9FsMKzYQQ6QuC0HiIFvZjfYxs8qim6gxmjO0fewhka8S/5mLq4Ds54f0oFY0JAMheoE5+wTw==","signatures":[{"sig":"MEQCIHjPL/ql+7wHs/0oh8Ao0UEis7vTMX1ErMv/lFTy/Kd5AiAUAkoOUZAc61mxYX79spYY4+U07i5rzuUUYK+XXOfGlw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13266},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"b9a9824db1a7ec3944c71d7babdb42bbdba17c3e","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.4.2","description":"AWS S3 implementation of File System Access API","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@b9g/filesystem":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.10"},"peerDependencies":{"@aws-sdk/client-s3":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-s3_0.1.0_1762136217495_0.33909037653915286","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@b9g/filesystem-s3","version":"0.1.1","keywords":["filesystem","s3","aws","storage","web-standards"],"_id":"@b9g/filesystem-s3@0.1.1","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"3b4abc46e724d70b011cd4051b5b67b7368d177d","tarball":"https://registry.npmjs.org/@b9g/filesystem-s3/-/filesystem-s3-0.1.1.tgz","fileCount":3,"integrity":"sha512-bPfSMD9BmaVtkMUFe2vku7Te2tTqPDFHi+lhGBjp6pWeRN2LONTBZy08U65fYPcg+8+y1C0XQifroPBS5kX9xg==","signatures":[{"sig":"MEUCIQCl15PAYqLuZch3j6ZWx7DyD4lOmuzLw+aU2EHkSxEwMwIgPWluKWrB0WZnhO+j/59OMwNrZsJ4BsDNjjkyhc1WCXg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13261},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"b9a9824db1a7ec3944c71d7babdb42bbdba17c3e","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.4.2","description":"AWS S3 implementation of File System Access API","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@b9g/filesystem":"^0.1.1"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.10"},"peerDependencies":{"@aws-sdk/client-s3":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-s3_0.1.1_1762137224516_0.34133923911122155","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@b9g/filesystem-s3","version":"0.1.3","keywords":["filesystem","s3","aws","storage","web-standards"],"_id":"@b9g/filesystem-s3@0.1.3","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"04e5ab4a6398b562f3970c6fe66f72c2e0fe3e34","tarball":"https://registry.npmjs.org/@b9g/filesystem-s3/-/filesystem-s3-0.1.3.tgz","fileCount":3,"integrity":"sha512-nY6VJ4iOjnN8s5onNyl26kfEMhv4AGVx+NnYfdxcuoDHkp0pStQ3KhtXR7yrhQ5asEUMt90FO/9PgbinhZW/OQ==","signatures":[{"sig":"MEUCIAPeF8RM/J7xkVwLwIjCOLc9BJOQWLXiE57YemelH4XeAiEAptOKRq4+EZGFkV2QIv+QYLyjHSrah7BfTkdHE44te7Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13261},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"bca46fb3116607c17e95fbd1a1944a4fd86c30f0","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.4.2","description":"AWS S3 implementation of File System Access API","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@b9g/filesystem":"^0.1.4"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.11"},"peerDependencies":{"@aws-sdk/client-s3":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-s3_0.1.3_1762726214605_0.9805275801700153","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@b9g/filesystem-s3","version":"0.1.4","keywords":["filesystem","s3","aws","storage","web-standards"],"_id":"@b9g/filesystem-s3@0.1.4","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"f55722cd20b01ed6d23373a62f090bf584bd4fd9","tarball":"https://registry.npmjs.org/@b9g/filesystem-s3/-/filesystem-s3-0.1.4.tgz","fileCount":4,"integrity":"sha512-D0ZAbBHhtV4q/YEhMWXvyWtBPY8fxKTS8zff8hOepAOrmuQyHkOlsIUpxkfYXdMy1GG7mCJul/QQoZXDxkwJew==","signatures":[{"sig":"MEUCIQDvVlaJMVa/Wgk5h9XFN4YEZgJbQN9sWrvuoN4ecfIksAIgQ1Eh0VqOdqwzm6gipvxjUG3OF9xsa8txSuULQF+pkl8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16097},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"d569dd6e62bdf4e603e4ab65382538503b68ed22","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.6.2","description":"AWS S3 implementation of File System Access API","directories":{},"_nodeVersion":"25.1.0","dependencies":{"@b9g/filesystem":"^0.1.5"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.11"},"peerDependencies":{"@aws-sdk/client-s3":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-s3_0.1.4_1764127030328_0.9520191543675018","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@b9g/filesystem-s3","version":"0.1.5","keywords":["filesystem","s3","aws","storage","web-standards"],"_id":"@b9g/filesystem-s3@0.1.5","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"bf97db3c8ec5cf34d4e18ed87bbc733960d95f69","tarball":"https://registry.npmjs.org/@b9g/filesystem-s3/-/filesystem-s3-0.1.5.tgz","fileCount":4,"integrity":"sha512-CL4Nj5Ev+XPJzXSln2+0S6U0fDvOH6jsjKTuRMrZrkWljlWSyESWBr9o+8uiSrdkX3dzOn9Lh1xhPoVhVUJh1A==","signatures":[{"sig":"MEUCIQDdITTRUUU7TRQxd9JnDTrHqtMOYjOZp4tq2+XiPJw9rQIgf2g0AGn1YOBCtXQylCP8kFHfd841hyeJd8+7I6/Yzok=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15715},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"0c2b98fdeac945781a8c333eedc3fd5fb69c6e52","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.6.2","description":"AWS S3 implementation of File System Access API","directories":{},"_nodeVersion":"25.1.0","dependencies":{"@b9g/filesystem":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.11"},"peerDependencies":{"@aws-sdk/client-s3":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-s3_0.1.5_1764528783967_0.7107920145091382","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@b9g/filesystem-s3","version":"0.1.6","keywords":["filesystem","s3","aws","storage","web-standards"],"_id":"@b9g/filesystem-s3@0.1.6","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"d5d8dea870c7a085e3ccf6f740628934c3038efd","tarball":"https://registry.npmjs.org/@b9g/filesystem-s3/-/filesystem-s3-0.1.6.tgz","fileCount":4,"integrity":"sha512-BiskJhFRu945ixSf0wjpzufd5LBJNTjcQ6P9C9f5/mSzgsrBRJrhEmkV1Di/NSqvYqMf/NscoukbRcMwRQ43ig==","signatures":[{"sig":"MEUCIQCNGgOZrs1nwt0eWhfyrprDX8a3b8T/XZyCA618AOC7bAIgQlHm4WCkQQ+U2A4w4JvXEDuFakTgtUnTio4d4fkQ2f0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15737},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"675ed6b5d90286c351d37ce927ce309f426b2951","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.6.2","description":"AWS S3 implementation of File System Access API","directories":{},"_nodeVersion":"25.1.0","dependencies":{"mime":"^4.0.4","@b9g/filesystem":"^0.1.7"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.18"},"peerDependencies":{"@aws-sdk/client-s3":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-s3_0.1.6_1764712734853_0.6468837426936436","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@b9g/filesystem-s3","version":"0.1.7","keywords":["filesystem","s3","aws","storage","web-standards"],"_id":"@b9g/filesystem-s3@0.1.7","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"homepage":"https://github.com/bikeshaving/shovel#readme","bugs":{"url":"https://github.com/bikeshaving/shovel/issues"},"dist":{"shasum":"47439fe1b9bf9633c56395c122a00fdad34a0e6b","tarball":"https://registry.npmjs.org/@b9g/filesystem-s3/-/filesystem-s3-0.1.7.tgz","fileCount":4,"integrity":"sha512-l32P/Lcs6Y8Hl2XSuEl7XfuBw10iKpLNCyngJ9+HLpNzQ8f4qh6P/ogemeYvh8+OOUFWbamzsl0i7N25wr/EHw==","signatures":[{"sig":"MEQCIATAYZ05OhCleQpwKeNSRYbmHdYirWQbH+dLNi/4xCPoAiBU/ONMJoD020sPDwg/Hmbl1r5irNvW4izAEg/1vXm00w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15838},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"21088b4a3f5df3ef2440e12c04684e9408f360e9","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"repository":{"url":"git+https://github.com/bikeshaving/shovel.git","type":"git","directory":"packages/filesystem-s3"},"_npmVersion":"11.8.0","description":"AWS S3 implementation of File System Access API","directories":{},"_nodeVersion":"25.5.0","dependencies":{"mime":"^4.0.4","@b9g/filesystem":"^0.1.9"},"_hasShrinkwrap":false,"devDependencies":{"@b9g/libuild":"^0.1.18"},"peerDependencies":{"@aws-sdk/client-s3":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-s3_0.1.7_1770318496016_0.7625051027916754","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@b9g/filesystem-s3","version":"0.1.8","keywords":["filesystem","s3","aws","storage","web-standards"],"_id":"@b9g/filesystem-s3@0.1.8","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"homepage":"https://github.com/bikeshaving/shovel#readme","bugs":{"url":"https://github.com/bikeshaving/shovel/issues"},"dist":{"shasum":"ef1e46c93ceed8d4b93a2d22a323ff63f7a76a7c","tarball":"https://registry.npmjs.org/@b9g/filesystem-s3/-/filesystem-s3-0.1.8.tgz","fileCount":4,"integrity":"sha512-PBOM6+qpS0C8QkN2UKCnOYtbGib3bjdLzuxzd4QFKrPAxo664K9gHE307w96LsgBsBTEaYk/eadFbSiJ2xgWWw==","signatures":[{"sig":"MEUCIDQdOy746dFcvRGkWShpj8cn5o0k8yDCIEt1WNif00zdAiEA+WiEBe6UFmHcUqo2K5TULdMSKrmjjkH6lmXzgOPxYAY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17301},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"ca24b80357c9cb0ef0a0aa2c868e68b7a6684201","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"repository":{"url":"git+https://github.com/bikeshaving/shovel.git","type":"git","directory":"packages/filesystem-s3"},"_npmVersion":"11.8.0","description":"AWS S3 implementation of File System Access API","directories":{},"_nodeVersion":"25.5.0","dependencies":{"mime":"^4.0.4","@b9g/filesystem":"^0.1.11"},"_hasShrinkwrap":false,"devDependencies":{"@b9g/libuild":"^0.1.18"},"peerDependencies":{"@aws-sdk/client-s3":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-s3_0.1.8_1770770204634_0.036517515578775805","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@b9g/filesystem-s3","version":"0.2.0","description":"AWS S3 implementation of File System Access API","keywords":["filesystem","s3","aws","storage","web-standards"],"repository":{"type":"git","url":"git+https://github.com/bikeshaving/shovel.git","directory":"packages/filesystem-s3"},"dependencies":{"@b9g/filesystem":"^0.2.0","mime":"^4.0.4"},"devDependencies":{"@b9g/libuild":"^0.1.18"},"peerDependencies":{"@aws-sdk/client-s3":"^3.0.0"},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json","./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"}},"gitHead":"df01f61383f17d27a82dcf80380b6eb4b4a6857b","_id":"@b9g/filesystem-s3@0.2.0","bugs":{"url":"https://github.com/bikeshaving/shovel/issues"},"homepage":"https://github.com/bikeshaving/shovel#readme","_nodeVersion":"25.5.0","_npmVersion":"11.8.0","dist":{"integrity":"sha512-2/Uj5vxTKn0qICMTiRwxsc9XQJ+VknVe/Zpwf7uAP99aK0S0GVKbI4FUu07Br8zGWC+WG4BYkWjXHw48kuGn3A==","shasum":"3ba9369a79445d0ff9b08a806632e0222b1e5beb","tarball":"https://registry.npmjs.org/@b9g/filesystem-s3/-/filesystem-s3-0.2.0.tgz","fileCount":4,"unpackedSize":17300,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDexzStyrkWYf1xFb4oUL5q+Xsvir0lqjvVBsXX6AMUvQIgAKVE0q2kVrjZF9s17phrjO3/Xpxmg5phZ+0CapAvR4E="}]},"_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"directories":{},"maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/filesystem-s3_0.2.0_1771610900857_0.6030524494677862"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-03T02:16:57.390Z","modified":"2026-02-20T18:08:21.165Z","0.1.0":"2025-11-03T02:16:57.672Z","0.1.1":"2025-11-03T02:33:44.698Z","0.1.3":"2025-11-09T22:10:14.795Z","0.1.4":"2025-11-26T03:17:10.520Z","0.1.5":"2025-11-30T18:53:04.157Z","0.1.6":"2025-12-02T21:58:55.025Z","0.1.7":"2026-02-05T19:08:16.173Z","0.1.8":"2026-02-11T00:36:44.794Z","0.2.0":"2026-02-20T18:08:21.004Z"},"bugs":{"url":"https://github.com/bikeshaving/shovel/issues"},"homepage":"https://github.com/bikeshaving/shovel#readme","keywords":["filesystem","s3","aws","storage","web-standards"],"repository":{"type":"git","url":"git+https://github.com/bikeshaving/shovel.git","directory":"packages/filesystem-s3"},"description":"AWS S3 implementation of File System Access API","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"readme":"# @b9g/filesystem-s3\n\nAWS S3 implementation of the [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_API). Provides standards-compliant file system operations backed by Amazon S3 object storage.\n\n## Features\n\n- Full `FileSystemDirectoryHandle` and `FileSystemFileHandle` implementation\n- Streaming writes via `WritableStream`\n- Directory simulation using S3 key prefixes\n- MIME type detection via the `mime` package\n- Compatible with `@b9g/filesystem` registry for pluggable backends\n- Requires `@aws-sdk/client-s3` v3 as a peer dependency\n\n## Installation\n\n```bash\nnpm install @b9g/filesystem-s3 @aws-sdk/client-s3\n```\n\n## Usage\n\n### Direct Usage\n\n```typescript\nimport {S3Client} from \"@aws-sdk/client-s3\";\nimport {S3FileSystemDirectoryHandle} from \"@b9g/filesystem-s3\";\n\nconst s3 = new S3Client({region: \"us-east-1\"});\nconst root = new S3FileSystemDirectoryHandle(s3, \"my-bucket\", \"\");\n\n// Read a file\nconst fileHandle = await root.getFileHandle(\"config.json\");\nconst file = await fileHandle.getFile();\nconst text = await file.text();\n\n// Write a file\nconst writable = await fileHandle.createWritable();\nawait writable.write(JSON.stringify({updated: true}));\nawait writable.close();\n\n// Create a directory\nconst dir = await root.getDirectoryHandle(\"uploads\", {create: true});\n\n// List entries\nfor await (const [name, handle] of root.entries()) {\n  console.log(name, handle.kind); // \"file\" or \"directory\"\n}\n\n// Delete (recursive for directories)\nawait root.removeEntry(\"uploads\", {recursive: true});\n```\n\n### With Shovel Filesystem Registry\n\n```typescript\nimport {S3FileSystemAdapter} from \"@b9g/filesystem-s3\";\n\n// In shovel.json directories config:\n// { module: \"@b9g/filesystem-s3\", export: \"S3FileSystemAdapter\" }\n```\n\nThe `S3FileSystemAdapter` integrates with Shovel's directory system. Each named directory gets an isolated prefix (`filesystems/{name}`) within the bucket.\n\n## Exports\n\n- **`S3FileSystemDirectoryHandle`** -- `FileSystemDirectoryHandle` backed by S3 key prefixes\n- **`S3FileSystemFileHandle`** -- `FileSystemFileHandle` backed by S3 objects\n- **`S3FileSystemWritableFileStream`** -- `WritableStream` that buffers chunks and uploads on close\n- **`S3FileSystemAdapter`** -- Backend adapter for `@b9g/filesystem` registry\n\n## API\n\n### `new S3FileSystemDirectoryHandle(s3Client, bucket, prefix)`\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `s3Client` | `S3Client` | AWS SDK v3 S3 client |\n| `bucket` | `string` | S3 bucket name |\n| `prefix` | `string` | Key prefix (e.g. `\"uploads/\"` or `\"\"` for root) |\n\nStandard `FileSystemDirectoryHandle` methods: `getFileHandle()`, `getDirectoryHandle()`, `removeEntry()`, `entries()`, `keys()`, `values()`, `isSameEntry()`.\n\n### `new S3FileSystemFileHandle(s3Client, bucket, key)`\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `s3Client` | `S3Client` | AWS SDK v3 S3 client |\n| `bucket` | `string` | S3 bucket name |\n| `key` | `string` | Full S3 object key |\n\nStandard `FileSystemFileHandle` methods: `getFile()`, `createWritable()`, `isSameEntry()`.\n\n### `new S3FileSystemAdapter(s3Client, bucket, config?)`\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `s3Client` | `S3Client` | AWS SDK v3 S3 client |\n| `bucket` | `string` | S3 bucket name |\n| `config` | `FileSystemConfig?` | Optional filesystem config |\n\nMethods: `getFileSystemRoot(name?)`, `getConfig()`, `dispose()`.\n\n## Implementation Notes\n\n- **Directories are simulated** -- S3 has no native directories. Subdirectories use key prefixes, and `getDirectoryHandle({create: true})` creates a `.shovel_directory_marker` object.\n- **Writes are buffered** -- `createWritable()` accumulates all chunks in memory and uploads in a single `PutObjectCommand` on `close()`.\n- **Permissions always granted** -- S3 access is controlled by AWS credentials, so `queryPermission()` / `requestPermission()` always return `\"granted\"`.\n- **`resolve()` not implemented** -- Returns `null` (not meaningful for flat S3 key spaces).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}