101 lines
3.4 KiB
JavaScript
101 lines
3.4 KiB
JavaScript
'use strict';
|
|
|
|
var protocolHttp = require('@smithy/protocol-http');
|
|
|
|
const deserializerMiddleware = (options, deserializer) => (next, context) => async (args) => {
|
|
const { response } = await next(args);
|
|
try {
|
|
const parsed = await deserializer(response, options);
|
|
return {
|
|
response,
|
|
output: parsed,
|
|
};
|
|
}
|
|
catch (error) {
|
|
Object.defineProperty(error, "$response", {
|
|
value: response,
|
|
});
|
|
if (!("$metadata" in error)) {
|
|
const hint = `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`;
|
|
try {
|
|
error.message += "\n " + hint;
|
|
}
|
|
catch (e) {
|
|
if (!context.logger || context.logger?.constructor?.name === "NoOpLogger") {
|
|
console.warn(hint);
|
|
}
|
|
else {
|
|
context.logger?.warn?.(hint);
|
|
}
|
|
}
|
|
if (typeof error.$responseBodyText !== "undefined") {
|
|
if (error.$response) {
|
|
error.$response.body = error.$responseBodyText;
|
|
}
|
|
}
|
|
try {
|
|
if (protocolHttp.HttpResponse.isInstance(response)) {
|
|
const { headers = {} } = response;
|
|
const headerEntries = Object.entries(headers);
|
|
error.$metadata = {
|
|
httpStatusCode: response.statusCode,
|
|
requestId: findHeader(/^x-[\w-]+-request-?id$/, headerEntries),
|
|
extendedRequestId: findHeader(/^x-[\w-]+-id-2$/, headerEntries),
|
|
cfId: findHeader(/^x-[\w-]+-cf-id$/, headerEntries),
|
|
};
|
|
}
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
throw error;
|
|
}
|
|
};
|
|
const findHeader = (pattern, headers) => {
|
|
return (headers.find(([k]) => {
|
|
return k.match(pattern);
|
|
}) || [void 0, void 0])[1];
|
|
};
|
|
|
|
const serializerMiddleware = (options, serializer) => (next, context) => async (args) => {
|
|
const endpointConfig = options;
|
|
const endpoint = context.endpointV2?.url && endpointConfig.urlParser
|
|
? async () => endpointConfig.urlParser(context.endpointV2.url)
|
|
: endpointConfig.endpoint;
|
|
if (!endpoint) {
|
|
throw new Error("No valid endpoint provider available.");
|
|
}
|
|
const request = await serializer(args.input, { ...options, endpoint });
|
|
return next({
|
|
...args,
|
|
request,
|
|
});
|
|
};
|
|
|
|
const deserializerMiddlewareOption = {
|
|
name: "deserializerMiddleware",
|
|
step: "deserialize",
|
|
tags: ["DESERIALIZER"],
|
|
override: true,
|
|
};
|
|
const serializerMiddlewareOption = {
|
|
name: "serializerMiddleware",
|
|
step: "serialize",
|
|
tags: ["SERIALIZER"],
|
|
override: true,
|
|
};
|
|
function getSerdePlugin(config, serializer, deserializer) {
|
|
return {
|
|
applyToStack: (commandStack) => {
|
|
commandStack.add(deserializerMiddleware(config, deserializer), deserializerMiddlewareOption);
|
|
commandStack.add(serializerMiddleware(config, serializer), serializerMiddlewareOption);
|
|
},
|
|
};
|
|
}
|
|
|
|
exports.deserializerMiddleware = deserializerMiddleware;
|
|
exports.deserializerMiddlewareOption = deserializerMiddlewareOption;
|
|
exports.getSerdePlugin = getSerdePlugin;
|
|
exports.serializerMiddleware = serializerMiddleware;
|
|
exports.serializerMiddlewareOption = serializerMiddlewareOption;
|