@context-action/core 0.7.2 → 0.7.3

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 CHANGED
@@ -529,13 +529,15 @@ var ActionGuard = class {
529
529
  //#region src/concurrency/OperationQueue.ts
530
530
  /**
531
531
  * 작업 큐 관리자
532
- *
532
+ *
533
533
  * 핵심 기능:
534
534
  * 1. 작업 직렬화 - 모든 작업을 순서대로 실행
535
535
  * 2. 우선순위 지원 - 중요한 작업 우선 처리
536
536
  * 3. 에러 처리 - 개별 작업 실패가 전체에 영향 주지 않음
537
537
  * 4. 메모리 관리 - 완료된 작업 자동 정리
538
538
  * 5. 🆕 동시성 제어 - maxConcurrency로 동시 실행 제한
539
+ * 6. 🆕 비동기 지원 - Promise.all() 완벽 지원
540
+ * 7. 🆕 이벤트 기반 처리 - 효율적인 큐 처리 시스템
539
541
  */
540
542
  var OperationQueue = class {
541
543
  constructor(name = "OperationQueue", maxConcurrency = 1) {
@@ -544,7 +546,7 @@ var OperationQueue = class {
544
546
  this.processingPromise = null;
545
547
  this.operationCounter = 0;
546
548
  this.activeOperations = 0;
547
- this.runningOperations = /* @__PURE__ */ new Set();
549
+ this.pendingResolvers = [];
548
550
  this.maxConcurrency = Math.max(1, maxConcurrency);
549
551
  }
550
552
  /**
@@ -573,13 +575,18 @@ var OperationQueue = class {
573
575
  }
574
576
  }
575
577
  this.queue.splice(insertIndex, 0, queuedOperation);
578
+ if (this.processingPromise) this.notifyNewOperation();
576
579
  this.processQueue();
577
580
  });
578
581
  }
579
582
  /**
580
- * 🆕 큐 처리 메인 로직 - 동시성 제어 지원
581
- *
582
- * maxConcurrency에 따라 동시 실행 작업 수를 제한하여 동시성 문제 방지
583
+ * 🆕 큐 처리 메인 로직 - 동시성 제어 및 비동기 지원
584
+ *
585
+ * 주요 특징:
586
+ * - maxConcurrency에 따라 동시 실행 작업 수를 제한하여 동시성 문제 방지
587
+ * - Promise.all() 시나리오에서 완벽한 순차적 실행 보장
588
+ * - 이벤트 기반 알림 시스템으로 효율적인 비동기 처리
589
+ * - 작업 완료 시 대기 중인 프로세스에게 자동 알림
583
590
  */
584
591
  async processQueue() {
585
592
  if (this.processingPromise) return this.processingPromise;
@@ -591,21 +598,46 @@ var OperationQueue = class {
591
598
  }
592
599
  }
593
600
  async _doProcess() {
594
- while (this.queue.length > 0 || this.runningOperations.size > 0) {
601
+ while (this.queue.length > 0 || this.activeOperations > 0) {
595
602
  while (this.queue.length > 0 && this.activeOperations < this.maxConcurrency) {
596
603
  const operation = this.queue.shift();
597
- this.activeOperations++;
598
- const operationPromise = this.executeOperation(operation);
599
- this.runningOperations.add(operationPromise);
600
- operationPromise.finally(() => {
601
- this.activeOperations--;
602
- this.runningOperations.delete(operationPromise);
603
- });
604
+ this.startOperation(operation);
604
605
  }
605
- if (this.runningOperations.size > 0) await Promise.race(this.runningOperations);
606
+ if (this.activeOperations > 0) await this.waitForAnyOperation();
606
607
  }
607
608
  }
608
609
  /**
610
+ * 🆕 개별 작업을 시작하고 완료를 추적
611
+ */
612
+ startOperation(operation) {
613
+ this.activeOperations++;
614
+ this.executeOperation(operation).finally(() => {
615
+ this.activeOperations--;
616
+ this.notifyOperationComplete();
617
+ });
618
+ }
619
+ /**
620
+ * 🆕 하나의 작업이 완료될 때까지 대기하거나 새로운 작업이 추가될 때까지 대기
621
+ */
622
+ waitForAnyOperation() {
623
+ return new Promise((resolve) => {
624
+ this.pendingResolvers.push(resolve);
625
+ });
626
+ }
627
+ /**
628
+ * 🆕 작업 완료 신호 - 대기 중인 프로세스들에게 알림
629
+ */
630
+ notifyOperationComplete() {
631
+ const resolvers = this.pendingResolvers.splice(0);
632
+ resolvers.forEach((resolve) => resolve());
633
+ }
634
+ /**
635
+ * 🆕 새로운 작업 추가 신호 - processQueue에서 호출
636
+ */
637
+ notifyNewOperation() {
638
+ this.notifyOperationComplete();
639
+ }
640
+ /**
609
641
  * 🆕 개별 작업 실행 로직
610
642
  */
611
643
  async executeOperation(operation) {
@@ -626,7 +658,6 @@ var OperationQueue = class {
626
658
  isProcessing: Boolean(this.processingPromise),
627
659
  activeOperations: this.activeOperations,
628
660
  maxConcurrency: this.maxConcurrency,
629
- runningOperationsCount: this.runningOperations.size,
630
661
  operations: this.queue.map((op) => ({
631
662
  id: op.id,
632
663
  priority: op.priority,
@@ -655,6 +686,8 @@ var OperationQueue = class {
655
686
  });
656
687
  this.queue = [];
657
688
  this.processingPromise = null;
689
+ const resolvers = this.pendingResolvers.splice(0);
690
+ resolvers.forEach((resolve) => resolve());
658
691
  }
659
692
  /**
660
693
  * 큐 크기 조회
@@ -693,7 +726,7 @@ var ActionRegister = class {
693
726
  this.executionMode = "sequential";
694
727
  this.actionExecutionModes = /* @__PURE__ */ new Map();
695
728
  this.unregisterFunctions = /* @__PURE__ */ new Map();
696
- this.filterCache = /* @__PURE__ */ new Map();
729
+ this.filterCacheDisabled = true;
697
730
  this.handlerIdCounter = 0;
698
731
  this.controllerPool = [];
699
732
  this.maxControllerPoolSize = 10;
@@ -840,7 +873,6 @@ var ActionRegister = class {
840
873
  }
841
874
  pipeline[existingIndex] = registration;
842
875
  pipeline.sort((a, b) => b.config.priority - a.config.priority);
843
- this.invalidateFilterCache();
844
876
  const newUnregister = this.createUnregisterFunction(action, handlerId, registration);
845
877
  this.unregisterFunctions.set(handlerId, newUnregister);
846
878
  this.log(`Handler replaced: ${String(action)}`, {
@@ -870,7 +902,6 @@ var ActionRegister = class {
870
902
  }
871
903
  pipeline.push(registration);
872
904
  pipeline.sort((a, b) => b.config.priority - a.config.priority);
873
- this.invalidateFilterCache();
874
905
  const unregister = this.createUnregisterFunction(action, handlerId, registration);
875
906
  this.unregisterFunctions.set(handlerId, unregister);
876
907
  this.log(`Handler registered: ${String(action)}`, {
@@ -1215,32 +1246,19 @@ var ActionRegister = class {
1215
1246
  return null;
1216
1247
  }
1217
1248
  /**
1218
- * 🔧 Calculate optimal cache size based on current handler count
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
1249
+ * 🔧 Generate optimized cache key for filter options
1227
1250
  */
1228
1251
  generateFilterCacheKey(filterOptions) {
1229
1252
  if (!filterOptions) return "no-filter";
1230
- const key = [
1231
- filterOptions.handlerIds?.sort().join(",") || "none",
1232
- filterOptions.excludeHandlerIds?.sort().join(",") || "none",
1233
- filterOptions.priority?.min?.toString() || "none",
1234
- filterOptions.priority?.max?.toString() || "none",
1235
- filterOptions.custom ? "custom" : "none"
1236
- ].join("|");
1237
- return key;
1238
- }
1239
- /**
1240
- * 🔧 Clear filter cache when pipelines change
1241
- */
1242
- invalidateFilterCache() {
1243
- this.filterCache.clear();
1253
+ const parts = [];
1254
+ if (filterOptions.handlerIds?.length) parts.push(`h:${filterOptions.handlerIds.slice().sort().join(",")}`);
1255
+ if (filterOptions.excludeHandlerIds?.length) parts.push(`e:${filterOptions.excludeHandlerIds.slice().sort().join(",")}`);
1256
+ if (filterOptions.priority) {
1257
+ const { min, max } = filterOptions.priority;
1258
+ if (min !== void 0 || max !== void 0) parts.push(`p:${min ?? "*"}-${max ?? "*"}`);
1259
+ }
1260
+ if (filterOptions.custom) return "custom-" + Date.now() + Math.random();
1261
+ return parts.length > 0 ? parts.join("|") : "no-filter";
1244
1262
  }
1245
1263
  /**
1246
1264
  * 🔧 Create or reuse PipelineController from pool for better performance
@@ -1286,30 +1304,20 @@ var ActionRegister = class {
1286
1304
  }
1287
1305
  filterHandlers(handlers, filterOptions) {
1288
1306
  if (!filterOptions) return handlers;
1289
- const cacheKey = this.generateFilterCacheKey(filterOptions);
1290
- if (!filterOptions.custom) {
1291
- const cached = this.filterCache.get(cacheKey);
1292
- if (cached) return cached;
1293
- }
1307
+ const handlerIdSet = filterOptions.handlerIds ? new Set(filterOptions.handlerIds) : null;
1308
+ const excludeIdSet = filterOptions.excludeHandlerIds ? new Set(filterOptions.excludeHandlerIds) : null;
1294
1309
  const filtered = handlers.filter((registration) => {
1295
1310
  const config = registration.config;
1296
- if (filterOptions.handlerIds?.length && !filterOptions.handlerIds.includes(config.id)) return false;
1297
- if (filterOptions.excludeHandlerIds?.length && filterOptions.excludeHandlerIds.includes(config.id)) return false;
1311
+ if (handlerIdSet && !handlerIdSet.has(config.id)) return false;
1312
+ if (excludeIdSet && excludeIdSet.has(config.id)) return false;
1298
1313
  if (filterOptions.priority) {
1299
- if (filterOptions.priority.min !== void 0 && config.priority < filterOptions.priority.min) return false;
1300
- if (filterOptions.priority.max !== void 0 && config.priority > filterOptions.priority.max) return false;
1314
+ const priority = config.priority;
1315
+ if (filterOptions.priority.min !== void 0 && priority < filterOptions.priority.min) return false;
1316
+ if (filterOptions.priority.max !== void 0 && priority > filterOptions.priority.max) return false;
1301
1317
  }
1302
1318
  if (filterOptions.custom && !filterOptions.custom(config)) return false;
1303
1319
  return true;
1304
1320
  });
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
1321
  return filtered;
1314
1322
  }
1315
1323
  processResults(context, resultOptions) {
@@ -1418,7 +1426,6 @@ var ActionRegister = class {
1418
1426
  */
1419
1427
  clearAction(action) {
1420
1428
  this.pipelines.delete(action);
1421
- this.invalidateFilterCache();
1422
1429
  }
1423
1430
  /**
1424
1431
  * Remove all handlers for all actions
@@ -1429,7 +1436,6 @@ var ActionRegister = class {
1429
1436
  */
1430
1437
  clearAll() {
1431
1438
  this.pipelines.clear();
1432
- this.invalidateFilterCache();
1433
1439
  }
1434
1440
  /**
1435
1441
  * Get the name of this action register
@@ -1563,7 +1569,6 @@ var ActionRegister = class {
1563
1569
  const index = pipeline.findIndex((reg) => reg.id === handlerId && reg === registration);
1564
1570
  if (index !== -1) {
1565
1571
  pipeline.splice(index, 1);
1566
- this.invalidateFilterCache();
1567
1572
  this.unregisterFunctions.delete(handlerId);
1568
1573
  if (registration.config.cleanup && typeof registration.config.cleanup === "function") try {
1569
1574
  registration.config.cleanup();
@@ -1617,7 +1622,6 @@ var ActionRegister = class {
1617
1622
  this.actionGuard.destroy();
1618
1623
  this.dispatchQueue?.clear?.();
1619
1624
  this.actionExecutionModes.clear();
1620
- this.filterCache.clear();
1621
1625
  this.controllerPool.length = 0;
1622
1626
  this.log("ActionRegister destroyed");
1623
1627
  }
package/dist/index.d.cts CHANGED
@@ -166,7 +166,7 @@ declare class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {
166
166
  private readonly isDebugMode;
167
167
  private readonly maxHandlersPerAction;
168
168
  private dispatchQueue?;
169
- private filterCache;
169
+ private filterCacheDisabled;
170
170
  private handlerIdCounter;
171
171
  private controllerPool;
172
172
  private readonly maxControllerPoolSize;
@@ -180,9 +180,7 @@ declare class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {
180
180
  private _performDispatch;
181
181
  dispatchWithResult<K extends keyof T, R = void>(action: K, payload?: T[K], options?: DispatchOptions): Promise<ExecutionResult<R>>;
182
182
  private applyActionGuardControlsWithResult;
183
- private get filterCacheMaxSize();
184
183
  private generateFilterCacheKey;
185
- private invalidateFilterCache;
186
184
  private getControllerFromPool;
187
185
  private returnControllerToPool;
188
186
  private filterHandlers;
@@ -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":"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"}
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
@@ -166,7 +166,7 @@ declare class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {
166
166
  private readonly isDebugMode;
167
167
  private readonly maxHandlersPerAction;
168
168
  private dispatchQueue?;
169
- private filterCache;
169
+ private filterCacheDisabled;
170
170
  private handlerIdCounter;
171
171
  private controllerPool;
172
172
  private readonly maxControllerPoolSize;
@@ -180,9 +180,7 @@ declare class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {
180
180
  private _performDispatch;
181
181
  dispatchWithResult<K extends keyof T, R = void>(action: K, payload?: T[K], options?: DispatchOptions): Promise<ExecutionResult<R>>;
182
182
  private applyActionGuardControlsWithResult;
183
- private get filterCacheMaxSize();
184
183
  private generateFilterCacheKey;
185
- private invalidateFilterCache;
186
184
  private getControllerFromPool;
187
185
  private returnControllerToPool;
188
186
  private filterHandlers;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","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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"}
1
+ {"version":3,"file":"index.d.ts","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.js CHANGED
@@ -528,13 +528,15 @@ var ActionGuard = class {
528
528
  //#region src/concurrency/OperationQueue.ts
529
529
  /**
530
530
  * 작업 큐 관리자
531
- *
531
+ *
532
532
  * 핵심 기능:
533
533
  * 1. 작업 직렬화 - 모든 작업을 순서대로 실행
534
534
  * 2. 우선순위 지원 - 중요한 작업 우선 처리
535
535
  * 3. 에러 처리 - 개별 작업 실패가 전체에 영향 주지 않음
536
536
  * 4. 메모리 관리 - 완료된 작업 자동 정리
537
537
  * 5. 🆕 동시성 제어 - maxConcurrency로 동시 실행 제한
538
+ * 6. 🆕 비동기 지원 - Promise.all() 완벽 지원
539
+ * 7. 🆕 이벤트 기반 처리 - 효율적인 큐 처리 시스템
538
540
  */
539
541
  var OperationQueue = class {
540
542
  constructor(name = "OperationQueue", maxConcurrency = 1) {
@@ -543,7 +545,7 @@ var OperationQueue = class {
543
545
  this.processingPromise = null;
544
546
  this.operationCounter = 0;
545
547
  this.activeOperations = 0;
546
- this.runningOperations = /* @__PURE__ */ new Set();
548
+ this.pendingResolvers = [];
547
549
  this.maxConcurrency = Math.max(1, maxConcurrency);
548
550
  }
549
551
  /**
@@ -572,13 +574,18 @@ var OperationQueue = class {
572
574
  }
573
575
  }
574
576
  this.queue.splice(insertIndex, 0, queuedOperation);
577
+ if (this.processingPromise) this.notifyNewOperation();
575
578
  this.processQueue();
576
579
  });
577
580
  }
578
581
  /**
579
- * 🆕 큐 처리 메인 로직 - 동시성 제어 지원
580
- *
581
- * maxConcurrency에 따라 동시 실행 작업 수를 제한하여 동시성 문제 방지
582
+ * 🆕 큐 처리 메인 로직 - 동시성 제어 및 비동기 지원
583
+ *
584
+ * 주요 특징:
585
+ * - maxConcurrency에 따라 동시 실행 작업 수를 제한하여 동시성 문제 방지
586
+ * - Promise.all() 시나리오에서 완벽한 순차적 실행 보장
587
+ * - 이벤트 기반 알림 시스템으로 효율적인 비동기 처리
588
+ * - 작업 완료 시 대기 중인 프로세스에게 자동 알림
582
589
  */
583
590
  async processQueue() {
584
591
  if (this.processingPromise) return this.processingPromise;
@@ -590,21 +597,46 @@ var OperationQueue = class {
590
597
  }
591
598
  }
592
599
  async _doProcess() {
593
- while (this.queue.length > 0 || this.runningOperations.size > 0) {
600
+ while (this.queue.length > 0 || this.activeOperations > 0) {
594
601
  while (this.queue.length > 0 && this.activeOperations < this.maxConcurrency) {
595
602
  const operation = this.queue.shift();
596
- this.activeOperations++;
597
- const operationPromise = this.executeOperation(operation);
598
- this.runningOperations.add(operationPromise);
599
- operationPromise.finally(() => {
600
- this.activeOperations--;
601
- this.runningOperations.delete(operationPromise);
602
- });
603
+ this.startOperation(operation);
603
604
  }
604
- if (this.runningOperations.size > 0) await Promise.race(this.runningOperations);
605
+ if (this.activeOperations > 0) await this.waitForAnyOperation();
605
606
  }
606
607
  }
607
608
  /**
609
+ * 🆕 개별 작업을 시작하고 완료를 추적
610
+ */
611
+ startOperation(operation) {
612
+ this.activeOperations++;
613
+ this.executeOperation(operation).finally(() => {
614
+ this.activeOperations--;
615
+ this.notifyOperationComplete();
616
+ });
617
+ }
618
+ /**
619
+ * 🆕 하나의 작업이 완료될 때까지 대기하거나 새로운 작업이 추가될 때까지 대기
620
+ */
621
+ waitForAnyOperation() {
622
+ return new Promise((resolve) => {
623
+ this.pendingResolvers.push(resolve);
624
+ });
625
+ }
626
+ /**
627
+ * 🆕 작업 완료 신호 - 대기 중인 프로세스들에게 알림
628
+ */
629
+ notifyOperationComplete() {
630
+ const resolvers = this.pendingResolvers.splice(0);
631
+ resolvers.forEach((resolve) => resolve());
632
+ }
633
+ /**
634
+ * 🆕 새로운 작업 추가 신호 - processQueue에서 호출
635
+ */
636
+ notifyNewOperation() {
637
+ this.notifyOperationComplete();
638
+ }
639
+ /**
608
640
  * 🆕 개별 작업 실행 로직
609
641
  */
610
642
  async executeOperation(operation) {
@@ -625,7 +657,6 @@ var OperationQueue = class {
625
657
  isProcessing: Boolean(this.processingPromise),
626
658
  activeOperations: this.activeOperations,
627
659
  maxConcurrency: this.maxConcurrency,
628
- runningOperationsCount: this.runningOperations.size,
629
660
  operations: this.queue.map((op) => ({
630
661
  id: op.id,
631
662
  priority: op.priority,
@@ -654,6 +685,8 @@ var OperationQueue = class {
654
685
  });
655
686
  this.queue = [];
656
687
  this.processingPromise = null;
688
+ const resolvers = this.pendingResolvers.splice(0);
689
+ resolvers.forEach((resolve) => resolve());
657
690
  }
658
691
  /**
659
692
  * 큐 크기 조회
@@ -692,7 +725,7 @@ var ActionRegister = class {
692
725
  this.executionMode = "sequential";
693
726
  this.actionExecutionModes = /* @__PURE__ */ new Map();
694
727
  this.unregisterFunctions = /* @__PURE__ */ new Map();
695
- this.filterCache = /* @__PURE__ */ new Map();
728
+ this.filterCacheDisabled = true;
696
729
  this.handlerIdCounter = 0;
697
730
  this.controllerPool = [];
698
731
  this.maxControllerPoolSize = 10;
@@ -839,7 +872,6 @@ var ActionRegister = class {
839
872
  }
840
873
  pipeline[existingIndex] = registration;
841
874
  pipeline.sort((a, b) => b.config.priority - a.config.priority);
842
- this.invalidateFilterCache();
843
875
  const newUnregister = this.createUnregisterFunction(action, handlerId, registration);
844
876
  this.unregisterFunctions.set(handlerId, newUnregister);
845
877
  this.log(`Handler replaced: ${String(action)}`, {
@@ -869,7 +901,6 @@ var ActionRegister = class {
869
901
  }
870
902
  pipeline.push(registration);
871
903
  pipeline.sort((a, b) => b.config.priority - a.config.priority);
872
- this.invalidateFilterCache();
873
904
  const unregister = this.createUnregisterFunction(action, handlerId, registration);
874
905
  this.unregisterFunctions.set(handlerId, unregister);
875
906
  this.log(`Handler registered: ${String(action)}`, {
@@ -1214,32 +1245,19 @@ var ActionRegister = class {
1214
1245
  return null;
1215
1246
  }
1216
1247
  /**
1217
- * 🔧 Calculate optimal cache size based on current handler count
1218
- * Note: This caches handler SELECTION metadata only, never execution results
1219
- */
1220
- get filterCacheMaxSize() {
1221
- const totalHandlers = Array.from(this.pipelines.values()).reduce((sum, pipeline) => sum + pipeline.length, 0);
1222
- return totalHandlers * 10 || 100;
1223
- }
1224
- /**
1225
- * 🔧 Generate cache key for filter options
1248
+ * 🔧 Generate optimized cache key for filter options
1226
1249
  */
1227
1250
  generateFilterCacheKey(filterOptions) {
1228
1251
  if (!filterOptions) return "no-filter";
1229
- const key = [
1230
- filterOptions.handlerIds?.sort().join(",") || "none",
1231
- filterOptions.excludeHandlerIds?.sort().join(",") || "none",
1232
- filterOptions.priority?.min?.toString() || "none",
1233
- filterOptions.priority?.max?.toString() || "none",
1234
- filterOptions.custom ? "custom" : "none"
1235
- ].join("|");
1236
- return key;
1237
- }
1238
- /**
1239
- * 🔧 Clear filter cache when pipelines change
1240
- */
1241
- invalidateFilterCache() {
1242
- this.filterCache.clear();
1252
+ const parts = [];
1253
+ if (filterOptions.handlerIds?.length) parts.push(`h:${filterOptions.handlerIds.slice().sort().join(",")}`);
1254
+ if (filterOptions.excludeHandlerIds?.length) parts.push(`e:${filterOptions.excludeHandlerIds.slice().sort().join(",")}`);
1255
+ if (filterOptions.priority) {
1256
+ const { min, max } = filterOptions.priority;
1257
+ if (min !== void 0 || max !== void 0) parts.push(`p:${min ?? "*"}-${max ?? "*"}`);
1258
+ }
1259
+ if (filterOptions.custom) return "custom-" + Date.now() + Math.random();
1260
+ return parts.length > 0 ? parts.join("|") : "no-filter";
1243
1261
  }
1244
1262
  /**
1245
1263
  * 🔧 Create or reuse PipelineController from pool for better performance
@@ -1285,30 +1303,20 @@ var ActionRegister = class {
1285
1303
  }
1286
1304
  filterHandlers(handlers, filterOptions) {
1287
1305
  if (!filterOptions) return handlers;
1288
- const cacheKey = this.generateFilterCacheKey(filterOptions);
1289
- if (!filterOptions.custom) {
1290
- const cached = this.filterCache.get(cacheKey);
1291
- if (cached) return cached;
1292
- }
1306
+ const handlerIdSet = filterOptions.handlerIds ? new Set(filterOptions.handlerIds) : null;
1307
+ const excludeIdSet = filterOptions.excludeHandlerIds ? new Set(filterOptions.excludeHandlerIds) : null;
1293
1308
  const filtered = handlers.filter((registration) => {
1294
1309
  const config = registration.config;
1295
- if (filterOptions.handlerIds?.length && !filterOptions.handlerIds.includes(config.id)) return false;
1296
- if (filterOptions.excludeHandlerIds?.length && filterOptions.excludeHandlerIds.includes(config.id)) return false;
1310
+ if (handlerIdSet && !handlerIdSet.has(config.id)) return false;
1311
+ if (excludeIdSet && excludeIdSet.has(config.id)) return false;
1297
1312
  if (filterOptions.priority) {
1298
- if (filterOptions.priority.min !== void 0 && config.priority < filterOptions.priority.min) return false;
1299
- if (filterOptions.priority.max !== void 0 && config.priority > filterOptions.priority.max) return false;
1313
+ const priority = config.priority;
1314
+ if (filterOptions.priority.min !== void 0 && priority < filterOptions.priority.min) return false;
1315
+ if (filterOptions.priority.max !== void 0 && priority > filterOptions.priority.max) return false;
1300
1316
  }
1301
1317
  if (filterOptions.custom && !filterOptions.custom(config)) return false;
1302
1318
  return true;
1303
1319
  });
1304
- if (!filterOptions.custom) {
1305
- const currentMaxSize = this.filterCacheMaxSize;
1306
- if (this.filterCache.size >= currentMaxSize) {
1307
- const oldestKey = this.filterCache.keys().next().value;
1308
- if (oldestKey !== void 0) this.filterCache.delete(oldestKey);
1309
- }
1310
- this.filterCache.set(cacheKey, filtered);
1311
- }
1312
1320
  return filtered;
1313
1321
  }
1314
1322
  processResults(context, resultOptions) {
@@ -1417,7 +1425,6 @@ var ActionRegister = class {
1417
1425
  */
1418
1426
  clearAction(action) {
1419
1427
  this.pipelines.delete(action);
1420
- this.invalidateFilterCache();
1421
1428
  }
1422
1429
  /**
1423
1430
  * Remove all handlers for all actions
@@ -1428,7 +1435,6 @@ var ActionRegister = class {
1428
1435
  */
1429
1436
  clearAll() {
1430
1437
  this.pipelines.clear();
1431
- this.invalidateFilterCache();
1432
1438
  }
1433
1439
  /**
1434
1440
  * Get the name of this action register
@@ -1562,7 +1568,6 @@ var ActionRegister = class {
1562
1568
  const index = pipeline.findIndex((reg) => reg.id === handlerId && reg === registration);
1563
1569
  if (index !== -1) {
1564
1570
  pipeline.splice(index, 1);
1565
- this.invalidateFilterCache();
1566
1571
  this.unregisterFunctions.delete(handlerId);
1567
1572
  if (registration.config.cleanup && typeof registration.config.cleanup === "function") try {
1568
1573
  registration.config.cleanup();
@@ -1616,7 +1621,6 @@ var ActionRegister = class {
1616
1621
  this.actionGuard.destroy();
1617
1622
  this.dispatchQueue?.clear?.();
1618
1623
  this.actionExecutionModes.clear();
1619
- this.filterCache.clear();
1620
1624
  this.controllerPool.length = 0;
1621
1625
  this.log("ActionRegister destroyed");
1622
1626
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["nonBlockingPromises: Array<Promise<any>>","errors: HandlerError[]","error: any","handlerErrors: HandlerError[]","handlerResult: R | undefined","keysToDelete: string[]","name: string","queuedOperation: QueuedOperation<T>","signals: AbortSignal[]","cleanups: (() => void)[]","autoAbortController: AbortController | undefined","effectiveSignal: AbortSignal","registration: HandlerRegistration<T[K], R>","throttleMs: number | undefined","debounceMs: number | undefined","context: PipelineContext<T[K], any>","context: PipelineContext<T[K], R>","executionError: Error | undefined","handlerResults: Array<{\n id: string;\n executed: boolean;\n duration: number | undefined;\n result: R | undefined;\n error: Error | undefined;\n metadata: Record<string, any> | undefined;\n }>","errors: HandlerError[]","executionResult: ExecutionResult<R>","finalConfig: Required<HandlerConfig>","currentUnregister: UnregisterFunction | undefined"],"sources":["../src/execution-modes.ts","../src/action-guard.ts","../src/concurrency/OperationQueue.ts","../src/ActionRegister.ts","../src/react-helpers.ts"],"sourcesContent":["/**\n * @fileoverview Execution mode implementations for ActionRegister\n * \n * Provides three different execution strategies for action handler pipelines:\n * - Sequential: Execute handlers one after another in priority order\n * - Parallel: Execute all handlers simultaneously\n * - Race: First handler to complete wins, others are cancelled\n */\n\nimport type { \n HandlerRegistration, \n PipelineContext, \n PipelineController,\n HandlerError\n} from './types.js';\n\n/**\n * Create standardized error handling for handlers\n * \n * @param error - The error that occurred\n * @param registration - The handler registration that failed\n * @returns Standardized HandlerError object\n * \n * @internal\n */\nfunction handleExecutionError<T, R>(\n error: any,\n registration: HandlerRegistration<T, R>\n): HandlerError {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n return {\n handlerId: registration.id,\n error: errorObj,\n timestamp: Date.now(),\n severity: registration.config.blocking ? 'blocking' : 'non-blocking'\n };\n}\n\n/**\n * Execute handlers in sequential mode (one after another)\n * \n * Executes action handlers one at a time in priority order (highest first).\n * Supports both blocking and non-blocking handlers, with proper abort and\n * termination handling. Handlers can modify payload for subsequent handlers\n * and jump to different priority levels.\n * \n * @template T - The payload type for the action\n * @template R - The result type for handlers\n * \n * @param context - Pipeline execution context containing handlers and state\n * @param createController - Factory function for creating pipeline controllers\n * \n * @throws {Error} When a blocking handler fails\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/dispatch-patterns\n * \n * @public\n */\nexport async function executeSequential<T, R = void>(\n context: PipelineContext<T, R>,\n createController: (registration: HandlerRegistration<T, R>, index: number) => PipelineController<T, R>\n): Promise<void> {\n\n let i = 0;\n const nonBlockingPromises: Array<Promise<any>> = [];\n const errors: HandlerError[] = [];\n \n while (i < context.handlers.length) {\n // Check for abort or termination\n if (context.aborted || context.terminated) {\n break;\n }\n\n const registration = context.handlers[i];\n if (!registration) {\n continue; // Skip if handler not found\n }\n context.currentIndex = i;\n const controller = createController(registration, i);\n\n try {\n // Check for abort before executing handler\n if (context.aborted) {\n break;\n }\n \n const result = registration.handler(context.payload, controller);\n\n if (registration.config.blocking) {\n // 🆕 Blocking handlers: Wait for completion (sync or async)\n const handlerResult = result instanceof Promise ? await result : result;\n if (handlerResult !== undefined && !context.terminated) {\n context.results.push(handlerResult as R);\n }\n } else {\n // 🆕 Non-blocking handlers: Handle differently for sync vs async\n if (result instanceof Promise) {\n // Non-blocking async: Track promise with error handling\n const promiseWithErrorHandling = result\n .then(asyncResult => {\n if (asyncResult !== undefined && !context.terminated) {\n context.results.push(asyncResult as R);\n }\n return asyncResult;\n })\n .catch(error => {\n // 🆕 Non-blocking async handler error collection\n const handlerError = handleExecutionError(error, registration);\n errors.push({\n handlerId: handlerError.handlerId,\n error: handlerError.error,\n timestamp: handlerError.timestamp,\n severity: 'non-blocking'\n });\n return undefined; // Return undefined for failed non-blocking handlers\n });\n \n nonBlockingPromises.push(promiseWithErrorHandling);\n } else if (result !== undefined && !context.terminated) {\n // Non-blocking sync: Immediately collect result\n context.results.push(result as R);\n }\n }\n\n /** Check if pipeline was terminated by controller.return() */\n if (context.terminated) {\n break;\n }\n\n /** Handle jump to priority AFTER handler execution */\n if (context.jumpToPriority !== undefined) {\n const jumpIndex = context.handlers.findIndex(\n handler => handler.config.priority === context.jumpToPriority\n );\n \n if (jumpIndex !== -1) {\n i = jumpIndex;\n context.jumpToPriority = undefined;\n continue;\n } else {\n context.jumpToPriority = undefined;\n i++;\n }\n } else {\n i++;\n }\n\n } catch (error: any) {\n // 🆕 Maintain backward compatibility: any sync error fails pipeline\n const handlerError = handleExecutionError(error, registration);\n \n // For backward compatibility: all synchronous errors fail the pipeline\n throw handlerError.error;\n }\n }\n \n // 🆕 Wait for all non-blocking promises with error collection\n if (nonBlockingPromises.length > 0) {\n await Promise.allSettled(nonBlockingPromises);\n }\n\n // 🔧 Store collected errors in context for ExecutionResult with proper typing\n if (errors.length > 0) {\n // Convert to proper HandlerError format\n const handlerErrors: HandlerError[] = errors.map(err => ({\n handlerId: err.handlerId,\n error: err.error,\n timestamp: err.timestamp,\n severity: 'non-blocking' as const\n }));\n \n // Add to context with proper typing\n (context as PipelineContext<any, any> & { collectedErrors?: HandlerError[] }).collectedErrors = handlerErrors;\n }\n}\n\n/**\n * Execute handlers in parallel mode (all at once)\n * \n * Executes all qualifying action handlers simultaneously using Promise.allSettled.\n * Supports both blocking and non-blocking handlers. Blocking handlers can still\n * fail the entire pipeline if they throw errors.\n * \n * @template T - The payload type for the action\n * @template R - The result type for handlers\n * \n * @param context - Pipeline execution context containing handlers and state\n * @param createController - Factory function for creating pipeline controllers\n * \n * @throws {Error} When any blocking handler fails\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/dispatch-patterns#parallel-execution\n * \n * @public\n */\nexport async function executeParallel<T, R = void>(\n context: PipelineContext<T, R>,\n createController: (registration: HandlerRegistration<T, R>, index: number) => PipelineController<T, R>\n): Promise<void> {\n\n /** All handlers are runnable */\n const runnableHandlers = context.handlers;\n\n /** Create promises for all handlers */\n const handlerPromises = runnableHandlers.map(async (registration, _index) => {\n const controller = createController(registration, _index);\n \n try {\n const result = registration.handler(context.payload, controller);\n \n let handlerResult: R | undefined;\n if (result instanceof Promise) {\n const resolved = await result;\n handlerResult = resolved as R | undefined;\n } else {\n handlerResult = result as R | undefined;\n }\n \n /** Collect result if handler returned something and pipeline wasn't terminated */\n if (handlerResult !== undefined && !context.terminated) {\n context.results.push(handlerResult);\n }\n \n return { \n success: true, \n handlerId: registration.id, \n result: handlerResult,\n terminated: context.terminated \n };\n \n } catch (error: any) {\n // 🆕 Consistent error object creation\n const handlerError = handleExecutionError(error, registration);\n \n if (handlerError.severity === 'blocking') {\n throw handlerError.error;\n }\n \n return { success: false, handlerId: registration.id, error: handlerError.error };\n }\n });\n\n /** Wait for all handlers to complete */\n const results = await Promise.allSettled(handlerPromises);\n \n /** Check for any rejected blocking handlers */\n const failures = results.filter((result, index) => {\n if (result.status === 'rejected') {\n const registration = runnableHandlers[index];\n return registration?.config.blocking ?? false;\n }\n return false;\n });\n\n if (failures.length > 0) {\n const firstFailure = failures[0] as PromiseRejectedResult;\n throw firstFailure.reason;\n }\n\n /** Check if any handler terminated the pipeline */\n const terminatedResults = results.filter(result => \n result.status === 'fulfilled' && result.value.terminated\n );\n \n if (terminatedResults.length > 0) {\n context.terminated = true;\n // In parallel mode, we can't determine which handler's termination result to use,\n // so we use the first one that terminated\n const firstTerminated = terminatedResults[0] as PromiseFulfilledResult<any>;\n context.terminationResult = firstTerminated.value.result;\n }\n}\n\n/**\n * Execute handlers in race mode (first to complete wins)\n * \n * Executes all qualifying handlers simultaneously using Promise.race, where\n * the first handler to complete determines the pipeline result. Other handlers\n * are effectively cancelled. Useful for scenarios where you want the fastest\n * response from multiple equivalent handlers.\n * \n * @template T - The payload type for the action\n * @template R - The result type for handlers\n * \n * @param context - Pipeline execution context containing handlers and state\n * @param createController - Factory function for creating pipeline controllers\n * \n * @throws {Error} When the winning handler fails and is blocking\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/dispatch-patterns#race-execution\n * \n * @public\n */\nexport async function executeRace<T, R = void>(\n context: PipelineContext<T, R>,\n createController: (registration: HandlerRegistration<T, R>, index: number) => PipelineController<T, R>\n): Promise<void> {\n\n /** All handlers are runnable */\n const runnableHandlers = context.handlers;\n\n if (runnableHandlers.length === 0) {\n return;\n }\n\n /** Create promises for all handlers */\n const handlerPromises = runnableHandlers.map(async (registration, _index) => {\n const controller = createController(registration, _index);\n \n try {\n const result = registration.handler(context.payload, controller);\n \n let handlerResult: R | undefined;\n if (result instanceof Promise) {\n const resolved = await result;\n handlerResult = resolved as R | undefined;\n } else {\n handlerResult = result as R | undefined;\n }\n \n return { \n success: true, \n handlerId: registration.id, \n registration,\n result: handlerResult,\n terminated: context.terminated\n };\n \n } catch (error: any) {\n // 🆕 Consistent error object creation\n const handlerError = handleExecutionError(error, registration);\n return { success: false, handlerId: registration.id, error: handlerError.error, registration };\n }\n });\n\n /** Race all handlers */\n const winner = await Promise.race(handlerPromises);\n\n /** If the winner failed and was blocking, throw the error */\n if (!winner.success && winner.registration?.config.blocking) {\n throw winner.error;\n }\n\n /** Collect result from the winning handler */\n if (winner.success && winner.result !== undefined) {\n context.results.push(winner.result);\n }\n\n /** Check if the winning handler terminated the pipeline */\n if (winner.success && winner.terminated) {\n context.terminated = true;\n context.terminationResult = winner.result;\n }\n}","/**\n * @fileoverview Action Guard system for debouncing, throttling and blocking\n * \n * Provides rate limiting and user experience optimization for actions through\n * debouncing (wait for pause) and throttling (limit frequency) mechanisms.\n * Used internally by ActionRegister to control action execution timing.\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/\n */\n\n\n/**\n * Action guard state tracking for debouncing and throttling\n * \n * Tracks timing and execution state for action execution control.\n * Maintains separate state for each action to enable independent\n * rate limiting per action type.\n * \n * @internal\n */\ninterface GuardState {\n /** Timestamp of last successful execution for throttling calculations */\n lastExecuted: number;\n \n /** Active debounce timer - cleared when new debounce requests arrive */\n debounceTimer: NodeJS.Timeout | undefined;\n \n /** Active throttle timer - tracks when throttle period will end */\n throttleTimer: NodeJS.Timeout | undefined;\n \n /** Flag indicating if action is currently in throttled state */\n isThrottled: boolean;\n \n /** Current debounce promise - reused for concurrent calls */\n debouncePromise: Promise<boolean> | undefined;\n \n /** Resolve function for current debounce promise */\n debounceResolve: ((value: boolean) => void) | undefined;\n}\n\n/**\n * Action Guard system for managing action execution timing\n * \n * Provides performance optimization and user experience enhancement through\n * debouncing and throttling mechanisms. Debouncing waits for a pause in calls\n * before executing, while throttling limits execution frequency.\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @example Manual Usage (Advanced)\n * ```typescript\n * const guard = new ActionGuard()\n * \n * // Manual debouncing\n * if (await guard.debounce('search', 300)) {\n * performSearch() // Only executes after 300ms pause\n * }\n * \n * // Manual throttling\n * if (guard.throttle('scroll', 100)) {\n * updateUI() // Max once per 100ms\n * }\n * ```\n * \n * @internal\n */\nexport class ActionGuard {\n private guards = new Map<string, GuardState>();\n private cleanupInterval: NodeJS.Timeout | undefined;\n private readonly maxIdleTime: number = 60000; // 1 minute\n private readonly cleanupIntervalMs: number = 30000; // 30 seconds\n\n constructor(autoCleanup: boolean = true) {\n if (autoCleanup) {\n this.startAutoCleanup();\n }\n }\n\n /**\n * Start automatic cleanup of idle guard states\n * \n * @internal\n */\n private startAutoCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n const keysToDelete: string[] = [];\n \n // Collect keys to delete (avoid modifying map during iteration)\n this.guards.forEach((state, key) => {\n const isIdle = now - state.lastExecuted > this.maxIdleTime;\n const hasActiveTimers = state.debounceTimer || state.throttleTimer;\n \n if (isIdle && !hasActiveTimers) {\n keysToDelete.push(key);\n }\n });\n \n // Batch delete idle guards\n if (keysToDelete.length > 0) {\n keysToDelete.forEach(key => this.guards.delete(key));\n // Optional debug logging for cleanup\n if (typeof process !== 'undefined' && process.env?.DEBUG_CONTEXT_ACTION) {\n console.debug(`[ActionGuard] Cleaned up ${keysToDelete.length} idle guards`);\n }\n }\n }, this.cleanupIntervalMs);\n }\n\n /**\n * Apply debouncing to an action\n * \n * Debouncing waits for a specified delay after the last call before allowing\n * execution. Each new call resets the timer. Useful for search inputs, resize\n * handlers, and other high-frequency user interactions.\n * \n * @param actionKey - Unique identifier for the action being debounced\n * @param debounceMs - Delay in milliseconds to wait after the last call\n * \n * @returns Promise resolving to true if execution should proceed, false if cancelled\n * \n * @example Search Input Debouncing\n * ```typescript\n * // Only search after user stops typing for 300ms\n * if (await guard.debounce('userSearch', 300)) {\n * performSearch(query)\n * }\n * ```\n * \n * @internal\n */\n async debounce(actionKey: string, debounceMs: number): Promise<boolean> {\n\n /** Get or create guard state for this action */\n let state = this.guards.get(actionKey);\n if (!state) {\n /** Initialize new guard state with default values */\n state = {\n lastExecuted: 0,\n isThrottled: false,\n debounceTimer: undefined as NodeJS.Timeout | undefined,\n throttleTimer: undefined as NodeJS.Timeout | undefined,\n debouncePromise: undefined as Promise<boolean> | undefined,\n debounceResolve: undefined as ((value: boolean) => void) | undefined,\n };\n this.guards.set(actionKey, state);\n }\n\n /** Clear any existing debounce timer to restart the delay period */\n if (state.debounceTimer) {\n clearTimeout(state.debounceTimer);\n // Resolve previous debounce with false if exists\n if (state.debounceResolve) {\n state.debounceResolve(false);\n state.debounceResolve = undefined as ((value: boolean) => void) | undefined;\n }\n }\n\n /** Create new debounce promise */\n return new Promise<boolean>((resolve) => {\n // Store new resolve function\n state!.debounceResolve = resolve;\n \n // Set new timer\n state!.debounceTimer = setTimeout(() => {\n /** Clean up timer and resolver references */\n state!.debounceTimer = undefined as NodeJS.Timeout | undefined;\n state!.debounceResolve = undefined as ((value: boolean) => void) | undefined;\n /** Update last execution timestamp */\n state!.lastExecuted = Date.now();\n resolve(true);\n }, debounceMs);\n });\n }\n\n /**\n * Apply throttling to an action\n * \n * Throttling limits execution frequency by ensuring a minimum interval between\n * calls. Unlike debouncing, throttling executes immediately on the first call\n * and then blocks subsequent calls until the interval expires.\n * \n * @param actionKey - Unique identifier for the action being throttled\n * @param throttleMs - Minimum interval in milliseconds between executions\n * \n * @returns True if execution should proceed, false if currently throttled\n * \n * @example Scroll Handler Throttling\n * ```typescript\n * // Update scroll position max once per 100ms\n * if (guard.throttle('scrollUpdate', 100)) {\n * updateScrollPosition()\n * }\n * ```\n * \n * @internal\n */\n throttle(actionKey: string, throttleMs: number): boolean {\n\n /** Get or create guard state for this action */\n let state = this.guards.get(actionKey);\n if (!state) {\n /** Initialize new guard state with default values */\n state = {\n lastExecuted: 0,\n isThrottled: false,\n debounceTimer: undefined as NodeJS.Timeout | undefined,\n throttleTimer: undefined as NodeJS.Timeout | undefined,\n debouncePromise: undefined as Promise<boolean> | undefined,\n debounceResolve: undefined as ((value: boolean) => void) | undefined,\n };\n this.guards.set(actionKey, state);\n }\n\n const now = Date.now();\n const timeSinceLastExecution = now - state.lastExecuted;\n\n /** Check if enough time has passed since last execution */\n /** If throttle period has elapsed, allow immediate execution */\n if (timeSinceLastExecution >= throttleMs) {\n /** Update execution timestamp and clear throttled state */\n state.lastExecuted = now;\n state.isThrottled = false;\n \n \n return true;\n }\n\n /** If already in throttled state, don't create duplicate timers */\n /** This prevents timer accumulation and unnecessary processing */\n if (state.isThrottled) {\n return false;\n }\n\n /** Set throttle timer to automatically clear the throttled state */\n /** Calculate remaining time until throttle period expires */\n state.isThrottled = true;\n const remainingTime = throttleMs - timeSinceLastExecution;\n \n /** Create timer to reset throttled state when period expires */\n state.throttleTimer = setTimeout(() => {\n /** Clear throttled state and timer reference */\n state!.isThrottled = false;\n state!.throttleTimer = undefined as NodeJS.Timeout | undefined;\n }, remainingTime);\n\n\n return false;\n }\n\n /**\n * Clear all guard state for a specific action\n * \n * Removes debounce and throttle timers for the specified action,\n * preventing memory leaks and allowing immediate re-execution.\n * \n * @param actionKey - Action identifier to clear guards for\n * \n * @internal\n */\n clearGuards(actionKey: string): void {\n const state = this.guards.get(actionKey);\n if (state) {\n // Clear debounce timer and cancel pending promises to prevent memory leaks\n if (state.debounceTimer) {\n clearTimeout(state.debounceTimer);\n if (state.debounceResolve) {\n state.debounceResolve(false);\n state.debounceResolve = undefined;\n }\n state.debounceTimer = undefined;\n }\n \n // Clear throttle timer to prevent memory leaks\n if (state.throttleTimer) {\n clearTimeout(state.throttleTimer);\n state.throttleTimer = undefined;\n }\n \n \n // Remove guard state from memory\n this.guards.delete(actionKey);\n }\n }\n\n /**\n * Clear all guard states for all actions\n * \n * Removes all active debounce and throttle timers, useful for cleanup\n * when shutting down the action system or resetting state.\n * \n * @internal\n */\n clearAll(): void {\n \n /** Iterate through all guard states and clear their timers */\n /** This prevents memory leaks when clearing the entire guard system */\n this.guards.forEach((state) => {\n /** Clear any active debounce timers */\n if (state.debounceTimer) {\n clearTimeout(state.debounceTimer);\n // Cancel waiting debounce calls\n if (state.debounceResolve) {\n state.debounceResolve(false);\n }\n }\n /** Clear any active throttle timers */\n if (state.throttleTimer) {\n clearTimeout(state.throttleTimer);\n }\n });\n \n /** Remove all guard states from memory */\n this.guards.clear();\n }\n\n /**\n * Get current guard state for debugging purposes\n * \n * Returns the internal state for a specific action, including timer\n * information and execution timestamps.\n * \n * @param actionKey - Action identifier to inspect\n * @returns Guard state or undefined if no state exists\n * \n * @internal\n */\n getGuardState(actionKey: string): GuardState | undefined {\n return this.guards.get(actionKey);\n }\n\n /**\n * Get all active guard states for debugging purposes\n * \n * Returns a copy of all current guard states, useful for monitoring\n * and debugging rate limiting behavior across all actions.\n * \n * @returns Map of action keys to their guard states\n * \n * @internal\n */\n getAllGuardStates(): Map<string, GuardState> {\n return new Map(this.guards);\n }\n\n /**\n * 🆕 Explicit destroy method for comprehensive cleanup\n * \n * Cleans up all timers, promises, and intervals to prevent memory leaks.\n * Should be called when ActionGuard is no longer needed.\n * \n * @internal\n */\n destroy(): void {\n // Stop auto cleanup interval\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = undefined as NodeJS.Timeout | undefined;\n }\n \n // Clear all existing guards\n this.clearAll();\n }\n\n /**\n * 🆕 Get statistics about active guards\n * \n * @returns Statistics about guard usage\n * \n * @internal\n */\n getStats(): { activeGuards: number; withTimers: number } {\n let withTimers = 0;\n this.guards.forEach(state => {\n if (state.debounceTimer || state.throttleTimer) {\n withTimers++;\n }\n });\n \n return {\n activeGuards: this.guards.size,\n withTimers\n };\n }\n}","/**\n * 동시성 문제 해결을 위한 작업 큐 시스템\n * \n * 모든 상태 변경 작업을 직렬화하여 race condition을 방지합니다.\n */\n\nexport interface QueuedOperation<T = any> {\n id: string;\n operation: () => T | Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n priority?: number;\n timestamp: number;\n}\n\n/**\n * 작업 큐 관리자\n * \n * 핵심 기능:\n * 1. 작업 직렬화 - 모든 작업을 순서대로 실행\n * 2. 우선순위 지원 - 중요한 작업 우선 처리\n * 3. 에러 처리 - 개별 작업 실패가 전체에 영향 주지 않음\n * 4. 메모리 관리 - 완료된 작업 자동 정리\n * 5. 🆕 동시성 제어 - maxConcurrency로 동시 실행 제한\n */\nexport class OperationQueue {\n private queue: QueuedOperation[] = [];\n private processingPromise: Promise<void> | null = null;\n private operationCounter = 0;\n \n // 🆕 Concurrency control\n private activeOperations = 0;\n private readonly maxConcurrency: number;\n private readonly runningOperations = new Set<Promise<any>>();\n \n constructor(\n private name: string = 'OperationQueue', \n maxConcurrency: number = 1\n ) {\n this.maxConcurrency = Math.max(1, maxConcurrency);\n }\n\n /**\n * 작업을 큐에 추가하고 실행 결과를 반환\n * \n * @param operation 실행할 작업\n * @param priority 우선순위 (높을수록 먼저 실행)\n * @returns Promise로 래핑된 작업 결과\n */\n enqueue<T>(operation: () => T | Promise<T>, priority: number = 0): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const queuedOperation: QueuedOperation<T> = {\n id: `${this.name}-${++this.operationCounter}`,\n operation,\n resolve,\n reject,\n priority,\n timestamp: Date.now()\n };\n\n // 우선순위에 따라 삽입 위치 결정\n let insertIndex = this.queue.length;\n for (let i = 0; i < this.queue.length; i++) {\n const item = this.queue[i];\n if (item && (item.priority || 0) < priority) {\n insertIndex = i;\n break;\n }\n }\n\n this.queue.splice(insertIndex, 0, queuedOperation);\n \n // 큐 처리 시작 (이미 처리 중이면 무시됨)\n this.processQueue();\n });\n }\n\n /**\n * 🆕 큐 처리 메인 로직 - 동시성 제어 지원\n * \n * maxConcurrency에 따라 동시 실행 작업 수를 제한하여 동시성 문제 방지\n */\n private async processQueue(): Promise<void> {\n if (this.processingPromise) {\n return this.processingPromise;\n }\n \n this.processingPromise = this._doProcess();\n try {\n await this.processingPromise;\n } finally {\n this.processingPromise = null;\n }\n }\n \n private async _doProcess(): Promise<void> {\n while (this.queue.length > 0 || this.runningOperations.size > 0) {\n // 🆕 동시성 제어: maxConcurrency 만큼만 동시 실행\n while (this.queue.length > 0 && this.activeOperations < this.maxConcurrency) {\n const operation = this.queue.shift()!;\n this.activeOperations++;\n \n // 🆕 비동기 작업 실행 및 추적\n const operationPromise = this.executeOperation(operation);\n this.runningOperations.add(operationPromise);\n \n // 🆕 작업 완료 시 정리\n operationPromise.finally(() => {\n this.activeOperations--;\n this.runningOperations.delete(operationPromise);\n });\n }\n \n // 🆕 실행 중인 작업이 있으면 하나가 완료될 때까지 대기\n if (this.runningOperations.size > 0) {\n await Promise.race(this.runningOperations);\n }\n }\n }\n \n /**\n * 🆕 개별 작업 실행 로직\n */\n private async executeOperation<T>(operation: QueuedOperation<T>): Promise<void> {\n try {\n // 작업 실행 (동기/비동기 모두 지원)\n const result = await Promise.resolve(operation.operation());\n operation.resolve(result);\n } catch (error) {\n // 개별 작업 실패는 전체 큐에 영향 주지 않음\n operation.reject(error);\n }\n }\n\n /**\n * 🆕 현재 큐 상태 조회 (디버깅용) - 동시성 정보 포함\n */\n getQueueInfo() {\n return {\n name: this.name,\n queueLength: this.queue.length,\n isProcessing: Boolean(this.processingPromise),\n activeOperations: this.activeOperations,\n maxConcurrency: this.maxConcurrency,\n runningOperationsCount: this.runningOperations.size,\n operations: this.queue.map(op => ({\n id: op.id,\n priority: op.priority,\n timestamp: op.timestamp\n }))\n };\n }\n \n /**\n * 🆕 동시성 설정 조회\n */\n getConcurrencyInfo() {\n return {\n maxConcurrency: this.maxConcurrency,\n activeOperations: this.activeOperations,\n availableSlots: this.maxConcurrency - this.activeOperations,\n queuedOperations: this.queue.length,\n efficiency: this.activeOperations / this.maxConcurrency\n };\n }\n\n /**\n * 큐 비우기 (테스트용)\n */\n clear(): void {\n // 대기 중인 작업들에게 취소 알림\n this.queue.forEach(operation => {\n operation.reject(new Error('Queue cleared'));\n });\n \n this.queue = [];\n this.processingPromise = null;\n }\n\n /**\n * 큐 크기 조회\n */\n get size(): number {\n return this.queue.length;\n }\n\n /**\n * 처리 중 여부 조회 \n */\n get processing(): boolean {\n return Boolean(this.processingPromise);\n }\n}","\nimport {\n ActionPayloadMap,\n ActionHandler,\n HandlerConfig,\n HandlerRegistration,\n PipelineContext,\n PipelineController,\n ActionRegisterConfig,\n UnregisterFunction,\n ExecutionMode,\n ExecutionResult,\n ActionRegistryInfo,\n ActionHandlerStats,\n DispatchOptions,\n HandlerError,\n} from './types.js';\nimport { executeSequential, executeParallel, executeRace } from './execution-modes.js';\nimport { ActionGuard } from './action-guard.js';\nimport { OperationQueue } from './concurrency/OperationQueue.js';\n\n/**\n * Action Register for managing action handlers with priority-based execution\n * \n * Central action registration and dispatch system providing type-safe action pipeline management.\n * Supports sequential, parallel, and race execution modes with advanced handler filtering,\n * throttling, debouncing, and comprehensive result collection.\n * \n * @template TActionMap - Action payload mapping interface extending ActionPayloadMap\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/\n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/register-delegation\n * \n * @public\n */\nexport class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {\n private pipelines = new Map<keyof T, Array<HandlerRegistration<any, any>>>();\n private readonly actionGuard: ActionGuard;\n private executionMode: ExecutionMode = 'sequential';\n private actionExecutionModes = new Map<keyof T, ExecutionMode>();\n \n // 🆕 Advanced unregister function management system\n private unregisterFunctions = new Map<string, UnregisterFunction>();\n \n public readonly name: string;\n private readonly registryConfig: ActionRegisterConfig['registry'];\n\n // 🆕 Performance optimizations\n private readonly isDebugMode: boolean;\n private readonly maxHandlersPerAction: number;\n\n // 🆕 동시성 문제 해결을 위한 큐 시스템 (conditional)\n private dispatchQueue?: OperationQueue;\n\n // 🔧 Performance optimization: Cache for handler SELECTION logic only (not execution results)\n // Safe to cache: filters only determine WHICH handlers to run, not their side effects\n private filterCache = new Map<string, HandlerRegistration<any, any>[]>();\n\n // 🔧 Performance optimization: Fast handler ID generation counter\n private handlerIdCounter = 0;\n\n // 🔧 Performance optimization: PipelineController pool for object reuse\n private controllerPool: PipelineController<any, any>[] = [];\n private readonly maxControllerPoolSize = 10;\n\n constructor(config: ActionRegisterConfig = {}) {\n this.name = config.name || 'ActionRegister';\n this.registryConfig = config.registry;\n this.maxHandlersPerAction = config.registry?.maxHandlersPerAction ?? 1000;\n \n // 🆕 Environment variable check cached (performance optimization)\n this.isDebugMode = Boolean(\n this.registryConfig?.debug && \n process.env.NODE_ENV === 'development'\n );\n \n // Guard creation with improved cleanup handling\n this.actionGuard = new ActionGuard(this.registryConfig?.autoCleanup !== false);\n \n // 🆕 Conditional queue system initialization\n if (config.registry?.useConcurrencyQueue !== false) {\n this.dispatchQueue = new OperationQueue(`${this.name}-Dispatch`);\n }\n \n if (this.registryConfig?.defaultExecutionMode) {\n this.executionMode = this.registryConfig.defaultExecutionMode;\n }\n \n this.log('ActionRegister initialized', {\n defaultExecutionMode: this.executionMode,\n autoCleanup: this.registryConfig?.autoCleanup !== false,\n concurrencyQueue: Boolean(this.dispatchQueue),\n debugMode: this.isDebugMode\n });\n }\n\n /**\n * Register an action handler with optional configuration\n * \n * @param action - The action type to register handler for\n * @param handler - The handler function to execute\n * @param config - Optional handler configuration including priority, tags, etc.\n * \n * @returns Unregister function to remove this handler\n * \n * @throws {Error} When maximum handlers limit is reached\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n register<K extends keyof T, R = void>(\n action: K,\n handler: ActionHandler<T[K], R>,\n config: HandlerConfig = {}\n ): UnregisterFunction {\n // 🔄 임시로 기존 구현 유지하되 개선된 방식 적용\n // 동기적 API를 유지하면서 내부적으로만 동시성 보호\n \n // 🆕 Optimized handler ID generation\n const handlerId = config.id || this.generateHandlerId(action);\n \n // 🆕 Direct synchronous registration\n const unregisterFn = this._performRegistrationSync(action, handler, config, handlerId);\n \n return unregisterFn;\n }\n\n /**\n * 🆕 Unified logging method with cached debug mode check\n */\n private log(message: string, data?: unknown, level: 'log' | 'warn' | 'error' = 'log') {\n if (this.isDebugMode) {\n const timestamp = new Date().toISOString();\n console[level](`🎯 [${timestamp}] [${this.name}] ${message}`, data || '');\n }\n }\n\n /**\n * 🔧 Generate unique handler ID using optimized counter-based approach\n */\n private generateHandlerId<K extends keyof T>(action: K): string {\n // 🔧 Performance: Use simple counter instead of crypto.randomUUID()\n // This is safe for single-process apps and ~70% faster\n return `${String(action)}_${this.name}_${++this.handlerIdCounter}`;\n }\n\n /**\n * 🔧 Create and merge AbortSignal instances with proper cleanup\n * \n * @param options Dispatch options containing signal and autoAbort configuration\n * @returns [effectiveSignal, autoAbortController, cleanupFunction]\n */\n private createAbortSignal(options?: DispatchOptions): [\n AbortSignal | undefined, \n AbortController | undefined, \n () => void\n ] {\n const signals: AbortSignal[] = [];\n const cleanups: (() => void)[] = [];\n let autoAbortController: AbortController | undefined;\n\n // Add existing signal if provided\n if (options?.signal) {\n signals.push(options.signal);\n }\n\n // Create auto-abort controller if enabled\n if (options?.autoAbort?.enabled) {\n autoAbortController = new AbortController();\n signals.push(autoAbortController.signal);\n }\n\n // No signals to merge\n if (signals.length === 0) {\n return [undefined, autoAbortController, () => {}];\n }\n\n // Single signal - no merge needed\n if (signals.length === 1) {\n return [signals[0], autoAbortController, () => cleanups.forEach(c => c())];\n }\n\n // Multiple signals - use AbortSignal.any() if available, fallback to manual merge\n let effectiveSignal: AbortSignal;\n \n if (typeof AbortSignal.any === 'function') {\n // Modern browsers with AbortSignal.any()\n effectiveSignal = AbortSignal.any(signals);\n } else {\n // Fallback: Create controller and link all signals\n const mergedController = new AbortController();\n effectiveSignal = mergedController.signal;\n \n signals.forEach(signal => {\n if (signal.aborted) {\n mergedController.abort();\n } else {\n const abortHandler = () => mergedController.abort();\n signal.addEventListener('abort', abortHandler, { once: true });\n cleanups.push(() => signal.removeEventListener('abort', abortHandler));\n }\n });\n }\n\n const cleanup = () => {\n cleanups.forEach(c => {\n try {\n c();\n } catch (error) {\n this.log('Cleanup error during AbortSignal cleanup', error, 'warn');\n }\n });\n };\n\n return [effectiveSignal, autoAbortController, cleanup];\n }\n\n /**\n * 🆕 Perform synchronous handler registration\n */\n private _performRegistrationSync<K extends keyof T, R = void>(\n action: K,\n handler: ActionHandler<T[K], R>,\n config: HandlerConfig,\n handlerId: string\n ): UnregisterFunction {\n // Create handler registration with defaults\n const registration: HandlerRegistration<T[K], R> = {\n handler,\n config: {\n priority: config.priority ?? 0,\n id: handlerId,\n blocking: config.blocking ?? false,\n once: config.once ?? false,\n debounce: config.debounce ?? undefined,\n throttle: config.throttle ?? undefined,\n replaceExisting: config.replaceExisting ?? false,\n cleanup: config.cleanup, // 🔧 Preserve cleanup function from config\n } as Required<HandlerConfig>,\n id: handlerId,\n };\n \n // Initialize pipeline if it doesn't exist\n if (!this.pipelines.has(action)) {\n this.pipelines.set(action, []);\n }\n\n const pipeline = this.pipelines.get(action)!;\n \n // Check handler limit\n if (pipeline.length >= this.maxHandlersPerAction) {\n console.warn(`Handler limit (${this.maxHandlersPerAction}) reached for action \"${String(action)}\". Registration ignored.`);\n return () => {}; // No-op unregister\n }\n const existingIndex = pipeline.findIndex(reg => reg.id === handlerId);\n\n // 🆕 Enhanced duplicate ID handling with replaceExisting support and cleanup\n if (existingIndex !== -1) {\n const existing = pipeline[existingIndex];\n const existingUnregister = this.unregisterFunctions.get(handlerId);\n \n if (config.replaceExisting) {\n // Clean up existing handler before replacement\n if (existingUnregister) {\n // Execute existing unregister function first\n existingUnregister();\n this.unregisterFunctions.delete(handlerId);\n }\n \n // Call cleanup if available on the old handler\n if (existing && typeof (existing as any).cleanup === 'function') {\n try {\n (existing as any).cleanup();\n } catch (cleanupError) {\n this.log(`Cleanup error for replaced handler: ${String(action)}`, cleanupError, 'warn');\n }\n }\n \n // Replace existing handler\n pipeline[existingIndex] = registration;\n pipeline.sort((a, b) => b.config.priority - a.config.priority);\n this.invalidateFilterCache();\n \n // Create new unregister function and store it\n const newUnregister = this.createUnregisterFunction(action, handlerId, registration);\n this.unregisterFunctions.set(handlerId, newUnregister);\n \n this.log(`Handler replaced: ${String(action)}`, {\n handlerId,\n priority: config.priority,\n totalHandlers: pipeline.length,\n hadExistingUnregister: Boolean(existingUnregister)\n });\n \n return newUnregister;\n } else {\n // Return existing unregister function or create a new one\n // At this point, existing is guaranteed to be defined because we're in the duplicate handler block\n if (!existing) {\n throw new Error('Internal error: existing handler should be defined in duplicate handler block');\n }\n \n this.log(`Handler duplicate ignored, returning existing unregister: ${String(action)}`, {\n handlerId,\n existingPriority: existing.config.priority,\n newPriority: config.priority,\n existingBlocking: existing.config.blocking,\n newBlocking: config.blocking,\n note: 'Use replaceExisting:true to replace'\n }, 'warn');\n \n if (existingUnregister) {\n return existingUnregister;\n } else {\n // Create new unregister function if somehow missing\n const newUnregister = this.createUnregisterFunction(action, handlerId, existing);\n this.unregisterFunctions.set(handlerId, newUnregister);\n return newUnregister;\n }\n }\n }\n \n // Add handler to pipeline\n pipeline.push(registration);\n pipeline.sort((a, b) => b.config.priority - a.config.priority);\n this.invalidateFilterCache();\n \n // Create and store unregister function\n const unregister = this.createUnregisterFunction(action, handlerId, registration);\n this.unregisterFunctions.set(handlerId, unregister);\n \n this.log(`Handler registered: ${String(action)}`, {\n handlerId,\n priority: config.priority,\n totalHandlers: pipeline.length\n });\n \n return unregister;\n }\n\n\n /**\n * Dispatch an action with optional execution options\n * \n * @param action - The action type to dispatch\n * @param payload - The action payload data\n * @param options - Optional dispatch options (execution mode, filters, etc.)\n * \n * @returns Promise that resolves when all handlers complete\n * \n * @throws {Error} When action dispatching fails\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n async dispatch<K extends keyof T>(\n action: K,\n payload?: T[K],\n options?: DispatchOptions\n ): Promise<void> {\n // 🆕 Conditional queue usage for performance\n if (options?.immediate || !this.dispatchQueue) {\n // Bypass queue for immediate execution or when queues disabled\n return this._performDispatch(action, payload, options);\n } else {\n // Use queue for concurrency protection\n return this.dispatchQueue.enqueue(async () => {\n return this._performDispatch(action, payload, options);\n });\n }\n }\n\n /**\n * 🆕 실제 디스패치 작업 수행 (큐에서 호출됨)\n */\n private async _performDispatch<K extends keyof T>(\n action: K,\n payload?: T[K],\n options?: DispatchOptions\n ): Promise<void> {\n // 🔍 디스패치 시작 디버그\n this.log(`Starting dispatch for action '${String(action)}'`, {\n hasPayload: payload !== undefined,\n payloadType: payload?.constructor?.name || typeof payload,\n options: options ? Object.keys(options) : 'none',\n timestamp: new Date().toISOString()\n });\n \n // Simple Event object detection for development\n if (payload instanceof Event && process.env.NODE_ENV === 'development') {\n console.warn(`Event object passed to action \"${String(action)}\"`, payload.type);\n }\n \n // 🔧 Improved AbortSignal handling with cleaner merge logic\n const [effectiveSignal, autoAbortController, cleanup] = this.createAbortSignal(options);\n \n if (options?.autoAbort?.onControllerCreated && autoAbortController) {\n options.autoAbort.onControllerCreated(autoAbortController);\n }\n \n // Check if dispatch is aborted before starting\n if (effectiveSignal?.aborted) {\n this.log(`Dispatch aborted before execution for '${String(action)}'`);\n return;\n }\n \n const pipeline = this.pipelines.get(action);\n \n // 🔍 파이프라인 존재 여부 디버그\n this.log(`Pipeline lookup for '${String(action)}'`, {\n pipelineExists: Boolean(pipeline),\n handlersCount: pipeline?.length || 0,\n allRegisteredActions: Array.from(this.pipelines.keys()),\n pipelineMap: Object.fromEntries(Array.from(this.pipelines.entries()).map(([k, v]) => [k, v.length]))\n });\n \n if (!pipeline || pipeline.length === 0) {\n this.log(`No handlers found for action '${String(action)}', dispatch cancelled`, {}, 'warn');\n return;\n }\n\n // 🆕 Optimize filtering - only copy array if filtering is needed\n const filteredHandlers = options?.filter \n ? this.filterHandlers(pipeline, options.filter)\n : pipeline;\n\n // Apply ActionGuard controls - check both dispatch options and handler configs\n const actionKey = String(action);\n \n // Get throttle/debounce settings from dispatch options or handler configs\n let throttleMs: number | undefined;\n let debounceMs: number | undefined;\n \n // Priority: dispatch options > handler config\n if (options?.throttle !== undefined) {\n throttleMs = options.throttle;\n } else if (filteredHandlers.length > 0) {\n // Use throttle from the first handler that has it (handlers are sorted by priority)\n for (const handler of filteredHandlers) {\n if (handler.config.throttle !== undefined) {\n throttleMs = handler.config.throttle;\n break;\n }\n }\n }\n \n if (options?.debounce !== undefined) {\n debounceMs = options.debounce;\n } else if (filteredHandlers.length > 0) {\n // Use debounce from the first handler that has it (handlers are sorted by priority)\n for (const handler of filteredHandlers) {\n if (handler.config.debounce !== undefined) {\n debounceMs = handler.config.debounce;\n break;\n }\n }\n }\n \n // Apply debounce if specified\n if (debounceMs !== undefined) {\n const shouldProceed = await this.actionGuard.debounce(actionKey, debounceMs);\n if (!shouldProceed) {\n return; // Debounced - don't execute\n }\n }\n \n // Apply throttle if specified\n if (throttleMs !== undefined) {\n const shouldProceed = this.actionGuard.throttle(actionKey, throttleMs);\n if (!shouldProceed) {\n return; // Throttled - don't execute\n }\n }\n\n // Determine execution mode for this action (with option override)\n const currentExecutionMode = options?.executionMode || \n this.actionExecutionModes.get(action) || \n this.executionMode;\n\n // Create pipeline execution context\n const context: PipelineContext<T[K], any> = {\n action: String(action),\n payload: payload as T[K],\n handlers: filteredHandlers, // Use filtered handlers\n aborted: false,\n abortReason: undefined as string | undefined,\n currentIndex: 0,\n jumpToPriority: undefined as number | undefined,\n executionMode: currentExecutionMode,\n \n // New result collection fields\n results: [],\n terminated: false,\n terminationResult: undefined as any,\n };\n\n \n // Add abort listener if signal provided (use effectiveSignal for auto-abort)\n const abortHandler = effectiveSignal ? () => {\n context.aborted = true;\n context.abortReason = 'Action dispatch aborted by signal';\n } : undefined;\n \n if (effectiveSignal && abortHandler) {\n effectiveSignal.addEventListener('abort', abortHandler);\n }\n \n \n try {\n await this.executePipeline(context, autoAbortController, options?.autoAbort);\n this.log(`Pipeline execution succeeded for ${String(action)}`);\n } catch (error) {\n this.log(`Pipeline execution failed for ${String(action)}`, error, 'error');\n throw error;\n } finally {\n // 🔧 Use cleanup function from createAbortSignal\n cleanup();\n }\n }\n\n /**\n * Dispatch an action and return detailed execution results\n * \n * @param action - The action type to dispatch\n * @param payload - The action payload data\n * @param options - Optional dispatch options including result collection strategy\n * \n * @returns Promise resolving to comprehensive execution results\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n async dispatchWithResult<K extends keyof T, R = void>(\n action: K,\n payload?: T[K],\n options?: DispatchOptions\n ): Promise<ExecutionResult<R>> {\n const _startTime = Date.now();\n \n // 🔧 Improved AbortSignal handling with cleaner merge logic (same as dispatch)\n const [effectiveSignal, autoAbortController, cleanup] = this.createAbortSignal(options);\n \n if (options?.autoAbort?.onControllerCreated && autoAbortController) {\n options.autoAbort.onControllerCreated(autoAbortController);\n }\n \n // Check if dispatch is aborted before starting\n if (effectiveSignal?.aborted) {\n return {\n success: false,\n aborted: true,\n abortReason: 'Action dispatch aborted by signal',\n terminated: false,\n result: undefined as any,\n successResults: [] as any,\n results: [],\n failedResults: [],\n execution: {\n duration: 0,\n handlersExecuted: 0,\n handlersSkipped: 0,\n handlersFailed: 0,\n startTime: _startTime,\n endTime: _startTime,\n },\n handlers: [],\n errors: [],\n };\n }\n \n const pipeline = this.pipelines.get(action);\n \n if (!pipeline || pipeline.length === 0) {\n return {\n success: true,\n aborted: false,\n abortReason: undefined as string | undefined,\n terminated: false,\n result: undefined as any,\n successResults: [] as any,\n results: [],\n failedResults: [],\n execution: {\n duration: 0,\n handlersExecuted: 0,\n handlersSkipped: 0,\n handlersFailed: 0,\n startTime: _startTime,\n endTime: _startTime,\n },\n handlers: [],\n errors: [],\n };\n }\n\n // 🆕 Optimize filtering - only copy array if filtering is needed\n const filteredHandlers = options?.filter \n ? this.filterHandlers(pipeline, options.filter)\n : pipeline;\n\n // 🔧 Apply ActionGuard controls using unified method with ExecutionResult return\n const actionKey = String(action);\n const guardResult = await this.applyActionGuardControlsWithResult<R>(\n actionKey, \n filteredHandlers, \n options, \n _startTime, \n pipeline.length\n );\n if (guardResult) {\n return guardResult; // Throttled or debounced - return early with proper result\n }\n\n // Determine execution mode for this action (with option override)\n const currentExecutionMode = options?.executionMode || \n this.actionExecutionModes.get(action) || \n this.executionMode;\n\n // Create pipeline execution context\n const context: PipelineContext<T[K], R> = {\n action: String(action),\n payload: payload as T[K],\n handlers: filteredHandlers,\n aborted: false,\n abortReason: undefined as string | undefined,\n currentIndex: 0,\n jumpToPriority: undefined as number | undefined,\n executionMode: currentExecutionMode,\n \n // Result collection fields\n results: [],\n terminated: false,\n terminationResult: undefined as R | undefined,\n };\n\n let executionError: Error | undefined;\n const handlerResults: Array<{\n id: string;\n executed: boolean;\n duration: number | undefined;\n result: R | undefined;\n error: Error | undefined;\n metadata: Record<string, any> | undefined;\n }> = [];\n\n\n // Initialize handler tracking - all handlers start as not executed\n filteredHandlers.forEach(handler => {\n handlerResults.push({\n id: handler.config.id,\n executed: false,\n duration: undefined as number | undefined,\n result: undefined as R | undefined,\n error: undefined as Error | undefined,\n metadata: undefined as Record<string, any> | undefined,\n });\n });\n\n // Add abort listener if signal provided (use effectiveSignal for auto-abort)\n const abortHandler = effectiveSignal ? () => {\n context.aborted = true;\n context.abortReason = 'Action dispatch aborted by signal';\n } : undefined;\n \n if (effectiveSignal && abortHandler) {\n effectiveSignal.addEventListener('abort', abortHandler);\n }\n \n // 🔧 Initialize errors array (will be updated after pipeline execution)\n let errors: HandlerError[] = [];\n \n try {\n await this.executePipeline(context, autoAbortController, options?.autoAbort);\n \n // 🔧 Collect errors from execution context after pipeline execution\n const contextWithErrors = context as PipelineContext<any, any> & { collectedErrors?: HandlerError[] };\n errors = contextWithErrors.collectedErrors || [];\n \n // Mark executed handlers based on context.currentIndex\n // In sequential mode, handlers 0 to currentIndex were executed\n // In parallel/race mode, all handlers that didn't error were executed\n const executedCount = Math.min(context.currentIndex + (context.aborted ? 0 : 1), filteredHandlers.length);\n for (let i = 0; i < executedCount; i++) {\n const handler = filteredHandlers[i];\n if (!handler) continue;\n const handlerResult = handlerResults.find(hr => hr.id === handler.config.id);\n if (handlerResult) {\n handlerResult.executed = true;\n }\n }\n } catch (error) {\n // 🔧 Collect errors from execution context before adding pipeline error\n const contextWithErrors = context as PipelineContext<any, any> & { collectedErrors?: HandlerError[] };\n errors = contextWithErrors.collectedErrors || [];\n \n executionError = error instanceof Error ? error : new Error(String(error));\n errors.push({\n handlerId: 'pipeline',\n error: executionError,\n timestamp: Date.now(),\n severity: 'blocking'\n });\n \n // Mark executed handlers even when there's an error\n const executedCount = Math.min(context.currentIndex + 1, filteredHandlers.length);\n for (let i = 0; i < executedCount; i++) {\n const handler = filteredHandlers[i];\n if (!handler) continue;\n const handlerResult = handlerResults.find(hr => hr.id === handler.config.id);\n if (handlerResult) {\n handlerResult.executed = true;\n }\n }\n } finally {\n // 🔧 Use cleanup function from createAbortSignal\n cleanup();\n }\n\n const endTime = Date.now();\n \n // Process results based on options\n const processedResult = this.processResults(context, options?.result);\n\n // 🔧 Type safety: Separate successful results from failed ones\n const successResults = context.results.filter((result): result is R => result !== undefined);\n const failedResults = errors.map(err => ({\n handlerId: err.handlerId,\n error: err.error,\n expectedType: typeof processedResult\n }));\n\n // Build execution result with improved type safety\n const executionResult: ExecutionResult<R> = {\n success: !executionError && !context.aborted,\n aborted: context.aborted,\n abortReason: context.abortReason,\n terminated: context.terminated,\n result: processedResult,\n successResults: successResults,\n results: context.results,\n failedResults,\n execution: {\n duration: endTime - _startTime,\n handlersExecuted: filteredHandlers.length === 0 ? 0 : context.currentIndex + (context.aborted ? 0 : 1),\n handlersSkipped: Math.max(0, filteredHandlers.length - (context.currentIndex + 1)),\n handlersFailed: errors.length,\n startTime: _startTime,\n endTime,\n },\n handlers: handlerResults,\n errors: errors.map(err => ({\n handlerId: err.handlerId,\n error: err.error,\n timestamp: err.timestamp,\n severity: 'non-blocking' as const\n })),\n };\n\n /** Clean up one-time handlers after execution */\n this.cleanupOneTimeHandlers(action, context.handlers);\n\n return executionResult;\n }\n\n /**\n * 🔧 Unified method for dispatchWithResult that returns ExecutionResult on guard rejection\n */\n private async applyActionGuardControlsWithResult<R>(\n actionKey: string,\n filteredHandlers: HandlerRegistration<any, any>[],\n options: DispatchOptions | undefined,\n startTime: number,\n pipelineLength: number\n ): Promise<ExecutionResult<R> | null> {\n // Get throttle/debounce settings (same logic as above)\n let throttleMs: number | undefined;\n let debounceMs: number | undefined;\n \n if (options?.throttle !== undefined) {\n throttleMs = options.throttle;\n } else if (filteredHandlers.length > 0) {\n for (const handler of filteredHandlers) {\n if (handler.config.throttle !== undefined) {\n throttleMs = handler.config.throttle;\n break;\n }\n }\n }\n \n if (options?.debounce !== undefined) {\n debounceMs = options.debounce;\n } else if (filteredHandlers.length > 0) {\n for (const handler of filteredHandlers) {\n if (handler.config.debounce !== undefined) {\n debounceMs = handler.config.debounce;\n break;\n }\n }\n }\n \n // Apply debounce if specified\n if (debounceMs !== undefined) {\n const shouldProceed = await this.actionGuard.debounce(actionKey, debounceMs);\n if (!shouldProceed) {\n return {\n success: false,\n aborted: true,\n abortReason: 'Debounced execution',\n terminated: false,\n result: undefined as any,\n successResults: [] as any,\n results: [],\n failedResults: [],\n execution: {\n duration: Date.now() - startTime,\n handlersExecuted: 0,\n handlersSkipped: pipelineLength,\n handlersFailed: 0,\n startTime: startTime,\n endTime: Date.now(),\n },\n handlers: [],\n errors: [],\n };\n }\n }\n \n // Apply throttle if specified\n if (throttleMs !== undefined) {\n const shouldProceed = this.actionGuard.throttle(actionKey, throttleMs);\n if (!shouldProceed) {\n return {\n success: false,\n aborted: true,\n abortReason: 'Throttled execution',\n terminated: false,\n result: undefined as any,\n successResults: [] as any,\n results: [],\n failedResults: [],\n execution: {\n duration: Date.now() - startTime,\n handlersExecuted: 0,\n handlersSkipped: pipelineLength,\n handlersFailed: 0,\n startTime: startTime,\n endTime: Date.now(),\n },\n handlers: [],\n errors: [],\n };\n }\n }\n\n return null; // No guard intervention, proceed with execution\n }\n\n /**\n * 🔧 Calculate optimal cache size based on current handler count\n * Note: This caches handler SELECTION metadata only, never execution results\n */\n private get filterCacheMaxSize(): number {\n const totalHandlers = Array.from(this.pipelines.values())\n .reduce((sum, pipeline) => sum + pipeline.length, 0);\n \n // Handler count × 10 filter combinations per handler (cache explosion prevention)\n return totalHandlers * 10 || 100; // Fallback to 100 if no handlers\n }\n\n /**\n * 🔧 Generate cache key for filter options\n */\n private generateFilterCacheKey(filterOptions?: DispatchOptions['filter']): string {\n if (!filterOptions) {\n return 'no-filter';\n }\n \n // Create deterministic cache key from filter options\n const key = [\n filterOptions.handlerIds?.sort().join(',') || 'none',\n filterOptions.excludeHandlerIds?.sort().join(',') || 'none',\n filterOptions.priority?.min?.toString() || 'none',\n filterOptions.priority?.max?.toString() || 'none',\n filterOptions.custom ? 'custom' : 'none'\n ].join('|');\n \n return key;\n }\n\n /**\n * 🔧 Clear filter cache when pipelines change\n */\n private invalidateFilterCache(): void {\n this.filterCache.clear();\n }\n\n /**\n * 🔧 Create or reuse PipelineController from pool for better performance\n */\n private getControllerFromPool<K extends keyof T>(\n context: PipelineContext<T[K], any>, \n autoAbortController?: AbortController,\n autoAbortOptions?: { allowHandlerAbort?: boolean }\n ): PipelineController<T[K], any> {\n // Try to reuse from pool\n let controller = this.controllerPool.pop();\n \n if (!controller) {\n // Create new controller if pool is empty\n controller = {} as PipelineController<T[K], any>;\n }\n\n // Configure/reset the controller for current context\n controller.abort = (reason?: string) => {\n context.aborted = true;\n context.abortReason = reason;\n \n // Auto-abort: Handler can trigger pipeline abort if enabled\n if (autoAbortController && autoAbortOptions?.allowHandlerAbort) {\n autoAbortController.abort(reason);\n }\n };\n\n controller.modifyPayload = (modifier: (payload: T[K]) => T[K]) => {\n context.payload = modifier(context.payload);\n };\n\n controller.getPayload = () => context.payload;\n\n controller.jumpToPriority = (priority: number) => {\n context.jumpToPriority = priority;\n };\n\n controller.return = (result: any) => {\n context.terminated = true;\n context.terminationResult = result;\n };\n\n controller.setResult = (result: any) => {\n context.results.push(result);\n };\n\n controller.getResults = () => {\n return [...context.results];\n };\n\n controller.mergeResult = (merger: (previousResults: any[], currentResult: any) => any) => {\n const currentResult = context.results[context.results.length - 1];\n const previousResults = context.results.slice(0, -1);\n const mergedResult = merger(previousResults, currentResult);\n context.results[context.results.length - 1] = mergedResult;\n };\n\n return controller;\n }\n\n /**\n * 🔧 Return controller to pool for reuse\n */\n private returnControllerToPool(controller: PipelineController<any, any>): void {\n // Only add to pool if we haven't exceeded max size\n if (this.controllerPool.length < this.maxControllerPoolSize) {\n this.controllerPool.push(controller);\n }\n }\n\n private filterHandlers(\n handlers: HandlerRegistration<any, any>[],\n filterOptions?: DispatchOptions['filter']\n ): HandlerRegistration<any, any>[] {\n if (!filterOptions) {\n return handlers;\n }\n\n // 🔧 Performance optimization: Use cache for filter results\n const cacheKey = this.generateFilterCacheKey(filterOptions);\n \n // Skip cache for custom filter functions (can't be cached safely)\n if (!filterOptions.custom) {\n const cached = this.filterCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n }\n\n // 🆕 Use filter method directly (already returns new array)\n const filtered = handlers.filter(registration => {\n const config = registration.config;\n\n // 🆕 Short-circuit evaluation for performance\n if (filterOptions.handlerIds?.length && \n !filterOptions.handlerIds.includes(config.id)) {\n return false;\n }\n\n if (filterOptions.excludeHandlerIds?.length && \n filterOptions.excludeHandlerIds.includes(config.id)) {\n return false;\n }\n\n // 🆕 Enhanced priority filtering\n if (filterOptions.priority) {\n if (filterOptions.priority.min !== undefined && \n config.priority < filterOptions.priority.min) {\n return false;\n }\n if (filterOptions.priority.max !== undefined && \n config.priority > filterOptions.priority.max) {\n return false;\n }\n }\n\n if (filterOptions.custom && !filterOptions.custom(config)) {\n return false;\n }\n\n return true;\n });\n\n // 🔧 Cache the result if no custom filter with dynamic size management\n if (!filterOptions.custom) {\n // 🔧 Dynamic cache size prevents explosion while allowing growth\n const currentMaxSize = this.filterCacheMaxSize;\n \n // Only evict if we exceed the current dynamic limit\n if (this.filterCache.size >= currentMaxSize) {\n // Remove oldest entries (LRU eviction)\n const oldestKey = this.filterCache.keys().next().value;\n if (oldestKey !== undefined) {\n this.filterCache.delete(oldestKey);\n }\n }\n \n this.filterCache.set(cacheKey, filtered);\n }\n\n return filtered;\n }\n\n private processResults<R>(\n context: PipelineContext<any, R>,\n resultOptions?: DispatchOptions['result']\n ): R | undefined {\n if (!resultOptions || !resultOptions.collect) {\n return undefined;\n }\n\n const results = context.results;\n \n // Handle termination result\n if (context.terminated && context.terminationResult !== undefined) {\n return context.terminationResult;\n }\n\n // Apply maxResults limit\n const limitedResults = resultOptions.maxResults \n ? results.slice(0, resultOptions.maxResults)\n : results;\n\n if (limitedResults.length === 0) {\n return undefined;\n }\n\n // Process results based on strategy\n switch (resultOptions.strategy) {\n case 'first':\n return limitedResults[0];\n case 'last':\n return limitedResults[limitedResults.length - 1];\n case 'all':\n return limitedResults as unknown as R;\n case 'merge':\n if (resultOptions.merger) {\n return resultOptions.merger(limitedResults);\n }\n // Default merge: return last result\n return limitedResults[limitedResults.length - 1];\n case 'custom':\n if (resultOptions.merger) {\n return resultOptions.merger(limitedResults);\n }\n throw new Error('Custom result strategy requires a merger function');\n default:\n // Default: return all results\n return limitedResults as unknown as R;\n }\n }\n\n private async executePipeline<K extends keyof T>(\n context: PipelineContext<T[K], any>, \n autoAbortController?: AbortController,\n autoAbortOptions?: { allowHandlerAbort?: boolean }\n ): Promise<void> {\n const createController = (_registration: HandlerRegistration<T[K], any>, _index: number): PipelineController<T[K], any> => {\n return this.getControllerFromPool(context, autoAbortController, autoAbortOptions);\n };\n\n switch (context.executionMode) {\n case 'sequential':\n await executeSequential<T[K], any>(context, createController);\n break;\n case 'parallel':\n await executeParallel<T[K], any>(context, createController);\n break;\n case 'race':\n await executeRace<T[K], any>(context, createController);\n break;\n default:\n throw new Error(`Unknown execution mode: ${context.executionMode}`);\n }\n\n this.cleanupOneTimeHandlers(context.action as K, context.handlers);\n }\n\n private cleanupOneTimeHandlers<K extends keyof T>(action: K, executedHandlers: HandlerRegistration<any, any>[]): void {\n const pipeline = this.pipelines.get(action);\n if (!pipeline) return;\n\n const oneTimeHandlers = executedHandlers.filter(reg => reg.config.once);\n if (oneTimeHandlers.length === 0) return;\n\n oneTimeHandlers.forEach(registration => {\n const index = pipeline.findIndex(reg => reg.id === registration.id);\n if (index !== -1) {\n pipeline.splice(index, 1);\n \n if (this.registryConfig?.debug && process.env.NODE_ENV === 'development') {\n console.log(`🎯 One-time handler removed: ${String(action)}`, {\n handlerId: registration.id,\n remainingHandlers: pipeline.length,\n registry: this.name\n });\n }\n }\n });\n }\n\n\n /**\n * Get the number of registered handlers for an action\n * \n * @param action - The action type to count handlers for\n * \n * @returns Number of registered handlers\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n getHandlerCount<K extends keyof T>(action: K): number {\n const pipeline = this.pipelines.get(action);\n return pipeline ? pipeline.length : 0;\n }\n\n /**\n * Check if an action has any registered handlers\n * \n * @param action - The action type to check\n * \n * @returns True if action has handlers, false otherwise\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n hasHandlers<K extends keyof T>(action: K): boolean {\n return this.getHandlerCount(action) > 0;\n }\n\n /**\n * Get all registered action types\n * \n * @returns Array of all registered action types\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n getRegisteredActions(): (keyof T)[] {\n return Array.from(this.pipelines.keys());\n }\n\n /**\n * Remove all handlers for a specific action\n * \n * @param action - The action type to clear handlers for\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n clearAction<K extends keyof T>(action: K): void {\n this.pipelines.delete(action);\n // 🔧 Invalidate filter cache when pipeline changes\n this.invalidateFilterCache();\n }\n\n /**\n * Remove all handlers for all actions\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n clearAll(): void {\n this.pipelines.clear();\n // 🔧 Invalidate filter cache when pipeline changes\n this.invalidateFilterCache();\n }\n\n /**\n * Get the name of this action register\n * \n * @returns The register name\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n getName(): string {\n return this.name;\n }\n\n /**\n * Get comprehensive registry information (similar to DeclarativeStoreRegistry pattern)\n * \n * @returns Registry information including actions, handlers, and execution modes\n */\n getRegistryInfo(): ActionRegistryInfo<T> {\n const totalHandlers = Array.from(this.pipelines.values()).reduce(\n (total, pipeline) => total + pipeline.length, \n 0\n );\n \n return {\n name: this.name,\n totalActions: this.pipelines.size,\n totalHandlers,\n registeredActions: Array.from(this.pipelines.keys()),\n actionExecutionModes: new Map(this.actionExecutionModes),\n defaultExecutionMode: this.executionMode,\n };\n }\n\n /**\n * Get detailed statistics for a specific action\n * \n * @param action Action name to get statistics for\n * @returns Detailed handler statistics\n */\n getActionStats<K extends keyof T>(action: K): ActionHandlerStats<T> | null {\n const pipeline = this.pipelines.get(action);\n if (!pipeline) {\n return null;\n }\n\n // Group handlers by priority\n const priorityMap = new Map<number, typeof pipeline>();\n pipeline.forEach(handler => {\n if (!priorityMap.has(handler.config.priority)) {\n priorityMap.set(handler.config.priority, []);\n }\n priorityMap.get(handler.config.priority)!.push(handler);\n });\n\n const handlersByPriority = Array.from(priorityMap.entries())\n .sort(([a], [b]) => b - a) // Sort by priority (highest first)\n .map(([priority, handlers]) => ({\n priority,\n handlers: handlers.map(h => ({\n id: h.config.id,\n }))\n }));\n\n // Execution statistics are no longer tracked\n const executionStats = undefined;\n\n return {\n action,\n handlerCount: pipeline.length,\n totalHandlers: pipeline.length,\n handlersByPriority,\n executionStats,\n };\n }\n\n /**\n * Get statistics for all registered actions\n * \n * @returns Array of statistics for all actions\n */\n getAllActionStats(): Array<ActionHandlerStats<T>> {\n return Array.from(this.pipelines.keys())\n .map(action => this.getActionStats(action))\n .filter((stats): stats is ActionHandlerStats<T> => stats !== null);\n }\n\n\n /**\n * Set global execution mode for all actions\n * \n * @param mode Execution mode to set\n */\n setExecutionMode(mode: ExecutionMode): void {\n this.executionMode = mode;\n \n if (this.registryConfig?.debug && process.env.NODE_ENV === 'development') {\n console.log(`🎯 Global execution mode set to: ${mode}`);\n }\n }\n\n /**\n * Set execution mode for a specific action\n * \n * @param action Action name\n * @param mode Execution mode to set\n */\n setActionExecutionMode<K extends keyof T>(action: K, mode: ExecutionMode): void {\n this.actionExecutionModes.set(action, mode);\n \n if (this.registryConfig?.debug && process.env.NODE_ENV === 'development') {\n console.log(`🎯 Execution mode set for action '${String(action)}': ${mode}`);\n }\n }\n\n /**\n * Get execution mode for a specific action\n * \n * @param action Action name\n * @returns Execution mode for the action, or default if not set\n */\n getActionExecutionMode<K extends keyof T>(action: K): ExecutionMode {\n return this.actionExecutionModes.get(action) || this.executionMode;\n }\n\n /**\n * Remove execution mode override for a specific action\n * \n * @param action Action name\n */\n removeActionExecutionMode<K extends keyof T>(action: K): void {\n this.actionExecutionModes.delete(action);\n \n if (this.registryConfig?.debug && process.env.NODE_ENV === 'development') {\n console.log(`🎯 Execution mode reset for action '${String(action)}' to default: ${this.executionMode}`);\n }\n }\n\n\n /**\n * Get registry configuration (for debugging and inspection)\n * \n * @returns Current registry configuration\n */\n getRegistryConfig(): ActionRegisterConfig['registry'] {\n return this.registryConfig;\n }\n\n /**\n * Check if registry has debug mode enabled\n * \n * @returns Whether debug mode is enabled\n */\n isDebugEnabled(): boolean {\n return this.isDebugMode;\n }\n\n /**\n * Creates a consistent unregister function for a handler\n * \n * @param action - Action key\n * @param handlerId - Handler identifier\n * @param registration - Handler registration object\n * @returns Unregister function\n * @private\n */\n private createUnregisterFunction<K extends keyof T>(\n action: K,\n handlerId: string,\n registration: HandlerRegistration<any, any>\n ): UnregisterFunction {\n return () => {\n const pipeline = this.pipelines.get(action);\n if (!pipeline) return;\n \n const index = pipeline.findIndex(reg => reg.id === handlerId && reg === registration);\n if (index !== -1) {\n pipeline.splice(index, 1);\n this.invalidateFilterCache();\n this.unregisterFunctions.delete(handlerId);\n \n // Execute cleanup function if available\n if (registration.config.cleanup && typeof registration.config.cleanup === 'function') {\n try {\n registration.config.cleanup();\n } catch (cleanupError) {\n this.log(`Cleanup error during unregister: ${String(action)}`, cleanupError, 'warn');\n }\n }\n \n this.log(`Handler unregistered: ${String(action)}`, {\n handlerId,\n remainingHandlers: pipeline.length\n });\n }\n };\n }\n\n /**\n * Gets the total count of registered unregister functions\n * \n * @returns Number of unregister functions\n * @public\n */\n getUnregisterFunctionCount(): number {\n return this.unregisterFunctions.size;\n }\n \n /**\n * Checks if an unregister function exists for the given handler ID\n * \n * @param handlerId - Handler identifier to check\n * @returns True if unregister function exists\n * @public\n */\n hasUnregisterFunction(handlerId: string): boolean {\n return this.unregisterFunctions.has(handlerId);\n }\n\n /**\n * 🆕 Destroy method for comprehensive cleanup\n * \n * Cleans up all internal resources including pipelines, guards, queues, and statistics.\n * Should be called when the ActionRegister is no longer needed to prevent memory leaks.\n * \n * @public\n */\n destroy(): void {\n // Execute all unregister functions to properly clean up handlers\n this.unregisterFunctions.forEach(unregister => {\n try {\n unregister();\n } catch (error) {\n this.log('Error during unregister in destroy', error, 'error');\n }\n });\n \n this.unregisterFunctions.clear();\n \n // Clean up all pipelines\n this.pipelines.clear();\n \n // Clean up guard system\n this.actionGuard.destroy();\n \n // Clean up queues if they exist\n this.dispatchQueue?.clear?.();\n \n this.actionExecutionModes.clear();\n \n // 🔧 Clean up performance caches\n this.filterCache.clear();\n \n // 🔧 Clean up controller pool\n this.controllerPool.length = 0;\n \n this.log('ActionRegister destroyed');\n }\n}","/**\n * @fileoverview React integration helpers for ActionRegister\n * \n * Provides React-specific utilities and hooks for seamless integration\n * with React components and lifecycle management.\n * \n * Note: This file provides utilities for React integration but does not\n * have direct React dependencies. Import React types externally when used.\n */\n\nimport type { \n ActionPayloadMap, \n ActionHandler, \n HandlerConfig,\n UnregisterFunction\n} from './types.js';\nimport type { ActionRegister } from './ActionRegister.js';\n\n/**\n * 🔧 Create action handler registration configuration for React components\n * \n * Creates a configuration object that can be used with React's useEffect to properly\n * register and unregister action handlers with lifecycle management and cleanup.\n * This is NOT a hook - it's a factory function for React hook integration.\n * \n * @template T - ActionPayloadMap type\n * @template K - Action key type\n * \n * @param registry - ActionRegister instance\n * @param action - Action name to register handler for\n * @param handler - Handler function (should be memoized with useCallback)\n * @param config - Handler configuration\n * \n * @returns Configuration object with register/unregister functions\n * \n * @example Basic Usage with useEffect\n * ```tsx\n * import { useCallback, useEffect } from 'react';\n * import { createActionHandler } from '@context-action/core/react-helpers';\n * \n * function MyComponent() {\n * const registry = useActionRegister();\n * \n * const handleUserUpdate = useCallback(async (payload, controller) => {\n * // Handler logic here\n * }, []);\n * \n * useEffect(() => {\n * const { register, unregister } = createActionHandler(\n * registry,\n * 'updateUser',\n * handleUserUpdate,\n * { priority: 10 }\n * );\n * \n * const cleanup = register();\n * return () => {\n * cleanup();\n * unregister();\n * };\n * }, [registry, handleUserUpdate]);\n * }\n * ```\n * \n * @example With Automatic Cleanup\n * ```tsx\n * const [userId, setUserId] = useState('123');\n * \n * const handleUserUpdate = useCallback(async (payload, controller) => {\n * console.log('Updating user:', userId, payload);\n * }, [userId]);\n * \n * useEffect(() => {\n * const handlerManager = createActionHandler(\n * registry,\n * 'updateUser',\n * handleUserUpdate,\n * { priority: 10 }\n * );\n * \n * // Simplified registration with automatic cleanup\n * return handlerManager.registerWithCleanup();\n * }, [registry, handleUserUpdate, userId]);\n * ```\n * \n * @public\n */\nexport function createActionHandler<T extends ActionPayloadMap, K extends keyof T>(\n registry: ActionRegister<T>,\n action: K,\n handler: ActionHandler<T[K]>,\n config?: HandlerConfig\n): {\n register: () => UnregisterFunction;\n unregister: () => void;\n registerWithCleanup: () => () => void;\n config: Required<HandlerConfig>;\n} {\n // Inline React-optimized handler configuration\n const timestamp = Date.now();\n const random = Math.random().toString(36).substr(2, 5);\n \n const finalConfig: Required<HandlerConfig> = {\n priority: config?.priority ?? 0,\n id: config?.id || `react_${String(action)}_${timestamp}_${random}`,\n blocking: config?.blocking ?? false,\n once: config?.once ?? false,\n debounce: config?.debounce ?? undefined,\n throttle: config?.throttle ?? undefined,\n // React-optimized defaults\n replaceExisting: true, // Always replace in React (handles HMR/remounting)\n } as Required<HandlerConfig>;\n let currentUnregister: UnregisterFunction | undefined;\n let isRegistered = false;\n \n return {\n /**\n * Register the handler and return cleanup function\n */\n register(): UnregisterFunction {\n if (isRegistered && currentUnregister) {\n // Clean up previous registration\n currentUnregister();\n }\n \n currentUnregister = registry.register(action, handler, finalConfig);\n isRegistered = true;\n \n return currentUnregister;\n },\n \n /**\n * Unregister the handler if currently registered\n */\n unregister(): void {\n if (isRegistered && currentUnregister) {\n currentUnregister();\n currentUnregister = undefined;\n isRegistered = false;\n }\n },\n \n /**\n * Register and return cleanup function (React useEffect pattern)\n */\n registerWithCleanup(): () => void {\n const unregisterFn = this.register();\n \n return () => {\n unregisterFn();\n this.unregister();\n };\n },\n \n config: finalConfig\n };\n}\n\n\n/**\n * 🆕 React development utilities\n * \n * Provides debugging and development helpers specifically for React environments.\n */\nexport const ReactDevUtils = {\n /**\n * Enable detailed React integration debugging\n */\n enableDebugMode(): void {\n if (typeof window !== 'undefined') {\n (window as any).__CONTEXT_ACTION_REACT_DEBUG__ = true;\n }\n },\n\n /**\n * Disable React integration debugging\n */\n disableDebugMode(): void {\n if (typeof window !== 'undefined') {\n (window as any).__CONTEXT_ACTION_REACT_DEBUG__ = false;\n }\n },\n\n /**\n * Check if React debug mode is enabled\n */\n isDebugMode(): boolean {\n return typeof window !== 'undefined' && \n Boolean((window as any).__CONTEXT_ACTION_REACT_DEBUG__);\n },\n\n /**\n * Log React-specific debugging information\n */\n log(component: string, action: string, message: string, data?: any): void {\n if (this.isDebugMode()) {\n console.log(`🎯 [React-ActionRegister] [${component}] ${action}: ${message}`, data || '');\n }\n },\n\n /**\n * Get React integration statistics\n */\n getStats(registry: ActionRegister<any>): {\n totalHandlers: number;\n reactHandlers: number;\n registryInfo: ReturnType<ActionRegister<any>['getRegistryInfo']>;\n } {\n const registryInfo = registry.getRegistryInfo();\n \n // Count React handlers (handlers with 'react' in their ID)\n let reactHandlers = 0;\n registry.getRegisteredActions().forEach((action: keyof any) => {\n const stats = registry.getActionStats(action);\n if (stats) {\n stats.handlersByPriority.forEach((priorityGroup: any) => {\n priorityGroup.handlers.forEach((handler: any) => {\n if (handler.id.includes('react')) {\n reactHandlers++;\n }\n });\n });\n }\n });\n\n return {\n totalHandlers: registryInfo.totalHandlers,\n reactHandlers,\n registryInfo\n };\n }\n};\n\n/**\n * 🆕 React Error Boundary integration\n * \n * Utilities for integrating ActionRegister errors with React Error Boundaries.\n */\nexport class ReactActionError extends Error {\n public readonly action: string;\n public readonly payload?: any;\n public readonly handlerId: string | undefined;\n public readonly timestamp: number;\n\n constructor(\n message: string,\n action: string,\n payload?: any,\n handlerId: string | undefined = undefined,\n originalError?: Error\n ) {\n super(message);\n this.name = 'ReactActionError';\n this.action = action;\n this.payload = payload;\n this.handlerId = handlerId;\n this.timestamp = Date.now();\n\n // Maintain original error stack if available\n if (originalError && originalError.stack) {\n this.stack = originalError.stack;\n }\n }\n\n /**\n * Create a React Error Boundary compatible error\n */\n static fromActionError(\n originalError: Error,\n action: string,\n payload?: any,\n handlerId?: string\n ): ReactActionError {\n return new ReactActionError(\n `Action '${action}' failed: ${originalError.message}`,\n action,\n payload,\n handlerId,\n originalError\n );\n }\n}\n\n/**\n * 🆕 Type guard for React Action Errors\n * \n * @param error - Error to check\n * @returns True if error is a ReactActionError\n */\nexport function isReactActionError(error: any): error is ReactActionError {\n return error instanceof ReactActionError;\n}"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["nonBlockingPromises: Array<Promise<any>>","errors: HandlerError[]","error: any","handlerErrors: HandlerError[]","handlerResult: R | undefined","keysToDelete: string[]","name: string","queuedOperation: QueuedOperation<T>","signals: AbortSignal[]","cleanups: (() => void)[]","autoAbortController: AbortController | undefined","effectiveSignal: AbortSignal","registration: HandlerRegistration<T[K], R>","throttleMs: number | undefined","debounceMs: number | undefined","context: PipelineContext<T[K], any>","context: PipelineContext<T[K], R>","executionError: Error | undefined","handlerResults: Array<{\n id: string;\n executed: boolean;\n duration: number | undefined;\n result: R | undefined;\n error: Error | undefined;\n metadata: Record<string, any> | undefined;\n }>","errors: HandlerError[]","executionResult: ExecutionResult<R>","parts: string[]","finalConfig: Required<HandlerConfig>","currentUnregister: UnregisterFunction | undefined"],"sources":["../src/execution-modes.ts","../src/action-guard.ts","../src/concurrency/OperationQueue.ts","../src/ActionRegister.ts","../src/react-helpers.ts"],"sourcesContent":["/**\n * @fileoverview Execution mode implementations for ActionRegister\n * \n * Provides three different execution strategies for action handler pipelines:\n * - Sequential: Execute handlers one after another in priority order\n * - Parallel: Execute all handlers simultaneously\n * - Race: First handler to complete wins, others are cancelled\n */\n\nimport type { \n HandlerRegistration, \n PipelineContext, \n PipelineController,\n HandlerError\n} from './types.js';\n\n/**\n * Create standardized error handling for handlers\n * \n * @param error - The error that occurred\n * @param registration - The handler registration that failed\n * @returns Standardized HandlerError object\n * \n * @internal\n */\nfunction handleExecutionError<T, R>(\n error: any,\n registration: HandlerRegistration<T, R>\n): HandlerError {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n return {\n handlerId: registration.id,\n error: errorObj,\n timestamp: Date.now(),\n severity: registration.config.blocking ? 'blocking' : 'non-blocking'\n };\n}\n\n/**\n * Execute handlers in sequential mode (one after another)\n * \n * Executes action handlers one at a time in priority order (highest first).\n * Supports both blocking and non-blocking handlers, with proper abort and\n * termination handling. Handlers can modify payload for subsequent handlers\n * and jump to different priority levels.\n * \n * @template T - The payload type for the action\n * @template R - The result type for handlers\n * \n * @param context - Pipeline execution context containing handlers and state\n * @param createController - Factory function for creating pipeline controllers\n * \n * @throws {Error} When a blocking handler fails\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/dispatch-patterns\n * \n * @public\n */\nexport async function executeSequential<T, R = void>(\n context: PipelineContext<T, R>,\n createController: (registration: HandlerRegistration<T, R>, index: number) => PipelineController<T, R>\n): Promise<void> {\n\n let i = 0;\n const nonBlockingPromises: Array<Promise<any>> = [];\n const errors: HandlerError[] = [];\n \n while (i < context.handlers.length) {\n // Check for abort or termination\n if (context.aborted || context.terminated) {\n break;\n }\n\n const registration = context.handlers[i];\n if (!registration) {\n continue; // Skip if handler not found\n }\n context.currentIndex = i;\n const controller = createController(registration, i);\n\n try {\n // Check for abort before executing handler\n if (context.aborted) {\n break;\n }\n \n const result = registration.handler(context.payload, controller);\n\n if (registration.config.blocking) {\n // 🆕 Blocking handlers: Wait for completion (sync or async)\n const handlerResult = result instanceof Promise ? await result : result;\n if (handlerResult !== undefined && !context.terminated) {\n context.results.push(handlerResult as R);\n }\n } else {\n // 🆕 Non-blocking handlers: Handle differently for sync vs async\n if (result instanceof Promise) {\n // Non-blocking async: Track promise with error handling\n const promiseWithErrorHandling = result\n .then(asyncResult => {\n if (asyncResult !== undefined && !context.terminated) {\n context.results.push(asyncResult as R);\n }\n return asyncResult;\n })\n .catch(error => {\n // 🆕 Non-blocking async handler error collection\n const handlerError = handleExecutionError(error, registration);\n errors.push({\n handlerId: handlerError.handlerId,\n error: handlerError.error,\n timestamp: handlerError.timestamp,\n severity: 'non-blocking'\n });\n return undefined; // Return undefined for failed non-blocking handlers\n });\n \n nonBlockingPromises.push(promiseWithErrorHandling);\n } else if (result !== undefined && !context.terminated) {\n // Non-blocking sync: Immediately collect result\n context.results.push(result as R);\n }\n }\n\n /** Check if pipeline was terminated by controller.return() */\n if (context.terminated) {\n break;\n }\n\n /** Handle jump to priority AFTER handler execution */\n if (context.jumpToPriority !== undefined) {\n const jumpIndex = context.handlers.findIndex(\n handler => handler.config.priority === context.jumpToPriority\n );\n \n if (jumpIndex !== -1) {\n i = jumpIndex;\n context.jumpToPriority = undefined;\n continue;\n } else {\n context.jumpToPriority = undefined;\n i++;\n }\n } else {\n i++;\n }\n\n } catch (error: any) {\n // 🆕 Maintain backward compatibility: any sync error fails pipeline\n const handlerError = handleExecutionError(error, registration);\n \n // For backward compatibility: all synchronous errors fail the pipeline\n throw handlerError.error;\n }\n }\n \n // 🆕 Wait for all non-blocking promises with error collection\n if (nonBlockingPromises.length > 0) {\n await Promise.allSettled(nonBlockingPromises);\n }\n\n // 🔧 Store collected errors in context for ExecutionResult with proper typing\n if (errors.length > 0) {\n // Convert to proper HandlerError format\n const handlerErrors: HandlerError[] = errors.map(err => ({\n handlerId: err.handlerId,\n error: err.error,\n timestamp: err.timestamp,\n severity: 'non-blocking' as const\n }));\n \n // Add to context with proper typing\n (context as PipelineContext<any, any> & { collectedErrors?: HandlerError[] }).collectedErrors = handlerErrors;\n }\n}\n\n/**\n * Execute handlers in parallel mode (all at once)\n * \n * Executes all qualifying action handlers simultaneously using Promise.allSettled.\n * Supports both blocking and non-blocking handlers. Blocking handlers can still\n * fail the entire pipeline if they throw errors.\n * \n * @template T - The payload type for the action\n * @template R - The result type for handlers\n * \n * @param context - Pipeline execution context containing handlers and state\n * @param createController - Factory function for creating pipeline controllers\n * \n * @throws {Error} When any blocking handler fails\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/dispatch-patterns#parallel-execution\n * \n * @public\n */\nexport async function executeParallel<T, R = void>(\n context: PipelineContext<T, R>,\n createController: (registration: HandlerRegistration<T, R>, index: number) => PipelineController<T, R>\n): Promise<void> {\n\n /** All handlers are runnable */\n const runnableHandlers = context.handlers;\n\n /** Create promises for all handlers */\n const handlerPromises = runnableHandlers.map(async (registration, _index) => {\n const controller = createController(registration, _index);\n \n try {\n const result = registration.handler(context.payload, controller);\n \n let handlerResult: R | undefined;\n if (result instanceof Promise) {\n const resolved = await result;\n handlerResult = resolved as R | undefined;\n } else {\n handlerResult = result as R | undefined;\n }\n \n /** Collect result if handler returned something and pipeline wasn't terminated */\n if (handlerResult !== undefined && !context.terminated) {\n context.results.push(handlerResult);\n }\n \n return { \n success: true, \n handlerId: registration.id, \n result: handlerResult,\n terminated: context.terminated \n };\n \n } catch (error: any) {\n // 🆕 Consistent error object creation\n const handlerError = handleExecutionError(error, registration);\n \n if (handlerError.severity === 'blocking') {\n throw handlerError.error;\n }\n \n return { success: false, handlerId: registration.id, error: handlerError.error };\n }\n });\n\n /** Wait for all handlers to complete */\n const results = await Promise.allSettled(handlerPromises);\n \n /** Check for any rejected blocking handlers */\n const failures = results.filter((result, index) => {\n if (result.status === 'rejected') {\n const registration = runnableHandlers[index];\n return registration?.config.blocking ?? false;\n }\n return false;\n });\n\n if (failures.length > 0) {\n const firstFailure = failures[0] as PromiseRejectedResult;\n throw firstFailure.reason;\n }\n\n /** Check if any handler terminated the pipeline */\n const terminatedResults = results.filter(result => \n result.status === 'fulfilled' && result.value.terminated\n );\n \n if (terminatedResults.length > 0) {\n context.terminated = true;\n // In parallel mode, we can't determine which handler's termination result to use,\n // so we use the first one that terminated\n const firstTerminated = terminatedResults[0] as PromiseFulfilledResult<any>;\n context.terminationResult = firstTerminated.value.result;\n }\n}\n\n/**\n * Execute handlers in race mode (first to complete wins)\n * \n * Executes all qualifying handlers simultaneously using Promise.race, where\n * the first handler to complete determines the pipeline result. Other handlers\n * are effectively cancelled. Useful for scenarios where you want the fastest\n * response from multiple equivalent handlers.\n * \n * @template T - The payload type for the action\n * @template R - The result type for handlers\n * \n * @param context - Pipeline execution context containing handlers and state\n * @param createController - Factory function for creating pipeline controllers\n * \n * @throws {Error} When the winning handler fails and is blocking\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/dispatch-patterns#race-execution\n * \n * @public\n */\nexport async function executeRace<T, R = void>(\n context: PipelineContext<T, R>,\n createController: (registration: HandlerRegistration<T, R>, index: number) => PipelineController<T, R>\n): Promise<void> {\n\n /** All handlers are runnable */\n const runnableHandlers = context.handlers;\n\n if (runnableHandlers.length === 0) {\n return;\n }\n\n /** Create promises for all handlers */\n const handlerPromises = runnableHandlers.map(async (registration, _index) => {\n const controller = createController(registration, _index);\n \n try {\n const result = registration.handler(context.payload, controller);\n \n let handlerResult: R | undefined;\n if (result instanceof Promise) {\n const resolved = await result;\n handlerResult = resolved as R | undefined;\n } else {\n handlerResult = result as R | undefined;\n }\n \n return { \n success: true, \n handlerId: registration.id, \n registration,\n result: handlerResult,\n terminated: context.terminated\n };\n \n } catch (error: any) {\n // 🆕 Consistent error object creation\n const handlerError = handleExecutionError(error, registration);\n return { success: false, handlerId: registration.id, error: handlerError.error, registration };\n }\n });\n\n /** Race all handlers */\n const winner = await Promise.race(handlerPromises);\n\n /** If the winner failed and was blocking, throw the error */\n if (!winner.success && winner.registration?.config.blocking) {\n throw winner.error;\n }\n\n /** Collect result from the winning handler */\n if (winner.success && winner.result !== undefined) {\n context.results.push(winner.result);\n }\n\n /** Check if the winning handler terminated the pipeline */\n if (winner.success && winner.terminated) {\n context.terminated = true;\n context.terminationResult = winner.result;\n }\n}","/**\n * @fileoverview Action Guard system for debouncing, throttling and blocking\n * \n * Provides rate limiting and user experience optimization for actions through\n * debouncing (wait for pause) and throttling (limit frequency) mechanisms.\n * Used internally by ActionRegister to control action execution timing.\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/\n */\n\n\n/**\n * Action guard state tracking for debouncing and throttling\n * \n * Tracks timing and execution state for action execution control.\n * Maintains separate state for each action to enable independent\n * rate limiting per action type.\n * \n * @internal\n */\ninterface GuardState {\n /** Timestamp of last successful execution for throttling calculations */\n lastExecuted: number;\n \n /** Active debounce timer - cleared when new debounce requests arrive */\n debounceTimer: NodeJS.Timeout | undefined;\n \n /** Active throttle timer - tracks when throttle period will end */\n throttleTimer: NodeJS.Timeout | undefined;\n \n /** Flag indicating if action is currently in throttled state */\n isThrottled: boolean;\n \n /** Current debounce promise - reused for concurrent calls */\n debouncePromise: Promise<boolean> | undefined;\n \n /** Resolve function for current debounce promise */\n debounceResolve: ((value: boolean) => void) | undefined;\n}\n\n/**\n * Action Guard system for managing action execution timing\n * \n * Provides performance optimization and user experience enhancement through\n * debouncing and throttling mechanisms. Debouncing waits for a pause in calls\n * before executing, while throttling limits execution frequency.\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @example Manual Usage (Advanced)\n * ```typescript\n * const guard = new ActionGuard()\n * \n * // Manual debouncing\n * if (await guard.debounce('search', 300)) {\n * performSearch() // Only executes after 300ms pause\n * }\n * \n * // Manual throttling\n * if (guard.throttle('scroll', 100)) {\n * updateUI() // Max once per 100ms\n * }\n * ```\n * \n * @internal\n */\nexport class ActionGuard {\n private guards = new Map<string, GuardState>();\n private cleanupInterval: NodeJS.Timeout | undefined;\n private readonly maxIdleTime: number = 60000; // 1 minute\n private readonly cleanupIntervalMs: number = 30000; // 30 seconds\n\n constructor(autoCleanup: boolean = true) {\n if (autoCleanup) {\n this.startAutoCleanup();\n }\n }\n\n /**\n * Start automatic cleanup of idle guard states\n * \n * @internal\n */\n private startAutoCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n const keysToDelete: string[] = [];\n \n // Collect keys to delete (avoid modifying map during iteration)\n this.guards.forEach((state, key) => {\n const isIdle = now - state.lastExecuted > this.maxIdleTime;\n const hasActiveTimers = state.debounceTimer || state.throttleTimer;\n \n if (isIdle && !hasActiveTimers) {\n keysToDelete.push(key);\n }\n });\n \n // Batch delete idle guards\n if (keysToDelete.length > 0) {\n keysToDelete.forEach(key => this.guards.delete(key));\n // Optional debug logging for cleanup\n if (typeof process !== 'undefined' && process.env?.DEBUG_CONTEXT_ACTION) {\n console.debug(`[ActionGuard] Cleaned up ${keysToDelete.length} idle guards`);\n }\n }\n }, this.cleanupIntervalMs);\n }\n\n /**\n * Apply debouncing to an action\n * \n * Debouncing waits for a specified delay after the last call before allowing\n * execution. Each new call resets the timer. Useful for search inputs, resize\n * handlers, and other high-frequency user interactions.\n * \n * @param actionKey - Unique identifier for the action being debounced\n * @param debounceMs - Delay in milliseconds to wait after the last call\n * \n * @returns Promise resolving to true if execution should proceed, false if cancelled\n * \n * @example Search Input Debouncing\n * ```typescript\n * // Only search after user stops typing for 300ms\n * if (await guard.debounce('userSearch', 300)) {\n * performSearch(query)\n * }\n * ```\n * \n * @internal\n */\n async debounce(actionKey: string, debounceMs: number): Promise<boolean> {\n\n /** Get or create guard state for this action */\n let state = this.guards.get(actionKey);\n if (!state) {\n /** Initialize new guard state with default values */\n state = {\n lastExecuted: 0,\n isThrottled: false,\n debounceTimer: undefined as NodeJS.Timeout | undefined,\n throttleTimer: undefined as NodeJS.Timeout | undefined,\n debouncePromise: undefined as Promise<boolean> | undefined,\n debounceResolve: undefined as ((value: boolean) => void) | undefined,\n };\n this.guards.set(actionKey, state);\n }\n\n /** Clear any existing debounce timer to restart the delay period */\n if (state.debounceTimer) {\n clearTimeout(state.debounceTimer);\n // Resolve previous debounce with false if exists\n if (state.debounceResolve) {\n state.debounceResolve(false);\n state.debounceResolve = undefined as ((value: boolean) => void) | undefined;\n }\n }\n\n /** Create new debounce promise */\n return new Promise<boolean>((resolve) => {\n // Store new resolve function\n state!.debounceResolve = resolve;\n \n // Set new timer\n state!.debounceTimer = setTimeout(() => {\n /** Clean up timer and resolver references */\n state!.debounceTimer = undefined as NodeJS.Timeout | undefined;\n state!.debounceResolve = undefined as ((value: boolean) => void) | undefined;\n /** Update last execution timestamp */\n state!.lastExecuted = Date.now();\n resolve(true);\n }, debounceMs);\n });\n }\n\n /**\n * Apply throttling to an action\n * \n * Throttling limits execution frequency by ensuring a minimum interval between\n * calls. Unlike debouncing, throttling executes immediately on the first call\n * and then blocks subsequent calls until the interval expires.\n * \n * @param actionKey - Unique identifier for the action being throttled\n * @param throttleMs - Minimum interval in milliseconds between executions\n * \n * @returns True if execution should proceed, false if currently throttled\n * \n * @example Scroll Handler Throttling\n * ```typescript\n * // Update scroll position max once per 100ms\n * if (guard.throttle('scrollUpdate', 100)) {\n * updateScrollPosition()\n * }\n * ```\n * \n * @internal\n */\n throttle(actionKey: string, throttleMs: number): boolean {\n\n /** Get or create guard state for this action */\n let state = this.guards.get(actionKey);\n if (!state) {\n /** Initialize new guard state with default values */\n state = {\n lastExecuted: 0,\n isThrottled: false,\n debounceTimer: undefined as NodeJS.Timeout | undefined,\n throttleTimer: undefined as NodeJS.Timeout | undefined,\n debouncePromise: undefined as Promise<boolean> | undefined,\n debounceResolve: undefined as ((value: boolean) => void) | undefined,\n };\n this.guards.set(actionKey, state);\n }\n\n const now = Date.now();\n const timeSinceLastExecution = now - state.lastExecuted;\n\n /** Check if enough time has passed since last execution */\n /** If throttle period has elapsed, allow immediate execution */\n if (timeSinceLastExecution >= throttleMs) {\n /** Update execution timestamp and clear throttled state */\n state.lastExecuted = now;\n state.isThrottled = false;\n \n \n return true;\n }\n\n /** If already in throttled state, don't create duplicate timers */\n /** This prevents timer accumulation and unnecessary processing */\n if (state.isThrottled) {\n return false;\n }\n\n /** Set throttle timer to automatically clear the throttled state */\n /** Calculate remaining time until throttle period expires */\n state.isThrottled = true;\n const remainingTime = throttleMs - timeSinceLastExecution;\n \n /** Create timer to reset throttled state when period expires */\n state.throttleTimer = setTimeout(() => {\n /** Clear throttled state and timer reference */\n state!.isThrottled = false;\n state!.throttleTimer = undefined as NodeJS.Timeout | undefined;\n }, remainingTime);\n\n\n return false;\n }\n\n /**\n * Clear all guard state for a specific action\n * \n * Removes debounce and throttle timers for the specified action,\n * preventing memory leaks and allowing immediate re-execution.\n * \n * @param actionKey - Action identifier to clear guards for\n * \n * @internal\n */\n clearGuards(actionKey: string): void {\n const state = this.guards.get(actionKey);\n if (state) {\n // Clear debounce timer and cancel pending promises to prevent memory leaks\n if (state.debounceTimer) {\n clearTimeout(state.debounceTimer);\n if (state.debounceResolve) {\n state.debounceResolve(false);\n state.debounceResolve = undefined;\n }\n state.debounceTimer = undefined;\n }\n \n // Clear throttle timer to prevent memory leaks\n if (state.throttleTimer) {\n clearTimeout(state.throttleTimer);\n state.throttleTimer = undefined;\n }\n \n \n // Remove guard state from memory\n this.guards.delete(actionKey);\n }\n }\n\n /**\n * Clear all guard states for all actions\n * \n * Removes all active debounce and throttle timers, useful for cleanup\n * when shutting down the action system or resetting state.\n * \n * @internal\n */\n clearAll(): void {\n \n /** Iterate through all guard states and clear their timers */\n /** This prevents memory leaks when clearing the entire guard system */\n this.guards.forEach((state) => {\n /** Clear any active debounce timers */\n if (state.debounceTimer) {\n clearTimeout(state.debounceTimer);\n // Cancel waiting debounce calls\n if (state.debounceResolve) {\n state.debounceResolve(false);\n }\n }\n /** Clear any active throttle timers */\n if (state.throttleTimer) {\n clearTimeout(state.throttleTimer);\n }\n });\n \n /** Remove all guard states from memory */\n this.guards.clear();\n }\n\n /**\n * Get current guard state for debugging purposes\n * \n * Returns the internal state for a specific action, including timer\n * information and execution timestamps.\n * \n * @param actionKey - Action identifier to inspect\n * @returns Guard state or undefined if no state exists\n * \n * @internal\n */\n getGuardState(actionKey: string): GuardState | undefined {\n return this.guards.get(actionKey);\n }\n\n /**\n * Get all active guard states for debugging purposes\n * \n * Returns a copy of all current guard states, useful for monitoring\n * and debugging rate limiting behavior across all actions.\n * \n * @returns Map of action keys to their guard states\n * \n * @internal\n */\n getAllGuardStates(): Map<string, GuardState> {\n return new Map(this.guards);\n }\n\n /**\n * 🆕 Explicit destroy method for comprehensive cleanup\n * \n * Cleans up all timers, promises, and intervals to prevent memory leaks.\n * Should be called when ActionGuard is no longer needed.\n * \n * @internal\n */\n destroy(): void {\n // Stop auto cleanup interval\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = undefined as NodeJS.Timeout | undefined;\n }\n \n // Clear all existing guards\n this.clearAll();\n }\n\n /**\n * 🆕 Get statistics about active guards\n * \n * @returns Statistics about guard usage\n * \n * @internal\n */\n getStats(): { activeGuards: number; withTimers: number } {\n let withTimers = 0;\n this.guards.forEach(state => {\n if (state.debounceTimer || state.throttleTimer) {\n withTimers++;\n }\n });\n \n return {\n activeGuards: this.guards.size,\n withTimers\n };\n }\n}","/**\n * 동시성 문제 해결을 위한 작업 큐 시스템\n * \n * 모든 상태 변경 작업을 직렬화하여 race condition을 방지합니다.\n */\n\nexport interface QueuedOperation<T = any> {\n id: string;\n operation: () => T | Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n priority?: number;\n timestamp: number;\n}\n\n/**\n * 작업 큐 관리자\n *\n * 핵심 기능:\n * 1. 작업 직렬화 - 모든 작업을 순서대로 실행\n * 2. 우선순위 지원 - 중요한 작업 우선 처리\n * 3. 에러 처리 - 개별 작업 실패가 전체에 영향 주지 않음\n * 4. 메모리 관리 - 완료된 작업 자동 정리\n * 5. 🆕 동시성 제어 - maxConcurrency로 동시 실행 제한\n * 6. 🆕 비동기 지원 - Promise.all() 완벽 지원\n * 7. 🆕 이벤트 기반 처리 - 효율적인 큐 처리 시스템\n */\nexport class OperationQueue {\n private queue: QueuedOperation[] = [];\n private processingPromise: Promise<void> | null = null;\n private operationCounter = 0;\n \n // 🆕 Concurrency control\n private activeOperations = 0;\n private readonly maxConcurrency: number;\n \n constructor(\n private name: string = 'OperationQueue', \n maxConcurrency: number = 1\n ) {\n this.maxConcurrency = Math.max(1, maxConcurrency);\n }\n\n /**\n * 작업을 큐에 추가하고 실행 결과를 반환\n * \n * @param operation 실행할 작업\n * @param priority 우선순위 (높을수록 먼저 실행)\n * @returns Promise로 래핑된 작업 결과\n */\n enqueue<T>(operation: () => T | Promise<T>, priority: number = 0): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const queuedOperation: QueuedOperation<T> = {\n id: `${this.name}-${++this.operationCounter}`,\n operation,\n resolve,\n reject,\n priority,\n timestamp: Date.now()\n };\n\n\n // 우선순위에 따라 삽입 위치 결정\n let insertIndex = this.queue.length;\n for (let i = 0; i < this.queue.length; i++) {\n const item = this.queue[i];\n if (item && (item.priority || 0) < priority) {\n insertIndex = i;\n break;\n }\n }\n\n this.queue.splice(insertIndex, 0, queuedOperation);\n\n // 큐 처리 시작 (이미 처리 중이면 무시됨)\n if (this.processingPromise) {\n // 이미 처리 중이라면, 대기 중인 프로세스에게 새로운 작업이 추가되었음을 알림\n this.notifyNewOperation();\n }\n this.processQueue();\n });\n }\n\n /**\n * 🆕 큐 처리 메인 로직 - 동시성 제어 및 비동기 지원\n *\n * 주요 특징:\n * - maxConcurrency에 따라 동시 실행 작업 수를 제한하여 동시성 문제 방지\n * - Promise.all() 시나리오에서 완벽한 순차적 실행 보장\n * - 이벤트 기반 알림 시스템으로 효율적인 비동기 처리\n * - 작업 완료 시 대기 중인 프로세스에게 자동 알림\n */\n private async processQueue(): Promise<void> {\n if (this.processingPromise) {\n return this.processingPromise;\n }\n\n this.processingPromise = this._doProcess();\n try {\n await this.processingPromise;\n } finally {\n this.processingPromise = null;\n }\n }\n \n private async _doProcess(): Promise<void> {\n while (this.queue.length > 0 || this.activeOperations > 0) {\n // 🆕 동시성 제어: maxConcurrency 만큼만 동시 실행\n while (this.queue.length > 0 && this.activeOperations < this.maxConcurrency) {\n const operation = this.queue.shift()!;\n\n // 🆕 비동기 작업 실행 (await를 사용하지 않음 - 병렬 실행을 위해)\n this.startOperation(operation);\n }\n\n // 🆕 실행 중인 작업이 있으면 하나가 완료될 때까지 대기\n if (this.activeOperations > 0) {\n await this.waitForAnyOperation();\n }\n }\n }\n\n /**\n * 🆕 개별 작업을 시작하고 완료를 추적\n */\n private startOperation<T>(operation: QueuedOperation<T>): void {\n this.activeOperations++;\n\n // 비동기로 작업 실행\n this.executeOperation(operation)\n .finally(() => {\n this.activeOperations--;\n\n // 대기 중인 프로세스에게 신호 보내기\n this.notifyOperationComplete();\n });\n }\n\n private pendingResolvers: Array<() => void> = [];\n\n /**\n * 🆕 하나의 작업이 완료될 때까지 대기하거나 새로운 작업이 추가될 때까지 대기\n */\n private waitForAnyOperation(): Promise<void> {\n return new Promise<void>((resolve) => {\n this.pendingResolvers.push(resolve);\n });\n }\n\n /**\n * 🆕 작업 완료 신호 - 대기 중인 프로세스들에게 알림\n */\n private notifyOperationComplete(): void {\n // 대기 중인 모든 리졸버를 깨우기\n const resolvers = this.pendingResolvers.splice(0);\n resolvers.forEach(resolve => resolve());\n }\n\n /**\n * 🆕 새로운 작업 추가 신호 - processQueue에서 호출\n */\n private notifyNewOperation(): void {\n // 새로운 작업이 추가되었으므로 대기 중인 프로세스를 깨워서 다시 확인하도록 함\n this.notifyOperationComplete();\n }\n \n /**\n * 🆕 개별 작업 실행 로직\n */\n private async executeOperation<T>(operation: QueuedOperation<T>): Promise<void> {\n try {\n // 작업 실행 (동기/비동기 모두 지원)\n const result = await Promise.resolve(operation.operation());\n operation.resolve(result);\n } catch (error) {\n // 개별 작업 실패는 전체 큐에 영향 주지 않음\n operation.reject(error);\n }\n }\n\n /**\n * 🆕 현재 큐 상태 조회 (디버깅용) - 동시성 정보 포함\n */\n getQueueInfo() {\n return {\n name: this.name,\n queueLength: this.queue.length,\n isProcessing: Boolean(this.processingPromise),\n activeOperations: this.activeOperations,\n maxConcurrency: this.maxConcurrency,\n operations: this.queue.map(op => ({\n id: op.id,\n priority: op.priority,\n timestamp: op.timestamp\n }))\n };\n }\n \n /**\n * 🆕 동시성 설정 조회\n */\n getConcurrencyInfo() {\n return {\n maxConcurrency: this.maxConcurrency,\n activeOperations: this.activeOperations,\n availableSlots: this.maxConcurrency - this.activeOperations,\n queuedOperations: this.queue.length,\n efficiency: this.activeOperations / this.maxConcurrency\n };\n }\n\n /**\n * 큐 비우기 (테스트용)\n */\n clear(): void {\n // 대기 중인 작업들에게 취소 알림\n this.queue.forEach(operation => {\n operation.reject(new Error('Queue cleared'));\n });\n\n this.queue = [];\n this.processingPromise = null;\n\n // 대기 중인 리졸버들도 정리\n const resolvers = this.pendingResolvers.splice(0);\n resolvers.forEach(resolve => resolve());\n }\n\n /**\n * 큐 크기 조회\n */\n get size(): number {\n return this.queue.length;\n }\n\n /**\n * 처리 중 여부 조회 \n */\n get processing(): boolean {\n return Boolean(this.processingPromise);\n }\n}","\nimport {\n ActionPayloadMap,\n ActionHandler,\n HandlerConfig,\n HandlerRegistration,\n PipelineContext,\n PipelineController,\n ActionRegisterConfig,\n UnregisterFunction,\n ExecutionMode,\n ExecutionResult,\n ActionRegistryInfo,\n ActionHandlerStats,\n DispatchOptions,\n HandlerError,\n} from './types.js';\nimport { executeSequential, executeParallel, executeRace } from './execution-modes.js';\nimport { ActionGuard } from './action-guard.js';\nimport { OperationQueue } from './concurrency/OperationQueue.js';\n\n/**\n * Action Register for managing action handlers with priority-based execution\n * \n * Central action registration and dispatch system providing type-safe action pipeline management.\n * Supports sequential, parallel, and race execution modes with advanced handler filtering,\n * throttling, debouncing, and comprehensive result collection.\n * \n * @template TActionMap - Action payload mapping interface extending ActionPayloadMap\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/\n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/register-delegation\n * \n * @public\n */\nexport class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {\n private pipelines = new Map<keyof T, Array<HandlerRegistration<any, any>>>();\n private readonly actionGuard: ActionGuard;\n private executionMode: ExecutionMode = 'sequential';\n private actionExecutionModes = new Map<keyof T, ExecutionMode>();\n \n // 🆕 Advanced unregister function management system\n private unregisterFunctions = new Map<string, UnregisterFunction>();\n \n public readonly name: string;\n private readonly registryConfig: ActionRegisterConfig['registry'];\n\n // 🆕 Performance optimizations\n private readonly isDebugMode: boolean;\n private readonly maxHandlersPerAction: number;\n\n // 🆕 동시성 문제 해결을 위한 큐 시스템 (conditional)\n private dispatchQueue?: OperationQueue;\n\n // 🧠 Filter cache disabled to prevent memory issues - direct filtering only\n private filterCacheDisabled = true;\n\n // 🔧 Performance optimization: Fast handler ID generation counter\n private handlerIdCounter = 0;\n\n // 🔧 Performance optimization: PipelineController pool for object reuse\n private controllerPool: PipelineController<any, any>[] = [];\n private readonly maxControllerPoolSize = 10;\n\n constructor(config: ActionRegisterConfig = {}) {\n this.name = config.name || 'ActionRegister';\n this.registryConfig = config.registry;\n this.maxHandlersPerAction = config.registry?.maxHandlersPerAction ?? 1000;\n \n // 🆕 Environment variable check cached (performance optimization)\n this.isDebugMode = Boolean(\n this.registryConfig?.debug && \n process.env.NODE_ENV === 'development'\n );\n \n // Guard creation with improved cleanup handling\n this.actionGuard = new ActionGuard(this.registryConfig?.autoCleanup !== false);\n \n // 🆕 Conditional queue system initialization\n if (config.registry?.useConcurrencyQueue !== false) {\n this.dispatchQueue = new OperationQueue(`${this.name}-Dispatch`);\n }\n \n if (this.registryConfig?.defaultExecutionMode) {\n this.executionMode = this.registryConfig.defaultExecutionMode;\n }\n \n this.log('ActionRegister initialized', {\n defaultExecutionMode: this.executionMode,\n autoCleanup: this.registryConfig?.autoCleanup !== false,\n concurrencyQueue: Boolean(this.dispatchQueue),\n debugMode: this.isDebugMode\n });\n }\n\n /**\n * Register an action handler with optional configuration\n * \n * @param action - The action type to register handler for\n * @param handler - The handler function to execute\n * @param config - Optional handler configuration including priority, tags, etc.\n * \n * @returns Unregister function to remove this handler\n * \n * @throws {Error} When maximum handlers limit is reached\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n register<K extends keyof T, R = void>(\n action: K,\n handler: ActionHandler<T[K], R>,\n config: HandlerConfig = {}\n ): UnregisterFunction {\n // 🔄 임시로 기존 구현 유지하되 개선된 방식 적용\n // 동기적 API를 유지하면서 내부적으로만 동시성 보호\n \n // 🆕 Optimized handler ID generation\n const handlerId = config.id || this.generateHandlerId(action);\n \n // 🆕 Direct synchronous registration\n const unregisterFn = this._performRegistrationSync(action, handler, config, handlerId);\n \n return unregisterFn;\n }\n\n /**\n * 🆕 Unified logging method with cached debug mode check\n */\n private log(message: string, data?: unknown, level: 'log' | 'warn' | 'error' = 'log') {\n if (this.isDebugMode) {\n const timestamp = new Date().toISOString();\n console[level](`🎯 [${timestamp}] [${this.name}] ${message}`, data || '');\n }\n }\n\n /**\n * 🔧 Generate unique handler ID using optimized counter-based approach\n */\n private generateHandlerId<K extends keyof T>(action: K): string {\n // 🔧 Performance: Use simple counter instead of crypto.randomUUID()\n // This is safe for single-process apps and ~70% faster\n return `${String(action)}_${this.name}_${++this.handlerIdCounter}`;\n }\n\n /**\n * 🔧 Create and merge AbortSignal instances with proper cleanup\n * \n * @param options Dispatch options containing signal and autoAbort configuration\n * @returns [effectiveSignal, autoAbortController, cleanupFunction]\n */\n private createAbortSignal(options?: DispatchOptions): [\n AbortSignal | undefined, \n AbortController | undefined, \n () => void\n ] {\n const signals: AbortSignal[] = [];\n const cleanups: (() => void)[] = [];\n let autoAbortController: AbortController | undefined;\n\n // Add existing signal if provided\n if (options?.signal) {\n signals.push(options.signal);\n }\n\n // Create auto-abort controller if enabled\n if (options?.autoAbort?.enabled) {\n autoAbortController = new AbortController();\n signals.push(autoAbortController.signal);\n }\n\n // No signals to merge\n if (signals.length === 0) {\n return [undefined, autoAbortController, () => {}];\n }\n\n // Single signal - no merge needed\n if (signals.length === 1) {\n return [signals[0], autoAbortController, () => cleanups.forEach(c => c())];\n }\n\n // Multiple signals - use AbortSignal.any() if available, fallback to manual merge\n let effectiveSignal: AbortSignal;\n \n if (typeof AbortSignal.any === 'function') {\n // Modern browsers with AbortSignal.any()\n effectiveSignal = AbortSignal.any(signals);\n } else {\n // Fallback: Create controller and link all signals\n const mergedController = new AbortController();\n effectiveSignal = mergedController.signal;\n \n signals.forEach(signal => {\n if (signal.aborted) {\n mergedController.abort();\n } else {\n const abortHandler = () => mergedController.abort();\n signal.addEventListener('abort', abortHandler, { once: true });\n cleanups.push(() => signal.removeEventListener('abort', abortHandler));\n }\n });\n }\n\n const cleanup = () => {\n cleanups.forEach(c => {\n try {\n c();\n } catch (error) {\n this.log('Cleanup error during AbortSignal cleanup', error, 'warn');\n }\n });\n };\n\n return [effectiveSignal, autoAbortController, cleanup];\n }\n\n /**\n * 🆕 Perform synchronous handler registration\n */\n private _performRegistrationSync<K extends keyof T, R = void>(\n action: K,\n handler: ActionHandler<T[K], R>,\n config: HandlerConfig,\n handlerId: string\n ): UnregisterFunction {\n // Create handler registration with defaults\n const registration: HandlerRegistration<T[K], R> = {\n handler,\n config: {\n priority: config.priority ?? 0,\n id: handlerId,\n blocking: config.blocking ?? false,\n once: config.once ?? false,\n debounce: config.debounce ?? undefined,\n throttle: config.throttle ?? undefined,\n replaceExisting: config.replaceExisting ?? false,\n cleanup: config.cleanup, // 🔧 Preserve cleanup function from config\n } as Required<HandlerConfig>,\n id: handlerId,\n };\n \n // Initialize pipeline if it doesn't exist\n if (!this.pipelines.has(action)) {\n this.pipelines.set(action, []);\n }\n\n const pipeline = this.pipelines.get(action)!;\n \n // Check handler limit\n if (pipeline.length >= this.maxHandlersPerAction) {\n console.warn(`Handler limit (${this.maxHandlersPerAction}) reached for action \"${String(action)}\". Registration ignored.`);\n return () => {}; // No-op unregister\n }\n const existingIndex = pipeline.findIndex(reg => reg.id === handlerId);\n\n // 🆕 Enhanced duplicate ID handling with replaceExisting support and cleanup\n if (existingIndex !== -1) {\n const existing = pipeline[existingIndex];\n const existingUnregister = this.unregisterFunctions.get(handlerId);\n \n if (config.replaceExisting) {\n // Clean up existing handler before replacement\n if (existingUnregister) {\n // Execute existing unregister function first\n existingUnregister();\n this.unregisterFunctions.delete(handlerId);\n }\n \n // Call cleanup if available on the old handler\n if (existing && typeof (existing as any).cleanup === 'function') {\n try {\n (existing as any).cleanup();\n } catch (cleanupError) {\n this.log(`Cleanup error for replaced handler: ${String(action)}`, cleanupError, 'warn');\n }\n }\n \n // Replace existing handler\n pipeline[existingIndex] = registration;\n pipeline.sort((a, b) => b.config.priority - a.config.priority);\n // Cache disabled\n \n // Create new unregister function and store it\n const newUnregister = this.createUnregisterFunction(action, handlerId, registration);\n this.unregisterFunctions.set(handlerId, newUnregister);\n \n this.log(`Handler replaced: ${String(action)}`, {\n handlerId,\n priority: config.priority,\n totalHandlers: pipeline.length,\n hadExistingUnregister: Boolean(existingUnregister)\n });\n \n return newUnregister;\n } else {\n // Return existing unregister function or create a new one\n // At this point, existing is guaranteed to be defined because we're in the duplicate handler block\n if (!existing) {\n throw new Error('Internal error: existing handler should be defined in duplicate handler block');\n }\n \n this.log(`Handler duplicate ignored, returning existing unregister: ${String(action)}`, {\n handlerId,\n existingPriority: existing.config.priority,\n newPriority: config.priority,\n existingBlocking: existing.config.blocking,\n newBlocking: config.blocking,\n note: 'Use replaceExisting:true to replace'\n }, 'warn');\n \n if (existingUnregister) {\n return existingUnregister;\n } else {\n // Create new unregister function if somehow missing\n const newUnregister = this.createUnregisterFunction(action, handlerId, existing);\n this.unregisterFunctions.set(handlerId, newUnregister);\n return newUnregister;\n }\n }\n }\n \n // Add handler to pipeline\n pipeline.push(registration);\n pipeline.sort((a, b) => b.config.priority - a.config.priority);\n // Cache disabled\n \n // Create and store unregister function\n const unregister = this.createUnregisterFunction(action, handlerId, registration);\n this.unregisterFunctions.set(handlerId, unregister);\n \n this.log(`Handler registered: ${String(action)}`, {\n handlerId,\n priority: config.priority,\n totalHandlers: pipeline.length\n });\n \n return unregister;\n }\n\n\n /**\n * Dispatch an action with optional execution options\n * \n * @param action - The action type to dispatch\n * @param payload - The action payload data\n * @param options - Optional dispatch options (execution mode, filters, etc.)\n * \n * @returns Promise that resolves when all handlers complete\n * \n * @throws {Error} When action dispatching fails\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n async dispatch<K extends keyof T>(\n action: K,\n payload?: T[K],\n options?: DispatchOptions\n ): Promise<void> {\n // 🆕 Conditional queue usage for performance\n if (options?.immediate || !this.dispatchQueue) {\n // Bypass queue for immediate execution or when queues disabled\n return this._performDispatch(action, payload, options);\n } else {\n // Use queue for concurrency protection\n return this.dispatchQueue.enqueue(async () => {\n return this._performDispatch(action, payload, options);\n });\n }\n }\n\n /**\n * 🆕 실제 디스패치 작업 수행 (큐에서 호출됨)\n */\n private async _performDispatch<K extends keyof T>(\n action: K,\n payload?: T[K],\n options?: DispatchOptions\n ): Promise<void> {\n // 🔍 디스패치 시작 디버그\n this.log(`Starting dispatch for action '${String(action)}'`, {\n hasPayload: payload !== undefined,\n payloadType: payload?.constructor?.name || typeof payload,\n options: options ? Object.keys(options) : 'none',\n timestamp: new Date().toISOString()\n });\n \n // Simple Event object detection for development\n if (payload instanceof Event && process.env.NODE_ENV === 'development') {\n console.warn(`Event object passed to action \"${String(action)}\"`, payload.type);\n }\n \n // 🔧 Improved AbortSignal handling with cleaner merge logic\n const [effectiveSignal, autoAbortController, cleanup] = this.createAbortSignal(options);\n \n if (options?.autoAbort?.onControllerCreated && autoAbortController) {\n options.autoAbort.onControllerCreated(autoAbortController);\n }\n \n // Check if dispatch is aborted before starting\n if (effectiveSignal?.aborted) {\n this.log(`Dispatch aborted before execution for '${String(action)}'`);\n return;\n }\n \n const pipeline = this.pipelines.get(action);\n \n // 🔍 파이프라인 존재 여부 디버그\n this.log(`Pipeline lookup for '${String(action)}'`, {\n pipelineExists: Boolean(pipeline),\n handlersCount: pipeline?.length || 0,\n allRegisteredActions: Array.from(this.pipelines.keys()),\n pipelineMap: Object.fromEntries(Array.from(this.pipelines.entries()).map(([k, v]) => [k, v.length]))\n });\n \n if (!pipeline || pipeline.length === 0) {\n this.log(`No handlers found for action '${String(action)}', dispatch cancelled`, {}, 'warn');\n return;\n }\n\n // 🆕 Optimize filtering - only copy array if filtering is needed\n const filteredHandlers = options?.filter \n ? this.filterHandlers(pipeline, options.filter)\n : pipeline;\n\n // Apply ActionGuard controls - check both dispatch options and handler configs\n const actionKey = String(action);\n \n // Get throttle/debounce settings from dispatch options or handler configs\n let throttleMs: number | undefined;\n let debounceMs: number | undefined;\n \n // Priority: dispatch options > handler config\n if (options?.throttle !== undefined) {\n throttleMs = options.throttle;\n } else if (filteredHandlers.length > 0) {\n // Use throttle from the first handler that has it (handlers are sorted by priority)\n for (const handler of filteredHandlers) {\n if (handler.config.throttle !== undefined) {\n throttleMs = handler.config.throttle;\n break;\n }\n }\n }\n \n if (options?.debounce !== undefined) {\n debounceMs = options.debounce;\n } else if (filteredHandlers.length > 0) {\n // Use debounce from the first handler that has it (handlers are sorted by priority)\n for (const handler of filteredHandlers) {\n if (handler.config.debounce !== undefined) {\n debounceMs = handler.config.debounce;\n break;\n }\n }\n }\n \n // Apply debounce if specified\n if (debounceMs !== undefined) {\n const shouldProceed = await this.actionGuard.debounce(actionKey, debounceMs);\n if (!shouldProceed) {\n return; // Debounced - don't execute\n }\n }\n \n // Apply throttle if specified\n if (throttleMs !== undefined) {\n const shouldProceed = this.actionGuard.throttle(actionKey, throttleMs);\n if (!shouldProceed) {\n return; // Throttled - don't execute\n }\n }\n\n // Determine execution mode for this action (with option override)\n const currentExecutionMode = options?.executionMode || \n this.actionExecutionModes.get(action) || \n this.executionMode;\n\n // Create pipeline execution context\n const context: PipelineContext<T[K], any> = {\n action: String(action),\n payload: payload as T[K],\n handlers: filteredHandlers, // Use filtered handlers\n aborted: false,\n abortReason: undefined as string | undefined,\n currentIndex: 0,\n jumpToPriority: undefined as number | undefined,\n executionMode: currentExecutionMode,\n \n // New result collection fields\n results: [],\n terminated: false,\n terminationResult: undefined as any,\n };\n\n \n // Add abort listener if signal provided (use effectiveSignal for auto-abort)\n const abortHandler = effectiveSignal ? () => {\n context.aborted = true;\n context.abortReason = 'Action dispatch aborted by signal';\n } : undefined;\n \n if (effectiveSignal && abortHandler) {\n effectiveSignal.addEventListener('abort', abortHandler);\n }\n \n \n try {\n await this.executePipeline(context, autoAbortController, options?.autoAbort);\n this.log(`Pipeline execution succeeded for ${String(action)}`);\n } catch (error) {\n this.log(`Pipeline execution failed for ${String(action)}`, error, 'error');\n throw error;\n } finally {\n // 🔧 Use cleanup function from createAbortSignal\n cleanup();\n }\n }\n\n /**\n * Dispatch an action and return detailed execution results\n * \n * @param action - The action type to dispatch\n * @param payload - The action payload data\n * @param options - Optional dispatch options including result collection strategy\n * \n * @returns Promise resolving to comprehensive execution results\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n async dispatchWithResult<K extends keyof T, R = void>(\n action: K,\n payload?: T[K],\n options?: DispatchOptions\n ): Promise<ExecutionResult<R>> {\n const _startTime = Date.now();\n \n // 🔧 Improved AbortSignal handling with cleaner merge logic (same as dispatch)\n const [effectiveSignal, autoAbortController, cleanup] = this.createAbortSignal(options);\n \n if (options?.autoAbort?.onControllerCreated && autoAbortController) {\n options.autoAbort.onControllerCreated(autoAbortController);\n }\n \n // Check if dispatch is aborted before starting\n if (effectiveSignal?.aborted) {\n return {\n success: false,\n aborted: true,\n abortReason: 'Action dispatch aborted by signal',\n terminated: false,\n result: undefined as any,\n successResults: [] as any,\n results: [],\n failedResults: [],\n execution: {\n duration: 0,\n handlersExecuted: 0,\n handlersSkipped: 0,\n handlersFailed: 0,\n startTime: _startTime,\n endTime: _startTime,\n },\n handlers: [],\n errors: [],\n };\n }\n \n const pipeline = this.pipelines.get(action);\n \n if (!pipeline || pipeline.length === 0) {\n return {\n success: true,\n aborted: false,\n abortReason: undefined as string | undefined,\n terminated: false,\n result: undefined as any,\n successResults: [] as any,\n results: [],\n failedResults: [],\n execution: {\n duration: 0,\n handlersExecuted: 0,\n handlersSkipped: 0,\n handlersFailed: 0,\n startTime: _startTime,\n endTime: _startTime,\n },\n handlers: [],\n errors: [],\n };\n }\n\n // 🆕 Optimize filtering - only copy array if filtering is needed\n const filteredHandlers = options?.filter \n ? this.filterHandlers(pipeline, options.filter)\n : pipeline;\n\n // 🔧 Apply ActionGuard controls using unified method with ExecutionResult return\n const actionKey = String(action);\n const guardResult = await this.applyActionGuardControlsWithResult<R>(\n actionKey, \n filteredHandlers, \n options, \n _startTime, \n pipeline.length\n );\n if (guardResult) {\n return guardResult; // Throttled or debounced - return early with proper result\n }\n\n // Determine execution mode for this action (with option override)\n const currentExecutionMode = options?.executionMode || \n this.actionExecutionModes.get(action) || \n this.executionMode;\n\n // Create pipeline execution context\n const context: PipelineContext<T[K], R> = {\n action: String(action),\n payload: payload as T[K],\n handlers: filteredHandlers,\n aborted: false,\n abortReason: undefined as string | undefined,\n currentIndex: 0,\n jumpToPriority: undefined as number | undefined,\n executionMode: currentExecutionMode,\n \n // Result collection fields\n results: [],\n terminated: false,\n terminationResult: undefined as R | undefined,\n };\n\n let executionError: Error | undefined;\n const handlerResults: Array<{\n id: string;\n executed: boolean;\n duration: number | undefined;\n result: R | undefined;\n error: Error | undefined;\n metadata: Record<string, any> | undefined;\n }> = [];\n\n\n // Initialize handler tracking - all handlers start as not executed\n filteredHandlers.forEach(handler => {\n handlerResults.push({\n id: handler.config.id,\n executed: false,\n duration: undefined as number | undefined,\n result: undefined as R | undefined,\n error: undefined as Error | undefined,\n metadata: undefined as Record<string, any> | undefined,\n });\n });\n\n // Add abort listener if signal provided (use effectiveSignal for auto-abort)\n const abortHandler = effectiveSignal ? () => {\n context.aborted = true;\n context.abortReason = 'Action dispatch aborted by signal';\n } : undefined;\n \n if (effectiveSignal && abortHandler) {\n effectiveSignal.addEventListener('abort', abortHandler);\n }\n \n // 🔧 Initialize errors array (will be updated after pipeline execution)\n let errors: HandlerError[] = [];\n \n try {\n await this.executePipeline(context, autoAbortController, options?.autoAbort);\n \n // 🔧 Collect errors from execution context after pipeline execution\n const contextWithErrors = context as PipelineContext<any, any> & { collectedErrors?: HandlerError[] };\n errors = contextWithErrors.collectedErrors || [];\n \n // Mark executed handlers based on context.currentIndex\n // In sequential mode, handlers 0 to currentIndex were executed\n // In parallel/race mode, all handlers that didn't error were executed\n const executedCount = Math.min(context.currentIndex + (context.aborted ? 0 : 1), filteredHandlers.length);\n for (let i = 0; i < executedCount; i++) {\n const handler = filteredHandlers[i];\n if (!handler) continue;\n const handlerResult = handlerResults.find(hr => hr.id === handler.config.id);\n if (handlerResult) {\n handlerResult.executed = true;\n }\n }\n } catch (error) {\n // 🔧 Collect errors from execution context before adding pipeline error\n const contextWithErrors = context as PipelineContext<any, any> & { collectedErrors?: HandlerError[] };\n errors = contextWithErrors.collectedErrors || [];\n \n executionError = error instanceof Error ? error : new Error(String(error));\n errors.push({\n handlerId: 'pipeline',\n error: executionError,\n timestamp: Date.now(),\n severity: 'blocking'\n });\n \n // Mark executed handlers even when there's an error\n const executedCount = Math.min(context.currentIndex + 1, filteredHandlers.length);\n for (let i = 0; i < executedCount; i++) {\n const handler = filteredHandlers[i];\n if (!handler) continue;\n const handlerResult = handlerResults.find(hr => hr.id === handler.config.id);\n if (handlerResult) {\n handlerResult.executed = true;\n }\n }\n } finally {\n // 🔧 Use cleanup function from createAbortSignal\n cleanup();\n }\n\n const endTime = Date.now();\n \n // Process results based on options\n const processedResult = this.processResults(context, options?.result);\n\n // 🔧 Type safety: Separate successful results from failed ones\n const successResults = context.results.filter((result): result is R => result !== undefined);\n const failedResults = errors.map(err => ({\n handlerId: err.handlerId,\n error: err.error,\n expectedType: typeof processedResult\n }));\n\n // Build execution result with improved type safety\n const executionResult: ExecutionResult<R> = {\n success: !executionError && !context.aborted,\n aborted: context.aborted,\n abortReason: context.abortReason,\n terminated: context.terminated,\n result: processedResult,\n successResults: successResults,\n results: context.results,\n failedResults,\n execution: {\n duration: endTime - _startTime,\n handlersExecuted: filteredHandlers.length === 0 ? 0 : context.currentIndex + (context.aborted ? 0 : 1),\n handlersSkipped: Math.max(0, filteredHandlers.length - (context.currentIndex + 1)),\n handlersFailed: errors.length,\n startTime: _startTime,\n endTime,\n },\n handlers: handlerResults,\n errors: errors.map(err => ({\n handlerId: err.handlerId,\n error: err.error,\n timestamp: err.timestamp,\n severity: 'non-blocking' as const\n })),\n };\n\n /** Clean up one-time handlers after execution */\n this.cleanupOneTimeHandlers(action, context.handlers);\n\n return executionResult;\n }\n\n /**\n * 🔧 Unified method for dispatchWithResult that returns ExecutionResult on guard rejection\n */\n private async applyActionGuardControlsWithResult<R>(\n actionKey: string,\n filteredHandlers: HandlerRegistration<any, any>[],\n options: DispatchOptions | undefined,\n startTime: number,\n pipelineLength: number\n ): Promise<ExecutionResult<R> | null> {\n // Get throttle/debounce settings (same logic as above)\n let throttleMs: number | undefined;\n let debounceMs: number | undefined;\n \n if (options?.throttle !== undefined) {\n throttleMs = options.throttle;\n } else if (filteredHandlers.length > 0) {\n for (const handler of filteredHandlers) {\n if (handler.config.throttle !== undefined) {\n throttleMs = handler.config.throttle;\n break;\n }\n }\n }\n \n if (options?.debounce !== undefined) {\n debounceMs = options.debounce;\n } else if (filteredHandlers.length > 0) {\n for (const handler of filteredHandlers) {\n if (handler.config.debounce !== undefined) {\n debounceMs = handler.config.debounce;\n break;\n }\n }\n }\n \n // Apply debounce if specified\n if (debounceMs !== undefined) {\n const shouldProceed = await this.actionGuard.debounce(actionKey, debounceMs);\n if (!shouldProceed) {\n return {\n success: false,\n aborted: true,\n abortReason: 'Debounced execution',\n terminated: false,\n result: undefined as any,\n successResults: [] as any,\n results: [],\n failedResults: [],\n execution: {\n duration: Date.now() - startTime,\n handlersExecuted: 0,\n handlersSkipped: pipelineLength,\n handlersFailed: 0,\n startTime: startTime,\n endTime: Date.now(),\n },\n handlers: [],\n errors: [],\n };\n }\n }\n \n // Apply throttle if specified\n if (throttleMs !== undefined) {\n const shouldProceed = this.actionGuard.throttle(actionKey, throttleMs);\n if (!shouldProceed) {\n return {\n success: false,\n aborted: true,\n abortReason: 'Throttled execution',\n terminated: false,\n result: undefined as any,\n successResults: [] as any,\n results: [],\n failedResults: [],\n execution: {\n duration: Date.now() - startTime,\n handlersExecuted: 0,\n handlersSkipped: pipelineLength,\n handlersFailed: 0,\n startTime: startTime,\n endTime: Date.now(),\n },\n handlers: [],\n errors: [],\n };\n }\n }\n\n return null; // No guard intervention, proceed with execution\n }\n\n // Cache methods removed for memory stability\n\n /**\n * 🔧 Generate optimized cache key for filter options\n */\n private generateFilterCacheKey(filterOptions?: DispatchOptions['filter']): string {\n if (!filterOptions) {\n return 'no-filter';\n }\n\n // Use pre-sorted arrays to avoid repeated sorting\n const parts: string[] = [];\n\n if (filterOptions.handlerIds?.length) {\n parts.push(`h:${filterOptions.handlerIds.slice().sort().join(',')}`);\n }\n\n if (filterOptions.excludeHandlerIds?.length) {\n parts.push(`e:${filterOptions.excludeHandlerIds.slice().sort().join(',')}`);\n }\n\n if (filterOptions.priority) {\n const { min, max } = filterOptions.priority;\n if (min !== undefined || max !== undefined) {\n parts.push(`p:${min ?? '*'}-${max ?? '*'}`);\n }\n }\n\n // Custom filters cannot be cached\n if (filterOptions.custom) {\n return 'custom-' + Date.now() + Math.random(); // Unique non-cacheable key\n }\n\n return parts.length > 0 ? parts.join('|') : 'no-filter';\n }\n\n // Cache invalidation removed for memory stability\n\n /**\n * 🔧 Create or reuse PipelineController from pool for better performance\n */\n private getControllerFromPool<K extends keyof T>(\n context: PipelineContext<T[K], any>, \n autoAbortController?: AbortController,\n autoAbortOptions?: { allowHandlerAbort?: boolean }\n ): PipelineController<T[K], any> {\n // Try to reuse from pool\n let controller = this.controllerPool.pop();\n \n if (!controller) {\n // Create new controller if pool is empty\n controller = {} as PipelineController<T[K], any>;\n }\n\n // Configure/reset the controller for current context\n controller.abort = (reason?: string) => {\n context.aborted = true;\n context.abortReason = reason;\n \n // Auto-abort: Handler can trigger pipeline abort if enabled\n if (autoAbortController && autoAbortOptions?.allowHandlerAbort) {\n autoAbortController.abort(reason);\n }\n };\n\n controller.modifyPayload = (modifier: (payload: T[K]) => T[K]) => {\n context.payload = modifier(context.payload);\n };\n\n controller.getPayload = () => context.payload;\n\n controller.jumpToPriority = (priority: number) => {\n context.jumpToPriority = priority;\n };\n\n controller.return = (result: any) => {\n context.terminated = true;\n context.terminationResult = result;\n };\n\n controller.setResult = (result: any) => {\n context.results.push(result);\n };\n\n controller.getResults = () => {\n return [...context.results];\n };\n\n controller.mergeResult = (merger: (previousResults: any[], currentResult: any) => any) => {\n const currentResult = context.results[context.results.length - 1];\n const previousResults = context.results.slice(0, -1);\n const mergedResult = merger(previousResults, currentResult);\n context.results[context.results.length - 1] = mergedResult;\n };\n\n return controller;\n }\n\n /**\n * 🔧 Return controller to pool for reuse\n */\n private returnControllerToPool(controller: PipelineController<any, any>): void {\n // Only add to pool if we haven't exceeded max size\n if (this.controllerPool.length < this.maxControllerPoolSize) {\n this.controllerPool.push(controller);\n }\n }\n\n private filterHandlers(\n handlers: HandlerRegistration<any, any>[],\n filterOptions?: DispatchOptions['filter']\n ): HandlerRegistration<any, any>[] {\n if (!filterOptions) {\n return handlers;\n }\n\n // Cache disabled for memory stability\n\n // Cache disabled - using direct filtering for memory stability\n\n // Create Sets for fast lookup if arrays are provided\n const handlerIdSet = filterOptions.handlerIds ? new Set(filterOptions.handlerIds) : null;\n const excludeIdSet = filterOptions.excludeHandlerIds ? new Set(filterOptions.excludeHandlerIds) : null;\n\n // Filter handlers with optimized checks\n const filtered = handlers.filter(registration => {\n const config = registration.config;\n\n // Fast Set-based inclusion check\n if (handlerIdSet && !handlerIdSet.has(config.id)) {\n return false;\n }\n\n // Fast Set-based exclusion check\n if (excludeIdSet && excludeIdSet.has(config.id)) {\n return false;\n }\n\n // Priority range check\n if (filterOptions.priority) {\n const priority = config.priority;\n if (filterOptions.priority.min !== undefined && priority < filterOptions.priority.min) {\n return false;\n }\n if (filterOptions.priority.max !== undefined && priority > filterOptions.priority.max) {\n return false;\n }\n }\n\n // Custom filter (not cached)\n if (filterOptions.custom && !filterOptions.custom(config)) {\n return false;\n }\n\n return true;\n });\n\n // Cache disabled for memory stability\n\n return filtered;\n }\n\n private processResults<R>(\n context: PipelineContext<any, R>,\n resultOptions?: DispatchOptions['result']\n ): R | undefined {\n if (!resultOptions || !resultOptions.collect) {\n return undefined;\n }\n\n const results = context.results;\n \n // Handle termination result\n if (context.terminated && context.terminationResult !== undefined) {\n return context.terminationResult;\n }\n\n // Apply maxResults limit\n const limitedResults = resultOptions.maxResults \n ? results.slice(0, resultOptions.maxResults)\n : results;\n\n if (limitedResults.length === 0) {\n return undefined;\n }\n\n // Process results based on strategy\n switch (resultOptions.strategy) {\n case 'first':\n return limitedResults[0];\n case 'last':\n return limitedResults[limitedResults.length - 1];\n case 'all':\n return limitedResults as unknown as R;\n case 'merge':\n if (resultOptions.merger) {\n return resultOptions.merger(limitedResults);\n }\n // Default merge: return last result\n return limitedResults[limitedResults.length - 1];\n case 'custom':\n if (resultOptions.merger) {\n return resultOptions.merger(limitedResults);\n }\n throw new Error('Custom result strategy requires a merger function');\n default:\n // Default: return all results\n return limitedResults as unknown as R;\n }\n }\n\n private async executePipeline<K extends keyof T>(\n context: PipelineContext<T[K], any>, \n autoAbortController?: AbortController,\n autoAbortOptions?: { allowHandlerAbort?: boolean }\n ): Promise<void> {\n const createController = (_registration: HandlerRegistration<T[K], any>, _index: number): PipelineController<T[K], any> => {\n return this.getControllerFromPool(context, autoAbortController, autoAbortOptions);\n };\n\n switch (context.executionMode) {\n case 'sequential':\n await executeSequential<T[K], any>(context, createController);\n break;\n case 'parallel':\n await executeParallel<T[K], any>(context, createController);\n break;\n case 'race':\n await executeRace<T[K], any>(context, createController);\n break;\n default:\n throw new Error(`Unknown execution mode: ${context.executionMode}`);\n }\n\n this.cleanupOneTimeHandlers(context.action as K, context.handlers);\n }\n\n private cleanupOneTimeHandlers<K extends keyof T>(action: K, executedHandlers: HandlerRegistration<any, any>[]): void {\n const pipeline = this.pipelines.get(action);\n if (!pipeline) return;\n\n const oneTimeHandlers = executedHandlers.filter(reg => reg.config.once);\n if (oneTimeHandlers.length === 0) return;\n\n oneTimeHandlers.forEach(registration => {\n const index = pipeline.findIndex(reg => reg.id === registration.id);\n if (index !== -1) {\n pipeline.splice(index, 1);\n \n if (this.registryConfig?.debug && process.env.NODE_ENV === 'development') {\n console.log(`🎯 One-time handler removed: ${String(action)}`, {\n handlerId: registration.id,\n remainingHandlers: pipeline.length,\n registry: this.name\n });\n }\n }\n });\n }\n\n\n /**\n * Get the number of registered handlers for an action\n * \n * @param action - The action type to count handlers for\n * \n * @returns Number of registered handlers\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n getHandlerCount<K extends keyof T>(action: K): number {\n const pipeline = this.pipelines.get(action);\n return pipeline ? pipeline.length : 0;\n }\n\n /**\n * Check if an action has any registered handlers\n * \n * @param action - The action type to check\n * \n * @returns True if action has handlers, false otherwise\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n hasHandlers<K extends keyof T>(action: K): boolean {\n return this.getHandlerCount(action) > 0;\n }\n\n /**\n * Get all registered action types\n * \n * @returns Array of all registered action types\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n getRegisteredActions(): (keyof T)[] {\n return Array.from(this.pipelines.keys());\n }\n\n /**\n * Remove all handlers for a specific action\n * \n * @param action - The action type to clear handlers for\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n clearAction<K extends keyof T>(action: K): void {\n this.pipelines.delete(action);\n // 🔧 Invalidate filter cache when pipeline changes\n // Cache disabled\n }\n\n /**\n * Remove all handlers for all actions\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n clearAll(): void {\n this.pipelines.clear();\n // 🔧 Invalidate filter cache when pipeline changes\n // Cache disabled\n }\n\n /**\n * Get the name of this action register\n * \n * @returns The register name\n * \n * @see https://mineclover.github.io/context-action/en/guide/patterns/action/basic-usage\n * \n * @public\n */\n getName(): string {\n return this.name;\n }\n\n /**\n * Get comprehensive registry information (similar to DeclarativeStoreRegistry pattern)\n * \n * @returns Registry information including actions, handlers, and execution modes\n */\n getRegistryInfo(): ActionRegistryInfo<T> {\n const totalHandlers = Array.from(this.pipelines.values()).reduce(\n (total, pipeline) => total + pipeline.length, \n 0\n );\n \n return {\n name: this.name,\n totalActions: this.pipelines.size,\n totalHandlers,\n registeredActions: Array.from(this.pipelines.keys()),\n actionExecutionModes: new Map(this.actionExecutionModes),\n defaultExecutionMode: this.executionMode,\n };\n }\n\n /**\n * Get detailed statistics for a specific action\n * \n * @param action Action name to get statistics for\n * @returns Detailed handler statistics\n */\n getActionStats<K extends keyof T>(action: K): ActionHandlerStats<T> | null {\n const pipeline = this.pipelines.get(action);\n if (!pipeline) {\n return null;\n }\n\n // Group handlers by priority\n const priorityMap = new Map<number, typeof pipeline>();\n pipeline.forEach(handler => {\n if (!priorityMap.has(handler.config.priority)) {\n priorityMap.set(handler.config.priority, []);\n }\n priorityMap.get(handler.config.priority)!.push(handler);\n });\n\n const handlersByPriority = Array.from(priorityMap.entries())\n .sort(([a], [b]) => b - a) // Sort by priority (highest first)\n .map(([priority, handlers]) => ({\n priority,\n handlers: handlers.map(h => ({\n id: h.config.id,\n }))\n }));\n\n // Execution statistics are no longer tracked\n const executionStats = undefined;\n\n return {\n action,\n handlerCount: pipeline.length,\n totalHandlers: pipeline.length,\n handlersByPriority,\n executionStats,\n };\n }\n\n /**\n * Get statistics for all registered actions\n * \n * @returns Array of statistics for all actions\n */\n getAllActionStats(): Array<ActionHandlerStats<T>> {\n return Array.from(this.pipelines.keys())\n .map(action => this.getActionStats(action))\n .filter((stats): stats is ActionHandlerStats<T> => stats !== null);\n }\n\n\n /**\n * Set global execution mode for all actions\n * \n * @param mode Execution mode to set\n */\n setExecutionMode(mode: ExecutionMode): void {\n this.executionMode = mode;\n \n if (this.registryConfig?.debug && process.env.NODE_ENV === 'development') {\n console.log(`🎯 Global execution mode set to: ${mode}`);\n }\n }\n\n /**\n * Set execution mode for a specific action\n * \n * @param action Action name\n * @param mode Execution mode to set\n */\n setActionExecutionMode<K extends keyof T>(action: K, mode: ExecutionMode): void {\n this.actionExecutionModes.set(action, mode);\n \n if (this.registryConfig?.debug && process.env.NODE_ENV === 'development') {\n console.log(`🎯 Execution mode set for action '${String(action)}': ${mode}`);\n }\n }\n\n /**\n * Get execution mode for a specific action\n * \n * @param action Action name\n * @returns Execution mode for the action, or default if not set\n */\n getActionExecutionMode<K extends keyof T>(action: K): ExecutionMode {\n return this.actionExecutionModes.get(action) || this.executionMode;\n }\n\n /**\n * Remove execution mode override for a specific action\n * \n * @param action Action name\n */\n removeActionExecutionMode<K extends keyof T>(action: K): void {\n this.actionExecutionModes.delete(action);\n \n if (this.registryConfig?.debug && process.env.NODE_ENV === 'development') {\n console.log(`🎯 Execution mode reset for action '${String(action)}' to default: ${this.executionMode}`);\n }\n }\n\n\n /**\n * Get registry configuration (for debugging and inspection)\n * \n * @returns Current registry configuration\n */\n getRegistryConfig(): ActionRegisterConfig['registry'] {\n return this.registryConfig;\n }\n\n /**\n * Check if registry has debug mode enabled\n * \n * @returns Whether debug mode is enabled\n */\n isDebugEnabled(): boolean {\n return this.isDebugMode;\n }\n\n /**\n * Creates a consistent unregister function for a handler\n * \n * @param action - Action key\n * @param handlerId - Handler identifier\n * @param registration - Handler registration object\n * @returns Unregister function\n * @private\n */\n private createUnregisterFunction<K extends keyof T>(\n action: K,\n handlerId: string,\n registration: HandlerRegistration<any, any>\n ): UnregisterFunction {\n return () => {\n const pipeline = this.pipelines.get(action);\n if (!pipeline) return;\n \n const index = pipeline.findIndex(reg => reg.id === handlerId && reg === registration);\n if (index !== -1) {\n pipeline.splice(index, 1);\n // Cache disabled\n this.unregisterFunctions.delete(handlerId);\n \n // Execute cleanup function if available\n if (registration.config.cleanup && typeof registration.config.cleanup === 'function') {\n try {\n registration.config.cleanup();\n } catch (cleanupError) {\n this.log(`Cleanup error during unregister: ${String(action)}`, cleanupError, 'warn');\n }\n }\n \n this.log(`Handler unregistered: ${String(action)}`, {\n handlerId,\n remainingHandlers: pipeline.length\n });\n }\n };\n }\n\n /**\n * Gets the total count of registered unregister functions\n * \n * @returns Number of unregister functions\n * @public\n */\n getUnregisterFunctionCount(): number {\n return this.unregisterFunctions.size;\n }\n \n /**\n * Checks if an unregister function exists for the given handler ID\n * \n * @param handlerId - Handler identifier to check\n * @returns True if unregister function exists\n * @public\n */\n hasUnregisterFunction(handlerId: string): boolean {\n return this.unregisterFunctions.has(handlerId);\n }\n\n /**\n * 🆕 Destroy method for comprehensive cleanup\n * \n * Cleans up all internal resources including pipelines, guards, queues, and statistics.\n * Should be called when the ActionRegister is no longer needed to prevent memory leaks.\n * \n * @public\n */\n destroy(): void {\n // Execute all unregister functions to properly clean up handlers\n this.unregisterFunctions.forEach(unregister => {\n try {\n unregister();\n } catch (error) {\n this.log('Error during unregister in destroy', error, 'error');\n }\n });\n \n this.unregisterFunctions.clear();\n \n // Clean up all pipelines\n this.pipelines.clear();\n \n // Clean up guard system\n this.actionGuard.destroy();\n \n // Clean up queues if they exist\n this.dispatchQueue?.clear?.();\n \n this.actionExecutionModes.clear();\n \n // Cache disabled\n \n // 🔧 Clean up controller pool\n this.controllerPool.length = 0;\n \n this.log('ActionRegister destroyed');\n }\n}","/**\n * @fileoverview React integration helpers for ActionRegister\n * \n * Provides React-specific utilities and hooks for seamless integration\n * with React components and lifecycle management.\n * \n * Note: This file provides utilities for React integration but does not\n * have direct React dependencies. Import React types externally when used.\n */\n\nimport type { \n ActionPayloadMap, \n ActionHandler, \n HandlerConfig,\n UnregisterFunction\n} from './types.js';\nimport type { ActionRegister } from './ActionRegister.js';\n\n/**\n * 🔧 Create action handler registration configuration for React components\n * \n * Creates a configuration object that can be used with React's useEffect to properly\n * register and unregister action handlers with lifecycle management and cleanup.\n * This is NOT a hook - it's a factory function for React hook integration.\n * \n * @template T - ActionPayloadMap type\n * @template K - Action key type\n * \n * @param registry - ActionRegister instance\n * @param action - Action name to register handler for\n * @param handler - Handler function (should be memoized with useCallback)\n * @param config - Handler configuration\n * \n * @returns Configuration object with register/unregister functions\n * \n * @example Basic Usage with useEffect\n * ```tsx\n * import { useCallback, useEffect } from 'react';\n * import { createActionHandler } from '@context-action/core/react-helpers';\n * \n * function MyComponent() {\n * const registry = useActionRegister();\n * \n * const handleUserUpdate = useCallback(async (payload, controller) => {\n * // Handler logic here\n * }, []);\n * \n * useEffect(() => {\n * const { register, unregister } = createActionHandler(\n * registry,\n * 'updateUser',\n * handleUserUpdate,\n * { priority: 10 }\n * );\n * \n * const cleanup = register();\n * return () => {\n * cleanup();\n * unregister();\n * };\n * }, [registry, handleUserUpdate]);\n * }\n * ```\n * \n * @example With Automatic Cleanup\n * ```tsx\n * const [userId, setUserId] = useState('123');\n * \n * const handleUserUpdate = useCallback(async (payload, controller) => {\n * console.log('Updating user:', userId, payload);\n * }, [userId]);\n * \n * useEffect(() => {\n * const handlerManager = createActionHandler(\n * registry,\n * 'updateUser',\n * handleUserUpdate,\n * { priority: 10 }\n * );\n * \n * // Simplified registration with automatic cleanup\n * return handlerManager.registerWithCleanup();\n * }, [registry, handleUserUpdate, userId]);\n * ```\n * \n * @public\n */\nexport function createActionHandler<T extends ActionPayloadMap, K extends keyof T>(\n registry: ActionRegister<T>,\n action: K,\n handler: ActionHandler<T[K]>,\n config?: HandlerConfig\n): {\n register: () => UnregisterFunction;\n unregister: () => void;\n registerWithCleanup: () => () => void;\n config: Required<HandlerConfig>;\n} {\n // Inline React-optimized handler configuration\n const timestamp = Date.now();\n const random = Math.random().toString(36).substr(2, 5);\n \n const finalConfig: Required<HandlerConfig> = {\n priority: config?.priority ?? 0,\n id: config?.id || `react_${String(action)}_${timestamp}_${random}`,\n blocking: config?.blocking ?? false,\n once: config?.once ?? false,\n debounce: config?.debounce ?? undefined,\n throttle: config?.throttle ?? undefined,\n // React-optimized defaults\n replaceExisting: true, // Always replace in React (handles HMR/remounting)\n } as Required<HandlerConfig>;\n let currentUnregister: UnregisterFunction | undefined;\n let isRegistered = false;\n \n return {\n /**\n * Register the handler and return cleanup function\n */\n register(): UnregisterFunction {\n if (isRegistered && currentUnregister) {\n // Clean up previous registration\n currentUnregister();\n }\n \n currentUnregister = registry.register(action, handler, finalConfig);\n isRegistered = true;\n \n return currentUnregister;\n },\n \n /**\n * Unregister the handler if currently registered\n */\n unregister(): void {\n if (isRegistered && currentUnregister) {\n currentUnregister();\n currentUnregister = undefined;\n isRegistered = false;\n }\n },\n \n /**\n * Register and return cleanup function (React useEffect pattern)\n */\n registerWithCleanup(): () => void {\n const unregisterFn = this.register();\n \n return () => {\n unregisterFn();\n this.unregister();\n };\n },\n \n config: finalConfig\n };\n}\n\n\n/**\n * 🆕 React development utilities\n * \n * Provides debugging and development helpers specifically for React environments.\n */\nexport const ReactDevUtils = {\n /**\n * Enable detailed React integration debugging\n */\n enableDebugMode(): void {\n if (typeof window !== 'undefined') {\n (window as any).__CONTEXT_ACTION_REACT_DEBUG__ = true;\n }\n },\n\n /**\n * Disable React integration debugging\n */\n disableDebugMode(): void {\n if (typeof window !== 'undefined') {\n (window as any).__CONTEXT_ACTION_REACT_DEBUG__ = false;\n }\n },\n\n /**\n * Check if React debug mode is enabled\n */\n isDebugMode(): boolean {\n return typeof window !== 'undefined' && \n Boolean((window as any).__CONTEXT_ACTION_REACT_DEBUG__);\n },\n\n /**\n * Log React-specific debugging information\n */\n log(component: string, action: string, message: string, data?: any): void {\n if (this.isDebugMode()) {\n console.log(`🎯 [React-ActionRegister] [${component}] ${action}: ${message}`, data || '');\n }\n },\n\n /**\n * Get React integration statistics\n */\n getStats(registry: ActionRegister<any>): {\n totalHandlers: number;\n reactHandlers: number;\n registryInfo: ReturnType<ActionRegister<any>['getRegistryInfo']>;\n } {\n const registryInfo = registry.getRegistryInfo();\n \n // Count React handlers (handlers with 'react' in their ID)\n let reactHandlers = 0;\n registry.getRegisteredActions().forEach((action: keyof any) => {\n const stats = registry.getActionStats(action);\n if (stats) {\n stats.handlersByPriority.forEach((priorityGroup: any) => {\n priorityGroup.handlers.forEach((handler: any) => {\n if (handler.id.includes('react')) {\n reactHandlers++;\n }\n });\n });\n }\n });\n\n return {\n totalHandlers: registryInfo.totalHandlers,\n reactHandlers,\n registryInfo\n };\n }\n};\n\n/**\n * 🆕 React Error Boundary integration\n * \n * Utilities for integrating ActionRegister errors with React Error Boundaries.\n */\nexport class ReactActionError extends Error {\n public readonly action: string;\n public readonly payload?: any;\n public readonly handlerId: string | undefined;\n public readonly timestamp: number;\n\n constructor(\n message: string,\n action: string,\n payload?: any,\n handlerId: string | undefined = undefined,\n originalError?: Error\n ) {\n super(message);\n this.name = 'ReactActionError';\n this.action = action;\n this.payload = payload;\n this.handlerId = handlerId;\n this.timestamp = Date.now();\n\n // Maintain original error stack if available\n if (originalError && originalError.stack) {\n this.stack = originalError.stack;\n }\n }\n\n /**\n * Create a React Error Boundary compatible error\n */\n static fromActionError(\n originalError: Error,\n action: string,\n payload?: any,\n handlerId?: string\n ): ReactActionError {\n return new ReactActionError(\n `Action '${action}' failed: ${originalError.message}`,\n action,\n payload,\n handlerId,\n originalError\n );\n }\n}\n\n/**\n * 🆕 Type guard for React Action Errors\n * \n * @param error - Error to check\n * @returns True if error is a ReactActionError\n */\nexport function isReactActionError(error: any): error is ReactActionError {\n return error instanceof ReactActionError;\n}"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@context-action/core",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "type": "module",
5
5
  "description": "Type-safe action pipeline management library for JavaScript/TypeScript",
6
6
  "main": "dist/index.cjs",
@@ -75,5 +75,5 @@
75
75
  "engines": {
76
76
  "node": ">=18.0.0"
77
77
  },
78
- "gitHead": "dcbd797f8163afac0a0454c05799c95baa6da384"
78
+ "gitHead": "a507727ec177f49d58106779953283723013929a"
79
79
  }