durable-execution-storage-drizzle
v0.32.0
Published
Drizzle ORM storage implementation for durable-execution
Downloads
56
Maintainers
Readme
durable-execution-storage-drizzle
A storage implementation for durable-execution using Drizzle ORM.
Installation
- npm
npm install effect durable-execution durable-execution-storage-drizzle drizzle-orm- pnpm
pnpm add effect durable-execution durable-execution-storage-drizzle drizzle-ormFeatures
- Full support for PostgreSQL, MySQL and SQLite
- Transaction support for consistent state management
- Type-safe schema definitions
- Optimized indexes for performance
- Support for all durable-execution features including parent-child tasks
Usage
PostgreSQL
import { drizzle } from 'drizzle-orm/node-postgres'
import { DurableExecutor } from 'durable-execution'
import {
createPgTaskExecutionsTable,
createPgTaskExecutionsStorage
} from 'durable-execution-storage-drizzle'
// Create drizzle instance
const db = drizzle(process.env.DATABASE_URL!)
// Create the schema - you can customize the table name by passing a string to the function
const taskExecutionsTable = createPgTaskExecutionsTable()
// Export the table from your schema file
// Create the storage instance
const storage = createPgTaskExecutionsStorage(db, taskExecutionsTable)
// Create and use the executor
const executor = await DurableExecutor.make(storage)
// Create a task
const task = executor.task({
id: 'my-task',
timeoutMs: 30_000,
run: (ctx, input: { name: string }) => {
return `Hello, ${input.name}!`
},
})
// Use the executor
async function main() {
const handle = await executor.enqueueTask(task, { name: 'World' })
const result = await handle.waitAndGetFinishedExecution()
console.log(result.output) // "Hello, World!"
}
// Start the durable executor
await executor.start()
// Run main
await main()
await executor.shutdown()MySQL
import { drizzle } from 'drizzle-orm/mysql2'
import { DurableExecutor } from 'durable-execution'
import {
createMySqlTaskExecutionsTable,
createMySqlTaskExecutionsStorage
} from 'durable-execution-storage-drizzle'
// Create drizzle instance
const db = drizzle(process.env.DATABASE_URL!)
// Create the schema - you can customize the table name by passing a string to the function
const taskExecutionsTable = createMySqlTaskExecutionsTable()
// Export the table from your schema file
// Create the storage instance
const storage = createMySqlTaskExecutionsStorage(
db,
taskExecutionsTable,
(result) => result[0].affectedRows
)
// Create and use the executor
const executor = await DurableExecutor.make(storage)
// Create a task
const task = executor.task({
id: 'my-task',
timeoutMs: 30_000,
run: (ctx, input: { name: string }) => {
return `Hello, ${input.name}!`
},
})
// Use the executor
async function main() {
const handle = await executor.enqueueTask(task, { name: 'World' })
const result = await handle.waitAndGetFinishedExecution()
console.log(result.output) // "Hello, World!"
}
// Start the durable executor
await executor.start()
// Run main
await main()
await executor.shutdown()SQLite
import { drizzle } from 'drizzle-orm/libsql'
import { DurableExecutor } from 'durable-execution'
import {
createSQLiteTaskExecutionsTable,
createSQLiteTaskExecutionsStorage
} from 'durable-execution-storage-drizzle'
// Create drizzle instance
const db = drizzle(process.env.DATABASE_URL!)
// Create the schema - you can customize the table name by passing a string to the function
const taskExecutionsTable = createSQLiteTaskExecutionsTable()
// Export the table from your schema file
// Create the storage instance
const storage = createSQLiteTaskExecutionsStorage(db, taskExecutionsTable)
// Create and use the executor
const executor = await DurableExecutor.make(storage)
// Create a task
const task = executor.task({
id: 'my-task',
timeoutMs: 30_000,
run: (ctx, input: { name: string }) => {
return `Hello, ${input.name}!`
},
})
// Use the executor
async function main() {
const handle = await executor.enqueueTask(task, { name: 'World' })
const result = await handle.waitAndGetFinishedExecution()
console.log(result.output) // "Hello, World!"
}
// Start the durable executor
await executor.start()
// Run main
await main()
await executor.shutdown()Database Migrations
Make sure the table is discoverable by Drizzle ORM. You can do this by exporting the table from your schema file. Once that is done, you can use Drizzle Kit to create the table in your database.
Links
License
This project is licensed under the MIT License. See the LICENSE file for details.
