This library provides helper functions to interact with AWS S3 and DynamoDB, making it easier to perform common operations in S3 and DynamoDB.
To install this library, run:
npm install @netizen-experience/aws
Initialize AWS clients before using the library functions.
const { dynamo, s3 } = getAwsClients();
Define DynamoDB tables with name, primary key, secondary search indexes (if any).
const table = defineTable(dynamo, {
name: "SOME_TABLE_NAME",
primaryKey: { partitionKey: "pk", sortKey: "sk" },
secondaryIndex: {
firstGSI: { partitionKey: "pk2", sortKey: "sk2" },
secondLSI: { partitionKey: "pk", sortKey: "sk3" },
},
});
await table.create({
schema: z.object({ partitionKey: z.string(), sortKey: z.string(), data: z.string() }),
item: { partitionKey: "pk", sortKey: "sk", data: "example" },
});
const item = await table.get({
schema: z.object({ partitionKey: z.string(), sortKey: z.string(), data: z.string() }),
key: { partitionKey: "pk", sortKey: "sk" },
});
await table.update({
schema: z.object({ partitionKey: z.string(), sortKey: z.string(), data: z.string().optional() }),
attributes: { partitionKey: "pk", sortKey: "sk", data: "updated data" },
});
await table.remove({
key: { partitionKey: "pk", sortKey: "sk" },
});
const items = await table.query({
schema: z.object({ partitionKey: z.string(), sortKey: z.string(), data: z.string() }),
attributes: { partitionKey: "pk" },
});
const items = await table.queryByPrefix({
schema: z.object({ partitionKey: z.string(), sortKey: z.string(), data: z.string() }),
attributes: { partitionKey: "pk", sortKey: "prefix" },
});
await table.batchWrite({
items: [
{
type: "put",
schema: z.object({ partitionKey: z.string(), sortKey: z.string(), data: z.string() }),
data: { partitionKey: "pk1", sortKey: "sk1", data: "example1" },
},
{
type: "delete",
key: { partitionKey: "pk2", sortKey: "sk2" },
},
],
});
All functions throw a DynamoError
in case of an error. You can catch and handle these errors as follows:
import { DynamoError } from "./lib/database/errors";
try {
await table.create({
schema: z.object({ partitionKey: z.string(), sortKey: z.string(), data: z.string() }),
item: { partitionKey: "pk", sortKey: "sk", data: "example" },
});
} catch (error) {
if (error instanceof DynamoError) {
console.error("DynamoDB Error:", error.message);
} else {
console.error("Unexpected Error:", error);
}
}
This library also provides utility functions to help in generating and parsing prefixed keys.
import { generatePrefixedKey, parsePrefixedKey } from "@netizen-experience/aws";
const prefixedKey = generatePrefixedKey("prefix", "key");
console.log(prefixedKey); // Output: "prefix#key"
const { prefix, key } = parsePrefixedKey("prefix#key");
console.log(prefix); // Output: "prefix"
console.log(key); // Output: "key"
Define an S3 bucket with the client and bucket name.
const bucket = defineBucket(s3, "your-bucket-name");
await bucket.upload({
key: "path/to/your/object",
body: "Your object content",
});
const object = await bucket.get({
key: "path/to/your/object",
});
await bucket.delete({
key: "path/to/your/object",
});
const head = await bucket.headObject({
key: "path/to/your/object",
});
const url = await bucket.createPreSignedUrl({
key: "path/to/your/object",
expiresIn: 3600, // Optional, default is 3600 seconds
});
const uploadUrl = await bucket.createUploadUrl({
key: "path/to/your/object",
expiresIn: 1200, // Optional, default is 3600 seconds
});