claude-flow-novice 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -9,854 +9,655 @@
|
|
|
9
9
|
* - Write operations: <500 nanoseconds (P95)
|
|
10
10
|
* - Concurrent throughput: >10M operations/second
|
|
11
11
|
* - Memory efficiency: >90% utilization
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
LockFreeMemoryPool,
|
|
17
|
-
LockFreeRingBuffer,
|
|
18
|
-
AtomicOperations
|
|
19
|
-
} from './lock-free-structures.js';
|
|
20
|
-
|
|
21
|
-
import {
|
|
22
|
-
AdvancedMemoryPressureManager,
|
|
23
|
-
MEMORY_PRESSURE_CONFIG
|
|
24
|
-
} from './memory-pressure-manager.js';
|
|
25
|
-
|
|
26
|
-
import {
|
|
27
|
-
HighPerformanceHash,
|
|
28
|
-
FastSerializer,
|
|
29
|
-
NamespaceKeySerializer
|
|
30
|
-
} from './high-performance-serialization.js';
|
|
31
|
-
|
|
32
|
-
import {
|
|
33
|
-
MemoryMappedPersistence,
|
|
34
|
-
BackupStrategyManager
|
|
35
|
-
} from './memory-mapped-persistence.js';
|
|
36
|
-
|
|
12
|
+
*/ import { LockFreeHashTable, LockFreeMemoryPool, AtomicOperations } from "./lock-free-structures.js";
|
|
13
|
+
import { AdvancedMemoryPressureManager } from "./memory-pressure-manager.js";
|
|
14
|
+
import { HighPerformanceHash, FastSerializer } from "./high-performance-serialization.js";
|
|
15
|
+
import { MemoryMappedPersistence, BackupStrategyManager } from "./memory-mapped-persistence.js";
|
|
37
16
|
/**
|
|
38
17
|
* Memory store configuration optimized for performance
|
|
39
|
-
*/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
// Performance monitoring
|
|
64
|
-
ENABLE_METRICS: true, // Enable performance counters
|
|
65
|
-
SAMPLING_RATE: 0.01, // 1% sampling for detailed metrics
|
|
66
|
-
METRIC_HISTORY_SIZE: 10000 // Number of samples to keep
|
|
67
|
-
};
|
|
68
|
-
|
|
18
|
+
*/ const ULTRA_FAST_CONFIG = {
|
|
19
|
+
// Memory layout
|
|
20
|
+
DEFAULT_SIZE: 64 * 1024 * 1024,
|
|
21
|
+
HEADER_SIZE: 1024,
|
|
22
|
+
BUCKET_COUNT: 16384,
|
|
23
|
+
REGION_SIZE: 4096,
|
|
24
|
+
// Performance tuning
|
|
25
|
+
CACHE_LINE_SIZE: 64,
|
|
26
|
+
MAX_KEY_SIZE: 256,
|
|
27
|
+
MAX_VALUE_SIZE: 64 * 1024,
|
|
28
|
+
THREAD_CACHE_SIZE: 16,
|
|
29
|
+
// Concurrency settings
|
|
30
|
+
MAX_CONCURRENT_OPERATIONS: 1000,
|
|
31
|
+
BACKOFF_MAX_ATTEMPTS: 16,
|
|
32
|
+
SPIN_LOCK_ITERATIONS: 100,
|
|
33
|
+
// Memory management
|
|
34
|
+
MEMORY_POOL_RATIO: 0.7,
|
|
35
|
+
METADATA_RATIO: 0.2,
|
|
36
|
+
RESERVE_RATIO: 0.1,
|
|
37
|
+
// Performance monitoring
|
|
38
|
+
ENABLE_METRICS: true,
|
|
39
|
+
SAMPLING_RATE: 0.01,
|
|
40
|
+
METRIC_HISTORY_SIZE: 10000 // Number of samples to keep
|
|
41
|
+
};
|
|
69
42
|
/**
|
|
70
43
|
* SharedArrayBuffer memory layout
|
|
71
|
-
*/
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
offset: null, // Calculated
|
|
94
|
-
size: 1024
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
|
|
44
|
+
*/ const MEMORY_LAYOUT = {
|
|
45
|
+
// Header (1KB) - cache line aligned
|
|
46
|
+
HEADER: {
|
|
47
|
+
offset: 0,
|
|
48
|
+
size: 1024
|
|
49
|
+
},
|
|
50
|
+
// Hash table buckets
|
|
51
|
+
HASH_TABLE: {
|
|
52
|
+
offset: 1024,
|
|
53
|
+
size: 16384 * 32 // 16K buckets * 32 bytes each
|
|
54
|
+
},
|
|
55
|
+
// Memory pool for entries
|
|
56
|
+
MEMORY_POOL: {
|
|
57
|
+
offset: 1024 + 16384 * 32,
|
|
58
|
+
size: null // Calculated based on remaining space
|
|
59
|
+
},
|
|
60
|
+
// Performance counters
|
|
61
|
+
COUNTERS: {
|
|
62
|
+
offset: null,
|
|
63
|
+
size: 1024
|
|
64
|
+
}
|
|
65
|
+
};
|
|
98
66
|
/**
|
|
99
67
|
* Entry layout in memory (cache-aligned)
|
|
100
|
-
*/
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
};
|
|
113
|
-
|
|
68
|
+
*/ const ENTRY_LAYOUT = {
|
|
69
|
+
next: 0,
|
|
70
|
+
keyHash: 4,
|
|
71
|
+
keyLength: 8,
|
|
72
|
+
valueLength: 10,
|
|
73
|
+
namespace: 12,
|
|
74
|
+
timestamp: 16,
|
|
75
|
+
flags: 24,
|
|
76
|
+
checksum: 28,
|
|
77
|
+
keyData: 32,
|
|
78
|
+
valueData: null // Variable - Value data (follows key)
|
|
79
|
+
};
|
|
114
80
|
/**
|
|
115
81
|
* Ultra-fast memory store implementation
|
|
116
|
-
*/
|
|
117
|
-
|
|
118
|
-
constructor(config = ULTRA_FAST_CONFIG) {
|
|
119
|
-
this.config = { ...ULTRA_FAST_CONFIG, ...config };
|
|
120
|
-
|
|
121
|
-
// Initialize SharedArrayBuffer
|
|
122
|
-
this.sharedBuffer = new SharedArrayBuffer(this.config.DEFAULT_SIZE);
|
|
123
|
-
this.bufferSize = this.config.DEFAULT_SIZE;
|
|
124
|
-
|
|
125
|
-
// Calculate memory layout offsets
|
|
126
|
-
this.calculateMemoryLayout();
|
|
127
|
-
|
|
128
|
-
// Initialize core components
|
|
129
|
-
this.initializeComponents();
|
|
130
|
-
|
|
131
|
-
// Performance monitoring
|
|
132
|
-
this.performanceCounters = new Map();
|
|
133
|
-
this.operationSampler = new Map();
|
|
134
|
-
|
|
135
|
-
// State tracking
|
|
136
|
-
this.isInitialized = false;
|
|
137
|
-
this.startTime = performance.now();
|
|
138
|
-
|
|
139
|
-
console.log(`UltraFastMemoryStore initialized: ${this.bufferSize} bytes`);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
82
|
+
*/ export class UltraFastMemoryStore {
|
|
83
|
+
/**
|
|
143
84
|
* Calculate memory layout based on buffer size
|
|
144
|
-
*/
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
MEMORY_LAYOUT.COUNTERS.offset = this.bufferSize - 1024;
|
|
158
|
-
MEMORY_LAYOUT.COUNTERS.size = 1024;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
85
|
+
*/ calculateMemoryLayout() {
|
|
86
|
+
let offset = MEMORY_LAYOUT.HEADER.offset + MEMORY_LAYOUT.HEADER.size;
|
|
87
|
+
// Hash table
|
|
88
|
+
MEMORY_LAYOUT.HASH_TABLE.offset = offset;
|
|
89
|
+
offset += MEMORY_LAYOUT.HASH_TABLE.size;
|
|
90
|
+
// Memory pool (majority of space)
|
|
91
|
+
MEMORY_LAYOUT.MEMORY_POOL.offset = offset;
|
|
92
|
+
MEMORY_LAYOUT.MEMORY_POOL.size = this.bufferSize - offset - 1024; // Reserve 1KB for counters
|
|
93
|
+
// Performance counters at the end
|
|
94
|
+
MEMORY_LAYOUT.COUNTERS.offset = this.bufferSize - 1024;
|
|
95
|
+
MEMORY_LAYOUT.COUNTERS.size = 1024;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
162
98
|
* Initialize all components
|
|
163
|
-
*/
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
// Namespace management
|
|
183
|
-
this.namespaceManager = new NamespaceManager(this.sharedBuffer);
|
|
184
|
-
|
|
185
|
-
// Memory pressure management
|
|
186
|
-
this.memoryPressureManager = new AdvancedMemoryPressureManager(this);
|
|
187
|
-
|
|
188
|
-
// Persistence layer
|
|
189
|
-
this.persistence = null; // Initialized on demand
|
|
190
|
-
|
|
191
|
-
// Performance monitoring
|
|
192
|
-
this.initializePerformanceMonitoring();
|
|
193
|
-
|
|
194
|
-
this.isInitialized = true;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
99
|
+
*/ initializeComponents() {
|
|
100
|
+
// Initialize header
|
|
101
|
+
this.initializeHeader();
|
|
102
|
+
// Hash table for fast key lookup
|
|
103
|
+
this.hashTable = new LockFreeHashTable(this.sharedBuffer, this.config.BUCKET_COUNT, MEMORY_LAYOUT.HASH_TABLE.offset);
|
|
104
|
+
// Memory pool for entry allocation
|
|
105
|
+
this.memoryPool = new LockFreeMemoryPool(this.sharedBuffer, MEMORY_LAYOUT.MEMORY_POOL.offset, MEMORY_LAYOUT.MEMORY_POOL.size);
|
|
106
|
+
// Namespace management
|
|
107
|
+
this.namespaceManager = new NamespaceManager(this.sharedBuffer);
|
|
108
|
+
// Memory pressure management
|
|
109
|
+
this.memoryPressureManager = new AdvancedMemoryPressureManager(this);
|
|
110
|
+
// Persistence layer
|
|
111
|
+
this.persistence = null; // Initialized on demand
|
|
112
|
+
// Performance monitoring
|
|
113
|
+
this.initializePerformanceMonitoring();
|
|
114
|
+
this.isInitialized = true;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
198
117
|
* Initialize SharedArrayBuffer header
|
|
199
|
-
*/
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
headerView.setBigUint64(40, BigInt(0), true); // Write counter
|
|
217
|
-
headerView.setBigUint64(48, BigInt(Date.now()), true); // Creation time
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
118
|
+
*/ initializeHeader() {
|
|
119
|
+
const headerView = new DataView(this.sharedBuffer, 0, MEMORY_LAYOUT.HEADER.size);
|
|
120
|
+
// Magic number and version
|
|
121
|
+
headerView.setUint32(0, 0x464C4F57, true); // 'FLOW' magic
|
|
122
|
+
headerView.setUint32(4, 1, true); // Version 1
|
|
123
|
+
// Buffer information
|
|
124
|
+
headerView.setBigUint64(8, BigInt(this.bufferSize), true);
|
|
125
|
+
headerView.setUint32(16, this.config.BUCKET_COUNT, true);
|
|
126
|
+
headerView.setUint32(20, 0, true); // Entry count (atomic)
|
|
127
|
+
headerView.setUint32(24, 0, true); // Max entries
|
|
128
|
+
headerView.setUint32(28, 0, true); // Free head (atomic)
|
|
129
|
+
// Statistics counters
|
|
130
|
+
headerView.setBigUint64(32, BigInt(0), true); // Read counter
|
|
131
|
+
headerView.setBigUint64(40, BigInt(0), true); // Write counter
|
|
132
|
+
headerView.setBigUint64(48, BigInt(Date.now()), true); // Creation time
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
221
135
|
* Initialize performance monitoring
|
|
222
|
-
*/
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
this.sampler = {
|
|
239
|
-
readSamples: [],
|
|
240
|
-
writeSamples: [],
|
|
241
|
-
maxSamples: this.config.METRIC_HISTORY_SIZE,
|
|
242
|
-
sampleRate: this.config.SAMPLING_RATE
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
136
|
+
*/ initializePerformanceMonitoring() {
|
|
137
|
+
if (!this.config.ENABLE_METRICS) return;
|
|
138
|
+
// Performance counters in shared memory
|
|
139
|
+
this.counterOffset = MEMORY_LAYOUT.COUNTERS.offset;
|
|
140
|
+
const counterView = new Uint32Array(this.sharedBuffer, this.counterOffset, MEMORY_LAYOUT.COUNTERS.size / 4);
|
|
141
|
+
// Initialize counters to zero
|
|
142
|
+
counterView.fill(0);
|
|
143
|
+
// Performance sampling
|
|
144
|
+
this.sampler = {
|
|
145
|
+
readSamples: [],
|
|
146
|
+
writeSamples: [],
|
|
147
|
+
maxSamples: this.config.METRIC_HISTORY_SIZE,
|
|
148
|
+
sampleRate: this.config.SAMPLING_RATE
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
247
152
|
* High-performance GET operation - Target: <100ns
|
|
248
|
-
*/
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
this.recordPerformanceSample('read', duration);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
return value;
|
|
288
|
-
|
|
289
|
-
} catch (error) {
|
|
290
|
-
this.incrementCounter('errors');
|
|
291
|
-
throw error;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
153
|
+
*/ get(namespace, key) {
|
|
154
|
+
const startTime = this.config.ENABLE_METRICS ? performance.now() * 1000000 : 0;
|
|
155
|
+
try {
|
|
156
|
+
// Resolve namespace (cached operation)
|
|
157
|
+
const namespaceId = this.namespaceManager.resolveNamespace(namespace);
|
|
158
|
+
// Calculate hash
|
|
159
|
+
const keyHash = HighPerformanceHash.xxhash32(key);
|
|
160
|
+
const namespacedHash = HighPerformanceHash.mixHash(namespaceId ^ keyHash);
|
|
161
|
+
// Find entry in hash table
|
|
162
|
+
const entryOffset = this.hashTable.lookup(namespacedHash, (entry)=>{
|
|
163
|
+
return this.compareKey(entry, namespaceId, key);
|
|
164
|
+
});
|
|
165
|
+
if (entryOffset === 0) {
|
|
166
|
+
// Key not found
|
|
167
|
+
this.incrementCounter('cacheMisses');
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
// Extract value from entry
|
|
171
|
+
const value = this.extractValue(entryOffset);
|
|
172
|
+
// Update access metadata (for eviction algorithms)
|
|
173
|
+
this.updateEntryAccess(entryOffset);
|
|
174
|
+
// Update statistics
|
|
175
|
+
this.incrementCounter('readOperations');
|
|
176
|
+
this.incrementCounter('cacheHits');
|
|
177
|
+
// Record performance sample
|
|
178
|
+
if (this.config.ENABLE_METRICS && this.shouldSample()) {
|
|
179
|
+
const duration = performance.now() * 1000000 - startTime;
|
|
180
|
+
this.recordPerformanceSample('read', duration);
|
|
181
|
+
}
|
|
182
|
+
return value;
|
|
183
|
+
} catch (error) {
|
|
184
|
+
this.incrementCounter('errors');
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
296
189
|
* High-performance SET operation - Target: <500ns
|
|
297
|
-
*/
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
}
|
|
350
|
-
return this.createNewEntry(retryOffset, namespaceId, keyHash, namespacedHash, key, serializedValue, startTime);
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
return this.createNewEntry(entryOffset, namespaceId, keyHash, namespacedHash, key, serializedValue, startTime);
|
|
354
|
-
|
|
355
|
-
} catch (error) {
|
|
356
|
-
this.incrementCounter('errors');
|
|
357
|
-
throw error;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/**
|
|
190
|
+
*/ async set(namespace, key, value) {
|
|
191
|
+
const startTime = this.config.ENABLE_METRICS ? performance.now() * 1000000 : 0;
|
|
192
|
+
try {
|
|
193
|
+
// Input validation
|
|
194
|
+
if (key.length > this.config.MAX_KEY_SIZE) {
|
|
195
|
+
throw new Error(`Key too large: ${key.length} > ${this.config.MAX_KEY_SIZE}`);
|
|
196
|
+
}
|
|
197
|
+
const serializedValue = FastSerializer.serialize(value);
|
|
198
|
+
if (serializedValue.length > this.config.MAX_VALUE_SIZE) {
|
|
199
|
+
throw new Error(`Value too large: ${serializedValue.length} > ${this.config.MAX_VALUE_SIZE}`);
|
|
200
|
+
}
|
|
201
|
+
// Resolve namespace
|
|
202
|
+
const namespaceId = this.namespaceManager.resolveNamespace(namespace);
|
|
203
|
+
// Calculate hash
|
|
204
|
+
const keyHash = HighPerformanceHash.xxhash32(key);
|
|
205
|
+
const namespacedHash = HighPerformanceHash.mixHash(namespaceId ^ keyHash);
|
|
206
|
+
// Check for existing entry
|
|
207
|
+
const existingOffset = this.hashTable.lookup(namespacedHash, (entry)=>{
|
|
208
|
+
return this.compareKey(entry, namespaceId, key);
|
|
209
|
+
});
|
|
210
|
+
if (existingOffset !== 0) {
|
|
211
|
+
// Update existing entry
|
|
212
|
+
const success = this.updateEntry(existingOffset, serializedValue);
|
|
213
|
+
if (success) {
|
|
214
|
+
this.incrementCounter('writeOperations');
|
|
215
|
+
this.recordWritePerformance(startTime);
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Create new entry
|
|
220
|
+
const entrySize = this.calculateEntrySize(key, serializedValue);
|
|
221
|
+
const entryOffset = this.memoryPool.allocate(entrySize);
|
|
222
|
+
if (entryOffset === 0) {
|
|
223
|
+
// Memory pressure - trigger eviction
|
|
224
|
+
const evicted = await this.memoryPressureManager.checkMemoryPressure();
|
|
225
|
+
if (!evicted) {
|
|
226
|
+
throw new Error('Cannot allocate memory: pool exhausted');
|
|
227
|
+
}
|
|
228
|
+
// Retry allocation after eviction
|
|
229
|
+
const retryOffset = this.memoryPool.allocate(entrySize);
|
|
230
|
+
if (retryOffset === 0) {
|
|
231
|
+
throw new Error('Cannot allocate memory after eviction');
|
|
232
|
+
}
|
|
233
|
+
return this.createNewEntry(retryOffset, namespaceId, keyHash, namespacedHash, key, serializedValue, startTime);
|
|
234
|
+
}
|
|
235
|
+
return this.createNewEntry(entryOffset, namespaceId, keyHash, namespacedHash, key, serializedValue, startTime);
|
|
236
|
+
} catch (error) {
|
|
237
|
+
this.incrementCounter('errors');
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
362
242
|
* Create new entry in memory
|
|
363
|
-
*/
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// Record performance
|
|
386
|
-
this.recordWritePerformance(startTime);
|
|
387
|
-
|
|
388
|
-
return true;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
/**
|
|
243
|
+
*/ createNewEntry(entryOffset, namespaceId, keyHash, namespacedHash, key, serializedValue, startTime) {
|
|
244
|
+
// Initialize entry structure
|
|
245
|
+
this.initializeEntry(entryOffset, namespaceId, keyHash, key, serializedValue);
|
|
246
|
+
// Insert into hash table
|
|
247
|
+
const inserted = this.hashTable.insert(namespacedHash, entryOffset);
|
|
248
|
+
if (!inserted) {
|
|
249
|
+
// Insertion failed - deallocate and throw
|
|
250
|
+
this.memoryPool.deallocate(entryOffset);
|
|
251
|
+
throw new Error('Failed to insert entry into hash table');
|
|
252
|
+
}
|
|
253
|
+
// Update statistics
|
|
254
|
+
this.incrementCounter('writeOperations');
|
|
255
|
+
AtomicOperations.atomicIncrement(this.sharedBuffer, 20); // Entry count
|
|
256
|
+
// Mark region as dirty for backup
|
|
257
|
+
if (this.persistence) {
|
|
258
|
+
this.persistence.markRegionDirty(entryOffset);
|
|
259
|
+
}
|
|
260
|
+
// Record performance
|
|
261
|
+
this.recordWritePerformance(startTime);
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
392
265
|
* Initialize entry structure in memory
|
|
393
|
-
*/
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
// Calculate and store checksum
|
|
419
|
-
const checksum = this.calculateEntryChecksum(entryOffset);
|
|
420
|
-
entryView.setUint32(ENTRY_LAYOUT.checksum, checksum, true);
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
/**
|
|
266
|
+
*/ initializeEntry(entryOffset, namespaceId, keyHash, key, serializedValue) {
|
|
267
|
+
const now = performance.now() * 1000000; // nanoseconds
|
|
268
|
+
// Entry header
|
|
269
|
+
AtomicOperations.storeRelease(this.sharedBuffer, entryOffset + ENTRY_LAYOUT.next, 0);
|
|
270
|
+
AtomicOperations.storeRelease(this.sharedBuffer, entryOffset + ENTRY_LAYOUT.keyHash, keyHash);
|
|
271
|
+
const entryView = new DataView(this.sharedBuffer, entryOffset, 64);
|
|
272
|
+
entryView.setUint16(ENTRY_LAYOUT.keyLength, key.length, true);
|
|
273
|
+
entryView.setUint16(ENTRY_LAYOUT.valueLength, serializedValue.length, true);
|
|
274
|
+
entryView.setUint32(ENTRY_LAYOUT.namespace, namespaceId, true);
|
|
275
|
+
entryView.setBigUint64(ENTRY_LAYOUT.timestamp, BigInt(now), true);
|
|
276
|
+
entryView.setUint32(ENTRY_LAYOUT.flags, 0, true);
|
|
277
|
+
// Key data
|
|
278
|
+
const keyBytes = new TextEncoder().encode(key);
|
|
279
|
+
const keyView = new Uint8Array(this.sharedBuffer, entryOffset + ENTRY_LAYOUT.keyData, keyBytes.length);
|
|
280
|
+
keyView.set(keyBytes);
|
|
281
|
+
// Value data (after key, aligned to 8 bytes)
|
|
282
|
+
const valueOffset = entryOffset + ENTRY_LAYOUT.keyData + this.alignTo8(key.length);
|
|
283
|
+
const valueView = new Uint8Array(this.sharedBuffer, valueOffset, serializedValue.length);
|
|
284
|
+
valueView.set(serializedValue);
|
|
285
|
+
// Calculate and store checksum
|
|
286
|
+
const checksum = this.calculateEntryChecksum(entryOffset);
|
|
287
|
+
entryView.setUint32(ENTRY_LAYOUT.checksum, checksum, true);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
424
290
|
* Compare key for hash table lookup
|
|
425
|
-
*/
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
return true;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
/**
|
|
291
|
+
*/ compareKey(entryView, namespaceId, key) {
|
|
292
|
+
// Fast namespace check first
|
|
293
|
+
const entryNamespace = entryView.namespace();
|
|
294
|
+
if (entryNamespace !== namespaceId) {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
// Key length check
|
|
298
|
+
const entryKeyLength = entryView.keyLength();
|
|
299
|
+
if (entryKeyLength !== key.length) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
// Key data comparison
|
|
303
|
+
const entryKeyOffset = entryView.offset + ENTRY_LAYOUT.keyData;
|
|
304
|
+
const entryKeyView = new Uint8Array(this.sharedBuffer, entryKeyOffset, entryKeyLength);
|
|
305
|
+
const keyBytes = new TextEncoder().encode(key);
|
|
306
|
+
// Optimized byte-by-byte comparison
|
|
307
|
+
for(let i = 0; i < entryKeyLength; i++){
|
|
308
|
+
if (entryKeyView[i] !== keyBytes[i]) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
455
315
|
* Extract value from entry
|
|
456
|
-
*/
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
return FastSerializer.deserialize(valueBytes);
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
/**
|
|
316
|
+
*/ extractValue(entryOffset) {
|
|
317
|
+
const entryView = new DataView(this.sharedBuffer, entryOffset, 64);
|
|
318
|
+
const keyLength = entryView.getUint16(ENTRY_LAYOUT.keyLength, true);
|
|
319
|
+
const valueLength = entryView.getUint16(ENTRY_LAYOUT.valueLength, true);
|
|
320
|
+
const valueOffset = entryOffset + ENTRY_LAYOUT.keyData + this.alignTo8(keyLength);
|
|
321
|
+
const valueBytes = new Uint8Array(this.sharedBuffer, valueOffset, valueLength);
|
|
322
|
+
return FastSerializer.deserialize(valueBytes);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
470
325
|
* Update entry access metadata
|
|
471
|
-
*/
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
/**
|
|
326
|
+
*/ updateEntryAccess(entryOffset) {
|
|
327
|
+
const now = performance.now() * 1000000;
|
|
328
|
+
// Update timestamp atomically
|
|
329
|
+
const timestampOffset = entryOffset + ENTRY_LAYOUT.timestamp;
|
|
330
|
+
AtomicOperations.storeRelease(this.sharedBuffer, timestampOffset, now);
|
|
331
|
+
// Update memory pressure manager
|
|
332
|
+
this.memoryPressureManager.updateEntryAccess({
|
|
333
|
+
offset: entryOffset
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
484
337
|
* Delete operation with lazy deletion
|
|
485
|
-
*/
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
// Decrement entry count
|
|
510
|
-
AtomicOperations.atomicDecrement(this.sharedBuffer, 20);
|
|
511
|
-
this.incrementCounter('deletions');
|
|
512
|
-
return true;
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
return false;
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
/**
|
|
338
|
+
*/ delete(namespace, key) {
|
|
339
|
+
const namespaceId = this.namespaceManager.resolveNamespace(namespace);
|
|
340
|
+
const keyHash = HighPerformanceHash.xxhash32(key);
|
|
341
|
+
const namespacedHash = HighPerformanceHash.mixHash(namespaceId ^ keyHash);
|
|
342
|
+
const entryOffset = this.hashTable.lookup(namespacedHash, (entry)=>{
|
|
343
|
+
return this.compareKey(entry, namespaceId, key);
|
|
344
|
+
});
|
|
345
|
+
if (entryOffset === 0) {
|
|
346
|
+
return false; // Key not found
|
|
347
|
+
}
|
|
348
|
+
// Mark entry as deleted (lazy deletion)
|
|
349
|
+
const flagsOffset = entryOffset + ENTRY_LAYOUT.flags;
|
|
350
|
+
const currentFlags = AtomicOperations.loadAcquire(this.sharedBuffer, flagsOffset);
|
|
351
|
+
const deletedFlags = currentFlags | 0x80000000; // Set deleted bit
|
|
352
|
+
const success = AtomicOperations.compareAndSwap32(this.sharedBuffer, flagsOffset, currentFlags, deletedFlags);
|
|
353
|
+
if (success === currentFlags) {
|
|
354
|
+
// Decrement entry count
|
|
355
|
+
AtomicOperations.atomicDecrement(this.sharedBuffer, 20);
|
|
356
|
+
this.incrementCounter('deletions');
|
|
357
|
+
return true;
|
|
358
|
+
}
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
519
362
|
* Batch operations for better performance
|
|
520
|
-
*/
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
/**
|
|
363
|
+
*/ async setBatch(namespace, entries) {
|
|
364
|
+
const results = new Array(entries.length);
|
|
365
|
+
// Process in parallel where possible
|
|
366
|
+
const promises = entries.map(async (entry, index)=>{
|
|
367
|
+
try {
|
|
368
|
+
results[index] = await this.set(namespace, entry.key, entry.value);
|
|
369
|
+
} catch (error) {
|
|
370
|
+
results[index] = {
|
|
371
|
+
error: error.message
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
await Promise.all(promises);
|
|
376
|
+
return results;
|
|
377
|
+
}
|
|
378
|
+
getBatch(namespace, keys) {
|
|
379
|
+
const results = new Map();
|
|
380
|
+
for (const key of keys){
|
|
381
|
+
try {
|
|
382
|
+
const value = this.get(namespace, key);
|
|
383
|
+
results.set(key, value);
|
|
384
|
+
} catch (error) {
|
|
385
|
+
results.set(key, {
|
|
386
|
+
error: error.message
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return results;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
553
393
|
* Namespace operations
|
|
554
|
-
*/
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
return cleared;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
/**
|
|
394
|
+
*/ async clearNamespace(namespace) {
|
|
395
|
+
const namespaceId = this.namespaceManager.resolveNamespace(namespace);
|
|
396
|
+
let cleared = 0;
|
|
397
|
+
// Iterate through all entries and mark namespace entries as deleted
|
|
398
|
+
for(let bucketIndex = 0; bucketIndex < this.config.BUCKET_COUNT; bucketIndex++){
|
|
399
|
+
const bucketOffset = MEMORY_LAYOUT.HASH_TABLE.offset + bucketIndex * 32;
|
|
400
|
+
let entryOffset = AtomicOperations.loadAcquire(this.sharedBuffer, bucketOffset);
|
|
401
|
+
while(entryOffset !== 0){
|
|
402
|
+
const entryView = new DataView(this.sharedBuffer, entryOffset, 64);
|
|
403
|
+
const entryNamespace = entryView.getUint32(ENTRY_LAYOUT.namespace, true);
|
|
404
|
+
if (entryNamespace === namespaceId) {
|
|
405
|
+
// Mark as deleted
|
|
406
|
+
const flagsOffset = entryOffset + ENTRY_LAYOUT.flags;
|
|
407
|
+
const currentFlags = entryView.getUint32(ENTRY_LAYOUT.flags, true);
|
|
408
|
+
entryView.setUint32(ENTRY_LAYOUT.flags, currentFlags | 0x80000000, true);
|
|
409
|
+
cleared++;
|
|
410
|
+
}
|
|
411
|
+
entryOffset = AtomicOperations.loadAcquire(this.sharedBuffer, entryOffset);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return cleared;
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
584
417
|
* Iterator support for namespace
|
|
585
|
-
*/
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
/**
|
|
418
|
+
*/ *iterateNamespace(namespace) {
|
|
419
|
+
const namespaceId = this.namespaceManager.resolveNamespace(namespace);
|
|
420
|
+
for(let bucketIndex = 0; bucketIndex < this.config.BUCKET_COUNT; bucketIndex++){
|
|
421
|
+
const bucketOffset = MEMORY_LAYOUT.HASH_TABLE.offset + bucketIndex * 32;
|
|
422
|
+
let entryOffset = AtomicOperations.loadAcquire(this.sharedBuffer, bucketOffset);
|
|
423
|
+
while(entryOffset !== 0){
|
|
424
|
+
const entryView = new DataView(this.sharedBuffer, entryOffset, 64);
|
|
425
|
+
const entryNamespace = entryView.getUint32(ENTRY_LAYOUT.namespace, true);
|
|
426
|
+
const flags = entryView.getUint32(ENTRY_LAYOUT.flags, true);
|
|
427
|
+
if (entryNamespace === namespaceId && !(flags & 0x80000000)) {
|
|
428
|
+
// Extract key and value
|
|
429
|
+
const keyLength = entryView.getUint16(ENTRY_LAYOUT.keyLength, true);
|
|
430
|
+
const keyBytes = new Uint8Array(this.sharedBuffer, entryOffset + ENTRY_LAYOUT.keyData, keyLength);
|
|
431
|
+
const key = new TextDecoder().decode(keyBytes);
|
|
432
|
+
const value = this.extractValue(entryOffset);
|
|
433
|
+
yield {
|
|
434
|
+
key,
|
|
435
|
+
value
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
entryOffset = AtomicOperations.loadAcquire(this.sharedBuffer, entryOffset);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
614
443
|
* Persistence operations
|
|
615
|
-
*/
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
if (!this.persistence) {
|
|
641
|
-
throw new Error('Persistence not enabled');
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
return await this.persistence.restoreFromBackup();
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
/**
|
|
444
|
+
*/ async enablePersistence(backupPath) {
|
|
445
|
+
this.persistence = new MemoryMappedPersistence(this.sharedBuffer, backupPath);
|
|
446
|
+
await this.persistence.initialize();
|
|
447
|
+
// Start background backup process
|
|
448
|
+
this.backupStrategy = new BackupStrategyManager(this.persistence);
|
|
449
|
+
console.log(`Persistence enabled: ${backupPath}`);
|
|
450
|
+
return this.persistence;
|
|
451
|
+
}
|
|
452
|
+
async backup(type = 'incremental') {
|
|
453
|
+
if (!this.persistence) {
|
|
454
|
+
throw new Error('Persistence not enabled');
|
|
455
|
+
}
|
|
456
|
+
if (type === 'full') {
|
|
457
|
+
return await this.persistence.fullBackup();
|
|
458
|
+
} else {
|
|
459
|
+
return await this.persistence.incrementalBackup();
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
async restore() {
|
|
463
|
+
if (!this.persistence) {
|
|
464
|
+
throw new Error('Persistence not enabled');
|
|
465
|
+
}
|
|
466
|
+
return await this.persistence.restoreFromBackup();
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
648
469
|
* Performance and monitoring
|
|
649
|
-
*/
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
if (samples.length === 0) return {};
|
|
739
|
-
|
|
740
|
-
const latencies = samples.map(s => s.latency).sort((a, b) => a - b);
|
|
741
|
-
return {
|
|
742
|
-
p50: latencies[Math.floor(latencies.length * 0.5)],
|
|
743
|
-
p95: latencies[Math.floor(latencies.length * 0.95)],
|
|
744
|
-
p99: latencies[Math.floor(latencies.length * 0.99)],
|
|
745
|
-
avg: latencies.reduce((a, b) => a + b, 0) / latencies.length
|
|
746
|
-
};
|
|
747
|
-
};
|
|
748
|
-
|
|
749
|
-
return {
|
|
750
|
-
reads: calculatePercentiles(this.sampler.readSamples),
|
|
751
|
-
writes: calculatePercentiles(this.sampler.writeSamples)
|
|
752
|
-
};
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
/**
|
|
470
|
+
*/ incrementCounter(name) {
|
|
471
|
+
if (!this.config.ENABLE_METRICS) return;
|
|
472
|
+
const counterMap = {
|
|
473
|
+
'readOperations': 0,
|
|
474
|
+
'writeOperations': 4,
|
|
475
|
+
'cacheHits': 8,
|
|
476
|
+
'cacheMisses': 12,
|
|
477
|
+
'evictions': 16,
|
|
478
|
+
'deletions': 20,
|
|
479
|
+
'errors': 24
|
|
480
|
+
};
|
|
481
|
+
const offset = counterMap[name];
|
|
482
|
+
if (offset !== undefined) {
|
|
483
|
+
AtomicOperations.atomicIncrement(this.sharedBuffer, this.counterOffset + offset);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
shouldSample() {
|
|
487
|
+
return Math.random() < this.config.SAMPLING_RATE;
|
|
488
|
+
}
|
|
489
|
+
recordPerformanceSample(operation, latency) {
|
|
490
|
+
const samples = this.sampler[`${operation}Samples`];
|
|
491
|
+
if (samples && samples.length < this.sampler.maxSamples) {
|
|
492
|
+
samples.push({
|
|
493
|
+
latency,
|
|
494
|
+
timestamp: performance.now()
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
recordWritePerformance(startTime) {
|
|
499
|
+
if (this.config.ENABLE_METRICS && this.shouldSample() && startTime > 0) {
|
|
500
|
+
const duration = performance.now() * 1000000 - startTime;
|
|
501
|
+
this.recordPerformanceSample('write', duration);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
getPerformanceStats() {
|
|
505
|
+
if (!this.config.ENABLE_METRICS) {
|
|
506
|
+
return {
|
|
507
|
+
metricsDisabled: true
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
const counterView = new Uint32Array(this.sharedBuffer, this.counterOffset, MEMORY_LAYOUT.COUNTERS.size / 4);
|
|
511
|
+
const readOps = counterView[0];
|
|
512
|
+
const writeOps = counterView[1];
|
|
513
|
+
const cacheHits = counterView[2];
|
|
514
|
+
const cacheMisses = counterView[3];
|
|
515
|
+
return {
|
|
516
|
+
operations: {
|
|
517
|
+
reads: readOps,
|
|
518
|
+
writes: writeOps,
|
|
519
|
+
total: readOps + writeOps
|
|
520
|
+
},
|
|
521
|
+
cache: {
|
|
522
|
+
hits: cacheHits,
|
|
523
|
+
misses: cacheMisses,
|
|
524
|
+
hitRate: cacheHits / (cacheHits + cacheMisses) || 0
|
|
525
|
+
},
|
|
526
|
+
memory: this.getMemoryStats(),
|
|
527
|
+
performance: this.getLatencyStats()
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
getMemoryStats() {
|
|
531
|
+
const poolStats = this.memoryPool.getPoolStats();
|
|
532
|
+
const headerView = new DataView(this.sharedBuffer, 0, MEMORY_LAYOUT.HEADER.size);
|
|
533
|
+
const entryCount = headerView.getUint32(20, true);
|
|
534
|
+
return {
|
|
535
|
+
totalSize: this.bufferSize,
|
|
536
|
+
utilization: poolStats.allocatedBytes / poolStats.totalSize,
|
|
537
|
+
fragmentation: poolStats.fragmentationRatio,
|
|
538
|
+
entryCount,
|
|
539
|
+
avgEntrySize: entryCount > 0 ? poolStats.allocatedBytes / entryCount : 0
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
getLatencyStats() {
|
|
543
|
+
const calculatePercentiles = (samples)=>{
|
|
544
|
+
if (samples.length === 0) return {};
|
|
545
|
+
const latencies = samples.map((s)=>s.latency).sort((a, b)=>a - b);
|
|
546
|
+
return {
|
|
547
|
+
p50: latencies[Math.floor(latencies.length * 0.5)],
|
|
548
|
+
p95: latencies[Math.floor(latencies.length * 0.95)],
|
|
549
|
+
p99: latencies[Math.floor(latencies.length * 0.99)],
|
|
550
|
+
avg: latencies.reduce((a, b)=>a + b, 0) / latencies.length
|
|
551
|
+
};
|
|
552
|
+
};
|
|
553
|
+
return {
|
|
554
|
+
reads: calculatePercentiles(this.sampler.readSamples),
|
|
555
|
+
writes: calculatePercentiles(this.sampler.writeSamples)
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
756
559
|
* Health checks and diagnostics
|
|
757
|
-
*/
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
uptime: performance.now() - this.startTime,
|
|
790
|
-
stats
|
|
791
|
-
};
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
/**
|
|
560
|
+
*/ healthCheck() {
|
|
561
|
+
const issues = [];
|
|
562
|
+
const warnings = [];
|
|
563
|
+
// Check performance targets
|
|
564
|
+
const stats = this.getPerformanceStats();
|
|
565
|
+
if (stats.performance.reads.p95 > 100000) {
|
|
566
|
+
issues.push('Read latency P95 exceeds target (100ns)');
|
|
567
|
+
}
|
|
568
|
+
if (stats.performance.writes.p95 > 500000) {
|
|
569
|
+
issues.push('Write latency P95 exceeds target (500ns)');
|
|
570
|
+
}
|
|
571
|
+
// Check memory utilization
|
|
572
|
+
if (stats.memory.utilization > 0.9) {
|
|
573
|
+
issues.push('Memory utilization above 90%');
|
|
574
|
+
} else if (stats.memory.utilization > 0.8) {
|
|
575
|
+
warnings.push('Memory utilization above 80%');
|
|
576
|
+
}
|
|
577
|
+
// Check cache hit rate
|
|
578
|
+
if (stats.cache.hitRate < 0.8) {
|
|
579
|
+
issues.push(`Cache hit rate below 80%: ${(stats.cache.hitRate * 100).toFixed(1)}%`);
|
|
580
|
+
} else if (stats.cache.hitRate < 0.9) {
|
|
581
|
+
warnings.push(`Cache hit rate below 90%: ${(stats.cache.hitRate * 100).toFixed(1)}%`);
|
|
582
|
+
}
|
|
583
|
+
return {
|
|
584
|
+
healthy: issues.length === 0,
|
|
585
|
+
issues,
|
|
586
|
+
warnings,
|
|
587
|
+
uptime: performance.now() - this.startTime,
|
|
588
|
+
stats
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
795
592
|
* Graceful shutdown
|
|
796
|
-
*/
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
console.log('UltraFastMemoryStore shutdown complete');
|
|
809
|
-
}
|
|
810
|
-
|
|
811
|
-
/**
|
|
593
|
+
*/ async shutdown() {
|
|
594
|
+
console.log('Shutting down UltraFastMemoryStore...');
|
|
595
|
+
// Stop memory pressure management
|
|
596
|
+
this.memoryPressureManager.stopBackgroundOperations();
|
|
597
|
+
// Final backup if persistence enabled
|
|
598
|
+
if (this.persistence) {
|
|
599
|
+
await this.persistence.shutdown();
|
|
600
|
+
}
|
|
601
|
+
console.log('UltraFastMemoryStore shutdown complete');
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
812
604
|
* Utility methods
|
|
813
|
-
*/
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
605
|
+
*/ calculateEntrySize(key, serializedValue) {
|
|
606
|
+
const keySize = new TextEncoder().encode(key).length;
|
|
607
|
+
return 64 + this.alignTo8(keySize) + serializedValue.length; // Header + key + value
|
|
608
|
+
}
|
|
609
|
+
alignTo8(size) {
|
|
610
|
+
return Math.ceil(size / 8) * 8;
|
|
611
|
+
}
|
|
612
|
+
calculateEntryChecksum(entryOffset) {
|
|
613
|
+
// Simple XOR checksum for demonstration - use CRC32 in production
|
|
614
|
+
const entryView = new DataView(this.sharedBuffer, entryOffset, 28); // Exclude checksum field
|
|
615
|
+
let checksum = 0;
|
|
616
|
+
for(let i = 0; i < 28; i += 4){
|
|
617
|
+
checksum ^= entryView.getUint32(i, true);
|
|
618
|
+
}
|
|
619
|
+
return checksum;
|
|
620
|
+
}
|
|
621
|
+
constructor(config = ULTRA_FAST_CONFIG){
|
|
622
|
+
this.config = {
|
|
623
|
+
...ULTRA_FAST_CONFIG,
|
|
624
|
+
...config
|
|
625
|
+
};
|
|
626
|
+
// Initialize SharedArrayBuffer
|
|
627
|
+
this.sharedBuffer = new SharedArrayBuffer(this.config.DEFAULT_SIZE);
|
|
628
|
+
this.bufferSize = this.config.DEFAULT_SIZE;
|
|
629
|
+
// Calculate memory layout offsets
|
|
630
|
+
this.calculateMemoryLayout();
|
|
631
|
+
// Initialize core components
|
|
632
|
+
this.initializeComponents();
|
|
633
|
+
// Performance monitoring
|
|
634
|
+
this.performanceCounters = new Map();
|
|
635
|
+
this.operationSampler = new Map();
|
|
636
|
+
// State tracking
|
|
637
|
+
this.isInitialized = false;
|
|
638
|
+
this.startTime = performance.now();
|
|
639
|
+
console.log(`UltraFastMemoryStore initialized: ${this.bufferSize} bytes`);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
836
642
|
/**
|
|
837
643
|
* Namespace manager for the memory store
|
|
838
|
-
*/
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
// Export the main class and configuration
|
|
862
|
-
export { ULTRA_FAST_CONFIG, MEMORY_LAYOUT, ENTRY_LAYOUT };
|
|
644
|
+
*/ let NamespaceManager = class NamespaceManager {
|
|
645
|
+
resolveNamespace(namespaceName) {
|
|
646
|
+
// Check cache first
|
|
647
|
+
let namespaceId = this.namespaceCache.get(namespaceName);
|
|
648
|
+
if (namespaceId !== undefined) {
|
|
649
|
+
return namespaceId;
|
|
650
|
+
}
|
|
651
|
+
// Generate namespace ID from hash for consistency
|
|
652
|
+
namespaceId = HighPerformanceHash.fnv1a32(namespaceName) & 0x7FFFFFFF; // Ensure positive
|
|
653
|
+
this.namespaceCache.set(namespaceName, namespaceId);
|
|
654
|
+
return namespaceId;
|
|
655
|
+
}
|
|
656
|
+
constructor(sharedBuffer){
|
|
657
|
+
this.sharedBuffer = sharedBuffer;
|
|
658
|
+
this.namespaceCache = new Map(); // Local cache for performance
|
|
659
|
+
this.nextNamespaceId = 1;
|
|
660
|
+
}
|
|
661
|
+
};
|
|
662
|
+
// Export the main class and configuration
|
|
663
|
+
export { ULTRA_FAST_CONFIG, MEMORY_LAYOUT, ENTRY_LAYOUT };
|