sproutboat 0.49.0 → 0.50.0

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,24 @@ maintained going forward by the `release` skill.
10
10
 
11
11
  ## Unreleased
12
12
 
13
+ ## [0.50.0] - 2026-11-02
14
+
15
+ Built on `@sproutboat/runtime` 0.41.0, `@sproutboat/toolchain` 0.22.0 and `@sproutboat/wire` 0.21.4. Each change below that an existing app could observe starts at a new compatibility date; earlier dates answer as before.
16
+
17
+ ### Added
18
+
19
+ - **`fetch()` on a standalone binary runs off the event loop from `2026-11-16`**: 20 concurrent fetches to a 100 ms endpoint take about
20
+ 105 ms instead of 2,040 ms, and other requests keep being served meanwhile. Requests now interleave across `await fetch()`, as in workerd,
21
+ which is why it starts at a new date; earlier dates answer as before.
22
+
23
+ ### Changed
24
+
25
+ - **Secrets from the environment decode as UTF-8 from `2026-11-07`** on a standalone binary. Before, the handler got the environment's bytes one char per byte, so `é` arrived as `é`.
26
+
27
+ ### Performance
28
+
29
+ - **ES256 (ECDSA P-256) in `crypto.subtle` signs 2.2x and verifies 3.1x faster** (macOS arm64, standalone and broker: 2,563 to 5,621 signs and 1,318 to 4,050 verifies per second). BearSSL is pinned to master commit `7bea48e` instead of 0.6 (source: the bearssl.org gitweb snapshot, sha256 `ed397832…`) and the runtime selects its 64-bit P-256 code (`ec_p256_m64`) where the target has a 128-bit multiply, which includes both Linux targets. Results are unchanged, so there is no new compatibility date; every other primitive is as before.
30
+
13
31
  ## [0.49.0] - 2026-10-31
14
32
 
15
33
  Built on `@sproutboat/runtime` 0.39.0, `@sproutboat/toolchain` 0.22.0 and `@sproutboat/wire` 0.21.2. Nothing an app can observe changes, so there is no new compatibility date.
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.49.0
6
+ **Package:** `sproutboat` 0.50.0
7
7
 
8
8
  ## Commands
9
9
 
@@ -10,7 +10,7 @@ to its upstream source.
10
10
  | Zig | `0.16.0` | Acquired cross-compiler | MIT | https://ziglang.org |
11
11
  | uWebSockets and uSockets | `360c276d609d59af56ae6932adb95154ace9f15f` | Embedded source and static archive | Apache-2.0 | https://github.com/uNetworking/uWebSockets |
12
12
  | SQLite | `3.50.4` | Acquired for standalone builds | Public domain | https://sqlite.org |
13
- | BearSSL | `0.6` | Acquired for standalone builds | MIT | https://bearssl.org |
13
+ | BearSSL | `7bea48e` (master) | Acquired for standalone builds | MIT | https://bearssl.org |
14
14
 
15
15
  ## Integrity pins
16
16
 
@@ -19,7 +19,7 @@ to its upstream source.
19
19
  | Porffor source archive | `1a62187a93356b36cb6ac703ce9770c8917e4fa65545fd7c33ee8a180ae5a4c9` |
20
20
  | Embedded uWebSockets archive | `e83736f3f8cf9d56a1ebe6ea61625a7af12386763374d47c14cff472ada7484a` |
21
21
  | SQLite amalgamation archive | `1d3049dd0f830a025a53105fc79fd2ab9431aea99e137809d064d8ee8356b032` |
22
- | BearSSL source archive | `6705bba1714961b41a728dfc5debbe348d2966c117649392f8c8139efc83ff14` |
22
+ | BearSSL source archive | `ed397832b1613582737d9c1ce01c1af74ad6a9e9c52a341e24433987cda0f372` |
23
23
  | Mozilla CA bundle | `f66dff1bdf8f96060b8177976f8b7d9254bc89bc4db933d769f7384d28480bc9` |
24
24
 
25
25
  The complete Apache-2.0 notice for uWebSockets and uSockets is retained in the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sproutboat",
3
- "version": "0.49.0",
3
+ "version": "0.50.0",
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",
@@ -64,9 +64,9 @@
64
64
  "@sproutboat/artifact": "^0.3.0",
65
65
  "@sproutboat/assets": "^0.3.0",
66
66
  "@sproutboat/config": "^0.6.0",
