@ 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) → stateProjection<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?)——订阅的aufeventStore粗线broker.publish(topic, event)亲活动, 返回tUnsubscribe。 。 。 .- Strukturelle 类型依赖 - Kein 导入
@bimetal/broker. Jeder 适应器,在结构图中PublishTarget<T> = { publish(topic, message): Promise<void> }erfüllt, passt automatisch (英语). - 维兰特尔特利希夫: 后附录Reihenfolge, ASync
.catch欧弗publish()sichtbarer Fehlerpfad (默认)console.error,通过 überschreibbaronPublishError) (中文(简体) ). - (原始内容存档于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页:1expectedVersion = envelope.version - 1未返回 ein 处理 mitclose()ưμ㼯aguardPublishTarget()。 。 。 .- 安施卢斯守护 - 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