Struct Client

Source
pub struct Client(/* private fields */);
Expand description

An instance of a Client is a unique connection to a single perspective_server::Server, whether locally in-memory or remote over some transport like a WebSocket.

The examples in this module are in JavaScript. See perspective docs for the Rust API.

The browser and node.js libraries both support the websocket(url) constructor, which connects to a remote perspective_server::Server instance over a WebSocket transport.

In the browser, the worker() constructor creates a new Web Worker perspective_server::Server and returns a Client connected to it.

In node.js, a pre-instantied Client connected synhronously to a global singleton perspective_server::Server is the default module export.

§JavaScript Examples

Create a Web Worker perspective_server::Server in the browser and return a Client instance connected for it:

import perspective from "@finos/perspective";
const client = await perspective.worker();

Create a WebSocket connection to a remote perspective_server::Server:

import perspective from "@finos/perspective";
const client = await perspective.websocket("ws://locahost:8080/ws");

Access the synchronous client in node.js:

import { default as client } from "@finos/perspective";
The examples in this module are in Python. See perspective docs for the Rust API.

§Python Examples

Create a perspective_server::Server and a local, synchronous Client instance connected for it:

import perspective;
server = perspective.Server()
client = server.new_local_client();

§Examples

Create a perspective_server::Server and a synchronous Client via the perspective crate:

use perspective::server::Server;
use perspective::LocalClient;

let server = Server::default();
let client = perspective::LocalClient::new(&server);

Implementations§

Source§

impl Client

Source

pub fn new( handle_request: Py<PyAny>, close_cb: Option<Py<PyAny>>, ) -> PyResult<Self>

Source

