@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.
Files changed (354) hide show
  1. package/.build/getFilesToBuild.js +26 -0
  2. package/.build/getPlatformSafeFilePath.js +6 -0
  3. package/.build/getPlatformSafePath.js +6 -0
  4. package/.build/index.js +88 -0
  5. package/.build/isWindows.js +3 -0
  6. package/API_KEY +1 -0
  7. package/README.md +1821 -0
  8. package/data/data.mdb +0 -0
  9. package/data/lock.mdb +0 -0
  10. package/dist/client/database.js +1 -0
  11. package/dist/client/index.js +1 -0
  12. package/dist/server/cluster/index.js +1 -0
  13. package/dist/server/cluster/master.js +20 -0
  14. package/dist/server/cluster/worker.js +1 -0
  15. package/dist/server/index.js +1 -0
  16. package/dist/server/lib/api_key_manager.js +9 -0
  17. package/dist/server/lib/auth_manager.js +1 -0
  18. package/dist/server/lib/auto_index_manager.js +1 -0
  19. package/dist/server/lib/backup_manager.js +1 -0
  20. package/dist/server/lib/connection_manager.js +1 -0
  21. package/dist/server/lib/disk_utils.js +2 -0
  22. package/dist/server/lib/http_server.js +405 -0
  23. package/dist/server/lib/index_manager.js +1 -0
  24. package/dist/server/lib/load_settings.js +1 -0
  25. package/dist/server/lib/logger.js +1 -0
  26. package/dist/server/lib/op_types.js +1 -0
  27. package/dist/server/lib/operation_dispatcher.js +1 -0
  28. package/dist/server/lib/operations/admin.js +1 -0
  29. package/dist/server/lib/operations/bulk_write.js +1 -0
  30. package/dist/server/lib/operations/create_index.js +1 -0
  31. package/dist/server/lib/operations/delete_one.js +1 -0
  32. package/dist/server/lib/operations/drop_index.js +1 -0
  33. package/dist/server/lib/operations/find.js +1 -0
  34. package/dist/server/lib/operations/find_one.js +1 -0
  35. package/dist/server/lib/operations/get_indexes.js +1 -0
  36. package/dist/server/lib/operations/insert_one.js +1 -0
  37. package/dist/server/lib/operations/update_one.js +1 -0
  38. package/dist/server/lib/performance_monitor.js +1 -0
  39. package/dist/server/lib/query_engine.js +1 -0
  40. package/dist/server/lib/recovery_manager.js +1 -0
  41. package/dist/server/lib/replication_manager.js +1 -0
  42. package/dist/server/lib/safe_json_parse.js +1 -0
  43. package/dist/server/lib/send_response.js +1 -0
  44. package/dist/server/lib/tcp_protocol.js +1 -0
  45. package/dist/server/lib/write_forwarder.js +1 -0
  46. package/dist/server/lib/write_queue.js +1 -0
  47. package/increment_version.js +3 -0
  48. package/logs/.013e15b54597d05db4b4b53ecc37b10c92a72927-audit.json +20 -0
  49. package/logs/.02de550a67ea0f5961faa2dfd458a4d06f59ebd1-audit.json +20 -0
  50. package/logs/.03494ba24eb3c72214b4068a77d54b8993bee651-audit.json +20 -0
  51. package/logs/.06309ec60b339be1259a7993dd09c732f8907fbc-audit.json +20 -0
  52. package/logs/.0663a04dcfa17285661e5e1b8cfa51f41523b210-audit.json +20 -0
  53. package/logs/.0f06e6c4c9b824622729e13927587479e5060391-audit.json +20 -0
  54. package/logs/.16ccf58682ecb22b3e3ec63f0da1b7fe9be56528-audit.json +20 -0
  55. package/logs/.1fa1a5d02f496474b1ab473524c65c984146a9ad-audit.json +20 -0
  56. package/logs/.2223c0ae3bea6f0d62c62b1d319cc8634856abb7-audit.json +20 -0
  57. package/logs/.23dc79ffda3e083665e6f5993f59397adcbf4a46-audit.json +20 -0
  58. package/logs/.28104f49b03906b189eefd1cd462cb46c3c0af22-audit.json +20 -0
  59. package/logs/.29cdbf13808abe6a0ce70ee2f2efdd680ce3fd8e-audit.json +20 -0
  60. package/logs/.2a9889afd071f77f41f5170d08703a0afca866b7-audit.json +20 -0
  61. package/logs/.2acec3d1940a2bbed487528b703ee5948959a599-audit.json +20 -0
  62. package/logs/.2fb60ff326338c02bfedbcd0e936444e4a216750-audit.json +20 -0
  63. package/logs/.318fc7a19530d76a345f030f7cad00dda15300e7-audit.json +20 -0
  64. package/logs/.3cf27043e19085f908cedc7701e6d013463208ee-audit.json +25 -0
  65. package/logs/.3d90d785415817fc443402843b7c95f8371adc9b-audit.json +20 -0
  66. package/logs/.4074bca620375f72966fc52dfd439577727671e5-audit.json +20 -0
  67. package/logs/.40eecf018417ea80a70ea8ec7a3cc9406bc6334b-audit.json +20 -0
  68. package/logs/.50e974f1ef7c365fca6a1251b2e2c2252914cb5e-audit.json +20 -0
  69. package/logs/.52cb7d9e4223cf26ba36006ac26b949a97c7923c-audit.json +20 -0
  70. package/logs/.54befcdb84c15aad980705a31bcc9f555c3577ab-audit.json +20 -0
  71. package/logs/.57dfb70e22eddb84db2e3c0ceeefac5c0b9baffa-audit.json +20 -0
  72. package/logs/.5f0b24705a1eaad4eca4968f2d86f91b3f9be683-audit.json +20 -0
  73. package/logs/.61ba98fdda7db58576b382fee07904e5db1169d6-audit.json +20 -0
  74. package/logs/.6235017727ef6b199d569a99d6aa8c8e80a1b475-audit.json +20 -0
  75. package/logs/.63db16193699219489d218a1ddea5dde3750cae4-audit.json +20 -0
  76. package/logs/.64fb67dfe14149c9eef728d79bf30a54da809c60-audit.json +20 -0
  77. package/logs/.669137453368987c1f311b5345342527afb54e50-audit.json +20 -0
  78. package/logs/.7a71f8c89ea28ae266d356aeff6306e876a30fbb-audit.json +20 -0
  79. package/logs/.7afbaa90fe9dc3a7d682676f9bb79f9a1b1fd9a6-audit.json +20 -0
  80. package/logs/.7ca29e322cd05327035de850099e7610864f2347-audit.json +20 -0
  81. package/logs/.83335ab3347e449dae03455a110aaf7f120d4802-audit.json +20 -0
  82. package/logs/.8c2487b5fd445d2c8e5c483c80b9fa99bbf1ca58-audit.json +20 -0
  83. package/logs/.8c8b9dc386922c9f3b4c13251af7052aac1d24c0-audit.json +20 -0
  84. package/logs/.8d6155d94640c4863301ae0fee5e4e7372a21446-audit.json +20 -0
  85. package/logs/.944a3119a243deea7c8270d5d9e582bb1d0eaa10-audit.json +20 -0
  86. package/logs/.9816a845c30fb2909f3b26a23eeb3538ebcad5db-audit.json +20 -0
  87. package/logs/.9dc08784e38b865488177c26d4af5934555e0323-audit.json +20 -0
  88. package/logs/.9dd27d2e0e454ac0a37600206d1cac5493b0d7ee-audit.json +20 -0
  89. package/logs/.a3d486feeac7654c59b547de96600e8849a06d4f-audit.json +20 -0
  90. package/logs/.a5b811f4def22250f86cc18870d7c4573625df22-audit.json +20 -0
  91. package/logs/.a61648eb5f830e0b6f508ac35e4f8f629d2ad4c7-audit.json +20 -0
  92. package/logs/.a89016d507045771b4b5a65656944a9c0f1e528b-audit.json +20 -0
  93. package/logs/.a99bee160a1c590be959af46bacc02724803f691-audit.json +20 -0
  94. package/logs/.ada7906d6243fd7da802f03d86c4ae5dd9df6236-audit.json +20 -0
  95. package/logs/.b518339ee942143b6af983af167f5bbb6983b4de-audit.json +20 -0
  96. package/logs/.b51b124b166d53c9519017856ea610d61d65fabe-audit.json +20 -0
  97. package/logs/.b7a6aee19f58e55633d5e4a3709041c47dfff975-audit.json +20 -0
  98. package/logs/.bd7a8a6ba9c55d557a4867ab53f02e3ec2e1553d-audit.json +20 -0
  99. package/logs/.c1435dafe453b169d6392b25065f3cf4ab6fbb21-audit.json +20 -0
  100. package/logs/.c17e1ce043109f77dc2f0e2aa290a9d1ed842c03-audit.json +20 -0
  101. package/logs/.ca62637ce9540e5a38a2fbedb2115febb6ad308a-audit.json +15 -0
  102. package/logs/.ccee67b9c176967f8977071409a41f5cb5cd6ad4-audit.json +20 -0
  103. package/logs/.db24043417ea79a6f14cd947476399e53930b48d-audit.json +20 -0
  104. package/logs/.e0f12acccb57829f5f33712bb2e2607ecd808147-audit.json +20 -0
  105. package/logs/.e9b6cc33d0bbd2e644c4e2bf44d177f850016557-audit.json +20 -0
  106. package/logs/.f15291d434808e3bdca7963ccd2e73893be027e6-audit.json +20 -0
  107. package/logs/.f4bdf9e21ef84f8a3fae3ffb32bbc39275991351-audit.json +15 -0
  108. package/logs/.fbac3aefac1e81b4230df5aa50667cb90d51024f-audit.json +20 -0
  109. package/logs/.fcfd495c0a9169db243f4a4f21878ee02b76413c-audit.json +20 -0
  110. package/logs/admin-2025-09-12.log +580 -0
  111. package/logs/admin-2025-09-15.log +283 -0
  112. package/logs/admin-error-2025-09-12.log +22 -0
  113. package/logs/admin-error-2025-09-15.log +10 -0
  114. package/logs/api_key_manager-2025-09-12.log +658 -0
  115. package/logs/api_key_manager-2025-09-15.log +295 -0
  116. package/logs/api_key_manager-error-2025-09-12.log +0 -0
  117. package/logs/api_key_manager-error-2025-09-15.log +0 -0
  118. package/logs/auth_manager-2025-09-12.log +4432 -0
  119. package/logs/auth_manager-2025-09-15.log +2000 -0
  120. package/logs/auth_manager-error-2025-09-12.log +11 -0
  121. package/logs/auth_manager-error-2025-09-15.log +5 -0
  122. package/logs/auto_index_manager-2025-09-12.log +84 -0
  123. package/logs/auto_index_manager-2025-09-15.log +45 -0
  124. package/logs/auto_index_manager-error-2025-09-12.log +6 -0
  125. package/logs/auto_index_manager-error-2025-09-15.log +0 -0
  126. package/logs/backup_manager-2025-09-12.log +198 -0
  127. package/logs/backup_manager-2025-09-15.log +90 -0
  128. package/logs/backup_manager-error-2025-09-12.log +198 -0
  129. package/logs/backup_manager-error-2025-09-15.log +90 -0
  130. package/logs/bulk_write-2025-09-12.log +66 -0
  131. package/logs/bulk_write-2025-09-15.log +38 -0
  132. package/logs/bulk_write-error-2025-09-12.log +0 -0
  133. package/logs/bulk_write-error-2025-09-15.log +0 -0
  134. package/logs/connection_manager-2025-09-12.log +2412 -0
  135. package/logs/connection_manager-2025-09-15.log +1132 -0
  136. package/logs/connection_manager-error-2025-09-12.log +0 -0
  137. package/logs/connection_manager-error-2025-09-15.log +0 -0
  138. package/logs/create_index-2025-09-12.log +302 -0
  139. package/logs/create_index-2025-09-15.log +158 -0
  140. package/logs/create_index-error-2025-09-12.log +30 -0
  141. package/logs/create_index-error-2025-09-15.log +13 -0
  142. package/logs/delete_one-2025-09-12.log +73 -0
  143. package/logs/delete_one-2025-09-15.log +43 -0
  144. package/logs/delete_one-error-2025-09-12.log +0 -0
  145. package/logs/delete_one-error-2025-09-15.log +0 -0
  146. package/logs/disk_utils-2025-09-12.log +4954 -0
  147. package/logs/disk_utils-2025-09-15.log +2446 -0
  148. package/logs/disk_utils-error-2025-09-12.log +0 -0
  149. package/logs/disk_utils-error-2025-09-15.log +0 -0
  150. package/logs/drop_index-2025-09-12.log +41 -0
  151. package/logs/drop_index-2025-09-15.log +23 -0
  152. package/logs/drop_index-error-2025-09-12.log +11 -0
  153. package/logs/drop_index-error-2025-09-15.log +5 -0
  154. package/logs/find-2025-09-12.log +1050 -0
  155. package/logs/find-2025-09-15.log +592 -0
  156. package/logs/find-error-2025-09-12.log +1 -0
  157. package/logs/find-error-2025-09-15.log +0 -0
  158. package/logs/find_one-2025-09-12.log +425 -0
  159. package/logs/find_one-2025-09-15.log +264 -0
  160. package/logs/find_one-error-2025-09-12.log +5 -0
  161. package/logs/find_one-error-2025-09-15.log +0 -0
  162. package/logs/get_indexes-2025-09-12.log +84 -0
  163. package/logs/get_indexes-2025-09-15.log +56 -0
  164. package/logs/get_indexes-error-2025-09-12.log +6 -0
  165. package/logs/get_indexes-error-2025-09-15.log +0 -0
  166. package/logs/http_server-2025-09-12.log +2772 -0
  167. package/logs/http_server-2025-09-15.log +1276 -0
  168. package/logs/http_server-error-2025-09-12.log +212 -0
  169. package/logs/http_server-error-2025-09-15.log +44 -0
  170. package/logs/index_manager-2025-09-12.log +5031 -0
  171. package/logs/index_manager-2025-09-15.log +2909 -0
  172. package/logs/index_manager-error-2025-09-12.log +80 -0
  173. package/logs/index_manager-error-2025-09-15.log +38 -0
  174. package/logs/insert_one-2025-09-12.log +2181 -0
  175. package/logs/insert_one-2025-09-15.log +1293 -0
  176. package/logs/insert_one-error-2025-09-12.log +0 -0
  177. package/logs/insert_one-error-2025-09-15.log +0 -0
  178. package/logs/master-2025-09-12.log +1882 -0
  179. package/logs/master-2025-09-15.log +910 -0
  180. package/logs/master-error-2025-09-12.log +80 -0
  181. package/logs/master-error-2025-09-15.log +0 -0
  182. package/logs/operation_dispatcher-2025-09-12.log +751 -0
  183. package/logs/operation_dispatcher-2025-09-15.log +359 -0
  184. package/logs/operation_dispatcher-error-2025-09-12.log +33 -0
  185. package/logs/operation_dispatcher-error-2025-09-15.log +11 -0
  186. package/logs/performance_monitor-2025-09-12.log +14889 -0
  187. package/logs/performance_monitor-2025-09-15.log +6803 -0
  188. package/logs/performance_monitor-error-2025-09-12.log +0 -0
  189. package/logs/performance_monitor-error-2025-09-15.log +0 -0
  190. package/logs/query_engine-2025-09-12.log +5310 -0
  191. package/logs/query_engine-2025-09-15.log +2639 -0
  192. package/logs/query_engine-error-2025-09-12.log +0 -0
  193. package/logs/query_engine-error-2025-09-15.log +0 -0
  194. package/logs/recovery_manager-2025-09-12.log +462 -0
  195. package/logs/recovery_manager-2025-09-15.log +210 -0
  196. package/logs/recovery_manager-error-2025-09-12.log +22 -0
  197. package/logs/recovery_manager-error-2025-09-15.log +10 -0
  198. package/logs/replication-2025-09-12.log +1923 -0
  199. package/logs/replication-2025-09-15.log +917 -0
  200. package/logs/replication-error-2025-09-12.log +33 -0
  201. package/logs/replication-error-2025-09-15.log +15 -0
  202. package/logs/server-2025-09-12.log +2601 -0
  203. package/logs/server-2025-09-15.log +1191 -0
  204. package/logs/server-error-2025-09-12.log +0 -0
  205. package/logs/server-error-2025-09-15.log +0 -0
  206. package/logs/tcp_protocol-2025-09-12.log +22 -0
  207. package/logs/tcp_protocol-2025-09-15.log +10 -0
  208. package/logs/tcp_protocol-error-2025-09-12.log +22 -0
  209. package/logs/tcp_protocol-error-2025-09-15.log +10 -0
  210. package/logs/test-2025-09-12.log +0 -0
  211. package/logs/test-2025-09-15.log +0 -0
  212. package/logs/test-error-2025-09-12.log +0 -0
  213. package/logs/test-error-2025-09-15.log +0 -0
  214. package/logs/update_one-2025-09-12.log +173 -0
  215. package/logs/update_one-2025-09-15.log +118 -0
  216. package/logs/update_one-error-2025-09-12.log +0 -0
  217. package/logs/update_one-error-2025-09-15.log +0 -0
  218. package/logs/worker-2025-09-12.log +1457 -0
  219. package/logs/worker-2025-09-15.log +695 -0
  220. package/logs/worker-error-2025-09-12.log +0 -0
  221. package/logs/worker-error-2025-09-15.log +0 -0
  222. package/logs/write_forwarder-2025-09-12.log +1956 -0
  223. package/logs/write_forwarder-2025-09-15.log +932 -0
  224. package/logs/write_forwarder-error-2025-09-12.log +66 -0
  225. package/logs/write_forwarder-error-2025-09-15.log +30 -0
  226. package/logs/write_queue-2025-09-12.log +612 -0
  227. package/logs/write_queue-2025-09-15.log +301 -0
  228. package/logs/write_queue-error-2025-09-12.log +184 -0
  229. package/logs/write_queue-error-2025-09-15.log +83 -0
  230. package/package.json +48 -0
  231. package/prompts/01-core-infrastructure.md +56 -0
  232. package/prompts/02-secondary-indexing.md +65 -0
  233. package/prompts/03-write-serialization.md +63 -0
  234. package/prompts/04-enhanced-authentication.md +75 -0
  235. package/prompts/05-comprehensive-admin-operations.md +75 -0
  236. package/prompts/06-backup-and-restore-system.md +106 -0
  237. package/prompts/07-production-safety-features.md +107 -0
  238. package/prompts/08-tcp-client-library.md +121 -0
  239. package/prompts/09-api-method-chaining.md +134 -0
  240. package/prompts/10-automatic-index-creation.md +223 -0
  241. package/prompts/11-operation-naming-consistency.md +268 -0
  242. package/prompts/12-tcp-replication-system.md +333 -0
  243. package/prompts/13-master-read-write-operations.md +57 -0
  244. package/prompts/14-index-upsert-operations.md +68 -0
  245. package/prompts/15-client-api-return-types.md +81 -0
  246. package/prompts/16-server-setup-ui.md +97 -0
  247. package/prompts/17-emergency-password-change.md +108 -0
  248. package/prompts/18-joystick-framework-integration.md +116 -0
  249. package/prompts/19-api-key-authentication-system.md +137 -0
  250. package/prompts/20-configurable-server-port.md +105 -0
  251. package/prompts/21-multi-database-support.md +161 -0
  252. package/prompts/FULL_TEXT_SEARCH.md +293 -0
  253. package/prompts/PROMPTS.md +158 -0
  254. package/prompts/README.md +221 -0
  255. package/prompts/TYPESCRIPT_GENERATION.md +179 -0
  256. package/src/client/database.js +166 -0
  257. package/src/client/index.js +752 -0
  258. package/src/server/cluster/index.js +53 -0
  259. package/src/server/cluster/master.js +774 -0
  260. package/src/server/cluster/worker.js +537 -0
  261. package/src/server/index.js +540 -0
  262. package/src/server/lib/api_key_manager.js +473 -0
  263. package/src/server/lib/auth_manager.js +375 -0
  264. package/src/server/lib/auto_index_manager.js +681 -0
  265. package/src/server/lib/backup_manager.js +650 -0
  266. package/src/server/lib/connection_manager.js +218 -0
  267. package/src/server/lib/disk_utils.js +118 -0
  268. package/src/server/lib/http_server.js +1165 -0
  269. package/src/server/lib/index_manager.js +756 -0
  270. package/src/server/lib/load_settings.js +143 -0
  271. package/src/server/lib/logger.js +135 -0
  272. package/src/server/lib/op_types.js +29 -0
  273. package/src/server/lib/operation_dispatcher.js +268 -0
  274. package/src/server/lib/operations/admin.js +808 -0
  275. package/src/server/lib/operations/bulk_write.js +367 -0
  276. package/src/server/lib/operations/create_index.js +68 -0
  277. package/src/server/lib/operations/delete_one.js +114 -0
  278. package/src/server/lib/operations/drop_index.js +58 -0
  279. package/src/server/lib/operations/find.js +340 -0
  280. package/src/server/lib/operations/find_one.js +319 -0
  281. package/src/server/lib/operations/get_indexes.js +52 -0
  282. package/src/server/lib/operations/insert_one.js +113 -0
  283. package/src/server/lib/operations/update_one.js +225 -0
  284. package/src/server/lib/performance_monitor.js +313 -0
  285. package/src/server/lib/query_engine.js +243 -0
  286. package/src/server/lib/recovery_manager.js +388 -0
  287. package/src/server/lib/replication_manager.js +727 -0
  288. package/src/server/lib/safe_json_parse.js +21 -0
  289. package/src/server/lib/send_response.js +47 -0
  290. package/src/server/lib/tcp_protocol.js +130 -0
  291. package/src/server/lib/write_forwarder.js +636 -0
  292. package/src/server/lib/write_queue.js +335 -0
  293. package/test_data/data.mdb +0 -0
  294. package/test_data/lock.mdb +0 -0
  295. package/tests/client/index.test.js +1232 -0
  296. package/tests/server/cluster/cluster.test.js +248 -0
  297. package/tests/server/cluster/master_read_write_operations.test.js +577 -0
  298. package/tests/server/index.test.js +651 -0
  299. package/tests/server/integration/authentication_integration.test.js +294 -0
  300. package/tests/server/integration/auto_indexing_integration.test.js +268 -0
  301. package/tests/server/integration/backup_integration.test.js +513 -0
  302. package/tests/server/integration/indexing_integration.test.js +126 -0
  303. package/tests/server/integration/production_safety_integration.test.js +358 -0
  304. package/tests/server/integration/replication_integration.test.js +227 -0
  305. package/tests/server/integration/write_serialization_integration.test.js +246 -0
  306. package/tests/server/lib/api_key_manager.test.js +516 -0
  307. package/tests/server/lib/auth_manager.test.js +317 -0
  308. package/tests/server/lib/auto_index_manager.test.js +275 -0
  309. package/tests/server/lib/backup_manager.test.js +238 -0
  310. package/tests/server/lib/connection_manager.test.js +221 -0
  311. package/tests/server/lib/disk_utils.test.js +63 -0
  312. package/tests/server/lib/http_server.test.js +389 -0
  313. package/tests/server/lib/index_manager.test.js +301 -0
  314. package/tests/server/lib/load_settings.test.js +107 -0
  315. package/tests/server/lib/load_settings_port_config.test.js +243 -0
  316. package/tests/server/lib/logger.test.js +282 -0
  317. package/tests/server/lib/operations/admin.test.js +638 -0
  318. package/tests/server/lib/operations/bulk_write.test.js +128 -0
  319. package/tests/server/lib/operations/create_index.test.js +138 -0
  320. package/tests/server/lib/operations/delete_one.test.js +52 -0
  321. package/tests/server/lib/operations/drop_index.test.js +72 -0
  322. package/tests/server/lib/operations/find.test.js +93 -0
  323. package/tests/server/lib/operations/find_one.test.js +91 -0
  324. package/tests/server/lib/operations/get_indexes.test.js +87 -0
  325. package/tests/server/lib/operations/insert_one.test.js +42 -0
  326. package/tests/server/lib/operations/update_one.test.js +89 -0
  327. package/tests/server/lib/performance_monitor.test.js +185 -0
  328. package/tests/server/lib/query_engine.test.js +46 -0
  329. package/tests/server/lib/recovery_manager.test.js +414 -0
  330. package/tests/server/lib/replication_manager.test.js +202 -0
  331. package/tests/server/lib/safe_json_parse.test.js +45 -0
  332. package/tests/server/lib/send_response.test.js +155 -0
  333. package/tests/server/lib/tcp_protocol.test.js +169 -0
  334. package/tests/server/lib/write_forwarder.test.js +258 -0
  335. package/tests/server/lib/write_queue.test.js +255 -0
  336. package/tsconfig.json +30 -0
  337. package/types/client/index.d.ts +447 -0
  338. package/types/server/cluster/index.d.ts +28 -0
  339. package/types/server/cluster/master.d.ts +115 -0
  340. package/types/server/cluster/worker.d.ts +1 -0
  341. package/types/server/lib/auth_manager.d.ts +13 -0
  342. package/types/server/lib/backup_manager.d.ts +43 -0
  343. package/types/server/lib/connection_manager.d.ts +15 -0
  344. package/types/server/lib/disk_utils.d.ts +3 -0
  345. package/types/server/lib/index_manager.d.ts +24 -0
  346. package/types/server/lib/load_settings.d.ts +4 -0
  347. package/types/server/lib/logger.d.ts +44 -0
  348. package/types/server/lib/op_types.d.ts +6 -0
  349. package/types/server/lib/performance_monitor.d.ts +68 -0
  350. package/types/server/lib/query_engine.d.ts +10 -0
  351. package/types/server/lib/safe_json_parse.d.ts +7 -0
  352. package/types/server/lib/send_response.d.ts +3 -0
  353. package/types/server/lib/tcp_protocol.d.ts +12 -0
  354. 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
+ });