miqro 5.0.5 → 6.0.4

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 (372) hide show
  1. package/.eslintrc +15 -0
  2. package/README.md +618 -20
  3. package/bin/miqro +34 -0
  4. package/build/editor.bundle.js +61154 -0
  5. package/build/esm/editor/auth.d.ts +6 -0
  6. package/build/esm/editor/auth.js +42 -0
  7. package/build/esm/editor/auth.js.map +1 -0
  8. package/build/esm/editor/common/admin-interface.d.ts +36 -0
  9. package/build/esm/editor/common/admin-interface.js +45 -0
  10. package/build/esm/editor/common/admin-interface.js.map +1 -0
  11. package/build/esm/editor/common/constants.d.ts +4 -0
  12. package/build/esm/editor/common/constants.js +21 -0
  13. package/build/esm/editor/common/constants.js.map +1 -0
  14. package/build/esm/editor/common/constants.server.d.ts +2 -0
  15. package/build/esm/editor/common/constants.server.js +5 -0
  16. package/build/esm/editor/common/constants.server.js.map +1 -0
  17. package/build/esm/editor/common/editor-index.d.ts +2 -0
  18. package/build/esm/editor/common/editor-index.js +15 -0
  19. package/build/esm/editor/common/editor-index.js.map +1 -0
  20. package/build/esm/editor/common/html-encode.d.ts +1 -0
  21. package/build/esm/editor/common/html-encode.js +15 -0
  22. package/build/esm/editor/common/html-encode.js.map +1 -0
  23. package/build/esm/editor/common/log-socket.d.ts +13 -0
  24. package/build/esm/editor/common/log-socket.js +68 -0
  25. package/build/esm/editor/common/log-socket.js.map +1 -0
  26. package/build/esm/editor/common/templates.d.ts +11 -0
  27. package/build/esm/editor/common/templates.js +444 -0
  28. package/build/esm/editor/common/templates.js.map +1 -0
  29. package/build/esm/editor/components/api-preview.d.ts +11 -0
  30. package/build/esm/editor/components/api-preview.js +91 -0
  31. package/build/esm/editor/components/api-preview.js.map +1 -0
  32. package/build/esm/editor/components/editor.d.ts +16 -0
  33. package/build/esm/editor/components/editor.js +355 -0
  34. package/build/esm/editor/components/editor.js.map +1 -0
  35. package/build/esm/editor/components/file-browser.d.ts +37 -0
  36. package/build/esm/editor/components/file-browser.js +122 -0
  37. package/build/esm/editor/components/file-browser.js.map +1 -0
  38. package/build/esm/editor/components/file-editor-toolbar.d.ts +22 -0
  39. package/build/esm/editor/components/file-editor-toolbar.js +94 -0
  40. package/build/esm/editor/components/file-editor-toolbar.js.map +1 -0
  41. package/build/esm/editor/components/file-editor.d.ts +32 -0
  42. package/build/esm/editor/components/file-editor.js +60 -0
  43. package/build/esm/editor/components/file-editor.js.map +1 -0
  44. package/build/esm/editor/components/filter-query.d.ts +1 -0
  45. package/build/esm/editor/components/filter-query.js +23 -0
  46. package/build/esm/editor/components/filter-query.js.map +1 -0
  47. package/build/esm/editor/components/highlight-text-area.d.ts +11 -0
  48. package/build/esm/editor/components/highlight-text-area.js +139 -0
  49. package/build/esm/editor/components/highlight-text-area.js.map +1 -0
  50. package/build/esm/editor/components/log-viewer.d.ts +6 -0
  51. package/build/esm/editor/components/log-viewer.js +70 -0
  52. package/build/esm/editor/components/log-viewer.js.map +1 -0
  53. package/build/esm/editor/components/new-file.d.ts +10 -0
  54. package/build/esm/editor/components/new-file.js +118 -0
  55. package/build/esm/editor/components/new-file.js.map +1 -0
  56. package/build/esm/editor/components/scroll-query.d.ts +7 -0
  57. package/build/esm/editor/components/scroll-query.js +22 -0
  58. package/build/esm/editor/components/scroll-query.js.map +1 -0
  59. package/build/esm/editor/components/start-page.d.ts +13 -0
  60. package/build/esm/editor/components/start-page.js +31 -0
  61. package/build/esm/editor/components/start-page.js.map +1 -0
  62. package/build/esm/editor/http/admin/editor/api/fs/delete.api.d.ts +3 -0
  63. package/build/esm/editor/http/admin/editor/api/fs/delete.api.js +30 -0
  64. package/build/esm/editor/http/admin/editor/api/fs/delete.api.js.map +1 -0
  65. package/build/esm/editor/http/admin/editor/api/fs/read.api.d.ts +5 -0
  66. package/build/esm/editor/http/admin/editor/api/fs/read.api.js +50 -0
  67. package/build/esm/editor/http/admin/editor/api/fs/read.api.js.map +1 -0
  68. package/build/esm/editor/http/admin/editor/api/fs/rename.api.d.ts +4 -0
  69. package/build/esm/editor/http/admin/editor/api/fs/rename.api.js +40 -0
  70. package/build/esm/editor/http/admin/editor/api/fs/rename.api.js.map +1 -0
  71. package/build/esm/editor/http/admin/editor/api/fs/scan.api.d.ts +26 -0
  72. package/build/esm/editor/http/admin/editor/api/fs/scan.api.js +150 -0
  73. package/build/esm/editor/http/admin/editor/api/fs/scan.api.js.map +1 -0
  74. package/build/esm/editor/http/admin/editor/api/fs/write.api.d.ts +3 -0
  75. package/build/esm/editor/http/admin/editor/api/fs/write.api.js +39 -0
  76. package/build/esm/editor/http/admin/editor/api/fs/write.api.js.map +1 -0
  77. package/build/esm/editor/http/admin/editor/api/server/reload.api.d.ts +10 -0
  78. package/build/esm/editor/http/admin/editor/api/server/reload.api.js +46 -0
  79. package/build/esm/editor/http/admin/editor/api/server/reload.api.js.map +1 -0
  80. package/build/esm/editor/http/admin/editor/api/server/restart.api.d.ts +10 -0
  81. package/build/esm/editor/http/admin/editor/api/server/restart.api.js +46 -0
  82. package/build/esm/editor/http/admin/editor/api/server/restart.api.js.map +1 -0
  83. package/build/esm/editor/http/admin/editor/editor.js +8 -0
  84. package/build/esm/editor/http/admin/editor/editor.js.map +1 -0
  85. package/build/esm/editor/http/admin/editor/index.api.d.ts +3 -0
  86. package/build/esm/editor/http/admin/editor/index.api.js +22 -0
  87. package/build/esm/editor/http/admin/editor/index.api.js.map +1 -0
  88. package/build/esm/editor/server.d.ts +3 -0
  89. package/build/esm/editor/server.js +50 -0
  90. package/build/esm/editor/server.js.map +1 -0
  91. package/build/esm/editor/ws.d.ts +3 -0
  92. package/build/esm/editor/ws.js +12 -0
  93. package/build/esm/editor/ws.js.map +1 -0
  94. package/build/esm/src/bin/compile.d.ts +3 -0
  95. package/build/esm/src/bin/compile.js +31 -0
  96. package/build/esm/src/bin/compile.js.map +1 -0
  97. package/build/{utils/doc/md.d.ts → esm/src/bin/doc-md.d.ts} +2 -4
  98. package/build/{utils/doc/md.js → esm/src/bin/doc-md.js} +32 -18
  99. package/build/esm/src/bin/doc-md.js.map +1 -0
  100. package/build/esm/src/bin/generate-doc.d.ts +4 -0
  101. package/build/esm/src/bin/generate-doc.js +47 -0
  102. package/build/esm/src/bin/generate-doc.js.map +1 -0
  103. package/build/esm/src/bin/test.d.ts +3 -0
  104. package/build/esm/src/bin/test.js +68 -0
  105. package/build/esm/src/bin/test.js.map +1 -0
  106. package/build/esm/src/bin/types.d.ts +3 -0
  107. package/build/esm/src/bin/types.js +21 -0
  108. package/build/esm/src/bin/types.js.map +1 -0
  109. package/build/esm/src/cluster.js +11 -0
  110. package/build/esm/src/cluster.js.map +1 -0
  111. package/build/esm/src/common/arguments.d.ts +22 -0
  112. package/build/esm/src/common/arguments.js +310 -0
  113. package/build/esm/src/common/arguments.js.map +1 -0
  114. package/build/esm/src/common/assets.d.ts +11 -0
  115. package/build/esm/src/common/assets.js +121 -0
  116. package/build/esm/src/common/assets.js.map +1 -0
  117. package/build/esm/src/common/checksum.d.ts +19 -0
  118. package/build/esm/src/common/checksum.js +57 -0
  119. package/build/esm/src/common/checksum.js.map +1 -0
  120. package/build/esm/src/common/constants.d.ts +10 -0
  121. package/build/esm/src/common/constants.js +14 -0
  122. package/build/esm/src/common/constants.js.map +1 -0
  123. package/build/esm/src/common/content-type.d.ts +4 -0
  124. package/build/esm/src/common/content-type.js +82 -0
  125. package/build/esm/src/common/content-type.js.map +1 -0
  126. package/build/esm/src/common/esbuild.d.ts +17 -0
  127. package/build/esm/src/common/esbuild.js +79 -0
  128. package/build/esm/src/common/esbuild.js.map +1 -0
  129. package/build/esm/src/common/exit.d.ts +2 -0
  130. package/build/esm/src/common/exit.js +84 -0
  131. package/build/esm/src/common/exit.js.map +1 -0
  132. package/build/esm/src/common/fs.d.ts +8 -0
  133. package/build/esm/src/common/fs.js +17 -0
  134. package/build/esm/src/common/fs.js.map +1 -0
  135. package/build/esm/src/common/help.d.ts +3 -0
  136. package/build/esm/src/common/help.js +44 -0
  137. package/build/esm/src/common/help.js.map +1 -0
  138. package/build/esm/src/common/jsx.d.ts +52 -0
  139. package/build/esm/src/common/jsx.js +365 -0
  140. package/build/esm/src/common/jsx.js.map +1 -0
  141. package/build/esm/src/common/paths.d.ts +14 -0
  142. package/build/esm/src/common/paths.js +110 -0
  143. package/build/esm/src/common/paths.js.map +1 -0
  144. package/build/esm/src/common/watch.d.ts +3 -0
  145. package/build/esm/src/common/watch.js +74 -0
  146. package/build/esm/src/common/watch.js.map +1 -0
  147. package/build/esm/src/inflate/inflate-sea.d.ts +5 -0
  148. package/build/esm/src/inflate/inflate-sea.js +175 -0
  149. package/build/esm/src/inflate/inflate-sea.js.map +1 -0
  150. package/build/esm/src/inflate/inflate.d.ts +14 -0
  151. package/build/esm/src/inflate/inflate.js +65 -0
  152. package/build/esm/src/inflate/inflate.js.map +1 -0
  153. package/build/esm/src/inflate/md.d.ts +2 -0
  154. package/build/esm/src/inflate/md.js +19 -0
  155. package/build/esm/src/inflate/md.js.map +1 -0
  156. package/build/esm/src/inflate/setup-auth.d.ts +3 -0
  157. package/build/esm/src/inflate/setup-auth.js +38 -0
  158. package/build/esm/src/inflate/setup-auth.js.map +1 -0
  159. package/build/esm/src/inflate/setup-cors.d.ts +3 -0
  160. package/build/esm/src/inflate/setup-cors.js +38 -0
  161. package/build/esm/src/inflate/setup-cors.js.map +1 -0
  162. package/build/esm/src/inflate/setup-db.d.ts +8 -0
  163. package/build/esm/src/inflate/setup-db.js +99 -0
  164. package/build/esm/src/inflate/setup-db.js.map +1 -0
  165. package/build/esm/src/inflate/setup-http.d.ts +37 -0
  166. package/build/esm/src/inflate/setup-http.js +543 -0
  167. package/build/esm/src/inflate/setup-http.js.map +1 -0
  168. package/build/esm/src/inflate/setup-log.d.ts +7 -0
  169. package/build/esm/src/inflate/setup-log.js +37 -0
  170. package/build/esm/src/inflate/setup-log.js.map +1 -0
  171. package/build/esm/src/inflate/setup-server-config.d.ts +7 -0
  172. package/build/esm/src/inflate/setup-server-config.js +37 -0
  173. package/build/esm/src/inflate/setup-server-config.js.map +1 -0
  174. package/build/esm/src/inflate/setup-test.d.ts +2 -0
  175. package/build/esm/src/inflate/setup-test.js +22 -0
  176. package/build/esm/src/inflate/setup-test.js.map +1 -0
  177. package/build/esm/src/inflate/setup-ws.d.ts +4 -0
  178. package/build/esm/src/inflate/setup-ws.js +46 -0
  179. package/build/esm/src/inflate/setup-ws.js.map +1 -0
  180. package/build/esm/src/inflate/utils/sea-utils.d.ts +2 -0
  181. package/build/esm/src/inflate/utils/sea-utils.js +13 -0
  182. package/build/esm/src/inflate/utils/sea-utils.js.map +1 -0
  183. package/build/esm/src/lib.d.ts +13 -0
  184. package/build/esm/src/lib.js +17 -0
  185. package/build/esm/src/lib.js.map +1 -0
  186. package/build/esm/src/main.d.ts +2 -0
  187. package/build/esm/src/main.js +92 -0
  188. package/build/esm/src/main.js.map +1 -0
  189. package/build/esm/src/services/app.d.ts +88 -0
  190. package/build/esm/src/services/app.js +619 -0
  191. package/build/esm/src/services/app.js.map +1 -0
  192. package/build/esm/src/services/editor.d.ts +3 -0
  193. package/build/esm/src/services/editor.js +61 -0
  194. package/build/esm/src/services/editor.js.map +1 -0
  195. package/build/esm/src/services/globals.d.ts +3 -0
  196. package/build/esm/src/services/globals.js +139 -0
  197. package/build/esm/src/services/globals.js.map +1 -0
  198. package/build/esm/src/services/hot-reload.d.ts +1 -0
  199. package/build/esm/src/services/hot-reload.js +45 -0
  200. package/build/esm/src/services/hot-reload.js.map +1 -0
  201. package/build/esm/src/services/migrations.d.ts +4 -0
  202. package/build/esm/src/services/migrations.js +61 -0
  203. package/build/esm/src/services/migrations.js.map +1 -0
  204. package/build/esm/src/services/utils/cache.d.ts +19 -0
  205. package/build/esm/src/services/utils/cache.js +85 -0
  206. package/build/esm/src/services/utils/cache.js.map +1 -0
  207. package/build/esm/src/services/utils/cluster-cache.d.ts +20 -0
  208. package/build/esm/src/services/utils/cluster-cache.js +211 -0
  209. package/build/esm/src/services/utils/cluster-cache.js.map +1 -0
  210. package/build/esm/src/services/utils/cluster-ws.d.ts +24 -0
  211. package/build/esm/src/services/utils/cluster-ws.js +176 -0
  212. package/build/esm/src/services/utils/cluster-ws.js.map +1 -0
  213. package/build/esm/src/services/utils/db-manager.d.ts +20 -0
  214. package/build/esm/src/services/utils/db-manager.js +59 -0
  215. package/build/esm/src/services/utils/db-manager.js.map +1 -0
  216. package/build/esm/src/services/utils/get-route.d.ts +9 -0
  217. package/build/esm/src/services/utils/get-route.js +58 -0
  218. package/build/esm/src/services/utils/get-route.js.map +1 -0
  219. package/build/esm/src/services/utils/log.d.ts +17 -0
  220. package/build/esm/src/services/utils/log.js +74 -0
  221. package/build/esm/src/services/utils/log.js.map +1 -0
  222. package/build/esm/src/services/utils/server-interface.d.ts +41 -0
  223. package/build/esm/src/services/utils/server-interface.js +74 -0
  224. package/build/esm/src/services/utils/server-interface.js.map +1 -0
  225. package/build/esm/src/services/utils/websocketmanager.d.ts +23 -0
  226. package/build/esm/src/services/utils/websocketmanager.js +128 -0
  227. package/build/esm/src/services/utils/websocketmanager.js.map +1 -0
  228. package/build/esm/src/types.d.ts +166 -0
  229. package/build/esm/src/types.js +2 -0
  230. package/build/esm/src/types.js.map +1 -0
  231. package/build/jsx.dom.js +1585 -0
  232. package/build/lib.cjs +14009 -0
  233. package/build/postject.base64.cjs +1 -0
  234. package/editor/auth.ts +51 -0
  235. package/editor/common/admin-interface.ts +84 -0
  236. package/editor/common/constants.server.ts +5 -0
  237. package/editor/common/constants.ts +21 -0
  238. package/editor/common/editor-index.tsx +17 -0
  239. package/editor/common/html-encode.ts +14 -0
  240. package/editor/common/log-socket.tsx +82 -0
  241. package/editor/common/templates.ts +448 -0
  242. package/editor/components/api-preview.tsx +116 -0
  243. package/editor/components/editor.tsx +483 -0
  244. package/editor/components/file-browser.tsx +295 -0
  245. package/editor/components/file-editor-toolbar.tsx +187 -0
  246. package/editor/components/file-editor.tsx +122 -0
  247. package/editor/components/filter-query.tsx +22 -0
  248. package/editor/components/highlight-text-area.tsx +159 -0
  249. package/editor/components/log-viewer.tsx +110 -0
  250. package/editor/components/new-file.tsx +169 -0
  251. package/editor/components/scroll-query.tsx +22 -0
  252. package/editor/components/start-page.tsx +49 -0
  253. package/editor/http/admin/editor/api/fs/delete.api.tsx +32 -0
  254. package/editor/http/admin/editor/api/fs/read.api.tsx +55 -0
  255. package/editor/http/admin/editor/api/fs/rename.api.tsx +41 -0
  256. package/editor/http/admin/editor/api/fs/scan.api.tsx +181 -0
  257. package/editor/http/admin/editor/api/fs/write.api.tsx +41 -0
  258. package/editor/http/admin/editor/api/server/reload.api.ts +52 -0
  259. package/editor/http/admin/editor/api/server/restart.api.tsx +52 -0
  260. package/editor/http/admin/editor/editor.tsx +8 -0
  261. package/editor/http/admin/editor/font.ttf +0 -0
  262. package/editor/http/admin/editor/index.api.tsx +39 -0
  263. package/editor/http/admin/editor/style.css +620 -0
  264. package/editor/server.ts +57 -0
  265. package/editor/static/android-chrome-192x192.png +0 -0
  266. package/editor/static/android-chrome-512x512.png +0 -0
  267. package/editor/static/apple-touch-icon.png +0 -0
  268. package/editor/static/editor.bundle.in.mjs +20 -0
  269. package/editor/static/favicon-16x16.png +0 -0
  270. package/editor/static/favicon-32x32.png +0 -0
  271. package/editor/static/favicon.ico +0 -0
  272. package/editor/static/site.webmanifest +19 -0
  273. package/editor/ws.ts +15 -0
  274. package/package.json +43 -24
  275. package/package.json--OLD +36 -0
  276. package/sea/app.sh +33 -0
  277. package/sea/base64.js +3 -0
  278. package/sea/basic-compile.base64.sh +1 -0
  279. package/sea/basic-compile.sh +73 -0
  280. package/sea/basic-config.json +9 -0
  281. package/sea/compile.sh +124 -0
  282. package/sea/copy-types.sh +46 -0
  283. package/sea/editor-assets/editor.bundle.in.mjs +19 -0
  284. package/sea/esbuild.sh +31 -0
  285. package/sea/generate-global-types-asset-json.js +34 -0
  286. package/sea/install-esbuild.sh +53 -0
  287. package/sea/install-nodejs.sh +49 -0
  288. package/sea/main.sh +34 -0
  289. package/sea/node.sh +33 -0
  290. package/sea/node.version.tag +1 -0
  291. package/sea/precompile.sh +7 -0
  292. package/sea/release-tar.sh +5 -0
  293. package/sea/sign-add.sh +22 -0
  294. package/sea/sign-remove.sh +22 -0
  295. package/sea/tsc.sh +1 -0
  296. package/sea/types.json +1 -0
  297. package/src/bin/compile.ts +35 -0
  298. package/src/bin/doc-md.ts +210 -0
  299. package/src/bin/generate-doc.ts +55 -0
  300. package/src/bin/test.ts +92 -0
  301. package/src/bin/types.ts +22 -0
  302. package/src/cluster.ts +16 -0
  303. package/src/common/arguments.ts +366 -0
  304. package/src/common/assets.ts +124 -0
  305. package/src/common/checksum.ts +58 -0
  306. package/src/common/constants.ts +18 -0
  307. package/src/common/content-type.ts +84 -0
  308. package/src/common/esbuild.ts +94 -0
  309. package/src/common/exit.ts +91 -0
  310. package/src/common/fs.ts +17 -0
  311. package/src/common/help.ts +46 -0
  312. package/src/common/jsx.ts +414 -0
  313. package/src/common/paths.ts +117 -0
  314. package/src/common/watch.ts +80 -0
  315. package/src/inflate/inflate-sea.ts +193 -0
  316. package/src/inflate/inflate.ts +96 -0
  317. package/src/inflate/md.ts +20 -0
  318. package/src/inflate/setup-auth.ts +40 -0
  319. package/src/inflate/setup-cors.ts +40 -0
  320. package/src/inflate/setup-db.ts +113 -0
  321. package/src/inflate/setup-http.ts +643 -0
  322. package/src/inflate/setup-log.ts +44 -0
  323. package/src/inflate/setup-server-config.ts +47 -0
  324. package/src/inflate/setup-test.ts +23 -0
  325. package/src/inflate/setup-ws.ts +48 -0
  326. package/src/inflate/utils/sea-utils.ts +14 -0
  327. package/src/lib.ts +19 -0
  328. package/src/main.ts +87 -0
  329. package/src/services/app.ts +718 -0
  330. package/src/services/editor.tsx +93 -0
  331. package/src/services/globals.ts +143 -0
  332. package/src/services/hot-reload.ts +46 -0
  333. package/src/services/migrations.ts +66 -0
  334. package/src/services/utils/cache.ts +88 -0
  335. package/src/services/utils/cluster-cache.ts +225 -0
  336. package/src/services/utils/cluster-ws.ts +192 -0
  337. package/src/services/utils/db-manager.ts +79 -0
  338. package/src/services/utils/get-route.ts +70 -0
  339. package/src/services/utils/log.ts +91 -0
  340. package/src/services/utils/server-interface.ts +166 -0
  341. package/src/services/utils/websocketmanager.ts +139 -0
  342. package/src/types/@esbuild.d.ts +1 -0
  343. package/src/types/@miqro/core.d.ts +2 -0
  344. package/src/types/@miqro/jsx.d.ts +2 -0
  345. package/src/types/@miqro/parser.d.ts +2 -0
  346. package/src/types/@miqro/query.d.ts +2 -0
  347. package/src/types/@miqro/request.d.ts +2 -0
  348. package/src/types/@miqro/test.d.ts +2 -0
  349. package/src/types/@miqro.d.ts +1 -0
  350. package/src/types/@types.d.ts +1 -0
  351. package/src/types/browser.globals.d.ts +9 -0
  352. package/src/types/globals.d.ts +2 -0
  353. package/src/types/jsx.globals.d.ts +37 -0
  354. package/src/types/miqro.d.ts +109 -0
  355. package/src/types/postject.d.ts +1 -0
  356. package/src/types/server.globals.d.ts +72 -0
  357. package/src/types.ts +199 -0
  358. package/tsconfig.json +35 -0
  359. package/build/cli.js +0 -4
  360. package/build/cmd-map.d.ts +0 -90
  361. package/build/cmd-map.js +0 -460
  362. package/build/index.js +0 -2
  363. package/build/utils/doc/json.d.ts +0 -7
  364. package/build/utils/doc/json.js +0 -12
  365. package/build/utils/exec.d.ts +0 -32
  366. package/build/utils/exec.js +0 -102
  367. package/build/utils/templates.d.ts +0 -33
  368. package/build/utils/templates.js +0 -302
  369. package/build/utils/watch.d.ts +0 -1
  370. package/build/utils/watch.js +0 -35
  371. /package/build/{index.d.ts → esm/editor/http/admin/editor/editor.d.ts} +0 -0
  372. /package/build/{cli.d.ts → esm/src/cluster.d.ts} +0 -0
