@perspective-dev/client 4.1.0 → 4.2.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.
Binary file
@@ -1,85 +1,97 @@
1
1
  /* tslint:disable */
2
2
  /* eslint-disable */
3
3
  export const memory: WebAssembly.Memory;
4
- export const __wbg_proxysession_free: (a: number, b: number) => void;
5
- export const proxysession_handle_request: (a: number, b: number) => number;
6
- export const proxysession_close: (a: number) => number;
7
4
  export const __wbg_client_free: (a: number, b: number) => void;
5
+ export const __wbg_genericsqlvirtualservermodel_free: (a: number, b: number) => void;
6
+ export const __wbg_proxysession_free: (a: number, b: number) => void;
7
+ export const __wbg_table_free: (a: number, b: number) => void;
8
+ export const __wbg_view_free: (a: number, b: number) => void;
9
+ export const __wbg_virtualdataslice_free: (a: number, b: number) => void;
10
+ export const __wbg_virtualserver_free: (a: number, b: number) => void;
8
11
  export const client___getClassname: (a: number, b: number) => void;
12
+ export const client_get_hosted_table_names: (a: number) => number;
13
+ export const client_handle_error: (a: number, b: number, c: number, d: number) => number;
14
+ export const client_handle_response: (a: number, b: number) => number;
9
15
  export const client_new: (a: number, b: number, c: number) => void;
10
16
  export const client_new_proxy_session: (a: number, b: number) => number;
11
- export const client_handle_response: (a: number, b: number) => number;
12
- export const client_handle_error: (a: number, b: number, c: number, d: number) => number;
13
17
  export const client_on_error: (a: number, b: number) => number;
14
- export const client_table: (a: number, b: number, c: number) => number;
15
- export const client_terminate: (a: number, b: number) => void;
16
- export const client_open_table: (a: number, b: number, c: number) => number;
17
- export const client_get_hosted_table_names: (a: number) => number;
18
18
  export const client_on_hosted_tables_update: (a: number, b: number) => number;
19
+ export const client_open_table: (a: number, b: number, c: number) => number;
19
20
  export const client_remove_hosted_tables_update: (a: number, b: number) => number;
20
21
  export const client_system_info: (a: number) => number;
22
+ export const client_table: (a: number, b: number, c: number) => number;
23
+ export const client_terminate: (a: number, b: number) => void;
24
+ export const genericsqlvirtualservermodel_getHostedTables: (a: number, b: number) => void;
25
+ export const genericsqlvirtualservermodel_new: (a: number, b: number) => void;
26
+ export const genericsqlvirtualservermodel_tableMakeView: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
27
+ export const genericsqlvirtualservermodel_tableSchema: (a: number, b: number, c: number, d: number) => void;
28
+ export const genericsqlvirtualservermodel_tableSize: (a: number, b: number, c: number, d: number) => void;
29
+ export const genericsqlvirtualservermodel_tableValidateExpression: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
30
+ export const genericsqlvirtualservermodel_viewColumnSize: (a: number, b: number, c: number, d: number) => void;
31
+ export const genericsqlvirtualservermodel_viewDelete: (a: number, b: number, c: number, d: number) => void;
32
+ export const genericsqlvirtualservermodel_viewGetData: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
33
+ export const genericsqlvirtualservermodel_viewSchema: (a: number, b: number, c: number, d: number) => void;
34
+ export const genericsqlvirtualservermodel_viewSize: (a: number, b: number, c: number, d: number) => void;
35
+ export const init: () => void;
36
+ export const proxysession_close: (a: number) => number;
37
+ export const proxysession_handle_request: (a: number, b: number) => number;
38
+ export const proxysession_new: (a: number, b: number) => number;
21
39
  export const table___getClassname: (a: number, b: number) => void;
22
- export const __wbg_table_free: (a: number, b: number) => void;
23
- export const table_get_index: (a: number) => number;
24
- export const table_get_client: (a: number) => number;
25
- export const table_get_name: (a: number) => number;
26
- export const table_get_limit: (a: number) => number;
27
40
  export const table_clear: (a: number) => number;
28
- export const table_delete: (a: number, b: number) => number;
29
- export const table_size: (a: number) => number;
30
- export const table_schema: (a: number) => number;
31
41
  export const table_columns: (a: number) => number;
