@crvouga/mockingbird-service-vercel-blob (英语)
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
A 类 阴道 便携式 Vercel Blob 模拟器用未修改的 @vercel/blob 2.8.0 (中文(简体) ) SDK(英语:SDK).
Blobs,多段上传,待取部件和合成下载赠款使用SQLite Collections,,
共享时钟、命名空间和时间线。 Fixtures只包含合成数据.
安装
bun add @crvouga/mockingbird-service-vercel-blob
使用量
该示例使用 @vercel/[email protected]它是一种可选的消费者依赖,而不是运行时间
模拟器的依赖性 .
import { del, put } from "@vercel/blob"
import { createServer } from "@crvouga/mockingbird-service-vercel-blob/server"
import { DEFAULT_TOKEN } from "@crvouga/mockingbird-service-vercel-blob"
// Test setup: the emulator, and the two variables the Blob SDK reads.
const server = await createServer()
process.env.VERCEL_BLOB_API_URL = `${server.url}/api/blob`
process.env.BLOB_READ_WRITE_TOKEN = DEFAULT_TOKEN
// The app's own Blob calls, unchanged.
const blob = await put("fixture.txt", "fixture bytes", { access: "public", addRandomSuffix: false })
console.log(await (await fetch(blob.url)).text()) // "fixture bytes"
await del(blob.url)
await server.close()
SDK的支持端点覆盖是 VERCEL_BLOB_API_URL (或
NEXT_PUBLIC_VERCEL_BLOB_API_URL) (中文(简体) ). 申请 BLOB_STORE_BASE_URL 必须为此绘制地图
SDK被应用程序所覆盖. 对于命名空间 suite,使用时
${server.url}/__admin/ns/suite/api/blob,一个 x-mockingbird-namespace: suite 页眉,或注册
固定符号 PUT /__admin/credentials。除非
fixtures: [{ pathname, bytes: string | number[], contentType?, cacheControlMaxAge?, storeId? }]
提供. tokens 映射用于存储 ID 的合成接线符; 默认值 DEFAULT_TOKEN
(单位:千美元)vercel_blob_rw_fixture_fixture地图到 fixture。无效或缺失的令牌返回供应商
403 { error: { code: "forbidden", message: "Access denied" } }。 。 。 .
SDK接受字符串,缓冲, Blob 和流. 其多段帮助者不接受原始
Uint8Array 键入 PutBody把它包入Blob或缓冲器 模拟器的 HTTP 上传处理器
保存生质 Uint8Array 请求正文以及字符串和任意二进制字节.
路线和行为
| 运行 | SDK线端点 | 行为 |
|---|---|---|
| 点球 | PUT /api/blob/?pathname=… | Raw 字节; 公共访问、 内容类型、 缓存 TTL、 可选随机后缀、 覆盖和ETag 先决条件 |
| 读取 BlobStore | GET /api/blob?url=… | head() 元数据、大小、ETag和上传时间戳 |
| 读取 BlobStore | GET /api/blob?prefix=…&limit=…&cursor=…&mode=… | list() 使用词典路径名排序并扩展/文件夹 |
| 复制块 | PUT /api/blob?pathname=…&fromUrl=… | 同存储副本; 目标内容类型独立推断, 除非提供 |
| 删除块 | POST /api/blob/delete | { urls: [...] }; 接受自己返回的 URL 或路径名; 缺失的 blobs 被忽略 |
| 多段卸载 | POST /api/blob/mpu?pathname=… | x-mpu-action: create/upload/complete, SDK 密钥/上载ID/部分编号头 |
| 下载 Blob / 下载 | GET /__admin/blobs/{id} 编号 : HEAD | 合成公共字节传输; 精确字节, ETag, Content-Length/ Type, 缓存和下载处理 |
put() 财务报告和审定财务报表 copy() 返回时 { pathname, url, downloadUrl, contentType, contentDisposition, etag }。 。 。 .
上传回复确实如此 没有 包含大小; head() 并列出元数据。 复制
不覆盖返回供应商的路径名 400 bad_request 并保留现有的字节.
从原子角度覆盖对象并保留其URL。 有条件的写入/删除使用
x-if-match 返回时 412 precondition_failed ; 复制检查其 来源 ETAG (英语).
删除在删除之前验证所有先决条件。 没有供应商要求识别的复制
被发明: 正常的重复路径规则适用于重复点. ETags使用SHA-256,如Vercel的
已公布的模拟器;时间戳使用被注入的时钟。 默认缓存TTL为2,592,000秒.
缓存默认值为1,000个对象,按路径名排序(所以) file10 首页 file2)并发出
hasMore 仅当另一个页面存在时,加光标。 模拟光标使用最后一个路径名, 如下
Vercel的模拟器;他们的编码并不是对生产不透明的光标格式的声称. 折叠
模式返回与 blob 条目分开的即时文件夹.
多段串接从不发布部分对象 。 重新加载一个部分编号替换
待定部分。 完成 验证 ETags 、 递增的独特数字、 总大小和
记录除最后部分外所有部分的最低5个小米B/等大小,然后以解剖法发布.
相同的完成重放返回已有的上传结果 . maxBlobBytes 默认为
20 MiB并可以配置:这是明确的本地资源约束,而不是生产配额.
公共 URL 使用配置 publicOrigin 或上传请求的来源。 它们包含
在保留内字节运输树内明确命名空间查询和点。 他们
通过平面工作 fetch 超过服务听众或进程 emulator.fetch。带有习惯
adminPrefix,字节 URL 和每个控制路径一起迁移。 时间线分支呼叫器
还必须前进 x-mockingbird-branch 当获取其公共 URL 时。 有条件的公众读取
支助 If-None-Match / 304 (中文(简体) ). 这个本地的 URL 传输是一个站入,而不是一个Vercel CDN 主机名.
SDK的车 get() 验证生产主机名, 所以使用纯度 fetch 用于本地下载.
控制和失败
所有服务控制都住在共享的旁边 /__admin/health, (中文(简体) ), /__admin/state, (中文(简体) ), /__admin/clock, (中文(简体) ),
/__admin/reset, (中文(简体) ), /__admin/requests故障引擎和时间线控制. adminKey 使用该
共享 x-mockingbird-admin-key 配置时守护 。 日记记录元数据并触摸
身份证 永远不要上传尸体.
| 控制权 | 目的 |
|---|---|
GET /__admin/store/blobs | Blob 元数据, 不包括字节 |
POST /__admin/store/blobs | 种子 { pathname, bytes: string | number[], contentType?, cacheControlMaxAge?, storeId? } |
GET /__admin/store/blobs/:id/bytes | 明确固定字节已读 |
GET /__admin/store/uploads | 等待/完成上传和部分元数据,不包括字节 |
POST /__admin/store/origin | 设定 { origin } 用于随后的上传和固定种子 |
POST /__admin/store/downloads | 创建合成 { blobId, expiresInMs } 下载赠款 |
POST /__admin/store/downloads/:id/expire | 立即终止赠款 |
合成赠与 URL 在共享时钟上过期并过期后返回 403; 普通公共
URL仍然公开. 这些控制不模拟生产签名协议. 预设 :
conflict, (中文(简体) ), rate_limited (429 / 重试- 之后), truncated_upload, (中文(简体) ), partial_multipart, (中文(简体) ),
server_error 财务报告和审定财务报表 network_reset每起火灾一次 启动 partial_multipart 创建后
上传,然后发送该部分失败;以前的部分仍然可供重试.
API 密码
便携式根导出 VercelBlobAPI, (中文(简体) ), createRuntime, (中文(简体) ), document, (中文(简体) ), supportedOperationIds, (中文(简体) ),
VERCEL_BLOB_NAMESPACE, (中文(简体) ), VERCEL_BLOB_PRESETS, (中文(简体) ), DEFAULT_TOKEN, (中文(简体) ), DEFAULT_STORE_ID 财务报告和审定财务报表
DEFAULT_CACHE_MAX_AGE,加上固定/记录/上载/赠款/运行时间选项类型.
VercelBlobAPI 曝光情况 fetch, (中文(简体) ), reset, (中文(简体) ), state, (中文(简体) ), metadata, (中文(简体) ), seed, (中文(简体) ), ensureSeeded, (中文(简体) ), app 财务报告和审定财务报表
sqlite。 。 。 . createRuntime 添加共享的 MockSurface 时钟、 故障引擎、 日记、 证书
注册、状态、命名空间和时间线控制。 节点 ./server 进口
createServer, (中文(简体) ), DEFAULT_PORT (8812个), serveTarget 和服务器类型; mockingbird-vercel-blob serve 开始一个听众.
甲骨文和核查
合同如下 Vercel的 SDK 文档, (中文(简体) ), 已发表 官方SDK 2.8.0,以及 Vercel的官方模拟器 Blob 路线在 e4cd051。 。 。 . 模拟器提供有线/有线/有线/清单的证据;它明确提供 没有 执行多部分, 和SDK文件的多部分规则.
bun test 运行 SDK, 二进制接受, 所有对等的 JSON 操作行走, 一个差异
实例检查、命名空间/重置/时钟/时间线和目录预设测试。 完成的SDK测试
put → public GET → overwrite → del 和手动/自动多部分 对抗这个包,
不修改 SDK 或联系Vercel。 双部分接受验证失败部分
将较早的部件保存完好,只有经过验证的完成才能显示对象.
bun run parity 凉了
只读 : VERCEL_BLOB_API_URL 财务报告和审定财务报表 VERCEL_BLOB_READ_WRITE_TOKEN 必须指定一个空测试
存储。 缺少证书或无法空入/无法进入的商店2号出入口,从没有通过现场直播的结果.
故意不模拟
私人商店及其授权,客户端上传签名,生产CDN/域名
路线, SDK get() 生产 - 主机验证绕行,范围请求,图像优化,
供应商配额、跨储存副本、真实的账单和仪表板、不透明的生产光标
编码和无文件请求ID分解没有模型化. 赠款是合成的
时钟控制。 此软件包在正常操作中永远不会联系Vercel; 只有明确
认证的、只读的等同命令就是这样做的.