@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,358 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import net from 'net';
|
|
3
|
+
import { create_server } from '../../../src/server/index.js';
|
|
4
|
+
import { encode_message, create_message_parser } from '../../../src/server/lib/tcp_protocol.js';
|
|
5
|
+
import { initialize_database } from '../../../src/server/lib/query_engine.js';
|
|
6
|
+
import { setup_authentication } from '../../../src/server/lib/auth_manager.js';
|
|
7
|
+
|
|
8
|
+
let server;
|
|
9
|
+
let port;
|
|
10
|
+
let shared_password;
|
|
11
|
+
|
|
12
|
+
test.before(async () => {
|
|
13
|
+
try {
|
|
14
|
+
// Clean up authentication file for fresh tests
|
|
15
|
+
try {
|
|
16
|
+
const { unlinkSync } = await import('fs');
|
|
17
|
+
unlinkSync('authentication.json');
|
|
18
|
+
} catch (error) {
|
|
19
|
+
// File doesn't exist, which is fine
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Initialize database for testing
|
|
23
|
+
initialize_database();
|
|
24
|
+
|
|
25
|
+
// Create server
|
|
26
|
+
server = await create_server();
|
|
27
|
+
|
|
28
|
+
// Start server on random port
|
|
29
|
+
await new Promise((resolve, reject) => {
|
|
30
|
+
server.listen(0, (error) => {
|
|
31
|
+
if (error) {
|
|
32
|
+
reject(error);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
port = server.address().port;
|
|
37
|
+
resolve();
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Set up authentication once for all tests
|
|
42
|
+
const { client, send, receive, close } = await create_client();
|
|
43
|
+
try {
|
|
44
|
+
send({ op: 'setup' });
|
|
45
|
+
const setup_response = await receive();
|
|
46
|
+
if (setup_response.ok === 1 || setup_response.ok === true) {
|
|
47
|
+
shared_password = setup_response.password;
|
|
48
|
+
}
|
|
49
|
+
} finally {
|
|
50
|
+
close();
|
|
51
|
+
}
|
|
52
|
+
} catch (error) {
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test.after.always(async () => {
|
|
58
|
+
if (server) {
|
|
59
|
+
await server.cleanup();
|
|
60
|
+
server.close();
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const create_client = () => {
|
|
65
|
+
return new Promise((resolve, reject) => {
|
|
66
|
+
const client = net.createConnection(port, 'localhost');
|
|
67
|
+
const parser = create_message_parser();
|
|
68
|
+
let responses = [];
|
|
69
|
+
|
|
70
|
+
client.on('connect', () => {
|
|
71
|
+
resolve({
|
|
72
|
+
client,
|
|
73
|
+
send: (data) => {
|
|
74
|
+
const encoded = encode_message(data);
|
|
75
|
+
client.write(encoded);
|
|
76
|
+
},
|
|
77
|
+
receive: () => {
|
|
78
|
+
return new Promise((resolve) => {
|
|
79
|
+
const handler = (data) => {
|
|
80
|
+
try {
|
|
81
|
+
const messages = parser.parse_messages(data);
|
|
82
|
+
for (const message of messages) {
|
|
83
|
+
// Message is already decoded from MessagePack, no need to JSON.parse
|
|
84
|
+
responses.push(message);
|
|
85
|
+
client.off('data', handler);
|
|
86
|
+
resolve(message);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
} catch (error) {
|
|
90
|
+
// Continue listening
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
client.on('data', handler);
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
close: () => {
|
|
97
|
+
client.end();
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
client.on('error', reject);
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
test('production safety - ping operation returns ok: 1', async t => {
|
|
107
|
+
const { client, send, receive, close } = await create_client();
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
send({ op: 'ping' });
|
|
111
|
+
const response = await receive();
|
|
112
|
+
|
|
113
|
+
t.is(response.ok, 1);
|
|
114
|
+
} finally {
|
|
115
|
+
close();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('production safety - admin stats include comprehensive monitoring', async t => {
|
|
120
|
+
const { client, send, receive, close } = await create_client();
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
// Authenticate using shared password
|
|
124
|
+
send({ op: 'authentication', data: { password: shared_password } });
|
|
125
|
+
const auth_response = await receive();
|
|
126
|
+
t.is(auth_response.ok, 1);
|
|
127
|
+
|
|
128
|
+
// Get admin stats
|
|
129
|
+
send({ op: 'admin', data: { admin_action: 'stats' } });
|
|
130
|
+
const stats_response = await receive();
|
|
131
|
+
|
|
132
|
+
t.is(stats_response.ok, 1);
|
|
133
|
+
|
|
134
|
+
// Check comprehensive stats structure
|
|
135
|
+
t.truthy(stats_response.server);
|
|
136
|
+
t.truthy(stats_response.memory);
|
|
137
|
+
t.truthy(stats_response.database);
|
|
138
|
+
t.truthy(stats_response.performance);
|
|
139
|
+
t.truthy(stats_response.system);
|
|
140
|
+
t.truthy(stats_response.connections);
|
|
141
|
+
t.truthy(stats_response.authentication);
|
|
142
|
+
|
|
143
|
+
// Check server stats
|
|
144
|
+
t.true(typeof stats_response.server.uptime === 'number');
|
|
145
|
+
t.true(typeof stats_response.server.uptime_formatted === 'string');
|
|
146
|
+
t.true(typeof stats_response.server.node_version === 'string');
|
|
147
|
+
t.true(typeof stats_response.server.platform === 'string');
|
|
148
|
+
t.true(typeof stats_response.server.arch === 'string');
|
|
149
|
+
t.true(typeof stats_response.server.pid === 'number');
|
|
150
|
+
|
|
151
|
+
// Check memory stats
|
|
152
|
+
t.true(typeof stats_response.memory.rss_mb === 'number');
|
|
153
|
+
t.true(typeof stats_response.memory.heap_total_mb === 'number');
|
|
154
|
+
t.true(typeof stats_response.memory.heap_used_mb === 'number');
|
|
155
|
+
t.true(typeof stats_response.memory.heap_used_percent === 'number');
|
|
156
|
+
t.true(typeof stats_response.memory.external_mb === 'number');
|
|
157
|
+
|
|
158
|
+
// Check database stats
|
|
159
|
+
t.true(typeof stats_response.database.map_size_mb === 'number');
|
|
160
|
+
t.true(typeof stats_response.database.used_space_mb === 'number');
|
|
161
|
+
t.true(typeof stats_response.database.usage_percent === 'number');
|
|
162
|
+
|
|
163
|
+
// Check performance stats
|
|
164
|
+
t.true(typeof stats_response.performance.ops_per_second === 'number');
|
|
165
|
+
t.true(typeof stats_response.performance.avg_response_time_ms === 'number');
|
|
166
|
+
|
|
167
|
+
// Check system stats
|
|
168
|
+
t.true(typeof stats_response.system.node_version === 'string');
|
|
169
|
+
t.true(typeof stats_response.system.platform === 'string');
|
|
170
|
+
t.true(typeof stats_response.system.arch === 'string');
|
|
171
|
+
t.true(typeof stats_response.system.pid === 'number');
|
|
172
|
+
|
|
173
|
+
// Check connection stats
|
|
174
|
+
t.true(typeof stats_response.connections.total_connections === 'number');
|
|
175
|
+
t.true(typeof stats_response.connections.max_connections === 'number');
|
|
176
|
+
|
|
177
|
+
// Check authentication stats
|
|
178
|
+
t.true(typeof stats_response.authentication.authenticated_clients === 'number');
|
|
179
|
+
} finally {
|
|
180
|
+
close();
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test('production safety - request timeout handling', async t => {
|
|
185
|
+
const { client, send, receive, close } = await create_client();
|
|
186
|
+
|
|
187
|
+
try {
|
|
188
|
+
// Authenticate using shared password
|
|
189
|
+
send({ op: 'authentication', data: { password: shared_password } });
|
|
190
|
+
const auth_response = await receive();
|
|
191
|
+
t.is(auth_response.ok, 1);
|
|
192
|
+
|
|
193
|
+
// Send a normal operation that should complete quickly
|
|
194
|
+
send({ op: 'insert_one', data: { collection: 'test_timeout', document: { name: 'test' } } });
|
|
195
|
+
const response = await receive();
|
|
196
|
+
|
|
197
|
+
t.is(response.ok, 1);
|
|
198
|
+
t.truthy(response.inserted_id);
|
|
199
|
+
} finally {
|
|
200
|
+
close();
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test('production safety - connection limits', async t => {
|
|
205
|
+
// This test verifies that connection management is working
|
|
206
|
+
// We can't easily test the actual limit without creating 1000+ connections
|
|
207
|
+
const { client, send, receive, close } = await create_client();
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
send({ op: 'ping' });
|
|
211
|
+
const response = await receive();
|
|
212
|
+
|
|
213
|
+
t.is(response.ok, 1);
|
|
214
|
+
|
|
215
|
+
// Connection should be tracked
|
|
216
|
+
// We can verify this by checking that the connection was accepted
|
|
217
|
+
t.pass();
|
|
218
|
+
} finally {
|
|
219
|
+
close();
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
test('production safety - structured logging for operations', async t => {
|
|
224
|
+
const { client, send, receive, close } = await create_client();
|
|
225
|
+
|
|
226
|
+
try {
|
|
227
|
+
// Authenticate using shared password
|
|
228
|
+
send({ op: 'authentication', data: { password: shared_password } });
|
|
229
|
+
const auth_response = await receive();
|
|
230
|
+
t.is(auth_response.ok, 1);
|
|
231
|
+
|
|
232
|
+
// Perform database operation that should be logged
|
|
233
|
+
send({ op: 'insert_one', data: { collection: 'test_logging', document: { name: 'test_log' } } });
|
|
234
|
+
const response = await receive();
|
|
235
|
+
|
|
236
|
+
t.is(response.ok, 1);
|
|
237
|
+
t.truthy(response.inserted_id);
|
|
238
|
+
|
|
239
|
+
// The operation should have been logged with structured format
|
|
240
|
+
// We can't easily verify the log output in tests, but we can verify the operation succeeded
|
|
241
|
+
t.pass();
|
|
242
|
+
} finally {
|
|
243
|
+
close();
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
test('production safety - error handling and categorization', async t => {
|
|
248
|
+
const { client, send, receive, close } = await create_client();
|
|
249
|
+
|
|
250
|
+
try {
|
|
251
|
+
// Authenticate using shared password
|
|
252
|
+
send({ op: 'authentication', data: { password: shared_password } });
|
|
253
|
+
const auth_response = await receive();
|
|
254
|
+
t.is(auth_response.ok, 1);
|
|
255
|
+
|
|
256
|
+
// Try an operation that should fail
|
|
257
|
+
send({ op: 'insert_one', data: { collection: '', document: { name: 'test' } } });
|
|
258
|
+
const response = await receive();
|
|
259
|
+
|
|
260
|
+
t.is(response.ok, 0);
|
|
261
|
+
t.truthy(response.error);
|
|
262
|
+
t.true(response.error.includes('Collection name is required'));
|
|
263
|
+
} finally {
|
|
264
|
+
close();
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
test('production safety - performance metrics tracking', async t => {
|
|
269
|
+
const { client, send, receive, close } = await create_client();
|
|
270
|
+
|
|
271
|
+
try {
|
|
272
|
+
// Authenticate using shared password
|
|
273
|
+
send({ op: 'authentication', data: { password: shared_password } });
|
|
274
|
+
const auth_response = await receive();
|
|
275
|
+
t.is(auth_response.ok, 1);
|
|
276
|
+
|
|
277
|
+
// Perform several operations to generate metrics
|
|
278
|
+
for (let i = 0; i < 5; i++) {
|
|
279
|
+
send({ op: 'insert_one', data: { collection: 'test_metrics', document: { index: i } } });
|
|
280
|
+
await receive();
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Get stats to verify metrics are being tracked
|
|
284
|
+
send({ op: 'admin', data: { admin_action: 'stats' } });
|
|
285
|
+
const stats_response = await receive();
|
|
286
|
+
|
|
287
|
+
t.is(stats_response.ok, 1);
|
|
288
|
+
t.true(typeof stats_response.performance.ops_per_second === 'number');
|
|
289
|
+
t.true(typeof stats_response.performance.avg_response_time_ms === 'number');
|
|
290
|
+
} finally {
|
|
291
|
+
close();
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
test('production safety - memory and resource monitoring', async t => {
|
|
296
|
+
const { client, send, receive, close } = await create_client();
|
|
297
|
+
|
|
298
|
+
try {
|
|
299
|
+
// Authenticate using shared password
|
|
300
|
+
send({ op: 'authentication', data: { password: shared_password } });
|
|
301
|
+
const auth_response = await receive();
|
|
302
|
+
t.is(auth_response.ok, 1);
|
|
303
|
+
|
|
304
|
+
// Get stats to verify resource monitoring
|
|
305
|
+
send({ op: 'admin', data: { admin_action: 'stats' } });
|
|
306
|
+
const stats_response = await receive();
|
|
307
|
+
|
|
308
|
+
t.is(stats_response.ok, 1);
|
|
309
|
+
|
|
310
|
+
// Verify memory monitoring
|
|
311
|
+
t.true(stats_response.memory.rss_mb > 0);
|
|
312
|
+
t.true(stats_response.memory.heap_total_mb > 0);
|
|
313
|
+
t.true(stats_response.memory.heap_used_mb > 0);
|
|
314
|
+
t.true(stats_response.memory.heap_used_percent >= 0 && stats_response.memory.heap_used_percent <= 100);
|
|
315
|
+
|
|
316
|
+
// Verify database resource monitoring
|
|
317
|
+
t.true(stats_response.database.map_size_mb >= 0);
|
|
318
|
+
t.true(stats_response.database.used_space_mb >= 0);
|
|
319
|
+
t.true(stats_response.database.usage_percent >= 0 && stats_response.database.usage_percent <= 100);
|
|
320
|
+
|
|
321
|
+
// Verify system resource monitoring
|
|
322
|
+
t.true(stats_response.system.cpu_user_ms >= 0);
|
|
323
|
+
t.true(stats_response.system.cpu_system_ms >= 0);
|
|
324
|
+
} finally {
|
|
325
|
+
close();
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
test('production safety - connection management stats', async t => {
|
|
330
|
+
const { client, send, receive, close } = await create_client();
|
|
331
|
+
|
|
332
|
+
try {
|
|
333
|
+
// Authenticate using shared password
|
|
334
|
+
send({ op: 'authentication', data: { password: shared_password } });
|
|
335
|
+
const auth_response = await receive();
|
|
336
|
+
t.is(auth_response.ok, 1);
|
|
337
|
+
|
|
338
|
+
// Get stats to verify connection management
|
|
339
|
+
send({ op: 'admin', data: { admin_action: 'stats' } });
|
|
340
|
+
const stats_response = await receive();
|
|
341
|
+
|
|
342
|
+
t.is(stats_response.ok, 1);
|
|
343
|
+
|
|
344
|
+
// Verify connection stats
|
|
345
|
+
t.true(typeof stats_response.connections.total_connections === 'number');
|
|
346
|
+
t.true(typeof stats_response.connections.max_connections === 'number');
|
|
347
|
+
t.true(typeof stats_response.connections.total_requests === 'number');
|
|
348
|
+
t.true(typeof stats_response.connections.idle_timeout_ms === 'number');
|
|
349
|
+
t.true(typeof stats_response.connections.request_timeout_ms === 'number');
|
|
350
|
+
|
|
351
|
+
t.true(stats_response.connections.total_connections >= 1); // At least our connection
|
|
352
|
+
t.is(stats_response.connections.max_connections, 1000); // Default max
|
|
353
|
+
t.is(stats_response.connections.idle_timeout_ms, 10 * 60 * 1000); // 10 minutes
|
|
354
|
+
t.is(stats_response.connections.request_timeout_ms, 5 * 1000); // 5 seconds
|
|
355
|
+
} finally {
|
|
356
|
+
close();
|
|
357
|
+
}
|
|
358
|
+
});
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import net from 'net';
|
|
4
|
+
import { create_server } from '../../../src/server/index.js';
|
|
5
|
+
import { setup_authentication, reset_auth_state } from '../../../src/server/lib/auth_manager.js';
|
|
6
|
+
import { initialize_database } from '../../../src/server/lib/query_engine.js';
|
|
7
|
+
import { encode_message, create_message_parser } from '../../../src/server/lib/tcp_protocol.js';
|
|
8
|
+
|
|
9
|
+
const AUTH_FILE_PATH = './settings.db.json';
|
|
10
|
+
|
|
11
|
+
// Shared server instance
|
|
12
|
+
let shared_server = null;
|
|
13
|
+
let shared_port = null;
|
|
14
|
+
let shared_password = null;
|
|
15
|
+
|
|
16
|
+
test.before(async () => {
|
|
17
|
+
// Set test environment
|
|
18
|
+
process.env.NODE_ENV = 'test';
|
|
19
|
+
|
|
20
|
+
// Reset auth state and clean up any existing auth files
|
|
21
|
+
reset_auth_state();
|
|
22
|
+
if (fs.existsSync(AUTH_FILE_PATH)) {
|
|
23
|
+
fs.unlinkSync(AUTH_FILE_PATH);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Initialize database for testing
|
|
27
|
+
initialize_database();
|
|
28
|
+
|
|
29
|
+
// Create shared server instance
|
|
30
|
+
shared_server = await create_server();
|
|
31
|
+
|
|
32
|
+
// Start server on random port
|
|
33
|
+
await new Promise((resolve, reject) => {
|
|
34
|
+
const timeout = setTimeout(() => {
|
|
35
|
+
reject(new Error('Server start timeout'));
|
|
36
|
+
}, 5000);
|
|
37
|
+
|
|
38
|
+
shared_server.listen(0, (error) => {
|
|
39
|
+
clearTimeout(timeout);
|
|
40
|
+
if (error) {
|
|
41
|
+
reject(error);
|
|
42
|
+
} else {
|
|
43
|
+
shared_port = shared_server.address().port;
|
|
44
|
+
resolve();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test.after.always(async () => {
|
|
51
|
+
// Clean up shared server
|
|
52
|
+
if (shared_server) {
|
|
53
|
+
try {
|
|
54
|
+
if (shared_server.cleanup) {
|
|
55
|
+
await shared_server.cleanup();
|
|
56
|
+
}
|
|
57
|
+
} catch (error) {
|
|
58
|
+
// Ignore cleanup errors
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
await new Promise((resolve) => {
|
|
62
|
+
const timeout = setTimeout(() => {
|
|
63
|
+
try {
|
|
64
|
+
shared_server.close();
|
|
65
|
+
} catch (error) {
|
|
66
|
+
// Ignore errors
|
|
67
|
+
}
|
|
68
|
+
resolve();
|
|
69
|
+
}, 2000);
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
shared_server.close(() => {
|
|
73
|
+
clearTimeout(timeout);
|
|
74
|
+
resolve();
|
|
75
|
+
});
|
|
76
|
+
} catch (error) {
|
|
77
|
+
clearTimeout(timeout);
|
|
78
|
+
resolve();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
shared_server = null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Reset auth state and clean up auth files
|
|
86
|
+
reset_auth_state();
|
|
87
|
+
if (fs.existsSync(AUTH_FILE_PATH)) {
|
|
88
|
+
try {
|
|
89
|
+
fs.unlinkSync(AUTH_FILE_PATH);
|
|
90
|
+
} catch (error) {
|
|
91
|
+
// Ignore cleanup errors
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Force garbage collection if available
|
|
96
|
+
if (global.gc) {
|
|
97
|
+
global.gc();
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test.beforeEach(() => {
|
|
102
|
+
// Reset auth state before each test
|
|
103
|
+
reset_auth_state();
|
|
104
|
+
if (fs.existsSync(AUTH_FILE_PATH)) {
|
|
105
|
+
fs.unlinkSync(AUTH_FILE_PATH);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
const create_client = () => {
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
const client = net.createConnection(shared_port, 'localhost');
|
|
112
|
+
const parser = create_message_parser();
|
|
113
|
+
|
|
114
|
+
client.on('connect', () => {
|
|
115
|
+
resolve({
|
|
116
|
+
client,
|
|
117
|
+
send: (data) => {
|
|
118
|
+
const encoded = encode_message(data);
|
|
119
|
+
client.write(encoded);
|
|
120
|
+
},
|
|
121
|
+
receive: () => {
|
|
122
|
+
return new Promise((resolve) => {
|
|
123
|
+
const handler = (data) => {
|
|
124
|
+
try {
|
|
125
|
+
const messages = parser.parse_messages(data);
|
|
126
|
+
for (const message of messages) {
|
|
127
|
+
client.off('data', handler);
|
|
128
|
+
resolve(message);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
} catch (error) {
|
|
132
|
+
// Continue listening
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
client.on('data', handler);
|
|
136
|
+
});
|
|
137
|
+
},
|
|
138
|
+
close: () => {
|
|
139
|
+
client.end();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
client.on('error', reject);
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
test('replication admin operations - get status when disabled', async t => {
|
|
149
|
+
// Setup authentication first
|
|
150
|
+
const password = setup_authentication();
|
|
151
|
+
|
|
152
|
+
const { client, send, receive, close } = await create_client();
|
|
153
|
+
|
|
154
|
+
try {
|
|
155
|
+
// First authenticate
|
|
156
|
+
send({ op: 'authentication', data: { password } });
|
|
157
|
+
const auth_response = await receive();
|
|
158
|
+
t.is(auth_response.ok, 1);
|
|
159
|
+
|
|
160
|
+
// Get admin status
|
|
161
|
+
send({ op: 'admin' });
|
|
162
|
+
const admin_response = await receive();
|
|
163
|
+
|
|
164
|
+
// Admin response should include server info
|
|
165
|
+
t.is(typeof admin_response.server, 'object');
|
|
166
|
+
t.is(typeof admin_response.database, 'object');
|
|
167
|
+
t.is(typeof admin_response.authentication, 'object');
|
|
168
|
+
} finally {
|
|
169
|
+
close();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test('replication integration - basic server functionality works', async t => {
|
|
174
|
+
// Setup authentication first
|
|
175
|
+
const password = setup_authentication();
|
|
176
|
+
|
|
177
|
+
const { client, send, receive, close } = await create_client();
|
|
178
|
+
|
|
179
|
+
try {
|
|
180
|
+
// First authenticate
|
|
181
|
+
send({ op: 'authentication', data: { password } });
|
|
182
|
+
const auth_response = await receive();
|
|
183
|
+
t.is(auth_response.ok, 1);
|
|
184
|
+
|
|
185
|
+
// Test basic ping operation
|
|
186
|
+
send({ op: 'ping' });
|
|
187
|
+
const ping_response = await receive();
|
|
188
|
+
t.is(ping_response.ok, 1);
|
|
189
|
+
|
|
190
|
+
// Test admin operation works
|
|
191
|
+
send({ op: 'admin' });
|
|
192
|
+
const admin_response = await receive();
|
|
193
|
+
|
|
194
|
+
// Admin response should include basic server info
|
|
195
|
+
t.is(typeof admin_response.server, 'object');
|
|
196
|
+
t.is(typeof admin_response.database, 'object');
|
|
197
|
+
} finally {
|
|
198
|
+
close();
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test('replication integration - database operations work normally', async t => {
|
|
203
|
+
// Setup authentication first
|
|
204
|
+
const password = setup_authentication();
|
|
205
|
+
|
|
206
|
+
const { client, send, receive, close } = await create_client();
|
|
207
|
+
|
|
208
|
+
try {
|
|
209
|
+
// First authenticate
|
|
210
|
+
send({ op: 'authentication', data: { password } });
|
|
211
|
+
const auth_response = await receive();
|
|
212
|
+
t.is(auth_response.ok, 1);
|
|
213
|
+
|
|
214
|
+
// Test insert operation
|
|
215
|
+
send({ op: 'insert_one', data: { collection: 'test', document: { name: 'test', value: 1 } } });
|
|
216
|
+
const insert_response = await receive();
|
|
217
|
+
t.is(insert_response.ok, 1);
|
|
218
|
+
|
|
219
|
+
// Test find operation
|
|
220
|
+
send({ op: 'find_one', data: { collection: 'test', filter: { name: 'test' } } });
|
|
221
|
+
const find_response = await receive();
|
|
222
|
+
t.is(find_response.ok, 1);
|
|
223
|
+
t.is(find_response.document.name, 'test');
|
|
224
|
+
} finally {
|
|
225
|
+
close();
|
|
226
|
+
}
|
|
227
|
+
});
|