# @bimetal/event-sourcing 中文文档

规范地址：https://npmcn.com/package/%40bimetal/event-sourcing/

版本：0\.42\.0
npm 元数据更新时间：2026-10-30T11:41:15.575Z
中文译文更新时间：2026-11-08T02:45:43.605Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40bimetal/event-sourcing
原文对照：https://npmcn.com/package/%40bimetal/event-sourcing/?lang=original

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：409 kB，91 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：0 个
- 首次发布：2026-05-17T15:12:32.801Z
- 最新版本发布：2026-10-30T11:41:15.391Z
- 近 30 天下载量：18054（2026-10-08 至 2026-11-06，npm 官方下载统计）
- 已发布版本数：27（近 12 个月 27 个）

## 中文简介

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

## 安装

```sh
npm install @bimetal/event-sourcing
```

也可以使用：`pnpm add @bimetal/event-sourcing`、`yarn add @bimetal/event-sourcing`、`bun add @bimetal/event-sourcing`

## README

# @ bimetal/ 活动包

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

## 安装

```bash
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.type`Vollstä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: 死亡 死亡 死亡 死亡

```typescript
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`\-回话 嗯,死桥母鸡.

```typescript
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.

```typescript
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();
```

## 从域包使用

```typescript
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 是什么？

域-不可知事件包原始:存储,聚合,投影,快照,中件\. @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（9 天前）；至今共发布 27 个版本，其中过去 12 个月发布了 27 个；首次发布于 2026/05/17。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

