Skip to content

Commit 83e1aad

Browse files
luluizdependabot[bot]ctw-joao-luisthomassedlmayerrodrigo-p-rodrigues
authored
Release/minor/v1.28.0 (#1247)
Minor release to v1.28.0. --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Thomas Sedlmayer <tsedlmayer@pmsfit.de> Signed-off-by: Bezerra Luiz, (Luiz.Bezerra@ctw.bmwgroup.com) <luiz.bezerra+QCOM@ctw.bmwgroup.com> Signed-off-by: ctw-joao-luis <Joao.Luis@ctw.bmwgroup.com> Signed-off-by: Taeseung Sohn <paulsohnjp@gmail.com> Signed-off-by: Gabriela Almeida <gabriela.almeida@criticaltechworks.com> Signed-off-by: Bezerra Luiz, (Luiz.Bezerra@ctw.bmwgroup.com) <198787532+luiz-bezerra-ctw-bmwgroup-com_QCOM@users.noreply.github.com> Signed-off-by: joao-oliveira-ctw <joao.alves.oliveira@criticaltechworks.com> Signed-off-by: Bezerra Luiz, (Luiz.Bezerra@ctw.bmwgroup.com) <luiz.bezerra@ctw.bmwgroup.com> Signed-off-by: Benedikt Schwering <mail@bschwer.ing> Signed-off-by: Gordon Stevenson <gordon.n.stevenson@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Joao Luis <joao.miguel.luis@criticaltechworks.com> Co-authored-by: Thomas Sedlmayer <tsedlmayer@pmsfit.de> Co-authored-by: ctw-joao-luis <Joao.Luis@ctw.bmwgroup.com> Co-authored-by: Rodrigo CTW <rodrigo.PE.rodrigues@ctw.bmwgroup.com> Co-authored-by: Gabriela Almeida <gabriela.almeida@criticaltechworks.com> Co-authored-by: Bezerra Luiz, (Luiz.Bezerra@ctw.bmwgroup.com) <198787532+luiz-bezerra-ctw-bmwgroup-com_QCOM@users.noreply.github.com> Co-authored-by: Alexandre Neuwald CTW <Alexandre.Neuwald@ctw.bmwgroup.com> Co-authored-by: Bezerra Luiz, (Luiz.Bezerra@ctw.bmwgroup.com) <luiz.bezerra+QCOM@ctw.bmwgroup.com> Co-authored-by: Alexandre Neuwald <alexandre.neuwald@criticaltechworks.com> Co-authored-by: Bruno Abreu <bmachadorj@gmail.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Taeseung Sohn <paulsohnjp@gmail.com> Co-authored-by: Planck-Ho <wenloong.he@gmail.com> Co-authored-by: lichtblick-bot <lichtblick@bmwgroup.com> Co-authored-by: andremarques94 <90326088+andremarques94@users.noreply.github.com> Co-authored-by: Taeseung Sohn <taeseung.sohn@tier4.jp> Co-authored-by: joao-oliveira-ctw <joao.alves.oliveira@criticaltechworks.com> Co-authored-by: cadkin <adkinscv@ornl.gov> Co-authored-by: udovonbmw <udo.rietschel@bmw.de> Co-authored-by: Copilot <copilot@github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: xucheng.zhang <xucheng.zhang@vbot.cn> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Benedikt Schwering <mail@bschwer.ing> Co-authored-by: skrutzler-knapp <stefan.krutzler3@knapp.com> Co-authored-by: Carlos Alvarez <candres.alv@gmail.com> Co-authored-by: Gordon Stevenson <gordon.n.stevenson@gmail.com> Co-authored-by: Thenuka Perera <thenuka@vexev.com> Co-authored-by: quentin-couton <quentin.couton@intempora.com> Co-authored-by: Max Richter <max.richter@understand.ai> Co-authored-by: Gordon Stevenson <gordon@vexev.com> Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 7d42ada commit 83e1aad

267 files changed

Lines changed: 7990 additions & 2999 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/agents/lb-e2e-test.agent.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,4 +196,8 @@ yarn test:e2e:desktop # All desktop tests
196196
# Web
197197
yarn test:e2e:web:debug <filename-fragment> # Debug single test
198198
yarn test:e2e:web # All web tests
199+
200+
# CI
201+
yarn test:e2e:ci # Always confirm that all tests pass in CI before pushing
202+
199203
```

‎.github/agents/lb-remote-connection.agent.md‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ FetchReader (Streams API → EventEmitter: data/error/end)
2323
CachedFilelike (VirtualLRUBuffer LRU cache, 500MB default, 10MB blocks)
2424
│
2525
▼
26+
BatchingReadable (coalesces reads <64KiB apart within a microtask tick, ≤4MiB span)
27+
│
28+
▼
2629
RemoteFileReadable (IReadable adapter: size(), read(offset, size))
2730
│
2831
├─────────────────── Worker boundary ────────────────────┐
@@ -76,7 +79,8 @@ WorkerSerializedIterableSource → BufferedIterableSource → Player
7679
| `util/VirtualLRUBuffer.ts` | Block-level LRU memory management |
7780
| `util/getNewConnection.ts` | HTTP connection decision algorithm |
7881
| `util/RequestQueue.ts` | Global concurrency limiter (10 max) |
79-
| `IterablePlayer/Mcap/RemoteFileReadable.ts` | `IReadable` adapter wrapping CachedFilelike |
82+
| `IterablePlayer/Mcap/RemoteFileReadable.ts` | `IReadable` adapter wrapping CachedFilelike (reads pass through BatchingReadable) |
83+
| `IterablePlayer/Mcap/BatchingReadable.ts` | Coalesces nearby `IReadable.read()` calls into fewer, larger reads |
8084
| `IterablePlayer/Mcap/McapIterableSource.ts` | Factory: indexed vs streaming decision |
8185
| `IterablePlayer/Mcap/McapIndexedIterableSource.ts` | Random access via chunk indexes |
8286
| `IterablePlayer/shared/MultiIterableSource.ts` | Multi-file orchestration |
@@ -306,6 +310,7 @@ WorkerSerializedIterableSource McapIterableSourceWorker.worker.ts
306310
8. **WASM decompression preload** prevents initialization failures under slow network
307311
9. **Cache budget division** for multi-file: consider fewer large files over many small ones
308312
10. **BufferedIterableSource** (10s, 300MB) smooths network latency for playback
313+
11. **Read coalescing** (`BatchingReadable`): merges `read()` calls arriving in the same microtask tick (gap <64KiB, ≤4MiB span) before they reach `CachedFilelike`
309314

310315
## Common Pitfalls
311316
- Server missing `Accept-Ranges: bytes` header → fails at open

‎.github/instructions/contributing.instructions.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@ applyTo: "**/*.ts,**/*.tsx"
66

77
These rules are derived from [CONTRIBUTING.md](../../CONTRIBUTING.md) and apply to all TypeScript and TSX files.
88

9+
## Branch naming
10+
11+
Branch names must use a prefix that matches the target branch (enforced in CI by
12+
[enforce-branch-naming.yml](../workflows/enforce-branch-naming.yml)):
13+
14+
| Target branch | Allowed source prefixes |
15+
|---------------|-------------------------|
16+
| `main` | `release/`, `hotfix/` |
17+
| `develop` | `feature/`, `bugfix/`, `dependabot/`, `sync/` |
18+
19+
Use a short, descriptive, kebab-case name after the prefix (e.g. `feature/improve-ai-experience`).
20+
921
## Component Structure
1022

1123
Every React component must follow this file organization:

‎.github/skills/mcap-format/SKILL.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ MCAP is an open-source container format for heterogeneous timestamped data, desi
179179
| Indexed source | `McapIndexedIterableSource.ts` |
180180
| Unindexed source | `McapUnindexedIterableSource.ts` |
181181
| File readable | `BlobReadable.ts` (local), `RemoteFileReadable.ts` (HTTP Range) |
182+
| Remote read coalescing | `BatchingReadable.ts` (merges nearby `read()` calls in a microtask tick) |
182183
| Decompression | `packages/mcap-support/src/decompressHandlers.ts` |
183184
| Schema parsing | `packages/mcap-support/src/parseChannel.ts` |
184185
| 10s read-ahead (default) | `BufferedIterableSource` (`DEFAULT_READ_AHEAD_DURATION = { sec: 10, nsec: 0 }`) |

‎.github/skills/remote-caching/SKILL.md‎

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ FetchReader (Streams API → EventEmitter: data/error/end)
1616
CachedFilelike (LRU block cache via VirtualLRUBuffer)
1717
│
1818
▼
19+
BatchingReadable (coalesces nearby read() calls within a microtask tick)
20+
│
21+
▼
1922
RemoteFileReadable (IReadable adapter: size(), read(offset, size))
2023
│
2124
▼ ┌─── Worker boundary ───┐
@@ -276,23 +279,48 @@ export const globalRequestQueue = new RequestQueue(GLOBAL_REQUEST_QUEUE_MAX_CONC
276279
Thin adapter bridging `CachedFilelike` (byte-offset Filelike API) to `McapTypes.IReadable` (bigint offset/size API).
277280

278281
```typescript
282+
const DEFAULT_CACHE_SIZE_BYTES = 1024 * 1024 * 500; // 500MiB
283+
279284
class RemoteFileReadable {
280-
#remoteReader: CachedFilelike; // Configured with 500MB cache
285+
#remoteReader: CachedFilelike; // Cache size configurable, defaults to 500MiB
286+
#batchingReadable: BatchingReadable; // Coalesces reads before CachedFilelike
281287

282-
constructor(url: string, cacheSizeInBytes = 500 * 1024 * 1024) {
288+
constructor(url: string, options?: { cacheSizeInBytes?: number; readAheadEnabled?: boolean }) {
283289
const fileReader = new BrowserHttpReader(url);
284-
this.#remoteReader = new CachedFilelike({ fileReader, cacheSizeInBytes });
290+
this.#remoteReader = new CachedFilelike({
291+
fileReader,
292+
cacheSizeInBytes: options?.cacheSizeInBytes ?? DEFAULT_CACHE_SIZE_BYTES,
293+
readAheadEnabled: options?.readAheadEnabled,
294+
});
295+
const inner = {
296+
size: async () => BigInt(this.#remoteReader.size()),
297+
read: async (offset, size) => this.#remoteReader.read(Number(offset), Number(size)),
298+
};
299+
this.#batchingReadable = new BatchingReadable(inner);
285300
}
286301

287302
async size(): Promise<bigint> { return BigInt(this.#remoteReader.size()); }
288303
async read(offset: bigint, size: bigint): Promise<Uint8Array> {
289-
return await this.#remoteReader.read(Number(offset), Number(size));
304+
return await this.#batchingReadable.read(offset, size); // → coalesced → CachedFilelike
290305
}
291306
}
292307
```
293308

294309
---
295310

311+
## BatchingReadable
312+
313+
**Source**: `packages/suite-base/src/players/IterablePlayer/Mcap/BatchingReadable.ts`
314+
315+
### Purpose
316+
Coalescing layer between `McapIndexedReader` and `CachedFilelike`. Accumulates `read()` calls that arrive within the same microtask tick, sorts them by offset, and merges those whose gap is `< 64 KiB` (up to a `4 MiB` merged span) into a single underlying read — cutting HTTP Range requests for MCAP files with many small chunks.
317+
318+
### Notes
319+
- Single-member groups are forwarded zero-copy; multi-member groups are sliced (copied) per request so a small result does not pin the full merged buffer in memory.
320+
- Only coalesces reads that are concurrently pending in the same tick. `McapIndexedReader` issues reads strictly sequentially (each awaited before the next), so real coalescing depends on concurrent access — validate request-count reduction empirically for a given workload.
321+
322+
---
323+
296324
## Multi-File Cache Budget Distribution
297325

298326
When `MultiIterableSource` handles multiple remote URLs:
@@ -321,5 +349,5 @@ This means:
321349
| `packages/suite-base/src/util/BrowserHttpReader.ts` | HTTP Range request implementation |
322350
| `packages/suite-base/src/util/FetchReader.ts` | Streams API EventEmitter adapter |
323351
| `packages/suite-base/src/util/RequestQueue.ts` | Global concurrency limiter (10 max) |
324-
| `packages/suite-base/src/players/IterablePlayer/Mcap/RemoteFileReadable.ts` | IReadable adapter (500MB default) |
325-
352+
| `packages/suite-base/src/players/IterablePlayer/Mcap/RemoteFileReadable.ts` | IReadable adapter (500MB default); reads pass through BatchingReadable |
353+
| `packages/suite-base/src/players/IterablePlayer/Mcap/BatchingReadable.ts` | Coalesces nearby `read()` calls (gap <64KiB, ≤4MiB span) into fewer inner reads |

‎.github/workflows/ci.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ jobs:
5555
steps:
5656
- uses: actions/checkout@v7
5757

58-
- uses: actions/setup-node@v6
58+
- uses: actions/setup-node@v7
5959
with:
6060
node-version: 24
6161
- run: corepack enable yarn
@@ -94,7 +94,7 @@ jobs:
9494
steps:
9595
- uses: actions/checkout@v7
9696

97-
- uses: actions/setup-node@v6
97+
- uses: actions/setup-node@v7
9898
with:
9999
node-version: 24
100100
- run: corepack enable yarn
@@ -145,7 +145,7 @@ jobs:
145145
steps:
146146
- uses: actions/checkout@v7
147147

148-
- uses: actions/setup-node@v6
148+
- uses: actions/setup-node@v7
149149
with:
150150
node-version: 24
151151
- run: corepack enable yarn
@@ -187,7 +187,7 @@ jobs:
187187
steps:
188188
- uses: actions/checkout@v7
189189

190-
- uses: actions/setup-node@v6
190+
- uses: actions/setup-node@v7
191191
with:
192192
node-version: 24
193193
- run: corepack enable yarn

‎.github/workflows/cloudflare-pages.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424
with:
2525
submodules: true
2626

27-
- uses: actions/setup-node@v6
27+
- uses: actions/setup-node@v7
2828
with:
2929
node-version: 24
3030

‎.github/workflows/dependabot-fix.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636
token: ${{ secrets.LICHTBLICK_GITHUB_TOKEN }}
3737
ref: ${{ github.event.pull_request.head.ref }}
3838

39-
- uses: actions/setup-node@v6
39+
- uses: actions/setup-node@v7
4040
with:
4141
node-version: 24
4242

‎.github/workflows/e2e-regression.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
steps:
3535
- uses: actions/checkout@v7
3636

37-
- uses: actions/setup-node@v6
37+
- uses: actions/setup-node@v7
3838
with:
3939
node-version: 24
4040
- run: corepack enable yarn
@@ -85,7 +85,7 @@ jobs:
8585
steps:
8686
- uses: actions/checkout@v7
8787

88-
- uses: actions/setup-node@v6
88+
- uses: actions/setup-node@v7
8989
with:
9090
node-version: 24
9191
- run: corepack enable yarn
@@ -127,7 +127,7 @@ jobs:
127127
steps:
128128
- uses: actions/checkout@v7
129129

130-
- uses: actions/setup-node@v6
130+
- uses: actions/setup-node@v7
131131
with:
132132
node-version: 24
133133
- run: corepack enable yarn

‎.github/workflows/gh-pages.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
with:
3131
ref: main
3232

33-
- uses: actions/setup-node@v6
33+
- uses: actions/setup-node@v7
3434
with:
3535
node-version: 24
3636

0 commit comments

Comments
 (0)