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.9 KiB
Text
122 lines
4.9 KiB
Text
import { NormalizedSchema, TypeRegistry } from "@smithy/core/schema";
|
|
import { decorateServiceException } from "@smithy/smithy-client";
|
|
export class ProtocolLib {
|
|
queryCompat;
|
|
constructor(queryCompat = false) {
|
|
this.queryCompat = queryCompat;
|
|
}
|
|
resolveRestContentType(defaultContentType, inputSchema) {
|
|
const members = inputSchema.getMemberSchemas();
|
|
const httpPayloadMember = Object.values(members).find((m) => {
|
|
return !!m.getMergedTraits().httpPayload;
|
|
});
|
|
if (httpPayloadMember) {
|
|
const mediaType = httpPayloadMember.getMergedTraits().mediaType;
|
|
if (mediaType) {
|
|
return mediaType;
|
|
}
|
|
else if (httpPayloadMember.isStringSchema()) {
|
|
return "text/plain";
|
|
}
|
|
else if (httpPayloadMember.isBlobSchema()) {
|
|
return "application/octet-stream";
|
|
}
|
|
else {
|
|
return defaultContentType;
|
|
}
|
|
}
|
|
else if (!inputSchema.isUnitSchema()) {
|
|
const hasBody = Object.values(members).find((m) => {
|
|
const { httpQuery, httpQueryParams, httpHeader, httpLabel, httpPrefixHeaders } = m.getMergedTraits();
|
|
const noPrefixHeaders = httpPrefixHeaders === void 0;
|
|
return !httpQuery && !httpQueryParams && !httpHeader && !httpLabel && noPrefixHeaders;
|
|
});
|
|
if (hasBody) {
|
|
return defaultContentType;
|
|
}
|
|
}
|
|
}
|
|
async getErrorSchemaOrThrowBaseException(errorIdentifier, defaultNamespace, response, dataObject, metadata, getErrorSchema) {
|
|
let namespace = defaultNamespace;
|
|
let errorName = errorIdentifier;
|
|
if (errorIdentifier.includes("#")) {
|
|
[namespace, errorName] = errorIdentifier.split("#");
|
|
}
|
|
const errorMetadata = {
|
|
$metadata: metadata,
|
|
$fault: response.statusCode < 500 ? "client" : "server",
|
|
};
|
|
const registry = TypeRegistry.for(namespace);
|
|
try {
|
|
const errorSchema = getErrorSchema?.(registry, errorName) ?? registry.getSchema(errorIdentifier);
|
|
return { errorSchema, errorMetadata };
|
|
}
|
|
catch (e) {
|
|
dataObject.message = dataObject.message ?? dataObject.Message ?? "UnknownError";
|
|
const synthetic = TypeRegistry.for("smithy.ts.sdk.synthetic." + namespace);
|
|
const baseExceptionSchema = synthetic.getBaseException();
|
|
if (baseExceptionSchema) {
|
|
const ErrorCtor = synthetic.getErrorCtor(baseExceptionSchema) ?? Error;
|
|
throw this.decorateServiceException(Object.assign(new ErrorCtor({ name: errorName }), errorMetadata), dataObject);
|
|
}
|
|
throw this.decorateServiceException(Object.assign(new Error(errorName), errorMetadata), dataObject);
|
|
}
|
|
}
|
|
decorateServiceException(exception, additions = {}) {
|
|
if (this.queryCompat) {
|
|
const msg = exception.Message ?? additions.Message;
|
|
const error = decorateServiceException(exception, additions);
|
|
if (msg) {
|
|
error.message = msg;
|
|
}
|
|
error.Error = {
|
|
...error.Error,
|
|
Type: error.Error.Type,
|
|
Code: error.Error.Code,
|
|
Message: error.Error.message ?? error.Error.Message ?? msg,
|
|
};
|
|
const reqId = error.$metadata.requestId;
|
|
if (reqId) {
|
|
error.RequestId = reqId;
|
|
}
|
|
return error;
|
|
}
|
|
return decorateServiceException(exception, additions);
|
|
}
|
|
setQueryCompatError(output, response) {
|
|
const queryErrorHeader = response.headers?.["x-amzn-query-error"];
|
|
if (output !== undefined && queryErrorHeader != null) {
|
|
const [Code, Type] = queryErrorHeader.split(";");
|
|
const entries = Object.entries(output);
|
|
const Error = {
|
|
Code,
|
|
Type,
|
|
};
|
|
Object.assign(output, Error);
|
|
for (const [k, v] of entries) {
|
|
Error[k === "message" ? "Message" : k] = v;
|
|
}
|
|
delete Error.__type;
|
|
output.Error = Error;
|
|
}
|
|
}
|
|
queryCompatOutput(queryCompatErrorData, errorData) {
|
|
if (queryCompatErrorData.Error) {
|
|
errorData.Error = queryCompatErrorData.Error;
|
|
}
|
|
if (queryCompatErrorData.Type) {
|
|
errorData.Type = queryCompatErrorData.Type;
|
|
}
|
|
if (queryCompatErrorData.Code) {
|
|
errorData.Code = queryCompatErrorData.Code;
|
|
}
|
|
}
|
|
findQueryCompatibleError(registry, errorName) {
|
|
try {
|
|
return registry.getSchema(errorName);
|
|
}
|
|
catch (e) {
|
|
return registry.find((schema) => NormalizedSchema.of(schema).getMergedTraits().awsQueryError?.[0] === errorName);
|
|
}
|
|
}
|
|
}
|