mirror of
https://github.com/multipleofnpm/cutedynamodb.git
synced 2026-01-13 16:17:58 +00:00
95 lines
4.9 KiB
JavaScript
95 lines
4.9 KiB
JavaScript
import {DynamoDBDocumentClient} from "@aws-sdk/lib-dynamodb";
|
|
import {DynamoDBClient} from "@aws-sdk/client-dynamodb";
|
|
|
|
let client;
|
|
|
|
/**
|
|
* Initializes the DynamoDB client for cute-dynamo library usage. It configures the client based on the environment and credentials provided.
|
|
* This function supports two authentication methods:
|
|
* 1. Client-side authentication using an AWS Identity Pool ID for applications where AWS credentials are managed client-side.
|
|
* 2. Server-side authentication using AWS Access Key ID and AWS Secret Access Key for server-side applications.
|
|
*
|
|
* By adhering to cute-dynamo's minimalistic design, this initialization sets the stage for interacting with DynamoDB tables that conform to the specified naming conventions and data structure rules.
|
|
*
|
|
* @param {Object} options - Configuration options for the DynamoDB client. Includes region, identityPoolId, accessKeyId, and secretAccessKey.
|
|
* @param {string} [options.region=process.env.AWS_REGION] - The AWS region where the DynamoDB instance is hosted.
|
|
* @param {string} [options.identityPoolId=process.env.AWS_IDENTITY_POOL_ID] - The AWS Cognito Identity Pool ID for client-side authentication. Optional if server-side credentials are provided.
|
|
* @param {string} [options.accessKeyId=process.env.AWS_ACCESS_KEY_ID] - The AWS Access Key ID for server-side authentication. Required if not using client-side authentication with an Identity Pool ID.
|
|
* @param {string} [options.secretAccessKey=process.env.AWS_SECRET_ACCESS_KEY] - The AWS Secret Access Key for server-side authentication. Required if not using client-side authentication.
|
|
*
|
|
* @throws {Error} Throws an error if insufficient credentials are provided for either authentication method.
|
|
*
|
|
* @example
|
|
* // Initialize for server-side usage or client-side with an identity pool ID
|
|
* // Server-side reads env vars: AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
|
|
* // Client-side reads env vars: AWS_REGION, AWS_IDENTITY_POOL_ID,
|
|
* await init();
|
|
*
|
|
* @example
|
|
* // Initialize for client-side usage with an identity pool ID
|
|
* await init({ region: 'us-east-1', identityPoolId: 'us-east-1:exampleId' });
|
|
*
|
|
* @example
|
|
* // Initialize for server-side usage with access key and secret key
|
|
* await init({ region: 'us-east-1', accessKeyId: 'AKIAEXAMPLE', secretAccessKey: 'secret' });
|
|
*/
|
|
export async function init({
|
|
region = typeof process !== 'undefined' ? process.env.AWS_REGION : undefined,
|
|
identityPoolId = typeof process !== 'undefined' ? process.env.AWS_IDENTITY_POOL_ID : undefined,
|
|
accessKeyId = typeof process !== 'undefined' ? process.env.AWS_ACCESS_KEY_ID : undefined,
|
|
secretAccessKey = typeof process !== 'undefined' ? process.env.AWS_SECRET_ACCESS_KEY : undefined
|
|
} = {}) {
|
|
let credentials;
|
|
|
|
if (identityPoolId) {
|
|
const {CognitoIdentityClient} = await import("@aws-sdk/client-cognito-identity");
|
|
const {fromCognitoIdentityPool} = await import("@aws-sdk/credential-provider-cognito-identity");
|
|
credentials = fromCognitoIdentityPool({
|
|
client: new CognitoIdentityClient({region}),
|
|
identityPoolId,
|
|
});
|
|
} else if (accessKeyId && secretAccessKey) {
|
|
credentials = {
|
|
accessKeyId,
|
|
secretAccessKey
|
|
};
|
|
} else {
|
|
throw new Error("Insufficient credentials provided");
|
|
}
|
|
|
|
client = DynamoDBDocumentClient.from(new DynamoDBClient({region, credentials}));
|
|
}
|
|
|
|
/**
|
|
* Creates a DynamoDB table instance for performing operations on items.
|
|
*
|
|
* @param {string} [tablename] - The name of the DynamoDB table. If not provided, the value of the `DYNAMODB_TABLE` environment variable is used.
|
|
* @returns {Object} An object with an `at` method for specifying the primary key and sort key of an item.
|
|
*
|
|
* @example
|
|
* const item = await table('yourtablename').at({'yourPKkeyName': 'PKvalue', 'yourSKname': 1711900504}).get();
|
|
*/
|
|
export const table = (tablename) => {
|
|
return {
|
|
at: (PKorPKSK) => {
|
|
return {
|
|
get: async () => {
|
|
const {GetCommand} = await import("@aws-sdk/lib-dynamodb");
|
|
const response = await client.send(new GetCommand({
|
|
TableName: tablename || (typeof process !== 'undefined' ? process.env.DYNAMODB_TABLE : undefined),
|
|
Key: PKorPKSK,
|
|
}));
|
|
return response.Item && response.Item.JSON ? JSON.parse(response.Item.JSON) : response.Item || null;
|
|
},
|
|
put: async (data) => {
|
|
const {PutCommand} = await import("@aws-sdk/lib-dynamodb");
|
|
return await client.send(new PutCommand({
|
|
TableName: tablename || (typeof process !== 'undefined' ? process.env.DYNAMODB_TABLE : undefined),
|
|
Item: {...PKorPKSK, JSON: JSON.stringify(data)},
|
|
}));
|
|
}
|
|
};
|
|
}
|
|
};
|
|
};
|