@gradio/core 0.0.4 → 0.1.0-beta.2

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
@@ -1,5 +1,81 @@
1
1
  # @gradio/core
2
2
 
3
+ ## 0.1.0-beta.2
4
+
5
+ ### Features
6
+
7
+ - [#9323](https://github.com/gradio-app/gradio/pull/9323) [`06babda`](https://github.com/gradio-app/gradio/commit/06babda0395fd3fbd323c1c3cb33704ecfd6deb0) - Disable liking user message in chatbot by default but make it configurable. Thanks @freddyaboulton!
8
+ - [#9339](https://github.com/gradio-app/gradio/pull/9339) [`4c8c6f2`](https://github.com/gradio-app/gradio/commit/4c8c6f2fe603081941c5fdc43f48a0632b9f31ad) - Ssr part 2. Thanks @pngwn!
9
+ - [#9269](https://github.com/gradio-app/gradio/pull/9269) [`e05f568`](https://github.com/gradio-app/gradio/commit/e05f568f47e9fa33ef91dbbe5cc477d32762bc36) - Fix reload mode and streaming in 5.0 dev. Thanks @freddyaboulton!
10
+ - [#9253](https://github.com/gradio-app/gradio/pull/9253) [`99648ec`](https://github.com/gradio-app/gradio/commit/99648ec7c4443e74799941e47b0015ac9ca581e1) - Adds ability to block event trigger when file is uploading. Thanks @dawoodkhan82!
11
+ - [#9335](https://github.com/gradio-app/gradio/pull/9335) [`b543465`](https://github.com/gradio-app/gradio/commit/b543465d06d7d1b399c4d0755da05e022611a97f) - Remove lite/theme.css from the Git-managed file tree. Thanks @whitphx!
12
+
13
+ ### Fixes
14
+
15
+ - [#9299](https://github.com/gradio-app/gradio/pull/9299) [`aa35b07`](https://github.com/gradio-app/gradio/commit/aa35b0788e613fdd45446d267513e6f94fa208ea) - Trigger state change event on iterators. Thanks @freddyaboulton!
16
+
17
+ ### Dependency updates
18
+
19
+ - @gradio/atoms@0.9.0-beta.2
20
+ - @gradio/gallery@0.13.0-beta.2
21
+ - @gradio/upload@0.13.0-beta.2
22
+ - @gradio/wasm@0.14.0-beta.2
23
+ - @gradio/markdown@0.10.0-beta.2
24
+ - @gradio/client@1.6.0-beta.2
25
+ - @gradio/icons@0.8.0-beta.2
26
+ - @gradio/statustracker@0.8.0-beta.2
27
+ - @gradio/utils@0.7.0-beta.2
28
+ - @gradio/plot@0.6.5-beta.2
29
+ - @gradio/button@0.3.0-beta.2
30
+ - @gradio/file@0.10.0-beta.2
31
+ - @gradio/image@0.16.0-beta.2
32
+ - @gradio/video@0.11.0-beta.2
33
+ - @gradio/code@0.10.0-beta.2
34
+ - @gradio/paramviewer@0.4.22-beta.2
35
+ - @gradio/checkbox@0.4.0-beta.2
36
+ - @gradio/column@0.2.0-beta.0
37
+ - @gradio/textbox@0.7.0-beta.2
38
+ - @gradio/tabs@0.3.0-beta.2
39
+
40
+ ## 0.1.0-beta.1
41
+
42
+ ### Features
43
+
44
+ - [#9200](https://github.com/gradio-app/gradio/pull/9200) [`2e179d3`](https://github.com/gradio-app/gradio/commit/2e179d35be6ed60a5a6bfc7303178d63e41781ad) - prefix api routes. Thanks @pngwn!
45
+
46
+ ### Dependency updates
47
+
48
+ - @gradio/video@0.11.0-beta.1
49
+ - @gradio/atoms@0.8.1-beta.1
50
+ - @gradio/icons@0.8.0-beta.1
51
+ - @gradio/statustracker@0.8.0-beta.1
52
+ - @gradio/utils@0.7.0-beta.1
53
+ - @gradio/client@1.6.0-beta.1
54
+ - @gradio/image@0.16.0-beta.1
55
+ - @gradio/upload@0.12.4-beta.1
56
+ - @gradio/markdown@0.9.4-beta.1
57
+ - @gradio/wasm@0.13.1-beta.1
58
+ - @gradio/theme@0.3.0-beta.1
59
+ - @gradio/gallery@0.13.0-beta.1
60
+ - @gradio/plot@0.6.5-beta.1
61
+ - @gradio/tabs@0.3.0-beta.1
62
+ - @gradio/column@0.2.0-beta.0
63
+ - @gradio/button@0.3.0-beta.1
64
+ - @gradio/textbox@0.7.0-beta.1
65
+ - @gradio/code@0.9.1-beta.1
66
+ - @gradio/paramviewer@0.4.22-beta.1
67
+ - @gradio/file@0.9.4-beta.1
68
+ - @gradio/checkbox@0.4.0-beta.1
69
+
70
+ ## 0.1.0-beta.0
71
+
72
+ ### Features
73
+
74
+ - [#9149](https://github.com/gradio-app/gradio/pull/9149) [`3d7a9b8`](https://github.com/gradio-app/gradio/commit/3d7a9b81f6fef06187eca832471dc1692eb493a0) - Open audio/image input stream only when queue is ready. Thanks @freddyaboulton!
75
+ - [#9173](https://github.com/gradio-app/gradio/pull/9173) [`66349fe`](https://github.com/gradio-app/gradio/commit/66349fe26827e3a3c15b738a1177e95fec7f5554) - Streaming Guides. Thanks @freddyaboulton!
76
+ - [#9052](https://github.com/gradio-app/gradio/pull/9052) [`f3652eb`](https://github.com/gradio-app/gradio/commit/f3652ebe08211e12739df73c15fd97e5ff81276a) - Video gallery. Thanks @dawoodkhan82!
77
+ - [#8941](https://github.com/gradio-app/gradio/pull/8941) [`97a7bf6`](https://github.com/gradio-app/gradio/commit/97a7bf66a79179d1b91a3199d68e5c11216ca500) - Streaming inputs for 5.0. Thanks @freddyaboulton!
78
+
3
79
  ## 0.0.4
4
80
 
5
81
  ### Fixes
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { default as Embed } from "./src/Embed.svelte";
2
2
  export { prefix_css, mount_css } from "./src/css";
3
+ export { create_components } from "./src/init";
3
4
  export * from "./src/i18n";
4
5
  export * from "./src/types";
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { default as Embed } from "./src/Embed.svelte";
2
2
  export { prefix_css, mount_css } from "./src/css";
3
+ export { create_components } from "./src/init";
3
4
  export * from "./src/i18n";
4
5
  export * from "./src/types";
@@ -1,4 +1,4 @@
1
- <script>import { tick } from "svelte";
1
+ <script>import { tick, onMount } from "svelte";
2
2
  import { _ } from "svelte-i18n";
3
3
  import { Client } from "@gradio/client";
4
4
  import { setupi18n } from "./i18n";
@@ -28,43 +28,53 @@ export let js;
28
28
  export let fill_height = false;
29
29
  export let ready;
30
30
  export let username;
31
- const {
31
+ export let api_prefix;
32
+ export let max_file_size;
33
+ export let initial_layout = void 0;
34
+ let {
32
35
  layout: _layout,
33
36
  targets,
34
37
  update_value,
35
38
  get_data,
39
+ modify_stream,
40
+ get_stream_state,
41
+ set_time_limit,
36
42
  loading_status,
37
43
  scheduled_updates,
38
44
  create_layout,
39
45
  rerender_layout
40
46
  } = create_components();
47
+ $_layout = initial_layout;
41
48
  $:
42
- create_layout({
49
+ components, layout, dependencies, root, app, fill_height, target, run();
50
+ $: {
51
+ ready = !!$_layout;
52
+ }
53
+ async function run() {
54
+ await create_layout({
43
55
  components,
44
56
  layout,
45
57
  dependencies,
46
- root,
58
+ root: root + api_prefix,
47
59
  app,
48
60
  options: {
49
61
  fill_height
50
62
  }
51
63
  });
52
- $: {
53
- ready = !!$_layout;
54
64
  }
55
- let params = new URLSearchParams(window.location.search);
56
- let api_docs_visible = params.get("view") === "api" && show_api;
57
- let api_recorder_visible = params.get("view") === "api-recorder" && show_api;
65
+ export let search_params;
66
+ let api_docs_visible = search_params.get("view") === "api" && show_api;
67
+ let api_recorder_visible = search_params.get("view") === "api-recorder" && show_api;
58
68
  function set_api_docs_visible(visible) {
59
69
  api_recorder_visible = false;
60
70
  api_docs_visible = visible;
61
- let params2 = new URLSearchParams(window.location.search);
71
+ let params = new URLSearchParams(window.location.search);
62
72
  if (visible) {
63
- params2.set("view", "api");
73
+ params.set("view", "api");
64
74
  } else {
65
- params2.delete("view");
75
+ params.delete("view");
66
76
  }
67
- history.replaceState(null, "", "?" + params2.toString());
77
+ history.replaceState(null, "", "?" + params.toString());
68
78
  }
69
79
  let api_calls = [];
70
80
  export let render_complete = false;
@@ -121,22 +131,17 @@ export function add_new_message(message, type) {
121
131
  }
122
132
  let _error_id = -1;
123
133
  let user_left_page = false;
124
- document.addEventListener("visibilitychange", function() {
125
- if (document.visibilityState === "hidden") {
126
- user_left_page = true;
127
- }
128
- });
129
134
  const MESSAGE_QUOTE_RE = /^'([^]+)'$/;
130
135
  const DUPLICATE_MESSAGE = $_("blocks.long_requests_queue");
131
136
  const MOBILE_QUEUE_WARNING = $_("blocks.connection_can_break");
132
137
  const MOBILE_RECONNECT_MESSAGE = $_("blocks.lost_connection");
138
+ const WAITING_FOR_INPUTS_MESSAGE = $_("blocks.waiting_for_inputs");
133
139
  const SHOW_DUPLICATE_MESSAGE_ON_ETA = 15;
134
140
  const SHOW_MOBILE_QUEUE_WARNING_ON_ETA = 10;
135
- const is_mobile_device = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
136
- navigator.userAgent
137
- );
141
+ let is_mobile_device = false;
138
142
  let showed_duplicate_message = false;
139
143
  let showed_mobile_warning = false;
144
+ let inputs_waiting = [];
140
145
  function wait_then_trigger_api_call(dep_index, trigger_id = null, event_data = null) {
141
146
  let _unsub = () => {
142
147
  };
@@ -154,8 +159,22 @@ function wait_then_trigger_api_call(dep_index, trigger_id = null, event_data = n
154
159
  trigger_api_call(dep_index, trigger_id, event_data);
155
160
  }
156
161
  }
162
+ async function get_component_value_or_event_data(component_id, trigger_id, event_data) {
163
+ if (component_id === trigger_id && event_data && event_data.is_value_data === true) {
164
+ return event_data.value;
165
+ }
166
+ return get_data(component_id);
167
+ }
157
168
  async function trigger_api_call(dep_index, trigger_id = null, event_data = null) {
158
169
  let dep = dependencies.find((dep2) => dep2.id === dep_index);
170
+ if (inputs_waiting.length > 0) {
171
+ for (const input of inputs_waiting) {
172
+ if (dep.inputs.includes(input)) {
173
+ add_new_message(WAITING_FOR_INPUTS_MESSAGE, "warning");
174
+ return;
175
+ }
176
+ }
177
+ }
159
178
  const current_status = loading_status.get_status_for_fn(dep_index);
160
179
  messages = messages.filter(({ fn_index }) => fn_index !== dep_index);
161
180
  if (current_status === "pending" || current_status === "generating") {
@@ -163,7 +182,11 @@ async function trigger_api_call(dep_index, trigger_id = null, event_data = null)
163
182
  }
164
183
  let payload = {
165
184
  fn_index: dep_index,
166
- data: await Promise.all(dep.inputs.map((id) => get_data(id))),
185
+ data: await Promise.all(
186
+ dep.inputs.map(
187
+ (id) => get_component_value_or_event_data(id, trigger_id, event_data)
188
+ )
189
+ ),
167
190
  event_data: dep.collects_event_data ? event_data : null,
168
191
  trigger_id
169
192
  };
@@ -196,22 +219,39 @@ async function trigger_api_call(dep_index, trigger_id = null, event_data = null)
196
219
  function trigger_prediction(dep2, payload2) {
197
220
  if (dep2.trigger_mode === "once") {
198
221
  if (!dep2.pending_request)
199
- make_prediction(payload2);
222
+ make_prediction(payload2, dep2.connection == "stream");
200
223
  } else if (dep2.trigger_mode === "multiple") {
201
- make_prediction(payload2);
224
+ make_prediction(payload2, dep2.connection == "stream");
202
225
  } else if (dep2.trigger_mode === "always_last") {
203
226
  if (!dep2.pending_request) {
204
- make_prediction(payload2);
227
+ make_prediction(payload2, dep2.connection == "stream");
205
228
  } else {
206
229
  dep2.final_event = payload2;
207
230
  }
208
231
  }
209
232
  }
210
- async function make_prediction(payload2) {
233
+ $:
234
+ console.log({ app });
235
+ async function make_prediction(payload2, streaming = false) {
211
236
  if (api_recorder_visible) {
212
237
  api_calls = [...api_calls, JSON.parse(JSON.stringify(payload2))];
213
238
  }
214
239
  let submission;
240
+ app.set_current_payload(payload2);
241
+ if (streaming) {
242
+ if (!submit_map.has(dep_index)) {
243
+ dep.inputs.forEach((id) => modify_stream(id, "waiting"));
244
+ } else if (submit_map.has(dep_index) && dep.inputs.some((id) => get_stream_state(id) === "waiting")) {
245
+ return;
246
+ } else if (submit_map.has(dep_index) && dep.inputs.some((id) => get_stream_state(id) === "open")) {
247
+ await app.post_data(
248
+ // @ts-ignore
249
+ `${app.config.root + app.config.api_prefix}/stream/${submit_map.get(dep_index).event_id()}`,
250
+ { ...payload2, session_hash: app.session_hash }
251
+ );
252
+ return;
253
+ }
254
+ }
215
255
  try {
216
256
  submission = app.submit(
217
257
  payload2.fn_index,
@@ -248,7 +288,7 @@ async function trigger_api_call(dep_index, trigger_id = null, event_data = null)
248
288
  const { data, fn_index } = message;
249
289
  if (dep.pending_request && dep.final_event) {
250
290
  dep.pending_request = false;
251
- make_prediction(dep.final_event);
291
+ make_prediction(dep.final_event, dep.connection == "stream");
252
292
  }
253
293
  dep.pending_request = false;
254
294
  handle_update(data, fn_index);
@@ -287,10 +327,24 @@ async function trigger_api_call(dep_index, trigger_id = null, event_data = null)
287
327
  ...messages
288
328
  ];
289
329
  }
330
+ function open_stream_events(status, id, dep2) {
331
+ if (status.original_msg === "process_starts" && dep2.connection === "stream") {
332
+ modify_stream(id, "open");
333
+ }
334
+ }
290
335
  function handle_status_update(message) {
291
336
  const { fn_index, ...status } = message;
337
+ if (status.stage === "streaming" && status.time_limit) {
338
+ dep.inputs.forEach((id) => {
339
+ set_time_limit(id, status.time_limit);
340
+ });
341
+ }
342
+ dep.inputs.forEach((id) => {
343
+ open_stream_events(message, id, dep);
344
+ });
292
345
  loading_status.update({
293
346
  ...status,
347
+ time_limit: status.time_limit,
294
348
  status: status.stage,
295
349
  progress: status.progress_data,
296
350
  fn_index
@@ -310,17 +364,23 @@ async function trigger_api_call(dep_index, trigger_id = null, event_data = null)
310
364
  ...messages
311
365
  ];
312
366
  }
313
- if (status.stage === "complete") {
367
+ if (status.stage === "complete" || status.stage === "generating") {
314
368
  status.changed_state_ids?.forEach((id) => {
315
369
  dependencies.filter((dep2) => dep2.targets.some(([_id, _2]) => _id === id)).forEach((dep2) => {
316
370
  wait_then_trigger_api_call(dep2.id, payload2.trigger_id);
317
371
  });
318
372
  });
373
+ }
374
+ if (status.stage === "complete") {
319
375
  dependencies.forEach(async (dep2) => {
320
376
  if (dep2.trigger_after === fn_index) {
321
377
  wait_then_trigger_api_call(dep2.id, payload2.trigger_id);
322
378
  }
323
379
  });
380
+ dep.inputs.forEach((id) => {
381
+ modify_stream(id, "closed");
382
+ });
383
+ submit_map.delete(dep_index);
324
384
  }
325
385
  if (status.broken && is_mobile_device && user_left_page) {
326
386
  window.setTimeout(() => {
@@ -396,13 +456,19 @@ async function handle_mount() {
396
456
  wait_then_trigger_api_call(dep.id);
397
457
  }
398
458
  });
399
- if (render_complete)
459
+ if (!target || render_complete)
400
460
  return;
401
461
  target.addEventListener("prop_change", (e) => {
402
462
  if (!isCustomEvent(e))
403
463
  throw new Error("not a custom event");
404
464
  const { id, prop, value } = e.detail;
405
465
  update_value([{ id, prop, value }]);
466
+ if (prop === "input_ready" && value === false) {
467
+ inputs_waiting.push(id);
468
+ }
469
+ if (prop === "input_ready" && value === true) {
470
+ inputs_waiting = inputs_waiting.filter((item) => item !== id);
471
+ }
406
472
  });
407
473
  target.addEventListener("gradio", (e) => {
408
474
  if (!isCustomEvent(e))
@@ -415,6 +481,17 @@ async function handle_mount() {
415
481
  messages = [new_message(data, -1, event), ...messages];
416
482
  } else if (event == "clear_status") {
417
483
  update_status(id, "complete", data);
484
+ } else if (event == "close_stream") {
485
+ const deps = $targets[id]?.[data];
486
+ deps?.forEach((dep_id) => {
487
+ if (submit_map.has(dep_id)) {
488
+ app.post_data(
489
+ // @ts-ignore
490
+ `${app.config.root + app.config.api_prefix}/stream/${submit_map.get(dep_id).event_id()}/close`,
491
+ {}
492
+ );
493
+ }
494
+ });
418
495
  } else {
419
496
  const deps = $targets[id]?.[event];
420
497
  deps?.forEach((dep_id) => {
@@ -470,6 +547,16 @@ function set_status(statuses) {
470
547
  function isCustomEvent(event) {
471
548
  return "detail" in event;
472
549
  }
550
+ onMount(() => {
551
+ document.addEventListener("visibilitychange", function() {
552
+ if (document.visibilityState === "hidden") {
553
+ user_left_page = true;
554
+ }
555
+ });
556
+ is_mobile_device = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
557
+ navigator.userAgent
558
+ );
559
+ });
473
560
  </script>
474
561
 
475
562
  <svelte:head>
@@ -480,19 +567,19 @@ function isCustomEvent(event) {
480
567
 
481
568
  <div class="wrap" style:min-height={app_mode ? "100%" : "auto"}>
482
569
  <div class="contain" style:flex-grow={app_mode ? "1" : "auto"}>
483
- {#if $_layout && app.config}
484
- <MountComponents
485
- rootNode={$_layout}
486
- {root}
487
- {target}
488
- {theme_mode}
489
- on:mount={handle_mount}
490
- {version}
491
- {autoscroll}
492
- max_file_size={app.config.max_file_size}
493
- client={app}
494
- />
495
- {/if}
570
+ <!-- {#if $_layout} -->
571
+ <MountComponents
572
+ rootNode={$_layout}
573
+ {root}
574
+ {target}
575
+ {theme_mode}
576
+ on:mount={handle_mount}
577
+ {version}
578
+ {autoscroll}
579
+ {max_file_size}
580
+ client={app}
581
+ />
582
+ <!-- {/if} -->
496
583
  </div>
497
584
 
498
585
  {#if show_footer}
@@ -24,6 +24,10 @@ declare const __propDef: {
24
24
  fill_height?: boolean | undefined;
25
25
  ready: boolean;
26
26
  username: string | null;
27
+ api_prefix: string;
28
+ max_file_size: number;
29
+ initial_layout?: LayoutNode | undefined;
30
+ search_params: URLSearchParams;
27
31
  render_complete?: boolean | undefined;
28
32
  add_new_message?: ((message: string, type: ToastMessage["type"]) => void) | undefined;
29
33
  };
@@ -14,13 +14,15 @@ onMount(() => {
14
14
  });
15
15
  </script>
16
16
 
17
- <Render
18
- node={rootNode}
19
- {root}
20
- {target}
21
- {theme_mode}
22
- {version}
23
- {autoscroll}
24
- {max_file_size}
25
- {client}
26
- />
17
+ {#if rootNode}
18
+ <Render
19
+ node={rootNode}
20
+ {root}
21
+ {target}
22
+ {theme_mode}
23
+ {version}
24
+ {autoscroll}
25
+ {max_file_size}
26
+ {client}
27
+ />
28
+ {/if}
@@ -25,17 +25,20 @@ onMount(() => {
25
25
  }
26
26
  };
27
27
  });
28
- $:
29
- node.children = node.children && node.children.filter((v) => {
30
- const valid_node = node.type !== "statustracker";
31
- if (!valid_node) {
32
- filtered_children.push(v);
33
- }
34
- return valid_node;
35
- });
28
+ $: {
29
+ if (node) {
30
+ node.children = node.children && node.children.filter((v) => {
31
+ const valid_node = node.type !== "statustracker";
32
+ if (!valid_node) {
33
+ filtered_children.push(v);
34
+ }
35
+ return valid_node;
36
+ });
37
+ }
38
+ }
36
39
  setContext("BLOCK_KEY", parent);
37
40
  $: {
38
- if (node.type === "form") {
41
+ if (node && node.type === "form") {
39
42
  if (node.children?.every((c) => !c.props.visible)) {
40
43
  node.props.visible = false;
41
44
  } else {
@@ -44,7 +47,7 @@ $: {
44
47
  }
45
48
  }
46
49
  $:
47
- gradio_class = new Gradio(
50
+ node.props.gradio = new Gradio(
48
51
  node.id,
49
52
  target,
50
53
  theme_mode,
@@ -59,7 +62,7 @@ $:
59
62
  </script>
60
63
 
61
64
  <RenderComponent
62
- _id={node.id}
65
+ _id={node?.id}
63
66
  component={node.component}
64
67
  bind:instance={node.instance}
65
68
  bind:value={node.props.value}
@@ -70,7 +73,6 @@ $:
70
73
  {...node.props}
71
74
  {theme_mode}
72
75
  {root}
73
- gradio={gradio_class}
74
76
  >
75
77
  {#if node.children && node.children.length}
76
78
  {#each node.children as _node (_node.id)}
@@ -7,7 +7,6 @@ export let target;
7
7
  export let theme_mode;
8
8
  export let instance;
9
9
  export let value;
10
- export let gradio;
11
10
  export let elem_id;
12
11
  export let elem_classes;
13
12
  export let _id;
@@ -19,6 +18,8 @@ function wrap(component2) {
19
18
  const props = Object.keys(instance2.$$.props);
20
19
  function report(props2) {
21
20
  return function(propargs) {
21
+ if (!target)
22
+ return;
22
23
  const ev = s(_id, props2, propargs);
23
24
  target.dispatchEvent(ev);
24
25
  };
@@ -45,7 +46,6 @@ const _component = wrap(component);
45
46
  {...$$restProps}
46
47
  {theme_mode}
47
48
  {root}
48
- {gradio}
49
49
  >
50
50
  <slot />
51
51
  </svelte:component>
@@ -1,5 +1,4 @@
1
1
  import { SvelteComponent } from "svelte";
2
- import type { Gradio } from "./gradio_helper";
3
2
  import type { ComponentMeta, ThemeMode } from "./types";
4
3
  declare const __propDef: {
5
4
  props: {
@@ -10,7 +9,6 @@ declare const __propDef: {
10
9
  theme_mode: ThemeMode;
11
10
  instance: ComponentMeta["instance"];
12
11
  value: any;
13
- gradio: Gradio;
14
12
  elem_id: string;
15
13
  elem_classes: string[];
16
14
  _id: number;
@@ -38,7 +38,9 @@ const langs = [
38
38
  ];
39
39
  let is_running = false;
40
40
  async function get_info() {
41
- let response = await fetch(root + "info");
41
+ let response = await fetch(
42
+ root.replace(/\/$/, "") + app.api_prefix + "/info"
43
+ );
42
44
  let data = await response.json();
43
45
  return data;
44
46
  }
@@ -205,6 +207,7 @@ onMount(() => {
205
207
  {root}
206
208
  {space_id}
207
209
  {username}
210
+ api_prefix={app.api_prefix}
208
211
  />
209
212
 
210
213
  <ParametersSnippet
@@ -5,6 +5,7 @@ import EndpointDetail from "./EndpointDetail.svelte";
5
5
  export let dependency;
6
6
  export let dependency_index;
7
7
  export let root;
8
+ export let api_prefix;
8
9
  export let space_id;
9
10
  export let endpoint_parameters;
10
11
  export let named;
@@ -21,6 +22,10 @@ let blob_components = ["Audio", "File", "Image", "Video"];
21
22
  let blob_examples = endpoint_parameters.filter(
22
23
  (param) => blob_components.includes(param.component)
23
24
  );
25
+ $:
26
+ normalised_api_prefix = api_prefix ? api_prefix : "/";
27
+ $:
28
+ normalised_root = root.replace(/\/$/, "");
24
29
  </script>
25
30
 
26
31
  <div class="container">
@@ -121,7 +126,7 @@ console.log(result.data);
121
126
  </div>
122
127
 
123
128
  <div bind:this={bash_post_code}>
124
- <pre>curl -X POST {root}call/{dependency.api_name} -s -H "Content-Type: application/json" -d '{"{"}
129
+ <pre>curl -X POST {normalised_root}{normalised_api_prefix}/call/{dependency.api_name} -s -H "Content-Type: application/json" -d '{"{"}
125
130
  "data": [{#each endpoint_parameters as { label, parameter_name, type, python_type, component, example_input, serializer }, i}
126
131
  <!--
127
132
  -->{represent_value(
@@ -133,7 +138,7 @@ console.log(result.data);
133
138
  {/each}
134
139
  ]{"}"}' \
135
140
  | awk -F'"' '{"{"} print $4{"}"}' \
136
- | read EVENT_ID; curl -N {root}call/{dependency.api_name}/$EVENT_ID</pre>
141
+ | read EVENT_ID; curl -N {normalised_root}{normalised_api_prefix}/call/{dependency.api_name}/$EVENT_ID</pre>
137
142
  </div>
138
143
  </code>
139
144
  </Block>
@@ -5,6 +5,7 @@ declare const __propDef: {
5
5
  dependency: Dependency;
6
6
  dependency_index: number;
7
7
  root: string;
8
+ api_prefix: string;
8
9
  space_id: string | null;
9
10
  endpoint_parameters: any;
10
11
  named: boolean;
package/dist/src/css.js CHANGED
@@ -1,5 +1,6 @@
1
1
  let supports_adopted_stylesheets = false;
2
- if ("attachShadow" in Element.prototype &&
2
+ if (typeof window !== "undefined" &&
3
+ "attachShadow" in Element.prototype &&
3
4
  "adoptedStyleSheets" in Document.prototype) {
4
5
  // Both Shadow DOM and adoptedStyleSheets are supported
5
6
  const shadow_root_test = document
@@ -16,6 +16,9 @@ export declare function create_components(): {
16
16
  targets: Writable<TargetMap>;
17
17
  update_value: (updates: UpdateTransaction[]) => void;
18
18
  get_data: (id: number) => any | Promise<any>;
19
+ modify_stream: (id: number, state: "open" | "waiting" | "closed") => void;
20
+ get_stream_state: (id: number) => "open" | "waiting" | "closed" | "not_set";
21
+ set_time_limit: (id: number, time_limit: number | undefined) => void;
19
22
  loading_status: ReturnType<typeof create_loading_status_store>;
20
23
  scheduled_updates: Writable<boolean>;
21
24
  create_layout: (args: {
@@ -27,7 +30,7 @@ export declare function create_components(): {
27
30
  options: {
28
31
  fill_height: boolean;
29
32
  };
30
- }) => void;
33
+ }) => Promise<void>;
31
34
  rerender_layout: (args: {
32
35
  render_id: number;
33
36
  components: ComponentMeta[];