@pattern-stack/codegen 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +67 -0
- package/README.md +214 -0
- package/dist/runtime/analytics/index.d.ts +6 -0
- package/dist/runtime/analytics/index.js +49 -0
- package/dist/runtime/analytics/index.js.map +1 -0
- package/dist/runtime/analytics/metrics.d.ts +75 -0
- package/dist/runtime/analytics/metrics.js +1 -0
- package/dist/runtime/analytics/metrics.js.map +1 -0
- package/dist/runtime/analytics/packs/crm-entity-measures.d.ts +21 -0
- package/dist/runtime/analytics/packs/crm-entity-measures.js +1 -0
- package/dist/runtime/analytics/packs/crm-entity-measures.js.map +1 -0
- package/dist/runtime/analytics/packs/index.d.ts +3 -0
- package/dist/runtime/analytics/packs/index.js +1 -0
- package/dist/runtime/analytics/packs/index.js.map +1 -0
- package/dist/runtime/analytics/packs/monetary-measures.d.ts +21 -0
- package/dist/runtime/analytics/packs/monetary-measures.js +1 -0
- package/dist/runtime/analytics/packs/monetary-measures.js.map +1 -0
- package/dist/runtime/analytics/specs.d.ts +49 -0
- package/dist/runtime/analytics/specs.js +1 -0
- package/dist/runtime/analytics/specs.js.map +1 -0
- package/dist/runtime/analytics/types.d.ts +85 -0
- package/dist/runtime/analytics/types.js +49 -0
- package/dist/runtime/analytics/types.js.map +1 -0
- package/dist/runtime/base-classes/activity-entity-repository.d.ts +26 -0
- package/dist/runtime/base-classes/activity-entity-repository.js +195 -0
- package/dist/runtime/base-classes/activity-entity-repository.js.map +1 -0
- package/dist/runtime/base-classes/activity-entity-service.d.ts +39 -0
- package/dist/runtime/base-classes/activity-entity-service.js +214 -0
- package/dist/runtime/base-classes/activity-entity-service.js.map +1 -0
- package/dist/runtime/base-classes/base-read-use-cases.d.ts +68 -0
- package/dist/runtime/base-classes/base-read-use-cases.js +32 -0
- package/dist/runtime/base-classes/base-read-use-cases.js.map +1 -0
- package/dist/runtime/base-classes/base-repository.d.ts +99 -0
- package/dist/runtime/base-classes/base-repository.js +160 -0
- package/dist/runtime/base-classes/base-repository.js.map +1 -0
- package/dist/runtime/base-classes/base-service.d.ts +98 -0
- package/dist/runtime/base-classes/base-service.js +186 -0
- package/dist/runtime/base-classes/base-service.js.map +1 -0
- package/dist/runtime/base-classes/index.d.ts +18 -0
- package/dist/runtime/base-classes/index.js +617 -0
- package/dist/runtime/base-classes/index.js.map +1 -0
- package/dist/runtime/base-classes/knowledge-entity-repository.d.ts +17 -0
- package/dist/runtime/base-classes/knowledge-entity-repository.js +166 -0
- package/dist/runtime/base-classes/knowledge-entity-repository.js.map +1 -0
- package/dist/runtime/base-classes/knowledge-entity-service.d.ts +15 -0
- package/dist/runtime/base-classes/knowledge-entity-service.js +192 -0
- package/dist/runtime/base-classes/knowledge-entity-service.js.map +1 -0
- package/dist/runtime/base-classes/lifecycle-events.d.ts +49 -0
- package/dist/runtime/base-classes/lifecycle-events.js +76 -0
- package/dist/runtime/base-classes/lifecycle-events.js.map +1 -0
- package/dist/runtime/base-classes/metadata-entity-repository.d.ts +27 -0
- package/dist/runtime/base-classes/metadata-entity-repository.js +212 -0
- package/dist/runtime/base-classes/metadata-entity-repository.js.map +1 -0
- package/dist/runtime/base-classes/metadata-entity-service.d.ts +39 -0
- package/dist/runtime/base-classes/metadata-entity-service.js +214 -0
- package/dist/runtime/base-classes/metadata-entity-service.js.map +1 -0
- package/dist/runtime/base-classes/synced-entity-repository.d.ts +32 -0
- package/dist/runtime/base-classes/synced-entity-repository.js +203 -0
- package/dist/runtime/base-classes/synced-entity-repository.js.map +1 -0
- package/dist/runtime/base-classes/synced-entity-service.d.ts +41 -0
- package/dist/runtime/base-classes/synced-entity-service.js +215 -0
- package/dist/runtime/base-classes/synced-entity-service.js.map +1 -0
- package/dist/runtime/base-classes/with-analytics.d.ts +18 -0
- package/dist/runtime/base-classes/with-analytics.js +11 -0
- package/dist/runtime/base-classes/with-analytics.js.map +1 -0
- package/dist/runtime/constants/tokens.d.ts +29 -0
- package/dist/runtime/constants/tokens.js +8 -0
- package/dist/runtime/constants/tokens.js.map +1 -0
- package/dist/runtime/subsystems/analytics/analytics-query.protocol.d.ts +30 -0
- package/dist/runtime/subsystems/analytics/analytics-query.protocol.js +1 -0
- package/dist/runtime/subsystems/analytics/analytics-query.protocol.js.map +1 -0
- package/dist/runtime/subsystems/analytics/analytics.module.d.ts +34 -0
- package/dist/runtime/subsystems/analytics/analytics.module.js +117 -0
- package/dist/runtime/subsystems/analytics/analytics.module.js.map +1 -0
- package/dist/runtime/subsystems/analytics/analytics.tokens.d.ts +24 -0
- package/dist/runtime/subsystems/analytics/analytics.tokens.js +10 -0
- package/dist/runtime/subsystems/analytics/analytics.tokens.js.map +1 -0
- package/dist/runtime/subsystems/analytics/cube-backend.d.ts +28 -0
- package/dist/runtime/subsystems/analytics/cube-backend.js +71 -0
- package/dist/runtime/subsystems/analytics/cube-backend.js.map +1 -0
- package/dist/runtime/subsystems/analytics/index.d.ts +6 -0
- package/dist/runtime/subsystems/analytics/index.js +122 -0
- package/dist/runtime/subsystems/analytics/index.js.map +1 -0
- package/dist/runtime/subsystems/analytics/noop-backend.d.ts +7 -0
- package/dist/runtime/subsystems/analytics/noop-backend.js +25 -0
- package/dist/runtime/subsystems/analytics/noop-backend.js.map +1 -0
- package/dist/runtime/subsystems/cache/cache.drizzle-backend.d.ts +43 -0
- package/dist/runtime/subsystems/cache/cache.drizzle-backend.js +133 -0
- package/dist/runtime/subsystems/cache/cache.drizzle-backend.js.map +1 -0
- package/dist/runtime/subsystems/cache/cache.memory-backend.d.ts +21 -0
- package/dist/runtime/subsystems/cache/cache.memory-backend.js +100 -0
- package/dist/runtime/subsystems/cache/cache.memory-backend.js.map +1 -0
- package/dist/runtime/subsystems/cache/cache.module.d.ts +37 -0
- package/dist/runtime/subsystems/cache/cache.module.js +272 -0
- package/dist/runtime/subsystems/cache/cache.module.js.map +1 -0
- package/dist/runtime/subsystems/cache/cache.protocol.d.ts +42 -0
- package/dist/runtime/subsystems/cache/cache.protocol.js +1 -0
- package/dist/runtime/subsystems/cache/cache.protocol.js.map +1 -0
- package/dist/runtime/subsystems/cache/cache.schema.d.ts +64 -0
- package/dist/runtime/subsystems/cache/cache.schema.js +18 -0
- package/dist/runtime/subsystems/cache/cache.schema.js.map +1 -0
- package/dist/runtime/subsystems/cache/cache.tokens.d.ts +18 -0
- package/dist/runtime/subsystems/cache/cache.tokens.js +8 -0
- package/dist/runtime/subsystems/cache/cache.tokens.js.map +1 -0
- package/dist/runtime/subsystems/cache/index.d.ts +11 -0
- package/dist/runtime/subsystems/cache/index.js +277 -0
- package/dist/runtime/subsystems/cache/index.js.map +1 -0
- package/dist/runtime/subsystems/events/domain-events.schema.d.ts +187 -0
- package/dist/runtime/subsystems/events/domain-events.schema.js +32 -0
- package/dist/runtime/subsystems/events/domain-events.schema.js.map +1 -0
- package/dist/runtime/subsystems/events/event-bus.drizzle-backend.d.ts +38 -0
- package/dist/runtime/subsystems/events/event-bus.drizzle-backend.js +199 -0
- package/dist/runtime/subsystems/events/event-bus.drizzle-backend.js.map +1 -0
- package/dist/runtime/subsystems/events/event-bus.memory-backend.d.ts +18 -0
- package/dist/runtime/subsystems/events/event-bus.memory-backend.js +71 -0
- package/dist/runtime/subsystems/events/event-bus.memory-backend.js.map +1 -0
- package/dist/runtime/subsystems/events/event-bus.protocol.d.ts +52 -0
- package/dist/runtime/subsystems/events/event-bus.protocol.js +1 -0
- package/dist/runtime/subsystems/events/event-bus.protocol.js.map +1 -0
- package/dist/runtime/subsystems/events/event-bus.redis-backend.d.ts +95 -0
- package/dist/runtime/subsystems/events/event-bus.redis-backend.js +229 -0
- package/dist/runtime/subsystems/events/event-bus.redis-backend.js.map +1 -0
- package/dist/runtime/subsystems/events/events.module.d.ts +46 -0
- package/dist/runtime/subsystems/events/events.module.js +531 -0
- package/dist/runtime/subsystems/events/events.module.js.map +1 -0
- package/dist/runtime/subsystems/events/events.tokens.d.ts +19 -0
- package/dist/runtime/subsystems/events/events.tokens.js +8 -0
- package/dist/runtime/subsystems/events/events.tokens.js.map +1 -0
- package/dist/runtime/subsystems/events/index.d.ts +12 -0
- package/dist/runtime/subsystems/events/index.js +536 -0
- package/dist/runtime/subsystems/events/index.js.map +1 -0
- package/dist/runtime/subsystems/index.d.ts +24 -0
- package/dist/runtime/subsystems/index.js +1643 -0
- package/dist/runtime/subsystems/index.js.map +1 -0
- package/dist/runtime/subsystems/jobs/index.d.ts +14 -0
- package/dist/runtime/subsystems/jobs/index.js +680 -0
- package/dist/runtime/subsystems/jobs/index.js.map +1 -0
- package/dist/runtime/subsystems/jobs/job-queue.bullmq-backend.d.ts +54 -0
- package/dist/runtime/subsystems/jobs/job-queue.bullmq-backend.js +186 -0
- package/dist/runtime/subsystems/jobs/job-queue.bullmq-backend.js.map +1 -0
- package/dist/runtime/subsystems/jobs/job-queue.drizzle-backend.d.ts +38 -0
- package/dist/runtime/subsystems/jobs/job-queue.drizzle-backend.js +228 -0
- package/dist/runtime/subsystems/jobs/job-queue.drizzle-backend.js.map +1 -0
- package/dist/runtime/subsystems/jobs/job-queue.memory-backend.d.ts +12 -0
- package/dist/runtime/subsystems/jobs/job-queue.memory-backend.js +44 -0
- package/dist/runtime/subsystems/jobs/job-queue.memory-backend.js.map +1 -0
- package/dist/runtime/subsystems/jobs/job-queue.protocol.d.ts +48 -0
- package/dist/runtime/subsystems/jobs/job-queue.protocol.js +1 -0
- package/dist/runtime/subsystems/jobs/job-queue.protocol.js.map +1 -0
- package/dist/runtime/subsystems/jobs/job-queue.redis-backend.d.ts +46 -0
- package/dist/runtime/subsystems/jobs/job-queue.redis-backend.js +187 -0
- package/dist/runtime/subsystems/jobs/job-queue.redis-backend.js.map +1 -0
- package/dist/runtime/subsystems/jobs/job-queue.schema.d.ts +237 -0
- package/dist/runtime/subsystems/jobs/job-queue.schema.js +44 -0
- package/dist/runtime/subsystems/jobs/job-queue.schema.js.map +1 -0
- package/dist/runtime/subsystems/jobs/jobs.module.d.ts +18 -0
- package/dist/runtime/subsystems/jobs/jobs.module.js +676 -0
- package/dist/runtime/subsystems/jobs/jobs.module.js.map +1 -0
- package/dist/runtime/subsystems/jobs/jobs.tokens.d.ts +13 -0
- package/dist/runtime/subsystems/jobs/jobs.tokens.js +8 -0
- package/dist/runtime/subsystems/jobs/jobs.tokens.js.map +1 -0
- package/dist/runtime/subsystems/storage/index.d.ts +6 -0
- package/dist/runtime/subsystems/storage/index.js +204 -0
- package/dist/runtime/subsystems/storage/index.js.map +1 -0
- package/dist/runtime/subsystems/storage/storage.local-backend.d.ts +18 -0
- package/dist/runtime/subsystems/storage/storage.local-backend.js +108 -0
- package/dist/runtime/subsystems/storage/storage.local-backend.js.map +1 -0
- package/dist/runtime/subsystems/storage/storage.memory-backend.d.ts +28 -0
- package/dist/runtime/subsystems/storage/storage.memory-backend.js +72 -0
- package/dist/runtime/subsystems/storage/storage.memory-backend.js.map +1 -0
- package/dist/runtime/subsystems/storage/storage.module.d.ts +40 -0
- package/dist/runtime/subsystems/storage/storage.module.js +201 -0
- package/dist/runtime/subsystems/storage/storage.module.js.map +1 -0
- package/dist/runtime/subsystems/storage/storage.protocol.d.ts +69 -0
- package/dist/runtime/subsystems/storage/storage.protocol.js +1 -0
- package/dist/runtime/subsystems/storage/storage.protocol.js.map +1 -0
- package/dist/runtime/subsystems/storage/storage.tokens.d.ts +11 -0
- package/dist/runtime/subsystems/storage/storage.tokens.js +6 -0
- package/dist/runtime/subsystems/storage/storage.tokens.js.map +1 -0
- package/dist/runtime/subsystems/storage/storage.utils.d.ts +9 -0
- package/dist/runtime/subsystems/storage/storage.utils.js +18 -0
- package/dist/runtime/subsystems/storage/storage.utils.js.map +1 -0
- package/dist/runtime/types/drizzle.d.ts +17 -0
- package/dist/runtime/types/drizzle.js +1 -0
- package/dist/runtime/types/drizzle.js.map +1 -0
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +7365 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/index.d.ts +2384 -0
- package/dist/src/index.js +2198 -0
- package/dist/src/index.js.map +1 -0
- package/package.json +114 -0
- package/templates/broadcast/new/backend-interface.ejs.t +47 -0
- package/templates/broadcast/new/bridge-listener.ejs.t +67 -0
- package/templates/broadcast/new/channel.ejs.t +77 -0
- package/templates/broadcast/new/index.ejs.t +21 -0
- package/templates/broadcast/new/memory-backend.ejs.t +87 -0
- package/templates/broadcast/new/module.ejs.t +57 -0
- package/templates/broadcast/new/prompt.js +268 -0
- package/templates/broadcast/new/websocket-backend.ejs.t +259 -0
- package/templates/entity/new/backend/application/commands/create.ejs.t +55 -0
- package/templates/entity/new/backend/application/commands/delete.ejs.t +45 -0
- package/templates/entity/new/backend/application/commands/grouped-index.ejs.t +149 -0
- package/templates/entity/new/backend/application/commands/index.ejs.t +15 -0
- package/templates/entity/new/backend/application/commands/update.ejs.t +58 -0
- package/templates/entity/new/backend/application/queries/declarative-queries.ejs.t +36 -0
- package/templates/entity/new/backend/application/queries/get-by-id.ejs.t +42 -0
- package/templates/entity/new/backend/application/queries/grouped-index.ejs.t +81 -0
- package/templates/entity/new/backend/application/queries/index.ejs.t +14 -0
- package/templates/entity/new/backend/application/queries/list.ejs.t +36 -0
- package/templates/entity/new/backend/application/schemas/_inject-index.ejs.t +7 -0
- package/templates/entity/new/backend/application/schemas/dto.ejs.t +45 -0
- package/templates/entity/new/backend/database/_inject-index.ejs.t +7 -0
- package/templates/entity/new/backend/database/electric-migration.ejs.t +21 -0
- package/templates/entity/new/backend/database/repository.ejs.t +450 -0
- package/templates/entity/new/backend/database/schema.ejs.t +248 -0
- package/templates/entity/new/backend/domain/_inject-index.ejs.t +12 -0
- package/templates/entity/new/backend/domain/entity.ejs.t +108 -0
- package/templates/entity/new/backend/domain/grouped-index.ejs.t +163 -0
- package/templates/entity/new/backend/domain/index.ejs.t +15 -0
- package/templates/entity/new/backend/domain/repository-interface.ejs.t +71 -0
- package/templates/entity/new/backend/modules/core/_ensure-anchor-tokens.ejs.t +10 -0
- package/templates/entity/new/backend/modules/core/_inject-token.ejs.t +7 -0
- package/templates/entity/new/backend/modules/core/module.ejs.t +67 -0
- package/templates/entity/new/backend/modules/trpc/module.ejs.t +67 -0
- package/templates/entity/new/backend/presentation/controller.ejs.t +201 -0
- package/templates/entity/new/clean-lite-ps/controller.ejs.t +37 -0
- package/templates/entity/new/clean-lite-ps/dto/create.ejs.t +17 -0
- package/templates/entity/new/clean-lite-ps/dto/output.ejs.t +25 -0
- package/templates/entity/new/clean-lite-ps/dto/update.ejs.t +11 -0
- package/templates/entity/new/clean-lite-ps/entity.ejs.t +52 -0
- package/templates/entity/new/clean-lite-ps/index.ejs.t +20 -0
- package/templates/entity/new/clean-lite-ps/module.ejs.t +43 -0
- package/templates/entity/new/clean-lite-ps/prompt-extension.js +617 -0
- package/templates/entity/new/clean-lite-ps/repository.ejs.t +62 -0
- package/templates/entity/new/clean-lite-ps/service.ejs.t +34 -0
- package/templates/entity/new/clean-lite-ps/use-cases/declarative-queries.ejs.t +34 -0
- package/templates/entity/new/clean-lite-ps/use-cases/find-by-id.ejs.t +16 -0
- package/templates/entity/new/clean-lite-ps/use-cases/list.ejs.t +16 -0
- package/templates/entity/new/frontend/_inject-entities-entry.ejs.t +7 -0
- package/templates/entity/new/frontend/_inject-entities-import.ejs.t +7 -0
- package/templates/entity/new/frontend/collections/_ensure-anchor-collections.ejs.t +10 -0
- package/templates/entity/new/frontend/collections/_inject-index.ejs.t +9 -0
- package/templates/entity/new/frontend/collections/_inject-schema-import.ejs.t +9 -0
- package/templates/entity/new/frontend/collections/collection.ejs.t +61 -0
- package/templates/entity/new/frontend/collections/collections-base.ejs.t +24 -0
- package/templates/entity/new/frontend/entity/collection.ejs.t +172 -0
- package/templates/entity/new/frontend/entity/combined.ejs.t +474 -0
- package/templates/entity/new/frontend/entity/fields.ejs.t +104 -0
- package/templates/entity/new/frontend/entity/hooks.ejs.t +73 -0
- package/templates/entity/new/frontend/entity/index.ejs.t +21 -0
- package/templates/entity/new/frontend/entity/mutation-hooks.ejs.t +84 -0
- package/templates/entity/new/frontend/entity/mutations.ejs.t +38 -0
- package/templates/entity/new/frontend/entity/types.ejs.t +59 -0
- package/templates/entity/new/frontend/generated/_inject-index-export.ejs.t +7 -0
- package/templates/entity/new/frontend/generated/_inject-index-import.ejs.t +7 -0
- package/templates/entity/new/frontend/generated/_inject-index-registry.ejs.t +7 -0
- package/templates/entity/new/frontend/store/_inject-collection-import.ejs.t +9 -0
- package/templates/entity/new/frontend/store/_inject-collections.ejs.t +9 -0
- package/templates/entity/new/frontend/store/_inject-entity.ejs.t +9 -0
- package/templates/entity/new/frontend/store/_inject-import.ejs.t +9 -0
- package/templates/entity/new/frontend/store/_inject-lookups.ejs.t +9 -0
- package/templates/entity/new/frontend/store/_inject-resolve.ejs.t +10 -0
- package/templates/entity/new/frontend/store/hooks.ejs.t +72 -0
- package/templates/entity/new/frontend/unified-entity.ejs.t +28 -0
- package/templates/entity/new/prompt.js +1421 -0
- package/templates/relationship/new/controller.ejs.t +36 -0
- package/templates/relationship/new/dto/create.ejs.t +41 -0
- package/templates/relationship/new/dto/output.ejs.t +44 -0
- package/templates/relationship/new/dto/update.ejs.t +10 -0
- package/templates/relationship/new/entity.ejs.t +98 -0
- package/templates/relationship/new/index.ejs.t +19 -0
- package/templates/relationship/new/module.ejs.t +35 -0
- package/templates/relationship/new/prompt.js +682 -0
- package/templates/relationship/new/repository.ejs.t +54 -0
- package/templates/relationship/new/service.ejs.t +31 -0
- package/templates/relationship/new/use-cases/declarative-queries.ejs.t +34 -0
- package/templates/relationship/new/use-cases/find-by-id.ejs.t +16 -0
- package/templates/relationship/new/use-cases/list.ejs.t +16 -0
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
12
|
+
|
|
13
|
+
// runtime/subsystems/events/events.module.ts
|
|
14
|
+
import { Module } from "@nestjs/common";
|
|
15
|
+
|
|
16
|
+
// runtime/subsystems/events/events.tokens.ts
|
|
17
|
+
var EVENT_BUS = "EVENT_BUS";
|
|
18
|
+
var REDIS_URL = /* @__PURE__ */ Symbol("REDIS_URL");
|
|
19
|
+
|
|
20
|
+
// runtime/subsystems/events/event-bus.drizzle-backend.ts
|
|
21
|
+
import { Injectable, Inject, Logger } from "@nestjs/common";
|
|
22
|
+
import { eq, and, sql } from "drizzle-orm";
|
|
23
|
+
|
|
24
|
+
// runtime/subsystems/events/domain-events.schema.ts
|
|
25
|
+
import {
|
|
26
|
+
jsonb,
|
|
27
|
+
pgTable,
|
|
28
|
+
text,
|
|
29
|
+
timestamp,
|
|
30
|
+
uuid
|
|
31
|
+
} from "drizzle-orm/pg-core";
|
|
32
|
+
var domainEvents = pgTable(
|
|
33
|
+
"domain_events",
|
|
34
|
+
{
|
|
35
|
+
id: uuid("id").primaryKey(),
|
|
36
|
+
type: text("type").notNull(),
|
|
37
|
+
aggregateId: text("aggregate_id").notNull(),
|
|
38
|
+
aggregateType: text("aggregate_type").notNull(),
|
|
39
|
+
payload: jsonb("payload").notNull().$type(),
|
|
40
|
+
occurredAt: timestamp("occurred_at", { withTimezone: true }).notNull(),
|
|
41
|
+
processedAt: timestamp("processed_at", { withTimezone: true }),
|
|
42
|
+
/** Lifecycle status: pending | processed | failed */
|
|
43
|
+
status: text("status").notNull().default("pending"),
|
|
44
|
+
/** Error message from the last failed dispatch attempt. */
|
|
45
|
+
error: text("error"),
|
|
46
|
+
metadata: jsonb("metadata").$type()
|
|
47
|
+
}
|
|
48
|
+
// Indexes: add via migration when deploying
|
|
49
|
+
// - (status, occurred_at) for polling
|
|
50
|
+
// - (aggregate_id, aggregate_type) for replay
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
// runtime/constants/tokens.ts
|
|
54
|
+
var DRIZZLE = "DRIZZLE";
|
|
55
|
+
|
|
56
|
+
// runtime/subsystems/events/event-bus.drizzle-backend.ts
|
|
57
|
+
var POLL_INTERVAL_MS = 1e3;
|
|
58
|
+
var POLL_BATCH_SIZE = 50;
|
|
59
|
+
var MAX_RETRIES = 3;
|
|
60
|
+
var DrizzleEventBus = class {
|
|
61
|
+
constructor(db) {
|
|
62
|
+
this.db = db;
|
|
63
|
+
}
|
|
64
|
+
db;
|
|
65
|
+
logger = new Logger(DrizzleEventBus.name);
|
|
66
|
+
polling = false;
|
|
67
|
+
pollTimer = null;
|
|
68
|
+
handlers = /* @__PURE__ */ new Map();
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// Lifecycle
|
|
71
|
+
// ============================================================================
|
|
72
|
+
async onModuleInit() {
|
|
73
|
+
this.polling = true;
|
|
74
|
+
this.schedulePoll();
|
|
75
|
+
}
|
|
76
|
+
async onModuleDestroy() {
|
|
77
|
+
this.polling = false;
|
|
78
|
+
if (this.pollTimer) {
|
|
79
|
+
clearTimeout(this.pollTimer);
|
|
80
|
+
this.pollTimer = null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// ============================================================================
|
|
84
|
+
// IEventBus
|
|
85
|
+
// ============================================================================
|
|
86
|
+
async publish(event, tx) {
|
|
87
|
+
const client = tx ?? this.db;
|
|
88
|
+
await client.insert(domainEvents).values({
|
|
89
|
+
id: event.id,
|
|
90
|
+
type: event.type,
|
|
91
|
+
aggregateId: event.aggregateId,
|
|
92
|
+
aggregateType: event.aggregateType,
|
|
93
|
+
payload: event.payload,
|
|
94
|
+
occurredAt: event.occurredAt,
|
|
95
|
+
processedAt: null,
|
|
96
|
+
status: "pending",
|
|
97
|
+
metadata: event.metadata
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async publishMany(events, tx) {
|
|
101
|
+
if (events.length === 0) return;
|
|
102
|
+
const client = tx ?? this.db;
|
|
103
|
+
await client.insert(domainEvents).values(
|
|
104
|
+
events.map((e) => ({
|
|
105
|
+
id: e.id,
|
|
106
|
+
type: e.type,
|
|
107
|
+
aggregateId: e.aggregateId,
|
|
108
|
+
aggregateType: e.aggregateType,
|
|
109
|
+
payload: e.payload,
|
|
110
|
+
occurredAt: e.occurredAt,
|
|
111
|
+
processedAt: null,
|
|
112
|
+
status: "pending",
|
|
113
|
+
metadata: e.metadata
|
|
114
|
+
}))
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
subscribe(eventType, handler) {
|
|
118
|
+
if (!this.handlers.has(eventType)) {
|
|
119
|
+
this.handlers.set(eventType, /* @__PURE__ */ new Set());
|
|
120
|
+
}
|
|
121
|
+
const set = this.handlers.get(eventType);
|
|
122
|
+
const h = handler;
|
|
123
|
+
set.add(h);
|
|
124
|
+
return () => {
|
|
125
|
+
set.delete(h);
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// ============================================================================
|
|
129
|
+
// Polling
|
|
130
|
+
// ============================================================================
|
|
131
|
+
schedulePoll() {
|
|
132
|
+
if (!this.polling) return;
|
|
133
|
+
this.pollTimer = setTimeout(async () => {
|
|
134
|
+
try {
|
|
135
|
+
await this.processBatch();
|
|
136
|
+
} catch (err) {
|
|
137
|
+
this.logger.error(`Poll cycle error: ${err}`);
|
|
138
|
+
} finally {
|
|
139
|
+
this.schedulePoll();
|
|
140
|
+
}
|
|
141
|
+
}, POLL_INTERVAL_MS);
|
|
142
|
+
}
|
|
143
|
+
async processBatch() {
|
|
144
|
+
const rows = await this.db.transaction(async (tx) => {
|
|
145
|
+
return tx.execute(
|
|
146
|
+
sql`SELECT * FROM domain_events WHERE status = 'pending' ORDER BY occurred_at ASC LIMIT ${POLL_BATCH_SIZE} FOR UPDATE SKIP LOCKED`
|
|
147
|
+
);
|
|
148
|
+
}).then((result) => result.rows ?? result);
|
|
149
|
+
for (const row of rows) {
|
|
150
|
+
const event = {
|
|
151
|
+
id: row["id"],
|
|
152
|
+
type: row["type"],
|
|
153
|
+
aggregateId: row["aggregate_id"],
|
|
154
|
+
aggregateType: row["aggregate_type"],
|
|
155
|
+
payload: row["payload"],
|
|
156
|
+
occurredAt: new Date(row["occurred_at"]),
|
|
157
|
+
metadata: row["metadata"]
|
|
158
|
+
};
|
|
159
|
+
let attempt = 0;
|
|
160
|
+
let lastError;
|
|
161
|
+
while (attempt < MAX_RETRIES) {
|
|
162
|
+
try {
|
|
163
|
+
await this.dispatch(event);
|
|
164
|
+
await this.db.update(domainEvents).set({ status: "processed", processedAt: /* @__PURE__ */ new Date() }).where(eq(domainEvents.id, event.id));
|
|
165
|
+
lastError = void 0;
|
|
166
|
+
break;
|
|
167
|
+
} catch (err) {
|
|
168
|
+
lastError = err;
|
|
169
|
+
attempt++;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (lastError !== void 0) {
|
|
173
|
+
const errorMessage = lastError instanceof Error ? lastError.message : String(lastError);
|
|
174
|
+
await this.db.update(domainEvents).set({ status: "failed", error: errorMessage }).where(and(eq(domainEvents.id, event.id), eq(domainEvents.status, "pending")));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async dispatch(event) {
|
|
179
|
+
const set = this.handlers.get(event.type);
|
|
180
|
+
if (!set) return;
|
|
181
|
+
let firstError;
|
|
182
|
+
for (const handler of set) {
|
|
183
|
+
try {
|
|
184
|
+
await handler(event);
|
|
185
|
+
} catch (err) {
|
|
186
|
+
this.logger.error(
|
|
187
|
+
`Handler error for event type "${event.type}" (id: ${event.id}): ${err}`
|
|
188
|
+
);
|
|
189
|
+
if (firstError === void 0) {
|
|
190
|
+
firstError = err;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (firstError !== void 0) {
|
|
195
|
+
throw firstError;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
DrizzleEventBus = __decorateClass([
|
|
200
|
+
Injectable(),
|
|
201
|
+
__decorateParam(0, Inject(DRIZZLE))
|
|
202
|
+
], DrizzleEventBus);
|
|
203
|
+
|
|
204
|
+
// runtime/subsystems/events/event-bus.memory-backend.ts
|
|
205
|
+
import { Injectable as Injectable2, Logger as Logger2 } from "@nestjs/common";
|
|
206
|
+
var MemoryEventBus = class {
|
|
207
|
+
logger = new Logger2(MemoryEventBus.name);
|
|
208
|
+
/** All events published since construction (or last clear). */
|
|
209
|
+
publishedEvents = [];
|
|
210
|
+
handlers = /* @__PURE__ */ new Map();
|
|
211
|
+
async publish(event) {
|
|
212
|
+
this.publishedEvents.push(event);
|
|
213
|
+
await this.dispatch(event);
|
|
214
|
+
}
|
|
215
|
+
async publishMany(events) {
|
|
216
|
+
for (const event of events) {
|
|
217
|
+
await this.publish(event);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
subscribe(eventType, handler) {
|
|
221
|
+
if (!this.handlers.has(eventType)) {
|
|
222
|
+
this.handlers.set(eventType, /* @__PURE__ */ new Set());
|
|
223
|
+
}
|
|
224
|
+
const set = this.handlers.get(eventType);
|
|
225
|
+
const h = handler;
|
|
226
|
+
set.add(h);
|
|
227
|
+
return () => {
|
|
228
|
+
set.delete(h);
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/** Remove all published events and subscriptions. Useful in beforeEach. */
|
|
232
|
+
clear() {
|
|
233
|
+
this.publishedEvents.length = 0;
|
|
234
|
+
this.handlers.clear();
|
|
235
|
+
}
|
|
236
|
+
async dispatch(event) {
|
|
237
|
+
const set = this.handlers.get(event.type);
|
|
238
|
+
if (!set) return;
|
|
239
|
+
let firstError;
|
|
240
|
+
for (const handler of set) {
|
|
241
|
+
try {
|
|
242
|
+
await handler(event);
|
|
243
|
+
} catch (err) {
|
|
244
|
+
this.logger.error(
|
|
245
|
+
`Handler error for event type "${event.type}" (id: ${event.id}): ${err}`
|
|
246
|
+
);
|
|
247
|
+
if (firstError === void 0) {
|
|
248
|
+
firstError = err;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (firstError !== void 0) {
|
|
253
|
+
throw firstError;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
MemoryEventBus = __decorateClass([
|
|
258
|
+
Injectable2()
|
|
259
|
+
], MemoryEventBus);
|
|
260
|
+
|
|
261
|
+
// runtime/subsystems/events/event-bus.redis-backend.ts
|
|
262
|
+
import { Injectable as Injectable3, Inject as Inject2, Logger as Logger3 } from "@nestjs/common";
|
|
263
|
+
var CHANNEL_PREFIX = "events:";
|
|
264
|
+
async function createRedisClient(url) {
|
|
265
|
+
let Redis;
|
|
266
|
+
try {
|
|
267
|
+
const mod = await import("ioredis");
|
|
268
|
+
Redis = mod.default ?? mod;
|
|
269
|
+
} catch {
|
|
270
|
+
throw new Error(
|
|
271
|
+
'RedisEventBus requires the "ioredis" package. Install it with: npm install ioredis'
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
return new Redis(url);
|
|
275
|
+
}
|
|
276
|
+
var RedisEventBus = class {
|
|
277
|
+
constructor(redisUrl) {
|
|
278
|
+
this.redisUrl = redisUrl;
|
|
279
|
+
}
|
|
280
|
+
redisUrl;
|
|
281
|
+
logger = new Logger3(RedisEventBus.name);
|
|
282
|
+
publisher = null;
|
|
283
|
+
subscriber = null;
|
|
284
|
+
connected = false;
|
|
285
|
+
/**
|
|
286
|
+
* In-process subscriber registry. Handlers registered here are called when
|
|
287
|
+
* a message arrives on the subscriber client — keeping fan-out within the
|
|
288
|
+
* same process without an extra round-trip through Redis.
|
|
289
|
+
*/
|
|
290
|
+
handlers = /* @__PURE__ */ new Map();
|
|
291
|
+
/**
|
|
292
|
+
* Track which event types have active Redis subscriptions.
|
|
293
|
+
* Used to avoid subscribing multiple times to the same type channel.
|
|
294
|
+
*/
|
|
295
|
+
subscribedTypes = /* @__PURE__ */ new Set();
|
|
296
|
+
// ============================================================================
|
|
297
|
+
// Lifecycle
|
|
298
|
+
// ============================================================================
|
|
299
|
+
async onModuleInit() {
|
|
300
|
+
this.publisher = await createRedisClient(this.redisUrl);
|
|
301
|
+
this.subscriber = await createRedisClient(this.redisUrl);
|
|
302
|
+
this.publisher.on(
|
|
303
|
+
"error",
|
|
304
|
+
(err) => this.logger.error(`Redis publisher error: ${err.message}`, err.stack)
|
|
305
|
+
);
|
|
306
|
+
this.subscriber.on(
|
|
307
|
+
"error",
|
|
308
|
+
(err) => this.logger.error(`Redis subscriber error: ${err.message}`, err.stack)
|
|
309
|
+
);
|
|
310
|
+
this.subscriber.on("message", (channel, message) => {
|
|
311
|
+
void this.handleMessage(channel, message);
|
|
312
|
+
});
|
|
313
|
+
this.connected = true;
|
|
314
|
+
this.logger.log(`RedisEventBus connected to ${this.redisUrl}`);
|
|
315
|
+
}
|
|
316
|
+
async onModuleDestroy() {
|
|
317
|
+
this.connected = false;
|
|
318
|
+
if (this.subscriber) {
|
|
319
|
+
await this.subscriber.unsubscribe();
|
|
320
|
+
this.subscriber.disconnect();
|
|
321
|
+
this.subscriber = null;
|
|
322
|
+
}
|
|
323
|
+
if (this.publisher) {
|
|
324
|
+
this.publisher.disconnect();
|
|
325
|
+
this.publisher = null;
|
|
326
|
+
}
|
|
327
|
+
this.subscribedTypes.clear();
|
|
328
|
+
this.logger.log("RedisEventBus disconnected");
|
|
329
|
+
}
|
|
330
|
+
// ============================================================================
|
|
331
|
+
// IEventBus
|
|
332
|
+
// ============================================================================
|
|
333
|
+
/**
|
|
334
|
+
* Publish a single event.
|
|
335
|
+
*
|
|
336
|
+
* `tx` is accepted but ignored — see module-level JSDoc for details.
|
|
337
|
+
*/
|
|
338
|
+
async publish(event, tx) {
|
|
339
|
+
void tx;
|
|
340
|
+
this.assertConnected();
|
|
341
|
+
const payload = this.serialize(event);
|
|
342
|
+
const channel = `${CHANNEL_PREFIX}${event.type}`;
|
|
343
|
+
await this.publisher.publish(channel, payload);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Publish multiple events using a pipeline so all PUBLISH commands are sent
|
|
347
|
+
* in a single round-trip.
|
|
348
|
+
*
|
|
349
|
+
* `tx` is accepted but ignored — see module-level JSDoc for details.
|
|
350
|
+
*/
|
|
351
|
+
async publishMany(events, tx) {
|
|
352
|
+
void tx;
|
|
353
|
+
if (events.length === 0) return;
|
|
354
|
+
this.assertConnected();
|
|
355
|
+
const pipeline = this.publisher.pipeline();
|
|
356
|
+
for (const event of events) {
|
|
357
|
+
const payload = this.serialize(event);
|
|
358
|
+
const channel = `${CHANNEL_PREFIX}${event.type}`;
|
|
359
|
+
pipeline.publish(channel, payload);
|
|
360
|
+
}
|
|
361
|
+
await pipeline.exec();
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Register a handler for a specific event type.
|
|
365
|
+
* Returns an unsubscribe function — call it to remove the handler.
|
|
366
|
+
*
|
|
367
|
+
* On first handler for a type, subscribes to the per-type Redis channel.
|
|
368
|
+
* On removal of the last handler for a type, unsubscribes from the channel.
|
|
369
|
+
*/
|
|
370
|
+
subscribe(eventType, handler) {
|
|
371
|
+
if (!this.handlers.has(eventType)) {
|
|
372
|
+
this.handlers.set(eventType, /* @__PURE__ */ new Set());
|
|
373
|
+
void this.subscribeToType(eventType);
|
|
374
|
+
}
|
|
375
|
+
const set = this.handlers.get(eventType);
|
|
376
|
+
const h = handler;
|
|
377
|
+
set.add(h);
|
|
378
|
+
return () => {
|
|
379
|
+
set.delete(h);
|
|
380
|
+
if (set.size === 0) {
|
|
381
|
+
this.handlers.delete(eventType);
|
|
382
|
+
void this.unsubscribeFromType(eventType);
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
// ============================================================================
|
|
387
|
+
// Internal helpers
|
|
388
|
+
// ============================================================================
|
|
389
|
+
assertConnected() {
|
|
390
|
+
if (!this.connected || !this.publisher) {
|
|
391
|
+
throw new Error(
|
|
392
|
+
"RedisEventBus is not connected. Ensure the module has been initialised before publishing."
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
serialize(event) {
|
|
397
|
+
return JSON.stringify({
|
|
398
|
+
...event,
|
|
399
|
+
occurredAt: event.occurredAt.toISOString()
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
deserialize(raw) {
|
|
403
|
+
const parsed = JSON.parse(raw);
|
|
404
|
+
return {
|
|
405
|
+
...parsed,
|
|
406
|
+
occurredAt: new Date(parsed.occurredAt)
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
async handleMessage(channel, message) {
|
|
410
|
+
let event;
|
|
411
|
+
try {
|
|
412
|
+
event = this.deserialize(message);
|
|
413
|
+
} catch (err) {
|
|
414
|
+
this.logger.warn(`Failed to deserialize event on channel "${channel}": ${err}`);
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
await this.dispatch(event);
|
|
418
|
+
}
|
|
419
|
+
async dispatch(event) {
|
|
420
|
+
const set = this.handlers.get(event.type);
|
|
421
|
+
if (!set) return;
|
|
422
|
+
for (const handler of set) {
|
|
423
|
+
try {
|
|
424
|
+
await handler(event);
|
|
425
|
+
} catch (err) {
|
|
426
|
+
this.logger.error(
|
|
427
|
+
`Handler error for event type "${event.type}" (id: ${event.id}): ${err}`
|
|
428
|
+
);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Subscribe to a per-type Redis channel.
|
|
434
|
+
* Called lazily when the first handler is registered for a type.
|
|
435
|
+
*/
|
|
436
|
+
async subscribeToType(eventType) {
|
|
437
|
+
if (this.subscribedTypes.has(eventType)) {
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
const channel = `${CHANNEL_PREFIX}${eventType}`;
|
|
441
|
+
try {
|
|
442
|
+
await this.subscriber.subscribe(channel);
|
|
443
|
+
this.subscribedTypes.add(eventType);
|
|
444
|
+
} catch (err) {
|
|
445
|
+
this.logger.error(`Failed to subscribe to channel "${channel}": ${err}`);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Unsubscribe from a per-type Redis channel.
|
|
450
|
+
* Called when the last handler for a type is removed.
|
|
451
|
+
*/
|
|
452
|
+
async unsubscribeFromType(eventType) {
|
|
453
|
+
if (!this.subscribedTypes.has(eventType)) {
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
const channel = `${CHANNEL_PREFIX}${eventType}`;
|
|
457
|
+
try {
|
|
458
|
+
await this.subscriber.unsubscribe(channel);
|
|
459
|
+
this.subscribedTypes.delete(eventType);
|
|
460
|
+
} catch (err) {
|
|
461
|
+
this.logger.error(`Failed to unsubscribe from channel "${channel}": ${err}`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
};
|
|
465
|
+
RedisEventBus = __decorateClass([
|
|
466
|
+
Injectable3(),
|
|
467
|
+
__decorateParam(0, Inject2(REDIS_URL))
|
|
468
|
+
], RedisEventBus);
|
|
469
|
+
|
|
470
|
+
// runtime/subsystems/events/events.module.ts
|
|
471
|
+
var EventsModule = class {
|
|
472
|
+
static forRootAsync(asyncOptions) {
|
|
473
|
+
return {
|
|
474
|
+
module: EventsModule,
|
|
475
|
+
global: true,
|
|
476
|
+
imports: asyncOptions.imports ?? [],
|
|
477
|
+
providers: [
|
|
478
|
+
{
|
|
479
|
+
provide: "EVENTS_MODULE_OPTIONS",
|
|
480
|
+
useFactory: asyncOptions.useFactory,
|
|
481
|
+
inject: asyncOptions.inject ?? []
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
provide: EVENT_BUS,
|
|
485
|
+
useFactory: (options) => {
|
|
486
|
+
const mod = EventsModule.forRoot(options);
|
|
487
|
+
const provider = mod.providers?.find(
|
|
488
|
+
(p) => typeof p === "object" && p !== null && "provide" in p && p.provide === EVENT_BUS
|
|
489
|
+
);
|
|
490
|
+
if (provider && typeof provider === "object" && "useClass" in provider) {
|
|
491
|
+
return new provider.useClass();
|
|
492
|
+
}
|
|
493
|
+
throw new Error("EventsModule.forRootAsync: failed to resolve provider");
|
|
494
|
+
},
|
|
495
|
+
inject: ["EVENTS_MODULE_OPTIONS"]
|
|
496
|
+
}
|
|
497
|
+
],
|
|
498
|
+
exports: [EVENT_BUS]
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
static forRoot(options = { backend: "drizzle" }) {
|
|
502
|
+
if (options.backend === "redis") {
|
|
503
|
+
const resolvedUrl = options.redisUrl ?? process.env["REDIS_URL"] ?? "redis://localhost:6379";
|
|
504
|
+
return {
|
|
505
|
+
module: EventsModule,
|
|
506
|
+
global: true,
|
|
507
|
+
providers: [
|
|
508
|
+
{ provide: REDIS_URL, useValue: resolvedUrl },
|
|
509
|
+
{ provide: EVENT_BUS, useClass: RedisEventBus },
|
|
510
|
+
// Register concrete class so NestJS can resolve lifecycle hooks
|
|
511
|
+
RedisEventBus
|
|
512
|
+
],
|
|
513
|
+
exports: [EVENT_BUS]
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
const provider = options.backend === "drizzle" ? { provide: EVENT_BUS, useClass: DrizzleEventBus } : { provide: EVENT_BUS, useClass: MemoryEventBus };
|
|
517
|
+
return {
|
|
518
|
+
module: EventsModule,
|
|
519
|
+
global: true,
|
|
520
|
+
providers: [provider],
|
|
521
|
+
exports: [EVENT_BUS]
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
};
|
|
525
|
+
EventsModule = __decorateClass([
|
|
526
|
+
Module({})
|
|
527
|
+
], EventsModule);
|
|
528
|
+
export {
|
|
529
|
+
EventsModule
|
|
530
|
+
};
|
|
531
|
+
//# sourceMappingURL=events.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../runtime/subsystems/events/events.module.ts","../../../../runtime/subsystems/events/events.tokens.ts","../../../../runtime/subsystems/events/event-bus.drizzle-backend.ts","../../../../runtime/subsystems/events/domain-events.schema.ts","../../../../runtime/constants/tokens.ts","../../../../runtime/subsystems/events/event-bus.memory-backend.ts","../../../../runtime/subsystems/events/event-bus.redis-backend.ts"],"sourcesContent":["/**\n * EventsModule — DynamicModule factory for the event bus subsystem.\n *\n * Register once in AppModule:\n * ```typescript\n * @Module({\n * imports: [\n * EventsModule.forRoot({ backend: 'drizzle' }),\n * ],\n * })\n * export class AppModule {}\n * ```\n *\n * Tests swap to the memory backend without touching application code:\n * ```typescript\n * Test.createTestingModule({\n * imports: [EventsModule.forRoot({ backend: 'memory' })],\n * });\n * ```\n *\n * `global: true` means entity modules do not need to import EventsModule\n * individually — the EVENT_BUS token is available project-wide.\n */\nimport { Module, type DynamicModule } from '@nestjs/common';\nimport { EVENT_BUS, REDIS_URL } from './events.tokens';\nimport { DrizzleEventBus } from './event-bus.drizzle-backend';\nimport { MemoryEventBus } from './event-bus.memory-backend';\nimport { RedisEventBus } from './event-bus.redis-backend';\n\nexport interface EventsModuleOptions {\n backend: 'drizzle' | 'memory' | 'redis';\n /**\n * Redis connection URL used when `backend` is `'redis'`.\n * Falls back to the REDIS_URL environment variable, then\n * `redis://localhost:6379` if neither is set.\n */\n redisUrl?: string;\n}\n\nexport interface EventsModuleAsyncOptions {\n useFactory: (...args: unknown[]) => Promise<EventsModuleOptions> | EventsModuleOptions;\n inject?: unknown[];\n imports?: unknown[];\n}\n\n@Module({})\nexport class EventsModule {\n static forRootAsync(asyncOptions: EventsModuleAsyncOptions): DynamicModule {\n return {\n module: EventsModule,\n global: true,\n imports: (asyncOptions.imports ?? []) as Parameters<typeof Module>[0]['imports'],\n providers: [\n {\n provide: 'EVENTS_MODULE_OPTIONS',\n useFactory: asyncOptions.useFactory,\n inject: (asyncOptions.inject ?? []) as (string | symbol | Function)[],\n },\n {\n provide: EVENT_BUS,\n useFactory: (options: EventsModuleOptions) => {\n const mod = EventsModule.forRoot(options);\n // Return the provider instance by delegating to forRoot's logic\n const provider = mod.providers?.find(\n (p) => typeof p === 'object' && p !== null && 'provide' in p && p.provide === EVENT_BUS,\n );\n if (provider && typeof provider === 'object' && 'useClass' in provider) {\n return new (provider.useClass as new () => unknown)();\n }\n throw new Error('EventsModule.forRootAsync: failed to resolve provider');\n },\n inject: ['EVENTS_MODULE_OPTIONS'],\n },\n ],\n exports: [EVENT_BUS],\n };\n }\n\n static forRoot(\n options: EventsModuleOptions = { backend: 'drizzle' },\n ): DynamicModule {\n if (options.backend === 'redis') {\n const resolvedUrl =\n options.redisUrl ?? process.env['REDIS_URL'] ?? 'redis://localhost:6379';\n\n return {\n module: EventsModule,\n global: true,\n providers: [\n { provide: REDIS_URL, useValue: resolvedUrl },\n { provide: EVENT_BUS, useClass: RedisEventBus },\n // Register concrete class so NestJS can resolve lifecycle hooks\n RedisEventBus,\n ],\n exports: [EVENT_BUS],\n };\n }\n\n const provider =\n options.backend === 'drizzle'\n ? { provide: EVENT_BUS, useClass: DrizzleEventBus }\n : { provide: EVENT_BUS, useClass: MemoryEventBus };\n\n return {\n module: EventsModule,\n global: true,\n providers: [provider],\n exports: [EVENT_BUS],\n };\n }\n}\n","/**\n * Injection token for the event bus.\n *\n * String constant (not Symbol) so it matches by value across import boundaries.\n * Matches the token in runtime/constants/tokens.ts — both are 'EVENT_BUS'.\n *\n * Usage in use cases:\n * ```typescript\n * constructor(@Inject(EVENT_BUS) private readonly eventBus: IEventBus) {}\n * ```\n */\nexport const EVENT_BUS = 'EVENT_BUS' as const;\n\n/**\n * Injection token for the Redis connection URL used by RedisEventBus.\n * Provided automatically by EventsModule.forRoot({ backend: 'redis' }).\n */\nexport const REDIS_URL = Symbol('REDIS_URL');\n","/**\n * DrizzleEventBus — Postgres-backed event bus using the transactional outbox pattern.\n *\n * Events are inserted into the `domain_events` table within the caller's\n * Drizzle transaction. A background polling loop (started on module init)\n * reads unprocessed events and dispatches them to registered subscribers.\n *\n * When the transaction rolls back, the event is never persisted — no\n * phantom events.\n *\n * This backend is suitable until you need real-time fan-out or very high\n * throughput. At that point, swap the backend for Redis Streams or similar\n * via EventsModule.forRoot({ backend: '...' }) without touching use cases.\n */\nimport { Injectable, OnModuleDestroy, OnModuleInit, Inject, Logger } from '@nestjs/common';\nimport { eq, and, sql } from 'drizzle-orm';\nimport type { DomainEvent, DrizzleTransaction, IEventBus } from './event-bus.protocol';\nimport type { DrizzleClient } from '../../types/drizzle';\nimport { domainEvents } from './domain-events.schema';\nimport { DRIZZLE } from '../../constants/tokens';\n\n/** How long to wait between polling cycles (ms). */\nconst POLL_INTERVAL_MS = 1_000;\n/** Max events claimed per polling cycle to bound memory usage. */\nconst POLL_BATCH_SIZE = 50;\n/** Max processing attempts before marking an event failed. */\nconst MAX_RETRIES = 3;\n\n@Injectable()\nexport class DrizzleEventBus implements IEventBus, OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(DrizzleEventBus.name);\n private polling = false;\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly handlers = new Map<string, Set<(event: DomainEvent) => Promise<void>>>();\n\n constructor(@Inject(DRIZZLE) private readonly db: DrizzleClient) {}\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async onModuleInit(): Promise<void> {\n this.polling = true;\n this.schedulePoll();\n }\n\n async onModuleDestroy(): Promise<void> {\n this.polling = false;\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n }\n\n // ============================================================================\n // IEventBus\n // ============================================================================\n\n async publish(event: DomainEvent, tx?: DrizzleTransaction): Promise<void> {\n const client = (tx ?? this.db) as DrizzleClient;\n await client.insert(domainEvents).values({\n id: event.id,\n type: event.type,\n aggregateId: event.aggregateId,\n aggregateType: event.aggregateType,\n payload: event.payload,\n occurredAt: event.occurredAt,\n processedAt: null,\n status: 'pending',\n metadata: event.metadata,\n });\n }\n\n async publishMany(events: DomainEvent[], tx?: DrizzleTransaction): Promise<void> {\n if (events.length === 0) return;\n const client = (tx ?? this.db) as DrizzleClient;\n await client.insert(domainEvents).values(\n events.map((e) => ({\n id: e.id,\n type: e.type,\n aggregateId: e.aggregateId,\n aggregateType: e.aggregateType,\n payload: e.payload,\n occurredAt: e.occurredAt,\n processedAt: null,\n status: 'pending' as const,\n metadata: e.metadata,\n })),\n );\n }\n\n subscribe<T extends DomainEvent = DomainEvent>(\n eventType: string,\n handler: (event: T) => Promise<void>,\n ): () => void {\n if (!this.handlers.has(eventType)) {\n this.handlers.set(eventType, new Set());\n }\n const set = this.handlers.get(eventType)!;\n const h = handler as (event: DomainEvent) => Promise<void>;\n set.add(h);\n return () => {\n set.delete(h);\n };\n }\n\n // ============================================================================\n // Polling\n // ============================================================================\n\n private schedulePoll(): void {\n if (!this.polling) return;\n this.pollTimer = setTimeout(async () => {\n try {\n await this.processBatch();\n } catch (err) {\n this.logger.error(`Poll cycle error: ${err}`);\n } finally {\n this.schedulePoll();\n }\n }, POLL_INTERVAL_MS);\n }\n\n private async processBatch(): Promise<void> {\n // Fetch a batch of pending events with FOR UPDATE SKIP LOCKED to prevent\n // double-processing when multiple instances are polling concurrently.\n const rows = await this.db.transaction(async (tx) => {\n return tx.execute(\n sql`SELECT * FROM domain_events WHERE status = 'pending' ORDER BY occurred_at ASC LIMIT ${POLL_BATCH_SIZE} FOR UPDATE SKIP LOCKED`,\n ) as Promise<{ rows: Record<string, unknown>[] }>;\n }).then((result) => (result as unknown as { rows: Record<string, unknown>[] }).rows ?? result as unknown as Record<string, unknown>[]);\n\n for (const row of rows) {\n const event: DomainEvent = {\n id: row['id'] as string,\n type: row['type'] as string,\n aggregateId: row['aggregate_id'] as string,\n aggregateType: row['aggregate_type'] as string,\n payload: row['payload'] as Record<string, unknown>,\n occurredAt: new Date(row['occurred_at'] as string),\n metadata: row['metadata'] as Record<string, unknown> | undefined,\n };\n\n let attempt = 0;\n let lastError: unknown;\n while (attempt < MAX_RETRIES) {\n try {\n await this.dispatch(event);\n // Mark processed\n await this.db\n .update(domainEvents)\n .set({ status: 'processed', processedAt: new Date() })\n .where(eq(domainEvents.id, event.id));\n lastError = undefined;\n break;\n } catch (err) {\n lastError = err;\n attempt++;\n }\n }\n\n if (lastError !== undefined) {\n const errorMessage = lastError instanceof Error ? lastError.message : String(lastError);\n await this.db\n .update(domainEvents)\n .set({ status: 'failed', error: errorMessage })\n .where(and(eq(domainEvents.id, event.id), eq(domainEvents.status, 'pending')));\n }\n }\n }\n\n private async dispatch(event: DomainEvent): Promise<void> {\n const set = this.handlers.get(event.type);\n if (!set) return;\n\n let firstError: unknown;\n for (const handler of set) {\n try {\n await handler(event);\n } catch (err) {\n this.logger.error(\n `Handler error for event type \"${event.type}\" (id: ${event.id}): ${err}`,\n );\n if (firstError === undefined) {\n firstError = err;\n }\n }\n }\n\n if (firstError !== undefined) {\n throw firstError;\n }\n }\n}\n","/**\n * Drizzle schema for the domain_events outbox table.\n *\n * This table backs the DrizzleEventBus. Events are inserted within the\n * same database transaction as the domain write (outbox pattern). A\n * polling process reads unprocessed rows and dispatches to subscribers.\n *\n * Indexes:\n * - (status, occurredAt) — polling query filter\n * - (aggregateId, aggregateType) — event replay per aggregate\n */\nimport {\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from 'drizzle-orm/pg-core';\nimport type { InferSelectModel } from 'drizzle-orm';\n\nexport const domainEvents = pgTable(\n 'domain_events',\n {\n id: uuid('id').primaryKey(),\n type: text('type').notNull(),\n aggregateId: text('aggregate_id').notNull(),\n aggregateType: text('aggregate_type').notNull(),\n payload: jsonb('payload').notNull().$type<Record<string, unknown>>(),\n occurredAt: timestamp('occurred_at', { withTimezone: true }).notNull(),\n processedAt: timestamp('processed_at', { withTimezone: true }),\n /** Lifecycle status: pending | processed | failed */\n status: text('status').notNull().default('pending'),\n /** Error message from the last failed dispatch attempt. */\n error: text('error'),\n metadata: jsonb('metadata').$type<Record<string, unknown>>(),\n },\n // Indexes: add via migration when deploying\n // - (status, occurred_at) for polling\n // - (aggregate_id, aggregate_type) for replay\n);\n\nexport type DomainEventRecord = InferSelectModel<typeof domainEvents>;\n","/**\n * NestJS injection tokens\n *\n * Used with @Inject() decorator in concrete repository constructors.\n */\n\n/**\n * Injection token for the Drizzle ORM database client.\n *\n * Usage in concrete repositories:\n * ```typescript\n * constructor(@Inject(DRIZZLE) db: DrizzleClient) { super(db); }\n * ```\n */\nexport const DRIZZLE = 'DRIZZLE' as const;\n\n/**\n * Injection token for the event bus (IEventBus).\n *\n * Optional — only resolved when EventsModule.forRoot() is registered.\n * BaseService uses this with @Optional() to emit lifecycle events\n * without requiring the events subsystem to be installed.\n *\n * Usage in services/use cases:\n * ```typescript\n * @Optional() @Inject(EVENT_BUS) eventBus?: IEventBus\n * ```\n */\nexport const EVENT_BUS = 'EVENT_BUS' as const;\n","/**\n * MemoryEventBus — in-memory backend for the event bus.\n *\n * Dispatches events synchronously to registered subscribers. The `tx`\n * parameter is ignored — all events are dispatched immediately.\n *\n * Use this backend in tests to assert event publication without a database.\n * Swap via EventsModule.forRoot({ backend: 'memory' }).\n */\nimport { Injectable, Logger } from '@nestjs/common';\nimport type { DomainEvent, IEventBus } from './event-bus.protocol';\n\n@Injectable()\nexport class MemoryEventBus implements IEventBus {\n private readonly logger = new Logger(MemoryEventBus.name);\n\n /** All events published since construction (or last clear). */\n readonly publishedEvents: DomainEvent[] = [];\n\n private readonly handlers = new Map<string, Set<(event: DomainEvent) => Promise<void>>>();\n\n async publish(event: DomainEvent): Promise<void> {\n this.publishedEvents.push(event);\n await this.dispatch(event);\n }\n\n async publishMany(events: DomainEvent[]): Promise<void> {\n for (const event of events) {\n await this.publish(event);\n }\n }\n\n subscribe<T extends DomainEvent = DomainEvent>(\n eventType: string,\n handler: (event: T) => Promise<void>,\n ): () => void {\n if (!this.handlers.has(eventType)) {\n this.handlers.set(eventType, new Set());\n }\n // Cast is safe — callers pass a typed handler; we store as the base type\n const set = this.handlers.get(eventType)!;\n const h = handler as (event: DomainEvent) => Promise<void>;\n set.add(h);\n\n return () => {\n set.delete(h);\n };\n }\n\n /** Remove all published events and subscriptions. Useful in beforeEach. */\n clear(): void {\n this.publishedEvents.length = 0;\n this.handlers.clear();\n }\n\n private async dispatch(event: DomainEvent): Promise<void> {\n const set = this.handlers.get(event.type);\n if (!set) return;\n\n let firstError: unknown;\n for (const handler of set) {\n try {\n await handler(event);\n } catch (err) {\n this.logger.error(\n `Handler error for event type \"${event.type}\" (id: ${event.id}): ${err}`,\n );\n if (firstError === undefined) {\n firstError = err;\n }\n }\n }\n\n if (firstError !== undefined) {\n throw firstError;\n }\n }\n}\n","/**\n * RedisEventBus — Redis Pub/Sub backend for the event bus.\n *\n * Publishes events to Redis channels and dispatches incoming messages to\n * registered in-process subscribers. Events are serialized as JSON strings.\n *\n * Channel naming:\n * - Per-type channel: events:{event.type} (e.g. events:contact_created)\n * - Catch-all channel: events:*\n *\n * Transactional semantics:\n * The `tx` parameter (Drizzle transaction) is accepted to satisfy the\n * IEventBus interface but has no effect — Redis Pub/Sub is not transactional.\n * Events published with a `tx` argument are dispatched immediately without\n * waiting for the surrounding transaction to commit. If you need\n * at-least-once delivery tied to a database transaction, use DrizzleEventBus.\n *\n * Connection model:\n * ioredis requires a dedicated connection for subscribers (a client in\n * subscribe mode cannot issue regular commands). This backend creates two\n * clients: one for publishing (`publisher`) and one for subscribing\n * (`subscriber`). Both are connected on module init and disconnected on\n * module destroy.\n *\n * Usage:\n * EventsModule.forRoot({ backend: 'redis', redisUrl: 'redis://localhost:6379' })\n *\n * Requires `ioredis` — install it separately if you use this backend:\n * npm install ioredis / bun add ioredis\n */\nimport { Injectable, OnModuleInit, OnModuleDestroy, Inject, Logger } from '@nestjs/common';\nimport type { DomainEvent, DrizzleTransaction, IEventBus } from './event-bus.protocol';\nimport { REDIS_URL } from './events.tokens';\n\n/** Redis channel prefix for all domain events. */\nconst CHANNEL_PREFIX = 'events:';\n/** Catch-all channel that receives every published event. */\nconst WILDCARD_CHANNEL = 'events:*';\n\n// ioredis is an optional peer dependency; import lazily so consumers who do\n// not use this backend do not need it on their classpath.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RedisClient = any;\n\nasync function createRedisClient(url: string): Promise<RedisClient> {\n let Redis: { new (url: string): RedisClient };\n try {\n const mod = await import('ioredis');\n Redis = mod.default ?? mod;\n } catch {\n throw new Error(\n 'RedisEventBus requires the \"ioredis\" package. Install it with: npm install ioredis',\n );\n }\n return new Redis(url);\n}\n\n@Injectable()\nexport class RedisEventBus implements IEventBus, OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(RedisEventBus.name);\n\n private publisher: RedisClient | null = null;\n private subscriber: RedisClient | null = null;\n private connected = false;\n\n /**\n * In-process subscriber registry. Handlers registered here are called when\n * a message arrives on the subscriber client — keeping fan-out within the\n * same process without an extra round-trip through Redis.\n */\n private readonly handlers = new Map<string, Set<(event: DomainEvent) => Promise<void>>>();\n\n /**\n * Track which event types have active Redis subscriptions.\n * Used to avoid subscribing multiple times to the same type channel.\n */\n private readonly subscribedTypes = new Set<string>();\n\n constructor(@Inject(REDIS_URL) private readonly redisUrl: string) {}\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async onModuleInit(): Promise<void> {\n this.publisher = await createRedisClient(this.redisUrl);\n this.subscriber = await createRedisClient(this.redisUrl);\n\n // Surface connection errors without crashing the process.\n this.publisher.on('error', (err: Error) =>\n this.logger.error(`Redis publisher error: ${err.message}`, err.stack),\n );\n this.subscriber.on('error', (err: Error) =>\n this.logger.error(`Redis subscriber error: ${err.message}`, err.stack),\n );\n\n // Set up message listener for per-type subscriptions.\n // Subscriptions are created lazily when the first handler is registered for a type.\n this.subscriber.on('message', (channel: string, message: string) => {\n void this.handleMessage(channel, message);\n });\n\n this.connected = true;\n this.logger.log(`RedisEventBus connected to ${this.redisUrl}`);\n }\n\n async onModuleDestroy(): Promise<void> {\n this.connected = false;\n\n if (this.subscriber) {\n // Unsubscribe from all channels and disconnect the subscriber.\n // unsubscribe() with no args unsubscribes from all channels.\n await this.subscriber.unsubscribe();\n this.subscriber.disconnect();\n this.subscriber = null;\n }\n\n if (this.publisher) {\n this.publisher.disconnect();\n this.publisher = null;\n }\n\n this.subscribedTypes.clear();\n this.logger.log('RedisEventBus disconnected');\n }\n\n // ============================================================================\n // IEventBus\n // ============================================================================\n\n /**\n * Publish a single event.\n *\n * `tx` is accepted but ignored — see module-level JSDoc for details.\n */\n async publish(event: DomainEvent, tx?: DrizzleTransaction): Promise<void> {\n void tx; // intentionally unused — Redis Pub/Sub is not transactional\n this.assertConnected();\n\n const payload = this.serialize(event);\n const channel = `${CHANNEL_PREFIX}${event.type}`;\n\n await this.publisher!.publish(channel, payload);\n }\n\n /**\n * Publish multiple events using a pipeline so all PUBLISH commands are sent\n * in a single round-trip.\n *\n * `tx` is accepted but ignored — see module-level JSDoc for details.\n */\n async publishMany(events: DomainEvent[], tx?: DrizzleTransaction): Promise<void> {\n void tx; // intentionally unused — Redis Pub/Sub is not transactional\n if (events.length === 0) return;\n this.assertConnected();\n\n const pipeline = this.publisher!.pipeline();\n for (const event of events) {\n const payload = this.serialize(event);\n const channel = `${CHANNEL_PREFIX}${event.type}`;\n pipeline.publish(channel, payload);\n }\n await pipeline.exec();\n }\n\n /**\n * Register a handler for a specific event type.\n * Returns an unsubscribe function — call it to remove the handler.\n *\n * On first handler for a type, subscribes to the per-type Redis channel.\n * On removal of the last handler for a type, unsubscribes from the channel.\n */\n subscribe<T extends DomainEvent = DomainEvent>(\n eventType: string,\n handler: (event: T) => Promise<void>,\n ): () => void {\n if (!this.handlers.has(eventType)) {\n this.handlers.set(eventType, new Set());\n // First handler for this type — subscribe to the per-type channel in Redis.\n void this.subscribeToType(eventType);\n }\n const set = this.handlers.get(eventType)!;\n const h = handler as (event: DomainEvent) => Promise<void>;\n set.add(h);\n\n return () => {\n set.delete(h);\n // If no more handlers for this type, unsubscribe from the Redis channel.\n if (set.size === 0) {\n this.handlers.delete(eventType);\n void this.unsubscribeFromType(eventType);\n }\n };\n }\n\n // ============================================================================\n // Internal helpers\n // ============================================================================\n\n private assertConnected(): void {\n if (!this.connected || !this.publisher) {\n throw new Error(\n 'RedisEventBus is not connected. Ensure the module has been initialised before publishing.',\n );\n }\n }\n\n private serialize(event: DomainEvent): string {\n return JSON.stringify({\n ...event,\n occurredAt: event.occurredAt.toISOString(),\n });\n }\n\n private deserialize(raw: string): DomainEvent {\n const parsed = JSON.parse(raw) as DomainEvent & { occurredAt: string };\n return {\n ...parsed,\n occurredAt: new Date(parsed.occurredAt),\n };\n }\n\n private async handleMessage(channel: string, message: string): Promise<void> {\n let event: DomainEvent;\n try {\n event = this.deserialize(message);\n } catch (err) {\n this.logger.warn(`Failed to deserialize event on channel \"${channel}\": ${err}`);\n return;\n }\n\n await this.dispatch(event);\n }\n\n private async dispatch(event: DomainEvent): Promise<void> {\n const set = this.handlers.get(event.type);\n if (!set) return;\n for (const handler of set) {\n try {\n await handler(event);\n } catch (err) {\n this.logger.error(\n `Handler error for event type \"${event.type}\" (id: ${event.id}): ${err}`,\n );\n }\n }\n }\n\n /**\n * Subscribe to a per-type Redis channel.\n * Called lazily when the first handler is registered for a type.\n */\n private async subscribeToType(eventType: string): Promise<void> {\n if (this.subscribedTypes.has(eventType)) {\n return; // Already subscribed to this type.\n }\n\n const channel = `${CHANNEL_PREFIX}${eventType}`;\n try {\n await this.subscriber!.subscribe(channel);\n this.subscribedTypes.add(eventType);\n } catch (err) {\n this.logger.error(`Failed to subscribe to channel \"${channel}\": ${err}`);\n }\n }\n\n /**\n * Unsubscribe from a per-type Redis channel.\n * Called when the last handler for a type is removed.\n */\n private async unsubscribeFromType(eventType: string): Promise<void> {\n if (!this.subscribedTypes.has(eventType)) {\n return; // Not subscribed to this type.\n }\n\n const channel = `${CHANNEL_PREFIX}${eventType}`;\n try {\n await this.subscriber!.unsubscribe(channel);\n this.subscribedTypes.delete(eventType);\n } catch (err) {\n this.logger.error(`Failed to unsubscribe from channel \"${channel}\": ${err}`);\n }\n }\n}\n"],"mappings":"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","names":["Injectable","Logger","Logger","Injectable","Injectable","Inject","Logger","Logger","Injectable","Inject"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injection token for the event bus.
|
|
3
|
+
*
|
|
4
|
+
* String constant (not Symbol) so it matches by value across import boundaries.
|
|
5
|
+
* Matches the token in runtime/constants/tokens.ts — both are 'EVENT_BUS'.
|
|
6
|
+
*
|
|
7
|
+
* Usage in use cases:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* constructor(@Inject(EVENT_BUS) private readonly eventBus: IEventBus) {}
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
declare const EVENT_BUS: "EVENT_BUS";
|
|
13
|
+
/**
|
|
14
|
+
* Injection token for the Redis connection URL used by RedisEventBus.
|
|
15
|
+
* Provided automatically by EventsModule.forRoot({ backend: 'redis' }).
|
|
16
|
+
*/
|
|
17
|
+
declare const REDIS_URL: unique symbol;
|
|
18
|
+
|
|
19
|
+
export { EVENT_BUS, REDIS_URL };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../runtime/subsystems/events/events.tokens.ts"],"sourcesContent":["/**\n * Injection token for the event bus.\n *\n * String constant (not Symbol) so it matches by value across import boundaries.\n * Matches the token in runtime/constants/tokens.ts — both are 'EVENT_BUS'.\n *\n * Usage in use cases:\n * ```typescript\n * constructor(@Inject(EVENT_BUS) private readonly eventBus: IEventBus) {}\n * ```\n */\nexport const EVENT_BUS = 'EVENT_BUS' as const;\n\n/**\n * Injection token for the Redis connection URL used by RedisEventBus.\n * Provided automatically by EventsModule.forRoot({ backend: 'redis' }).\n */\nexport const REDIS_URL = Symbol('REDIS_URL');\n"],"mappings":";AAWO,IAAM,YAAY;AAMlB,IAAM,YAAY,uBAAO,WAAW;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { DomainEvent, DrizzleTransaction, IEventBus } from './event-bus.protocol.js';
|
|
2
|
+
export { EVENT_BUS } from './events.tokens.js';
|
|
3
|
+
export { EventsModule, EventsModuleOptions } from './events.module.js';
|
|
4
|
+
export { MemoryEventBus } from './event-bus.memory-backend.js';
|
|
5
|
+
export { DrizzleEventBus } from './event-bus.drizzle-backend.js';
|
|
6
|
+
export { RedisEventBus } from './event-bus.redis-backend.js';
|
|
7
|
+
export { DomainEventRecord, domainEvents } from './domain-events.schema.js';
|
|
8
|
+
import '../../types/drizzle.js';
|
|
9
|
+
import 'drizzle-orm/node-postgres';
|
|
10
|
+
import '@nestjs/common';
|
|
11
|
+
import 'drizzle-orm/pg-core';
|
|
12
|
+
import 'drizzle-orm';
|