123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- var Shape = require('./shape');
- var util = require('../util');
- var property = util.property;
- var memoizedProperty = util.memoizedProperty;
- function Operation(name, operation, options) {
- var self = this;
- options = options || {};
- property(this, 'name', operation.name || name);
- property(this, 'api', options.api, false);
- operation.http = operation.http || {};
- property(this, 'endpoint', operation.endpoint);
- property(this, 'httpMethod', operation.http.method || 'POST');
- property(this, 'httpPath', operation.http.requestUri || '/');
- property(this, 'authtype', operation.authtype || '');
- property(
- this,
- 'endpointDiscoveryRequired',
- operation.endpointdiscovery ?
- (operation.endpointdiscovery.required ? 'REQUIRED' : 'OPTIONAL') :
- 'NULL'
- );
- // httpChecksum replaces usage of httpChecksumRequired, but some APIs
- // (s3control) still uses old trait.
- var httpChecksumRequired = operation.httpChecksumRequired
- || (operation.httpChecksum && operation.httpChecksum.requestChecksumRequired);
- property(this, 'httpChecksumRequired', httpChecksumRequired, false);
- memoizedProperty(this, 'input', function() {
- if (!operation.input) {
- return new Shape.create({type: 'structure'}, options);
- }
- return Shape.create(operation.input, options);
- });
- memoizedProperty(this, 'output', function() {
- if (!operation.output) {
- return new Shape.create({type: 'structure'}, options);
- }
- return Shape.create(operation.output, options);
- });
- memoizedProperty(this, 'errors', function() {
- var list = [];
- if (!operation.errors) return null;
- for (var i = 0; i < operation.errors.length; i++) {
- list.push(Shape.create(operation.errors[i], options));
- }
- return list;
- });
- memoizedProperty(this, 'paginator', function() {
- return options.api.paginators[name];
- });
- if (options.documentation) {
- property(this, 'documentation', operation.documentation);
- property(this, 'documentationUrl', operation.documentationUrl);
- }
- // idempotentMembers only tracks top-level input shapes
- memoizedProperty(this, 'idempotentMembers', function() {
- var idempotentMembers = [];
- var input = self.input;
- var members = input.members;
- if (!input.members) {
- return idempotentMembers;
- }
- for (var name in members) {
- if (!members.hasOwnProperty(name)) {
- continue;
- }
- if (members[name].isIdempotent === true) {
- idempotentMembers.push(name);
- }
- }
- return idempotentMembers;
- });
- memoizedProperty(this, 'hasEventOutput', function() {
- var output = self.output;
- return hasEventStream(output);
- });
- }
- function hasEventStream(topLevelShape) {
- var members = topLevelShape.members;
- var payload = topLevelShape.payload;
- if (!topLevelShape.members) {
- return false;
- }
- if (payload) {
- var payloadMember = members[payload];
- return payloadMember.isEventStream;
- }
- // check if any member is an event stream
- for (var name in members) {
- if (!members.hasOwnProperty(name)) {
- if (members[name].isEventStream === true) {
- return true;
- }
- }
- }
- return false;
- }
- /**
- * @api private
- */
- module.exports = Operation;
|