Skip to content

Commit 7bd4e82

Browse files
authored
add TestRunner & SingleRunner modules (#5827)
1 parent 1ebd493 commit 7bd4e82

File tree

6 files changed

+106
-1
lines changed

6 files changed

+106
-1
lines changed

.changeset/common-hands-cough.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@effect/workflow": minor
3+
---
4+
5+
remove schedule option from Activity.retry

.changeset/gentle-humans-matter.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
"@effect/cluster": patch
3+
---
4+
5+
add TestRunner & SingleRunner modules
6+
7+
- `TestRunner` allows you to run a in-memory cluster for testing purposes.
8+
9+
- `SingleRunner` allows you to run a single node cluster simple deployment
10+
scenarios.
11+
- Message storage is backed by a SQL database
12+
- Multiple nodes are not supported
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* @since 1.0.0
3+
*/
4+
import type * as SqlClient from "@effect/sql/SqlClient"
5+
import type * as ConfigError from "effect/ConfigError"
6+
import * as Layer from "effect/Layer"
7+
import type * as MessageStorage from "./MessageStorage.js"
8+
import * as RunnerHealth from "./RunnerHealth.js"
9+
import * as Runners from "./Runners.js"
10+
import * as RunnerStorage from "./RunnerStorage.js"
11+
import * as Sharding from "./Sharding.js"
12+
import * as ShardingConfig from "./ShardingConfig.js"
13+
import * as SqlMessageStorage from "./SqlMessageStorage.js"
14+
import * as SqlRunnerStorage from "./SqlRunnerStorage.js"
15+
16+
/**
17+
* A sql backed single-node cluster, that can be used for running durable
18+
* entities and workflows.
19+
*
20+
* @since 1.0.0
21+
* @category Layers
22+
*/
23+
export const layer = (options?: {
24+
readonly shardingConfig?: Partial<ShardingConfig.ShardingConfig["Type"]> | undefined
25+
readonly runnerStorage?: "memory" | "sql" | undefined
26+
}): Layer.Layer<
27+
| Sharding.Sharding
28+
| Runners.Runners
29+
| MessageStorage.MessageStorage,
30+
ConfigError.ConfigError,
31+
SqlClient.SqlClient
32+
> =>
33+
Sharding.layer.pipe(
34+
Layer.provideMerge(Runners.layerNoop),
35+
Layer.provideMerge(SqlMessageStorage.layer),
36+
Layer.provide([
37+
options?.runnerStorage === "memory" ? RunnerStorage.layerMemory : Layer.orDie(SqlRunnerStorage.layer),
38+
RunnerHealth.layerNoop
39+
]),
40+
Layer.provide(ShardingConfig.layerFromEnv(options?.shardingConfig))
41+
)

packages/cluster/src/TestRunner.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* @since 1.0.0
3+
*/
4+
import * as Layer from "effect/Layer"
5+
import * as MessageStorage from "./MessageStorage.js"
6+
import * as RunnerHealth from "./RunnerHealth.js"
7+
import * as Runners from "./Runners.js"
8+
import * as RunnerStorage from "./RunnerStorage.js"
9+
import * as Sharding from "./Sharding.js"
10+
import * as ShardingConfig from "./ShardingConfig.js"
11+
12+
/**
13+
* An in-memory cluster that can be used for testing purposes.
14+
*
15+
* MessageStorage is backed by an in-memory driver, and RunnerStorage is backed
16+
* by an in-memory driver.
17+
*
18+
* @since 1.0.0
19+
* @category Layers
20+
*/
21+
export const layer: Layer.Layer<
22+
Sharding.Sharding | Runners.Runners | MessageStorage.MessageStorage | MessageStorage.MemoryDriver
23+
> = Sharding.layer.pipe(
24+
Layer.provideMerge(Runners.layerNoop),
25+
Layer.provideMerge(MessageStorage.layerMemory),
26+
Layer.provide([RunnerStorage.layerMemory, RunnerHealth.layerNoop]),
27+
Layer.provide(ShardingConfig.layer())
28+
)

packages/cluster/src/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,11 @@ export * as ShardingConfig from "./ShardingConfig.js"
148148
*/
149149
export * as ShardingRegistrationEvent from "./ShardingRegistrationEvent.js"
150150

151+
/**
152+
* @since 1.0.0
153+
*/
154+
export * as SingleRunner from "./SingleRunner.js"
155+
151156
/**
152157
* @since 1.0.0
153158
*/
@@ -177,3 +182,8 @@ export * as SqlMessageStorage from "./SqlMessageStorage.js"
177182
* @since 1.0.0
178183
*/
179184
export * as SqlRunnerStorage from "./SqlRunnerStorage.js"
185+
186+
/**
187+
* @since 1.0.0
188+
*/
189+
export * as TestRunner from "./TestRunner.js"

packages/workflow/src/Activity.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { dual } from "effect/Function"
1111
import * as Schedule from "effect/Schedule"
1212
import * as Schema from "effect/Schema"
1313
import type { Scope } from "effect/Scope"
14+
import type * as Types from "effect/Types"
1415
import * as DurableDeferred from "./DurableDeferred.js"
1516
import { makeHashDigest } from "./internal/crypto.js"
1617
import * as Workflow from "./Workflow.js"
@@ -148,7 +149,15 @@ const retryOnInterrupt = (
148149
* @since 1.0.0
149150
* @category Error handling
150151
*/
151-
export const retry: typeof Effect.retry = dual(
152+
export const retry: {
153+
<E, O extends Types.NoExcessProperties<Omit<Effect.Retry.Options<E>, "schedule">, O>>(
154+
options: O
155+
): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Retry.Return<R, E, A, O>
156+
<A, E, R, O extends Types.NoExcessProperties<Omit<Effect.Retry.Options<E>, "schedule">, O>>(
157+
self: Effect.Effect<A, E, R>,
158+
options: O
159+
): Effect.Retry.Return<R, E, A, O>
160+
} = dual(
152161
2,
153162
(effect: Effect.Effect<any, any, any>, options: {}) =>
154163
Effect.suspend(() => {

0 commit comments

Comments
 (0)