@joystick.js/db-canary 0.0.0-canary.2209
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/.build/getFilesToBuild.js +26 -0
- package/.build/getPlatformSafeFilePath.js +6 -0
- package/.build/getPlatformSafePath.js +6 -0
- package/.build/index.js +88 -0
- package/.build/isWindows.js +3 -0
- package/API_KEY +1 -0
- package/README.md +1821 -0
- package/data/data.mdb +0 -0
- package/data/lock.mdb +0 -0
- package/dist/client/database.js +1 -0
- package/dist/client/index.js +1 -0
- package/dist/server/cluster/index.js +1 -0
- package/dist/server/cluster/master.js +20 -0
- package/dist/server/cluster/worker.js +1 -0
- package/dist/server/index.js +1 -0
- package/dist/server/lib/api_key_manager.js +9 -0
- package/dist/server/lib/auth_manager.js +1 -0
- package/dist/server/lib/auto_index_manager.js +1 -0
- package/dist/server/lib/backup_manager.js +1 -0
- package/dist/server/lib/connection_manager.js +1 -0
- package/dist/server/lib/disk_utils.js +2 -0
- package/dist/server/lib/http_server.js +405 -0
- package/dist/server/lib/index_manager.js +1 -0
- package/dist/server/lib/load_settings.js +1 -0
- package/dist/server/lib/logger.js +1 -0
- package/dist/server/lib/op_types.js +1 -0
- package/dist/server/lib/operation_dispatcher.js +1 -0
- package/dist/server/lib/operations/admin.js +1 -0
- package/dist/server/lib/operations/bulk_write.js +1 -0
- package/dist/server/lib/operations/create_index.js +1 -0
- package/dist/server/lib/operations/delete_one.js +1 -0
- package/dist/server/lib/operations/drop_index.js +1 -0
- package/dist/server/lib/operations/find.js +1 -0
- package/dist/server/lib/operations/find_one.js +1 -0
- package/dist/server/lib/operations/get_indexes.js +1 -0
- package/dist/server/lib/operations/insert_one.js +1 -0
- package/dist/server/lib/operations/update_one.js +1 -0
- package/dist/server/lib/performance_monitor.js +1 -0
- package/dist/server/lib/query_engine.js +1 -0
- package/dist/server/lib/recovery_manager.js +1 -0
- package/dist/server/lib/replication_manager.js +1 -0
- package/dist/server/lib/safe_json_parse.js +1 -0
- package/dist/server/lib/send_response.js +1 -0
- package/dist/server/lib/tcp_protocol.js +1 -0
- package/dist/server/lib/write_forwarder.js +1 -0
- package/dist/server/lib/write_queue.js +1 -0
- package/increment_version.js +3 -0
- package/logs/.013e15b54597d05db4b4b53ecc37b10c92a72927-audit.json +20 -0
- package/logs/.02de550a67ea0f5961faa2dfd458a4d06f59ebd1-audit.json +20 -0
- package/logs/.03494ba24eb3c72214b4068a77d54b8993bee651-audit.json +20 -0
- package/logs/.06309ec60b339be1259a7993dd09c732f8907fbc-audit.json +20 -0
- package/logs/.0663a04dcfa17285661e5e1b8cfa51f41523b210-audit.json +20 -0
- package/logs/.0f06e6c4c9b824622729e13927587479e5060391-audit.json +20 -0
- package/logs/.16ccf58682ecb22b3e3ec63f0da1b7fe9be56528-audit.json +20 -0
- package/logs/.1fa1a5d02f496474b1ab473524c65c984146a9ad-audit.json +20 -0
- package/logs/.2223c0ae3bea6f0d62c62b1d319cc8634856abb7-audit.json +20 -0
- package/logs/.23dc79ffda3e083665e6f5993f59397adcbf4a46-audit.json +20 -0
- package/logs/.28104f49b03906b189eefd1cd462cb46c3c0af22-audit.json +20 -0
- package/logs/.29cdbf13808abe6a0ce70ee2f2efdd680ce3fd8e-audit.json +20 -0
- package/logs/.2a9889afd071f77f41f5170d08703a0afca866b7-audit.json +20 -0
- package/logs/.2acec3d1940a2bbed487528b703ee5948959a599-audit.json +20 -0
- package/logs/.2fb60ff326338c02bfedbcd0e936444e4a216750-audit.json +20 -0
- package/logs/.318fc7a19530d76a345f030f7cad00dda15300e7-audit.json +20 -0
- package/logs/.3cf27043e19085f908cedc7701e6d013463208ee-audit.json +25 -0
- package/logs/.3d90d785415817fc443402843b7c95f8371adc9b-audit.json +20 -0
- package/logs/.4074bca620375f72966fc52dfd439577727671e5-audit.json +20 -0
- package/logs/.40eecf018417ea80a70ea8ec7a3cc9406bc6334b-audit.json +20 -0
- package/logs/.50e974f1ef7c365fca6a1251b2e2c2252914cb5e-audit.json +20 -0
- package/logs/.52cb7d9e4223cf26ba36006ac26b949a97c7923c-audit.json +20 -0
- package/logs/.54befcdb84c15aad980705a31bcc9f555c3577ab-audit.json +20 -0
- package/logs/.57dfb70e22eddb84db2e3c0ceeefac5c0b9baffa-audit.json +20 -0
- package/logs/.5f0b24705a1eaad4eca4968f2d86f91b3f9be683-audit.json +20 -0
- package/logs/.61ba98fdda7db58576b382fee07904e5db1169d6-audit.json +20 -0
- package/logs/.6235017727ef6b199d569a99d6aa8c8e80a1b475-audit.json +20 -0
- package/logs/.63db16193699219489d218a1ddea5dde3750cae4-audit.json +20 -0
- package/logs/.64fb67dfe14149c9eef728d79bf30a54da809c60-audit.json +20 -0
- package/logs/.669137453368987c1f311b5345342527afb54e50-audit.json +20 -0
- package/logs/.7a71f8c89ea28ae266d356aeff6306e876a30fbb-audit.json +20 -0
- package/logs/.7afbaa90fe9dc3a7d682676f9bb79f9a1b1fd9a6-audit.json +20 -0
- package/logs/.7ca29e322cd05327035de850099e7610864f2347-audit.json +20 -0
- package/logs/.83335ab3347e449dae03455a110aaf7f120d4802-audit.json +20 -0
- package/logs/.8c2487b5fd445d2c8e5c483c80b9fa99bbf1ca58-audit.json +20 -0
- package/logs/.8c8b9dc386922c9f3b4c13251af7052aac1d24c0-audit.json +20 -0
- package/logs/.8d6155d94640c4863301ae0fee5e4e7372a21446-audit.json +20 -0
- package/logs/.944a3119a243deea7c8270d5d9e582bb1d0eaa10-audit.json +20 -0
- package/logs/.9816a845c30fb2909f3b26a23eeb3538ebcad5db-audit.json +20 -0
- package/logs/.9dc08784e38b865488177c26d4af5934555e0323-audit.json +20 -0
- package/logs/.9dd27d2e0e454ac0a37600206d1cac5493b0d7ee-audit.json +20 -0
- package/logs/.a3d486feeac7654c59b547de96600e8849a06d4f-audit.json +20 -0
- package/logs/.a5b811f4def22250f86cc18870d7c4573625df22-audit.json +20 -0
- package/logs/.a61648eb5f830e0b6f508ac35e4f8f629d2ad4c7-audit.json +20 -0
- package/logs/.a89016d507045771b4b5a65656944a9c0f1e528b-audit.json +20 -0
- package/logs/.a99bee160a1c590be959af46bacc02724803f691-audit.json +20 -0
- package/logs/.ada7906d6243fd7da802f03d86c4ae5dd9df6236-audit.json +20 -0
- package/logs/.b518339ee942143b6af983af167f5bbb6983b4de-audit.json +20 -0
- package/logs/.b51b124b166d53c9519017856ea610d61d65fabe-audit.json +20 -0
- package/logs/.b7a6aee19f58e55633d5e4a3709041c47dfff975-audit.json +20 -0
- package/logs/.bd7a8a6ba9c55d557a4867ab53f02e3ec2e1553d-audit.json +20 -0
- package/logs/.c1435dafe453b169d6392b25065f3cf4ab6fbb21-audit.json +20 -0
- package/logs/.c17e1ce043109f77dc2f0e2aa290a9d1ed842c03-audit.json +20 -0
- package/logs/.ca62637ce9540e5a38a2fbedb2115febb6ad308a-audit.json +15 -0
- package/logs/.ccee67b9c176967f8977071409a41f5cb5cd6ad4-audit.json +20 -0
- package/logs/.db24043417ea79a6f14cd947476399e53930b48d-audit.json +20 -0
- package/logs/.e0f12acccb57829f5f33712bb2e2607ecd808147-audit.json +20 -0
- package/logs/.e9b6cc33d0bbd2e644c4e2bf44d177f850016557-audit.json +20 -0
- package/logs/.f15291d434808e3bdca7963ccd2e73893be027e6-audit.json +20 -0
- package/logs/.f4bdf9e21ef84f8a3fae3ffb32bbc39275991351-audit.json +15 -0
- package/logs/.fbac3aefac1e81b4230df5aa50667cb90d51024f-audit.json +20 -0
- package/logs/.fcfd495c0a9169db243f4a4f21878ee02b76413c-audit.json +20 -0
- package/logs/admin-2025-09-12.log +580 -0
- package/logs/admin-2025-09-15.log +283 -0
- package/logs/admin-error-2025-09-12.log +22 -0
- package/logs/admin-error-2025-09-15.log +10 -0
- package/logs/api_key_manager-2025-09-12.log +658 -0
- package/logs/api_key_manager-2025-09-15.log +295 -0
- package/logs/api_key_manager-error-2025-09-12.log +0 -0
- package/logs/api_key_manager-error-2025-09-15.log +0 -0
- package/logs/auth_manager-2025-09-12.log +4432 -0
- package/logs/auth_manager-2025-09-15.log +2000 -0
- package/logs/auth_manager-error-2025-09-12.log +11 -0
- package/logs/auth_manager-error-2025-09-15.log +5 -0
- package/logs/auto_index_manager-2025-09-12.log +84 -0
- package/logs/auto_index_manager-2025-09-15.log +45 -0
- package/logs/auto_index_manager-error-2025-09-12.log +6 -0
- package/logs/auto_index_manager-error-2025-09-15.log +0 -0
- package/logs/backup_manager-2025-09-12.log +198 -0
- package/logs/backup_manager-2025-09-15.log +90 -0
- package/logs/backup_manager-error-2025-09-12.log +198 -0
- package/logs/backup_manager-error-2025-09-15.log +90 -0
- package/logs/bulk_write-2025-09-12.log +66 -0
- package/logs/bulk_write-2025-09-15.log +38 -0
- package/logs/bulk_write-error-2025-09-12.log +0 -0
- package/logs/bulk_write-error-2025-09-15.log +0 -0
- package/logs/connection_manager-2025-09-12.log +2412 -0
- package/logs/connection_manager-2025-09-15.log +1132 -0
- package/logs/connection_manager-error-2025-09-12.log +0 -0
- package/logs/connection_manager-error-2025-09-15.log +0 -0
- package/logs/create_index-2025-09-12.log +302 -0
- package/logs/create_index-2025-09-15.log +158 -0
- package/logs/create_index-error-2025-09-12.log +30 -0
- package/logs/create_index-error-2025-09-15.log +13 -0
- package/logs/delete_one-2025-09-12.log +73 -0
- package/logs/delete_one-2025-09-15.log +43 -0
- package/logs/delete_one-error-2025-09-12.log +0 -0
- package/logs/delete_one-error-2025-09-15.log +0 -0
- package/logs/disk_utils-2025-09-12.log +4954 -0
- package/logs/disk_utils-2025-09-15.log +2446 -0
- package/logs/disk_utils-error-2025-09-12.log +0 -0
- package/logs/disk_utils-error-2025-09-15.log +0 -0
- package/logs/drop_index-2025-09-12.log +41 -0
- package/logs/drop_index-2025-09-15.log +23 -0
- package/logs/drop_index-error-2025-09-12.log +11 -0
- package/logs/drop_index-error-2025-09-15.log +5 -0
- package/logs/find-2025-09-12.log +1050 -0
- package/logs/find-2025-09-15.log +592 -0
- package/logs/find-error-2025-09-12.log +1 -0
- package/logs/find-error-2025-09-15.log +0 -0
- package/logs/find_one-2025-09-12.log +425 -0
- package/logs/find_one-2025-09-15.log +264 -0
- package/logs/find_one-error-2025-09-12.log +5 -0
- package/logs/find_one-error-2025-09-15.log +0 -0
- package/logs/get_indexes-2025-09-12.log +84 -0
- package/logs/get_indexes-2025-09-15.log +56 -0
- package/logs/get_indexes-error-2025-09-12.log +6 -0
- package/logs/get_indexes-error-2025-09-15.log +0 -0
- package/logs/http_server-2025-09-12.log +2772 -0
- package/logs/http_server-2025-09-15.log +1276 -0
- package/logs/http_server-error-2025-09-12.log +212 -0
- package/logs/http_server-error-2025-09-15.log +44 -0
- package/logs/index_manager-2025-09-12.log +5031 -0
- package/logs/index_manager-2025-09-15.log +2909 -0
- package/logs/index_manager-error-2025-09-12.log +80 -0
- package/logs/index_manager-error-2025-09-15.log +38 -0
- package/logs/insert_one-2025-09-12.log +2181 -0
- package/logs/insert_one-2025-09-15.log +1293 -0
- package/logs/insert_one-error-2025-09-12.log +0 -0
- package/logs/insert_one-error-2025-09-15.log +0 -0
- package/logs/master-2025-09-12.log +1882 -0
- package/logs/master-2025-09-15.log +910 -0
- package/logs/master-error-2025-09-12.log +80 -0
- package/logs/master-error-2025-09-15.log +0 -0
- package/logs/operation_dispatcher-2025-09-12.log +751 -0
- package/logs/operation_dispatcher-2025-09-15.log +359 -0
- package/logs/operation_dispatcher-error-2025-09-12.log +33 -0
- package/logs/operation_dispatcher-error-2025-09-15.log +11 -0
- package/logs/performance_monitor-2025-09-12.log +14889 -0
- package/logs/performance_monitor-2025-09-15.log +6803 -0
- package/logs/performance_monitor-error-2025-09-12.log +0 -0
- package/logs/performance_monitor-error-2025-09-15.log +0 -0
- package/logs/query_engine-2025-09-12.log +5310 -0
- package/logs/query_engine-2025-09-15.log +2639 -0
- package/logs/query_engine-error-2025-09-12.log +0 -0
- package/logs/query_engine-error-2025-09-15.log +0 -0
- package/logs/recovery_manager-2025-09-12.log +462 -0
- package/logs/recovery_manager-2025-09-15.log +210 -0
- package/logs/recovery_manager-error-2025-09-12.log +22 -0
- package/logs/recovery_manager-error-2025-09-15.log +10 -0
- package/logs/replication-2025-09-12.log +1923 -0
- package/logs/replication-2025-09-15.log +917 -0
- package/logs/replication-error-2025-09-12.log +33 -0
- package/logs/replication-error-2025-09-15.log +15 -0
- package/logs/server-2025-09-12.log +2601 -0
- package/logs/server-2025-09-15.log +1191 -0
- package/logs/server-error-2025-09-12.log +0 -0
- package/logs/server-error-2025-09-15.log +0 -0
- package/logs/tcp_protocol-2025-09-12.log +22 -0
- package/logs/tcp_protocol-2025-09-15.log +10 -0
- package/logs/tcp_protocol-error-2025-09-12.log +22 -0
- package/logs/tcp_protocol-error-2025-09-15.log +10 -0
- package/logs/test-2025-09-12.log +0 -0
- package/logs/test-2025-09-15.log +0 -0
- package/logs/test-error-2025-09-12.log +0 -0
- package/logs/test-error-2025-09-15.log +0 -0
- package/logs/update_one-2025-09-12.log +173 -0
- package/logs/update_one-2025-09-15.log +118 -0
- package/logs/update_one-error-2025-09-12.log +0 -0
- package/logs/update_one-error-2025-09-15.log +0 -0
- package/logs/worker-2025-09-12.log +1457 -0
- package/logs/worker-2025-09-15.log +695 -0
- package/logs/worker-error-2025-09-12.log +0 -0
- package/logs/worker-error-2025-09-15.log +0 -0
- package/logs/write_forwarder-2025-09-12.log +1956 -0
- package/logs/write_forwarder-2025-09-15.log +932 -0
- package/logs/write_forwarder-error-2025-09-12.log +66 -0
- package/logs/write_forwarder-error-2025-09-15.log +30 -0
- package/logs/write_queue-2025-09-12.log +612 -0
- package/logs/write_queue-2025-09-15.log +301 -0
- package/logs/write_queue-error-2025-09-12.log +184 -0
- package/logs/write_queue-error-2025-09-15.log +83 -0
- package/package.json +48 -0
- package/prompts/01-core-infrastructure.md +56 -0
- package/prompts/02-secondary-indexing.md +65 -0
- package/prompts/03-write-serialization.md +63 -0
- package/prompts/04-enhanced-authentication.md +75 -0
- package/prompts/05-comprehensive-admin-operations.md +75 -0
- package/prompts/06-backup-and-restore-system.md +106 -0
- package/prompts/07-production-safety-features.md +107 -0
- package/prompts/08-tcp-client-library.md +121 -0
- package/prompts/09-api-method-chaining.md +134 -0
- package/prompts/10-automatic-index-creation.md +223 -0
- package/prompts/11-operation-naming-consistency.md +268 -0
- package/prompts/12-tcp-replication-system.md +333 -0
- package/prompts/13-master-read-write-operations.md +57 -0
- package/prompts/14-index-upsert-operations.md +68 -0
- package/prompts/15-client-api-return-types.md +81 -0
- package/prompts/16-server-setup-ui.md +97 -0
- package/prompts/17-emergency-password-change.md +108 -0
- package/prompts/18-joystick-framework-integration.md +116 -0
- package/prompts/19-api-key-authentication-system.md +137 -0
- package/prompts/20-configurable-server-port.md +105 -0
- package/prompts/21-multi-database-support.md +161 -0
- package/prompts/FULL_TEXT_SEARCH.md +293 -0
- package/prompts/PROMPTS.md +158 -0
- package/prompts/README.md +221 -0
- package/prompts/TYPESCRIPT_GENERATION.md +179 -0
- package/src/client/database.js +166 -0
- package/src/client/index.js +752 -0
- package/src/server/cluster/index.js +53 -0
- package/src/server/cluster/master.js +774 -0
- package/src/server/cluster/worker.js +537 -0
- package/src/server/index.js +540 -0
- package/src/server/lib/api_key_manager.js +473 -0
- package/src/server/lib/auth_manager.js +375 -0
- package/src/server/lib/auto_index_manager.js +681 -0
- package/src/server/lib/backup_manager.js +650 -0
- package/src/server/lib/connection_manager.js +218 -0
- package/src/server/lib/disk_utils.js +118 -0
- package/src/server/lib/http_server.js +1165 -0
- package/src/server/lib/index_manager.js +756 -0
- package/src/server/lib/load_settings.js +143 -0
- package/src/server/lib/logger.js +135 -0
- package/src/server/lib/op_types.js +29 -0
- package/src/server/lib/operation_dispatcher.js +268 -0
- package/src/server/lib/operations/admin.js +808 -0
- package/src/server/lib/operations/bulk_write.js +367 -0
- package/src/server/lib/operations/create_index.js +68 -0
- package/src/server/lib/operations/delete_one.js +114 -0
- package/src/server/lib/operations/drop_index.js +58 -0
- package/src/server/lib/operations/find.js +340 -0
- package/src/server/lib/operations/find_one.js +319 -0
- package/src/server/lib/operations/get_indexes.js +52 -0
- package/src/server/lib/operations/insert_one.js +113 -0
- package/src/server/lib/operations/update_one.js +225 -0
- package/src/server/lib/performance_monitor.js +313 -0
- package/src/server/lib/query_engine.js +243 -0
- package/src/server/lib/recovery_manager.js +388 -0
- package/src/server/lib/replication_manager.js +727 -0
- package/src/server/lib/safe_json_parse.js +21 -0
- package/src/server/lib/send_response.js +47 -0
- package/src/server/lib/tcp_protocol.js +130 -0
- package/src/server/lib/write_forwarder.js +636 -0
- package/src/server/lib/write_queue.js +335 -0
- package/test_data/data.mdb +0 -0
- package/test_data/lock.mdb +0 -0
- package/tests/client/index.test.js +1232 -0
- package/tests/server/cluster/cluster.test.js +248 -0
- package/tests/server/cluster/master_read_write_operations.test.js +577 -0
- package/tests/server/index.test.js +651 -0
- package/tests/server/integration/authentication_integration.test.js +294 -0
- package/tests/server/integration/auto_indexing_integration.test.js +268 -0
- package/tests/server/integration/backup_integration.test.js +513 -0
- package/tests/server/integration/indexing_integration.test.js +126 -0
- package/tests/server/integration/production_safety_integration.test.js +358 -0
- package/tests/server/integration/replication_integration.test.js +227 -0
- package/tests/server/integration/write_serialization_integration.test.js +246 -0
- package/tests/server/lib/api_key_manager.test.js +516 -0
- package/tests/server/lib/auth_manager.test.js +317 -0
- package/tests/server/lib/auto_index_manager.test.js +275 -0
- package/tests/server/lib/backup_manager.test.js +238 -0
- package/tests/server/lib/connection_manager.test.js +221 -0
- package/tests/server/lib/disk_utils.test.js +63 -0
- package/tests/server/lib/http_server.test.js +389 -0
- package/tests/server/lib/index_manager.test.js +301 -0
- package/tests/server/lib/load_settings.test.js +107 -0
- package/tests/server/lib/load_settings_port_config.test.js +243 -0
- package/tests/server/lib/logger.test.js +282 -0
- package/tests/server/lib/operations/admin.test.js +638 -0
- package/tests/server/lib/operations/bulk_write.test.js +128 -0
- package/tests/server/lib/operations/create_index.test.js +138 -0
- package/tests/server/lib/operations/delete_one.test.js +52 -0
- package/tests/server/lib/operations/drop_index.test.js +72 -0
- package/tests/server/lib/operations/find.test.js +93 -0
- package/tests/server/lib/operations/find_one.test.js +91 -0
- package/tests/server/lib/operations/get_indexes.test.js +87 -0
- package/tests/server/lib/operations/insert_one.test.js +42 -0
- package/tests/server/lib/operations/update_one.test.js +89 -0
- package/tests/server/lib/performance_monitor.test.js +185 -0
- package/tests/server/lib/query_engine.test.js +46 -0
- package/tests/server/lib/recovery_manager.test.js +414 -0
- package/tests/server/lib/replication_manager.test.js +202 -0
- package/tests/server/lib/safe_json_parse.test.js +45 -0
- package/tests/server/lib/send_response.test.js +155 -0
- package/tests/server/lib/tcp_protocol.test.js +169 -0
- package/tests/server/lib/write_forwarder.test.js +258 -0
- package/tests/server/lib/write_queue.test.js +255 -0
- package/tsconfig.json +30 -0
- package/types/client/index.d.ts +447 -0
- package/types/server/cluster/index.d.ts +28 -0
- package/types/server/cluster/master.d.ts +115 -0
- package/types/server/cluster/worker.d.ts +1 -0
- package/types/server/lib/auth_manager.d.ts +13 -0
- package/types/server/lib/backup_manager.d.ts +43 -0
- package/types/server/lib/connection_manager.d.ts +15 -0
- package/types/server/lib/disk_utils.d.ts +3 -0
- package/types/server/lib/index_manager.d.ts +24 -0
- package/types/server/lib/load_settings.d.ts +4 -0
- package/types/server/lib/logger.d.ts +44 -0
- package/types/server/lib/op_types.d.ts +6 -0
- package/types/server/lib/performance_monitor.d.ts +68 -0
- package/types/server/lib/query_engine.d.ts +10 -0
- package/types/server/lib/safe_json_parse.d.ts +7 -0
- package/types/server/lib/send_response.d.ts +3 -0
- package/types/server/lib/tcp_protocol.d.ts +12 -0
- package/types/server/lib/write_queue.d.ts +2 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Connection management system for JoystickDB TCP server.
|
|
3
|
+
* Handles client connection lifecycle, idle timeouts, request timeouts, and connection limits.
|
|
4
|
+
* Provides connection tracking, activity monitoring, and graceful shutdown capabilities.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import create_logger from './logger.js';
|
|
8
|
+
|
|
9
|
+
const { create_context_logger } = create_logger('connection_manager');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Creates a connection manager instance for handling TCP client connections.
|
|
13
|
+
* @param {Object} [options={}] - Configuration options for the connection manager
|
|
14
|
+
* @param {number} [options.max_connections=1000] - Maximum number of concurrent connections
|
|
15
|
+
* @param {number} [options.idle_timeout=600000] - Idle timeout in milliseconds (10 minutes)
|
|
16
|
+
* @param {number} [options.request_timeout=5000] - Request timeout in milliseconds (5 seconds)
|
|
17
|
+
* @returns {Object} Connection manager instance with management methods
|
|
18
|
+
* @returns {function} returns.add_connection - Adds a new connection
|
|
19
|
+
* @returns {function} returns.remove_connection - Removes a connection
|
|
20
|
+
* @returns {function} returns.update_activity - Updates connection activity
|
|
21
|
+
* @returns {function} returns.create_request_timeout - Creates request timeout
|
|
22
|
+
* @returns {function} returns.get_stats - Gets connection statistics
|
|
23
|
+
* @returns {function} returns.shutdown - Shuts down all connections
|
|
24
|
+
*/
|
|
25
|
+
const create_connection_manager = (options = {}) => {
|
|
26
|
+
const {
|
|
27
|
+
max_connections = 1000,
|
|
28
|
+
idle_timeout = 10 * 60 * 1000,
|
|
29
|
+
request_timeout = 5 * 1000
|
|
30
|
+
} = options;
|
|
31
|
+
|
|
32
|
+
/** @type {Map<string, Object>} Map of socket IDs to connection information */
|
|
33
|
+
const connections = new Map();
|
|
34
|
+
const log = create_context_logger();
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Adds a new connection to the manager with idle timeout handling.
|
|
38
|
+
* @param {Object} socket - TCP socket instance
|
|
39
|
+
* @param {string} socket.id - Unique socket identifier
|
|
40
|
+
* @returns {boolean} True if connection added successfully, false if limit reached
|
|
41
|
+
*/
|
|
42
|
+
const add_connection = (socket) => {
|
|
43
|
+
if (connections.size >= max_connections) {
|
|
44
|
+
log.warn('Connection limit reached', {
|
|
45
|
+
current_connections: connections.size,
|
|
46
|
+
max_connections,
|
|
47
|
+
rejected_socket_id: socket.id
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
socket.destroy();
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const connection_info = {
|
|
55
|
+
socket,
|
|
56
|
+
connected_at: Date.now(),
|
|
57
|
+
last_activity: Date.now(),
|
|
58
|
+
idle_timer: null,
|
|
59
|
+
request_count: 0
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
connection_info.idle_timer = setTimeout(() => {
|
|
63
|
+
log.info('Connection idle timeout', {
|
|
64
|
+
socket_id: socket.id,
|
|
65
|
+
idle_duration_ms: Date.now() - connection_info.last_activity
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
remove_connection(socket.id);
|
|
69
|
+
socket.destroy();
|
|
70
|
+
}, idle_timeout);
|
|
71
|
+
|
|
72
|
+
connections.set(socket.id, connection_info);
|
|
73
|
+
|
|
74
|
+
log.info('Connection added', {
|
|
75
|
+
socket_id: socket.id,
|
|
76
|
+
total_connections: connections.size,
|
|
77
|
+
max_connections
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
return true;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Removes a connection from the manager and cleans up timers.
|
|
85
|
+
* @param {string} socket_id - Unique socket identifier
|
|
86
|
+
*/
|
|
87
|
+
const remove_connection = (socket_id) => {
|
|
88
|
+
const connection_info = connections.get(socket_id);
|
|
89
|
+
|
|
90
|
+
if (connection_info) {
|
|
91
|
+
if (connection_info.idle_timer) {
|
|
92
|
+
clearTimeout(connection_info.idle_timer);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
connections.delete(socket_id);
|
|
96
|
+
|
|
97
|
+
log.info('Connection removed', {
|
|
98
|
+
socket_id,
|
|
99
|
+
total_connections: connections.size,
|
|
100
|
+
connection_duration_ms: Date.now() - connection_info.connected_at,
|
|
101
|
+
request_count: connection_info.request_count
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Updates connection activity timestamp and resets idle timer.
|
|
108
|
+
* @param {string} socket_id - Unique socket identifier
|
|
109
|
+
*/
|
|
110
|
+
const update_activity = (socket_id) => {
|
|
111
|
+
const connection_info = connections.get(socket_id);
|
|
112
|
+
|
|
113
|
+
if (connection_info) {
|
|
114
|
+
connection_info.last_activity = Date.now();
|
|
115
|
+
connection_info.request_count++;
|
|
116
|
+
|
|
117
|
+
if (connection_info.idle_timer) {
|
|
118
|
+
clearTimeout(connection_info.idle_timer);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
connection_info.idle_timer = setTimeout(() => {
|
|
122
|
+
log.info('Connection idle timeout', {
|
|
123
|
+
socket_id,
|
|
124
|
+
idle_duration_ms: Date.now() - connection_info.last_activity
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
remove_connection(socket_id);
|
|
128
|
+
connection_info.socket.destroy();
|
|
129
|
+
}, idle_timeout);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Creates a request timeout that will close the connection if exceeded.
|
|
135
|
+
* @param {string} socket_id - Unique socket identifier
|
|
136
|
+
* @param {string} operation - Name of the operation being timed
|
|
137
|
+
* @returns {NodeJS.Timeout} Timeout handle that can be cleared
|
|
138
|
+
*/
|
|
139
|
+
const create_request_timeout = (socket_id, operation) => {
|
|
140
|
+
return setTimeout(() => {
|
|
141
|
+
const connection_info = connections.get(socket_id);
|
|
142
|
+
|
|
143
|
+
if (connection_info) {
|
|
144
|
+
log.warn('Request timeout', {
|
|
145
|
+
socket_id,
|
|
146
|
+
operation,
|
|
147
|
+
timeout_ms: request_timeout
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
remove_connection(socket_id);
|
|
151
|
+
connection_info.socket.destroy();
|
|
152
|
+
}
|
|
153
|
+
}, request_timeout);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Gets current connection statistics and metrics.
|
|
158
|
+
* @returns {Object} Statistics object
|
|
159
|
+
* @returns {number} returns.total_connections - Current number of active connections
|
|
160
|
+
* @returns {number} returns.max_connections - Maximum allowed connections
|
|
161
|
+
* @returns {number} returns.total_requests - Total requests processed across all connections
|
|
162
|
+
* @returns {number} returns.oldest_connection_age_ms - Age of oldest connection in milliseconds
|
|
163
|
+
* @returns {number} returns.idle_timeout_ms - Idle timeout setting in milliseconds
|
|
164
|
+
* @returns {number} returns.request_timeout_ms - Request timeout setting in milliseconds
|
|
165
|
+
*/
|
|
166
|
+
const get_stats = () => {
|
|
167
|
+
const now = Date.now();
|
|
168
|
+
let total_requests = 0;
|
|
169
|
+
let oldest_connection = now;
|
|
170
|
+
|
|
171
|
+
for (const connection_info of connections.values()) {
|
|
172
|
+
total_requests += connection_info.request_count;
|
|
173
|
+
oldest_connection = Math.min(oldest_connection, connection_info.connected_at);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
total_connections: connections.size,
|
|
178
|
+
max_connections,
|
|
179
|
+
total_requests,
|
|
180
|
+
oldest_connection_age_ms: connections.size > 0 ? now - oldest_connection : 0,
|
|
181
|
+
idle_timeout_ms: idle_timeout,
|
|
182
|
+
request_timeout_ms: request_timeout
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Shuts down the connection manager by closing all active connections.
|
|
188
|
+
* Clears all timers and destroys all sockets gracefully.
|
|
189
|
+
*/
|
|
190
|
+
const shutdown = () => {
|
|
191
|
+
log.info('Shutting down connection manager', {
|
|
192
|
+
active_connections: connections.size
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
for (const [socket_id, connection_info] of connections) {
|
|
196
|
+
if (connection_info.idle_timer) {
|
|
197
|
+
clearTimeout(connection_info.idle_timer);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
connection_info.socket.destroy();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
connections.clear();
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
add_connection,
|
|
208
|
+
remove_connection,
|
|
209
|
+
update_activity,
|
|
210
|
+
create_request_timeout,
|
|
211
|
+
get_stats,
|
|
212
|
+
shutdown
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
export {
|
|
217
|
+
create_connection_manager
|
|
218
|
+
};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Disk space utilities for JoystickDB LMDB map size management.
|
|
3
|
+
* Provides functions to detect available disk space, calculate optimal LMDB map sizes,
|
|
4
|
+
* and determine when map size growth is needed based on usage patterns and disk capacity.
|
|
5
|
+
* Ensures efficient memory-mapped file allocation while preventing disk space exhaustion.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { exec } from 'child_process';
|
|
9
|
+
import { promisify } from 'util';
|
|
10
|
+
import create_logger from './logger.js';
|
|
11
|
+
|
|
12
|
+
/** @type {Function} Promisified version of child_process.exec for async/await usage */
|
|
13
|
+
const exec_async = promisify(exec);
|
|
14
|
+
|
|
15
|
+
const { create_context_logger } = create_logger('disk_utils');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Gets the total disk size for the specified path using the df command.
|
|
19
|
+
* Executes system df command to retrieve disk space information and parses the output
|
|
20
|
+
* to extract total available space in bytes.
|
|
21
|
+
* @param {string} [path='.'] - Path to check disk size for
|
|
22
|
+
* @returns {Promise<number>} Total disk size in bytes
|
|
23
|
+
* @throws {Error} When df command fails or output cannot be parsed
|
|
24
|
+
*/
|
|
25
|
+
const get_disk_size = async (path = '.') => {
|
|
26
|
+
const log = create_context_logger();
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
const { stdout } = await exec_async(`df -k ${path}`);
|
|
30
|
+
const lines = stdout.trim().split('\n');
|
|
31
|
+
|
|
32
|
+
if (lines.length < 2) {
|
|
33
|
+
throw new Error('Unable to parse df output');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const data_line = lines[1];
|
|
37
|
+
const columns = data_line.split(/\s+/);
|
|
38
|
+
|
|
39
|
+
if (columns.length < 4) {
|
|
40
|
+
throw new Error('Invalid df output format');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const total_kb = parseInt(columns[1]);
|
|
44
|
+
const total_bytes = total_kb * 1024;
|
|
45
|
+
|
|
46
|
+
log.info('Disk size detected', {
|
|
47
|
+
path,
|
|
48
|
+
total_kb,
|
|
49
|
+
total_bytes,
|
|
50
|
+
total_gb: Math.round(total_bytes / (1024 * 1024 * 1024) * 100) / 100
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
return total_bytes;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
log.error('Failed to get disk size', { path, error: error.message });
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Calculates optimal LMDB map size based on available disk space.
|
|
62
|
+
* Uses 80% of available disk space as the maximum map size to prevent disk exhaustion
|
|
63
|
+
* while allowing for adequate database growth. Falls back to 10GB default on failure.
|
|
64
|
+
* @param {string} [database_path='./data'] - Path to the database directory
|
|
65
|
+
* @returns {Promise<number>} Calculated map size in bytes (80% of disk space or 10GB default)
|
|
66
|
+
*/
|
|
67
|
+
const calculate_map_size = async (database_path = './data') => {
|
|
68
|
+
const log = create_context_logger();
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const disk_size = await get_disk_size(database_path);
|
|
72
|
+
const map_size = Math.floor(disk_size * 0.8);
|
|
73
|
+
|
|
74
|
+
log.info('Map size calculated', {
|
|
75
|
+
database_path,
|
|
76
|
+
disk_size,
|
|
77
|
+
map_size,
|
|
78
|
+
percentage: 80
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return map_size;
|
|
82
|
+
} catch (error) {
|
|
83
|
+
log.warn('Failed to calculate map_size, using default', {
|
|
84
|
+
database_path,
|
|
85
|
+
error: error.message,
|
|
86
|
+
default_size: 1024 * 1024 * 1024 * 10
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
return 1024 * 1024 * 1024 * 10;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Determines if LMDB map size should be grown based on current usage.
|
|
95
|
+
* Evaluates if current usage exceeds 80% threshold and calculates new size
|
|
96
|
+
* by doubling current size, capped at 80% of available disk space.
|
|
97
|
+
* @param {number} current_size - Current LMDB map size in bytes
|
|
98
|
+
* @param {number} used_size - Currently used space in bytes
|
|
99
|
+
* @param {number} disk_size - Total available disk space in bytes
|
|
100
|
+
* @returns {number|null} New map size in bytes if growth needed, null otherwise
|
|
101
|
+
*/
|
|
102
|
+
const should_grow_map_size = (current_size, used_size, disk_size) => {
|
|
103
|
+
const usage_percentage = used_size / current_size;
|
|
104
|
+
const growth_threshold = 0.8;
|
|
105
|
+
|
|
106
|
+
if (usage_percentage >= growth_threshold) {
|
|
107
|
+
const new_size = Math.min(current_size * 2, Math.floor(disk_size * 0.8));
|
|
108
|
+
return new_size > current_size ? new_size : null;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return null;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export {
|
|
115
|
+
get_disk_size,
|
|
116
|
+
calculate_map_size,
|
|
117
|
+
should_grow_map_size
|
|
118
|
+
};
|