Skip to content

Commit 1858f0c

Browse files
authored
add test workflow (#242)
1 parent c8becea commit 1858f0c

File tree

14 files changed

+555
-455
lines changed

14 files changed

+555
-455
lines changed

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
3+
}

package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@
2121
"@babel/plugin-transform-modules-commonjs": "^7.27.1",
2222
"@effect/build-utils": "^0.8.3",
2323
"@effect/eslint-plugin": "^0.3.2",
24-
"@effect/language-service": "^0.17.1",
24+
"@effect/language-service": "^0.19.0",
2525
"@eslint/js": "^9.28.0",
26-
"@types/node": "^22.15.29",
27-
"@vitest/coverage-v8": "^3.2.1",
28-
"@vitest/expect": "^3.2.1",
26+
"@types/node": "^22.15.30",
27+
"@vitest/coverage-v8": "^3.2.2",
28+
"@vitest/expect": "^3.2.2",
2929
"ast-types": "^0.14.2",
3030
"babel-plugin-annotate-pure-calls": "^0.5.0",
3131
"eslint": "^9.28.0",
32-
"eslint-import-resolver-typescript": "^4.4.2",
33-
"eslint-plugin-import-x": "^4.15.0",
32+
"eslint-import-resolver-typescript": "^4.4.3",
33+
"eslint-plugin-import-x": "^4.15.1",
3434
"eslint-plugin-local-rules": "^3.0.2",
3535
"eslint-plugin-simple-import-sort": "^12.1.1",
3636
"eslint-plugin-sort-destructure-keys": "^2.0.0",
@@ -42,7 +42,7 @@
4242
"typescript": "^5.8.3",
4343
"typescript-eslint": "^8.33.1",
4444
"vite": "^6.3.5",
45-
"vitest": "^3.2.1"
45+
"vitest": "^3.2.2"
4646
},
4747
"pnpm": {
4848
"patchedDependencies": {

packages/discord-bot/package.json

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,24 @@
1010
"@chat/discord": "workspace:*",
1111
"@chat/domain": "workspace:*",
1212
"@chat/shared": "workspace:*",
13-
"@effect/ai": "^0.18.6",
14-
"@effect/ai-openai": "^0.21.6",
15-
"@effect/cluster": "^0.38.0",
16-
"@effect/experimental": "^0.48.5",
17-
"@effect/language-service": "^0.17.1",
18-
"@effect/opentelemetry": "^0.50.5",
19-
"@effect/platform": "^0.84.5",
20-
"@effect/platform-node": "^0.85.0",
13+
"@effect/ai": "^0.18.9",
14+
"@effect/ai-openai": "^0.21.9",
15+
"@effect/cluster": "^0.38.5",
16+
"@effect/experimental": "^0.48.8",
17+
"@effect/language-service": "^0.19.0",
18+
"@effect/opentelemetry": "^0.50.7",
19+
"@effect/platform": "^0.84.7",
20+
"@effect/platform-node": "^0.85.5",
2121
"@octokit/plugin-rest-endpoint-methods": "^16.0.0",
2222
"@octokit/types": "^14.1.0",
23-
"@types/node": "^22.15.29",
23+
"@types/node": "^22.15.30",
2424
"dfx": "^0.120.0",
25-
"effect": "^3.16.3",
25+
"effect": "^3.16.4",
2626
"fuzzysort": "^3.1.0",
2727
"html-entities": "^2.6.0",
2828
"octokit": "^5.0.3"
29+
},
30+
"dependencies": {
31+
"@effect/workflow": "^0.1.4"
2932
}
3033
}

packages/discord-bot/src/Cluster.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { SqlClientLayer } from "@chat/shared/Sql"
2-
import { RunnerAddress } from "@effect/cluster"
2+
import type { Runners, Sharding } from "@effect/cluster"
3+
import { ClusterWorkflowEngine, RunnerAddress } from "@effect/cluster"
34
import { NodeClusterRunnerSocket } from "@effect/platform-node"
5+
import type { WorkflowEngine } from "@effect/workflow"
46
import { Config, Effect, Layer } from "effect"
57

