@beaugmented/s3-sandbox

中文文档
0.1.2发布于 2026/10/14MPL-2.0TypeScriptES Module构建来源已验证近 30 天下载 2.3万

一个本地的S3兼容服务器,用于孤立的开发和测试

中文使用文档
文档目录8 节
  1. 安装和运行
  2. 程序化 API
  3. 在霍诺上山
  4. AWS SDK v3 (英语)
  5. 支助行动
  6. Bucket 配置和网站
  7. 活动
  8. 许可证和归属

@ 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 已启用.

选项默认含义
directoryOS 临时目录 + s3-sandbox文件系统存储根 .
addresslocalhost主机或IP绑定.
port4568HTTP 端口; 0 选择可用的端口.
silentfalse禁止请求日志.
key, (中文(简体) ), cert, (中文(简体) ), pfx未设定节点 HTTPS 服务器选项 .
serviceEndpointamazonaws.com虚拟主机的服务主机名后缀.
vhostBucketstrue识别主机名中的桶名 .
resetOnClosefalse删除服务器关闭时的所有桶数据 .
allowMismatchedSignaturesfalse接受有不匹配签名的完善请求 .
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的 麻省理工学院通知。 。 。 .

版本与发布记录

@beaugmented/s3-sandbox 共发布 4 个版本,首次发布于 2026/10/14;过去 12 个月发布了 4 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.1.2latest2026/10/1424 天前
0.1.12026/10/1424 天前
0.1.02026/10/1424 天前
0.0.0-stage2026/10/1424 天前

关于 @beaugmented/s3-sandbox 的常见问题

@beaugmented/s3-sandbox 是什么?

一个本地的S3兼容服务器,用于孤立的开发和测试

如何安装 @beaugmented/s3-sandbox?

在项目目录运行 npm install @beaugmented/s3-sandbox,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 s3-sandbox,可以用 npx s3-sandbox 直接运行。

@beaugmented/s3-sandbox 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@beaugmented/s3-sandbox 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@beaugmented/s3-sandbox 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js 26.11.1。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@beaugmented/s3-sandbox 可以商用吗?

@beaugmented/s3-sandbox 使用 MPL-2.0 许可。弱 Copyleft:可以商用,也可以和闭源代码一起使用;但如果分发时修改了 MPL 授权的文件,这些文件的修改需以 MPL 开源。以上为概括,不构成法律意见,请以许可原文为准。

@beaugmented/s3-sandbox 的下载量有多少?

根据 npm 官方下载统计,@beaugmented/s3-sandbox 在 2026/10/08 – 2026/11/06 这 30 天内被下载 23,176 次,日均约 773 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@beaugmented/s3-sandbox 还在维护吗?

最新版本 0.1.2 发布于 2026/10/14(24 天前);至今共发布 4 个版本,其中过去 12 个月发布了 4 个;首次发布于 2026/10/14。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。