export class PrismaService extends Service<PrismaService>()("PrismaService", {
effect: Effect.gen(function* () {
return {
$transaction: <R, E, A>(
effect: Effect.Effect<A, E, R>,
options?: {
maxWait?: number;
timeout?: number;
isolationLevel?: Prisma.TransactionIsolationLevel;
},
) =>
Effect.flatMap(
Effect.all([PrismaClientService, Effect.runtime<R>()]),
([{ client, tx }, runtime]): Effect.Effect<A, E | PrismaError, R> => {
const isRootClient = "$transaction" in tx;
if (!isRootClient) {
return effect;
}
return Effect.tryPromise(() =>
client.$transaction(async (tx) => {
return await Runtime.runPromise(runtime)(
effect.pipe(
Effect.provideService(PrismaClientService, {
tx,
client,
}),
) as Effect.Effect<A, E, R>,
);
}, options),
) as unknown as Effect.Effect<A, E, R>;
},
),
...
};
}),
}) {}
export class PrismaService extends Service<PrismaService>()("PrismaService", {
effect: Effect.gen(function* () {
return {
$transaction: <R, E, A>(
effect: Effect.Effect<A, E, R>,
options?: {
maxWait?: number;
timeout?: number;
isolationLevel?: Prisma.TransactionIsolationLevel;
},
) =>
Effect.flatMap(
Effect.all([PrismaClientService, Effect.runtime<R>()]),
([{ client, tx }, runtime]): Effect.Effect<A, E | PrismaError, R> => {
const isRootClient = "$transaction" in tx;
if (!isRootClient) {
return effect;
}
return Effect.tryPromise(() =>
client.$transaction(async (tx) => {
return await Runtime.runPromise(runtime)(
effect.pipe(
Effect.provideService(PrismaClientService, {
tx,
client,
}),
) as Effect.Effect<A, E, R>,
);
}, options),
) as unknown as Effect.Effect<A, E, R>;
},
),
...
};
}),
}) {}