@generacy-ai/orchestrator 0.0.0-preview-20260304013206
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 +191 -0
- package/dist/auth/api-key.d.ts +63 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +102 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/github-oauth.d.ts +29 -0
- package/dist/auth/github-oauth.d.ts.map +1 -0
- package/dist/auth/github-oauth.js +136 -0
- package/dist/auth/github-oauth.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +9 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/jwt.d.ts +34 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +74 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/middleware.d.ts +43 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +101 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +21 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +295 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +733 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +174 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +30 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +173 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +4 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +32 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +92 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +31 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +89 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/routes/agents.d.ts +7 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +78 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/dispatch.d.ts +8 -0
- package/dist/routes/dispatch.d.ts.map +1 -0
- package/dist/routes/dispatch.js +46 -0
- package/dist/routes/dispatch.js.map +1 -0
- package/dist/routes/events.d.ts +14 -0
- package/dist/routes/events.d.ts.map +1 -0
- package/dist/routes/events.js +240 -0
- package/dist/routes/events.js.map +1 -0
- package/dist/routes/health.d.ts +14 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +132 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +36 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +34 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/integrations.d.ts +34 -0
- package/dist/routes/integrations.d.ts.map +1 -0
- package/dist/routes/integrations.js +81 -0
- package/dist/routes/integrations.js.map +1 -0
- package/dist/routes/metrics.d.ts +31 -0
- package/dist/routes/metrics.d.ts.map +1 -0
- package/dist/routes/metrics.js +157 -0
- package/dist/routes/metrics.js.map +1 -0
- package/dist/routes/pr-webhooks.d.ts +15 -0
- package/dist/routes/pr-webhooks.d.ts.map +1 -0
- package/dist/routes/pr-webhooks.js +114 -0
- package/dist/routes/pr-webhooks.js.map +1 -0
- package/dist/routes/queue.d.ts +7 -0
- package/dist/routes/queue.d.ts.map +1 -0
- package/dist/routes/queue.js +94 -0
- package/dist/routes/queue.js.map +1 -0
- package/dist/routes/webhooks.d.ts +15 -0
- package/dist/routes/webhooks.d.ts.map +1 -0
- package/dist/routes/webhooks.js +117 -0
- package/dist/routes/webhooks.js.map +1 -0
- package/dist/routes/workflows.d.ts +7 -0
- package/dist/routes/workflows.d.ts.map +1 -0
- package/dist/routes/workflows.js +138 -0
- package/dist/routes/workflows.js.map +1 -0
- package/dist/server.d.ts +35 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +264 -0
- package/dist/server.js.map +1 -0
- package/dist/services/agent-registry.d.ts +89 -0
- package/dist/services/agent-registry.d.ts.map +1 -0
- package/dist/services/agent-registry.js +173 -0
- package/dist/services/agent-registry.js.map +1 -0
- package/dist/services/epic-completion-monitor-service.d.ts +69 -0
- package/dist/services/epic-completion-monitor-service.d.ts.map +1 -0
- package/dist/services/epic-completion-monitor-service.js +200 -0
- package/dist/services/epic-completion-monitor-service.js.map +1 -0
- package/dist/services/identity.d.ts +41 -0
- package/dist/services/identity.d.ts.map +1 -0
- package/dist/services/identity.js +91 -0
- package/dist/services/identity.js.map +1 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +13 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/label-monitor-service.d.ts +95 -0
- package/dist/services/label-monitor-service.d.ts.map +1 -0
- package/dist/services/label-monitor-service.js +414 -0
- package/dist/services/label-monitor-service.js.map +1 -0
- package/dist/services/label-sync-service.d.ts +76 -0
- package/dist/services/label-sync-service.d.ts.map +1 -0
- package/dist/services/label-sync-service.js +108 -0
- package/dist/services/label-sync-service.js.map +1 -0
- package/dist/services/phase-tracker-service.d.ts +32 -0
- package/dist/services/phase-tracker-service.d.ts.map +1 -0
- package/dist/services/phase-tracker-service.js +82 -0
- package/dist/services/phase-tracker-service.js.map +1 -0
- package/dist/services/pr-feedback-monitor-service.d.ts +86 -0
- package/dist/services/pr-feedback-monitor-service.d.ts.map +1 -0
- package/dist/services/pr-feedback-monitor-service.js +423 -0
- package/dist/services/pr-feedback-monitor-service.js.map +1 -0
- package/dist/services/queue-service.d.ts +62 -0
- package/dist/services/queue-service.d.ts.map +1 -0
- package/dist/services/queue-service.js +147 -0
- package/dist/services/queue-service.js.map +1 -0
- package/dist/services/redis-queue-adapter.d.ts +35 -0
- package/dist/services/redis-queue-adapter.d.ts.map +1 -0
- package/dist/services/redis-queue-adapter.js +218 -0
- package/dist/services/redis-queue-adapter.js.map +1 -0
- package/dist/services/smee-receiver.d.ts +87 -0
- package/dist/services/smee-receiver.d.ts.map +1 -0
- package/dist/services/smee-receiver.js +225 -0
- package/dist/services/smee-receiver.js.map +1 -0
- package/dist/services/webhook-setup-service.d.ts +253 -0
- package/dist/services/webhook-setup-service.d.ts.map +1 -0
- package/dist/services/webhook-setup-service.js +369 -0
- package/dist/services/webhook-setup-service.js.map +1 -0
- package/dist/services/worker-dispatcher.d.ts +57 -0
- package/dist/services/worker-dispatcher.d.ts.map +1 -0
- package/dist/services/worker-dispatcher.js +211 -0
- package/dist/services/worker-dispatcher.js.map +1 -0
- package/dist/services/workflow-service.d.ts +65 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +164 -0
- package/dist/services/workflow-service.js.map +1 -0
- package/dist/sse/events.d.ts +50 -0
- package/dist/sse/events.d.ts.map +1 -0
- package/dist/sse/events.js +152 -0
- package/dist/sse/events.js.map +1 -0
- package/dist/sse/index.d.ts +4 -0
- package/dist/sse/index.d.ts.map +1 -0
- package/dist/sse/index.js +7 -0
- package/dist/sse/index.js.map +1 -0
- package/dist/sse/stream.d.ts +109 -0
- package/dist/sse/stream.d.ts.map +1 -0
- package/dist/sse/stream.js +239 -0
- package/dist/sse/stream.js.map +1 -0
- package/dist/sse/subscriptions.d.ts +91 -0
- package/dist/sse/subscriptions.d.ts.map +1 -0
- package/dist/sse/subscriptions.js +299 -0
- package/dist/sse/subscriptions.js.map +1 -0
- package/dist/types/api.d.ts +651 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +169 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +27 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/monitor.d.ts +243 -0
- package/dist/types/monitor.d.ts.map +1 -0
- package/dist/types/monitor.js +2 -0
- package/dist/types/monitor.js.map +1 -0
- package/dist/types/problem-details.d.ts +63 -0
- package/dist/types/problem-details.d.ts.map +1 -0
- package/dist/types/problem-details.js +37 -0
- package/dist/types/problem-details.js.map +1 -0
- package/dist/types/sse.d.ts +224 -0
- package/dist/types/sse.d.ts.map +1 -0
- package/dist/types/sse.js +103 -0
- package/dist/types/sse.js.map +1 -0
- package/dist/types/webhook.d.ts +59 -0
- package/dist/types/webhook.d.ts.map +1 -0
- package/dist/types/webhook.js +2 -0
- package/dist/types/webhook.js.map +1 -0
- package/dist/utils/correlation.d.ts +30 -0
- package/dist/utils/correlation.d.ts.map +1 -0
- package/dist/utils/correlation.js +34 -0
- package/dist/utils/correlation.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/shutdown.d.ts +28 -0
- package/dist/utils/shutdown.d.ts.map +1 -0
- package/dist/utils/shutdown.js +86 -0
- package/dist/utils/shutdown.js.map +1 -0
- package/dist/worker/claude-cli-worker.d.ts +61 -0
- package/dist/worker/claude-cli-worker.d.ts.map +1 -0
- package/dist/worker/claude-cli-worker.js +330 -0
- package/dist/worker/claude-cli-worker.js.map +1 -0
- package/dist/worker/cli-spawner.d.ts +42 -0
- package/dist/worker/cli-spawner.d.ts.map +1 -0
- package/dist/worker/cli-spawner.js +183 -0
- package/dist/worker/cli-spawner.js.map +1 -0
- package/dist/worker/config.d.ts +76 -0
- package/dist/worker/config.d.ts.map +1 -0
- package/dist/worker/config.js +39 -0
- package/dist/worker/config.js.map +1 -0
- package/dist/worker/epic-post-tasks.d.ts +73 -0
- package/dist/worker/epic-post-tasks.d.ts.map +1 -0
- package/dist/worker/epic-post-tasks.js +266 -0
- package/dist/worker/epic-post-tasks.js.map +1 -0
- package/dist/worker/gate-checker.d.ts +22 -0
- package/dist/worker/gate-checker.d.ts.map +1 -0
- package/dist/worker/gate-checker.js +41 -0
- package/dist/worker/gate-checker.js.map +1 -0
- package/dist/worker/index.d.ts +13 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +19 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/label-manager.d.ts +89 -0
- package/dist/worker/label-manager.d.ts.map +1 -0
- package/dist/worker/label-manager.js +200 -0
- package/dist/worker/label-manager.js.map +1 -0
- package/dist/worker/output-capture.d.ts +58 -0
- package/dist/worker/output-capture.d.ts.map +1 -0
- package/dist/worker/output-capture.js +153 -0
- package/dist/worker/output-capture.js.map +1 -0
- package/dist/worker/phase-loop.d.ts +64 -0
- package/dist/worker/phase-loop.d.ts.map +1 -0
- package/dist/worker/phase-loop.js +185 -0
- package/dist/worker/phase-loop.js.map +1 -0
- package/dist/worker/phase-resolver.d.ts +62 -0
- package/dist/worker/phase-resolver.d.ts.map +1 -0
- package/dist/worker/phase-resolver.js +144 -0
- package/dist/worker/phase-resolver.js.map +1 -0
- package/dist/worker/pr-feedback-handler.d.ts +105 -0
- package/dist/worker/pr-feedback-handler.d.ts.map +1 -0
- package/dist/worker/pr-feedback-handler.js +391 -0
- package/dist/worker/pr-feedback-handler.js.map +1 -0
- package/dist/worker/pr-linker.d.ts +69 -0
- package/dist/worker/pr-linker.d.ts.map +1 -0
- package/dist/worker/pr-linker.js +108 -0
- package/dist/worker/pr-linker.js.map +1 -0
- package/dist/worker/pr-manager.d.ts +61 -0
- package/dist/worker/pr-manager.d.ts.map +1 -0
- package/dist/worker/pr-manager.js +140 -0
- package/dist/worker/pr-manager.js.map +1 -0
- package/dist/worker/repo-checkout.d.ts +63 -0
- package/dist/worker/repo-checkout.d.ts.map +1 -0
- package/dist/worker/repo-checkout.js +160 -0
- package/dist/worker/repo-checkout.js.map +1 -0
- package/dist/worker/stage-comment-manager.d.ts +34 -0
- package/dist/worker/stage-comment-manager.d.ts.map +1 -0
- package/dist/worker/stage-comment-manager.js +114 -0
- package/dist/worker/stage-comment-manager.js.map +1 -0
- package/dist/worker/types.d.ts +192 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +53 -0
- package/dist/worker/types.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ServerResponse, IncomingMessage } from 'http';
|
|
3
|
+
import type { DecisionQueueItem, DecisionResponse, ConnectedAgent } from './api.js';
|
|
4
|
+
export declare const SSEChannelSchema: z.ZodEnum<["workflows", "queue", "agents"]>;
|
|
5
|
+
export type SSEChannel = z.infer<typeof SSEChannelSchema>;
|
|
6
|
+
export declare const WorkflowEventTypeSchema: z.ZodEnum<["workflow:started", "workflow:completed", "workflow:failed", "workflow:paused", "workflow:resumed", "workflow:cancelled", "step:started", "step:completed", "step:failed", "decision:requested", "decision:resolved"]>;
|
|
7
|
+
export type WorkflowEventType = z.infer<typeof WorkflowEventTypeSchema>;
|
|
8
|
+
export declare const SSEEventTypeSchema: z.ZodEnum<["workflow:started", "workflow:completed", "workflow:failed", "workflow:paused", "workflow:resumed", "workflow:cancelled", "step:started", "step:completed", "step:failed", "decision:requested", "decision:resolved", "queue:updated", "queue:item:added", "queue:item:removed", "agent:connected", "agent:disconnected", "agent:status", "error", "connected"]>;
|
|
9
|
+
export type SSEEventType = z.infer<typeof SSEEventTypeSchema>;
|
|
10
|
+
/**
|
|
11
|
+
* Base SSE event structure
|
|
12
|
+
*/
|
|
13
|
+
export interface SSEEvent<T = unknown> {
|
|
14
|
+
/** Event type (maps to SSE 'event:' field) */
|
|
15
|
+
event: SSEEventType;
|
|
16
|
+
/** Unique event ID (maps to SSE 'id:' field) */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Event payload (serialized to SSE 'data:' field) */
|
|
19
|
+
data: T;
|
|
20
|
+
/** Event timestamp */
|
|
21
|
+
timestamp: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Workflow event data payload
|
|
25
|
+
*/
|
|
26
|
+
export interface WorkflowEventData {
|
|
27
|
+
workflowId: string;
|
|
28
|
+
stepId?: string;
|
|
29
|
+
progress?: number;
|
|
30
|
+
status?: string;
|
|
31
|
+
error?: {
|
|
32
|
+
type: string;
|
|
33
|
+
message: string;
|
|
34
|
+
};
|
|
35
|
+
metadata?: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Workflow-specific SSE event
|
|
39
|
+
*/
|
|
40
|
+
export interface WorkflowSSEEvent extends SSEEvent<WorkflowEventData> {
|
|
41
|
+
event: WorkflowEventType;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Queue event data payload
|
|
45
|
+
*/
|
|
46
|
+
export interface QueueEventData {
|
|
47
|
+
action: 'added' | 'removed' | 'updated';
|
|
48
|
+
item?: DecisionQueueItem;
|
|
49
|
+
items?: DecisionQueueItem[];
|
|
50
|
+
queueSize: number;
|
|
51
|
+
/** Included on 'removed' events when a decision has been responded to */
|
|
52
|
+
response?: DecisionResponse;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Queue update SSE event
|
|
56
|
+
*/
|
|
57
|
+
export interface QueueSSEEvent extends SSEEvent<QueueEventData> {
|
|
58
|
+
event: 'queue:updated' | 'queue:item:added' | 'queue:item:removed';
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Agent event data payload
|
|
62
|
+
*/
|
|
63
|
+
export interface AgentEventData {
|
|
64
|
+
agentId: string;
|
|
65
|
+
status: 'connected' | 'disconnected' | 'busy' | 'idle';
|
|
66
|
+
capabilities?: string[];
|
|
67
|
+
metadata?: Record<string, unknown>;
|
|
68
|
+
agent?: ConnectedAgent;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Agent status SSE event
|
|
72
|
+
*/
|
|
73
|
+
export interface AgentSSEEvent extends SSEEvent<AgentEventData> {
|
|
74
|
+
event: 'agent:connected' | 'agent:disconnected' | 'agent:status';
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Error event data payload
|
|
78
|
+
*/
|
|
79
|
+
export interface ErrorEventData {
|
|
80
|
+
type: string;
|
|
81
|
+
title: string;
|
|
82
|
+
status: number;
|
|
83
|
+
detail?: string;
|
|
84
|
+
traceId?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Error SSE event
|
|
88
|
+
*/
|
|
89
|
+
export interface ErrorSSEEvent extends SSEEvent<ErrorEventData> {
|
|
90
|
+
event: 'error';
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Connected event data payload
|
|
94
|
+
*/
|
|
95
|
+
export interface ConnectedEventData {
|
|
96
|
+
connectionId: string;
|
|
97
|
+
channels: SSEChannel[];
|
|
98
|
+
timestamp: string;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Connection confirmation SSE event
|
|
102
|
+
*/
|
|
103
|
+
export interface ConnectedSSEEvent extends SSEEvent<ConnectedEventData> {
|
|
104
|
+
event: 'connected';
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Union of all SSE event types
|
|
108
|
+
*/
|
|
109
|
+
export type AnySSEEvent = WorkflowSSEEvent | QueueSSEEvent | AgentSSEEvent | ErrorSSEEvent | ConnectedSSEEvent;
|
|
110
|
+
/**
|
|
111
|
+
* Subscription filter options
|
|
112
|
+
*/
|
|
113
|
+
export interface SSEFilters {
|
|
114
|
+
/** Filter to specific workflow */
|
|
115
|
+
workflowId?: string;
|
|
116
|
+
/** Filter by tags */
|
|
117
|
+
tags?: string[];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* SSE client subscription
|
|
121
|
+
*/
|
|
122
|
+
export interface SSESubscription {
|
|
123
|
+
/** Subscribed channels */
|
|
124
|
+
channels: Set<SSEChannel>;
|
|
125
|
+
/** Active filters */
|
|
126
|
+
filters: SSEFilters;
|
|
127
|
+
/** Last event ID received (for reconnection) */
|
|
128
|
+
lastEventId?: string;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Active SSE connection
|
|
132
|
+
*/
|
|
133
|
+
export interface SSEConnection {
|
|
134
|
+
/** Unique connection identifier */
|
|
135
|
+
id: string;
|
|
136
|
+
/** Node.js response stream */
|
|
137
|
+
response: ServerResponse;
|
|
138
|
+
/** Original request (for correlation ID) */
|
|
139
|
+
request: IncomingMessage;
|
|
140
|
+
/** Client's user ID (from auth) */
|
|
141
|
+
userId: string;
|
|
142
|
+
/** Subscription configuration */
|
|
143
|
+
subscription: SSESubscription;
|
|
144
|
+
/** Connection established timestamp */
|
|
145
|
+
connectedAt: Date;
|
|
146
|
+
/** Heartbeat timer reference */
|
|
147
|
+
heartbeatTimer?: NodeJS.Timeout;
|
|
148
|
+
/** Event sequence counter */
|
|
149
|
+
sequenceCounter: number;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* SSE connection options
|
|
153
|
+
*/
|
|
154
|
+
export interface SSEConnectionOptions {
|
|
155
|
+
/** Channels to subscribe to */
|
|
156
|
+
channels?: SSEChannel[];
|
|
157
|
+
/** Filter options */
|
|
158
|
+
filters?: SSEFilters;
|
|
159
|
+
/** Resume from last event ID */
|
|
160
|
+
lastEventId?: string;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* SSE stream configuration
|
|
164
|
+
*/
|
|
165
|
+
export interface SSEStreamConfig {
|
|
166
|
+
/** Heartbeat interval in milliseconds (default: 30000) */
|
|
167
|
+
heartbeatInterval: number;
|
|
168
|
+
/** Maximum connections per client (default: 3) */
|
|
169
|
+
maxConnectionsPerClient: number;
|
|
170
|
+
/** Buffer size for missed events (default: 100) */
|
|
171
|
+
eventBufferSize: number;
|
|
172
|
+
/** Event retention duration in ms (default: 60000) */
|
|
173
|
+
eventRetentionMs: number;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Default SSE configuration
|
|
177
|
+
*/
|
|
178
|
+
export declare const DEFAULT_SSE_CONFIG: SSEStreamConfig;
|
|
179
|
+
/**
|
|
180
|
+
* SSE filters validation schema
|
|
181
|
+
*/
|
|
182
|
+
export declare const SSEFiltersSchema: z.ZodOptional<z.ZodObject<{
|
|
183
|
+
workflowId: z.ZodOptional<z.ZodString>;
|
|
184
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
185
|
+
}, "strip", z.ZodTypeAny, {
|
|
186
|
+
tags?: string[] | undefined;
|
|
187
|
+
workflowId?: string | undefined;
|
|
188
|
+
}, {
|
|
189
|
+
tags?: string[] | undefined;
|
|
190
|
+
workflowId?: string | undefined;
|
|
191
|
+
}>>;
|
|
192
|
+
/**
|
|
193
|
+
* Query parameters for SSE endpoints
|
|
194
|
+
*/
|
|
195
|
+
export declare const SSEQuerySchema: z.ZodObject<{
|
|
196
|
+
channels: z.ZodOptional<z.ZodString>;
|
|
197
|
+
workflowId: z.ZodOptional<z.ZodString>;
|
|
198
|
+
}, "strip", z.ZodTypeAny, {
|
|
199
|
+
workflowId?: string | undefined;
|
|
200
|
+
channels?: string | undefined;
|
|
201
|
+
}, {
|
|
202
|
+
workflowId?: string | undefined;
|
|
203
|
+
channels?: string | undefined;
|
|
204
|
+
}>;
|
|
205
|
+
export type SSEQuery = z.infer<typeof SSEQuerySchema>;
|
|
206
|
+
/**
|
|
207
|
+
* Parse channels from query string
|
|
208
|
+
*/
|
|
209
|
+
export declare function parseChannels(channelsParam?: string): SSEChannel[];
|
|
210
|
+
/**
|
|
211
|
+
* Event ID structure
|
|
212
|
+
* Format: {timestamp}_{connectionId}_{sequence}
|
|
213
|
+
* Example: 1706123456789_conn_abc123_42
|
|
214
|
+
*/
|
|
215
|
+
export interface EventIdComponents {
|
|
216
|
+
timestamp: number;
|
|
217
|
+
connectionId: string;
|
|
218
|
+
sequence: number;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Parse event ID components
|
|
222
|
+
*/
|
|
223
|
+
export declare function parseEventId(id: string): EventIdComponents | null;
|
|
224
|
+
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/types/sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Channel Types (shared with WebSocket, will be sole source after migration)
|
|
4
|
+
// ============================================================================
|
|
5
|
+
export const SSEChannelSchema = z.enum(['workflows', 'queue', 'agents']);
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// SSE Event Types
|
|
8
|
+
// ============================================================================
|
|
9
|
+
export const WorkflowEventTypeSchema = z.enum([
|
|
10
|
+
'workflow:started',
|
|
11
|
+
'workflow:completed',
|
|
12
|
+
'workflow:failed',
|
|
13
|
+
'workflow:paused',
|
|
14
|
+
'workflow:resumed',
|
|
15
|
+
'workflow:cancelled',
|
|
16
|
+
'step:started',
|
|
17
|
+
'step:completed',
|
|
18
|
+
'step:failed',
|
|
19
|
+
'decision:requested',
|
|
20
|
+
'decision:resolved',
|
|
21
|
+
]);
|
|
22
|
+
export const SSEEventTypeSchema = z.enum([
|
|
23
|
+
// Workflow events
|
|
24
|
+
'workflow:started',
|
|
25
|
+
'workflow:completed',
|
|
26
|
+
'workflow:failed',
|
|
27
|
+
'workflow:paused',
|
|
28
|
+
'workflow:resumed',
|
|
29
|
+
'workflow:cancelled',
|
|
30
|
+
'step:started',
|
|
31
|
+
'step:completed',
|
|
32
|
+
'step:failed',
|
|
33
|
+
'decision:requested',
|
|
34
|
+
'decision:resolved',
|
|
35
|
+
// Queue events
|
|
36
|
+
'queue:updated',
|
|
37
|
+
'queue:item:added',
|
|
38
|
+
'queue:item:removed',
|
|
39
|
+
// Agent events
|
|
40
|
+
'agent:connected',
|
|
41
|
+
'agent:disconnected',
|
|
42
|
+
'agent:status',
|
|
43
|
+
// System events
|
|
44
|
+
'error',
|
|
45
|
+
'connected',
|
|
46
|
+
]);
|
|
47
|
+
/**
|
|
48
|
+
* Default SSE configuration
|
|
49
|
+
*/
|
|
50
|
+
export const DEFAULT_SSE_CONFIG = {
|
|
51
|
+
heartbeatInterval: 30000,
|
|
52
|
+
maxConnectionsPerClient: 3,
|
|
53
|
+
eventBufferSize: 100,
|
|
54
|
+
eventRetentionMs: 60000,
|
|
55
|
+
};
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Query Parameter Validation
|
|
58
|
+
// ============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* SSE filters validation schema
|
|
61
|
+
*/
|
|
62
|
+
export const SSEFiltersSchema = z
|
|
63
|
+
.object({
|
|
64
|
+
workflowId: z.string().optional(),
|
|
65
|
+
tags: z.array(z.string()).optional(),
|
|
66
|
+
})
|
|
67
|
+
.optional();
|
|
68
|
+
/**
|
|
69
|
+
* Query parameters for SSE endpoints
|
|
70
|
+
*/
|
|
71
|
+
export const SSEQuerySchema = z.object({
|
|
72
|
+
channels: z.string().optional(), // comma-separated
|
|
73
|
+
workflowId: z.string().optional(),
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* Parse channels from query string
|
|
77
|
+
*/
|
|
78
|
+
export function parseChannels(channelsParam) {
|
|
79
|
+
if (!channelsParam) {
|
|
80
|
+
return ['workflows', 'queue', 'agents']; // default: all
|
|
81
|
+
}
|
|
82
|
+
const channels = channelsParam.split(',').map((c) => c.trim());
|
|
83
|
+
return channels.filter((c) => SSEChannelSchema.safeParse(c).success);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse event ID components
|
|
87
|
+
*/
|
|
88
|
+
export function parseEventId(id) {
|
|
89
|
+
const parts = id.split('_');
|
|
90
|
+
if (parts.length < 3)
|
|
91
|
+
return null;
|
|
92
|
+
const firstPart = parts[0];
|
|
93
|
+
const lastPart = parts[parts.length - 1];
|
|
94
|
+
if (!firstPart || !lastPart)
|
|
95
|
+
return null;
|
|
96
|
+
const timestamp = parseInt(firstPart, 10);
|
|
97
|
+
const connectionId = parts.slice(1, -1).join('_');
|
|
98
|
+
const sequence = parseInt(lastPart, 10);
|
|
99
|
+
if (isNaN(timestamp) || isNaN(sequence))
|
|
100
|
+
return null;
|
|
101
|
+
return { timestamp, connectionId, sequence };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/types/sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal GitHub webhook response type.
|
|
3
|
+
* Only includes fields needed for matching and reactivation.
|
|
4
|
+
*/
|
|
5
|
+
export interface GitHubWebhook {
|
|
6
|
+
/** Webhook ID */
|
|
7
|
+
id: number;
|
|
8
|
+
/** Whether webhook is active */
|
|
9
|
+
active: boolean;
|
|
10
|
+
/** Webhook configuration */
|
|
11
|
+
config: {
|
|
12
|
+
/** Target URL */
|
|
13
|
+
url: string;
|
|
14
|
+
};
|
|
15
|
+
/** Event types webhook subscribes to */
|
|
16
|
+
events: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Summary of webhook setup operation across multiple repositories
|
|
20
|
+
*/
|
|
21
|
+
export interface WebhookSetupSummary {
|
|
22
|
+
/** Total repositories checked */
|
|
23
|
+
total: number;
|
|
24
|
+
/** Webhooks created */
|
|
25
|
+
created: number;
|
|
26
|
+
/** Webhooks skipped (already exist) */
|
|
27
|
+
skipped: number;
|
|
28
|
+
/** Webhooks reactivated */
|
|
29
|
+
reactivated: number;
|
|
30
|
+
/** Repositories that failed */
|
|
31
|
+
failed: number;
|
|
32
|
+
/** Per-repository results */
|
|
33
|
+
results: WebhookSetupResult[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Result of webhook setup for a single repository
|
|
37
|
+
*/
|
|
38
|
+
export interface WebhookSetupResult {
|
|
39
|
+
/** Repository owner */
|
|
40
|
+
owner: string;
|
|
41
|
+
/** Repository name */
|
|
42
|
+
repo: string;
|
|
43
|
+
/** Action taken */
|
|
44
|
+
action: 'created' | 'skipped' | 'reactivated' | 'failed';
|
|
45
|
+
/** Webhook ID (if applicable) */
|
|
46
|
+
webhookId?: number;
|
|
47
|
+
/** Error message (if action === 'failed') */
|
|
48
|
+
error?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Repository configuration for webhook setup
|
|
52
|
+
*/
|
|
53
|
+
export interface RepositoryConfig {
|
|
54
|
+
/** Repository owner */
|
|
55
|
+
owner: string;
|
|
56
|
+
/** Repository name */
|
|
57
|
+
repo: string;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/types/webhook.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE;QACN,iBAAiB;QACjB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC;IACzD,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/types/webhook.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { FastifyRequest, FastifyReply } from 'fastify';
|
|
2
|
+
/**
|
|
3
|
+
* Header name for request correlation ID
|
|
4
|
+
*/
|
|
5
|
+
export declare const CORRELATION_ID_HEADER = "x-request-id";
|
|
6
|
+
/**
|
|
7
|
+
* Augment FastifyRequest to include correlation ID
|
|
8
|
+
*/
|
|
9
|
+
declare module 'fastify' {
|
|
10
|
+
interface FastifyRequest {
|
|
11
|
+
correlationId: string;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate a new correlation ID
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateCorrelationId(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Extract correlation ID from request headers or generate a new one
|
|
20
|
+
*/
|
|
21
|
+
export declare function getCorrelationId(request: FastifyRequest): string;
|
|
22
|
+
/**
|
|
23
|
+
* Fastify hook to add correlation ID to requests (async for Fastify v5)
|
|
24
|
+
*/
|
|
25
|
+
export declare function correlationIdHook(request: FastifyRequest, _reply: FastifyReply): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Fastify hook to add correlation ID to response headers (async for Fastify v5)
|
|
28
|
+
*/
|
|
29
|
+
export declare function correlationIdResponseHook(request: FastifyRequest, reply: FastifyReply): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=correlation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlation.d.ts","sourceRoot":"","sources":["../../src/utils/correlation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AAEpD;;GAEG;AACH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB;CACF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAMhE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Header name for request correlation ID
|
|
4
|
+
*/
|
|
5
|
+
export const CORRELATION_ID_HEADER = 'x-request-id';
|
|
6
|
+
/**
|
|
7
|
+
* Generate a new correlation ID
|
|
8
|
+
*/
|
|
9
|
+
export function generateCorrelationId() {
|
|
10
|
+
return randomUUID();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Extract correlation ID from request headers or generate a new one
|
|
14
|
+
*/
|
|
15
|
+
export function getCorrelationId(request) {
|
|
16
|
+
const headerValue = request.headers[CORRELATION_ID_HEADER];
|
|
17
|
+
if (typeof headerValue === 'string' && headerValue.length > 0) {
|
|
18
|
+
return headerValue;
|
|
19
|
+
}
|
|
20
|
+
return generateCorrelationId();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Fastify hook to add correlation ID to requests (async for Fastify v5)
|
|
24
|
+
*/
|
|
25
|
+
export async function correlationIdHook(request, _reply) {
|
|
26
|
+
request.correlationId = getCorrelationId(request);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Fastify hook to add correlation ID to response headers (async for Fastify v5)
|
|
30
|
+
*/
|
|
31
|
+
export async function correlationIdResponseHook(request, reply) {
|
|
32
|
+
reply.header(CORRELATION_ID_HEADER, request.correlationId);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=correlation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlation.js","sourceRoot":"","sources":["../../src/utils/correlation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,cAAc,CAAC;AAWpD;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACtD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3D,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,qBAAqB,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAuB,EACvB,MAAoB;IAEpB,OAAO,CAAC,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAuB,EACvB,KAAmB;IAEnB,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { CORRELATION_ID_HEADER, generateCorrelationId, getCorrelationId, correlationIdHook, correlationIdResponseHook, } from './correlation.js';
|
|
2
|
+
export { setupGracefulShutdown, isShuttingDown, resetShutdownState, type ShutdownOptions, } from './shutdown.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GAEnB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { FastifyInstance } from 'fastify';
|
|
2
|
+
/**
|
|
3
|
+
* Shutdown options
|
|
4
|
+
*/
|
|
5
|
+
export interface ShutdownOptions {
|
|
6
|
+
/** Timeout for graceful shutdown in milliseconds (default: 30000) */
|
|
7
|
+
timeout?: number;
|
|
8
|
+
/** Logger for shutdown messages */
|
|
9
|
+
logger?: {
|
|
10
|
+
info: (msg: string) => void;
|
|
11
|
+
error: (msg: string, error?: Error) => void;
|
|
12
|
+
};
|
|
13
|
+
/** Additional cleanup functions to run */
|
|
14
|
+
cleanup?: Array<() => Promise<void>>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Setup graceful shutdown handlers for SIGTERM and SIGINT
|
|
18
|
+
*/
|
|
19
|
+
export declare function setupGracefulShutdown(server: FastifyInstance, options?: ShutdownOptions): () => Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Check if shutdown is in progress
|
|
22
|
+
*/
|
|
23
|
+
export declare function isShuttingDown(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Reset shutdown state (for testing)
|
|
26
|
+
*/
|
|
27
|
+
export declare function resetShutdownState(): void;
|
|
28
|
+
//# sourceMappingURL=shutdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../src/utils/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAe/C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;KAC7C,CAAC;IACF,0CAA0C;IAC1C,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;CACtC;AAyCD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,eAAoB,GAC5B,MAAM,OAAO,CAAC,IAAI,CAAC,CAsCrB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
const state = {
|
|
2
|
+
isShuttingDown: false,
|
|
3
|
+
shutdownPromise: null,
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Perform graceful shutdown
|
|
7
|
+
*/
|
|
8
|
+
async function performShutdown(server, options) {
|
|
9
|
+
const { timeout = 30000, logger, cleanup = [] } = options;
|
|
10
|
+
logger?.info('Starting graceful shutdown...');
|
|
11
|
+
// Create timeout promise
|
|
12
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
13
|
+
setTimeout(() => {
|
|
14
|
+
reject(new Error(`Shutdown timed out after ${timeout}ms`));
|
|
15
|
+
}, timeout);
|
|
16
|
+
});
|
|
17
|
+
try {
|
|
18
|
+
// Close server (stops accepting new connections)
|
|
19
|
+
await Promise.race([server.close(), timeoutPromise]);
|
|
20
|
+
logger?.info('Server closed, stopping new connections');
|
|
21
|
+
// Run cleanup functions
|
|
22
|
+
for (const cleanupFn of cleanup) {
|
|
23
|
+
try {
|
|
24
|
+
await Promise.race([cleanupFn(), timeoutPromise]);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
logger?.error('Cleanup function failed', error);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
logger?.info('Graceful shutdown complete');
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
logger?.error('Shutdown failed', error);
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Setup graceful shutdown handlers for SIGTERM and SIGINT
|
|
39
|
+
*/
|
|
40
|
+
export function setupGracefulShutdown(server, options = {}) {
|
|
41
|
+
const { logger } = options;
|
|
42
|
+
const handleSignal = (signal) => {
|
|
43
|
+
return () => {
|
|
44
|
+
if (state.isShuttingDown) {
|
|
45
|
+
logger?.info(`Received ${signal} but already shutting down`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
logger?.info(`Received ${signal}, initiating graceful shutdown`);
|
|
49
|
+
state.isShuttingDown = true;
|
|
50
|
+
state.shutdownPromise = performShutdown(server, options)
|
|
51
|
+
.then(() => {
|
|
52
|
+
process.exit(0);
|
|
53
|
+
})
|
|
54
|
+
.catch((error) => {
|
|
55
|
+
logger?.error('Shutdown failed, forcing exit', error);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
// Register signal handlers
|
|
61
|
+
process.on('SIGTERM', handleSignal('SIGTERM'));
|
|
62
|
+
process.on('SIGINT', handleSignal('SIGINT'));
|
|
63
|
+
// Return a function to manually trigger shutdown (for testing)
|
|
64
|
+
return async () => {
|
|
65
|
+
if (state.isShuttingDown && state.shutdownPromise) {
|
|
66
|
+
return state.shutdownPromise;
|
|
67
|
+
}
|
|
68
|
+
state.isShuttingDown = true;
|
|
69
|
+
state.shutdownPromise = performShutdown(server, options);
|
|
70
|
+
return state.shutdownPromise;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if shutdown is in progress
|
|
75
|
+
*/
|
|
76
|
+
export function isShuttingDown() {
|
|
77
|
+
return state.isShuttingDown;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Reset shutdown state (for testing)
|
|
81
|
+
*/
|
|
82
|
+
export function resetShutdownState() {
|
|
83
|
+
state.isShuttingDown = false;
|
|
84
|
+
state.shutdownPromise = null;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=shutdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../src/utils/shutdown.ts"],"names":[],"mappings":"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"}
|