@sonamu-kit/tasks 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/client.d.ts +0 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +0 -1
  4. package/dist/client.js.map +1 -1
  5. package/dist/client.test.js +2 -1
  6. package/dist/client.test.js.map +1 -1
  7. package/dist/core/duration.d.ts +1 -1
  8. package/dist/core/duration.js +1 -1
  9. package/dist/core/duration.js.map +1 -1
  10. package/dist/core/workflow.d.ts +2 -1
  11. package/dist/core/workflow.d.ts.map +1 -1
  12. package/dist/core/workflow.js +2 -1
  13. package/dist/core/workflow.js.map +1 -1
  14. package/dist/database/backend.d.ts +7 -8
  15. package/dist/database/backend.d.ts.map +1 -1
  16. package/dist/database/backend.js +134 -39
  17. package/dist/database/backend.js.map +1 -1
  18. package/dist/database/backend.test.js +3 -1
  19. package/dist/database/backend.test.js.map +1 -1
  20. package/dist/database/base.d.ts +2 -2
  21. package/dist/database/base.d.ts.map +1 -1
  22. package/dist/database/base.js +17 -5
  23. package/dist/database/base.js.map +1 -1
  24. package/dist/database/pubsub.d.ts.map +1 -1
  25. package/dist/database/pubsub.js +9 -3
  26. package/dist/database/pubsub.js.map +1 -1
  27. package/dist/execution.test.js +4 -2
  28. package/dist/execution.test.js.map +1 -1
  29. package/dist/practices/01-remote-workflow.js +2 -1
  30. package/dist/practices/01-remote-workflow.js.map +1 -1
  31. package/dist/testing/connection.d.ts +1 -1
  32. package/dist/testing/connection.d.ts.map +1 -1
  33. package/dist/testing/connection.js +5 -4
  34. package/dist/testing/connection.js.map +1 -1
  35. package/dist/worker.test.js +2 -1
  36. package/dist/worker.test.js.map +1 -1
  37. package/package.json +7 -5
  38. package/scripts/migrate.ts +1 -4
  39. package/src/client.test.ts +2 -1
  40. package/src/client.ts +0 -1
  41. package/src/core/duration.ts +1 -1
  42. package/src/core/workflow.ts +2 -1
  43. package/src/database/backend.test.ts +3 -1
  44. package/src/database/backend.ts +140 -45
  45. package/src/database/base.ts +12 -7
  46. package/src/database/pubsub.ts +9 -3
  47. package/src/execution.test.ts +4 -2
  48. package/src/practices/01-remote-workflow.ts +2 -1
  49. package/src/testing/connection.ts +5 -3
  50. package/src/worker.test.ts +2 -1
  51. package/templates/openworkflow.config.ts +1 -1
