@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.
Files changed (307) hide show
  1. package/dist/Blok.d.ts +19 -0
  2. package/dist/Blok.js +184 -0
  3. package/dist/Blok.js.map +1 -0
  4. package/dist/BlokResponse.d.ts +16 -0
  5. package/dist/BlokResponse.js +28 -0
  6. package/dist/BlokResponse.js.map +1 -0
  7. package/dist/Configuration.d.ts +37 -0
  8. package/dist/Configuration.js +248 -0
  9. package/dist/Configuration.js.map +1 -0
  10. package/dist/ConfigurationResolver.d.ts +7 -0
  11. package/dist/ConfigurationResolver.js +15 -0
  12. package/dist/ConfigurationResolver.js.map +1 -0
  13. package/dist/DefaultLogger.d.ts +65 -0
  14. package/dist/DefaultLogger.js +101 -0
  15. package/dist/DefaultLogger.js.map +1 -0
  16. package/dist/LocalStorage.d.ts +7 -0
  17. package/dist/LocalStorage.js +56 -0
  18. package/dist/LocalStorage.js.map +1 -0
  19. package/dist/MemoryUsage.d.ts +22 -0
  20. package/dist/MemoryUsage.js +83 -0
  21. package/dist/MemoryUsage.js.map +1 -0
  22. package/dist/NodeMap.d.ts +7 -0
  23. package/dist/NodeMap.js +13 -0
  24. package/dist/NodeMap.js.map +1 -0
  25. package/dist/ResolverBase.d.ts +8 -0
  26. package/dist/ResolverBase.js +18 -0
  27. package/dist/ResolverBase.js.map +1 -0
  28. package/dist/Runner.d.ts +25 -0
  29. package/dist/Runner.js +32 -0
  30. package/dist/Runner.js.map +1 -0
  31. package/dist/RunnerNode.d.ts +9 -0
  32. package/dist/RunnerNode.js +8 -0
  33. package/dist/RunnerNode.js.map +1 -0
  34. package/dist/RunnerNodeBase.d.ts +4 -0
  35. package/dist/RunnerNodeBase.js +3 -0
  36. package/dist/RunnerNodeBase.js.map +1 -0
  37. package/dist/RunnerSteps.d.ts +14 -0
  38. package/dist/RunnerSteps.js +110 -0
  39. package/dist/RunnerSteps.js.map +1 -0
  40. package/dist/RuntimeAdapterNode.d.ts +19 -0
  41. package/dist/RuntimeAdapterNode.js +87 -0
  42. package/dist/RuntimeAdapterNode.js.map +1 -0
  43. package/dist/RuntimeRegistry.d.ts +61 -0
  44. package/dist/RuntimeRegistry.js +87 -0
  45. package/dist/RuntimeRegistry.js.map +1 -0
  46. package/dist/TriggerBase.d.ts +119 -0
  47. package/dist/TriggerBase.js +413 -0
  48. package/dist/TriggerBase.js.map +1 -0
  49. package/dist/adapters/BunRuntimeAdapter.d.ts +38 -0
  50. package/dist/adapters/BunRuntimeAdapter.js +169 -0
  51. package/dist/adapters/BunRuntimeAdapter.js.map +1 -0
  52. package/dist/adapters/DockerRuntimeAdapter.d.ts +85 -0
  53. package/dist/adapters/DockerRuntimeAdapter.js +298 -0
  54. package/dist/adapters/DockerRuntimeAdapter.js.map +1 -0
  55. package/dist/adapters/HttpRuntimeAdapter.d.ts +58 -0
  56. package/dist/adapters/HttpRuntimeAdapter.js +152 -0
  57. package/dist/adapters/HttpRuntimeAdapter.js.map +1 -0
  58. package/dist/adapters/NodeJsRuntimeAdapter.d.ts +23 -0
  59. package/dist/adapters/NodeJsRuntimeAdapter.js +67 -0
  60. package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -0
  61. package/dist/adapters/RuntimeAdapter.d.ts +42 -0
  62. package/dist/adapters/RuntimeAdapter.js +2 -0
  63. package/dist/adapters/RuntimeAdapter.js.map +1 -0
  64. package/dist/adapters/WasmRuntimeAdapter.d.ts +69 -0
  65. package/dist/adapters/WasmRuntimeAdapter.js +279 -0
  66. package/dist/adapters/WasmRuntimeAdapter.js.map +1 -0
  67. package/dist/cache/NodeResultCache.d.ts +286 -0
  68. package/dist/cache/NodeResultCache.js +499 -0
  69. package/dist/cache/NodeResultCache.js.map +1 -0
  70. package/dist/cache/index.d.ts +1 -0
  71. package/dist/cache/index.js +2 -0
  72. package/dist/cache/index.js.map +1 -0
  73. package/dist/cost/CostEstimator.d.ts +57 -0
  74. package/dist/cost/CostEstimator.js +171 -0
  75. package/dist/cost/CostEstimator.js.map +1 -0
  76. package/dist/cost/index.d.ts +4 -0
  77. package/dist/cost/index.js +3 -0
  78. package/dist/cost/index.js.map +1 -0
  79. package/dist/cost/pricing.d.ts +24 -0
  80. package/dist/cost/pricing.js +169 -0
  81. package/dist/cost/pricing.js.map +1 -0
  82. package/dist/defineNode.d.ts +155 -0
  83. package/dist/defineNode.js +191 -0
  84. package/dist/defineNode.js.map +1 -0
  85. package/dist/graphql/GraphQLSchemaGenerator.d.ts +129 -0
  86. package/dist/graphql/GraphQLSchemaGenerator.js +425 -0
  87. package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -0
  88. package/dist/hmr/FileWatcher.d.ts +62 -0
  89. package/dist/hmr/FileWatcher.js +185 -0
  90. package/dist/hmr/FileWatcher.js.map +1 -0
  91. package/dist/hmr/HmrDevConsole.d.ts +13 -0
  92. package/dist/hmr/HmrDevConsole.js +46 -0
  93. package/dist/hmr/HmrDevConsole.js.map +1 -0
  94. package/dist/hmr/HotReloadManager.d.ts +84 -0
  95. package/dist/hmr/HotReloadManager.js +195 -0
  96. package/dist/hmr/HotReloadManager.js.map +1 -0
  97. package/dist/hmr/index.d.ts +39 -0
  98. package/dist/hmr/index.js +38 -0
  99. package/dist/hmr/index.js.map +1 -0
  100. package/dist/index.d.ts +107 -0
  101. package/dist/index.js +107 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/integrations/APMIntegration.d.ts +141 -0
  104. package/dist/integrations/APMIntegration.js +212 -0
  105. package/dist/integrations/APMIntegration.js.map +1 -0
  106. package/dist/integrations/AzureMonitorIntegration.d.ts +118 -0
  107. package/dist/integrations/AzureMonitorIntegration.js +254 -0
  108. package/dist/integrations/AzureMonitorIntegration.js.map +1 -0
  109. package/dist/integrations/CloudWatchIntegration.d.ts +135 -0
  110. package/dist/integrations/CloudWatchIntegration.js +293 -0
  111. package/dist/integrations/CloudWatchIntegration.js.map +1 -0
  112. package/dist/integrations/SentryIntegration.d.ts +153 -0
  113. package/dist/integrations/SentryIntegration.js +200 -0
  114. package/dist/integrations/SentryIntegration.js.map +1 -0
  115. package/dist/integrations/index.d.ts +19 -0
  116. package/dist/integrations/index.js +16 -0
  117. package/dist/integrations/index.js.map +1 -0
  118. package/dist/marketplace/RuntimeAutoScaler.d.ts +148 -0
  119. package/dist/marketplace/RuntimeAutoScaler.js +366 -0
  120. package/dist/marketplace/RuntimeAutoScaler.js.map +1 -0
  121. package/dist/marketplace/RuntimeCatalog.d.ts +174 -0
  122. package/dist/marketplace/RuntimeCatalog.js +339 -0
  123. package/dist/marketplace/RuntimeCatalog.js.map +1 -0
  124. package/dist/marketplace/RuntimeDiscovery.d.ts +86 -0
  125. package/dist/marketplace/RuntimeDiscovery.js +219 -0
  126. package/dist/marketplace/RuntimeDiscovery.js.map +1 -0
  127. package/dist/marketplace/RuntimeHealthMonitor.d.ts +100 -0
  128. package/dist/marketplace/RuntimeHealthMonitor.js +241 -0
  129. package/dist/marketplace/RuntimeHealthMonitor.js.map +1 -0
  130. package/dist/marketplace/RuntimeMetricsDashboard.d.ts +113 -0
  131. package/dist/marketplace/RuntimeMetricsDashboard.js +293 -0
  132. package/dist/marketplace/RuntimeMetricsDashboard.js.map +1 -0
  133. package/dist/monitoring/CircuitBreaker.d.ts +107 -0
  134. package/dist/monitoring/CircuitBreaker.js +238 -0
  135. package/dist/monitoring/CircuitBreaker.js.map +1 -0
  136. package/dist/monitoring/DistributedTracer.d.ts +125 -0
  137. package/dist/monitoring/DistributedTracer.js +230 -0
  138. package/dist/monitoring/DistributedTracer.js.map +1 -0
  139. package/dist/monitoring/HealthCheck.d.ts +54 -0
  140. package/dist/monitoring/HealthCheck.js +102 -0
  141. package/dist/monitoring/HealthCheck.js.map +1 -0
  142. package/dist/monitoring/PerformanceProfiler.d.ts +63 -0
  143. package/dist/monitoring/PerformanceProfiler.js +229 -0
  144. package/dist/monitoring/PerformanceProfiler.js.map +1 -0
  145. package/dist/monitoring/PrometheusBootstrap.d.ts +30 -0
  146. package/dist/monitoring/PrometheusBootstrap.js +71 -0
  147. package/dist/monitoring/PrometheusBootstrap.js.map +1 -0
  148. package/dist/monitoring/PrometheusMetricsBridge.d.ts +60 -0
  149. package/dist/monitoring/PrometheusMetricsBridge.js +216 -0
  150. package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -0
  151. package/dist/monitoring/RateLimiter.d.ts +58 -0
  152. package/dist/monitoring/RateLimiter.js +128 -0
  153. package/dist/monitoring/RateLimiter.js.map +1 -0
  154. package/dist/monitoring/StructuredLogger.d.ts +131 -0
  155. package/dist/monitoring/StructuredLogger.js +207 -0
  156. package/dist/monitoring/StructuredLogger.js.map +1 -0
  157. package/dist/monitoring/TracingBootstrap.d.ts +69 -0
  158. package/dist/monitoring/TracingBootstrap.js +129 -0
  159. package/dist/monitoring/TracingBootstrap.js.map +1 -0
  160. package/dist/monitoring/TriggerMetricsCollector.d.ts +94 -0
  161. package/dist/monitoring/TriggerMetricsCollector.js +174 -0
  162. package/dist/monitoring/TriggerMetricsCollector.js.map +1 -0
  163. package/dist/monitoring/index.d.ts +9 -0
  164. package/dist/monitoring/index.js +10 -0
  165. package/dist/monitoring/index.js.map +1 -0
  166. package/dist/openapi/OpenAPIGenerator.d.ts +192 -0
  167. package/dist/openapi/OpenAPIGenerator.js +373 -0
  168. package/dist/openapi/OpenAPIGenerator.js.map +1 -0
  169. package/dist/openapi/index.d.ts +20 -0
  170. package/dist/openapi/index.js +20 -0
  171. package/dist/openapi/index.js.map +1 -0
  172. package/dist/security/ABAC.d.ts +224 -0
  173. package/dist/security/ABAC.js +380 -0
  174. package/dist/security/ABAC.js.map +1 -0
  175. package/dist/security/AuditLogger.d.ts +242 -0
  176. package/dist/security/AuditLogger.js +317 -0
  177. package/dist/security/AuditLogger.js.map +1 -0
  178. package/dist/security/AuthMiddleware.d.ts +163 -0
  179. package/dist/security/AuthMiddleware.js +274 -0
  180. package/dist/security/AuthMiddleware.js.map +1 -0
  181. package/dist/security/EncryptionAtRest.d.ts +206 -0
  182. package/dist/security/EncryptionAtRest.js +236 -0
  183. package/dist/security/EncryptionAtRest.js.map +1 -0
  184. package/dist/security/OAuthProvider.d.ts +334 -0
  185. package/dist/security/OAuthProvider.js +719 -0
  186. package/dist/security/OAuthProvider.js.map +1 -0
  187. package/dist/security/PIIDetector.d.ts +233 -0
  188. package/dist/security/PIIDetector.js +354 -0
  189. package/dist/security/PIIDetector.js.map +1 -0
  190. package/dist/security/RBAC.d.ts +143 -0
  191. package/dist/security/RBAC.js +285 -0
  192. package/dist/security/RBAC.js.map +1 -0
  193. package/dist/security/SecretManager.d.ts +652 -0
  194. package/dist/security/SecretManager.js +1146 -0
  195. package/dist/security/SecretManager.js.map +1 -0
  196. package/dist/security/TLSConfig.d.ts +305 -0
  197. package/dist/security/TLSConfig.js +550 -0
  198. package/dist/security/TLSConfig.js.map +1 -0
  199. package/dist/security/index.d.ts +79 -0
  200. package/dist/security/index.js +80 -0
  201. package/dist/security/index.js.map +1 -0
  202. package/dist/testing/TestHarness.d.ts +189 -0
  203. package/dist/testing/TestHarness.js +272 -0
  204. package/dist/testing/TestHarness.js.map +1 -0
  205. package/dist/testing/TestLogger.d.ts +103 -0
  206. package/dist/testing/TestLogger.js +153 -0
  207. package/dist/testing/TestLogger.js.map +1 -0
  208. package/dist/testing/WorkflowTestRunner.d.ts +172 -0
  209. package/dist/testing/WorkflowTestRunner.js +355 -0
  210. package/dist/testing/WorkflowTestRunner.js.map +1 -0
  211. package/dist/testing/index.d.ts +21 -0
  212. package/dist/testing/index.js +22 -0
  213. package/dist/testing/index.js.map +1 -0
  214. package/dist/tracing/InMemoryRunStore.d.ts +44 -0
  215. package/dist/tracing/InMemoryRunStore.js +341 -0
  216. package/dist/tracing/InMemoryRunStore.js.map +1 -0
  217. package/dist/tracing/PostgresRunStore.d.ts +82 -0
  218. package/dist/tracing/PostgresRunStore.js +640 -0
  219. package/dist/tracing/PostgresRunStore.js.map +1 -0
  220. package/dist/tracing/RunStore.d.ts +38 -0
  221. package/dist/tracing/RunStore.js +2 -0
  222. package/dist/tracing/RunStore.js.map +1 -0
  223. package/dist/tracing/RunTracker.d.ts +75 -0
  224. package/dist/tracing/RunTracker.js +374 -0
  225. package/dist/tracing/RunTracker.js.map +1 -0
  226. package/dist/tracing/SqliteRunStore.d.ts +53 -0
  227. package/dist/tracing/SqliteRunStore.js +703 -0
  228. package/dist/tracing/SqliteRunStore.js.map +1 -0
  229. package/dist/tracing/TraceRouter.d.ts +47 -0
  230. package/dist/tracing/TraceRouter.js +904 -0
  231. package/dist/tracing/TraceRouter.js.map +1 -0
  232. package/dist/tracing/TracingLogger.d.ts +21 -0
  233. package/dist/tracing/TracingLogger.js +62 -0
  234. package/dist/tracing/TracingLogger.js.map +1 -0
  235. package/dist/tracing/createStore.d.ts +30 -0
  236. package/dist/tracing/createStore.js +75 -0
  237. package/dist/tracing/createStore.js.map +1 -0
  238. package/dist/tracing/index.d.ts +13 -0
  239. package/dist/tracing/index.js +9 -0
  240. package/dist/tracing/index.js.map +1 -0
  241. package/dist/tracing/sanitize.d.ts +7 -0
  242. package/dist/tracing/sanitize.js +95 -0
  243. package/dist/tracing/sanitize.js.map +1 -0
  244. package/dist/tracing/types.d.ts +178 -0
  245. package/dist/tracing/types.js +3 -0
  246. package/dist/tracing/types.js.map +1 -0
  247. package/dist/types/Average.d.ts +11 -0
  248. package/dist/types/Average.js +2 -0
  249. package/dist/types/Average.js.map +1 -0
  250. package/dist/types/Condition.d.ts +8 -0
  251. package/dist/types/Condition.js +2 -0
  252. package/dist/types/Condition.js.map +1 -0
  253. package/dist/types/Conditions.d.ts +5 -0
  254. package/dist/types/Conditions.js +2 -0
  255. package/dist/types/Conditions.js.map +1 -0
  256. package/dist/types/Config.d.ts +12 -0
  257. package/dist/types/Config.js +2 -0
  258. package/dist/types/Config.js.map +1 -0
  259. package/dist/types/Flow.d.ts +5 -0
  260. package/dist/types/Flow.js +2 -0
  261. package/dist/types/Flow.js.map +1 -0
  262. package/dist/types/GlobalOptions.d.ts +11 -0
  263. package/dist/types/GlobalOptions.js +2 -0
  264. package/dist/types/GlobalOptions.js.map +1 -0
  265. package/dist/types/Inputs.d.ts +5 -0
  266. package/dist/types/Inputs.js +2 -0
  267. package/dist/types/Inputs.js.map +1 -0
  268. package/dist/types/JsonLikeObject.d.ts +3 -0
  269. package/dist/types/JsonLikeObject.js +2 -0
  270. package/dist/types/JsonLikeObject.js.map +1 -0
  271. package/dist/types/Mapper.d.ts +5 -0
  272. package/dist/types/Mapper.js +2 -0
  273. package/dist/types/Mapper.js.map +1 -0
  274. package/dist/types/Node.d.ts +10 -0
  275. package/dist/types/Node.js +2 -0
  276. package/dist/types/Node.js.map +1 -0
  277. package/dist/types/ParamsDictionary.d.ts +3 -0
  278. package/dist/types/ParamsDictionary.js +2 -0
  279. package/dist/types/ParamsDictionary.js.map +1 -0
  280. package/dist/types/Properties.d.ts +5 -0
  281. package/dist/types/Properties.js +2 -0
  282. package/dist/types/Properties.js.map +1 -0
  283. package/dist/types/Targets.d.ts +5 -0
  284. package/dist/types/Targets.js +2 -0
  285. package/dist/types/Targets.js.map +1 -0
  286. package/dist/types/Trigger.d.ts +5 -0
  287. package/dist/types/Trigger.js +2 -0
  288. package/dist/types/Trigger.js.map +1 -0
  289. package/dist/types/TriggerHttp.d.ts +7 -0
  290. package/dist/types/TriggerHttp.js +2 -0
  291. package/dist/types/TriggerHttp.js.map +1 -0
  292. package/dist/types/TriggerResponse.d.ts +6 -0
  293. package/dist/types/TriggerResponse.js +2 -0
  294. package/dist/types/TriggerResponse.js.map +1 -0
  295. package/dist/types/Triggers.d.ts +5 -0
  296. package/dist/types/Triggers.js +2 -0
  297. package/dist/types/Triggers.js.map +1 -0
  298. package/dist/types/TryCatch.d.ts +6 -0
  299. package/dist/types/TryCatch.js +2 -0
  300. package/dist/types/TryCatch.js.map +1 -0
  301. package/dist/visualization/NodeDependencyGraph.d.ts +76 -0
  302. package/dist/visualization/NodeDependencyGraph.js +418 -0
  303. package/dist/visualization/NodeDependencyGraph.js.map +1 -0
  304. package/dist/visualization/WorkflowVisualizer.d.ts +144 -0
  305. package/dist/visualization/WorkflowVisualizer.js +446 -0
  306. package/dist/visualization/WorkflowVisualizer.js.map +1 -0
  307. package/package.json +95 -0
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Health Check Infrastructure for Blok Triggers
3
+ *
4
+ * Provides standardized health check capabilities across all trigger types.
5
+ * Supports Kubernetes readiness/liveness probes and custom dependency checks.
6
+ */
7
+ export class HealthCheck {
8
+ startTime;
9
+ dependencies = new Map();
10
+ cachedResults = new Map();
11
+ cacheMaxAge;
12
+ constructor(cacheMaxAgeMs = 5000) {
13
+ this.startTime = Date.now();
14
+ this.cacheMaxAge = cacheMaxAgeMs;
15
+ }
16
+ /**
17
+ * Register a named dependency health check.
18
+ */
19
+ registerDependency(name, checkFn) {
20
+ this.dependencies.set(name, checkFn);
21
+ }
22
+ /**
23
+ * Remove a registered dependency check.
24
+ */
25
+ removeDependency(name) {
26
+ this.dependencies.delete(name);
27
+ this.cachedResults.delete(name);
28
+ }
29
+ /**
30
+ * Run all dependency checks and return aggregated health.
31
+ */
32
+ async check() {
33
+ const checks = {};
34
+ const entries = Array.from(this.dependencies.entries());
35
+ const results = await Promise.allSettled(entries.map(async ([name, checkFn]) => {
36
+ const cached = this.cachedResults.get(name);
37
+ if (cached && Date.now() - cached.lastChecked < this.cacheMaxAge) {
38
+ return { name, result: cached };
39
+ }
40
+ const start = performance.now();
41
+ try {
42
+ const result = await checkFn();
43
+ result.latency_ms = performance.now() - start;
44
+ result.lastChecked = Date.now();
45
+ this.cachedResults.set(name, result);
46
+ return { name, result };
47
+ }
48
+ catch (err) {
49
+ const result = {
50
+ status: "unhealthy",
51
+ latency_ms: performance.now() - start,
52
+ message: err instanceof Error ? err.message : String(err),
53
+ lastChecked: Date.now(),
54
+ };
55
+ this.cachedResults.set(name, result);
56
+ return { name, result };
57
+ }
58
+ }));
59
+ for (const settled of results) {
60
+ if (settled.status === "fulfilled") {
61
+ checks[settled.value.name] = settled.value.result;
62
+ }
63
+ }
64
+ const status = this.aggregateStatus(checks);
65
+ return {
66
+ status,
67
+ timestamp: Date.now(),
68
+ uptime: Date.now() - this.startTime,
69
+ checks,
70
+ };
71
+ }
72
+ /**
73
+ * Quick liveness check - is the process alive and responsive?
74
+ */
75
+ liveness() {
76
+ return {
77
+ status: "ok",
78
+ uptime: Date.now() - this.startTime,
79
+ };
80
+ }
81
+ /**
82
+ * Readiness check - are all dependencies healthy?
83
+ */
84
+ async readiness() {
85
+ const result = await this.check();
86
+ return {
87
+ ready: result.status !== "unhealthy",
88
+ status: result.status,
89
+ };
90
+ }
91
+ aggregateStatus(checks) {
92
+ const statuses = Object.values(checks);
93
+ if (statuses.length === 0)
94
+ return "healthy";
95
+ if (statuses.some((c) => c.status === "unhealthy"))
96
+ return "unhealthy";
97
+ if (statuses.some((c) => c.status === "degraded"))
98
+ return "degraded";
99
+ return "healthy";
100
+ }
101
+ }
102
+ //# sourceMappingURL=HealthCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HealthCheck.js","sourceRoot":"","sources":["../../src/monitoring/HealthCheck.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Performance Profiler for Blok Workflows
3
+ *
4
+ * Collects and analyzes per-node execution metrics to identify
5
+ * bottlenecks and hot paths in workflow execution.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * const profiler = new PerformanceProfiler();
10
+ * profiler.addSample("user-api", "validator", 5.2, 12, 2.1);
11
+ * profiler.addSample("user-api", "db-query", 120.5, 45, 8.3);
12
+ * profiler.addSample("user-api", "formatter", 3.1, 10, 1.2);
13
+ * console.log(profiler.toTable());
14
+ * ```
15
+ */
16
+ export interface NodeProfile {
17
+ nodeName: string;
18
+ workflowName: string;
19
+ executionCount: number;
20
+ totalTimeMs: number;
21
+ avgTimeMs: number;
22
+ minTimeMs: number;
23
+ maxTimeMs: number;
24
+ p50Ms: number;
25
+ p95Ms: number;
26
+ p99Ms: number;
27
+ memoryAvgMb: number;
28
+ memoryPeakMb: number;
29
+ cpuAvgPct: number;
30
+ errorCount: number;
31
+ errorRate: number;
32
+ percentOfTotal: number;
33
+ }
34
+ export interface WorkflowProfile {
35
+ workflowName: string;
36
+ totalExecutions: number;
37
+ avgTotalTimeMs: number;
38
+ p95TotalTimeMs: number;
39
+ nodes: NodeProfile[];
40
+ bottleneck: NodeProfile | null;
41
+ hotPath: string[];
42
+ }
43
+ export interface ProfileConfig {
44
+ topN?: number;
45
+ }
46
+ export declare class PerformanceProfiler {
47
+ private config;
48
+ private samples;
49
+ private workflowTotals;
50
+ constructor(config?: ProfileConfig);
51
+ addSample(workflowName: string, nodeName: string, latencyMs: number, memoryMb?: number, cpuPct?: number, error?: boolean): void;
52
+ addWorkflowSample(workflowName: string, totalTimeMs: number): void;
53
+ getProfiles(): WorkflowProfile[];
54
+ getBottlenecks(topN?: number): NodeProfile[];
55
+ getHotPath(workflowName: string): string[];
56
+ toTable(): string;
57
+ toFlameChart(): string;
58
+ toJson(): string;
59
+ reset(): void;
60
+ private percentile;
61
+ private fmtMs;
62
+ private padColumns;
63
+ }
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Performance Profiler for Blok Workflows
3
+ *
4
+ * Collects and analyzes per-node execution metrics to identify
5
+ * bottlenecks and hot paths in workflow execution.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * const profiler = new PerformanceProfiler();
10
+ * profiler.addSample("user-api", "validator", 5.2, 12, 2.1);
11
+ * profiler.addSample("user-api", "db-query", 120.5, 45, 8.3);
12
+ * profiler.addSample("user-api", "formatter", 3.1, 10, 1.2);
13
+ * console.log(profiler.toTable());
14
+ * ```
15
+ */
16
+ const MAX_SAMPLES = 10_000;
17
+ export class PerformanceProfiler {
18
+ config;
19
+ samples = new Map();
20
+ workflowTotals = new Map();
21
+ constructor(config) {
22
+ this.config = {
23
+ topN: config?.topN ?? 10,
24
+ };
25
+ }
26
+ addSample(workflowName, nodeName, latencyMs, memoryMb, cpuPct, error) {
27
+ if (!this.samples.has(workflowName)) {
28
+ this.samples.set(workflowName, new Map());
29
+ }
30
+ const workflowMap = this.samples.get(workflowName);
31
+ if (!workflowMap)
32
+ return;
33
+ if (!workflowMap.has(nodeName)) {
34
+ workflowMap.set(nodeName, {
35
+ latencies: [],
36
+ memories: [],
37
+ cpus: [],
38
+ errors: 0,
39
+ });
40
+ }
41
+ const node = workflowMap.get(nodeName);
42
+ if (!node)
43
+ return;
44
+ node.latencies.push(latencyMs);
45
+ if (memoryMb !== undefined)
46
+ node.memories.push(memoryMb);
47
+ if (cpuPct !== undefined)
48
+ node.cpus.push(cpuPct);
49
+ if (error)
50
+ node.errors++;
51
+ // Trim to max samples
52
+ if (node.latencies.length > MAX_SAMPLES) {
53
+ node.latencies = node.latencies.slice(-MAX_SAMPLES / 2);
54
+ }
55
+ if (node.memories.length > MAX_SAMPLES) {
56
+ node.memories = node.memories.slice(-MAX_SAMPLES / 2);
57
+ }
58
+ if (node.cpus.length > MAX_SAMPLES) {
59
+ node.cpus = node.cpus.slice(-MAX_SAMPLES / 2);
60
+ }
61
+ }
62
+ addWorkflowSample(workflowName, totalTimeMs) {
63
+ if (!this.workflowTotals.has(workflowName)) {
64
+ this.workflowTotals.set(workflowName, []);
65
+ }
66
+ this.workflowTotals.get(workflowName)?.push(totalTimeMs);
67
+ }
68
+ getProfiles() {
69
+ const profiles = [];
70
+ for (const [workflowName, workflowMap] of this.samples) {
71
+ const nodes = [];
72
+ let totalAvgTime = 0;
73
+ for (const [nodeName, data] of workflowMap) {
74
+ const sorted = [...data.latencies].sort((a, b) => a - b);
75
+ const count = sorted.length;
76
+ const sum = sorted.reduce((a, b) => a + b, 0);
77
+ const avg = count > 0 ? sum / count : 0;
78
+ const memAvg = data.memories.length > 0 ? data.memories.reduce((a, b) => a + b, 0) / data.memories.length : 0;
79
+ const memPeak = data.memories.length > 0 ? Math.max(...data.memories) : 0;
80
+ const cpuAvg = data.cpus.length > 0 ? data.cpus.reduce((a, b) => a + b, 0) / data.cpus.length : 0;
81
+ totalAvgTime += avg;
82
+ nodes.push({
83
+ nodeName,
84
+ workflowName,
85
+ executionCount: count,
86
+ totalTimeMs: sum,
87
+ avgTimeMs: avg,
88
+ minTimeMs: count > 0 ? sorted[0] : 0,
89
+ maxTimeMs: count > 0 ? sorted[count - 1] : 0,
90
+ p50Ms: this.percentile(sorted, 50),
91
+ p95Ms: this.percentile(sorted, 95),
92
+ p99Ms: this.percentile(sorted, 99),
93
+ memoryAvgMb: memAvg,
94
+ memoryPeakMb: memPeak,
95
+ cpuAvgPct: cpuAvg,
96
+ errorCount: data.errors,
97
+ errorRate: count > 0 ? data.errors / count : 0,
98
+ percentOfTotal: 0, // computed below
99
+ });
100
+ }
101
+ // Compute percentOfTotal
102
+ for (const node of nodes) {
103
+ node.percentOfTotal = totalAvgTime > 0 ? (node.avgTimeMs / totalAvgTime) * 100 : 0;
104
+ }
105
+ // Sort by avgTimeMs descending
106
+ nodes.sort((a, b) => b.avgTimeMs - a.avgTimeMs);
107
+ // Workflow totals
108
+ const wfTotals = this.workflowTotals.get(workflowName) || [];
109
+ const wfSorted = [...wfTotals].sort((a, b) => a - b);
110
+ const wfAvg = wfSorted.length > 0 ? wfSorted.reduce((a, b) => a + b, 0) / wfSorted.length : totalAvgTime;
111
+ profiles.push({
112
+ workflowName,
113
+ totalExecutions: nodes.length > 0 ? nodes[0].executionCount : 0,
114
+ avgTotalTimeMs: wfAvg,
115
+ p95TotalTimeMs: this.percentile(wfSorted, 95) || wfAvg,
116
+ nodes,
117
+ bottleneck: nodes.length > 0 ? nodes[0] : null,
118
+ hotPath: nodes.map((n) => n.nodeName),
119
+ });
120
+ }
121
+ return profiles;
122
+ }
123
+ getBottlenecks(topN) {
124
+ const n = topN ?? this.config.topN;
125
+ const allNodes = [];
126
+ for (const profile of this.getProfiles()) {
127
+ allNodes.push(...profile.nodes);
128
+ }
129
+ allNodes.sort((a, b) => b.avgTimeMs - a.avgTimeMs);
130
+ return allNodes.slice(0, n);
131
+ }
132
+ getHotPath(workflowName) {
133
+ const profiles = this.getProfiles();
134
+ const profile = profiles.find((p) => p.workflowName === workflowName);
135
+ return profile?.hotPath ?? [];
136
+ }
137
+ toTable() {
138
+ const profiles = this.getProfiles();
139
+ if (profiles.length === 0)
140
+ return "[No profiling data]";
141
+ const lines = [];
142
+ for (const profile of profiles) {
143
+ lines.push("");
144
+ lines.push(` Workflow: ${profile.workflowName}`);
145
+ lines.push(` Avg Total: ${this.fmtMs(profile.avgTotalTimeMs)} | P95: ${this.fmtMs(profile.p95TotalTimeMs)} | Bottleneck: ${profile.bottleneck?.nodeName ?? "N/A"}`);
146
+ lines.push("");
147
+ // Header
148
+ const header = this.padColumns([
149
+ { val: "Node", width: 24 },
150
+ { val: "Count", width: 8 },
151
+ { val: "Avg(ms)", width: 10 },
152
+ { val: "P50(ms)", width: 10 },
153
+ { val: "P95(ms)", width: 10 },
154
+ { val: "P99(ms)", width: 10 },
155
+ { val: "Mem(MB)", width: 10 },
156
+ { val: "CPU(%)", width: 8 },
157
+ { val: "Err%", width: 7 },
158
+ { val: "% Total", width: 9 },
159
+ ]);
160
+ lines.push(` ${header}`);
161
+ lines.push(` ${"─".repeat(header.length)}`);
162
+ const topNodes = profile.nodes.slice(0, this.config.topN);
163
+ for (const node of topNodes) {
164
+ const row = this.padColumns([
165
+ { val: node.nodeName.length > 22 ? `${node.nodeName.substring(0, 19)}...` : node.nodeName, width: 24 },
166
+ { val: String(node.executionCount), width: 8 },
167
+ { val: this.fmtMs(node.avgTimeMs), width: 10 },
168
+ { val: this.fmtMs(node.p50Ms), width: 10 },
169
+ { val: this.fmtMs(node.p95Ms), width: 10 },
170
+ { val: this.fmtMs(node.p99Ms), width: 10 },
171
+ { val: node.memoryAvgMb > 0 ? node.memoryAvgMb.toFixed(1) : "-", width: 10 },
172
+ { val: node.cpuAvgPct > 0 ? node.cpuAvgPct.toFixed(1) : "-", width: 8 },
173
+ { val: (node.errorRate * 100).toFixed(1), width: 7 },
174
+ { val: `${node.percentOfTotal.toFixed(1)}%`, width: 9 },
175
+ ]);
176
+ lines.push(` ${row}`);
177
+ }
178
+ }
179
+ lines.push("");
180
+ return lines.join("\n");
181
+ }
182
+ toFlameChart() {
183
+ const profiles = this.getProfiles();
184
+ if (profiles.length === 0)
185
+ return "[No profiling data]";
186
+ const lines = [];
187
+ const maxBarWidth = 50;
188
+ for (const profile of profiles) {
189
+ lines.push("");
190
+ lines.push(` Workflow: ${profile.workflowName} (Avg: ${this.fmtMs(profile.avgTotalTimeMs)})`);
191
+ lines.push("");
192
+ const maxTime = profile.nodes.length > 0 ? Math.max(...profile.nodes.map((n) => n.avgTimeMs)) : 1;
193
+ for (const node of profile.nodes.slice(0, this.config.topN)) {
194
+ const barLength = Math.max(1, Math.round((node.avgTimeMs / maxTime) * maxBarWidth));
195
+ const bar = "█".repeat(barLength);
196
+ const name = node.nodeName.length > 20 ? `${node.nodeName.substring(0, 17)}...` : node.nodeName;
197
+ const padded = name + " ".repeat(Math.max(0, 20 - name.length));
198
+ lines.push(` ${padded} ${bar} ${this.fmtMs(node.avgTimeMs)} (${node.percentOfTotal.toFixed(0)}%)`);
199
+ }
200
+ }
201
+ lines.push("");
202
+ return lines.join("\n");
203
+ }
204
+ toJson() {
205
+ return JSON.stringify(this.getProfiles(), null, 2);
206
+ }
207
+ reset() {
208
+ this.samples.clear();
209
+ this.workflowTotals.clear();
210
+ }
211
+ // -- Internal --
212
+ percentile(sorted, p) {
213
+ if (sorted.length === 0)
214
+ return 0;
215
+ const index = Math.ceil((p / 100) * sorted.length) - 1;
216
+ return sorted[Math.max(0, Math.min(index, sorted.length - 1))];
217
+ }
218
+ fmtMs(ms) {
219
+ if (ms >= 1000)
220
+ return `${(ms / 1000).toFixed(2)}s`;
221
+ if (ms >= 1)
222
+ return ms.toFixed(1);
223
+ return ms.toFixed(3);
224
+ }
225
+ padColumns(cols) {
226
+ return cols.map((c) => c.val + " ".repeat(Math.max(0, c.width - c.val.length))).join("");
227
+ }
228
+ }
229
+ //# sourceMappingURL=PerformanceProfiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerformanceProfiler.js","sourceRoot":"","sources":["../../src/monitoring/PerformanceProfiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * PrometheusBootstrap - Configures OpenTelemetry MeterProvider with PrometheusExporter
3
+ *
4
+ * Uses dynamic imports for @opentelemetry/sdk-metrics and @opentelemetry/exporter-prometheus.
5
+ * Returns null if the packages are not installed (they are optional peer dependencies).
6
+ * Call this once at trigger startup in listen().
7
+ */
8
+ export interface PrometheusBootstrapConfig {
9
+ serviceName: string;
10
+ serviceVersion?: string;
11
+ port?: number;
12
+ endpoint?: string;
13
+ }
14
+ export interface PrometheusBootstrapResult {
15
+ metricsHandler: (req: unknown, res: unknown) => void;
16
+ shutdown: () => Promise<void>;
17
+ }
18
+ /**
19
+ * Bootstrap Prometheus metrics export using OpenTelemetry.
20
+ *
21
+ * Dynamically imports @opentelemetry/sdk-metrics and @opentelemetry/exporter-prometheus.
22
+ * If these packages are not installed, returns null silently.
23
+ *
24
+ * @returns Bootstrap result with metricsHandler and shutdown, or null if packages unavailable
25
+ */
26
+ export declare function bootstrapPrometheus(config: PrometheusBootstrapConfig): Promise<PrometheusBootstrapResult | null>;
27
+ /**
28
+ * Reset the initialization state. Useful for testing.
29
+ */
30
+ export declare function resetPrometheusBootstrap(): void;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * PrometheusBootstrap - Configures OpenTelemetry MeterProvider with PrometheusExporter
3
+ *
4
+ * Uses dynamic imports for @opentelemetry/sdk-metrics and @opentelemetry/exporter-prometheus.
5
+ * Returns null if the packages are not installed (they are optional peer dependencies).
6
+ * Call this once at trigger startup in listen().
7
+ */
8
+ import { metrics } from "@opentelemetry/api";
9
+ // Track whether we've already initialized to avoid double-init warnings
10
+ let initialized = false;
11
+ /**
12
+ * Bootstrap Prometheus metrics export using OpenTelemetry.
13
+ *
14
+ * Dynamically imports @opentelemetry/sdk-metrics and @opentelemetry/exporter-prometheus.
15
+ * If these packages are not installed, returns null silently.
16
+ *
17
+ * @returns Bootstrap result with metricsHandler and shutdown, or null if packages unavailable
18
+ */
19
+ export async function bootstrapPrometheus(config) {
20
+ if (initialized) {
21
+ return null;
22
+ }
23
+ try {
24
+ // Use variable-based dynamic imports so TypeScript doesn't try to resolve
25
+ // type declarations at compile time — these are optional peer dependencies.
26
+ const exporterPkg = "@opentelemetry/exporter-prometheus";
27
+ const sdkMetricsPkg = "@opentelemetry/sdk-metrics";
28
+ const resourcesPkg = "@opentelemetry/resources";
29
+ const semconvPkg = "@opentelemetry/semantic-conventions";
30
+ const [exporterMod, sdkMod, resourceMod, semconvMod] = await Promise.all([
31
+ import(/* webpackIgnore: true */ exporterPkg),
32
+ import(/* webpackIgnore: true */ sdkMetricsPkg),
33
+ import(/* webpackIgnore: true */ resourcesPkg),
34
+ import(/* webpackIgnore: true */ semconvPkg),
35
+ ]);
36
+ const { PrometheusExporter } = exporterMod;
37
+ const { MeterProvider } = sdkMod;
38
+ const { Resource } = resourceMod;
39
+ const { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } = semconvMod;
40
+ const port = config.port ?? Number.parseInt(process.env.BLOK_METRICS_PORT || "9464", 10);
41
+ const endpoint = config.endpoint ?? "/metrics";
42
+ const exporter = new PrometheusExporter({ port, endpoint });
43
+ const resource = Resource.default().merge(new Resource({
44
+ [ATTR_SERVICE_NAME]: config.serviceName,
45
+ [ATTR_SERVICE_VERSION]: config.serviceVersion ?? "0.0.1",
46
+ }));
47
+ const meterProvider = new MeterProvider({ resource });
48
+ meterProvider.addMetricReader(exporter);
49
+ metrics.setGlobalMeterProvider(meterProvider);
50
+ initialized = true;
51
+ const metricsHandler = exporter.getMetricsRequestHandler.bind(exporter);
52
+ return {
53
+ metricsHandler,
54
+ shutdown: async () => {
55
+ await meterProvider.shutdown();
56
+ initialized = false;
57
+ },
58
+ };
59
+ }
60
+ catch {
61
+ // OpenTelemetry SDK packages not installed - this is expected and fine
62
+ return null;
63
+ }
64
+ }
65
+ /**
66
+ * Reset the initialization state. Useful for testing.
67
+ */
68
+ export function resetPrometheusBootstrap() {
69
+ initialized = false;
70
+ }
71
+ //# sourceMappingURL=PrometheusBootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrometheusBootstrap.js","sourceRoot":"","sources":["../../src/monitoring/PrometheusBootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAc7C,wEAAwE;AACxE,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,MAAiC;IAEjC,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,CAAC;QACJ,0EAA0E;QAC1E,4EAA4E;QAC5E,MAAM,WAAW,GAAG,oCAAoC,CAAC;QACzD,MAAM,aAAa,GAAG,4BAA4B,CAAC;QACnD,MAAM,YAAY,GAAG,0BAA0B,CAAC;QAChD,MAAM,UAAU,GAAG,qCAAqC,CAAC;QAEzD,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACxE,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC;YAC7C,MAAM,CAAC,yBAAyB,CAAC,aAAa,CAAC;YAC/C,MAAM,CAAC,yBAAyB,CAAC,YAAY,CAAC;YAC9C,MAAM,CAAC,yBAAyB,CAAC,UAAU,CAAC;SAC5C,CAAC,CAAC;QAEH,MAAM,EAAE,kBAAkB,EAAE,GAAG,WAAW,CAAC;QAC3C,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;QACjC,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;QACjC,MAAM,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,GAAG,UAAU,CAAC;QAE/D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QACzF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,UAAU,CAAC;QAE/C,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CACxC,IAAI,QAAQ,CAAC;YACZ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,WAAW;YACvC,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC,cAAc,IAAI,OAAO;SACxD,CAAC,CACF,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;QAE9C,WAAW,GAAG,IAAI,CAAC;QAEnB,MAAM,cAAc,GAAG,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExE,OAAO;YACN,cAAc;YACd,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACpB,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC;gBAC/B,WAAW,GAAG,KAAK,CAAC;YACrB,CAAC;SACD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,uEAAuE;QACvE,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACvC,WAAW,GAAG,KAAK,CAAC;AACrB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * PrometheusMetricsBridge - Bridges internal metrics to OpenTelemetry/Prometheus
3
+ *
4
+ * Exposes TriggerMetricsCollector data as properly-named Prometheus metrics
5
+ * using the OpenTelemetry API. Works as no-op if no MeterProvider is configured.
6
+ */
7
+ import type { CircuitBreaker } from "./CircuitBreaker";
8
+ import type { RateLimiter } from "./RateLimiter";
9
+ import type { TriggerMetricsCollector } from "./TriggerMetricsCollector";
10
+ export interface PrometheusMetricsBridgeConfig {
11
+ triggerType: string;
12
+ triggerName: string;
13
+ }
14
+ export interface ExecutionLabels {
15
+ workflow_name: string;
16
+ workflow_version: string;
17
+ env: string;
18
+ }
19
+ export declare class PrometheusMetricsBridge {
20
+ private meter;
21
+ private config;
22
+ private collector;
23
+ private circuitBreaker;
24
+ private rateLimiter;
25
+ private executionsCounter;
26
+ private durationHistogram;
27
+ private errorsCounter;
28
+ private observableGauges;
29
+ private initialized;
30
+ constructor(config: PrometheusMetricsBridgeConfig, collector: TriggerMetricsCollector);
31
+ /**
32
+ * Register observable callbacks that pull from the TriggerMetricsCollector
33
+ * at scrape time. Call this once after construction.
34
+ */
35
+ initialize(): void;
36
+ /**
37
+ * Record a workflow execution. Called from TriggerBase.run() after each request.
38
+ *
39
+ * @param durationMs - Execution duration in milliseconds
40
+ * @param success - Whether the execution succeeded
41
+ * @param labels - Workflow-specific labels
42
+ */
43
+ recordExecution(durationMs: number, success: boolean, labels: ExecutionLabels): void;
44
+ /**
45
+ * Record an error with a specific category.
46
+ */
47
+ recordError(category: string, labels?: Partial<ExecutionLabels>): void;
48
+ /**
49
+ * Attach a CircuitBreaker for state monitoring.
50
+ */
51
+ attachCircuitBreaker(cb: CircuitBreaker): void;
52
+ /**
53
+ * Attach a RateLimiter for remaining token monitoring.
54
+ */
55
+ attachRateLimiter(rl: RateLimiter): void;
56
+ /**
57
+ * Clean up resources.
58
+ */
59
+ destroy(): void;
60
+ }