Skip to content

v33.0.0

Choose a tag to compare

@KaiSchwarz-cnic KaiSchwarz-cnic released this 20 Aug 11:38

33.0.0 (2026-08-20)

  • feat(client)!: fold the CNR session lifecycle onto CNR\Client (ec3e48d)
  • feat(column)!: replace Column::$length with an interface-reachable getLength() (91e63ef)
  • feat(response)!: extract Paginator (b84b7fb)
  • feat(templates)!: split the Response factory off the template registry (22d65fb)
  • fix(client)!: continue CNR pagination with the command that was sent (b50cd88)
  • fix(response)!: stop treating pagination meta as column data (f86539c)

Bug Fixes

  • translator: stop treating a literal "0" body as an empty response (af20745)

Features

  • client: accept a pre-built SocketConfig at construction (31cc6f6)
  • exception: give UnsupportedFeatureException structured context (53133d4)

BREAKING CHANGES

  • CNR\Client::requestNextResponsePage() throws PaginationException when handed a Response it did not produce whose command carries a masked AUTH/PASSWORD, rather than putting the mask on the wire. A foreign Response with no sensitive command keys still continues as before.

See MIGRATION.md → v33.0.0

  • CNIC\CNR\SessionClient and CNIC\CNR\SessionCapable are
    removed, with no alias; ClientFactory::cnr() declares CNIC\CNR\Client as its
    return type. Rename the type — the four session methods are unchanged in
    signature and behaviour.

See MIGRATION.md → v33.0.0

  • ResponseTemplateManagerInterface no longer declares
    getTemplate(), getTemplates(), isTemplateMatchHash() or
    isTemplateMatchPlain() — they moved to CNIC\ResponseTemplateFactoryInterface.
    The concrete brand managers still answer all eight calls, so only
    interface-typed handles are affected. The protected hook
    AbstractResponseTemplateManager::createResponse() is renamed
    createResponseFromTemplateId(), and getTemplates() resolves each entry by
    id rather than by wire text.

See MIGRATION.md → v33.0.0

  • Column::$length is removed; read the count through
    ColumnInterface::getLength(). Anyone implementing ColumnInterface directly must
    add the method.

See MIGRATION.md → v33.0.0

  • getPagination() returns CNIC\Paginator, not
    array<string,int|null> — call ->toArray() for the array. getCurrentPageNumber(),
    getNextPageNumber(), getPreviousPageNumber(), getNumberOfPages(),
    hasNextPage() and hasPreviousPage() are no longer on ResponseInterface or
    AbstractResponse; reach them through getPagination().

See MIGRATION.md → v33.0.0

  • getColumnKeys() no longer takes a bool; pagination and
    status metadata is unreachable through getColumn()/getColumnIndex()/records;
    the four pagination primitives answer null instead of standing in; an empty
    list reports 0 records instead of 1, and IBS list rows no longer carry the
    response status on row 0.

See MIGRATION.md → v33.0.0