pub fn from_server( py: Python<'_>, server: Py<PySyncServer>, loop_callback: Option<Py<PyAny>>, ) -> PyResult<Self>

Source

pub fn handle_response( &self, py: Python<'_>, response: Py<PyBytes>, ) -> PyResult<bool>

Source

pub fn table( &self, py: Python<'_>, input: Py<PyAny>, limit: Option<u32>, index: Option<Py<PyString>>, name: Option<Py<PyString>>, format: Option<Py<PyString>>, ) -> PyResult<Table>

Creates a new Table from either a schema or data.

The Client::table factory function can be initialized with either a schema (see Table::schema), or data in one of these formats:

  • Apache Arrow
  • CSV
  • JSON row-oriented
  • JSON column-oriented

When instantiated with data, the schema is inferred from this data. While this is convenient, inferrence is sometimes imperfect e.g. when the input is empty, null or ambiguous. For these cases, Client::table can first be instantiated with a explicit schema.

When instantiated with a schema, the resulting Table is empty but with known column names and column types. When subsqeuently populated with Table::update, these columns will be coerced to the schema’s type. This behavior can be useful when Client::table’s column type inferences doesn’t work.

The resulting Table is virtual, and invoking its methods dispatches events to the perspective_server::Server this Client connects to, where the data is stored and all calculation occurs.

§Arguments
  • arg - Either schema or initialization data.
  • options - Optional configuration which provides one of:
    • limit - The max number of rows the resulting Table can store.
    • index - The column name to use as an index column. If this Table is being instantiated by data, this column name must be present in the data.
    • name - The name of the table. This will be generated if it is not provided.
    • format - The explicit format of the input data, can be one of "json", "columns", "csv" or "arrow". This overrides language-specific type dispatch behavior, which allows stringified and byte array alternative inputs.
§JavaScript Examples

Load a CSV from a string:

const table = await client.table("x,y\n1,2\n3,4");

Load an Arrow from an ArrayBuffer:

import * as fs from "node:fs/promises";
const table2 = await client.table(await fs.readFile("superstore.arrow"));

Load a CSV from a UInt8Array (the default for this type is Arrow) using a format override:

const enc = new TextEncoder();
const table = await client.table(enc.encode("x,y\n1,2\n3,4"), {
    format: "csv",
});

Create a table with an index:

const table = await client.table(data, { index: "Row ID" });
§Python Examples

Load a CSV from a str:

table = client.table("x,y\n1,2\n3,4")
§Examples

Load a CSV from a String:

let opts = TableInitOptions::default();
let data = TableData::Update(UpdateData::Csv("x,y\n1,2\n3,4".into()));
let table = client.table(data, opts).await?;
Source

pub fn open_table(&self, py: Python<'_>, name: String) -> PyResult<Table>

Opens a Table that is hosted on the perspective_server::Server that is connected to this Client.

The name property of TableInitOptions is used to identify each Table. Table names can be looked up for each Client via Client::get_hosted_table_names.

§JavaScript Examples

Get a virtual Table named “table_one” from this Client

const tables = await client.open_table("table_one");
§Python Examples
tables = client.open_table("table_one");
§Examples
let tables = client.open_table("table_one").await;
Source

pub fn get_hosted_table_names(&self, py: Python<'_>) -> PyResult<Vec<String>>

Retrieves the names of all tables that this client has access to.

name is a string identifier unique to the Table (per Client), which can be used in conjunction with Client::open_table to get a Table instance without the use of Client::table constructor directly (e.g., one created by another Client).

§JavaScript Examples
const tables = await client.get_hosted_table_names();
§Python Examples
tables = client.get_hosted_table_names();
§Examples
let tables = client.get_hosted_table_names().await;
Source

pub fn on_hosted_tables_update( &self, py: Python<'_>, callback: Py<PyAny>, ) -> PyResult<u32>

Register a callback which is invoked whenever Client::table (on this Client) or Table::delete (on a Table belinging to this Client) are called.

§JavaScript Examples
const sub = await client.on_hosted_tables_update(() => {
    console.log("Tables have updated!", await client.get_hosted_table_names());
});

// This invokes the handler
const table = await client.table("x\n1", {name: "test"});

// So does this
await table.delete();

// cleanup
await client.remove_hosted_tables_update(sub);
Source

pub fn remove_hosted_tables_update( &self, py: Python<'_>, callback_id: u32, ) -> PyResult<()>

Remove a callback previously registered via Client::on_hosted_tables_update.

Source

pub fn set_loop_callback( &self, py: Python<'_>, loop_cb: Py<PyAny>, ) -> PyResult<()>

Methods such as View::on_update take a callback function as an argument, which may be invoked by the Perspective runtime when updates occur. If provided a loop callback function via Client::set_loop_callback, such callback function invocations be passed to the loop callback instead.

Client::set_loop_callback can be used to control scheduling/conflation (e.g. by adding a delay), as well as executor integration.

Source

pub fn terminate(&self, py: Python<'_>) -> PyResult<()>

Terminates this Client, cleaning up any crate::View handles the Client has open as well as its callbacks.

Trait Implementations§

Source§

impl IntoPy<Py<PyAny>> for Client

Source§

fn into_py(self, py: Python<'_>) -> PyObject

👎Deprecated since 0.23.0: IntoPy is going to be replaced by IntoPyObject. See the migration guide (https://pyo3.rs/v0.23.0/migration) for more information.
Performs the conversion.
Source§

impl<'py> IntoPyObject<'py> for Client

Source§

type Target = Client

The Python output type
Source§

type Output = Bound<'py, <Client as IntoPyObject<'py>>::Target>

The smart pointer type to use. Read more
Source§

type Error = PyErr

The type returned in the event of a conversion error.
Source§

fn into_pyobject( self, py: Python<'py>, ) -> Result<<Self as IntoPyObject<'_>>::Output, <Self as IntoPyObject<'_>>::Error>

Performs the conversion.
Source§

impl PyClass for Client

Source§

type Frozen = False

Whether the pyclass is frozen. Read more
Source§

impl PyClassBaseType for Client

Source§

type LayoutAsBase = PyClassObject<Client>

Source§

type BaseNativeType = <Client as PyClassImpl>::BaseNativeType

Source§

type Initializer = PyClassInitializer<Client>

Source§

type PyClassMutability = <Client as PyClassImpl>::PyClassMutability

Source§

impl PyClassImpl for Client

Source§

const IS_BASETYPE: bool = true

#[pyclass(subclass)]
Source§

const IS_SUBCLASS: bool = false

#[pyclass(extends=…)]
Source§

const IS_MAPPING: bool = false

#[pyclass(mapping)]
Source§

const IS_SEQUENCE: bool = false

#[pyclass(sequence)]
Source§

type BaseType = PyAny

Base class
Source§

type ThreadChecker = SendablePyClass<Client>

This handles following two situations: Read more
Source§

type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild

Immutable or mutable
Source§

type Dict = PyClassDummySlot

Specify this class has #[pyclass(dict)] or not.
Source§

type WeakRef = PyClassDummySlot

Specify this class has #[pyclass(weakref)] or not.
Source§

type BaseNativeType = PyAny

The closest native ancestor. This is PyAny by default, and when you declare #[pyclass(extends=PyDict)], it’s PyDict.
Source§

fn items_iter() -> PyClassItemsIter

Source§

fn doc(py: Python<'_>) -> PyResult<&'static CStr>

Rendered class doc
Source§

fn lazy_type_object() -> &'static LazyTypeObject<Self>

Source§

fn dict_offset() -> Option<isize>

Source§

fn weaklist_offset() -> Option<isize>

Source§

impl PyClassNewTextSignature<Client> for PyClassImplCollector<Client>

Source§

fn new_text_signature(self) -> Option<&'static str>

Source§

impl<'a, 'py> PyFunctionArgument<'a, 'py> for &'a Client

Source§

type Holder = Option<PyRef<'py, Client>>

Source§

fn extract( obj: &'a Bound<'py, PyAny>, holder: &'a mut Self::Holder, ) -> PyResult<Self>

Source§

impl<'a, 'py> PyFunctionArgument<'a, 'py> for &'a mut Client

Source§

type Holder = Option<PyRefMut<'py, Client>>

Source§

fn extract( obj: &'a Bound<'py, PyAny>, holder: &'a mut Self::Holder, ) -> PyResult<Self>

Source§

impl PyMethods<Client> for PyClassImplCollector<Client>

Source§

fn py_methods(self) -> &'static PyClassItems

Source§

impl PyTypeInfo for Client

Source§

const NAME: &'static str = "Client"

Class name.
Source§

const MODULE: Option<&'static str>

Module name, if any.
Source§

fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject

Returns the PyTypeObject instance for this type.
Source§

fn type_object(py: Python<'_>) -> Bound<'_, PyType>

Returns the safe abstraction over the type object.
Source§

fn type_object_bound(py: Python<'_>) -> Bound<'_, PyType>

👎Deprecated since 0.23.0: renamed to PyTypeInfo::type_object
Deprecated name for PyTypeInfo::type_object.
Source§

fn is_type_of(object: &Bound<'_, PyAny>) -> bool

Checks if object is an instance of this type or a subclass of this type.
Source§

fn is_type_of_bound(object: &Bound<'_, PyAny>) -> bool

👎Deprecated since 0.23.0: renamed to PyTypeInfo::is_type_of
Deprecated name for PyTypeInfo::is_type_of.
Source§

fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool

Checks if object is an instance of this type.
Source§

fn is_exact_type_of_bound(object: &Bound<'_, PyAny>) -> bool

👎Deprecated since 0.23.0: renamed to PyTypeInfo::is_exact_type_of
Deprecated name for PyTypeInfo::is_exact_type_of.
Source§

impl DerefToPyAny for Client

Auto Trait Implementations§

§

impl Freeze for Client

§

impl !RefUnwindSafe for Client

§

impl Send for Client

§

impl Sync for Client

§

impl Unpin for Client

§

impl !UnwindSafe for Client

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<'py, T> IntoPyObjectExt<'py> for T
where T: IntoPyObject<'py>,

Source§

fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr>

Converts self into an owned Python object, dropping type information.
Source§

fn into_py_any(self, py: Python<'py>) -> Result<Py<PyAny>, PyErr>

Converts self into an owned Python object, dropping type information and unbinding it from the 'py lifetime.
Source§

fn into_pyobject_or_pyerr(self, py: Python<'py>) -> Result<Self::Output, PyErr>

Converts self into a Python object. Read more
Source§

impl<T> PyErrArguments for T
where T: for<'py> IntoPyObject<'py> + Send + Sync,

Source§

fn arguments(self, py: Python<'_>) -> Py<PyAny>

Arguments for exception
Source§

impl<T> PyTypeCheck for T
where T: PyTypeInfo,

Source§

const NAME: &'static str = <T as PyTypeInfo>::NAME

Name of self. This is used in error messages, for example.
Source§

fn type_check(object: &Bound<'_, PyAny>) -> bool

Checks if object is an instance of Self, which may include a subtype. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> Ungil for T
where T: Send,