durable-execution-storage-convex
Version:
Convex storage implementation for durable-execution
149 lines (110 loc) • 4.01 kB
Markdown
//img.shields.io/npm/v/durable-execution-storage-convex)](https://www.npmjs.com/package/durable-execution-storage-convex)
[](https://github.com/gpahal/durable-execution/blob/main/LICENSE)
A storage implementation for [durable-execution](https://github.com/gpahal/durable-execution) using
[ ](https://www.convex.dev/).
- npm
```bash
npm install effect durable-execution durable-execution-storage-convex convex
```
- pnpm
```bash
pnpm add effect durable-execution durable-execution-storage-convex convex
```
- Full support for Convex
- Transaction support for consistent state management
- Type-safe schema definitions
- Optimized indexes for performance
- Support for all durable-execution features including parent-child tasks
- Add the storage component to your Convex project
```ts
// src/convex/convex.config.ts
import { defineApp } from 'convex/server'
import taskExecutionsStorage from 'durable-execution-storage-convex/convex.config'
const app = defineApp()
app.use(taskExecutionsStorage)
export default app
```
- Expose the public api needed by the storage implementation. Use a random string as the
auth secret. Use the same auth secret in the storage implementation. The publicly exposed api is
protected by the auth secret.
```ts
// src/convex/taskExecutionsStorage.ts
import {
convertDurableExecutionStorageComponentToPublicApiImpl
} from 'durable-execution-storage-convex'
import { components } from './_generated/api'
export const {
insertMany,
getManyById,
getManyBySleepingTaskUniqueId,
updateManyById,
updateManyByIdAndInsertChildrenIfUpdated,
updateByStatusAndStartAtLessThanAndReturn,
updateByStatusAndOCFPStatusAndACCZeroAndReturn,
updateByCloseStatusAndReturn,
updateByStatusAndIsSleepingTaskAndExpiresAtLessThan,
updateByOCFPExpiresAt,
updateByCloseExpiresAt,
updateByExecutorIdAndNPCAndReturn,
getManyByParentExecutionId,
updateManyByParentExecutionIdAndIsFinished,
updateAndDecrementParentACCByIsFinishedAndCloseStatus,
deleteById,
deleteAll,
} = convertDurableExecutionStorageComponentToPublicApiImpl(
components.taskExecutionsStorage,
'SUPER_SECRET',
)
```
- Use the storage implementation
```ts
// src/index.ts
import { ConvexHttpClient } from 'convex/browser'
import { DurableExecutor } from 'durable-execution'
import { ConvexTaskExecutionsStorage } from 'durable-execution-storage-convex'
import { api } from '../convex/_generated/api'
// Create the convex client
const convexClient = new ConvexHttpClient(process.env.VITE_CONVEX_URL!)
// Create the storage instance
const storage = new ConvexTaskExecutionsStorage(
convexClient,
// Use a random string as the auth secret as the one in the public api
'SUPER_SECRET',
api.taskExecutionsStorage,
)
// 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()
```
Utilities will be provided when migrations are needed.
- [Durable Execution docs](https://gpahal.github.io/durable-execution)
- [GitHub](https://github.com/gpahal/durable-execution)
- [NPM package](https://www.npmjs.com/package/durable-execution-storage-convex)
- [Convex](https://www.convex.dev/)
This project is licensed under the MIT License. See the
[ ](https://github.com/gpahal/durable-execution/blob/main/LICENSE) file for details.
[![NPM Version](https: