UNPKG

@convex-dev/workflow

Version:

Convex component for durably executing workflows.

114 lines 3.52 kB
import { vResultValidator, vWorkIdValidator } from "@convex-dev/workpool"; import { deprecated, literals } from "convex-helpers/validators"; import { defineSchema, defineTable } from "convex/server"; import { v } from "convex/values"; import { logLevel } from "./logging.js"; export const vOnComplete = v.object({ fnHandle: v.string(), // mutation context: v.optional(v.any()), }); const workflowObject = { name: v.optional(v.string()), workflowHandle: v.string(), args: v.any(), onComplete: v.optional(vOnComplete), logLevel: deprecated, startedAt: deprecated, state: deprecated, // undefined until it's completed runResult: v.optional(vResultValidator), // Internal execution status, used to totally order mutations. generationNumber: v.number(), }; export const workflowDocument = v.object({ _id: v.string(), _creationTime: v.number(), ...workflowObject, }); const stepCommonFields = { name: v.string(), inProgress: v.boolean(), argsSize: v.number(), args: v.any(), runResult: v.optional(vResultValidator), startedAt: v.number(), completedAt: v.optional(v.number()), }; export const step = v.union(v.object({ kind: v.optional(v.literal("function")), functionType: literals("query", "mutation", "action"), handle: v.string(), workId: v.optional(vWorkIdValidator), ...stepCommonFields, }), v.object({ kind: v.literal("workflow"), handle: v.string(), workflowId: v.optional(v.id("workflows")), ...stepCommonFields, }), v.object({ kind: v.literal("event"), ...stepCommonFields, eventId: v.optional(v.id("events")), args: v.object({ eventId: v.optional(v.id("events")) }), }), v.object({ kind: v.literal("sleep"), workId: v.optional(vWorkIdValidator), ...stepCommonFields, })); const journalObject = { workflowId: v.id("workflows"), stepNumber: v.number(), step, }; export const journalDocument = v.object({ _id: v.string(), _creationTime: v.number(), ...journalObject, }); export const event = { workflowId: v.id("workflows"), name: v.string(), state: v.union(v.object({ kind: v.literal("created"), }), v.object({ kind: v.literal("sent"), result: vResultValidator, sentAt: v.number(), }), v.object({ kind: v.literal("waiting"), waitingAt: v.number(), stepId: v.id("steps"), }), v.object({ kind: v.literal("consumed"), waitingAt: v.number(), sentAt: v.number(), consumedAt: v.number(), stepId: v.id("steps"), })), }; export default defineSchema({ config: defineTable({ logLevel: v.optional(logLevel), maxParallelism: v.optional(v.number()), }), workflows: defineTable(workflowObject).index("name", ["name"]), steps: defineTable(journalObject) .index("workflow", ["workflowId", "stepNumber"]) .index("inProgress", ["step.inProgress", "workflowId"]), events: defineTable(event).index("workflowId_state", [ "workflowId", "state.kind", ]), onCompleteFailures: defineTable(v.union(v.object({ workId: v.optional(vWorkIdValidator), workflowId: v.optional(v.string()), result: vResultValidator, context: v.any(), }), v.object({ workflowId: v.id("workflows"), generationNumber: v.number(), runResult: vResultValidator, error: v.string(), }))), }); //# sourceMappingURL=schema.js.map