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>
122 lines
4.8 KiB
Text
122 lines
4.8 KiB
Text
import { NormalizedSchema, translateTraits } from "@smithy/core/schema";
|
|
import { HttpRequest, HttpResponse } from "@smithy/protocol-http";
|
|
import { SerdeContext } from "./SerdeContext";
|
|
export class HttpProtocol extends SerdeContext {
|
|
options;
|
|
constructor(options) {
|
|
super();
|
|
this.options = options;
|
|
}
|
|
getRequestType() {
|
|
return HttpRequest;
|
|
}
|
|
getResponseType() {
|
|
return HttpResponse;
|
|
}
|
|
setSerdeContext(serdeContext) {
|
|
this.serdeContext = serdeContext;
|
|
this.serializer.setSerdeContext(serdeContext);
|
|
this.deserializer.setSerdeContext(serdeContext);
|
|
if (this.getPayloadCodec()) {
|
|
this.getPayloadCodec().setSerdeContext(serdeContext);
|
|
}
|
|
}
|
|
updateServiceEndpoint(request, endpoint) {
|
|
if ("url" in endpoint) {
|
|
request.protocol = endpoint.url.protocol;
|
|
request.hostname = endpoint.url.hostname;
|
|
request.port = endpoint.url.port ? Number(endpoint.url.port) : undefined;
|
|
request.path = endpoint.url.pathname;
|
|
request.fragment = endpoint.url.hash || void 0;
|
|
request.username = endpoint.url.username || void 0;
|
|
request.password = endpoint.url.password || void 0;
|
|
if (!request.query) {
|
|
request.query = {};
|
|
}
|
|
for (const [k, v] of endpoint.url.searchParams.entries()) {
|
|
request.query[k] = v;
|
|
}
|
|
return request;
|
|
}
|
|
else {
|
|
request.protocol = endpoint.protocol;
|
|
request.hostname = endpoint.hostname;
|
|
request.port = endpoint.port ? Number(endpoint.port) : undefined;
|
|
request.path = endpoint.path;
|
|
request.query = {
|
|
...endpoint.query,
|
|
};
|
|
return request;
|
|
}
|
|
}
|
|
setHostPrefix(request, operationSchema, input) {
|
|
const inputNs = NormalizedSchema.of(operationSchema.input);
|
|
const opTraits = translateTraits(operationSchema.traits ?? {});
|
|
if (opTraits.endpoint) {
|
|
let hostPrefix = opTraits.endpoint?.[0];
|
|
if (typeof hostPrefix === "string") {
|
|
const hostLabelInputs = [...inputNs.structIterator()].filter(([, member]) => member.getMergedTraits().hostLabel);
|
|
for (const [name] of hostLabelInputs) {
|
|
const replacement = input[name];
|
|
if (typeof replacement !== "string") {
|
|
throw new Error(`@smithy/core/schema - ${name} in input must be a string as hostLabel.`);
|
|
}
|
|
hostPrefix = hostPrefix.replace(`{${name}}`, replacement);
|
|
}
|
|
request.hostname = hostPrefix + request.hostname;
|
|
}
|
|
}
|
|
}
|
|
deserializeMetadata(output) {
|
|
return {
|
|
httpStatusCode: output.statusCode,
|
|
requestId: output.headers["x-amzn-requestid"] ?? output.headers["x-amzn-request-id"] ?? output.headers["x-amz-request-id"],
|
|
extendedRequestId: output.headers["x-amz-id-2"],
|
|
cfId: output.headers["x-amz-cf-id"],
|
|
};
|
|
}
|
|
async serializeEventStream({ eventStream, requestSchema, initialRequest, }) {
|
|
const eventStreamSerde = await this.loadEventStreamCapability();
|
|
return eventStreamSerde.serializeEventStream({
|
|
eventStream,
|
|
requestSchema,
|
|
initialRequest,
|
|
});
|
|
}
|
|
async deserializeEventStream({ response, responseSchema, initialResponseContainer, }) {
|
|
const eventStreamSerde = await this.loadEventStreamCapability();
|
|
return eventStreamSerde.deserializeEventStream({
|
|
response,
|
|
responseSchema,
|
|
initialResponseContainer,
|
|
});
|
|
}
|
|
async loadEventStreamCapability() {
|
|
const { EventStreamSerde } = await import("@smithy/core/event-streams");
|
|
return new EventStreamSerde({
|
|
marshaller: this.getEventStreamMarshaller(),
|
|
serializer: this.serializer,
|
|
deserializer: this.deserializer,
|
|
serdeContext: this.serdeContext,
|
|
defaultContentType: this.getDefaultContentType(),
|
|
});
|
|
}
|
|
getDefaultContentType() {
|
|
throw new Error(`@smithy/core/protocols - ${this.constructor.name} getDefaultContentType() implementation missing.`);
|
|
}
|
|
async deserializeHttpMessage(schema, context, response, arg4, arg5) {
|
|
void schema;
|
|
void context;
|
|
void response;
|
|
void arg4;
|
|
void arg5;
|
|
return [];
|
|
}
|
|
getEventStreamMarshaller() {
|
|
const context = this.serdeContext;
|
|
if (!context.eventStreamMarshaller) {
|
|
throw new Error("@smithy/core - HttpProtocol: eventStreamMarshaller missing in serdeContext.");
|
|
}
|
|
return context.eventStreamMarshaller;
|
|
}
|
|
}
|