42
+ export const table_delete: (a: number, b: number) => number;
43
+ export const table_get_client: (a: number) => number;
44
+ export const table_get_index: (a: number) => number;
45
+ export const table_get_limit: (a: number) => number;
46
+ export const table_get_name: (a: number) => number;
32
47
  export const table_make_port: (a: number) => number;
33
48
  export const table_on_delete: (a: number, b: number) => number;
34
- export const table_remove_delete: (a: number, b: number) => number;
35
49
  export const table_remove: (a: number, b: number, c: number) => number;
50
+ export const table_remove_delete: (a: number, b: number) => number;
36
51
  export const table_replace: (a: number, b: number, c: number) => number;
52
+ export const table_schema: (a: number) => number;
53
+ export const table_size: (a: number) => number;
37
54
  export const table_update: (a: number, b: number, c: number) => number;
38
- export const table_view: (a: number, b: number) => number;
39
55
  export const table_validate_expressions: (a: number, b: number) => number;
40
- export const __wbg_view_free: (a: number, b: number) => void;
56
+ export const table_view: (a: number, b: number) => number;
41
57
  export const view___get_model: (a: number) => number;
58
+ export const view_collapse: (a: number, b: number) => number;
42
59
  export const view_column_paths: (a: number, b: number) => number;
43
60
  export const view_delete: (a: number) => number;
44
61
  export const view_dimensions: (a: number) => number;
62
+ export const view_expand: (a: number, b: number) => number;
45
63
  export const view_expression_schema: (a: number) => number;
46
64
  export const view_get_config: (a: number) => number;
47
65
  export const view_get_min_max: (a: number, b: number, c: number) => number;
66
+ export const view_num_columns: (a: number) => number;
48
67
  export const view_num_rows: (a: number) => number;
68
+ export const view_on_delete: (a: number, b: number) => number;
69
+ export const view_on_update: (a: number, b: number, c: number) => number;
70
+ export const view_remove_delete: (a: number, b: number) => number;
71
+ export const view_remove_update: (a: number, b: number) => number;
49
72
  export const view_schema: (a: number) => number;
73
+ export const view_set_depth: (a: number, b: number) => number;
50
74
  export const view_to_arrow: (a: number, b: number) => number;
51
- export const view_to_columns_string: (a: number, b: number) => number;
52
75
  export const view_to_columns: (a: number, b: number) => number;
53
- export const view_to_json_string: (a: number, b: number) => number;
76
+ export const view_to_columns_string: (a: number, b: number) => number;
77
+ export const view_to_csv: (a: number, b: number) => number;
54
78
  export const view_to_json: (a: number, b: number) => number;
79
+ export const view_to_json_string: (a: number, b: number) => number;
55
80
  export const view_to_ndjson: (a: number, b: number) => number;
56
- export const view_to_csv: (a: number, b: number) => number;
57
- export const view_on_update: (a: number, b: number, c: number) => number;
58
- export const view_remove_update: (a: number, b: number) => number;
59
- export const view_on_delete: (a: number, b: number) => number;
60
- export const view_num_columns: (a: number) => number;
61
- export const view_remove_delete: (a: number, b: number) => number;
62
- export const view_collapse: (a: number, b: number) => number;
63
- export const view_expand: (a: number, b: number) => number;
64
- export const view_set_depth: (a: number, b: number) => number;
65
- export const __wbg_jsvirtualdataslice_free: (a: number, b: number) => void;
66
- export const jsvirtualdataslice_new: () => number;
67
- export const jsvirtualdataslice_setCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => void;
68
- export const jsvirtualdataslice_setStringCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
69
- export const jsvirtualdataslice_setIntegerCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
70
- export const jsvirtualdataslice_setFloatCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
71
- export const jsvirtualdataslice_setBooleanCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
72
- export const jsvirtualdataslice_setDatetimeCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
73
- export const __wbg_jsvirtualserver_free: (a: number, b: number) => void;
74
- export const jsvirtualserver_new: (a: number, b: number) => void;
75
- export const jsvirtualserver_handleRequest: (a: number, b: number, c: number) => number;
76
- export const init: () => void;
77
- export const proxysession_new: (a: number, b: number) => number;
78
- export const __wasm_bindgen_func_elem_3509: (a: number, b: number, c: number) => void;
79
- export const __wasm_bindgen_func_elem_3494: (a: number, b: number) => void;
80
- export const __wasm_bindgen_func_elem_553: (a: number, b: number) => number;
81
- export const __wasm_bindgen_func_elem_123: (a: number, b: number) => void;
82
- export const __wasm_bindgen_func_elem_5064: (a: number, b: number, c: number, d: number) => void;
81
+ export const virtualdataslice_new: (a: number) => number;
82
+ export const virtualdataslice_setBooleanCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
83
+ export const virtualdataslice_setCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => void;
84
+ export const virtualdataslice_setDatetimeCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
85
+ export const virtualdataslice_setFloatCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
86
+ export const virtualdataslice_setIntegerCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
87
+ export const virtualdataslice_setStringCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
88
+ export const virtualserver_handleRequest: (a: number, b: number, c: number) => number;
89
+ export const virtualserver_new: (a: number, b: number) => void;
90
+ export const __wasm_bindgen_func_elem_1421: (a: number, b: number) => void;
91
+ export const __wasm_bindgen_func_elem_3793: (a: number, b: number) => void;
92
+ export const __wasm_bindgen_func_elem_5384: (a: number, b: number, c: number, d: number) => void;
93
+ export const __wasm_bindgen_func_elem_3795: (a: number, b: number, c: number) => void;
94
+ export const __wasm_bindgen_func_elem_1668: (a: number, b: number) => number;
83
95
  export const __wbindgen_export: (a: number, b: number) => number;
