@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,638 @@
1
+ import test from 'ava';
2
+ import net from 'net';
3
+ import fs from 'fs';
4
+ import { encode as encode_messagepack, decode as decode_messagepack } from 'msgpackr';
5
+ import { create_server } from '../../../../src/server/index.js';
6
+ import { initialize_database, get_database, cleanup_database } from '../../../../src/server/lib/query_engine.js';
7
+ import { reset_auth_state } from '../../../../src/server/lib/auth_manager.js';
8
+
9
+ // Dynamic port allocation
10
+ let current_port = 4000;
11
+ const get_next_port = () => {
12
+ return ++current_port;
13
+ };
14
+
15
+ let server;
16
+ let port;
17
+
18
+ test.beforeEach(async () => {
19
+ // Reset auth state
20
+ reset_auth_state();
21
+
22
+ // Initialize test database and clear it for clean state between tests
23
+ initialize_database('./test_data');
24
+ try {
25
+ const db = get_database();
26
+ db.clearSync();
27
+ } catch (error) {
28
+ // Ignore errors during cleanup
29
+ }
30
+
31
+ // Create server with dynamic port
32
+ const test_port = get_next_port();
33
+ server = await create_server();
34
+
35
+ // Start server on specific port
36
+ await new Promise((resolve) => {
37
+ server.listen(test_port, () => {
38
+ port = test_port;
39
+ setTimeout(resolve, 100);
40
+ });
41
+ });
42
+ });
43
+
44
+ test.afterEach(async () => {
45
+ if (server) {
46
+ await server.cleanup();
47
+ server.close();
48
+ server = null;
49
+ }
50
+
51
+ // Clean up auth state after each test
52
+ reset_auth_state();
53
+
54
+ // Clean up database
55
+ await cleanup_database();
56
+ });
57
+
58
+ const create_client = () => {
59
+ return new Promise((resolve, reject) => {
60
+ const client = net.createConnection(port, 'localhost');
61
+
62
+ client.on('connect', () => {
63
+ resolve(client);
64
+ });
65
+
66
+ client.on('error', reject);
67
+ });
68
+ };
69
+
70
+ const send_message = (client, message) => {
71
+ return new Promise((resolve, reject) => {
72
+ // Encode the message object directly (not as JSON string first)
73
+ const encoded_message = encode_messagepack(message);
74
+ const length_buffer = Buffer.alloc(4);
75
+ length_buffer.writeUInt32BE(encoded_message.length, 0);
76
+
77
+ let response_data = Buffer.alloc(0);
78
+ let expected_length = null;
79
+ let header_received = false;
80
+
81
+ const handle_data = (data) => {
82
+ response_data = Buffer.concat([response_data, data]);
83
+
84
+ if (!header_received && response_data.length >= 4) {
85
+ expected_length = response_data.readUInt32BE(0);
86
+ header_received = true;
87
+ }
88
+
89
+ if (header_received && response_data.length >= expected_length + 4) {
90
+ client.removeListener('data', handle_data);
91
+ const message_data = response_data.slice(4, expected_length + 4);
92
+
93
+ try {
94
+ const response = decode_messagepack(message_data);
95
+ resolve(response);
96
+ } catch (error) {
97
+ reject(new Error(`Failed to parse response: ${error.message}`));
98
+ }
99
+ }
100
+ };
101
+
102
+ client.on('data', handle_data);
103
+ client.write(Buffer.concat([length_buffer, encoded_message]));
104
+
105
+ setTimeout(() => {
106
+ client.removeListener('data', handle_data);
107
+ reject(new Error('Response timeout'));
108
+ }, 5000);
109
+ });
110
+ };
111
+
112
+ const authenticate_client = async (client) => {
113
+ // First setup authentication
114
+ const setup_response = await send_message(client, {
115
+ op: 'setup',
116
+ data: {}
117
+ });
118
+
119
+ if (!setup_response.ok) {
120
+ throw new Error(`Setup failed: ${JSON.stringify(setup_response.error || setup_response)}`);
121
+ }
122
+
123
+ const password = setup_response.password;
124
+ if (!password) {
125
+ throw new Error(`Setup response did not contain password: ${JSON.stringify(setup_response)}`);
126
+ }
127
+
128
+ // Then authenticate
129
+ const auth_response = await send_message(client, {
130
+ op: 'authentication',
131
+ data: { password }
132
+ });
133
+
134
+ if (!auth_response.ok) {
135
+ throw new Error(`Authentication failed: ${JSON.stringify(auth_response.error || auth_response)}`);
136
+ }
137
+
138
+ return password;
139
+ };
140
+
141
+ test('admin operation - default (backward compatibility)', async (t) => {
142
+ const client = await create_client();
143
+ await authenticate_client(client);
144
+
145
+ const response = await send_message(client, {
146
+ op: 'admin',
147
+ data: {}
148
+ });
149
+
150
+ t.is(response.ok, true);
151
+ t.truthy(response.server);
152
+ t.truthy(response.database);
153
+ t.truthy(response.connections);
154
+ t.truthy(response.authentication);
155
+ t.truthy(response.settings);
156
+
157
+ // Check server info
158
+ t.is(typeof response.server.uptime, 'number');
159
+ t.is(typeof response.server.uptime_formatted, 'string');
160
+ t.truthy(response.server.memory_usage);
161
+ t.is(typeof response.server.node_version, 'string');
162
+ t.is(typeof response.server.platform, 'string');
163
+ t.is(typeof response.server.pid, 'number');
164
+
165
+ // Check database info
166
+ t.is(typeof response.database.total_documents, 'number');
167
+ t.is(typeof response.database.total_collections, 'number');
168
+ t.truthy(response.database.stats);
169
+ t.is(typeof response.database.map_size_usage_percent, 'number');
170
+
171
+ client.end();
172
+ });
173
+
174
+ test('admin operation - stats action', async (t) => {
175
+ const client = await create_client();
176
+ await authenticate_client(client);
177
+
178
+ const response = await send_message(client, {
179
+ op: 'admin',
180
+ data: { admin_action: 'stats' }
181
+ });
182
+
183
+ t.is(response.ok, 1);
184
+ t.truthy(response.server);
185
+ t.truthy(response.database);
186
+ t.truthy(response.performance);
187
+ t.truthy(response.connections);
188
+ t.truthy(response.write_queue);
189
+ t.truthy(response.authentication);
190
+
191
+ // Check performance metrics
192
+ t.is(typeof response.performance.ops_per_second, 'number');
193
+ t.is(typeof response.performance.avg_response_time_ms, 'number');
194
+
195
+ // Check enhanced database info
196
+ t.is(typeof response.database.map_size_mb, 'number');
197
+ t.is(typeof response.database.used_space_mb, 'number');
198
+ t.is(typeof response.database.usage_percent, 'number');
199
+
200
+ client.end();
201
+ });
202
+
203
+ test('admin operation - list_collections action', async (t) => {
204
+ const client = await create_client();
205
+ await authenticate_client(client);
206
+
207
+ // Insert some test data first
208
+ await send_message(client, {
209
+ op: 'insert_one',
210
+ data: {
211
+ collection: 'test_collection',
212
+ document: { name: 'test', value: 123 }
213
+ }
214
+ });
215
+
216
+ await send_message(client, {
217
+ op: 'insert_one',
218
+ data: {
219
+ collection: 'another_collection',
220
+ document: { title: 'test', count: 456 }
221
+ }
222
+ });
223
+
224
+ const response = await send_message(client, {
225
+ op: 'admin',
226
+ data: { admin_action: 'list_collections' }
227
+ });
228
+
229
+ t.is(response.ok, 1);
230
+ t.truthy(response.collections);
231
+ t.is(typeof response.total_collections, 'number');
232
+ t.is(typeof response.total_documents, 'number');
233
+ t.true(response.total_collections >= 2);
234
+ t.true(response.total_documents >= 2);
235
+
236
+ // Check collection structure
237
+ const test_collection = response.collections.find(col => col.name === 'test_collection');
238
+ t.truthy(test_collection);
239
+ t.is(typeof test_collection.document_count, 'number');
240
+ t.true(Array.isArray(test_collection.indexes));
241
+ t.is(typeof test_collection.estimated_size_bytes, 'number');
242
+
243
+ client.end();
244
+ });
245
+
246
+ test('admin operation - list_documents action', async (t) => {
247
+ const client = await create_client();
248
+ await authenticate_client(client);
249
+
250
+ // Insert test documents
251
+ const test_docs = [
252
+ { name: 'doc1', value: 100 },
253
+ { name: 'doc2', value: 200 },
254
+ { name: 'doc3', value: 300 }
255
+ ];
256
+
257
+ for (const doc of test_docs) {
258
+ await send_message(client, {
259
+ op: 'insert_one',
260
+ data: {
261
+ collection: 'list_test',
262
+ document: doc
263
+ }
264
+ });
265
+ }
266
+
267
+ const response = await send_message(client, {
268
+ op: 'admin',
269
+ data: {
270
+ admin_action: 'list_documents',
271
+ collection: 'list_test',
272
+ limit: 2
273
+ }
274
+ });
275
+
276
+ t.is(response.ok, 1);
277
+ t.is(response.collection, 'list_test');
278
+ t.true(Array.isArray(response.documents));
279
+ t.is(response.documents.length, 2);
280
+ t.is(response.count, 2);
281
+ t.is(response.skip, 0);
282
+ t.is(response.limit, 2);
283
+ t.is(response.has_more, true);
284
+
285
+ // Check document structure
286
+ const first_doc = response.documents[0];
287
+ t.truthy(first_doc._id);
288
+ t.truthy(first_doc.name);
289
+ t.is(typeof first_doc.value, 'number');
290
+
291
+ client.end();
292
+ });
293
+
294
+ test('admin operation - list_documents with pagination', async (t) => {
295
+ const client = await create_client();
296
+ await authenticate_client(client);
297
+
298
+ // Insert test documents for pagination
299
+ const test_docs = [
300
+ { name: 'page_doc1', value: 100 },
301
+ { name: 'page_doc2', value: 200 },
302
+ { name: 'page_doc3', value: 300 }
303
+ ];
304
+
305
+ for (const doc of test_docs) {
306
+ await send_message(client, {
307
+ op: 'insert_one',
308
+ data: {
309
+ collection: 'pagination_test',
310
+ document: doc
311
+ }
312
+ });
313
+ }
314
+
315
+ // Test pagination
316
+ const response = await send_message(client, {
317
+ op: 'admin',
318
+ data: {
319
+ admin_action: 'list_documents',
320
+ collection: 'pagination_test',
321
+ limit: 1,
322
+ skip: 1
323
+ }
324
+ });
325
+
326
+ t.is(response.ok, 1);
327
+ t.is(response.documents.length, 1);
328
+ t.is(response.skip, 1);
329
+ t.is(response.limit, 1);
330
+
331
+ client.end();
332
+ });
333
+
334
+ test('admin operation - get_document action', async (t) => {
335
+ const client = await create_client();
336
+ await authenticate_client(client);
337
+
338
+ // Insert a test document
339
+ const insert_response = await send_message(client, {
340
+ op: 'insert_one',
341
+ data: {
342
+ collection: 'get_test',
343
+ document: { name: 'specific_doc', value: 999 }
344
+ }
345
+ });
346
+
347
+ const document_id = insert_response.inserted_id;
348
+
349
+ const response = await send_message(client, {
350
+ op: 'admin',
351
+ data: {
352
+ admin_action: 'get_document',
353
+ collection: 'get_test',
354
+ document_id
355
+ }
356
+ });
357
+
358
+ t.is(response.ok, 1);
359
+ t.is(response.found, true);
360
+ t.is(response.collection, 'get_test');
361
+ t.is(response.document_id, document_id);
362
+ t.truthy(response.document);
363
+ t.is(response.document._id, document_id);
364
+ t.is(response.document.name, 'specific_doc');
365
+ t.is(response.document.value, 999);
366
+
367
+ client.end();
368
+ });
369
+
370
+ test('admin operation - get_document not found', async (t) => {
371
+ const client = await create_client();
372
+ await authenticate_client(client);
373
+
374
+ const response = await send_message(client, {
375
+ op: 'admin',
376
+ data: {
377
+ admin_action: 'get_document',
378
+ collection: 'get_test',
379
+ document_id: 'nonexistent'
380
+ }
381
+ });
382
+
383
+ t.is(response.ok, 1);
384
+ t.is(response.found, false);
385
+ t.is(response.collection, 'get_test');
386
+ t.is(response.document_id, 'nonexistent');
387
+
388
+ client.end();
389
+ });
390
+
391
+ test('admin operation - query_documents action', async (t) => {
392
+ const client = await create_client();
393
+ await authenticate_client(client);
394
+
395
+ // Insert test documents with different values
396
+ const test_docs = [
397
+ { category: 'A', score: 85 },
398
+ { category: 'B', score: 92 },
399
+ { category: 'A', score: 78 },
400
+ { category: 'C', score: 95 }
401
+ ];
402
+
403
+ for (const doc of test_docs) {
404
+ await send_message(client, {
405
+ op: 'insert_one',
406
+ data: {
407
+ collection: 'query_test',
408
+ document: doc
409
+ }
410
+ });
411
+ }
412
+
413
+ // Query for category 'A'
414
+ const response = await send_message(client, {
415
+ op: 'admin',
416
+ data: {
417
+ admin_action: 'query_documents',
418
+ collection: 'query_test',
419
+ filter: { category: 'A' }
420
+ }
421
+ });
422
+
423
+ t.is(response.ok, 1);
424
+ t.is(response.collection, 'query_test');
425
+ t.deepEqual(response.filter, { category: 'A' });
426
+ t.true(Array.isArray(response.documents));
427
+ t.is(response.documents.length, 2);
428
+ t.is(typeof response.total_examined, 'number');
429
+ t.true(response.total_examined >= 2);
430
+
431
+ // Check that all returned documents match the filter
432
+ response.documents.forEach(doc => {
433
+ t.is(doc.category, 'A');
434
+ t.truthy(doc._id);
435
+ t.is(typeof doc.score, 'number');
436
+ });
437
+
438
+ client.end();
439
+ });
440
+
441
+ test('admin operation - query_documents with operators', async (t) => {
442
+ const client = await create_client();
443
+ await authenticate_client(client);
444
+
445
+ // Query with $gt operator
446
+ const response = await send_message(client, {
447
+ op: 'admin',
448
+ data: {
449
+ admin_action: 'query_documents',
450
+ collection: 'query_test',
451
+ filter: { score: { $gt: 90 } }
452
+ }
453
+ });
454
+
455
+ t.is(response.ok, 1);
456
+ t.true(Array.isArray(response.documents));
457
+
458
+ // All returned documents should have score > 90
459
+ response.documents.forEach(doc => {
460
+ t.true(doc.score > 90);
461
+ });
462
+
463
+ client.end();
464
+ });
465
+
466
+ test('admin operation - insert_document action', async (t) => {
467
+ const client = await create_client();
468
+ await authenticate_client(client);
469
+
470
+ const response = await send_message(client, {
471
+ op: 'admin',
472
+ data: {
473
+ admin_action: 'insert_document',
474
+ collection: 'admin_insert_test',
475
+ document: { name: 'admin_inserted', value: 777 }
476
+ }
477
+ });
478
+
479
+ t.is(response.ok, 1);
480
+ t.truthy(response.inserted_id);
481
+ t.is(response.acknowledged, true);
482
+
483
+ // Verify the document was inserted
484
+ const verify_response = await send_message(client, {
485
+ op: 'find_one',
486
+ data: {
487
+ collection: 'admin_insert_test',
488
+ filter: { name: 'admin_inserted' }
489
+ }
490
+ });
491
+
492
+ t.is(verify_response.ok, 1);
493
+ t.truthy(verify_response.document);
494
+ t.is(verify_response.document.name, 'admin_inserted');
495
+ t.is(verify_response.document.value, 777);
496
+
497
+ client.end();
498
+ });
499
+
500
+ test('admin operation - update_document action', async (t) => {
501
+ const client = await create_client();
502
+ await authenticate_client(client);
503
+
504
+ // Insert a document to update
505
+ const insert_response = await send_message(client, {
506
+ op: 'insert_one',
507
+ data: {
508
+ collection: 'admin_update_test',
509
+ document: { name: 'to_update', value: 100 }
510
+ }
511
+ });
512
+
513
+ const response = await send_message(client, {
514
+ op: 'admin',
515
+ data: {
516
+ admin_action: 'update_document',
517
+ collection: 'admin_update_test',
518
+ filter: { name: 'to_update' },
519
+ update: { $set: { value: 200, updated: true } }
520
+ }
521
+ });
522
+
523
+ t.is(response.ok, 1);
524
+ t.is(response.matched_count, 1);
525
+ t.is(response.modified_count, 1);
526
+ t.is(response.acknowledged, true);
527
+
528
+ // Verify the update
529
+ const verify_response = await send_message(client, {
530
+ op: 'find_one',
531
+ data: {
532
+ collection: 'admin_update_test',
533
+ filter: { name: 'to_update' }
534
+ }
535
+ });
536
+
537
+ t.is(verify_response.ok, 1);
538
+ t.is(verify_response.document.value, 200);
539
+ t.is(verify_response.document.updated, true);
540
+
541
+ client.end();
542
+ });
543
+
544
+ test('admin operation - delete_document action', async (t) => {
545
+ const client = await create_client();
546
+ await authenticate_client(client);
547
+
548
+ // Insert a document to delete
549
+ await send_message(client, {
550
+ op: 'insert_one',
551
+ data: {
552
+ collection: 'admin_delete_test',
553
+ document: { name: 'to_delete', value: 100 }
554
+ }
555
+ });
556
+
557
+ const response = await send_message(client, {
558
+ op: 'admin',
559
+ data: {
560
+ admin_action: 'delete_document',
561
+ collection: 'admin_delete_test',
562
+ filter: { name: 'to_delete' }
563
+ }
564
+ });
565
+
566
+ t.is(response.ok, 1);
567
+ t.is(response.deleted_count, 1);
568
+ t.is(response.acknowledged, true);
569
+
570
+ // Verify the document was deleted
571
+ const verify_response = await send_message(client, {
572
+ op: 'find_one',
573
+ data: {
574
+ collection: 'admin_delete_test',
575
+ filter: { name: 'to_delete' }
576
+ }
577
+ });
578
+
579
+ t.is(verify_response.ok, 1);
580
+ t.is(verify_response.document, null);
581
+
582
+ client.end();
583
+ });
584
+
585
+ test('admin operation - authentication required', async (t) => {
586
+ const client = await create_client();
587
+
588
+ // Try admin operation without authentication
589
+ const response = await send_message(client, {
590
+ op: 'admin',
591
+ data: { admin_action: 'stats' }
592
+ });
593
+
594
+ t.is(response.ok, false);
595
+ t.truthy(response.error);
596
+ t.true(response.error.includes('Authentication required'));
597
+
598
+ client.end();
599
+ });
600
+
601
+ test('admin operation - invalid collection name', async (t) => {
602
+ const client = await create_client();
603
+ await authenticate_client(client);
604
+
605
+ const response = await send_message(client, {
606
+ op: 'admin',
607
+ data: {
608
+ admin_action: 'list_documents'
609
+ // Missing collection parameter
610
+ }
611
+ });
612
+
613
+ t.is(response.ok, 0);
614
+ t.truthy(response.error);
615
+ t.true(response.error.includes('Collection name is required'));
616
+
617
+ client.end();
618
+ });
619
+
620
+ test('admin operation - error handling', async (t) => {
621
+ const client = await create_client();
622
+ await authenticate_client(client);
623
+
624
+ const response = await send_message(client, {
625
+ op: 'admin',
626
+ data: {
627
+ admin_action: 'get_document',
628
+ collection: 'test'
629
+ // Missing document_id parameter
630
+ }
631
+ });
632
+
633
+ t.is(response.ok, 0);
634
+ t.truthy(response.error);
635
+ t.true(response.error.includes('Collection name and document ID are required'));
636
+
637
+ client.end();
638
+ });