@sproutboat/runtime 0.9.2 → 0.9.4
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 +12 -0
- package/package.json +1 -1
- package/src/transport-embedded.js +6 -2
- package/src/wrap.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @sproutboat/runtime
|
|
2
2
|
|
|
3
|
+
## 0.9.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 38db17d: Fix broker-backed native-fetch builds after the direct R2 download ABI gained an ETag accessor.
|
|
8
|
+
|
|
9
|
+
## 0.9.3
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 5ee065c: Stream standalone direct R2 byte ranges safely and support ETag conditionals.
|
|
14
|
+
|
|
3
15
|
## 0.9.2
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -581,7 +581,7 @@ static void sb_r2_delete_blob(const char* path, const char* bucket, const char*
|
|
|
581
581
|
typedef struct sb_r2_transfer_ctx {
|
|
582
582
|
FILE* file;
|
|
583
583
|
sqlite3* db;
|
|
584
|
-
char store[1024], bucket[256], key[512], token[32], expected[65], http[1024], custom[1024], temporary[1200];
|
|
584
|
+
char store[1024], bucket[256], key[512], token[32], expected[65], etag[65], http[1024], custom[1024], temporary[1200];
|
|
585
585
|
size_t size, max_bytes;
|
|
586
586
|
} sb_r2_transfer_ctx;
|
|
587
587
|
|
|
@@ -771,11 +771,14 @@ int sb_r2_transfer_download_open(const char* bucket, const char* token, sb_r2_tr
|
|
|
771
771
|
snprintf(ctx->key, sizeof(ctx->key), "%s", key);
|
|
772
772
|
sqlite3_finalize(st);
|
|
773
773
|
st = 0;
|
|
774
|
-
if (sqlite3_prepare_v2(ctx->db, "SELECT blob_id FROM r2 WHERE bucket=?1 AND key=?2", -1, &st, 0) != 0 || !st) { free(ctx); return 503; }
|
|
774
|
+
if (sqlite3_prepare_v2(ctx->db, "SELECT blob_id, etag FROM r2 WHERE bucket=?1 AND key=?2", -1, &st, 0) != 0 || !st) { free(ctx); return 503; }
|
|
775
775
|
sqlite3_bind_text(st, 1, bucket, -1, SB_SQLITE_TRANSIENT);
|
|
776
776
|
sqlite3_bind_text(st, 2, ctx->key, -1, SB_SQLITE_TRANSIENT);
|
|
777
777
|
if (sqlite3_step(st) != SB_SQLITE_ROW) { sqlite3_finalize(st); free(ctx); return 404; }
|
|
778
778
|
const char* generation = (const char*)sqlite3_column_text(st, 0);
|
|
779
|
+
const char* etag = (const char*)sqlite3_column_text(st, 1);
|
|
780
|
+
if (!etag || strlen(etag) >= sizeof(ctx->etag)) { sqlite3_finalize(st); free(ctx); return 404; }
|
|
781
|
+
snprintf(ctx->etag, sizeof(ctx->etag), "%s", etag);
|
|
779
782
|
char blobpath[1024];
|
|
780
783
|
sb_r2_blob_path(blobpath, sizeof(blobpath), ctx->store, bucket, ctx->key, generation ? generation : "");
|
|
781
784
|
sqlite3_finalize(st);
|
|
@@ -795,6 +798,7 @@ int sb_r2_transfer_download_open(const char* bucket, const char* token, sb_r2_tr
|
|
|
795
798
|
}
|
|
796
799
|
|
|
797
800
|
size_t sb_r2_transfer_download_size(sb_r2_transfer_ctx* ctx) { return ctx ? ctx->size : 0; }
|
|
801
|
+
const char* sb_r2_transfer_download_etag(sb_r2_transfer_ctx* ctx) { return ctx ? ctx->etag : ""; }
|
|
798
802
|
size_t sb_r2_transfer_download_read(sb_r2_transfer_ctx* ctx, size_t offset, char* out, size_t cap) {
|
|
799
803
|
if (!ctx || !ctx->file || offset >= ctx->size || fseek(ctx->file, (long)offset, SEEK_SET) != 0) return 0;
|
|
800
804
|
size_t wanted = ctx->size - offset < cap ? ctx->size - offset : cap;
|
package/src/wrap.ts
CHANGED
|
@@ -200,7 +200,7 @@ export function wrapNativeFetchHandler(
|
|
|
200
200
|
const nativeTransferAbi =
|
|
201
201
|
transport === "embedded"
|
|
202
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; } 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";
|
|
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";
|
|
204
204
|
const wire = hasBindings(bindings)
|
|
205
205
|
? `__sbInstallBindings(env, ${JSON.stringify(bindings)});\n`
|
|
206
206
|
: "";
|