npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

satori-node

v1.1.7

Published

Satori driver for NodeJS

Readme

📚 Satori Node.js SDK

Welcome to the official documentation for Satori Node.js SDK! 🚀
This library allows you to interact easily and efficiently with the Satori database via WebSockets, supporting CRUD operations, real-time notifications, and advanced queries.


✨ Main Features

  • Ultra-fast CRUD operations
  • Advanced queries using field_array 🔍
  • Real-time notifications 📢
  • Graph-like relations (vertices and references) 🕸️
  • Data encryption and decryption 🔐

🚀 Installation

npm install satori-node

🏁 Basic Usage

import { Satori } from 'satori-node';

const client = new Satori({
  username: 'user',
  password: 'password',
  host: 'ws://localhost:2310'
});

await client.connect();

If you are inserting a vector you must specify data to a [f32] and type to vector


🗃️ CRUD Operations

Create Data

await client.set({
  key: 'user:123',
  data: { name: 'John', email: '[email protected]' },
  type: 'user' 
});

If you are inserting a vector you must specify data to a [f32] and type to vector

Read Data

const user = await client.get({ key: 'user:123' });

Modify a Field

await client.put({
  key: 'user:123',
  replace_field: 'name',
  replace_value: 'Peter'
});

Delete Data

await client.delete({ key: 'user:123' });

🧩 Advanced Queries with field_array 🔍

You can perform operations on multiple objects that meet certain conditions using the field_array field:

await client.get({
  field_array: [
    { field: 'email', value: '[email protected]' }
  ],
});
  • field_array is an array of conditions { field, value }.
  • You can combine it with one: true to get only the first matching result.

🔔 Real-time Notifications

Receive automatic updates when an object changes!

client.notify('user:123', data => {
  console.log('User updated!', data);
});

🕸️ Relations and Graphs

You can create relationships between objects (vertices):

await client.setVertex({
  key: 'user:123',
  vertex: 'friend:456',
  relation: 'friend',
  encryption_key: 'secret'
});

And traverse the graph with DFS:

await client.dfs({ node: 'user:123', encryption_key: 'secret' });

🔐 Encryption and Security

Easily encrypt and decrypt data:

await client.encrypt({ key: 'user:123', encryption_key: 'secret' });
await client.decrypt({ key: 'user:123', encryption_key: 'secret' });

🧰 Schema Class (Data Model)

You can use the Schema class to model your data in an object-oriented way:

import Schema from 'satori-node/schema';

class User extends Schema {
  // Define your fields here
}

const user = new User({ name: 'Anna' }, client, 'user');
await user.set();

It includes useful methods such as:

  • set, delete, encrypt, setVertex, getVertex, deleteVertex, dfs
  • Array methods: push, pop, splice, remove

📦 Array Manipulation Methods

Below are the available methods to manipulate arrays in the Satori database using the Node.js client:

🔹 push

Adds a value to an existing array in an object.

await client.push({ key: 'user:123', array: 'friends', value: 'user:456' });
  • key: Object key.
  • array: Name of the array.
  • value: Value to add.

🔹 pop

Removes the last element from an array in an object.

await client.pop({ key: 'user:123', array: 'friends' });
  • key: Object key.
  • array: Name of the array.

🔹 splice

Modifies an array in an object (for example, to cut or replace elements).

await client.splice({ key: 'user:123', array: 'friends' });
  • key: Object key.
  • array: Name of the array.

🔹 remove

Removes a specific value from an array in an object.

await client.remove({ key: 'user:123', array: 'friends', value: 'user:456' });
  • key: Object key.
  • array: Name of the array.
  • value: Value to remove.

🤖 AI Methods

Satori has AI features integrated that boost developers productivity.

🔹 set_middleware

Make the LLM analyze incoming querys and decide if it must reject them, accept them or modify them.

await client.set_middleware({
    "operation": "SET",
    "middleware": "Only accept requests that have the amount field specified, and convert its value to dollars"
});

🔹 ann

Perform an Aproximate Nearest Neighbors search

await client.ann({'key' : 'user:123', 'top_k' : '5'});
  • key: Source object key.
  • vector: Vector of f32 instead of key
  • top_k: Number of nearest neighbors to return

🔹 query

Make querys in natural language

await client.query({'query' : 'Insert the value 5 into the grades array of user:123', 'backend' : 'openai:gpt-4o-mini'|);
  • query: Your query in natural language.
  • ref: The LLM backend. Must be openai:model-name or ollama:model-name, if not specified openai:gpt-4o-mini will be used as default. If you're using OpenAI as your backend you must specify the OPENAI_API_KEY env variable.

🔹 ask

Ask question about your data in natural language

await client.ask({'question' : 'How many user over 25 years old do we have. Just return the number.', 'backend' : 'openai:gpt-4o-mini'});
  • question: Your question in natural language.
  • ref: The LLM backend. Must be openai:model-name or ollama:model-name, if not specified openai:gpt-4o-mini will be used as default. If you're using OpenAI as your backend you must specify the OPENAI_API_KEY env variable.

Analytics

🔹 get_operations

Returns all operations executed on the database.

🔹 get_access_frequency

Returns the number of times an object has been queried or accessed.

await client.get_access_frequency({'key' : 'jhon'})

Responses

All responses obbey the following pattern:

{
  data: any //the requested data if any
  message: string //status message
  type: string //SUCCESS || ERROR
}

AI responses obbey a different patern:

ask

{
  response: string //response to the question
}

query

{
  result: string //response from the operation made in the db
  status: string //status
}

ann

{
  results: array //response from the operation made in the db
}

🧠 Key Concepts

  • key: Unique identifier of the object.
  • type: Object type (e.g., 'user').
  • field_array: Advanced filters for bulk operations.
  • notifications: Subscription to real-time changes.
  • vertices: Graph-like relationships between objects.

💬 Questions or Suggestions?

Feel free to open an issue or contribute! With ❤️ from the Satori team.