@effect-server-utils/cqrs

中文文档
0.1.0-beta.10发布于 2026/10/30MITTypeScriptESM + CJS零依赖构建来源已验证近 30 天下载 4347

已键入 CQRS for Effect: 命令并查询有每条消息成功和出错类型的总线, 由订阅者选择其一致性模式的事件总线, 以及处理管理器

中文使用文档
文档目录6 节
  1. 你得到的东西
  2. 宣布和发出命令
  3. 活动
  4. 测试助手
  5. 文档
  6. 许可证

@ effect- server- utils/ cqrs

输入的 CQRS 用于 效果: 命令和查询公交车,每条消息都成功 出错类型,是一种由订阅者选择其一致性模型的事件总线,以及处理管理器.

pnpm add @effect-server-utils/cqrs effect

effect 是同级依赖.

你得到的东西

  • Command 编号 : Query - 发布一次信息,说明其有效载荷计划、成功类型和 失败类型 。 返回错误事物的处理器不编译, 和呼叫器读两个 从定义上而不是从总线上走 二个是分开的外观 将查询组拒绝给一个预期命令组—— CQRS 区分 以类型表示.
  • CommandBus 编号 : QueryBus ——全应用的调度表面. bus.execute(Command, payload) 从您通过的定义中读取其签名, 因此没有命令声明的侧表 可以飘来飘去.
  • DispatchTable ——将每个模块的调度器折叠到一个表格中一个公共汽车路线通过. 这个 一张表格可能错误的三种方式(DuplicateDispatchTag, (中文(简体) ), UnroutableTags, (中文(简体) ), MissingHandler旅费 作为被标记的缺陷,所以启动检查可以匹配条件而不是解析消息字符串.
  • EventBus - 1辆公共汽车,3个交货合同,选择地点: 订阅 而不是在派遣. subscribe 运行在出版商的纤维里,并可以将其卷回; subscribeAfterCommit 运行一次 出版商的边界已在其自己的边界内完成,永远无法; stream 输入相机 绝不等待, 制片人只说出了点事 所以一个事件可以为消费者服务 需要不同的东西.
  • DeferralSink - 决定什么的可选接缝 subscribeAfterCommit 等着 这个 软件包不知道交易是什么:安装 @effect-server-utils/unit-of-work 承诺后意味着承诺后;不安装任何设备,这些操作员在每台设备结束时运行 发送。 汉德勒的书写方式都一样.
  • Saga 一个过程管理者处理推迟的事件,因为没有单一的事件决定.
  • Middleware - 行为在每次发送时都适用一次. Middleware.span 由 默认; metrics() 财务报告和审定财务报表 deadline() 选择进入。 中间软件可能不会改变消息的成功或者 出错通道,也就是让公交车有一个接合而不会削弱呼叫者的类型.
  • UnhandledFailures ——当没有来电者接收时,失败就会发生.

宣布和发出命令

import * as Effect from "effect/Effect";
import * as Schema from "effect/Schema";
import { Command, CommandBus } from "@effect-server-utils/cqrs";

class OrderNotFound extends Schema.TaggedError<OrderNotFound>()("OrderNotFound", {
  orderId: Schema.String,
}) {}

const PlaceOrder = Command.make("PlaceOrder", {
  payload: { orderId: Schema.String },
  success: Schema.String,
  failure: OrderNotFound,
});

// A module groups the tags it owns and implements them in one place. Whatever
// services the handlers need become the Layer's requirements.
const Orders = Command.group(PlaceOrder);

export const OrdersHandlers = Command.handlersOf(Orders, {
  PlaceOrder: (payload) => Effect.succeed(`placed:${payload.orderId}`),
});

// At a call site, the channels come from the definition — not from the bus.
const program = Effect.gen(function* () {
  const bus = yield* CommandBus;
  const receipt = yield* bus.execute(PlaceOrder, { orderId: "ord_1" });
  return receipt;
}).pipe(Effect.catchTag("OrderNotFound", (e) => Effect.succeed(`missing:${e.orderId}`)));

在组成根部,每个模块的调度表面被合并到表格中 巴士路线 通过:

import { makeCommandBus, mergeDispatchTables } from "@effect-server-utils/cqrs";

const table = mergeDispatchTables(ordersDispatcher, billingDispatcher);
const bus = makeCommandBus(table, { declaredIn: [Orders, Billing] });

活动

import { Event } from "@effect-server-utils/cqrs";

const OrderPlaced = Event.make("OrderPlaced", { orderId: Schema.String });

const subscriptions = Effect.gen(function* () {
  const bus = yield* EventBus;

  // Part of the same logical operation: its failure rolls the publisher back.
  yield* bus.subscribe(OrderPlaced, (event) => inventory.reserve(event.orderId));

  // A reaction to work that is already durable: isolated, retried on its own.
  yield* bus.subscribeAfterCommit(OrderPlaced, (event) => email.sendReceipt(event.orderId));
});

"已经耐用"需要耐用 内没有 DeferralSink 在上下文中,总线运行 派遣结束时的后承诺处理者——仍然在每一个直接的,仍然孤立的——之后 足以使一个没有数据存储器来协调。 添加 @effect-server-utils/unit-of-work 同样的处理者在真正的承诺后开始运行, 每个人在 本身的交易,上面没有重写:

import { makeUnitOfWork, withUnitOfWork } from "@effect-server-utils/unit-of-work";

// Installs the sink alongside the boundary — they are one decision.
const runtime = Layer.mergeAll(makeEventBus(), makeUnitOfWork()).pipe(
  Layer.provide(YourTransactionDriver),
);

// The boundary a use case declares once, at the end of its pipe.
const placeOrder = (input: Input) => doTheWork(input).pipe(withUnitOfWork);

测试助手

串行性检查在它们自己的入口后进行,因为它们得到一个样本值 消费者生产过程中无业务的产权测试运行时间:

import { checkEventsSerializable, checkSerializable } from "@effect-server-utils/cqrs/testing";

const check = Effect.gen(function* () {
  const problems = yield* checkSerializable(Orders); // empty means every contract is portable
});

文档

完整文档: https://dataquail.github.io/effect-server-utils 页面存档备份,存于互联网档案馆

许可证

麻省理工学院

版本与发布记录

@effect-server-utils/cqrs 共发布 11 个版本,首次发布于 2026/08/17;过去 12 个月发布了 11 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.1.0-beta.10latest2026/10/3014 天前
0.1.0-beta.92026/10/111 个月前
0.1.0-beta.82026/10/111 个月前
0.1.0-beta.72026/09/221 个月前
0.1.0-beta.62026/09/122 个月前
0.1.0-beta.52026/09/122 个月前

其他发布通道:beta → 0.1.0-beta.0。

关于 @effect-server-utils/cqrs 的常见问题

@effect-server-utils/cqrs 是什么?

已键入 CQRS for Effect: 命令并查询有每条消息成功和出错类型的总线, 由订阅者选择其一致性模式的事件总线, 以及处理管理器

如何安装 @effect-server-utils/cqrs?

在项目目录运行 npm install @effect-server-utils/cqrs,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:effect(^4.0.2)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@effect-server-utils/cqrs 支持 TypeScript 吗?

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

@effect-server-utils/cqrs 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@effect-server-utils/cqrs 可以商用吗?

@effect-server-utils/cqrs 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@effect-server-utils/cqrs 的下载量有多少?

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

@effect-server-utils/cqrs 还在维护吗?

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