Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
72 lines
3.3 KiB
Text
72 lines
3.3 KiB
Text
import { HttpRequest } from "@smithy/protocol-http";
|
|
import { getDateHeader, getSkewCorrectedDate, getUpdatedSystemClockOffset } from "../utils";
|
|
const throwSigningPropertyError = (name, property) => {
|
|
if (!property) {
|
|
throw new Error(`Property \`${name}\` is not resolved for AWS SDK SigV4Auth`);
|
|
}
|
|
return property;
|
|
};
|
|
export const validateSigningProperties = async (signingProperties) => {
|
|
const context = throwSigningPropertyError("context", signingProperties.context);
|
|
const config = throwSigningPropertyError("config", signingProperties.config);
|
|
const authScheme = context.endpointV2?.properties?.authSchemes?.[0];
|
|
const signerFunction = throwSigningPropertyError("signer", config.signer);
|
|
const signer = await signerFunction(authScheme);
|
|
const signingRegion = signingProperties?.signingRegion;
|
|
const signingRegionSet = signingProperties?.signingRegionSet;
|
|
const signingName = signingProperties?.signingName;
|
|
return {
|
|
config,
|
|
signer,
|
|
signingRegion,
|
|
signingRegionSet,
|
|
signingName,
|
|
};
|
|
};
|
|
export class AwsSdkSigV4Signer {
|
|
async sign(httpRequest, identity, signingProperties) {
|
|
if (!HttpRequest.isInstance(httpRequest)) {
|
|
throw new Error("The request is not an instance of `HttpRequest` and cannot be signed");
|
|
}
|
|
const validatedProps = await validateSigningProperties(signingProperties);
|
|
const { config, signer } = validatedProps;
|
|
let { signingRegion, signingName } = validatedProps;
|
|
const handlerExecutionContext = signingProperties.context;
|
|
if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) {
|
|
const [first, second] = handlerExecutionContext.authSchemes;
|
|
if (first?.name === "sigv4a" && second?.name === "sigv4") {
|
|
signingRegion = second?.signingRegion ?? signingRegion;
|
|
signingName = second?.signingName ?? signingName;
|
|
}
|
|
}
|
|
const signedRequest = await signer.sign(httpRequest, {
|
|
signingDate: getSkewCorrectedDate(config.systemClockOffset),
|
|
signingRegion: signingRegion,
|
|
signingService: signingName,
|
|
});
|
|
return signedRequest;
|
|
}
|
|
errorHandler(signingProperties) {
|
|
return (error) => {
|
|
const serverTime = error.ServerTime ?? getDateHeader(error.$response);
|
|
if (serverTime) {
|
|
const config = throwSigningPropertyError("config", signingProperties.config);
|
|
const initialSystemClockOffset = config.systemClockOffset;
|
|
config.systemClockOffset = getUpdatedSystemClockOffset(serverTime, config.systemClockOffset);
|
|
const clockSkewCorrected = config.systemClockOffset !== initialSystemClockOffset;
|
|
if (clockSkewCorrected && error.$metadata) {
|
|
error.$metadata.clockSkewCorrected = true;
|
|
}
|
|
}
|
|
throw error;
|
|
};
|
|
}
|
|
successHandler(httpResponse, signingProperties) {
|
|
const dateHeader = getDateHeader(httpResponse);
|
|
if (dateHeader) {
|
|
const config = throwSigningPropertyError("config", signingProperties.config);
|
|
config.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config.systemClockOffset);
|
|
}
|
|
}
|
|
}
|
|
export const AWSSDKSigV4Signer = AwsSdkSigV4Signer;
|