@blokjs/runner 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Blok.d.ts +19 -0
- package/dist/Blok.js +184 -0
- package/dist/Blok.js.map +1 -0
- package/dist/BlokResponse.d.ts +16 -0
- package/dist/BlokResponse.js +28 -0
- package/dist/BlokResponse.js.map +1 -0
- package/dist/Configuration.d.ts +37 -0
- package/dist/Configuration.js +248 -0
- package/dist/Configuration.js.map +1 -0
- package/dist/ConfigurationResolver.d.ts +7 -0
- package/dist/ConfigurationResolver.js +15 -0
- package/dist/ConfigurationResolver.js.map +1 -0
- package/dist/DefaultLogger.d.ts +65 -0
- package/dist/DefaultLogger.js +101 -0
- package/dist/DefaultLogger.js.map +1 -0
- package/dist/LocalStorage.d.ts +7 -0
- package/dist/LocalStorage.js +56 -0
- package/dist/LocalStorage.js.map +1 -0
- package/dist/MemoryUsage.d.ts +22 -0
- package/dist/MemoryUsage.js +83 -0
- package/dist/MemoryUsage.js.map +1 -0
- package/dist/NodeMap.d.ts +7 -0
- package/dist/NodeMap.js +13 -0
- package/dist/NodeMap.js.map +1 -0
- package/dist/ResolverBase.d.ts +8 -0
- package/dist/ResolverBase.js +18 -0
- package/dist/ResolverBase.js.map +1 -0
- package/dist/Runner.d.ts +25 -0
- package/dist/Runner.js +32 -0
- package/dist/Runner.js.map +1 -0
- package/dist/RunnerNode.d.ts +9 -0
- package/dist/RunnerNode.js +8 -0
- package/dist/RunnerNode.js.map +1 -0
- package/dist/RunnerNodeBase.d.ts +4 -0
- package/dist/RunnerNodeBase.js +3 -0
- package/dist/RunnerNodeBase.js.map +1 -0
- package/dist/RunnerSteps.d.ts +14 -0
- package/dist/RunnerSteps.js +110 -0
- package/dist/RunnerSteps.js.map +1 -0
- package/dist/RuntimeAdapterNode.d.ts +19 -0
- package/dist/RuntimeAdapterNode.js +87 -0
- package/dist/RuntimeAdapterNode.js.map +1 -0
- package/dist/RuntimeRegistry.d.ts +61 -0
- package/dist/RuntimeRegistry.js +87 -0
- package/dist/RuntimeRegistry.js.map +1 -0
- package/dist/TriggerBase.d.ts +119 -0
- package/dist/TriggerBase.js +413 -0
- package/dist/TriggerBase.js.map +1 -0
- package/dist/adapters/BunRuntimeAdapter.d.ts +38 -0
- package/dist/adapters/BunRuntimeAdapter.js +169 -0
- package/dist/adapters/BunRuntimeAdapter.js.map +1 -0
- package/dist/adapters/DockerRuntimeAdapter.d.ts +85 -0
- package/dist/adapters/DockerRuntimeAdapter.js +298 -0
- package/dist/adapters/DockerRuntimeAdapter.js.map +1 -0
- package/dist/adapters/HttpRuntimeAdapter.d.ts +58 -0
- package/dist/adapters/HttpRuntimeAdapter.js +152 -0
- package/dist/adapters/HttpRuntimeAdapter.js.map +1 -0
- package/dist/adapters/NodeJsRuntimeAdapter.d.ts +23 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js +67 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -0
- package/dist/adapters/RuntimeAdapter.d.ts +42 -0
- package/dist/adapters/RuntimeAdapter.js +2 -0
- package/dist/adapters/RuntimeAdapter.js.map +1 -0
- package/dist/adapters/WasmRuntimeAdapter.d.ts +69 -0
- package/dist/adapters/WasmRuntimeAdapter.js +279 -0
- package/dist/adapters/WasmRuntimeAdapter.js.map +1 -0
- package/dist/cache/NodeResultCache.d.ts +286 -0
- package/dist/cache/NodeResultCache.js +499 -0
- package/dist/cache/NodeResultCache.js.map +1 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cost/CostEstimator.d.ts +57 -0
- package/dist/cost/CostEstimator.js +171 -0
- package/dist/cost/CostEstimator.js.map +1 -0
- package/dist/cost/index.d.ts +4 -0
- package/dist/cost/index.js +3 -0
- package/dist/cost/index.js.map +1 -0
- package/dist/cost/pricing.d.ts +24 -0
- package/dist/cost/pricing.js +169 -0
- package/dist/cost/pricing.js.map +1 -0
- package/dist/defineNode.d.ts +155 -0
- package/dist/defineNode.js +191 -0
- package/dist/defineNode.js.map +1 -0
- package/dist/graphql/GraphQLSchemaGenerator.d.ts +129 -0
- package/dist/graphql/GraphQLSchemaGenerator.js +425 -0
- package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -0
- package/dist/hmr/FileWatcher.d.ts +62 -0
- package/dist/hmr/FileWatcher.js +185 -0
- package/dist/hmr/FileWatcher.js.map +1 -0
- package/dist/hmr/HmrDevConsole.d.ts +13 -0
- package/dist/hmr/HmrDevConsole.js +46 -0
- package/dist/hmr/HmrDevConsole.js.map +1 -0
- package/dist/hmr/HotReloadManager.d.ts +84 -0
- package/dist/hmr/HotReloadManager.js +195 -0
- package/dist/hmr/HotReloadManager.js.map +1 -0
- package/dist/hmr/index.d.ts +39 -0
- package/dist/hmr/index.js +38 -0
- package/dist/hmr/index.js.map +1 -0
- package/dist/index.d.ts +107 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/APMIntegration.d.ts +141 -0
- package/dist/integrations/APMIntegration.js +212 -0
- package/dist/integrations/APMIntegration.js.map +1 -0
- package/dist/integrations/AzureMonitorIntegration.d.ts +118 -0
- package/dist/integrations/AzureMonitorIntegration.js +254 -0
- package/dist/integrations/AzureMonitorIntegration.js.map +1 -0
- package/dist/integrations/CloudWatchIntegration.d.ts +135 -0
- package/dist/integrations/CloudWatchIntegration.js +293 -0
- package/dist/integrations/CloudWatchIntegration.js.map +1 -0
- package/dist/integrations/SentryIntegration.d.ts +153 -0
- package/dist/integrations/SentryIntegration.js +200 -0
- package/dist/integrations/SentryIntegration.js.map +1 -0
- package/dist/integrations/index.d.ts +19 -0
- package/dist/integrations/index.js +16 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/marketplace/RuntimeAutoScaler.d.ts +148 -0
- package/dist/marketplace/RuntimeAutoScaler.js +366 -0
- package/dist/marketplace/RuntimeAutoScaler.js.map +1 -0
- package/dist/marketplace/RuntimeCatalog.d.ts +174 -0
- package/dist/marketplace/RuntimeCatalog.js +339 -0
- package/dist/marketplace/RuntimeCatalog.js.map +1 -0
- package/dist/marketplace/RuntimeDiscovery.d.ts +86 -0
- package/dist/marketplace/RuntimeDiscovery.js +219 -0
- package/dist/marketplace/RuntimeDiscovery.js.map +1 -0
- package/dist/marketplace/RuntimeHealthMonitor.d.ts +100 -0
- package/dist/marketplace/RuntimeHealthMonitor.js +241 -0
- package/dist/marketplace/RuntimeHealthMonitor.js.map +1 -0
- package/dist/marketplace/RuntimeMetricsDashboard.d.ts +113 -0
- package/dist/marketplace/RuntimeMetricsDashboard.js +293 -0
- package/dist/marketplace/RuntimeMetricsDashboard.js.map +1 -0
- package/dist/monitoring/CircuitBreaker.d.ts +107 -0
- package/dist/monitoring/CircuitBreaker.js +238 -0
- package/dist/monitoring/CircuitBreaker.js.map +1 -0
- package/dist/monitoring/DistributedTracer.d.ts +125 -0
- package/dist/monitoring/DistributedTracer.js +230 -0
- package/dist/monitoring/DistributedTracer.js.map +1 -0
- package/dist/monitoring/HealthCheck.d.ts +54 -0
- package/dist/monitoring/HealthCheck.js +102 -0
- package/dist/monitoring/HealthCheck.js.map +1 -0
- package/dist/monitoring/PerformanceProfiler.d.ts +63 -0
- package/dist/monitoring/PerformanceProfiler.js +229 -0
- package/dist/monitoring/PerformanceProfiler.js.map +1 -0
- package/dist/monitoring/PrometheusBootstrap.d.ts +30 -0
- package/dist/monitoring/PrometheusBootstrap.js +71 -0
- package/dist/monitoring/PrometheusBootstrap.js.map +1 -0
- package/dist/monitoring/PrometheusMetricsBridge.d.ts +60 -0
- package/dist/monitoring/PrometheusMetricsBridge.js +216 -0
- package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -0
- package/dist/monitoring/RateLimiter.d.ts +58 -0
- package/dist/monitoring/RateLimiter.js +128 -0
- package/dist/monitoring/RateLimiter.js.map +1 -0
- package/dist/monitoring/StructuredLogger.d.ts +131 -0
- package/dist/monitoring/StructuredLogger.js +207 -0
- package/dist/monitoring/StructuredLogger.js.map +1 -0
- package/dist/monitoring/TracingBootstrap.d.ts +69 -0
- package/dist/monitoring/TracingBootstrap.js +129 -0
- package/dist/monitoring/TracingBootstrap.js.map +1 -0
- package/dist/monitoring/TriggerMetricsCollector.d.ts +94 -0
- package/dist/monitoring/TriggerMetricsCollector.js +174 -0
- package/dist/monitoring/TriggerMetricsCollector.js.map +1 -0
- package/dist/monitoring/index.d.ts +9 -0
- package/dist/monitoring/index.js +10 -0
- package/dist/monitoring/index.js.map +1 -0
- package/dist/openapi/OpenAPIGenerator.d.ts +192 -0
- package/dist/openapi/OpenAPIGenerator.js +373 -0
- package/dist/openapi/OpenAPIGenerator.js.map +1 -0
- package/dist/openapi/index.d.ts +20 -0
- package/dist/openapi/index.js +20 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/security/ABAC.d.ts +224 -0
- package/dist/security/ABAC.js +380 -0
- package/dist/security/ABAC.js.map +1 -0
- package/dist/security/AuditLogger.d.ts +242 -0
- package/dist/security/AuditLogger.js +317 -0
- package/dist/security/AuditLogger.js.map +1 -0
- package/dist/security/AuthMiddleware.d.ts +163 -0
- package/dist/security/AuthMiddleware.js +274 -0
- package/dist/security/AuthMiddleware.js.map +1 -0
- package/dist/security/EncryptionAtRest.d.ts +206 -0
- package/dist/security/EncryptionAtRest.js +236 -0
- package/dist/security/EncryptionAtRest.js.map +1 -0
- package/dist/security/OAuthProvider.d.ts +334 -0
- package/dist/security/OAuthProvider.js +719 -0
- package/dist/security/OAuthProvider.js.map +1 -0
- package/dist/security/PIIDetector.d.ts +233 -0
- package/dist/security/PIIDetector.js +354 -0
- package/dist/security/PIIDetector.js.map +1 -0
- package/dist/security/RBAC.d.ts +143 -0
- package/dist/security/RBAC.js +285 -0
- package/dist/security/RBAC.js.map +1 -0
- package/dist/security/SecretManager.d.ts +652 -0
- package/dist/security/SecretManager.js +1146 -0
- package/dist/security/SecretManager.js.map +1 -0
- package/dist/security/TLSConfig.d.ts +305 -0
- package/dist/security/TLSConfig.js +550 -0
- package/dist/security/TLSConfig.js.map +1 -0
- package/dist/security/index.d.ts +79 -0
- package/dist/security/index.js +80 -0
- package/dist/security/index.js.map +1 -0
- package/dist/testing/TestHarness.d.ts +189 -0
- package/dist/testing/TestHarness.js +272 -0
- package/dist/testing/TestHarness.js.map +1 -0
- package/dist/testing/TestLogger.d.ts +103 -0
- package/dist/testing/TestLogger.js +153 -0
- package/dist/testing/TestLogger.js.map +1 -0
- package/dist/testing/WorkflowTestRunner.d.ts +172 -0
- package/dist/testing/WorkflowTestRunner.js +355 -0
- package/dist/testing/WorkflowTestRunner.js.map +1 -0
- package/dist/testing/index.d.ts +21 -0
- package/dist/testing/index.js +22 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tracing/InMemoryRunStore.d.ts +44 -0
- package/dist/tracing/InMemoryRunStore.js +341 -0
- package/dist/tracing/InMemoryRunStore.js.map +1 -0
- package/dist/tracing/PostgresRunStore.d.ts +82 -0
- package/dist/tracing/PostgresRunStore.js +640 -0
- package/dist/tracing/PostgresRunStore.js.map +1 -0
- package/dist/tracing/RunStore.d.ts +38 -0
- package/dist/tracing/RunStore.js +2 -0
- package/dist/tracing/RunStore.js.map +1 -0
- package/dist/tracing/RunTracker.d.ts +75 -0
- package/dist/tracing/RunTracker.js +374 -0
- package/dist/tracing/RunTracker.js.map +1 -0
- package/dist/tracing/SqliteRunStore.d.ts +53 -0
- package/dist/tracing/SqliteRunStore.js +703 -0
- package/dist/tracing/SqliteRunStore.js.map +1 -0
- package/dist/tracing/TraceRouter.d.ts +47 -0
- package/dist/tracing/TraceRouter.js +904 -0
- package/dist/tracing/TraceRouter.js.map +1 -0
- package/dist/tracing/TracingLogger.d.ts +21 -0
- package/dist/tracing/TracingLogger.js +62 -0
- package/dist/tracing/TracingLogger.js.map +1 -0
- package/dist/tracing/createStore.d.ts +30 -0
- package/dist/tracing/createStore.js +75 -0
- package/dist/tracing/createStore.js.map +1 -0
- package/dist/tracing/index.d.ts +13 -0
- package/dist/tracing/index.js +9 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/sanitize.d.ts +7 -0
- package/dist/tracing/sanitize.js +95 -0
- package/dist/tracing/sanitize.js.map +1 -0
- package/dist/tracing/types.d.ts +178 -0
- package/dist/tracing/types.js +3 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types/Average.d.ts +11 -0
- package/dist/types/Average.js +2 -0
- package/dist/types/Average.js.map +1 -0
- package/dist/types/Condition.d.ts +8 -0
- package/dist/types/Condition.js +2 -0
- package/dist/types/Condition.js.map +1 -0
- package/dist/types/Conditions.d.ts +5 -0
- package/dist/types/Conditions.js +2 -0
- package/dist/types/Conditions.js.map +1 -0
- package/dist/types/Config.d.ts +12 -0
- package/dist/types/Config.js +2 -0
- package/dist/types/Config.js.map +1 -0
- package/dist/types/Flow.d.ts +5 -0
- package/dist/types/Flow.js +2 -0
- package/dist/types/Flow.js.map +1 -0
- package/dist/types/GlobalOptions.d.ts +11 -0
- package/dist/types/GlobalOptions.js +2 -0
- package/dist/types/GlobalOptions.js.map +1 -0
- package/dist/types/Inputs.d.ts +5 -0
- package/dist/types/Inputs.js +2 -0
- package/dist/types/Inputs.js.map +1 -0
- package/dist/types/JsonLikeObject.d.ts +3 -0
- package/dist/types/JsonLikeObject.js +2 -0
- package/dist/types/JsonLikeObject.js.map +1 -0
- package/dist/types/Mapper.d.ts +5 -0
- package/dist/types/Mapper.js +2 -0
- package/dist/types/Mapper.js.map +1 -0
- package/dist/types/Node.d.ts +10 -0
- package/dist/types/Node.js +2 -0
- package/dist/types/Node.js.map +1 -0
- package/dist/types/ParamsDictionary.d.ts +3 -0
- package/dist/types/ParamsDictionary.js +2 -0
- package/dist/types/ParamsDictionary.js.map +1 -0
- package/dist/types/Properties.d.ts +5 -0
- package/dist/types/Properties.js +2 -0
- package/dist/types/Properties.js.map +1 -0
- package/dist/types/Targets.d.ts +5 -0
- package/dist/types/Targets.js +2 -0
- package/dist/types/Targets.js.map +1 -0
- package/dist/types/Trigger.d.ts +5 -0
- package/dist/types/Trigger.js +2 -0
- package/dist/types/Trigger.js.map +1 -0
- package/dist/types/TriggerHttp.d.ts +7 -0
- package/dist/types/TriggerHttp.js +2 -0
- package/dist/types/TriggerHttp.js.map +1 -0
- package/dist/types/TriggerResponse.d.ts +6 -0
- package/dist/types/TriggerResponse.js +2 -0
- package/dist/types/TriggerResponse.js.map +1 -0
- package/dist/types/Triggers.d.ts +5 -0
- package/dist/types/Triggers.js +2 -0
- package/dist/types/Triggers.js.map +1 -0
- package/dist/types/TryCatch.d.ts +6 -0
- package/dist/types/TryCatch.js +2 -0
- package/dist/types/TryCatch.js.map +1 -0
- package/dist/visualization/NodeDependencyGraph.d.ts +76 -0
- package/dist/visualization/NodeDependencyGraph.js +418 -0
- package/dist/visualization/NodeDependencyGraph.js.map +1 -0
- package/dist/visualization/WorkflowVisualizer.d.ts +144 -0
- package/dist/visualization/WorkflowVisualizer.js +446 -0
- package/dist/visualization/WorkflowVisualizer.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Watcher for Hot Module Replacement (HMR)
|
|
3
|
+
*
|
|
4
|
+
* Watches file system for changes in nodes, workflows, and triggers,
|
|
5
|
+
* then emits reload events for the appropriate components.
|
|
6
|
+
*
|
|
7
|
+
* Uses Node.js fs.watch with debouncing to avoid duplicate events.
|
|
8
|
+
*/
|
|
9
|
+
import { EventEmitter } from "node:events";
|
|
10
|
+
import { watch } from "node:fs";
|
|
11
|
+
import { readdir, stat } from "node:fs/promises";
|
|
12
|
+
import { extname, join, relative } from "node:path";
|
|
13
|
+
const DEFAULT_CONFIG = {
|
|
14
|
+
nodePaths: [],
|
|
15
|
+
workflowPaths: [],
|
|
16
|
+
triggerPaths: [],
|
|
17
|
+
extensions: [".ts", ".js", ".json"],
|
|
18
|
+
debounceMs: 250,
|
|
19
|
+
ignorePatterns: ["node_modules", "dist", ".git", "__tests__", ".d.ts"],
|
|
20
|
+
verbose: false,
|
|
21
|
+
};
|
|
22
|
+
export class FileWatcher extends EventEmitter {
|
|
23
|
+
config;
|
|
24
|
+
watchers = new Map();
|
|
25
|
+
debounceTimers = new Map();
|
|
26
|
+
knownFiles = new Set();
|
|
27
|
+
running = false;
|
|
28
|
+
constructor(config = {}) {
|
|
29
|
+
super();
|
|
30
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Start watching all configured directories
|
|
34
|
+
*/
|
|
35
|
+
async start() {
|
|
36
|
+
if (this.running)
|
|
37
|
+
return;
|
|
38
|
+
this.running = true;
|
|
39
|
+
const allPaths = [
|
|
40
|
+
...this.config.nodePaths.map((p) => ({ path: p, category: "node" })),
|
|
41
|
+
...this.config.workflowPaths.map((p) => ({ path: p, category: "workflow" })),
|
|
42
|
+
...this.config.triggerPaths.map((p) => ({ path: p, category: "trigger" })),
|
|
43
|
+
];
|
|
44
|
+
for (const { path, category } of allPaths) {
|
|
45
|
+
await this.watchDirectory(path, category);
|
|
46
|
+
}
|
|
47
|
+
this.emit("ready", { watchedPaths: allPaths.map((p) => p.path) });
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Stop all watchers and clean up
|
|
51
|
+
*/
|
|
52
|
+
async stop() {
|
|
53
|
+
this.running = false;
|
|
54
|
+
for (const [_path, watcher] of this.watchers) {
|
|
55
|
+
watcher.close();
|
|
56
|
+
}
|
|
57
|
+
this.watchers.clear();
|
|
58
|
+
for (const timer of this.debounceTimers.values()) {
|
|
59
|
+
clearTimeout(timer);
|
|
60
|
+
}
|
|
61
|
+
this.debounceTimers.clear();
|
|
62
|
+
this.knownFiles.clear();
|
|
63
|
+
this.removeAllListeners();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get current watcher status
|
|
67
|
+
*/
|
|
68
|
+
getStatus() {
|
|
69
|
+
return {
|
|
70
|
+
running: this.running,
|
|
71
|
+
watchedDirectories: this.watchers.size,
|
|
72
|
+
knownFiles: this.knownFiles.size,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async watchDirectory(dirPath, category) {
|
|
76
|
+
try {
|
|
77
|
+
// Index existing files
|
|
78
|
+
await this.indexDirectory(dirPath);
|
|
79
|
+
// Create recursive watcher
|
|
80
|
+
const watcher = watch(dirPath, { recursive: true }, (eventType, filename) => {
|
|
81
|
+
if (!filename)
|
|
82
|
+
return;
|
|
83
|
+
const fullPath = join(dirPath, filename);
|
|
84
|
+
this.handleFsEvent(eventType, fullPath, dirPath, category);
|
|
85
|
+
});
|
|
86
|
+
watcher.on("error", (err) => {
|
|
87
|
+
this.emit("error", { path: dirPath, error: err });
|
|
88
|
+
});
|
|
89
|
+
this.watchers.set(dirPath, watcher);
|
|
90
|
+
if (this.config.verbose) {
|
|
91
|
+
this.emit("log", `Watching ${category} directory: ${dirPath}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
this.emit("error", { path: dirPath, error: err });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async indexDirectory(dirPath) {
|
|
99
|
+
try {
|
|
100
|
+
const entries = await readdir(dirPath, { recursive: true });
|
|
101
|
+
for (const entry of entries) {
|
|
102
|
+
const fullPath = join(dirPath, entry.toString());
|
|
103
|
+
if (this.shouldIgnore(fullPath))
|
|
104
|
+
continue;
|
|
105
|
+
if (!this.isWatchedExtension(fullPath))
|
|
106
|
+
continue;
|
|
107
|
+
try {
|
|
108
|
+
const stats = await stat(fullPath);
|
|
109
|
+
if (stats.isFile()) {
|
|
110
|
+
this.knownFiles.add(fullPath);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// File may have been deleted between readdir and stat
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Directory may not exist yet
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
handleFsEvent(eventType, filePath, baseDir, category) {
|
|
123
|
+
if (this.shouldIgnore(filePath))
|
|
124
|
+
return;
|
|
125
|
+
if (!this.isWatchedExtension(filePath))
|
|
126
|
+
return;
|
|
127
|
+
// Debounce to avoid duplicate events
|
|
128
|
+
const existing = this.debounceTimers.get(filePath);
|
|
129
|
+
if (existing) {
|
|
130
|
+
clearTimeout(existing);
|
|
131
|
+
}
|
|
132
|
+
this.debounceTimers.set(filePath, setTimeout(async () => {
|
|
133
|
+
this.debounceTimers.delete(filePath);
|
|
134
|
+
await this.processChange(filePath, baseDir, category);
|
|
135
|
+
}, this.config.debounceMs));
|
|
136
|
+
}
|
|
137
|
+
async processChange(filePath, baseDir, category) {
|
|
138
|
+
const relativePath = relative(baseDir, filePath);
|
|
139
|
+
let eventType;
|
|
140
|
+
try {
|
|
141
|
+
const stats = await stat(filePath);
|
|
142
|
+
if (stats.isFile()) {
|
|
143
|
+
if (this.knownFiles.has(filePath)) {
|
|
144
|
+
eventType = `${category}:change`;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
this.knownFiles.add(filePath);
|
|
148
|
+
eventType = `${category}:add`;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// File was deleted
|
|
157
|
+
if (this.knownFiles.has(filePath)) {
|
|
158
|
+
this.knownFiles.delete(filePath);
|
|
159
|
+
eventType = `${category}:remove`;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const event = {
|
|
166
|
+
type: eventType,
|
|
167
|
+
filePath,
|
|
168
|
+
relativePath,
|
|
169
|
+
timestamp: Date.now(),
|
|
170
|
+
};
|
|
171
|
+
this.emit("change", event);
|
|
172
|
+
this.emit(eventType, event);
|
|
173
|
+
if (this.config.verbose) {
|
|
174
|
+
this.emit("log", `[HMR] ${eventType}: ${relativePath}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
shouldIgnore(filePath) {
|
|
178
|
+
return this.config.ignorePatterns.some((pattern) => filePath.includes(pattern));
|
|
179
|
+
}
|
|
180
|
+
isWatchedExtension(filePath) {
|
|
181
|
+
const ext = extname(filePath);
|
|
182
|
+
return this.config.extensions.includes(ext);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=FileWatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileWatcher.js","sourceRoot":"","sources":["../../src/hmr/FileWatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMR Dev Console - Formatted developer-friendly output for hot reload events.
|
|
3
|
+
*
|
|
4
|
+
* Subscribes to HotReloadManager events and prints timestamped,
|
|
5
|
+
* color-coded messages to the console during development.
|
|
6
|
+
*/
|
|
7
|
+
import type { HotReloadManager } from "./HotReloadManager";
|
|
8
|
+
export declare class HmrDevConsole {
|
|
9
|
+
private hmr;
|
|
10
|
+
constructor(hmr: HotReloadManager);
|
|
11
|
+
printStats(): void;
|
|
12
|
+
private formatEventType;
|
|
13
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMR Dev Console - Formatted developer-friendly output for hot reload events.
|
|
3
|
+
*
|
|
4
|
+
* Subscribes to HotReloadManager events and prints timestamped,
|
|
5
|
+
* color-coded messages to the console during development.
|
|
6
|
+
*/
|
|
7
|
+
export class HmrDevConsole {
|
|
8
|
+
hmr;
|
|
9
|
+
constructor(hmr) {
|
|
10
|
+
this.hmr = hmr;
|
|
11
|
+
this.hmr.on("ready", (info) => {
|
|
12
|
+
console.log("\n [HMR] Hot reload active");
|
|
13
|
+
console.log(` Watching ${info.watchedPaths.length} director${info.watchedPaths.length === 1 ? "y" : "ies"}`);
|
|
14
|
+
for (const p of info.watchedPaths) {
|
|
15
|
+
console.log(` - ${p}`);
|
|
16
|
+
}
|
|
17
|
+
console.log("");
|
|
18
|
+
});
|
|
19
|
+
this.hmr.on("reload", (event) => {
|
|
20
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
21
|
+
const label = this.formatEventType(event.type);
|
|
22
|
+
console.log(` [HMR] [${timestamp}] ${label}: ${event.relativePath}`);
|
|
23
|
+
});
|
|
24
|
+
this.hmr.on("reload-error", ({ event, error }) => {
|
|
25
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
26
|
+
console.error(` [HMR] [${timestamp}] ERROR ${event.relativePath}: ${error.message}`);
|
|
27
|
+
});
|
|
28
|
+
this.hmr.on("disabled", ({ reason }) => {
|
|
29
|
+
console.error(`\n [HMR] DISABLED: ${reason}\n`);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
printStats() {
|
|
33
|
+
const stats = this.hmr.getStats();
|
|
34
|
+
const uptime = Math.round(stats.uptime / 1000);
|
|
35
|
+
console.log("\n [HMR] Stats:");
|
|
36
|
+
console.log(` Total reloads: ${stats.totalReloads}`);
|
|
37
|
+
console.log(` Nodes: ${stats.nodeReloads} | Workflows: ${stats.workflowReloads} | Triggers: ${stats.triggerReloads}`);
|
|
38
|
+
console.log(` Errors: ${stats.errors}`);
|
|
39
|
+
console.log(` Uptime: ${uptime}s\n`);
|
|
40
|
+
}
|
|
41
|
+
formatEventType(type) {
|
|
42
|
+
const [category, action] = type.split(":");
|
|
43
|
+
return `${category} ${action}`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=HmrDevConsole.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HmrDevConsole.js","sourceRoot":"","sources":["../../src/hmr/HmrDevConsole.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,OAAO,aAAa;IACL;IAApB,YAAoB,GAAqB;QAArB,QAAG,GAAH,GAAG,CAAkB;QACxC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAgC,EAAE,EAAE;YACzD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,YAAY,CAAC,MAAM,YAAY,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9G,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAe,EAAE,EAAE;YACzC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,KAAK,KAAK,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAqC,EAAE,EAAE;YACnF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,YAAY,SAAS,WAAW,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAsB,EAAE,EAAE;YAC1D,OAAO,CAAC,KAAK,CAAC,uBAAuB,MAAM,IAAI,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,UAAU;QACT,MAAM,KAAK,GAAmB,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CACV,cAAc,KAAK,CAAC,WAAW,iBAAiB,KAAK,CAAC,eAAe,gBAAgB,KAAK,CAAC,cAAc,EAAE,CAC3G,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,KAAK,CAAC,CAAC;IACzC,CAAC;IAEO,eAAe,CAAC,IAAY;QACnC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;IAChC,CAAC;CACD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hot Reload Manager for Blok Framework
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates hot module replacement across the framework:
|
|
5
|
+
* - Node hot-reload: Invalidates module cache and re-imports changed nodes
|
|
6
|
+
* - Workflow hot-reload: Re-reads workflow JSON/TS and reinitializes Configuration
|
|
7
|
+
* - Trigger hot-reload: Signals triggers to reload their workflow registrations
|
|
8
|
+
*
|
|
9
|
+
* Integrates with RuntimeRegistry.replace() for runtime adapter hot-swapping.
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from "node:events";
|
|
12
|
+
import { type FileWatcherConfig, type HMREvent } from "./FileWatcher";
|
|
13
|
+
export interface HotReloadStats {
|
|
14
|
+
totalReloads: number;
|
|
15
|
+
nodeReloads: number;
|
|
16
|
+
workflowReloads: number;
|
|
17
|
+
triggerReloads: number;
|
|
18
|
+
errors: number;
|
|
19
|
+
lastReload: number | null;
|
|
20
|
+
lastError: string | null;
|
|
21
|
+
uptime: number;
|
|
22
|
+
}
|
|
23
|
+
export type ReloadHandler = (event: HMREvent) => Promise<void> | void;
|
|
24
|
+
export interface HotReloadManagerConfig extends FileWatcherConfig {
|
|
25
|
+
/** Enable/disable hot reload (default: true in dev, false in prod) */
|
|
26
|
+
enabled?: boolean;
|
|
27
|
+
/** Maximum consecutive errors before disabling hot-reload */
|
|
28
|
+
maxConsecutiveErrors?: number;
|
|
29
|
+
/** Cooldown between reloads of the same file in ms (default: 1000) */
|
|
30
|
+
cooldownMs?: number;
|
|
31
|
+
}
|
|
32
|
+
export declare class HotReloadManager extends EventEmitter {
|
|
33
|
+
private fileWatcher;
|
|
34
|
+
private config;
|
|
35
|
+
private stats;
|
|
36
|
+
private startTime;
|
|
37
|
+
private consecutiveErrors;
|
|
38
|
+
private disabled;
|
|
39
|
+
private cooldowns;
|
|
40
|
+
/** User-registered handlers for specific event types */
|
|
41
|
+
private nodeChangeHandlers;
|
|
42
|
+
private workflowChangeHandlers;
|
|
43
|
+
private triggerChangeHandlers;
|
|
44
|
+
constructor(config?: HotReloadManagerConfig);
|
|
45
|
+
/**
|
|
46
|
+
* Start the hot reload system
|
|
47
|
+
*/
|
|
48
|
+
start(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Stop the hot reload system
|
|
51
|
+
*/
|
|
52
|
+
stop(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Register a handler for node changes
|
|
55
|
+
*/
|
|
56
|
+
onNodeChange(handler: ReloadHandler): void;
|
|
57
|
+
/**
|
|
58
|
+
* Register a handler for workflow changes
|
|
59
|
+
*/
|
|
60
|
+
onWorkflowChange(handler: ReloadHandler): void;
|
|
61
|
+
/**
|
|
62
|
+
* Register a handler for trigger changes
|
|
63
|
+
*/
|
|
64
|
+
onTriggerChange(handler: ReloadHandler): void;
|
|
65
|
+
/**
|
|
66
|
+
* Get current stats
|
|
67
|
+
*/
|
|
68
|
+
getStats(): HotReloadStats;
|
|
69
|
+
/**
|
|
70
|
+
* Invalidate a module from Node.js require cache
|
|
71
|
+
*/
|
|
72
|
+
invalidateModule(modulePath: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Generate a cache-busted path for ESM dynamic import().
|
|
75
|
+
* Node.js does not expose an ESM module cache, so we append
|
|
76
|
+
* a timestamp query string to force re-evaluation.
|
|
77
|
+
*/
|
|
78
|
+
invalidateEsmModule(modulePath: string): string;
|
|
79
|
+
/**
|
|
80
|
+
* Invalidate all modules matching a pattern
|
|
81
|
+
*/
|
|
82
|
+
invalidateModules(pattern: string | RegExp): number;
|
|
83
|
+
private handleChange;
|
|
84
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hot Reload Manager for Blok Framework
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates hot module replacement across the framework:
|
|
5
|
+
* - Node hot-reload: Invalidates module cache and re-imports changed nodes
|
|
6
|
+
* - Workflow hot-reload: Re-reads workflow JSON/TS and reinitializes Configuration
|
|
7
|
+
* - Trigger hot-reload: Signals triggers to reload their workflow registrations
|
|
8
|
+
*
|
|
9
|
+
* Integrates with RuntimeRegistry.replace() for runtime adapter hot-swapping.
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from "node:events";
|
|
12
|
+
import { FileWatcher } from "./FileWatcher";
|
|
13
|
+
export class HotReloadManager extends EventEmitter {
|
|
14
|
+
fileWatcher;
|
|
15
|
+
config;
|
|
16
|
+
stats;
|
|
17
|
+
startTime;
|
|
18
|
+
consecutiveErrors = 0;
|
|
19
|
+
disabled = false;
|
|
20
|
+
cooldowns = new Map();
|
|
21
|
+
/** User-registered handlers for specific event types */
|
|
22
|
+
nodeChangeHandlers = [];
|
|
23
|
+
workflowChangeHandlers = [];
|
|
24
|
+
triggerChangeHandlers = [];
|
|
25
|
+
constructor(config = {}) {
|
|
26
|
+
super();
|
|
27
|
+
this.config = {
|
|
28
|
+
enabled: process.env.NODE_ENV !== "production",
|
|
29
|
+
maxConsecutiveErrors: 5,
|
|
30
|
+
cooldownMs: 1000,
|
|
31
|
+
...config,
|
|
32
|
+
};
|
|
33
|
+
this.startTime = Date.now();
|
|
34
|
+
this.stats = {
|
|
35
|
+
totalReloads: 0,
|
|
36
|
+
nodeReloads: 0,
|
|
37
|
+
workflowReloads: 0,
|
|
38
|
+
triggerReloads: 0,
|
|
39
|
+
errors: 0,
|
|
40
|
+
lastReload: null,
|
|
41
|
+
lastError: null,
|
|
42
|
+
uptime: 0,
|
|
43
|
+
};
|
|
44
|
+
this.fileWatcher = new FileWatcher(this.config);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Start the hot reload system
|
|
48
|
+
*/
|
|
49
|
+
async start() {
|
|
50
|
+
if (!this.config.enabled) {
|
|
51
|
+
this.emit("log", "[HMR] Hot reload is disabled (production mode)");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.fileWatcher.on("change", (event) => this.handleChange(event));
|
|
55
|
+
this.fileWatcher.on("error", (err) => {
|
|
56
|
+
this.emit("error", err);
|
|
57
|
+
});
|
|
58
|
+
this.fileWatcher.on("log", (msg) => this.emit("log", msg));
|
|
59
|
+
this.fileWatcher.on("ready", (info) => {
|
|
60
|
+
this.emit("ready", info);
|
|
61
|
+
this.emit("log", `[HMR] Hot reload active, watching ${info.watchedPaths.length} directories`);
|
|
62
|
+
});
|
|
63
|
+
await this.fileWatcher.start();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Stop the hot reload system
|
|
67
|
+
*/
|
|
68
|
+
async stop() {
|
|
69
|
+
await this.fileWatcher.stop();
|
|
70
|
+
this.cooldowns.clear();
|
|
71
|
+
this.emit("log", "[HMR] Hot reload stopped");
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Register a handler for node changes
|
|
75
|
+
*/
|
|
76
|
+
onNodeChange(handler) {
|
|
77
|
+
this.nodeChangeHandlers.push(handler);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Register a handler for workflow changes
|
|
81
|
+
*/
|
|
82
|
+
onWorkflowChange(handler) {
|
|
83
|
+
this.workflowChangeHandlers.push(handler);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Register a handler for trigger changes
|
|
87
|
+
*/
|
|
88
|
+
onTriggerChange(handler) {
|
|
89
|
+
this.triggerChangeHandlers.push(handler);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get current stats
|
|
93
|
+
*/
|
|
94
|
+
getStats() {
|
|
95
|
+
return {
|
|
96
|
+
...this.stats,
|
|
97
|
+
uptime: Date.now() - this.startTime,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Invalidate a module from Node.js require cache
|
|
102
|
+
*/
|
|
103
|
+
invalidateModule(modulePath) {
|
|
104
|
+
try {
|
|
105
|
+
// Clear from require cache
|
|
106
|
+
const resolved = require.resolve(modulePath);
|
|
107
|
+
if (require.cache[resolved]) {
|
|
108
|
+
delete require.cache[resolved];
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Generate a cache-busted path for ESM dynamic import().
|
|
119
|
+
* Node.js does not expose an ESM module cache, so we append
|
|
120
|
+
* a timestamp query string to force re-evaluation.
|
|
121
|
+
*/
|
|
122
|
+
invalidateEsmModule(modulePath) {
|
|
123
|
+
return `${modulePath}?t=${Date.now()}`;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Invalidate all modules matching a pattern
|
|
127
|
+
*/
|
|
128
|
+
invalidateModules(pattern) {
|
|
129
|
+
let count = 0;
|
|
130
|
+
const regex = typeof pattern === "string" ? new RegExp(pattern) : pattern;
|
|
131
|
+
for (const key of Object.keys(require.cache)) {
|
|
132
|
+
if (regex.test(key)) {
|
|
133
|
+
delete require.cache[key];
|
|
134
|
+
count++;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return count;
|
|
138
|
+
}
|
|
139
|
+
async handleChange(event) {
|
|
140
|
+
if (this.disabled)
|
|
141
|
+
return;
|
|
142
|
+
// Check cooldown
|
|
143
|
+
const lastReload = this.cooldowns.get(event.filePath);
|
|
144
|
+
if (lastReload && Date.now() - lastReload < (this.config.cooldownMs || 1000)) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
this.cooldowns.set(event.filePath, Date.now());
|
|
148
|
+
try {
|
|
149
|
+
const category = event.type.split(":")[0];
|
|
150
|
+
let handlers;
|
|
151
|
+
switch (category) {
|
|
152
|
+
case "node":
|
|
153
|
+
handlers = this.nodeChangeHandlers;
|
|
154
|
+
// Invalidate module cache for the changed node
|
|
155
|
+
this.invalidateModule(event.filePath);
|
|
156
|
+
this.stats.nodeReloads++;
|
|
157
|
+
break;
|
|
158
|
+
case "workflow":
|
|
159
|
+
handlers = this.workflowChangeHandlers;
|
|
160
|
+
this.stats.workflowReloads++;
|
|
161
|
+
break;
|
|
162
|
+
case "trigger":
|
|
163
|
+
handlers = this.triggerChangeHandlers;
|
|
164
|
+
this.stats.triggerReloads++;
|
|
165
|
+
break;
|
|
166
|
+
default:
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// Execute all registered handlers
|
|
170
|
+
for (const handler of handlers) {
|
|
171
|
+
await handler(event);
|
|
172
|
+
}
|
|
173
|
+
this.stats.totalReloads++;
|
|
174
|
+
this.stats.lastReload = Date.now();
|
|
175
|
+
this.consecutiveErrors = 0;
|
|
176
|
+
this.emit("reload", event);
|
|
177
|
+
this.emit("log", `[HMR] ${event.type}: ${event.relativePath} reloaded successfully`);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
this.stats.errors++;
|
|
181
|
+
this.consecutiveErrors++;
|
|
182
|
+
this.stats.lastError = err instanceof Error ? err.message : String(err);
|
|
183
|
+
this.emit("reload-error", { event, error: err });
|
|
184
|
+
this.emit("log", `[HMR] Error reloading ${event.relativePath}: ${this.stats.lastError}`);
|
|
185
|
+
if (this.consecutiveErrors >= (this.config.maxConsecutiveErrors || 5)) {
|
|
186
|
+
this.disabled = true;
|
|
187
|
+
this.emit("disabled", {
|
|
188
|
+
reason: `Too many consecutive errors (${this.consecutiveErrors})`,
|
|
189
|
+
});
|
|
190
|
+
this.emit("log", `[HMR] Hot reload disabled after ${this.consecutiveErrors} consecutive errors`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=HotReloadManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HotReloadManager.js","sourceRoot":"","sources":["../../src/hmr/HotReloadManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hot Module Replacement (HMR) System for Blok
|
|
3
|
+
*
|
|
4
|
+
* Provides file-watching and hot-reload capabilities for development:
|
|
5
|
+
* - FileWatcher: Low-level file system monitoring with debouncing
|
|
6
|
+
* - HotReloadManager: High-level orchestrator for node/workflow/trigger reloads
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { HotReloadManager } from "@blokjs/runner";
|
|
11
|
+
*
|
|
12
|
+
* const hmr = new HotReloadManager({
|
|
13
|
+
* nodePaths: ["./src/nodes"],
|
|
14
|
+
* workflowPaths: ["./workflows"],
|
|
15
|
+
* triggerPaths: ["./src/triggers"],
|
|
16
|
+
* verbose: true,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Register reload handlers
|
|
20
|
+
* hmr.onNodeChange(async (event) => {
|
|
21
|
+
* console.log(`Node changed: ${event.relativePath}`);
|
|
22
|
+
* // Re-register node in NodeMap
|
|
23
|
+
* const mod = await import(event.filePath);
|
|
24
|
+
* nodeMap.addNode(event.relativePath, mod.default);
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* hmr.onWorkflowChange(async (event) => {
|
|
28
|
+
* console.log(`Workflow changed: ${event.relativePath}`);
|
|
29
|
+
* // Workflow will be re-read on next request via Configuration.init()
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* await hmr.start();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export { FileWatcher } from "./FileWatcher";
|
|
36
|
+
export type { FileWatcherConfig, HMREvent, HMREventType } from "./FileWatcher";
|
|
37
|
+
export { HotReloadManager } from "./HotReloadManager";
|
|
38
|
+
export type { HotReloadManagerConfig, HotReloadStats, ReloadHandler } from "./HotReloadManager";
|
|
39
|
+
export { HmrDevConsole } from "./HmrDevConsole";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hot Module Replacement (HMR) System for Blok
|
|
3
|
+
*
|
|
4
|
+
* Provides file-watching and hot-reload capabilities for development:
|
|
5
|
+
* - FileWatcher: Low-level file system monitoring with debouncing
|
|
6
|
+
* - HotReloadManager: High-level orchestrator for node/workflow/trigger reloads
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { HotReloadManager } from "@blokjs/runner";
|
|
11
|
+
*
|
|
12
|
+
* const hmr = new HotReloadManager({
|
|
13
|
+
* nodePaths: ["./src/nodes"],
|
|
14
|
+
* workflowPaths: ["./workflows"],
|
|
15
|
+
* triggerPaths: ["./src/triggers"],
|
|
16
|
+
* verbose: true,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Register reload handlers
|
|
20
|
+
* hmr.onNodeChange(async (event) => {
|
|
21
|
+
* console.log(`Node changed: ${event.relativePath}`);
|
|
22
|
+
* // Re-register node in NodeMap
|
|
23
|
+
* const mod = await import(event.filePath);
|
|
24
|
+
* nodeMap.addNode(event.relativePath, mod.default);
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* hmr.onWorkflowChange(async (event) => {
|
|
28
|
+
* console.log(`Workflow changed: ${event.relativePath}`);
|
|
29
|
+
* // Workflow will be re-read on next request via Configuration.init()
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* await hmr.start();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export { FileWatcher } from "./FileWatcher";
|
|
36
|
+
export { HotReloadManager } from "./HotReloadManager";
|
|
37
|
+
export { HmrDevConsole } from "./HmrDevConsole";
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hmr/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|