@lotiai/composer 0.2.0 → 0.2.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/dist/build-config/index.d.ts +52 -0
- package/dist/build-config/index.d.ts.map +1 -0
- package/dist/build-config/index.js +66 -0
- package/dist/build-config/index.js.map +1 -0
- package/dist/build-config/loader.d.ts +80 -0
- package/dist/build-config/loader.d.ts.map +1 -0
- package/dist/build-config/loader.js +238 -0
- package/dist/build-config/loader.js.map +1 -0
- package/dist/build-config/schema.d.ts +101 -0
- package/dist/build-config/schema.d.ts.map +1 -0
- package/dist/build-config/schema.js +94 -0
- package/dist/build-config/schema.js.map +1 -0
- package/dist/cli/commands/dev-temporal.d.ts +15 -0
- package/dist/cli/commands/dev-temporal.d.ts.map +1 -0
- package/dist/cli/commands/dev-temporal.js +68 -0
- package/dist/cli/commands/dev-temporal.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +21 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +421 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/profiles.d.ts +15 -0
- package/dist/cli/commands/profiles.d.ts.map +1 -0
- package/dist/cli/commands/profiles.js +69 -0
- package/dist/cli/commands/profiles.js.map +1 -0
- package/dist/cli/index.d.ts +21 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +44 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/async/build/workflow-factory.d.ts +212 -0
- package/dist/internal/async/build/workflow-factory.d.ts.map +1 -0
- package/dist/internal/async/build/workflow-factory.js +533 -0
- package/dist/internal/async/build/workflow-factory.js.map +1 -0
- package/dist/internal/async/build-scripts/utils/common.d.ts +28 -0
- package/dist/internal/async/build-scripts/utils/common.d.ts.map +1 -0
- package/dist/internal/async/build-scripts/utils/common.js +50 -0
- package/dist/internal/async/build-scripts/utils/common.js.map +1 -0
- package/dist/internal/async/build-scripts/utils/import-module.d.ts +19 -0
- package/dist/internal/async/build-scripts/utils/import-module.d.ts.map +1 -0
- package/dist/internal/async/build-scripts/utils/import-module.js +80 -0
- package/dist/internal/async/build-scripts/utils/import-module.js.map +1 -0
- package/dist/internal/async/build-scripts/utils/type-guards.d.ts +123 -0
- package/dist/internal/async/build-scripts/utils/type-guards.d.ts.map +1 -0
- package/dist/internal/async/build-scripts/utils/type-guards.js +145 -0
- package/dist/internal/async/build-scripts/utils/type-guards.js.map +1 -0
- package/dist/internal/async/config/cleanup-policy.d.ts +50 -0
- package/dist/internal/async/config/cleanup-policy.d.ts.map +1 -0
- package/dist/internal/async/config/cleanup-policy.js +20 -0
- package/dist/internal/async/config/cleanup-policy.js.map +1 -0
- package/dist/internal/async/config/worker-profiles.d.ts +172 -0
- package/dist/internal/async/config/worker-profiles.d.ts.map +1 -0
- package/dist/internal/async/config/worker-profiles.js +275 -0
- package/dist/internal/async/config/worker-profiles.js.map +1 -0
- package/dist/internal/async/execute/temporal-client.d.ts +182 -0
- package/dist/internal/async/execute/temporal-client.d.ts.map +1 -0
- package/dist/internal/async/execute/temporal-client.js +190 -0
- package/dist/internal/async/execute/temporal-client.js.map +1 -0
- package/dist/internal/async/execute/workflow-execution.d.ts +98 -0
- package/dist/internal/async/execute/workflow-execution.d.ts.map +1 -0
- package/dist/internal/async/execute/workflow-execution.js +191 -0
- package/dist/internal/async/execute/workflow-execution.js.map +1 -0
- package/dist/internal/async/metrics/task-queue-metrics.d.ts +74 -0
- package/dist/internal/async/metrics/task-queue-metrics.d.ts.map +1 -0
- package/dist/internal/async/metrics/task-queue-metrics.js +155 -0
- package/dist/internal/async/metrics/task-queue-metrics.js.map +1 -0
- package/dist/internal/async/register/activity-worker.d.ts +123 -0
- package/dist/internal/async/register/activity-worker.d.ts.map +1 -0
- package/dist/internal/async/register/activity-worker.js +355 -0
- package/dist/internal/async/register/activity-worker.js.map +1 -0
- package/dist/internal/async/register/generate-workflow-source.d.ts +43 -0
- package/dist/internal/async/register/generate-workflow-source.d.ts.map +1 -0
- package/dist/internal/async/register/generate-workflow-source.js +193 -0
- package/dist/internal/async/register/generate-workflow-source.js.map +1 -0
- package/dist/internal/async/register/workflow-worker.d.ts +125 -0
- package/dist/internal/async/register/workflow-worker.d.ts.map +1 -0
- package/dist/internal/async/register/workflow-worker.js +215 -0
- package/dist/internal/async/register/workflow-worker.js.map +1 -0
- package/dist/internal/async/register-scripts/start-activity-worker.d.ts +70 -0
- package/dist/internal/async/register-scripts/start-activity-worker.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/start-activity-worker.js +75 -0
- package/dist/internal/async/register-scripts/start-activity-worker.js.map +1 -0
- package/dist/internal/async/register-scripts/start-all-workers.d.ts +81 -0
- package/dist/internal/async/register-scripts/start-all-workers.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/start-all-workers.js +84 -0
- package/dist/internal/async/register-scripts/start-all-workers.js.map +1 -0
- package/dist/internal/async/register-scripts/start-workflow-worker.d.ts +69 -0
- package/dist/internal/async/register-scripts/start-workflow-worker.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/start-workflow-worker.js +74 -0
- package/dist/internal/async/register-scripts/start-workflow-worker.js.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules-cli.d.ts +28 -0
- package/dist/internal/async/register-scripts/sync-schedules-cli.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules-cli.js +124 -0
- package/dist/internal/async/register-scripts/sync-schedules-cli.js.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules-via-lambda.d.ts +55 -0
- package/dist/internal/async/register-scripts/sync-schedules-via-lambda.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules-via-lambda.js +146 -0
- package/dist/internal/async/register-scripts/sync-schedules-via-lambda.js.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules.d.ts +68 -0
- package/dist/internal/async/register-scripts/sync-schedules.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules.js +83 -0
- package/dist/internal/async/register-scripts/sync-schedules.js.map +1 -0
- package/dist/internal/async/schedule/constants.d.ts +10 -0
- package/dist/internal/async/schedule/constants.d.ts.map +1 -0
- package/dist/internal/async/schedule/constants.js +13 -0
- package/dist/internal/async/schedule/constants.js.map +1 -0
- package/dist/internal/async/schedule/define-schedule.d.ts +192 -0
- package/dist/internal/async/schedule/define-schedule.d.ts.map +1 -0
- package/dist/internal/async/schedule/define-schedule.js +79 -0
- package/dist/internal/async/schedule/define-schedule.js.map +1 -0
- package/dist/internal/async/schedule/index.d.ts +3 -0
- package/dist/internal/async/schedule/index.d.ts.map +1 -0
- package/dist/internal/async/schedule/index.js +9 -0
- package/dist/internal/async/schedule/index.js.map +1 -0
- package/dist/internal/async/schedule/schedule-definition-schema.d.ts +64 -0
- package/dist/internal/async/schedule/schedule-definition-schema.d.ts.map +1 -0
- package/dist/internal/async/schedule/schedule-definition-schema.js +77 -0
- package/dist/internal/async/schedule/schedule-definition-schema.js.map +1 -0
- package/dist/internal/async/schedule/sync-schedules.d.ts +71 -0
- package/dist/internal/async/schedule/sync-schedules.d.ts.map +1 -0
- package/dist/internal/async/schedule/sync-schedules.js +231 -0
- package/dist/internal/async/schedule/sync-schedules.js.map +1 -0
- package/dist/internal/async/utils/ensure-namespace.d.ts +16 -0
- package/dist/internal/async/utils/ensure-namespace.d.ts.map +1 -0
- package/dist/internal/async/utils/ensure-namespace.js +64 -0
- package/dist/internal/async/utils/ensure-namespace.js.map +1 -0
- package/dist/internal/async/utils/find-package-root.d.ts +9 -0
- package/dist/internal/async/utils/find-package-root.d.ts.map +1 -0
- package/dist/internal/async/utils/find-package-root.js +28 -0
- package/dist/internal/async/utils/find-package-root.js.map +1 -0
- package/dist/internal/async/utils/is-composer-error.d.ts +14 -0
- package/dist/internal/async/utils/is-composer-error.d.ts.map +1 -0
- package/dist/internal/async/utils/is-composer-error.js +17 -0
- package/dist/internal/async/utils/is-composer-error.js.map +1 -0
- package/dist/internal/context-provider.d.ts +316 -0
- package/dist/internal/context-provider.d.ts.map +1 -0
- package/dist/internal/context-provider.js +12 -0
- package/dist/internal/context-provider.js.map +1 -0
- package/dist/internal/create-composer.d.ts +57 -0
- package/dist/internal/create-composer.d.ts.map +1 -0
- package/dist/internal/create-composer.js +125 -0
- package/dist/internal/create-composer.js.map +1 -0
- package/dist/internal/dag-sync-fanout.d.ts +79 -0
- package/dist/internal/dag-sync-fanout.d.ts.map +1 -0
- package/dist/internal/dag-sync-fanout.js +59 -0
- package/dist/internal/dag-sync-fanout.js.map +1 -0
- package/dist/internal/dag-sync-step.d.ts +230 -0
- package/dist/internal/dag-sync-step.d.ts.map +1 -0
- package/dist/internal/dag-sync-step.js +159 -0
- package/dist/internal/dag-sync-step.js.map +1 -0
- package/dist/internal/dag-sync-workflow.d.ts +535 -0
- package/dist/internal/dag-sync-workflow.d.ts.map +1 -0
- package/dist/internal/dag-sync-workflow.js +843 -0
- package/dist/internal/dag-sync-workflow.js.map +1 -0
- package/dist/internal/defaults.d.ts +24 -0
- package/dist/internal/defaults.d.ts.map +1 -0
- package/dist/internal/defaults.js +102 -0
- package/dist/internal/defaults.js.map +1 -0
- package/dist/internal/errors.d.ts +109 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +212 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/index.d.ts +9 -0
- package/dist/internal/index.d.ts.map +1 -0
- package/dist/internal/index.js +22 -0
- package/dist/internal/index.js.map +1 -0
- package/dist/internal/observability.d.ts +63 -0
- package/dist/internal/observability.d.ts.map +1 -0
- package/dist/internal/observability.js +323 -0
- package/dist/internal/observability.js.map +1 -0
- package/dist/internal/types.d.ts +80 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/internal/types.js +9 -0
- package/dist/internal/types.js.map +1 -0
- package/dist/internal/workflow-planning.d.ts +107 -0
- package/dist/internal/workflow-planning.d.ts.map +1 -0
- package/dist/internal/workflow-planning.js +216 -0
- package/dist/internal/workflow-planning.js.map +1 -0
- package/dist/schedule-sync.d.ts +17 -0
- package/dist/schedule-sync.d.ts.map +1 -0
- package/dist/schedule-sync.js +22 -0
- package/dist/schedule-sync.js.map +1 -0
- package/dist/temporal-naming.d.ts +27 -0
- package/dist/temporal-naming.d.ts.map +1 -0
- package/dist/temporal-naming.js +33 -0
- package/dist/temporal-naming.js.map +1 -0
- package/package.json +16 -17
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Schedule Sync
|
|
3
|
+
*
|
|
4
|
+
* Generic framework function that syncs a list of `ScheduleDefinition`s to the
|
|
5
|
+
* Temporal server configured on a Composer instance. Mirrors the shape of
|
|
6
|
+
* `startActivityWorker` / `startWorkflowWorker`: the caller supplies the
|
|
7
|
+
* schedules explicitly (no directory scanning), and this wrapper handles the
|
|
8
|
+
* cross-cutting concerns -- current-environment filtering, `DRY_RUN` env var,
|
|
9
|
+
* structured logging, and non-zero exit on sync errors.
|
|
10
|
+
*
|
|
11
|
+
* ## Usage
|
|
12
|
+
*
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { runScheduleSync } from "@lotiai/composer";
|
|
15
|
+
* import { composer } from "./my-app-composer";
|
|
16
|
+
* import * as schedules from "./schedules";
|
|
17
|
+
*
|
|
18
|
+
* await runScheduleSync(composer, {
|
|
19
|
+
* schedules: Object.values(schedules).filter(isScheduleDefinition),
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @module sync-schedules
|
|
24
|
+
*/
|
|
25
|
+
import type { Composer } from "../../context-provider";
|
|
26
|
+
import type { ScheduleDefinition } from "../schedule/define-schedule";
|
|
27
|
+
/**
|
|
28
|
+
* Options for `runScheduleSync`.
|
|
29
|
+
*/
|
|
30
|
+
export interface SyncScheduleScriptOptions {
|
|
31
|
+
/**
|
|
32
|
+
* Schedule definitions to reconcile against the Temporal server.
|
|
33
|
+
* The caller is responsible for discovering these (typically by filtering a
|
|
34
|
+
* schedules barrel export with `isScheduleDefinition`).
|
|
35
|
+
*/
|
|
36
|
+
schedules: ScheduleDefinition[];
|
|
37
|
+
/**
|
|
38
|
+
* Name of the current environment (e.g. "prod"). Used to filter schedules
|
|
39
|
+
* that declare an `environments` allowlist.
|
|
40
|
+
*
|
|
41
|
+
* @default process.env.ENVIRONMENT_NAME
|
|
42
|
+
*/
|
|
43
|
+
currentEnvironment?: string | null;
|
|
44
|
+
/**
|
|
45
|
+
* If true, log what would happen without making changes on the server.
|
|
46
|
+
*
|
|
47
|
+
* @default process.env.COMPOSER_SCHEDULE_SYNC_DRY_RUN === "true"
|
|
48
|
+
*/
|
|
49
|
+
dryRun?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Reconciles composer-managed Temporal schedules with the supplied list using
|
|
53
|
+
* the Composer's configured Temporal connection.
|
|
54
|
+
*
|
|
55
|
+
* This function:
|
|
56
|
+
* 1. Resolves the current environment (options or `ENVIRONMENT_NAME`) and
|
|
57
|
+
* dry-run flag (options or `DRY_RUN`).
|
|
58
|
+
* 2. Filters schedules by their `environments` allowlist.
|
|
59
|
+
* 3. Logs the resolved configuration and any skipped schedules.
|
|
60
|
+
* 4. Delegates to `composer.syncSchedules()` for the actual reconciliation.
|
|
61
|
+
* 5. Logs a create/update/delete summary.
|
|
62
|
+
* 6. Exits with code 1 if any schedule failed to sync.
|
|
63
|
+
*
|
|
64
|
+
* @param composer - Composer instance providing the Temporal connection + logger
|
|
65
|
+
* @param options - Schedules, current environment, and dry-run flag
|
|
66
|
+
*/
|
|
67
|
+
export declare function runScheduleSync<TContext>(composer: Composer<TContext>, options: SyncScheduleScriptOptions): Promise<void>;
|
|
68
|
+
//# sourceMappingURL=sync-schedules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-schedules.d.ts","sourceRoot":"","sources":["../../../../src/internal/async/register-scripts/sync-schedules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;OAIG;IACH,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAEhC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAC5C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5B,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAqEf"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runScheduleSync = runScheduleSync;
|
|
4
|
+
/**
|
|
5
|
+
* Reconciles composer-managed Temporal schedules with the supplied list using
|
|
6
|
+
* the Composer's configured Temporal connection.
|
|
7
|
+
*
|
|
8
|
+
* This function:
|
|
9
|
+
* 1. Resolves the current environment (options or `ENVIRONMENT_NAME`) and
|
|
10
|
+
* dry-run flag (options or `DRY_RUN`).
|
|
11
|
+
* 2. Filters schedules by their `environments` allowlist.
|
|
12
|
+
* 3. Logs the resolved configuration and any skipped schedules.
|
|
13
|
+
* 4. Delegates to `composer.syncSchedules()` for the actual reconciliation.
|
|
14
|
+
* 5. Logs a create/update/delete summary.
|
|
15
|
+
* 6. Exits with code 1 if any schedule failed to sync.
|
|
16
|
+
*
|
|
17
|
+
* @param composer - Composer instance providing the Temporal connection + logger
|
|
18
|
+
* @param options - Schedules, current environment, and dry-run flag
|
|
19
|
+
*/
|
|
20
|
+
async function runScheduleSync(composer, options) {
|
|
21
|
+
const logger = composer.logger;
|
|
22
|
+
const { serverAddress, namespace } = composer.temporal;
|
|
23
|
+
const currentEnvironment = options.currentEnvironment ?? process.env.ENVIRONMENT_NAME ?? null;
|
|
24
|
+
const dryRun = options.dryRun ?? process.env.COMPOSER_SCHEDULE_SYNC_DRY_RUN === "true";
|
|
25
|
+
if (currentEnvironment === null && options.schedules.length > 0) {
|
|
26
|
+
logger.error("Cannot sync schedules: no current environment was provided", {
|
|
27
|
+
hint: "Set ENVIRONMENT_NAME or pass options.currentEnvironment to runScheduleSync",
|
|
28
|
+
scheduleCount: options.schedules.length,
|
|
29
|
+
});
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const activeSchedules = [];
|
|
33
|
+
const skippedSchedules = [];
|
|
34
|
+
for (const schedule of options.schedules) {
|
|
35
|
+
if (currentEnvironment !== null && schedule.environments.includes(currentEnvironment)) {
|
|
36
|
+
activeSchedules.push(schedule);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
skippedSchedules.push({
|
|
40
|
+
scheduleId: schedule.scheduleId,
|
|
41
|
+
environments: schedule.environments,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
logger.info("Syncing Temporal schedules", {
|
|
46
|
+
serverAddress,
|
|
47
|
+
namespace,
|
|
48
|
+
currentEnvironment,
|
|
49
|
+
dryRun,
|
|
50
|
+
active: activeSchedules.length,
|
|
51
|
+
skipped: skippedSchedules.length,
|
|
52
|
+
});
|
|
53
|
+
for (const { scheduleId, environments } of skippedSchedules) {
|
|
54
|
+
logger.debug("Skipping schedule (not active in current environment)", {
|
|
55
|
+
scheduleId,
|
|
56
|
+
environments,
|
|
57
|
+
currentEnvironment,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const result = await composer.syncSchedules(activeSchedules, { dryRun });
|
|
62
|
+
logger.info("Schedule sync complete", {
|
|
63
|
+
dryRun,
|
|
64
|
+
created: result.created.length,
|
|
65
|
+
updated: result.updated.length,
|
|
66
|
+
deleted: result.deleted.length,
|
|
67
|
+
errors: result.errors.length,
|
|
68
|
+
});
|
|
69
|
+
if (result.errors.length > 0) {
|
|
70
|
+
for (const { scheduleId, error } of result.errors) {
|
|
71
|
+
logger.error("Schedule failed to sync", { scheduleId, error });
|
|
72
|
+
}
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
logger.error("Failed to sync Temporal schedules", {
|
|
78
|
+
error: error instanceof Error ? error.message : String(error),
|
|
79
|
+
});
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=sync-schedules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-schedules.js","sourceRoot":"","sources":["../../../../src/internal/async/register-scripts/sync-schedules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memo key and value used to tag schedules managed by composer.
|
|
3
|
+
*
|
|
4
|
+
* During sync, only schedules with this memo are considered for update
|
|
5
|
+
* or deletion. Schedules without it (manually created or from other
|
|
6
|
+
* systems) are never touched.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MANAGED_BY_MEMO_KEY = "managedBy";
|
|
9
|
+
export declare const MANAGED_BY_MEMO_VALUE = "composer";
|
|
10
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/internal/async/schedule/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,qBAAqB,aAAa,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MANAGED_BY_MEMO_VALUE = exports.MANAGED_BY_MEMO_KEY = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Memo key and value used to tag schedules managed by composer.
|
|
6
|
+
*
|
|
7
|
+
* During sync, only schedules with this memo are considered for update
|
|
8
|
+
* or deletion. Schedules without it (manually created or from other
|
|
9
|
+
* systems) are never touched.
|
|
10
|
+
*/
|
|
11
|
+
exports.MANAGED_BY_MEMO_KEY = "managedBy";
|
|
12
|
+
exports.MANAGED_BY_MEMO_VALUE = "composer";
|
|
13
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/internal/async/schedule/constants.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACU,QAAA,mBAAmB,GAAG,WAAW,CAAC;AAClC,QAAA,qBAAqB,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schedule Definition
|
|
3
|
+
*
|
|
4
|
+
* Provides the `defineSchedule()` function for declaring Temporal schedule
|
|
5
|
+
* definitions that reference composer workflows. Schedule definitions are
|
|
6
|
+
* declarative -- they describe what should be scheduled, not how to create
|
|
7
|
+
* the schedule on the Temporal server (that's handled at sync time by
|
|
8
|
+
* `composer.syncSchedules()` / `runScheduleSync()`).
|
|
9
|
+
*
|
|
10
|
+
* Consumers export schedule definitions from a barrel (typically
|
|
11
|
+
* `src/schedules/index.ts`) and pass them explicitly to a sync entrypoint --
|
|
12
|
+
* the same "pass it in" pattern used for workflows and steps.
|
|
13
|
+
*
|
|
14
|
+
* @module define-schedule
|
|
15
|
+
*/
|
|
16
|
+
import type { ScheduleSpec } from "@temporalio/client";
|
|
17
|
+
import { ScheduleOverlapPolicy } from "@temporalio/client";
|
|
18
|
+
import type { ExtractWorkflowBag, ExtractWorkflowConfig, ExtractWorkflowRequiredInitial, Workflow } from "../../dag-sync-workflow";
|
|
19
|
+
export type { ScheduleSpec } from "@temporalio/client";
|
|
20
|
+
export { ScheduleOverlapPolicy } from "@temporalio/client";
|
|
21
|
+
/**
|
|
22
|
+
* Extracts the required initial data type for a workflow, combining
|
|
23
|
+
* RequiredInitial fields with ConfiguredValues keys.
|
|
24
|
+
*
|
|
25
|
+
* - If the workflow has RequiredInitial fields, those must be provided.
|
|
26
|
+
* - ConfiguredValues are already baked into the workflow and don't need
|
|
27
|
+
* to be provided in initialData.
|
|
28
|
+
*/
|
|
29
|
+
type ScheduleInitialData<W extends Workflow<any, any, any, any, any>> = [
|
|
30
|
+
ExtractWorkflowRequiredInitial<W>
|
|
31
|
+
] extends [never] ? Partial<ExtractWorkflowBag<W>> | undefined : Partial<ExtractWorkflowBag<W>> & Pick<ExtractWorkflowBag<W>, Exclude<ExtractWorkflowRequiredInitial<W>, keyof ExtractWorkflowConfig<W>>>;
|
|
32
|
+
/**
|
|
33
|
+
* Options for defining a schedule.
|
|
34
|
+
*
|
|
35
|
+
* @typeParam W - The workflow type this schedule is for
|
|
36
|
+
*/
|
|
37
|
+
export interface ScheduleDefinitionOptions<W extends Workflow<any, any, any, any, any>> {
|
|
38
|
+
/**
|
|
39
|
+
* Unique, stable identifier for this schedule on the Temporal server.
|
|
40
|
+
*
|
|
41
|
+
* This ID persists across deployments -- it's how `syncSchedules()` knows
|
|
42
|
+
* which schedule to update. Choose a descriptive, kebab-case name.
|
|
43
|
+
*
|
|
44
|
+
* @example "daily-report", "weekly-cleanup", "hourly-health-check"
|
|
45
|
+
*/
|
|
46
|
+
scheduleId: string;
|
|
47
|
+
/**
|
|
48
|
+
* The workflow to execute on this schedule.
|
|
49
|
+
*
|
|
50
|
+
* Pass the workflow definition object (the result of `createWorkflow(...).build(...)`.
|
|
51
|
+
*/
|
|
52
|
+
workflow: W;
|
|
53
|
+
/**
|
|
54
|
+
* Static initial data for scheduled runs.
|
|
55
|
+
*
|
|
56
|
+
* Type-safe: must satisfy the workflow's RequiredInitial constraint.
|
|
57
|
+
* For workflows with no required initial fields, this is optional.
|
|
58
|
+
*/
|
|
59
|
+
initialData: ScheduleInitialData<W>;
|
|
60
|
+
/**
|
|
61
|
+
* When the schedule should fire.
|
|
62
|
+
*
|
|
63
|
+
* Uses Temporal's `ScheduleSpec` type directly. Supports:
|
|
64
|
+
* - `calendars`: Calendar-based times (like cron but more readable)
|
|
65
|
+
* - `intervals`: Repeating intervals (e.g., every 1 hour)
|
|
66
|
+
* - `cronExpressions`: Legacy cron strings
|
|
67
|
+
* - `timezone`: IANA timezone (default: UTC)
|
|
68
|
+
* - `jitter`: Random jitter added to each trigger time
|
|
69
|
+
* - `startAt` / `endAt`: Time bounds
|
|
70
|
+
* - `skip`: Calendar specs for times to exclude
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* // Every day at 2am UTC
|
|
74
|
+
* { calendars: [{ hour: 2 }] }
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* // Every Monday at 8:30am Eastern
|
|
78
|
+
* { calendars: [{ hour: 8, minute: 30, dayOfWeek: "MONDAY" }], timezone: "US/Eastern" }
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* // Every hour
|
|
82
|
+
* { intervals: [{ every: "1h" }] }
|
|
83
|
+
*/
|
|
84
|
+
spec: ScheduleSpec;
|
|
85
|
+
/**
|
|
86
|
+
* What happens when a new run would start while a previous is still running.
|
|
87
|
+
*
|
|
88
|
+
* @default ScheduleOverlapPolicy.SKIP
|
|
89
|
+
*/
|
|
90
|
+
overlap?: ScheduleOverlapPolicy;
|
|
91
|
+
/**
|
|
92
|
+
* Maximum time period for catching up missed runs.
|
|
93
|
+
*
|
|
94
|
+
* If the Temporal server was down or the schedule was paused, this controls
|
|
95
|
+
* how far back it will try to execute missed runs on recovery.
|
|
96
|
+
*
|
|
97
|
+
* Accepts ms-formatted strings (e.g., "1d", "1h") or milliseconds as a number.
|
|
98
|
+
*
|
|
99
|
+
* @default "1 minute" (Temporal's default)
|
|
100
|
+
* @example "1 day", "1h", "0" (no catchup)
|
|
101
|
+
*/
|
|
102
|
+
catchupWindow?: number | string;
|
|
103
|
+
/**
|
|
104
|
+
* Whether to create the schedule in a paused state.
|
|
105
|
+
*
|
|
106
|
+
* @default false
|
|
107
|
+
*/
|
|
108
|
+
paused?: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Human-readable note about this schedule.
|
|
111
|
+
* Visible in the Temporal UI.
|
|
112
|
+
*/
|
|
113
|
+
note?: string;
|
|
114
|
+
/**
|
|
115
|
+
* Task queue for the scheduled workflow.
|
|
116
|
+
* @default "workflow-tasks"
|
|
117
|
+
*/
|
|
118
|
+
taskQueue?: string;
|
|
119
|
+
/**
|
|
120
|
+
* Environments in which this schedule should be active.
|
|
121
|
+
*
|
|
122
|
+
* Must be a non-empty list of environment names (e.g. `"prod"`, `"preview"`).
|
|
123
|
+
* At sync time, the schedule is only reconciled when the current environment
|
|
124
|
+
* (`ENVIRONMENT_NAME`) matches one of these values. This keeps
|
|
125
|
+
* production-only schedules from running in preview / local environments.
|
|
126
|
+
*
|
|
127
|
+
* @example ["prod"]
|
|
128
|
+
* @example ["preview", "prod"]
|
|
129
|
+
*/
|
|
130
|
+
environments: readonly string[];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* A schedule definition ready for syncing to the Temporal server.
|
|
134
|
+
*
|
|
135
|
+
* This is the runtime representation produced by `defineSchedule()`.
|
|
136
|
+
* It carries the workflow name (extracted from the workflow definition)
|
|
137
|
+
* and all schedule configuration.
|
|
138
|
+
*/
|
|
139
|
+
export interface ScheduleDefinition {
|
|
140
|
+
/** Marker for type guard identification */
|
|
141
|
+
readonly __scheduleDefinition: true;
|
|
142
|
+
/** Unique schedule ID on the Temporal server */
|
|
143
|
+
readonly scheduleId: string;
|
|
144
|
+
/** Workflow name (unversioned -- versioning is applied at sync time) */
|
|
145
|
+
readonly workflowName: string;
|
|
146
|
+
/** Static initial data for scheduled runs */
|
|
147
|
+
readonly initialData: Record<string, unknown>;
|
|
148
|
+
/** Configured values from the workflow (merged at sync time, overriding initialData) */
|
|
149
|
+
readonly configuredValues: Record<string, unknown>;
|
|
150
|
+
/** When the schedule should fire */
|
|
151
|
+
readonly spec: ScheduleSpec;
|
|
152
|
+
/** Overlap policy */
|
|
153
|
+
readonly overlap: ScheduleOverlapPolicy;
|
|
154
|
+
/** Catchup window for missed runs */
|
|
155
|
+
readonly catchupWindow?: number | string;
|
|
156
|
+
/** Whether to create in paused state */
|
|
157
|
+
readonly paused: boolean;
|
|
158
|
+
/** Human-readable note */
|
|
159
|
+
readonly note?: string;
|
|
160
|
+
/** Task queue */
|
|
161
|
+
readonly taskQueue: string;
|
|
162
|
+
/** Environments in which this schedule should be active (non-empty). */
|
|
163
|
+
readonly environments: readonly string[];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Defines a Temporal schedule for a composer workflow.
|
|
167
|
+
*
|
|
168
|
+
* Creates a typed, declarative schedule definition that consumers export from
|
|
169
|
+
* a `schedules/` barrel and pass explicitly to a sync entrypoint (e.g.
|
|
170
|
+
* `runScheduleSync()`), mirroring how workflows are passed to
|
|
171
|
+
* `startWorkflowWorker()`.
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```typescript
|
|
175
|
+
* import { defineSchedule, ScheduleOverlapPolicy } from "@lotiai/composer";
|
|
176
|
+
* import { dailyReportWorkflow } from "../workflows/daily-report-workflow";
|
|
177
|
+
*
|
|
178
|
+
* export const dailyReport = defineSchedule({
|
|
179
|
+
* scheduleId: "daily-report",
|
|
180
|
+
* workflow: dailyReportWorkflow,
|
|
181
|
+
* initialData: { reportType: "daily" },
|
|
182
|
+
* environments: ["prod"],
|
|
183
|
+
* spec: {
|
|
184
|
+
* calendars: [{ hour: 8, minute: 0 }],
|
|
185
|
+
* timezone: "US/Eastern",
|
|
186
|
+
* },
|
|
187
|
+
* overlap: ScheduleOverlapPolicy.SKIP,
|
|
188
|
+
* });
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
export declare function defineSchedule<W extends Workflow<any, any, any, any, any>>(options: ScheduleDefinitionOptions<W>): ScheduleDefinition;
|
|
192
|
+
//# sourceMappingURL=define-schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-schedule.d.ts","sourceRoot":"","sources":["../../../../src/internal/async/schedule/define-schedule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,8BAA8B,EAC9B,QAAQ,EACT,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;GAOG;AACH,KAAK,mBAAmB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI;IACtE,8BAA8B,CAAC,CAAC,CAAC;CAClC,SAAS,CAAC,KAAK,CAAC,GACb,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAC1C,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAC5B,IAAI,CACF,kBAAkB,CAAC,CAAC,CAAC,EACrB,OAAO,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE,MAAM,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAC3E,CAAC;AAER;;;;GAIG;AACH,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACpF;;;;;;;OAOG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,QAAQ,EAAE,CAAC,CAAC;IAEZ;;;;;OAKG;IACH,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAEpC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,IAAI,EAAE,YAAY,CAAC;IAEnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAEhC;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEhC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;;;OAUG;IACH,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC;IAEpC,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9C,wFAAwF;IACxF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnD,oCAAoC;IACpC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAE5B,qBAAqB;IACrB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IAExC,qCAAqC;IACrC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEzC,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEvB,iBAAiB;IACjB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACxE,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,GACpC,kBAAkB,CAqCpB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Schedule Definition
|
|
4
|
+
*
|
|
5
|
+
* Provides the `defineSchedule()` function for declaring Temporal schedule
|
|
6
|
+
* definitions that reference composer workflows. Schedule definitions are
|
|
7
|
+
* declarative -- they describe what should be scheduled, not how to create
|
|
8
|
+
* the schedule on the Temporal server (that's handled at sync time by
|
|
9
|
+
* `composer.syncSchedules()` / `runScheduleSync()`).
|
|
10
|
+
*
|
|
11
|
+
* Consumers export schedule definitions from a barrel (typically
|
|
12
|
+
* `src/schedules/index.ts`) and pass them explicitly to a sync entrypoint --
|
|
13
|
+
* the same "pass it in" pattern used for workflows and steps.
|
|
14
|
+
*
|
|
15
|
+
* @module define-schedule
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.ScheduleOverlapPolicy = void 0;
|
|
19
|
+
exports.defineSchedule = defineSchedule;
|
|
20
|
+
const client_1 = require("@temporalio/client");
|
|
21
|
+
var client_2 = require("@temporalio/client");
|
|
22
|
+
Object.defineProperty(exports, "ScheduleOverlapPolicy", { enumerable: true, get: function () { return client_2.ScheduleOverlapPolicy; } });
|
|
23
|
+
/**
|
|
24
|
+
* Defines a Temporal schedule for a composer workflow.
|
|
25
|
+
*
|
|
26
|
+
* Creates a typed, declarative schedule definition that consumers export from
|
|
27
|
+
* a `schedules/` barrel and pass explicitly to a sync entrypoint (e.g.
|
|
28
|
+
* `runScheduleSync()`), mirroring how workflows are passed to
|
|
29
|
+
* `startWorkflowWorker()`.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* import { defineSchedule, ScheduleOverlapPolicy } from "@lotiai/composer";
|
|
34
|
+
* import { dailyReportWorkflow } from "../workflows/daily-report-workflow";
|
|
35
|
+
*
|
|
36
|
+
* export const dailyReport = defineSchedule({
|
|
37
|
+
* scheduleId: "daily-report",
|
|
38
|
+
* workflow: dailyReportWorkflow,
|
|
39
|
+
* initialData: { reportType: "daily" },
|
|
40
|
+
* environments: ["prod"],
|
|
41
|
+
* spec: {
|
|
42
|
+
* calendars: [{ hour: 8, minute: 0 }],
|
|
43
|
+
* timezone: "US/Eastern",
|
|
44
|
+
* },
|
|
45
|
+
* overlap: ScheduleOverlapPolicy.SKIP,
|
|
46
|
+
* });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
function defineSchedule(options) {
|
|
50
|
+
if (!options.scheduleId || typeof options.scheduleId !== "string") {
|
|
51
|
+
throw new Error("scheduleId is required and must be a non-empty string");
|
|
52
|
+
}
|
|
53
|
+
if (!options.workflow || typeof options.workflow.name !== "string") {
|
|
54
|
+
throw new Error("workflow is required and must be a valid workflow definition");
|
|
55
|
+
}
|
|
56
|
+
if (!options.spec) {
|
|
57
|
+
throw new Error("spec is required -- define when the schedule should fire");
|
|
58
|
+
}
|
|
59
|
+
if (!Array.isArray(options.environments) ||
|
|
60
|
+
options.environments.length === 0 ||
|
|
61
|
+
!options.environments.every((env) => typeof env === "string" && env.length > 0)) {
|
|
62
|
+
throw new Error(`environments is required for schedule "${options.scheduleId}" and must be a non-empty array of environment names (e.g. ["prod"])`);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
__scheduleDefinition: true,
|
|
66
|
+
scheduleId: options.scheduleId,
|
|
67
|
+
workflowName: options.workflow.name,
|
|
68
|
+
initialData: (options.initialData ?? {}),
|
|
69
|
+
configuredValues: (options.workflow.configuredValues ?? {}),
|
|
70
|
+
spec: options.spec,
|
|
71
|
+
overlap: options.overlap ?? client_1.ScheduleOverlapPolicy.SKIP,
|
|
72
|
+
catchupWindow: options.catchupWindow,
|
|
73
|
+
paused: options.paused ?? false,
|
|
74
|
+
note: options.note,
|
|
75
|
+
taskQueue: options.taskQueue ?? "workflow-tasks",
|
|
76
|
+
environments: [...options.environments],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=define-schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-schedule.js","sourceRoot":"","sources":["../../../../src/internal/async/schedule/define-schedule.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAqNH,wCAuCC;AAzPD,+CAA2D;AAS3D,6CAA2D;AAAlD,+GAAA,qBAAqB,OAAA;AA+K9B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,SAAgB,cAAc,CAC5B,OAAqC;IAErC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;QACpC,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QACjC,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EAC/E,CAAC;QACD,MAAM,IAAI,KAAK,CACb,0CAA0C,OAAO,CAAC,UAAU,sEAAsE,CACnI,CAAC;IACJ,CAAC;IAED,OAAO;QACL,oBAAoB,EAAE,IAAI;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;QACnC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAA4B;QACnE,gBAAgB,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,IAAI,EAAE,CAA4B;QACtF,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,8BAAqB,CAAC,IAAI;QACtD,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,gBAAgB;QAChD,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { defineSchedule, type ScheduleDefinition, type ScheduleDefinitionOptions, ScheduleOverlapPolicy, type ScheduleSpec, } from "./define-schedule";
|
|
2
|
+
export { type SyncSchedulesConfig, type SyncSchedulesResult, syncSchedules, type TemporalScheduleConfig, } from "./sync-schedules";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/internal/async/schedule/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,qBAAqB,EACrB,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,aAAa,EACb,KAAK,sBAAsB,GAC5B,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncSchedules = exports.ScheduleOverlapPolicy = exports.defineSchedule = void 0;
|
|
4
|
+
var define_schedule_1 = require("./define-schedule");
|
|
5
|
+
Object.defineProperty(exports, "defineSchedule", { enumerable: true, get: function () { return define_schedule_1.defineSchedule; } });
|
|
6
|
+
Object.defineProperty(exports, "ScheduleOverlapPolicy", { enumerable: true, get: function () { return define_schedule_1.ScheduleOverlapPolicy; } });
|
|
7
|
+
var sync_schedules_1 = require("./sync-schedules");
|
|
8
|
+
Object.defineProperty(exports, "syncSchedules", { enumerable: true, get: function () { return sync_schedules_1.syncSchedules; } });
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/internal/async/schedule/index.ts"],"names":[],"mappings":";;;AAAA,qDAM2B;AALzB,iHAAA,cAAc,OAAA;AAGd,wHAAA,qBAAqB,OAAA;AAGvB,mDAK0B;AAFxB,+GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schema for `ScheduleDefinition`.
|
|
3
|
+
*
|
|
4
|
+
* Used at trust boundaries where schedule definitions arrive as JSON from
|
|
5
|
+
* another process -- notably the `schedule-sync` Lambda's event payload. The
|
|
6
|
+
* schema mirrors the `ScheduleDefinition` interface and matches the shape
|
|
7
|
+
* produced by `defineSchedule()`.
|
|
8
|
+
*
|
|
9
|
+
* @module schedule-definition-schema
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
/**
|
|
13
|
+
* Overlap policy values accepted by `ScheduleDefinition.overlap`.
|
|
14
|
+
*
|
|
15
|
+
* Mirrors the string values exported by `@temporalio/client`'s
|
|
16
|
+
* `ScheduleOverlapPolicy` (excluding the deprecated `UNSPECIFIED`). Hand-listed
|
|
17
|
+
* rather than derived from the SDK object because the SDK includes an
|
|
18
|
+
* `UNSPECIFIED: undefined` entry that is not a valid Zod enum value.
|
|
19
|
+
*/
|
|
20
|
+
export declare const scheduleOverlapPolicySchema: z.ZodEnum<{
|
|
21
|
+
SKIP: "SKIP";
|
|
22
|
+
BUFFER_ONE: "BUFFER_ONE";
|
|
23
|
+
BUFFER_ALL: "BUFFER_ALL";
|
|
24
|
+
CANCEL_OTHER: "CANCEL_OTHER";
|
|
25
|
+
TERMINATE_OTHER: "TERMINATE_OTHER";
|
|
26
|
+
ALLOW_ALL: "ALLOW_ALL";
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* Zod schema for `ScheduleDefinition`.
|
|
30
|
+
*
|
|
31
|
+
* Structurally mirrors the `ScheduleDefinition` interface produced by
|
|
32
|
+
* `defineSchedule()`. Used at trust boundaries where schedule definitions
|
|
33
|
+
* arrive as JSON from another process -- notably the schedule-sync Lambda.
|
|
34
|
+
*
|
|
35
|
+
* Note: the inferred output type preserves structural compatibility with
|
|
36
|
+
* `ScheduleDefinition`, but `spec` widens to a loose object. Callers handing
|
|
37
|
+
* the parsed value to `syncSchedules()` should cast the array as
|
|
38
|
+
* `ScheduleDefinition[]`.
|
|
39
|
+
*/
|
|
40
|
+
export declare const scheduleDefinitionSchema: z.ZodObject<{
|
|
41
|
+
__scheduleDefinition: z.ZodLiteral<true>;
|
|
42
|
+
scheduleId: z.ZodString;
|
|
43
|
+
workflowName: z.ZodString;
|
|
44
|
+
initialData: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
45
|
+
configuredValues: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
46
|
+
spec: z.ZodObject<{
|
|
47
|
+
startAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
48
|
+
endAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
49
|
+
}, z.core.$loose>;
|
|
50
|
+
overlap: z.ZodEnum<{
|
|
51
|
+
SKIP: "SKIP";
|
|
52
|
+
BUFFER_ONE: "BUFFER_ONE";
|
|
53
|
+
BUFFER_ALL: "BUFFER_ALL";
|
|
54
|
+
CANCEL_OTHER: "CANCEL_OTHER";
|
|
55
|
+
TERMINATE_OTHER: "TERMINATE_OTHER";
|
|
56
|
+
ALLOW_ALL: "ALLOW_ALL";
|
|
57
|
+
}>;
|
|
58
|
+
catchupWindow: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>;
|
|
59
|
+
paused: z.ZodBoolean;
|
|
60
|
+
note: z.ZodOptional<z.ZodString>;
|
|
61
|
+
taskQueue: z.ZodString;
|
|
62
|
+
environments: z.ZodArray<z.ZodString>;
|
|
63
|
+
}, z.core.$strict>;
|
|
64
|
+
//# sourceMappingURL=schedule-definition-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-definition-schema.d.ts","sourceRoot":"","sources":["../../../../src/internal/async/schedule/schedule-definition-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B;;;;;;;EAOtC,CAAC;AAuBH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;kBAanC,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scheduleDefinitionSchema = exports.scheduleOverlapPolicySchema = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Zod schema for `ScheduleDefinition`.
|
|
6
|
+
*
|
|
7
|
+
* Used at trust boundaries where schedule definitions arrive as JSON from
|
|
8
|
+
* another process -- notably the `schedule-sync` Lambda's event payload. The
|
|
9
|
+
* schema mirrors the `ScheduleDefinition` interface and matches the shape
|
|
10
|
+
* produced by `defineSchedule()`.
|
|
11
|
+
*
|
|
12
|
+
* @module schedule-definition-schema
|
|
13
|
+
*/
|
|
14
|
+
const zod_1 = require("zod");
|
|
15
|
+
/**
|
|
16
|
+
* Overlap policy values accepted by `ScheduleDefinition.overlap`.
|
|
17
|
+
*
|
|
18
|
+
* Mirrors the string values exported by `@temporalio/client`'s
|
|
19
|
+
* `ScheduleOverlapPolicy` (excluding the deprecated `UNSPECIFIED`). Hand-listed
|
|
20
|
+
* rather than derived from the SDK object because the SDK includes an
|
|
21
|
+
* `UNSPECIFIED: undefined` entry that is not a valid Zod enum value.
|
|
22
|
+
*/
|
|
23
|
+
exports.scheduleOverlapPolicySchema = zod_1.z.enum([
|
|
24
|
+
"SKIP",
|
|
25
|
+
"BUFFER_ONE",
|
|
26
|
+
"BUFFER_ALL",
|
|
27
|
+
"CANCEL_OTHER",
|
|
28
|
+
"TERMINATE_OTHER",
|
|
29
|
+
"ALLOW_ALL",
|
|
30
|
+
]);
|
|
31
|
+
/**
|
|
32
|
+
* Zod schema for `ScheduleSpec`.
|
|
33
|
+
*
|
|
34
|
+
* Passes unrecognized fields through untouched so detailed `ScheduleSpec`
|
|
35
|
+
* shape validation stays with the Temporal client (which runs downstream of
|
|
36
|
+
* this schema). The known `Date`-valued fields (`startAt`, `endAt`) are
|
|
37
|
+
* explicitly coerced because schedule definitions are `JSON.stringify`ed
|
|
38
|
+
* when shipped to the schedule-sync Lambda, which loses `Date` identity --
|
|
39
|
+
* without this coercion, `startAt`/`endAt` would arrive as ISO strings and
|
|
40
|
+
* the Temporal client would reject them when constructing the protobuf
|
|
41
|
+
* payload.
|
|
42
|
+
*
|
|
43
|
+
* `z.coerce.date()` accepts both real `Date` instances (direct path, where
|
|
44
|
+
* this schema is not strictly needed but may still be applied) and ISO
|
|
45
|
+
* strings (Lambda path, after JSON round-trip).
|
|
46
|
+
*/
|
|
47
|
+
const scheduleSpecSchema = zod_1.z.looseObject({
|
|
48
|
+
startAt: zod_1.z.coerce.date().optional(),
|
|
49
|
+
endAt: zod_1.z.coerce.date().optional(),
|
|
50
|
+
});
|
|
51
|
+
/**
|
|
52
|
+
* Zod schema for `ScheduleDefinition`.
|
|
53
|
+
*
|
|
54
|
+
* Structurally mirrors the `ScheduleDefinition` interface produced by
|
|
55
|
+
* `defineSchedule()`. Used at trust boundaries where schedule definitions
|
|
56
|
+
* arrive as JSON from another process -- notably the schedule-sync Lambda.
|
|
57
|
+
*
|
|
58
|
+
* Note: the inferred output type preserves structural compatibility with
|
|
59
|
+
* `ScheduleDefinition`, but `spec` widens to a loose object. Callers handing
|
|
60
|
+
* the parsed value to `syncSchedules()` should cast the array as
|
|
61
|
+
* `ScheduleDefinition[]`.
|
|
62
|
+
*/
|
|
63
|
+
exports.scheduleDefinitionSchema = zod_1.z.strictObject({
|
|
64
|
+
__scheduleDefinition: zod_1.z.literal(true),
|
|
65
|
+
scheduleId: zod_1.z.string().min(1),
|
|
66
|
+
workflowName: zod_1.z.string().min(1),
|
|
67
|
+
initialData: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()),
|
|
68
|
+
configuredValues: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()),
|
|
69
|
+
spec: scheduleSpecSchema,
|
|
70
|
+
overlap: exports.scheduleOverlapPolicySchema,
|
|
71
|
+
catchupWindow: zod_1.z.union([zod_1.z.number(), zod_1.z.string()]).optional(),
|
|
72
|
+
paused: zod_1.z.boolean(),
|
|
73
|
+
note: zod_1.z.string().optional(),
|
|
74
|
+
taskQueue: zod_1.z.string().min(1),
|
|
75
|
+
environments: zod_1.z.array(zod_1.z.string().min(1)).min(1),
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=schedule-definition-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-definition-schema.js","sourceRoot":"","sources":["../../../../src/internal/async/schedule/schedule-definition-schema.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;GASG;AACH,6BAAwB;AAExB;;;;;;;GAOG;AACU,QAAA,2BAA2B,GAAG,OAAC,CAAC,IAAI,CAAC;IAChD,MAAM;IACN,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,WAAW;CACZ,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,kBAAkB,GAAG,OAAC,CAAC,WAAW,CAAC;IACvC,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACU,QAAA,wBAAwB,GAAG,OAAC,CAAC,YAAY,CAAC;IACrD,oBAAoB,EAAE,OAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,gBAAgB,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC;IACnD,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,mCAA2B;IACpC,aAAa,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3D,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE;IACnB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,YAAY,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAChD,CAAC,CAAC"}
|