@sproutboat/runtime 0.9.5 → 0.9.6
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 +10 -0
- package/package.json +1 -1
- package/src/transport-embedded.js +0 -2
- package/src/wrap.ts +6 -7
- package/src/wrap.test.ts +0 -17
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @sproutboat/runtime
|
|
2
2
|
|
|
3
|
+
## 0.9.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- f070d70: Revert native R2 transfer size-gating (#202). It saved ~11KB of `__text`
|
|
8
|
+
(~1.3% of a typical binary) and on macOS didn't even change the shipped
|
|
9
|
+
file size, since `__TEXT` is page-aligned. Not worth the `#ifdef`
|
|
10
|
+
guard-placement bug class it introduced. R2 transfer support is native code
|
|
11
|
+
again, always compiled in with 404 stubs where unused, same as before #202.
|
|
12
|
+
|
|
3
13
|
## 0.9.5
|
|
4
14
|
|
|
5
15
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -578,7 +578,6 @@ static void sb_r2_delete_blob(const char* path, const char* bucket, const char*
|
|
|
578
578
|
// path before it allocates a PendingRequest body. The context owns only a file
|
|
579
579
|
// descriptor and small metadata buffers; object bytes stay in the kernel page
|
|
580
580
|
// cache until the final fixed-size digest pass.
|
|
581
|
-
#ifdef SB_R2_TRANSFER
|
|
582
581
|
typedef struct sb_r2_transfer_ctx {
|
|
583
582
|
FILE* file;
|
|
584
583
|
sqlite3* db;
|
|
@@ -806,7 +805,6 @@ size_t sb_r2_transfer_download_read(sb_r2_transfer_ctx* ctx, size_t offset, char
|
|
|
806
805
|
return fread(out, 1, wanted, ctx->file);
|
|
807
806
|
}
|
|
808
807
|
void sb_r2_transfer_download_close(sb_r2_transfer_ctx* ctx) { if (ctx) { if (ctx->file) fclose(ctx->file); free(ctx); } }
|
|
809
|
-
#endif
|
|
810
808
|
|
|
811
809
|
// Run a script: one or more statements separated by semicolons. sqlite3_exec
|
|
812
810
|
// handles the whole string, which prepare/step does not — it compiles the first
|
package/src/wrap.ts
CHANGED
|
@@ -194,14 +194,13 @@ export function wrapNativeFetchHandler(
|
|
|
194
194
|
`globalThis.__sbOutbound = ${JSON.stringify(bindings.outbound)};\n` +
|
|
195
195
|
(assets ? `globalThis.__sbAssets = ${JSON.stringify(assets)};\n` : "");
|
|
196
196
|
// The native transfer hook runs before JavaScript receives its Request. It
|
|
197
|
-
//
|
|
198
|
-
//
|
|
197
|
+
// has a real file-backed implementation only in embedded builds. The broker
|
|
198
|
+
// transport supplies ABI-compatible stubs because its separate transfer
|
|
199
|
+
// listener owns these URLs, while the shared uWebSockets patch is global.
|
|
199
200
|
const nativeTransferAbi =
|
|
200
|
-
|
|
201
|
-
?
|
|
202
|
-
:
|
|
203
|
-
? `Porffor.c\`const char* sb_standalone_app_name(void) { return ${JSON.stringify(appName)}; }\`;\n`
|
|
204
|
-
: 'Porffor.c`typedef struct sb_r2_transfer_ctx { int unused; } sb_r2_transfer_ctx; int sb_r2_transfer_open(const char* a, const char* b, size_t c, sb_r2_transfer_ctx** d) { if (d) *d = 0; return 404; } int sb_r2_transfer_write(sb_r2_transfer_ctx* a, const char* b, size_t c) { return 404; } int sb_r2_transfer_finish(sb_r2_transfer_ctx* a) { return 404; } void sb_r2_transfer_abort(sb_r2_transfer_ctx* a) {} int sb_r2_transfer_download_open(const char* a, const char* b, sb_r2_transfer_ctx** c) { if (c) *c = 0; return 404; } size_t sb_r2_transfer_download_size(sb_r2_transfer_ctx* a) { return 0; } const char* sb_r2_transfer_download_etag(sb_r2_transfer_ctx* a) { return ""; } size_t sb_r2_transfer_download_read(sb_r2_transfer_ctx* a, size_t b, char* c, size_t d) { return 0; } void sb_r2_transfer_download_close(sb_r2_transfer_ctx* a) {}`;\n';
|
|
201
|
+
transport === "embedded"
|
|
202
|
+
? `Porffor.c\`const char* sb_standalone_app_name(void) { return ${JSON.stringify(appName)}; }\`;\n`
|
|
203
|
+
: "Porffor.c`typedef struct sb_r2_transfer_ctx { int unused; } sb_r2_transfer_ctx; int sb_r2_transfer_open(const char* a, const char* b, size_t c, sb_r2_transfer_ctx** d) { if (d) *d = 0; return 404; } int sb_r2_transfer_write(sb_r2_transfer_ctx* a, const char* b, size_t c) { return 404; } int sb_r2_transfer_finish(sb_r2_transfer_ctx* a) { return 404; } void sb_r2_transfer_abort(sb_r2_transfer_ctx* a) {} int sb_r2_transfer_download_open(const char* a, const char* b, sb_r2_transfer_ctx** c) { if (c) *c = 0; return 404; } size_t sb_r2_transfer_download_size(sb_r2_transfer_ctx* a) { return 0; } const char* sb_r2_transfer_download_etag(sb_r2_transfer_ctx* a) { return \"\"; } size_t sb_r2_transfer_download_read(sb_r2_transfer_ctx* a, size_t b, char* c, size_t d) { return 0; } void sb_r2_transfer_download_close(sb_r2_transfer_ctx* a) {}`;\n";
|
|
205
204
|
const wire = hasBindings(bindings)
|
|
206
205
|
? `__sbInstallBindings(env, ${JSON.stringify(bindings)});\n`
|
|
207
206
|
: "";
|
package/src/wrap.test.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "bun:test";
|
|
2
|
-
import { EMPTY_BINDINGS, wrapNativeFetchHandler } from "./wrap";
|
|
3
|
-
|
|
4
|
-
const handler = "export default { fetch() { return new Response('ok'); } };";
|
|
5
|
-
|
|
6
|
-
test("direct R2 transfer ABI is emitted only for an R2 binding", () => {
|
|
7
|
-
const empty = wrapNativeFetchHandler(handler, "", {}, EMPTY_BINDINGS);
|
|
8
|
-
expect(empty).not.toContain("sb_r2_transfer_open");
|
|
9
|
-
|
|
10
|
-
const r2 = wrapNativeFetchHandler(handler, "", {}, { ...EMPTY_BINDINGS, r2: ["OBJECTS"] });
|
|
11
|
-
expect(r2).toContain("sb_r2_transfer_open");
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
test("scrypt remains available without a capability declaration", () => {
|
|
15
|
-
const wrapped = wrapNativeFetchHandler(handler, "sb_scrypt", {}, EMPTY_BINDINGS);
|
|
16
|
-
expect(wrapped).toContain("sb_scrypt");
|
|
17
|
-
});
|