UNPKG

cdk-iot-greengrass-fleet-provisioning

Version:

CDK Construct for AWS IoT Greengrass Fleet Provisioning (with AWS IoT Certificates)

76 lines (75 loc) 3.14 kB
import { RpcProtocol } from "@smithy/core/protocols"; import { deref, NormalizedSchema, SCHEMA } from "@smithy/core/schema"; import { ProtocolLib } from "../ProtocolLib"; import { JsonCodec } from "./JsonCodec"; import { loadRestJsonErrorCode } from "./parseJsonBody"; export class AwsJsonRpcProtocol extends RpcProtocol { serializer; deserializer; serviceTarget; codec; mixin = new ProtocolLib(); awsQueryCompatible; constructor({ defaultNamespace, serviceTarget, awsQueryCompatible, }) { super({ defaultNamespace, }); this.serviceTarget = serviceTarget; this.codec = new JsonCodec({ timestampFormat: { useTrait: true, default: SCHEMA.TIMESTAMP_EPOCH_SECONDS, }, jsonName: false, }); this.serializer = this.codec.createSerializer(); this.deserializer = this.codec.createDeserializer(); this.awsQueryCompatible = !!awsQueryCompatible; } async serializeRequest(operationSchema, input, context) { const request = await super.serializeRequest(operationSchema, input, context); if (!request.path.endsWith("/")) { request.path += "/"; } Object.assign(request.headers, { "content-type": `application/x-amz-json-${this.getJsonRpcVersion()}`, "x-amz-target": `${this.serviceTarget}.${NormalizedSchema.of(operationSchema).getName()}`, }); if (this.awsQueryCompatible) { request.headers["x-amzn-query-mode"] = "true"; } if (deref(operationSchema.input) === "unit" || !request.body) { request.body = "{}"; } try { request.headers["content-length"] = this.mixin.calculateContentLength(request.body, this.serdeContext); } catch (e) { } return request; } getPayloadCodec() { return this.codec; } async handleError(operationSchema, context, response, dataObject, metadata) { if (this.awsQueryCompatible) { this.mixin.setQueryCompatError(dataObject, response); } 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 exception = new errorSchema.ctor(message); const output = {}; for (const [name, member] of ns.structIterator()) { const target = member.getMergedTraits().jsonName ?? name; output[name] = this.codec.createDeserializer().readObject(member, dataObject[target]); } if (this.awsQueryCompatible) { this.mixin.queryCompatOutput(dataObject, output); } throw Object.assign(exception, errorMetadata, { $fault: ns.getMergedTraits().error, message, }, output); } }