67
- "@sproutboat/runtime": "^0.39.0",
67
+ "@sproutboat/runtime": "^0.41.0",
68
68
  "@sproutboat/toolchain": "^0.22.0",
69
- "@sproutboat/wire": "^0.21.2"
69
+ "@sproutboat/wire": "^0.21.4"
70
70
  },
71
71
  "devDependencies": {
72
72
  "@oxlint/plugins": "1.85.0",
@@ -78,10 +78,10 @@
78
78
  "typescript": "7.0.2"
79
79
  },
80
80
  "optionalDependencies": {
81
- "@sproutboat/cli-darwin-arm64": "0.49.0",
82
- "@sproutboat/cli-darwin-x64": "0.49.0",
83
- "@sproutboat/cli-linux-arm64": "0.49.0",
84
- "@sproutboat/cli-linux-x64": "0.49.0"
81
+ "@sproutboat/cli-darwin-arm64": "0.50.0",
82
+ "@sproutboat/cli-darwin-x64": "0.50.0",
83
+ "@sproutboat/cli-linux-arm64": "0.50.0",
84
+ "@sproutboat/cli-linux-x64": "0.50.0"
85
85
  },
86
86
  "engines": {
87
87
  "node": ">=18"
package/src/bearssl.ts CHANGED
@@ -22,9 +22,16 @@ import { resolve } from "node:path";
22
22
  import { LINUX_TARGETS, type BuildTarget } from "./targets";
23
23
  import { resolveHostCompiler } from "./toolchain";
24
24
 
25
- export const BEARSSL_VERSION = "0.6";
26
- const BEARSSL_URL = `https://bearssl.org/bearssl-${BEARSSL_VERSION}.tar.gz`;
27
- const BEARSSL_SHA256 = "6705bba1714961b41a728dfc5debbe348d2966c117649392f8c8139efc83ff14";
25
+ /**
26
+ * BearSSL master, pinned to a commit: 0.6 (2018) predates `ec_p256_m64`, the 64-bit P-256 code that
27
+ * crypto.subtle selects explicitly (ES256 sign 2.9x, verify 5.7x faster). There is no release after 0.6,
28
+ * so the source is the gitweb snapshot of this commit, pinned by the digest of its bytes.
29
+ */
30
+ export const BEARSSL_COMMIT = "7bea48e5e850ab4cafbe68d3765cdaba13a86d6f";
31
+ export const BEARSSL_VERSION = BEARSSL_COMMIT.slice(0, 7);
32
+ const BEARSSL_TREE = `BearSSL-${BEARSSL_VERSION}`;
33
+ const BEARSSL_URL = `https://bearssl.org/gitweb/?p=BearSSL;a=snapshot;h=${BEARSSL_COMMIT};sf=tgz`;
34
+ const BEARSSL_SHA256 = "ed397832b1613582737d9c1ce01c1af74ad6a9e9c52a341e24433987cda0f372";
28
35
 
29
36
  /**
30
37
  * The Mozilla root set, as curl publishes it. Pinned by hash like everything
@@ -118,7 +125,7 @@ async function download(url: string, expected: string, to: string): Promise<Buff
118
125
  /** Unpack the source tree once, and build the host tools we need from it. */
119
126
  async function sourceTree(): Promise<string> {
120
127
  const dir = cacheDir();
121
- const tree = resolve(dir, `bearssl-${BEARSSL_VERSION}`);
128
+ const tree = resolve(dir, BEARSSL_TREE);
122
129
  return withBearsslLock(dir, "source", async () => {
123
130
  const tarball = resolve(dir, "bearssl.tar.gz");
124
131
  const sourceManifest = resolve(tree, ".sproutboat-source");
@@ -142,7 +149,7 @@ async function sourceTree(): Promise<string> {
142
149
  await mkdir(stage, { recursive: true });
143
150
  const untar = await run("tar", ["xzf", tarball, "-C", stage]);
144
151
  if (untar.code !== 0) throw new Error(`could not unpack BearSSL: ${untar.stderr}`);
145
- const stagedTree = resolve(stage, `bearssl-${BEARSSL_VERSION}`);
152
+ const stagedTree = resolve(stage, BEARSSL_TREE);
146
153
  if (!existsSync(resolve(stagedTree, "inc/bearssl.h"))) {
147
154
  await rm(stage, { recursive: true, force: true });
148
155
  throw new Error("BearSSL archive did not contain bearssl.h");