import type Redis from "ioredis";
import type { ServerEventEnvelope } from "@slackwsh/contracts";
/** Every active workspace member — the fanout list for a workspace-wide
 * mutation (tasks, calendar events).
 *
 * Tasks and events are workspace-wide rather than channel-gated, and there is
 * no equivalent of `ch:{channelId}`'s "join on open" for a workspace room a
 * client can rely on always having joined (apps/gateway only joins
 * `ws:{workspaceId}` as a side effect of `channel:join`). So — mirroring
 * sendMessage's personal-fanout-to-peers pattern (§4.3) rather than `ws:`
 * room broadcast — these events go to every active member's own `u:{userId}`
 * room, which every connected socket joins unconditionally on connect. */
export declare function activeWorkspaceMemberIds(tx: any, workspaceId: number): Promise<number[]>;
/** Publishes one envelope into every listed member's personal room.
 *
 * Concurrent, not sequential: publishRoomEvent never throws, and a workspace
 * of a few hundred members shouldn't cost a few hundred serialized Redis
 * round-trips on the mutation's response path. */
export declare function fanoutToMembers(redis: Redis, memberIds: number[], event: ServerEventEnvelope): Promise<void>;
//# sourceMappingURL=member-fanout.d.ts.map