84
96
  export const __wbindgen_export2: (a: number, b: number, c: number, d: number) => number;
85
97
  export const __wbindgen_export3: (a: number) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@perspective-dev/client",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",
@@ -48,6 +48,7 @@
48
48
  "@perspective-dev/esbuild-plugin": "",
49
49
  "@perspective-dev/metadata": "",
50
50
  "@perspective-dev/test": "",
51
+ "@clickhouse/client-web": "^1.12.0",
51
52
  "@duckdb/duckdb-wasm": "^1.30.0",
52
53
  "@playwright/experimental-ct-react": "=1.52.0",
53
54
  "@playwright/test": "=1.52.0",
@@ -0,0 +1,189 @@
1
+ // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ // ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ // ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ // ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ // ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ // ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ // ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ // ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ // ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+
13
+ //! WASM bindings for the DuckDB SQL query builder.
14
+
15
+ use std::str::FromStr;
16
+
17
+ use indexmap::IndexMap;
18
+ use js_sys::Object;
19
+ use perspective_client::config::ViewConfig;
20
+ use perspective_client::proto::{ColumnType, ViewPort};
21
+ use perspective_client::virtual_server;
22
+ use wasm_bindgen::prelude::*;
23
+
24
+ use crate::utils::*;
25
+
26
+ /// JavaScript-facing DuckDB SQL query builder.
27
+ ///
28
+ /// This struct wraps the Rust `DuckDBSqlBuilder` and exposes it to JavaScript
29
+ /// via wasm_bindgen.
30
+ #[wasm_bindgen]
31
+ pub struct GenericSQLVirtualServerModel {
32
+ inner: virtual_server::GenericSQLVirtualServerModel,
33
+ }
34
+
35
+ #[wasm_bindgen]
36
+ extern "C" {
37
+ pub type JsGenericSQLVirtualServerModelArgs;
38
+ }
39
+
40
+ #[wasm_bindgen]
41
+ impl GenericSQLVirtualServerModel {
42
+ /// Creates a new `JsDuckDBSqlBuilder` instance.
43
+ #[wasm_bindgen(constructor)]
44
+ pub fn new(args: Option<JsGenericSQLVirtualServerModelArgs>) -> Result<Self, JsValue> {
45
+ Ok(Self {
46
+ inner: virtual_server::GenericSQLVirtualServerModel::new(
47
+ args.map(|x| x.into_serde_ext())
48
+ .transpose()?
49
+ .unwrap_or_default(),
50
+ ),
51
+ })
52
+ }
53
+
54
+ /// Returns the SQL query to list all hosted tables.
55
+ #[wasm_bindgen(js_name = "getHostedTables")]
56
+ pub fn get_hosted_tables(&self) -> Result<String, JsValue> {
57
+ self.inner
58
+ .get_hosted_tables()
59
+ .map_err(|e| JsValue::from_str(&e.to_string()))
60
+ }
61
+
62
+ /// Returns the SQL query to describe a table's schema.
63
+ #[wasm_bindgen(js_name = "tableSchema")]
64
+ pub fn table_schema(&self, table_id: &str) -> Result<String, JsValue> {
65
+ self.inner
66
+ .table_schema(table_id)
67
+ .map_err(|e| JsValue::from_str(&e.to_string()))
68
+ }
69
+
70
+ /// Returns the SQL query to get the row count of a table.
71
+ #[wasm_bindgen(js_name = "tableSize")]
72
+ pub fn table_size(&self, table_id: &str) -> Result<String, JsValue> {
73
+ self.inner
74
+ .table_size(table_id)
75
+ .map_err(|e| JsValue::from_str(&e.to_string()))
76
+ }
77
+
78
+ /// Returns the SQL query to get the column count of a view.
79
+ #[wasm_bindgen(js_name = "viewColumnSize")]
80
+ pub fn view_column_size(&self, view_id: &str) -> Result<String, JsValue> {
81
+ self.inner
82
+ .view_column_size(view_id)
83
+ .map_err(|e| JsValue::from_str(&e.to_string()))
84
+ }
85
+
86
+ /// Returns the SQL query to validate an expression against a table.
87
+ #[wasm_bindgen(js_name = "tableValidateExpression")]
88
+ pub fn table_validate_expression(
89
+ &self,
90
+ table_id: &str,
91
+ expression: &str,
92
+ ) -> Result<String, JsValue> {
93
+ self.inner
94
+ .table_validate_expression(table_id, expression)
95
+ .map_err(|e| JsValue::from_str(&e.to_string()))
96
+ }
97
+
98
+ /// Returns the SQL query to delete a view.
99
+ #[wasm_bindgen(js_name = "viewDelete")]
100
+ pub fn view_delete(&self, view_id: &str) -> Result<String, JsValue> {
101
+ self.inner
102
+ .view_delete(view_id)
103
+ .map_err(|e| JsValue::from_str(&e.to_string()))
104
+ }
105
+
106
+ /// Returns the SQL query to create a view from a table with the given
107
+ /// configuration.
108
+ #[wasm_bindgen(js_name = "tableMakeView")]
109
+ pub fn table_make_view(
110
+ &self,
111
+ table_id: &str,
112
+ view_id: &str,
113
+ config: JsValue,
114
+ ) -> Result<String, JsValue> {
115
+ let config: ViewConfig = serde_wasm_bindgen::from_value(config)
116
+ .map_err(|e| JsValue::from_str(&e.to_string()))?;
117
+
118
+ self.inner
119
+ .table_make_view(table_id, view_id, &config)
120
+ .map_err(|e| JsValue::from_str(&e.to_string()))
121
+ }
122
+
123
+ /// Returns the SQL query to fetch data from a view with the given viewport.
124
+ #[wasm_bindgen(js_name = "viewGetData")]
125
+ pub fn view_get_data(
126
+ &self,
127
+ view_id: &str,
128
+ config: JsValue,
129
+ viewport: JsValue,
130
+ schema: JsValue,
131
+ ) -> Result<String, JsValue> {
132
+ let config: ViewConfig = serde_wasm_bindgen::from_value(config)
133
+ .map_err(|e| JsValue::from_str(&e.to_string()))?;
134
+
135
+ let viewport: ViewPort = serde_wasm_bindgen::from_value(viewport)
136
+ .map_err(|e| JsValue::from_str(&e.to_string()))?;
137
+
138
+ let schema = self.parse_schema(schema)?;
139
+
140
+ self.inner
141
+ .view_get_data(view_id, &config, &viewport, &schema)
142
+ .map_err(|e| JsValue::from_str(&e.to_string()))
143
+ }
144
+
145
+ /// Returns the SQL query to describe a view's schema.
146
+ #[wasm_bindgen(js_name = "viewSchema")]
147
+ pub fn view_schema(&self, view_id: &str) -> Result<String, JsValue> {
148
+ self.inner
149
+ .view_schema(view_id)
150
+ .map_err(|e| JsValue::from_str(&e.to_string()))
151
+ }
152
+
153
+ /// Returns the SQL query to get the row count of a view.
154
+ #[wasm_bindgen(js_name = "viewSize")]
155
+ pub fn view_size(&self, view_id: &str) -> Result<String, JsValue> {
156
+ self.inner
157
+ .view_size(view_id)
158
+ .map_err(|e| JsValue::from_str(&e.to_string()))
159
+ }
160
+ }
161
+
162
+ impl GenericSQLVirtualServerModel {
163
+ fn parse_schema(&self, schema: JsValue) -> Result<IndexMap<String, ColumnType>, JsValue> {
164
+ let obj = schema.dyn_ref::<Object>().ok_or_else(|| {
165
+ JsValue::from_str("Schema must be an object mapping column names to types")
166
+ })?;
167
+
168
+ let mut result = IndexMap::new();
169
+ let entries = Object::entries(obj);
170
+ for i in 0..entries.length() {
171
+ let entry = entries.get(i);
172
+ let entry_array = entry
173
+ .dyn_ref::<js_sys::Array>()
174
+ .ok_or_else(|| JsValue::from_str("Invalid schema entry"))?;
175
+ let key = entry_array
176
+ .get(0)
177
+ .as_string()
178
+ .ok_or_else(|| JsValue::from_str("Column name must be a string"))?;
179
+ let value = entry_array
180
+ .get(1)
181
+ .as_string()
182
+ .ok_or_else(|| JsValue::from_str("Column type must be a string"))?;
183
+ let column_type = ColumnType::from_str(&value)
184
+ .map_err(|_| JsValue::from_str(&format!("Unknown column type: {}", value)))?;
185
+ result.insert(key, column_type);
186
+ }
187
+ Ok(result)
188
+ }
189
+ }
package/src/rust/lib.rs CHANGED
@@ -26,20 +26,20 @@
26
26
  extern crate alloc;
