@jagilber-org/index-server 1.19.1
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/CHANGELOG.md +1218 -0
- package/CODE_OF_CONDUCT.md +49 -0
- package/CONTRIBUTING.md +75 -0
- package/LICENSE +21 -0
- package/README.md +523 -0
- package/SECURITY.md +50 -0
- package/dist/config/configUtils.d.ts +11 -0
- package/dist/config/configUtils.js +87 -0
- package/dist/config/dashboardConfig.d.ts +45 -0
- package/dist/config/dashboardConfig.js +63 -0
- package/dist/config/defaultValues.d.ts +61 -0
- package/dist/config/defaultValues.js +70 -0
- package/dist/config/dirConstants.d.ts +17 -0
- package/dist/config/dirConstants.js +28 -0
- package/dist/config/featureConfig.d.ts +61 -0
- package/dist/config/featureConfig.js +121 -0
- package/dist/config/runtimeConfig.d.ts +145 -0
- package/dist/config/runtimeConfig.js +334 -0
- package/dist/config/serverConfig.d.ts +90 -0
- package/dist/config/serverConfig.js +164 -0
- package/dist/dashboard/analytics/AnalyticsEngine.d.ts +142 -0
- package/dist/dashboard/analytics/AnalyticsEngine.js +373 -0
- package/dist/dashboard/analytics/BusinessIntelligence.d.ts +187 -0
- package/dist/dashboard/analytics/BusinessIntelligence.js +594 -0
- package/dist/dashboard/client/admin.html +2150 -0
- package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/chunk-SP2CHFBE.mjs +1 -0
- package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/render-T6MDALS3.mjs +27 -0
- package/dist/dashboard/client/css/admin.css +1466 -0
- package/dist/dashboard/client/js/admin.boot.js +359 -0
- package/dist/dashboard/client/js/admin.config.js +196 -0
- package/dist/dashboard/client/js/admin.embeddings.js +425 -0
- package/dist/dashboard/client/js/admin.graph.js +583 -0
- package/dist/dashboard/client/js/admin.instances.js +120 -0
- package/dist/dashboard/client/js/admin.instructions.js +552 -0
- package/dist/dashboard/client/js/admin.logs.js +113 -0
- package/dist/dashboard/client/js/admin.maintenance.js +354 -0
- package/dist/dashboard/client/js/admin.messaging.js +635 -0
- package/dist/dashboard/client/js/admin.monitor.js +181 -0
- package/dist/dashboard/client/js/admin.overview.js +221 -0
- package/dist/dashboard/client/js/admin.performance.js +61 -0
- package/dist/dashboard/client/js/admin.sessions.js +293 -0
- package/dist/dashboard/client/js/admin.sqlite.js +366 -0
- package/dist/dashboard/client/js/admin.utils.js +49 -0
- package/dist/dashboard/client/js/chart.umd.js +14 -0
- package/dist/dashboard/client/js/elk.bundled.js +6696 -0
- package/dist/dashboard/client/js/marked.umd.js +74 -0
- package/dist/dashboard/client/js/mermaid.min.js +3022 -0
- package/dist/dashboard/client/mermaid-layout-elk.esm.min.mjs +1 -0
- package/dist/dashboard/export/DataExporter.d.ts +169 -0
- package/dist/dashboard/export/DataExporter.js +737 -0
- package/dist/dashboard/export/exporters/csvExporter.d.ts +11 -0
- package/dist/dashboard/export/exporters/csvExporter.js +46 -0
- package/dist/dashboard/export/exporters/exportTypes.d.ts +89 -0
- package/dist/dashboard/export/exporters/exportTypes.js +5 -0
- package/dist/dashboard/export/exporters/jsonExporter.d.ts +7 -0
- package/dist/dashboard/export/exporters/jsonExporter.js +22 -0
- package/dist/dashboard/export/exporters/xmlExporter.d.ts +17 -0
- package/dist/dashboard/export/exporters/xmlExporter.js +175 -0
- package/dist/dashboard/integration/APIIntegration.d.ts +41 -0
- package/dist/dashboard/integration/APIIntegration.js +95 -0
- package/dist/dashboard/security/SecurityMonitor.d.ts +167 -0
- package/dist/dashboard/security/SecurityMonitor.js +559 -0
- package/dist/dashboard/server/AdminPanel.d.ts +183 -0
- package/dist/dashboard/server/AdminPanel.js +792 -0
- package/dist/dashboard/server/AdminPanelConfig.d.ts +42 -0
- package/dist/dashboard/server/AdminPanelConfig.js +80 -0
- package/dist/dashboard/server/AdminPanelState.d.ts +47 -0
- package/dist/dashboard/server/AdminPanelState.js +214 -0
- package/dist/dashboard/server/ApiRoutes.d.ts +17 -0
- package/dist/dashboard/server/ApiRoutes.js +149 -0
- package/dist/dashboard/server/DashboardServer.d.ts +49 -0
- package/dist/dashboard/server/DashboardServer.js +159 -0
- package/dist/dashboard/server/FileMetricsStorage.d.ts +49 -0
- package/dist/dashboard/server/FileMetricsStorage.js +195 -0
- package/dist/dashboard/server/HttpTransport.d.ts +23 -0
- package/dist/dashboard/server/HttpTransport.js +116 -0
- package/dist/dashboard/server/InstanceManager.d.ts +53 -0
- package/dist/dashboard/server/InstanceManager.js +284 -0
- package/dist/dashboard/server/KnowledgeStore.d.ts +35 -0
- package/dist/dashboard/server/KnowledgeStore.js +105 -0
- package/dist/dashboard/server/LeaderElection.d.ts +81 -0
- package/dist/dashboard/server/LeaderElection.js +268 -0
- package/dist/dashboard/server/MetricsCollector.d.ts +200 -0
- package/dist/dashboard/server/MetricsCollector.js +803 -0
- package/dist/dashboard/server/SessionPersistenceManager.d.ts +88 -0
- package/dist/dashboard/server/SessionPersistenceManager.js +457 -0
- package/dist/dashboard/server/ThinClient.d.ts +64 -0
- package/dist/dashboard/server/ThinClient.js +237 -0
- package/dist/dashboard/server/WebSocketManager.d.ts +161 -0
- package/dist/dashboard/server/WebSocketManager.js +463 -0
- package/dist/dashboard/server/httpLifecycle.d.ts +17 -0
- package/dist/dashboard/server/httpLifecycle.js +35 -0
- package/dist/dashboard/server/legacyDashboardHtml.d.ts +9 -0
- package/dist/dashboard/server/legacyDashboardHtml.js +618 -0
- package/dist/dashboard/server/legacyDashboardStyles.d.ts +5 -0
- package/dist/dashboard/server/legacyDashboardStyles.js +490 -0
- package/dist/dashboard/server/metricsAggregation.d.ts +252 -0
- package/dist/dashboard/server/metricsAggregation.js +206 -0
- package/dist/dashboard/server/metricsSerializer.d.ts +25 -0
- package/dist/dashboard/server/metricsSerializer.js +195 -0
- package/dist/dashboard/server/routes/admin.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/admin.routes.js +596 -0
- package/dist/dashboard/server/routes/alerts.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/alerts.routes.js +93 -0
- package/dist/dashboard/server/routes/api.feedback.routes.d.ts +73 -0
- package/dist/dashboard/server/routes/api.feedback.routes.js +171 -0
- package/dist/dashboard/server/routes/api.instructions.routes.d.ts +101 -0
- package/dist/dashboard/server/routes/api.instructions.routes.js +213 -0
- package/dist/dashboard/server/routes/api.usage.routes.d.ts +57 -0
- package/dist/dashboard/server/routes/api.usage.routes.js +374 -0
- package/dist/dashboard/server/routes/embeddings.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/embeddings.routes.js +246 -0
- package/dist/dashboard/server/routes/graph.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/graph.routes.js +280 -0
- package/dist/dashboard/server/routes/index.d.ts +38 -0
- package/dist/dashboard/server/routes/index.js +194 -0
- package/dist/dashboard/server/routes/instances.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/instances.routes.js +35 -0
- package/dist/dashboard/server/routes/instructions.routes.d.ts +8 -0
- package/dist/dashboard/server/routes/instructions.routes.js +336 -0
- package/dist/dashboard/server/routes/knowledge.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/knowledge.routes.js +82 -0
- package/dist/dashboard/server/routes/logs.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/logs.routes.js +164 -0
- package/dist/dashboard/server/routes/messaging.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/messaging.routes.js +293 -0
- package/dist/dashboard/server/routes/metrics.routes.d.ts +10 -0
- package/dist/dashboard/server/routes/metrics.routes.js +346 -0
- package/dist/dashboard/server/routes/scripts.routes.d.ts +9 -0
- package/dist/dashboard/server/routes/scripts.routes.js +84 -0
- package/dist/dashboard/server/routes/sqlite.routes.d.ts +9 -0
- package/dist/dashboard/server/routes/sqlite.routes.js +569 -0
- package/dist/dashboard/server/routes/status.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/status.routes.js +183 -0
- package/dist/dashboard/server/routes/synthetic.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/synthetic.routes.js +195 -0
- package/dist/dashboard/server/routes/tools.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/tools.routes.js +46 -0
- package/dist/dashboard/server/routes/usage.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/usage.routes.js +25 -0
- package/dist/dashboard/server/wsInit.d.ts +16 -0
- package/dist/dashboard/server/wsInit.js +35 -0
- package/dist/externalClientLib.d.ts +1 -0
- package/dist/externalClientLib.js +2 -0
- package/dist/minimal/index.d.ts +1 -0
- package/dist/minimal/index.js +140 -0
- package/dist/models/SessionPersistence.d.ts +115 -0
- package/dist/models/SessionPersistence.js +66 -0
- package/dist/models/instruction.d.ts +45 -0
- package/dist/models/instruction.js +2 -0
- package/dist/perf/benchmark.d.ts +1 -0
- package/dist/perf/benchmark.js +50 -0
- package/dist/portableClientWrapper.d.ts +1 -0
- package/dist/portableClientWrapper.js +2 -0
- package/dist/schemas/index.d.ts +128 -0
- package/dist/schemas/index.js +371 -0
- package/dist/scripts/runPerformanceBaseline.d.ts +1 -0
- package/dist/scripts/runPerformanceBaseline.js +17 -0
- package/dist/server/handshakeManager.d.ts +25 -0
- package/dist/server/handshakeManager.js +472 -0
- package/dist/server/index-server.d.ts +56 -0
- package/dist/server/index-server.js +822 -0
- package/dist/server/registry.d.ts +44 -0
- package/dist/server/registry.js +236 -0
- package/dist/server/sdkServer.d.ts +8 -0
- package/dist/server/sdkServer.js +299 -0
- package/dist/server/shutdownGuard.d.ts +41 -0
- package/dist/server/shutdownGuard.js +52 -0
- package/dist/server/thin-client.d.ts +22 -0
- package/dist/server/thin-client.js +111 -0
- package/dist/server/transport.d.ts +41 -0
- package/dist/server/transport.js +312 -0
- package/dist/server/transportFactory.d.ts +21 -0
- package/dist/server/transportFactory.js +429 -0
- package/dist/services/atomicFs.d.ts +22 -0
- package/dist/services/atomicFs.js +103 -0
- package/dist/services/auditLog.d.ts +38 -0
- package/dist/services/auditLog.js +142 -0
- package/dist/services/autoBackup.d.ts +14 -0
- package/dist/services/autoBackup.js +171 -0
- package/dist/services/autoSplit.d.ts +32 -0
- package/dist/services/autoSplit.js +113 -0
- package/dist/services/backupZip.d.ts +25 -0
- package/dist/services/backupZip.js +110 -0
- package/dist/services/bootstrapGating.d.ts +123 -0
- package/dist/services/bootstrapGating.js +221 -0
- package/dist/services/canonical.d.ts +23 -0
- package/dist/services/canonical.js +65 -0
- package/dist/services/categoryRules.d.ts +7 -0
- package/dist/services/categoryRules.js +37 -0
- package/dist/services/classificationService.d.ts +42 -0
- package/dist/services/classificationService.js +168 -0
- package/dist/services/embeddingService.d.ts +62 -0
- package/dist/services/embeddingService.js +259 -0
- package/dist/services/errors.d.ts +22 -0
- package/dist/services/errors.js +31 -0
- package/dist/services/featureFlags.d.ts +25 -0
- package/dist/services/featureFlags.js +89 -0
- package/dist/services/features.d.ts +13 -0
- package/dist/services/features.js +35 -0
- package/dist/services/handlers/instructions.add.d.ts +1 -0
- package/dist/services/handlers/instructions.add.js +496 -0
- package/dist/services/handlers/instructions.groom.d.ts +1 -0
- package/dist/services/handlers/instructions.groom.js +523 -0
- package/dist/services/handlers/instructions.import.d.ts +1 -0
- package/dist/services/handlers/instructions.import.js +173 -0
- package/dist/services/handlers/instructions.patch.d.ts +1 -0
- package/dist/services/handlers/instructions.patch.js +167 -0
- package/dist/services/handlers/instructions.query.d.ts +163 -0
- package/dist/services/handlers/instructions.query.js +522 -0
- package/dist/services/handlers/instructions.reload.d.ts +1 -0
- package/dist/services/handlers/instructions.reload.js +13 -0
- package/dist/services/handlers/instructions.remove.d.ts +1 -0
- package/dist/services/handlers/instructions.remove.js +118 -0
- package/dist/services/handlers/instructions.shared.d.ts +31 -0
- package/dist/services/handlers/instructions.shared.js +124 -0
- package/dist/services/handlers.activation.d.ts +1 -0
- package/dist/services/handlers.activation.js +203 -0
- package/dist/services/handlers.bootstrap.d.ts +1 -0
- package/dist/services/handlers.bootstrap.js +38 -0
- package/dist/services/handlers.dashboardConfig.d.ts +34 -0
- package/dist/services/handlers.dashboardConfig.js +108 -0
- package/dist/services/handlers.diagnostics.d.ts +1 -0
- package/dist/services/handlers.diagnostics.js +64 -0
- package/dist/services/handlers.feedback.d.ts +15 -0
- package/dist/services/handlers.feedback.js +378 -0
- package/dist/services/handlers.gates.d.ts +1 -0
- package/dist/services/handlers.gates.js +46 -0
- package/dist/services/handlers.graph.d.ts +53 -0
- package/dist/services/handlers.graph.js +231 -0
- package/dist/services/handlers.help.d.ts +1 -0
- package/dist/services/handlers.help.js +119 -0
- package/dist/services/handlers.instructionSchema.d.ts +1 -0
- package/dist/services/handlers.instructionSchema.js +227 -0
- package/dist/services/handlers.instructions.d.ts +8 -0
- package/dist/services/handlers.instructions.js +14 -0
- package/dist/services/handlers.instructionsDiagnostics.d.ts +1 -0
- package/dist/services/handlers.instructionsDiagnostics.js +14 -0
- package/dist/services/handlers.integrity.d.ts +1 -0
- package/dist/services/handlers.integrity.js +35 -0
- package/dist/services/handlers.manifest.d.ts +1 -0
- package/dist/services/handlers.manifest.js +24 -0
- package/dist/services/handlers.messaging.d.ts +12 -0
- package/dist/services/handlers.messaging.js +203 -0
- package/dist/services/handlers.metrics.d.ts +1 -0
- package/dist/services/handlers.metrics.js +43 -0
- package/dist/services/handlers.promote.d.ts +1 -0
- package/dist/services/handlers.promote.js +306 -0
- package/dist/services/handlers.prompt.d.ts +1 -0
- package/dist/services/handlers.prompt.js +7 -0
- package/dist/services/handlers.search.d.ts +69 -0
- package/dist/services/handlers.search.js +645 -0
- package/dist/services/handlers.testPrimitive.d.ts +1 -0
- package/dist/services/handlers.testPrimitive.js +5 -0
- package/dist/services/handlers.trace.d.ts +1 -0
- package/dist/services/handlers.trace.js +31 -0
- package/dist/services/handlers.usage.d.ts +1 -0
- package/dist/services/handlers.usage.js +11 -0
- package/dist/services/hotScore.d.ts +137 -0
- package/dist/services/hotScore.js +244 -0
- package/dist/services/indexContext.d.ts +117 -0
- package/dist/services/indexContext.js +968 -0
- package/dist/services/indexLoader.d.ts +44 -0
- package/dist/services/indexLoader.js +921 -0
- package/dist/services/indexRepository.d.ts +32 -0
- package/dist/services/indexRepository.js +71 -0
- package/dist/services/indexingService.d.ts +1 -0
- package/dist/services/indexingService.js +2 -0
- package/dist/services/instructions.dispatcher.d.ts +1 -0
- package/dist/services/instructions.dispatcher.js +231 -0
- package/dist/services/logPrefix.d.ts +1 -0
- package/dist/services/logPrefix.js +30 -0
- package/dist/services/logger.d.ts +52 -0
- package/dist/services/logger.js +268 -0
- package/dist/services/manifestManager.d.ts +82 -0
- package/dist/services/manifestManager.js +200 -0
- package/dist/services/messaging/agentMailbox.d.ts +60 -0
- package/dist/services/messaging/agentMailbox.js +353 -0
- package/dist/services/messaging/messagingPersistence.d.ts +20 -0
- package/dist/services/messaging/messagingPersistence.js +111 -0
- package/dist/services/messaging/messagingTypes.d.ts +150 -0
- package/dist/services/messaging/messagingTypes.js +66 -0
- package/dist/services/ownershipService.d.ts +1 -0
- package/dist/services/ownershipService.js +38 -0
- package/dist/services/performanceBaseline.d.ts +19 -0
- package/dist/services/performanceBaseline.js +210 -0
- package/dist/services/preflight.d.ts +12 -0
- package/dist/services/preflight.js +79 -0
- package/dist/services/promptReviewService.d.ts +44 -0
- package/dist/services/promptReviewService.js +101 -0
- package/dist/services/responseEnvelope.d.ts +6 -0
- package/dist/services/responseEnvelope.js +25 -0
- package/dist/services/seedBootstrap.d.ts +34 -0
- package/dist/services/seedBootstrap.js +427 -0
- package/dist/services/storage/factory.d.ts +17 -0
- package/dist/services/storage/factory.js +35 -0
- package/dist/services/storage/hashUtils.d.ts +11 -0
- package/dist/services/storage/hashUtils.js +35 -0
- package/dist/services/storage/index.d.ts +12 -0
- package/dist/services/storage/index.js +18 -0
- package/dist/services/storage/jsonFileStore.d.ts +32 -0
- package/dist/services/storage/jsonFileStore.js +241 -0
- package/dist/services/storage/migrationEngine.d.ts +35 -0
- package/dist/services/storage/migrationEngine.js +93 -0
- package/dist/services/storage/sqliteMessageStore.d.ts +53 -0
- package/dist/services/storage/sqliteMessageStore.js +146 -0
- package/dist/services/storage/sqliteSchema.d.ts +12 -0
- package/dist/services/storage/sqliteSchema.js +122 -0
- package/dist/services/storage/sqliteStore.d.ts +41 -0
- package/dist/services/storage/sqliteStore.js +339 -0
- package/dist/services/storage/sqliteUsageStore.d.ts +35 -0
- package/dist/services/storage/sqliteUsageStore.js +94 -0
- package/dist/services/storage/types.d.ts +171 -0
- package/dist/services/storage/types.js +12 -0
- package/dist/services/toolHandlers.d.ts +23 -0
- package/dist/services/toolHandlers.js +50 -0
- package/dist/services/toolRegistry.d.ts +20 -0
- package/dist/services/toolRegistry.js +490 -0
- package/dist/services/toolRegistry.zod.d.ts +10 -0
- package/dist/services/toolRegistry.zod.js +323 -0
- package/dist/services/tracing.d.ts +26 -0
- package/dist/services/tracing.js +260 -0
- package/dist/services/usageBuckets.d.ts +161 -0
- package/dist/services/usageBuckets.js +364 -0
- package/dist/services/validationService.d.ts +38 -0
- package/dist/services/validationService.js +125 -0
- package/dist/utils/BufferRing.d.ts +203 -0
- package/dist/utils/BufferRing.js +551 -0
- package/dist/utils/BufferRingExamples.d.ts +55 -0
- package/dist/utils/BufferRingExamples.js +188 -0
- package/dist/utils/envUtils.d.ts +42 -0
- package/dist/utils/envUtils.js +80 -0
- package/dist/utils/memoryMonitor.d.ts +83 -0
- package/dist/utils/memoryMonitor.js +275 -0
- package/dist/versioning/schemaVersion.d.ts +6 -0
- package/dist/versioning/schemaVersion.js +93 -0
- package/package.json +134 -0
- package/schemas/README.md +13 -0
- package/schemas/feedback-entry.schema.json +27 -0
- package/schemas/graph-export-v2.schema.json +60 -0
- package/schemas/index-server.code-schema.json +38477 -0
- package/schemas/instruction.schema.json +262 -0
- package/schemas/json-schema/SessionPersistence-persisted-admin-session.schema.json +54 -0
- package/schemas/json-schema/SessionPersistence-persisted-session-history-entry.schema.json +51 -0
- package/schemas/json-schema/SessionPersistence-persisted-web-socket-connection.schema.json +54 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-config.schema.json +110 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-data.schema.json +229 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-manifest.schema.json +109 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-metadata.schema.json +55 -0
- package/schemas/json-schema/instruction-audience-scope.schema.json +14 -0
- package/schemas/json-schema/instruction-content-type.schema.json +17 -0
- package/schemas/json-schema/instruction-instruction-entry.schema.json +206 -0
- package/schemas/json-schema/instruction-requirement-level.schema.json +16 -0
- package/schemas/manifest.json +78 -0
- package/schemas/manifest.schema.json +33 -0
- package/schemas/usage-batch.schema.json +16 -0
- package/schemas/usage-buckets.schema.json +30 -0
- package/schemas/usage-event.schema.json +17 -0
- package/scripts/copy-dashboard-assets.mjs +170 -0
- package/scripts/setup-hooks.cjs +28 -0
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configurable Buffer Ring - Generic circular buffer implementation
|
|
4
|
+
*
|
|
5
|
+
* Provides a high-performance, memory-efficient circular buffer with configurable
|
|
6
|
+
* size limits, overflow strategies, and optional persistence support.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Configurable capacity with automatic overflow handling
|
|
10
|
+
* - Multiple overflow strategies (drop-oldest, drop-newest, resize)
|
|
11
|
+
* - Optional persistence to disk with atomic writes
|
|
12
|
+
* - Type-safe generic implementation
|
|
13
|
+
* - Memory usage tracking and cleanup
|
|
14
|
+
* - Event notifications for buffer state changes
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.BufferRingFactory = exports.BufferRing = exports.OverflowStrategy = void 0;
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const crypto = __importStar(require("crypto"));
|
|
54
|
+
const events_1 = require("events");
|
|
55
|
+
const logger_1 = require("../services/logger");
|
|
56
|
+
const runtimeConfig_1 = require("../config/runtimeConfig");
|
|
57
|
+
/**
|
|
58
|
+
* Buffer overflow strategies
|
|
59
|
+
*/
|
|
60
|
+
var OverflowStrategy;
|
|
61
|
+
(function (OverflowStrategy) {
|
|
62
|
+
/** Drop the oldest entries when buffer is full (default) */
|
|
63
|
+
OverflowStrategy["DROP_OLDEST"] = "drop-oldest";
|
|
64
|
+
/** Drop the newest entry when buffer is full */
|
|
65
|
+
OverflowStrategy["DROP_NEWEST"] = "drop-newest";
|
|
66
|
+
/** Resize the buffer to accommodate new entries */
|
|
67
|
+
OverflowStrategy["RESIZE"] = "resize";
|
|
68
|
+
/** Throw an error when buffer is full */
|
|
69
|
+
OverflowStrategy["ERROR"] = "error";
|
|
70
|
+
})(OverflowStrategy || (exports.OverflowStrategy = OverflowStrategy = {}));
|
|
71
|
+
/**
|
|
72
|
+
* Generic configurable buffer ring implementation
|
|
73
|
+
*/
|
|
74
|
+
class BufferRing extends events_1.EventEmitter {
|
|
75
|
+
buffer = [];
|
|
76
|
+
writeIndex = 0;
|
|
77
|
+
isFull = false;
|
|
78
|
+
config;
|
|
79
|
+
stats;
|
|
80
|
+
/** Sequence counter for append mode records */
|
|
81
|
+
appendSeq = 0;
|
|
82
|
+
/** Track whether append mode file has been lazily loaded */
|
|
83
|
+
appendLoaded = false;
|
|
84
|
+
constructor(config = {}) {
|
|
85
|
+
super();
|
|
86
|
+
this.config = {
|
|
87
|
+
capacity: 1000,
|
|
88
|
+
overflowStrategy: OverflowStrategy.DROP_OLDEST,
|
|
89
|
+
autoPersist: false,
|
|
90
|
+
maxPersistEntries: 0,
|
|
91
|
+
enableIntegrityCheck: true,
|
|
92
|
+
appendMode: true,
|
|
93
|
+
...config
|
|
94
|
+
};
|
|
95
|
+
// Environment override via config: allow disable or enable explicitly
|
|
96
|
+
const bufferRingCfg = (0, runtimeConfig_1.getRuntimeConfig)().bufferRing;
|
|
97
|
+
this.config.appendMode = bufferRingCfg.append;
|
|
98
|
+
this.stats = {
|
|
99
|
+
count: 0,
|
|
100
|
+
capacity: this.config.capacity,
|
|
101
|
+
totalAdded: 0,
|
|
102
|
+
totalDropped: 0,
|
|
103
|
+
resizeCount: 0,
|
|
104
|
+
memoryUsage: 0,
|
|
105
|
+
lastModified: new Date(),
|
|
106
|
+
utilization: 0
|
|
107
|
+
};
|
|
108
|
+
// Load from persistence if configured
|
|
109
|
+
if (this.config.persistPath) {
|
|
110
|
+
if (this.config.appendMode) {
|
|
111
|
+
// Lazy load for append mode occurs on first access; optionally preload if config set
|
|
112
|
+
if (bufferRingCfg.preload) {
|
|
113
|
+
try {
|
|
114
|
+
this.loadFromAppendSync();
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
const err = error instanceof Error ? error : new Error('Unknown append preload error');
|
|
118
|
+
this.emit('error', err, 'load');
|
|
119
|
+
(0, logger_1.logError)(`[BufferRing] Failed (append) to load from ${this.config.persistPath}`, err);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
this.loadFromDisk().catch(error => {
|
|
125
|
+
this.emit('error', error, 'load');
|
|
126
|
+
(0, logger_1.logError)(`[BufferRing] Failed to load from ${this.config.persistPath}`, error);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Add an entry to the buffer
|
|
133
|
+
*/
|
|
134
|
+
add(entry) {
|
|
135
|
+
try {
|
|
136
|
+
const serializedEntry = this.config.serializer ? this.config.serializer(entry) : entry;
|
|
137
|
+
let dropped;
|
|
138
|
+
if (this.isFull) {
|
|
139
|
+
switch (this.config.overflowStrategy) {
|
|
140
|
+
case OverflowStrategy.DROP_OLDEST:
|
|
141
|
+
dropped = this.buffer[this.writeIndex];
|
|
142
|
+
this.buffer[this.writeIndex] = serializedEntry;
|
|
143
|
+
this.writeIndex = (this.writeIndex + 1) % this.config.capacity;
|
|
144
|
+
this.stats.totalDropped++;
|
|
145
|
+
if (dropped !== undefined) {
|
|
146
|
+
this.emit('entry-dropped', dropped, 'overflow');
|
|
147
|
+
}
|
|
148
|
+
break;
|
|
149
|
+
case OverflowStrategy.DROP_NEWEST:
|
|
150
|
+
this.emit('entry-dropped', serializedEntry, 'overflow');
|
|
151
|
+
this.stats.totalDropped++;
|
|
152
|
+
return false;
|
|
153
|
+
case OverflowStrategy.RESIZE:
|
|
154
|
+
this.resize(this.config.capacity * 2);
|
|
155
|
+
this.buffer[this.writeIndex] = serializedEntry;
|
|
156
|
+
this.writeIndex++;
|
|
157
|
+
this.stats.count++;
|
|
158
|
+
break;
|
|
159
|
+
case OverflowStrategy.ERROR:
|
|
160
|
+
throw new Error(`Buffer overflow: capacity ${this.config.capacity} exceeded`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
this.buffer[this.writeIndex] = serializedEntry;
|
|
165
|
+
this.writeIndex++;
|
|
166
|
+
this.stats.count++;
|
|
167
|
+
if (this.writeIndex >= this.config.capacity) {
|
|
168
|
+
this.isFull = true;
|
|
169
|
+
this.writeIndex = 0;
|
|
170
|
+
this.emit('buffer-full', this.config.capacity);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
this.stats.totalAdded++;
|
|
174
|
+
this.stats.lastModified = new Date();
|
|
175
|
+
this.updateStats();
|
|
176
|
+
this.emit('entry-added', serializedEntry, this.writeIndex - 1);
|
|
177
|
+
// Auto-persist if enabled
|
|
178
|
+
if (this.config.autoPersist && this.config.persistPath) {
|
|
179
|
+
if (this.config.appendMode) {
|
|
180
|
+
try {
|
|
181
|
+
this.appendToDisk(serializedEntry);
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
this.emit('error', err, 'auto-append');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
this.saveToDisk().catch(error => {
|
|
189
|
+
this.emit('error', error, 'auto-persist');
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
this.emit('error', error, 'add');
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get all entries in chronological order (oldest first)
|
|
202
|
+
*/
|
|
203
|
+
getAll() {
|
|
204
|
+
// Lazy load append file on first read if in append mode
|
|
205
|
+
if (this.config.appendMode && this.config.persistPath && !this.appendLoaded) {
|
|
206
|
+
try {
|
|
207
|
+
this.loadFromAppendSync();
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
this.emit('error', err, 'load-append');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (!this.isFull) {
|
|
214
|
+
return this.buffer.slice(0, this.writeIndex).map(this.deserializeEntry.bind(this));
|
|
215
|
+
}
|
|
216
|
+
// Buffer is full, need to reorder from oldest to newest
|
|
217
|
+
const oldest = this.buffer.slice(this.writeIndex).map(this.deserializeEntry.bind(this));
|
|
218
|
+
const newest = this.buffer.slice(0, this.writeIndex).map(this.deserializeEntry.bind(this));
|
|
219
|
+
return [...oldest, ...newest];
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get the last N entries (newest first)
|
|
223
|
+
*/
|
|
224
|
+
getLast(n) {
|
|
225
|
+
const all = this.getAll();
|
|
226
|
+
return all.slice(-n).reverse();
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get the first N entries (oldest first)
|
|
230
|
+
*/
|
|
231
|
+
getFirst(n) {
|
|
232
|
+
const all = this.getAll();
|
|
233
|
+
return all.slice(0, n);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get entries within a range
|
|
237
|
+
*/
|
|
238
|
+
getRange(start, end) {
|
|
239
|
+
const all = this.getAll();
|
|
240
|
+
return all.slice(start, end);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Filter entries based on predicate
|
|
244
|
+
*/
|
|
245
|
+
filter(predicate) {
|
|
246
|
+
return this.getAll().filter(predicate);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Find first entry matching predicate
|
|
250
|
+
*/
|
|
251
|
+
find(predicate) {
|
|
252
|
+
return this.getAll().find(predicate);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Clear all entries
|
|
256
|
+
*/
|
|
257
|
+
clear() {
|
|
258
|
+
const droppedCount = this.stats.count;
|
|
259
|
+
this.buffer.forEach(entry => {
|
|
260
|
+
if (entry !== undefined) {
|
|
261
|
+
this.emit('entry-dropped', entry, 'clear');
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
this.buffer = [];
|
|
265
|
+
this.writeIndex = 0;
|
|
266
|
+
this.isFull = false;
|
|
267
|
+
this.stats.count = 0;
|
|
268
|
+
this.stats.totalDropped += droppedCount;
|
|
269
|
+
this.stats.lastModified = new Date();
|
|
270
|
+
this.updateStats();
|
|
271
|
+
(0, logger_1.logInfo)(`[BufferRing] Cleared ${droppedCount} entries`);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Resize the buffer capacity
|
|
275
|
+
*/
|
|
276
|
+
resize(newCapacity) {
|
|
277
|
+
if (newCapacity <= 0) {
|
|
278
|
+
throw new Error('Buffer capacity must be positive');
|
|
279
|
+
}
|
|
280
|
+
const oldCapacity = this.config.capacity;
|
|
281
|
+
const currentEntries = this.getAll();
|
|
282
|
+
this.config.capacity = newCapacity;
|
|
283
|
+
this.buffer = [];
|
|
284
|
+
this.writeIndex = 0;
|
|
285
|
+
this.isFull = false;
|
|
286
|
+
this.stats.count = 0;
|
|
287
|
+
this.stats.capacity = newCapacity;
|
|
288
|
+
this.stats.resizeCount++;
|
|
289
|
+
// Re-add entries up to new capacity
|
|
290
|
+
const entriesToKeep = currentEntries.slice(-newCapacity);
|
|
291
|
+
entriesToKeep.forEach(entry => this.add(entry));
|
|
292
|
+
this.emit('buffer-resized', oldCapacity, newCapacity);
|
|
293
|
+
(0, logger_1.logInfo)(`[BufferRing] Resized from ${oldCapacity} to ${newCapacity} entries`);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Get buffer statistics
|
|
297
|
+
*/
|
|
298
|
+
getStats() {
|
|
299
|
+
this.updateStats();
|
|
300
|
+
return { ...this.stats };
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Get buffer configuration
|
|
304
|
+
*/
|
|
305
|
+
getConfig() {
|
|
306
|
+
return { ...this.config };
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Update configuration
|
|
310
|
+
*/
|
|
311
|
+
updateConfig(newConfig) {
|
|
312
|
+
const oldCapacity = this.config.capacity;
|
|
313
|
+
this.config = { ...this.config, ...newConfig };
|
|
314
|
+
// Handle capacity changes
|
|
315
|
+
if (this.config.capacity !== oldCapacity) {
|
|
316
|
+
this.resize(this.config.capacity);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Save buffer to disk
|
|
321
|
+
*/
|
|
322
|
+
async saveToDisk() {
|
|
323
|
+
if (!this.config.persistPath) {
|
|
324
|
+
throw new Error('No persist path configured');
|
|
325
|
+
}
|
|
326
|
+
try {
|
|
327
|
+
const entries = this.getAll();
|
|
328
|
+
const entriesToSave = this.config.maxPersistEntries > 0
|
|
329
|
+
? entries.slice(-this.config.maxPersistEntries)
|
|
330
|
+
: entries;
|
|
331
|
+
const data = {
|
|
332
|
+
config: this.config,
|
|
333
|
+
entries: entriesToSave,
|
|
334
|
+
stats: this.getStats(),
|
|
335
|
+
version: '1.0.0',
|
|
336
|
+
createdAt: new Date().toISOString(),
|
|
337
|
+
lastSaved: new Date().toISOString()
|
|
338
|
+
};
|
|
339
|
+
if (this.config.enableIntegrityCheck) {
|
|
340
|
+
data.checksum = this.computeChecksum(data);
|
|
341
|
+
}
|
|
342
|
+
// Ensure directory exists
|
|
343
|
+
const dir = path.dirname(this.config.persistPath);
|
|
344
|
+
if (!fs.existsSync(dir)) {
|
|
345
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
346
|
+
}
|
|
347
|
+
// Atomic write
|
|
348
|
+
const tempPath = this.config.persistPath + '.tmp';
|
|
349
|
+
const serialized = JSON.stringify(data, null, 2);
|
|
350
|
+
fs.writeFileSync(tempPath, serialized);
|
|
351
|
+
fs.renameSync(tempPath, this.config.persistPath);
|
|
352
|
+
this.emit('persisted', this.config.persistPath, entriesToSave.length);
|
|
353
|
+
if (!this.config.suppressPersistLog) {
|
|
354
|
+
(0, logger_1.logInfo)(`[BufferRing] Persisted ${entriesToSave.length} entries to ${this.config.persistPath}`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
this.emit('error', error, 'save');
|
|
359
|
+
throw error;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Load buffer from disk
|
|
364
|
+
*/
|
|
365
|
+
async loadFromDisk() {
|
|
366
|
+
if (!this.config.persistPath || !fs.existsSync(this.config.persistPath)) {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
const raw = fs.readFileSync(this.config.persistPath, 'utf8');
|
|
371
|
+
const data = JSON.parse(raw);
|
|
372
|
+
// Verify integrity if enabled
|
|
373
|
+
if (this.config.enableIntegrityCheck && data.checksum) {
|
|
374
|
+
const expectedChecksum = this.computeChecksum(data);
|
|
375
|
+
if (data.checksum !== expectedChecksum) {
|
|
376
|
+
throw new Error('Integrity check failed: checksum mismatch');
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// Clear current buffer
|
|
380
|
+
this.clear();
|
|
381
|
+
// Restore entries
|
|
382
|
+
data.entries.forEach(entry => this.add(entry));
|
|
383
|
+
// Update stats (preserve some current values)
|
|
384
|
+
this.stats = {
|
|
385
|
+
...data.stats,
|
|
386
|
+
lastModified: new Date(),
|
|
387
|
+
memoryUsage: this.estimateMemoryUsage()
|
|
388
|
+
};
|
|
389
|
+
this.emit('loaded', this.config.persistPath, data.entries.length);
|
|
390
|
+
if (!this.config.suppressPersistLog) {
|
|
391
|
+
(0, logger_1.logInfo)(`[BufferRing] Loaded ${data.entries.length} entries from ${this.config.persistPath}`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
this.emit('error', error, 'load');
|
|
396
|
+
throw error;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Append a single entry (JSONL) instead of rewriting full snapshot.
|
|
401
|
+
* Record shape: { t: ISO timestamp, i: sequence, v: serializedEntry }
|
|
402
|
+
*/
|
|
403
|
+
appendToDisk(entry) {
|
|
404
|
+
if (!this.config.persistPath)
|
|
405
|
+
return;
|
|
406
|
+
const dir = path.dirname(this.config.persistPath);
|
|
407
|
+
if (!fs.existsSync(dir)) {
|
|
408
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
409
|
+
}
|
|
410
|
+
const rec = { t: new Date().toISOString(), i: this.appendSeq++, v: entry };
|
|
411
|
+
fs.appendFileSync(this.config.persistPath, JSON.stringify(rec) + '\n');
|
|
412
|
+
if (!this.config.suppressPersistLog && this.appendSeq % 250 === 0) {
|
|
413
|
+
// Throttle log noise (every 250 appends)
|
|
414
|
+
(0, logger_1.logInfo)(`[BufferRing] Appended ${this.appendSeq} records to ${this.config.persistPath}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Synchronous load for append mode (reads JSONL file)
|
|
419
|
+
*/
|
|
420
|
+
loadFromAppendSync() {
|
|
421
|
+
if (!this.config.persistPath || !fs.existsSync(this.config.persistPath)) {
|
|
422
|
+
this.appendLoaded = true;
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
try {
|
|
426
|
+
const raw = fs.readFileSync(this.config.persistPath, 'utf8');
|
|
427
|
+
const lines = raw.split(/\r?\n/).filter(l => l.trim().length);
|
|
428
|
+
const max = this.config.maxPersistEntries > 0 ? this.config.maxPersistEntries : this.config.capacity;
|
|
429
|
+
const slice = lines.slice(-max);
|
|
430
|
+
// Clear existing buffer first (without emitting per-drop noise)
|
|
431
|
+
this.buffer = [];
|
|
432
|
+
this.writeIndex = 0;
|
|
433
|
+
this.isFull = false;
|
|
434
|
+
this.stats.count = 0;
|
|
435
|
+
slice.forEach(line => {
|
|
436
|
+
try {
|
|
437
|
+
const rec = JSON.parse(line);
|
|
438
|
+
this.add(rec.v); // reuse add for ordering & stats
|
|
439
|
+
if (typeof rec.i === 'number' && rec.i >= this.appendSeq)
|
|
440
|
+
this.appendSeq = rec.i + 1;
|
|
441
|
+
}
|
|
442
|
+
catch { /* skip malformed line */ }
|
|
443
|
+
});
|
|
444
|
+
this.appendLoaded = true;
|
|
445
|
+
if (!this.config.suppressPersistLog) {
|
|
446
|
+
(0, logger_1.logInfo)(`[BufferRing] Loaded (append mode) ${slice.length}/${lines.length} entries from ${this.config.persistPath}`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
catch (err) {
|
|
450
|
+
this.appendLoaded = true; // avoid retry loop
|
|
451
|
+
throw err;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Get memory usage estimate
|
|
456
|
+
*/
|
|
457
|
+
getMemoryUsage() {
|
|
458
|
+
return this.estimateMemoryUsage();
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Compact buffer by removing undefined entries
|
|
462
|
+
*/
|
|
463
|
+
compact() {
|
|
464
|
+
const validEntries = this.getAll();
|
|
465
|
+
this.clear();
|
|
466
|
+
validEntries.forEach(entry => this.add(entry));
|
|
467
|
+
(0, logger_1.logInfo)(`[BufferRing] Compacted buffer, retained ${validEntries.length} entries`);
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Private helper methods
|
|
471
|
+
*/
|
|
472
|
+
deserializeEntry(entry) {
|
|
473
|
+
return this.config.deserializer ? this.config.deserializer(entry) : entry;
|
|
474
|
+
}
|
|
475
|
+
updateStats() {
|
|
476
|
+
this.stats.utilization = (this.stats.count / this.config.capacity) * 100;
|
|
477
|
+
this.stats.memoryUsage = this.estimateMemoryUsage();
|
|
478
|
+
}
|
|
479
|
+
estimateMemoryUsage() {
|
|
480
|
+
// Rough estimate: 8 bytes per pointer + JSON stringified size
|
|
481
|
+
const baseSize = this.buffer.length * 8;
|
|
482
|
+
const dataSize = JSON.stringify(this.buffer.filter(x => x !== undefined)).length * 2; // UTF-16
|
|
483
|
+
return baseSize + dataSize;
|
|
484
|
+
}
|
|
485
|
+
computeChecksum(data) {
|
|
486
|
+
const dataWithoutChecksum = { ...data };
|
|
487
|
+
delete dataWithoutChecksum.checksum;
|
|
488
|
+
const serialized = JSON.stringify(dataWithoutChecksum, Object.keys(dataWithoutChecksum).sort());
|
|
489
|
+
return crypto.createHash('sha256').update(serialized).digest('hex');
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
exports.BufferRing = BufferRing;
|
|
493
|
+
/**
|
|
494
|
+
* Factory function for creating commonly used buffer rings
|
|
495
|
+
*/
|
|
496
|
+
class BufferRingFactory {
|
|
497
|
+
/**
|
|
498
|
+
* Create a log buffer ring
|
|
499
|
+
*/
|
|
500
|
+
static createLogBuffer(capacity = 1000, persistPath) {
|
|
501
|
+
return new BufferRing({
|
|
502
|
+
capacity,
|
|
503
|
+
overflowStrategy: OverflowStrategy.DROP_OLDEST,
|
|
504
|
+
persistPath,
|
|
505
|
+
autoPersist: !!persistPath,
|
|
506
|
+
maxPersistEntries: capacity * 0.8, // Persist 80% of capacity
|
|
507
|
+
enableIntegrityCheck: true
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Create a metrics buffer ring
|
|
512
|
+
*/
|
|
513
|
+
static createMetricsBuffer(capacity = 500, persistPath) {
|
|
514
|
+
return new BufferRing({
|
|
515
|
+
capacity,
|
|
516
|
+
overflowStrategy: OverflowStrategy.DROP_OLDEST,
|
|
517
|
+
persistPath,
|
|
518
|
+
autoPersist: false, // Manual persistence for performance
|
|
519
|
+
maxPersistEntries: 0, // Persist all
|
|
520
|
+
enableIntegrityCheck: true,
|
|
521
|
+
serializer: (entry) => ({
|
|
522
|
+
...entry,
|
|
523
|
+
timestamp: entry.timestamp || new Date().toISOString()
|
|
524
|
+
})
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Create an event buffer ring
|
|
529
|
+
*/
|
|
530
|
+
static createEventBuffer(capacity = 200) {
|
|
531
|
+
return new BufferRing({
|
|
532
|
+
capacity,
|
|
533
|
+
overflowStrategy: OverflowStrategy.DROP_OLDEST,
|
|
534
|
+
autoPersist: false,
|
|
535
|
+
enableIntegrityCheck: false // Events are transient
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Create a resizable buffer ring
|
|
540
|
+
*/
|
|
541
|
+
static createResizableBuffer(initialCapacity = 100, _maxCapacity = 10000) {
|
|
542
|
+
return new BufferRing({
|
|
543
|
+
capacity: initialCapacity,
|
|
544
|
+
overflowStrategy: OverflowStrategy.RESIZE,
|
|
545
|
+
autoPersist: false,
|
|
546
|
+
enableIntegrityCheck: false
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
exports.BufferRingFactory = BufferRingFactory;
|
|
551
|
+
exports.default = BufferRing;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BufferRing Usage Examples
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates various use cases for the configurable BufferRing utility,
|
|
5
|
+
* particularly for log management, metrics collection, and event handling in the
|
|
6
|
+
* Index Server.
|
|
7
|
+
*/
|
|
8
|
+
import { BufferRing, BufferRingFactory, OverflowStrategy } from './BufferRing';
|
|
9
|
+
export declare function createLogViewerBuffer(logDir: string): BufferRing<string>;
|
|
10
|
+
export declare function createMetricsCollector(dataDir: string): BufferRing<Record<string, unknown>>;
|
|
11
|
+
export declare function createEventTracker(): BufferRing<Record<string, unknown>>;
|
|
12
|
+
export declare function createToolMetricsBuffer(): BufferRing<{
|
|
13
|
+
toolName: string;
|
|
14
|
+
duration: number;
|
|
15
|
+
timestamp: string;
|
|
16
|
+
success: boolean;
|
|
17
|
+
}>;
|
|
18
|
+
export interface BufferConfig {
|
|
19
|
+
type: 'log' | 'metrics' | 'events' | 'custom';
|
|
20
|
+
capacity: number;
|
|
21
|
+
persistPath?: string;
|
|
22
|
+
overflowStrategy?: OverflowStrategy;
|
|
23
|
+
autoPersist?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function createConfiguredBuffer(config: BufferConfig): BufferRing<unknown>;
|
|
26
|
+
export declare class LogViewerService {
|
|
27
|
+
private logBuffer;
|
|
28
|
+
constructor(logDir: string);
|
|
29
|
+
addLogEntry(logLine: string): void;
|
|
30
|
+
getRecentLogs(count?: number): string[];
|
|
31
|
+
getLogRange(start: number, end: number): string[];
|
|
32
|
+
searchLogs(pattern: string): string[];
|
|
33
|
+
getLogStats(): {
|
|
34
|
+
totalLines: number;
|
|
35
|
+
bufferUtilization: number;
|
|
36
|
+
memoryUsage: number;
|
|
37
|
+
totalProcessed: number;
|
|
38
|
+
droppedLines: number;
|
|
39
|
+
};
|
|
40
|
+
clearLogs(): void;
|
|
41
|
+
persistLogs(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
export declare class LogStreamer {
|
|
44
|
+
private logBuffer;
|
|
45
|
+
private subscribers;
|
|
46
|
+
constructor(bufferSize?: number);
|
|
47
|
+
addLog(logEntry: string): void;
|
|
48
|
+
subscribe(callback: (log: string) => void): () => void;
|
|
49
|
+
getBufferSnapshot(): string[];
|
|
50
|
+
getStats(): {
|
|
51
|
+
bufferStats: import("./BufferRing").BufferRingStats;
|
|
52
|
+
subscriberCount: number;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export { BufferRing, BufferRingFactory, OverflowStrategy };
|