Channels
Learn how to work with channels using the Synnax TypeScript client.
The TypeScript client provides interfaces for creating, retrieving and deleting the channels in a Synnax cluster. In this guide, we’ll cover the details of each of these operations.
If you’re unfamiliar with what channels are and how they work, check out the of channels concepts guide.
Creating Channels
We can create channels using the channels.create
method on the client.
Creating a Data Channel and its Index
Creating a data channel first requires us to create an index channel to store its timestamps:
import { DataType } from "@synnaxlabs/client";
// This channel is a special 'index' channel that is used to store timestamps for
// other channels.
const timeIndexChannel = await client.channels.create({
name: "time",
// Index channels must have a data type of TIMESTAMP and isIndex set to true
dataType: DataType.TIMESTAMP,
isIndex: true,
});
// This channel is used to store our actual data.
const tempChannel = await client.channels.create({
name: "my_temp_sensor",
dataType: DataType.FLOAT32,
// Pass the key of the index channel here
index: timeIndexChannel.key
});
Notice how we set the isIndex
property to true
on the "time"
index
channel. This tells Synnax that this channel will be used to store timestamps
for other channels. We then pass the index
property to the temperature sensor
channel so it uses the "time"
channel as its index.
Creating Multiple Channels
We can also create multiple channels efficiently by providing a list of channels
to the create
method. This is far more efficient than creating channels
individually, and provides the atomic guarantee that either no or all channels
will be created.
When creating variable rate channels, keep in mind that we need to create index channels before we can create the channels that use them.
import { Channel } from "@synnaxlabs/client";
// We need to create the index first, that way we can provide
// its key to our data channels.
const timeIndexChannel = await client.channels.create({
name: "time",
dataType: DataType.TIMESTAMP,
isIndex: true,
});
const sensorOne = new Channel({
name: "sensor_one",
dataType: DataType.FLOAT32,
index: timeIndexChannel.key
});
const sensorTwo = new Channel({
name: "sensor_two",
dataType: DataType.FLOAT32,
index: timeIndexChannel.key
});
const sensorThree = new Channel({
name: "sensor_three",
dataType: DataType.FLOAT32,
index: timeIndexChannel.key
});
const sensors = await client.channels.create(
[sensorOne, sensorTwo, sensorThree]
);
Retrieving Channels
Like creating them, we can retrieve channels using the channels.retrieve
method on
the client.
Retrieving a Single Channel
To retrieve a single channel, we can pass the channel’s name or key to the retrieve
method:
// By name
const tempChannel = await client.channels.retrieve("my_temp_sensor");
// If you know the key, you can use that too
const tempChannel = await client.channels.retrieve(tempChannel.key);
If Synnax finds no channels matching the query, the client will raise a
NotFoundError
. If more than one channel matches the query, the client will
raise a MultipleFoundError
. If you’d like to accept no or multiple results,
provide a list to the retrieve
method as shown in the next section.
Retrieving Multiple Channels
We can also retrieve multiple channels by passing a list of names or keys to the
retrieve
method:
// By name
const channels = await client.channels.retrieve(
["my_temp_sensor", "time"]
);
// By key
const channels = await client.channels.retrieve(
[tempChannel.key, timeIndexChannel.key]
);
// This won't work!!
const channels = await client.channels.retrieve(
["my_temp_sensor", timeIndexChannel.key]
);
Synnax will not raise a NotFoundError
if no channels match the query. Instead,
it will simply omit that channel from the list of results.
Deleting Channels
To delete a channel, we can use the channels.delete
method on the client:
Deleting a channel will also delete all of the data stored in that channel. This is a permanent operation that cannot be undone. Be careful!
// Delete a single channel
await client.channels.delete("my_precise_tc")
// Delete multiple channels
await client.channels.delete(["sensor_one", "sensor_two"])
// Delete by key
await client.channels.delete(sensor_three.key)
// Delete many by key
await client.channels.delete([sensor_one.key, sensor_two.key, sensor_three.key])
Unlike with retrieving channels, Synnax will not raise an error if it cannot
find a channel matching the key or name. This means that delete
is an
idempotent operation, and is safe to call even if the channel has already been
deleted.
Deleting a channel by name will delete all channels with that name.
Next Steps
Now that we know how to create and retrieve channels, we can start reading and writing data to them. Check out the reading data and writing data guides to learn more.