@classytic/streamline 1.0.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/LICENSE +21 -0
- package/README.md +740 -0
- package/dist/container-BzpIMrrj.mjs +2697 -0
- package/dist/errors-BqunvWPz.mjs +129 -0
- package/dist/events-B5aTz7kD.mjs +28 -0
- package/dist/events-C0sZINZq.d.mts +92 -0
- package/dist/index.d.mts +1589 -0
- package/dist/index.mjs +1102 -0
- package/dist/integrations/fastify.d.mts +12 -0
- package/dist/integrations/fastify.mjs +23 -0
- package/dist/telemetry/index.d.mts +18 -0
- package/dist/telemetry/index.mjs +102 -0
- package/dist/types-DG85_LzF.d.mts +275 -0
- package/package.json +104 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __exportAll = (all, no_symbols) => {
|
|
4
|
+
let target = {};
|
|
5
|
+
for (var name in all) {
|
|
6
|
+
__defProp(target, name, {
|
|
7
|
+
get: all[name],
|
|
8
|
+
enumerable: true
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
if (!no_symbols) {
|
|
12
|
+
__defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
13
|
+
}
|
|
14
|
+
return target;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/utils/errors.ts
|
|
19
|
+
var errors_exports = /* @__PURE__ */ __exportAll({
|
|
20
|
+
DataCorruptionError: () => DataCorruptionError,
|
|
21
|
+
ErrorCode: () => ErrorCode,
|
|
22
|
+
InvalidStateError: () => InvalidStateError,
|
|
23
|
+
MaxRetriesExceededError: () => MaxRetriesExceededError,
|
|
24
|
+
StepNotFoundError: () => StepNotFoundError,
|
|
25
|
+
StepTimeoutError: () => StepTimeoutError,
|
|
26
|
+
WorkflowError: () => WorkflowError,
|
|
27
|
+
WorkflowNotFoundError: () => WorkflowNotFoundError
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Custom error classes with rich context for better debugging
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Standardized error codes for programmatic error handling.
|
|
34
|
+
* Use these codes to handle specific error conditions in your application.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* try {
|
|
39
|
+
* await workflow.resume(runId);
|
|
40
|
+
* } catch (err) {
|
|
41
|
+
* if (err.code === ErrorCode.WORKFLOW_NOT_FOUND) {
|
|
42
|
+
* // Handle missing workflow
|
|
43
|
+
* }
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
const ErrorCode = {
|
|
48
|
+
WORKFLOW_NOT_FOUND: "WORKFLOW_NOT_FOUND",
|
|
49
|
+
WORKFLOW_ALREADY_COMPLETED: "WORKFLOW_ALREADY_COMPLETED",
|
|
50
|
+
WORKFLOW_CANCELLED: "WORKFLOW_CANCELLED",
|
|
51
|
+
STEP_NOT_FOUND: "STEP_NOT_FOUND",
|
|
52
|
+
STEP_TIMEOUT: "STEP_TIMEOUT",
|
|
53
|
+
STEP_FAILED: "STEP_FAILED",
|
|
54
|
+
INVALID_STATE: "INVALID_STATE",
|
|
55
|
+
INVALID_TRANSITION: "INVALID_TRANSITION",
|
|
56
|
+
DATA_CORRUPTION: "DATA_CORRUPTION",
|
|
57
|
+
VALIDATION_ERROR: "VALIDATION_ERROR",
|
|
58
|
+
MAX_RETRIES_EXCEEDED: "MAX_RETRIES_EXCEEDED",
|
|
59
|
+
EXECUTION_ABORTED: "EXECUTION_ABORTED"
|
|
60
|
+
};
|
|
61
|
+
var WorkflowError = class extends Error {
|
|
62
|
+
code;
|
|
63
|
+
constructor(message, code, context) {
|
|
64
|
+
super(message);
|
|
65
|
+
this.context = context;
|
|
66
|
+
this.name = "WorkflowError";
|
|
67
|
+
this.code = code;
|
|
68
|
+
}
|
|
69
|
+
toString() {
|
|
70
|
+
const contextStr = Object.entries(this.context).map(([key, value]) => `${key}=${value}`).join(", ");
|
|
71
|
+
return `${this.name} [${this.code}]: ${this.message} (${contextStr})`;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
var StepNotFoundError = class extends WorkflowError {
|
|
75
|
+
constructor(stepId, workflowId, availableSteps) {
|
|
76
|
+
super(`Step "${stepId}" not found in workflow "${workflowId}". Available steps: ${availableSteps.join(", ")}`, ErrorCode.STEP_NOT_FOUND, {
|
|
77
|
+
stepId,
|
|
78
|
+
workflowId,
|
|
79
|
+
availableSteps
|
|
80
|
+
});
|
|
81
|
+
this.name = "StepNotFoundError";
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
var WorkflowNotFoundError = class extends WorkflowError {
|
|
85
|
+
constructor(runId) {
|
|
86
|
+
super(`Workflow run "${runId}" not found in database`, ErrorCode.WORKFLOW_NOT_FOUND, { runId });
|
|
87
|
+
this.name = "WorkflowNotFoundError";
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
var InvalidStateError = class extends WorkflowError {
|
|
91
|
+
constructor(action, currentState, expectedStates, context) {
|
|
92
|
+
super(`Cannot ${action} - workflow is in state "${currentState}". Expected one of: ${expectedStates.join(", ")}`, ErrorCode.INVALID_STATE, {
|
|
93
|
+
action,
|
|
94
|
+
currentState,
|
|
95
|
+
expectedStates,
|
|
96
|
+
...context
|
|
97
|
+
});
|
|
98
|
+
this.name = "InvalidStateError";
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
var StepTimeoutError = class extends WorkflowError {
|
|
102
|
+
constructor(stepId, timeoutMs, runId) {
|
|
103
|
+
super(`Step "${stepId}" exceeded timeout of ${timeoutMs}ms`, ErrorCode.STEP_TIMEOUT, {
|
|
104
|
+
stepId,
|
|
105
|
+
timeoutMs,
|
|
106
|
+
runId
|
|
107
|
+
});
|
|
108
|
+
this.name = "StepTimeoutError";
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
var DataCorruptionError = class extends WorkflowError {
|
|
112
|
+
constructor(reason, context) {
|
|
113
|
+
super(`Data corruption detected: ${reason}`, ErrorCode.DATA_CORRUPTION, context);
|
|
114
|
+
this.name = "DataCorruptionError";
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
var MaxRetriesExceededError = class extends WorkflowError {
|
|
118
|
+
constructor(stepId, attempts, runId) {
|
|
119
|
+
super(`Step "${stepId}" failed after ${attempts} attempts`, ErrorCode.MAX_RETRIES_EXCEEDED, {
|
|
120
|
+
stepId,
|
|
121
|
+
attempts,
|
|
122
|
+
runId
|
|
123
|
+
});
|
|
124
|
+
this.name = "MaxRetriesExceededError";
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
//#endregion
|
|
129
|
+
export { StepNotFoundError as a, WorkflowNotFoundError as c, MaxRetriesExceededError as i, errors_exports as l, ErrorCode as n, StepTimeoutError as o, InvalidStateError as r, WorkflowError as s, DataCorruptionError as t };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
|
|
3
|
+
//#region src/core/events.ts
|
|
4
|
+
/**
|
|
5
|
+
* Type-safe event bus with explicit payload types
|
|
6
|
+
*/
|
|
7
|
+
var WorkflowEventBus = class extends EventEmitter {
|
|
8
|
+
emit(event, payload) {
|
|
9
|
+
return super.emit(event, payload);
|
|
10
|
+
}
|
|
11
|
+
on(event, listener) {
|
|
12
|
+
return super.on(event, listener);
|
|
13
|
+
}
|
|
14
|
+
once(event, listener) {
|
|
15
|
+
return super.once(event, listener);
|
|
16
|
+
}
|
|
17
|
+
off(event, listener) {
|
|
18
|
+
return super.off(event, listener);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Global event bus for cross-container event aggregation.
|
|
23
|
+
* Use with createContainer({ eventBus: 'global' }) for telemetry integration.
|
|
24
|
+
*/
|
|
25
|
+
const globalEventBus = new WorkflowEventBus();
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
export { globalEventBus as n, WorkflowEventBus as t };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
|
|
3
|
+
//#region src/core/events.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Typed event payloads for type-safe event handling
|
|
6
|
+
*/
|
|
7
|
+
interface BaseEventPayload {
|
|
8
|
+
runId: string;
|
|
9
|
+
timestamp?: Date;
|
|
10
|
+
}
|
|
11
|
+
interface StepEventPayload extends BaseEventPayload {
|
|
12
|
+
stepId: string;
|
|
13
|
+
attempt?: number;
|
|
14
|
+
}
|
|
15
|
+
interface StepCompletedPayload extends StepEventPayload {
|
|
16
|
+
data?: unknown;
|
|
17
|
+
}
|
|
18
|
+
interface StepFailedPayload extends StepEventPayload {
|
|
19
|
+
error: Error;
|
|
20
|
+
}
|
|
21
|
+
interface StepRetryPayload extends StepEventPayload {
|
|
22
|
+
maxRetries: number;
|
|
23
|
+
retryAfter: Date;
|
|
24
|
+
}
|
|
25
|
+
interface WorkflowCompletedPayload extends BaseEventPayload {
|
|
26
|
+
data?: unknown;
|
|
27
|
+
}
|
|
28
|
+
interface WorkflowFailedPayload extends BaseEventPayload {
|
|
29
|
+
error: Error | {
|
|
30
|
+
message: string;
|
|
31
|
+
code?: string;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
interface WorkflowResumedPayload extends BaseEventPayload {
|
|
35
|
+
stepId?: string;
|
|
36
|
+
data?: unknown;
|
|
37
|
+
}
|
|
38
|
+
interface EngineErrorPayload {
|
|
39
|
+
runId?: string;
|
|
40
|
+
error: Error;
|
|
41
|
+
context: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Event name to payload type mapping
|
|
45
|
+
*/
|
|
46
|
+
interface EventPayloadMap {
|
|
47
|
+
'step:started': StepEventPayload;
|
|
48
|
+
'step:completed': StepCompletedPayload;
|
|
49
|
+
'step:failed': StepFailedPayload;
|
|
50
|
+
'step:waiting': StepEventPayload & {
|
|
51
|
+
data?: unknown;
|
|
52
|
+
};
|
|
53
|
+
'step:skipped': StepEventPayload;
|
|
54
|
+
'step:retry-scheduled': StepRetryPayload;
|
|
55
|
+
'workflow:started': BaseEventPayload;
|
|
56
|
+
'workflow:completed': WorkflowCompletedPayload;
|
|
57
|
+
'workflow:failed': WorkflowFailedPayload;
|
|
58
|
+
'workflow:waiting': BaseEventPayload & {
|
|
59
|
+
data?: unknown;
|
|
60
|
+
};
|
|
61
|
+
'workflow:resumed': WorkflowResumedPayload;
|
|
62
|
+
'workflow:cancelled': BaseEventPayload;
|
|
63
|
+
'workflow:recovered': BaseEventPayload;
|
|
64
|
+
'workflow:retry': BaseEventPayload;
|
|
65
|
+
'engine:error': EngineErrorPayload;
|
|
66
|
+
'scheduler:error': EngineErrorPayload;
|
|
67
|
+
'scheduler:circuit-open': {
|
|
68
|
+
error: Error;
|
|
69
|
+
context: string;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
type WorkflowEventName = keyof EventPayloadMap;
|
|
73
|
+
/**
|
|
74
|
+
* Type-safe event bus with explicit payload types
|
|
75
|
+
*/
|
|
76
|
+
declare class WorkflowEventBus extends EventEmitter {
|
|
77
|
+
emit<K extends WorkflowEventName>(event: K, payload: EventPayloadMap[K]): boolean;
|
|
78
|
+
emit(event: string, payload: unknown): boolean;
|
|
79
|
+
on<K extends WorkflowEventName>(event: K, listener: (payload: EventPayloadMap[K]) => void): this;
|
|
80
|
+
on(event: string, listener: (payload: unknown) => void): this;
|
|
81
|
+
once<K extends WorkflowEventName>(event: K, listener: (payload: EventPayloadMap[K]) => void): this;
|
|
82
|
+
once(event: string, listener: (payload: unknown) => void): this;
|
|
83
|
+
off<K extends WorkflowEventName>(event: K, listener: (payload: EventPayloadMap[K]) => void): this;
|
|
84
|
+
off(event: string, listener: (payload: unknown) => void): this;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Global event bus for cross-container event aggregation.
|
|
88
|
+
* Use with createContainer({ eventBus: 'global' }) for telemetry integration.
|
|
89
|
+
*/
|
|
90
|
+
declare const globalEventBus: WorkflowEventBus;
|
|
91
|
+
//#endregion
|
|
92
|
+
export { WorkflowEventName as n, globalEventBus as r, WorkflowEventBus as t };
|