@durable-effect/jobs 0.0.1-next.1
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.
- package/LICENSE +21 -0
- package/README.md +490 -0
- package/dist/client/client.d.ts +34 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +427 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/response.d.ts +99 -0
- package/dist/client/response.d.ts.map +1 -0
- package/dist/client/response.js +92 -0
- package/dist/client/response.js.map +1 -0
- package/dist/client/types.d.ts +242 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +3 -0
- package/dist/client/types.js.map +1 -0
- package/dist/definitions/continuous.d.ts +110 -0
- package/dist/definitions/continuous.d.ts.map +1 -0
- package/dist/definitions/continuous.js +79 -0
- package/dist/definitions/continuous.js.map +1 -0
- package/dist/definitions/debounce.d.ts +67 -0
- package/dist/definitions/debounce.d.ts.map +1 -0
- package/dist/definitions/debounce.js +28 -0
- package/dist/definitions/debounce.js.map +1 -0
- package/dist/definitions/index.d.ts +4 -0
- package/dist/definitions/index.d.ts.map +1 -0
- package/dist/definitions/index.js +5 -0
- package/dist/definitions/index.js.map +1 -0
- package/dist/definitions/task.d.ts +234 -0
- package/dist/definitions/task.d.ts.map +1 -0
- package/dist/definitions/task.js +106 -0
- package/dist/definitions/task.js.map +1 -0
- package/dist/engine/engine.d.ts +60 -0
- package/dist/engine/engine.d.ts.map +1 -0
- package/dist/engine/engine.js +89 -0
- package/dist/engine/engine.js.map +1 -0
- package/dist/engine/index.d.ts +3 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +3 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/types.d.ts +53 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +3 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/errors.d.ts +119 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +80 -0
- package/dist/errors.js.map +1 -0
- package/dist/factory.d.ts +97 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +94 -0
- package/dist/factory.js.map +1 -0
- package/dist/handlers/continuous/context.d.ts +25 -0
- package/dist/handlers/continuous/context.d.ts.map +1 -0
- package/dist/handlers/continuous/context.js +38 -0
- package/dist/handlers/continuous/context.js.map +1 -0
- package/dist/handlers/continuous/executor.d.ts +10 -0
- package/dist/handlers/continuous/executor.d.ts.map +1 -0
- package/dist/handlers/continuous/executor.js +83 -0
- package/dist/handlers/continuous/executor.js.map +1 -0
- package/dist/handlers/continuous/handler.d.ts +14 -0
- package/dist/handlers/continuous/handler.d.ts.map +1 -0
- package/dist/handlers/continuous/handler.js +283 -0
- package/dist/handlers/continuous/handler.js.map +1 -0
- package/dist/handlers/continuous/index.d.ts +4 -0
- package/dist/handlers/continuous/index.d.ts.map +1 -0
- package/dist/handlers/continuous/index.js +4 -0
- package/dist/handlers/continuous/index.js.map +1 -0
- package/dist/handlers/continuous/types.d.ts +36 -0
- package/dist/handlers/continuous/types.d.ts.map +1 -0
- package/dist/handlers/continuous/types.js +3 -0
- package/dist/handlers/continuous/types.js.map +1 -0
- package/dist/handlers/debounce/handler.d.ts +14 -0
- package/dist/handlers/debounce/handler.d.ts.map +1 -0
- package/dist/handlers/debounce/handler.js +261 -0
- package/dist/handlers/debounce/handler.js.map +1 -0
- package/dist/handlers/debounce/index.d.ts +3 -0
- package/dist/handlers/debounce/index.d.ts.map +1 -0
- package/dist/handlers/debounce/index.js +3 -0
- package/dist/handlers/debounce/index.js.map +1 -0
- package/dist/handlers/debounce/types.d.ts +10 -0
- package/dist/handlers/debounce/types.d.ts.map +1 -0
- package/dist/handlers/debounce/types.js +3 -0
- package/dist/handlers/debounce/types.js.map +1 -0
- package/dist/handlers/index.d.ts +14 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +25 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/task/context.d.ts +35 -0
- package/dist/handlers/task/context.d.ts.map +1 -0
- package/dist/handlers/task/context.js +156 -0
- package/dist/handlers/task/context.js.map +1 -0
- package/dist/handlers/task/handler.d.ts +13 -0
- package/dist/handlers/task/handler.d.ts.map +1 -0
- package/dist/handlers/task/handler.js +280 -0
- package/dist/handlers/task/handler.js.map +1 -0
- package/dist/handlers/task/index.d.ts +3 -0
- package/dist/handlers/task/index.d.ts.map +1 -0
- package/dist/handlers/task/index.js +2 -0
- package/dist/handlers/task/index.js.map +1 -0
- package/dist/handlers/task/types.d.ts +10 -0
- package/dist/handlers/task/types.d.ts.map +1 -0
- package/dist/handlers/task/types.js +3 -0
- package/dist/handlers/task/types.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/index.d.ts +5 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +4 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.d.ts +74 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +159 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/typed.d.ts +146 -0
- package/dist/registry/typed.d.ts.map +1 -0
- package/dist/registry/typed.js +29 -0
- package/dist/registry/typed.js.map +1 -0
- package/dist/registry/types.d.ts +497 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +3 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/retry/errors.d.ts +31 -0
- package/dist/retry/errors.d.ts.map +1 -0
- package/dist/retry/errors.js +22 -0
- package/dist/retry/errors.js.map +1 -0
- package/dist/retry/executor.d.ts +53 -0
- package/dist/retry/executor.d.ts.map +1 -0
- package/dist/retry/executor.js +112 -0
- package/dist/retry/executor.js.map +1 -0
- package/dist/retry/index.d.ts +4 -0
- package/dist/retry/index.d.ts.map +1 -0
- package/dist/retry/index.js +4 -0
- package/dist/retry/index.js.map +1 -0
- package/dist/retry/types.d.ts +29 -0
- package/dist/retry/types.d.ts.map +1 -0
- package/dist/retry/types.js +3 -0
- package/dist/retry/types.js.map +1 -0
- package/dist/runtime/dispatcher.d.ts +39 -0
- package/dist/runtime/dispatcher.d.ts.map +1 -0
- package/dist/runtime/dispatcher.js +76 -0
- package/dist/runtime/dispatcher.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +6 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/runtime.d.ts +88 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +116 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/types.d.ts +182 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +3 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/services/alarm.d.ts +37 -0
- package/dist/services/alarm.d.ts.map +1 -0
- package/dist/services/alarm.js +39 -0
- package/dist/services/alarm.js.map +1 -0
- package/dist/services/cleanup.d.ts +27 -0
- package/dist/services/cleanup.d.ts.map +1 -0
- package/dist/services/cleanup.js +25 -0
- package/dist/services/cleanup.js.map +1 -0
- package/dist/services/entity-state.d.ts +49 -0
- package/dist/services/entity-state.d.ts.map +1 -0
- package/dist/services/entity-state.js +72 -0
- package/dist/services/entity-state.js.map +1 -0
- package/dist/services/execution.d.ts +70 -0
- package/dist/services/execution.d.ts.map +1 -0
- package/dist/services/execution.js +159 -0
- package/dist/services/execution.js.map +1 -0
- package/dist/services/execution_test.d.ts +13 -0
- package/dist/services/execution_test.d.ts.map +1 -0
- package/dist/services/execution_test.js +11 -0
- package/dist/services/execution_test.js.map +1 -0
- package/dist/services/idempotency.d.ts +36 -0
- package/dist/services/idempotency.d.ts.map +1 -0
- package/dist/services/idempotency.js +48 -0
- package/dist/services/idempotency.js.map +1 -0
- package/dist/services/index.d.ts +19 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +33 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/metadata.d.ts +64 -0
- package/dist/services/metadata.d.ts.map +1 -0
- package/dist/services/metadata.js +56 -0
- package/dist/services/metadata.js.map +1 -0
- package/dist/services/registry.d.ts +19 -0
- package/dist/services/registry.d.ts.map +1 -0
- package/dist/services/registry.js +17 -0
- package/dist/services/registry.js.map +1 -0
- package/dist/storage-keys.d.ts +38 -0
- package/dist/storage-keys.d.ts.map +1 -0
- package/dist/storage-keys.js +47 -0
- package/dist/storage-keys.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// packages/jobs/src/client/response.ts
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
/**
|
|
4
|
+
* Create a JobCallError.
|
|
5
|
+
*/
|
|
6
|
+
export const jobCallError = (cause) => ({
|
|
7
|
+
_tag: "JobCallError",
|
|
8
|
+
cause,
|
|
9
|
+
});
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Response Narrowing
|
|
12
|
+
// =============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Runtime error for unexpected response types.
|
|
15
|
+
*/
|
|
16
|
+
export class UnexpectedResponseError extends Error {
|
|
17
|
+
_tag = "UnexpectedResponseError";
|
|
18
|
+
expected;
|
|
19
|
+
actual;
|
|
20
|
+
constructor(expected, actual) {
|
|
21
|
+
super(`Expected response type "${expected}" but received "${actual}"`);
|
|
22
|
+
this.name = "UnexpectedResponseError";
|
|
23
|
+
this.expected = expected;
|
|
24
|
+
this.actual = actual;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Type guard to check if a response has a specific _type.
|
|
29
|
+
*/
|
|
30
|
+
export function isResponseType(response, expectedType) {
|
|
31
|
+
return response._type === expectedType;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Narrow a response to a specific type with runtime validation.
|
|
35
|
+
*
|
|
36
|
+
* This provides both compile-time type safety AND runtime validation,
|
|
37
|
+
* unlike raw type casts which only provide compile-time types.
|
|
38
|
+
*
|
|
39
|
+
* @throws UnexpectedResponseError if the response type doesn't match
|
|
40
|
+
*/
|
|
41
|
+
export function narrowResponse(response, expectedType) {
|
|
42
|
+
if (isResponseType(response, expectedType)) {
|
|
43
|
+
return response;
|
|
44
|
+
}
|
|
45
|
+
throw new UnexpectedResponseError(expectedType, response._type);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Narrow a Promise<JobResponse> to a specific type.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* const response = await narrowResponseAsync(
|
|
53
|
+
* stub.call({ type: "continuous", action: "start", ... }),
|
|
54
|
+
* "continuous.start"
|
|
55
|
+
* );
|
|
56
|
+
* // response is typed as ContinuousStartResponse
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export async function narrowResponseAsync(promise, expectedType) {
|
|
60
|
+
const response = await promise;
|
|
61
|
+
return narrowResponse(response, expectedType);
|
|
62
|
+
}
|
|
63
|
+
// =============================================================================
|
|
64
|
+
// Effect-based Response Narrowing
|
|
65
|
+
// =============================================================================
|
|
66
|
+
/**
|
|
67
|
+
* Narrow a Promise<JobResponse> to a specific type, returning an Effect.
|
|
68
|
+
*
|
|
69
|
+
* This is the Effect-based version that properly handles errors and can be used
|
|
70
|
+
* with Effect.gen and yield*.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```ts
|
|
74
|
+
* const response = yield* narrowResponseEffect(
|
|
75
|
+
* stub.call({ type: "continuous", action: "start", ... }),
|
|
76
|
+
* "continuous.start"
|
|
77
|
+
* );
|
|
78
|
+
* // response is typed as ContinuousStartResponse
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export function narrowResponseEffect(promise, expectedType) {
|
|
82
|
+
return Effect.tryPromise({
|
|
83
|
+
try: () => promise,
|
|
84
|
+
catch: (error) => jobCallError(error),
|
|
85
|
+
}).pipe(Effect.flatMap((response) => {
|
|
86
|
+
if (isResponseType(response, expectedType)) {
|
|
87
|
+
return Effect.succeed(response);
|
|
88
|
+
}
|
|
89
|
+
return Effect.fail(new UnexpectedResponseError(expectedType, response._type));
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/client/response.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAsChC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAgB,EAAE,CAAC,CAAC;IAC7D,IAAI,EAAE,cAAc;IACpB,KAAK;CACN,CAAC,CAAC;AAsCH,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACvC,IAAI,GAAG,yBAAyB,CAAC;IACjC,QAAQ,CAAe;IACvB,MAAM,CAAS;IAExB,YAAY,QAAsB,EAAE,MAAc;QAChD,KAAK,CAAC,2BAA2B,QAAQ,mBAAmB,MAAM,GAAG,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAqB,EACrB,YAAe;IAEf,OAAO,QAAQ,CAAC,KAAK,KAAK,YAAY,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAqB,EACrB,YAAe;IAEf,IAAI,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,uBAAuB,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAA6B,EAC7B,YAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;IAC/B,OAAO,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAChD,CAAC;AAWD,gFAAgF;AAChF,kCAAkC;AAClC,gFAAgF;AAEhF;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA6B,EAC7B,YAAe;IAEf,OAAO,MAAM,CAAC,UAAU,CAAC;QACvB,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;KACtC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC1B,IAAI,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,uBAAuB,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAC1D,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import type { Context, Effect } from "effect";
|
|
2
|
+
import type { TypedJobRegistry, ContinuousKeysOf, DebounceKeysOf, WorkerPoolKeysOf, ContinuousStateOf, DebounceEventOf, DebounceStateOf, WorkerPoolEventOf } from "../registry/typed";
|
|
3
|
+
import type { ContinuousStartResponse, ContinuousTerminateResponse, ContinuousTriggerResponse, ContinuousStatusResponse, ContinuousGetStateResponse, DebounceAddResponse, DebounceFlushResponse, DebounceClearResponse, DebounceStatusResponse, DebounceGetStateResponse, WorkerPoolEnqueueResponse, WorkerPoolPauseResponse, WorkerPoolResumeResponse, WorkerPoolCancelResponse, WorkerPoolStatusResponse, WorkerPoolDrainResponse } from "../runtime/types";
|
|
4
|
+
import type { UnexpectedResponseError, JobCallError } from "./response";
|
|
5
|
+
import type { TaskSendResponse, TaskTriggerResponse, TaskTerminateResponse, TaskStatusResponse, TaskGetStateResponse } from "../runtime/types";
|
|
6
|
+
import type { TaskKeysOf, TaskStateOf, TaskEventOf } from "../registry/typed";
|
|
7
|
+
/**
|
|
8
|
+
* Combined error type for client operations.
|
|
9
|
+
*/
|
|
10
|
+
export type ClientError = JobCallError | UnexpectedResponseError;
|
|
11
|
+
export type { JobCallError, UnexpectedResponseError };
|
|
12
|
+
/**
|
|
13
|
+
* Type-safe client for continuous jobs.
|
|
14
|
+
*/
|
|
15
|
+
export interface ContinuousClient<S> {
|
|
16
|
+
/**
|
|
17
|
+
* Start the continuous job with initial state.
|
|
18
|
+
*
|
|
19
|
+
* If the instance already exists, returns its current status.
|
|
20
|
+
*/
|
|
21
|
+
start(options: {
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly input: S;
|
|
24
|
+
}): Effect.Effect<ContinuousStartResponse, ClientError>;
|
|
25
|
+
/**
|
|
26
|
+
* Terminate the continuous job.
|
|
27
|
+
*
|
|
28
|
+
* This fully removes the job - cancels the alarm and deletes all state.
|
|
29
|
+
* After termination, the same ID can be used to start a fresh instance.
|
|
30
|
+
*/
|
|
31
|
+
terminate(id: string, options?: {
|
|
32
|
+
readonly reason?: string;
|
|
33
|
+
}): Effect.Effect<ContinuousTerminateResponse, ClientError>;
|
|
34
|
+
/**
|
|
35
|
+
* Trigger immediate execution (bypass schedule).
|
|
36
|
+
*/
|
|
37
|
+
trigger(id: string): Effect.Effect<ContinuousTriggerResponse, ClientError>;
|
|
38
|
+
/**
|
|
39
|
+
* Get current status.
|
|
40
|
+
*/
|
|
41
|
+
status(id: string): Effect.Effect<ContinuousStatusResponse, ClientError>;
|
|
42
|
+
/**
|
|
43
|
+
* Get current state.
|
|
44
|
+
*/
|
|
45
|
+
getState(id: string): Effect.Effect<ContinuousGetStateResponse, ClientError>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Type-safe client for debounce jobs.
|
|
49
|
+
*/
|
|
50
|
+
export interface DebounceClient<I, S> {
|
|
51
|
+
/**
|
|
52
|
+
* Add an event to the debounce.
|
|
53
|
+
*
|
|
54
|
+
* Creates the debounce if it doesn't exist.
|
|
55
|
+
* The id serves as both instance identifier and idempotency key.
|
|
56
|
+
*/
|
|
57
|
+
add(options: {
|
|
58
|
+
readonly id: string;
|
|
59
|
+
readonly event: I;
|
|
60
|
+
}): Effect.Effect<DebounceAddResponse, ClientError>;
|
|
61
|
+
/**
|
|
62
|
+
* Manually flush the debounce.
|
|
63
|
+
*/
|
|
64
|
+
flush(id: string): Effect.Effect<DebounceFlushResponse, ClientError>;
|
|
65
|
+
/**
|
|
66
|
+
* Clear the debounce without processing.
|
|
67
|
+
*/
|
|
68
|
+
clear(id: string): Effect.Effect<DebounceClearResponse, ClientError>;
|
|
69
|
+
/**
|
|
70
|
+
* Get current status.
|
|
71
|
+
*/
|
|
72
|
+
status(id: string): Effect.Effect<DebounceStatusResponse, ClientError>;
|
|
73
|
+
/**
|
|
74
|
+
* Get current accumulated state.
|
|
75
|
+
*/
|
|
76
|
+
getState(id: string): Effect.Effect<DebounceGetStateResponse, ClientError>;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Type-safe client for workerPool jobs.
|
|
80
|
+
*/
|
|
81
|
+
export interface WorkerPoolClient<E> {
|
|
82
|
+
/**
|
|
83
|
+
* Enqueue an event for processing.
|
|
84
|
+
*
|
|
85
|
+
* @param options.id - Unique event ID for idempotency
|
|
86
|
+
* @param options.event - The event data
|
|
87
|
+
* @param options.partitionKey - Optional partition key for routing
|
|
88
|
+
* @param options.priority - Optional priority (higher = processed first)
|
|
89
|
+
*/
|
|
90
|
+
enqueue(options: {
|
|
91
|
+
readonly id: string;
|
|
92
|
+
readonly event: E;
|
|
93
|
+
readonly partitionKey?: string;
|
|
94
|
+
readonly priority?: number;
|
|
95
|
+
}): Effect.Effect<WorkerPoolEnqueueResponse, ClientError>;
|
|
96
|
+
/**
|
|
97
|
+
* Pause processing on all or specific instance.
|
|
98
|
+
*/
|
|
99
|
+
pause(instanceIndex?: number): Effect.Effect<WorkerPoolPauseResponse, ClientError>;
|
|
100
|
+
/**
|
|
101
|
+
* Resume processing on all or specific instance.
|
|
102
|
+
*/
|
|
103
|
+
resume(instanceIndex?: number): Effect.Effect<WorkerPoolResumeResponse, ClientError>;
|
|
104
|
+
/**
|
|
105
|
+
* Cancel a pending event.
|
|
106
|
+
*/
|
|
107
|
+
cancel(eventId: string): Effect.Effect<WorkerPoolCancelResponse, ClientError>;
|
|
108
|
+
/**
|
|
109
|
+
* Get aggregated status across all instances.
|
|
110
|
+
*/
|
|
111
|
+
status(): Effect.Effect<WorkerPoolAggregatedStatus, ClientError>;
|
|
112
|
+
/**
|
|
113
|
+
* Get status for a specific instance.
|
|
114
|
+
*/
|
|
115
|
+
instanceStatus(instanceIndex: number): Effect.Effect<WorkerPoolStatusResponse, ClientError>;
|
|
116
|
+
/**
|
|
117
|
+
* Drain all pending events (cancel and cleanup).
|
|
118
|
+
*/
|
|
119
|
+
drain(instanceIndex?: number): Effect.Effect<WorkerPoolDrainResponse, ClientError>;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Aggregated workerPool status across all instances.
|
|
123
|
+
*/
|
|
124
|
+
export interface WorkerPoolAggregatedStatus {
|
|
125
|
+
readonly instances: WorkerPoolStatusResponse[];
|
|
126
|
+
readonly totalPending: number;
|
|
127
|
+
readonly totalProcessed: number;
|
|
128
|
+
readonly activeInstances: number;
|
|
129
|
+
readonly pausedInstances: number;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Type-safe client for task jobs.
|
|
133
|
+
*/
|
|
134
|
+
export interface TaskClient<S, E> {
|
|
135
|
+
/**
|
|
136
|
+
* Send an event to a task instance.
|
|
137
|
+
* Creates the instance if it doesn't exist.
|
|
138
|
+
*/
|
|
139
|
+
send(options: {
|
|
140
|
+
readonly id: string;
|
|
141
|
+
readonly event: E;
|
|
142
|
+
}): Effect.Effect<TaskSendResponse, ClientError>;
|
|
143
|
+
/**
|
|
144
|
+
* Manually trigger execution.
|
|
145
|
+
*/
|
|
146
|
+
trigger(id: string): Effect.Effect<TaskTriggerResponse, ClientError>;
|
|
147
|
+
/**
|
|
148
|
+
* Terminate task immediately (delete all state + cancel alarms).
|
|
149
|
+
*/
|
|
150
|
+
terminate(id: string): Effect.Effect<TaskTerminateResponse, ClientError>;
|
|
151
|
+
/**
|
|
152
|
+
* Get current status.
|
|
153
|
+
*/
|
|
154
|
+
status(id: string): Effect.Effect<TaskStatusResponse, ClientError>;
|
|
155
|
+
/**
|
|
156
|
+
* Get current state.
|
|
157
|
+
*/
|
|
158
|
+
getState(id: string): Effect.Effect<TaskGetStateResponse, ClientError>;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The jobs client providing access to all registered jobs.
|
|
162
|
+
*
|
|
163
|
+
* Now uses TypedJobRegistry which preserves literal keys via the __definitions property.
|
|
164
|
+
*/
|
|
165
|
+
export interface JobsClient<R extends TypedJobRegistry<any>> {
|
|
166
|
+
/**
|
|
167
|
+
* Get a typed client for a continuous job.
|
|
168
|
+
*/
|
|
169
|
+
continuous<K extends ContinuousKeys<R>>(name: K): ContinuousClient<ContinuousStateType<R, K>>;
|
|
170
|
+
/**
|
|
171
|
+
* Get a typed client for a debounce job.
|
|
172
|
+
*/
|
|
173
|
+
debounce<K extends DebounceKeys<R>>(name: K): DebounceClient<DebounceEventType<R, K>, DebounceStateType<R, K>>;
|
|
174
|
+
/**
|
|
175
|
+
* Get a typed client for a workerPool job.
|
|
176
|
+
*/
|
|
177
|
+
workerPool<K extends WorkerPoolKeys<R>>(name: K): WorkerPoolClient<WorkerPoolEventType<R, K>>;
|
|
178
|
+
/**
|
|
179
|
+
* Get a typed client for a task job.
|
|
180
|
+
*/
|
|
181
|
+
task<K extends TaskKeys<R>>(name: K): TaskClient<TaskStateType<R, K>, TaskEventType<R, K>>;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Factory for creating jobs clients.
|
|
185
|
+
*/
|
|
186
|
+
export interface JobsClientFactory<R extends TypedJobRegistry<any>> {
|
|
187
|
+
/**
|
|
188
|
+
* Create a client from a Durable Object binding.
|
|
189
|
+
*/
|
|
190
|
+
fromBinding(binding: DurableObjectNamespace): JobsClient<R>;
|
|
191
|
+
/**
|
|
192
|
+
* Effect Tag for using the client as a service.
|
|
193
|
+
*/
|
|
194
|
+
Tag: Context.Tag<JobsClient<R>, JobsClient<R>>;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Extract the definitions type from a TypedJobRegistry.
|
|
198
|
+
*/
|
|
199
|
+
type DefinitionsOf<R extends TypedJobRegistry<any>> = R extends TypedJobRegistry<infer T> ? T : never;
|
|
200
|
+
/**
|
|
201
|
+
* Extract continuous job keys from registry.
|
|
202
|
+
*
|
|
203
|
+
* Simplified: directly uses ContinuousKeysOf from the __definitions type.
|
|
204
|
+
*/
|
|
205
|
+
export type ContinuousKeys<R extends TypedJobRegistry<any>> = ContinuousKeysOf<DefinitionsOf<R>>;
|
|
206
|
+
/**
|
|
207
|
+
* Extract debounce job keys from registry.
|
|
208
|
+
*/
|
|
209
|
+
export type DebounceKeys<R extends TypedJobRegistry<any>> = DebounceKeysOf<DefinitionsOf<R>>;
|
|
210
|
+
/**
|
|
211
|
+
* Extract workerPool job keys from registry.
|
|
212
|
+
*/
|
|
213
|
+
export type WorkerPoolKeys<R extends TypedJobRegistry<any>> = WorkerPoolKeysOf<DefinitionsOf<R>>;
|
|
214
|
+
/**
|
|
215
|
+
* Extract task job keys from registry.
|
|
216
|
+
*/
|
|
217
|
+
export type TaskKeys<R extends TypedJobRegistry<any>> = TaskKeysOf<DefinitionsOf<R>>;
|
|
218
|
+
/**
|
|
219
|
+
* Extract state type from continuous definition.
|
|
220
|
+
*/
|
|
221
|
+
export type ContinuousStateType<R extends TypedJobRegistry<any>, K extends ContinuousKeys<R>> = ContinuousStateOf<DefinitionsOf<R>, K>;
|
|
222
|
+
/**
|
|
223
|
+
* Extract event type from debounce definition.
|
|
224
|
+
*/
|
|
225
|
+
export type DebounceEventType<R extends TypedJobRegistry<any>, K extends DebounceKeys<R>> = DebounceEventOf<DefinitionsOf<R>, K>;
|
|
226
|
+
/**
|
|
227
|
+
* Extract state type from debounce definition.
|
|
228
|
+
*/
|
|
229
|
+
export type DebounceStateType<R extends TypedJobRegistry<any>, K extends DebounceKeys<R>> = DebounceStateOf<DefinitionsOf<R>, K>;
|
|
230
|
+
/**
|
|
231
|
+
* Extract event type from workerPool definition.
|
|
232
|
+
*/
|
|
233
|
+
export type WorkerPoolEventType<R extends TypedJobRegistry<any>, K extends WorkerPoolKeys<R>> = WorkerPoolEventOf<DefinitionsOf<R>, K>;
|
|
234
|
+
/**
|
|
235
|
+
* Extract state type from task definition.
|
|
236
|
+
*/
|
|
237
|
+
export type TaskStateType<R extends TypedJobRegistry<any>, K extends TaskKeys<R>> = TaskStateOf<DefinitionsOf<R>, K>;
|
|
238
|
+
/**
|
|
239
|
+
* Extract event type from task definition.
|
|
240
|
+
*/
|
|
241
|
+
export type TaskEventType<R extends TypedJobRegistry<any>, K extends TaskKeys<R>> = TaskEventOf<DefinitionsOf<R>, K>;
|
|
242
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,oCAAoC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Duration, type Effect, type Schema } from "effect";
|
|
2
|
+
import type { UnregisteredContinuousDefinition, ContinuousSchedule, ContinuousContext } from "../registry/types";
|
|
3
|
+
import type { JobRetryConfig } from "../retry/types";
|
|
4
|
+
/**
|
|
5
|
+
* Input config for creating a continuous job definition.
|
|
6
|
+
*/
|
|
7
|
+
export interface ContinuousMakeConfig<S, E, R> {
|
|
8
|
+
/**
|
|
9
|
+
* Schema for validating and serializing state.
|
|
10
|
+
* Accepts any Effect Schema (Struct, Class, etc.)
|
|
11
|
+
*/
|
|
12
|
+
readonly stateSchema: Schema.Schema<S, any, never>;
|
|
13
|
+
/**
|
|
14
|
+
* Schedule for when to execute.
|
|
15
|
+
*/
|
|
16
|
+
readonly schedule: ContinuousSchedule;
|
|
17
|
+
/**
|
|
18
|
+
* Whether to execute immediately on start.
|
|
19
|
+
* @default true
|
|
20
|
+
*/
|
|
21
|
+
readonly startImmediately?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Optional retry configuration for execute handler failures.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { Backoff } from "@durable-effect/core";
|
|
28
|
+
*
|
|
29
|
+
* retry: {
|
|
30
|
+
* maxAttempts: 3,
|
|
31
|
+
* delay: Backoff.exponential({ base: "1 second", max: "30 seconds" }),
|
|
32
|
+
* isRetryable: (error) => error._tag !== "FatalError",
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
readonly retry?: JobRetryConfig;
|
|
37
|
+
/**
|
|
38
|
+
* The function to execute on schedule.
|
|
39
|
+
*/
|
|
40
|
+
execute(ctx: ContinuousContext<S>): Effect.Effect<void, E, R>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Namespace for creating continuous job definitions.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* import { Continuous } from "@durable-effect/jobs";
|
|
48
|
+
* import { Schema } from "effect";
|
|
49
|
+
*
|
|
50
|
+
* const dailyReport = Continuous.make({
|
|
51
|
+
* stateSchema: Schema.Struct({
|
|
52
|
+
* lastReportDate: Schema.DateFromSelf,
|
|
53
|
+
* totalReports: Schema.Number,
|
|
54
|
+
* }),
|
|
55
|
+
* schedule: Continuous.every("24 hours"),
|
|
56
|
+
* execute: (ctx) =>
|
|
57
|
+
* Effect.gen(function* () {
|
|
58
|
+
* console.log(`Generating report #${ctx.runCount}`);
|
|
59
|
+
* ctx.updateState((s) => ({
|
|
60
|
+
* ...s,
|
|
61
|
+
* lastReportDate: new Date(),
|
|
62
|
+
* totalReports: s.totalReports + 1,
|
|
63
|
+
* }));
|
|
64
|
+
* }),
|
|
65
|
+
* });
|
|
66
|
+
*
|
|
67
|
+
* // Register with createDurableJobs - name comes from key
|
|
68
|
+
* const { Jobs } = createDurableJobs({ dailyReport });
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare const Continuous: {
|
|
72
|
+
/**
|
|
73
|
+
* Create a continuous job definition.
|
|
74
|
+
*
|
|
75
|
+
* The name is NOT provided here - it comes from the key when you
|
|
76
|
+
* register the job via createDurableJobs().
|
|
77
|
+
*
|
|
78
|
+
* @param config - Configuration for the job
|
|
79
|
+
* @returns An UnregisteredContinuousDefinition that can be registered
|
|
80
|
+
*/
|
|
81
|
+
readonly make: <S, E = never, R = never>(config: ContinuousMakeConfig<S, E, R>) => UnregisteredContinuousDefinition<S, E, R>;
|
|
82
|
+
/**
|
|
83
|
+
* Create a schedule that executes at a fixed interval.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* Continuous.every("30 minutes")
|
|
88
|
+
* Continuous.every(Duration.hours(1))
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
readonly every: (interval: Duration.DurationInput) => ContinuousSchedule;
|
|
92
|
+
/**
|
|
93
|
+
* Create a schedule based on a cron expression.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* // Every day at midnight
|
|
98
|
+
* Continuous.cron("0 0 * * *")
|
|
99
|
+
*
|
|
100
|
+
* // Every Monday at 9am
|
|
101
|
+
* Continuous.cron("0 9 * * 1")
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
readonly cron: (expression: string) => ContinuousSchedule;
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Type alias for the Continuous namespace.
|
|
108
|
+
*/
|
|
109
|
+
export type ContinuousNamespace = typeof Continuous;
|
|
110
|
+
//# sourceMappingURL=continuous.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continuous.d.ts","sourceRoot":"","sources":["../../src/definitions/continuous.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,KAAK,EACV,gCAAgC,EAChC,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3C;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAEnD;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAEtC;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAEhC;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAE/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,UAAU;IACrB;;;;;;;;OAQG;oBACI,CAAC,EAAE,CAAC,UAAU,CAAC,kBACZ,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACpC,gCAAgC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAS5C;;;;;;;;OAQG;+BACe,QAAQ,CAAC,aAAa,KAAG,kBAAkB;IAK7D;;;;;;;;;;;OAWG;gCACgB,MAAM,KAAG,kBAAkB;CAItC,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,UAAU,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// packages/jobs/src/definitions/continuous.ts
|
|
2
|
+
/**
|
|
3
|
+
* Namespace for creating continuous job definitions.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { Continuous } from "@durable-effect/jobs";
|
|
8
|
+
* import { Schema } from "effect";
|
|
9
|
+
*
|
|
10
|
+
* const dailyReport = Continuous.make({
|
|
11
|
+
* stateSchema: Schema.Struct({
|
|
12
|
+
* lastReportDate: Schema.DateFromSelf,
|
|
13
|
+
* totalReports: Schema.Number,
|
|
14
|
+
* }),
|
|
15
|
+
* schedule: Continuous.every("24 hours"),
|
|
16
|
+
* execute: (ctx) =>
|
|
17
|
+
* Effect.gen(function* () {
|
|
18
|
+
* console.log(`Generating report #${ctx.runCount}`);
|
|
19
|
+
* ctx.updateState((s) => ({
|
|
20
|
+
* ...s,
|
|
21
|
+
* lastReportDate: new Date(),
|
|
22
|
+
* totalReports: s.totalReports + 1,
|
|
23
|
+
* }));
|
|
24
|
+
* }),
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // Register with createDurableJobs - name comes from key
|
|
28
|
+
* const { Jobs } = createDurableJobs({ dailyReport });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export const Continuous = {
|
|
32
|
+
/**
|
|
33
|
+
* Create a continuous job definition.
|
|
34
|
+
*
|
|
35
|
+
* The name is NOT provided here - it comes from the key when you
|
|
36
|
+
* register the job via createDurableJobs().
|
|
37
|
+
*
|
|
38
|
+
* @param config - Configuration for the job
|
|
39
|
+
* @returns An UnregisteredContinuousDefinition that can be registered
|
|
40
|
+
*/
|
|
41
|
+
make: (config) => ({
|
|
42
|
+
_tag: "ContinuousDefinition",
|
|
43
|
+
stateSchema: config.stateSchema,
|
|
44
|
+
schedule: config.schedule,
|
|
45
|
+
startImmediately: config.startImmediately,
|
|
46
|
+
retry: config.retry,
|
|
47
|
+
execute: config.execute,
|
|
48
|
+
}),
|
|
49
|
+
/**
|
|
50
|
+
* Create a schedule that executes at a fixed interval.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* Continuous.every("30 minutes")
|
|
55
|
+
* Continuous.every(Duration.hours(1))
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
every: (interval) => ({
|
|
59
|
+
_tag: "Every",
|
|
60
|
+
interval,
|
|
61
|
+
}),
|
|
62
|
+
/**
|
|
63
|
+
* Create a schedule based on a cron expression.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* // Every day at midnight
|
|
68
|
+
* Continuous.cron("0 0 * * *")
|
|
69
|
+
*
|
|
70
|
+
* // Every Monday at 9am
|
|
71
|
+
* Continuous.cron("0 9 * * 1")
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
cron: (expression) => ({
|
|
75
|
+
_tag: "Cron",
|
|
76
|
+
expression,
|
|
77
|
+
}),
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=continuous.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continuous.js","sourceRoot":"","sources":["../../src/definitions/continuous.ts"],"names":[],"mappings":"AAAA,8CAA8C;AA0D9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;;;;;;;;OAQG;IACH,IAAI,EAAE,CACJ,MAAqC,EACM,EAAE,CAAC,CAAC;QAC/C,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;IAEF;;;;;;;;OAQG;IACH,KAAK,EAAE,CAAC,QAAgC,EAAsB,EAAE,CAAC,CAAC;QAChE,IAAI,EAAE,OAAO;QACb,QAAQ;KACT,CAAC;IAEF;;;;;;;;;;;OAWG;IACH,IAAI,EAAE,CAAC,UAAkB,EAAsB,EAAE,CAAC,CAAC;QACjD,IAAI,EAAE,MAAM;QACZ,UAAU;KACX,CAAC;CACM,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Duration, Effect, type Schema } from "effect";
|
|
2
|
+
import type { UnregisteredDebounceDefinition, DebounceEventContext, DebounceExecuteContext } from "../registry/types";
|
|
3
|
+
import type { JobRetryConfig } from "../retry/types";
|
|
4
|
+
/**
|
|
5
|
+
* Configuration for creating a debounce job definition.
|
|
6
|
+
*/
|
|
7
|
+
export interface DebounceMakeConfig<I, S, E, R> {
|
|
8
|
+
/**
|
|
9
|
+
* Schema for validating incoming events.
|
|
10
|
+
*/
|
|
11
|
+
readonly eventSchema: Schema.Schema<I, any, never>;
|
|
12
|
+
/**
|
|
13
|
+
* Optional schema for persisted state.
|
|
14
|
+
* Defaults to eventSchema (keep latest event).
|
|
15
|
+
*/
|
|
16
|
+
readonly stateSchema?: Schema.Schema<S, any, never>;
|
|
17
|
+
/**
|
|
18
|
+
* Duration to wait after first event before flushing.
|
|
19
|
+
*/
|
|
20
|
+
readonly flushAfter: Duration.DurationInput;
|
|
21
|
+
/**
|
|
22
|
+
* Optional max events before immediate flush.
|
|
23
|
+
*/
|
|
24
|
+
readonly maxEvents?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Optional retry configuration for flush/execute handler failures.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { Backoff } from "@durable-effect/core";
|
|
31
|
+
*
|
|
32
|
+
* retry: {
|
|
33
|
+
* maxAttempts: 3,
|
|
34
|
+
* delay: Backoff.exponential({ base: "1 second", max: "30 seconds" }),
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
readonly retry?: JobRetryConfig;
|
|
39
|
+
/**
|
|
40
|
+
* Reducer for each incoming event. Defaults to returning the latest event.
|
|
41
|
+
*/
|
|
42
|
+
onEvent?(ctx: DebounceEventContext<I, S>): Effect.Effect<S, never, R>;
|
|
43
|
+
/**
|
|
44
|
+
* Effect executed when the debounce flushes.
|
|
45
|
+
*/
|
|
46
|
+
execute(ctx: DebounceExecuteContext<S>): Effect.Effect<void, E, R>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Namespace for creating debounce job definitions.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* const webhookDebounce = Debounce.make({
|
|
54
|
+
* eventSchema: Schema.Struct({ ... }),
|
|
55
|
+
* flushAfter: "5 minutes",
|
|
56
|
+
* execute: (ctx) => Effect.log(ctx.state),
|
|
57
|
+
* });
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare const Debounce: {
|
|
61
|
+
make: <I, S = I, E = never, R = never>(config: DebounceMakeConfig<I, S, E, R>) => UnregisteredDebounceDefinition<I, S, E, R>;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Type alias for the Debounce namespace.
|
|
65
|
+
*/
|
|
66
|
+
export type DebounceNamespace = typeof Debounce;
|
|
67
|
+
//# sourceMappingURL=debounce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/definitions/debounce.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,KAAK,EACV,8BAA8B,EAC9B,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC5C;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAEnD;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAEpD;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,aAAa,CAAC;IAE5C;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAEhC;;OAEG;IACH,OAAO,CAAC,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEtE;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAEpE;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,QAAQ;WACZ,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,kBACnB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACrC,8BAA8B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;CAiB9C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// packages/jobs/src/definitions/debounce.ts
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
/**
|
|
4
|
+
* Namespace for creating debounce job definitions.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* const webhookDebounce = Debounce.make({
|
|
9
|
+
* eventSchema: Schema.Struct({ ... }),
|
|
10
|
+
* flushAfter: "5 minutes",
|
|
11
|
+
* execute: (ctx) => Effect.log(ctx.state),
|
|
12
|
+
* });
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export const Debounce = {
|
|
16
|
+
make: (config) => ({
|
|
17
|
+
_tag: "DebounceDefinition",
|
|
18
|
+
eventSchema: config.eventSchema,
|
|
19
|
+
stateSchema: (config.stateSchema ?? config.eventSchema),
|
|
20
|
+
flushAfter: config.flushAfter,
|
|
21
|
+
maxEvents: config.maxEvents,
|
|
22
|
+
retry: config.retry,
|
|
23
|
+
onEvent: config.onEvent ??
|
|
24
|
+
((ctx) => Effect.succeed(ctx.event)),
|
|
25
|
+
execute: config.execute,
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=debounce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../src/definitions/debounce.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,OAAO,EAAY,MAAM,EAAe,MAAM,QAAQ,CAAC;AAgEvD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,CACJ,MAAsC,EACM,EAAE,CAAC,CAAC;QAChD,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAIrD;QACD,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EACL,MAAM,CAAC,OAAO;YACd,CAAC,CAAC,GAA+B,EAAE,EAAE,CACnC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAqB,CAAC,CAAC;QAC9C,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;CACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { Continuous, type ContinuousMakeConfig, type ContinuousNamespace, } from "./continuous";
|
|
2
|
+
export { Debounce, type DebounceMakeConfig, type DebounceNamespace, } from "./debounce";
|
|
3
|
+
export { Task, type TaskMakeConfig, type TaskNamespace, } from "./task";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/definitions/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,EACV,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,QAAQ,EACR,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,IAAI,EACJ,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,QAAQ,CAAC"}
|