@astami/temporal-functions 0.1.0
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/README.md +215 -0
- package/dist/client/index.d.mts +34 -0
- package/dist/client/index.d.ts +34 -0
- package/dist/client/index.js +168 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.mjs +162 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/index.d.mts +133 -0
- package/dist/index.d.ts +133 -0
- package/dist/index.js +120 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +111 -0
- package/dist/index.mjs.map +1 -0
- package/dist/testing/index.d.mts +74 -0
- package/dist/testing/index.d.ts +74 -0
- package/dist/testing/index.js +129 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/index.mjs +121 -0
- package/dist/testing/index.mjs.map +1 -0
- package/dist/types-C-cNq1Id.d.mts +292 -0
- package/dist/types-C-cNq1Id.d.ts +292 -0
- package/dist/worker/index.d.mts +37 -0
- package/dist/worker/index.d.ts +37 -0
- package/dist/worker/index.js +239 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/index.mjs +233 -0
- package/dist/worker/index.mjs.map +1 -0
- package/package.json +87 -0
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { F as FunctionOptions, a as FunctionDef, W as WorkflowHandler, b as WorkflowOptions, c as WorkflowDef, H as HttpTriggerOptions, C as CronTriggerOptions, R as Registry } from './types-C-cNq1Id.mjs';
|
|
2
|
+
export { g as ClientConfig, f as RetryPolicy, S as StartWorkflowOptions, j as TFNClient, k as TFNWorker, T as TemporalConfig, h as WorkerConfig, d as WorkflowContext, i as WorkflowHandle, e as WorkflowInfo } from './types-C-cNq1Id.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Temporal Functions - Main Entry Point
|
|
6
|
+
*
|
|
7
|
+
* This module provides the core API for defining functions and workflows.
|
|
8
|
+
* Import from 'temporal-functions' for function/workflow definitions.
|
|
9
|
+
* Import from 'temporal-functions/client' for triggering workflows.
|
|
10
|
+
* Import from 'temporal-functions/worker' for running workers.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Global registry for all defined functions and workflows
|
|
15
|
+
*/
|
|
16
|
+
declare const registry: Registry;
|
|
17
|
+
/**
|
|
18
|
+
* Define a function (maps to a Temporal Activity)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* export const sendEmail = tfn.fn(
|
|
23
|
+
* 'sendEmail',
|
|
24
|
+
* async (params: EmailParams) => {
|
|
25
|
+
* return await emailService.send(params);
|
|
26
|
+
* },
|
|
27
|
+
* { timeout: '30s', retries: 3 }
|
|
28
|
+
* );
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
declare function fn<TInput, TOutput>(name: string, handler: (input: TInput) => Promise<TOutput>, options?: FunctionOptions): FunctionDef<TInput, TOutput>;
|
|
32
|
+
/**
|
|
33
|
+
* Define a workflow
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* export const processOrder = tfn.workflow(
|
|
38
|
+
* 'processOrder',
|
|
39
|
+
* async (ctx, order: Order) => {
|
|
40
|
+
* const validated = await ctx.run(validateOrder, order);
|
|
41
|
+
* const paid = await ctx.run(chargePayment, validated);
|
|
42
|
+
* return { orderId: paid.id, status: 'complete' };
|
|
43
|
+
* }
|
|
44
|
+
* );
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
declare function workflow<TInput, TOutput>(name: string, handler: WorkflowHandler<TInput, TOutput>, options?: WorkflowOptions): WorkflowDef<TInput, TOutput>;
|
|
48
|
+
interface HttpTriggerDef {
|
|
49
|
+
type: 'http';
|
|
50
|
+
method: string;
|
|
51
|
+
path: string;
|
|
52
|
+
workflow: WorkflowDef;
|
|
53
|
+
options: HttpTriggerOptions;
|
|
54
|
+
}
|
|
55
|
+
interface CronTriggerDef {
|
|
56
|
+
type: 'cron';
|
|
57
|
+
schedule: string;
|
|
58
|
+
workflow: WorkflowDef;
|
|
59
|
+
options: CronTriggerOptions;
|
|
60
|
+
}
|
|
61
|
+
interface SignalTriggerDef {
|
|
62
|
+
type: 'signal';
|
|
63
|
+
signalName: string;
|
|
64
|
+
handler: (payload: unknown) => void | Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
type TriggerDef = HttpTriggerDef | CronTriggerDef | SignalTriggerDef;
|
|
67
|
+
/**
|
|
68
|
+
* Registry for trigger definitions
|
|
69
|
+
*/
|
|
70
|
+
declare const triggers: TriggerDef[];
|
|
71
|
+
/**
|
|
72
|
+
* Define an HTTP trigger for a workflow
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* tfn.http('POST', '/api/orders', processOrder);
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
declare function http<TInput, TOutput>(method: string, path: string, workflow: WorkflowDef<TInput, TOutput>, options?: HttpTriggerOptions): void;
|
|
80
|
+
/**
|
|
81
|
+
* Define a cron/scheduled trigger for a workflow
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* tfn.cron('0 9 * * *', dailyReport); // Every day at 9am
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
declare function cron<TInput, TOutput>(schedule: string, workflow: WorkflowDef<TInput, TOutput>, options?: CronTriggerOptions): void;
|
|
89
|
+
/**
|
|
90
|
+
* Define an interval trigger (convenience wrapper around cron)
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* tfn.interval('5m', healthCheck); // Every 5 minutes
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
declare function interval<TInput, TOutput>(duration: string, workflow: WorkflowDef<TInput, TOutput>, options?: CronTriggerOptions): void;
|
|
98
|
+
/**
|
|
99
|
+
* Define a signal trigger
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* tfn.signal('order.cancel', handleCancellation);
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
declare function signal(signalName: string, handler: (payload: unknown) => void | Promise<void>): void;
|
|
107
|
+
/**
|
|
108
|
+
* Check if a definition is a function
|
|
109
|
+
*/
|
|
110
|
+
declare function isFunction(def: unknown): def is FunctionDef;
|
|
111
|
+
/**
|
|
112
|
+
* Check if a definition is a workflow
|
|
113
|
+
*/
|
|
114
|
+
declare function isWorkflow(def: unknown): def is WorkflowDef;
|
|
115
|
+
/**
|
|
116
|
+
* The main Temporal Functions API
|
|
117
|
+
*/
|
|
118
|
+
declare const tfn: {
|
|
119
|
+
/** Define a function (activity) */
|
|
120
|
+
fn: typeof fn;
|
|
121
|
+
/** Define a workflow */
|
|
122
|
+
workflow: typeof workflow;
|
|
123
|
+
/** Define an HTTP trigger */
|
|
124
|
+
http: typeof http;
|
|
125
|
+
/** Define a cron trigger */
|
|
126
|
+
cron: typeof cron;
|
|
127
|
+
/** Define an interval trigger */
|
|
128
|
+
interval: typeof interval;
|
|
129
|
+
/** Define a signal trigger */
|
|
130
|
+
signal: typeof signal;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export { CronTriggerOptions, FunctionDef, FunctionOptions, HttpTriggerOptions, WorkflowDef, WorkflowHandler, WorkflowOptions, tfn as default, isFunction, isWorkflow, registry, tfn, triggers };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { F as FunctionOptions, a as FunctionDef, W as WorkflowHandler, b as WorkflowOptions, c as WorkflowDef, H as HttpTriggerOptions, C as CronTriggerOptions, R as Registry } from './types-C-cNq1Id.js';
|
|
2
|
+
export { g as ClientConfig, f as RetryPolicy, S as StartWorkflowOptions, j as TFNClient, k as TFNWorker, T as TemporalConfig, h as WorkerConfig, d as WorkflowContext, i as WorkflowHandle, e as WorkflowInfo } from './types-C-cNq1Id.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Temporal Functions - Main Entry Point
|
|
6
|
+
*
|
|
7
|
+
* This module provides the core API for defining functions and workflows.
|
|
8
|
+
* Import from 'temporal-functions' for function/workflow definitions.
|
|
9
|
+
* Import from 'temporal-functions/client' for triggering workflows.
|
|
10
|
+
* Import from 'temporal-functions/worker' for running workers.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Global registry for all defined functions and workflows
|
|
15
|
+
*/
|
|
16
|
+
declare const registry: Registry;
|
|
17
|
+
/**
|
|
18
|
+
* Define a function (maps to a Temporal Activity)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* export const sendEmail = tfn.fn(
|
|
23
|
+
* 'sendEmail',
|
|
24
|
+
* async (params: EmailParams) => {
|
|
25
|
+
* return await emailService.send(params);
|
|
26
|
+
* },
|
|
27
|
+
* { timeout: '30s', retries: 3 }
|
|
28
|
+
* );
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
declare function fn<TInput, TOutput>(name: string, handler: (input: TInput) => Promise<TOutput>, options?: FunctionOptions): FunctionDef<TInput, TOutput>;
|
|
32
|
+
/**
|
|
33
|
+
* Define a workflow
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* export const processOrder = tfn.workflow(
|
|
38
|
+
* 'processOrder',
|
|
39
|
+
* async (ctx, order: Order) => {
|
|
40
|
+
* const validated = await ctx.run(validateOrder, order);
|
|
41
|
+
* const paid = await ctx.run(chargePayment, validated);
|
|
42
|
+
* return { orderId: paid.id, status: 'complete' };
|
|
43
|
+
* }
|
|
44
|
+
* );
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
declare function workflow<TInput, TOutput>(name: string, handler: WorkflowHandler<TInput, TOutput>, options?: WorkflowOptions): WorkflowDef<TInput, TOutput>;
|
|
48
|
+
interface HttpTriggerDef {
|
|
49
|
+
type: 'http';
|
|
50
|
+
method: string;
|
|
51
|
+
path: string;
|
|
52
|
+
workflow: WorkflowDef;
|
|
53
|
+
options: HttpTriggerOptions;
|
|
54
|
+
}
|
|
55
|
+
interface CronTriggerDef {
|
|
56
|
+
type: 'cron';
|
|
57
|
+
schedule: string;
|
|
58
|
+
workflow: WorkflowDef;
|
|
59
|
+
options: CronTriggerOptions;
|
|
60
|
+
}
|
|
61
|
+
interface SignalTriggerDef {
|
|
62
|
+
type: 'signal';
|
|
63
|
+
signalName: string;
|
|
64
|
+
handler: (payload: unknown) => void | Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
type TriggerDef = HttpTriggerDef | CronTriggerDef | SignalTriggerDef;
|
|
67
|
+
/**
|
|
68
|
+
* Registry for trigger definitions
|
|
69
|
+
*/
|
|
70
|
+
declare const triggers: TriggerDef[];
|
|
71
|
+
/**
|
|
72
|
+
* Define an HTTP trigger for a workflow
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* tfn.http('POST', '/api/orders', processOrder);
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
declare function http<TInput, TOutput>(method: string, path: string, workflow: WorkflowDef<TInput, TOutput>, options?: HttpTriggerOptions): void;
|
|
80
|
+
/**
|
|
81
|
+
* Define a cron/scheduled trigger for a workflow
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* tfn.cron('0 9 * * *', dailyReport); // Every day at 9am
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
declare function cron<TInput, TOutput>(schedule: string, workflow: WorkflowDef<TInput, TOutput>, options?: CronTriggerOptions): void;
|
|
89
|
+
/**
|
|
90
|
+
* Define an interval trigger (convenience wrapper around cron)
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* tfn.interval('5m', healthCheck); // Every 5 minutes
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
declare function interval<TInput, TOutput>(duration: string, workflow: WorkflowDef<TInput, TOutput>, options?: CronTriggerOptions): void;
|
|
98
|
+
/**
|
|
99
|
+
* Define a signal trigger
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* tfn.signal('order.cancel', handleCancellation);
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
declare function signal(signalName: string, handler: (payload: unknown) => void | Promise<void>): void;
|
|
107
|
+
/**
|
|
108
|
+
* Check if a definition is a function
|
|
109
|
+
*/
|
|
110
|
+
declare function isFunction(def: unknown): def is FunctionDef;
|
|
111
|
+
/**
|
|
112
|
+
* Check if a definition is a workflow
|
|
113
|
+
*/
|
|
114
|
+
declare function isWorkflow(def: unknown): def is WorkflowDef;
|
|
115
|
+
/**
|
|
116
|
+
* The main Temporal Functions API
|
|
117
|
+
*/
|
|
118
|
+
declare const tfn: {
|
|
119
|
+
/** Define a function (activity) */
|
|
120
|
+
fn: typeof fn;
|
|
121
|
+
/** Define a workflow */
|
|
122
|
+
workflow: typeof workflow;
|
|
123
|
+
/** Define an HTTP trigger */
|
|
124
|
+
http: typeof http;
|
|
125
|
+
/** Define a cron trigger */
|
|
126
|
+
cron: typeof cron;
|
|
127
|
+
/** Define an interval trigger */
|
|
128
|
+
interval: typeof interval;
|
|
129
|
+
/** Define a signal trigger */
|
|
130
|
+
signal: typeof signal;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export { CronTriggerOptions, FunctionDef, FunctionOptions, HttpTriggerOptions, WorkflowDef, WorkflowHandler, WorkflowOptions, tfn as default, isFunction, isWorkflow, registry, tfn, triggers };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
// src/index.ts
|
|
6
|
+
var registry = {
|
|
7
|
+
functions: /* @__PURE__ */ new Map(),
|
|
8
|
+
workflows: /* @__PURE__ */ new Map()
|
|
9
|
+
};
|
|
10
|
+
function fn(name, handler, options = {}) {
|
|
11
|
+
const def = {
|
|
12
|
+
name,
|
|
13
|
+
handler,
|
|
14
|
+
options: {
|
|
15
|
+
startToCloseTimeout: "1m",
|
|
16
|
+
...options
|
|
17
|
+
},
|
|
18
|
+
__type: "function"
|
|
19
|
+
};
|
|
20
|
+
registry.functions.set(name, def);
|
|
21
|
+
return def;
|
|
22
|
+
}
|
|
23
|
+
function workflow(name, handler, options = {}) {
|
|
24
|
+
const def = {
|
|
25
|
+
name,
|
|
26
|
+
handler,
|
|
27
|
+
options: {
|
|
28
|
+
taskQueue: "default",
|
|
29
|
+
...options
|
|
30
|
+
},
|
|
31
|
+
__type: "workflow"
|
|
32
|
+
};
|
|
33
|
+
registry.workflows.set(name, def);
|
|
34
|
+
return def;
|
|
35
|
+
}
|
|
36
|
+
var triggers = [];
|
|
37
|
+
function http(method, path, workflow2, options = {}) {
|
|
38
|
+
triggers.push({
|
|
39
|
+
type: "http",
|
|
40
|
+
method: method.toUpperCase(),
|
|
41
|
+
path,
|
|
42
|
+
workflow: workflow2,
|
|
43
|
+
options
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function cron(schedule, workflow2, options = {}) {
|
|
47
|
+
triggers.push({
|
|
48
|
+
type: "cron",
|
|
49
|
+
schedule,
|
|
50
|
+
workflow: workflow2,
|
|
51
|
+
options
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function interval(duration, workflow2, options = {}) {
|
|
55
|
+
const cronSchedule = durationToCron(duration);
|
|
56
|
+
cron(cronSchedule, workflow2, options);
|
|
57
|
+
}
|
|
58
|
+
function signal(signalName, handler) {
|
|
59
|
+
triggers.push({
|
|
60
|
+
type: "signal",
|
|
61
|
+
signalName,
|
|
62
|
+
handler
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function durationToCron(duration) {
|
|
66
|
+
const match = duration.match(/^(\d+)(s|m|h|d)$/);
|
|
67
|
+
if (!match) {
|
|
68
|
+
throw new Error(`Invalid duration format: ${duration}. Use format like '5m', '1h', '30s'`);
|
|
69
|
+
}
|
|
70
|
+
const value = parseInt(match[1], 10);
|
|
71
|
+
const unit = match[2];
|
|
72
|
+
switch (unit) {
|
|
73
|
+
case "s":
|
|
74
|
+
if (value < 60) {
|
|
75
|
+
return `*/${value} * * * * *`;
|
|
76
|
+
}
|
|
77
|
+
throw new Error("Seconds interval must be less than 60");
|
|
78
|
+
case "m":
|
|
79
|
+
return `*/${value} * * * *`;
|
|
80
|
+
// Every N minutes
|
|
81
|
+
case "h":
|
|
82
|
+
return `0 */${value} * * *`;
|
|
83
|
+
// Every N hours
|
|
84
|
+
case "d":
|
|
85
|
+
return `0 0 */${value} * *`;
|
|
86
|
+
// Every N days
|
|
87
|
+
default:
|
|
88
|
+
throw new Error(`Unknown duration unit: ${unit}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function isFunction(def) {
|
|
92
|
+
return def?.__type === "function";
|
|
93
|
+
}
|
|
94
|
+
function isWorkflow(def) {
|
|
95
|
+
return def?.__type === "workflow";
|
|
96
|
+
}
|
|
97
|
+
var tfn = {
|
|
98
|
+
/** Define a function (activity) */
|
|
99
|
+
fn,
|
|
100
|
+
/** Define a workflow */
|
|
101
|
+
workflow,
|
|
102
|
+
/** Define an HTTP trigger */
|
|
103
|
+
http,
|
|
104
|
+
/** Define a cron trigger */
|
|
105
|
+
cron,
|
|
106
|
+
/** Define an interval trigger */
|
|
107
|
+
interval,
|
|
108
|
+
/** Define a signal trigger */
|
|
109
|
+
signal
|
|
110
|
+
};
|
|
111
|
+
var src_default = tfn;
|
|
112
|
+
|
|
113
|
+
exports.default = src_default;
|
|
114
|
+
exports.isFunction = isFunction;
|
|
115
|
+
exports.isWorkflow = isWorkflow;
|
|
116
|
+
exports.registry = registry;
|
|
117
|
+
exports.tfn = tfn;
|
|
118
|
+
exports.triggers = triggers;
|
|
119
|
+
//# sourceMappingURL=index.js.map
|
|
120
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["workflow"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Temporal Functions - Main Entry Point\n *\n * This module provides the core API for defining functions and workflows.\n * Import from 'temporal-functions' for function/workflow definitions.\n * Import from 'temporal-functions/client' for triggering workflows.\n * Import from 'temporal-functions/worker' for running workers.\n */\n\nimport type {\n FunctionDef,\n FunctionOptions,\n WorkflowDef,\n WorkflowOptions,\n WorkflowHandler,\n WorkflowContext,\n Registry,\n HttpTriggerOptions,\n CronTriggerOptions,\n} from './types.js';\n\n// =============================================================================\n// Global Registry\n// =============================================================================\n\n/**\n * Global registry for all defined functions and workflows\n */\nexport const registry: Registry = {\n functions: new Map(),\n workflows: new Map(),\n};\n\n// =============================================================================\n// Function Definition\n// =============================================================================\n\n/**\n * Define a function (maps to a Temporal Activity)\n *\n * @example\n * ```typescript\n * export const sendEmail = tfn.fn(\n * 'sendEmail',\n * async (params: EmailParams) => {\n * return await emailService.send(params);\n * },\n * { timeout: '30s', retries: 3 }\n * );\n * ```\n */\nfunction fn<TInput, TOutput>(\n name: string,\n handler: (input: TInput) => Promise<TOutput>,\n options: FunctionOptions = {}\n): FunctionDef<TInput, TOutput> {\n const def: FunctionDef<TInput, TOutput> = {\n name,\n handler,\n options: {\n startToCloseTimeout: '1m',\n ...options,\n },\n __type: 'function',\n };\n\n registry.functions.set(name, def as FunctionDef);\n return def;\n}\n\n// =============================================================================\n// Workflow Definition\n// =============================================================================\n\n/**\n * Define a workflow\n *\n * @example\n * ```typescript\n * export const processOrder = tfn.workflow(\n * 'processOrder',\n * async (ctx, order: Order) => {\n * const validated = await ctx.run(validateOrder, order);\n * const paid = await ctx.run(chargePayment, validated);\n * return { orderId: paid.id, status: 'complete' };\n * }\n * );\n * ```\n */\nfunction workflow<TInput, TOutput>(\n name: string,\n handler: WorkflowHandler<TInput, TOutput>,\n options: WorkflowOptions = {}\n): WorkflowDef<TInput, TOutput> {\n const def: WorkflowDef<TInput, TOutput> = {\n name,\n handler,\n options: {\n taskQueue: 'default',\n ...options,\n },\n __type: 'workflow',\n };\n\n registry.workflows.set(name, def as WorkflowDef);\n return def;\n}\n\n// =============================================================================\n// Trigger Definitions (Declarative)\n// =============================================================================\n\ninterface HttpTriggerDef {\n type: 'http';\n method: string;\n path: string;\n workflow: WorkflowDef;\n options: HttpTriggerOptions;\n}\n\ninterface CronTriggerDef {\n type: 'cron';\n schedule: string;\n workflow: WorkflowDef;\n options: CronTriggerOptions;\n}\n\ninterface SignalTriggerDef {\n type: 'signal';\n signalName: string;\n handler: (payload: unknown) => void | Promise<void>;\n}\n\ntype TriggerDef = HttpTriggerDef | CronTriggerDef | SignalTriggerDef;\n\n/**\n * Registry for trigger definitions\n */\nexport const triggers: TriggerDef[] = [];\n\n/**\n * Define an HTTP trigger for a workflow\n *\n * @example\n * ```typescript\n * tfn.http('POST', '/api/orders', processOrder);\n * ```\n */\nfunction http<TInput, TOutput>(\n method: string,\n path: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: HttpTriggerOptions = {}\n): void {\n triggers.push({\n type: 'http',\n method: method.toUpperCase(),\n path,\n workflow: workflow as WorkflowDef,\n options,\n });\n}\n\n/**\n * Define a cron/scheduled trigger for a workflow\n *\n * @example\n * ```typescript\n * tfn.cron('0 9 * * *', dailyReport); // Every day at 9am\n * ```\n */\nfunction cron<TInput, TOutput>(\n schedule: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: CronTriggerOptions = {}\n): void {\n triggers.push({\n type: 'cron',\n schedule,\n workflow: workflow as WorkflowDef,\n options,\n });\n}\n\n/**\n * Define an interval trigger (convenience wrapper around cron)\n *\n * @example\n * ```typescript\n * tfn.interval('5m', healthCheck); // Every 5 minutes\n * ```\n */\nfunction interval<TInput, TOutput>(\n duration: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: CronTriggerOptions = {}\n): void {\n // Convert duration to cron expression\n const cronSchedule = durationToCron(duration);\n cron(cronSchedule, workflow, options);\n}\n\n/**\n * Define a signal trigger\n *\n * @example\n * ```typescript\n * tfn.signal('order.cancel', handleCancellation);\n * ```\n */\nfunction signal(\n signalName: string,\n handler: (payload: unknown) => void | Promise<void>\n): void {\n triggers.push({\n type: 'signal',\n signalName,\n handler,\n });\n}\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\n/**\n * Convert a duration string to a cron expression\n */\nfunction durationToCron(duration: string): string {\n const match = duration.match(/^(\\d+)(s|m|h|d)$/);\n if (!match) {\n throw new Error(`Invalid duration format: ${duration}. Use format like '5m', '1h', '30s'`);\n }\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 's':\n if (value < 60) {\n return `*/${value} * * * * *`; // Every N seconds (non-standard)\n }\n throw new Error('Seconds interval must be less than 60');\n case 'm':\n return `*/${value} * * * *`; // Every N minutes\n case 'h':\n return `0 */${value} * * *`; // Every N hours\n case 'd':\n return `0 0 */${value} * *`; // Every N days\n default:\n throw new Error(`Unknown duration unit: ${unit}`);\n }\n}\n\n/**\n * Check if a definition is a function\n */\nexport function isFunction(def: unknown): def is FunctionDef {\n return (def as FunctionDef)?.__type === 'function';\n}\n\n/**\n * Check if a definition is a workflow\n */\nexport function isWorkflow(def: unknown): def is WorkflowDef {\n return (def as WorkflowDef)?.__type === 'workflow';\n}\n\n// =============================================================================\n// Main API Export\n// =============================================================================\n\n/**\n * The main Temporal Functions API\n */\nexport const tfn = {\n /** Define a function (activity) */\n fn,\n /** Define a workflow */\n workflow,\n /** Define an HTTP trigger */\n http,\n /** Define a cron trigger */\n cron,\n /** Define an interval trigger */\n interval,\n /** Define a signal trigger */\n signal,\n};\n\n// Re-export types\nexport type {\n FunctionDef,\n FunctionOptions,\n WorkflowDef,\n WorkflowOptions,\n WorkflowContext,\n WorkflowHandler,\n WorkflowInfo,\n RetryPolicy,\n HttpTriggerOptions,\n CronTriggerOptions,\n TemporalConfig,\n ClientConfig,\n WorkerConfig,\n StartWorkflowOptions,\n WorkflowHandle,\n TFNClient,\n TFNWorker,\n} from './types.js';\n\nexport default tfn;\n"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
var registry = {
|
|
3
|
+
functions: /* @__PURE__ */ new Map(),
|
|
4
|
+
workflows: /* @__PURE__ */ new Map()
|
|
5
|
+
};
|
|
6
|
+
function fn(name, handler, options = {}) {
|
|
7
|
+
const def = {
|
|
8
|
+
name,
|
|
9
|
+
handler,
|
|
10
|
+
options: {
|
|
11
|
+
startToCloseTimeout: "1m",
|
|
12
|
+
...options
|
|
13
|
+
},
|
|
14
|
+
__type: "function"
|
|
15
|
+
};
|
|
16
|
+
registry.functions.set(name, def);
|
|
17
|
+
return def;
|
|
18
|
+
}
|
|
19
|
+
function workflow(name, handler, options = {}) {
|
|
20
|
+
const def = {
|
|
21
|
+
name,
|
|
22
|
+
handler,
|
|
23
|
+
options: {
|
|
24
|
+
taskQueue: "default",
|
|
25
|
+
...options
|
|
26
|
+
},
|
|
27
|
+
__type: "workflow"
|
|
28
|
+
};
|
|
29
|
+
registry.workflows.set(name, def);
|
|
30
|
+
return def;
|
|
31
|
+
}
|
|
32
|
+
var triggers = [];
|
|
33
|
+
function http(method, path, workflow2, options = {}) {
|
|
34
|
+
triggers.push({
|
|
35
|
+
type: "http",
|
|
36
|
+
method: method.toUpperCase(),
|
|
37
|
+
path,
|
|
38
|
+
workflow: workflow2,
|
|
39
|
+
options
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function cron(schedule, workflow2, options = {}) {
|
|
43
|
+
triggers.push({
|
|
44
|
+
type: "cron",
|
|
45
|
+
schedule,
|
|
46
|
+
workflow: workflow2,
|
|
47
|
+
options
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function interval(duration, workflow2, options = {}) {
|
|
51
|
+
const cronSchedule = durationToCron(duration);
|
|
52
|
+
cron(cronSchedule, workflow2, options);
|
|
53
|
+
}
|
|
54
|
+
function signal(signalName, handler) {
|
|
55
|
+
triggers.push({
|
|
56
|
+
type: "signal",
|
|
57
|
+
signalName,
|
|
58
|
+
handler
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function durationToCron(duration) {
|
|
62
|
+
const match = duration.match(/^(\d+)(s|m|h|d)$/);
|
|
63
|
+
if (!match) {
|
|
64
|
+
throw new Error(`Invalid duration format: ${duration}. Use format like '5m', '1h', '30s'`);
|
|
65
|
+
}
|
|
66
|
+
const value = parseInt(match[1], 10);
|
|
67
|
+
const unit = match[2];
|
|
68
|
+
switch (unit) {
|
|
69
|
+
case "s":
|
|
70
|
+
if (value < 60) {
|
|
71
|
+
return `*/${value} * * * * *`;
|
|
72
|
+
}
|
|
73
|
+
throw new Error("Seconds interval must be less than 60");
|
|
74
|
+
case "m":
|
|
75
|
+
return `*/${value} * * * *`;
|
|
76
|
+
// Every N minutes
|
|
77
|
+
case "h":
|
|
78
|
+
return `0 */${value} * * *`;
|
|
79
|
+
// Every N hours
|
|
80
|
+
case "d":
|
|
81
|
+
return `0 0 */${value} * *`;
|
|
82
|
+
// Every N days
|
|
83
|
+
default:
|
|
84
|
+
throw new Error(`Unknown duration unit: ${unit}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function isFunction(def) {
|
|
88
|
+
return def?.__type === "function";
|
|
89
|
+
}
|
|
90
|
+
function isWorkflow(def) {
|
|
91
|
+
return def?.__type === "workflow";
|
|
92
|
+
}
|
|
93
|
+
var tfn = {
|
|
94
|
+
/** Define a function (activity) */
|
|
95
|
+
fn,
|
|
96
|
+
/** Define a workflow */
|
|
97
|
+
workflow,
|
|
98
|
+
/** Define an HTTP trigger */
|
|
99
|
+
http,
|
|
100
|
+
/** Define a cron trigger */
|
|
101
|
+
cron,
|
|
102
|
+
/** Define an interval trigger */
|
|
103
|
+
interval,
|
|
104
|
+
/** Define a signal trigger */
|
|
105
|
+
signal
|
|
106
|
+
};
|
|
107
|
+
var src_default = tfn;
|
|
108
|
+
|
|
109
|
+
export { src_default as default, isFunction, isWorkflow, registry, tfn, triggers };
|
|
110
|
+
//# sourceMappingURL=index.mjs.map
|
|
111
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["workflow"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Temporal Functions - Main Entry Point\n *\n * This module provides the core API for defining functions and workflows.\n * Import from 'temporal-functions' for function/workflow definitions.\n * Import from 'temporal-functions/client' for triggering workflows.\n * Import from 'temporal-functions/worker' for running workers.\n */\n\nimport type {\n FunctionDef,\n FunctionOptions,\n WorkflowDef,\n WorkflowOptions,\n WorkflowHandler,\n WorkflowContext,\n Registry,\n HttpTriggerOptions,\n CronTriggerOptions,\n} from './types.js';\n\n// =============================================================================\n// Global Registry\n// =============================================================================\n\n/**\n * Global registry for all defined functions and workflows\n */\nexport const registry: Registry = {\n functions: new Map(),\n workflows: new Map(),\n};\n\n// =============================================================================\n// Function Definition\n// =============================================================================\n\n/**\n * Define a function (maps to a Temporal Activity)\n *\n * @example\n * ```typescript\n * export const sendEmail = tfn.fn(\n * 'sendEmail',\n * async (params: EmailParams) => {\n * return await emailService.send(params);\n * },\n * { timeout: '30s', retries: 3 }\n * );\n * ```\n */\nfunction fn<TInput, TOutput>(\n name: string,\n handler: (input: TInput) => Promise<TOutput>,\n options: FunctionOptions = {}\n): FunctionDef<TInput, TOutput> {\n const def: FunctionDef<TInput, TOutput> = {\n name,\n handler,\n options: {\n startToCloseTimeout: '1m',\n ...options,\n },\n __type: 'function',\n };\n\n registry.functions.set(name, def as FunctionDef);\n return def;\n}\n\n// =============================================================================\n// Workflow Definition\n// =============================================================================\n\n/**\n * Define a workflow\n *\n * @example\n * ```typescript\n * export const processOrder = tfn.workflow(\n * 'processOrder',\n * async (ctx, order: Order) => {\n * const validated = await ctx.run(validateOrder, order);\n * const paid = await ctx.run(chargePayment, validated);\n * return { orderId: paid.id, status: 'complete' };\n * }\n * );\n * ```\n */\nfunction workflow<TInput, TOutput>(\n name: string,\n handler: WorkflowHandler<TInput, TOutput>,\n options: WorkflowOptions = {}\n): WorkflowDef<TInput, TOutput> {\n const def: WorkflowDef<TInput, TOutput> = {\n name,\n handler,\n options: {\n taskQueue: 'default',\n ...options,\n },\n __type: 'workflow',\n };\n\n registry.workflows.set(name, def as WorkflowDef);\n return def;\n}\n\n// =============================================================================\n// Trigger Definitions (Declarative)\n// =============================================================================\n\ninterface HttpTriggerDef {\n type: 'http';\n method: string;\n path: string;\n workflow: WorkflowDef;\n options: HttpTriggerOptions;\n}\n\ninterface CronTriggerDef {\n type: 'cron';\n schedule: string;\n workflow: WorkflowDef;\n options: CronTriggerOptions;\n}\n\ninterface SignalTriggerDef {\n type: 'signal';\n signalName: string;\n handler: (payload: unknown) => void | Promise<void>;\n}\n\ntype TriggerDef = HttpTriggerDef | CronTriggerDef | SignalTriggerDef;\n\n/**\n * Registry for trigger definitions\n */\nexport const triggers: TriggerDef[] = [];\n\n/**\n * Define an HTTP trigger for a workflow\n *\n * @example\n * ```typescript\n * tfn.http('POST', '/api/orders', processOrder);\n * ```\n */\nfunction http<TInput, TOutput>(\n method: string,\n path: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: HttpTriggerOptions = {}\n): void {\n triggers.push({\n type: 'http',\n method: method.toUpperCase(),\n path,\n workflow: workflow as WorkflowDef,\n options,\n });\n}\n\n/**\n * Define a cron/scheduled trigger for a workflow\n *\n * @example\n * ```typescript\n * tfn.cron('0 9 * * *', dailyReport); // Every day at 9am\n * ```\n */\nfunction cron<TInput, TOutput>(\n schedule: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: CronTriggerOptions = {}\n): void {\n triggers.push({\n type: 'cron',\n schedule,\n workflow: workflow as WorkflowDef,\n options,\n });\n}\n\n/**\n * Define an interval trigger (convenience wrapper around cron)\n *\n * @example\n * ```typescript\n * tfn.interval('5m', healthCheck); // Every 5 minutes\n * ```\n */\nfunction interval<TInput, TOutput>(\n duration: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: CronTriggerOptions = {}\n): void {\n // Convert duration to cron expression\n const cronSchedule = durationToCron(duration);\n cron(cronSchedule, workflow, options);\n}\n\n/**\n * Define a signal trigger\n *\n * @example\n * ```typescript\n * tfn.signal('order.cancel', handleCancellation);\n * ```\n */\nfunction signal(\n signalName: string,\n handler: (payload: unknown) => void | Promise<void>\n): void {\n triggers.push({\n type: 'signal',\n signalName,\n handler,\n });\n}\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\n/**\n * Convert a duration string to a cron expression\n */\nfunction durationToCron(duration: string): string {\n const match = duration.match(/^(\\d+)(s|m|h|d)$/);\n if (!match) {\n throw new Error(`Invalid duration format: ${duration}. Use format like '5m', '1h', '30s'`);\n }\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 's':\n if (value < 60) {\n return `*/${value} * * * * *`; // Every N seconds (non-standard)\n }\n throw new Error('Seconds interval must be less than 60');\n case 'm':\n return `*/${value} * * * *`; // Every N minutes\n case 'h':\n return `0 */${value} * * *`; // Every N hours\n case 'd':\n return `0 0 */${value} * *`; // Every N days\n default:\n throw new Error(`Unknown duration unit: ${unit}`);\n }\n}\n\n/**\n * Check if a definition is a function\n */\nexport function isFunction(def: unknown): def is FunctionDef {\n return (def as FunctionDef)?.__type === 'function';\n}\n\n/**\n * Check if a definition is a workflow\n */\nexport function isWorkflow(def: unknown): def is WorkflowDef {\n return (def as WorkflowDef)?.__type === 'workflow';\n}\n\n// =============================================================================\n// Main API Export\n// =============================================================================\n\n/**\n * The main Temporal Functions API\n */\nexport const tfn = {\n /** Define a function (activity) */\n fn,\n /** Define a workflow */\n workflow,\n /** Define an HTTP trigger */\n http,\n /** Define a cron trigger */\n cron,\n /** Define an interval trigger */\n interval,\n /** Define a signal trigger */\n signal,\n};\n\n// Re-export types\nexport type {\n FunctionDef,\n FunctionOptions,\n WorkflowDef,\n WorkflowOptions,\n WorkflowContext,\n WorkflowHandler,\n WorkflowInfo,\n RetryPolicy,\n HttpTriggerOptions,\n CronTriggerOptions,\n TemporalConfig,\n ClientConfig,\n WorkerConfig,\n StartWorkflowOptions,\n WorkflowHandle,\n TFNClient,\n TFNWorker,\n} from './types.js';\n\nexport default tfn;\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { a as FunctionDef, c as WorkflowDef, d as WorkflowContext } from '../types-C-cNq1Id.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Temporal Functions - Testing Utilities
|
|
5
|
+
*
|
|
6
|
+
* Utilities for testing functions and workflows.
|
|
7
|
+
* Import from 'temporal-functions/testing'.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Create a mock workflow context for testing
|
|
12
|
+
*/
|
|
13
|
+
declare function createMockContext(overrides?: Partial<WorkflowContext>): WorkflowContext;
|
|
14
|
+
/**
|
|
15
|
+
* Test environment for running workflows in isolation
|
|
16
|
+
*/
|
|
17
|
+
declare class TestEnvironment {
|
|
18
|
+
private mocks;
|
|
19
|
+
private currentTime;
|
|
20
|
+
/**
|
|
21
|
+
* Mock a function's implementation
|
|
22
|
+
*/
|
|
23
|
+
mock<TInput, TOutput>(fn: FunctionDef<TInput, TOutput>, implementation: (input: TInput) => Promise<TOutput> | TOutput): this;
|
|
24
|
+
/**
|
|
25
|
+
* Set the current time for the test
|
|
26
|
+
*/
|
|
27
|
+
setTime(time: Date): this;
|
|
28
|
+
/**
|
|
29
|
+
* Execute a workflow with the test environment
|
|
30
|
+
*/
|
|
31
|
+
execute<TInput, TOutput>(workflow: WorkflowDef<TInput, TOutput>, input: TInput): Promise<TOutput>;
|
|
32
|
+
/**
|
|
33
|
+
* Start a workflow and return a handle for interaction
|
|
34
|
+
*/
|
|
35
|
+
start<TInput, TOutput>(workflow: WorkflowDef<TInput, TOutput>, input: TInput): Promise<TestWorkflowHandle<TOutput>>;
|
|
36
|
+
/**
|
|
37
|
+
* Create a workflow context with mocks applied
|
|
38
|
+
*/
|
|
39
|
+
private createContext;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Handle to a test workflow execution
|
|
43
|
+
*/
|
|
44
|
+
interface TestWorkflowHandle<TOutput> {
|
|
45
|
+
/** Wait for the workflow result */
|
|
46
|
+
result(): Promise<TOutput>;
|
|
47
|
+
/** Send a signal to the workflow */
|
|
48
|
+
signal<TPayload>(signalName: string, payload: TPayload): Promise<void>;
|
|
49
|
+
/** Query the workflow */
|
|
50
|
+
query<TResult>(queryName: string): TResult;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create a test environment
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* import { tfn } from 'temporal-functions/testing';
|
|
58
|
+
*
|
|
59
|
+
* const env = await tfn.testEnv();
|
|
60
|
+
*
|
|
61
|
+
* env.mock(sendEmail, async (params) => ({
|
|
62
|
+
* messageId: 'test-id',
|
|
63
|
+
* }));
|
|
64
|
+
*
|
|
65
|
+
* const result = await env.execute(myWorkflow, { data: 'test' });
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
declare function createTestEnv(): Promise<TestEnvironment>;
|
|
69
|
+
declare const tfn: {
|
|
70
|
+
testEnv: typeof createTestEnv;
|
|
71
|
+
mockContext: typeof createMockContext;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export { TestEnvironment, type TestWorkflowHandle, createMockContext, createTestEnv, tfn as default, tfn };
|