Skip to content

Commit 511dbdc

Browse files
authored
Add options for ReferenceStore (#155)
1 parent 3504747 commit 511dbdc

File tree

4 files changed

+33
-12
lines changed

4 files changed

+33
-12
lines changed

.changeset/something.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@zarrita/storage": patch
3+
---
4+
5+
Add support for passing fetch options to ReferenceStore.

packages/storage/src/fetch.ts

+2-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { AbsolutePath, AsyncReadable, RangeQuery } from "./types.js";
2-
import { fetch_range } from "./util.js";
2+
import { fetch_range, merge_init } from "./util.js";
33

44
function resolve(root: string | URL, path: AbsolutePath): URL {
55
const base = typeof root === "string" ? new URL(root) : root;
@@ -72,14 +72,7 @@ class FetchStore implements AsyncReadable<RequestInit> {
7272
}
7373

7474
#merge_init(overrides: RequestInit) {
75-
return {
76-
...this.#overrides,
77-
...overrides,
78-
headers: {
79-
...this.#overrides.headers,
80-
...overrides.headers,
81-
},
82-
};
75+
return merge_init(this.#overrides, overrides);
8376
}
8477

8578
async get(

packages/storage/src/ref.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { parse } from "reference-spec-reader";
2-
import { fetch_range, strip_prefix, uri2href } from "./util.js";
2+
import { fetch_range, merge_init, strip_prefix, uri2href } from "./util.js";
33
import type { AbsolutePath, AsyncReadable } from "./types.js";
44

55
/**
@@ -36,19 +36,22 @@ type ReferenceEntry = string | [url: string | null] | [
3636

3737
interface ReferenceStoreOptions {
3838
target?: string | URL;
39+
overrides?: RequestInit;
3940
}
4041

4142
/** @experimental */
4243
class ReferenceStore implements AsyncReadable<RequestInit> {
4344
#refs: Map<string, ReferenceEntry>;
4445
#opts: ReferenceStoreOptions;
46+
#overrides: RequestInit;
4547

4648
constructor(
4749
refs: Map<string, ReferenceEntry>,
4850
opts: ReferenceStoreOptions = {},
4951
) {
5052
this.#refs = refs;
5153
this.#opts = opts;
54+
this.#overrides = opts.overrides || {};
5255
}
5356

5457
async get(
@@ -72,7 +75,12 @@ class ReferenceStore implements AsyncReadable<RequestInit> {
7275
throw Error(`No url for key ${key}, and no target url provided.`);
7376
}
7477

75-
let res = await fetch_range(uri2href(url), offset, size, opts);
78+
let res = await fetch_range(
79+
uri2href(url),
80+
offset,
81+
size,
82+
merge_init(this.#overrides, opts),
83+
);
7684

7785
if (res.status === 200 || res.status === 206) {
7886
return new Uint8Array(await res.arrayBuffer());
@@ -89,7 +97,7 @@ class ReferenceStore implements AsyncReadable<RequestInit> {
8997
}
9098

9199
static async fromUrl(url: string | URL, opts?: ReferenceStoreOptions) {
92-
let spec = await fetch(url).then((res) => res.json());
100+
let spec = await fetch(url, opts?.overrides).then((res) => res.json());
93101
return ReferenceStore.fromSpec(spec, opts);
94102
}
95103
}

packages/storage/src/util.ts

+15
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,18 @@ export function fetch_range(
4040
}
4141
return fetch(url, opts);
4242
}
43+
44+
export function merge_init(
45+
storeOverrides: RequestInit,
46+
requestOverrides: RequestInit,
47+
) {
48+
// Request overrides take precedence over storeOverrides.
49+
return {
50+
...storeOverrides,
51+
...requestOverrides,
52+
headers: {
53+
...storeOverrides.headers,
54+
...requestOverrides.headers,
55+
},
56+
};
57+
}

0 commit comments

Comments
 (0)