Skip to content

Turso Implementation

The Turso implementation uses the @tursodatabase/database library.

Installation

bash
npm install applesauce-sqlite @tursodatabase/database

Basic Usage

Unlike other implementations, Turso requires you to create and initialize the database instance yourself before passing it to the TursoEventDatabase constructor:

js
import { EventStore } from "applesauce-core";
import { TursoEventDatabase } from "applesauce-sqlite/turso";
import { connect } from "@tursodatabase/database";

// For local development - simple file path
const db = await connect("my-database.db");

// Create and initialize the event database in one step
const database = await TursoEventDatabase.fromDatabase(db);

// Create EventStore with Turso backend
const eventStore = new EventStore(database);

// Use as normal
eventStore.add(someNostrEvent);

Options

The TursoEventDatabase.fromDatabase() method accepts the following options:

js
const database = await TursoEventDatabase.fromDatabase(db, {
  search: true, // Enable full-text search (default: false)
  searchContentFormatter: customFormatter, // Custom search content formatter
});

Search Support

Enable full-text search using SQLite's FTS5 extension:

js
const database = await TursoEventDatabase.fromDatabase(db, {
  search: true,
});

// Now you can search events
const results = eventStore.getByFilters({
  search: "bitcoin lightning",
});

Custom Search Formatter

Customize how content is indexed for search:

js
const database = await TursoEventDatabase.fromDatabase(db, {
  search: true,
  searchContentFormatter: (event) => {
    // Extract searchable content from event
    return event.content + " " + event.tags.map((t) => t[1]).join(" ");
  },
});

Advanced Usage

Database Connection Management

The Turso implementation requires you to manage the database connection lifecycle:

js
import { connect } from "@tursodatabase/database";

// Create connection
const db = await connect("my-database.db");

// Create and initialize event database in one step
const database = await TursoEventDatabase.fromDatabase(db, { search: true });

// ... use the database

// Close when done
await database.close();

Using with Existing Database Instance

You can use any existing Turso Database instance:

js
import { connect } from "@tursodatabase/database";
import { TursoEventDatabase } from "applesauce-sqlite/turso";

// Your existing database setup
const db = await connect("my-database.db");

// Create and initialize event database in one step
const database = await TursoEventDatabase.fromDatabase(db, { search: true });

Local Development

For local development, you can use a local SQLite file:

js
import { connect } from "@tursodatabase/database";
import { TursoEventDatabase } from "applesauce-sqlite/turso";

// Local SQLite file
const db = await connect("local.db");

const database = await TursoEventDatabase.fromDatabase(db, { search: true });

Rebuilding Search Index

If you need to rebuild the search index (e.g., after changing the search formatter):

js
await database.rebuildSearchIndex();

Closing the Database

Always close the database when done:

js
await database.close();

Or use automatic cleanup with Symbol.dispose:

js
{
  const database = await TursoEventDatabase.fromDatabase(db);
  // ... use database
} // Automatically closed when out of scope

Complete Example

Here's a complete example showing how to use the Turso implementation:

js
import { EventStore } from "applesauce-core";
import { TursoEventDatabase } from "applesauce-sqlite/turso";
import { connect } from "@tursodatabase/database";

async function initApp() {
  try {
    // Create database connection
    const db = await connect("nostr-events.db");

    // Create and initialize event database with search enabled
    const database = await TursoEventDatabase.fromDatabase(db, {
      search: true,
    });

    // Create event store
    const eventStore = new EventStore(database);

    // Example: Add a test event
    const testEvent = {
      id: "test123",
      kind: 1,
      pubkey: "pubkey123",
      created_at: Math.floor(Date.now() / 1000),
      content: "Hello from Turso!",
      tags: [],
      sig: "signature123",
    };

    await eventStore.add(testEvent);

    // Example: Search events
    const searchResults = await eventStore.getByFilters({
      search: "Hello",
      kinds: [1],
    });

    console.log("Search results:", searchResults);

    // Close when done
    await database.close();
  } catch (error) {
    console.error("Error initializing app:", error);
  }
}

initApp();