package/dist/client.d.ts CHANGED
@@ -99,7 +99,6 @@ export declare class OpenWorkflow {
99
99
  * Declare a workflow without providing its implementation (which is provided
100
100
  * separately via `implementWorkflow`). Returns a lightweight WorkflowSpec
101
101
  * that can be used to schedule workflow runs.
102
- * @param config - Workflow config
103
102
  * @param spec - Workflow spec
104
103
  * @returns Workflow spec
105
104
  * @example
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAsB,MAAM,UAAU,CAAC;AACtD,OAAO,EAAkB,kBAAkB,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAMlG,KAAK,oBAAoB,CAAC,OAAO,EAAE,KAAK,IAAI,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAGzE,KAAK,gBAAgB,CAAC,OAAO,EAAE,KAAK,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,OAAO,EAAE,mBAAmB;IAIxC;;;;;OAKG;IACH,SAAS,CAAC,OAAO,CAAC,EAAE;QAClB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,MAAM;IAUV;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAG,KAAK,EAC/C,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAC3C,EAAE,EAAE,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,GAClC,IAAI;IAKP;;;;;;;;;;;;OAYG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAG,KAAK,EAC/C,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAC3C,KAAK,CAAC,EAAE,QAAQ,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IA6BrC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EACpF,IAAI,EAAE,YAAY,CAChB,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,EACpC,MAAM,EACN,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CACjC,EACD,EAAE,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,GACjE,gBAAgB,CACjB,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,EACpC,MAAM,EACN,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CACjC;IAMD;;;;;;;;OAQG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI9D;;;;;;;;;OASG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;CAGpE;AAED;;;;;;;;;;;;;GAaG;AAGH,eAAO,MAAM,eAAe,2BAAqB,CAAC;AAMlD;;;;GAIG;AACH,qBAAa,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAG,KAAK;IAC3D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAEzC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;IAKzE;;;;;OAKG;IACG,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAG9F;AAMD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAE,IAAI,CAAC;IAElB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,MAAM;IACnC,OAAO,CAAC,OAAO,CAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,eAAe,CAAS;gBAEpB,OAAO,EAAE,qBAAqB;IAO1C;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAsC/B;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAK9B"}
package/dist/client.js CHANGED
@@ -129,7 +129,6 @@ const DEFAULT_RESULT_TIMEOUT_MS = 5 * 60 * 1000; // 5m
129
129
  * Declare a workflow without providing its implementation (which is provided
130
130
  * separately via `implementWorkflow`). Returns a lightweight WorkflowSpec
131
131
  * that can be used to schedule workflow runs.
132
- * @param config - Workflow config
133
132
  * @param spec - Workflow spec
134
133
  * @returns Workflow spec
135
134
  * @example
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type { Backend } from \"./backend\";\nimport type { StandardSchemaV1 } from \"./core/schema\";\nimport type { SchemaInput, SchemaOutput, WorkflowRun } from \"./core/workflow\";\nimport { validateInput } from \"./core/workflow\";\nimport type { WorkflowFunction } from \"./execution\";\nimport { WorkflowRegistry } from \"./registry\";\nimport { Worker, type WorkerOptions } from \"./worker\";\nimport { defineWorkflow, defineWorkflowSpec, type Workflow, type WorkflowSpec } from \"./workflow\";\n\nconst DEFAULT_RESULT_POLL_INTERVAL_MS = 1000; // 1s\nconst DEFAULT_RESULT_TIMEOUT_MS = 5 * 60 * 1000; // 5m\n\n/* The data the worker function receives (after transformation). */\ntype WorkflowHandlerInput<TSchema, Input> = SchemaOutput<TSchema, Input>;\n\n/* The data the client sends (before transformation) */\ntype WorkflowRunInput<TSchema, Input> = SchemaInput<TSchema, Input>;\n\n/**\n * Options for the OpenWorkflow client.\n */\nexport interface OpenWorkflowOptions {\n backend: Backend;\n}\n\n/**\n * Client used to register workflows and start runs.\n */\nexport class OpenWorkflow {\n private backend: Backend;\n private registry = new WorkflowRegistry();\n\n constructor(options: OpenWorkflowOptions) {\n this.backend = options.backend;\n }\n\n /**\n * Create a new Worker with this client's backend and workflows.\n * @param options - Worker options\n * @param options.concurrency - Max concurrent workflow runs\n * @returns Worker instance\n */\n newWorker(options?: {\n concurrency?: number | undefined;\n usePubSub?: boolean;\n listenDelay?: number;\n }): Worker {\n return new Worker({\n backend: this.backend,\n registry: this.registry,\n concurrency: options?.concurrency,\n usePubSub: options?.usePubSub,\n listenDelay: options?.listenDelay,\n } satisfies WorkerOptions);\n }\n\n /**\n * Provide the implementation for a declared workflow. This links the workflow\n * specification to its execution logic and registers it with this\n * OpenWorkflow instance for worker execution.\n * @param spec - Workflow spec\n * @param fn - Workflow implementation\n */\n implementWorkflow<Input, Output, RunInput = Input>(\n spec: WorkflowSpec<Input, Output, RunInput>,\n fn: WorkflowFunction<Input, Output>,\n ): void {\n const workflow: Workflow<Input, Output, RunInput> = { spec, fn };\n this.registry.register(workflow as Workflow<unknown, unknown, unknown>);\n }\n\n /**\n * Run a workflow from its specification. This is the primary way to schedule\n * a workflow using only its WorkflowSpec.\n * @param spec - Workflow spec\n * @param input - Workflow input\n * @param options - Run options\n * @returns Handle for awaiting the result\n * @example\n * ```ts\n * const handle = await ow.runWorkflow(emailWorkflow, { to: 'user@example.com' });\n * const result = await handle.result();\n * ```\n */\n async runWorkflow<Input, Output, RunInput = Input>(\n spec: WorkflowSpec<Input, Output, RunInput>,\n input?: RunInput,\n options?: WorkflowRunOptions,\n ): Promise<WorkflowRunHandle<Output>> {\n const validationResult = await validateInput(spec.schema, input);\n if (!validationResult.success) {\n throw new Error(validationResult.error);\n }\n const parsedInput = validationResult.value;\n const workflowRun = await this.backend.createWorkflowRun({\n workflowName: spec.name,\n version: spec.version ?? null,\n idempotencyKey: null,\n config: {},\n context: null,\n input: parsedInput ?? null,\n availableAt: null,\n deadlineAt: options?.deadlineAt ?? null,\n });\n\n if (options?.publishToChannel) {\n await this.backend.publish(workflowRun.id);\n }\n\n return new WorkflowRunHandle<Output>({\n backend: this.backend,\n workflowRun: workflowRun,\n resultPollIntervalMs: DEFAULT_RESULT_POLL_INTERVAL_MS,\n resultTimeoutMs: DEFAULT_RESULT_TIMEOUT_MS,\n });\n }\n\n /**\n * Define and register a new workflow.\n *\n * This is a convenience method that combines `declareWorkflow` and\n * `implementWorkflow` into a single call. For better code splitting and to\n * separate declaration from implementation, consider using those methods\n * separately.\n * @param config - Workflow config\n * @param fn - Workflow implementation\n * @returns Runnable workflow\n * @example\n * ```ts\n * const workflow = ow.defineWorkflow(\n * { name: 'my-workflow' },\n * async ({ input, step }) => {\n * // workflow implementation\n * },\n * );\n * ```\n */\n defineWorkflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(\n spec: WorkflowSpec<\n WorkflowHandlerInput<TSchema, Input>,\n Output,\n WorkflowRunInput<TSchema, Input>\n >,\n fn: WorkflowFunction<WorkflowHandlerInput<TSchema, Input>, Output>,\n ): RunnableWorkflow<\n WorkflowHandlerInput<TSchema, Input>,\n Output,\n WorkflowRunInput<TSchema, Input>\n > {\n const workflow = defineWorkflow(spec, fn);\n this.registry.register(workflow as Workflow<unknown, unknown, unknown>);\n return new RunnableWorkflow(this, workflow);\n }\n\n /**\n * Unregister a workflow from the registry.\n * @param name - The workflow name\n * @param version - The workflow version (null for unversioned)\n * @example\n * ```ts\n * ow.unregisterWorkflow(\"my-workflow\", \"v1\");\n * ```\n */\n unregisterWorkflow(name: string, version: string | null): void {\n this.registry.remove(name, version);\n }\n\n /**\n * Check if a workflow is registered in the registry.\n * @param name - The workflow name\n * @param version - The workflow version (null for unversioned)\n * @returns True if the workflow is registered, false otherwise\n * @example\n * ```ts\n * ow.isWorkflowRegistered(\"my-workflow\", \"v1\");\n * ```\n */\n isWorkflowRegistered(name: string, version: string | null): boolean {\n return this.registry.has(name, version);\n }\n}\n\n/**\n * Declare a workflow without providing its implementation (which is provided\n * separately via `implementWorkflow`). Returns a lightweight WorkflowSpec\n * that can be used to schedule workflow runs.\n * @param config - Workflow config\n * @param spec - Workflow spec\n * @returns Workflow spec\n * @example\n * ```ts\n * export const emailWorkflow = declareWorkflow({\n * name: 'send-email',\n * schema: z.object({ to: z.string().email() }),\n * });\n * ```\n */\n// kept for backwards compatibility, to be deprecated\n// eslint-disable-next-line unicorn/prefer-export-from\nexport const declareWorkflow = defineWorkflowSpec;\n\n//\n// --- Workflow Definition\n//\n\n/**\n * A fully defined workflow with its implementation. This class is returned by\n * `defineWorkflow` and provides the `.run()` method for scheduling workflow\n * runs.\n */\nexport class RunnableWorkflow<Input, Output, RunInput = Input> {\n private readonly ow: OpenWorkflow;\n readonly workflow: Workflow<Input, Output, RunInput>;\n\n constructor(ow: OpenWorkflow, workflow: Workflow<Input, Output, RunInput>) {\n this.ow = ow;\n this.workflow = workflow;\n }\n\n /**\n * Starts a new workflow run.\n * @param input - Workflow input\n * @param options - Run options\n * @returns Workflow run handle\n */\n async run(input?: RunInput, options?: WorkflowRunOptions): Promise<WorkflowRunHandle<Output>> {\n return this.ow.runWorkflow(this.workflow.spec, input, options);\n }\n}\n\n//\n// --- Workflow Run\n//\n\n/**\n * Options for creating a new workflow run from a runnable workflow when calling\n * `workflow.run()`.\n */\nexport interface WorkflowRunOptions {\n /**\n * Set a deadline for the workflow run. If the workflow exceeds this deadline,\n * it will be marked as failed.\n */\n deadlineAt?: Date;\n\n /**\n * Publish when the workflow run is created to the channel.\n * Default: true\n */\n publishToChannel?: boolean;\n}\n\n/**\n * Options for WorkflowHandle.\n */\nexport interface WorkflowHandleOptions {\n backend: Backend;\n workflowRun: WorkflowRun;\n resultPollIntervalMs: number;\n resultTimeoutMs: number;\n}\n\n/**\n * Represents a started workflow run and provides methods to await its result.\n * Returned from `workflowDef.run()`.\n */\nexport class WorkflowRunHandle<Output> {\n private backend: Backend;\n readonly workflowRun: WorkflowRun;\n private resultPollIntervalMs: number;\n private resultTimeoutMs: number;\n\n constructor(options: WorkflowHandleOptions) {\n this.backend = options.backend;\n this.workflowRun = options.workflowRun;\n this.resultPollIntervalMs = options.resultPollIntervalMs;\n this.resultTimeoutMs = options.resultTimeoutMs;\n }\n\n /**\n * Waits for the workflow run to complete and returns the result.\n * @returns Workflow output\n */\n async result(): Promise<Output> {\n const start = Date.now();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const latest = await this.backend.getWorkflowRun({\n workflowRunId: this.workflowRun.id,\n });\n\n if (!latest) {\n throw new Error(`Workflow run ${this.workflowRun.id} no longer exists`);\n }\n\n // 'succeeded' status is deprecated\n if (latest.status === \"succeeded\" || latest.status === \"completed\") {\n return latest.output as Output;\n }\n\n if (latest.status === \"failed\") {\n throw new Error(\n `Workflow ${this.workflowRun.workflowName} failed: ${JSON.stringify(latest.error)}`,\n );\n }\n\n if (latest.status === \"canceled\") {\n throw new Error(`Workflow ${this.workflowRun.workflowName} was canceled`);\n }\n\n if (Date.now() - start > this.resultTimeoutMs) {\n throw new Error(`Timed out waiting for workflow run ${this.workflowRun.id} to finish`);\n }\n\n await new Promise((resolve) => {\n setTimeout(resolve, this.resultPollIntervalMs);\n });\n }\n }\n\n /**\n * Cancels the workflow run. Only workflows in pending, running, or sleeping\n * status can be canceled.\n */\n async cancel(): Promise<void> {\n await this.backend.cancelWorkflowRun({\n workflowRunId: this.workflowRun.id,\n });\n }\n}\n"],"names":["validateInput","WorkflowRegistry","Worker","defineWorkflow","defineWorkflowSpec","DEFAULT_RESULT_POLL_INTERVAL_MS","DEFAULT_RESULT_TIMEOUT_MS","OpenWorkflow","backend","registry","options","newWorker","concurrency","usePubSub","listenDelay","implementWorkflow","spec","fn","workflow","register","runWorkflow","input","validationResult","schema","success","Error","error","parsedInput","value","workflowRun","createWorkflowRun","workflowName","name","version","idempotencyKey","config","context","availableAt","deadlineAt","publishToChannel","publish","id","WorkflowRunHandle","resultPollIntervalMs","resultTimeoutMs","RunnableWorkflow","unregisterWorkflow","remove","isWorkflowRegistered","has","declareWorkflow","ow","run","result","start","Date","now","latest","getWorkflowRun","workflowRunId","status","output","JSON","stringify","Promise","resolve","setTimeout","cancel","cancelWorkflowRun"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type { Backend } from \"./backend\";\nimport type { StandardSchemaV1 } from \"./core/schema\";\nimport type { SchemaInput, SchemaOutput, WorkflowRun } from \"./core/workflow\";\nimport { validateInput } from \"./core/workflow\";\nimport type { WorkflowFunction } from \"./execution\";\nimport { WorkflowRegistry } from \"./registry\";\nimport { Worker, type WorkerOptions } from \"./worker\";\nimport { defineWorkflow, defineWorkflowSpec, type Workflow, type WorkflowSpec } from \"./workflow\";\n\nconst DEFAULT_RESULT_POLL_INTERVAL_MS = 1000; // 1s\nconst DEFAULT_RESULT_TIMEOUT_MS = 5 * 60 * 1000; // 5m\n\n/* The data the worker function receives (after transformation). */\ntype WorkflowHandlerInput<TSchema, Input> = SchemaOutput<TSchema, Input>;\n\n/* The data the client sends (before transformation) */\ntype WorkflowRunInput<TSchema, Input> = SchemaInput<TSchema, Input>;\n\n/**\n * Options for the OpenWorkflow client.\n */\nexport interface OpenWorkflowOptions {\n backend: Backend;\n}\n\n/**\n * Client used to register workflows and start runs.\n */\nexport class OpenWorkflow {\n private backend: Backend;\n private registry = new WorkflowRegistry();\n\n constructor(options: OpenWorkflowOptions) {\n this.backend = options.backend;\n }\n\n /**\n * Create a new Worker with this client's backend and workflows.\n * @param options - Worker options\n * @param options.concurrency - Max concurrent workflow runs\n * @returns Worker instance\n */\n newWorker(options?: {\n concurrency?: number | undefined;\n usePubSub?: boolean;\n listenDelay?: number;\n }): Worker {\n return new Worker({\n backend: this.backend,\n registry: this.registry,\n concurrency: options?.concurrency,\n usePubSub: options?.usePubSub,\n listenDelay: options?.listenDelay,\n } satisfies WorkerOptions);\n }\n\n /**\n * Provide the implementation for a declared workflow. This links the workflow\n * specification to its execution logic and registers it with this\n * OpenWorkflow instance for worker execution.\n * @param spec - Workflow spec\n * @param fn - Workflow implementation\n */\n implementWorkflow<Input, Output, RunInput = Input>(\n spec: WorkflowSpec<Input, Output, RunInput>,\n fn: WorkflowFunction<Input, Output>,\n ): void {\n const workflow: Workflow<Input, Output, RunInput> = { spec, fn };\n this.registry.register(workflow as Workflow<unknown, unknown, unknown>);\n }\n\n /**\n * Run a workflow from its specification. This is the primary way to schedule\n * a workflow using only its WorkflowSpec.\n * @param spec - Workflow spec\n * @param input - Workflow input\n * @param options - Run options\n * @returns Handle for awaiting the result\n * @example\n * ```ts\n * const handle = await ow.runWorkflow(emailWorkflow, { to: 'user@example.com' });\n * const result = await handle.result();\n * ```\n */\n async runWorkflow<Input, Output, RunInput = Input>(\n spec: WorkflowSpec<Input, Output, RunInput>,\n input?: RunInput,\n options?: WorkflowRunOptions,\n ): Promise<WorkflowRunHandle<Output>> {\n const validationResult = await validateInput(spec.schema, input);\n if (!validationResult.success) {\n throw new Error(validationResult.error);\n }\n const parsedInput = validationResult.value;\n const workflowRun = await this.backend.createWorkflowRun({\n workflowName: spec.name,\n version: spec.version ?? null,\n idempotencyKey: null,\n config: {},\n context: null,\n input: parsedInput ?? null,\n availableAt: null,\n deadlineAt: options?.deadlineAt ?? null,\n });\n\n if (options?.publishToChannel) {\n await this.backend.publish(workflowRun.id);\n }\n\n return new WorkflowRunHandle<Output>({\n backend: this.backend,\n workflowRun: workflowRun,\n resultPollIntervalMs: DEFAULT_RESULT_POLL_INTERVAL_MS,\n resultTimeoutMs: DEFAULT_RESULT_TIMEOUT_MS,\n });\n }\n\n /**\n * Define and register a new workflow.\n *\n * This is a convenience method that combines `declareWorkflow` and\n * `implementWorkflow` into a single call. For better code splitting and to\n * separate declaration from implementation, consider using those methods\n * separately.\n * @param config - Workflow config\n * @param fn - Workflow implementation\n * @returns Runnable workflow\n * @example\n * ```ts\n * const workflow = ow.defineWorkflow(\n * { name: 'my-workflow' },\n * async ({ input, step }) => {\n * // workflow implementation\n * },\n * );\n * ```\n */\n defineWorkflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(\n spec: WorkflowSpec<\n WorkflowHandlerInput<TSchema, Input>,\n Output,\n WorkflowRunInput<TSchema, Input>\n >,\n fn: WorkflowFunction<WorkflowHandlerInput<TSchema, Input>, Output>,\n ): RunnableWorkflow<\n WorkflowHandlerInput<TSchema, Input>,\n Output,\n WorkflowRunInput<TSchema, Input>\n > {\n const workflow = defineWorkflow(spec, fn);\n this.registry.register(workflow as Workflow<unknown, unknown, unknown>);\n return new RunnableWorkflow(this, workflow);\n }\n\n /**\n * Unregister a workflow from the registry.\n * @param name - The workflow name\n * @param version - The workflow version (null for unversioned)\n * @example\n * ```ts\n * ow.unregisterWorkflow(\"my-workflow\", \"v1\");\n * ```\n */\n unregisterWorkflow(name: string, version: string | null): void {\n this.registry.remove(name, version);\n }\n\n /**\n * Check if a workflow is registered in the registry.\n * @param name - The workflow name\n * @param version - The workflow version (null for unversioned)\n * @returns True if the workflow is registered, false otherwise\n * @example\n * ```ts\n * ow.isWorkflowRegistered(\"my-workflow\", \"v1\");\n * ```\n */\n isWorkflowRegistered(name: string, version: string | null): boolean {\n return this.registry.has(name, version);\n }\n}\n\n/**\n * Declare a workflow without providing its implementation (which is provided\n * separately via `implementWorkflow`). Returns a lightweight WorkflowSpec\n * that can be used to schedule workflow runs.\n * @param spec - Workflow spec\n * @returns Workflow spec\n * @example\n * ```ts\n * export const emailWorkflow = declareWorkflow({\n * name: 'send-email',\n * schema: z.object({ to: z.string().email() }),\n * });\n * ```\n */\n// kept for backwards compatibility, to be deprecated\n// eslint-disable-next-line unicorn/prefer-export-from\nexport const declareWorkflow = defineWorkflowSpec;\n\n//\n// --- Workflow Definition\n//\n\n/**\n * A fully defined workflow with its implementation. This class is returned by\n * `defineWorkflow` and provides the `.run()` method for scheduling workflow\n * runs.\n */\nexport class RunnableWorkflow<Input, Output, RunInput = Input> {\n private readonly ow: OpenWorkflow;\n readonly workflow: Workflow<Input, Output, RunInput>;\n\n constructor(ow: OpenWorkflow, workflow: Workflow<Input, Output, RunInput>) {\n this.ow = ow;\n this.workflow = workflow;\n }\n\n /**\n * Starts a new workflow run.\n * @param input - Workflow input\n * @param options - Run options\n * @returns Workflow run handle\n */\n async run(input?: RunInput, options?: WorkflowRunOptions): Promise<WorkflowRunHandle<Output>> {\n return this.ow.runWorkflow(this.workflow.spec, input, options);\n }\n}\n\n//\n// --- Workflow Run\n//\n\n/**\n * Options for creating a new workflow run from a runnable workflow when calling\n * `workflow.run()`.\n */\nexport interface WorkflowRunOptions {\n /**\n * Set a deadline for the workflow run. If the workflow exceeds this deadline,\n * it will be marked as failed.\n */\n deadlineAt?: Date;\n\n /**\n * Publish when the workflow run is created to the channel.\n * Default: true\n */\n publishToChannel?: boolean;\n}\n\n/**\n * Options for WorkflowHandle.\n */\nexport interface WorkflowHandleOptions {\n backend: Backend;\n workflowRun: WorkflowRun;\n resultPollIntervalMs: number;\n resultTimeoutMs: number;\n}\n\n/**\n * Represents a started workflow run and provides methods to await its result.\n * Returned from `workflowDef.run()`.\n */\nexport class WorkflowRunHandle<Output> {\n private backend: Backend;\n readonly workflowRun: WorkflowRun;\n private resultPollIntervalMs: number;\n private resultTimeoutMs: number;\n\n constructor(options: WorkflowHandleOptions) {\n this.backend = options.backend;\n this.workflowRun = options.workflowRun;\n this.resultPollIntervalMs = options.resultPollIntervalMs;\n this.resultTimeoutMs = options.resultTimeoutMs;\n }\n\n /**\n * Waits for the workflow run to complete and returns the result.\n * @returns Workflow output\n */\n async result(): Promise<Output> {\n const start = Date.now();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const latest = await this.backend.getWorkflowRun({\n workflowRunId: this.workflowRun.id,\n });\n\n if (!latest) {\n throw new Error(`Workflow run ${this.workflowRun.id} no longer exists`);\n }\n\n // 'succeeded' status is deprecated\n if (latest.status === \"succeeded\" || latest.status === \"completed\") {\n return latest.output as Output;\n }\n\n if (latest.status === \"failed\") {\n throw new Error(\n `Workflow ${this.workflowRun.workflowName} failed: ${JSON.stringify(latest.error)}`,\n );\n }\n\n if (latest.status === \"canceled\") {\n throw new Error(`Workflow ${this.workflowRun.workflowName} was canceled`);\n }\n\n if (Date.now() - start > this.resultTimeoutMs) {\n throw new Error(`Timed out waiting for workflow run ${this.workflowRun.id} to finish`);\n }\n\n await new Promise((resolve) => {\n setTimeout(resolve, this.resultPollIntervalMs);\n });\n }\n }\n\n /**\n * Cancels the workflow run. Only workflows in pending, running, or sleeping\n * status can be canceled.\n */\n async cancel(): Promise<void> {\n await this.backend.cancelWorkflowRun({\n workflowRunId: this.workflowRun.id,\n });\n }\n}\n"],"names":["validateInput","WorkflowRegistry","Worker","defineWorkflow","defineWorkflowSpec","DEFAULT_RESULT_POLL_INTERVAL_MS","DEFAULT_RESULT_TIMEOUT_MS","OpenWorkflow","backend","registry","options","newWorker","concurrency","usePubSub","listenDelay","implementWorkflow","spec","fn","workflow","register","runWorkflow","input","validationResult","schema","success","Error","error","parsedInput","value","workflowRun","createWorkflowRun","workflowName","name","version","idempotencyKey","config","context","availableAt","deadlineAt","publishToChannel","publish","id","WorkflowRunHandle","resultPollIntervalMs","resultTimeoutMs","RunnableWorkflow","unregisterWorkflow","remove","isWorkflowRegistered","has","declareWorkflow","ow","run","result","start","Date","now","latest","getWorkflowRun","workflowRunId","status","output","JSON","stringify","Promise","resolve","setTimeout","cancel","cancelWorkflowRun"],"mappings":"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"}
@@ -7,10 +7,11 @@ import { KNEX_GLOBAL_CONFIG } from "./testing/connection.js";
7
7
  describe("OpenWorkflow", ()=>{
8
8
  let backend;
9
9
  beforeEach(async ()=>{
10
- backend = await BackendPostgres.connect(KNEX_GLOBAL_CONFIG, {
10
+ backend = new BackendPostgres(KNEX_GLOBAL_CONFIG, {
11
11
  namespaceId: randomUUID(),
12
12
  runMigrations: false
13
13
  });
14
+ await backend.initialize();
14
15
  });
15
16
  afterEach(async ()=>{
16
17
  await backend.stop();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.test.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { afterEach, beforeEach, describe, expect, test } from \"vitest\";\nimport { z } from \"zod\";\nimport { BackendPostgres } from \".\";\nimport { declareWorkflow, OpenWorkflow } from \"./client\";\nimport { KNEX_GLOBAL_CONFIG } from \"./testing/connection\";\n\ndescribe(\"OpenWorkflow\", () => {\n let backend: BackendPostgres;\n\n beforeEach(async () => {\n backend = await BackendPostgres.connect(KNEX_GLOBAL_CONFIG, {\n namespaceId: randomUUID(),\n runMigrations: false,\n });\n });\n\n afterEach(async () => {\n await backend.stop();\n });\n\n test(\"enqueues workflow runs via backend\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"enqueue-test\" }, noopFn);\n await workflow.run({ docUrl: \"https://example.com\" });\n\n const workerId = \"enqueue-worker\";\n const claimed = await backend.claimWorkflowRun({\n workerId,\n leaseDurationMs: 1000,\n });\n\n expect(claimed?.workflowName).toBe(\"enqueue-test\");\n expect(claimed?.workerId).toBe(workerId);\n expect(claimed?.input).toEqual({ docUrl: \"https://example.com\" });\n });\n\n describe(\"schema validation\", () => {\n describe(\"Zod schema\", () => {\n const schema = z.object({\n userId: z.uuid(),\n count: z.number().int().positive(),\n });\n\n test(\"accepts valid input\", async () => {\n const client = new OpenWorkflow({ backend });\n const workflow = client.defineWorkflow({ name: \"schema-zod-valid\", schema }, noopFn);\n\n const handle = await workflow.run({\n userId: randomUUID(),\n count: 3,\n });\n\n await handle.cancel();\n });\n\n test(\"rejects invalid input\", async () => {\n const client = new OpenWorkflow({ backend });\n const workflow = client.defineWorkflow({ name: \"schema-zod-invalid\", schema }, noopFn);\n\n await expect(workflow.run({ userId: \"not-a-uuid\", count: 0 } as never)).rejects.toThrow();\n });\n });\n });\n\n test(\"result resolves when workflow succeeds\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"result-success\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n const workerId = \"test-worker\";\n const claimed = await backend.claimWorkflowRun({\n workerId,\n leaseDurationMs: 1000,\n });\n expect(claimed).not.toBeNull();\n if (!claimed) throw new Error(\"workflow run was not claimed\");\n\n await backend.completeWorkflowRun({\n workflowRunId: claimed.id,\n workerId,\n output: { ok: true },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n const result = await handle.result();\n expect(result).toEqual({ ok: true });\n });\n\n test(\"result rejects when workflow fails\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"result-failure\" }, noopFn);\n await workflow.run({ value: 1 });\n\n const workerId = \"test-worker\";\n const claimed = await backend.claimWorkflowRun({\n workerId,\n leaseDurationMs: 1000,\n });\n expect(claimed).not.toBeNull();\n if (!claimed) throw new Error(\"workflow run was not claimed\");\n\n // mark as failed (should reschedule))\n await backend.failWorkflowRun({\n workflowRunId: claimed.id,\n workerId,\n error: { message: \"boom\" },\n });\n\n const rescheduled = await backend.getWorkflowRun({\n workflowRunId: claimed.id,\n });\n expect(rescheduled?.status).toBe(\"pending\");\n expect(rescheduled?.error).toEqual({ message: \"boom\" });\n });\n\n test(\"creates workflow run with deadline\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"deadline-test\" }, noopFn);\n const deadline = new Date(Date.now() + 60_000); // in 1 minute\n const handle = await workflow.run({ value: 1 }, { deadlineAt: deadline });\n\n expect(handle.workflowRun.deadlineAt).not.toBeNull();\n expect(handle.workflowRun.deadlineAt?.getTime()).toBe(deadline.getTime());\n });\n\n test(\"creates workflow run with version\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"versioned-test\", version: \"v2.0\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n expect(handle.workflowRun.version).toBe(\"v2.0\");\n });\n\n test(\"creates workflow run without version\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"unversioned-test\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n expect(handle.workflowRun.version).toBeNull();\n });\n\n test(\"cancels workflow run via handle\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"cancel-test\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n await handle.cancel();\n\n const workflowRun = await backend.getWorkflowRun({\n workflowRunId: handle.workflowRun.id,\n });\n expect(workflowRun?.status).toBe(\"canceled\");\n expect(workflowRun?.finishedAt).not.toBeNull();\n });\n\n describe(\"declareWorkflow / implementWorkflow API\", () => {\n test(\"declareWorkflow returns a spec that can be used to schedule runs\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({ name: \"declare-test\" });\n\n const handle = await client.runWorkflow(spec, { message: \"hello\" });\n expect(handle.workflowRun.workflowName).toBe(\"declare-test\");\n\n await handle.cancel();\n });\n\n test(\"implementWorkflow registers the workflow for worker execution\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({ name: \"implement-test\" });\n client.implementWorkflow(spec, ({ input }) => {\n return { received: input };\n });\n\n const handle = await client.runWorkflow(spec, { data: 42 });\n const worker = client.newWorker();\n await worker.tick();\n await sleep(100); // wait for background execution\n\n const result = await handle.result();\n expect(result).toEqual({ received: { data: 42 } });\n });\n\n test(\"implementWorkflow throws when workflow is already registered\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({ name: \"duplicate-test\" });\n client.implementWorkflow(spec, noopFn);\n\n expect(() => {\n client.implementWorkflow(spec, noopFn);\n }).toThrow('Workflow \"duplicate-test\" is already registered');\n });\n\n test(\"implementWorkflow allows registering different versions of the same workflow\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const specV1 = declareWorkflow({\n name: \"multi-version\",\n version: \"v1\",\n });\n const specV2 = declareWorkflow({\n name: \"multi-version\",\n version: \"v2\",\n });\n\n // no throwing...\n client.implementWorkflow(specV1, noopFn);\n client.implementWorkflow(specV2, noopFn);\n });\n\n test(\"implementWorkflow throws for same name+version combination\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec1 = declareWorkflow({\n name: \"version-duplicate\",\n version: \"v1\",\n });\n const spec2 = declareWorkflow({\n name: \"version-duplicate\",\n version: \"v1\",\n });\n\n client.implementWorkflow(spec1, noopFn);\n\n expect(() => {\n client.implementWorkflow(spec2, noopFn);\n }).toThrow('Workflow \"version-duplicate\" (version: v1) is already registered');\n });\n\n test(\"declareWorkflow with schema validates input on runWorkflow\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const schema = z.object({\n email: z.email(),\n });\n const spec = declareWorkflow({\n name: \"declare-schema-test\",\n schema,\n });\n\n const handle = await client.runWorkflow(spec, {\n email: \"test@example.com\",\n });\n await handle.cancel();\n\n await expect(client.runWorkflow(spec, { email: \"not-an-email\" })).rejects.toThrow();\n });\n\n test(\"declareWorkflow with version sets version on workflow run\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({\n name: \"declare-version-test\",\n version: \"v1.2.3\",\n });\n\n const handle = await client.runWorkflow(spec);\n expect(handle.workflowRun.version).toBe(\"v1.2.3\");\n\n await handle.cancel();\n });\n\n test(\"defineWorkflow wraps declareWorkflow and implementWorkflow\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"define-wrap-test\" }, ({ input }) => ({\n doubled: (input as { n: number }).n * 2,\n }));\n\n const handle = await workflow.run({ n: 21 });\n const worker = client.newWorker();\n await worker.tick();\n await sleep(100); // wait for background execution\n\n const result = await handle.result();\n expect(result).toEqual({ doubled: 42 });\n });\n });\n});\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function noopFn() {\n // no-op\n}\n"],"names":["randomUUID","afterEach","beforeEach","describe","expect","test","z","BackendPostgres","declareWorkflow","OpenWorkflow","KNEX_GLOBAL_CONFIG","backend","connect","namespaceId","runMigrations","stop","client","workflow","defineWorkflow","name","noopFn","run","docUrl","workerId","claimed","claimWorkflowRun","leaseDurationMs","workflowName","toBe","input","toEqual","schema","object","userId","uuid","count","number","int","positive","handle","cancel","rejects","toThrow","value","not","toBeNull","Error","completeWorkflowRun","workflowRunId","id","output","ok","result","failWorkflowRun","error","message","rescheduled","getWorkflowRun","status","deadline","Date","now","deadlineAt","workflowRun","getTime","version","finishedAt","spec","runWorkflow","implementWorkflow","received","data","worker","newWorker","tick","sleep","specV1","specV2","spec1","spec2","email","doubled","n","ms","Promise","resolve","setTimeout"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/client.test.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { afterEach, beforeEach, describe, expect, test } from \"vitest\";\nimport { z } from \"zod\";\nimport { BackendPostgres } from \".\";\nimport { declareWorkflow, OpenWorkflow } from \"./client\";\nimport { KNEX_GLOBAL_CONFIG } from \"./testing/connection\";\n\ndescribe(\"OpenWorkflow\", () => {\n let backend: BackendPostgres;\n\n beforeEach(async () => {\n backend = new BackendPostgres(KNEX_GLOBAL_CONFIG, {\n namespaceId: randomUUID(),\n runMigrations: false,\n });\n await backend.initialize();\n });\n\n afterEach(async () => {\n await backend.stop();\n });\n\n test(\"enqueues workflow runs via backend\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"enqueue-test\" }, noopFn);\n await workflow.run({ docUrl: \"https://example.com\" });\n\n const workerId = \"enqueue-worker\";\n const claimed = await backend.claimWorkflowRun({\n workerId,\n leaseDurationMs: 1000,\n });\n\n expect(claimed?.workflowName).toBe(\"enqueue-test\");\n expect(claimed?.workerId).toBe(workerId);\n expect(claimed?.input).toEqual({ docUrl: \"https://example.com\" });\n });\n\n describe(\"schema validation\", () => {\n describe(\"Zod schema\", () => {\n const schema = z.object({\n userId: z.uuid(),\n count: z.number().int().positive(),\n });\n\n test(\"accepts valid input\", async () => {\n const client = new OpenWorkflow({ backend });\n const workflow = client.defineWorkflow({ name: \"schema-zod-valid\", schema }, noopFn);\n\n const handle = await workflow.run({\n userId: randomUUID(),\n count: 3,\n });\n\n await handle.cancel();\n });\n\n test(\"rejects invalid input\", async () => {\n const client = new OpenWorkflow({ backend });\n const workflow = client.defineWorkflow({ name: \"schema-zod-invalid\", schema }, noopFn);\n\n await expect(workflow.run({ userId: \"not-a-uuid\", count: 0 } as never)).rejects.toThrow();\n });\n });\n });\n\n test(\"result resolves when workflow succeeds\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"result-success\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n const workerId = \"test-worker\";\n const claimed = await backend.claimWorkflowRun({\n workerId,\n leaseDurationMs: 1000,\n });\n expect(claimed).not.toBeNull();\n if (!claimed) throw new Error(\"workflow run was not claimed\");\n\n await backend.completeWorkflowRun({\n workflowRunId: claimed.id,\n workerId,\n output: { ok: true },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n const result = await handle.result();\n expect(result).toEqual({ ok: true });\n });\n\n test(\"result rejects when workflow fails\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"result-failure\" }, noopFn);\n await workflow.run({ value: 1 });\n\n const workerId = \"test-worker\";\n const claimed = await backend.claimWorkflowRun({\n workerId,\n leaseDurationMs: 1000,\n });\n expect(claimed).not.toBeNull();\n if (!claimed) throw new Error(\"workflow run was not claimed\");\n\n // mark as failed (should reschedule))\n await backend.failWorkflowRun({\n workflowRunId: claimed.id,\n workerId,\n error: { message: \"boom\" },\n });\n\n const rescheduled = await backend.getWorkflowRun({\n workflowRunId: claimed.id,\n });\n expect(rescheduled?.status).toBe(\"pending\");\n expect(rescheduled?.error).toEqual({ message: \"boom\" });\n });\n\n test(\"creates workflow run with deadline\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"deadline-test\" }, noopFn);\n const deadline = new Date(Date.now() + 60_000); // in 1 minute\n const handle = await workflow.run({ value: 1 }, { deadlineAt: deadline });\n\n expect(handle.workflowRun.deadlineAt).not.toBeNull();\n expect(handle.workflowRun.deadlineAt?.getTime()).toBe(deadline.getTime());\n });\n\n test(\"creates workflow run with version\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"versioned-test\", version: \"v2.0\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n expect(handle.workflowRun.version).toBe(\"v2.0\");\n });\n\n test(\"creates workflow run without version\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"unversioned-test\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n expect(handle.workflowRun.version).toBeNull();\n });\n\n test(\"cancels workflow run via handle\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"cancel-test\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n await handle.cancel();\n\n const workflowRun = await backend.getWorkflowRun({\n workflowRunId: handle.workflowRun.id,\n });\n expect(workflowRun?.status).toBe(\"canceled\");\n expect(workflowRun?.finishedAt).not.toBeNull();\n });\n\n describe(\"declareWorkflow / implementWorkflow API\", () => {\n test(\"declareWorkflow returns a spec that can be used to schedule runs\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({ name: \"declare-test\" });\n\n const handle = await client.runWorkflow(spec, { message: \"hello\" });\n expect(handle.workflowRun.workflowName).toBe(\"declare-test\");\n\n await handle.cancel();\n });\n\n test(\"implementWorkflow registers the workflow for worker execution\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({ name: \"implement-test\" });\n client.implementWorkflow(spec, ({ input }) => {\n return { received: input };\n });\n\n const handle = await client.runWorkflow(spec, { data: 42 });\n const worker = client.newWorker();\n await worker.tick();\n await sleep(100); // wait for background execution\n\n const result = await handle.result();\n expect(result).toEqual({ received: { data: 42 } });\n });\n\n test(\"implementWorkflow throws when workflow is already registered\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({ name: \"duplicate-test\" });\n client.implementWorkflow(spec, noopFn);\n\n expect(() => {\n client.implementWorkflow(spec, noopFn);\n }).toThrow('Workflow \"duplicate-test\" is already registered');\n });\n\n test(\"implementWorkflow allows registering different versions of the same workflow\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const specV1 = declareWorkflow({\n name: \"multi-version\",\n version: \"v1\",\n });\n const specV2 = declareWorkflow({\n name: \"multi-version\",\n version: \"v2\",\n });\n\n // no throwing...\n client.implementWorkflow(specV1, noopFn);\n client.implementWorkflow(specV2, noopFn);\n });\n\n test(\"implementWorkflow throws for same name+version combination\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec1 = declareWorkflow({\n name: \"version-duplicate\",\n version: \"v1\",\n });\n const spec2 = declareWorkflow({\n name: \"version-duplicate\",\n version: \"v1\",\n });\n\n client.implementWorkflow(spec1, noopFn);\n\n expect(() => {\n client.implementWorkflow(spec2, noopFn);\n }).toThrow('Workflow \"version-duplicate\" (version: v1) is already registered');\n });\n\n test(\"declareWorkflow with schema validates input on runWorkflow\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const schema = z.object({\n email: z.email(),\n });\n const spec = declareWorkflow({\n name: \"declare-schema-test\",\n schema,\n });\n\n const handle = await client.runWorkflow(spec, {\n email: \"test@example.com\",\n });\n await handle.cancel();\n\n await expect(client.runWorkflow(spec, { email: \"not-an-email\" })).rejects.toThrow();\n });\n\n test(\"declareWorkflow with version sets version on workflow run\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({\n name: \"declare-version-test\",\n version: \"v1.2.3\",\n });\n\n const handle = await client.runWorkflow(spec);\n expect(handle.workflowRun.version).toBe(\"v1.2.3\");\n\n await handle.cancel();\n });\n\n test(\"defineWorkflow wraps declareWorkflow and implementWorkflow\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"define-wrap-test\" }, ({ input }) => ({\n doubled: (input as { n: number }).n * 2,\n }));\n\n const handle = await workflow.run({ n: 21 });\n const worker = client.newWorker();\n await worker.tick();\n await sleep(100); // wait for background execution\n\n const result = await handle.result();\n expect(result).toEqual({ doubled: 42 });\n });\n });\n});\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function noopFn() {\n // no-op\n}\n"],"names":["randomUUID","afterEach","beforeEach","describe","expect","test","z","BackendPostgres","declareWorkflow","OpenWorkflow","KNEX_GLOBAL_CONFIG","backend","namespaceId","runMigrations","initialize","stop","client","workflow","defineWorkflow","name","noopFn","run","docUrl","workerId","claimed","claimWorkflowRun","leaseDurationMs","workflowName","toBe","input","toEqual","schema","object","userId","uuid","count","number","int","positive","handle","cancel","rejects","toThrow","value","not","toBeNull","Error","completeWorkflowRun","workflowRunId","id","output","ok","result","failWorkflowRun","error","message","rescheduled","getWorkflowRun","status","deadline","Date","now","deadlineAt","workflowRun","getTime","version","finishedAt","spec","runWorkflow","implementWorkflow","received","data","worker","newWorker","tick","sleep","specV1","specV2","spec1","spec2","email","doubled","n","ms","Promise","resolve","setTimeout"],"mappings":"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"}
@@ -11,7 +11,7 @@ type Unit = Years | Months | Weeks | Days | Hours | Minutes | Seconds | Millisec
11
11
  type UnitAnyCase = Capitalize<Unit> | Uppercase<Unit> | Lowercase<Unit>;
12
12
  export type DurationString = `${number}` | `${number}${UnitAnyCase}` | `${number} ${UnitAnyCase}`;
13
13
  /**
14
- * Parse a duration string into milliseconds. Exmaples:
14
+ * Parse a duration string into milliseconds. Examples:
15
15
  * - short units: "1ms", "5s", "30m", "2h", "7d", "3w", "1y"
16
16
  * - long units: "1 millisecond", "5 seconds", "30 minutes", "2 hours", "7 days", "3 weeks", "1 year"
17
17
  * @param str - Duration string
@@ -1,6 +1,6 @@
1
1
  import { err, ok } from "./result.js";
2
2
  /**
3
- * Parse a duration string into milliseconds. Exmaples:
3
+ * Parse a duration string into milliseconds. Examples:
4
4
  * - short units: "1ms", "5s", "30m", "2h", "7d", "3w", "1y"
5
5
  * - long units: "1 millisecond", "5 seconds", "30 minutes", "2 hours", "7 days", "3 weeks", "1 year"
6
6
  * @param str - Duration string
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/duration.ts"],"sourcesContent":["import type { Result } from \"./result\";\nimport { err, ok } from \"./result\";\n\ntype Years = \"years\" | \"year\" | \"yrs\" | \"yr\" | \"y\";\ntype Months = \"months\" | \"month\" | \"mo\";\ntype Weeks = \"weeks\" | \"week\" | \"w\";\ntype Days = \"days\" | \"day\" | \"d\";\ntype Hours = \"hours\" | \"hour\" | \"hrs\" | \"hr\" | \"h\";\ntype Minutes = \"minutes\" | \"minute\" | \"mins\" | \"min\" | \"m\";\ntype Seconds = \"seconds\" | \"second\" | \"secs\" | \"sec\" | \"s\";\ntype Milliseconds = \"milliseconds\" | \"millisecond\" | \"msecs\" | \"msec\" | \"ms\";\ntype Unit = Years | Months | Weeks | Days | Hours | Minutes | Seconds | Milliseconds;\ntype UnitAnyCase = Capitalize<Unit> | Uppercase<Unit> | Lowercase<Unit>;\nexport type DurationString = `${number}` | `${number}${UnitAnyCase}` | `${number} ${UnitAnyCase}`;\n\n/**\n * Parse a duration string into milliseconds. Exmaples:\n * - short units: \"1ms\", \"5s\", \"30m\", \"2h\", \"7d\", \"3w\", \"1y\"\n * - long units: \"1 millisecond\", \"5 seconds\", \"30 minutes\", \"2 hours\", \"7 days\", \"3 weeks\", \"1 year\"\n * @param str - Duration string\n * @returns Milliseconds\n */\nexport function parseDuration(str: DurationString): Result<number> {\n if (typeof str !== \"string\") {\n return err(\n new TypeError(`Invalid duration format: expected a string but received ${typeof str}`),\n );\n }\n\n if (str.length === 0) {\n return err(new Error('Invalid duration format: \"\"'));\n }\n\n const match = /^(-?\\.?\\d+(?:\\.\\d+)?)\\s*([a-z]+)?$/i.exec(str);\n\n if (!match?.[1]) {\n return err(new Error(`Invalid duration format: \"${str}\"`));\n }\n\n const numValue = Number.parseFloat(match[1]);\n const unit = match[2]?.toLowerCase() ?? \"ms\"; // default to ms if not provided\n\n const multipliers: Record<string, number> = {\n millisecond: 1,\n milliseconds: 1,\n msec: 1,\n msecs: 1,\n ms: 1,\n second: 1000,\n seconds: 1000,\n sec: 1000,\n secs: 1000,\n s: 1000,\n minute: 60 * 1000,\n minutes: 60 * 1000,\n min: 60 * 1000,\n mins: 60 * 1000,\n m: 60 * 1000,\n hour: 60 * 60 * 1000,\n hours: 60 * 60 * 1000,\n hr: 60 * 60 * 1000,\n hrs: 60 * 60 * 1000,\n h: 60 * 60 * 1000,\n day: 24 * 60 * 60 * 1000,\n days: 24 * 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n week: 7 * 24 * 60 * 60 * 1000,\n weeks: 7 * 24 * 60 * 60 * 1000,\n w: 7 * 24 * 60 * 60 * 1000,\n month: 2_629_800_000,\n months: 2_629_800_000,\n mo: 2_629_800_000,\n year: 31_557_600_000,\n years: 31_557_600_000,\n yr: 31_557_600_000,\n yrs: 31_557_600_000,\n y: 31_557_600_000,\n };\n\n const multiplier = multipliers[unit];\n if (multiplier === undefined) {\n return err(new Error(`Invalid duration format: \"${str}\"`));\n }\n\n return ok(numValue * multiplier);\n}\n"],"names":["err","ok","parseDuration","str","TypeError","length","Error","match","exec","numValue","Number","parseFloat","unit","toLowerCase","multipliers","millisecond","milliseconds","msec","msecs","ms","second","seconds","sec","secs","s","minute","minutes","min","mins","m","hour","hours","hr","hrs","h","day","days","d","week","weeks","w","month","months","mo","year","years","yr","yrs","y","multiplier","undefined"],"mappings":"AACA,SAASA,GAAG,EAAEC,EAAE,QAAQ,cAAW;AAcnC;;;;;;CAMC,GACD,OAAO,SAASC,cAAcC,GAAmB;IAC/C,IAAI,OAAOA,QAAQ,UAAU;QAC3B,OAAOH,IACL,IAAII,UAAU,CAAC,wDAAwD,EAAE,OAAOD,KAAK;IAEzF;IAEA,IAAIA,IAAIE,MAAM,KAAK,GAAG;QACpB,OAAOL,IAAI,IAAIM,MAAM;IACvB;IAEA,MAAMC,QAAQ,sCAAsCC,IAAI,CAACL;IAEzD,IAAI,CAACI,OAAO,CAAC,EAAE,EAAE;QACf,OAAOP,IAAI,IAAIM,MAAM,CAAC,0BAA0B,EAAEH,IAAI,CAAC,CAAC;IAC1D;IAEA,MAAMM,WAAWC,OAAOC,UAAU,CAACJ,KAAK,CAAC,EAAE;IAC3C,MAAMK,OAAOL,KAAK,CAAC,EAAE,EAAEM,iBAAiB,MAAM,gCAAgC;IAE9E,MAAMC,cAAsC;QAC1CC,aAAa;QACbC,cAAc;QACdC,MAAM;QACNC,OAAO;QACPC,IAAI;QACJC,QAAQ;QACRC,SAAS;QACTC,KAAK;QACLC,MAAM;QACNC,GAAG;QACHC,QAAQ,KAAK;QACbC,SAAS,KAAK;QACdC,KAAK,KAAK;QACVC,MAAM,KAAK;QACXC,GAAG,KAAK;QACRC,MAAM,KAAK,KAAK;QAChBC,OAAO,KAAK,KAAK;QACjBC,IAAI,KAAK,KAAK;QACdC,KAAK,KAAK,KAAK;QACfC,GAAG,KAAK,KAAK;QACbC,KAAK,KAAK,KAAK,KAAK;QACpBC,MAAM,KAAK,KAAK,KAAK;QACrBC,GAAG,KAAK,KAAK,KAAK;QAClBC,MAAM,IAAI,KAAK,KAAK,KAAK;QACzBC,OAAO,IAAI,KAAK,KAAK,KAAK;QAC1BC,GAAG,IAAI,KAAK,KAAK,KAAK;QACtBC,OAAO;QACPC,QAAQ;QACRC,IAAI;QACJC,MAAM;QACNC,OAAO;QACPC,IAAI;QACJC,KAAK;QACLC,GAAG;IACL;IAEA,MAAMC,aAAanC,WAAW,CAACF,KAAK;IACpC,IAAIqC,eAAeC,WAAW;QAC5B,OAAOlD,IAAI,IAAIM,MAAM,CAAC,0BAA0B,EAAEH,IAAI,CAAC,CAAC;IAC1D;IAEA,OAAOF,GAAGQ,WAAWwC;AACvB"}
1
+ {"version":3,"sources":["../../src/core/duration.ts"],"sourcesContent":["import type { Result } from \"./result\";\nimport { err, ok } from \"./result\";\n\ntype Years = \"years\" | \"year\" | \"yrs\" | \"yr\" | \"y\";\ntype Months = \"months\" | \"month\" | \"mo\";\ntype Weeks = \"weeks\" | \"week\" | \"w\";\ntype Days = \"days\" | \"day\" | \"d\";\ntype Hours = \"hours\" | \"hour\" | \"hrs\" | \"hr\" | \"h\";\ntype Minutes = \"minutes\" | \"minute\" | \"mins\" | \"min\" | \"m\";\ntype Seconds = \"seconds\" | \"second\" | \"secs\" | \"sec\" | \"s\";\ntype Milliseconds = \"milliseconds\" | \"millisecond\" | \"msecs\" | \"msec\" | \"ms\";\ntype Unit = Years | Months | Weeks | Days | Hours | Minutes | Seconds | Milliseconds;\ntype UnitAnyCase = Capitalize<Unit> | Uppercase<Unit> | Lowercase<Unit>;\nexport type DurationString = `${number}` | `${number}${UnitAnyCase}` | `${number} ${UnitAnyCase}`;\n\n/**\n * Parse a duration string into milliseconds. Examples:\n * - short units: \"1ms\", \"5s\", \"30m\", \"2h\", \"7d\", \"3w\", \"1y\"\n * - long units: \"1 millisecond\", \"5 seconds\", \"30 minutes\", \"2 hours\", \"7 days\", \"3 weeks\", \"1 year\"\n * @param str - Duration string\n * @returns Milliseconds\n */\nexport function parseDuration(str: DurationString): Result<number> {\n if (typeof str !== \"string\") {\n return err(\n new TypeError(`Invalid duration format: expected a string but received ${typeof str}`),\n );\n }\n\n if (str.length === 0) {\n return err(new Error('Invalid duration format: \"\"'));\n }\n\n const match = /^(-?\\.?\\d+(?:\\.\\d+)?)\\s*([a-z]+)?$/i.exec(str);\n\n if (!match?.[1]) {\n return err(new Error(`Invalid duration format: \"${str}\"`));\n }\n\n const numValue = Number.parseFloat(match[1]);\n const unit = match[2]?.toLowerCase() ?? \"ms\"; // default to ms if not provided\n\n const multipliers: Record<string, number> = {\n millisecond: 1,\n milliseconds: 1,\n msec: 1,\n msecs: 1,\n ms: 1,\n second: 1000,\n seconds: 1000,\n sec: 1000,\n secs: 1000,\n s: 1000,\n minute: 60 * 1000,\n minutes: 60 * 1000,\n min: 60 * 1000,\n mins: 60 * 1000,\n m: 60 * 1000,\n hour: 60 * 60 * 1000,\n hours: 60 * 60 * 1000,\n hr: 60 * 60 * 1000,\n hrs: 60 * 60 * 1000,\n h: 60 * 60 * 1000,\n day: 24 * 60 * 60 * 1000,\n days: 24 * 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n week: 7 * 24 * 60 * 60 * 1000,\n weeks: 7 * 24 * 60 * 60 * 1000,\n w: 7 * 24 * 60 * 60 * 1000,\n month: 2_629_800_000,\n months: 2_629_800_000,\n mo: 2_629_800_000,\n year: 31_557_600_000,\n years: 31_557_600_000,\n yr: 31_557_600_000,\n yrs: 31_557_600_000,\n y: 31_557_600_000,\n };\n\n const multiplier = multipliers[unit];\n if (multiplier === undefined) {\n return err(new Error(`Invalid duration format: \"${str}\"`));\n }\n\n return ok(numValue * multiplier);\n}\n"],"names":["err","ok","parseDuration","str","TypeError","length","Error","match","exec","numValue","Number","parseFloat","unit","toLowerCase","multipliers","millisecond","milliseconds","msec","msecs","ms","second","seconds","sec","secs","s","minute","minutes","min","mins","m","hour","hours","hr","hrs","h","day","days","d","week","weeks","w","month","months","mo","year","years","yr","yrs","y","multiplier","undefined"],"mappings":"AACA,SAASA,GAAG,EAAEC,EAAE,QAAQ,cAAW;AAcnC;;;;;;CAMC,GACD,OAAO,SAASC,cAAcC,GAAmB;IAC/C,IAAI,OAAOA,QAAQ,UAAU;QAC3B,OAAOH,IACL,IAAII,UAAU,CAAC,wDAAwD,EAAE,OAAOD,KAAK;IAEzF;IAEA,IAAIA,IAAIE,MAAM,KAAK,GAAG;QACpB,OAAOL,IAAI,IAAIM,MAAM;IACvB;IAEA,MAAMC,QAAQ,sCAAsCC,IAAI,CAACL;IAEzD,IAAI,CAACI,OAAO,CAAC,EAAE,EAAE;QACf,OAAOP,IAAI,IAAIM,MAAM,CAAC,0BAA0B,EAAEH,IAAI,CAAC,CAAC;IAC1D;IAEA,MAAMM,WAAWC,OAAOC,UAAU,CAACJ,KAAK,CAAC,EAAE;IAC3C,MAAMK,OAAOL,KAAK,CAAC,EAAE,EAAEM,iBAAiB,MAAM,gCAAgC;IAE9E,MAAMC,cAAsC;QAC1CC,aAAa;QACbC,cAAc;QACdC,MAAM;QACNC,OAAO;QACPC,IAAI;QACJC,QAAQ;QACRC,SAAS;QACTC,KAAK;QACLC,MAAM;QACNC,GAAG;QACHC,QAAQ,KAAK;QACbC,SAAS,KAAK;QACdC,KAAK,KAAK;QACVC,MAAM,KAAK;QACXC,GAAG,KAAK;QACRC,MAAM,KAAK,KAAK;QAChBC,OAAO,KAAK,KAAK;QACjBC,IAAI,KAAK,KAAK;QACdC,KAAK,KAAK,KAAK;QACfC,GAAG,KAAK,KAAK;QACbC,KAAK,KAAK,KAAK,KAAK;QACpBC,MAAM,KAAK,KAAK,KAAK;QACrBC,GAAG,KAAK,KAAK,KAAK;QAClBC,MAAM,IAAI,KAAK,KAAK,KAAK;QACzBC,OAAO,IAAI,KAAK,KAAK,KAAK;QAC1BC,GAAG,IAAI,KAAK,KAAK,KAAK;QACtBC,OAAO;QACPC,QAAQ;QACRC,IAAI;QACJC,MAAM;QACNC,OAAO;QACPC,IAAI;QACJC,KAAK;QACLC,GAAG;IACL;IAEA,MAAMC,aAAanC,WAAW,CAACF,KAAK;IACpC,IAAIqC,eAAeC,WAAW;QAC5B,OAAOlD,IAAI,IAAIM,MAAM,CAAC,0BAA0B,EAAEH,IAAI,CAAC,CAAC;IAC1D;IAEA,OAAOF,GAAGQ,WAAWwC;AACvB"}
@@ -72,7 +72,8 @@ export declare function validateInput<RunInput, Input>(schema: StandardSchemaV1<
72
72
  /**
73
73
  * Check if a workflow run status represents a terminal state.
74
74
  * @param status - The workflow run status
75
- * @returns True if the status is terminal (completed, failed, or canceled)
75
+ * @returns True if the status is terminal (succeeded, completed, failed, or canceled).
76
+ * Note: 'succeeded' is deprecated in favor of 'completed'.
76
77
  */
77
78
  export declare function isTerminalStatus(status: string): status is "succeeded" | "completed" | "failed" | "canceled";
78
79
  //# sourceMappingURL=workflow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/core/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,SAAS,GACT,UAAU,GACV,WAAW,GACX,WAAW,GACX,QAAQ,GACR,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,OAAO,EAAE,QAAQ,IAAI,OAAO,SAAS,gBAAgB,GACzE,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,GACpC,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,IAAI,OAAO,SAAS,gBAAgB,GAC1E,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,GACrC,QAAQ,CAAC;AAEb;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElG;;GAEG;AACH,eAAO,MAAM,8BAA8B;IACzC,kDAAkD;;IAElD,0CAA0C;;CAElC,CAAC;AAEX;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,KAAK,EACjD,MAAM,EAAE,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS,EAC5D,KAAK,EAAE,QAAQ,GAAG,SAAS,GAC1B,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CA4BlC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAI7D"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/core/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,SAAS,GACT,UAAU,GACV,WAAW,GACX,WAAW,GACX,QAAQ,GACR,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,OAAO,EAAE,QAAQ,IAAI,OAAO,SAAS,gBAAgB,GACzE,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,GACpC,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,IAAI,OAAO,SAAS,gBAAgB,GAC1E,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,GACrC,QAAQ,CAAC;AAEb;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElG;;GAEG;AACH,eAAO,MAAM,8BAA8B;IACzC,kDAAkD;;IAElD,0CAA0C;;CAElC,CAAC;AAEX;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,KAAK,EACjD,MAAM,EAAE,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS,EAC5D,KAAK,EAAE,QAAQ,GAAG,SAAS,GAC1B,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CA4BlC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAI7D"}
@@ -38,7 +38,8 @@
38
38
  /**
39
39
  * Check if a workflow run status represents a terminal state.
40
40
  * @param status - The workflow run status
41
- * @returns True if the status is terminal (completed, failed, or canceled)
41
+ * @returns True if the status is terminal (succeeded, completed, failed, or canceled).
42
+ * Note: 'succeeded' is deprecated in favor of 'completed'.
42
43
  */ export function isTerminalStatus(status) {
43
44
  return status === "succeeded" || status === "completed" || status === "failed" || status === "canceled";
44
45
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/workflow.ts"],"sourcesContent":["import type { SerializedError } from \"./error\";\nimport type { JsonValue } from \"./json\";\nimport type { StandardSchemaV1 } from \"./schema\";\n\n/**\n * Status of a workflow run through its lifecycle.\n */\nexport type WorkflowRunStatus =\n | \"pending\"\n | \"running\"\n | \"sleeping\"\n | \"succeeded\" // deprecated in favor of 'completed'\n | \"completed\"\n | \"failed\"\n | \"canceled\";\n\n/**\n * WorkflowRun represents a single execution instance of a workflow.\n */\nexport interface WorkflowRun {\n namespaceId: string;\n id: string;\n workflowName: string;\n version: string | null;\n status: WorkflowRunStatus;\n idempotencyKey: string | null;\n config: JsonValue; // user-defined config\n context: JsonValue | null; // runtime execution metadata\n input: JsonValue | null;\n output: JsonValue | null;\n error: SerializedError | null;\n attempts: number;\n parentStepAttemptNamespaceId: string | null;\n parentStepAttemptId: string | null;\n workerId: string | null;\n availableAt: Date | null;\n deadlineAt: Date | null;\n startedAt: Date | null;\n finishedAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\n/**\n * Infers the input type from a Standard Schema.\n */\nexport type SchemaInput<TSchema, Fallback> = TSchema extends StandardSchemaV1\n ? StandardSchemaV1.InferInput<TSchema>\n : Fallback;\n\n/**\n * Infers the output type from a Standard Schema.\n */\nexport type SchemaOutput<TSchema, Fallback> = TSchema extends StandardSchemaV1\n ? StandardSchemaV1.InferOutput<TSchema>\n : Fallback;\n\n/**\n * Result of input validation - either success with a value or failure with an\n * error message.\n */\nexport type ValidationResult<T> = { success: true; value: T } | { success: false; error: string };\n\n/**\n * Default configuration for result polling when awaiting workflow completion.\n */\nexport const DEFAULT_WORKFLOW_RESULT_CONFIG = {\n /** Polling interval in milliseconds (1 second) */\n pollIntervalMs: 1000,\n /** Timeout in milliseconds (5 minutes) */\n timeoutMs: 5 * 60 * 1000,\n} as const;\n\n/**\n * Validate input against a Standard Schema. Pure async function that validates\n * input and returns a ValidationResult.\n * @param schema - The Standard Schema to validate against (or null/undefined\n * for no validation)\n * @param input - The input value to validate\n * @returns A ValidationResult containing either the validated value or an error\n * message\n */\nexport async function validateInput<RunInput, Input>(\n schema: StandardSchemaV1<RunInput, Input> | null | undefined,\n input: RunInput | undefined,\n): Promise<ValidationResult<Input>> {\n // No schema means no validation - pass through as-is\n if (!schema) {\n return {\n success: true,\n value: input as unknown as Input,\n };\n }\n\n // Validate using Standard Schema v1 protocol https://standardschema.dev\n const result = schema[\"~standard\"].validate(input);\n const resolved = await Promise.resolve(result);\n\n if (resolved.issues) {\n const messages =\n resolved.issues.length > 0\n ? resolved.issues.map((issue) => issue.message).join(\"; \")\n : \"Validation failed\";\n return {\n success: false,\n error: messages,\n };\n }\n\n return {\n success: true,\n value: resolved.value,\n };\n}\n\n/**\n * Check if a workflow run status represents a terminal state.\n * @param status - The workflow run status\n * @returns True if the status is terminal (completed, failed, or canceled)\n */\nexport function isTerminalStatus(\n status: string,\n): status is \"succeeded\" | \"completed\" | \"failed\" | \"canceled\" {\n return (\n status === \"succeeded\" || status === \"completed\" || status === \"failed\" || status === \"canceled\"\n );\n}\n"],"names":["DEFAULT_WORKFLOW_RESULT_CONFIG","pollIntervalMs","timeoutMs","validateInput","schema","input","success","value","result","validate","resolved","Promise","resolve","issues","messages","length","map","issue","message","join","error","isTerminalStatus","status"],"mappings":"AA+DA;;CAEC,GACD,OAAO,MAAMA,iCAAiC;IAC5C,gDAAgD,GAChDC,gBAAgB;IAChB,wCAAwC,GACxCC,WAAW,IAAI,KAAK;AACtB,EAAW;AAEX;;;;;;;;CAQC,GACD,OAAO,eAAeC,cACpBC,MAA4D,EAC5DC,KAA2B;IAE3B,qDAAqD;IACrD,IAAI,CAACD,QAAQ;QACX,OAAO;YACLE,SAAS;YACTC,OAAOF;QACT;IACF;IAEA,wEAAwE;IACxE,MAAMG,SAASJ,MAAM,CAAC,YAAY,CAACK,QAAQ,CAACJ;IAC5C,MAAMK,WAAW,MAAMC,QAAQC,OAAO,CAACJ;IAEvC,IAAIE,SAASG,MAAM,EAAE;QACnB,MAAMC,WACJJ,SAASG,MAAM,CAACE,MAAM,GAAG,IACrBL,SAASG,MAAM,CAACG,GAAG,CAAC,CAACC,QAAUA,MAAMC,OAAO,EAAEC,IAAI,CAAC,QACnD;QACN,OAAO;YACLb,SAAS;YACTc,OAAON;QACT;IACF;IAEA,OAAO;QACLR,SAAS;QACTC,OAAOG,SAASH,KAAK;IACvB;AACF;AAEA;;;;CAIC,GACD,OAAO,SAASc,iBACdC,MAAc;IAEd,OACEA,WAAW,eAAeA,WAAW,eAAeA,WAAW,YAAYA,WAAW;AAE1F"}
1
+ {"version":3,"sources":["../../src/core/workflow.ts"],"sourcesContent":["import type { SerializedError } from \"./error\";\nimport type { JsonValue } from \"./json\";\nimport type { StandardSchemaV1 } from \"./schema\";\n\n/**\n * Status of a workflow run through its lifecycle.\n */\nexport type WorkflowRunStatus =\n | \"pending\"\n | \"running\"\n | \"sleeping\"\n | \"succeeded\" // deprecated in favor of 'completed'\n | \"completed\"\n | \"failed\"\n | \"canceled\";\n\n/**\n * WorkflowRun represents a single execution instance of a workflow.\n */\nexport interface WorkflowRun {\n namespaceId: string;\n id: string;\n workflowName: string;\n version: string | null;\n status: WorkflowRunStatus;\n idempotencyKey: string | null;\n config: JsonValue; // user-defined config\n context: JsonValue | null; // runtime execution metadata\n input: JsonValue | null;\n output: JsonValue | null;\n error: SerializedError | null;\n attempts: number;\n parentStepAttemptNamespaceId: string | null;\n parentStepAttemptId: string | null;\n workerId: string | null;\n availableAt: Date | null;\n deadlineAt: Date | null;\n startedAt: Date | null;\n finishedAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\n/**\n * Infers the input type from a Standard Schema.\n */\nexport type SchemaInput<TSchema, Fallback> = TSchema extends StandardSchemaV1\n ? StandardSchemaV1.InferInput<TSchema>\n : Fallback;\n\n/**\n * Infers the output type from a Standard Schema.\n */\nexport type SchemaOutput<TSchema, Fallback> = TSchema extends StandardSchemaV1\n ? StandardSchemaV1.InferOutput<TSchema>\n : Fallback;\n\n/**\n * Result of input validation - either success with a value or failure with an\n * error message.\n */\nexport type ValidationResult<T> = { success: true; value: T } | { success: false; error: string };\n\n/**\n * Default configuration for result polling when awaiting workflow completion.\n */\nexport const DEFAULT_WORKFLOW_RESULT_CONFIG = {\n /** Polling interval in milliseconds (1 second) */\n pollIntervalMs: 1000,\n /** Timeout in milliseconds (5 minutes) */\n timeoutMs: 5 * 60 * 1000,\n} as const;\n\n/**\n * Validate input against a Standard Schema. Pure async function that validates\n * input and returns a ValidationResult.\n * @param schema - The Standard Schema to validate against (or null/undefined\n * for no validation)\n * @param input - The input value to validate\n * @returns A ValidationResult containing either the validated value or an error\n * message\n */\nexport async function validateInput<RunInput, Input>(\n schema: StandardSchemaV1<RunInput, Input> | null | undefined,\n input: RunInput | undefined,\n): Promise<ValidationResult<Input>> {\n // No schema means no validation - pass through as-is\n if (!schema) {\n return {\n success: true,\n value: input as unknown as Input,\n };\n }\n\n // Validate using Standard Schema v1 protocol https://standardschema.dev\n const result = schema[\"~standard\"].validate(input);\n const resolved = await Promise.resolve(result);\n\n if (resolved.issues) {\n const messages =\n resolved.issues.length > 0\n ? resolved.issues.map((issue) => issue.message).join(\"; \")\n : \"Validation failed\";\n return {\n success: false,\n error: messages,\n };\n }\n\n return {\n success: true,\n value: resolved.value,\n };\n}\n\n/**\n * Check if a workflow run status represents a terminal state.\n * @param status - The workflow run status\n * @returns True if the status is terminal (succeeded, completed, failed, or canceled).\n * Note: 'succeeded' is deprecated in favor of 'completed'.\n */\nexport function isTerminalStatus(\n status: string,\n): status is \"succeeded\" | \"completed\" | \"failed\" | \"canceled\" {\n return (\n status === \"succeeded\" || status === \"completed\" || status === \"failed\" || status === \"canceled\"\n );\n}\n"],"names":["DEFAULT_WORKFLOW_RESULT_CONFIG","pollIntervalMs","timeoutMs","validateInput","schema","input","success","value","result","validate","resolved","Promise","resolve","issues","messages","length","map","issue","message","join","error","isTerminalStatus","status"],"mappings":"AA+DA;;CAEC,GACD,OAAO,MAAMA,iCAAiC;IAC5C,gDAAgD,GAChDC,gBAAgB;IAChB,wCAAwC,GACxCC,WAAW,IAAI,KAAK;AACtB,EAAW;AAEX;;;;;;;;CAQC,GACD,OAAO,eAAeC,cACpBC,MAA4D,EAC5DC,KAA2B;IAE3B,qDAAqD;IACrD,IAAI,CAACD,QAAQ;QACX,OAAO;YACLE,SAAS;YACTC,OAAOF;QACT;IACF;IAEA,wEAAwE;IACxE,MAAMG,SAASJ,MAAM,CAAC,YAAY,CAACK,QAAQ,CAACJ;IAC5C,MAAMK,WAAW,MAAMC,QAAQC,OAAO,CAACJ;IAEvC,IAAIE,SAASG,MAAM,EAAE;QACnB,MAAMC,WACJJ,SAASG,MAAM,CAACE,MAAM,GAAG,IACrBL,SAASG,MAAM,CAACG,GAAG,CAAC,CAACC,QAAUA,MAAMC,OAAO,EAAEC,IAAI,CAAC,QACnD;QACN,OAAO;YACLb,SAAS;YACTc,OAAON;QACT;IACF;IAEA,OAAO;QACLR,SAAS;QACTC,OAAOG,SAASH,KAAK;IACvB;AACF;AAEA;;;;;CAKC,GACD,OAAO,SAASc,iBACdC,MAAc;IAEd,OACEA,WAAW,eAAeA,WAAW,eAAeA,WAAW,YAAYA,WAAW;AAE1F"}
@@ -13,19 +13,18 @@ interface BackendPostgresOptions {
13
13
  * Manages a connection to a Postgres database for workflow operations.
14
14
  */
15
15
  export declare class BackendPostgres implements Backend {
16
- private knex;
16
+ private config;
17
17
  private namespaceId;
18
18
  private usePubSub;
19
19
  private pubsub;
20
- private constructor();
20
+ private initialized;
21
+ private runMigrations;
22
+ private _knex;
23
+ private get knex();
24
+ constructor(config: Knex.Config, options?: BackendPostgresOptions);
25
+ initialize(): Promise<void>;
21
26
  subscribe(callback: OnSubscribed): Promise<void>;
22
27
  publish(payload?: string): Promise<void>;
23
- /**
24
- * Create and initialize a new BackendPostgres instance. This will
25
- * automatically run migrations on startup unless `runMigrations` is set to
26
- * false.
27
- */
28
- static connect(dbConf: Knex.Config, options?: BackendPostgresOptions): Promise<BackendPostgres>;
29
28
  stop(): Promise<void>;
30
29
  createWorkflowRun(params: CreateWorkflowRunParams): Promise<WorkflowRun>;
31
30
  getWorkflowRun(params: GetWorkflowRunParams): Promise<WorkflowRun | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/database/backend.ts"],"names":[],"mappings":"AACA,OAAa,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAE5B,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,UAAU,CAAC;AAE7D,eAAO,MAAM,sBAAsB,EAAG,WAAoB,CAAC;AAG3D,UAAU,sBAAsB;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,OAAO;IAC7C,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,MAAM,CAA+B;IAE7C,OAAO;IAMD,SAAS,CAAC,QAAQ,EAAE,YAAY;IAYhC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C;;;;OAIG;WACU,OAAO,CAClB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,eAAe,CAAC;IAmCrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IA8BxE,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAkCzE,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAyB/F,OAAO,CAAC,0BAA0B;IAkB5B,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAwD7E,sBAAsB,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,WAAW,CAAC;IAqBlF,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBtE,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,WAAW,CAAC;IA0B5E,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;IA4CpE,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IA4CxE,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IA0BxE,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAWzE,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAyB/F,OAAO,CAAC,0BAA0B;IAmBlC,OAAO,CAAC,wBAAwB;IAyC1B,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,WAAW,CAAC;IA6B5E,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;CA4B3E;AAED;;;;;GAKG;AACH,UAAU,MAAM;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AASD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOnD"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/database/backend.ts"],"names":[],"mappings":"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"}