import { S3Client } from "@aws-sdk/client-s3"
import { S3, S3Service } from "@effect-aws/client-s3"
import { MinioContainer } from "@testcontainers/minio"
import * as ConfigProvider from "effect/ConfigProvider"
import * as Effect from "effect/Effect"
import * as Layer from "effect/Layer"
export class FilesContainer extends Effect.Service<FilesContainer>()("FilesContainer", {
scoped: Effect.acquireRelease(
Effect.promise(() => new MinioContainer("minio/minio:latest").withUsername("minioadmin").withPassword("minioadmin").start()),
(container) => Effect.promise(() => container.stop())
),
}) {
static readonly Live = Layer.effectDiscard(
Effect.gen(function* () {
const s3 = yield* S3
yield* s3.createBucket({ Bucket: "test-bucket" })
return Layer.setConfigProvider(ConfigProvider.fromMap(new Map([["AWS_BUCKET_NAME", "test-bucket"]])))
})
).pipe(
Layer.provideMerge(
Layer.unwrapEffect(
Effect.gen(function* () {
const container = yield* FilesContainer
return S3Service.baseLayer(
() =>
new S3Client({
endpoint: container.getConnectionUrl(),
region: "us-east-1",
requestChecksumCalculation: "WHEN_REQUIRED",
responseChecksumValidation: "WHEN_REQUIRED",
forcePathStyle: true,
credentials: {
accessKeyId: container.getUsername(),
secretAccessKey: container.getPassword(),
},
})
)
})
)
),
Layer.provide(FilesContainer.Default),
Layer.orDie
)
}
import { S3Client } from "@aws-sdk/client-s3"
import { S3, S3Service } from "@effect-aws/client-s3"
import { MinioContainer } from "@testcontainers/minio"
import * as ConfigProvider from "effect/ConfigProvider"
import * as Effect from "effect/Effect"
import * as Layer from "effect/Layer"
export class FilesContainer extends Effect.Service<FilesContainer>()("FilesContainer", {
scoped: Effect.acquireRelease(
Effect.promise(() => new MinioContainer("minio/minio:latest").withUsername("minioadmin").withPassword("minioadmin").start()),
(container) => Effect.promise(() => container.stop())
),
}) {
static readonly Live = Layer.effectDiscard(
Effect.gen(function* () {
const s3 = yield* S3
yield* s3.createBucket({ Bucket: "test-bucket" })
return Layer.setConfigProvider(ConfigProvider.fromMap(new Map([["AWS_BUCKET_NAME", "test-bucket"]])))
})
).pipe(
Layer.provideMerge(
Layer.unwrapEffect(
Effect.gen(function* () {
const container = yield* FilesContainer
return S3Service.baseLayer(
() =>
new S3Client({
endpoint: container.getConnectionUrl(),
region: "us-east-1",
requestChecksumCalculation: "WHEN_REQUIRED",
responseChecksumValidation: "WHEN_REQUIRED",
forcePathStyle: true,
credentials: {
accessKeyId: container.getUsername(),
secretAccessKey: container.getPassword(),
},
})
)
})
)
),
Layer.provide(FilesContainer.Default),
Layer.orDie
)
}