@rerun-io/web-viewer 0.17.0-alpha.1 → 0.17.0-alpha.101

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/README.md CHANGED
@@ -41,7 +41,7 @@ viewer.stop();
41
41
  ```
42
42
 
43
43
  The `rrd` in the snippet above should be a URL pointing to either:
44
- - A hosted `.rrd` file, such as <https://app.rerun.io/version/0.17.0-alpha.1/examples/dna.rrd>
44
+ - A hosted `.rrd` file, such as <https://app.rerun.io/version/0.17.0-alpha.101/examples/dna.rrd>
45
45
  - A WebSocket connection to the SDK opened via the [`serve`](https://www.rerun.io/docs/reference/sdk-operating-modes#serve) API
46
46
 
47
47
  If `rrd` is not set, the Viewer will display the same welcome screen as <https://app.rerun.io>.
package/index.d.ts CHANGED
@@ -1,256 +1,177 @@
1
- declare module '@rerun-io/web-viewer' {
2
- export class WebViewer {
3
- /**
4
- * Start the viewer.
5
- *
6
- * @param rrd URLs to `.rrd` files or WebSocket connections to our SDK.
7
- * @param parent The element to attach the canvas onto.
8
- * @param options Whether to hide the welcome screen.
9
- * */
10
- start(rrd?: string | string[] | null | undefined, parent?: HTMLElement | null | undefined, options?: WebViewerOptions | null | undefined): Promise<void>;
11
- /**
12
- * Returns `true` if the viewer is ready to connect to data sources.
13
- */
14
- get ready(): boolean;
15
- /**
16
- * Open a recording.
17
- *
18
- * The viewer must have been started via `WebViewer.start`.
19
- *
20
- * @param rrd URLs to `.rrd` files or WebSocket connections to our SDK.
21
- * @param options
22
- * - follow_if_http: Whether Rerun should open the resource in "Following" mode when streaming
23
- * from an HTTP url. Defaults to `false`. Ignored for non-HTTP URLs.
24
- */
25
- open(rrd: string | string[], options?: {
26
- follow_if_http?: boolean;
27
- }): void;
28
- /**
29
- * Close a recording.
30
- *
31
- * The viewer must have been started via `WebViewer.start`.
32
- *
33
- * @param rrd URLs to `.rrd` files or WebSocket connections to our SDK.
34
- */
35
- close(rrd: string | string[]): void;
36
- /**
37
- * Stop the viewer, freeing all associated memory.
38
- *
39
- * The same viewer instance may be started multiple times.
40
- */
41
- stop(): void;
42
- /**
43
- * Opens a new channel for sending log messages.
44
- *
45
- * The channel can be used to incrementally push `rrd` chunks into the viewer.
46
- *
47
- * @param channel_name used to identify the channel.
48
- *
49
- * */
50
- open_channel(channel_name?: string): LogChannel;
51
- /**
52
- * Force a panel to a specific state.
53
- *
54
- * */
55
- override_panel_state(panel: Panel, state: PanelState): void;
56
- /**
57
- * Toggle panel overrides set via `override_panel_state`.
58
- */
59
- toggle_panel_overrides(): void;
60
- /**
61
- * Toggle fullscreen mode.
62
- *
63
- * This does nothing if `allow_fullscreen` was not set to `true` when starting the viewer.
64
- *
65
- * Fullscreen mode works by updating the underlying `<canvas>` element's `style`:
66
- * - `position` to `fixed`
67
- * - width/height/top/left to cover the entire viewport
68
- *
69
- * When fullscreen mode is toggled off, the style is restored to its previous values.
70
- *
71
- * When fullscreen mode is toggled on, any other instance of the viewer on the page
72
- * which is already in fullscreen mode is toggled off. This means that it doesn't
73
- * have to be tracked manually.
74
- *
75
- * This functionality can also be directly accessed in the viewer:
76
- * - The maximize/minimize top panel button
77
- * - The `Toggle fullscreen` UI command (accessible via the command palette, CTRL+P)
78
- */
79
- toggle_fullscreen(): void;
80
- #private;
81
- }
82
- export class LogChannel {
83
-
84
- constructor(on_send: (data: Uint8Array) => void, on_close: () => void, get_state: () => 'ready' | 'starting' | 'stopped');
85
- get ready(): boolean;
86
- /**
87
- * Send an `rrd` containing log messages to the viewer.
88
- *
89
- * Does nothing if `!this.ready`.
90
- *
91
- * @param rrd_bytes Is an rrd file stored in a byte array, received via some other side channel.
92
- */
93
- send_rrd(rrd_bytes: Uint8Array): void;
94
- /**
95
- * Close the channel.
96
- *
97
- * Does nothing if `!this.ready`.
98
- */
99
- close(): void;
100
- #private;
101
- }
102
- export type Panel = "top" | "blueprint" | "selection" | "time";
103
- export type PanelState = "hidden" | "collapsed" | "expanded";
104
- export type Backend = "webgpu" | "webgl";
105
- export type CanvasRect = {
106
- width: string;
107
- height: string;
108
- top: string;
109
- left: string;
110
- bottom: string;
111
- right: string;
112
- };
113
- export type CanvasStyle = {
114
- canvas: CanvasRect & {
115
- position: string;
116
- transition: string;
117
- };
118
- document: {
119
- overflow: string;
120
- };
121
- };
122
- export type FullscreenOff = {
123
- on: false;
124
- saved_style: null;
125
- saved_rect: null;
126
- };
127
- export type FullscreenOn = {
128
- on: true;
129
- saved_style: CanvasStyle;
130
- saved_rect: DOMRect;
131
- };
132
- export type FullscreenState = (FullscreenOff | FullscreenOn);
133
- export type WebViewerOptions = {
134
- /**
135
- * Use a different example manifest.
136
- */
137
- manifest_url?: string | undefined;
138
- /**
139
- * Force the viewer to use a specific rendering backend.
140
- */
141
- render_backend?: Backend | undefined;
142
- /**
143
- * Whether to hide the welcome screen in favor of a simpler one.
144
- */
145
- hide_welcome_screen?: boolean | undefined;
146
- /**
147
- * Whether to allow the viewer to enter fullscreen mode.
148
- */
149
- allow_fullscreen?: boolean | undefined;
150
- };
151
- export type FullscreenOptions = {
152
- get_state: () => boolean;
153
- on_toggle: () => void;
154
- };
1
+ export type Panel = "top" | "blueprint" | "selection" | "time";
2
+ export type PanelState = "hidden" | "collapsed" | "expanded";
3
+ export type Backend = "webgpu" | "webgl";
4
+ export type CanvasRect = {
5
+ width: string;
6
+ height: string;
7
+ top: string;
8
+ left: string;
9
+ bottom: string;
10
+ right: string;
11
+ };
12
+ export type CanvasStyle = {
13
+ canvas: CanvasRect & {
14
+ position: string;
15
+ transition: string;
16
+ zIndex: string;
17
+ };
18
+ document: {
19
+ body: {
20
+ overflow: string;
21
+ scrollbarGutter: string;
22
+ };
23
+ root: {
24
+ overflow: string;
25
+ scrollbarGutter: string;
26
+ };
27
+ };
28
+ };
29
+ interface WebViewerOptions {
30
+ manifest_url?: string;
31
+ render_backend?: Backend;
32
+ hide_welcome_screen?: boolean;
33
+ allow_fullscreen?: boolean;
155
34
  }
156
-
157
- declare module '@rerun-io/web-viewer/re_viewer.js' {
158
- /* tslint:disable */
159
- /* eslint-disable */
160
- /**
161
- * Used to set the "email" property in the analytics config,
162
- * in the same way as `rerun analytics email YOURNAME@rerun.io`.
163
- *
164
- * This one just panics when it fails, as it's only ever really run
165
- * by rerun employees manually in `app.rerun.io`.
166
- * */
167
- export function set_email(email: string): void;
168
-
169
- export class IntoUnderlyingByteSource {
170
- free(): void;
171
-
172
- start(controller: ReadableByteStreamController): void;
173
-
174
- pull(controller: ReadableByteStreamController): Promise<any>;
175
-
176
- cancel(): void;
177
-
178
- readonly autoAllocateChunkSize: number;
179
-
180
- readonly type: string;
181
- }
182
-
183
- export class IntoUnderlyingSink {
184
- free(): void;
185
-
186
- write(chunk: any): Promise<any>;
187
-
188
- close(): Promise<any>;
189
-
190
- abort(reason: any): Promise<any>;
191
- }
192
-
193
- export class IntoUnderlyingSource {
194
- free(): void;
195
-
196
- pull(controller: ReadableStreamDefaultController): Promise<any>;
197
-
198
- cancel(): void;
199
- }
200
-
201
- export class WebHandle {
202
- free(): void;
203
-
204
- constructor(app_options: any);
205
- /**
206
- * - `url` is an optional URL to either an .rrd file over http, or a Rerun WebSocket server.
207
- * - `manifest_url` is an optional URL to an `examples_manifest.json` file over http.
208
- * - `force_wgpu_backend` is an optional string to force a specific backend, either `webgl` or `webgpu`.
209
- * */
210
- start(canvas_id: string): Promise<void>;
211
-
212
- toggle_panel_overrides(): void;
213
-
214
- override_panel_state(panel: string, state?: string): void;
215
-
216
- destroy(): void;
217
-
218
- has_panicked(): boolean;
219
-
220
- panic_message(): string | undefined;
221
-
222
- panic_callstack(): string | undefined;
223
- /**
224
- * Add a new receiver streaming data from the given url.
225
- *
226
- * If `follow_if_http` is `true`, and the url is an HTTP source, the viewer will open the stream
227
- * in `Following` mode rather than `Playing` mode.
228
- *
229
- * Websocket streams are always opened in `Following` mode.
230
- *
231
- * It is an error to open a channel twice with the same id.
232
- *
233
- */
234
- add_receiver(url: string, follow_if_http?: boolean): void;
235
-
236
- remove_receiver(url: string): void;
237
- /**
238
- * Open a new channel for streaming data.
239
- *
240
- * It is an error to open a channel twice with the same id.
241
- * */
242
- open_channel(id: string, channel_name: string): void;
243
- /**
244
- * Close an existing channel for streaming data.
245
- *
246
- * No-op if the channel is already closed.
247
- * */
248
- close_channel(id: string): void;
249
- /**
250
- * Add an rrd to the viewer directly from a byte array.
251
- * */
252
- send_rrd_to_channel(id: string, data: Uint8Array): void;
253
- }
35
+ interface WebViewerEvents {
36
+ fullscreen: boolean;
37
+ ready: void;
254
38
  }
255
-
39
+ type WithValue<Events> = {
40
+ [K in keyof Events as Events[K] extends void ? never : K]: Events[K];
41
+ };
42
+ type WithoutValue<Events> = {
43
+ [K in keyof Events as Events[K] extends void ? K : never]: Events[K];
44
+ };
45
+ type Cancel = () => void;
46
+ export declare class WebViewer {
47
+ #private;
48
+ constructor();
49
+ /**
50
+ * Start the viewer.
51
+ *
52
+ * @param rrd URLs to `.rrd` files or WebSocket connections to our SDK.
53
+ * @param parent The element to attach the canvas onto.
54
+ * @param options Whether to hide the welcome screen.
55
+ */
56
+ start(rrd: string | string[] | null, parent: HTMLElement | null, options: WebViewerOptions | null): Promise<void>;
57
+ /**
58
+ * Register an event listener.
59
+ *
60
+ * Returns a function which removes the listener when called.
61
+ */
62
+ on<E extends keyof WithValue<WebViewerEvents>>(event: E, callback: (value: WithValue<WebViewerEvents>[E]) => void): Cancel;
63
+ on<E extends keyof WithoutValue<WebViewerEvents>>(event: E, callback: () => void): Cancel;
64
+ /**
65
+ * Register an event listener which runs only once.
66
+ *
67
+ * Returns a function which removes the listener when called.
68
+ */
69
+ once<E extends keyof WithValue<WebViewerEvents>>(event: E, callback: (value: WithValue<WebViewerEvents>[E]) => void): Cancel;
70
+ once<E extends keyof WithoutValue<WebViewerEvents>>(event: E, callback: () => void): Cancel;
71
+ /**
72
+ * Unregister an event listener.
73
+ *
74
+ * The event emitter relies on referential equality to store callbacks.
75
+ * The `callback` passed in must be the exact same _instance_ of the function passed in to `on` or `once`.
76
+ */
77
+ off<E extends keyof WithValue<WebViewerEvents>>(event: E, callback: (value: WithValue<WebViewerEvents>[E]) => void): void;
78
+ off<E extends keyof WithoutValue<WebViewerEvents>>(event: E, callback: () => void): void;
79
+ /**
80
+ * Returns `true` if the viewer is ready to connect to data sources.
81
+ */
82
+ get ready(): boolean;
83
+ /**
84
+ * Open a recording.
85
+ *
86
+ * The viewer must have been started via `WebViewer.start`.
87
+ *
88
+ * @param rrd URLs to `.rrd` files or WebSocket connections to our SDK.
89
+ * @param options
90
+ * - follow_if_http: Whether Rerun should open the resource in "Following" mode when streaming
91
+ * from an HTTP url. Defaults to `false`. Ignored for non-HTTP URLs.
92
+ */
93
+ open(rrd: string | string[], options?: {
94
+ follow_if_http?: boolean;
95
+ }): void;
96
+ /**
97
+ * Close a recording.
98
+ *
99
+ * The viewer must have been started via `WebViewer.start`.
100
+ *
101
+ * @param rrd URLs to `.rrd` files or WebSocket connections to our SDK.
102
+ */
103
+ close(rrd: string | string[]): void;
104
+ /**
105
+ * Stop the viewer, freeing all associated memory.
106
+ *
107
+ * The same viewer instance may be started multiple times.
108
+ */
109
+ stop(): void;
110
+ /**
111
+ * Opens a new channel for sending log messages.
112
+ *
113
+ * The channel can be used to incrementally push `rrd` chunks into the viewer.
114
+ *
115
+ * @param channel_name used to identify the channel.
116
+ */
117
+ open_channel(channel_name?: string): LogChannel;
118
+ /**
119
+ * Force a panel to a specific state.
120
+ *
121
+ * @param panel
122
+ * @param state
123
+ */
124
+ override_panel_state(panel: Panel, state: PanelState): void;
125
+ /**
126
+ * Toggle panel overrides set via `override_panel_state`.
127
+ *
128
+ * @param value - set to a specific value. Toggles the previous value if not provided.
129
+ */
130
+ toggle_panel_overrides(value?: boolean | null): void;
131
+ /**
132
+ * Toggle fullscreen mode.
133
+ *
134
+ * This does nothing if `allow_fullscreen` was not set to `true` when starting the viewer.
135
+ *
136
+ * Fullscreen mode works by updating the underlying `<canvas>` element's `style`:
137
+ * - `position` to `fixed`
138
+ * - width/height/top/left to cover the entire viewport
139
+ *
140
+ * When fullscreen mode is toggled off, the style is restored to its previous values.
141
+ *
142
+ * When fullscreen mode is toggled on, any other instance of the viewer on the page
143
+ * which is already in fullscreen mode is toggled off. This means that it doesn't
144
+ * have to be tracked manually.
145
+ *
146
+ * This functionality can also be directly accessed in the viewer:
147
+ * - The maximize/minimize top panel button
148
+ * - The `Toggle fullscreen` UI command (accessible via the command palette, CTRL+P)
149
+ */
150
+ toggle_fullscreen(): void;
151
+ }
152
+ declare class LogChannel {
153
+ #private;
154
+ /**
155
+ * @param on_send
156
+ * @param on_close
157
+ * @param get_state
158
+ */
159
+ constructor(on_send: (data: Uint8Array) => void, on_close: () => void, get_state: () => "ready" | "starting" | "stopped");
160
+ get ready(): boolean;
161
+ /**
162
+ * Send an `rrd` containing log messages to the viewer.
163
+ *
164
+ * Does nothing if `!this.ready`.
165
+ *
166
+ * @param rrd_bytes Is an rrd file stored in a byte array, received via some other side channel.
167
+ */
168
+ send_rrd(rrd_bytes: Uint8Array): void;
169
+ /**
170
+ * Close the channel.
171
+ *
172
+ * Does nothing if `!this.ready`.
173
+ */
174
+ close(): void;
175
+ }
176
+ export {};
256
177
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map CHANGED
@@ -1,28 +1 @@
1
- {
2
- "version": 3,
3
- "file": "index.d.ts",
4
- "names": [
5
- "WebViewer",
6
- "LogChannel",
7
- "Panel",
8
- "PanelState",
9
- "Backend",
10
- "FullscreenOff",
11
- "FullscreenOn",
12
- "FullscreenState",
13
- "set_email",
14
- "IntoUnderlyingByteSource",
15
- "IntoUnderlyingSink",
16
- "IntoUnderlyingSource",
17
- "WebHandle"
18
- ],
19
- "sources": [
20
- "index.js",
21
- "re_viewer.d.ts"
22
- ],
23
- "sourcesContent": [
24
- null,
25
- null
26
- ],
27
- "mappings": ";cAiEaA,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoVTC,UAAUA;;;;;;;;;;;;;;;;;;;;aAtXkCC,KAAKA;aAEZC,UAAUA;aAE3BC,OAAOA;;;;;;;;;;;;;;;;;;aAayBC,aAAaA;;;;;aAEJC,YAAYA;;;;;aAEzCC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBC1C5CC,SAASA;;eAGZC,wBAAwBA;;;;;;;;;;;;;;eAuBxBC,kBAAkBA;;;;;;;;;;eAmBlBC,oBAAoBA;;;;;;;;eAapBC,SAASA"
28
- }
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}