@gradio/client 0.4.2 → 0.5.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 +26 -0
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/index.js +63 -9
- package/dist/utils.d.ts +11 -0
- package/dist/utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +73 -11
- package/src/utils.ts +21 -0
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,31 @@
|
|
1
1
|
# @gradio/client
|
2
2
|
|
3
|
+
## 0.5.0
|
4
|
+
|
5
|
+
### Highlights
|
6
|
+
|
7
|
+
#### new `FileExplorer` component ([#5672](https://github.com/gradio-app/gradio/pull/5672) [`e4a307ed6`](https://github.com/gradio-app/gradio/commit/e4a307ed6cde3bbdf4ff2f17655739addeec941e))
|
8
|
+
|
9
|
+
Thanks to a new capability that allows components to communicate directly with the server _without_ passing data via the value, we have created a new `FileExplorer` component.
|
10
|
+
|
11
|
+
This component allows you to populate the explorer by passing a glob, but only provides the selected file(s) in your prediction function.
|
12
|
+
|
13
|
+
Users can then navigate the virtual filesystem and select files which will be accessible in your predict function. This component will allow developers to build more complex spaces, with more flexible input options.
|
14
|
+
|
15
|
+

|
16
|
+
|
17
|
+
For more information check the [`FileExplorer` documentation](https://gradio.app/docs/fileexplorer).
|
18
|
+
|
19
|
+
Thanks [@aliabid94](https://github.com/aliabid94)!
|
20
|
+
|
21
|
+
### Features
|
22
|
+
|
23
|
+
- [#5787](https://github.com/gradio-app/gradio/pull/5787) [`caeee8bf7`](https://github.com/gradio-app/gradio/commit/caeee8bf7821fd5fe2f936ed82483bed00f613ec) - ensure the client does not depend on `window` when running in a node environment. Thanks [@gibiee](https://github.com/gibiee)!
|
24
|
+
|
25
|
+
### Fixes
|
26
|
+
|
27
|
+
- [#5776](https://github.com/gradio-app/gradio/pull/5776) [`c0fef4454`](https://github.com/gradio-app/gradio/commit/c0fef44541bfa61568bdcfcdfc7d7d79869ab1df) - Revert replica proxy logic and instead implement using the `root` variable. Thanks [@freddyaboulton](https://github.com/freddyaboulton)!
|
28
|
+
|
3
29
|
## 0.4.2
|
4
30
|
|
5
31
|
### Features
|
package/dist/client.d.ts
CHANGED
@@ -7,6 +7,7 @@ type client_return = {
|
|
7
7
|
predict: predict;
|
8
8
|
config: Config;
|
9
9
|
submit: (endpoint: string | number, data?: unknown[], event_data?: unknown) => SubmitReturn;
|
10
|
+
component_server: (component_id: number, fn_name: string, data: unknown[]) => any;
|
10
11
|
view_api: (c?: Config) => Promise<ApiInfo<JsApiData>>;
|
11
12
|
};
|
12
13
|
type SubmitReturn = {
|
package/dist/client.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAQN,cAAc,
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
@@ -4,6 +4,12 @@ function semiver(a, b, bool) {
|
|
4
4
|
b = b.split(".");
|
5
5
|
return fn(a[0], b[0]) || fn(a[1], b[1]) || (b[2] = b.slice(2).join("."), bool = /[.-]/.test(a[2] = a.slice(2).join(".")), bool == /[.-]/.test(b[2]) ? fn(a[2], b[2]) : bool ? -1 : 1);
|
6
6
|
}
|
7
|
+
function resolve_root(base_url, root_path, prioritize_base) {
|
8
|
+
if (root_path.startsWith("http://") || root_path.startsWith("https://")) {
|
9
|
+
return prioritize_base ? base_url : root_path;
|
10
|
+
}
|
11
|
+
return base_url + root_path;
|
12
|
+
}
|
7
13
|
function determine_protocol(endpoint) {
|
8
14
|
if (endpoint.startsWith("http")) {
|
9
15
|
const { protocol, host } = new URL(endpoint);
|
@@ -261,7 +267,8 @@ function api_factory(fetch_implementation, WebSocket_factory) {
|
|
261
267
|
const return_obj = {
|
262
268
|
predict,
|
263
269
|
submit,
|
264
|
-
view_api
|
270
|
+
view_api,
|
271
|
+
component_server
|
265
272
|
// duplicate
|
266
273
|
};
|
267
274
|
const transform_files = normalise_files ?? true;
|
@@ -408,11 +415,14 @@ function api_factory(fetch_implementation, WebSocket_factory) {
|
|
408
415
|
let payload;
|
409
416
|
let complete = false;
|
410
417
|
const listener_map = {};
|
411
|
-
|
412
|
-
|
413
|
-
|
418
|
+
let url_params = "";
|
419
|
+
if (typeof window !== "undefined") {
|
420
|
+
url_params = new URLSearchParams(
|
421
|
+
window.location.search
|
422
|
+
).toString();
|
423
|
+
}
|
414
424
|
handle_blob2(
|
415
|
-
`${http_protocol}//${host
|
425
|
+
`${http_protocol}//${resolve_root(host, config.path, true)}`,
|
416
426
|
data,
|
417
427
|
api_info,
|
418
428
|
hf_token
|
@@ -428,7 +438,7 @@ function api_factory(fetch_implementation, WebSocket_factory) {
|
|
428
438
|
time: /* @__PURE__ */ new Date()
|
429
439
|
});
|
430
440
|
post_data2(
|
431
|
-
`${http_protocol}//${host
|
441
|
+
`${http_protocol}//${resolve_root(host, config.path, true)}/run${_endpoint.startsWith("/") ? _endpoint : `/${_endpoint}`}${url_params ? "?" + url_params : ""}`,
|
432
442
|
{
|
433
443
|
...payload,
|
434
444
|
session_hash
|
@@ -489,7 +499,11 @@ function api_factory(fetch_implementation, WebSocket_factory) {
|
|
489
499
|
fn_index,
|
490
500
|
time: /* @__PURE__ */ new Date()
|
491
501
|
});
|
492
|
-
let url = new URL(`${ws_protocol}://${
|
502
|
+
let url = new URL(`${ws_protocol}://${resolve_root(
|
503
|
+
host,
|
504
|
+
config.path,
|
505
|
+
true
|
506
|
+
)}
|
493
507
|
/queue/join${url_params ? "?" + url_params : ""}`);
|
494
508
|
if (jwt) {
|
495
509
|
url.searchParams.set("__sign", jwt);
|
@@ -628,7 +642,11 @@ function api_factory(fetch_implementation, WebSocket_factory) {
|
|
628
642
|
}
|
629
643
|
try {
|
630
644
|
await fetch_implementation(
|
631
|
-
`${http_protocol}//${
|
645
|
+
`${http_protocol}//${resolve_root(
|
646
|
+
host,
|
647
|
+
config.path,
|
648
|
+
true
|
649
|
+
)}/reset`,
|
632
650
|
{
|
633
651
|
headers: { "Content-Type": "application/json" },
|
634
652
|
method: "POST",
|
@@ -655,6 +673,42 @@ function api_factory(fetch_implementation, WebSocket_factory) {
|
|
655
673
|
destroy
|
656
674
|
};
|
657
675
|
}
|
676
|
+
async function component_server(component_id, fn_name, data) {
|
677
|
+
var _a;
|
678
|
+
const headers = { "Content-Type": "application/json" };
|
679
|
+
if (hf_token) {
|
680
|
+
headers.Authorization = `Bearer ${hf_token}`;
|
681
|
+
}
|
682
|
+
let root_url;
|
683
|
+
let component = config.components.find(
|
684
|
+
(comp) => comp.id === component_id
|
685
|
+
);
|
686
|
+
if ((_a = component == null ? void 0 : component.props) == null ? void 0 : _a.root_url) {
|
687
|
+
root_url = component.props.root_url;
|
688
|
+
} else {
|
689
|
+
root_url = `${http_protocol}//${host + config.path}/`;
|
690
|
+
}
|
691
|
+
const response = await fetch_implementation(
|
692
|
+
`${root_url}component_server/`,
|
693
|
+
{
|
694
|
+
method: "POST",
|
695
|
+
body: JSON.stringify({
|
696
|
+
data,
|
697
|
+
component_id,
|
698
|
+
fn_name,
|
699
|
+
session_hash
|
700
|
+
}),
|
701
|
+
headers
|
702
|
+
}
|
703
|
+
);
|
704
|
+
if (!response.ok) {
|
705
|
+
throw new Error(
|
706
|
+
"Could not connect to component server: " + response.statusText
|
707
|
+
);
|
708
|
+
}
|
709
|
+
const output = await response.json();
|
710
|
+
return output;
|
711
|
+
}
|
658
712
|
async function view_api(config2) {
|
659
713
|
if (api)
|
660
714
|
return api;
|
@@ -946,7 +1000,7 @@ async function resolve_config(fetch_implementation, endpoint, token) {
|
|
946
1000
|
if (typeof window !== "undefined" && window.gradio_config && location.origin !== "http://localhost:9876" && !window.gradio_config.dev_mode) {
|
947
1001
|
const path = window.gradio_config.root;
|
948
1002
|
const config = window.gradio_config;
|
949
|
-
config.root = endpoint
|
1003
|
+
config.root = resolve_root(endpoint, config.root, false);
|
950
1004
|
return { ...config, path };
|
951
1005
|
} else if (endpoint) {
|
952
1006
|
let response = await fetch_implementation(`${endpoint}/config`, {
|
package/dist/utils.d.ts
CHANGED
@@ -1,4 +1,15 @@
|
|
1
1
|
import type { Config } from "./types.js";
|
2
|
+
/**
|
3
|
+
* This function is used to resolve the URL for making requests when the app has a root path.
|
4
|
+
* The root path could be a path suffix like "/app" which is appended to the end of the base URL. Or
|
5
|
+
* it could be a full URL like "https://abidlabs-test-client-replica--gqf2x.hf.space" which is used when hosting
|
6
|
+
* Gradio apps on Hugging Face Spaces.
|
7
|
+
* @param {string} base_url The base URL at which the Gradio server is hosted
|
8
|
+
* @param {string} root_path The root path, which could be a path suffix (e.g. mounted in FastAPI app) or a full URL (e.g. hosted on Hugging Face Spaces)
|
9
|
+
* @param {boolean} prioritize_base Whether to prioritize the base URL over the root path. This is used when both the base path and root paths are full URLs. For example, for fetching files the root path should be prioritized, but for making request, the base URL should be prioritized.
|
10
|
+
* @returns {string} the resolved URL
|
11
|
+
*/
|
12
|
+
export declare function resolve_root(base_url: string, root_path: string, prioritize_base: boolean): string;
|
2
13
|
export declare function determine_protocol(endpoint: string): {
|
3
14
|
ws_protocol: "ws" | "wss";
|
4
15
|
http_protocol: "http:" | "https:";
|
package/dist/utils.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACrD,WAAW,EAAE,IAAI,GAAG,KAAK,CAAC;IAC1B,aAAa,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACb,CAwBA;AAED,eAAO,MAAM,aAAa,QAAqB,CAAC;AAChD,eAAO,MAAM,eAAe,QAAwB,CAAC;AACrD,wBAAsB,gBAAgB,CACrC,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,MAAM,EAAE,GACpB,OAAO,CAAC;IACV,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,IAAI,GAAG,KAAK,CAAC;IAC1B,aAAa,EAAE,OAAO,GAAG,QAAQ,CAAC;CAClC,CAAC,CA4CD;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC,GACzB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxB;AAID,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAe5E;AAED,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAqB1C;AAED,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,EAC7C,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAuB1C;AAED,wBAAsB,iBAAiB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED,eAAO,MAAM,cAAc,0GAQjB,CAAC"}
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,OAAO,GACtB,MAAM,CAKR;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACrD,WAAW,EAAE,IAAI,GAAG,KAAK,CAAC;IAC1B,aAAa,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACb,CAwBA;AAED,eAAO,MAAM,aAAa,QAAqB,CAAC;AAChD,eAAO,MAAM,eAAe,QAAwB,CAAC;AACrD,wBAAsB,gBAAgB,CACrC,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,MAAM,EAAE,GACpB,OAAO,CAAC;IACV,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,IAAI,GAAG,KAAK,CAAC;IAC1B,aAAa,EAAE,OAAO,GAAG,QAAQ,CAAC;CAClC,CAAC,CA4CD;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC,GACzB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxB;AAID,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAe5E;AAED,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAqB1C;AAED,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,EAC7C,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAuB1C;AAED,wBAAsB,iBAAiB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED,eAAO,MAAM,cAAc,0GAQjB,CAAC"}
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
@@ -8,7 +8,8 @@ import {
|
|
8
8
|
get_space_hardware,
|
9
9
|
set_space_hardware,
|
10
10
|
set_space_timeout,
|
11
|
-
hardware_types
|
11
|
+
hardware_types,
|
12
|
+
resolve_root
|
12
13
|
} from "./utils.js";
|
13
14
|
|
14
15
|
import type {
|
@@ -45,6 +46,11 @@ type client_return = {
|
|
45
46
|
data?: unknown[],
|
46
47
|
event_data?: unknown
|
47
48
|
) => SubmitReturn;
|
49
|
+
component_server: (
|
50
|
+
component_id: number,
|
51
|
+
fn_name: string,
|
52
|
+
data: unknown[]
|
53
|
+
) => any;
|
48
54
|
view_api: (c?: Config) => Promise<ApiInfo<JsApiData>>;
|
49
55
|
};
|
50
56
|
|
@@ -243,7 +249,8 @@ export function api_factory(
|
|
243
249
|
const return_obj = {
|
244
250
|
predict,
|
245
251
|
submit,
|
246
|
-
view_api
|
252
|
+
view_api,
|
253
|
+
component_server
|
247
254
|
// duplicate
|
248
255
|
};
|
249
256
|
|
@@ -422,12 +429,15 @@ export function api_factory(
|
|
422
429
|
let payload: Payload;
|
423
430
|
let complete: false | Record<string, any> = false;
|
424
431
|
const listener_map: ListenerMap<EventType> = {};
|
425
|
-
|
426
|
-
|
427
|
-
|
432
|
+
let url_params = ""
|
433
|
+
if (typeof(window) !== "undefined") {
|
434
|
+
url_params = new URLSearchParams(
|
435
|
+
window.location.search
|
436
|
+
).toString();
|
437
|
+
}
|
428
438
|
|
429
439
|
handle_blob(
|
430
|
-
`${http_protocol}//${host
|
440
|
+
`${http_protocol}//${resolve_root(host, config.path, true)}`,
|
431
441
|
data,
|
432
442
|
api_info,
|
433
443
|
hf_token
|
@@ -444,7 +454,7 @@ export function api_factory(
|
|
444
454
|
});
|
445
455
|
|
446
456
|
post_data(
|
447
|
-
`${http_protocol}//${host
|
457
|
+
`${http_protocol}//${resolve_root(host, config.path, true)}/run${
|
448
458
|
_endpoint.startsWith("/") ? _endpoint : `/${_endpoint}`
|
449
459
|
}${url_params ? "?" + url_params : ""}`,
|
450
460
|
{
|
@@ -512,8 +522,11 @@ export function api_factory(
|
|
512
522
|
fn_index,
|
513
523
|
time: new Date()
|
514
524
|
});
|
515
|
-
|
516
|
-
|
525
|
+
let url = new URL(`${ws_protocol}://${resolve_root(
|
526
|
+
host,
|
527
|
+
config.path,
|
528
|
+
true
|
529
|
+
)}
|
517
530
|
/queue/join${url_params ? "?" + url_params : ""}`);
|
518
531
|
|
519
532
|
if (jwt) {
|
@@ -677,7 +690,11 @@ export function api_factory(
|
|
677
690
|
|
678
691
|
try {
|
679
692
|
await fetch_implementation(
|
680
|
-
`${http_protocol}//${
|
693
|
+
`${http_protocol}//${resolve_root(
|
694
|
+
host,
|
695
|
+
config.path,
|
696
|
+
true
|
697
|
+
)}/reset`,
|
681
698
|
{
|
682
699
|
headers: { "Content-Type": "application/json" },
|
683
700
|
method: "POST",
|
@@ -707,6 +724,51 @@ export function api_factory(
|
|
707
724
|
};
|
708
725
|
}
|
709
726
|
|
727
|
+
async function component_server(
|
728
|
+
component_id: number,
|
729
|
+
fn_name: string,
|
730
|
+
data: unknown[]
|
731
|
+
): Promise<any> {
|
732
|
+
const headers: {
|
733
|
+
Authorization?: string;
|
734
|
+
"Content-Type": "application/json";
|
735
|
+
} = { "Content-Type": "application/json" };
|
736
|
+
if (hf_token) {
|
737
|
+
headers.Authorization = `Bearer ${hf_token}`;
|
738
|
+
}
|
739
|
+
let root_url: string;
|
740
|
+
let component = config.components.find(
|
741
|
+
(comp) => comp.id === component_id
|
742
|
+
);
|
743
|
+
if (component?.props?.root_url) {
|
744
|
+
root_url = component.props.root_url;
|
745
|
+
} else {
|
746
|
+
root_url = `${http_protocol}//${host + config.path}/`;
|
747
|
+
}
|
748
|
+
const response = await fetch_implementation(
|
749
|
+
`${root_url}component_server/`,
|
750
|
+
{
|
751
|
+
method: "POST",
|
752
|
+
body: JSON.stringify({
|
753
|
+
data: data,
|
754
|
+
component_id: component_id,
|
755
|
+
fn_name: fn_name,
|
756
|
+
session_hash: session_hash
|
757
|
+
}),
|
758
|
+
headers
|
759
|
+
}
|
760
|
+
);
|
761
|
+
|
762
|
+
if (!response.ok) {
|
763
|
+
throw new Error(
|
764
|
+
"Could not connect to component server: " + response.statusText
|
765
|
+
);
|
766
|
+
}
|
767
|
+
|
768
|
+
const output = await response.json();
|
769
|
+
return output;
|
770
|
+
}
|
771
|
+
|
710
772
|
async function view_api(config?: Config): Promise<ApiInfo<JsApiData>> {
|
711
773
|
if (api) return api;
|
712
774
|
|
@@ -1152,7 +1214,7 @@ async function resolve_config(
|
|
1152
1214
|
) {
|
1153
1215
|
const path = window.gradio_config.root;
|
1154
1216
|
const config = window.gradio_config;
|
1155
|
-
config.root = endpoint
|
1217
|
+
config.root = resolve_root(endpoint, config.root, false);
|
1156
1218
|
return { ...config, path: path };
|
1157
1219
|
} else if (endpoint) {
|
1158
1220
|
let response = await fetch_implementation(`${endpoint}/config`, {
|
package/src/utils.ts
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
import type { Config } from "./types.js";
|
2
2
|
|
3
|
+
/**
|
4
|
+
* This function is used to resolve the URL for making requests when the app has a root path.
|
5
|
+
* The root path could be a path suffix like "/app" which is appended to the end of the base URL. Or
|
6
|
+
* it could be a full URL like "https://abidlabs-test-client-replica--gqf2x.hf.space" which is used when hosting
|
7
|
+
* Gradio apps on Hugging Face Spaces.
|
8
|
+
* @param {string} base_url The base URL at which the Gradio server is hosted
|
9
|
+
* @param {string} root_path The root path, which could be a path suffix (e.g. mounted in FastAPI app) or a full URL (e.g. hosted on Hugging Face Spaces)
|
10
|
+
* @param {boolean} prioritize_base Whether to prioritize the base URL over the root path. This is used when both the base path and root paths are full URLs. For example, for fetching files the root path should be prioritized, but for making request, the base URL should be prioritized.
|
11
|
+
* @returns {string} the resolved URL
|
12
|
+
*/
|
13
|
+
export function resolve_root(
|
14
|
+
base_url: string,
|
15
|
+
root_path: string,
|
16
|
+
prioritize_base: boolean
|
17
|
+
): string {
|
18
|
+
if (root_path.startsWith("http://") || root_path.startsWith("https://")) {
|
19
|
+
return prioritize_base ? base_url : root_path;
|
20
|
+
}
|
21
|
+
return base_url + root_path;
|
22
|
+
}
|
23
|
+
|
3
24
|
export function determine_protocol(endpoint: string): {
|
4
25
|
ws_protocol: "ws" | "wss";
|
5
26
|
http_protocol: "http:" | "https:";
|