Skip to content

Bug: hasMetadataByHandlers returns true when require='some' and all handlers fail #9026

@lstein

Description

@lstein

Bug

hasMetadataByHandlers in invokeai/frontend/web/src/features/metadata/parsing.tsx returns true when require: 'some' and all handlers reject. It should return false.

Current code

const hasMetadataByHandlers = async (arg) => {
  const { metadata, handlers, store, require } = arg;
  for (const handler of handlers) {
    try {
      await handler.parse(metadata, store);
      if (require === 'some') {
        return true;  // ← correct: at least one succeeded
      }
    } catch {
      if (require === 'all') {
        return false;  // ← correct: one failed, not all
      }
    }
  }
  return true;  // ← BUG: reached when require='some' and ALL handlers threw
};

Expected behavior

When require: 'some', the function should return false if no handler's parse() resolved successfully.

Suggested fix

  // after the loop:
  return require === 'all'; // true if all succeeded (require='all'), false if none did (require='some')

Or equivalently, track whether any handler succeeded:

let anySucceeded = false;
for (const handler of handlers) {
  try {
    await handler.parse(metadata, store);
    anySucceeded = true;
    if (require === 'some') return true;
  } catch {
    if (require === 'all') return false;
  }
}
return anySucceeded;

Impact

Any caller using require: 'some' will get a false positive when no metadata keys match. This was discovered while implementing Qwen Image metadata handlers that correctly reject on missing keys — the hasMetadataByHandlers check still returned true for empty metadata.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions