Skip to content

Commit 744f5a5

Browse files
committed
feat: add deleteBucket method
1 parent 58e18d8 commit 744f5a5

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

src/client.ts

+27-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AWSSignerV4 } from "../deps.ts";
2-
import type { CreateBucketOptions } from "./types.ts";
2+
import type { CreateBucketOptions, DeleteBucketOptions } from "./types.ts";
33
import { S3Error } from "./error.ts";
44
import { S3Bucket } from "./bucket.ts";
55
import { doRequest, encoder } from "./utils.ts";
@@ -88,4 +88,30 @@ export class S3 {
8888
bucket,
8989
});
9090
}
91+
92+
async deleteBucket(
93+
bucket: string,
94+
options?: DeleteBucketOptions,
95+
): Promise<void> {
96+
const headers: Params = {};
97+
98+
if (options?.expectedBucketOwner) {
99+
headers["x-amz-expected-bucket-owner "] = options.expectedBucketOwner;
100+
}
101+
102+
const resp = await doRequest({
103+
host: this.#host,
104+
signer: this.#signer,
105+
path: bucket,
106+
method: "DELETE",
107+
headers,
108+
});
109+
110+
if (resp.status !== 204) {
111+
throw new S3Error(
112+
`Failed to delete bucket "${bucket}": ${resp.status} ${resp.statusText}`,
113+
await resp.text(),
114+
);
115+
}
116+
}
91117
}

src/client_test.ts

+19-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ Deno.test({
2727

2828
// teardown
2929
await bucket.deleteObject("foo");
30-
// @TODO: delete also bucket once s3.deleteBucket is implemented.
3130
},
3231
});
3332

@@ -42,3 +41,22 @@ Deno.test({
4241
);
4342
},
4443
});
44+
45+
Deno.test({
46+
name: "[client] should delete a bucket",
47+
async fn() {
48+
await s3.deleteBucket("test.bucket");
49+
},
50+
});
51+
52+
Deno.test({
53+
name:
54+
"[client] should throw when deleting a bucket if the bucket does not exist",
55+
async fn() {
56+
await assertThrowsAsync(
57+
() => s3.deleteBucket("test.bucket"),
58+
S3Error,
59+
'Failed to delete bucket "test.bucket": 404 Not Found',
60+
);
61+
},
62+
});

src/types.ts

+4
Original file line numberDiff line numberDiff line change
@@ -566,3 +566,7 @@ export interface CreateBucketOptions {
566566
/** Allows grantee to write the ACL for the applicable bucket. */
567567
grantWriteAcp?: string;
568568
}
569+
570+
export interface DeleteBucketOptions {
571+
expectedBucketOwner?: string;
572+
}

0 commit comments

Comments
 (0)