Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion examples/effect-worker-v2/src/jobs/basic-debounce.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ export const debounceExample = Debounce.make({
Effect.gen(function* () {
const state = yield* ctx.state;
const eventCount = yield* ctx.eventCount;

yield* Effect.tryPromise(() => fetch("http://localhost:3000/api/health"));
// yield* Effect.fail("Debounce job failed");
yield* Effect.log(
`Debounce flushed! Events: ${eventCount}, Last action: ${state?.actionId}, Reason: ${ctx.flushReason}`,
);
Expand Down
2 changes: 1 addition & 1 deletion examples/effect-worker-v2/src/jobs/basic-task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export const basicTask = Task.make({
currentRun: 0,
});

yield* ctx.schedule(Date.now() + 5000);
yield* ctx.schedule(Date.now() + 200);
}
}),

Expand Down
12 changes: 9 additions & 3 deletions examples/effect-worker-v2/src/jobs/heartbeat.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Continuous } from "@durable-effect/jobs";
import { Effect, Schema } from "effect";
import { Duration, Effect, Schema } from "effect";

// =============================================================================
// Heartbeat Job - Simple Continuous Job Example
Expand Down Expand Up @@ -41,11 +41,16 @@ export const heartbeat = Continuous.make({
stateSchema: HeartbeatState,

// Run every 10 seconds
schedule: Continuous.every("4 minutes"),
schedule: Continuous.every("4 seconds"),

// Start immediately when created (default: true)
startImmediately: true,

retry: {
maxAttempts: 3,
delay: Duration.seconds(1),
},

// The execute function runs on each scheduled tick
execute: (ctx) =>
Effect.gen(function* () {
Expand All @@ -55,6 +60,7 @@ export const heartbeat = Continuous.make({
yield* Effect.log(
`Heartbeat #${ctx.runCount}: ${currentState.name} - count=${currentState.count}`,
);
// yield* Effect.fail("Heartbeat job failed");

// Update state (Effect-based)
yield* ctx.updateState((s) => ({
Expand All @@ -64,7 +70,7 @@ export const heartbeat = Continuous.make({
}));

// Example: auto-terminate after 10 heartbeats
if (currentState.count >= 9) {
if (currentState.count >= 2000) {
yield* Effect.log(
`Heartbeat ${currentState.name} reached max count, terminating`,
);
Expand Down
25 changes: 17 additions & 8 deletions examples/effect-worker-v2/src/jobs/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,24 @@ import { debounceExample } from "./basic-debounce";
* });
* ```
*/
export const { Jobs, JobsClient, registry } = createDurableJobs({
// Task jobs
basicTask,
export const { Jobs, JobsClient, registry } = createDurableJobs(
{
// Task jobs
basicTask2: basicTask,

// Continuous jobs
heartbeat,
// Debounce job
debounceExample,
});
// Continuous jobs
heartbeat2: heartbeat,
// Debounce job
debounceExample2: debounceExample,
},
{
tracker: {
endpoint: "http://localhost:3000/sync",
env: "dev",
serviceKey: "my-service-key",
},
},
);

// =============================================================================
// Type Exports
Expand Down
10 changes: 5 additions & 5 deletions examples/effect-worker-v2/src/routes/jobs/continuous.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export const continuousRoutes = HttpRouter.empty.pipe(
const body = yield* HttpServerRequest.schemaBodyJson(StartRequest);

const now = Date.now();
const result = yield* client.continuous("heartbeat").start({
const result = yield* client.continuous("heartbeat2").start({
id: body.id,
input: {
name: body.name,
Expand Down Expand Up @@ -69,7 +69,7 @@ export const continuousRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(TerminateRequest);

const result = yield* client.continuous("heartbeat").terminate(body.id, {
const result = yield* client.continuous("heartbeat2").terminate(body.id, {
reason: body.reason,
});

Expand All @@ -91,7 +91,7 @@ export const continuousRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(IdRequest);

const result = yield* client.continuous("heartbeat").trigger(body.id);
const result = yield* client.continuous("heartbeat2").trigger(body.id);

return yield* HttpServerResponse.json({
success: true,
Expand All @@ -112,7 +112,7 @@ export const continuousRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(IdRequest);

const result = yield* client.continuous("heartbeat").status(body.id);
const result = yield* client.continuous("heartbeat2").status(body.id);

return yield* HttpServerResponse.json({
success: true,
Expand All @@ -129,7 +129,7 @@ export const continuousRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(IdRequest);

const result = yield* client.continuous("heartbeat").getState(body.id);
const result = yield* client.continuous("heartbeat2").getState(body.id);

return yield* HttpServerResponse.json({
success: true,
Expand Down
24 changes: 13 additions & 11 deletions examples/effect-worker-v2/src/routes/jobs/debounce.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export const debounceRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(AddEventRequest);

const result = yield* client.debounce("debounceExample").add({
const result = yield* client.debounce("debounceExample2").add({
id: body.id,
event: {
actionId: body.actionId,
Expand All @@ -53,7 +53,7 @@ export const debounceRoutes = HttpRouter.empty.pipe(
created: result.created,
},
});
})
}),
),

// POST /debounce/flush - Manually flush the buffer
Expand All @@ -64,7 +64,7 @@ export const debounceRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(IdRequest);

const result = yield* client.debounce("debounceExample").flush(body.id);
const result = yield* client.debounce("debounceExample2").flush(body.id);

return yield* HttpServerResponse.json({
success: true,
Expand All @@ -74,7 +74,7 @@ export const debounceRoutes = HttpRouter.empty.pipe(
reason: result.reason,
},
});
})
}),
),

// POST /debounce/clear - Clear the buffer without flushing
Expand All @@ -85,7 +85,7 @@ export const debounceRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(IdRequest);

const result = yield* client.debounce("debounceExample").clear(body.id);
const result = yield* client.debounce("debounceExample2").clear(body.id);

return yield* HttpServerResponse.json({
success: true,
Expand All @@ -94,7 +94,7 @@ export const debounceRoutes = HttpRouter.empty.pipe(
discardedEvents: result.discardedEvents,
},
});
})
}),
),

// POST /debounce/status - Get debounce status
Expand All @@ -105,13 +105,13 @@ export const debounceRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(IdRequest);

const result = yield* client.debounce("debounceExample").status(body.id);
const result = yield* client.debounce("debounceExample2").status(body.id);

return yield* HttpServerResponse.json({
success: true,
result,
});
})
}),
),

// POST /debounce/state - Get debounce state
Expand All @@ -122,14 +122,16 @@ export const debounceRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(IdRequest);

const result = yield* client.debounce("debounceExample").getState(body.id);
const result = yield* client
.debounce("debounceExample2")
.getState(body.id);

return yield* HttpServerResponse.json({
success: true,
result: {
state: result.state,
},
});
})
)
}),
),
);
18 changes: 9 additions & 9 deletions examples/effect-worker-v2/src/routes/jobs/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const taskRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(SendEventRequest);

const result = yield* client.task("basicTask").send({
const result = yield* client.task("basicTask2").send({
id: body.id,
event: { targetRuns: body.targetRuns },
});
Expand All @@ -46,7 +46,7 @@ export const taskRoutes = HttpRouter.empty.pipe(
scheduledAt: result.scheduledAt,
},
});
})
}),
),

// POST /task/status - Get task status
Expand All @@ -57,13 +57,13 @@ export const taskRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(IdRequest);

const result = yield* client.task("basicTask").status(body.id);
const result = yield* client.task("basicTask2").status(body.id);

return yield* HttpServerResponse.json({
success: true,
result,
});
})
}),
),

// POST /task/state - Get task state
Expand All @@ -74,7 +74,7 @@ export const taskRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(IdRequest);

const result = yield* client.task("basicTask").getState(body.id);
const result = yield* client.task("basicTask2").getState(body.id);

return yield* HttpServerResponse.json({
success: true,
Expand All @@ -84,7 +84,7 @@ export const taskRoutes = HttpRouter.empty.pipe(
scheduledAt: result.scheduledAt,
},
});
})
}),
),

// POST /task/terminate - Terminate task
Expand All @@ -95,7 +95,7 @@ export const taskRoutes = HttpRouter.empty.pipe(
const client = JobsClient.fromBinding(env.JOBS);
const body = yield* HttpServerRequest.schemaBodyJson(IdRequest);

const result = yield* client.task("basicTask").terminate(body.id);
const result = yield* client.task("basicTask2").terminate(body.id);

return yield* HttpServerResponse.json({
success: true,
Expand All @@ -104,6 +104,6 @@ export const taskRoutes = HttpRouter.empty.pipe(
terminated: result.terminated,
},
});
})
)
}),
),
);
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@durable-effect/core",
"version": "0.0.1-next.13",
"version": "0.0.1-next.14",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
Expand Down
Loading