@context-action/core 0.7.2 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +175 -86
- package/dist/index.d.cts +5 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +175 -86
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -50,6 +50,16 @@ async function executeSequential(context, createController) {
|
|
|
50
50
|
const controller = createController(registration, i);
|
|
51
51
|
try {
|
|
52
52
|
if (context.aborted) break;
|
|
53
|
+
if (registration.config.condition) try {
|
|
54
|
+
const shouldExecute = registration.config.condition(context.payload);
|
|
55
|
+
if (!shouldExecute) {
|
|
56
|
+
i++;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
} catch {
|
|
60
|
+
i++;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
53
63
|
const result = registration.handler(context.payload, controller);
|
|
54
64
|
if (registration.config.blocking) {
|
|
55
65
|
const handlerResult = result instanceof Promise ? await result : result;
|
|
@@ -74,8 +84,20 @@ async function executeSequential(context, createController) {
|
|
|
74
84
|
if (context.terminated) break;
|
|
75
85
|
/** Handle jump to priority AFTER handler execution */
|
|
76
86
|
if (context.jumpToPriority !== void 0) {
|
|
77
|
-
|
|
78
|
-
if (
|
|
87
|
+
context.jumpCount = (context.jumpCount || 0) + 1;
|
|
88
|
+
if (context.jumpCount > (context.maxJumps || 10)) {
|
|
89
|
+
console.error(`[ActionRegister] ERROR: Maximum jump limit (${context.maxJumps || 10}) exceeded. Aborting to prevent infinite loop. Check your jumpToPriority logic and conditions.`);
|
|
90
|
+
context.aborted = true;
|
|
91
|
+
context.abortReason = `Maximum jump limit exceeded (${context.jumpCount} jumps)`;
|
|
92
|
+
context.jumpToPriority = void 0;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
const jumpIndex = context.handlers.findIndex((handler) => (handler.config.priority || 0) <= context.jumpToPriority);
|
|
96
|
+
if (jumpIndex !== -1 && jumpIndex !== i) {
|
|
97
|
+
if (jumpIndex < i) {
|
|
98
|
+
const targetHandler = context.handlers[jumpIndex];
|
|
99
|
+
if (targetHandler && !targetHandler.config.condition) console.warn(`[ActionRegister] WARNING: Backward jumpToPriority to handler '${targetHandler.config.id || "unnamed"}' without condition. This may cause infinite loops! Consider adding a condition to prevent re-execution. Jump count: ${context.jumpCount}/${context.maxJumps || 10}`);
|
|
100
|
+
}
|
|
79
101
|
i = jumpIndex;
|
|
80
102
|
context.jumpToPriority = void 0;
|
|
81
103
|
continue;
|
|
@@ -86,7 +108,9 @@ async function executeSequential(context, createController) {
|
|
|
86
108
|
} else i++;
|
|
87
109
|
} catch (error) {
|
|
88
110
|
const handlerError = handleExecutionError(error, registration);
|
|
89
|
-
|
|
111
|
+
errors.push(handlerError);
|
|
112
|
+
if (registration.config.blocking) throw handlerError.error;
|
|
113
|
+
i++;
|
|
90
114
|
}
|
|
91
115
|
}
|
|
92
116
|
if (nonBlockingPromises.length > 0) await Promise.allSettled(nonBlockingPromises);
|
|
@@ -126,6 +150,24 @@ async function executeParallel(context, createController) {
|
|
|
126
150
|
const handlerPromises = runnableHandlers.map(async (registration, _index) => {
|
|
127
151
|
const controller = createController(registration, _index);
|
|
128
152
|
try {
|
|
153
|
+
if (registration.config.condition) try {
|
|
154
|
+
const shouldExecute = registration.config.condition(context.payload);
|
|
155
|
+
if (!shouldExecute) return {
|
|
156
|
+
success: true,
|
|
157
|
+
handlerId: registration.id,
|
|
158
|
+
result: void 0,
|
|
159
|
+
terminated: false,
|
|
160
|
+
skipped: true
|
|
161
|
+
};
|
|
162
|
+
} catch {
|
|
163
|
+
return {
|
|
164
|
+
success: true,
|
|
165
|
+
handlerId: registration.id,
|
|
166
|
+
result: void 0,
|
|
167
|
+
terminated: false,
|
|
168
|
+
skipped: true
|
|
169
|
+
};
|
|
170
|
+
}
|
|
129
171
|
const result = registration.handler(context.payload, controller);
|
|
130
172
|
let handlerResult;
|
|
131
173
|
if (result instanceof Promise) {
|
|
@@ -200,6 +242,26 @@ async function executeRace(context, createController) {
|
|
|
200
242
|
const handlerPromises = runnableHandlers.map(async (registration, _index) => {
|
|
201
243
|
const controller = createController(registration, _index);
|
|
202
244
|
try {
|
|
245
|
+
if (registration.config.condition) try {
|
|
246
|
+
const shouldExecute = registration.config.condition(context.payload);
|
|
247
|
+
if (!shouldExecute) return {
|
|
248
|
+
success: true,
|
|
249
|
+
handlerId: registration.id,
|
|
250
|
+
registration,
|
|
251
|
+
result: void 0,
|
|
252
|
+
terminated: false,
|
|
253
|
+
skipped: true
|
|
254
|
+
};
|
|
255
|
+
} catch {
|
|
256
|
+
return {
|
|
257
|
+
success: true,
|
|
258
|
+
handlerId: registration.id,
|
|
259
|
+
registration,
|
|
260
|
+
result: void 0,
|
|
261
|
+
terminated: false,
|
|
262
|
+
skipped: true
|
|
263
|
+
};
|
|
264
|
+
}
|
|
203
265
|
const result = registration.handler(context.payload, controller);
|
|
204
266
|
let handlerResult;
|
|
205
267
|
if (result instanceof Promise) {
|
|
@@ -529,13 +591,15 @@ var ActionGuard = class {
|
|
|
529
591
|
//#region src/concurrency/OperationQueue.ts
|
|
530
592
|
/**
|
|
531
593
|
* 작업 큐 관리자
|
|
532
|
-
*
|
|
594
|
+
*
|
|
533
595
|
* 핵심 기능:
|
|
534
596
|
* 1. 작업 직렬화 - 모든 작업을 순서대로 실행
|
|
535
597
|
* 2. 우선순위 지원 - 중요한 작업 우선 처리
|
|
536
598
|
* 3. 에러 처리 - 개별 작업 실패가 전체에 영향 주지 않음
|
|
537
599
|
* 4. 메모리 관리 - 완료된 작업 자동 정리
|
|
538
600
|
* 5. 🆕 동시성 제어 - maxConcurrency로 동시 실행 제한
|
|
601
|
+
* 6. 🆕 비동기 지원 - Promise.all() 완벽 지원
|
|
602
|
+
* 7. 🆕 이벤트 기반 처리 - 효율적인 큐 처리 시스템
|
|
539
603
|
*/
|
|
540
604
|
var OperationQueue = class {
|
|
541
605
|
constructor(name = "OperationQueue", maxConcurrency = 1) {
|
|
@@ -544,7 +608,7 @@ var OperationQueue = class {
|
|
|
544
608
|
this.processingPromise = null;
|
|
545
609
|
this.operationCounter = 0;
|
|
546
610
|
this.activeOperations = 0;
|
|
547
|
-
this.
|
|
611
|
+
this.pendingResolvers = [];
|
|
548
612
|
this.maxConcurrency = Math.max(1, maxConcurrency);
|
|
549
613
|
}
|
|
550
614
|
/**
|
|
@@ -573,13 +637,18 @@ var OperationQueue = class {
|
|
|
573
637
|
}
|
|
574
638
|
}
|
|
575
639
|
this.queue.splice(insertIndex, 0, queuedOperation);
|
|
640
|
+
if (this.processingPromise) this.notifyNewOperation();
|
|
576
641
|
this.processQueue();
|
|
577
642
|
});
|
|
578
643
|
}
|
|
579
644
|
/**
|
|
580
|
-
* 🆕 큐 처리 메인 로직 - 동시성 제어 지원
|
|
581
|
-
*
|
|
582
|
-
*
|
|
645
|
+
* 🆕 큐 처리 메인 로직 - 동시성 제어 및 비동기 지원
|
|
646
|
+
*
|
|
647
|
+
* 주요 특징:
|
|
648
|
+
* - maxConcurrency에 따라 동시 실행 작업 수를 제한하여 동시성 문제 방지
|
|
649
|
+
* - Promise.all() 시나리오에서 완벽한 순차적 실행 보장
|
|
650
|
+
* - 이벤트 기반 알림 시스템으로 효율적인 비동기 처리
|
|
651
|
+
* - 작업 완료 시 대기 중인 프로세스에게 자동 알림
|
|
583
652
|
*/
|
|
584
653
|
async processQueue() {
|
|
585
654
|
if (this.processingPromise) return this.processingPromise;
|
|
@@ -591,21 +660,46 @@ var OperationQueue = class {
|
|
|
591
660
|
}
|
|
592
661
|
}
|
|
593
662
|
async _doProcess() {
|
|
594
|
-
while (this.queue.length > 0 || this.
|
|
663
|
+
while (this.queue.length > 0 || this.activeOperations > 0) {
|
|
595
664
|
while (this.queue.length > 0 && this.activeOperations < this.maxConcurrency) {
|
|
596
665
|
const operation = this.queue.shift();
|
|
597
|
-
this.
|
|
598
|
-
const operationPromise = this.executeOperation(operation);
|
|
599
|
-
this.runningOperations.add(operationPromise);
|
|
600
|
-
operationPromise.finally(() => {
|
|
601
|
-
this.activeOperations--;
|
|
602
|
-
this.runningOperations.delete(operationPromise);
|
|
603
|
-
});
|
|
666
|
+
this.startOperation(operation);
|
|
604
667
|
}
|
|
605
|
-
if (this.
|
|
668
|
+
if (this.activeOperations > 0) await this.waitForAnyOperation();
|
|
606
669
|
}
|
|
607
670
|
}
|
|
608
671
|
/**
|
|
672
|
+
* 🆕 개별 작업을 시작하고 완료를 추적
|
|
673
|
+
*/
|
|
674
|
+
startOperation(operation) {
|
|
675
|
+
this.activeOperations++;
|
|
676
|
+
this.executeOperation(operation).finally(() => {
|
|
677
|
+
this.activeOperations--;
|
|
678
|
+
this.notifyOperationComplete();
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* 🆕 하나의 작업이 완료될 때까지 대기하거나 새로운 작업이 추가될 때까지 대기
|
|
683
|
+
*/
|
|
684
|
+
waitForAnyOperation() {
|
|
685
|
+
return new Promise((resolve) => {
|
|
686
|
+
this.pendingResolvers.push(resolve);
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
/**
|
|
690
|
+
* 🆕 작업 완료 신호 - 대기 중인 프로세스들에게 알림
|
|
691
|
+
*/
|
|
692
|
+
notifyOperationComplete() {
|
|
693
|
+
const resolvers = this.pendingResolvers.splice(0);
|
|
694
|
+
resolvers.forEach((resolve) => resolve());
|
|
695
|
+
}
|
|
696
|
+
/**
|
|
697
|
+
* 🆕 새로운 작업 추가 신호 - processQueue에서 호출
|
|
698
|
+
*/
|
|
699
|
+
notifyNewOperation() {
|
|
700
|
+
this.notifyOperationComplete();
|
|
701
|
+
}
|
|
702
|
+
/**
|
|
609
703
|
* 🆕 개별 작업 실행 로직
|
|
610
704
|
*/
|
|
611
705
|
async executeOperation(operation) {
|
|
@@ -626,7 +720,6 @@ var OperationQueue = class {
|
|
|
626
720
|
isProcessing: Boolean(this.processingPromise),
|
|
627
721
|
activeOperations: this.activeOperations,
|
|
628
722
|
maxConcurrency: this.maxConcurrency,
|
|
629
|
-
runningOperationsCount: this.runningOperations.size,
|
|
630
723
|
operations: this.queue.map((op) => ({
|
|
631
724
|
id: op.id,
|
|
632
725
|
priority: op.priority,
|
|
@@ -655,6 +748,8 @@ var OperationQueue = class {
|
|
|
655
748
|
});
|
|
656
749
|
this.queue = [];
|
|
657
750
|
this.processingPromise = null;
|
|
751
|
+
const resolvers = this.pendingResolvers.splice(0);
|
|
752
|
+
resolvers.forEach((resolve) => resolve());
|
|
658
753
|
}
|
|
659
754
|
/**
|
|
660
755
|
* 큐 크기 조회
|
|
@@ -693,7 +788,8 @@ var ActionRegister = class {
|
|
|
693
788
|
this.executionMode = "sequential";
|
|
694
789
|
this.actionExecutionModes = /* @__PURE__ */ new Map();
|
|
695
790
|
this.unregisterFunctions = /* @__PURE__ */ new Map();
|
|
696
|
-
this.
|
|
791
|
+
this.lastRegisteredTimestamps = /* @__PURE__ */ new Map();
|
|
792
|
+
this.filterCacheDisabled = true;
|
|
697
793
|
this.handlerIdCounter = 0;
|
|
698
794
|
this.controllerPool = [];
|
|
699
795
|
this.maxControllerPoolSize = 10;
|
|
@@ -813,8 +909,9 @@ var ActionRegister = class {
|
|
|
813
909
|
once: config.once ?? false,
|
|
814
910
|
debounce: config.debounce ?? void 0,
|
|
815
911
|
throttle: config.throttle ?? void 0,
|
|
816
|
-
replaceExisting: config.replaceExisting ??
|
|
817
|
-
cleanup: config.cleanup
|
|
912
|
+
replaceExisting: config.replaceExisting ?? true,
|
|
913
|
+
cleanup: config.cleanup,
|
|
914
|
+
condition: config.condition
|
|
818
915
|
},
|
|
819
916
|
id: handlerId
|
|
820
917
|
};
|
|
@@ -828,19 +925,16 @@ var ActionRegister = class {
|
|
|
828
925
|
if (existingIndex !== -1) {
|
|
829
926
|
const existing = pipeline[existingIndex];
|
|
830
927
|
const existingUnregister = this.unregisterFunctions.get(handlerId);
|
|
831
|
-
if (config.replaceExisting) {
|
|
832
|
-
if (
|
|
833
|
-
|
|
834
|
-
this.unregisterFunctions.delete(handlerId);
|
|
835
|
-
}
|
|
836
|
-
if (existing && typeof existing.cleanup === "function") try {
|
|
837
|
-
existing.cleanup();
|
|
928
|
+
if (registration.config.replaceExisting) {
|
|
929
|
+
if (existing && existing.config.cleanup && typeof existing.config.cleanup === "function") try {
|
|
930
|
+
existing.config.cleanup();
|
|
838
931
|
} catch (cleanupError) {
|
|
839
932
|
this.log(`Cleanup error for replaced handler: ${String(action)}`, cleanupError, "warn");
|
|
840
933
|
}
|
|
934
|
+
if (existingUnregister) this.unregisterFunctions.delete(handlerId);
|
|
841
935
|
pipeline[existingIndex] = registration;
|
|
842
936
|
pipeline.sort((a, b) => b.config.priority - a.config.priority);
|
|
843
|
-
this.
|
|
937
|
+
this.lastRegisteredTimestamps.set(action, /* @__PURE__ */ new Date());
|
|
844
938
|
const newUnregister = this.createUnregisterFunction(action, handlerId, registration);
|
|
845
939
|
this.unregisterFunctions.set(handlerId, newUnregister);
|
|
846
940
|
this.log(`Handler replaced: ${String(action)}`, {
|
|
@@ -870,7 +964,7 @@ var ActionRegister = class {
|
|
|
870
964
|
}
|
|
871
965
|
pipeline.push(registration);
|
|
872
966
|
pipeline.sort((a, b) => b.config.priority - a.config.priority);
|
|
873
|
-
this.
|
|
967
|
+
this.lastRegisteredTimestamps.set(action, /* @__PURE__ */ new Date());
|
|
874
968
|
const unregister = this.createUnregisterFunction(action, handlerId, registration);
|
|
875
969
|
this.unregisterFunctions.set(handlerId, unregister);
|
|
876
970
|
this.log(`Handler registered: ${String(action)}`, {
|
|
@@ -964,6 +1058,8 @@ var ActionRegister = class {
|
|
|
964
1058
|
abortReason: void 0,
|
|
965
1059
|
currentIndex: 0,
|
|
966
1060
|
jumpToPriority: void 0,
|
|
1061
|
+
jumpCount: 0,
|
|
1062
|
+
maxJumps: 10,
|
|
967
1063
|
executionMode: currentExecutionMode,
|
|
968
1064
|
results: [],
|
|
969
1065
|
terminated: false,
|
|
@@ -1055,6 +1151,8 @@ var ActionRegister = class {
|
|
|
1055
1151
|
abortReason: void 0,
|
|
1056
1152
|
currentIndex: 0,
|
|
1057
1153
|
jumpToPriority: void 0,
|
|
1154
|
+
jumpCount: 0,
|
|
1155
|
+
maxJumps: 10,
|
|
1058
1156
|
executionMode: currentExecutionMode,
|
|
1059
1157
|
results: [],
|
|
1060
1158
|
terminated: false,
|
|
@@ -1215,32 +1313,19 @@ var ActionRegister = class {
|
|
|
1215
1313
|
return null;
|
|
1216
1314
|
}
|
|
1217
1315
|
/**
|
|
1218
|
-
* 🔧
|
|
1219
|
-
* Note: This caches handler SELECTION metadata only, never execution results
|
|
1220
|
-
*/
|
|
1221
|
-
get filterCacheMaxSize() {
|
|
1222
|
-
const totalHandlers = Array.from(this.pipelines.values()).reduce((sum, pipeline) => sum + pipeline.length, 0);
|
|
1223
|
-
return totalHandlers * 10 || 100;
|
|
1224
|
-
}
|
|
1225
|
-
/**
|
|
1226
|
-
* 🔧 Generate cache key for filter options
|
|
1316
|
+
* 🔧 Generate optimized cache key for filter options
|
|
1227
1317
|
*/
|
|
1228
1318
|
generateFilterCacheKey(filterOptions) {
|
|
1229
1319
|
if (!filterOptions) return "no-filter";
|
|
1230
|
-
const
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
filterOptions.priority
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
return
|
|
1238
|
-
|
|
1239
|
-
/**
|
|
1240
|
-
* 🔧 Clear filter cache when pipelines change
|
|
1241
|
-
*/
|
|
1242
|
-
invalidateFilterCache() {
|
|
1243
|
-
this.filterCache.clear();
|
|
1320
|
+
const parts = [];
|
|
1321
|
+
if (filterOptions.handlerIds?.length) parts.push(`h:${filterOptions.handlerIds.slice().sort().join(",")}`);
|
|
1322
|
+
if (filterOptions.excludeHandlerIds?.length) parts.push(`e:${filterOptions.excludeHandlerIds.slice().sort().join(",")}`);
|
|
1323
|
+
if (filterOptions.priority) {
|
|
1324
|
+
const { min, max } = filterOptions.priority;
|
|
1325
|
+
if (min !== void 0 || max !== void 0) parts.push(`p:${min ?? "*"}-${max ?? "*"}`);
|
|
1326
|
+
}
|
|
1327
|
+
if (filterOptions.custom) return "custom-" + Date.now() + Math.random();
|
|
1328
|
+
return parts.length > 0 ? parts.join("|") : "no-filter";
|
|
1244
1329
|
}
|
|
1245
1330
|
/**
|
|
1246
1331
|
* 🔧 Create or reuse PipelineController from pool for better performance
|
|
@@ -1254,7 +1339,11 @@ var ActionRegister = class {
|
|
|
1254
1339
|
if (autoAbortController && autoAbortOptions?.allowHandlerAbort) autoAbortController.abort(reason);
|
|
1255
1340
|
};
|
|
1256
1341
|
controller.modifyPayload = (modifier) => {
|
|
1257
|
-
|
|
1342
|
+
try {
|
|
1343
|
+
context.payload = modifier(context.payload);
|
|
1344
|
+
} catch (modificationError) {
|
|
1345
|
+
this.log("Payload modification error", modificationError, "warn");
|
|
1346
|
+
}
|
|
1258
1347
|
};
|
|
1259
1348
|
controller.getPayload = () => context.payload;
|
|
1260
1349
|
controller.jumpToPriority = (priority) => {
|
|
@@ -1286,36 +1375,27 @@ var ActionRegister = class {
|
|
|
1286
1375
|
}
|
|
1287
1376
|
filterHandlers(handlers, filterOptions) {
|
|
1288
1377
|
if (!filterOptions) return handlers;
|
|
1289
|
-
const
|
|
1290
|
-
|
|
1291
|
-
const cached = this.filterCache.get(cacheKey);
|
|
1292
|
-
if (cached) return cached;
|
|
1293
|
-
}
|
|
1378
|
+
const handlerIdSet = filterOptions.handlerIds ? new Set(filterOptions.handlerIds) : null;
|
|
1379
|
+
const excludeIdSet = filterOptions.excludeHandlerIds ? new Set(filterOptions.excludeHandlerIds) : null;
|
|
1294
1380
|
const filtered = handlers.filter((registration) => {
|
|
1295
1381
|
const config = registration.config;
|
|
1296
|
-
if (
|
|
1297
|
-
if (
|
|
1382
|
+
if (handlerIdSet && !handlerIdSet.has(config.id)) return false;
|
|
1383
|
+
if (excludeIdSet && excludeIdSet.has(config.id)) return false;
|
|
1298
1384
|
if (filterOptions.priority) {
|
|
1299
|
-
|
|
1300
|
-
if (filterOptions.priority.
|
|
1385
|
+
const priority = config.priority;
|
|
1386
|
+
if (filterOptions.priority.min !== void 0 && priority < filterOptions.priority.min) return false;
|
|
1387
|
+
if (filterOptions.priority.max !== void 0 && priority > filterOptions.priority.max) return false;
|
|
1301
1388
|
}
|
|
1302
1389
|
if (filterOptions.custom && !filterOptions.custom(config)) return false;
|
|
1303
1390
|
return true;
|
|
1304
1391
|
});
|
|
1305
|
-
if (!filterOptions.custom) {
|
|
1306
|
-
const currentMaxSize = this.filterCacheMaxSize;
|
|
1307
|
-
if (this.filterCache.size >= currentMaxSize) {
|
|
1308
|
-
const oldestKey = this.filterCache.keys().next().value;
|
|
1309
|
-
if (oldestKey !== void 0) this.filterCache.delete(oldestKey);
|
|
1310
|
-
}
|
|
1311
|
-
this.filterCache.set(cacheKey, filtered);
|
|
1312
|
-
}
|
|
1313
1392
|
return filtered;
|
|
1314
1393
|
}
|
|
1315
1394
|
processResults(context, resultOptions) {
|
|
1316
|
-
if (!resultOptions || !resultOptions.collect) return void 0;
|
|
1317
1395
|
const results = context.results;
|
|
1318
1396
|
if (context.terminated && context.terminationResult !== void 0) return context.terminationResult;
|
|
1397
|
+
if (!resultOptions) return results.length > 0 ? results[results.length - 1] : void 0;
|
|
1398
|
+
if (!resultOptions.collect && !resultOptions.strategy) return void 0;
|
|
1319
1399
|
const limitedResults = resultOptions.maxResults ? results.slice(0, resultOptions.maxResults) : results;
|
|
1320
1400
|
if (limitedResults.length === 0) return void 0;
|
|
1321
1401
|
switch (resultOptions.strategy) {
|
|
@@ -1328,7 +1408,9 @@ var ActionRegister = class {
|
|
|
1328
1408
|
case "custom":
|
|
1329
1409
|
if (resultOptions.merger) return resultOptions.merger(limitedResults);
|
|
1330
1410
|
throw new Error("Custom result strategy requires a merger function");
|
|
1331
|
-
default:
|
|
1411
|
+
default:
|
|
1412
|
+
if (resultOptions.collect) return limitedResults;
|
|
1413
|
+
return limitedResults[limitedResults.length - 1];
|
|
1332
1414
|
}
|
|
1333
1415
|
}
|
|
1334
1416
|
async executePipeline(context, autoAbortController, autoAbortOptions) {
|
|
@@ -1365,6 +1447,10 @@ var ActionRegister = class {
|
|
|
1365
1447
|
});
|
|
1366
1448
|
}
|
|
1367
1449
|
});
|
|
1450
|
+
if (pipeline.length === 0) {
|
|
1451
|
+
this.pipelines.delete(action);
|
|
1452
|
+
this.lastRegisteredTimestamps.delete(action);
|
|
1453
|
+
}
|
|
1368
1454
|
}
|
|
1369
1455
|
/**
|
|
1370
1456
|
* Get the number of registered handlers for an action
|
|
@@ -1418,7 +1504,7 @@ var ActionRegister = class {
|
|
|
1418
1504
|
*/
|
|
1419
1505
|
clearAction(action) {
|
|
1420
1506
|
this.pipelines.delete(action);
|
|
1421
|
-
this.
|
|
1507
|
+
this.lastRegisteredTimestamps.delete(action);
|
|
1422
1508
|
}
|
|
1423
1509
|
/**
|
|
1424
1510
|
* Remove all handlers for all actions
|
|
@@ -1429,7 +1515,7 @@ var ActionRegister = class {
|
|
|
1429
1515
|
*/
|
|
1430
1516
|
clearAll() {
|
|
1431
1517
|
this.pipelines.clear();
|
|
1432
|
-
this.
|
|
1518
|
+
this.lastRegisteredTimestamps.clear();
|
|
1433
1519
|
}
|
|
1434
1520
|
/**
|
|
1435
1521
|
* Get the name of this action register
|
|
@@ -1483,7 +1569,8 @@ var ActionRegister = class {
|
|
|
1483
1569
|
handlerCount: pipeline.length,
|
|
1484
1570
|
totalHandlers: pipeline.length,
|
|
1485
1571
|
handlersByPriority,
|
|
1486
|
-
executionStats
|
|
1572
|
+
executionStats,
|
|
1573
|
+
lastRegistered: this.lastRegisteredTimestamps.get(action)
|
|
1487
1574
|
};
|
|
1488
1575
|
}
|
|
1489
1576
|
/**
|
|
@@ -1563,8 +1650,11 @@ var ActionRegister = class {
|
|
|
1563
1650
|
const index = pipeline.findIndex((reg) => reg.id === handlerId && reg === registration);
|
|
1564
1651
|
if (index !== -1) {
|
|
1565
1652
|
pipeline.splice(index, 1);
|
|
1566
|
-
this.invalidateFilterCache();
|
|
1567
1653
|
this.unregisterFunctions.delete(handlerId);
|
|
1654
|
+
if (pipeline.length === 0) {
|
|
1655
|
+
this.pipelines.delete(action);
|
|
1656
|
+
this.lastRegisteredTimestamps.delete(action);
|
|
1657
|
+
}
|
|
1568
1658
|
if (registration.config.cleanup && typeof registration.config.cleanup === "function") try {
|
|
1569
1659
|
registration.config.cleanup();
|
|
1570
1660
|
} catch (cleanupError) {
|
|
@@ -1572,7 +1662,8 @@ var ActionRegister = class {
|
|
|
1572
1662
|
}
|
|
1573
1663
|
this.log(`Handler unregistered: ${String(action)}`, {
|
|
1574
1664
|
handlerId,
|
|
1575
|
-
remainingHandlers: pipeline.length
|
|
1665
|
+
remainingHandlers: pipeline.length,
|
|
1666
|
+
actionRemoved: pipeline.length === 0
|
|
1576
1667
|
});
|
|
1577
1668
|
}
|
|
1578
1669
|
};
|
|
@@ -1605,19 +1696,17 @@ var ActionRegister = class {
|
|
|
1605
1696
|
* @public
|
|
1606
1697
|
*/
|
|
1607
1698
|
destroy() {
|
|
1608
|
-
this.unregisterFunctions.forEach((unregister) => {
|
|
1609
|
-
try {
|
|
1610
|
-
unregister();
|
|
1611
|
-
} catch (error) {
|
|
1612
|
-
this.log("Error during unregister in destroy", error, "error");
|
|
1613
|
-
}
|
|
1614
|
-
});
|
|
1615
1699
|
this.unregisterFunctions.clear();
|
|
1700
|
+
for (const [action, pipeline] of this.pipelines.entries()) for (const registration of pipeline) if (registration.config.cleanup && typeof registration.config.cleanup === "function") try {
|
|
1701
|
+
registration.config.cleanup();
|
|
1702
|
+
} catch (cleanupError) {
|
|
1703
|
+
this.log(`Cleanup error for handler during destroy: ${String(action)}`, cleanupError, "warn");
|
|
1704
|
+
}
|
|
1616
1705
|
this.pipelines.clear();
|
|
1706
|
+
this.lastRegisteredTimestamps.clear();
|
|
1617
1707
|
this.actionGuard.destroy();
|
|
1618
1708
|
this.dispatchQueue?.clear?.();
|
|
1619
1709
|
this.actionExecutionModes.clear();
|
|
1620
|
-
this.filterCache.clear();
|
|
1621
1710
|
this.controllerPool.length = 0;
|
|
1622
1711
|
this.log("ActionRegister destroyed");
|
|
1623
1712
|
}
|
package/dist/index.d.cts
CHANGED
|
@@ -22,6 +22,7 @@ interface HandlerConfig {
|
|
|
22
22
|
throttle?: number;
|
|
23
23
|
replaceExisting?: boolean;
|
|
24
24
|
cleanup?: () => void;
|
|
25
|
+
condition?: (payload: any) => boolean;
|
|
25
26
|
}
|
|
26
27
|
interface HandlerRegistration<T = any, R = void> {
|
|
27
28
|
handler: ActionHandler<T, R>;
|
|
@@ -37,6 +38,8 @@ interface PipelineContext<T = any, R = void> {
|
|
|
37
38
|
abortReason: string | undefined;
|
|
38
39
|
currentIndex: number;
|
|
39
40
|
jumpToPriority: number | undefined;
|
|
41
|
+
jumpCount?: number;
|
|
42
|
+
maxJumps?: number;
|
|
40
43
|
executionMode: ExecutionMode;
|
|
41
44
|
results: R[];
|
|
42
45
|
terminated: boolean;
|
|
@@ -161,12 +164,13 @@ declare class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {
|
|
|
161
164
|
private executionMode;
|
|
162
165
|
private actionExecutionModes;
|
|
163
166
|
private unregisterFunctions;
|
|
167
|
+
private lastRegisteredTimestamps;
|
|
164
168
|
readonly name: string;
|
|
165
169
|
private readonly registryConfig;
|
|
166
170
|
private readonly isDebugMode;
|
|
167
171
|
private readonly maxHandlersPerAction;
|
|
168
172
|
private dispatchQueue?;
|
|
169
|
-
private
|
|
173
|
+
private filterCacheDisabled;
|
|
170
174
|
private handlerIdCounter;
|
|
171
175
|
private controllerPool;
|
|
172
176
|
private readonly maxControllerPoolSize;
|
|
@@ -180,9 +184,7 @@ declare class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {
|
|
|
180
184
|
private _performDispatch;
|
|
181
185
|
dispatchWithResult<K extends keyof T, R = void>(action: K, payload?: T[K], options?: DispatchOptions): Promise<ExecutionResult<R>>;
|
|
182
186
|
private applyActionGuardControlsWithResult;
|
|
183
|
-
private get filterCacheMaxSize();
|
|
184
187
|
private generateFilterCacheKey;
|
|
185
|
-
private invalidateFilterCache;
|
|
186
188
|
private getControllerFromPool;
|
|
187
189
|
private returnControllerToPool;
|
|
188
190
|
private filterHandlers;
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/ActionRegister.ts","../src/action-guard.ts","../src/execution-modes.ts","../src/react-helpers.ts"],"sourcesContent":[],"mappings":";UAYiB,gBAAA;EAAA,CAAA,UAAA,EAAA,MAAgB,CAAA,EAAA,OAAA;AAwFjC;AAK0C,UALzB,kBAKyB,CAAA,IAAA,GAAA,EAAA,IAAA,IAAA,CAAA,CAAA;OAG1B,CAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/ActionRegister.ts","../src/action-guard.ts","../src/execution-modes.ts","../src/react-helpers.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ interface HandlerConfig {
|
|
|
22
22
|
throttle?: number;
|
|
23
23
|
replaceExisting?: boolean;
|
|
24
24
|
cleanup?: () => void;
|
|
25
|
+
condition?: (payload: any) => boolean;
|
|
25
26
|
}
|
|
26
27
|
interface HandlerRegistration<T = any, R = void> {
|
|
27
28
|
handler: ActionHandler<T, R>;
|
|
@@ -37,6 +38,8 @@ interface PipelineContext<T = any, R = void> {
|
|
|
37
38
|
abortReason: string | undefined;
|
|
38
39
|
currentIndex: number;
|
|
39
40
|
jumpToPriority: number | undefined;
|
|
41
|
+
jumpCount?: number;
|
|
42
|
+
maxJumps?: number;
|
|
40
43
|
executionMode: ExecutionMode;
|
|
41
44
|
results: R[];
|
|
42
45
|
terminated: boolean;
|
|
@@ -161,12 +164,13 @@ declare class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {
|
|
|
161
164
|
private executionMode;
|
|
162
165
|
private actionExecutionModes;
|
|
163
166
|
private unregisterFunctions;
|
|
167
|
+
private lastRegisteredTimestamps;
|
|
164
168
|
readonly name: string;
|
|
165
169
|
private readonly registryConfig;
|
|
166
170
|
private readonly isDebugMode;
|
|
167
171
|
private readonly maxHandlersPerAction;
|
|
168
172
|
private dispatchQueue?;
|
|
169
|
-
private
|
|
173
|
+
private filterCacheDisabled;
|
|
170
174
|
private handlerIdCounter;
|
|
171
175
|
private controllerPool;
|
|
172
176
|
private readonly maxControllerPoolSize;
|
|
@@ -180,9 +184,7 @@ declare class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {
|
|
|
180
184
|
private _performDispatch;
|
|
181
185
|
dispatchWithResult<K extends keyof T, R = void>(action: K, payload?: T[K], options?: DispatchOptions): Promise<ExecutionResult<R>>;
|
|
182
186
|
private applyActionGuardControlsWithResult;
|
|
183
|
-
private get filterCacheMaxSize();
|
|
184
187
|
private generateFilterCacheKey;
|
|
185
|
-
private invalidateFilterCache;
|
|
186
188
|
private getControllerFromPool;
|
|
187
189
|
private returnControllerToPool;
|
|
188
190
|
private filterHandlers;
|