diff --git a/packages/auth/package.json b/packages/auth/package.json index 668dd65..4811277 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -21,6 +21,7 @@ }, "dependencies": { "@repo/core-events": "workspace:*", + "@repo/core-realtime": "workspace:*", "@repo/core-shared": "workspace:*", "@trpc/server": "^11.0.0", "inversify": "^6.2.0", diff --git a/packages/auth/src/di/bind-dev-seed.test.ts b/packages/auth/src/di/bind-dev-seed.test.ts index 939b03d..28ee4dc 100644 --- a/packages/auth/src/di/bind-dev-seed.test.ts +++ b/packages/auth/src/di/bind-dev-seed.test.ts @@ -1,7 +1,8 @@ import "reflect-metadata"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { NoopTracer, NoopLogger } from "@repo/core-shared/instrumentation"; -import { RecordingEventBus, RecordingJobQueue } from "@repo/core-testing/instrumentation"; +import { RecordingEventBus, RecordingJobQueue, RecordingRealtimeBroadcaster } from "@repo/core-testing/instrumentation"; +import { RealtimeHandlerRegistry } from "@repo/core-realtime"; import { bindDevSeedAuth } from "@/di/bind-dev-seed"; import { authContainer } from "@/di/container"; import { AUTH_SYMBOLS } from "@/di/symbols"; @@ -32,7 +33,7 @@ describe("bindDevSeedAuth", () => { }); it("populates the repository with the dev users", async () => { - await bindDevSeedAuth(noop.tracer, noop.logger, new RecordingEventBus(), new RecordingJobQueue()); + await bindDevSeedAuth(noop.tracer, noop.logger, new RecordingEventBus(), new RecordingJobQueue(), new RecordingRealtimeBroadcaster(), new RealtimeHandlerRegistry()); const repo = authContainer.get( AUTH_SYMBOLS.IUsersRepository, @@ -45,7 +46,7 @@ describe("bindDevSeedAuth", () => { }); it("seeds alice reachable by username", async () => { - await bindDevSeedAuth(noop.tracer, noop.logger, new RecordingEventBus(), new RecordingJobQueue()); + await bindDevSeedAuth(noop.tracer, noop.logger, new RecordingEventBus(), new RecordingJobQueue(), new RecordingRealtimeBroadcaster(), new RealtimeHandlerRegistry()); const repo = authContainer.get( AUTH_SYMBOLS.IUsersRepository, @@ -58,13 +59,13 @@ describe("bindDevSeedAuth", () => { }); it("is idempotent — calling twice rebuilds a fresh populated repo", async () => { - await bindDevSeedAuth(noop.tracer, noop.logger, new RecordingEventBus(), new RecordingJobQueue()); + await bindDevSeedAuth(noop.tracer, noop.logger, new RecordingEventBus(), new RecordingJobQueue(), new RecordingRealtimeBroadcaster(), new RealtimeHandlerRegistry()); const before = authContainer.get( AUTH_SYMBOLS.IUsersRepository, ); const beforeAlice = await before.getUserByUsername("alice"); - await bindDevSeedAuth(noop.tracer, noop.logger, new RecordingEventBus(), new RecordingJobQueue()); + await bindDevSeedAuth(noop.tracer, noop.logger, new RecordingEventBus(), new RecordingJobQueue(), new RecordingRealtimeBroadcaster(), new RealtimeHandlerRegistry()); const after = authContainer.get( AUTH_SYMBOLS.IUsersRepository, ); diff --git a/packages/auth/src/di/bind-dev-seed.ts b/packages/auth/src/di/bind-dev-seed.ts index 37f3d84..caa083f 100644 --- a/packages/auth/src/di/bind-dev-seed.ts +++ b/packages/auth/src/di/bind-dev-seed.ts @@ -6,6 +6,7 @@ import { type ILogger, } from "@repo/core-shared/instrumentation"; import type { IEventBus } from "@repo/core-events"; +import type { IRealtimeBroadcaster, IRealtimeHandlerRegistry } from "@repo/core-realtime"; import type { IJobQueue } from "@repo/core-shared/jobs"; import { authContainer } from "./container.js"; import { AUTH_SYMBOLS } from "./symbols.js"; @@ -38,6 +39,8 @@ export async function bindDevSeedAuth( logger: ILogger, bus: IEventBus, queue: IJobQueue, + realtime: IRealtimeBroadcaster, + realtimeRegistry: IRealtimeHandlerRegistry, ): Promise { // Bind shared instrumentation into feature container if (authContainer.isBound(INSTRUMENTATION_SYMBOLS.TRACER)) { @@ -151,6 +154,8 @@ export async function bindDevSeedAuth( // output at the / anchors below. void bus; void queue; + void realtime; + void realtimeRegistry; // // // diff --git a/packages/auth/src/di/bind-production.ts b/packages/auth/src/di/bind-production.ts index b498e61..759453a 100644 --- a/packages/auth/src/di/bind-production.ts +++ b/packages/auth/src/di/bind-production.ts @@ -7,6 +7,7 @@ import { type ILogger, } from "@repo/core-shared/instrumentation"; import type { IEventBus } from "@repo/core-events"; +import type { IRealtimeBroadcaster, IRealtimeHandlerRegistry } from "@repo/core-realtime"; import type { IJobQueue } from "@repo/core-shared/jobs"; import { authContainer } from "./container"; import { AUTH_SYMBOLS } from "./symbols"; @@ -29,6 +30,8 @@ export function bindProductionAuth( logger: ILogger, bus: IEventBus, queue: IJobQueue, + realtime: IRealtimeBroadcaster, + realtimeRegistry: IRealtimeHandlerRegistry, ): void { if (bound) return; bound = true; @@ -149,6 +152,8 @@ export function bindProductionAuth( // output at the / anchors below. void bus; void queue; + void realtime; + void realtimeRegistry; // // // diff --git a/packages/core-testing/src/instrumentation/recording-realtime-broadcaster.ts b/packages/core-testing/src/instrumentation/recording-realtime-broadcaster.ts index 2ea6ce8..1151c47 100644 --- a/packages/core-testing/src/instrumentation/recording-realtime-broadcaster.ts +++ b/packages/core-testing/src/instrumentation/recording-realtime-broadcaster.ts @@ -6,7 +6,7 @@ import type { z } from "zod"; type RealtimeChannelDescriptor = { readonly name: TName; readonly schema: TSchema; - readonly scope?: string; + readonly scope: string | { role: string } | { userScoped: true; template: string }; }; interface IRealtimeBroadcaster { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e7e0bc..9ed3c22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -330,6 +330,9 @@ importers: '@repo/core-events': specifier: workspace:* version: link:../core-events + '@repo/core-realtime': + specifier: workspace:* + version: link:../core-realtime '@repo/core-shared': specifier: workspace:* version: link:../core-shared @@ -373,6 +376,9 @@ importers: '@repo/core-events': specifier: workspace:* version: link:../core-events + '@repo/core-realtime': + specifier: workspace:* + version: link:../core-realtime '@repo/core-shared': specifier: workspace:* version: link:../core-shared @@ -809,6 +815,9 @@ importers: '@repo/core-events': specifier: workspace:* version: link:../core-events + '@repo/core-realtime': + specifier: workspace:* + version: link:../core-realtime '@repo/core-shared': specifier: workspace:* version: link:../core-shared @@ -852,6 +861,9 @@ importers: '@repo/core-events': specifier: workspace:* version: link:../core-events + '@repo/core-realtime': + specifier: workspace:* + version: link:../core-realtime '@repo/core-shared': specifier: workspace:* version: link:../core-shared @@ -892,6 +904,9 @@ importers: '@repo/core-events': specifier: workspace:* version: link:../core-events + '@repo/core-realtime': + specifier: workspace:* + version: link:../core-realtime '@repo/core-shared': specifier: workspace:* version: link:../core-shared