【免费下载链接】emulateLocal API emulation for CI and no-network sandboxes项目地址https://gitcode.com/gh_mirrors/emul/emulate点击查看免费下载emulate 是一款面向 CI 和无网络沙箱的本地 API 模拟API Emulation工具用「一个核心 Store 插件系统」的架构在本地启动 14 个高保真的服务模拟器GitHub、Stripe、Slack、Google、AWS、Vercel 等状态完全保留在内存中无需数据库、无需外网。本文将深入它的源码拆解这套架构为什么能如此轻量地撑起 14 个服务。为什么需要「一核多插件」的 API 模拟器架构传统做法是为每个外部服务写一个 Mock——但 Mock 是无状态的「应答机」你创建一个 Issue它不会真的改变仓库状态你发起一次 Stripe 支付Webhook 不会按真实时序触发。emulate 的口号是 Fully stateful, production-fidelity API emulation. Not mocks.README.md。要做到这一点每个模拟器都需要一套有状态的数据层创建、更新、删除都要持久在内存里并影响后续请求一套认证、限流、错误处理机制各服务的 401/404 格式还不一样一套Webhook 真实投递能力GitHub App 安装后push 事件要真的发到你注册的 URL如果 14 个服务各自实现一遍代码量和维护成本会爆炸。emulate 的答案是把「共性」全部沉到 core 包里每个服务只写「个性」。仓库结构一眼看懂 monorepo 分层官方架构文档apps/web/app/docs/architecture/page.mdx给出了一张清晰的地图packages/ emulate/ # CLI 入口npx emulate emulators/ core/ # HTTP 服务器、内存 Store、插件接口、中间件 adapter-next/ # Next.js App Router 集成 adapter-nuxt/ # Nuxt 服务端路由集成 vercel/ # Vercel API 服务 github/ # GitHub API 服务 google/ # Google OAuth 2.0 / OIDC Gmail、Calendar、Drive slack/ # Slack Web API、OAuth v2、incoming webhooks ...共 14 个服务插件一句话总结core是地基emulate是门面CLI其余 14 个包是即插即用的插件两个 adapter 包负责把插件塞进 Next.js / Nuxt 应用。核心 Store通用内存数据层整套架构的「核」是 store.ts 里的StoreCollectionTCollection 定义见 L63-L219。它本质上是一个带类型的安全内存数据库自动 CRUD每个Entity自动拥有id、created_at、updated_at插入即建索引更新自动维护索引字段索引构造时声明indexFieldsfindBy(email, ...)走索引 O(1) 查找没索引则退化为全量过滤内置分页query()直接返回PaginatedResulttotal_count、has_next、has_prev各服务的列表接口几乎零成本快照与恢复snapshot()/restore()可以把整个 Store 序列化成纯 JSONMap/Set也会被标记化转换这是reset()和持久化的基础。以 Stripe 模拟器为例stripe/src/index.tsseed 数据就是直接往 Store 里插客户记录上图来自 examples/stripe-checkout 示例商品、价格、客户全部由 Store 中的记录驱动checkout 页面是模拟器用共享 UI 渲染出来的真实 HTML 页面。而持久化则由可插拔的 persistence.ts 承接任何实现了load()/save()的对象都能当适配器内置文件适配器用临时文件 rename保证原子写状态在冷启动时加载、每次变更后落盘。插件接口一个模拟器只需要两个方法plugin.ts 定义了全仓库最重要的接口短到可以背下来export interface ServicePlugin { name: string; register(app, store, webhooks, baseUrl, tokenMap?): void; // 注册路由 seed?(store, baseUrl): void; // 填充初始状态可选 }register拿到共享的 Hono 路由应用、Store、Webhook 分发器后把自己的路由挂上去。GitHub 模拟器在 index.ts 里就挂了近 20 组路由users、repos、issues、pulls、webhooks、search……seed启动时写入默认数据保证零配置也能跑。所有「横切关注点」——CORS、Bearer Token 认证、统一错误格式、每 Token 每小时 5000 次的限流——都由 core 统一注入插件里一行都不用写。Server 组装从插件到完整服务只差一次调用server.ts 的createServer(plugin, options)展示了组装过程顺序非常讲究创建Hono应用、Store、WebhookDispatcher挂全局中间件CORS → 错误处理 →auth 中间件把配置里的 token 映射成用户与 scope→ 限流计数器调用plugin.register(...)插件开始「接管」路由兜底 404带documentation_url模拟真实服务的报错风格。Webhook 是另一处点睛之笔webhooks.ts 的WebhookDispatcher默认用 GitHub 的X-Hub-Signature-256签名头而 Stripe 插件只需一行webhooks.setHeaderFactory(stripeWebhookHeaders)stripe/src/index.ts#L144就切换成Stripe-Signature签名——签名算法的差异被设计成一个可替换的工厂函数这正是插件系统的精髓。14 个模拟器如何被注册与启动CLI 侧的 registry.ts 维护着 14 个服务的注册表vercel、github、google、slack、apple、microsoft、okta、aws、resend、stripe、mongoatlas、clerk、linear、twilio。每个条目包含load()动态import对应的emulators/*包按需加载只启动--service github时不会加载其他 13 个包defaultFallback无 token 配置时自动选一个「当前用户」零配置开箱即用initConfignpx emulate init时生成的种子配置模板。端口则从基准端口默认 4000自动递增分配14 个服务各占一个端口互不干扰。插件系统的第三类玩家自定义 API这套架构最妙的一点是插件接口对用户代码同样开放。通过 custom.ts 里的defineEmulator你可以声明自己的state()工厂和setup()路由得到一个与内置服务待遇完全一致的模拟器——同样的 reset/snapshot/restore 生命周期、同样的 Inspector 检查页、同样的持久化适配器且能同时跑在 CLI、进程内测试和 Next.js/Nuxt 适配器里完整示例见 examples/custom-api。框架集成则由两个薄薄的 adapter 完成adapter-next 和 adapter-nuxt它们把createServer的产物包成框架路由 handler让模拟器「寄生」在你的应用里而不是独立进程。架构要点速览新手必读清单设计决策好处Store 与具体服务解耦14 个服务共享同一套 CRUD/索引/分页/快照代码ServicePlugin仅两个方法新增一个模拟器的成本 写路由 写 seedWebhook 签名做成 Header 工厂GitHub/Stripe/Slack 各自签名互不污染限流、认证、CORS 全部在 core插件作者零心智负担registry 动态 importCLI 按需加载启动快内存态 快照恢复CI 中秒级 reset天然可重放如果你想继续深入推荐这条源码阅读路线packages/emulators/core/README.md核心包总览packages/emulators/core/src/store.ts数据层packages/emulators/core/src/plugin.ts插件契约18 行全文最短packages/emulators/core/src/server.ts组装流程packages/emulators/stripe/src/index.ts一个「小而完整」的插件样本packages/emulate/src/registry.tsCLI 如何发现并启动 14 个服务结语emulate 的架构哲学可以浓缩成一句话把「模拟一个 API 需要的一切共性」提炼成 core把「这个 API 长什么样」留给插件。一个 287 行的 Store、18 行的插件接口、105 行的 Server 组装器撑起了 14 个生产级保真度的本地模拟器——这正是好的插件系统该有的样子新增第 15 个服务时你不需要读懂前 14 个只需要实现register和seed两个方法。赞分享【免费下载链接】emulateLocal API emulation for CI and no-network sandboxes项目地址https://gitcode.com/gh_mirrors/emul/emulate点击查看免费下载相关推荐Notesnook monorepo架构深度剖析13个核心包如何撑起四端统一的加密笔记应用Notesnook monorepo架构深度剖析13个核心包如何撑起四端统一的加密笔记应用 Notesnook 是一款完全开源、端到端加密的笔记应用Ever前端移动开发桌面应用应用安全Ollama App本地部署指南安全高效运行AI模型的终极方案Ollama App本地部署指南安全高效运行AI模型的终极方案 Ollama App是一款现代且易用的Ollama客户端让你在保持所有数据隐私和本地网络环境AI 应用人工智能大模型操作系统原理深度剖析进程、内存与文件系统如何撑起 easy-vibe 的每一个程序操作系统原理深度剖析进程、内存与文件系统如何撑起 easy vibe 的每一个程序 在 easy vibeDatawhale 的开源项目制学习项目的附录课教程文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考