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>
82 lines
3.6 KiB
Text
82 lines
3.6 KiB
Text
import { HttpBindingProtocol, HttpInterceptingShapeDeserializer, HttpInterceptingShapeSerializer, } from "@smithy/core/protocols";
|
|
import { NormalizedSchema, TypeRegistry } from "@smithy/core/schema";
|
|
import { ProtocolLib } from "../ProtocolLib";
|
|
import { JsonCodec } from "./JsonCodec";
|
|
import { loadRestJsonErrorCode } from "./parseJsonBody";
|
|
export class AwsRestJsonProtocol extends HttpBindingProtocol {
|
|
serializer;
|
|
deserializer;
|
|
codec;
|
|
mixin = new ProtocolLib();
|
|
constructor({ defaultNamespace }) {
|
|
super({
|
|
defaultNamespace,
|
|
});
|
|
const settings = {
|
|
timestampFormat: {
|
|
useTrait: true,
|
|
default: 7,
|
|
},
|
|
httpBindings: true,
|
|
jsonName: true,
|
|
};
|
|
this.codec = new JsonCodec(settings);
|
|
this.serializer = new HttpInterceptingShapeSerializer(this.codec.createSerializer(), settings);
|
|
this.deserializer = new HttpInterceptingShapeDeserializer(this.codec.createDeserializer(), settings);
|
|
}
|
|
getShapeId() {
|
|
return "aws.protocols#restJson1";
|
|
}
|
|
getPayloadCodec() {
|
|
return this.codec;
|
|
}
|
|
setSerdeContext(serdeContext) {
|
|
this.codec.setSerdeContext(serdeContext);
|
|
super.setSerdeContext(serdeContext);
|
|
}
|
|
async serializeRequest(operationSchema, input, context) {
|
|
const request = await super.serializeRequest(operationSchema, input, context);
|
|
const inputSchema = NormalizedSchema.of(operationSchema.input);
|
|
if (!request.headers["content-type"]) {
|
|
const contentType = this.mixin.resolveRestContentType(this.getDefaultContentType(), inputSchema);
|
|
if (contentType) {
|
|
request.headers["content-type"] = contentType;
|
|
}
|
|
}
|
|
if (request.body == null && request.headers["content-type"] === this.getDefaultContentType()) {
|
|
request.body = "{}";
|
|
}
|
|
return request;
|
|
}
|
|
async deserializeResponse(operationSchema, context, response) {
|
|
const output = await super.deserializeResponse(operationSchema, context, response);
|
|
const outputSchema = NormalizedSchema.of(operationSchema.output);
|
|
for (const [name, member] of outputSchema.structIterator()) {
|
|
if (member.getMemberTraits().httpPayload && !(name in output)) {
|
|
output[name] = null;
|
|
}
|
|
}
|
|
return output;
|
|
}
|
|
async handleError(operationSchema, context, response, dataObject, metadata) {
|
|
const errorIdentifier = loadRestJsonErrorCode(response, dataObject) ?? "Unknown";
|
|
const { errorSchema, errorMetadata } = await this.mixin.getErrorSchemaOrThrowBaseException(errorIdentifier, this.options.defaultNamespace, response, dataObject, metadata);
|
|
const ns = NormalizedSchema.of(errorSchema);
|
|
const message = dataObject.message ?? dataObject.Message ?? "Unknown";
|
|
const ErrorCtor = TypeRegistry.for(errorSchema[1]).getErrorCtor(errorSchema) ?? Error;
|
|
const exception = new ErrorCtor(message);
|
|
await this.deserializeHttpMessage(errorSchema, context, response, dataObject);
|
|
const output = {};
|
|
for (const [name, member] of ns.structIterator()) {
|
|
const target = member.getMergedTraits().jsonName ?? name;
|
|
output[name] = this.codec.createDeserializer().readObject(member, dataObject[target]);
|
|
}
|
|
throw this.mixin.decorateServiceException(Object.assign(exception, errorMetadata, {
|
|
$fault: ns.getMergedTraits().error,
|
|
message,
|
|
}, output), dataObject);
|
|
}
|
|
getDefaultContentType() {
|
|
return "application/json";
|
|
}
|
|
}
|