6-
export const ClusterLayer = Layer.unwrapEffect(
8+
const ShardingLayer = Layer.unwrapEffect(
79
Effect.gen(function*() {
810
const shardManagerHost = yield* Config.string("SHARD_MANAGER_HOST").pipe(
911
Config.withDefault("localhost")
@@ -21,3 +23,9 @@ export const ClusterLayer = Layer.unwrapEffect(
2123
Layer.provide(SqlClientLayer),
2224
Layer.orDie
2325
)
26+
27+
export const ClusterLayer: Layer.Layer<
28+
Sharding.Sharding | Runners.Runners | WorkflowEngine.WorkflowEngine
29+
> = ClusterWorkflowEngine.layer.pipe(
30+
Layer.provideMerge(ShardingLayer)
31+
) as any

packages/discord-bot/src/MessageLogger.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { DiscordGatewayLayer } from "@chat/discord/DiscordGateway"
22
import { MessageLogger } from "@chat/domain/MessageLogger"
3+
import { MessageWorkflow } from "@chat/domain/MessageWorkflow"
34
import { DiscordGateway } from "dfx/DiscordGateway"
45
import { Effect, Layer } from "effect"
56
import { ChannelsCache } from "./ChannelsCache.ts"
@@ -29,6 +30,12 @@ const make = Effect.gen(function*() {
2930
author: message.author.username,
3031
message: message.content
3132
})
33+
34+
yield* MessageWorkflow.execute({
35+
id: message.id,
36+
message: message.content,
37+
author: message.author.username
38+
}, { discard: true })
3239
},
3340
(effect, message) =>
3441
Effect.withSpan(effect, "MessageLogger.handle", {

packages/discord/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
"./*": "./src/*.ts"
1010
},
1111
"dependencies": {
12-
"@effect/platform": "^0.84.5",
13-
"@effect/platform-node": "^0.85.0",
12+
"@effect/platform": "^0.84.7",
13+
"@effect/platform-node": "^0.85.5",
1414
"dfx": "^0.120.0",
15-
"effect": "^3.16.3"
15+
"effect": "^3.16.4"
1616
}
1717
}

packages/domain/package.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
"./*": "./src/*.ts"
1010
},
1111
"dependencies": {
12-
"@effect/ai": "^0.18.6",
13-
"@effect/cluster": "^0.38.0",
14-
"@effect/rpc": "^0.61.5",
15-
"@effect/sql": "^0.37.5",
16-
"effect": "^3.16.3"
12+
"@effect/ai": "^0.18.9",
13+
"@effect/cluster": "^0.38.5",
14+
"@effect/rpc": "^0.61.7",
15+
"@effect/sql": "^0.37.8",
16+
"@effect/workflow": "^0.1.4",
17+
"effect": "^3.16.4"
1718
}
1819
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Workflow } from "@effect/workflow"
2+
import { Schema } from "effect"
3+
4+
export const MessageWorkflow = Workflow.make({
5+
name: "MessageWorkflow",
6+
payload: {
7+
id: Schema.String,
8+
message: Schema.String,
9+
author: Schema.String
10+
},
11+
idempotencyKey: ({ id }) => id
12+
})

packages/runner/package.json

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,18 @@
1010
"@chat/discord": "workspace:*",
1111
"@chat/domain": "workspace:*",
1212
"@chat/shared": "workspace:*",
13-
"@effect/ai": "^0.18.6",
14-
"@effect/ai-openai": "^0.21.6",
15-
"@effect/cluster": "^0.38.0",
16-
"@effect/platform": "^0.84.5",
17-
"@effect/platform-node": "^0.85.0",
18-
"@effect/rpc": "^0.61.5",
19-
"@effect/sql": "^0.37.5",
20-
"@effect/sql-pg": "^0.38.5",
13+
"@effect/ai": "^0.18.9",
14+
"@effect/ai-openai": "^0.21.9",
15+
"@effect/cluster": "^0.38.5",
16+
"@effect/platform": "^0.84.7",
17+
"@effect/platform-node": "^0.85.5",
18+
"@effect/rpc": "^0.61.7",
19+
"@effect/sql": "^0.37.8",
20+
"@effect/sql-pg": "^0.38.8",
2121
"dfx": "^0.120.0",
22-
"effect": "^3.16.3"
22+
"effect": "^3.16.4"
23+
},
24+
"dependencies": {
25+
"@effect/workflow": "^0.1.4"
2326
}
2427
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { MessageWorkflow } from "@chat/domain/MessageWorkflow"
2+
import { Activity, DurableClock } from "@effect/workflow"
3+
import { Effect } from "effect"
4+
5+
export const MessageWorkflowLayer = MessageWorkflow.toLayer(
6+
Effect.fnUntraced(
7+
function*({ author }, _executionId) {
8+
yield* Effect.log("Running")
9+
10+
yield* DurableClock.sleep({
11+
name: "Wait 1 day",
12+
duration: "1 day"
13+
})
14+
15+
yield* Activity.make({
16+
name: "TestActivity",
17+
execute: Effect.log("Executing TestActivity")
18+
}).pipe(
19+
MessageWorkflow.withCompensation(Effect.fn(function*() {
20+
yield* Effect.log("Compensating TestActivity")
21+
}))
22+
)
23+
24+
if (author === "timsmart") {
25+
return yield* Effect.die("TimSmart is not allowed to send messages")
26+
}
27+
28+
yield* Effect.log("Done")
29+
},
30+
(effect, { author, id, message }, executionId) =>
31+
Effect.annotateLogs(effect, {
32+
workflow: "MessageWorkflow",
33+
id,
34+
message,
35+
author,
36+
executionId
37+
})
38+
)
39+
)

0 commit comments

Comments
 (0)