v9.4.0
selectAll
Queries can now select every Cell present in a root or joined Row with the selectAll keyword (as requested in issue #40). Heterogeneous Rows are supported directly: each result Row contains only its source Row's Cells, while the result Table's Cell Ids are their reactive union.
Joined selections retain their Cell Ids by default, or can take a Cell Id prefix or mapping callback. Selection clauses are applied in declaration order, and source Cell Ids within a selectAll function call are processed lexically, so collision behavior is deterministic.
import {createQueries, createStore} from 'tinybase';
const selectAllStore = createStore().setTable('pets', {
fido: {species: 'dog', color: 'brown'},
felix: {species: 'cat', indoor: true},
});
const selectAllQueries = createQueries(selectAllStore);
selectAllQueries.setQueryDefinition('allPets', 'pets', ({selectAll}) =>
selectAll(),
);
console.log(selectAllQueries.getResultRow('allPets', 'fido'));
// -> {color: 'brown', species: 'dog'}
console.log(selectAllQueries.getResultRow('allPets', 'felix'));
// -> {indoor: true, species: 'cat'}Ungrouped queries iterate only the Cells present in each matched Row. Grouped queries discover columns from the table-wide Cell Id union, but materialize each Row in the same deterministic order before aggregation. They rebuild when that union changes; selected Cells that are not aggregated remain grouping dimensions.
Reliability And Hardening
- Multiplexed WebSockets accept at most 100 active channels, with channel Ids limited to 1,024 UTF-8 bytes. Client creation rejects local overflow without closing the shared socket; servers also bound pending channel setup and teardown. Fragment and startup-buffer limits are shared across the physical socket, abandoned fragments and in-flight subscriptions are cleaned up, and teardown waits for every channel even if one fails.
startAutoPersistingrolls back both partially started halves if the second half fails, without replacing the original error or stopping a newer concurrent start.- Fragmented Durable Object SQL storage now encodes unsafe and uppercase prefixes collision-free. Previous ambiguous table names are not adopted automatically and must be migrated explicitly.
- PostgreSQL tabular persistence keeps distinct INSERT, DELETE, and UPDATE notification triggers even when table names exceed PostgreSQL's identifier limit.
- Release validation now uses clean installs, runs the full unit and executable documentation suite with PostgreSQL in CI, and tests the final assembled distribution before publishing it.