Skip to content

v9.4.0

Choose a tag to compare

@jamesgpearce jamesgpearce released this 08 Aug 05:34
· 105 commits to main since this release

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.
  • startAutoPersisting rolls 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.