Skip to content

Custom middleware to mutate input does not work #6743

@alfaproject

Description

@alfaproject

Checkboxes for prior research

Describe the bug

I did a custom DynamoDB client middleware to log used capacity units when a specific environment variable is set by mutating the input to the operations to include the ReturnConsumedCapacity when said env variable is configured, but the input that is mutated is ignored completely and only the original command input is serialized in the request

Regression Issue

  • Select this option if this issue appears to be a regression.

SDK version number

@aws-sdk/[email protected]

Which JavaScript Runtime is this issue in?

Node.js

Details of the browser/Node.js/ReactNative version

v20.11.0

Reproduction Steps

import { ConsumedCapacity, ServiceInputTypes, ServiceOutputTypes } from '@aws-sdk/client-dynamodb';
import { InitializeMiddleware, Pluggable } from '@aws-sdk/types';
import { RegionResolvedConfig } from '@smithy/config-resolver';
import { logInfo } from '@tma/core-log';
import { getEnvNumber } from '@tma/node-env';

function createLogConsumedCapacityMiddleware(
  minConsumedCapacityUnits: number,
): InitializeMiddleware<ServiceInputTypes, ServiceOutputTypes> {
  return next => async args => {
    args.input = {
      ...args.input,
      ReturnConsumedCapacity: 'TOTAL',
    };

    const result = await next(args);

    const output = result.output as { ConsumedCapacity?: ConsumedCapacity | ConsumedCapacity[] };

    const consumedCapacities = output.ConsumedCapacity
      ? Array.isArray(output.ConsumedCapacity)
        ? output.ConsumedCapacity
        : [output.ConsumedCapacity]
      : [];

    if (consumedCapacities.some(consumedCapacity => (consumedCapacity.CapacityUnits ?? 0) >= minConsumedCapacityUnits)) {
      logInfo('ConsumedCapacity', {
        consumedCapacity: output.ConsumedCapacity,
        input: args.input,
      });
    }

    return result;
  };
}

export function createLogConsumedCapacityPlugin(_config: RegionResolvedConfig): Pluggable<ServiceInputTypes, ServiceOutputTypes> {
  return {
    applyToStack: stack => {
      const LOG_CONSUMED_CAPACITY = getEnvNumber('DYNAMODB_LOG_CONSUMED_CAPACITY', 0);
      if (LOG_CONSUMED_CAPACITY) {
        stack.add(createLogConsumedCapacityMiddleware(LOG_CONSUMED_CAPACITY), {
          name: 'logConsumedCapacityMiddleware',
          step: 'initialize',
        });
      }
    },
  };
}

Observed Behavior

ReturnConsumedCapacity is ignored in the new input

Expected Behavior

ReturnConsumedCapacity should not be ignored and the DynamoDB operations should return the CapacityUnits used

Possible Solution

No response

Additional Information/Context

No response

Metadata

Metadata

Labels

bugThis issue is a bug.p2This is a standard priority issueresponse-requestedWaiting on additional info and feedback. Will move to \"closing-soon\" in 7 days.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions