@ beaugmented/ s3- sandbox (英语)
本地S3兼容服务器,用于开发和孤立测试,来源于 S3rver 软件要求节点26.11.1和无害环境管理.
这个叉子由 增加数。请报告问题并请求支持 此寄存器。 。 。 .
安装和运行
pnpm add -D @beaugmented/s3-sandbox
pnpm exec s3-sandbox --directory ./s3-data --address 127.0.0.1 --port 4568
pnpm exec s3-sandbox --help
CLI 在需要时创建数据目录. --configure-bucket <name> [configs...] 预配置带有可选 XML 文件并可以重复的桶. --key 财务报告和审定财务报表 --cert 启用 TLS. --no-vhost-buckets 禁用桶主机名 .
程序化 API
import { mkdtempSync, rmSync } from "node:fs"
import { tmpdir } from "node:os"
import path from "node:path"
import S3Sandbox from "@beaugmented/s3-sandbox"
const directory = mkdtempSync(path.join(tmpdir(), "s3-test-"))
const sandbox = new S3Sandbox({
directory,
address: "127.0.0.1",
port: 0,
silent: true,
configureBuckets: [{ name: "test-bucket" }],
})
try {
const { port } = await sandbox.run()
// Use http://127.0.0.1:${port} as the client's endpoint.
} finally {
await sandbox.close()
rmSync(directory, { recursive: true, force: true })
}
为程序实例使用一个专用的现有目录。 端口 0 选择可用的端口; run() 决定收听地址。 在测试清理中关闭服务器 。 除非 resetOnClose 已启用.
| 选项 | 默认 | 含义 |
|---|---|---|
directory | OS 临时目录 + s3-sandbox | 文件系统存储根 . |
address | localhost | 主机或IP绑定. |
port | 4568 | HTTP 端口; 0 选择可用的端口. |
silent | false | 禁止请求日志. |
key, (中文(简体) ), cert, (中文(简体) ), pfx | 未设定 | 节点 HTTPS 服务器选项 . |
serviceEndpoint | amazonaws.com | 虚拟主机的服务主机名后缀. |
vhostBuckets | true | 识别主机名中的桶名 . |
resetOnClose | false | 删除服务器关闭时的所有桶数据 . |
allowMismatchedSignatures | false | 接受有不匹配签名的完善请求 . |
configureBuckets | [] | Bucket名和可选的生 XML 字符串或缓冲. |
run(callback) 财务报告和审定财务报表 close(callback) 保留回调表并返回实例. callback() 及其别名 getMiddleware() 返回一个适合 http.createServer()调用 configureBuckets() 在直接安装处理器之前. reset() 清除存储的桶数据.
服务器内部使用Hono并扩展了节点 EventEmitter. 它的公用API是S3沙盒生命周期和事件API;HTTP框架继承和上下文定制不支持.
在霍诺上山
getHonoMiddleware() 将沙盒装入Hono应用程序中 由它的节点适配器提供 穿过路线中使用的同一种挂载路径, 不带后行斜线; 挂起根时省略它 。 适配器提供S3签名和流上传所需的原始节点请求.
import { Hono } from "hono"
import { serve, type HttpBindings } from "@hono/node-server"
await sandbox.configureBuckets()
const app = new Hono<{ Bindings: HttpBindings }>()
app.use("/s3/*", sandbox.getHonoMiddleware("/s3"))
const server = serve({
fetch: app.fetch,
port: 4568,
overrideGlobalObjects: false,
})
// Use http://localhost:4568/s3 as the S3 client's endpoint.
// Close the host server during cleanup; sandbox.run() was not called.
await new Promise<void>((resolve, reject) =>
server.close((error) => (error ? reject(error) : resolve())),
)
AWS SDK v3 (英语)
使用 S3RVER 用于签名密钥和启用路径式访问 :
import { S3Client } from "@aws-sdk/client-s3"
const client = new S3Client({
endpoint: "http://127.0.0.1:4568",
region: "us-east-1",
forcePathStyle: true,
credentials: { accessKeyId: "S3RVER", secretAccessKey: "S3RVER" },
requestChecksumCalculation: "WHEN_REQUIRED",
responseChecksumValidation: "WHEN_REQUIRED",
})
校验和设置选择了沙盒目前执行的S3行为. 目前SDK v3请求和遗留的SDK v2客户合同进行测试.
支助行动
- Buckets:创建,删除,列表,对象列表中包含前缀,划界符,标记和续作符,位置查询,以及CORS/website配置.
- 对象:PUT,多部分形式 POST,GET,HEAD,复制,单批删除,标记,元数据,字节范围,以及假ACL响应.
- 多段上传:启动,上传/复制部分,并完成.
- 认证:签名版本2和4, 预先签名的URL, 并签名块上传.
- 网站:索引/错误文档,重定向,路由规则,以及虚拟主机请求.
这是S3部分执行,目的是在当地进行开发和测试。 不支持的操作返回 S3 形状的错误 .
对象读取支持单字节范围,包括 bytes=0-0后缀区域,例如: bytes=-10。超出对象大小的尾部和后缀长度被夹到可用的字节上。 对空对象返回的不满意范围和范围 416 InvalidRange; 变形和多范围头被忽略.
对于多部分 POST 上传, 提交 key,元数据,以及响应控制字段 file 页:1 即使该部分没有文件名,也要存储文件内容流 。 服务器存储了第一个文件并忽略了后来的形式字段.
Bucket 配置和网站
通过套件导出解析捆绑的 XML 示例 :
import { readFileSync } from "node:fs"
import S3Sandbox from "@beaugmented/s3-sandbox"
const cors = new URL(
import.meta.resolve("@beaugmented/s3-sandbox/example/cors.xml"),
)
const website = new URL(
import.meta.resolve("@beaugmented/s3-sandbox/example/website.xml"),
)
const sandbox = new S3Sandbox({
directory: "./s3-data",
configureBuckets: [
{
name: "site.local",
configs: [readFileSync(cors), readFileSync(website)],
},
],
})
网站请求可以使用桶路径, 如 http://localhost:4568/site.local/。用于 http://site.local:4568/,解决 site.local 改为 127.0.0.1 当地。 上传的索引文档必须匹配桶的网站配置.
参见 AWS 示例 (简体中文) 财务报告和审定财务报表 网站配置。 。 。 .
活动
执行对象操作前订阅 :
sandbox.on("event", (event) => {
console.log(event.Records[0].eventName)
})
PUT、POST、COPY和DELETE 操作在 S3事件结构。 。 。 .
许可证和归属
此分叉根据 MPL - 2.0 导弹杰米·霍尔是 S3rver 软件,是该项目的基础. 通知 识别继承的材料及其原件 麻省理工学院通知。保存上游文件系统后缀.
被吸收的多部分执行也保留了Brian White的 麻省理工学院通知。 。 。 .