mongo.do 0.1.0 → 0.1.1

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 (706) hide show
  1. package/dist/cli/index.d.ts +1 -15
  2. package/dist/cli/index.js +4083 -196
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/index.d.ts +2740 -20
  5. package/dist/index.js +9375 -27
  6. package/dist/index.js.map +1 -1
  7. package/dist/worker-entrypoint-BEW23Gmp.d.ts +1331 -0
  8. package/dist/worker.d.ts +6 -5
  9. package/dist/worker.js +5477 -18
  10. package/dist/worker.js.map +1 -1
  11. package/package.json +3 -2
  12. package/dist/agentfs/adapters/anthropic.d.ts +0 -176
  13. package/dist/agentfs/adapters/anthropic.d.ts.map +0 -1
  14. package/dist/agentfs/adapters/anthropic.js +0 -629
  15. package/dist/agentfs/adapters/anthropic.js.map +0 -1
  16. package/dist/agentfs/adapters/index.d.ts +0 -21
  17. package/dist/agentfs/adapters/index.d.ts.map +0 -1
  18. package/dist/agentfs/adapters/index.js +0 -23
  19. package/dist/agentfs/adapters/index.js.map +0 -1
  20. package/dist/agentfs/adapters/vercel.d.ts +0 -260
  21. package/dist/agentfs/adapters/vercel.d.ts.map +0 -1
  22. package/dist/agentfs/adapters/vercel.js +0 -288
  23. package/dist/agentfs/adapters/vercel.js.map +0 -1
  24. package/dist/agentfs/glob.d.ts +0 -116
  25. package/dist/agentfs/glob.d.ts.map +0 -1
  26. package/dist/agentfs/glob.js +0 -270
  27. package/dist/agentfs/glob.js.map +0 -1
  28. package/dist/agentfs/grep.d.ts +0 -83
  29. package/dist/agentfs/grep.d.ts.map +0 -1
  30. package/dist/agentfs/grep.js +0 -193
  31. package/dist/agentfs/grep.js.map +0 -1
  32. package/dist/agentfs/index.d.ts +0 -22
  33. package/dist/agentfs/index.d.ts.map +0 -1
  34. package/dist/agentfs/index.js +0 -18
  35. package/dist/agentfs/index.js.map +0 -1
  36. package/dist/agentfs/kv-store.d.ts +0 -128
  37. package/dist/agentfs/kv-store.d.ts.map +0 -1
  38. package/dist/agentfs/kv-store.js +0 -227
  39. package/dist/agentfs/kv-store.js.map +0 -1
  40. package/dist/agentfs/mondo-agent.d.ts +0 -255
  41. package/dist/agentfs/mondo-agent.d.ts.map +0 -1
  42. package/dist/agentfs/mondo-agent.js +0 -879
  43. package/dist/agentfs/mondo-agent.js.map +0 -1
  44. package/dist/agentfs/toolcalls.d.ts +0 -130
  45. package/dist/agentfs/toolcalls.d.ts.map +0 -1
  46. package/dist/agentfs/toolcalls.js +0 -178
  47. package/dist/agentfs/toolcalls.js.map +0 -1
  48. package/dist/agentfs/types.d.ts +0 -171
  49. package/dist/agentfs/types.d.ts.map +0 -1
  50. package/dist/agentfs/types.js +0 -7
  51. package/dist/agentfs/types.js.map +0 -1
  52. package/dist/agentfs/vfs.d.ts +0 -249
  53. package/dist/agentfs/vfs.d.ts.map +0 -1
  54. package/dist/agentfs/vfs.js +0 -469
  55. package/dist/agentfs/vfs.js.map +0 -1
  56. package/dist/cli/index.d.ts.map +0 -1
  57. package/dist/cli/mcp.d.ts +0 -119
  58. package/dist/cli/mcp.d.ts.map +0 -1
  59. package/dist/cli/mcp.js +0 -418
  60. package/dist/cli/mcp.js.map +0 -1
  61. package/dist/cli/server.d.ts +0 -179
  62. package/dist/cli/server.d.ts.map +0 -1
  63. package/dist/cli/server.js +0 -441
  64. package/dist/cli/server.js.map +0 -1
  65. package/dist/client/Collection.d.ts +0 -199
  66. package/dist/client/Collection.d.ts.map +0 -1
  67. package/dist/client/Collection.js +0 -256
  68. package/dist/client/Collection.js.map +0 -1
  69. package/dist/client/Database.d.ts +0 -68
  70. package/dist/client/Database.d.ts.map +0 -1
  71. package/dist/client/Database.js +0 -105
  72. package/dist/client/Database.js.map +0 -1
  73. package/dist/client/MongoClient.d.ts +0 -165
  74. package/dist/client/MongoClient.d.ts.map +0 -1
  75. package/dist/client/MongoClient.js +0 -307
  76. package/dist/client/MongoClient.js.map +0 -1
  77. package/dist/client/aggregation-cursor.d.ts +0 -210
  78. package/dist/client/aggregation-cursor.d.ts.map +0 -1
  79. package/dist/client/aggregation-cursor.js +0 -509
  80. package/dist/client/aggregation-cursor.js.map +0 -1
  81. package/dist/client/bulk-write.d.ts +0 -216
  82. package/dist/client/bulk-write.d.ts.map +0 -1
  83. package/dist/client/bulk-write.js +0 -63
  84. package/dist/client/bulk-write.js.map +0 -1
  85. package/dist/client/change-stream.d.ts +0 -245
  86. package/dist/client/change-stream.d.ts.map +0 -1
  87. package/dist/client/change-stream.js +0 -429
  88. package/dist/client/change-stream.js.map +0 -1
  89. package/dist/client/cursor.d.ts +0 -85
  90. package/dist/client/cursor.d.ts.map +0 -1
  91. package/dist/client/cursor.js +0 -156
  92. package/dist/client/cursor.js.map +0 -1
  93. package/dist/client/http-cursor.d.ts +0 -233
  94. package/dist/client/http-cursor.d.ts.map +0 -1
  95. package/dist/client/http-cursor.js +0 -496
  96. package/dist/client/http-cursor.js.map +0 -1
  97. package/dist/client/index.d.ts +0 -18
  98. package/dist/client/index.d.ts.map +0 -1
  99. package/dist/client/index.js +0 -24
  100. package/dist/client/index.js.map +0 -1
  101. package/dist/client/mongo-client.d.ts +0 -60
  102. package/dist/client/mongo-client.d.ts.map +0 -1
  103. package/dist/client/mongo-client.js +0 -190
  104. package/dist/client/mongo-client.js.map +0 -1
  105. package/dist/client/mongo-collection.d.ts +0 -359
  106. package/dist/client/mongo-collection.d.ts.map +0 -1
  107. package/dist/client/mongo-collection.js +0 -1641
  108. package/dist/client/mongo-collection.js.map +0 -1
  109. package/dist/client/mongo-cursor.d.ts +0 -257
  110. package/dist/client/mongo-cursor.d.ts.map +0 -1
  111. package/dist/client/mongo-cursor.js +0 -621
  112. package/dist/client/mongo-cursor.js.map +0 -1
  113. package/dist/client/mongo-database.d.ts +0 -88
  114. package/dist/client/mongo-database.d.ts.map +0 -1
  115. package/dist/client/mongo-database.js +0 -139
  116. package/dist/client/mongo-database.js.map +0 -1
  117. package/dist/client/session.d.ts +0 -210
  118. package/dist/client/session.d.ts.map +0 -1
  119. package/dist/client/session.js +0 -326
  120. package/dist/client/session.js.map +0 -1
  121. package/dist/durable-object/index-manager.d.ts +0 -173
  122. package/dist/durable-object/index-manager.d.ts.map +0 -1
  123. package/dist/durable-object/index-manager.js +0 -764
  124. package/dist/durable-object/index-manager.js.map +0 -1
  125. package/dist/durable-object/index.d.ts +0 -12
  126. package/dist/durable-object/index.d.ts.map +0 -1
  127. package/dist/durable-object/index.js +0 -8
  128. package/dist/durable-object/index.js.map +0 -1
  129. package/dist/durable-object/mcp-handler.d.ts +0 -52
  130. package/dist/durable-object/mcp-handler.d.ts.map +0 -1
  131. package/dist/durable-object/mcp-handler.js +0 -186
  132. package/dist/durable-object/mcp-handler.js.map +0 -1
  133. package/dist/durable-object/migrations.d.ts +0 -40
  134. package/dist/durable-object/migrations.d.ts.map +0 -1
  135. package/dist/durable-object/migrations.js +0 -121
  136. package/dist/durable-object/migrations.js.map +0 -1
  137. package/dist/durable-object/mondo-database.d.ts +0 -148
  138. package/dist/durable-object/mondo-database.d.ts.map +0 -1
  139. package/dist/durable-object/mondo-database.js +0 -621
  140. package/dist/durable-object/mondo-database.js.map +0 -1
  141. package/dist/durable-object/schema.d.ts +0 -192
  142. package/dist/durable-object/schema.d.ts.map +0 -1
  143. package/dist/durable-object/schema.js +0 -186
  144. package/dist/durable-object/schema.js.map +0 -1
  145. package/dist/embedding/document-serializer.d.ts +0 -118
  146. package/dist/embedding/document-serializer.d.ts.map +0 -1
  147. package/dist/embedding/document-serializer.js +0 -339
  148. package/dist/embedding/document-serializer.js.map +0 -1
  149. package/dist/embedding/embedding-manager.d.ts +0 -136
  150. package/dist/embedding/embedding-manager.d.ts.map +0 -1
  151. package/dist/embedding/embedding-manager.js +0 -176
  152. package/dist/embedding/embedding-manager.js.map +0 -1
  153. package/dist/embedding/index.d.ts +0 -9
  154. package/dist/embedding/index.d.ts.map +0 -1
  155. package/dist/embedding/index.js +0 -9
  156. package/dist/embedding/index.js.map +0 -1
  157. package/dist/executor/aggregation-executor.d.ts +0 -93
  158. package/dist/executor/aggregation-executor.d.ts.map +0 -1
  159. package/dist/executor/aggregation-executor.js +0 -275
  160. package/dist/executor/aggregation-executor.js.map +0 -1
  161. package/dist/executor/function-executor.d.ts +0 -39
  162. package/dist/executor/function-executor.d.ts.map +0 -1
  163. package/dist/executor/function-executor.js +0 -168
  164. package/dist/executor/function-executor.js.map +0 -1
  165. package/dist/executor/index.d.ts +0 -4
  166. package/dist/executor/index.d.ts.map +0 -1
  167. package/dist/executor/index.js +0 -4
  168. package/dist/executor/index.js.map +0 -1
  169. package/dist/executor/vector-search-executor.d.ts +0 -71
  170. package/dist/executor/vector-search-executor.d.ts.map +0 -1
  171. package/dist/executor/vector-search-executor.js +0 -113
  172. package/dist/executor/vector-search-executor.js.map +0 -1
  173. package/dist/index.d.ts.map +0 -1
  174. package/dist/mcp/adapters/anthropic-adapter.d.ts +0 -256
  175. package/dist/mcp/adapters/anthropic-adapter.d.ts.map +0 -1
  176. package/dist/mcp/adapters/anthropic-adapter.js +0 -409
  177. package/dist/mcp/adapters/anthropic-adapter.js.map +0 -1
  178. package/dist/mcp/adapters/base-adapter.d.ts +0 -164
  179. package/dist/mcp/adapters/base-adapter.d.ts.map +0 -1
  180. package/dist/mcp/adapters/base-adapter.js +0 -277
  181. package/dist/mcp/adapters/base-adapter.js.map +0 -1
  182. package/dist/mcp/adapters/errors.d.ts +0 -173
  183. package/dist/mcp/adapters/errors.d.ts.map +0 -1
  184. package/dist/mcp/adapters/errors.js +0 -305
  185. package/dist/mcp/adapters/errors.js.map +0 -1
  186. package/dist/mcp/adapters/index.d.ts +0 -65
  187. package/dist/mcp/adapters/index.d.ts.map +0 -1
  188. package/dist/mcp/adapters/index.js +0 -92
  189. package/dist/mcp/adapters/index.js.map +0 -1
  190. package/dist/mcp/adapters/streaming.d.ts +0 -200
  191. package/dist/mcp/adapters/streaming.d.ts.map +0 -1
  192. package/dist/mcp/adapters/streaming.js +0 -381
  193. package/dist/mcp/adapters/streaming.js.map +0 -1
  194. package/dist/mcp/adapters/vercel-adapter.d.ts +0 -321
  195. package/dist/mcp/adapters/vercel-adapter.d.ts.map +0 -1
  196. package/dist/mcp/adapters/vercel-adapter.js +0 -487
  197. package/dist/mcp/adapters/vercel-adapter.js.map +0 -1
  198. package/dist/mcp/agent.d.ts +0 -192
  199. package/dist/mcp/agent.d.ts.map +0 -1
  200. package/dist/mcp/agent.js +0 -338
  201. package/dist/mcp/agent.js.map +0 -1
  202. package/dist/mcp/cli.d.ts +0 -71
  203. package/dist/mcp/cli.d.ts.map +0 -1
  204. package/dist/mcp/cli.js +0 -218
  205. package/dist/mcp/cli.js.map +0 -1
  206. package/dist/mcp/index.d.ts +0 -15
  207. package/dist/mcp/index.d.ts.map +0 -1
  208. package/dist/mcp/index.js +0 -20
  209. package/dist/mcp/index.js.map +0 -1
  210. package/dist/mcp/sandbox/database-proxy.d.ts +0 -118
  211. package/dist/mcp/sandbox/database-proxy.d.ts.map +0 -1
  212. package/dist/mcp/sandbox/database-proxy.js +0 -154
  213. package/dist/mcp/sandbox/database-proxy.js.map +0 -1
  214. package/dist/mcp/sandbox/index.d.ts +0 -8
  215. package/dist/mcp/sandbox/index.d.ts.map +0 -1
  216. package/dist/mcp/sandbox/index.js +0 -7
  217. package/dist/mcp/sandbox/index.js.map +0 -1
  218. package/dist/mcp/sandbox/miniflare-evaluator.d.ts +0 -72
  219. package/dist/mcp/sandbox/miniflare-evaluator.d.ts.map +0 -1
  220. package/dist/mcp/sandbox/miniflare-evaluator.js +0 -379
  221. package/dist/mcp/sandbox/miniflare-evaluator.js.map +0 -1
  222. package/dist/mcp/sandbox/template.d.ts +0 -48
  223. package/dist/mcp/sandbox/template.d.ts.map +0 -1
  224. package/dist/mcp/sandbox/template.js +0 -147
  225. package/dist/mcp/sandbox/template.js.map +0 -1
  226. package/dist/mcp/sandbox/worker-evaluator.d.ts +0 -160
  227. package/dist/mcp/sandbox/worker-evaluator.d.ts.map +0 -1
  228. package/dist/mcp/sandbox/worker-evaluator.js +0 -217
  229. package/dist/mcp/sandbox/worker-evaluator.js.map +0 -1
  230. package/dist/mcp/server.d.ts +0 -75
  231. package/dist/mcp/server.d.ts.map +0 -1
  232. package/dist/mcp/server.js +0 -278
  233. package/dist/mcp/server.js.map +0 -1
  234. package/dist/mcp/tool-call-auditor.d.ts +0 -188
  235. package/dist/mcp/tool-call-auditor.d.ts.map +0 -1
  236. package/dist/mcp/tool-call-auditor.js +0 -198
  237. package/dist/mcp/tool-call-auditor.js.map +0 -1
  238. package/dist/mcp/tools/do.d.ts +0 -51
  239. package/dist/mcp/tools/do.d.ts.map +0 -1
  240. package/dist/mcp/tools/do.js +0 -113
  241. package/dist/mcp/tools/do.js.map +0 -1
  242. package/dist/mcp/tools/fetch.d.ts +0 -43
  243. package/dist/mcp/tools/fetch.d.ts.map +0 -1
  244. package/dist/mcp/tools/fetch.js +0 -127
  245. package/dist/mcp/tools/fetch.js.map +0 -1
  246. package/dist/mcp/tools/index.d.ts +0 -9
  247. package/dist/mcp/tools/index.d.ts.map +0 -1
  248. package/dist/mcp/tools/index.js +0 -9
  249. package/dist/mcp/tools/index.js.map +0 -1
  250. package/dist/mcp/tools/search.d.ts +0 -60
  251. package/dist/mcp/tools/search.d.ts.map +0 -1
  252. package/dist/mcp/tools/search.js +0 -278
  253. package/dist/mcp/tools/search.js.map +0 -1
  254. package/dist/mcp/transport/http.d.ts +0 -144
  255. package/dist/mcp/transport/http.d.ts.map +0 -1
  256. package/dist/mcp/transport/http.js +0 -545
  257. package/dist/mcp/transport/http.js.map +0 -1
  258. package/dist/mcp/transport/index.d.ts +0 -10
  259. package/dist/mcp/transport/index.d.ts.map +0 -1
  260. package/dist/mcp/transport/index.js +0 -12
  261. package/dist/mcp/transport/index.js.map +0 -1
  262. package/dist/mcp/transport/stdio.d.ts +0 -132
  263. package/dist/mcp/transport/stdio.d.ts.map +0 -1
  264. package/dist/mcp/transport/stdio.js +0 -466
  265. package/dist/mcp/transport/stdio.js.map +0 -1
  266. package/dist/mcp/types.d.ts +0 -476
  267. package/dist/mcp/types.d.ts.map +0 -1
  268. package/dist/mcp/types.js +0 -178
  269. package/dist/mcp/types.js.map +0 -1
  270. package/dist/olap/cdc/cdc-buffer.d.ts +0 -92
  271. package/dist/olap/cdc/cdc-buffer.d.ts.map +0 -1
  272. package/dist/olap/cdc/cdc-buffer.js +0 -146
  273. package/dist/olap/cdc/cdc-buffer.js.map +0 -1
  274. package/dist/olap/cdc/cdc-emitter.d.ts +0 -118
  275. package/dist/olap/cdc/cdc-emitter.d.ts.map +0 -1
  276. package/dist/olap/cdc/cdc-emitter.js +0 -217
  277. package/dist/olap/cdc/cdc-emitter.js.map +0 -1
  278. package/dist/olap/cdc/cdc-schema.d.ts +0 -119
  279. package/dist/olap/cdc/cdc-schema.d.ts.map +0 -1
  280. package/dist/olap/cdc/cdc-schema.js +0 -253
  281. package/dist/olap/cdc/cdc-schema.js.map +0 -1
  282. package/dist/olap/cdc/index.d.ts +0 -10
  283. package/dist/olap/cdc/index.d.ts.map +0 -1
  284. package/dist/olap/cdc/index.js +0 -10
  285. package/dist/olap/cdc/index.js.map +0 -1
  286. package/dist/olap/clickhouse/iceberg.d.ts +0 -164
  287. package/dist/olap/clickhouse/iceberg.d.ts.map +0 -1
  288. package/dist/olap/clickhouse/iceberg.js +0 -138
  289. package/dist/olap/clickhouse/iceberg.js.map +0 -1
  290. package/dist/olap/clickhouse/index.d.ts +0 -14
  291. package/dist/olap/clickhouse/index.d.ts.map +0 -1
  292. package/dist/olap/clickhouse/index.js +0 -14
  293. package/dist/olap/clickhouse/index.js.map +0 -1
  294. package/dist/olap/clickhouse/mapper.d.ts +0 -170
  295. package/dist/olap/clickhouse/mapper.d.ts.map +0 -1
  296. package/dist/olap/clickhouse/mapper.js +0 -654
  297. package/dist/olap/clickhouse/mapper.js.map +0 -1
  298. package/dist/olap/clickhouse/olap-backend.d.ts +0 -181
  299. package/dist/olap/clickhouse/olap-backend.d.ts.map +0 -1
  300. package/dist/olap/clickhouse/olap-backend.js +0 -1083
  301. package/dist/olap/clickhouse/olap-backend.js.map +0 -1
  302. package/dist/olap/clickhouse/query-executor.d.ts +0 -163
  303. package/dist/olap/clickhouse/query-executor.d.ts.map +0 -1
  304. package/dist/olap/clickhouse/query-executor.js +0 -560
  305. package/dist/olap/clickhouse/query-executor.js.map +0 -1
  306. package/dist/olap/clickhouse/query.d.ts +0 -134
  307. package/dist/olap/clickhouse/query.d.ts.map +0 -1
  308. package/dist/olap/clickhouse/query.js +0 -512
  309. package/dist/olap/clickhouse/query.js.map +0 -1
  310. package/dist/olap/stage/index.d.ts +0 -6
  311. package/dist/olap/stage/index.d.ts.map +0 -1
  312. package/dist/olap/stage/index.js +0 -6
  313. package/dist/olap/stage/index.js.map +0 -1
  314. package/dist/olap/stage/parser.d.ts +0 -68
  315. package/dist/olap/stage/parser.d.ts.map +0 -1
  316. package/dist/olap/stage/parser.js +0 -293
  317. package/dist/olap/stage/parser.js.map +0 -1
  318. package/dist/olap/stage/router.d.ts +0 -94
  319. package/dist/olap/stage/router.d.ts.map +0 -1
  320. package/dist/olap/stage/router.js +0 -390
  321. package/dist/olap/stage/router.js.map +0 -1
  322. package/dist/rpc/endpoint.d.ts +0 -52
  323. package/dist/rpc/endpoint.d.ts.map +0 -1
  324. package/dist/rpc/endpoint.js +0 -734
  325. package/dist/rpc/endpoint.js.map +0 -1
  326. package/dist/rpc/index.d.ts +0 -34
  327. package/dist/rpc/index.d.ts.map +0 -1
  328. package/dist/rpc/index.js +0 -45
  329. package/dist/rpc/index.js.map +0 -1
  330. package/dist/rpc/rpc-client.d.ts +0 -275
  331. package/dist/rpc/rpc-client.d.ts.map +0 -1
  332. package/dist/rpc/rpc-client.js +0 -735
  333. package/dist/rpc/rpc-client.js.map +0 -1
  334. package/dist/rpc/rpc-target.d.ts +0 -220
  335. package/dist/rpc/rpc-target.d.ts.map +0 -1
  336. package/dist/rpc/rpc-target.js +0 -500
  337. package/dist/rpc/rpc-target.js.map +0 -1
  338. package/dist/rpc/worker-entrypoint.d.ts +0 -159
  339. package/dist/rpc/worker-entrypoint.d.ts.map +0 -1
  340. package/dist/rpc/worker-entrypoint.js +0 -212
  341. package/dist/rpc/worker-entrypoint.js.map +0 -1
  342. package/dist/server.d.ts +0 -18
  343. package/dist/server.d.ts.map +0 -1
  344. package/dist/server.js +0 -129
  345. package/dist/server.js.map +0 -1
  346. package/dist/studio/components/browser/CollectionItem.d.ts +0 -26
  347. package/dist/studio/components/browser/CollectionItem.d.ts.map +0 -1
  348. package/dist/studio/components/browser/CollectionItem.js +0 -143
  349. package/dist/studio/components/browser/CollectionItem.js.map +0 -1
  350. package/dist/studio/components/browser/CollectionTree.d.ts +0 -45
  351. package/dist/studio/components/browser/CollectionTree.d.ts.map +0 -1
  352. package/dist/studio/components/browser/CollectionTree.js +0 -207
  353. package/dist/studio/components/browser/CollectionTree.js.map +0 -1
  354. package/dist/studio/components/browser/ConnectedDatabaseBrowser.d.ts +0 -51
  355. package/dist/studio/components/browser/ConnectedDatabaseBrowser.d.ts.map +0 -1
  356. package/dist/studio/components/browser/ConnectedDatabaseBrowser.js +0 -185
  357. package/dist/studio/components/browser/ConnectedDatabaseBrowser.js.map +0 -1
  358. package/dist/studio/components/browser/DatabaseBrowser.d.ts +0 -46
  359. package/dist/studio/components/browser/DatabaseBrowser.d.ts.map +0 -1
  360. package/dist/studio/components/browser/DatabaseBrowser.js +0 -304
  361. package/dist/studio/components/browser/DatabaseBrowser.js.map +0 -1
  362. package/dist/studio/components/browser/__tests__/CollectionItem.test.d.ts +0 -5
  363. package/dist/studio/components/browser/__tests__/CollectionItem.test.d.ts.map +0 -1
  364. package/dist/studio/components/browser/__tests__/CollectionItem.test.js +0 -169
  365. package/dist/studio/components/browser/__tests__/CollectionItem.test.js.map +0 -1
  366. package/dist/studio/components/browser/__tests__/CollectionTree.test.d.ts +0 -5
  367. package/dist/studio/components/browser/__tests__/CollectionTree.test.d.ts.map +0 -1
  368. package/dist/studio/components/browser/__tests__/CollectionTree.test.js +0 -203
  369. package/dist/studio/components/browser/__tests__/CollectionTree.test.js.map +0 -1
  370. package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.d.ts +0 -8
  371. package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.d.ts.map +0 -1
  372. package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.js +0 -522
  373. package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.js.map +0 -1
  374. package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.d.ts +0 -5
  375. package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.d.ts.map +0 -1
  376. package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.js +0 -518
  377. package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.js.map +0 -1
  378. package/dist/studio/components/browser/__tests__/setup.d.ts +0 -5
  379. package/dist/studio/components/browser/__tests__/setup.d.ts.map +0 -1
  380. package/dist/studio/components/browser/__tests__/setup.js +0 -22
  381. package/dist/studio/components/browser/__tests__/setup.js.map +0 -1
  382. package/dist/studio/components/browser/index.d.ts +0 -15
  383. package/dist/studio/components/browser/index.d.ts.map +0 -1
  384. package/dist/studio/components/browser/index.js +0 -10
  385. package/dist/studio/components/browser/index.js.map +0 -1
  386. package/dist/studio/components/browser/types.d.ts +0 -33
  387. package/dist/studio/components/browser/types.d.ts.map +0 -1
  388. package/dist/studio/components/browser/types.js +0 -5
  389. package/dist/studio/components/browser/types.js.map +0 -1
  390. package/dist/studio/components/connection/ConnectionForm.d.ts +0 -59
  391. package/dist/studio/components/connection/ConnectionForm.d.ts.map +0 -1
  392. package/dist/studio/components/connection/ConnectionForm.js +0 -274
  393. package/dist/studio/components/connection/ConnectionForm.js.map +0 -1
  394. package/dist/studio/components/connection/ConnectionList.d.ts +0 -59
  395. package/dist/studio/components/connection/ConnectionList.d.ts.map +0 -1
  396. package/dist/studio/components/connection/ConnectionList.js +0 -286
  397. package/dist/studio/components/connection/ConnectionList.js.map +0 -1
  398. package/dist/studio/components/connection/ConnectionPanel.d.ts +0 -132
  399. package/dist/studio/components/connection/ConnectionPanel.d.ts.map +0 -1
  400. package/dist/studio/components/connection/ConnectionPanel.js +0 -293
  401. package/dist/studio/components/connection/ConnectionPanel.js.map +0 -1
  402. package/dist/studio/components/connection/__tests__/ConnectionPanel.test.d.ts +0 -8
  403. package/dist/studio/components/connection/__tests__/ConnectionPanel.test.d.ts.map +0 -1
  404. package/dist/studio/components/connection/__tests__/ConnectionPanel.test.js +0 -632
  405. package/dist/studio/components/connection/__tests__/ConnectionPanel.test.js.map +0 -1
  406. package/dist/studio/components/connection/__tests__/setup.d.ts +0 -5
  407. package/dist/studio/components/connection/__tests__/setup.d.ts.map +0 -1
  408. package/dist/studio/components/connection/__tests__/setup.js +0 -11
  409. package/dist/studio/components/connection/__tests__/setup.js.map +0 -1
  410. package/dist/studio/components/connection/index.d.ts +0 -10
  411. package/dist/studio/components/connection/index.d.ts.map +0 -1
  412. package/dist/studio/components/connection/index.js +0 -7
  413. package/dist/studio/components/connection/index.js.map +0 -1
  414. package/dist/studio/components/crud/DeleteDocumentDialog.d.ts +0 -91
  415. package/dist/studio/components/crud/DeleteDocumentDialog.d.ts.map +0 -1
  416. package/dist/studio/components/crud/DeleteDocumentDialog.js +0 -273
  417. package/dist/studio/components/crud/DeleteDocumentDialog.js.map +0 -1
  418. package/dist/studio/components/crud/DocumentEditor.d.ts +0 -32
  419. package/dist/studio/components/crud/DocumentEditor.d.ts.map +0 -1
  420. package/dist/studio/components/crud/DocumentEditor.js +0 -546
  421. package/dist/studio/components/crud/DocumentEditor.js.map +0 -1
  422. package/dist/studio/components/crud/InsertDocumentDialog.d.ts +0 -78
  423. package/dist/studio/components/crud/InsertDocumentDialog.d.ts.map +0 -1
  424. package/dist/studio/components/crud/InsertDocumentDialog.js +0 -323
  425. package/dist/studio/components/crud/InsertDocumentDialog.js.map +0 -1
  426. package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.d.ts +0 -5
  427. package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.d.ts.map +0 -1
  428. package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.js +0 -298
  429. package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.js.map +0 -1
  430. package/dist/studio/components/crud/__tests__/DocumentEditor.test.d.ts +0 -8
  431. package/dist/studio/components/crud/__tests__/DocumentEditor.test.d.ts.map +0 -1
  432. package/dist/studio/components/crud/__tests__/DocumentEditor.test.js +0 -368
  433. package/dist/studio/components/crud/__tests__/DocumentEditor.test.js.map +0 -1
  434. package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.d.ts +0 -2
  435. package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.d.ts.map +0 -1
  436. package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.js +0 -352
  437. package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.js.map +0 -1
  438. package/dist/studio/components/crud/__tests__/setup.d.ts +0 -5
  439. package/dist/studio/components/crud/__tests__/setup.d.ts.map +0 -1
  440. package/dist/studio/components/crud/__tests__/setup.js +0 -22
  441. package/dist/studio/components/crud/__tests__/setup.js.map +0 -1
  442. package/dist/studio/components/crud/index.d.ts +0 -12
  443. package/dist/studio/components/crud/index.d.ts.map +0 -1
  444. package/dist/studio/components/crud/index.js +0 -11
  445. package/dist/studio/components/crud/index.js.map +0 -1
  446. package/dist/studio/hooks/useConnection.d.ts +0 -127
  447. package/dist/studio/hooks/useConnection.d.ts.map +0 -1
  448. package/dist/studio/hooks/useConnection.js +0 -414
  449. package/dist/studio/hooks/useConnection.js.map +0 -1
  450. package/dist/studio/hooks/useDatabaseBrowser.d.ts +0 -107
  451. package/dist/studio/hooks/useDatabaseBrowser.d.ts.map +0 -1
  452. package/dist/studio/hooks/useDatabaseBrowser.js +0 -294
  453. package/dist/studio/hooks/useDatabaseBrowser.js.map +0 -1
  454. package/dist/studio/index.d.ts +0 -16
  455. package/dist/studio/index.d.ts.map +0 -1
  456. package/dist/studio/index.js +0 -14
  457. package/dist/studio/index.js.map +0 -1
  458. package/dist/studio/types/connection.d.ts +0 -266
  459. package/dist/studio/types/connection.d.ts.map +0 -1
  460. package/dist/studio/types/connection.js +0 -159
  461. package/dist/studio/types/connection.js.map +0 -1
  462. package/dist/studio/vitest.config.d.ts +0 -3
  463. package/dist/studio/vitest.config.d.ts.map +0 -1
  464. package/dist/studio/vitest.config.js +0 -33
  465. package/dist/studio/vitest.config.js.map +0 -1
  466. package/dist/translator/aggregation-translator.d.ts +0 -51
  467. package/dist/translator/aggregation-translator.d.ts.map +0 -1
  468. package/dist/translator/aggregation-translator.js +0 -324
  469. package/dist/translator/aggregation-translator.js.map +0 -1
  470. package/dist/translator/dialect.d.ts +0 -131
  471. package/dist/translator/dialect.d.ts.map +0 -1
  472. package/dist/translator/dialect.js +0 -276
  473. package/dist/translator/dialect.js.map +0 -1
  474. package/dist/translator/geo-translator.d.ts +0 -91
  475. package/dist/translator/geo-translator.d.ts.map +0 -1
  476. package/dist/translator/geo-translator.js +0 -587
  477. package/dist/translator/geo-translator.js.map +0 -1
  478. package/dist/translator/hybrid-translator.d.ts +0 -70
  479. package/dist/translator/hybrid-translator.d.ts.map +0 -1
  480. package/dist/translator/hybrid-translator.js +0 -193
  481. package/dist/translator/hybrid-translator.js.map +0 -1
  482. package/dist/translator/index.d.ts +0 -13
  483. package/dist/translator/index.d.ts.map +0 -1
  484. package/dist/translator/index.js +0 -11
  485. package/dist/translator/index.js.map +0 -1
  486. package/dist/translator/query-translator.d.ts +0 -211
  487. package/dist/translator/query-translator.d.ts.map +0 -1
  488. package/dist/translator/query-translator.js +0 -1276
  489. package/dist/translator/query-translator.js.map +0 -1
  490. package/dist/translator/search-highlight.d.ts +0 -83
  491. package/dist/translator/search-highlight.d.ts.map +0 -1
  492. package/dist/translator/search-highlight.js +0 -83
  493. package/dist/translator/search-highlight.js.map +0 -1
  494. package/dist/translator/search-translator.d.ts +0 -155
  495. package/dist/translator/search-translator.d.ts.map +0 -1
  496. package/dist/translator/search-translator.js +0 -241
  497. package/dist/translator/search-translator.js.map +0 -1
  498. package/dist/translator/stages/add-fields-stage.d.ts +0 -7
  499. package/dist/translator/stages/add-fields-stage.d.ts.map +0 -1
  500. package/dist/translator/stages/add-fields-stage.js +0 -72
  501. package/dist/translator/stages/add-fields-stage.js.map +0 -1
  502. package/dist/translator/stages/bucket-stage.d.ts +0 -7
  503. package/dist/translator/stages/bucket-stage.d.ts.map +0 -1
  504. package/dist/translator/stages/bucket-stage.js +0 -87
  505. package/dist/translator/stages/bucket-stage.js.map +0 -1
  506. package/dist/translator/stages/count-stage.d.ts +0 -7
  507. package/dist/translator/stages/count-stage.d.ts.map +0 -1
  508. package/dist/translator/stages/count-stage.js +0 -12
  509. package/dist/translator/stages/count-stage.js.map +0 -1
  510. package/dist/translator/stages/expression-translator.d.ts +0 -68
  511. package/dist/translator/stages/expression-translator.d.ts.map +0 -1
  512. package/dist/translator/stages/expression-translator.js +0 -467
  513. package/dist/translator/stages/expression-translator.js.map +0 -1
  514. package/dist/translator/stages/facet-stage.d.ts +0 -13
  515. package/dist/translator/stages/facet-stage.d.ts.map +0 -1
  516. package/dist/translator/stages/facet-stage.js +0 -26
  517. package/dist/translator/stages/facet-stage.js.map +0 -1
  518. package/dist/translator/stages/fusion-stages.d.ts +0 -118
  519. package/dist/translator/stages/fusion-stages.d.ts.map +0 -1
  520. package/dist/translator/stages/fusion-stages.js +0 -201
  521. package/dist/translator/stages/fusion-stages.js.map +0 -1
  522. package/dist/translator/stages/group-stage.d.ts +0 -8
  523. package/dist/translator/stages/group-stage.d.ts.map +0 -1
  524. package/dist/translator/stages/group-stage.js +0 -123
  525. package/dist/translator/stages/group-stage.js.map +0 -1
  526. package/dist/translator/stages/index.d.ts +0 -24
  527. package/dist/translator/stages/index.d.ts.map +0 -1
  528. package/dist/translator/stages/index.js +0 -24
  529. package/dist/translator/stages/index.js.map +0 -1
  530. package/dist/translator/stages/join-optimizer.d.ts +0 -37
  531. package/dist/translator/stages/join-optimizer.d.ts.map +0 -1
  532. package/dist/translator/stages/join-optimizer.js +0 -93
  533. package/dist/translator/stages/join-optimizer.js.map +0 -1
  534. package/dist/translator/stages/limit-stage.d.ts +0 -7
  535. package/dist/translator/stages/limit-stage.d.ts.map +0 -1
  536. package/dist/translator/stages/limit-stage.js +0 -11
  537. package/dist/translator/stages/limit-stage.js.map +0 -1
  538. package/dist/translator/stages/lookup-stage.d.ts +0 -7
  539. package/dist/translator/stages/lookup-stage.d.ts.map +0 -1
  540. package/dist/translator/stages/lookup-stage.js +0 -73
  541. package/dist/translator/stages/lookup-stage.js.map +0 -1
  542. package/dist/translator/stages/match-stage.d.ts +0 -7
  543. package/dist/translator/stages/match-stage.d.ts.map +0 -1
  544. package/dist/translator/stages/match-stage.js +0 -14
  545. package/dist/translator/stages/match-stage.js.map +0 -1
  546. package/dist/translator/stages/optimizer.d.ts +0 -15
  547. package/dist/translator/stages/optimizer.d.ts.map +0 -1
  548. package/dist/translator/stages/optimizer.js +0 -249
  549. package/dist/translator/stages/optimizer.js.map +0 -1
  550. package/dist/translator/stages/parallel-facet.d.ts +0 -47
  551. package/dist/translator/stages/parallel-facet.d.ts.map +0 -1
  552. package/dist/translator/stages/parallel-facet.js +0 -57
  553. package/dist/translator/stages/parallel-facet.js.map +0 -1
  554. package/dist/translator/stages/project-stage.d.ts +0 -8
  555. package/dist/translator/stages/project-stage.d.ts.map +0 -1
  556. package/dist/translator/stages/project-stage.js +0 -145
  557. package/dist/translator/stages/project-stage.js.map +0 -1
  558. package/dist/translator/stages/search-stage.d.ts +0 -60
  559. package/dist/translator/stages/search-stage.d.ts.map +0 -1
  560. package/dist/translator/stages/search-stage.js +0 -89
  561. package/dist/translator/stages/search-stage.js.map +0 -1
  562. package/dist/translator/stages/skip-stage.d.ts +0 -7
  563. package/dist/translator/stages/skip-stage.d.ts.map +0 -1
  564. package/dist/translator/stages/skip-stage.js +0 -11
  565. package/dist/translator/stages/skip-stage.js.map +0 -1
  566. package/dist/translator/stages/sort-stage.d.ts +0 -7
  567. package/dist/translator/stages/sort-stage.d.ts.map +0 -1
  568. package/dist/translator/stages/sort-stage.js +0 -21
  569. package/dist/translator/stages/sort-stage.js.map +0 -1
  570. package/dist/translator/stages/types.d.ts +0 -136
  571. package/dist/translator/stages/types.d.ts.map +0 -1
  572. package/dist/translator/stages/types.js +0 -5
  573. package/dist/translator/stages/types.js.map +0 -1
  574. package/dist/translator/stages/unwind-stage.d.ts +0 -7
  575. package/dist/translator/stages/unwind-stage.d.ts.map +0 -1
  576. package/dist/translator/stages/unwind-stage.js +0 -61
  577. package/dist/translator/stages/unwind-stage.js.map +0 -1
  578. package/dist/translator/stages/vector-search-stage.d.ts +0 -53
  579. package/dist/translator/stages/vector-search-stage.d.ts.map +0 -1
  580. package/dist/translator/stages/vector-search-stage.js +0 -62
  581. package/dist/translator/stages/vector-search-stage.js.map +0 -1
  582. package/dist/translator/update-translator.d.ts +0 -148
  583. package/dist/translator/update-translator.d.ts.map +0 -1
  584. package/dist/translator/update-translator.js +0 -819
  585. package/dist/translator/update-translator.js.map +0 -1
  586. package/dist/translator/vector-translator.d.ts +0 -89
  587. package/dist/translator/vector-translator.d.ts.map +0 -1
  588. package/dist/translator/vector-translator.js +0 -106
  589. package/dist/translator/vector-translator.js.map +0 -1
  590. package/dist/types/env.d.ts +0 -31
  591. package/dist/types/env.d.ts.map +0 -1
  592. package/dist/types/env.js +0 -5
  593. package/dist/types/env.js.map +0 -1
  594. package/dist/types/function.d.ts +0 -65
  595. package/dist/types/function.d.ts.map +0 -1
  596. package/dist/types/function.js +0 -5
  597. package/dist/types/function.js.map +0 -1
  598. package/dist/types/index.d.ts +0 -137
  599. package/dist/types/index.d.ts.map +0 -1
  600. package/dist/types/index.js +0 -13
  601. package/dist/types/index.js.map +0 -1
  602. package/dist/types/mongodb.d.ts +0 -258
  603. package/dist/types/mongodb.d.ts.map +0 -1
  604. package/dist/types/mongodb.js +0 -5
  605. package/dist/types/mongodb.js.map +0 -1
  606. package/dist/types/objectid.d.ts +0 -130
  607. package/dist/types/objectid.d.ts.map +0 -1
  608. package/dist/types/objectid.js +0 -314
  609. package/dist/types/objectid.js.map +0 -1
  610. package/dist/types/rpc.d.ts +0 -313
  611. package/dist/types/rpc.d.ts.map +0 -1
  612. package/dist/types/rpc.js +0 -136
  613. package/dist/types/rpc.js.map +0 -1
  614. package/dist/types/vectorize.d.ts +0 -136
  615. package/dist/types/vectorize.d.ts.map +0 -1
  616. package/dist/types/vectorize.js +0 -8
  617. package/dist/types/vectorize.js.map +0 -1
  618. package/dist/utils/sql-safety.d.ts +0 -64
  619. package/dist/utils/sql-safety.d.ts.map +0 -1
  620. package/dist/utils/sql-safety.js +0 -112
  621. package/dist/utils/sql-safety.js.map +0 -1
  622. package/dist/validation/document-validator.d.ts +0 -195
  623. package/dist/validation/document-validator.d.ts.map +0 -1
  624. package/dist/validation/document-validator.js +0 -529
  625. package/dist/validation/document-validator.js.map +0 -1
  626. package/dist/vectorize/document-serializer.d.ts +0 -119
  627. package/dist/vectorize/document-serializer.d.ts.map +0 -1
  628. package/dist/vectorize/document-serializer.js +0 -320
  629. package/dist/vectorize/document-serializer.js.map +0 -1
  630. package/dist/wire/auth/index.d.ts +0 -5
  631. package/dist/wire/auth/index.d.ts.map +0 -1
  632. package/dist/wire/auth/index.js +0 -5
  633. package/dist/wire/auth/index.js.map +0 -1
  634. package/dist/wire/auth/scram.d.ts +0 -160
  635. package/dist/wire/auth/scram.d.ts.map +0 -1
  636. package/dist/wire/auth/scram.js +0 -425
  637. package/dist/wire/auth/scram.js.map +0 -1
  638. package/dist/wire/backend/interface.d.ts +0 -168
  639. package/dist/wire/backend/interface.d.ts.map +0 -1
  640. package/dist/wire/backend/interface.js +0 -10
  641. package/dist/wire/backend/interface.js.map +0 -1
  642. package/dist/wire/backend/local-sqlite.d.ts +0 -89
  643. package/dist/wire/backend/local-sqlite.d.ts.map +0 -1
  644. package/dist/wire/backend/local-sqlite.js +0 -1002
  645. package/dist/wire/backend/local-sqlite.js.map +0 -1
  646. package/dist/wire/backend/query-router.d.ts +0 -197
  647. package/dist/wire/backend/query-router.d.ts.map +0 -1
  648. package/dist/wire/backend/query-router.js +0 -590
  649. package/dist/wire/backend/query-router.js.map +0 -1
  650. package/dist/wire/backend/validation.d.ts +0 -26
  651. package/dist/wire/backend/validation.d.ts.map +0 -1
  652. package/dist/wire/backend/validation.js +0 -79
  653. package/dist/wire/backend/validation.js.map +0 -1
  654. package/dist/wire/backend/workers-proxy.d.ts +0 -95
  655. package/dist/wire/backend/workers-proxy.d.ts.map +0 -1
  656. package/dist/wire/backend/workers-proxy.js +0 -429
  657. package/dist/wire/backend/workers-proxy.js.map +0 -1
  658. package/dist/wire/commands/admin.d.ts +0 -49
  659. package/dist/wire/commands/admin.d.ts.map +0 -1
  660. package/dist/wire/commands/admin.js +0 -272
  661. package/dist/wire/commands/admin.js.map +0 -1
  662. package/dist/wire/commands/aggregate.d.ts +0 -15
  663. package/dist/wire/commands/aggregate.d.ts.map +0 -1
  664. package/dist/wire/commands/aggregate.js +0 -98
  665. package/dist/wire/commands/aggregate.js.map +0 -1
  666. package/dist/wire/commands/auth.d.ts +0 -58
  667. package/dist/wire/commands/auth.d.ts.map +0 -1
  668. package/dist/wire/commands/auth.js +0 -158
  669. package/dist/wire/commands/auth.js.map +0 -1
  670. package/dist/wire/commands/crud.d.ts +0 -49
  671. package/dist/wire/commands/crud.d.ts.map +0 -1
  672. package/dist/wire/commands/crud.js +0 -336
  673. package/dist/wire/commands/crud.js.map +0 -1
  674. package/dist/wire/commands/hello.d.ts +0 -35
  675. package/dist/wire/commands/hello.d.ts.map +0 -1
  676. package/dist/wire/commands/hello.js +0 -204
  677. package/dist/wire/commands/hello.js.map +0 -1
  678. package/dist/wire/commands/index.d.ts +0 -24
  679. package/dist/wire/commands/index.d.ts.map +0 -1
  680. package/dist/wire/commands/index.js +0 -145
  681. package/dist/wire/commands/index.js.map +0 -1
  682. package/dist/wire/commands/router.d.ts +0 -46
  683. package/dist/wire/commands/router.d.ts.map +0 -1
  684. package/dist/wire/commands/router.js +0 -151
  685. package/dist/wire/commands/router.js.map +0 -1
  686. package/dist/wire/commands/types.d.ts +0 -51
  687. package/dist/wire/commands/types.d.ts.map +0 -1
  688. package/dist/wire/commands/types.js +0 -15
  689. package/dist/wire/commands/types.js.map +0 -1
  690. package/dist/wire/index.d.ts +0 -15
  691. package/dist/wire/index.d.ts.map +0 -1
  692. package/dist/wire/index.js +0 -19
  693. package/dist/wire/index.js.map +0 -1
  694. package/dist/wire/message.d.ts +0 -49
  695. package/dist/wire/message.d.ts.map +0 -1
  696. package/dist/wire/message.js +0 -299
  697. package/dist/wire/message.js.map +0 -1
  698. package/dist/wire/server.d.ts +0 -145
  699. package/dist/wire/server.d.ts.map +0 -1
  700. package/dist/wire/server.js +0 -284
  701. package/dist/wire/server.js.map +0 -1
  702. package/dist/wire/types.d.ts +0 -140
  703. package/dist/wire/types.d.ts.map +0 -1
  704. package/dist/wire/types.js +0 -64
  705. package/dist/wire/types.js.map +0 -1
  706. package/dist/worker.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/sql-safety.ts","../../src/wire/backend/validation.ts","../../src/wire/backend/local-sqlite.ts","../../src/wire/types.ts","../../src/wire/message.ts","../../src/types/rpc.ts","../../src/wire/commands/types.ts","../../src/wire/commands/hello.ts","../../src/wire/commands/admin.ts","../../src/wire/commands/crud.ts","../../src/wire/commands/aggregate.ts","../../src/wire/commands/index.ts","../../src/wire/commands/auth.ts","../../src/wire/auth/scram.ts","../../src/wire/commands/router.ts","../../src/wire/server.ts","../../package.json","../../src/wire/backend/workers-proxy.ts","../../src/cli/server.ts","../../src/cli/index.ts"],"names":["CURSOR_TIMEOUT_MS","updatedDoc","result","successResponse","errorResponse","init_types","ObjectId","Long","Binary","serverNonce","conversationId","serverFirstMessage","conv","LocalSQLiteBackend","WireProtocolServer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * SQL Safety Utilities\n *\n * Functions to validate and sanitize field names and identifiers\n * to prevent SQL injection attacks.\n */\n\n/**\n * Regular expression pattern for valid MongoDB field names.\n * Allows alphanumeric characters, underscores, dots (for nested paths),\n * hyphens, and dollar signs (for operators/special fields).\n */\nconst SAFE_FIELD_PATTERN = /^[a-zA-Z0-9_.$-]+$/\n\n/**\n * Regular expression pattern for valid SQL identifiers.\n * Only allows alphanumeric characters and underscores.\n */\nconst SAFE_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/\n\n/**\n * Validates and returns a field name/path for safe use in SQL json_extract expressions.\n * Prevents SQL injection by only allowing safe characters in field paths.\n *\n * @param field - The field name or dot-notation path to validate\n * @returns The validated field name (unchanged if valid)\n * @throws Error if field name contains invalid characters\n *\n * @example\n * validateFieldPath('name') // returns 'name'\n * validateFieldPath('user.address') // returns 'user.address'\n * validateFieldPath(\"foo'; DROP--\") // throws Error\n */\nexport function validateFieldPath(field: string): string {\n if (!field || field.length === 0) {\n throw new Error('Field name cannot be empty')\n }\n\n // Check for null bytes\n if (field.includes('\\0')) {\n throw new Error('Field name cannot contain null characters')\n }\n\n // Check against safe pattern\n if (!SAFE_FIELD_PATTERN.test(field)) {\n throw new Error(\n `Invalid field name: \"${field}\". Field names can only contain alphanumeric characters, underscores, dots, hyphens, and dollar signs.`\n )\n }\n\n // Validate dot notation structure\n if (field.includes('..') || field.startsWith('.') || field.endsWith('.')) {\n throw new Error(\n `Invalid field path: \"${field}\". Field paths cannot have consecutive, leading, or trailing dots.`\n )\n }\n\n return field\n}\n\n/**\n * Validates an identifier (table name, index name, column name) for safe use in SQL.\n * Only allows alphanumeric characters and underscores, must start with letter or underscore.\n *\n * @param identifier - The identifier to validate\n * @returns The validated identifier (unchanged if valid)\n * @throws Error if identifier contains invalid characters\n *\n * @example\n * validateIdentifier('users') // returns 'users'\n * validateIdentifier('my_table_1') // returns 'my_table_1'\n * validateIdentifier('1table') // throws Error (starts with number)\n * validateIdentifier(\"users'; DROP--\")// throws Error\n */\nexport function validateIdentifier(identifier: string): string {\n if (!identifier || identifier.length === 0) {\n throw new Error('Identifier cannot be empty')\n }\n\n // Check for null bytes\n if (identifier.includes('\\0')) {\n throw new Error('Identifier cannot contain null characters')\n }\n\n // Check against safe pattern\n if (!SAFE_IDENTIFIER_PATTERN.test(identifier)) {\n throw new Error(\n `Invalid identifier: \"${identifier}\". Identifiers can only contain alphanumeric characters and underscores, and must start with a letter or underscore.`\n )\n }\n\n return identifier\n}\n\n/**\n * Creates a safe JSON path expression for use in json_extract().\n * Validates the field name and returns the properly formatted path.\n *\n * @param field - The field name or dot-notation path\n * @returns The JSON path string (e.g., '$.field.name')\n * @throws Error if field name is invalid\n *\n * @example\n * safeJsonPath('name') // returns '$.name'\n * safeJsonPath('user.address') // returns '$.user.address'\n * safeJsonPath('$special') // returns '$.$special' (preserves leading $)\n */\nexport function safeJsonPath(field: string): string {\n const validField = validateFieldPath(field)\n return validField.startsWith('$') ? validField : `$.${validField}`\n}\n\n/**\n * Creates a safe json_extract expression for use in SQL.\n * Validates the field name and returns the complete expression.\n *\n * @param dataColumn - The name of the JSON data column (e.g., 'data', 'value')\n * @param field - The field name or dot-notation path\n * @returns The json_extract expression (e.g., \"json_extract(data, '$.field')\")\n * @throws Error if field name is invalid\n *\n * @example\n * safeJsonExtract('data', 'name') // returns \"json_extract(data, '$.name')\"\n * safeJsonExtract('value', 'a.b') // returns \"json_extract(value, '$.a.b')\"\n */\nexport function safeJsonExtract(dataColumn: string, field: string): string {\n validateIdentifier(dataColumn)\n const jsonPath = safeJsonPath(field)\n return `json_extract(${dataColumn}, '${jsonPath}')`\n}\n","/**\n * Validation functions for database and collection names.\n *\n * These functions are critical for security - they prevent path traversal attacks\n * and SQL injection attempts through malicious database/collection names.\n */\n\n/**\n * Validate and sanitize a database name to prevent path traversal attacks.\n * Throws an error if the name contains dangerous characters or patterns.\n *\n * SECURITY: This function is critical for preventing attacks where malicious\n * database names like \"../../../etc/passwd\" could be used to read/write\n * files outside the data directory.\n *\n * @throws Error if the database name is invalid or contains path traversal attempts\n */\nexport function sanitizeDatabaseName(name: string): string {\n // Reject empty names\n if (!name || typeof name !== 'string') {\n throw new Error('Database name must be a non-empty string')\n }\n\n // Reject path traversal patterns\n if (name.includes('..') || name.includes('/') || name.includes('\\\\')) {\n throw new Error(`Invalid database name \"${name}\": contains path traversal characters`)\n }\n\n // Reject null bytes (can bypass path checks in some systems)\n if (name.includes('\\0')) {\n throw new Error('Invalid database name: contains null byte')\n }\n\n // Reject names starting with dots (hidden files)\n if (name.startsWith('.')) {\n throw new Error(`Invalid database name \"${name}\": cannot start with a dot`)\n }\n\n // Reject names that are too long (filesystem safety)\n if (name.length > 255) {\n throw new Error(`Database name too long: ${name.length} characters (max 255)`)\n }\n\n // Only allow alphanumeric, underscore, and hyphen (safe filename characters)\n // This is more restrictive than MongoDB but appropriate for filesystem safety\n const validNameRegex = /^[a-zA-Z0-9_-]+$/\n if (!validNameRegex.test(name)) {\n throw new Error(\n `Invalid database name \"${name}\": only alphanumeric characters, underscores, and hyphens are allowed`\n )\n }\n\n return name\n}\n\n/**\n * Validate a collection name to prevent injection attacks.\n * Collection names are stored in the database, not used in file paths,\n * but validation prevents SQL-related issues and maintains consistency.\n *\n * @throws Error if the collection name is invalid\n */\nexport function validateCollectionName(name: string): string {\n // Reject empty names\n if (!name || typeof name !== 'string') {\n throw new Error('Collection name must be a non-empty string')\n }\n\n // Reject null bytes\n if (name.includes('\\0')) {\n throw new Error('Invalid collection name: contains null byte')\n }\n\n // Reject names that are too long\n if (name.length > 255) {\n throw new Error(`Collection name too long: ${name.length} characters (max 255)`)\n }\n\n // MongoDB allows more characters in collection names, but we restrict\n // to prevent potential issues. Allow alphanumeric, underscore, hyphen, and dot.\n // Dots are allowed for namespacing (e.g., \"system.users\")\n const validNameRegex = /^[a-zA-Z_][a-zA-Z0-9_.-]*$/\n if (!validNameRegex.test(name)) {\n throw new Error(\n `Invalid collection name \"${name}\": must start with a letter or underscore, and contain only alphanumeric characters, underscores, hyphens, and dots`\n )\n }\n\n // Reject system collection prefixes unless it's a known system collection\n if (name.startsWith('system.') && !['system.users', 'system.indexes', 'system.namespaces'].includes(name)) {\n throw new Error(`Invalid collection name \"${name}\": cannot use reserved 'system.' prefix`)\n }\n\n return name\n}\n","/**\n * Local SQLite Backend\n *\n * Implements MondoBackend using Bun's native SQLite for local development.\n * Simplified implementation for wire protocol server.\n */\n\nimport { Database, type SQLQueryBindings } from 'bun:sqlite'\nimport { ObjectId, type Document } from 'bson'\nimport { validateFieldPath, safeJsonPath } from '../../utils/sql-safety.js'\nimport { sanitizeDatabaseName, validateCollectionName } from './validation.js'\nimport type {\n MondoBackend,\n DatabaseInfo,\n CollectionInfo,\n FindOptions,\n FindResult,\n InsertResult,\n UpdateResult,\n DeleteResult,\n AggregateResult,\n CollStats,\n DbStats,\n IndexInfo,\n IndexSpec,\n CursorState,\n} from './interface.js'\n\n// Re-export validation functions for backwards compatibility\nexport { sanitizeDatabaseName, validateCollectionName } from './validation.js'\n\n/** Default batch size for cursor results */\nconst DEFAULT_BATCH_SIZE = 101\n\n/** Cursor timeout in milliseconds (10 minutes) */\nconst CURSOR_TIMEOUT_MS = 10 * 60 * 1000\n\ntype SQLParams = SQLQueryBindings[]\n\n/**\n * Local SQLite Backend\n */\nexport class LocalSQLiteBackend implements MondoBackend {\n private databases: Map<string, Database> = new Map()\n private cursors: Map<bigint, CursorState> = new Map()\n private nextCursorId = 1n\n private dataDir: string\n\n constructor(dataDir: string = '.mongodo') {\n this.dataDir = dataDir\n\n // Ensure data directory exists\n const fs = require('fs')\n if (!fs.existsSync(dataDir)) {\n fs.mkdirSync(dataDir, { recursive: true })\n }\n\n // Start cursor cleanup interval\n setInterval(() => this.cleanupExpiredCursors(), 60000)\n }\n\n /**\n * Get or create a database connection\n */\n private getDatabase(name: string): Database {\n // SECURITY: Validate database name to prevent path traversal attacks\n const safeName = sanitizeDatabaseName(name)\n\n let db = this.databases.get(safeName)\n if (!db) {\n const dbPath = `${this.dataDir}/${safeName}.sqlite`\n db = new Database(dbPath)\n this.initializeSchema(db)\n this.databases.set(safeName, db)\n }\n return db\n }\n\n /**\n * Initialize the database schema\n */\n private initializeSchema(db: Database): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS collections (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n options TEXT DEFAULT '{}'\n );\n\n CREATE TABLE IF NOT EXISTS documents (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n collection_id INTEGER NOT NULL,\n _id TEXT NOT NULL,\n data TEXT NOT NULL DEFAULT '{}',\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE,\n UNIQUE(collection_id, _id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_documents_id ON documents(_id);\n CREATE INDEX IF NOT EXISTS idx_documents_collection_id ON documents(collection_id, _id);\n\n CREATE TABLE IF NOT EXISTS indexes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n collection_id INTEGER NOT NULL,\n name TEXT NOT NULL,\n key TEXT NOT NULL,\n options TEXT DEFAULT '{}',\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE,\n UNIQUE(collection_id, name)\n );\n `)\n }\n\n /**\n * Get collection ID, creating collection if it doesn't exist\n */\n private getOrCreateCollectionId(db: Database, name: string): number {\n // SECURITY: Validate collection name\n const safeName = validateCollectionName(name)\n\n const existing = db.query('SELECT id FROM collections WHERE name = ?').get(safeName) as\n | { id: number }\n | null\n\n if (existing) {\n return existing.id\n }\n\n const result = db.query('INSERT INTO collections (name) VALUES (?) RETURNING id').get(safeName) as {\n id: number\n }\n return result.id\n }\n\n /**\n * Get collection ID or null if not found\n */\n private getCollectionId(db: Database, name: string): number | null {\n // SECURITY: Validate collection name\n const safeName = validateCollectionName(name)\n\n const result = db.query('SELECT id FROM collections WHERE name = ?').get(safeName) as\n | { id: number }\n | null\n return result?.id ?? null\n }\n\n // ============ Database Operations ============\n\n async listDatabases(): Promise<DatabaseInfo[]> {\n const fs = require('fs')\n const path = require('path')\n\n let files: string[] = []\n try {\n files = fs.readdirSync(this.dataDir) as string[]\n } catch {\n // Directory doesn't exist\n }\n\n const databases: DatabaseInfo[] = []\n\n for (const file of files) {\n if (file.endsWith('.sqlite')) {\n const name = file.replace('.sqlite', '')\n const filePath = path.join(this.dataDir, file)\n const stats = fs.statSync(filePath)\n\n databases.push({\n name,\n sizeOnDisk: stats.size,\n empty: stats.size < 1000,\n })\n }\n }\n\n // Always include admin database\n if (!databases.find((d) => d.name === 'admin')) {\n databases.unshift({ name: 'admin', sizeOnDisk: 0, empty: true })\n }\n\n return databases\n }\n\n async createDatabase(name: string): Promise<void> {\n this.getDatabase(name)\n }\n\n async dropDatabase(name: string): Promise<void> {\n // SECURITY: Validate database name to prevent path traversal attacks\n const safeName = sanitizeDatabaseName(name)\n\n const db = this.databases.get(safeName)\n if (db) {\n db.close()\n this.databases.delete(safeName)\n }\n\n const fs = require('fs')\n const dbPath = `${this.dataDir}/${safeName}.sqlite`\n if (fs.existsSync(dbPath)) {\n fs.unlinkSync(dbPath)\n }\n }\n\n async databaseExists(name: string): Promise<boolean> {\n // SECURITY: Validate database name to prevent path traversal attacks\n const safeName = sanitizeDatabaseName(name)\n\n const fs = require('fs')\n return fs.existsSync(`${this.dataDir}/${safeName}.sqlite`)\n }\n\n // ============ Collection Operations ============\n\n async listCollections(dbName: string, filter?: Document): Promise<CollectionInfo[]> {\n const db = this.getDatabase(dbName)\n\n let query = 'SELECT name, options FROM collections'\n const params: SQLParams = []\n\n if (filter?.name && typeof filter.name === 'string') {\n query += ' WHERE name = ?'\n params.push(filter.name)\n }\n\n const rows = db.query(query).all(...params) as Array<{ name: string; options: string }>\n\n return rows.map((row) => ({\n name: row.name,\n type: 'collection' as const,\n options: JSON.parse(row.options) as Document,\n info: { readOnly: false },\n }))\n }\n\n async createCollection(dbName: string, name: string, options?: Document): Promise<void> {\n // SECURITY: Validate collection name\n const safeName = validateCollectionName(name)\n\n const db = this.getDatabase(dbName)\n const optionsJson = JSON.stringify(options || {})\n db.query('INSERT OR IGNORE INTO collections (name, options) VALUES (?, ?)').run(safeName, optionsJson)\n }\n\n async dropCollection(dbName: string, name: string): Promise<void> {\n // SECURITY: Validate collection name\n const safeName = validateCollectionName(name)\n\n const db = this.getDatabase(dbName)\n db.query('DELETE FROM collections WHERE name = ?').run(safeName)\n }\n\n async collectionExists(dbName: string, name: string): Promise<boolean> {\n // SECURITY: Validate collection name\n const safeName = validateCollectionName(name)\n\n const db = this.getDatabase(dbName)\n const result = db.query('SELECT 1 FROM collections WHERE name = ? LIMIT 1').get(safeName)\n return result !== null\n }\n\n async collStats(dbName: string, collection: string): Promise<CollStats> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (!collectionId) {\n return {\n ns: `${dbName}.${collection}`,\n count: 0,\n size: 0,\n avgObjSize: 0,\n storageSize: 0,\n totalIndexSize: 0,\n nindexes: 1,\n indexSizes: { _id_: 0 },\n }\n }\n\n const stats = db\n .query(`\n SELECT COUNT(*) as count, COALESCE(SUM(LENGTH(data)), 0) as size\n FROM documents WHERE collection_id = ?\n `)\n .get(collectionId) as { count: number; size: number }\n\n return {\n ns: `${dbName}.${collection}`,\n count: stats.count,\n size: stats.size,\n avgObjSize: stats.count > 0 ? stats.size / stats.count : 0,\n storageSize: stats.size,\n totalIndexSize: stats.count * 50,\n nindexes: 1,\n indexSizes: { _id_: stats.count * 50 },\n }\n }\n\n async dbStats(dbName: string): Promise<DbStats> {\n const db = this.getDatabase(dbName)\n\n const collectionStats = db\n .query('SELECT COUNT(DISTINCT id) as collections FROM collections')\n .get() as { collections: number }\n\n const docStats = db\n .query('SELECT COUNT(*) as objects, COALESCE(SUM(LENGTH(data)), 0) as dataSize FROM documents')\n .get() as { objects: number; dataSize: number }\n\n return {\n db: dbName,\n collections: collectionStats.collections,\n views: 0,\n objects: docStats.objects,\n avgObjSize: docStats.objects > 0 ? docStats.dataSize / docStats.objects : 0,\n dataSize: docStats.dataSize,\n storageSize: docStats.dataSize,\n indexes: collectionStats.collections,\n indexSize: docStats.objects * 50,\n }\n }\n\n // ============ CRUD Operations ============\n\n async find(dbName: string, collection: string, options: FindOptions): Promise<FindResult> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (!collectionId) {\n return { documents: [], cursorId: 0n, hasMore: false }\n }\n\n let sql = 'SELECT _id, data FROM documents WHERE collection_id = ?'\n const params: SQLParams = [collectionId]\n\n // Build filter (simplified)\n if (options.filter && Object.keys(options.filter).length > 0) {\n const filterSql = this.buildFilterSql(options.filter, params)\n if (filterSql) {\n sql += ` AND (${filterSql})`\n }\n }\n\n // Add sorting\n if (options.sort) {\n const sortClauses: string[] = []\n for (const [field, direction] of Object.entries(options.sort)) {\n const dir = direction === -1 ? 'DESC' : 'ASC'\n if (field === '_id') {\n sortClauses.push(`_id ${dir}`)\n } else {\n // Validate field name to prevent SQL injection\n const safePath = safeJsonPath(validateFieldPath(field))\n sortClauses.push(`json_extract(data, '${safePath}') ${dir}`)\n }\n }\n if (sortClauses.length > 0) {\n sql += ` ORDER BY ${sortClauses.join(', ')}`\n }\n }\n\n // Add limit and offset\n if (options.limit && options.limit > 0) {\n sql += ` LIMIT ${options.limit}`\n }\n if (options.skip && options.skip > 0) {\n sql += ` OFFSET ${options.skip}`\n }\n\n const rows = db.query(sql).all(...params) as Array<{ _id: string; data: string }>\n\n let documents = rows.map((row) => {\n const doc = JSON.parse(row.data) as Document\n doc._id = this.parseId(row._id)\n return doc\n })\n\n // Apply projection\n if (options.projection) {\n documents = documents.map((doc) => this.applyProjection(doc, options.projection!))\n }\n\n const batchSize = options.batchSize || DEFAULT_BATCH_SIZE\n\n // Handle cursor for large result sets\n if (documents.length > batchSize) {\n const cursorId = this.nextCursorId++\n this.cursors.set(cursorId, {\n id: cursorId,\n namespace: `${dbName}.${collection}`,\n documents,\n position: batchSize,\n batchSize,\n createdAt: Date.now(),\n })\n\n return {\n documents: documents.slice(0, batchSize),\n cursorId,\n hasMore: true,\n }\n }\n\n return { documents, cursorId: 0n, hasMore: false }\n }\n\n async insertOne(dbName: string, collection: string, doc: Document): Promise<InsertResult> {\n return this.insertMany(dbName, collection, [doc])\n }\n\n async insertMany(dbName: string, collection: string, docs: Document[]): Promise<InsertResult> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getOrCreateCollectionId(db, collection)\n\n const insertedIds = new Map<number, unknown>()\n let insertedCount = 0\n\n const stmt = db.prepare('INSERT INTO documents (collection_id, _id, data) VALUES (?, ?, ?)')\n\n db.transaction(() => {\n for (let i = 0; i < docs.length; i++) {\n const doc = { ...docs[i] }\n\n if (!doc._id) {\n doc._id = new ObjectId()\n }\n\n const idStr = this.serializeId(doc._id)\n const dataJson = JSON.stringify(doc)\n\n stmt.run(collectionId, idStr, dataJson)\n insertedIds.set(i, doc._id)\n insertedCount++\n }\n })()\n\n return { acknowledged: true, insertedIds, insertedCount }\n }\n\n async updateOne(\n dbName: string,\n collection: string,\n filter: Document,\n update: Document,\n options?: { upsert?: boolean }\n ): Promise<UpdateResult> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (!collectionId && !options?.upsert) {\n return { acknowledged: true, matchedCount: 0, modifiedCount: 0, upsertedCount: 0 }\n }\n\n // Find the document\n let sql = 'SELECT id, _id, data FROM documents WHERE collection_id = ?'\n const params: SQLParams = [collectionId || 0]\n\n const filterSql = this.buildFilterSql(filter, params)\n if (filterSql) {\n sql += ` AND (${filterSql})`\n }\n sql += ' LIMIT 1'\n\n const row = db.query(sql).get(...params) as { id: number; _id: string; data: string } | null\n\n if (!row) {\n if (options?.upsert) {\n const cid = this.getOrCreateCollectionId(db, collection)\n const newDoc = { ...filter } as Document\n const updatedDoc = this.applyUpdate(newDoc, update)\n if (!updatedDoc._id) {\n updatedDoc._id = new ObjectId()\n }\n const idStr = this.serializeId(updatedDoc._id)\n db.query('INSERT INTO documents (collection_id, _id, data) VALUES (?, ?, ?)').run(\n cid,\n idStr,\n JSON.stringify(updatedDoc)\n )\n return {\n acknowledged: true,\n matchedCount: 0,\n modifiedCount: 0,\n upsertedId: updatedDoc._id,\n upsertedCount: 1,\n }\n }\n return { acknowledged: true, matchedCount: 0, modifiedCount: 0, upsertedCount: 0 }\n }\n\n const doc = JSON.parse(row.data) as Document\n doc._id = this.parseId(row._id)\n const updatedDoc = this.applyUpdate(doc, update)\n\n db.query('UPDATE documents SET data = ? WHERE id = ?').run(JSON.stringify(updatedDoc), row.id)\n\n return { acknowledged: true, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 }\n }\n\n async updateMany(\n dbName: string,\n collection: string,\n filter: Document,\n update: Document,\n options?: { upsert?: boolean }\n ): Promise<UpdateResult> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (!collectionId) {\n if (options?.upsert) {\n const result = await this.updateOne(dbName, collection, filter, update, options)\n return result\n }\n return { acknowledged: true, matchedCount: 0, modifiedCount: 0, upsertedCount: 0 }\n }\n\n let sql = 'SELECT id, _id, data FROM documents WHERE collection_id = ?'\n const params: SQLParams = [collectionId]\n\n const filterSql = this.buildFilterSql(filter, params)\n if (filterSql) {\n sql += ` AND (${filterSql})`\n }\n\n const rows = db.query(sql).all(...params) as Array<{ id: number; _id: string; data: string }>\n\n if (rows.length === 0 && options?.upsert) {\n const result = await this.updateOne(dbName, collection, filter, update, options)\n return result\n }\n\n const stmt = db.prepare('UPDATE documents SET data = ? WHERE id = ?')\n\n db.transaction(() => {\n for (const row of rows) {\n const doc = JSON.parse(row.data) as Document\n doc._id = this.parseId(row._id)\n const updatedDoc = this.applyUpdate(doc, update)\n stmt.run(JSON.stringify(updatedDoc), row.id)\n }\n })()\n\n return {\n acknowledged: true,\n matchedCount: rows.length,\n modifiedCount: rows.length,\n upsertedCount: 0,\n }\n }\n\n async deleteOne(dbName: string, collection: string, filter: Document): Promise<DeleteResult> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (!collectionId) {\n return { acknowledged: true, deletedCount: 0 }\n }\n\n // Find one document first\n let sql = 'SELECT id FROM documents WHERE collection_id = ?'\n const params: SQLParams = [collectionId]\n\n const filterSql = this.buildFilterSql(filter, params)\n if (filterSql) {\n sql += ` AND (${filterSql})`\n }\n sql += ' LIMIT 1'\n\n const row = db.query(sql).get(...params) as { id: number } | null\n\n if (!row) {\n return { acknowledged: true, deletedCount: 0 }\n }\n\n db.query('DELETE FROM documents WHERE id = ?').run(row.id)\n return { acknowledged: true, deletedCount: 1 }\n }\n\n async deleteMany(dbName: string, collection: string, filter: Document): Promise<DeleteResult> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (!collectionId) {\n return { acknowledged: true, deletedCount: 0 }\n }\n\n let sql = 'DELETE FROM documents WHERE collection_id = ?'\n const params: SQLParams = [collectionId]\n\n const filterSql = this.buildFilterSql(filter, params)\n if (filterSql) {\n sql += ` AND (${filterSql})`\n }\n\n const result = db.query(sql).run(...params)\n return { acknowledged: true, deletedCount: result.changes }\n }\n\n // ============ Count & Distinct ============\n\n async count(dbName: string, collection: string, query?: Document): Promise<number> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (!collectionId) {\n return 0\n }\n\n let sql = 'SELECT COUNT(*) as count FROM documents WHERE collection_id = ?'\n const params: SQLParams = [collectionId]\n\n if (query && Object.keys(query).length > 0) {\n const filterSql = this.buildFilterSql(query, params)\n if (filterSql) {\n sql += ` AND (${filterSql})`\n }\n }\n\n const result = db.query(sql).get(...params) as { count: number }\n return result.count\n }\n\n async distinct(\n dbName: string,\n collection: string,\n field: string,\n query?: Document\n ): Promise<unknown[]> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (!collectionId) {\n return []\n }\n\n let sql: string\n if (field === '_id') {\n sql = 'SELECT DISTINCT _id as value FROM documents WHERE collection_id = ?'\n } else {\n // Validate field name to prevent SQL injection\n const safePath = safeJsonPath(validateFieldPath(field))\n sql = `SELECT DISTINCT json_extract(data, '${safePath}') as value FROM documents WHERE collection_id = ?`\n }\n const params: SQLParams = [collectionId]\n\n if (query && Object.keys(query).length > 0) {\n const filterSql = this.buildFilterSql(query, params)\n if (filterSql) {\n sql += ` AND (${filterSql})`\n }\n }\n\n const rows = db.query(sql).all(...params) as Array<{ value: unknown }>\n return rows.map((r) => r.value).filter((v) => v !== null)\n }\n\n // ============ Aggregation ============\n\n async aggregate(\n dbName: string,\n collection: string,\n pipeline: Document[],\n options?: { batchSize?: number }\n ): Promise<AggregateResult> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (!collectionId) {\n return { documents: [], cursorId: 0n, hasMore: false }\n }\n\n // Get all documents for in-memory processing\n const rows = db\n .query('SELECT _id, data FROM documents WHERE collection_id = ?')\n .all(collectionId) as Array<{ _id: string; data: string }>\n\n let documents = rows.map((row) => {\n const doc = JSON.parse(row.data) as Document\n doc._id = this.parseId(row._id)\n return doc\n })\n\n // Apply pipeline stages\n documents = this.applyPipeline(documents, pipeline)\n\n const batchSize = options?.batchSize || DEFAULT_BATCH_SIZE\n\n if (documents.length > batchSize) {\n const cursorId = this.nextCursorId++\n this.cursors.set(cursorId, {\n id: cursorId,\n namespace: `${dbName}.${collection}`,\n documents,\n position: batchSize,\n batchSize,\n createdAt: Date.now(),\n })\n\n return {\n documents: documents.slice(0, batchSize),\n cursorId,\n hasMore: true,\n }\n }\n\n return { documents, cursorId: 0n, hasMore: false }\n }\n\n // ============ Index Operations ============\n\n async listIndexes(dbName: string, collection: string): Promise<IndexInfo[]> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n const indexes: IndexInfo[] = [{ v: 2, key: { _id: 1 }, name: '_id_' }]\n\n if (!collectionId) {\n return indexes\n }\n\n const rows = db\n .query('SELECT name, key, options FROM indexes WHERE collection_id = ?')\n .all(collectionId) as Array<{ name: string; key: string; options: string }>\n\n for (const row of rows) {\n indexes.push({\n v: 2,\n key: JSON.parse(row.key) as Document,\n name: row.name,\n ...(JSON.parse(row.options) as Document),\n })\n }\n\n return indexes\n }\n\n async createIndexes(dbName: string, collection: string, indexes: IndexSpec[]): Promise<string[]> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getOrCreateCollectionId(db, collection)\n\n const createdNames: string[] = []\n const stmt = db.prepare(\n 'INSERT OR IGNORE INTO indexes (collection_id, name, key, options) VALUES (?, ?, ?, ?)'\n )\n\n for (const spec of indexes) {\n const name = spec.name || this.generateIndexName(spec.key)\n const keyJson = JSON.stringify(spec.key)\n const options: Document = {}\n if (spec.unique) options.unique = true\n if (spec.sparse) options.sparse = true\n\n const result = stmt.run(collectionId, name, keyJson, JSON.stringify(options))\n if (result.changes > 0) {\n createdNames.push(name)\n }\n }\n\n return createdNames\n }\n\n async dropIndex(dbName: string, collection: string, indexName: string): Promise<void> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (collectionId) {\n db.query('DELETE FROM indexes WHERE collection_id = ? AND name = ?').run(\n collectionId,\n indexName\n )\n }\n }\n\n async dropIndexes(dbName: string, collection: string): Promise<void> {\n const db = this.getDatabase(dbName)\n const collectionId = this.getCollectionId(db, collection)\n\n if (collectionId) {\n db.query(\"DELETE FROM indexes WHERE collection_id = ? AND name != '_id_'\").run(collectionId)\n }\n }\n\n // ============ Cursor Management ============\n\n createCursor(state: CursorState): void {\n this.cursors.set(state.id, state)\n }\n\n getCursor(id: bigint): CursorState | undefined {\n return this.cursors.get(id)\n }\n\n advanceCursor(id: bigint, count: number): Document[] {\n const cursor = this.cursors.get(id)\n if (!cursor) {\n return []\n }\n\n const start = cursor.position\n const end = Math.min(start + count, cursor.documents.length)\n cursor.position = end\n\n return cursor.documents.slice(start, end)\n }\n\n closeCursor(id: bigint): boolean {\n return this.cursors.delete(id)\n }\n\n cleanupExpiredCursors(): void {\n const now = Date.now()\n for (const [id, cursor] of this.cursors) {\n if (now - cursor.createdAt > CURSOR_TIMEOUT_MS) {\n this.cursors.delete(id)\n }\n }\n }\n\n // ============ Helper Methods ============\n\n private serializeId(id: unknown): string {\n if (id instanceof ObjectId) {\n return id.toHexString()\n }\n if (typeof id === 'object' && id !== null && '$oid' in id) {\n return (id as { $oid: string }).$oid\n }\n return String(id)\n }\n\n private parseId(idStr: string): ObjectId | string {\n if (/^[0-9a-f]{24}$/i.test(idStr)) {\n return new ObjectId(idStr)\n }\n return idStr\n }\n\n private generateIndexName(key: Document): string {\n return Object.entries(key)\n .map(([field, dir]) => `${field}_${dir}`)\n .join('_')\n }\n\n /**\n * Build simplified SQL filter from MongoDB query\n */\n private buildFilterSql(filter: Document, params: SQLParams): string {\n const conditions: string[] = []\n\n for (const [key, value] of Object.entries(filter)) {\n if (key === '_id') {\n params.push(this.serializeId(value))\n conditions.push('_id = ?')\n } else if (key === '$and' && Array.isArray(value)) {\n const subConditions = value\n .map((sub) => this.buildFilterSql(sub as Document, params))\n .filter(Boolean)\n if (subConditions.length > 0) {\n conditions.push(`(${subConditions.join(' AND ')})`)\n }\n } else if (key === '$or' && Array.isArray(value)) {\n const subConditions = value\n .map((sub) => this.buildFilterSql(sub as Document, params))\n .filter(Boolean)\n if (subConditions.length > 0) {\n conditions.push(`(${subConditions.join(' OR ')})`)\n }\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Handle operators\n // Validate field name to prevent SQL injection\n const safePath = safeJsonPath(validateFieldPath(key))\n for (const [op, opValue] of Object.entries(value as Document)) {\n const path = `json_extract(data, '${safePath}')`\n switch (op) {\n case '$eq':\n params.push(opValue as SQLQueryBindings)\n conditions.push(`${path} = ?`)\n break\n case '$ne':\n params.push(opValue as SQLQueryBindings)\n conditions.push(`${path} != ?`)\n break\n case '$gt':\n params.push(opValue as SQLQueryBindings)\n conditions.push(`${path} > ?`)\n break\n case '$gte':\n params.push(opValue as SQLQueryBindings)\n conditions.push(`${path} >= ?`)\n break\n case '$lt':\n params.push(opValue as SQLQueryBindings)\n conditions.push(`${path} < ?`)\n break\n case '$lte':\n params.push(opValue as SQLQueryBindings)\n conditions.push(`${path} <= ?`)\n break\n case '$exists':\n conditions.push(opValue ? `${path} IS NOT NULL` : `${path} IS NULL`)\n break\n case '$in':\n if (Array.isArray(opValue) && opValue.length > 0) {\n const placeholders = opValue.map(() => '?').join(', ')\n params.push(...(opValue as SQLQueryBindings[]))\n conditions.push(`${path} IN (${placeholders})`)\n }\n break\n }\n }\n } else {\n // Direct equality\n // Validate field name to prevent SQL injection\n const safePath = safeJsonPath(validateFieldPath(key))\n const sqlValue = typeof value === 'boolean' ? (value ? 1 : 0) : value\n params.push(sqlValue as SQLQueryBindings)\n conditions.push(`json_extract(data, '${safePath}') = ?`)\n }\n }\n\n return conditions.join(' AND ')\n }\n\n private applyProjection(doc: Document, projection: Document): Document {\n const includeFields = new Set<string>()\n const excludeFields = new Set<string>()\n let isInclusion = false\n\n for (const [field, value] of Object.entries(projection)) {\n if (field === '_id' && (value === 0 || value === false)) {\n excludeFields.add('_id')\n continue\n }\n\n if (value === 1 || value === true) {\n includeFields.add(field)\n isInclusion = true\n } else if (value === 0 || value === false) {\n excludeFields.add(field)\n }\n }\n\n if (isInclusion) {\n const result: Document = {}\n if (!excludeFields.has('_id')) {\n result._id = doc._id\n }\n for (const field of includeFields) {\n if (field in doc) {\n result[field] = doc[field]\n }\n }\n return result\n }\n\n const result = { ...doc }\n for (const field of excludeFields) {\n delete result[field]\n }\n return result\n }\n\n private applyUpdate(doc: Document, update: Document): Document {\n const result = { ...doc }\n\n if (update.$set) {\n Object.assign(result, update.$set as Document)\n }\n\n if (update.$unset) {\n for (const key of Object.keys(update.$unset as Document)) {\n delete result[key]\n }\n }\n\n if (update.$inc) {\n for (const [key, value] of Object.entries(update.$inc as Document)) {\n const current = (result[key] as number) || 0\n result[key] = current + (value as number)\n }\n }\n\n if (update.$push) {\n for (const [key, value] of Object.entries(update.$push as Document)) {\n const current = (result[key] as unknown[]) || []\n if (typeof value === 'object' && value !== null && '$each' in value) {\n current.push(...((value as Document).$each as unknown[]))\n } else {\n current.push(value)\n }\n result[key] = current\n }\n }\n\n // Handle replacement (no operators)\n const hasOperators = Object.keys(update).some((k) => k.startsWith('$'))\n if (!hasOperators) {\n const id = result._id\n for (const key of Object.keys(result)) {\n if (key !== '_id') delete result[key]\n }\n Object.assign(result, update)\n result._id = id\n }\n\n return result\n }\n\n private applyPipeline(documents: Document[], pipeline: Document[]): Document[] {\n let result = [...documents]\n\n for (const stage of pipeline) {\n const entry = Object.entries(stage)[0]\n if (!entry) continue\n const [op, value] = entry\n\n switch (op) {\n case '$match':\n result = result.filter((doc) => this.matchDocument(doc, value as Document))\n break\n\n case '$project':\n result = result.map((doc) => this.applyProjection(doc, value as Document))\n break\n\n case '$sort':\n result = this.sortDocuments(result, value as Document)\n break\n\n case '$limit':\n result = result.slice(0, value as number)\n break\n\n case '$skip':\n result = result.slice(value as number)\n break\n\n case '$count':\n result = [{ [value as string]: result.length }]\n break\n\n case '$sample':\n const size = (value as { size: number }).size || 100\n result = this.shuffleArray(result).slice(0, size)\n break\n\n case '$group':\n result = this.groupDocuments(result, value as Document)\n break\n }\n }\n\n return result\n }\n\n private matchDocument(doc: Document, query: Document): boolean {\n for (const [key, value] of Object.entries(query)) {\n if (key === '$and') {\n if (!(value as Document[]).every((q) => this.matchDocument(doc, q))) {\n return false\n }\n continue\n }\n if (key === '$or') {\n if (!(value as Document[]).some((q) => this.matchDocument(doc, q))) {\n return false\n }\n continue\n }\n\n const docValue = doc[key]\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n for (const [op, opValue] of Object.entries(value as Document)) {\n switch (op) {\n case '$eq':\n if (docValue !== opValue) return false\n break\n case '$ne':\n if (docValue === opValue) return false\n break\n case '$gt':\n if (!((docValue as number) > (opValue as number))) return false\n break\n case '$gte':\n if (!((docValue as number) >= (opValue as number))) return false\n break\n case '$lt':\n if (!((docValue as number) < (opValue as number))) return false\n break\n case '$lte':\n if (!((docValue as number) <= (opValue as number))) return false\n break\n case '$in':\n if (!(opValue as unknown[]).includes(docValue)) return false\n break\n case '$exists':\n if ((opValue && docValue === undefined) || (!opValue && docValue !== undefined))\n return false\n break\n }\n }\n } else {\n if (docValue !== value) return false\n }\n }\n return true\n }\n\n private sortDocuments(documents: Document[], sort: Document): Document[] {\n return [...documents].sort((a, b) => {\n for (const [field, direction] of Object.entries(sort)) {\n const aVal = a[field]\n const bVal = b[field]\n const dir = direction === -1 ? -1 : 1\n\n if (aVal === bVal) continue\n if (aVal === undefined || aVal === null) return dir\n if (bVal === undefined || bVal === null) return -dir\n if ((aVal as number) < (bVal as number)) return -dir\n if ((aVal as number) > (bVal as number)) return dir\n }\n return 0\n })\n }\n\n private shuffleArray<T>(array: T[]): T[] {\n const result = [...array]\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n const temp = result[i]!\n result[i] = result[j]!\n result[j] = temp\n }\n return result\n }\n\n private groupDocuments(documents: Document[], groupSpec: Document): Document[] {\n const groups = new Map<string, Document[]>()\n const idSpec = groupSpec._id\n\n for (const doc of documents) {\n let groupKey: string\n if (idSpec === null) {\n groupKey = '__all__'\n } else if (typeof idSpec === 'string' && idSpec.startsWith('$')) {\n groupKey = JSON.stringify(doc[idSpec.slice(1)])\n } else {\n groupKey = JSON.stringify(idSpec)\n }\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, [])\n }\n groups.get(groupKey)!.push(doc)\n }\n\n const result: Document[] = []\n for (const [key, docs] of groups) {\n const grouped: Document = { _id: key === '__all__' ? null : JSON.parse(key) }\n\n for (const [field, spec] of Object.entries(groupSpec)) {\n if (field === '_id') continue\n\n if (typeof spec === 'object' && spec !== null) {\n const [op, value] = Object.entries(spec as Document)[0]\n const fieldPath =\n typeof value === 'string' && value.startsWith('$') ? value.slice(1) : null\n\n switch (op) {\n case '$sum':\n if (value === 1) {\n grouped[field] = docs.length\n } else if (fieldPath) {\n grouped[field] = docs.reduce((sum, doc) => sum + ((doc[fieldPath] as number) || 0), 0)\n }\n break\n case '$avg':\n if (fieldPath) {\n const values = docs.map((doc) => doc[fieldPath]).filter((v) => typeof v === 'number') as number[]\n grouped[field] = values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : null\n }\n break\n case '$first':\n if (fieldPath && docs.length > 0) {\n const firstDoc = docs[0]\n if (firstDoc) {\n grouped[field] = firstDoc[fieldPath]\n }\n }\n break\n case '$last':\n if (fieldPath && docs.length > 0) {\n const lastDoc = docs[docs.length - 1]\n if (lastDoc) {\n grouped[field] = lastDoc[fieldPath]\n }\n }\n break\n }\n }\n }\n\n result.push(grouped)\n }\n\n return result\n }\n\n /**\n * Close all database connections\n */\n close(): void {\n for (const db of this.databases.values()) {\n db.close()\n }\n this.databases.clear()\n this.cursors.clear()\n }\n}\n","/**\n * MongoDB Wire Protocol Types\n *\n * Based on: https://www.mongodb.com/docs/manual/reference/mongodb-wire-protocol/\n */\n\nimport type { Document, Long } from 'bson'\n\n/** MongoDB wire protocol opcodes */\nexport const OpCode = {\n /** Standard message format for all operations (MongoDB 3.6+) */\n OP_MSG: 2013,\n /** Compressed message wrapper */\n OP_COMPRESSED: 2012,\n /** Legacy reply to client (removed in 5.1, but still used for backwards compat) */\n OP_REPLY: 1,\n /** Legacy query (deprecated, but still used for initial handshake) */\n OP_QUERY: 2004,\n /** Legacy get more (removed in 5.1) */\n OP_GET_MORE: 2005,\n /** Legacy kill cursors (removed in 5.1) */\n OP_KILL_CURSORS: 2007,\n} as const\n\nexport type OpCodeValue = (typeof OpCode)[keyof typeof OpCode]\n\n/** OP_MSG flag bits */\nexport const OpMsgFlags = {\n /** Message ends with CRC-32C checksum */\n CHECKSUM_PRESENT: 1 << 0,\n /** More messages follow; don't respond until bit=0 */\n MORE_TO_COME: 1 << 1,\n /** Client accepts multiple replies (exhaust cursors) */\n EXHAUST_ALLOWED: 1 << 16,\n} as const\n\n/** OP_QUERY flag bits (legacy) */\nexport const OpQueryFlags = {\n TAILABLE_CURSOR: 1 << 1,\n SLAVE_OK: 1 << 2,\n OPLOG_REPLAY: 1 << 3, // Deprecated\n NO_CURSOR_TIMEOUT: 1 << 4,\n AWAIT_DATA: 1 << 5,\n EXHAUST: 1 << 6,\n PARTIAL: 1 << 7,\n} as const\n\n/** OP_REPLY response flags */\nexport const OpReplyFlags = {\n CURSOR_NOT_FOUND: 1 << 0,\n QUERY_FAILURE: 1 << 1,\n SHARD_CONFIG_STALE: 1 << 2,\n AWAIT_CAPABLE: 1 << 3,\n} as const\n\n/** Compression algorithm IDs */\nexport const Compressor = {\n NOOP: 0,\n SNAPPY: 1,\n ZLIB: 2,\n ZSTD: 3,\n} as const\n\nexport type CompressorValue = (typeof Compressor)[keyof typeof Compressor]\n\n/**\n * Message header structure (16 bytes)\n * All integers are little-endian\n */\nexport interface MsgHeader {\n /** Total message size including this header */\n messageLength: number\n /** Client-generated unique identifier */\n requestID: number\n /** For responses: requestID being replied to */\n responseTo: number\n /** Message type (OpCode) */\n opCode: OpCodeValue\n}\n\n/** OP_MSG section type 0 - single BSON body */\nexport interface Section0 {\n kind: 0\n body: Document\n}\n\n/** OP_MSG section type 1 - document sequence */\nexport interface Section1 {\n kind: 1\n identifier: string\n documents: Document[]\n}\n\nexport type Section = Section0 | Section1\n\n/** Parsed OP_MSG message */\nexport interface OpMsgMessage {\n header: MsgHeader\n flagBits: number\n sections: Section[]\n checksum?: number\n}\n\n/** Parsed OP_QUERY message (legacy, for handshake) */\nexport interface OpQueryMessage {\n header: MsgHeader\n flags: number\n fullCollectionName: string\n numberToSkip: number\n numberToReturn: number\n query: Document\n returnFieldsSelector?: Document\n}\n\n/** OP_REPLY message (legacy response format) */\nexport interface OpReplyMessage {\n header: MsgHeader\n responseFlags: number\n cursorID: Long\n startingFrom: number\n numberReturned: number\n documents: Document[]\n}\n\n/** Connection state for tracking client connections */\nexport interface ConnectionState {\n id: number\n authenticated: boolean\n authenticatedUser?: string\n authDb?: string\n compressionEnabled: boolean\n compressor?: CompressorValue\n cursors: Map<bigint, CursorState>\n}\n\n/** Cursor state for pagination */\nexport interface CursorState {\n id: bigint\n namespace: string\n documents: Document[]\n position: number\n batchSize: number\n createdAt: number\n}\n\n/** Server capabilities for hello response */\nexport interface ServerCapabilities {\n maxBsonObjectSize: number\n maxMessageSizeBytes: number\n maxWriteBatchSize: number\n minWireVersion: number\n maxWireVersion: number\n logicalSessionTimeoutMinutes: number\n readOnly: boolean\n}\n\n/** Default server capabilities (MongoDB 6.0 compatible) */\nexport const DEFAULT_CAPABILITIES: ServerCapabilities = {\n maxBsonObjectSize: 16 * 1024 * 1024, // 16 MiB\n maxMessageSizeBytes: 48 * 1024 * 1024, // 48 MiB\n maxWriteBatchSize: 100000,\n minWireVersion: 0,\n maxWireVersion: 17, // MongoDB 6.0\n logicalSessionTimeoutMinutes: 30,\n readOnly: false,\n}\n","/**\n * MongoDB Wire Protocol Message Parsing and Serialization\n *\n * Handles the binary message format including:\n * - MsgHeader (16 bytes)\n * - OP_MSG (modern format)\n * - OP_QUERY (legacy, for handshake)\n * - OP_REPLY (legacy response)\n */\n\nimport { BSON, Document } from 'bson'\nimport {\n type MsgHeader,\n type OpMsgMessage,\n type OpQueryMessage,\n type Section,\n type Section0,\n type Section1,\n type OpCodeValue,\n OpCode,\n OpMsgFlags,\n} from './types.js'\n\n/** Header size in bytes */\nconst HEADER_SIZE = 16\n\n/**\n * Parse the 16-byte message header\n */\nexport function parseHeader(buffer: Buffer): MsgHeader {\n if (buffer.length < HEADER_SIZE) {\n throw new Error(`Buffer too small for header: ${buffer.length} < ${HEADER_SIZE}`)\n }\n\n return {\n messageLength: buffer.readInt32LE(0),\n requestID: buffer.readInt32LE(4),\n responseTo: buffer.readInt32LE(8),\n opCode: buffer.readInt32LE(12) as OpCodeValue,\n }\n}\n\n/**\n * Serialize a message header to buffer\n */\nexport function serializeHeader(header: MsgHeader): Buffer {\n const buffer = Buffer.allocUnsafe(HEADER_SIZE)\n buffer.writeInt32LE(header.messageLength, 0)\n buffer.writeInt32LE(header.requestID, 4)\n buffer.writeInt32LE(header.responseTo, 8)\n buffer.writeInt32LE(header.opCode, 12)\n return buffer\n}\n\n/**\n * Parse a C-style null-terminated string\n */\nfunction parseCString(buffer: Buffer, offset: number): [string, number] {\n let end = offset\n while (end < buffer.length && buffer[end] !== 0) {\n end++\n }\n const str = buffer.toString('utf8', offset, end)\n return [str, end + 1] // +1 to skip the null terminator\n}\n\n/**\n * Parse a BSON document from buffer\n */\nfunction parseBSONDocument(buffer: Buffer, offset: number): [Document, number] {\n const length = buffer.readInt32LE(offset)\n const doc = BSON.deserialize(buffer.subarray(offset, offset + length))\n return [doc, offset + length]\n}\n\n/**\n * Parse OP_MSG message (opcode 2013)\n */\nexport function parseOpMsg(buffer: Buffer): OpMsgMessage {\n const header = parseHeader(buffer)\n\n if (header.opCode !== OpCode.OP_MSG) {\n throw new Error(`Expected OP_MSG (${OpCode.OP_MSG}), got ${header.opCode}`)\n }\n\n let offset = HEADER_SIZE\n\n // Flag bits (4 bytes)\n const flagBits = buffer.readUInt32LE(offset)\n offset += 4\n\n const hasChecksum = (flagBits & OpMsgFlags.CHECKSUM_PRESENT) !== 0\n const messageEnd = hasChecksum ? buffer.length - 4 : buffer.length\n\n // Parse sections\n const sections: Section[] = []\n\n while (offset < messageEnd) {\n const kind = buffer.readUInt8(offset)\n offset += 1\n\n if (kind === 0) {\n // Kind 0: Single BSON document\n const [body, newOffset] = parseBSONDocument(buffer, offset)\n sections.push({ kind: 0, body } as Section0)\n offset = newOffset\n } else if (kind === 1) {\n // Kind 1: Document sequence\n const sectionSize = buffer.readInt32LE(offset)\n const sectionEnd = offset + sectionSize\n offset += 4\n\n const [identifier, docStart] = parseCString(buffer, offset)\n offset = docStart\n\n const documents: Document[] = []\n while (offset < sectionEnd) {\n const [doc, newOffset] = parseBSONDocument(buffer, offset)\n documents.push(doc)\n offset = newOffset\n }\n\n sections.push({ kind: 1, identifier, documents } as Section1)\n } else {\n throw new Error(`Unknown section kind: ${kind}`)\n }\n }\n\n // Optional checksum\n if (hasChecksum) {\n return { header, flagBits, sections, checksum: buffer.readUInt32LE(messageEnd) }\n }\n return { header, flagBits, sections }\n}\n\n/**\n * Parse OP_QUERY message (opcode 2004, legacy)\n * Still used for initial handshake by some clients\n */\nexport function parseOpQuery(buffer: Buffer): OpQueryMessage {\n const header = parseHeader(buffer)\n\n if (header.opCode !== OpCode.OP_QUERY) {\n throw new Error(`Expected OP_QUERY (${OpCode.OP_QUERY}), got ${header.opCode}`)\n }\n\n let offset = HEADER_SIZE\n\n // Flags (4 bytes)\n const flags = buffer.readInt32LE(offset)\n offset += 4\n\n // Full collection name (cstring)\n const [fullCollectionName, afterName] = parseCString(buffer, offset)\n offset = afterName\n\n // Number to skip (4 bytes)\n const numberToSkip = buffer.readInt32LE(offset)\n offset += 4\n\n // Number to return (4 bytes)\n const numberToReturn = buffer.readInt32LE(offset)\n offset += 4\n\n // Query document\n const [query, afterQuery] = parseBSONDocument(buffer, offset)\n offset = afterQuery\n\n // Optional return fields selector\n if (offset < buffer.length) {\n const [returnFieldsSelector] = parseBSONDocument(buffer, offset)\n return {\n header,\n flags,\n fullCollectionName,\n numberToSkip,\n numberToReturn,\n query,\n returnFieldsSelector,\n }\n }\n\n return {\n header,\n flags,\n fullCollectionName,\n numberToSkip,\n numberToReturn,\n query,\n }\n}\n\n/**\n * Serialize an OP_MSG response\n */\nexport function serializeOpMsg(\n requestID: number,\n responseTo: number,\n body: Document,\n additionalSections?: Section1[]\n): Buffer {\n // Serialize the body document\n const bodyBson = Buffer.from(BSON.serialize(body))\n\n // Calculate section 0 size\n let sectionsSize = 1 + bodyBson.length // kind byte + BSON\n\n // Calculate additional sections size\n const serializedSections: Buffer[] = []\n if (additionalSections) {\n for (const section of additionalSections) {\n const identifierBuf = Buffer.from(section.identifier + '\\0', 'utf8')\n const docsBufs = section.documents.map((doc) => Buffer.from(BSON.serialize(doc)))\n const docsSize = docsBufs.reduce((sum, buf) => sum + buf.length, 0)\n const sectionSize = 4 + identifierBuf.length + docsSize // size + identifier + docs\n\n const sectionBuf = Buffer.allocUnsafe(1 + sectionSize) // kind + section\n sectionBuf.writeUInt8(1, 0) // kind = 1\n sectionBuf.writeInt32LE(sectionSize, 1)\n identifierBuf.copy(sectionBuf, 5)\n let docOffset = 5 + identifierBuf.length\n for (const docBuf of docsBufs) {\n docBuf.copy(sectionBuf, docOffset)\n docOffset += docBuf.length\n }\n\n serializedSections.push(sectionBuf)\n sectionsSize += sectionBuf.length\n }\n }\n\n // Total message length\n const messageLength = HEADER_SIZE + 4 + sectionsSize // header + flagBits + sections\n\n // Allocate buffer\n const buffer = Buffer.allocUnsafe(messageLength)\n let offset = 0\n\n // Header\n buffer.writeInt32LE(messageLength, offset)\n offset += 4\n buffer.writeInt32LE(requestID, offset)\n offset += 4\n buffer.writeInt32LE(responseTo, offset)\n offset += 4\n buffer.writeInt32LE(OpCode.OP_MSG, offset)\n offset += 4\n\n // Flag bits (no flags set)\n buffer.writeUInt32LE(0, offset)\n offset += 4\n\n // Section 0 (body)\n buffer.writeUInt8(0, offset) // kind = 0\n offset += 1\n bodyBson.copy(buffer, offset)\n offset += bodyBson.length\n\n // Additional sections\n for (const sectionBuf of serializedSections) {\n sectionBuf.copy(buffer, offset)\n offset += sectionBuf.length\n }\n\n return buffer\n}\n\n/**\n * Serialize an OP_REPLY response (legacy)\n */\nexport function serializeOpReply(\n requestID: number,\n responseTo: number,\n documents: Document[],\n cursorID: bigint = 0n,\n responseFlags: number = 0\n): Buffer {\n // Serialize documents\n const docBuffers = documents.map((doc) => Buffer.from(BSON.serialize(doc)))\n const docsSize = docBuffers.reduce((sum, buf) => sum + buf.length, 0)\n\n // Total message length\n // header(16) + responseFlags(4) + cursorID(8) + startingFrom(4) + numberReturned(4) + docs\n const messageLength = HEADER_SIZE + 20 + docsSize\n\n const buffer = Buffer.allocUnsafe(messageLength)\n let offset = 0\n\n // Header\n buffer.writeInt32LE(messageLength, offset)\n offset += 4\n buffer.writeInt32LE(requestID, offset)\n offset += 4\n buffer.writeInt32LE(responseTo, offset)\n offset += 4\n buffer.writeInt32LE(OpCode.OP_REPLY, offset)\n offset += 4\n\n // Response flags\n buffer.writeInt32LE(responseFlags, offset)\n offset += 4\n\n // Cursor ID\n buffer.writeBigInt64LE(cursorID, offset)\n offset += 8\n\n // Starting from\n buffer.writeInt32LE(0, offset)\n offset += 4\n\n // Number returned\n buffer.writeInt32LE(documents.length, offset)\n offset += 4\n\n // Documents\n for (const docBuf of docBuffers) {\n docBuf.copy(buffer, offset)\n offset += docBuf.length\n }\n\n return buffer\n}\n\n/**\n * Parse any incoming message based on opcode\n */\nexport function parseMessage(buffer: Buffer): OpMsgMessage | OpQueryMessage {\n const header = parseHeader(buffer)\n\n switch (header.opCode) {\n case OpCode.OP_MSG:\n return parseOpMsg(buffer)\n case OpCode.OP_QUERY:\n return parseOpQuery(buffer)\n default:\n throw new Error(`Unsupported opcode: ${header.opCode}`)\n }\n}\n\n/**\n * Extract the command document and database from parsed message\n */\nexport function extractCommand(message: OpMsgMessage | OpQueryMessage): {\n db: string\n command: Document\n documentSequences: Map<string, Document[]>\n} {\n if ('sections' in message) {\n // OP_MSG\n const section0 = message.sections.find((s): s is Section0 => s.kind === 0)\n if (!section0) {\n throw new Error('OP_MSG missing section 0 (body)')\n }\n\n const command = section0.body\n const db = command.$db as string\n if (!db) {\n throw new Error('OP_MSG command missing $db field')\n }\n\n // Collect document sequences from kind=1 sections\n const documentSequences = new Map<string, Document[]>()\n for (const section of message.sections) {\n if (section.kind === 1) {\n documentSequences.set(section.identifier, section.documents)\n }\n }\n\n return { db, command, documentSequences }\n } else {\n // OP_QUERY\n const parts = message.fullCollectionName.split('.')\n const db = parts[0] || 'admin'\n const command = message.query\n\n return { db, command, documentSequences: new Map() }\n }\n}\n","/**\n * Consolidated RPC Types\n *\n * This module contains all shared RPC-related type definitions used across:\n * - src/rpc/rpc-target.ts\n * - src/rpc/rpc-client.ts\n * - src/rpc/endpoint.ts\n * - src/rpc/index.ts\n * - src/wire/backend/workers-proxy.ts\n */\n\n// ============================================================================\n// Cloudflare Durable Object Types\n// ============================================================================\n\n/**\n * Durable Object namespace interface\n */\nexport interface DurableObjectNamespace {\n idFromName(name: string): DurableObjectId\n get(id: DurableObjectId): DurableObjectStub\n}\n\n/**\n * Durable Object ID interface\n */\nexport interface DurableObjectId {\n toString(): string\n}\n\n/**\n * Durable Object stub interface\n */\nexport interface DurableObjectStub {\n fetch(request: Request | string, init?: RequestInit): Promise<Response>\n}\n\n// ============================================================================\n// Environment Types\n// ============================================================================\n\n/**\n * Base Mondo environment bindings interface\n */\nexport interface MondoEnv {\n MONDO_DATABASE: DurableObjectNamespace\n /** Optional Worker Loader for $function support (closed beta) */\n LOADER?: WorkerLoader\n /** Optional auth token for RPC endpoint */\n MONDO_AUTH_TOKEN?: string\n}\n\n// ============================================================================\n// Worker Loader Types (for $function operator)\n// ============================================================================\n\n/**\n * Worker Loader interface for dynamic worker creation\n * (Closed beta feature for $function operator support)\n */\nexport interface WorkerLoader {\n get(id: string, getCode: () => Promise<WorkerCode>): WorkerStub\n}\n\n/**\n * Worker code specification for dynamic workers\n */\nexport interface WorkerCode {\n compatibilityDate: string\n compatibilityFlags?: string[]\n mainModule: string\n modules: Record<string, string | { js: string } | { text: string }>\n globalOutbound?: null // null blocks all network access\n env?: Record<string, unknown>\n}\n\n/**\n * Worker stub interface for dynamic workers\n */\nexport interface WorkerStub {\n fetch?(request: Request): Promise<Response>\n getEntrypoint?(name?: string): WorkerEntrypoint\n}\n\n/**\n * Worker entrypoint interface\n */\nexport interface WorkerEntrypoint {\n fetch(request: Request): Promise<Response>\n}\n\n// ============================================================================\n// JSON-RPC Style Request/Response Types\n// ============================================================================\n\n/**\n * RPC request structure for Workers RPC (capnweb-style)\n * Used by rpc-target.ts and rpc-client.ts\n */\nexport interface RpcRequest {\n id?: string\n method: string\n params: unknown[]\n}\n\n/**\n * RPC response structure for Workers RPC\n */\nexport interface RpcResponse {\n id?: string\n result?: unknown\n error?: string\n}\n\n/**\n * Batch response structure\n */\nexport interface BatchResponse {\n results: RpcResponse[]\n}\n\n// ============================================================================\n// HTTP RPC Endpoint Request/Response Types\n// ============================================================================\n\n/**\n * RPC request structure for HTTP endpoint\n * Used by endpoint.ts and workers-proxy.ts\n */\nexport interface HttpRpcRequest {\n method: string\n db?: string\n collection?: string\n filter?: Record<string, unknown>\n update?: Record<string, unknown>\n document?: Record<string, unknown>\n documents?: Record<string, unknown>[]\n pipeline?: Record<string, unknown>[]\n options?: Record<string, unknown>\n field?: string\n query?: Record<string, unknown>\n}\n\n/**\n * HTTP RPC success response\n */\nexport interface HttpRpcSuccessResponse {\n ok: 1\n result: unknown\n}\n\n/**\n * HTTP RPC error response\n */\nexport interface HttpRpcErrorResponse {\n ok: 0\n error: string\n code: number\n codeName?: string\n}\n\n/**\n * HTTP RPC response (union type)\n */\nexport type HttpRpcResponse = HttpRpcSuccessResponse | HttpRpcErrorResponse\n\n// ============================================================================\n// Legacy RPC Types (for src/rpc/index.ts message-based protocol)\n// ============================================================================\n\n/**\n * RPC message types for internal operations\n */\nexport enum MessageType {\n // Document operations\n INSERT_ONE = 'insertOne',\n INSERT_MANY = 'insertMany',\n FIND_ONE = 'findOne',\n FIND = 'find',\n UPDATE_ONE = 'updateOne',\n UPDATE_MANY = 'updateMany',\n DELETE_ONE = 'deleteOne',\n DELETE_MANY = 'deleteMany',\n\n // Aggregation\n AGGREGATE = 'aggregate',\n COUNT = 'count',\n DISTINCT = 'distinct',\n\n // Index operations\n CREATE_INDEX = 'createIndex',\n DROP_INDEX = 'dropIndex',\n LIST_INDEXES = 'listIndexes',\n\n // Collection operations\n CREATE_COLLECTION = 'createCollection',\n DROP_COLLECTION = 'dropCollection',\n LIST_COLLECTIONS = 'listCollections',\n\n // Database operations\n STATS = 'stats',\n HEALTH = 'health',\n}\n\n/**\n * Legacy RPC request interface (message-based)\n */\nexport interface LegacyRpcRequest {\n type: MessageType\n collection?: string\n payload: unknown\n}\n\n/**\n * Legacy RPC response interface\n */\nexport interface LegacyRpcResponse<T = unknown> {\n success: boolean\n data?: T\n error?: {\n code: string\n message: string\n }\n}\n\n// ============================================================================\n// Database Reference Types\n// ============================================================================\n\n/**\n * Database reference returned by db() method\n */\nexport interface DatabaseRef {\n name: string\n stub: DurableObjectStub\n}\n\n/**\n * Collection reference returned by collection() method\n */\nexport interface CollectionRef {\n dbName: string\n collectionName: string\n stub: DurableObjectStub\n}\n\n// ============================================================================\n// Batched Executor Types\n// ============================================================================\n\n/**\n * Batched executor options\n */\nexport interface BatchedExecutorOptions {\n maxBatchSize?: number\n flushInterval?: number\n}\n\n/**\n * Pipelined operation reference\n */\nexport interface PipelineOp {\n id: string\n method: string\n params: unknown[]\n dependencies: string[]\n}\n\n// ============================================================================\n// RPC Client Types\n// ============================================================================\n\n/**\n * RPC client options\n */\nexport interface RpcClientOptions {\n /** Enable automatic reconnection */\n autoReconnect?: boolean\n /** Maximum retry attempts */\n maxRetries?: number\n /** Reconnect interval in milliseconds */\n reconnectInterval?: number\n /** Enable request deduplication */\n deduplicate?: boolean\n /** Deduplication TTL in milliseconds */\n deduplicationTtl?: number\n /** Request timeout in milliseconds */\n timeout?: number\n}\n\n/**\n * Options for request deduplicator\n */\nexport interface DeduplicatorOptions {\n ttl?: number\n}\n\n/**\n * Event handler type\n */\nexport type EventHandler<T = unknown> = (event: T) => void\n\n/**\n * Reconnect event data\n */\nexport interface ReconnectEvent {\n attempt: number\n lastError?: Error\n}\n\n// ============================================================================\n// RPC Handler Types\n// ============================================================================\n\n/**\n * RPC Handler interface\n */\nexport interface RpcHandler {\n fetch(request: Request): Promise<Response>\n}\n\n// ============================================================================\n// MongoDB Error Codes\n// ============================================================================\n\n/**\n * MongoDB-compatible error codes\n */\nexport const ErrorCode = {\n OK: 0,\n INTERNAL_ERROR: 1,\n BAD_VALUE: 2,\n NO_SUCH_KEY: 4,\n GRAPH_CONTAINS_CYCLE: 5,\n HOST_UNREACHABLE: 6,\n HOST_NOT_FOUND: 7,\n UNKNOWN_ERROR: 8,\n FAILED_TO_PARSE: 9,\n CANNOT_MUTATE_OBJECT: 10,\n USER_NOT_FOUND: 11,\n UNSUPPORTED_FORMAT: 12,\n UNAUTHORIZED: 13,\n TYPE_MISMATCH: 14,\n OVERFLOW: 15,\n INVALID_LENGTH: 16,\n PROTOCOL_ERROR: 17,\n AUTHENTICATION_FAILED: 18,\n CANNOT_REUSE_OBJECT: 19,\n ILLEGAL_OPERATION: 20,\n EMPTY_ARRAY_OPERATION: 21,\n INVALID_BSON: 22,\n ALREADY_INITIALIZED: 23,\n LOCK_TIMEOUT: 24,\n REMOTE_VALIDATION_ERROR: 25,\n NAMESPACE_NOT_FOUND: 26,\n INDEX_NOT_FOUND: 27,\n PATH_NOT_VIABLE: 28,\n NON_EXISTENT_PATH: 29,\n INVALID_PATH: 30,\n ROLE_NOT_FOUND: 31,\n ROLES_NOT_RELATED: 32,\n PRIVILEGE_NOT_FOUND: 33,\n CANNOT_BACKFILL_ARRAY: 34,\n COMMAND_NOT_FOUND: 59,\n DATABASE_NOT_FOUND: 60,\n LOCATION_ERROR: 16755,\n DUPLICATE_KEY: 11000,\n} as const\n\nexport type ErrorCodeValue = (typeof ErrorCode)[keyof typeof ErrorCode]\n\n/**\n * Get the code name for an error code\n */\nexport function getErrorCodeName(code: number): string {\n for (const [name, value] of Object.entries(ErrorCode)) {\n if (value === code) {\n return name\n .split('_')\n .map((word) => word.charAt(0) + word.slice(1).toLowerCase())\n .join('')\n }\n }\n return 'UnknownError'\n}\n\n// ============================================================================\n// Response Helper Functions\n// ============================================================================\n\n/**\n * Create a success response (Document format for wire protocol)\n */\nexport function successResponse(data: Record<string, unknown> = {}): Record<string, unknown> {\n return { ok: 1, ...data }\n}\n\n/**\n * Create an error response (Document format for wire protocol)\n */\nexport function errorResponse(\n code: number,\n errmsg: string,\n codeName?: string\n): Record<string, unknown> {\n return {\n ok: 0,\n code,\n codeName: codeName || getErrorCodeName(code),\n errmsg,\n }\n}\n\n/**\n * Create a legacy success response\n */\nexport function legacySuccessResponse<T>(data: T): LegacyRpcResponse<T> {\n return { success: true, data }\n}\n\n/**\n * Create a legacy error response\n */\nexport function legacyErrorResponse(code: string, message: string): LegacyRpcResponse<never> {\n return { success: false, error: { code, message } }\n}\n","/**\n * Command handler types for the wire protocol server\n */\n\nimport type { Document } from 'bson'\nimport type { ConnectionState } from '../types.js'\nimport {\n ErrorCode,\n successResponse as rpcSuccessResponse,\n errorResponse as rpcErrorResponse,\n} from '../../types/rpc.js'\n\n// Re-export ErrorCode from consolidated types\nexport { ErrorCode }\n\n/** Authentication configuration */\nexport interface AuthConfig {\n /** Enable authentication */\n enabled: boolean\n /** Username for SCRAM-SHA-256 authentication */\n username: string\n /** Password for SCRAM-SHA-256 authentication */\n password: string\n}\n\n/** Context passed to command handlers */\nexport interface CommandContext {\n /** Database name from $db field */\n db: string\n /** Connection ID */\n connectionId: number\n /** Request ID for logging/tracing */\n requestId: number\n /** Document sequences from OP_MSG kind=1 sections */\n documentSequences: Map<string, Document[]>\n /** SECURITY: Authentication configuration (when auth is enabled) */\n auth?: AuthConfig\n /** Connection state (for updating authentication status) */\n connection?: ConnectionState\n}\n\n/** Result from a command handler */\nexport interface CommandResult {\n /** Response document */\n response: Document\n /** Additional document sequences to include in response (for cursors, etc) */\n documentSequences?: Array<{ identifier: string; documents: Document[] }>\n}\n\n/** Command handler interface */\nexport interface CommandHandler {\n /** Execute the command */\n execute(command: Document, context: CommandContext): Promise<CommandResult>\n}\n\n/** Create a success response */\nexport function successResponse(data: Document = {}): Document {\n return rpcSuccessResponse(data) as Document\n}\n\n/** Create an error response */\nexport function errorResponse(\n code: number,\n errmsg: string,\n codeName?: string\n): Document {\n return rpcErrorResponse(code, errmsg, codeName) as Document\n}\n","/**\n * hello/isMaster command handler\n *\n * This is the first command clients send to discover server capabilities.\n * Critical for Compass and driver compatibility.\n */\n\nimport { ObjectId, Long, type Document } from 'bson'\nimport type { CommandHandler, CommandContext, CommandResult } from './types.js'\nimport { successResponse } from './types.js'\nimport { DEFAULT_CAPABILITIES } from '../types.js'\n\nexport class HelloCommand implements CommandHandler {\n private processId = new ObjectId()\n private counter = 0n\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const now = new Date()\n\n // Build base response matching MongoDB 6.0\n const response: Document = {\n // Primary fields\n ismaster: true,\n isWritablePrimary: true,\n\n // Topology version (changes when server state changes)\n topologyVersion: {\n processId: this.processId,\n counter: Long.fromBigInt(this.counter++),\n },\n\n // Size limits\n maxBsonObjectSize: DEFAULT_CAPABILITIES.maxBsonObjectSize,\n maxMessageSizeBytes: DEFAULT_CAPABILITIES.maxMessageSizeBytes,\n maxWriteBatchSize: DEFAULT_CAPABILITIES.maxWriteBatchSize,\n\n // Time\n localTime: now,\n\n // Session support\n logicalSessionTimeoutMinutes: DEFAULT_CAPABILITIES.logicalSessionTimeoutMinutes,\n\n // Connection info\n connectionId: context.connectionId,\n\n // Wire version (MongoDB 6.0 = 17)\n minWireVersion: DEFAULT_CAPABILITIES.minWireVersion,\n maxWireVersion: DEFAULT_CAPABILITIES.maxWireVersion,\n\n // Not read-only\n readOnly: DEFAULT_CAPABILITIES.readOnly,\n\n // Success\n ok: 1,\n }\n\n // If client supports hello command, indicate we do too\n if (command.hello || command.helloOk) {\n response.helloOk = true\n }\n\n // If client requested auth mechanisms for a user\n if (command.saslSupportedMechs) {\n // Support standard auth mechanisms\n response.saslSupportedMechs = ['SCRAM-SHA-256', 'SCRAM-SHA-1']\n }\n\n // If client is probing for compression\n if (command.compression && Array.isArray(command.compression)) {\n // We don't support compression yet, but acknowledge the request\n response.compression = []\n }\n\n // Add client info echo if provided (for debugging)\n if (command.client) {\n // Don't echo back, but we could log it\n }\n\n // Indicate this is not a mongos or replica set\n // (standalone server mode)\n\n return { response }\n }\n}\n\nexport class PingCommand implements CommandHandler {\n async execute(_command: Document, _context: CommandContext): Promise<CommandResult> {\n return { response: successResponse() }\n }\n}\n\nexport class BuildInfoCommand implements CommandHandler {\n async execute(_command: Document, _context: CommandContext): Promise<CommandResult> {\n const response = successResponse({\n version: '6.0.0-mongo.do',\n gitVersion: 'mongo.do-0.1.0',\n modules: [],\n allocator: 'system',\n javascriptEngine: 'none',\n sysInfo: 'mongo.do-on-workers',\n versionArray: [6, 0, 0, 0],\n openssl: {\n running: 'not-applicable',\n compiled: 'not-applicable',\n },\n buildEnvironment: {\n target_os: 'cloudflare-workers',\n target_arch: 'wasm',\n },\n bits: 64,\n debug: false,\n maxBsonObjectSize: DEFAULT_CAPABILITIES.maxBsonObjectSize,\n storageEngines: ['sqlite'],\n })\n\n return { response }\n }\n}\n\nexport class HostInfoCommand implements CommandHandler {\n async execute(_command: Document, _context: CommandContext): Promise<CommandResult> {\n const now = new Date()\n const response = successResponse({\n system: {\n currentTime: now,\n hostname: 'mongo.do-server',\n cpuAddrSize: 64,\n memSizeMB: 512,\n memLimitMB: 512,\n numCores: 1,\n cpuArch: 'wasm',\n numaEnabled: false,\n },\n os: {\n type: 'cloudflare-workers',\n name: 'MondoDB',\n version: '0.1.0',\n },\n extra: {\n note: 'Running on Cloudflare Workers Durable Objects',\n },\n })\n\n return { response }\n }\n}\n\nexport class WhatsmyuriCommand implements CommandHandler {\n async execute(_command: Document, _context: CommandContext): Promise<CommandResult> {\n // This command returns the client's IP address\n // In our case, we return localhost since we're running locally\n return {\n response: successResponse({\n you: '127.0.0.1:0',\n }),\n }\n }\n}\n\nexport class GetLogCommand implements CommandHandler {\n async execute(command: Document, _context: CommandContext): Promise<CommandResult> {\n const logType = command.getLog\n\n if (logType === '*') {\n // Return available log types\n return {\n response: successResponse({\n names: ['global', 'startupWarnings'],\n }),\n }\n }\n\n if (logType === 'startupWarnings') {\n return {\n response: successResponse({\n totalLinesWritten: 1,\n log: [\n JSON.stringify({\n t: { $date: new Date().toISOString() },\n s: 'I',\n c: 'STORAGE',\n msg: 'MondoDB using SQLite storage engine',\n }),\n ],\n }),\n }\n }\n\n return {\n response: successResponse({\n totalLinesWritten: 0,\n log: [],\n }),\n }\n }\n}\n\nexport class GetParameterCommand implements CommandHandler {\n async execute(command: Document, _context: CommandContext): Promise<CommandResult> {\n // Handle getParameter: '*' to return all parameters\n const param = command.getParameter\n\n const parameters: Document = {\n featureCompatibilityVersion: { version: '6.0' },\n authenticationMechanisms: ['SCRAM-SHA-256', 'SCRAM-SHA-1'],\n }\n\n if (param === '*') {\n return { response: successResponse(parameters) }\n }\n\n // Return specific parameter if requested\n if (typeof param === 'string' && param in parameters) {\n return {\n response: successResponse({\n [param]: parameters[param],\n }),\n }\n }\n\n return { response: successResponse({}) }\n }\n}\n\nexport class GetCmdLineOptsCommand implements CommandHandler {\n async execute(_command: Document, _context: CommandContext): Promise<CommandResult> {\n return {\n response: successResponse({\n argv: ['mongo.do-server'],\n parsed: {\n storage: {\n engine: 'sqlite',\n },\n },\n }),\n }\n }\n}\n","/**\n * Admin Commands\n *\n * Database and collection management commands\n */\n\nimport type { Document } from 'bson'\nimport type { CommandHandler, CommandContext, CommandResult } from './types.js'\nimport { successResponse, errorResponse, ErrorCode } from './types.js'\nimport type { MondoBackend } from '../backend/interface.js'\n\nexport class ListDatabasesCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, _context: CommandContext): Promise<CommandResult> {\n const databases = await this.backend.listDatabases()\n\n // Apply nameOnly filter if requested\n const nameOnly = command.nameOnly === true\n\n // Apply filter if provided\n let filteredDbs = databases\n if (command.filter && typeof command.filter === 'object') {\n const filter = command.filter as Document\n if (filter.name) {\n if (typeof filter.name === 'string') {\n filteredDbs = databases.filter((db) => db.name === filter.name)\n } else if (filter.name.$regex) {\n const regex = new RegExp(filter.name.$regex, filter.name.$options)\n filteredDbs = databases.filter((db) => regex.test(db.name))\n }\n }\n }\n\n const totalSize = filteredDbs.reduce((sum, db) => sum + db.sizeOnDisk, 0)\n\n if (nameOnly) {\n return {\n response: successResponse({\n databases: filteredDbs.map((db) => ({ name: db.name })),\n }),\n }\n }\n\n return {\n response: successResponse({\n databases: filteredDbs,\n totalSize,\n totalSizeMb: totalSize / (1024 * 1024),\n }),\n }\n }\n}\n\nexport class ListCollectionsCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const db = context.db\n const filter = command.filter as Document | undefined\n const nameOnly = command.nameOnly === true\n\n const collections = await this.backend.listCollections(db, filter)\n\n if (nameOnly) {\n return {\n response: successResponse({\n cursor: {\n id: 0n,\n ns: `${db}.$cmd.listCollections`,\n firstBatch: collections.map((c) => ({ name: c.name, type: c.type })),\n },\n }),\n }\n }\n\n return {\n response: successResponse({\n cursor: {\n id: 0n,\n ns: `${db}.$cmd.listCollections`,\n firstBatch: collections,\n },\n }),\n }\n }\n}\n\nexport class CreateCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collectionName = command.create as string\n if (!collectionName || typeof collectionName !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'create requires a string collection name'),\n }\n }\n\n // Extract options\n const options: Document = {}\n if (command.capped) options.capped = command.capped\n if (command.size) options.size = command.size\n if (command.max) options.max = command.max\n if (command.validator) options.validator = command.validator\n if (command.validationLevel) options.validationLevel = command.validationLevel\n if (command.validationAction) options.validationAction = command.validationAction\n\n await this.backend.createCollection(context.db, collectionName, options)\n\n return { response: successResponse() }\n }\n}\n\nexport class DropCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collectionName = command.drop as string\n if (!collectionName || typeof collectionName !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'drop requires a string collection name'),\n }\n }\n\n const exists = await this.backend.collectionExists(context.db, collectionName)\n if (!exists) {\n return {\n response: errorResponse(\n ErrorCode.NAMESPACE_NOT_FOUND,\n `ns not found: ${context.db}.${collectionName}`\n ),\n }\n }\n\n await this.backend.dropCollection(context.db, collectionName)\n\n return {\n response: successResponse({\n nIndexesWas: 1,\n ns: `${context.db}.${collectionName}`,\n }),\n }\n }\n}\n\nexport class DropDatabaseCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(_command: Document, context: CommandContext): Promise<CommandResult> {\n await this.backend.dropDatabase(context.db)\n\n return {\n response: successResponse({\n dropped: context.db,\n }),\n }\n }\n}\n\nexport class CollStatsCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collectionName = command.collStats as string\n if (!collectionName || typeof collectionName !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'collStats requires a collection name'),\n }\n }\n\n const exists = await this.backend.collectionExists(context.db, collectionName)\n if (!exists) {\n return {\n response: errorResponse(\n ErrorCode.NAMESPACE_NOT_FOUND,\n `Collection [${context.db}.${collectionName}] not found`\n ),\n }\n }\n\n const stats = await this.backend.collStats(context.db, collectionName)\n\n return {\n response: successResponse({\n ...stats,\n wiredTiger: {}, // Empty for SQLite\n indexDetails: {},\n scaleFactor: 1,\n }),\n }\n }\n}\n\nexport class DbStatsCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const scale = typeof command.scale === 'number' ? command.scale : 1\n const stats = await this.backend.dbStats(context.db)\n\n return {\n response: successResponse({\n db: stats.db,\n collections: stats.collections,\n views: stats.views,\n objects: stats.objects,\n avgObjSize: stats.avgObjSize,\n dataSize: stats.dataSize / scale,\n storageSize: stats.storageSize / scale,\n indexes: stats.indexes,\n indexSize: stats.indexSize / scale,\n totalSize: (stats.dataSize + stats.indexSize) / scale,\n scaleFactor: scale,\n fsUsedSize: stats.storageSize / scale,\n fsTotalSize: stats.storageSize * 10 / scale, // Estimate\n }),\n }\n }\n}\n\nexport class ServerStatusCommand implements CommandHandler {\n private startTime = new Date()\n\n constructor(_backend: MondoBackend) {\n void _backend; // Reserved for future backend status integration\n }\n\n async execute(_command: Document, _context: CommandContext): Promise<CommandResult> {\n const now = new Date()\n const uptimeSeconds = Math.floor((now.getTime() - this.startTime.getTime()) / 1000)\n\n return {\n response: successResponse({\n host: 'mongo.do-server',\n version: '6.0.0-mongo.do',\n process: 'mongo.do-server',\n pid: process.pid || 1,\n uptime: uptimeSeconds,\n uptimeMillis: uptimeSeconds * 1000,\n uptimeEstimate: uptimeSeconds,\n localTime: now,\n\n connections: {\n current: 1,\n available: 100,\n totalCreated: 1,\n active: 1,\n },\n\n opcounters: {\n insert: 0,\n query: 0,\n update: 0,\n delete: 0,\n getmore: 0,\n command: 0,\n },\n\n mem: {\n bits: 64,\n resident: 50,\n virtual: 100,\n supported: true,\n },\n\n storageEngine: {\n name: 'sqlite',\n supportsCommittedReads: true,\n oldestRequiredTimestampForCrashRecovery: null,\n supportsPendingDrops: false,\n dropPendingIdents: 0,\n supportsSnapshotReadConcern: true,\n readOnly: false,\n persistent: true,\n backupCursorOpen: false,\n },\n\n asserts: {\n regular: 0,\n warning: 0,\n msg: 0,\n user: 0,\n tripwire: 0,\n rollovers: 0,\n },\n\n network: {\n bytesIn: 0,\n bytesOut: 0,\n numRequests: 0,\n },\n }),\n }\n }\n}\n","/**\n * CRUD Commands\n *\n * find, insert, update, delete, count, distinct, getMore, killCursors\n */\n\nimport { Long, type Document } from 'bson'\nimport type { CommandHandler, CommandContext, CommandResult } from './types.js'\nimport { successResponse, errorResponse, ErrorCode } from './types.js'\nimport type { MondoBackend, FindOptions } from '../backend/interface.js'\n\nexport class FindCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collection = command.find as string\n if (!collection || typeof collection !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'find requires a collection name'),\n }\n }\n\n const options: FindOptions = {\n filter: command.filter as Document,\n projection: command.projection as Document,\n sort: command.sort as Document,\n limit: command.limit as number,\n skip: command.skip as number,\n batchSize: command.batchSize as number || 101,\n hint: command.hint as Document | string,\n collation: command.collation as Document,\n allowDiskUse: command.allowDiskUse as boolean,\n }\n\n // Handle singleBatch option\n if (command.singleBatch === true) {\n options.batchSize = options.limit || 1000000\n }\n\n const result = await this.backend.find(context.db, collection, options)\n\n return {\n response: successResponse({\n cursor: {\n id: Long.fromBigInt(result.cursorId),\n ns: `${context.db}.${collection}`,\n firstBatch: result.documents,\n },\n }),\n }\n }\n}\n\nexport class InsertCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collection = command.insert as string\n if (!collection || typeof collection !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'insert requires a collection name'),\n }\n }\n\n // Get documents from command or from document sequence\n let documents = command.documents as Document[]\n if (!documents && context.documentSequences.has('documents')) {\n documents = context.documentSequences.get('documents')!\n }\n\n if (!documents || !Array.isArray(documents) || documents.length === 0) {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'insert requires documents array'),\n }\n }\n\n const ordered = command.ordered !== false\n\n try {\n const result = await this.backend.insertMany(context.db, collection, documents)\n\n return {\n response: successResponse({\n n: result.insertedCount,\n }),\n }\n } catch (error) {\n if (ordered) {\n return {\n response: errorResponse(\n ErrorCode.INTERNAL_ERROR,\n error instanceof Error ? error.message : 'Insert failed'\n ),\n }\n }\n // For unordered, we would need to track partial success\n throw error\n }\n }\n}\n\nexport class UpdateCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collection = command.update as string\n if (!collection || typeof collection !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'update requires a collection name'),\n }\n }\n\n // Get updates from command or document sequence\n let updates = command.updates as Document[]\n if (!updates && context.documentSequences.has('updates')) {\n updates = context.documentSequences.get('updates')!\n }\n\n if (!updates || !Array.isArray(updates) || updates.length === 0) {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'update requires updates array'),\n }\n }\n\n let totalMatched = 0\n let totalModified = 0\n let upserted: Array<{ index: number; _id: unknown }> = []\n\n for (let i = 0; i < updates.length; i++) {\n const op = updates[i] as Document\n const filter = op?.q as Document\n const update = op?.u as Document\n const multi = op?.multi === true\n const upsert = op?.upsert === true\n const arrayFilters = op?.arrayFilters as Document[]\n\n const result = multi\n ? await this.backend.updateMany(context.db, collection, filter, update, {\n upsert,\n arrayFilters,\n })\n : await this.backend.updateOne(context.db, collection, filter, update, {\n upsert,\n arrayFilters,\n })\n\n totalMatched += result.matchedCount\n totalModified += result.modifiedCount\n\n if (result.upsertedId !== undefined) {\n upserted.push({ index: i, _id: result.upsertedId })\n }\n }\n\n const response: Document = {\n n: totalMatched,\n nModified: totalModified,\n ok: 1,\n }\n\n if (upserted.length > 0) {\n response.upserted = upserted\n }\n\n return { response }\n }\n}\n\nexport class DeleteCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collection = command.delete as string\n if (!collection || typeof collection !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'delete requires a collection name'),\n }\n }\n\n // Get deletes from command or document sequence\n let deletes = command.deletes as Document[]\n if (!deletes && context.documentSequences.has('deletes')) {\n deletes = context.documentSequences.get('deletes')!\n }\n\n if (!deletes || !Array.isArray(deletes) || deletes.length === 0) {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'delete requires deletes array'),\n }\n }\n\n let totalDeleted = 0\n\n for (const op of deletes) {\n const filter = op.q as Document\n const limit = op.limit as number // 0 = deleteMany, 1 = deleteOne\n\n const result =\n limit === 0 || limit === undefined\n ? await this.backend.deleteMany(context.db, collection, filter)\n : await this.backend.deleteOne(context.db, collection, filter)\n\n totalDeleted += result.deletedCount\n }\n\n return {\n response: successResponse({\n n: totalDeleted,\n }),\n }\n }\n}\n\nexport class CountCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collection = command.count as string\n if (!collection || typeof collection !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'count requires a collection name'),\n }\n }\n\n const query = command.query as Document | undefined\n const count = await this.backend.count(context.db, collection, query)\n\n // Apply skip and limit if provided\n let adjustedCount = count\n if (command.skip && typeof command.skip === 'number') {\n adjustedCount = Math.max(0, adjustedCount - command.skip)\n }\n if (command.limit && typeof command.limit === 'number' && command.limit > 0) {\n adjustedCount = Math.min(adjustedCount, command.limit)\n }\n\n return {\n response: successResponse({\n n: adjustedCount,\n }),\n }\n }\n}\n\nexport class DistinctCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collection = command.distinct as string\n if (!collection || typeof collection !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'distinct requires a collection name'),\n }\n }\n\n const key = command.key as string\n if (!key || typeof key !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'distinct requires a key field'),\n }\n }\n\n const query = command.query as Document | undefined\n const values = await this.backend.distinct(context.db, collection, key, query)\n\n return {\n response: successResponse({\n values,\n }),\n }\n }\n}\n\nexport class GetMoreCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const cursorId = command.getMore\n const collection = command.collection as string\n const batchSize = (command.batchSize as number) || 101\n\n if (cursorId === undefined) {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'getMore requires a cursor id'),\n }\n }\n\n // Convert to bigint\n let cursorBigInt: bigint\n if (typeof cursorId === 'bigint') {\n cursorBigInt = cursorId\n } else if (cursorId instanceof Long) {\n cursorBigInt = cursorId.toBigInt()\n } else {\n cursorBigInt = BigInt(cursorId)\n }\n\n const cursor = this.backend.getCursor(cursorBigInt)\n if (!cursor) {\n return {\n response: errorResponse(\n ErrorCode.NAMESPACE_NOT_FOUND,\n `cursor id ${cursorId} not found`\n ),\n }\n }\n\n const documents = this.backend.advanceCursor(cursorBigInt, batchSize)\n const updatedCursor = this.backend.getCursor(cursorBigInt)\n const hasMore = updatedCursor ? updatedCursor.position < updatedCursor.documents.length : false\n\n // If no more documents, close the cursor\n if (!hasMore) {\n this.backend.closeCursor(cursorBigInt)\n }\n\n return {\n response: successResponse({\n cursor: {\n id: hasMore ? Long.fromBigInt(cursorBigInt) : Long.ZERO,\n ns: `${context.db}.${collection}`,\n nextBatch: documents,\n },\n }),\n }\n }\n}\n\nexport class KillCursorsCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, _context: CommandContext): Promise<CommandResult> {\n const cursors = command.cursors as (Long | bigint | number)[]\n\n if (!cursors || !Array.isArray(cursors)) {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'killCursors requires cursors array'),\n }\n }\n\n const cursorsKilled: Long[] = []\n const cursorsNotFound: Long[] = []\n const cursorsAlive: Long[] = []\n const cursorsUnknown: Long[] = []\n\n for (const cursorId of cursors) {\n let cursorBigInt: bigint\n if (typeof cursorId === 'bigint') {\n cursorBigInt = cursorId\n } else if (cursorId instanceof Long) {\n cursorBigInt = cursorId.toBigInt()\n } else {\n cursorBigInt = BigInt(cursorId)\n }\n\n const killed = this.backend.closeCursor(cursorBigInt)\n const longId = Long.fromBigInt(cursorBigInt)\n\n if (killed) {\n cursorsKilled.push(longId)\n } else {\n cursorsNotFound.push(longId)\n }\n }\n\n return {\n response: successResponse({\n cursorsKilled,\n cursorsNotFound,\n cursorsAlive,\n cursorsUnknown,\n }),\n }\n }\n}\n","/**\n * Aggregate Command\n *\n * Handles MongoDB aggregation pipeline execution\n */\n\nimport { Long, type Document } from 'bson'\nimport type { CommandHandler, CommandContext, CommandResult } from './types.js'\nimport { successResponse, errorResponse, ErrorCode } from './types.js'\nimport type { MondoBackend } from '../backend/interface.js'\n\nexport class AggregateCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collection = command.aggregate as string\n if (!collection || typeof collection !== 'string') {\n // Could be aggregating on database (e.g., $listLocalSessions)\n // For now, require collection name\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'aggregate requires a collection name'),\n }\n }\n\n const pipeline = command.pipeline as Document[]\n if (!pipeline || !Array.isArray(pipeline)) {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'aggregate requires a pipeline array'),\n }\n }\n\n // Check for special system aggregations\n if (collection === '1' || collection === 1 as unknown) {\n // Database-level aggregation commands\n return this.handleDatabaseAggregation(pipeline, context)\n }\n\n // Extract options\n const batchSize = (command.cursor?.batchSize as number) || 101\n const allowDiskUse = command.allowDiskUse as boolean\n\n // Check for $out or $merge stages (not returning a cursor)\n const lastStage = pipeline[pipeline.length - 1]\n const hasOutputStage = lastStage && ('$out' in lastStage || '$merge' in lastStage)\n\n try {\n const result = await this.backend.aggregate(context.db, collection, pipeline, {\n batchSize,\n allowDiskUse,\n })\n\n if (hasOutputStage) {\n // For $out/$merge, return success without cursor\n return {\n response: successResponse(),\n }\n }\n\n return {\n response: successResponse({\n cursor: {\n id: Long.fromBigInt(result.cursorId),\n ns: `${context.db}.${collection}`,\n firstBatch: result.documents,\n },\n }),\n }\n } catch (error) {\n return {\n response: errorResponse(\n ErrorCode.INTERNAL_ERROR,\n error instanceof Error ? error.message : 'Aggregation failed'\n ),\n }\n }\n }\n\n private async handleDatabaseAggregation(\n pipeline: Document[],\n context: CommandContext\n ): Promise<CommandResult> {\n // Handle database-level aggregation stages\n const firstStage = pipeline[0]\n\n if (firstStage && '$listLocalSessions' in firstStage) {\n // Return empty sessions list\n return {\n response: successResponse({\n cursor: {\n id: Long.ZERO,\n ns: `${context.db}.$cmd.aggregate`,\n firstBatch: [],\n },\n }),\n }\n }\n\n if (firstStage && '$currentOp' in firstStage) {\n // Return empty operations list\n return {\n response: successResponse({\n cursor: {\n id: Long.ZERO,\n ns: `${context.db}.$cmd.aggregate`,\n firstBatch: [],\n },\n }),\n }\n }\n\n return {\n response: errorResponse(\n ErrorCode.COMMAND_NOT_FOUND,\n 'Database-level aggregation not supported'\n ),\n }\n }\n}\n","/**\n * Index Commands\n *\n * listIndexes, createIndexes, dropIndexes\n */\n\nimport { Long, type Document } from 'bson'\nimport type { CommandHandler, CommandContext, CommandResult } from './types.js'\nimport { successResponse, errorResponse, ErrorCode } from './types.js'\nimport type { MondoBackend, IndexSpec } from '../backend/interface.js'\n\nexport class ListIndexesCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collection = command.listIndexes as string\n if (!collection || typeof collection !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'listIndexes requires a collection name'),\n }\n }\n\n const exists = await this.backend.collectionExists(context.db, collection)\n if (!exists) {\n return {\n response: errorResponse(\n ErrorCode.NAMESPACE_NOT_FOUND,\n `ns not found: ${context.db}.${collection}`\n ),\n }\n }\n\n const indexes = await this.backend.listIndexes(context.db, collection)\n\n return {\n response: successResponse({\n cursor: {\n id: Long.ZERO,\n ns: `${context.db}.${collection}`,\n firstBatch: indexes,\n },\n }),\n }\n }\n}\n\nexport class CreateIndexesCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collection = command.createIndexes as string\n if (!collection || typeof collection !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'createIndexes requires a collection name'),\n }\n }\n\n const indexes = command.indexes as Document[]\n if (!indexes || !Array.isArray(indexes) || indexes.length === 0) {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'createIndexes requires indexes array'),\n }\n }\n\n // Validate and convert index specifications\n const indexSpecs: IndexSpec[] = indexes.map((idx) => ({\n key: idx.key as Document,\n name: idx.name as string,\n unique: idx.unique as boolean,\n sparse: idx.sparse as boolean,\n background: idx.background as boolean,\n expireAfterSeconds: idx.expireAfterSeconds as number,\n partialFilterExpression: idx.partialFilterExpression as Document,\n }))\n\n // Get existing indexes for comparison\n let existingIndexes: string[] = []\n try {\n const existing = await this.backend.listIndexes(context.db, collection)\n existingIndexes = existing.map((idx) => idx.name)\n } catch {\n // Collection might not exist yet\n }\n\n const createdNames = await this.backend.createIndexes(context.db, collection, indexSpecs)\n\n // Count how many are new vs existing\n const numIndexesBefore = existingIndexes.length\n const numIndexesAfter = numIndexesBefore + createdNames.length\n\n return {\n response: successResponse({\n numIndexesBefore,\n numIndexesAfter,\n createdCollectionAutomatically: false,\n note: createdNames.length > 0 ? undefined : 'all indexes already exist',\n }),\n }\n }\n}\n\nexport class DropIndexesCommand implements CommandHandler {\n constructor(private backend: MondoBackend) {}\n\n async execute(command: Document, context: CommandContext): Promise<CommandResult> {\n const collection = command.dropIndexes as string\n if (!collection || typeof collection !== 'string') {\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'dropIndexes requires a collection name'),\n }\n }\n\n const index = command.index as string | string[] | Document\n\n if (index === '*') {\n // Drop all indexes except _id\n await this.backend.dropIndexes(context.db, collection)\n return {\n response: successResponse({\n msg: 'non-_id indexes dropped',\n }),\n }\n }\n\n if (typeof index === 'string') {\n // Drop by name\n if (index === '_id_') {\n return {\n response: errorResponse(\n ErrorCode.ILLEGAL_OPERATION,\n 'cannot drop _id index'\n ),\n }\n }\n\n await this.backend.dropIndex(context.db, collection, index)\n return {\n response: successResponse({\n nIndexesWas: 1,\n }),\n }\n }\n\n if (Array.isArray(index)) {\n // Drop multiple by name\n for (const name of index) {\n if (name === '_id_') continue\n await this.backend.dropIndex(context.db, collection, name)\n }\n return { response: successResponse() }\n }\n\n if (typeof index === 'object') {\n // Drop by key specification - would need to find matching index\n return {\n response: errorResponse(\n ErrorCode.BAD_VALUE,\n 'dropping index by key specification not yet supported'\n ),\n }\n }\n\n return {\n response: errorResponse(ErrorCode.BAD_VALUE, 'invalid index specification'),\n }\n }\n}\n","/**\n * Authentication Commands\n *\n * saslStart, saslContinue - SCRAM-SHA-256 authentication\n */\n\nimport { Binary, type Document } from 'bson'\nimport type { CommandHandler, CommandContext, CommandResult } from './types.js'\nimport { successResponse, errorResponse, ErrorCode } from './types.js'\nimport type { ScramAuthenticator } from '../auth/scram.js'\n\n/** Extended context with authentication state management */\nexport interface AuthCommandContext extends CommandContext {\n /** Set authenticated user after successful auth */\n setAuthenticated?: (username: string, db: string) => void\n}\n\n/**\n * saslStart command - begin SASL authentication\n *\n * Initiates SCRAM-SHA-256 authentication exchange.\n */\nexport class SaslStartCommand implements CommandHandler {\n constructor(private authenticator: ScramAuthenticator) {}\n\n async execute(command: Document, context: AuthCommandContext): Promise<CommandResult> {\n const mechanism = command.mechanism as string\n const payload = command.payload as Binary | Buffer | Uint8Array\n const options = command.options as Document | undefined\n\n if (!mechanism) {\n return {\n response: errorResponse(\n ErrorCode.BAD_VALUE,\n 'saslStart requires mechanism field'\n ),\n }\n }\n\n if (!payload) {\n return {\n response: errorResponse(\n ErrorCode.BAD_VALUE,\n 'saslStart requires payload field'\n ),\n }\n }\n\n // Determine auth database (default to $external for X.509, otherwise the $db)\n let authDb = context.db\n if (options?.authdb) {\n authDb = options.authdb as string\n }\n\n const result = await this.authenticator.saslStart(mechanism, payload, authDb)\n\n if (!result.success) {\n return {\n response: errorResponse(\n ErrorCode.AUTHENTICATION_FAILED,\n result.error || 'Authentication failed'\n ),\n }\n }\n\n return {\n response: successResponse({\n conversationId: result.conversationId,\n payload: new Binary(result.payload!),\n done: result.done,\n }),\n }\n }\n}\n\n/**\n * saslContinue command - continue SASL authentication\n *\n * Continues SCRAM-SHA-256 authentication exchange.\n */\nexport class SaslContinueCommand implements CommandHandler {\n constructor(private authenticator: ScramAuthenticator) {}\n\n async execute(command: Document, context: AuthCommandContext): Promise<CommandResult> {\n const conversationId = command.conversationId as number\n const payload = command.payload as Binary | Buffer | Uint8Array\n\n if (conversationId === undefined || conversationId === null) {\n return {\n response: errorResponse(\n ErrorCode.BAD_VALUE,\n 'saslContinue requires conversationId field'\n ),\n }\n }\n\n if (!payload) {\n return {\n response: errorResponse(\n ErrorCode.BAD_VALUE,\n 'saslContinue requires payload field'\n ),\n }\n }\n\n const result = await this.authenticator.saslContinue(conversationId, payload)\n\n if (!result.success) {\n return {\n response: errorResponse(\n ErrorCode.AUTHENTICATION_FAILED,\n result.error || 'Authentication failed'\n ),\n }\n }\n\n // If authentication completed successfully, update connection state\n if (result.done) {\n const user = this.authenticator.getConversationUser(conversationId)\n if (user && context.setAuthenticated) {\n context.setAuthenticated(user.username, user.db)\n }\n // Clean up conversation\n this.authenticator.cleanupConversation(conversationId)\n }\n\n return {\n response: successResponse({\n conversationId: result.conversationId,\n payload: new Binary(result.payload!),\n done: result.done,\n }),\n }\n }\n}\n\n/**\n * authenticate command - legacy authentication (deprecated but needed for compat)\n *\n * Modern drivers use SASL, but some tools may still use this.\n */\nexport class AuthenticateCommand implements CommandHandler {\n async execute(_command: Document, _context: CommandContext): Promise<CommandResult> {\n // The legacy authenticate command is deprecated\n // Direct clients to use SASL authentication\n return {\n response: errorResponse(\n ErrorCode.AUTHENTICATION_FAILED,\n 'Legacy authenticate command is not supported. Use SCRAM-SHA-256 via saslStart/saslContinue.'\n ),\n }\n }\n}\n\n/**\n * logout command - clear authentication state\n */\nexport class LogoutCommand implements CommandHandler {\n constructor(\n private clearAuthentication: (connectionId: number) => void\n ) {}\n\n async execute(_command: Document, context: CommandContext): Promise<CommandResult> {\n this.clearAuthentication(context.connectionId)\n return {\n response: successResponse({\n // MongoDB returns ok: 1 for logout\n }),\n }\n }\n}\n\n/**\n * Commands that should be allowed without authentication\n */\nexport const UNAUTHENTICATED_COMMANDS = new Set([\n // Handshake commands\n 'hello',\n 'ismaster',\n 'isMaster',\n 'buildInfo',\n 'buildinfo',\n\n // Authentication commands\n 'saslStart',\n 'saslContinue',\n 'authenticate',\n 'logout',\n\n // Basic connectivity\n 'ping',\n 'whatsmyuri',\n\n // Required for driver initialization\n 'getParameter',\n 'getCmdLineOpts',\n])\n\n/**\n * Check if a command requires authentication\n */\nexport function requiresAuthentication(commandName: string): boolean {\n return !UNAUTHENTICATED_COMMANDS.has(commandName)\n}\n","/**\n * SCRAM-SHA-256 Authentication Implementation\n *\n * Implements the Salted Challenge Response Authentication Mechanism (SCRAM)\n * per RFC 5802 and RFC 7677 (SHA-256 variant).\n *\n * MongoDB uses SCRAM-SHA-256 as its primary authentication mechanism.\n */\n\nimport { Binary } from 'bson'\n\n/** User credentials stored in the system */\nexport interface StoredCredentials {\n username: string\n /** Salt for SCRAM (base64 encoded) */\n salt: string\n /** Stored key (base64 encoded) */\n storedKey: string\n /** Server key (base64 encoded) */\n serverKey: string\n /** Iteration count for PBKDF2 */\n iterationCount: number\n /** Database the user belongs to */\n db: string\n /** Roles assigned to the user */\n roles?: Array<{ role: string; db: string }>\n}\n\n/** SCRAM conversation state */\nexport interface ScramConversation {\n username: string\n db: string\n clientNonce: string\n serverNonce: string\n salt: string\n iterationCount: number\n clientFirstMessageBare: string\n serverFirstMessage: string\n step: 'init' | 'challenge' | 'complete'\n}\n\n/** SCRAM authentication result */\nexport interface ScramResult {\n success: boolean\n conversationId?: number\n payload?: Buffer\n done: boolean\n error?: string\n}\n\n/** Credentials provider interface */\nexport interface CredentialsProvider {\n getCredentials(username: string, db: string): Promise<StoredCredentials | null>\n}\n\n/**\n * SCRAM-SHA-256 Authenticator\n *\n * Handles server-side SCRAM authentication flow.\n */\nexport class ScramAuthenticator {\n private conversations: Map<number, ScramConversation> = new Map()\n private nextConversationId = 1\n\n constructor(private credentialsProvider: CredentialsProvider) {}\n\n /**\n * Handle saslStart command - begin authentication\n *\n * @param mechanism - Should be \"SCRAM-SHA-256\"\n * @param payload - Client's first message (Binary or Buffer)\n * @param db - Authentication database\n */\n async saslStart(\n mechanism: string,\n payload: Binary | Buffer | Uint8Array,\n db: string\n ): Promise<ScramResult> {\n if (mechanism !== 'SCRAM-SHA-256') {\n return {\n success: false,\n done: true,\n error: `Mechanism ${mechanism} is not supported. Only SCRAM-SHA-256 is available.`,\n }\n }\n\n // Extract payload bytes\n const payloadBytes =\n payload instanceof Binary ? payload.buffer : Buffer.from(payload)\n const clientFirstMessage = payloadBytes.toString('utf-8')\n\n // Parse client-first-message: n,,n=username,r=client-nonce\n const parsed = this.parseClientFirstMessage(clientFirstMessage)\n if (!parsed) {\n return {\n success: false,\n done: true,\n error: 'Invalid client-first-message format',\n }\n }\n\n const { username, clientNonce, clientFirstMessageBare } = parsed\n\n // Look up user credentials\n const credentials = await this.credentialsProvider.getCredentials(username, db)\n if (!credentials) {\n // Don't reveal whether user exists - continue with fake salt\n // This prevents user enumeration attacks\n const fakeSalt = await this.generateSalt()\n const serverNonce = clientNonce + (await this.generateNonce())\n const iterationCount = 15000\n\n const conversationId = this.nextConversationId++\n this.conversations.set(conversationId, {\n username,\n db,\n clientNonce,\n serverNonce,\n salt: fakeSalt,\n iterationCount,\n clientFirstMessageBare,\n serverFirstMessage: '',\n step: 'init',\n })\n\n // Server-first-message: r=combined-nonce,s=salt,i=iteration-count\n const serverFirstMessage = `r=${serverNonce},s=${fakeSalt},i=${iterationCount}`\n\n const conv = this.conversations.get(conversationId)!\n conv.serverFirstMessage = serverFirstMessage\n conv.step = 'challenge'\n\n return {\n success: true,\n conversationId,\n payload: Buffer.from(serverFirstMessage, 'utf-8'),\n done: false,\n }\n }\n\n // Generate server nonce (append to client nonce)\n const serverNonce = clientNonce + (await this.generateNonce())\n const conversationId = this.nextConversationId++\n\n // Store conversation state\n this.conversations.set(conversationId, {\n username,\n db,\n clientNonce,\n serverNonce,\n salt: credentials.salt,\n iterationCount: credentials.iterationCount,\n clientFirstMessageBare,\n serverFirstMessage: '',\n step: 'init',\n })\n\n // Server-first-message: r=combined-nonce,s=salt,i=iteration-count\n const serverFirstMessage = `r=${serverNonce},s=${credentials.salt},i=${credentials.iterationCount}`\n\n const conv = this.conversations.get(conversationId)!\n conv.serverFirstMessage = serverFirstMessage\n conv.step = 'challenge'\n\n return {\n success: true,\n conversationId,\n payload: Buffer.from(serverFirstMessage, 'utf-8'),\n done: false,\n }\n }\n\n /**\n * Handle saslContinue command - continue authentication\n *\n * @param conversationId - Conversation ID from saslStart\n * @param payload - Client's response message\n */\n async saslContinue(\n conversationId: number,\n payload: Binary | Buffer | Uint8Array\n ): Promise<ScramResult> {\n const conv = this.conversations.get(conversationId)\n if (!conv) {\n return {\n success: false,\n done: true,\n error: 'Invalid conversation ID',\n }\n }\n\n const payloadBytes =\n payload instanceof Binary ? payload.buffer : Buffer.from(payload)\n const clientMessage = payloadBytes.toString('utf-8')\n\n if (conv.step === 'challenge') {\n // This is client-final-message: c=channel-binding,r=nonce,p=client-proof\n const parsed = this.parseClientFinalMessage(clientMessage)\n if (!parsed) {\n this.conversations.delete(conversationId)\n return {\n success: false,\n done: true,\n error: 'Invalid client-final-message format',\n }\n }\n\n const { clientProof, nonce, clientFinalMessageWithoutProof } =\n parsed\n // Note: channelBinding is parsed but not used - we don't support channel binding yet\n\n // Verify nonce matches\n if (nonce !== conv.serverNonce) {\n this.conversations.delete(conversationId)\n return {\n success: false,\n done: true,\n error: 'Authentication failed: nonce mismatch',\n }\n }\n\n // Look up credentials again for verification\n const credentials = await this.credentialsProvider.getCredentials(\n conv.username,\n conv.db\n )\n if (!credentials) {\n this.conversations.delete(conversationId)\n return {\n success: false,\n done: true,\n error: 'Authentication failed',\n }\n }\n\n // Verify client proof\n const verified = await this.verifyClientProof(\n conv,\n clientProof,\n clientFinalMessageWithoutProof,\n credentials\n )\n\n if (!verified.success) {\n this.conversations.delete(conversationId)\n return {\n success: false,\n done: true,\n error: 'Authentication failed',\n }\n }\n\n conv.step = 'complete'\n\n // Server-final-message: v=server-signature\n const serverFinalMessage = `v=${verified.serverSignature}`\n\n return {\n success: true,\n conversationId,\n payload: Buffer.from(serverFinalMessage, 'utf-8'),\n done: true,\n }\n }\n\n this.conversations.delete(conversationId)\n return {\n success: false,\n done: true,\n error: 'Unexpected conversation state',\n }\n }\n\n /**\n * Parse client-first-message\n * Format: gs2-header n=username,r=client-nonce\n * gs2-header is typically \"n,,\" (no channel binding, no authzid)\n */\n private parseClientFirstMessage(\n message: string\n ): { username: string; clientNonce: string; clientFirstMessageBare: string } | null {\n // Match: n,,n=<username>,r=<nonce>\n // or: y,,n=<username>,r=<nonce> (channel binding not used but supported by client)\n // or: p=<cb-name>,,n=<username>,r=<nonce> (channel binding used)\n const match = message.match(/^([nyp])(=([^,]*))?,,(.+)$/)\n if (!match) return null\n\n const clientFirstMessageBare = match[4]\n if (!clientFirstMessageBare) return null\n\n // Parse the bare message for username and nonce\n const parts = new Map<string, string>()\n for (const part of clientFirstMessageBare.split(',')) {\n const eqIdx = part.indexOf('=')\n if (eqIdx > 0) {\n parts.set(part.slice(0, eqIdx), part.slice(eqIdx + 1))\n }\n }\n\n const username = parts.get('n')\n const clientNonce = parts.get('r')\n\n if (!username || !clientNonce) return null\n\n // Decode SASLprep username (handle =2C for comma, =3D for equals)\n const decodedUsername = username.replace(/=2C/g, ',').replace(/=3D/g, '=')\n\n return { username: decodedUsername, clientNonce, clientFirstMessageBare }\n }\n\n /**\n * Parse client-final-message\n * Format: c=channel-binding,r=nonce,p=client-proof\n */\n private parseClientFinalMessage(message: string): {\n channelBinding: string\n nonce: string\n clientProof: string\n clientFinalMessageWithoutProof: string\n } | null {\n // The proof is the last field\n const proofMatch = message.match(/,p=([A-Za-z0-9+/=]+)$/)\n if (!proofMatch) return null\n\n const clientProof = proofMatch[1]\n const clientFinalMessageWithoutProof = message.slice(\n 0,\n message.length - proofMatch[0].length\n )\n\n // Parse other fields\n const parts = new Map<string, string>()\n for (const part of clientFinalMessageWithoutProof.split(',')) {\n const eqIdx = part.indexOf('=')\n if (eqIdx > 0) {\n parts.set(part.slice(0, eqIdx), part.slice(eqIdx + 1))\n }\n }\n\n const channelBinding = parts.get('c')\n const nonce = parts.get('r')\n\n if (!channelBinding || !nonce || !clientProof) return null\n\n return { channelBinding, nonce, clientProof, clientFinalMessageWithoutProof }\n }\n\n /**\n * Verify client proof and generate server signature\n */\n private async verifyClientProof(\n conv: ScramConversation,\n clientProofBase64: string,\n clientFinalMessageWithoutProof: string,\n credentials: StoredCredentials\n ): Promise<{ success: boolean; serverSignature?: string }> {\n try {\n // AuthMessage = client-first-message-bare + \",\" + server-first-message + \",\" + client-final-message-without-proof\n const authMessage = `${conv.clientFirstMessageBare},${conv.serverFirstMessage},${clientFinalMessageWithoutProof}`\n\n // Decode stored keys\n const storedKey = Buffer.from(credentials.storedKey, 'base64')\n const serverKey = Buffer.from(credentials.serverKey, 'base64')\n\n // ClientSignature = HMAC(StoredKey, AuthMessage)\n const clientSignature = await this.hmacSha256(storedKey, authMessage)\n\n // ClientProof = ClientKey XOR ClientSignature\n // So: ClientKey = ClientProof XOR ClientSignature\n const clientProof = Buffer.from(clientProofBase64, 'base64')\n const clientKey = Buffer.alloc(clientProof.length)\n for (let i = 0; i < clientProof.length; i++) {\n clientKey[i] = (clientProof[i] ?? 0) ^ (clientSignature[i] ?? 0)\n }\n\n // Verify: H(ClientKey) should equal StoredKey\n const computedStoredKey = await this.sha256(clientKey)\n if (!this.timingSafeEqual(computedStoredKey, storedKey)) {\n return { success: false }\n }\n\n // ServerSignature = HMAC(ServerKey, AuthMessage)\n const serverSignature = await this.hmacSha256(serverKey, authMessage)\n\n return {\n success: true,\n serverSignature: serverSignature.toString('base64'),\n }\n } catch {\n return { success: false }\n }\n }\n\n /**\n * Generate a random nonce\n */\n private async generateNonce(): Promise<string> {\n const bytes = new Uint8Array(24)\n crypto.getRandomValues(bytes)\n return Buffer.from(bytes).toString('base64')\n }\n\n /**\n * Generate a random salt\n */\n private async generateSalt(): Promise<string> {\n const bytes = new Uint8Array(16)\n crypto.getRandomValues(bytes)\n return Buffer.from(bytes).toString('base64')\n }\n\n /**\n * Compute SHA-256 hash\n */\n private async sha256(data: Buffer | Uint8Array): Promise<Buffer> {\n const hashBuffer = await crypto.subtle.digest('SHA-256', new Uint8Array(data))\n return Buffer.from(hashBuffer)\n }\n\n /**\n * Compute HMAC-SHA-256\n */\n private async hmacSha256(\n key: Buffer | Uint8Array,\n message: string\n ): Promise<Buffer> {\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n new Uint8Array(key),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signature = await crypto.subtle.sign(\n 'HMAC',\n cryptoKey,\n new TextEncoder().encode(message)\n )\n return Buffer.from(signature)\n }\n\n /**\n * Timing-safe comparison\n */\n private timingSafeEqual(a: Buffer, b: Buffer): boolean {\n if (a.length !== b.length) return false\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= (a[i] ?? 0) ^ (b[i] ?? 0)\n }\n return result === 0\n }\n\n /**\n * Clean up a conversation\n */\n cleanupConversation(conversationId: number): void {\n this.conversations.delete(conversationId)\n }\n\n /**\n * Get conversation username for successful auth\n */\n getConversationUser(conversationId: number): { username: string; db: string } | null {\n const conv = this.conversations.get(conversationId)\n if (!conv || conv.step !== 'complete') return null\n return { username: conv.username, db: conv.db }\n }\n}\n\n/**\n * Create SCRAM credentials from a password\n *\n * This is used when adding users to generate the stored credentials.\n */\nexport async function createScramCredentials(\n username: string,\n password: string,\n db: string,\n iterationCount = 15000\n): Promise<StoredCredentials> {\n // Generate salt\n const saltBytes = new Uint8Array(16)\n crypto.getRandomValues(saltBytes)\n const salt = Buffer.from(saltBytes).toString('base64')\n\n // SaltedPassword = Hi(Normalize(password), salt, i)\n // Hi is PBKDF2 with HMAC-SHA-256\n const saltedPassword = await pbkdf2Sha256(password, saltBytes, iterationCount)\n\n // ClientKey = HMAC(SaltedPassword, \"Client Key\")\n const clientKey = await hmacSha256(saltedPassword, 'Client Key')\n\n // StoredKey = H(ClientKey)\n const storedKey = await sha256(clientKey)\n\n // ServerKey = HMAC(SaltedPassword, \"Server Key\")\n const serverKey = await hmacSha256(saltedPassword, 'Server Key')\n\n return {\n username,\n salt,\n storedKey: storedKey.toString('base64'),\n serverKey: serverKey.toString('base64'),\n iterationCount,\n db,\n }\n}\n\n// Helper functions for credential creation\n\nasync function pbkdf2Sha256(\n password: string,\n salt: Uint8Array,\n iterations: number\n): Promise<Buffer> {\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: new Uint8Array(salt),\n iterations: iterations,\n hash: 'SHA-256',\n },\n keyMaterial,\n 256 // 32 bytes\n )\n return Buffer.from(derivedBits)\n}\n\nasync function sha256(data: Buffer | Uint8Array): Promise<Buffer> {\n const hashBuffer = await crypto.subtle.digest('SHA-256', new Uint8Array(data))\n return Buffer.from(hashBuffer)\n}\n\nasync function hmacSha256(\n key: Buffer | Uint8Array,\n message: string\n): Promise<Buffer> {\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n new Uint8Array(key),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signature = await crypto.subtle.sign(\n 'HMAC',\n cryptoKey,\n new TextEncoder().encode(message)\n )\n return Buffer.from(signature)\n}\n\n/**\n * In-memory credentials provider for testing and simple deployments\n */\nexport class InMemoryCredentialsProvider implements CredentialsProvider {\n private credentials: Map<string, StoredCredentials> = new Map()\n\n /**\n * Add a user with a password\n */\n async addUser(\n username: string,\n password: string,\n db: string,\n roles?: Array<{ role: string; db: string }>\n ): Promise<void> {\n const creds = await createScramCredentials(username, password, db)\n if (roles) {\n creds.roles = roles\n }\n this.credentials.set(`${db}.${username}`, creds)\n }\n\n /**\n * Add pre-computed credentials\n */\n addCredentials(credentials: StoredCredentials): void {\n this.credentials.set(`${credentials.db}.${credentials.username}`, credentials)\n }\n\n /**\n * Get credentials for a user\n */\n async getCredentials(\n username: string,\n db: string\n ): Promise<StoredCredentials | null> {\n return this.credentials.get(`${db}.${username}`) || null\n }\n\n /**\n * Remove a user\n */\n removeUser(username: string, db: string): boolean {\n return this.credentials.delete(`${db}.${username}`)\n }\n\n /**\n * Check if a user exists\n */\n hasUser(username: string, db: string): boolean {\n return this.credentials.has(`${db}.${username}`)\n }\n}\n","/**\n * Command Router\n *\n * Dispatches incoming commands to their handlers\n */\n\nimport type { Document } from 'bson'\nimport type { CommandHandler, CommandContext, CommandResult } from './types.js'\nimport { errorResponse, ErrorCode } from './types.js'\nimport type { MondoBackend } from '../backend/interface.js'\nimport {\n HelloCommand,\n PingCommand,\n BuildInfoCommand,\n HostInfoCommand,\n WhatsmyuriCommand,\n GetLogCommand,\n GetParameterCommand,\n GetCmdLineOptsCommand,\n} from './hello.js'\nimport {\n ListDatabasesCommand,\n ListCollectionsCommand,\n CreateCommand,\n DropCommand,\n DropDatabaseCommand,\n CollStatsCommand,\n DbStatsCommand,\n ServerStatusCommand,\n} from './admin.js'\nimport {\n FindCommand,\n InsertCommand,\n UpdateCommand,\n DeleteCommand,\n CountCommand,\n DistinctCommand,\n GetMoreCommand,\n KillCursorsCommand,\n} from './crud.js'\nimport { AggregateCommand } from './aggregate.js'\nimport { ListIndexesCommand, CreateIndexesCommand, DropIndexesCommand } from './index.js'\nimport {\n SaslStartCommand,\n SaslContinueCommand,\n AuthenticateCommand,\n LogoutCommand,\n requiresAuthentication,\n type AuthCommandContext,\n} from './auth.js'\nimport { ScramAuthenticator, type CredentialsProvider } from '../auth/scram.js'\nimport type { ConnectionState } from '../types.js'\n\n/** Router configuration options */\nexport interface RouterOptions {\n /** Enable authentication requirement */\n authEnabled?: boolean\n /** Credentials provider for authentication */\n credentialsProvider?: CredentialsProvider\n /** Function to get connection state */\n getConnectionState?: (connectionId: number) => ConnectionState | undefined\n /** Function to update connection state after authentication */\n setConnectionAuthenticated?: (connectionId: number, username: string, db: string) => void\n /** Function to clear authentication */\n clearConnectionAuthentication?: (connectionId: number) => void\n}\n\nexport class CommandRouter {\n private handlers: Map<string, CommandHandler>\n private authEnabled: boolean\n private authenticator?: ScramAuthenticator\n private getConnectionState: ((connectionId: number) => ConnectionState | undefined) | undefined\n private setConnectionAuthenticated: ((connectionId: number, username: string, db: string) => void) | undefined\n private clearConnectionAuthentication: ((connectionId: number) => void) | undefined\n\n constructor(backend: MondoBackend, options: RouterOptions = {}) {\n this.authEnabled = options.authEnabled ?? false\n this.getConnectionState = options.getConnectionState\n this.setConnectionAuthenticated = options.setConnectionAuthenticated\n this.clearConnectionAuthentication = options.clearConnectionAuthentication\n\n // Initialize authenticator if credentials provider is given\n if (options.credentialsProvider) {\n this.authenticator = new ScramAuthenticator(options.credentialsProvider)\n }\n\n // Initialize all command handlers\n this.handlers = new Map<string, CommandHandler>([\n // Handshake & discovery\n ['hello', new HelloCommand()],\n ['ismaster', new HelloCommand()],\n ['isMaster', new HelloCommand()],\n\n // System info\n ['ping', new PingCommand()],\n ['buildInfo', new BuildInfoCommand()],\n ['buildinfo', new BuildInfoCommand()],\n ['hostInfo', new HostInfoCommand()],\n ['whatsmyuri', new WhatsmyuriCommand()],\n ['getLog', new GetLogCommand()],\n ['getParameter', new GetParameterCommand()],\n ['getCmdLineOpts', new GetCmdLineOptsCommand()],\n\n // Admin commands\n ['listDatabases', new ListDatabasesCommand(backend)],\n ['listCollections', new ListCollectionsCommand(backend)],\n ['create', new CreateCommand(backend)],\n ['drop', new DropCommand(backend)],\n ['dropDatabase', new DropDatabaseCommand(backend)],\n ['collStats', new CollStatsCommand(backend)],\n ['dbStats', new DbStatsCommand(backend)],\n ['serverStatus', new ServerStatusCommand(backend)],\n\n // CRUD\n ['find', new FindCommand(backend)],\n ['insert', new InsertCommand(backend)],\n ['update', new UpdateCommand(backend)],\n ['delete', new DeleteCommand(backend)],\n ['count', new CountCommand(backend)],\n ['distinct', new DistinctCommand(backend)],\n ['getMore', new GetMoreCommand(backend)],\n ['killCursors', new KillCursorsCommand(backend)],\n\n // Aggregation\n ['aggregate', new AggregateCommand(backend)],\n\n // Indexes\n ['listIndexes', new ListIndexesCommand(backend)],\n ['createIndexes', new CreateIndexesCommand(backend)],\n ['dropIndexes', new DropIndexesCommand(backend)],\n ])\n\n // Register authentication commands if authenticator is available\n if (this.authenticator) {\n this.handlers.set('saslStart', new SaslStartCommand(this.authenticator))\n this.handlers.set('saslContinue', new SaslContinueCommand(this.authenticator))\n }\n\n // Always register authenticate and logout (even if auth not fully enabled)\n this.handlers.set('authenticate', new AuthenticateCommand())\n if (this.clearConnectionAuthentication) {\n this.handlers.set('logout', new LogoutCommand(this.clearConnectionAuthentication))\n }\n }\n\n /**\n * Route a command to its handler\n */\n async route(command: Document, context: CommandContext): Promise<CommandResult> {\n // Get the command name (first key in the document)\n const commandName = Object.keys(command).find((key) => !key.startsWith('$'))\n\n if (!commandName) {\n return {\n response: errorResponse(\n ErrorCode.COMMAND_NOT_FOUND,\n 'no command found in request'\n ),\n }\n }\n\n // Check authentication if enabled\n if (this.authEnabled && requiresAuthentication(commandName)) {\n const connState = this.getConnectionState?.(context.connectionId)\n if (!connState?.authenticated) {\n return {\n response: errorResponse(\n ErrorCode.UNAUTHORIZED,\n `command ${commandName} requires authentication`\n ),\n }\n }\n }\n\n const handler = this.handlers.get(commandName)\n\n if (!handler) {\n // Check for case-insensitive match\n const lowerName = commandName.toLowerCase()\n for (const [name, h] of this.handlers) {\n if (name.toLowerCase() === lowerName) {\n return this.executeHandler(h, command, context, commandName)\n }\n }\n\n return {\n response: errorResponse(\n ErrorCode.COMMAND_NOT_FOUND,\n `no such command: '${commandName}'`\n ),\n }\n }\n\n return this.executeHandler(handler, command, context, commandName)\n }\n\n private async executeHandler(\n handler: CommandHandler,\n command: Document,\n context: CommandContext,\n commandName: string\n ): Promise<CommandResult> {\n try {\n // For auth commands, extend context with setAuthenticated callback\n if (commandName === 'saslStart' || commandName === 'saslContinue') {\n const authContext: AuthCommandContext = {\n ...context,\n setAuthenticated: (username: string, db: string) => {\n this.setConnectionAuthenticated?.(context.connectionId, username, db)\n },\n }\n return await handler.execute(command, authContext)\n }\n\n return await handler.execute(command, context)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`Error executing command '${commandName}':`, message)\n\n return {\n response: errorResponse(ErrorCode.INTERNAL_ERROR, message),\n }\n }\n }\n\n /**\n * Check if a command exists\n */\n hasCommand(name: string): boolean {\n return this.handlers.has(name)\n }\n\n /**\n * Register a new command handler\n */\n registerCommand(name: string, handler: CommandHandler): void {\n this.handlers.set(name, handler)\n }\n}\n","/**\n * MongoDB Wire Protocol Server\n *\n * TCP server that speaks the MongoDB wire protocol.\n * Can run locally with Bun for development/Compass support.\n */\n\nimport type { Socket } from 'bun'\nimport { parseMessage, extractCommand, serializeOpMsg, serializeOpReply } from './message.js'\nimport { CommandRouter } from './commands/router.js'\nimport type { MondoBackend } from './backend/interface.js'\nimport type { ConnectionState } from './types.js'\nimport { OpCode } from './types.js'\nimport { requiresAuthentication } from './commands/auth.js'\nimport { ScramAuthenticator, InMemoryCredentialsProvider } from './auth/scram.js'\nimport { SaslStartCommand, SaslContinueCommand, LogoutCommand } from './commands/auth.js'\n\n/** TLS configuration options for secure connections */\nexport interface TlsOptions {\n /**\n * Private key in PEM format.\n * Can be a string path, Buffer, or Bun.file()\n */\n key: string | Buffer | ReturnType<typeof Bun.file>\n /**\n * Certificate chain in PEM format.\n * Can be a string path, Buffer, or Bun.file()\n */\n cert: string | Buffer | ReturnType<typeof Bun.file>\n /**\n * Optionally override the trusted CA certificates.\n * Default is to trust well-known CAs curated by Mozilla.\n */\n ca?: string | Buffer | ReturnType<typeof Bun.file> | Array<string | Buffer | ReturnType<typeof Bun.file>>\n /**\n * Passphrase for encrypted private key\n */\n passphrase?: string\n /**\n * Request a certificate from clients (mutual TLS)\n * Default: false\n */\n requestCert?: boolean\n /**\n * Reject connections from clients with invalid/untrusted certificates\n * Only has effect when requestCert is true\n * Default: true\n */\n rejectUnauthorized?: boolean\n /**\n * Minimum TLS version to allow\n * Default: 'TLSv1.2'\n */\n minVersion?: 'TLSv1' | 'TLSv1.1' | 'TLSv1.2' | 'TLSv1.3'\n /**\n * Maximum TLS version to allow\n * Default: 'TLSv1.3'\n */\n maxVersion?: 'TLSv1' | 'TLSv1.1' | 'TLSv1.2' | 'TLSv1.3'\n /**\n * Server name for SNI (Server Name Indication)\n */\n serverName?: string\n /**\n * ALPN protocols to advertise\n */\n ALPNProtocols?: string[]\n}\n\n/** Authentication configuration options */\nexport interface AuthOptions {\n /** Enable authentication (default: false for local development) */\n enabled: boolean\n /** Username for SCRAM-SHA-256 authentication */\n username: string\n /** Password for SCRAM-SHA-256 authentication */\n password: string\n}\n\n/** Server configuration options */\nexport interface ServerOptions {\n /** Port to listen on (default: 27017) */\n port?: number\n /** Host to bind to (default: 'localhost') */\n host?: string\n /** Enable verbose logging */\n verbose?: boolean\n /**\n * TLS configuration for secure connections.\n * When provided, the server will use TLS/SSL.\n * If not provided, the server runs without encryption (for local development).\n */\n tls?: TlsOptions\n /**\n * SECURITY: Authentication configuration\n * When enabled, clients must authenticate before executing most commands\n */\n auth?: AuthOptions\n}\n\nconst DEFAULT_OPTIONS: ServerOptions = {\n port: 27017,\n host: 'localhost',\n verbose: false,\n}\n\n/**\n * Wire Protocol Server\n *\n * Handles TCP connections and dispatches commands to the router.\n * SECURITY: Supports optional authentication via SCRAM-SHA-256.\n */\nexport class WireProtocolServer {\n private options: Required<ServerOptions>\n private router: CommandRouter\n private connections: Map<number, ConnectionState> = new Map()\n private nextConnectionId = 1\n private nextRequestId = 1\n // Use unknown to avoid typing issues with Bun.listen union types\n private server: unknown = null\n private authenticator: ScramAuthenticator | null = null\n\n constructor(backend: MondoBackend, options: ServerOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options } as Required<ServerOptions>\n this.router = new CommandRouter(backend)\n\n // SECURITY: Set up authentication if configured\n if (this.options.auth?.enabled) {\n const credentialsProvider = new InMemoryCredentialsProvider()\n // Add the configured user\n credentialsProvider.addUser(\n this.options.auth.username,\n this.options.auth.password,\n 'admin' // Default auth database\n ).then(() => {\n console.log(`Authentication enabled for user: ${this.options.auth!.username}`)\n })\n\n this.authenticator = new ScramAuthenticator(credentialsProvider)\n\n // Register auth commands\n this.router.registerCommand('saslStart', new SaslStartCommand(this.authenticator))\n this.router.registerCommand('saslContinue', new SaslContinueCommand(this.authenticator))\n this.router.registerCommand('logout', new LogoutCommand((connId) => {\n const conn = this.connections.get(connId)\n if (conn) {\n conn.authenticated = false\n }\n }))\n }\n }\n\n /**\n * Start the server\n */\n async start(): Promise<void> {\n const { port, host, verbose, tls } = this.options\n\n // Socket data type\n type SocketData = { connectionId: number; buffer: Buffer }\n\n // Socket handlers shared between TLS and non-TLS modes\n const socketHandlers = {\n open: (socket: Socket<SocketData>) => {\n const connectionId = this.nextConnectionId++\n socket.data = { connectionId, buffer: Buffer.alloc(0) }\n\n this.connections.set(connectionId, {\n id: connectionId,\n authenticated: false,\n compressionEnabled: false,\n cursors: new Map(),\n })\n\n if (verbose) {\n const connType = tls ? 'TLS connection' : 'Connection'\n console.log(`[${connectionId}] ${connType} opened`)\n }\n },\n\n data: async (socket: Socket<SocketData>, data: Buffer) => {\n // Accumulate data in buffer\n socket.data.buffer = Buffer.concat([socket.data.buffer, data])\n\n // Process complete messages\n await this.processBuffer(socket)\n },\n\n close: (socket: Socket<SocketData>) => {\n const connId = socket.data.connectionId\n\n if (verbose) {\n console.log(`[${connId}] Connection closed`)\n }\n\n this.connections.delete(connId)\n },\n\n error: (socket: Socket<SocketData>, error: Error) => {\n const { connectionId } = socket.data\n console.error(`[${connectionId}] Socket error:`, error)\n },\n }\n\n // Start server with or without TLS\n if (tls) {\n // TLS mode\n this.server = Bun.listen<SocketData>({\n hostname: host,\n port,\n socket: socketHandlers,\n tls: this.buildTlsConfig(tls),\n })\n console.log(`mongo.do wire protocol server listening on TLS ${host}:${port}`)\n } else {\n // Non-TLS mode (default for local development)\n this.server = Bun.listen<SocketData>({\n hostname: host,\n port,\n socket: socketHandlers,\n })\n console.log(`mongo.do wire protocol server listening on TCP ${host}:${port}`)\n }\n }\n\n /**\n * Build TLS configuration object from TlsOptions\n */\n private buildTlsConfig(tlsOptions: TlsOptions): Record<string, any> {\n const config: Record<string, any> = {\n key: tlsOptions.key,\n cert: tlsOptions.cert,\n }\n\n // Add optional TLS settings\n if (tlsOptions.ca !== undefined) {\n config.ca = tlsOptions.ca\n }\n if (tlsOptions.passphrase !== undefined) {\n config.passphrase = tlsOptions.passphrase\n }\n if (tlsOptions.requestCert !== undefined) {\n config.requestCert = tlsOptions.requestCert\n }\n if (tlsOptions.rejectUnauthorized !== undefined) {\n config.rejectUnauthorized = tlsOptions.rejectUnauthorized\n }\n if (tlsOptions.minVersion !== undefined) {\n config.minVersion = tlsOptions.minVersion\n }\n if (tlsOptions.maxVersion !== undefined) {\n config.maxVersion = tlsOptions.maxVersion\n }\n if (tlsOptions.serverName !== undefined) {\n config.serverName = tlsOptions.serverName\n }\n if (tlsOptions.ALPNProtocols !== undefined) {\n config.ALPNProtocols = tlsOptions.ALPNProtocols\n }\n\n return config\n }\n\n /**\n * Stop the server\n */\n async stop(): Promise<void> {\n if (this.server) {\n (this.server as { stop: () => void }).stop()\n this.server = null\n console.log('Server stopped')\n }\n }\n\n /**\n * Process accumulated buffer for complete messages\n */\n private async processBuffer(\n socket: Socket<{ connectionId: number; buffer: Buffer }>\n ): Promise<void> {\n const { connectionId, buffer } = socket.data\n\n // Need at least 4 bytes to read message length\n while (buffer.length >= 4) {\n const messageLength = buffer.readInt32LE(0)\n\n // Check if we have the complete message\n if (buffer.length < messageLength) {\n break\n }\n\n // Extract the complete message\n const messageBuffer = buffer.subarray(0, messageLength)\n socket.data.buffer = buffer.subarray(messageLength)\n\n try {\n const response = await this.handleMessage(connectionId, messageBuffer)\n if (response) {\n socket.write(response)\n }\n } catch (error) {\n console.error(`[${connectionId}] Error handling message:`, error)\n // Send error response\n const errorResponse = serializeOpMsg(\n this.nextRequestId++,\n messageBuffer.readInt32LE(4), // responseTo = requestID\n { ok: 0, errmsg: error instanceof Error ? error.message : 'Unknown error', code: 1 }\n )\n socket.write(errorResponse)\n }\n }\n }\n\n /**\n * Handle a single message\n */\n private async handleMessage(\n connectionId: number,\n buffer: Buffer\n ): Promise<Buffer | null> {\n const message = parseMessage(buffer)\n const { db, command, documentSequences } = extractCommand(message)\n\n const cmdName = Object.keys(command).find((k) => !k.startsWith('$'))\n\n if (this.options.verbose) {\n console.log(`[${connectionId}] ${cmdName} on ${db}`)\n }\n\n // SECURITY: Check authentication before executing most commands\n const connection = this.connections.get(connectionId)\n if (this.options.auth?.enabled && connection) {\n const isAuthRequired = requiresAuthentication(cmdName || '')\n\n if (isAuthRequired && !connection.authenticated) {\n // Return authentication error\n const errorResult = {\n ok: 0,\n errmsg: 'Authentication required. Use SCRAM-SHA-256 to authenticate.',\n code: 13, // Unauthorized\n codeName: 'Unauthorized',\n }\n\n if (message.header.opCode === OpCode.OP_QUERY) {\n return serializeOpReply(this.nextRequestId++, message.header.requestID, [errorResult])\n } else {\n return serializeOpMsg(this.nextRequestId++, message.header.requestID, errorResult)\n }\n }\n }\n\n // Execute the command\n const context: Parameters<typeof this.router.route>[1] = {\n db,\n connectionId,\n requestId: message.header.requestID,\n documentSequences,\n // Pass auth info for SASL handlers\n auth: this.options.auth,\n }\n if (connection !== undefined) {\n context.connection = connection\n }\n const result = await this.router.route(command, context)\n\n // Check if this was a successful authentication\n if (cmdName === 'saslContinue' && result.response.ok === 1 && result.response.done === true) {\n if (connection) {\n connection.authenticated = true\n }\n }\n\n // Determine response format based on request format\n if (message.header.opCode === OpCode.OP_QUERY) {\n // Legacy OP_QUERY - respond with OP_REPLY\n return serializeOpReply(\n this.nextRequestId++,\n message.header.requestID,\n [result.response]\n )\n } else {\n // OP_MSG - respond with OP_MSG\n return serializeOpMsg(\n this.nextRequestId++,\n message.header.requestID,\n result.response\n )\n }\n }\n\n /**\n * Get server address info\n */\n get address(): { host: string; port: number; tls: boolean } {\n return {\n host: this.options.host,\n port: this.options.port,\n tls: this.isTls,\n }\n }\n\n /**\n * Check if server is using TLS\n */\n get isTls(): boolean {\n return this.options.tls !== undefined\n }\n\n /**\n * Get the MongoDB connection string for this server\n * Returns mongodb:// for non-TLS or mongodb+srv:// style for TLS\n */\n get connectionString(): string {\n const { host, port } = this.options\n const protocol = this.isTls ? 'mongodb+ssl' : 'mongodb'\n return `${protocol}://${host}:${port}`\n }\n}\n\n/**\n * Create and start a wire protocol server\n */\nexport async function createServer(\n backend: MondoBackend,\n options: ServerOptions = {}\n): Promise<WireProtocolServer> {\n const server = new WireProtocolServer(backend, options)\n await server.start()\n return server\n}\n","{\n \"name\": \"mongo.do\",\n \"version\": \"0.1.1\",\n \"description\": \"MongoDB-compatible database backed by Cloudflare Durable Objects SQLite\",\n \"author\": \"Nathan Clevenger\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/nathanclevenger/mongo.do.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/nathanclevenger/mongo.do/issues\"\n },\n \"homepage\": \"https://github.com/nathanclevenger/mongo.do#readme\",\n \"type\": \"module\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"bin\": {\n \"mongo.do\": \"./dist/cli/index.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n }\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"wrangler dev\",\n \"start\": \"bun run src/cli/index.ts\",\n \"start:verbose\": \"bun run src/cli/index.ts --verbose\",\n \"server\": \"bun run src/cli/index.ts\",\n \"server:verbose\": \"bun run src/cli/index.ts --verbose\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:compat\": \"vitest run --config vitest.config.compat.ts\",\n \"test:compat:watch\": \"vitest --config vitest.config.compat.ts\",\n \"typecheck\": \"tsc --noEmit\",\n \"deploy\": \"wrangler deploy\",\n \"prepublishOnly\": \"npm run build && npm run test\"\n },\n \"dependencies\": {\n \"bson\": \"^6.10.0\",\n \"capnweb\": \"^0.1.0\",\n \"js-yaml\": \"^4.1.1\",\n \"zod\": \"^4.3.5\"\n },\n \"devDependencies\": {\n \"@cloudflare/vitest-pool-workers\": \"^0.11.1\",\n \"@cloudflare/workers-types\": \"^4.20240925.0\",\n \"@testing-library/jest-dom\": \"^6.9.1\",\n \"@testing-library/react\": \"^16.3.1\",\n \"@testing-library/user-event\": \"^14.6.1\",\n \"@types/bun\": \"^1.2.4\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^20.19.27\",\n \"@types/react\": \"^19.2.7\",\n \"@types/react-dom\": \"^19.2.3\",\n \"@vitejs/plugin-react\": \"^5.1.2\",\n \"jsdom\": \"^27.4.0\",\n \"mongodb\": \"^7.0.0\",\n \"mongodb-memory-server\": \"^11.0.1\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.6.0\",\n \"vitest\": \"^3.2.4\",\n \"wrangler\": \"^4.54.0\"\n },\n \"keywords\": [\n \"mongodb\",\n \"cloudflare\",\n \"durable-objects\",\n \"sqlite\",\n \"database\"\n ],\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n }\n}\n","/**\n * WorkersProxyBackend\n *\n * MondoBackend implementation that proxies requests to Cloudflare Workers\n * via the RPC endpoint. This enables the wire protocol server to delegate\n * operations to a remote Cloudflare Workers deployment.\n */\n\nimport type { Document } from 'bson'\nimport type {\n MondoBackend,\n DatabaseInfo,\n CollectionInfo,\n FindOptions,\n FindResult,\n InsertResult,\n UpdateResult,\n DeleteResult,\n AggregateResult,\n CollStats,\n DbStats,\n IndexInfo,\n IndexSpec,\n CursorState,\n} from './interface.js'\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\n/**\n * Configuration options for WorkersProxyBackend\n */\nexport interface WorkersProxyBackendOptions {\n /** RPC endpoint URL (required) */\n endpoint: string\n /** Authentication token (optional) */\n authToken?: string\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number\n /** Number of retries on transient failures (default: 0) */\n retries?: number\n /** Delay between retries in milliseconds (default: 1000) */\n retryDelay?: number\n}\n\n/**\n * RPC request structure\n */\ninterface RpcRequest {\n method: string\n db?: string\n collection?: string\n filter?: Document\n update?: Document\n document?: Document\n documents?: Document[]\n pipeline?: Document[]\n options?: Document\n field?: string\n query?: Document\n}\n\n/**\n * RPC success response\n */\ninterface RpcSuccessResponse {\n ok: 1\n result: unknown\n}\n\n/**\n * RPC error response\n */\ninterface RpcErrorResponse {\n ok: 0\n error: string\n code: number\n codeName?: string\n}\n\ntype RpcResponse = RpcSuccessResponse | RpcErrorResponse\n\n/**\n * Error with MongoDB-compatible error code\n */\nexport class MongoProxyError extends Error {\n code: number\n codeName?: string\n\n constructor(message: string, code: number, codeName?: string) {\n super(message)\n this.name = 'MongoProxyError'\n this.code = code\n if (codeName) {\n this.codeName = codeName\n }\n }\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Cursor timeout in milliseconds (10 minutes) */\nconst CURSOR_TIMEOUT_MS = 10 * 60 * 1000\n\n/** HTTP status codes that should trigger retries */\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504])\n\n/** MongoDB error codes that should not be retried */\nconst NON_RETRYABLE_ERROR_CODES = new Set([\n 2, // BadValue\n 13, // Unauthorized\n 26, // NamespaceNotFound\n 59, // CommandNotFound\n 11000, // DuplicateKey\n])\n\n// ============================================================================\n// WorkersProxyBackend Implementation\n// ============================================================================\n\n/**\n * MondoBackend implementation that proxies to Cloudflare Workers RPC endpoint\n */\nexport class WorkersProxyBackend implements MondoBackend {\n private endpoint: string\n private authToken?: string\n private timeout: number\n private retries: number\n private retryDelay: number\n private cursors: Map<bigint, CursorState> = new Map()\n\n constructor(options: WorkersProxyBackendOptions) {\n // Validate endpoint\n if (!options.endpoint) {\n throw new Error('WorkersProxyBackend requires an endpoint URL')\n }\n\n try {\n new URL(options.endpoint)\n } catch {\n throw new Error(`WorkersProxyBackend endpoint is not a valid URL: ${options.endpoint}`)\n }\n\n this.endpoint = options.endpoint\n if (options.authToken) {\n this.authToken = options.authToken\n }\n this.timeout = options.timeout ?? 30000\n this.retries = options.retries ?? 0\n this.retryDelay = options.retryDelay ?? 1000\n }\n\n // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n /**\n * Make an RPC call to the Workers endpoint\n */\n private async rpc<T>(request: RpcRequest, attempt = 0): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (this.authToken) {\n headers['Authorization'] = `Bearer ${this.authToken}`\n }\n\n try {\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n signal: AbortSignal.timeout(this.timeout),\n })\n\n // Check for HTTP errors\n if (!response.ok && !response.headers.get('Content-Type')?.includes('application/json')) {\n const error = new Error(`HTTP error: ${response.status} ${response.statusText}`)\n\n // Retry on retryable status codes\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < this.retries) {\n await this.delay(this.retryDelay)\n return this.rpc<T>(request, attempt + 1)\n }\n\n throw error\n }\n\n // Parse response\n let data: RpcResponse\n try {\n data = await response.json() as RpcResponse\n } catch {\n throw new Error('Invalid JSON response from RPC endpoint')\n }\n\n // Check for RPC errors\n if (data.ok === 0) {\n const error = new MongoProxyError(data.error, data.code, data.codeName)\n\n // Don't retry non-retryable error codes\n if (NON_RETRYABLE_ERROR_CODES.has(data.code)) {\n throw error\n }\n\n throw error\n }\n\n return data.result as T\n } catch (error) {\n // Retry on network errors\n if (\n attempt < this.retries &&\n error instanceof Error &&\n !('code' in error && NON_RETRYABLE_ERROR_CODES.has((error as MongoProxyError).code))\n ) {\n await this.delay(this.retryDelay)\n return this.rpc<T>(request, attempt + 1)\n }\n\n throw error\n }\n }\n\n /**\n * Delay for a specified number of milliseconds\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n }\n\n /**\n * Convert cursor ID from string to bigint\n */\n private parseCursorId(cursorId: string | bigint): bigint {\n if (typeof cursorId === 'bigint') return cursorId\n return BigInt(cursorId)\n }\n\n // ==========================================================================\n // Database Operations\n // ==========================================================================\n\n async listDatabases(): Promise<DatabaseInfo[]> {\n return this.rpc<DatabaseInfo[]>({ method: 'listDatabases' })\n }\n\n async createDatabase(name: string): Promise<void> {\n await this.rpc<null>({ method: 'createDatabase', db: name })\n }\n\n async dropDatabase(name: string): Promise<void> {\n await this.rpc<null>({ method: 'dropDatabase', db: name })\n }\n\n async databaseExists(name: string): Promise<boolean> {\n return this.rpc<boolean>({ method: 'databaseExists', db: name })\n }\n\n // ==========================================================================\n // Collection Operations\n // ==========================================================================\n\n async listCollections(db: string, filter?: Document): Promise<CollectionInfo[]> {\n const request: RpcRequest = {\n method: 'listCollections',\n db,\n }\n if (filter) {\n request.filter = filter\n }\n return this.rpc<CollectionInfo[]>(request)\n }\n\n async createCollection(db: string, name: string, options?: Document): Promise<void> {\n const request: RpcRequest = {\n method: 'createCollection',\n db,\n collection: name,\n }\n if (options) {\n request.options = options\n }\n await this.rpc<null>(request)\n }\n\n async dropCollection(db: string, name: string): Promise<void> {\n await this.rpc<null>({\n method: 'dropCollection',\n db,\n collection: name,\n })\n }\n\n async collectionExists(db: string, name: string): Promise<boolean> {\n return this.rpc<boolean>({\n method: 'collectionExists',\n db,\n collection: name,\n })\n }\n\n async collStats(db: string, collection: string): Promise<CollStats> {\n return this.rpc<CollStats>({\n method: 'collStats',\n db,\n collection,\n })\n }\n\n async dbStats(db: string): Promise<DbStats> {\n return this.rpc<DbStats>({\n method: 'dbStats',\n db,\n })\n }\n\n // ==========================================================================\n // CRUD Operations\n // ==========================================================================\n\n async find(db: string, collection: string, options: FindOptions): Promise<FindResult> {\n const request: RpcRequest = {\n method: 'find',\n db,\n collection,\n }\n if (options.filter) {\n request.filter = options.filter\n }\n const findOptions: Document = {}\n if (options.projection) findOptions.projection = options.projection\n if (options.sort) findOptions.sort = options.sort\n if (options.limit !== undefined) findOptions.limit = options.limit\n if (options.skip !== undefined) findOptions.skip = options.skip\n if (options.batchSize !== undefined) findOptions.batchSize = options.batchSize\n if (options.hint) findOptions.hint = options.hint\n if (options.comment) findOptions.comment = options.comment\n if (options.allowDiskUse !== undefined) findOptions.allowDiskUse = options.allowDiskUse\n if (options.collation) findOptions.collation = options.collation\n if (Object.keys(findOptions).length > 0) {\n request.options = findOptions\n }\n const result = await this.rpc<{\n documents: Document[]\n cursorId: string\n hasMore: boolean\n }>(request)\n\n return {\n documents: result.documents,\n cursorId: this.parseCursorId(result.cursorId),\n hasMore: result.hasMore,\n }\n }\n\n async insertOne(db: string, collection: string, doc: Document): Promise<InsertResult> {\n const result = await this.rpc<{\n acknowledged: boolean\n insertedIds: Record<number, unknown>\n insertedCount: number\n }>({\n method: 'insertOne',\n db,\n collection,\n document: doc,\n })\n\n return {\n acknowledged: result.acknowledged,\n insertedIds: new Map(Object.entries(result.insertedIds).map(([k, v]) => [Number(k), v])),\n insertedCount: result.insertedCount,\n }\n }\n\n async insertMany(db: string, collection: string, docs: Document[]): Promise<InsertResult> {\n const result = await this.rpc<{\n acknowledged: boolean\n insertedIds: Record<number, unknown>\n insertedCount: number\n }>({\n method: 'insertMany',\n db,\n collection,\n documents: docs,\n })\n\n return {\n acknowledged: result.acknowledged,\n insertedIds: new Map(Object.entries(result.insertedIds).map(([k, v]) => [Number(k), v])),\n insertedCount: result.insertedCount,\n }\n }\n\n async updateOne(\n db: string,\n collection: string,\n filter: Document,\n update: Document,\n options?: { upsert?: boolean; arrayFilters?: Document[] }\n ): Promise<UpdateResult> {\n const request: RpcRequest = {\n method: 'updateOne',\n db,\n collection,\n filter,\n update,\n }\n if (options) {\n request.options = options\n }\n return this.rpc<UpdateResult>(request)\n }\n\n async updateMany(\n db: string,\n collection: string,\n filter: Document,\n update: Document,\n options?: { upsert?: boolean; arrayFilters?: Document[] }\n ): Promise<UpdateResult> {\n const request: RpcRequest = {\n method: 'updateMany',\n db,\n collection,\n filter,\n update,\n }\n if (options) {\n request.options = options\n }\n return this.rpc<UpdateResult>(request)\n }\n\n async deleteOne(db: string, collection: string, filter: Document): Promise<DeleteResult> {\n return this.rpc<DeleteResult>({\n method: 'deleteOne',\n db,\n collection,\n filter,\n })\n }\n\n async deleteMany(db: string, collection: string, filter: Document): Promise<DeleteResult> {\n return this.rpc<DeleteResult>({\n method: 'deleteMany',\n db,\n collection,\n filter,\n })\n }\n\n // ==========================================================================\n // Count and Distinct\n // ==========================================================================\n\n async count(db: string, collection: string, query?: Document): Promise<number> {\n const request: RpcRequest = {\n method: 'count',\n db,\n collection,\n }\n if (query) {\n request.query = query\n }\n return this.rpc<number>(request)\n }\n\n async distinct(db: string, collection: string, field: string, query?: Document): Promise<unknown[]> {\n const request: RpcRequest = {\n method: 'distinct',\n db,\n collection,\n field,\n }\n if (query) {\n request.query = query\n }\n return this.rpc<unknown[]>(request)\n }\n\n // ==========================================================================\n // Aggregation\n // ==========================================================================\n\n async aggregate(\n db: string,\n collection: string,\n pipeline: Document[],\n options?: { batchSize?: number; allowDiskUse?: boolean }\n ): Promise<AggregateResult> {\n const request: RpcRequest = {\n method: 'aggregate',\n db,\n collection,\n pipeline,\n }\n if (options) {\n request.options = options\n }\n const result = await this.rpc<{\n documents: Document[]\n cursorId: string\n hasMore: boolean\n }>(request)\n\n return {\n documents: result.documents,\n cursorId: this.parseCursorId(result.cursorId),\n hasMore: result.hasMore,\n }\n }\n\n // ==========================================================================\n // Index Operations\n // ==========================================================================\n\n async listIndexes(db: string, collection: string): Promise<IndexInfo[]> {\n return this.rpc<IndexInfo[]>({\n method: 'listIndexes',\n db,\n collection,\n })\n }\n\n async createIndexes(db: string, collection: string, indexes: IndexSpec[]): Promise<string[]> {\n return this.rpc<string[]>({\n method: 'createIndexes',\n db,\n collection,\n options: { indexes },\n })\n }\n\n async dropIndex(db: string, collection: string, indexName: string): Promise<void> {\n await this.rpc<null>({\n method: 'dropIndex',\n db,\n collection,\n options: { indexName },\n })\n }\n\n async dropIndexes(db: string, collection: string): Promise<void> {\n await this.rpc<null>({\n method: 'dropIndexes',\n db,\n collection,\n })\n }\n\n // ==========================================================================\n // Cursor Management\n // ==========================================================================\n\n createCursor(state: CursorState): void {\n this.cursors.set(state.id, state)\n }\n\n getCursor(id: bigint): CursorState | undefined {\n return this.cursors.get(id)\n }\n\n advanceCursor(id: bigint, count: number): Document[] {\n const cursor = this.cursors.get(id)\n if (!cursor) {\n return []\n }\n\n const start = cursor.position\n const end = Math.min(start + count, cursor.documents.length)\n cursor.position = end\n\n return cursor.documents.slice(start, end)\n }\n\n closeCursor(id: bigint): boolean {\n return this.cursors.delete(id)\n }\n\n cleanupExpiredCursors(): void {\n const now = Date.now()\n for (const [id, cursor] of this.cursors) {\n if (now - cursor.createdAt > CURSOR_TIMEOUT_MS) {\n this.cursors.delete(id)\n }\n }\n }\n}\n","/**\n * CLI Server Module\n *\n * Enhanced CLI for MondoDB wire protocol server with support for\n * local SQLite backend and remote Cloudflare Workers proxy.\n *\n * @module cli/server\n *\n * @example\n * ```typescript\n * import { parseArgs, runServer, printStartupMessage } from './server'\n *\n * const options = parseArgs(process.argv.slice(2))\n * if (options.help) {\n * printHelp()\n * process.exit(0)\n * }\n *\n * const controller = await runServer(options)\n * printStartupMessage(options)\n *\n * // Later, gracefully shutdown\n * await controller.stop()\n * ```\n */\n\nimport type { MondoBackend } from '../wire/backend/interface.js'\nimport { WorkersProxyBackend } from '../wire/backend/workers-proxy.js'\n\n// Lazy imports for Bun-specific modules (deferred to avoid bun:sqlite in Node tests)\nlet LocalSQLiteBackend: typeof import('../wire/backend/local-sqlite.js').LocalSQLiteBackend\nlet WireProtocolServer: typeof import('../wire/server.js').WireProtocolServer\n\n/**\n * Lazy load Bun-specific modules to avoid issues in Node.js environments.\n * These modules depend on bun:sqlite which is not available in Node.\n *\n * @internal\n */\nasync function loadBunModules(): Promise<void> {\n if (!LocalSQLiteBackend) {\n const localModule = await import('../wire/backend/local-sqlite.js')\n LocalSQLiteBackend = localModule.LocalSQLiteBackend\n }\n if (!WireProtocolServer) {\n const serverModule = await import('../wire/server.js')\n WireProtocolServer = serverModule.WireProtocolServer\n }\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Command-line options for the MondoDB server.\n */\nexport interface CLIOptions {\n /** Port number to listen on (1-65535) */\n port: number\n /** Host address to bind to (e.g., 'localhost', '0.0.0.0') */\n host: string\n /** Directory path for local SQLite data storage */\n dataDir: string\n /** Optional URL for remote Cloudflare Workers endpoint */\n remote?: string\n /** Enable verbose logging output */\n verbose: boolean\n /** Display help message and exit */\n help: boolean\n}\n\n/**\n * Controller interface for managing a running server instance.\n * Provides methods and properties to monitor and control the server lifecycle.\n */\nexport interface ServerController {\n /** Gracefully stop the server and close all connections */\n stop(): Promise<void>\n /** Whether the server is currently running */\n isRunning: boolean\n /** Whether the server is accepting new connections */\n isAcceptingConnections: boolean\n /** Number of currently active client connections */\n activeConnections: number\n /** The address the server is bound to */\n address: { host: string; port: number }\n}\n\n// ============================================================================\n// Argument Parsing\n// ============================================================================\n\n/**\n * Parse command-line arguments into a CLIOptions object.\n *\n * Supports both long-form (--port) and short-form (-p) arguments.\n * Unknown arguments are silently ignored.\n *\n * @param args - Array of command-line arguments (typically process.argv.slice(2))\n * @returns Parsed CLI options with defaults applied\n *\n * @example\n * ```typescript\n * const options = parseArgs(['--port', '27018', '--verbose'])\n * // options.port === 27018\n * // options.verbose === true\n * ```\n */\nexport function parseArgs(args: string[]): CLIOptions {\n const options: CLIOptions = {\n port: 27017,\n host: 'localhost',\n dataDir: './data',\n verbose: false,\n help: false,\n }\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (!arg) continue\n\n // Handle --help / -h\n if (arg === '--help' || arg === '-h') {\n options.help = true\n continue\n }\n\n // Handle --verbose / -v\n if (arg === '--verbose' || arg === '-v') {\n options.verbose = true\n continue\n }\n\n // Handle --port / -p\n if (arg.startsWith('--port=')) {\n options.port = parseInt(arg.slice(7), 10)\n continue\n }\n if (arg.startsWith('-p=')) {\n options.port = parseInt(arg.slice(3), 10)\n continue\n }\n if (arg === '--port' || arg === '-p') {\n const nextArg = args[++i]\n if (nextArg) {\n options.port = parseInt(nextArg, 10)\n }\n continue\n }\n\n // Handle --host / -H (note: -h is for help)\n if (arg.startsWith('--host=')) {\n options.host = arg.slice(7)\n continue\n }\n if (arg.startsWith('-H=')) {\n options.host = arg.slice(3)\n continue\n }\n if (arg === '--host' || arg === '-H') {\n const nextArg = args[++i]\n if (nextArg) {\n options.host = nextArg\n }\n continue\n }\n\n // Handle --data / -d\n if (arg.startsWith('--data=')) {\n options.dataDir = arg.slice(7)\n continue\n }\n if (arg.startsWith('-d=')) {\n options.dataDir = arg.slice(3)\n continue\n }\n if (arg === '--data' || arg === '-d') {\n const nextArg = args[++i]\n if (nextArg) {\n options.dataDir = nextArg\n }\n continue\n }\n\n // Handle --remote / -r\n if (arg.startsWith('--remote=')) {\n options.remote = arg.slice(9)\n continue\n }\n if (arg.startsWith('-r=')) {\n options.remote = arg.slice(3)\n continue\n }\n if (arg === '--remote' || arg === '-r') {\n const nextArg = args[++i]\n if (nextArg) {\n options.remote = nextArg\n }\n continue\n }\n\n // Unknown options are ignored\n }\n\n return options\n}\n\n// ============================================================================\n// Option Validation\n// ============================================================================\n\n/**\n * Validation result returned by validateOptions.\n */\nexport interface ValidationResult {\n /** Whether all options are valid */\n valid: boolean\n /** Array of error messages (empty if valid) */\n errors: string[]\n}\n\n/**\n * Validate CLI options and return a result with all validation errors.\n *\n * Validates:\n * - Port is a valid integer between 1 and 65535\n * - Host is a non-empty string\n * - Data directory is a non-empty string (unless in remote mode)\n * - Remote URL (if provided) is a valid HTTP/HTTPS URL\n *\n * @param options - CLI options to validate\n * @returns ValidationResult with valid boolean and errors array\n *\n * @example\n * ```typescript\n * const result = validateOptions({ port: 0, host: 'localhost', ... })\n * if (!result.valid) {\n * console.error(result.errors.join('\\n'))\n * }\n * ```\n */\nexport function validateOptions(options: CLIOptions): ValidationResult {\n const errors: string[] = []\n\n // Validate port\n if (\n typeof options.port !== 'number' ||\n isNaN(options.port) ||\n !Number.isInteger(options.port) ||\n options.port < 1 ||\n options.port > 65535\n ) {\n errors.push(`Invalid port: ${options.port}. Port must be an integer between 1 and 65535.`)\n }\n\n // Validate host\n if (!options.host || typeof options.host !== 'string' || options.host.trim() === '') {\n errors.push('Invalid host: host cannot be empty')\n }\n\n // Validate dataDir only if not in remote mode\n if (!options.remote) {\n if (!options.dataDir || typeof options.dataDir !== 'string' || options.dataDir.trim() === '') {\n errors.push('Invalid data directory: path cannot be empty')\n }\n }\n\n // Validate remote URL if provided\n if (options.remote !== undefined) {\n if (!options.remote || typeof options.remote !== 'string' || options.remote.trim() === '') {\n errors.push('Invalid remote URL: URL cannot be empty. Use https://your-worker.workers.dev')\n } else {\n try {\n const url = new URL(options.remote)\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n errors.push(`Invalid remote URL: protocol must be http or https, got \"${url.protocol.slice(0, -1)}\"`)\n }\n } catch {\n errors.push(`Invalid remote URL: \"${options.remote}\" is not a valid URL. Use https://your-worker.workers.dev`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n }\n}\n\n// ============================================================================\n// Backend Creation\n// ============================================================================\n\n/**\n * Create the appropriate storage backend based on CLI options.\n *\n * - If `options.remote` is set, creates a WorkersProxyBackend that forwards\n * requests to a remote Cloudflare Workers endpoint.\n * - Otherwise, creates a LocalSQLiteBackend for local file-based storage.\n *\n * @param options - CLI options containing backend configuration\n * @returns Promise resolving to the configured backend instance\n *\n * @example\n * ```typescript\n * // Local backend\n * const local = await createBackend({ dataDir: './data', ... })\n *\n * // Remote backend\n * const remote = await createBackend({ remote: 'https://my-worker.dev', ... })\n * ```\n */\nexport async function createBackend(options: CLIOptions): Promise<MondoBackend> {\n if (options.remote) {\n // Use WorkersProxyBackend for remote mode\n return new WorkersProxyBackend({\n endpoint: options.remote,\n })\n }\n\n // Use LocalSQLiteBackend for local mode (lazy load Bun modules)\n await loadBunModules()\n return new LocalSQLiteBackend(options.dataDir)\n}\n\n// ============================================================================\n// Output Functions\n// ============================================================================\n\n/**\n * Print usage help message to stdout.\n * Displays all available command-line options with descriptions and examples.\n */\nexport function printHelp(): void {\n console.log(`\nUsage: mongo.do serve [options]\n\nStart a MongoDB wire protocol server backed by SQLite.\n\nOptions:\n -p, --port <port> Port to listen on (default: 27017)\n -H, --host <host> Host to bind to (default: localhost)\n -d, --data <path> Data directory for local SQLite storage (default: ./data)\n -r, --remote <url> Proxy/forward to remote Cloudflare Workers endpoint\n -v, --verbose Enable verbose logging\n -V, --version Show version number\n -h, --help Show this help message\n\nExamples:\n # Start local server on default port\n mongo.do serve\n\n # Start on custom port with verbose logging\n mongo.do serve --port 27018 --verbose\n\n # Bind to all interfaces\n mongo.do serve --host 0.0.0.0\n\n # Use custom data directory\n mongo.do serve --data /var/lib/mongodo\n\n # Proxy to remote Cloudflare Workers\n mongo.do serve --remote https://my-mongo-do.workers.dev\n\n # Combine options\n mongo.do serve --port 27018 --host 0.0.0.0 --verbose\n`)\n}\n\n/**\n * Print server startup message to stdout.\n * Displays connection string and backend mode information.\n *\n * @param options - CLI options used to start the server\n */\nexport function printStartupMessage(options: CLIOptions): void {\n const connectionString = `mongodb://${options.host}:${options.port}`\n\n if (options.remote) {\n console.log(`MondoDB server started in proxy/remote mode`)\n console.log(` Connect: ${connectionString}`)\n console.log(` Proxying to: ${options.remote}`)\n } else {\n console.log(`MondoDB server started in local/SQLite mode`)\n console.log(` Connect: ${connectionString}`)\n console.log(` Data directory: ${options.dataDir}`)\n }\n}\n\n/**\n * Print server shutdown message to stdout.\n * Called after graceful server shutdown completes.\n */\nexport function printShutdownMessage(): void {\n console.log('MondoDB server gracefully shutdown. Clean stop complete.')\n}\n\n// ============================================================================\n// Server Runner\n// ============================================================================\n\n/**\n * Start the MongoDB wire protocol server with the given options.\n *\n * This is the main entry point for starting a MondoDB server. It:\n * 1. Validates the provided options\n * 2. Creates the appropriate backend (local or remote)\n * 3. Starts the wire protocol server\n * 4. Sets up signal handlers for graceful shutdown\n *\n * @param options - Server configuration options\n * @param backend - Optional pre-configured backend (for testing)\n * @returns Promise resolving to a ServerController for managing the server\n * @throws {Error} If options are invalid or server fails to start\n *\n * @example\n * ```typescript\n * const controller = await runServer({\n * port: 27017,\n * host: 'localhost',\n * dataDir: './data',\n * verbose: false,\n * help: false,\n * })\n *\n * // Check server status\n * console.log(controller.isRunning) // true\n *\n * // Graceful shutdown\n * await controller.stop()\n * ```\n */\nexport async function runServer(\n options: CLIOptions,\n backend?: MondoBackend\n): Promise<ServerController> {\n // Validate options first\n const validationResult = validateOptions(options)\n if (!validationResult.valid) {\n throw new Error(validationResult.errors[0])\n }\n\n // Create backend if not provided\n const serverBackend = backend ?? await createBackend(options)\n\n // Test remote connection if using remote backend\n if (options.remote && !backend) {\n try {\n // Try to list databases to verify connection\n await serverBackend.listDatabases()\n } catch (e) {\n throw new Error(`Failed to connect to remote worker: ${options.remote}. Network unreachable or worker not responding.`)\n }\n }\n\n // Lazy load WireProtocolServer\n await loadBunModules()\n\n // Create and start the wire protocol server\n const wireServer = new WireProtocolServer(serverBackend, {\n port: options.port,\n host: options.host,\n verbose: options.verbose,\n })\n\n let running = false\n let acceptingConnections = false\n let connectionCount = 0\n\n // Signal handlers\n const handleSignal = async () => {\n if (running) {\n await controller.stop()\n }\n }\n\n const sigintHandler = handleSignal\n const sigtermHandler = handleSignal\n\n // Controller object\n const controller: ServerController = {\n get isRunning() {\n return running\n },\n get isAcceptingConnections() {\n return acceptingConnections\n },\n get activeConnections() {\n return connectionCount\n },\n get address() {\n return { host: options.host, port: options.port }\n },\n async stop() {\n if (!running) return\n\n running = false\n acceptingConnections = false\n connectionCount = 0\n\n // Stop the wire server\n await wireServer.stop()\n\n // Clean up backend if it has a close method\n if ('close' in serverBackend && typeof serverBackend.close === 'function') {\n await (serverBackend as { close: () => Promise<void> }).close()\n }\n\n // Remove signal handlers\n process.removeListener('SIGINT', sigintHandler)\n process.removeListener('SIGTERM', sigtermHandler)\n },\n }\n\n // Register signal handlers\n process.on('SIGINT', sigintHandler)\n process.on('SIGTERM', sigtermHandler)\n\n // Start the server\n try {\n await wireServer.start()\n running = true\n acceptingConnections = true\n } catch (e) {\n // Clean up signal handlers on failure\n process.removeListener('SIGINT', sigintHandler)\n process.removeListener('SIGTERM', sigtermHandler)\n\n // Rethrow with better error message for port in use\n if (e instanceof Error && e.message.includes('EADDRINUSE')) {\n throw new Error(`Port ${options.port} is already in use (EADDRINUSE)`)\n }\n throw e\n }\n\n return controller\n}\n","#!/usr/bin/env node\n/**\n * MondoDB CLI Entry Point\n *\n * Main entry point for the MondoDB command-line interface.\n * Provides a MongoDB-compatible database backed by SQLite or Cloudflare Workers.\n *\n * Usage:\n * mongo.do [options]\n * bun run src/cli/index.ts [options]\n *\n * @module cli\n */\n\nimport { version } from '../../package.json'\nimport {\n parseArgs,\n validateOptions,\n printHelp,\n printStartupMessage as _printStartupMessage,\n printShutdownMessage,\n runServer,\n type CLIOptions,\n} from './server.js'\n\n// ============================================================================\n// ANSI Color Codes (no external dependencies)\n// ============================================================================\n\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n\n // Foreground colors\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n}\n\n/**\n * Check if stdout supports colors\n */\nfunction supportsColor(): boolean {\n // Check for NO_COLOR environment variable\n if (process.env.NO_COLOR !== undefined) {\n return false\n }\n\n // Check for FORCE_COLOR environment variable\n if (process.env.FORCE_COLOR !== undefined) {\n return true\n }\n\n // Check if running in a TTY\n return process.stdout.isTTY ?? false\n}\n\nconst useColors = supportsColor()\n\n/**\n * Apply color to text if colors are supported\n */\nfunction colorize(text: string, color: keyof typeof colors): string {\n if (!useColors) return text\n return `${colors[color]}${text}${colors.reset}`\n}\n\n// ============================================================================\n// Output Functions\n// ============================================================================\n\n/**\n * Print the ASCII banner for MondoDB\n */\nfunction printBanner(): void {\n const banner = `\n${colorize('MondoDB', 'cyan')} ${colorize(`v${version}`, 'dim')}\n${colorize('MongoDB-compatible database backed by SQLite', 'dim')}\n`\n console.log(banner)\n}\n\n/**\n * Print version information\n */\nfunction printVersion(): void {\n console.log(`mongo.do version ${version}`)\n}\n\n/**\n * Print an error message\n */\nfunction printError(message: string): void {\n console.error(`${colorize('error:', 'red')} ${message}`)\n}\n\n/**\n * Print enhanced startup message with colors\n */\nfunction printColoredStartupMessage(options: CLIOptions): void {\n const connectionString = `mongodb://${options.host}:${options.port}`\n\n console.log('')\n if (options.remote) {\n console.log(`${colorize('Mode:', 'bold')} ${colorize('Proxy/Remote', 'magenta')}`)\n console.log(`${colorize('Connect:', 'bold')} ${colorize(connectionString, 'cyan')}`)\n console.log(`${colorize('Proxying to:', 'bold')} ${colorize(options.remote, 'blue')}`)\n } else {\n console.log(`${colorize('Mode:', 'bold')} ${colorize('Local/SQLite', 'green')}`)\n console.log(`${colorize('Connect:', 'bold')} ${colorize(connectionString, 'cyan')}`)\n console.log(`${colorize('Data directory:', 'bold')} ${options.dataDir}`)\n }\n\n if (options.verbose) {\n console.log(`${colorize('Verbose logging:', 'bold')} ${colorize('enabled', 'yellow')}`)\n }\n\n console.log('')\n console.log(`${colorize('Ready to accept connections.', 'green')} Press ${colorize('Ctrl+C', 'bold')} to stop.`)\n console.log('')\n}\n\n// ============================================================================\n// Argument Parsing Extensions\n// ============================================================================\n\n/**\n * Extended CLI options including version flag\n */\ninterface ExtendedCLIOptions extends CLIOptions {\n version: boolean\n}\n\n/**\n * Parse command line arguments with version flag support\n */\nfunction parseArgsExtended(args: string[]): ExtendedCLIOptions {\n const baseOptions = parseArgs(args)\n\n // Check for version flag\n const hasVersion = args.some(\n (arg) => arg === '--version' || arg === '-V'\n )\n\n return {\n ...baseOptions,\n version: hasVersion,\n }\n}\n\n// ============================================================================\n// Main Entry Point\n// ============================================================================\n\n/**\n * Main CLI function\n */\nasync function main(): Promise<void> {\n try {\n // Parse arguments\n const options = parseArgsExtended(process.argv.slice(2))\n\n // Handle --version flag\n if (options.version) {\n printVersion()\n process.exit(0)\n }\n\n // Handle --help flag\n if (options.help) {\n printHelp()\n process.exit(0)\n }\n\n // Validate options\n try {\n validateOptions(options)\n } catch (error) {\n if (error instanceof Error) {\n printError(error.message)\n } else {\n printError('Invalid options')\n }\n console.log('')\n console.log(`Run ${colorize('mongo.do --help', 'cyan')} for usage information.`)\n process.exit(1)\n }\n\n // Print banner\n printBanner()\n\n // Start the server\n const controller = await runServer(options)\n\n // Print startup message\n printColoredStartupMessage(options)\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.log('')\n console.log(`${colorize(`Received ${signal}, shutting down...`, 'yellow')}`)\n\n try {\n await controller.stop()\n printShutdownMessage()\n process.exit(0)\n } catch (error) {\n printError(`Error during shutdown: ${error instanceof Error ? error.message : 'Unknown error'}`)\n process.exit(1)\n }\n }\n\n // Register signal handlers\n process.on('SIGINT', () => shutdown('SIGINT'))\n process.on('SIGTERM', () => shutdown('SIGTERM'))\n\n // Handle uncaught exceptions\n process.on('uncaughtException', (error) => {\n printError(`Uncaught exception: ${error.message}`)\n if (options.verbose) {\n console.error(error.stack)\n }\n process.exit(1)\n })\n\n // Handle unhandled promise rejections\n process.on('unhandledRejection', (reason) => {\n printError(`Unhandled rejection: ${reason instanceof Error ? reason.message : String(reason)}`)\n if (options.verbose && reason instanceof Error) {\n console.error(reason.stack)\n }\n process.exit(1)\n })\n\n } catch (error) {\n // Handle startup errors gracefully\n if (error instanceof Error) {\n printError(error.message)\n\n // Provide helpful hints for common errors\n if (error.message.includes('EADDRINUSE')) {\n console.log('')\n console.log(`${colorize('Hint:', 'yellow')} The port is already in use. Try a different port with ${colorize('--port', 'cyan')}.`)\n } else if (error.message.includes('EACCES')) {\n console.log('')\n console.log(`${colorize('Hint:', 'yellow')} Permission denied. Ports below 1024 require root privileges.`)\n console.log(` Try using a port number above 1024, e.g., ${colorize('--port=27017', 'cyan')}.`)\n } else if (error.message.includes('Failed to connect to remote')) {\n console.log('')\n console.log(`${colorize('Hint:', 'yellow')} Could not connect to the remote worker.`)\n console.log(` Check that the URL is correct and the worker is running.`)\n }\n } else {\n printError('An unexpected error occurred')\n }\n\n process.exit(1)\n }\n}\n\n// Run the CLI\nmain()\n"]}