rest-pipeline-js 1.2.5 → 1.2.6

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.
Files changed (56) hide show
  1. package/dist/cjs/error-handler.js +12 -0
  2. package/dist/cjs/index.js +23 -0
  3. package/dist/cjs/pipeline-orchestrator.js +565 -0
  4. package/dist/cjs/progress-tracker.js +47 -0
  5. package/dist/cjs/react.js +29 -0
  6. package/dist/cjs/request-executor.js +33 -0
  7. package/dist/cjs/rest-client.js +201 -0
  8. package/dist/cjs/types.js +2 -0
  9. package/dist/cjs/usePipelineProgress-react.js +17 -0
  10. package/dist/cjs/usePipelineProgress-vue.js +17 -0
  11. package/dist/cjs/usePipelineRun-react.js +33 -0
  12. package/dist/cjs/usePipelineRun-vue.js +45 -0
  13. package/dist/cjs/usePipelineStepEvents-react.js +46 -0
  14. package/dist/cjs/usePipelineStepEvents-vue.js +45 -0
  15. package/dist/cjs/useRestClient-react.js +13 -0
  16. package/dist/cjs/useRestClient-vue.js +14 -0
  17. package/dist/cjs/vue.js +29 -0
  18. package/dist/esm/error-handler.d.ts +4 -0
  19. package/dist/esm/error-handler.js +8 -0
  20. package/dist/esm/index.d.ts +6 -0
  21. package/dist/esm/index.js +7 -0
  22. package/dist/esm/pipeline-orchestrator.d.ts +136 -0
  23. package/dist/esm/pipeline-orchestrator.js +561 -0
  24. package/dist/esm/progress-tracker.d.ts +22 -0
  25. package/dist/esm/progress-tracker.js +43 -0
  26. package/dist/esm/react.d.ts +5 -0
  27. package/dist/esm/react.js +6 -0
  28. package/dist/esm/request-executor.d.ts +9 -0
  29. package/dist/esm/request-executor.js +29 -0
  30. package/dist/esm/rest-client.d.ts +14 -0
  31. package/dist/esm/rest-client.js +160 -0
  32. package/dist/esm/types.d.ts +164 -0
  33. package/dist/esm/types.js +1 -0
  34. package/dist/esm/usePipelineProgress-react.d.ts +8 -0
  35. package/dist/esm/usePipelineProgress-react.js +14 -0
  36. package/dist/esm/usePipelineProgress-vue.d.ts +16 -0
  37. package/dist/esm/usePipelineProgress-vue.js +14 -0
  38. package/dist/esm/usePipelineRun-react.d.ts +12 -0
  39. package/dist/esm/usePipelineRun-react.js +30 -0
  40. package/dist/esm/usePipelineRun-vue.d.ts +21 -0
  41. package/dist/esm/usePipelineRun-vue.js +42 -0
  42. package/dist/esm/usePipelineStepEvents-react.d.ts +29 -0
  43. package/dist/esm/usePipelineStepEvents-react.js +41 -0
  44. package/dist/esm/usePipelineStepEvents-vue.d.ts +39 -0
  45. package/dist/esm/usePipelineStepEvents-vue.js +40 -0
  46. package/dist/esm/useRestClient-react.d.ts +15 -0
  47. package/dist/esm/useRestClient-react.js +10 -0
  48. package/dist/esm/useRestClient-vue.d.ts +15 -0
  49. package/dist/esm/useRestClient-vue.js +10 -0
  50. package/dist/esm/vue.d.ts +5 -0
  51. package/dist/esm/vue.js +6 -0
  52. package/package.json +14 -13
  53. package/src/error-handler.ts +7 -3
  54. package/tests/pipeline-orchestrator.test.ts +6 -6
  55. package/tsconfig.cjs.json +16 -0
  56. package/tsconfig.esm.json +16 -0
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ErrorHandler = void 0;
4
+ class ErrorHandler {
5
+ handle(error, _stageKey) {
6
+ return {
7
+ message: error instanceof Error ? error.message : String(error !== null && error !== void 0 ? error : 'Unknown error'),
8
+ status: typeof (error === null || error === void 0 ? void 0 : error.status) === 'number' ? error.status : undefined,
9
+ };
10
+ }
11
+ }
12
+ exports.ErrorHandler = ErrorHandler;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ // Barrel file for pipeline-js module (core only — no Vue/React)
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ __exportStar(require("./rest-client"), exports);
19
+ __exportStar(require("./types"), exports);
20
+ __exportStar(require("./request-executor"), exports);
21
+ __exportStar(require("./error-handler"), exports);
22
+ __exportStar(require("./progress-tracker"), exports);
23
+ __exportStar(require("./pipeline-orchestrator"), exports);
@@ -0,0 +1,565 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PipelineOrchestrator = void 0;
4
+ const error_handler_1 = require("./error-handler");
5
+ const progress_tracker_1 = require("./progress-tracker");
6
+ const request_executor_1 = require("./request-executor");
7
+ const rest_client_1 = require("./rest-client");
8
+ class PipelineOrchestrator {
9
+ constructor(params) {
10
+ var _a, _b, _c, _d;
11
+ this.onStepStartHandlers = [];
12
+ this.onStepFinishHandlers = [];
13
+ this.onStepErrorHandlers = [];
14
+ /** Универсальные подписчики событий: ключ — имя события */
15
+ this.eventHandlers = {};
16
+ /** Встроенные логи */
17
+ this.logs = [];
18
+ this.stageResults = {};
19
+ this.stageResultsListeners = [];
20
+ /** AbortController для отмены пайплайна */
21
+ this.abortController = null;
22
+ this.config = params.config;
23
+ this.progress = new progress_tracker_1.ProgressTracker(params.config.stages.length);
24
+ this.errorHandler = new error_handler_1.ErrorHandler();
25
+ this.executor = new request_executor_1.RequestExecutor((_a = params.httpConfig) !== null && _a !== void 0 ? _a : {});
26
+ this.sharedData = (_b = params.sharedData) !== null && _b !== void 0 ? _b : {};
27
+ this.autoReset = (_d = (_c = params.options) === null || _c === void 0 ? void 0 : _c.autoReset) !== null && _d !== void 0 ? _d : false;
28
+ }
29
+ /**
30
+ * Подписка на изменения stageResults (реактивно)
31
+ */
32
+ subscribeStageResults(listener) {
33
+ this.stageResultsListeners.push(listener);
34
+ // Немедленно уведомляем нового подписчика о текущем состоянии
35
+ listener({ ...this.stageResults });
36
+ return () => {
37
+ this.stageResultsListeners = this.stageResultsListeners.filter((l) => l !== listener);
38
+ };
39
+ }
40
+ /**
41
+ * Универсальная подписка на события: step:<key>, progress, log и др.
42
+ */
43
+ on(event, handler) {
44
+ if (!this.eventHandlers[event])
45
+ this.eventHandlers[event] = [];
46
+ this.eventHandlers[event].push(handler);
47
+ return () => {
48
+ this.eventHandlers[event] = this.eventHandlers[event].filter((h) => h !== handler);
49
+ };
50
+ }
51
+ /**
52
+ * Вызов всех обработчиков события
53
+ */
54
+ async emit(event, ...args) {
55
+ if (this.eventHandlers[event]) {
56
+ for (const handler of this.eventHandlers[event]) {
57
+ await handler(...args);
58
+ }
59
+ }
60
+ }
61
+ /**
62
+ * Получить логи пайплайна
63
+ */
64
+ getLogs() {
65
+ return [...this.logs];
66
+ }
67
+ notifyStageResults() {
68
+ for (const listener of this.stageResultsListeners) {
69
+ listener({ ...this.stageResults });
70
+ }
71
+ }
72
+ /**
73
+ * Повторно выполнить только один шаг пайплайна (без полного рестарта)
74
+ * @param stepKey ключ шага
75
+ * @param options дополнительные опции (например, onStepPause, externalSignal)
76
+ */
77
+ async rerunStep(stepKey, options) {
78
+ var _a, _b;
79
+ const i = this.config.stages.findIndex((s) => s.key === stepKey);
80
+ if (i === -1)
81
+ return undefined;
82
+ const stage = this.config.stages[i];
83
+ const key = stage.key;
84
+ const signal = options === null || options === void 0 ? void 0 : options.externalSignal;
85
+ this.logs.push({
86
+ type: "log",
87
+ message: `rerunStep:${key}:start`,
88
+ timestamp: new Date(),
89
+ data: { stepIndex: i },
90
+ });
91
+ await this.emit("log", {
92
+ type: "rerunStep:start",
93
+ stepKey: key,
94
+ stepIndex: i,
95
+ });
96
+ // Получаем url для шага, аналогично run
97
+ let stepUrl = undefined;
98
+ if (typeof stage.request === "string") {
99
+ stepUrl = stage.request;
100
+ }
101
+ else if (typeof stage.request === "function") {
102
+ try {
103
+ const reqResult = await stage.request({
104
+ prev: i > 0
105
+ ? (_a = this.stageResults[this.config.stages[i - 1].key]) === null || _a === void 0 ? void 0 : _a.data
106
+ : undefined,
107
+ allResults: this.stageResults,
108
+ sharedData: this.sharedData,
109
+ });
110
+ if (typeof reqResult === "string") {
111
+ stepUrl = reqResult;
112
+ }
113
+ }
114
+ catch {
115
+ // ignore errors here, url не обязателен
116
+ }
117
+ }
118
+ else {
119
+ stepUrl = key;
120
+ }
121
+ this.stageResults[key] = { status: "pending", url: stepUrl };
122
+ this.notifyStageResults();
123
+ this.progress.updateStage(i, "loading");
124
+ await this.emitStepStart({
125
+ stepIndex: i,
126
+ stepKey: key,
127
+ status: "loading",
128
+ stageResults: { ...this.stageResults },
129
+ });
130
+ await this.emit(`step:${key}:start`, {
131
+ stepIndex: i,
132
+ stepKey: key,
133
+ status: "loading",
134
+ stageResults: { ...this.stageResults },
135
+ });
136
+ try {
137
+ let stepResult;
138
+ if (typeof stage.request === "function") {
139
+ stepResult = await stage.request({
140
+ prev: i > 0
141
+ ? (_b = this.stageResults[this.config.stages[i - 1].key]) === null || _b === void 0 ? void 0 : _b.data
142
+ : undefined,
143
+ allResults: this.stageResults,
144
+ sharedData: this.sharedData,
145
+ });
146
+ }
147
+ else {
148
+ const res = await this.executor.execute(stage.key, undefined, stage.retryCount, stage.timeoutMs);
149
+ stepResult = res.data;
150
+ }
151
+ if (options === null || options === void 0 ? void 0 : options.onStepPause) {
152
+ stepResult = await options.onStepPause(i, stepResult, this.stageResults);
153
+ }
154
+ this.stageResults[key] = {
155
+ status: "success",
156
+ url: stepUrl,
157
+ data: stepResult,
158
+ };
159
+ this.notifyStageResults();
160
+ this.progress.updateStage(i, "success");
161
+ await this.emitStepFinish({
162
+ stepIndex: i,
163
+ stepKey: key,
164
+ status: "success",
165
+ data: stepResult,
166
+ stageResults: { ...this.stageResults },
167
+ });
168
+ await this.emit(`step:${key}:success`, {
169
+ stepIndex: i,
170
+ stepKey: key,
171
+ status: "success",
172
+ data: stepResult,
173
+ stageResults: { ...this.stageResults },
174
+ });
175
+ this.logs.push({
176
+ type: "log",
177
+ message: `rerunStep:${key}:success`,
178
+ timestamp: new Date(),
179
+ data: { stepIndex: i, data: stepResult },
180
+ });
181
+ await this.emit("log", {
182
+ type: "rerunStep:success",
183
+ stepKey: key,
184
+ stepIndex: i,
185
+ data: stepResult,
186
+ });
187
+ return this.stageResults[key];
188
+ }
189
+ catch (err) {
190
+ let handled;
191
+ if (stage && typeof stage.errorHandler === "function") {
192
+ handled = stage.errorHandler({
193
+ error: err,
194
+ key: stage.key,
195
+ sharedData: this.sharedData,
196
+ });
197
+ }
198
+ else if (stage) {
199
+ handled = this.errorHandler.handle(err, stage.key);
200
+ }
201
+ else {
202
+ handled = this.errorHandler.handle(err, "unknown");
203
+ }
204
+ if (!handled && stage) {
205
+ handled = this.errorHandler.handle(err, stage.key);
206
+ }
207
+ const apiError = (0, rest_client_1.toApiError)(handled !== null && handled !== void 0 ? handled : err);
208
+ this.stageResults[key] = {
209
+ status: "error",
210
+ url: stepUrl,
211
+ error: apiError,
212
+ };
213
+ this.notifyStageResults();
214
+ this.progress.updateStage(i, "error");
215
+ await this.emitStepError({
216
+ stepIndex: i,
217
+ stepKey: key,
218
+ status: "error",
219
+ error: apiError,
220
+ stageResults: { ...this.stageResults },
221
+ });
222
+ await this.emit(`step:${key}:error`, {
223
+ stepIndex: i,
224
+ stepKey: key,
225
+ status: "error",
226
+ error: apiError,
227
+ stageResults: { ...this.stageResults },
228
+ });
229
+ this.logs.push({
230
+ type: "error",
231
+ message: `rerunStep:${key}:error`,
232
+ timestamp: new Date(),
233
+ data: { stepIndex: i, error: apiError },
234
+ });
235
+ await this.emit("log", {
236
+ type: "rerunStep:error",
237
+ stepKey: key,
238
+ stepIndex: i,
239
+ error: apiError,
240
+ });
241
+ return this.stageResults[key];
242
+ }
243
+ }
244
+ /**
245
+ * Отменить выполнение пайплайна (вызывает ошибку AbortError)
246
+ */
247
+ abort() {
248
+ if (this.abortController) {
249
+ this.abortController.abort();
250
+ }
251
+ }
252
+ /**
253
+ * Проверить, был ли пайплайн отменён
254
+ */
255
+ isAborted() {
256
+ var _a, _b;
257
+ return (_b = (_a = this.abortController) === null || _a === void 0 ? void 0 : _a.signal.aborted) !== null && _b !== void 0 ? _b : false;
258
+ }
259
+ /**
260
+ * Подписка на событие начала шага
261
+ */
262
+ onStepStart(handler) {
263
+ this.onStepStartHandlers.push(handler);
264
+ return () => {
265
+ this.onStepStartHandlers = this.onStepStartHandlers.filter((h) => h !== handler);
266
+ };
267
+ }
268
+ /**
269
+ * Подписка на событие успешного завершения шага
270
+ */
271
+ onStepFinish(handler) {
272
+ this.onStepFinishHandlers.push(handler);
273
+ return () => {
274
+ this.onStepFinishHandlers = this.onStepFinishHandlers.filter((h) => h !== handler);
275
+ };
276
+ }
277
+ /**
278
+ * Подписка на событие ошибки шага
279
+ */
280
+ onStepError(handler) {
281
+ this.onStepErrorHandlers.push(handler);
282
+ return () => {
283
+ this.onStepErrorHandlers = this.onStepErrorHandlers.filter((h) => h !== handler);
284
+ };
285
+ }
286
+ async emitStepStart(event) {
287
+ for (const handler of this.onStepStartHandlers) {
288
+ await handler(event);
289
+ }
290
+ // Гибкая подписка на step:<key>:start
291
+ await this.emit(`step:${event.stepKey}:start`, event);
292
+ // Логирование
293
+ this.logs.push({
294
+ type: "log",
295
+ message: `step:${event.stepKey}:start`,
296
+ timestamp: new Date(),
297
+ data: event,
298
+ });
299
+ await this.emit("log", { type: "step:start", ...event });
300
+ }
301
+ async emitStepFinish(event) {
302
+ for (const handler of this.onStepFinishHandlers) {
303
+ await handler(event);
304
+ }
305
+ await this.emit(`step:${event.stepKey}:success`, event);
306
+ this.logs.push({
307
+ type: "log",
308
+ message: `step:${event.stepKey}:success`,
309
+ timestamp: new Date(),
310
+ data: event,
311
+ });
312
+ await this.emit("log", { type: "step:success", ...event });
313
+ }
314
+ async emitStepError(event) {
315
+ for (const handler of this.onStepErrorHandlers) {
316
+ await handler(event);
317
+ }
318
+ await this.emit(`step:${event.stepKey}:error`, event);
319
+ this.logs.push({
320
+ type: "error",
321
+ message: `step:${event.stepKey}:error`,
322
+ timestamp: new Date(),
323
+ data: event,
324
+ });
325
+ await this.emit("log", { type: "step:error", ...event });
326
+ }
327
+ /**
328
+ * Подписаться на изменения прогресса выполнения pipeline
329
+ * @param listener функция-обработчик изменений
330
+ * @returns функция для отписки
331
+ */
332
+ subscribeProgress(listener) {
333
+ return this.progress.subscribe(listener);
334
+ }
335
+ /**
336
+ * Подписка на прогресс с фильтрацией по этапу (stepKey) или общий
337
+ */
338
+ subscribeStepProgress(stepKey, listener) {
339
+ return this.on(`step:${stepKey}:progress`, listener);
340
+ }
341
+ /**
342
+ * Получить текущий прогресс выполнения pipeline (snapshot, не реактивный)
343
+ */
344
+ getProgress() {
345
+ return this.progress.getProgress();
346
+ }
347
+ /**
348
+ * Возвращает текущий снимок состояния прогресса (не реактивный).
349
+ * Для отслеживания изменений используйте subscribeProgress.
350
+ */
351
+ getProgressRef() {
352
+ return this.progress.getProgressRef();
353
+ }
354
+ /**
355
+ * Запустить выполнение пайплайна
356
+ * @param onStepPause callback для пользовательской паузы между шагами
357
+ * @param externalSignal внешний AbortSignal (опционально)
358
+ */
359
+ async run(onStepPause, externalSignal) {
360
+ var _a, _b, _c, _d, _e;
361
+ if (this.autoReset) {
362
+ this.stageResults = {};
363
+ this.notifyStageResults();
364
+ }
365
+ let success = true;
366
+ // Создаём новый AbortController для этого запуска
367
+ this.abortController = new AbortController();
368
+ const signal = externalSignal !== null && externalSignal !== void 0 ? externalSignal : this.abortController.signal;
369
+ for (let i = 0; i < this.config.stages.length; i++) {
370
+ if (signal.aborted) {
371
+ // Прерываем выполнение, если был вызван abort
372
+ const apiError = (0, rest_client_1.toApiError)({
373
+ message: "Pipeline aborted",
374
+ code: "ABORTED",
375
+ });
376
+ const key = ((_a = this.config.stages[i]) === null || _a === void 0 ? void 0 : _a.key) || `stage${i}`;
377
+ this.stageResults[key] = { status: "error", error: apiError };
378
+ this.notifyStageResults();
379
+ this.progress.updateStage(i, "error");
380
+ this.logs.push({
381
+ type: "error",
382
+ message: `abort:${key}`,
383
+ timestamp: new Date(),
384
+ data: { stepIndex: i, error: apiError },
385
+ });
386
+ await this.emit("log", {
387
+ type: "abort",
388
+ stepKey: key,
389
+ stepIndex: i,
390
+ error: apiError,
391
+ });
392
+ await this.emitStepError({
393
+ stepIndex: i,
394
+ stepKey: key,
395
+ status: "error",
396
+ error: apiError,
397
+ stageResults: { ...this.stageResults },
398
+ });
399
+ success = false;
400
+ break;
401
+ }
402
+ const stage = this.config.stages[i];
403
+ const key = (stage === null || stage === void 0 ? void 0 : stage.key) || `stage${i}`;
404
+ // Получаем url команды для шага
405
+ let stepUrl = undefined;
406
+ if (typeof stage.request === "string") {
407
+ stepUrl = stage.request;
408
+ }
409
+ else if (typeof stage.request === "function") {
410
+ try {
411
+ const reqResult = await stage.request({
412
+ prev: i > 0
413
+ ? (_b = this.stageResults[this.config.stages[i - 1].key]) === null || _b === void 0 ? void 0 : _b.data
414
+ : undefined,
415
+ allResults: this.stageResults,
416
+ sharedData: this.sharedData,
417
+ });
418
+ if (typeof reqResult === "string") {
419
+ stepUrl = reqResult;
420
+ }
421
+ }
422
+ catch {
423
+ // ignore errors here, url не обязателен
424
+ }
425
+ }
426
+ else {
427
+ stepUrl = key;
428
+ }
429
+ this.stageResults[key] = { status: "pending", url: stepUrl };
430
+ this.notifyStageResults();
431
+ this.progress.updateStage(i, "loading");
432
+ // Гибкая подписка на прогресс шага
433
+ await this.emit(`step:${key}:progress`, "loading");
434
+ // emit step start
435
+ await this.emitStepStart({
436
+ stepIndex: i,
437
+ stepKey: key,
438
+ status: "loading",
439
+ stageResults: { ...this.stageResults },
440
+ });
441
+ try {
442
+ let stepResult;
443
+ // --- pauseBeforeMs (пауза перед выполнением команды) ---
444
+ if (typeof stage.pauseBefore === "number" && stage.pauseBefore > 0) {
445
+ await new Promise((resolve) => setTimeout(resolve, stage.pauseBefore));
446
+ }
447
+ // --- before (pre-processing) ---
448
+ let prevInput = i > 0
449
+ ? (_c = this.stageResults[this.config.stages[i - 1].key]) === null || _c === void 0 ? void 0 : _c.data
450
+ : undefined;
451
+ if (typeof stage.before === "function") {
452
+ const beforeResult = await stage.before({
453
+ prev: prevInput,
454
+ allResults: this.stageResults,
455
+ sharedData: this.sharedData,
456
+ });
457
+ if (typeof beforeResult !== "undefined") {
458
+ prevInput = beforeResult;
459
+ }
460
+ }
461
+ // --- request ---
462
+ if (typeof stage.request === "function") {
463
+ const reqResult = await stage.request({
464
+ prev: prevInput,
465
+ allResults: this.stageResults,
466
+ sharedData: this.sharedData,
467
+ });
468
+ if (typeof reqResult === "string") {
469
+ const res = await this.executor.execute(reqResult, undefined, stage.retryCount, stage.timeoutMs);
470
+ stepResult = res.data;
471
+ }
472
+ else {
473
+ stepResult = reqResult;
474
+ }
475
+ }
476
+ else if (stage.key) {
477
+ const res = await this.executor.execute(stage.key, undefined, stage.retryCount, stage.timeoutMs);
478
+ stepResult = res.data;
479
+ }
480
+ else {
481
+ stepResult = undefined;
482
+ }
483
+ // --- after (post-processing) ---
484
+ if (typeof stage.after === "function") {
485
+ stepResult = await stage.after({
486
+ result: stepResult,
487
+ allResults: this.stageResults,
488
+ sharedData: this.sharedData,
489
+ });
490
+ }
491
+ // --- pauseAfterMs (пауза после выполнения команды) ---
492
+ if (typeof stage.pauseAfter === "number" && stage.pauseAfter > 0) {
493
+ await new Promise((resolve) => setTimeout(resolve, stage.pauseAfter));
494
+ }
495
+ // --- Пользовательская пауза/подтверждение/изменение результата ---
496
+ if (onStepPause) {
497
+ stepResult = await onStepPause(i, stepResult, this.stageResults);
498
+ }
499
+ this.stageResults[key] = {
500
+ status: "success",
501
+ data: stepResult,
502
+ url: (_d = this.stageResults[key]) === null || _d === void 0 ? void 0 : _d.url,
503
+ };
504
+ this.notifyStageResults();
505
+ this.progress.updateStage(i, "success");
506
+ await this.emit(`step:${key}:progress`, "success");
507
+ await this.emitStepFinish({
508
+ stepIndex: i,
509
+ stepKey: key,
510
+ status: "success",
511
+ data: stepResult,
512
+ stageResults: { ...this.stageResults },
513
+ });
514
+ }
515
+ catch (err) {
516
+ let handled;
517
+ if (stage && typeof stage.errorHandler === "function") {
518
+ handled = stage.errorHandler({
519
+ error: err,
520
+ key: stage.key,
521
+ sharedData: this.sharedData,
522
+ });
523
+ }
524
+ else if (stage) {
525
+ handled = this.errorHandler.handle(err, stage.key);
526
+ }
527
+ else {
528
+ handled = this.errorHandler.handle(err, "unknown");
529
+ }
530
+ if (!handled && stage) {
531
+ handled = this.errorHandler.handle(err, stage.key);
532
+ }
533
+ const apiError = (0, rest_client_1.toApiError)(handled !== null && handled !== void 0 ? handled : err);
534
+ this.stageResults[key] = {
535
+ status: "error",
536
+ error: apiError,
537
+ url: (_e = this.stageResults[key]) === null || _e === void 0 ? void 0 : _e.url,
538
+ };
539
+ this.notifyStageResults();
540
+ this.progress.updateStage(i, "error");
541
+ await this.emit(`step:${key}:progress`, "error");
542
+ await this.emitStepError({
543
+ stepIndex: i,
544
+ stepKey: key,
545
+ status: "error",
546
+ error: apiError,
547
+ stageResults: { ...this.stageResults },
548
+ });
549
+ success = false;
550
+ break;
551
+ }
552
+ }
553
+ return { stageResults: { ...this.stageResults }, success };
554
+ }
555
+ /**
556
+ * Очистить stageResults и уведомить подписчиков
557
+ */
558
+ clearStageResults() {
559
+ this.stageResults = {};
560
+ this.notifyStageResults();
561
+ // Корректно сбрасываем прогресс
562
+ this.progress.reset();
563
+ }
564
+ }
565
+ exports.PipelineOrchestrator = PipelineOrchestrator;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProgressTracker = void 0;
4
+ class ProgressTracker {
5
+ constructor(totalStages) {
6
+ this.listeners = [];
7
+ this.progress = {
8
+ currentStage: 0,
9
+ totalStages,
10
+ stageStatuses: Array(totalStages).fill("pending"),
11
+ };
12
+ }
13
+ reset() {
14
+ this.progress.currentStage = 0;
15
+ this.progress.stageStatuses = Array(this.progress.totalStages).fill("pending");
16
+ this.notify();
17
+ }
18
+ /**
19
+ * Возвращает текущий снимок состояния прогресса (не реактивный).
20
+ * Для отслеживания изменений используйте subscribeProgress.
21
+ */
22
+ getProgressRef() {
23
+ return this.progress;
24
+ }
25
+ updateStage(stage, status) {
26
+ this.progress.stageStatuses[stage] = status;
27
+ this.progress.currentStage = stage;
28
+ this.notify();
29
+ }
30
+ getProgress() {
31
+ return { ...this.progress };
32
+ }
33
+ subscribe(listener) {
34
+ this.listeners.push(listener);
35
+ // Немедленно уведомляем нового подписчика о текущем состоянии
36
+ listener({ ...this.progress });
37
+ return () => {
38
+ this.listeners = this.listeners.filter((l) => l !== listener);
39
+ };
40
+ }
41
+ notify() {
42
+ for (const listener of this.listeners) {
43
+ listener({ ...this.progress });
44
+ }
45
+ }
46
+ }
47
+ exports.ProgressTracker = ProgressTracker;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ // Entry point: core + React. Import from "rest-pipeline-js/react".
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.useRerunPipelineStepReact = exports.usePipelineLogsReact = exports.usePipelineStepEventReact = exports.useRestClientReact = exports.usePipelineRunReact = exports.usePipelineProgressReact = void 0;
19
+ __exportStar(require("./index"), exports);
20
+ var usePipelineProgress_react_1 = require("./usePipelineProgress-react");
21
+ Object.defineProperty(exports, "usePipelineProgressReact", { enumerable: true, get: function () { return usePipelineProgress_react_1.usePipelineProgressReact; } });
22
+ var usePipelineRun_react_1 = require("./usePipelineRun-react");
23
+ Object.defineProperty(exports, "usePipelineRunReact", { enumerable: true, get: function () { return usePipelineRun_react_1.usePipelineRunReact; } });
24
+ var useRestClient_react_1 = require("./useRestClient-react");
25
+ Object.defineProperty(exports, "useRestClientReact", { enumerable: true, get: function () { return useRestClient_react_1.useRestClientReact; } });
26
+ var usePipelineStepEvents_react_1 = require("./usePipelineStepEvents-react");
27
+ Object.defineProperty(exports, "usePipelineStepEventReact", { enumerable: true, get: function () { return usePipelineStepEvents_react_1.usePipelineStepEventReact; } });
28
+ Object.defineProperty(exports, "usePipelineLogsReact", { enumerable: true, get: function () { return usePipelineStepEvents_react_1.usePipelineLogsReact; } });
29
+ Object.defineProperty(exports, "useRerunPipelineStepReact", { enumerable: true, get: function () { return usePipelineStepEvents_react_1.useRerunPipelineStepReact; } });