operation.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. var Shape = require('./shape');
  2. var util = require('../util');
  3. var property = util.property;
  4. var memoizedProperty = util.memoizedProperty;
  5. function Operation(name, operation, options) {
  6. var self = this;
  7. options = options || {};
  8. property(this, 'name', operation.name || name);
  9. property(this, 'api', options.api, false);
  10. operation.http = operation.http || {};
  11. property(this, 'endpoint', operation.endpoint);
  12. property(this, 'httpMethod', operation.http.method || 'POST');
  13. property(this, 'httpPath', operation.http.requestUri || '/');
  14. property(this, 'authtype', operation.authtype || '');
  15. property(
  16. this,
  17. 'endpointDiscoveryRequired',
  18. operation.endpointdiscovery ?
  19. (operation.endpointdiscovery.required ? 'REQUIRED' : 'OPTIONAL') :
  20. 'NULL'
  21. );
  22. // httpChecksum replaces usage of httpChecksumRequired, but some APIs
  23. // (s3control) still uses old trait.
  24. var httpChecksumRequired = operation.httpChecksumRequired
  25. || (operation.httpChecksum && operation.httpChecksum.requestChecksumRequired);
  26. property(this, 'httpChecksumRequired', httpChecksumRequired, false);
  27. memoizedProperty(this, 'input', function() {
  28. if (!operation.input) {
  29. return new Shape.create({type: 'structure'}, options);
  30. }
  31. return Shape.create(operation.input, options);
  32. });
  33. memoizedProperty(this, 'output', function() {
  34. if (!operation.output) {
  35. return new Shape.create({type: 'structure'}, options);
  36. }
  37. return Shape.create(operation.output, options);
  38. });
  39. memoizedProperty(this, 'errors', function() {
  40. var list = [];
  41. if (!operation.errors) return null;
  42. for (var i = 0; i < operation.errors.length; i++) {
  43. list.push(Shape.create(operation.errors[i], options));
  44. }
  45. return list;
  46. });
  47. memoizedProperty(this, 'paginator', function() {
  48. return options.api.paginators[name];
  49. });
  50. if (options.documentation) {
  51. property(this, 'documentation', operation.documentation);
  52. property(this, 'documentationUrl', operation.documentationUrl);
  53. }
  54. // idempotentMembers only tracks top-level input shapes
  55. memoizedProperty(this, 'idempotentMembers', function() {
  56. var idempotentMembers = [];
  57. var input = self.input;
  58. var members = input.members;
  59. if (!input.members) {
  60. return idempotentMembers;
  61. }
  62. for (var name in members) {
  63. if (!members.hasOwnProperty(name)) {
  64. continue;
  65. }
  66. if (members[name].isIdempotent === true) {
  67. idempotentMembers.push(name);
  68. }
  69. }
  70. return idempotentMembers;
  71. });
  72. memoizedProperty(this, 'hasEventOutput', function() {
  73. var output = self.output;
  74. return hasEventStream(output);
  75. });
  76. }
  77. function hasEventStream(topLevelShape) {
  78. var members = topLevelShape.members;
  79. var payload = topLevelShape.payload;
  80. if (!topLevelShape.members) {
  81. return false;
  82. }
  83. if (payload) {
  84. var payloadMember = members[payload];
  85. return payloadMember.isEventStream;
  86. }
  87. // check if any member is an event stream
  88. for (var name in members) {
  89. if (!members.hasOwnProperty(name)) {
  90. if (members[name].isEventStream === true) {
  91. return true;
  92. }
  93. }
  94. }
  95. return false;
  96. }
  97. /**
  98. * @api private
  99. */
  100. module.exports = Operation;