1import * as S3 from "@distilled.cloud/aws/s3";
2import * as Effect from "effect/Effect";
3import * as Binding from "../../Binding.ts";
4import type { Bucket } from "./Bucket.ts";
5
6export interface CreateMultipartUploadRequest extends Omit<
7 S3.CreateMultipartUploadRequest,
8 "Bucket"
9> {}
10
11/**
12 * Runtime binding for `s3:CreateMultipartUpload`.
13 *
14 * Starts a multipart upload and returns the `UploadId` that `UploadPart`,
15 * `CompleteMultipartUpload`, and `AbortMultipartUpload` reference. Use it for
16 * objects too large for a single `PutObject` (parts are 5 MiB–5 GiB, uploaded
17 * independently and in parallel). Provide the implementation with
18 * `Effect.provide(AWS.S3.CreateMultipartUploadHttp)`.
19 * ### Multipart Uploads
20 * **Example:** Start a Multipart Upload
21 * ```typescript
22 * // init — bind the operation to the bucket
23 * const createUpload = yield* AWS.S3.CreateMultipartUpload(bucket);
24 *
25 * // runtime — object-level metadata (ContentType, etc.) is set here,
26 * // not on the individual parts
27 * const { UploadId } = yield* createUpload({
28 * Key: "backups/archive.tar",
29 * ContentType: "application/x-tar",
30 * });
31 * // pass UploadId to AWS.S3.UploadPart / CompleteMultipartUpload
32 * ```
33 *
34 * @binding
35 */
36export interface CreateMultipartUpload extends Binding.Service<
37 CreateMultipartUpload,
38 "AWS.S3.CreateMultipartUpload",
39 (
40 bucket: Bucket,
41 ) => Effect.Effect<
42 (
43 request: CreateMultipartUploadRequest,
44 ) => Effect.Effect<
45 S3.CreateMultipartUploadOutput,
46 S3.CreateMultipartUploadError
47 >
48 >
49> {}
50
51export const CreateMultipartUpload = Binding.Service<CreateMultipartUpload>(
52 "AWS.S3.CreateMultipartUpload",
53);