@@ -0,0 +1,192 @@
1
+ import { Logger, WebSocketServer, WebSocketServerOptions } from "@miqro/core";
2
+ import { Serializable } from "node:child_process";
3
+
4
+ const ClusterWebSocketServer2MessageType = "$$$$ClusterWebSocketServer2Message$$$$$";
5
+
6
+ export interface ClusterWebSocketServer2Message {
7
+ type: typeof ClusterWebSocketServer2MessageType;
8
+ target: string;
9
+ action: "connection" | "disconnection" | "sendMessage" | "error" | "sync";
10
+ clientUUID?: string;
11
+ errorMessage?: string;
12
+ fromUUID?: string;
13
+ fromPID: string,
14
+ payload?: Serializable;
15
+ }
16
+
17
+ export class ClusterWebSocketServer2 extends WebSocketServer {
18
+ public remoteClients: Set<string> = new Set();
19
+ listener: (data: any) => Promise<void>;
20
+ public constructor(protected name: string, options: WebSocketServerOptions) {
21
+ super({
22
+ ...options,
23
+ validate: (req) => {
24
+ if (
25
+ this.options.maxConnections !== undefined &&
26
+ this.clients.size + this.remoteClients.size >= this.options.maxConnections
27
+ ) {
28
+ return false;
29
+ } else {
30
+ return options.validate ? options.validate(req) : true;
31
+ }
32
+ },
33
+ onError: (req, error) => {
34
+ if (process.send) {
35
+ process.send({
36
+ type: ClusterWebSocketServer2MessageType,
37
+ action: "error",
38
+ target: this.name,
39
+ clientUUID: req.uuid,
40
+ fromPID: String(process.pid),
41
+ errorMessage: error.message
42
+ } as ClusterWebSocketServer2Message);
43
+ }
44
+ if (options.onError) {
45
+ options.onError(req, error);
46
+ }
47
+ },
48
+ onConnection: (req) => {
49
+ if (process.send) {
50
+ process.send({
51
+ type: ClusterWebSocketServer2MessageType,
52
+ action: "connection",
53
+ target: this.name,
54
+ fromPID: String(process.pid),
55
+ clientUUID: req.uuid
56
+ } as ClusterWebSocketServer2Message);
57
+ }
58
+ if (options.onConnection) {
59
+ options.onConnection(req);
60
+ }
61
+ },
62
+ onDisconnect: (req) => {
63
+ if (process.send) {
64
+ process.send({
65
+ type: ClusterWebSocketServer2MessageType,
66
+ action: "disconnection",
67
+ target: this.name,
68
+ fromPID: String(process.pid),
69
+ clientUUID: req.uuid
70
+ } as ClusterWebSocketServer2Message);
71
+ }
72
+ if (options.onDisconnect) {
73
+ options.onDisconnect(req);
74
+ }
75
+ }
76
+ });
77
+ this.listener = async (data) => {
78
+ try {
79
+ const msg = (data as ClusterWebSocketServer2Message);
80
+ if (
81
+ msg &&
82
+ msg.type === ClusterWebSocketServer2MessageType &&
83
+ msg.target === this.name &&
84
+ msg.action) {
85
+ // receive message from cluster workers
86
+ //console.dir(data);
87
+ //this.logger?.debug("remote web socket server message from [%s] [%s] [%s]", msg.fromPID, msg.target, msg.action);
88
+ switch (msg.action) {
89
+ case "sync":
90
+ if (process.send) {
91
+ for (const clientUUID of this.clients.keys()) {
92
+ process.send({
93
+ type: ClusterWebSocketServer2MessageType,
94
+ action: "connection",
95
+ target: this.name,
96
+ fromPID: String(process.pid),
97
+ clientUUID
98
+ } as ClusterWebSocketServer2Message);
99
+ }
100
+ }
101
+ break;
102
+ case "connection":
103
+ if (!msg.clientUUID) {
104
+ throw new Error(`action [${msg.action}] without clientUUID`);
105
+ }
106
+ if (!this.remoteClients.has(msg.clientUUID)) {
107
+ this.remoteClients.add(msg.clientUUID);
108
+ }
109
+ break;
110
+ case "disconnection":
111
+ if (!msg.clientUUID) {
112
+ throw new Error(`action [${msg.action}] without clientUUID`);
113
+ }
114
+ if (this.remoteClients.has(msg.clientUUID)) {
115
+ this.remoteClients.delete(msg.clientUUID);
116
+ }
117
+ break;
118
+ case "sendMessage": {
119
+ const payload = String(msg.payload);
120
+ if (!msg.clientUUID) {
121
+ // broadcast to local clients
122
+ await super.broadcast(payload, msg.fromUUID);
123
+ } else if (this.isConnected(msg.clientUUID)) {
124
+ // write if local client
125
+ await super.writeTo(msg.clientUUID, payload);
126
+ }
127
+ break;
128
+ }
129
+ default:
130
+ throw new Error(`action [${msg.action}] not supported`);
131
+ }
132
+ }
133
+ } catch (e) {
134
+ console.error(e);
135
+ }
136
+ };
137
+
138
+ if (process.send) {
139
+ process.on("message", this.listener);
140
+ process.send({
141
+ type: ClusterWebSocketServer2MessageType,
142
+ action: "sync",
143
+ fromPID: String(process.pid),
144
+ target: this.name
145
+ } as ClusterWebSocketServer2Message);
146
+ }
147
+ }
148
+
149
+ dispose() {
150
+ process.removeListener("message", this.listener);
151
+ }
152
+
153
+ public async broadcast(payload: string, fromUUID?: string): Promise<void> {
154
+ if (process.send) {
155
+ process.send({
156
+ type: ClusterWebSocketServer2MessageType,
157
+ action: "sendMessage",
158
+ payload,
159
+ target: this.name,
160
+ fromPID: String(process.pid),
161
+ fromUUID
162
+ } as ClusterWebSocketServer2Message);
163
+ }
164
+ return super.broadcast(payload, fromUUID);
165
+ }
166
+
167
+ public async writeTo(clientUUID: string, payload: string): Promise<void> {
168
+ if (this.remoteClients.has(clientUUID)) {
169
+ // write to remote client via IPC
170
+ if (process.send) {
171
+ process.send({
172
+ type: ClusterWebSocketServer2MessageType,
173
+ action: "sendMessage",
174
+ clientUUID,
175
+ target: this.name,
176
+ fromPID: String(process.pid),
177
+ payload
178
+ } as ClusterWebSocketServer2Message);
179
+ return;
180
+ }
181
+ }
182
+ // due to the implementation of isUUIDValid depends on this.remoteClients to be sync there can be two clients registered with the same UUID in the cluster
183
+ if (this.clients.has(clientUUID)) {
184
+ // write to local client
185
+ return super.writeTo(clientUUID, payload);
186
+ }
187
+ }
188
+
189
+ public isUUIDValid(uuid: string) {
190
+ return !this.clients.has(uuid) && !this.remoteClients.has(uuid);
191
+ }
192
+ }
@@ -0,0 +1,79 @@
1
+ import cluster from "node:cluster";
2
+ import { Database } from "@miqro/query";
3
+ import { DBConfig } from "../../types.js";
4
+ import { LogProvider } from "./log.js";
5
+ import { Logger } from "@miqro/core";
6
+
7
+ export class DBManager {
8
+ private map = new Map<string, Database>();
9
+ public options: {
10
+ loggerProvider?: LogProvider;
11
+ logger?: Logger;
12
+ };
13
+
14
+ constructor(options?: {
15
+ loggerProvider?: LogProvider;
16
+ logger?: Logger;
17
+ }) {
18
+ this.options = options ? options : {};
19
+ }
20
+
21
+ async setupDB(config: DBConfig) {
22
+ if (this.getDB(config.name)) {
23
+ throw new Error("cannot override db");
24
+ }
25
+ if (!config.disabled) {
26
+ const DB_IDENTIFIER = cluster.isPrimary ? "DATABASE" : process.env["CLUSTER_NODE_NUMBER"] ? `WORKER_${process.env["CLUSTER_NODE_NUMBER"]}_DATABASE` : "WORKER_DATABASE";
27
+ this.options?.logger?.debug("setting up db connection [%s]", config.name);
28
+ this.options?.logger?.trace("creating db connection [%s]", config.name);
29
+ const db = new Database({
30
+ dialect: config.dialect ? config.dialect as any : "node:sqlite",
31
+ storage: config.storage ? config.storage : "./db.sqlite3",
32
+ connectionString: config.url,
33
+ logger: this.options?.loggerProvider?.getLogger(`${DB_IDENTIFIER}_${config.name}`)
34
+ });
35
+
36
+ this.options?.logger?.trace("connecting db connection [%s]", config.name);
37
+ await db.connect();
38
+ this.options?.logger?.trace("db connection [%s] connected", config.name);
39
+
40
+ /*if (config.name && config.name !== name) {
41
+ this.setDB(config.name, db);
42
+ }*/
43
+
44
+ this.setDB(config.name, db);
45
+
46
+ return db;
47
+ }
48
+ }
49
+
50
+ async closeAll() {
51
+ this.options?.logger?.debug("closing all db connections");
52
+ for (const name of this.map.keys()) {
53
+ const db = this.map.get(name);
54
+ if (db && db.status === "connected") {
55
+ this.options?.logger?.debug("disconnecting db connection [%s]", name);
56
+ await db.disconnect();
57
+ }
58
+ }
59
+ }
60
+
61
+ async deleteAll() {
62
+ await this.closeAll();
63
+ this.options?.logger?.debug("clear all db connections");
64
+ this.map.clear();
65
+ }
66
+
67
+ getDB(name: string): Database | null {
68
+ const db = this.map.get(name);
69
+ return db ? db : null;
70
+ }
71
+
72
+ setDB(name: string, db: Database): void {
73
+ if (this.getDB(name)) {
74
+ throw new Error("cannot override db connection [" + name + "]");
75
+ }
76
+ this.map.set(name, db);
77
+ }
78
+
79
+ }
@@ -0,0 +1,70 @@
1
+ import { APIRoute, normalizePath, RouterHandlerOptions } from "@miqro/core";
2
+ import { join } from "node:path";
3
+
4
+ export interface RouterUseCall {
5
+ path?: string;
6
+ method?: string;
7
+ inflatePath: string;
8
+ defaultInflatePath: string;
9
+ options?: RouterHandlerOptions;
10
+ }
11
+
12
+ export function getRoutes(prePath: string, defaultPath: string, apiOptions?: Partial<APIRoute>): RouterUseCall[] {
13
+ const ret: RouterUseCall[] = [];
14
+ const path = apiOptions && apiOptions.path ? apiOptions.path : defaultPath;
15
+ const defaultInflatePath = join(prePath, defaultPath);
16
+ const method = apiOptions && apiOptions.method ? apiOptions.method : "GET";
17
+
18
+ const methods = method instanceof Array ? method : [method];
19
+ const paths = path instanceof Array ? path : [path];
20
+
21
+ if (apiOptions && apiOptions.path === null) {
22
+ for (const m of methods) {
23
+ ret.push({
24
+ options: {
25
+ apiName: apiOptions?.apiName,
26
+ description: apiOptions?.description,
27
+ identifier: apiOptions?.identifier,
28
+ middleware: apiOptions?.middleware,
29
+ name: apiOptions?.name,
30
+ parser: apiOptions?.parser,
31
+ policy: apiOptions?.policy,
32
+ request: apiOptions?.request,
33
+ response: apiOptions?.response,
34
+ session: apiOptions?.session
35
+ },
36
+ inflatePath: defaultInflatePath,
37
+ defaultInflatePath,
38
+ method: m.toLocaleLowerCase() !== "use" ? m.toUpperCase() : undefined,
39
+ path: undefined
40
+ });
41
+ }
42
+ } else {
43
+ for (const p of paths) {
44
+ for (const m of methods) {
45
+ ret.push({
46
+ options: {
47
+ apiName: apiOptions?.apiName,
48
+ description: apiOptions?.description,
49
+ identifier: apiOptions?.identifier,
50
+ middleware: apiOptions?.middleware,
51
+ name: apiOptions?.name,
52
+ parser: apiOptions?.parser,
53
+ policy: apiOptions?.policy,
54
+ request: apiOptions?.request,
55
+ response: apiOptions?.response,
56
+ session: apiOptions?.session
57
+ },
58
+ inflatePath: p !== "/" ? join(prePath, p) : defaultInflatePath,
59
+ defaultInflatePath,
60
+ method: m.toLocaleLowerCase() !== "use" ? m.toUpperCase() : undefined,
61
+ path: normalizePath(join(prePath, p))
62
+ });
63
+ }
64
+ }
65
+ }
66
+
67
+
68
+
69
+ return ret;
70
+ }
@@ -0,0 +1,91 @@
1
+ import { ConsoleTransport, getEnvVariable, Logger, LoggerTransport, MinimalLogger, newURL, normalizePath, Request, WriteArgs } from "@miqro/core";
2
+ import { format } from "node:util";
3
+
4
+ const DEFAULT_ENV_NAME = "LOG_LEVEL";
5
+
6
+ export interface LogProviderOptions {
7
+ name?: string;
8
+ transports: LoggerTransport[];
9
+ formatter: (args: WriteArgs) => string;
10
+ }
11
+
12
+ export const DEFAULT_FORMATTER = ({ identifier, level, message, optionalParams }: WriteArgs) => format(`${new Date().toISOString()} PID[${process.pid}] ` +
13
+ `${identifier ? `[${identifier}] ` : ""}` +
14
+ `${level !== "info" ? (level === "error" || level === "warn" ? `[${level.toUpperCase()}] ` : `[${level}] `) : ""}` +
15
+ `${message}`, ...optionalParams)
16
+
17
+ export class LogProvider {
18
+
19
+ public options: LogProviderOptions;
20
+ public constructor(options?: LogProviderOptions) {
21
+ this.options = {
22
+ formatter: options && options.formatter ? options.formatter : DEFAULT_FORMATTER,
23
+ transports: options && options.transports ? options.transports : [ConsoleTransport()]
24
+ };
25
+ this.requestLoggerFactory = this.requestLoggerFactory.bind(this);
26
+ }
27
+
28
+ public requestLoggerFactory(uuid: string, req: Request): MinimalLogger {
29
+ let path = "";
30
+ let query = "";
31
+ let urlParsingError;
32
+ let method = "GET";
33
+ let remoteAddress: string | undefined = "";
34
+ try {
35
+ const url = newURL(req.url ? req.url : "/") as URL;
36
+ query = url.searchParams.toString();
37
+ path = normalizePath(url.pathname); // normalized path
38
+ method = req.method ? req.method.toUpperCase() as string : "GET";
39
+ remoteAddress = req.socket.remoteAddress;
40
+ } catch (e) {
41
+ urlParsingError = e;
42
+ }
43
+ const pathToEnv = path.replace(/\//ig, "_").toUpperCase();
44
+ const WORKER_IDENTIFIER = process.env["CLUSTER_NODE_NUMBER"] ? `WORKER_${process.env["CLUSTER_NODE_NUMBER"]}_` : "";
45
+ const identifier = `${pathToEnv === "_" ? "" : `${pathToEnv.substring(1)}`}${method.toUpperCase()}`;
46
+ const upgrade = req.headers.connection?.indexOf("Upgrade") !== -1;
47
+
48
+ const logger = this.getLogger(
49
+ `${WORKER_IDENTIFIER}${identifier}`, {
50
+ formatter: (args: WriteArgs) => {
51
+ args.message = `%s${upgrade ? " UPGRADE" : ""} %s%s [%s] (%s) ${args.message}`;
52
+ args.optionalParams = [method, path, query ? `?${query}` : "", uuid, remoteAddress].concat(args.optionalParams);
53
+ args.meta.push(req);
54
+ args.meta.push(uuid);
55
+ return this.options.formatter(args);
56
+ }
57
+ });
58
+
59
+
60
+ if (urlParsingError) {
61
+ logger.error(urlParsingError);
62
+ }
63
+
64
+ return logger;
65
+ };
66
+
67
+ public getLogger(identifier: string, options?: { level?: any; transports?: any[]; formatter?: any; }): Logger {
68
+
69
+ identifier = this.options.name ?
70
+ `${this.options.name}${identifier ?
71
+ `_${identifier}` : ""}`.toUpperCase() :
72
+ identifier ? identifier.toUpperCase() : "";
73
+
74
+ const envVarName = `LOG_LEVEL_${identifier}`;
75
+ const level = options && options.level ? options.level : getEnvVariable(envVarName) ? getEnvVariable(envVarName) : getEnvVariable(DEFAULT_ENV_NAME, "info");
76
+
77
+ const logger = new Logger(identifier, level, {
78
+ transports: [],
79
+ formatter: options && options.formatter ? options.formatter : this.options.formatter
80
+ });
81
+ for (const t of this.options.transports) {
82
+ logger.addTransport(t);
83
+ }
84
+ if (options && options.transports) {
85
+ for (const t of options.transports) {
86
+ logger.addTransport(t);
87
+ }
88
+ }
89
+ return logger;
90
+ }
91
+ }
@@ -0,0 +1,166 @@
1
+ import { WebSocketServer, Logger } from "@miqro/core";
2
+ import { Database } from "@miqro/query";
3
+ import cluster from "node:cluster";
4
+ import { CacheInterface, MigrateOptions, NamedMigration, ServerInterface } from "../../types.js";
5
+ import { DBManager } from "./db-manager.js";
6
+ import { Miqro } from "../app.js";
7
+ import { WebSocketManager } from "./websocketmanager.js";
8
+ import { execSync } from "node:child_process";
9
+ import { LogProvider } from "./log.js";
10
+
11
+ /*
12
+ {
13
+ cache: this.cache,
14
+ localCache: this.localCache,
15
+ db: {
16
+ get: (name: string) => {
17
+ return this.dbManager.getDB(name);
18
+ },
19
+ getMigrations: () => {
20
+ if (this.inflated) {
21
+ const ret: NamedMigration[] = [];
22
+ for (const d of this.inflated.dbList) {
23
+ ret.push(...(d.migrations.map(m => {
24
+ return {
25
+ name: m.name,
26
+ service: m.service,
27
+ dbName: m.dbName
28
+ }
29
+ })));
30
+ }
31
+ return ret;
32
+ }
33
+ return [];
34
+ },
35
+ migrate: (options) => {
36
+ return this.migrate(options);
37
+ },
38
+ },
39
+ ws: {
40
+ get: (path: string) => {
41
+ if (path === LOG_SOCKET_PATH) {
42
+ throw new Error("cannot use this path");
43
+ }
44
+ return this.webSocketManager.getWS(path);
45
+ },
46
+ disconnectAll: (path: string) => {
47
+ if (path === LOG_SOCKET_PATH) {
48
+ throw new Error("cannot use this path");
49
+ }
50
+ this.webSocketManager.disconnectAllFrom(path);
51
+ }
52
+ },
53
+ isPrimaryWorker: () => {
54
+ return cluster.isPrimary || process.env["CLUSTER_NODE_NUMBER"] === "0";
55
+ },
56
+ openBrowser: (path: string) => {
57
+ const PORT = this.options.port;
58
+ const URL = `http://localhost:${PORT}${path}`;
59
+ const DEFAULT_OPEN = process.platform === "win32" ? "explorer" : process.platform === "darwin" ? "open" : "xdg-open";
60
+ const OPEN = process.env["BROWSER"] ? process.env["BROWSER"] === "none" ? false : process.env["BROWSER"] : DEFAULT_OPEN;
61
+ if (OPEN) {
62
+ const openCMD = `${OPEN} "${URL}"`;
63
+ this.logger?.info("opening browser with [%s]", openCMD);
64
+ execSync(openCMD);
65
+ } else {
66
+ this.logger?.warn("ignoring browser [%s]", process.env["BROWSER"]);
67
+ }
68
+ },
69
+ logger: this.logger,
70
+ getLogger: (identifier: string, options?: { level?: any; transports?: any[]; formatter?: any; }) => {
71
+ return this.loggerProvider.getLogger(identifier, options);
72
+ }
73
+ }*/
74
+
75
+ export interface ServerInterfaceImplOptions {
76
+ cache: CacheInterface;
77
+ localCache: CacheInterface;
78
+ dbManager: DBManager;
79
+ wsManager: WebSocketManager;
80
+ logger?: Logger;
81
+ app?: Miqro;
82
+ port?: string;
83
+ loggerProvider?: LogProvider;
84
+ }
85
+
86
+ export class ServerInterfaceImpl implements ServerInterface {
87
+ public cache: CacheInterface;
88
+ public localCache: CacheInterface;
89
+ public logger?: Logger;
90
+ public port?: string;
91
+
92
+ public db: {
93
+ get(name: string): Database | null;
94
+ getMigrations(): NamedMigration[];
95
+ migrate(options: MigrateOptions): Promise<void>;
96
+ };
97
+ public ws: {
98
+ get(path: string): WebSocketServer | undefined;
99
+ disconnectAll(path: string): void;
100
+ };
101
+ public loggerProvider?: LogProvider;
102
+
103
+ constructor(options: ServerInterfaceImplOptions) {
104
+ this.cache = options.cache;
105
+ this.localCache = options.localCache;
106
+ this.logger = options.logger;
107
+ this.port = options.port;
108
+
109
+ const dbManager = options.dbManager;
110
+ const wsManager = options.wsManager;
111
+ this.loggerProvider = options.loggerProvider;
112
+ const app = options.app;
113
+
114
+ this.db = Object.freeze({
115
+ get: (name: string) => {
116
+ return dbManager.getDB(name);
117
+ },
118
+ getMigrations: () => {
119
+ if (app?.inflated) {
120
+ const ret: NamedMigration[] = [];
121
+ for (const d of app?.inflated.dbList) {
122
+ ret.push(...(d.migrations.map(m => {
123
+ return {
124
+ name: m.name,
125
+ service: m.service,
126
+ dbName: m.dbName
127
+ }
128
+ })));
129
+ }
130
+ return ret;
131
+ }
132
+ return [];
133
+ },
134
+ migrate: (options: MigrateOptions) => {
135
+ return app?.migrate(options);
136
+ }
137
+ });
138
+ this.ws = Object.freeze({
139
+ get: (name: string) => {
140
+ return wsManager?.getWS(name);
141
+ },
142
+ disconnectAll: (path: string) => {
143
+ return wsManager?.disconnectAllButLOGSocket();
144
+ }
145
+ });
146
+ }
147
+ public isPrimaryWorker(): boolean {
148
+ return cluster.isPrimary || process.env["CLUSTER_NODE_NUMBER"] === "0";
149
+ }
150
+ public openBrowser(path: string): void {
151
+ const PORT = this.port;
152
+ const URL = `http://localhost${PORT ? `:${PORT}` : ""}${path}`;
153
+ const DEFAULT_OPEN = process.platform === "win32" ? "explorer" : process.platform === "darwin" ? "open" : "xdg-open";
154
+ const OPEN = process.env["BROWSER"] ? process.env["BROWSER"] === "none" ? false : process.env["BROWSER"] : DEFAULT_OPEN;
155
+ if (OPEN) {
156
+ const openCMD = `${OPEN} "${URL}"`;
157
+ this.logger?.info("opening browser with [%s]", openCMD);
158
+ execSync(openCMD);
159
+ } else {
160
+ this.logger?.warn("ignoring browser [%s]", process.env["BROWSER"]);
161
+ }
162
+ }
163
+ public getLogger(identifier: string, options?: { level?: any; transports?: any[]; formatter?: any; }): Logger {
164
+ return this.loggerProvider?.getLogger(identifier, options);
165
+ }
166
+ }