// ---------------------------------------------------------------------------// WorkOsMirror — the WRITE side of cloud's local membership mirror.//// WorkOS owns users and organization memberships. This service keeps the// `accounts` / `memberships` rows (db/schema.ts) in step with it so the read// side (`auth/member-directory.ts`, the cloud `MemberDirectory`) never has to// ask WorkOS. Three feeders write through it: the login callback (user +// memberships already in hand), Executor-initiated changes (write-through in// `auth/handlers.ts` and `account/workos-account-service.ts`), and the WorkOS// Events API reconciler (dashboard-side changes, replayed in order from a// persisted cursor). The one-off backfill runs the same store out-of-band.//// The queries live in `workos-mirror-store.ts`; this file binds them to the// per-request `DbService`. Per-request layer shape, like `UserStoreService`:// it holds the request's postgres socket, so it is rebuilt per request// (`RequestScopedServicesLive`) and never shared across Workers requests.// ---------------------------------------------------------------------------import { Context, Effect, Layer } from "effect";import { DbService } from "../db/db";import { makeWorkOsMirrorStore, type WorkOsMirrorShape } from "./workos-mirror-store";export { WorkOsMirrorError } from "./errors";export { WorkOsMirrorWrite, mirrorMembershipFromWorkOs, mirrorUserFromWorkOs, type WorkOsMembershipPayload, type WorkOsMirrorMembership, type WorkOsMirrorMembershipRef, type WorkOsMirrorShape, type WorkOsMirrorUser, type WorkOsMirrorWriteOutcome, type WorkOsOrganizationScan, type WorkOsOrganizationScanWrites, type WorkOsScannedMember, type WorkOsUserPayload,} from "./workos-mirror-store";export class WorkOsMirror extends Context.Service<WorkOsMirror, WorkOsMirrorShape>()( "@executor-js/cloud/WorkOsMirror",) { static Live = Layer.effect(this)( Effect.map(DbService.asEffect(), ({ db }) => makeWorkOsMirrorStore(db)), );}/** * A FRESH `WorkOsMirror` layer (new layer value per call), for a service built * once but invoked across many Workers requests — the same reason * `makeUserStoreLayer` exists. See [[makeDbLayer]]. */export const makeWorkOsMirrorLayer = (): Layer.Layer<WorkOsMirror, never, DbService> => Layer.effect(WorkOsMirror)( Effect.map(DbService.asEffect(), ({ db }) => makeWorkOsMirrorStore(db)), );
// ---------------------------------------------------------------------------
// WorkOsMirror — the WRITE side of cloud's local membership mirror.
//
// WorkOS owns users and organization memberships. This service keeps the
// `accounts` / `memberships` rows (db/schema.ts) in step with it so the read
// side (`auth/member-directory.ts`, the cloud `MemberDirectory`) never has to
// ask WorkOS. Three feeders write through it: the login callback (user +
// memberships already in hand), Executor-initiated changes (write-through in
// `auth/handlers.ts` and `account/workos-account-service.ts`), and the WorkOS
// Events API reconciler (dashboard-side changes, replayed in order from a
// persisted cursor). The one-off backfill runs the same store out-of-band.
//
// The queries live in `workos-mirror-store.ts`; this file binds them to the
// per-request `DbService`. Per-request layer shape, like `UserStoreService`:
// it holds the request's postgres socket, so it is rebuilt per request
// (`RequestScopedServicesLive`) and never shared across Workers requests.
// ---------------------------------------------------------------------------
import { Context, Effect, Layer } from "effect";
import { DbService } from "../db/db";
import { makeWorkOsMirrorStore, type WorkOsMirrorShape } from "./workos-mirror-store";
export { WorkOsMirrorError } from "./errors";
export {
WorkOsMirrorWrite,
mirrorMembershipFromWorkOs,
mirrorUserFromWorkOs,
type WorkOsMembershipPayload,
type WorkOsMirrorMembership,
type WorkOsMirrorMembershipRef,
type WorkOsMirrorShape,
type WorkOsMirrorUser,
type WorkOsMirrorWriteOutcome,
type WorkOsOrganizationScan,
type WorkOsOrganizationScanWrites,
type WorkOsScannedMember,
type WorkOsUserPayload,
} from "./workos-mirror-store";
export class WorkOsMirror extends Context.Service<WorkOsMirror, WorkOsMirrorShape>()(
"@executor-js/cloud/WorkOsMirror",
) {
static Live = Layer.effect(this)(
Effect.map(DbService.asEffect(), ({ db }) => makeWorkOsMirrorStore(db)),
);
}
/**
* A FRESH `WorkOsMirror` layer (new layer value per call), for a service built
* once but invoked across many Workers requests — the same reason
* `makeUserStoreLayer` exists. See [[makeDbLayer]].
*/
export const makeWorkOsMirrorLayer = (): Layer.Layer<WorkOsMirror, never, DbService> =>
Layer.effect(WorkOsMirror)(
Effect.map(DbService.asEffect(), ({ db }) => makeWorkOsMirrorStore(db)),
);