The response
A response carries clientId, callbackId, an isError
flag and a data container holding whichever of appData, routeData,
or viewData it's updating, each with an optional matching rules dictionary,
appDataRules, routeDataRules, viewDataRules, keyed by
property name. Bindary merges received data into the client's own data automatically,
according to those rules.
Client-side, a rule covers: path (retarget where this specific property
applies, rather than its own key), updateKey/removeByKeyValues
(match array items by a field's value rather than by index), addIndex/
removeIndex/removeCount (position-based insertion and removal),
update (merge onto existing data or overwrite it outright),
recreate (rebuild the element rather than update it in place) and
ignoreNullValues/omitKeys (skip specific fields when merging).
This is the client's view of the contract, what arrives and how it gets applied. It isn't
the same shape as a specific backend's own rules class, .NET's DataRules, for
instance, matches closely but adds a couple of fields of its own. Each backend page covers
its own version, this is the wire format both sides agree on.