@es-labs/node
Version:
Reusable CJS code
194 lines (174 loc) • 5.56 kB
JavaScript
// TBD not used yet
import {
S3Client,
S3ServiceException,
// This command supersedes the ListObjectsCommand and is the recommended way to list objects.
paginateListObjectsV2,
} from "@aws-sdk/client-s3";
/**
* Log all of the object keys in a bucket.
* @param {{ bucketName: string, pageSize: string }}
*/
export const main = async ({ bucketName, pageSize }) => {
const client = new S3Client({});
/** @type {string[][]} */
const objects = [];
try {
const paginator = paginateListObjectsV2(
{ client, /* Max items per page */ pageSize: Number.parseInt(pageSize) },
{ Bucket: bucketName },
);
for await (const page of paginator) {
objects.push(page.Contents.map((o) => o.Key));
}
objects.forEach((objectList, pageNum) => {
console.log(
`Page ${pageNum + 1}\n------\n${objectList.map((o) => `• ${o}`).join("\n")}\n`,
);
});
} catch (caught) {
if (
caught instanceof S3ServiceException &&
caught.name === "NoSuchBucket"
) {
console.error(
`Error from S3 while listing objects for "${bucketName}". The bucket doesn't exist.`,
);
} else if (caught instanceof S3ServiceException) {
console.error(
`Error from S3 while listing objects for "${bucketName}". ${caught.name}: ${caught.message}`,
);
} else {
throw caught;
}
}
};
/*
// https://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_Scenario_PresignedUrl_section.html
// https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html
// https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/javascript_s3_code_examples.html#basics
import https from "https";
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
import { fromIni } from "@aws-sdk/credential-providers";
import { HttpRequest } from "@smithy/protocol-http";
import {
getSignedUrl,
S3RequestPresigner,
} from "@aws-sdk/s3-request-presigner";
import { parseUrl } from "@smithy/url-parser";
import { formatUrl } from "@aws-sdk/util-format-url";
import { Hash } from "@smithy/hash-node";
const createPresignedUrlWithoutClient = async ({ region, bucket, key }) => {
const url = parseUrl(`https://${bucket}.s3.${region}.amazonaws.com/${key}`);
const presigner = new S3RequestPresigner({
credentials: fromIni(),
region,
sha256: Hash.bind(null, "sha256"),
});
const signedUrlObject = await presigner.presign(
new HttpRequest({ ...url, method: "PUT" }),
);
return formatUrl(signedUrlObject);
};
const createPresignedUrlWithClient = ({ region, bucket, key }) => {
const client = new S3Client({ region });
const command = new PutObjectCommand({ Bucket: bucket, Key: key });
return getSignedUrl(client, command, { expiresIn: 3600 });
};
function put(url, data) {
return new Promise((resolve, reject) => {
const req = https.request(
url,
{ method: "PUT", headers: { "Content-Length": new Blob([data]).size } },
(res) => {
let responseBody = "";
res.on("data", (chunk) => {
responseBody += chunk;
});
res.on("end", () => {
resolve(responseBody);
});
},
);
req.on("error", (err) => {
reject(err);
});
req.write(data);
req.end();
});
}
export const main = async () => {
const REGION = "us-east-1";
const BUCKET = "example_bucket";
const KEY = "example_file.txt";
// There are two ways to generate a presigned URL.
// 1. Use createPresignedUrl without the S3 client.
// 2. Use getSignedUrl in conjunction with the S3 client and GetObjectCommand.
try {
const noClientUrl = await createPresignedUrlWithoutClient({
region: REGION,
bucket: BUCKET,
key: KEY,
});
const clientUrl = await createPresignedUrlWithClient({
region: REGION,
bucket: BUCKET,
key: KEY,
});
// After you get the presigned URL, you can provide your own file
// data. Refer to put() above.
console.log("Calling PUT using presigned URL without client");
await put(noClientUrl, "Hello World");
console.log("Calling PUT using presigned URL with client");
await put(clientUrl, "Hello World");
console.log("\nDone. Check your S3 console.");
} catch (err) {
console.error(err);
}
};
*/
/*
import {
DeleteObjectCommand,
S3Client,
S3ServiceException,
waitUntilObjectNotExists,
} from "@aws-sdk/client-s3";
// Delete one object from an Amazon S3 bucket.
// @param {{ bucketName: string, key: string }}
export const main = async ({ bucketName, key }) => {
const client = new S3Client({});
try {
await client.send(
new DeleteObjectCommand({
Bucket: bucketName,
Key: key,
}),
);
await waitUntilObjectNotExists(
{ client },
{ Bucket: bucketName, Key: key },
);
// A successful delete, or a delete for a non-existent object, both return
// a 204 response code.
console.log(
`The object "${key}" from bucket "${bucketName}" was deleted, or it didn't exist.`,
);
} catch (caught) {
if (
caught instanceof S3ServiceException &&
caught.name === "NoSuchBucket"
) {
console.error(
`Error from S3 while deleting object from ${bucketName}. The bucket doesn't exist.`,
);
} else if (caught instanceof S3ServiceException) {
console.error(
`Error from S3 while deleting object from ${bucketName}. ${caught.name}: ${caught.message}`,
);
} else {
throw caught;
}
}
};
*/