Drizzle ORM storage implementation for durable-execution
npm install durable-execution-storage-drizzle


A storage implementation for durable-execution using
Drizzle ORM.
- npm
``bash`
npm install effect durable-execution durable-execution-storage-drizzle drizzle-orm
- pnpm
`bash`
pnpm add effect durable-execution durable-execution-storage-drizzle drizzle-orm
- 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
`ts
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()
`
`ts
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()
`
`ts
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()
``
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.
- Durable Execution docs
- GitHub
- NPM package
- Drizzle ORM
This project is licensed under the MIT License. See the
LICENSE file for details.