sproutboat 0.10.2 → 0.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,30 @@ maintained going forward by the `release` skill.
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [0.10.3] - 2026-09-11
14
+ ### Added
15
+ - Rate-limiter result carries `resetAt`: `env.<NAME>.limit({ key })` now returns
16
+ `{ success, resetAt }`, where `resetAt` is epoch ms for when the fixed window
17
+ rolls, so a `429` can send an accurate `Retry-After`
18
+ (baronunread/sproutboat#69). Additive; callers reading only `success` are
19
+ unaffected.
20
+
21
+ ### Changed
22
+ - `@sproutboat/runtime` and `@sproutboat/wire` bumped to `^0.5.0`; they carry
23
+ the `resetAt` value the rate-limiter type now declares.
24
+
25
+ ### Docs
26
+ - `docs/standalone.md`: dropped the stale "outbound `fetch()` speaks `http://`
27
+ only" bullet. Standalone binaries link BearSSL and verify HTTPS against the
28
+ Mozilla root set (see "TLS, in both directions"). Added a
29
+ dev/standalone/deployed parity note: every binding op, rate limiters and
30
+ `request.cf.clientIp` with `SB_TRUSTED_PROXIES` included, behaves the same
31
+ under `sproutboat dev` as in a standalone binary and a deployed sprout.
32
+ - `capability-http-sync-v0.md`: documented async handlers. `fetch` may return a
33
+ promise it creates (not a `.then()`-chained one, which hangs); async responses
34
+ omit `x-sb-cpu-ms`; `crypto.subtle` digest/sign/verify are async in signature
35
+ only over synchronous inline C, so per-request hashing costs no I/O.
36
+
13
37
  ## [0.10.2] - 2026-09-11
14
38
  ### Fixed
15
39
  - The one-time Zig download no longer depends on ziglang.org being reachable.
@@ -370,7 +394,8 @@ its own package.
370
394
  - Renamed the package to `sproutboat` (was `@sproutboat/cli`); dropped the
371
395
  `sprout` bin alias in favour of a user-defined shell alias.
372
396
 
373
- [Unreleased]: https://github.com/baronunread/sproutboat-cli/compare/v0.10.2...HEAD
397
+ [Unreleased]: https://github.com/baronunread/sproutboat-cli/compare/v0.10.3...HEAD
398
+ [0.10.3]: https://github.com/baronunread/sproutboat-cli/compare/v0.10.2...v0.10.3
374
399
  [0.10.2]: https://github.com/baronunread/sproutboat-cli/compare/v0.10.1...v0.10.2
375
400
  [0.10.1]: https://github.com/baronunread/sproutboat-cli/compare/v0.10.0...v0.10.1
376
401
  [0.10.0]: https://github.com/baronunread/sproutboat-cli/compare/v0.9.0...v0.10.0
package/SURFACE.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > Generated by `src/surface.test.ts` from `src/surface.ts` + the pinned
4
4
  > toolchain constants. Do not edit by hand — run `UPDATE_SURFACE=1 bun test`.
5
5
 
6
- **Package:** `sproutboat` 0.10.2 · runs on Bun (use `bunx`, not `npx`)
6
+ **Package:** `sproutboat` 0.10.3 · runs on Bun (use `bunx`, not `npx`)
7
7
 
8
8
  ## Commands
9
9
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sproutboat",
3
- "version": "0.10.2",
3
+ "version": "0.10.3",
4
4
  "description": "Wrangler-shaped CLI for Sproutboat. Deploys workers to any control plane via --api-url / SPROUTBOAT_API_URL.",
5
5
  "keywords": [
6
6
  "cli",
@@ -63,9 +63,9 @@
63
63
  "@sproutboat/artifact": "^0.2.0",
64
64
  "@sproutboat/assets": "^0.2.0",
65
65
  "@sproutboat/config": "^0.3.0",
66
- "@sproutboat/runtime": "^0.4.0",
66
+ "@sproutboat/runtime": "^0.5.0",
67
67
  "@sproutboat/toolchain": "^0.3.0",
68
- "@sproutboat/wire": "^0.4.0",
68
+ "@sproutboat/wire": "^0.5.0",
69
69
  "esbuild": "^0.28.2"
70
70
  },
71
71
  "devDependencies": {
@@ -182,9 +182,13 @@ declare global {
182
182
  * A rate-limiter binding (#69). `limit` and `period` are fixed in
183
183
  * sproutboat.jsonc; `limit({ key })` counts one call against a fixed window
184
184
  * and reports whether the key is still under the cap.
185
+ *
186
+ * `resetAt` is epoch milliseconds for when the window rolls and the count
187
+ * clears — the same for a hit or a miss. Turn a rejection into a header with
188
+ * `Retry-After: Math.ceil((resetAt - Date.now()) / 1000)`.
185
189
  */
186
190
  interface RateLimit {
187
- limit(options: { key: string }): { success: boolean };
191
+ limit(options: { key: string }): { success: boolean; resetAt: number };
188
192
  }
189
193
 
190
194
  // ------------------------------------ Crypto