@bimetal/event-sourcing

中文文档
0.42.0发布于 2026/10/30Apache-2.0TypeScriptES Module零依赖近 30 天下载 1.8万

域-不可知事件包原始:存储,聚合,投影,快照,中件. @bimetal/calendar-data, @bimetal/table-data和其他域包的基金会.

中文使用文档
文档目录11 节
  1. 安装
  2. 里面的东西
  3. 类型
  4. 错误
  5. 记忆适应器
  6. 专题公约(für Broker-Konsumenten)
  7. 活动Store ——经纪桥梁 bridgeEventStoreToBroker (中文(简体) )
  8. 经纪人 – 活动站桥 bridgeBrokerToEventStore (中文(简体) )
  9. 从域包使用
  10. 替换
  11. 许可证

@ bimetal/ 活动包

域-不可知事件-包生原始. 无外部依赖性, 无 @bimetal/* 依赖性。 类似域包的基础 @bimetal/calendar-data 财务报告和审定财务报表 @bimetal/table-data。 。 。 .

安装

npm install @bimetal/event-sourcing

里面的东西

类型

  • DomainEvent<T, P> ——不可改变的,仅附带元数据的事件(correlationId, (中文(简体) ), userId, (中文(简体) ), source, (中文(简体) ), version(中文(简体) )
  • Command<T, P> - 对调度管道的投入
  • EventStore - 附加/读取/订阅接口;存储适配器(store-sqlite, (中文(简体) ), store-eventstoredb,)执行此规定
  • EventBus 正在处理中的酒吧/分店
  • Aggregate<S, C, E> —— 说 handle(state, command) → events[] + 键 apply(state, event) → state
  • Projection<R> ——从事件中获得读取模型
  • AggregateState<T> – 内部状态, 由 per-entity 撤销堆栈 + 处理后的命令- id 窗口
  • AggregateSnapshot<T>, (中文(简体) ), SnapshotStore<T> ——即时捕获以快取水
  • DomainStore<S, C, E, R> ——由混凝土域库实施的通用外观接口
  • DispatchContext<Store>, (中文(简体) ), DispatchMiddleware<Cmd, Evt, Store> - 管道钩
  • Clock —— 说 { now(): number } 事件时间戳的时间来源(以前是 @bimetal/temporal(中文(简体) )
  • EventMetadataProvider ——用户/来源丰富
  • DomainError —— 说 CONCURRENCY_CONFLICT | STREAM_NOT_FOUND | VALIDATION_ERROR | ENTITY_NOT_FOUND

错误

  • DataValidationError ——被域集合抛到无效命令上
  • ConcurrencyError 被一个 EventStore 何时 expectedVersion 不对劲

记忆适应器

  • createInMemoryEventStore() ——无持久性 EventStore 测试
  • createInMemorySnapshotStore<T>() ——无持久性 SnapshotStore<T>
  • createEventBus() —— 说 EventBus

专题公约(für Broker-Konsumenten)

  • eventToTopic(event) - 《公约》主题 @bimetal/broker (原始内容存档于2018-09-29). und komptable Adapter. 利费特 event.typeVollständig 震慑力, keine映射-Magie.
  • topicForEventType(type) ——身份-帮助für订阅 ohne Event-Objekt.

Da DomainEvent-Types der FQN- Konvention 互联网档案馆的存檔,存档日期2013-12-21 <vendor>.<domain>.<EventName> folgen, funktionieren Pattle-signit at RabbitMQ-Style splekt 的 Funktionieren Pattle-订阅 : 维基百科中的相关条目: 克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克多克 bimetal.# (所有), bimetal.calendar.* (所有日历晚会), bimetal.calendar.CalendarEventCreated (释出.

钟声 键 导入自定义 @bimetal/broker 死亡 Verbindung passiert auf der Aufrufer-Seite: 死亡 死亡 死亡 死亡

import { eventToTopic } from '@bimetal/event-sourcing';
import { createInProcessBroker } from '@bimetal/broker';
import type { DomainEvent } from '@bimetal/event-sourcing';

const broker = createInProcessBroker<DomainEvent>();
await broker.publish(eventToTopic(event), event);

活动Store ——经纪桥梁bridgeEventStoreToBroker(中文(简体) )

Eng genschnittene Contract-Utility für die kritische Verbindungsstelle Event Store QQ 经纪公司.

  • bridgeEventStoreToBroker(eventStore, broker, options?) ——订阅的auf eventStore粗线 broker.publish(topic, event) 亲活动, 返回t Unsubscribe。 。 。 .
  • Strukturelle 类型依赖 - Kein 导入 @bimetal/broker. Jeder 适应器,在结构图中 PublishTarget<T> = { publish(topic, message): Promise<void> } erfüllt, passt automatisch (英语).
  • 维兰特尔特利希夫: 后附录Reihenfolge, ASync .catch 欧弗 publish()sichtbarer Fehlerpfad (默认) console.error,通过 überschreibbar onPublishError) (中文(简体) ).
  • (原始内容存档于2018-10-21). Bewust nicht suständig für Retry, Dead-Letter, Backpressure — diese gehören in den (英语:Diese gehören) 维基百科中的相关条目: 维基语录链接:名人名言 - 文学作品 - 谚语 - 谚语 - 谚语 - 谚语 - 谚语 - 谚语 - 谚语 onPublishError-回话 嗯,死桥母鸡.
import { bridgeEventStoreToBroker } from '@bimetal/event-sourcing';
import { createInProcessBroker } from '@bimetal/broker';

const broker = createInProcessBroker<DomainEvent>();
const off = bridgeEventStoreToBroker(eventStore, broker, {
  streamId: 'main',            // optional, sonst alle Streams
  toTopic: (event) => event.type,  // optional, Default = eventToTopic
  onPublishError: (err, event, topic) => {
    deadLetterQueue.enqueue({ event, topic, error: err });
  },
});

// später: off();

经纪人 – 活动站桥bridgeBrokerToEventStore(中文(简体) )

Das Gegenstück: eingehende Broker-Nachrichten in einen Event Store übernehmen—— mit den beiden Bausteinen, die sonst jede App selbst baut. 中国植物物种信息数据库.

  • bridgeBrokerToEventStore(broker, eventStore, { streamId, … }) - 已订阅的auf den经纪公司(违约- #,交替纳蒂夫出炉 topics页:1 expectedVersion = envelope.version - 1 未返回 ein 处理 mit close() ưμ㼯a guardPublishTarget()。 。 。 .
  • 安施卢斯守护 - Nur被挖出一个地峡流出 anschließt, wird übernommen. Bereits Bekanntes fällt still weg; eine echte Lücke meldet 维基百科中的相关条目: 维基语录链接:名人名言 - 文学作品 - 谚语 - 谚语 - 谚语 - 谚语 - 谚语 onGap。 。 。 .
  • 回声布雷姆斯 —— 说 guardPublishTarget(broker) (原始内容存档于2018-09-29) (英语). hüllt das Publish-Target so, dass von remote übernommene Events nicht zurück auf den Bus gehen.
  • (原始内容存档于2013-10-12). Der DomainStore fleshet selbst. Die Bridge greift am EventureStore an; die externe 附加-订阅 as stores erkent das fremede Event (s fehlt in seinem) 互联网档案馆的存檔,存档日期2011-12-21 ownEventIds- 排好队的 (原始内容存档于2017-09-22). Deshalb ist das Rezept domänenfrei.
  • 哈特·沃拉乌塞通克(英语:Harte Voraussetung):贝德·恩德潘克特(英语:Endpunkte sideden deministisch identisch) (闪光器) streamId(原始内容存档于2018-03-26). Gleiche Seed-Events in gleicher Reihenfolge-oder beide leer. Der Guard vergleicht versionsnumern, keine Inhalte. 中国植物物种信息数据库.
  • 克因补. 贝 capabilities.ordering: 'none' kann ein event außer der Reihe ankommen; de Guard verwirft es, und Brocker mit (法语) replay: false {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我还得说. onGap (原始内容存档于2013-10-12). Ist das signal"dieser Endpunkt muss nu sewden", nicht Log-Raussen.
  • (原始内容存档于2018-09-21). Keine Vertrauensgrenze von sich aus. 欧恩 accept 桥倒了 表单 纳克里奇特河口 type,尼奇特死(英语: schemaVersion尼克特死 有效载荷。 Auf einem Kanal, 代码 : 错误broker-broadcast: jedes Script desselben Origins), ist das nicht reparabel: der Log ist application - 仅限- ein einziges Fremd-Event vergiftet ihn dauerhaft (英语:, (中文(简体) ), hydrate() 开始. accept 灰绿色 转动 dem 附加 und 不是一个失败关闭; abgelehnte 事件 Weden 仍然是 verworfen .
  • close() 以克为单位 Promise<void>。 。 。 . 断绝订阅 爱因斯坦 (原始内容存档于2019-10-21) (英语). Ubernahmen sofort; eine bereits 劳芬德 (原始内容存档于2013-10-12). lässt sich nicht abbrechen (kein Cancel im) EventStore- Vertrag),达斯承诺解决了,wenn sie durch ist. Ihre Echo-Bremse bleibt bas dahin Bestehen (英语). inbound.close() 安伟星先生, await inbound.close() (原始内容存档于2018-10-21). Ordnet den Deardown.
  • adoptedIdCap (第512号过失)是nicht überall nur ein Sicherheitsnetz. Bei 存储器, 死同步 append() notifizieren (memory, SQLite), hält das Bremsen-Set nie mehr als eine Id. 中国植物物种信息数据库. eine Netzwerkrunde später; dort sammeln sich die a, und über der Grenze verdrängt die FIFO-Kappung noch Benötigte. 互联网档案馆的存檔,存档日期2013-12-02.
import { createInProcessBroker } from '@bimetal/broker';
import {
  bridgeBrokerToEventStore,
  bridgeEventStoreToBroker,
  createInMemoryEventStore,
  type DomainEvent,
} from '@bimetal/event-sourcing';

const KNOWN_TYPES = new Set(['bimetal.calendar.CalendarEventCreated']);

const eventStore = createInMemoryEventStore();
const broker = createInProcessBroker<DomainEvent>();

const inbound = bridgeBrokerToEventStore(broker, eventStore, {
  streamId: 'main',
  // Vertrauensgrenze VOR dem Append — der Log ist append-only.
  accept: (event) => KNOWN_TYPES.has(event.type) && event.metadata.schemaVersion === 1,
  onGap: () => { window.location.reload(); },   // kein Replay — nur Neu-Seeding hilft
});

const off = bridgeEventStoreToBroker(
  eventStore,
  inbound.guardPublishTarget(broker),  // ← Echo-Bremse
  { streamId: 'main' },
);

// später: off(); await inbound.close();

从域包使用

import type {
  AggregateState,
  Command,
  DomainEvent,
  DomainStore,
  Aggregate,
  Projection,
} from '@bimetal/event-sourcing';

interface TableRow { readonly id: string; readonly cells: Record<string, unknown>; }

type CreateRow = Command<'CreateRow', { row: TableRow }>;
type RowCreated = DomainEvent<'RowCreated', { row: TableRow }>;
type RowState = AggregateState<TableRow>;
type RowStore = DomainStore<RowState, CreateRow, RowCreated, { rows: readonly TableRow[]; version: number }>;

完整的示例,见 @bimetal/calendar-data 财务报告和审定财务报表 @bimetal/table-data。 。 。 .

替换

此软件包包含域不可知部分( 已过期) @bimetal/data 软件包,已删除。 具体日历总计/预测/储存 @bimetal/calendar-data。 。 。 .

许可证

Apache 许可证 2.0

版本与发布记录

@bimetal/event-sourcing 共发布 27 个版本,首次发布于 2026/05/17;过去 12 个月发布了 27 个版本。

版本发布日期距今
0.42.0latest2026/10/308 天前
0.41.02026/10/2415 天前
0.40.02026/10/1128 天前
0.39.02026/10/061 个月前
0.38.02026/10/041 个月前
0.37.02026/09/131 个月前

其他发布通道:next → 1.0.0-rc.3。

关于 @bimetal/event-sourcing 的常见问题

@bimetal/event-sourcing 是什么?

域-不可知事件包原始:存储,聚合,投影,快照,中件. @bimetal/calendar-data, @bimetal/table-data和其他域包的基金会.

如何安装 @bimetal/event-sourcing?

在项目目录运行 npm install @bimetal/event-sourcing,或使用 pnpm add / yarn add / bun add。

@bimetal/event-sourcing 支持 TypeScript 吗?

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

@bimetal/event-sourcing 支持 ESM 还是 CommonJS?

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

@bimetal/event-sourcing 可以商用吗?

@bimetal/event-sourcing 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@bimetal/event-sourcing 的下载量有多少?

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

@bimetal/event-sourcing 还在维护吗?

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