27
27
 
28
28
  mod client;
29
+ mod generic_sql_model;
29
30
  mod table;
30
31
  mod table_data;
31
32
  pub mod utils;
32
33
  mod view;
33
- #[cfg(target_arch = "wasm32")]
34
34
  mod virtual_server;
35
35
 
36
36
  #[cfg(feature = "export-init")]
37
37
  use wasm_bindgen::prelude::*;
38
38
 
39
39
  pub use crate::client::Client;
40
+ pub use crate::generic_sql_model::*;
40
41
  pub use crate::table::*;
41
42
  pub use crate::table_data::*;
42
- #[cfg(target_arch = "wasm32")]
43
43
  pub use crate::virtual_server::*;
44
44
 
45
45
  #[cfg(feature = "export-init")]
@@ -170,10 +170,10 @@ impl<S: Subscriber + for<'a> LookupSpan<'a>> Layer<S> for WasmLogger {
170
170
  }
171
171
 
172
172
  fn on_record(&self, id: &tracing::Id, values: &tracing::span::Record<'_>, ctx: Context<'_, S>) {
173
- if let Some(span_ref) = ctx.span(id) {
174
- if let Some(debug_record) = span_ref.extensions_mut().get_mut::<LogLineBuffer>() {
175
- values.record(debug_record);
176
- }
173
+ if let Some(span_ref) = ctx.span(id)
174
+ && let Some(debug_record) = span_ref.extensions_mut().get_mut::<LogLineBuffer>()
175
+ {
176
+ values.record(debug_record);
177
177
  }
178
178
  }
179
179
 
@@ -46,6 +46,12 @@ where
46
46
  pub fn new<U: Future<Output = ApiResult<T>> + 'static>(x: U) -> Self {
47
47
  Self(Box::pin(x))
48
48
  }
49
+
50
+ pub fn new_throttled<U: Future<Output = ApiResult<T>> + 'static>(x: U) -> ApiFuture<()> {
51
+ ApiFuture::<()>(Box::pin(
52
+ async move { x.await.ignore_view_delete().map(|_| ()) },
53
+ ))
54
+ }
49
55
  }
50
56
 
51
57
  impl<T> ApiFuture<T>
@@ -87,7 +93,7 @@ where
87
93
  future_to_promise(async move {
88
94
  match fut.0.await.ignore_view_delete()? {
89
95
  Some(x) => Ok(x).into_js_result(),
90
- None => Ok::<_, JsValue>(()).into_js_result(),
96
+ None => Err("View not found".into()).into_js_result(),
91
97
  }
92
98
  })
93
99
  }