@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,42 @@
1
+ import test from 'ava';
2
+ import sinon from 'sinon';
3
+ import insert_one from '../../../../src/server/lib/operations/insert_one.js';
4
+ import { initialize_database, get_database, cleanup_database } from '../../../../src/server/lib/query_engine.js';
5
+
6
+ test.beforeEach(() => {
7
+ initialize_database('./test_data');
8
+ const db = get_database();
9
+ db.clearSync();
10
+ });
11
+
12
+ test.afterEach(async (t) => {
13
+ await cleanup_database();
14
+ });
15
+
16
+ test('insert_one - should insert a document and return acknowledged', async (t) => {
17
+ const result = await insert_one('default', 'users', { name: 'Alice' });
18
+ t.true(result.acknowledged);
19
+ t.truthy(result.inserted_id);
20
+ const db = get_database();
21
+ const key = `default:users:${result.inserted_id}`;
22
+ const doc = JSON.parse(db.get(key));
23
+ t.is(doc.name, 'Alice');
24
+ t.is(doc._id, result.inserted_id);
25
+ t.truthy(doc._created_at);
26
+ t.truthy(doc._updated_at);
27
+ });
28
+
29
+ test('insert_one - should throw if collection name is missing', async (t) => {
30
+ await t.throwsAsync(() => insert_one('default', '', { name: 'Bob' }), { message: 'Collection name is required' });
31
+ });
32
+
33
+ test('insert_one - should throw if document is not an object', async (t) => {
34
+ await t.throwsAsync(() => insert_one('default', 'users', null), { message: 'Document must be a valid object' });
35
+ await t.throwsAsync(() => insert_one('default', 'users', 'not-an-object'), { message: 'Document must be a valid object' });
36
+ });
37
+
38
+ test('insert_one - should throw if document with same _id exists', async (t) => {
39
+ const doc = { _id: 'fixed_id', name: 'Carol' };
40
+ await insert_one('default', 'users', doc);
41
+ await t.throwsAsync(() => insert_one('default', 'users', doc), { message: 'Document with _id fixed_id already exists' });
42
+ });
@@ -0,0 +1,89 @@
1
+ import test from 'ava';
2
+ import sinon from 'sinon';
3
+ import update_one from '../../../../src/server/lib/operations/update_one.js';
4
+ import insert_one from '../../../../src/server/lib/operations/insert_one.js';
5
+ import { initialize_database, get_database, cleanup_database } from '../../../../src/server/lib/query_engine.js';
6
+
7
+ test.beforeEach(() => {
8
+ initialize_database('./test_data');
9
+ const db = get_database();
10
+ db.clearSync();
11
+ });
12
+
13
+ test.afterEach(async (t) => {
14
+ await cleanup_database();
15
+ });
16
+
17
+ test('update_one - should update a document with $set', async (t) => {
18
+ const { inserted_id } = await insert_one('default', 'users', { name: 'Alice', age: 20 });
19
+ const result = await update_one('default', 'users', { _id: inserted_id }, { $set: { age: 21 } });
20
+ t.true(result.acknowledged);
21
+ t.is(result.matched_count, 1);
22
+ t.is(result.modified_count, 1);
23
+ const db = get_database();
24
+ const doc = JSON.parse(db.get(`default:users:${inserted_id}`));
25
+ t.is(doc.age, 21);
26
+ });
27
+
28
+ test('update_one - should update a document with $unset', async (t) => {
29
+ const { inserted_id } = await insert_one('default', 'users', { name: 'Bob', age: 30 });
30
+ await update_one('default', 'users', { _id: inserted_id }, { $unset: { age: true } });
31
+ const db = get_database();
32
+ const doc = JSON.parse(db.get(`default:users:${inserted_id}`));
33
+ t.falsy(doc.age);
34
+ });
35
+
36
+ test('update_one - should update a document with $inc', async (t) => {
37
+ const { inserted_id } = await insert_one('default', 'users', { name: 'Carol', count: 1 });
38
+ await update_one('default', 'users', { _id: inserted_id }, { $inc: { count: 2 } });
39
+ const db = get_database();
40
+ const doc = JSON.parse(db.get(`default:users:${inserted_id}`));
41
+ t.is(doc.count, 3);
42
+ });
43
+
44
+ test('update_one - should update a document with $push', async (t) => {
45
+ const { inserted_id } = await insert_one('default', 'users', { name: 'Dan', tags: ['a'] });
46
+ await update_one('default', 'users', { _id: inserted_id }, { $push: { tags: 'b' } });
47
+ const db = get_database();
48
+ const doc = JSON.parse(db.get(`default:users:${inserted_id}`));
49
+ t.deepEqual(doc.tags, ['a', 'b']);
50
+ });
51
+
52
+ test('update_one - should update a document with $pull', async (t) => {
53
+ const { inserted_id } = await insert_one('default', 'users', { name: 'Eve', tags: ['a', 'b', 'c'] });
54
+ await update_one('default', 'users', { _id: inserted_id }, { $pull: { tags: 'b' } });
55
+ const db = get_database();
56
+ const doc = JSON.parse(db.get(`default:users:${inserted_id}`));
57
+ t.deepEqual(doc.tags, ['a', 'c']);
58
+ });
59
+
60
+ test('update_one - should upsert if no match and upsert option is true', async (t) => {
61
+ const result = await update_one('default', 'users', { name: 'Frank' }, { $set: { age: 40 } }, { upsert: true });
62
+ t.true(result.acknowledged);
63
+ t.is(result.matched_count, 0);
64
+ t.is(result.modified_count, 0);
65
+ t.truthy(result.upserted_id);
66
+ const db = get_database();
67
+ const doc = JSON.parse(db.get(`default:users:${result.upserted_id}`));
68
+ t.is(doc.name, 'Frank');
69
+ t.is(doc.age, 40);
70
+ });
71
+
72
+ test('update_one - should throw if collection name is missing', async (t) => {
73
+ await t.throwsAsync(() => update_one('default', '', { _id: 'x' }, { $set: { a: 1 } }), { message: 'Collection name is required' });
74
+ });
75
+
76
+ test('update_one - should throw if filter is not an object', async (t) => {
77
+ await t.throwsAsync(() => update_one('default', 'users', null, { $set: { a: 1 } }), { message: 'Filter must be a valid object' });
78
+ await t.throwsAsync(() => update_one('default', 'users', 'not-an-object', { $set: { a: 1 } }), { message: 'Filter must be a valid object' });
79
+ });
80
+
81
+ test('update_one - should throw if update is not an object', async (t) => {
82
+ await t.throwsAsync(() => update_one('default', 'users', { _id: 'x' }, null), { message: 'Update must be a valid object' });
83
+ await t.throwsAsync(() => update_one('default', 'users', { _id: 'x' }, 'not-an-object'), { message: 'Update must be a valid object' });
84
+ });
85
+
86
+ test('update_one - should throw on unsupported operator', async (t) => {
87
+ const { inserted_id } = await insert_one('default', 'users', { name: 'Grace' });
88
+ await t.throwsAsync(() => update_one('default', 'users', { _id: inserted_id }, { $foo: { a: 1 } }), { message: 'Unsupported update operator: $foo' });
89
+ });
@@ -0,0 +1,185 @@
1
+ import test from 'ava';
2
+ import { PerformanceMonitor } from '../../../src/server/lib/performance_monitor.js';
3
+
4
+ test('PerformanceMonitor - should initialize with empty metrics', t => {
5
+ const monitor = new PerformanceMonitor();
6
+ const stats = monitor.get_performance_stats();
7
+
8
+ t.is(stats.total_requests, 0);
9
+ t.is(stats.total_errors, 0);
10
+ t.is(stats.ops_per_second, 0);
11
+ t.is(stats.avg_response_time_ms, 0);
12
+ t.is(stats.error_rate_percent, 0);
13
+ });
14
+
15
+ test('PerformanceMonitor - should track successful operations', t => {
16
+ const monitor = new PerformanceMonitor();
17
+
18
+ monitor.track_operation('find_one', 50, 'success');
19
+ monitor.track_operation('insert_one', 100, 'success');
20
+
21
+ const stats = monitor.get_performance_stats();
22
+
23
+ t.is(stats.total_requests, 2);
24
+ t.is(stats.total_errors, 0);
25
+ t.is(stats.error_rate_percent, 0);
26
+ t.true(stats.ops_per_second >= 0);
27
+ t.true(stats.avg_response_time_ms > 0);
28
+ });
29
+
30
+ test('PerformanceMonitor - should track failed operations', t => {
31
+ const monitor = new PerformanceMonitor();
32
+
33
+ monitor.track_operation('find_one', 25, 'error', 'Document not found');
34
+ monitor.track_operation('insert_one', 75, 'success');
35
+
36
+ const stats = monitor.get_performance_stats();
37
+
38
+ t.is(stats.total_requests, 2);
39
+ t.is(stats.total_errors, 1);
40
+ t.is(stats.error_rate_percent, 50);
41
+ t.is(stats.top_errors.length, 1);
42
+ t.is(stats.top_errors[0].error, 'Document not found');
43
+ t.is(stats.top_errors[0].count, 1);
44
+ });
45
+
46
+ test('PerformanceMonitor - should track operation breakdown', t => {
47
+ const monitor = new PerformanceMonitor();
48
+
49
+ monitor.track_operation('find_one', 50, 'success');
50
+ monitor.track_operation('find_one', 100, 'error', 'Timeout');
51
+ monitor.track_operation('insert_one', 75, 'success');
52
+
53
+ const stats = monitor.get_performance_stats();
54
+
55
+ t.truthy(stats.operations.find_one);
56
+ t.is(stats.operations.find_one.count, 2);
57
+ t.is(stats.operations.find_one.error_count, 1);
58
+ t.is(stats.operations.find_one.error_rate, 50);
59
+ t.is(stats.operations.find_one.avg_duration_ms, 75);
60
+
61
+ t.truthy(stats.operations.insert_one);
62
+ t.is(stats.operations.insert_one.count, 1);
63
+ t.is(stats.operations.insert_one.error_count, 0);
64
+ t.is(stats.operations.insert_one.error_rate, 0);
65
+ t.is(stats.operations.insert_one.avg_duration_ms, 75);
66
+ });
67
+
68
+ test('PerformanceMonitor - should get memory stats', t => {
69
+ const monitor = new PerformanceMonitor();
70
+ const memory_stats = monitor.get_memory_stats();
71
+
72
+ t.true(typeof memory_stats.rss_mb === 'number');
73
+ t.true(typeof memory_stats.heap_total_mb === 'number');
74
+ t.true(typeof memory_stats.heap_used_mb === 'number');
75
+ t.true(typeof memory_stats.heap_used_percent === 'number');
76
+ t.true(typeof memory_stats.external_mb === 'number');
77
+
78
+ t.true(memory_stats.rss_mb > 0);
79
+ t.true(memory_stats.heap_total_mb > 0);
80
+ t.true(memory_stats.heap_used_mb > 0);
81
+ t.true(memory_stats.heap_used_percent >= 0 && memory_stats.heap_used_percent <= 100);
82
+ });
83
+
84
+ test('PerformanceMonitor - should get system stats', t => {
85
+ const monitor = new PerformanceMonitor();
86
+ const system_stats = monitor.get_system_stats();
87
+
88
+ t.true(typeof system_stats.node_version === 'string');
89
+ t.true(typeof system_stats.platform === 'string');
90
+ t.true(typeof system_stats.arch === 'string');
91
+ t.true(typeof system_stats.pid === 'number');
92
+ t.true(typeof system_stats.cpu_user_ms === 'number');
93
+ t.true(typeof system_stats.cpu_system_ms === 'number');
94
+
95
+ t.true(system_stats.pid > 0);
96
+ t.true(system_stats.cpu_user_ms >= 0);
97
+ t.true(system_stats.cpu_system_ms >= 0);
98
+ });
99
+
100
+ test('PerformanceMonitor - should log structured operations', t => {
101
+ const monitor = new PerformanceMonitor();
102
+
103
+ // This should not throw
104
+ t.notThrows(() => {
105
+ monitor.log_structured_operation(
106
+ 'client_123',
107
+ 'find_one',
108
+ 'users',
109
+ 45,
110
+ 'success',
111
+ null,
112
+ 1024,
113
+ 2048
114
+ );
115
+ });
116
+
117
+ const stats = monitor.get_performance_stats();
118
+ t.is(stats.total_requests, 1);
119
+ t.is(stats.total_errors, 0);
120
+ });
121
+
122
+ test('PerformanceMonitor - should log structured operations with errors', t => {
123
+ const monitor = new PerformanceMonitor();
124
+
125
+ monitor.log_structured_operation(
126
+ 'client_456',
127
+ 'insert_one',
128
+ 'users',
129
+ 100,
130
+ 'error',
131
+ 'Validation failed',
132
+ 512,
133
+ 0
134
+ );
135
+
136
+ const stats = monitor.get_performance_stats();
137
+ t.is(stats.total_requests, 1);
138
+ t.is(stats.total_errors, 1);
139
+ t.is(stats.error_rate_percent, 100);
140
+ });
141
+
142
+ test('PerformanceMonitor - should reset metrics', t => {
143
+ const monitor = new PerformanceMonitor();
144
+
145
+ monitor.track_operation('find_one', 50, 'success');
146
+ monitor.track_operation('insert_one', 100, 'error', 'Test error');
147
+
148
+ let stats = monitor.get_performance_stats();
149
+ t.is(stats.total_requests, 2);
150
+ t.is(stats.total_errors, 1);
151
+
152
+ monitor.reset_metrics();
153
+
154
+ stats = monitor.get_performance_stats();
155
+ t.is(stats.total_requests, 0);
156
+ t.is(stats.total_errors, 0);
157
+ t.is(stats.ops_per_second, 0);
158
+ t.is(stats.avg_response_time_ms, 0);
159
+ t.is(stats.error_rate_percent, 0);
160
+ });
161
+
162
+ test('PerformanceMonitor - should limit response times array size', t => {
163
+ const monitor = new PerformanceMonitor();
164
+
165
+ // Add more than max_response_times (1000) operations
166
+ for (let i = 0; i < 1200; i++) {
167
+ monitor.track_operation('test_op', 10, 'success');
168
+ }
169
+
170
+ const stats = monitor.get_performance_stats();
171
+ t.is(stats.total_requests, 1200);
172
+
173
+ // Response times array should be limited
174
+ t.true(monitor.metrics.response_times.length <= monitor.max_response_times);
175
+ });
176
+
177
+ test('PerformanceMonitor - should handle database stats gracefully', t => {
178
+ const monitor = new PerformanceMonitor();
179
+
180
+ // This should not throw even if database is not available
181
+ t.notThrows(() => {
182
+ const db_stats = monitor.get_database_stats();
183
+ t.true(typeof db_stats === 'object');
184
+ });
185
+ });
@@ -0,0 +1,46 @@
1
+ import test from 'ava';
2
+ import sinon from 'sinon';
3
+ import {
4
+ initialize_database,
5
+ get_database,
6
+ generate_document_id,
7
+ build_collection_key,
8
+ parse_collection_key,
9
+ cleanup_database
10
+ } from '../../../src/server/lib/query_engine.js';
11
+
12
+ test.afterEach(async () => {
13
+ // Clean up database connections after each test
14
+ await cleanup_database(true); // Remove test database directory
15
+ });
16
+
17
+ test('query_engine - should throw if get_database called before initialization', (t) => {
18
+ const original_db_instance = global.db_instance;
19
+ global.db_instance = null;
20
+ t.throws(() => get_database(), { message: 'Database not initialized. Call initialize_database first.' });
21
+ global.db_instance = original_db_instance;
22
+ });
23
+
24
+ test('query_engine - should initialize database and return instance', (t) => {
25
+ const db = initialize_database('./test_data');
26
+ t.truthy(db);
27
+ });
28
+
29
+ test('query_engine - should return same instance on multiple initialize calls', (t) => {
30
+ const db1 = initialize_database('./test_data');
31
+ const db2 = initialize_database('./test_data');
32
+ t.is(db1, db2);
33
+ });
34
+
35
+ test('query_engine - should generate unique document ids', (t) => {
36
+ const id1 = generate_document_id();
37
+ const id2 = generate_document_id();
38
+ t.not(id1, id2);
39
+ });
40
+
41
+ test('query_engine - should build and parse collection keys correctly', (t) => {
42
+ const key = build_collection_key('default', 'users', 'abc123');
43
+ t.is(key, 'default:users:abc123');
44
+ const parsed = parse_collection_key(key);
45
+ t.deepEqual(parsed, { database: 'default', collection: 'users', document_id: 'abc123' });
46
+ });