miqro 6.0.14 → 6.1.2

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 (318) hide show
  1. package/README.md +12 -0
  2. package/build/editor.bundle.js +37 -50409
  3. package/build/esm/src/bin/compile.js +0 -1
  4. package/build/esm/src/bin/doc-md.js +0 -1
  5. package/build/esm/src/bin/generate-doc.d.ts +3 -1
  6. package/build/esm/src/bin/generate-doc.js +16 -12
  7. package/build/esm/src/bin/test.js +0 -1
  8. package/build/esm/src/bin/types.js +0 -1
  9. package/build/esm/src/cluster.js +0 -1
  10. package/build/esm/src/common/arguments.d.ts +12 -0
  11. package/build/esm/src/common/arguments.js +111 -10
  12. package/build/esm/src/common/assets.js +2 -3
  13. package/build/esm/src/common/checksum.js +0 -1
  14. package/build/esm/src/common/constants.js +0 -1
  15. package/build/esm/src/common/content-type.js +0 -1
  16. package/build/esm/src/common/esbuild.js +0 -1
  17. package/build/esm/src/common/exit.js +0 -1
  18. package/build/esm/src/common/fs.js +0 -1
  19. package/build/esm/src/common/help.d.ts +1 -1
  20. package/build/esm/src/common/help.js +4 -1
  21. package/build/esm/src/common/jsx.d.ts +8 -1
  22. package/build/esm/src/common/jsx.js +84 -2
  23. package/build/esm/src/common/paths.d.ts +4 -0
  24. package/build/esm/src/common/paths.js +41 -2
  25. package/build/esm/src/common/watch.js +0 -1
  26. package/build/esm/src/inflate/inflate-sea.js +27 -16
  27. package/build/esm/src/inflate/inflate.js +2 -1
  28. package/build/esm/src/inflate/md.d.ts +1 -0
  29. package/build/esm/src/inflate/md.js +9 -6
  30. package/build/esm/src/inflate/setup-auth.js +0 -1
  31. package/build/esm/src/inflate/setup-cors.js +0 -1
  32. package/build/esm/src/inflate/setup-db.js +0 -1
  33. package/build/esm/src/inflate/setup-error.d.ts +3 -0
  34. package/build/esm/src/inflate/setup-error.js +40 -0
  35. package/build/esm/src/inflate/setup-http.js +13 -4
  36. package/build/esm/src/inflate/setup-log.js +0 -1
  37. package/build/esm/src/inflate/setup-middleware.d.ts +4 -0
  38. package/build/esm/src/inflate/setup-middleware.js +42 -0
  39. package/build/esm/src/inflate/setup-server-config.js +0 -1
  40. package/build/esm/src/inflate/setup-test.js +0 -1
  41. package/build/esm/src/inflate/setup-ws.js +0 -1
  42. package/build/esm/src/inflate/setup.doc.d.ts +4 -0
  43. package/build/esm/src/inflate/setup.doc.js +62 -0
  44. package/build/esm/src/inflate/utils/sea-utils.js +0 -1
  45. package/build/esm/src/lib.js +0 -1
  46. package/build/esm/src/main.js +3 -4
  47. package/build/esm/src/services/app.d.ts +1 -0
  48. package/build/esm/src/services/app.js +18 -2
  49. package/build/esm/src/services/editor.js +0 -1
  50. package/build/esm/src/services/globals.js +0 -1
  51. package/build/esm/src/services/hot-reload.js +0 -1
  52. package/build/esm/src/services/migrations.js +0 -1
  53. package/build/esm/src/services/utils/admin-interface.js +0 -1
  54. package/build/esm/src/services/utils/cache.js +0 -1
  55. package/build/esm/src/services/utils/cluster-cache.js +0 -1
  56. package/build/esm/src/services/utils/cluster-ws.js +0 -1
  57. package/build/esm/src/services/utils/db-manager.js +0 -1
  58. package/build/esm/src/services/utils/get-route.js +0 -1
  59. package/build/esm/src/services/utils/log-transport.js +0 -1
  60. package/build/esm/src/services/utils/log.js +2 -2
  61. package/build/esm/src/services/utils/server-interface.js +0 -1
  62. package/build/esm/src/services/utils/websocketmanager.js +0 -1
  63. package/build/esm/src/types.d.ts +16 -1
  64. package/build/esm/src/types.js +0 -1
  65. package/build/lib.cjs +890 -322
  66. package/package.json +4 -2
  67. package/sea/types.json +1 -1
  68. package/tsconfig.json +1 -1
  69. package/bin/miqro +0 -34
  70. package/build/esm/editor/auth.d.ts +0 -6
  71. package/build/esm/editor/auth.js +0 -42
  72. package/build/esm/editor/auth.js.map +0 -1
  73. package/build/esm/editor/common/admin-interface.d.ts +0 -36
  74. package/build/esm/editor/common/admin-interface.js +0 -45
  75. package/build/esm/editor/common/admin-interface.js.map +0 -1
  76. package/build/esm/editor/common/constants.d.ts +0 -4
  77. package/build/esm/editor/common/constants.js +0 -21
  78. package/build/esm/editor/common/constants.js.map +0 -1
  79. package/build/esm/editor/common/constants.server.d.ts +0 -2
  80. package/build/esm/editor/common/constants.server.js +0 -5
  81. package/build/esm/editor/common/constants.server.js.map +0 -1
  82. package/build/esm/editor/common/editor-index.d.ts +0 -2
  83. package/build/esm/editor/common/editor-index.js +0 -15
  84. package/build/esm/editor/common/editor-index.js.map +0 -1
  85. package/build/esm/editor/common/html-encode.d.ts +0 -1
  86. package/build/esm/editor/common/html-encode.js +0 -15
  87. package/build/esm/editor/common/html-encode.js.map +0 -1
  88. package/build/esm/editor/common/log-socket.d.ts +0 -15
  89. package/build/esm/editor/common/log-socket.js +0 -71
  90. package/build/esm/editor/common/log-socket.js.map +0 -1
  91. package/build/esm/editor/common/templates.d.ts +0 -11
  92. package/build/esm/editor/common/templates.js +0 -444
  93. package/build/esm/editor/common/templates.js.map +0 -1
  94. package/build/esm/editor/components/api-preview.d.ts +0 -11
  95. package/build/esm/editor/components/api-preview.js +0 -91
  96. package/build/esm/editor/components/api-preview.js.map +0 -1
  97. package/build/esm/editor/components/editor.d.ts +0 -16
  98. package/build/esm/editor/components/editor.js +0 -358
  99. package/build/esm/editor/components/editor.js.map +0 -1
  100. package/build/esm/editor/components/file-browser.d.ts +0 -37
  101. package/build/esm/editor/components/file-browser.js +0 -127
  102. package/build/esm/editor/components/file-browser.js.map +0 -1
  103. package/build/esm/editor/components/file-editor-toolbar.d.ts +0 -22
  104. package/build/esm/editor/components/file-editor-toolbar.js +0 -94
  105. package/build/esm/editor/components/file-editor-toolbar.js.map +0 -1
  106. package/build/esm/editor/components/file-editor.d.ts +0 -32
  107. package/build/esm/editor/components/file-editor.js +0 -60
  108. package/build/esm/editor/components/file-editor.js.map +0 -1
  109. package/build/esm/editor/components/filter-query.d.ts +0 -1
  110. package/build/esm/editor/components/filter-query.js +0 -23
  111. package/build/esm/editor/components/filter-query.js.map +0 -1
  112. package/build/esm/editor/components/highlight-text-area.d.ts +0 -11
  113. package/build/esm/editor/components/highlight-text-area.js +0 -139
  114. package/build/esm/editor/components/highlight-text-area.js.map +0 -1
  115. package/build/esm/editor/components/log-viewer.d.ts +0 -6
  116. package/build/esm/editor/components/log-viewer.js +0 -70
  117. package/build/esm/editor/components/log-viewer.js.map +0 -1
  118. package/build/esm/editor/components/new-file.d.ts +0 -10
  119. package/build/esm/editor/components/new-file.js +0 -118
  120. package/build/esm/editor/components/new-file.js.map +0 -1
  121. package/build/esm/editor/components/scroll-query.d.ts +0 -7
  122. package/build/esm/editor/components/scroll-query.js +0 -22
  123. package/build/esm/editor/components/scroll-query.js.map +0 -1
  124. package/build/esm/editor/components/start-page.d.ts +0 -13
  125. package/build/esm/editor/components/start-page.js +0 -31
  126. package/build/esm/editor/components/start-page.js.map +0 -1
  127. package/build/esm/editor/http/admin/editor/api/fs/delete.api.d.ts +0 -3
  128. package/build/esm/editor/http/admin/editor/api/fs/delete.api.js +0 -30
  129. package/build/esm/editor/http/admin/editor/api/fs/delete.api.js.map +0 -1
  130. package/build/esm/editor/http/admin/editor/api/fs/read.api.d.ts +0 -5
  131. package/build/esm/editor/http/admin/editor/api/fs/read.api.js +0 -50
  132. package/build/esm/editor/http/admin/editor/api/fs/read.api.js.map +0 -1
  133. package/build/esm/editor/http/admin/editor/api/fs/rename.api.d.ts +0 -4
  134. package/build/esm/editor/http/admin/editor/api/fs/rename.api.js +0 -40
  135. package/build/esm/editor/http/admin/editor/api/fs/rename.api.js.map +0 -1
  136. package/build/esm/editor/http/admin/editor/api/fs/scan.api.d.ts +0 -26
  137. package/build/esm/editor/http/admin/editor/api/fs/scan.api.js +0 -150
  138. package/build/esm/editor/http/admin/editor/api/fs/scan.api.js.map +0 -1
  139. package/build/esm/editor/http/admin/editor/api/fs/write.api.d.ts +0 -3
  140. package/build/esm/editor/http/admin/editor/api/fs/write.api.js +0 -39
  141. package/build/esm/editor/http/admin/editor/api/fs/write.api.js.map +0 -1
  142. package/build/esm/editor/http/admin/editor/api/server/reload.api.d.ts +0 -10
  143. package/build/esm/editor/http/admin/editor/api/server/reload.api.js +0 -47
  144. package/build/esm/editor/http/admin/editor/api/server/reload.api.js.map +0 -1
  145. package/build/esm/editor/http/admin/editor/api/server/restart.api.d.ts +0 -10
  146. package/build/esm/editor/http/admin/editor/api/server/restart.api.js +0 -46
  147. package/build/esm/editor/http/admin/editor/api/server/restart.api.js.map +0 -1
  148. package/build/esm/editor/http/admin/editor/editor.d.ts +0 -1
  149. package/build/esm/editor/http/admin/editor/editor.js +0 -8
  150. package/build/esm/editor/http/admin/editor/editor.js.map +0 -1
  151. package/build/esm/editor/http/admin/editor/index.api.d.ts +0 -3
  152. package/build/esm/editor/http/admin/editor/index.api.js +0 -22
  153. package/build/esm/editor/http/admin/editor/index.api.js.map +0 -1
  154. package/build/esm/editor/server.d.ts +0 -3
  155. package/build/esm/editor/server.js +0 -50
  156. package/build/esm/editor/server.js.map +0 -1
  157. package/build/esm/editor/ws.d.ts +0 -3
  158. package/build/esm/editor/ws.js +0 -12
  159. package/build/esm/editor/ws.js.map +0 -1
  160. package/build/esm/src/bin/compile.js.map +0 -1
  161. package/build/esm/src/bin/doc-md.js.map +0 -1
  162. package/build/esm/src/bin/generate-doc.js.map +0 -1
  163. package/build/esm/src/bin/test.js.map +0 -1
  164. package/build/esm/src/bin/types.js.map +0 -1
  165. package/build/esm/src/cluster.js.map +0 -1
  166. package/build/esm/src/common/arguments.js.map +0 -1
  167. package/build/esm/src/common/assets.js.map +0 -1
  168. package/build/esm/src/common/checksum.js.map +0 -1
  169. package/build/esm/src/common/constants.js.map +0 -1
  170. package/build/esm/src/common/content-type.js.map +0 -1
  171. package/build/esm/src/common/esbuild.js.map +0 -1
  172. package/build/esm/src/common/exit.js.map +0 -1
  173. package/build/esm/src/common/fs.js.map +0 -1
  174. package/build/esm/src/common/help.js.map +0 -1
  175. package/build/esm/src/common/jsx.js.map +0 -1
  176. package/build/esm/src/common/paths.js.map +0 -1
  177. package/build/esm/src/common/watch.js.map +0 -1
  178. package/build/esm/src/inflate/inflate-sea.js.map +0 -1
  179. package/build/esm/src/inflate/inflate.js.map +0 -1
  180. package/build/esm/src/inflate/md.js.map +0 -1
  181. package/build/esm/src/inflate/setup-auth.js.map +0 -1
  182. package/build/esm/src/inflate/setup-cors.js.map +0 -1
  183. package/build/esm/src/inflate/setup-db.js.map +0 -1
  184. package/build/esm/src/inflate/setup-http.js.map +0 -1
  185. package/build/esm/src/inflate/setup-log.js.map +0 -1
  186. package/build/esm/src/inflate/setup-server-config.js.map +0 -1
  187. package/build/esm/src/inflate/setup-test.js.map +0 -1
  188. package/build/esm/src/inflate/setup-ws.js.map +0 -1
  189. package/build/esm/src/inflate/utils/sea-utils.js.map +0 -1
  190. package/build/esm/src/lib.js.map +0 -1
  191. package/build/esm/src/main.js.map +0 -1
  192. package/build/esm/src/services/app.js.map +0 -1
  193. package/build/esm/src/services/editor.js.map +0 -1
  194. package/build/esm/src/services/globals.js.map +0 -1
  195. package/build/esm/src/services/hot-reload.js.map +0 -1
  196. package/build/esm/src/services/migrations.js.map +0 -1
  197. package/build/esm/src/services/utils/admin-interface.js.map +0 -1
  198. package/build/esm/src/services/utils/cache.js.map +0 -1
  199. package/build/esm/src/services/utils/cluster-cache.js.map +0 -1
  200. package/build/esm/src/services/utils/cluster-ws.js.map +0 -1
  201. package/build/esm/src/services/utils/db-manager.js.map +0 -1
  202. package/build/esm/src/services/utils/get-route.js.map +0 -1
  203. package/build/esm/src/services/utils/log-transport.js.map +0 -1
  204. package/build/esm/src/services/utils/log.js.map +0 -1
  205. package/build/esm/src/services/utils/server-interface.js.map +0 -1
  206. package/build/esm/src/services/utils/websocketmanager.js.map +0 -1
  207. package/build/esm/src/types.js.map +0 -1
  208. package/editor/auth.ts +0 -51
  209. package/editor/common/admin-interface.ts +0 -84
  210. package/editor/common/constants.server.ts +0 -5
  211. package/editor/common/constants.ts +0 -21
  212. package/editor/common/editor-index.tsx +0 -17
  213. package/editor/common/html-encode.ts +0 -14
  214. package/editor/common/log-socket.tsx +0 -85
  215. package/editor/common/templates.ts +0 -448
  216. package/editor/components/api-preview.tsx +0 -116
  217. package/editor/components/editor.tsx +0 -486
  218. package/editor/components/file-browser.tsx +0 -308
  219. package/editor/components/file-editor-toolbar.tsx +0 -191
  220. package/editor/components/file-editor.tsx +0 -122
  221. package/editor/components/filter-query.tsx +0 -22
  222. package/editor/components/highlight-text-area.tsx +0 -159
  223. package/editor/components/log-viewer.tsx +0 -110
  224. package/editor/components/new-file.tsx +0 -169
  225. package/editor/components/scroll-query.tsx +0 -22
  226. package/editor/components/start-page.tsx +0 -49
  227. package/editor/http/admin/editor/api/fs/delete.api.tsx +0 -32
  228. package/editor/http/admin/editor/api/fs/read.api.tsx +0 -55
  229. package/editor/http/admin/editor/api/fs/rename.api.tsx +0 -41
  230. package/editor/http/admin/editor/api/fs/scan.api.tsx +0 -181
  231. package/editor/http/admin/editor/api/fs/write.api.tsx +0 -41
  232. package/editor/http/admin/editor/api/server/reload.api.ts +0 -53
  233. package/editor/http/admin/editor/api/server/restart.api.tsx +0 -52
  234. package/editor/http/admin/editor/editor.tsx +0 -8
  235. package/editor/http/admin/editor/index.api.tsx +0 -39
  236. package/editor/server.ts +0 -57
  237. package/editor/static/android-chrome-192x192.png +0 -0
  238. package/editor/static/android-chrome-512x512.png +0 -0
  239. package/editor/static/apple-touch-icon.png +0 -0
  240. package/editor/static/editor.bundle.in.mjs +0 -20
  241. package/editor/static/favicon-16x16.png +0 -0
  242. package/editor/static/favicon-32x32.png +0 -0
  243. package/editor/static/favicon.ico +0 -0
  244. package/editor/static/site.webmanifest +0 -19
  245. package/editor/ws.ts +0 -15
  246. package/sea/base64.js +0 -3
  247. package/sea/compile.sh +0 -127
  248. package/sea/copy-types.sh +0 -46
  249. package/sea/editor-assets/editor.bundle.in.mjs +0 -19
  250. package/sea/generate-global-types-asset-json.js +0 -34
  251. package/sea/release-tar.sh +0 -5
  252. package/sea/tsc.sh +0 -1
  253. package/sea/version.tag.js +0 -11
  254. package/src/bin/compile.ts +0 -35
  255. package/src/bin/doc-md.ts +0 -210
  256. package/src/bin/generate-doc.ts +0 -58
  257. package/src/bin/test.ts +0 -92
  258. package/src/bin/types.ts +0 -22
  259. package/src/cluster.ts +0 -27
  260. package/src/common/arguments.ts +0 -382
  261. package/src/common/assets.ts +0 -128
  262. package/src/common/checksum.ts +0 -58
  263. package/src/common/constants.ts +0 -18
  264. package/src/common/content-type.ts +0 -84
  265. package/src/common/esbuild.ts +0 -94
  266. package/src/common/exit.ts +0 -91
  267. package/src/common/fs.ts +0 -17
  268. package/src/common/help.ts +0 -47
  269. package/src/common/jsx.ts +0 -426
  270. package/src/common/paths.ts +0 -117
  271. package/src/common/watch.ts +0 -85
  272. package/src/inflate/inflate-sea.ts +0 -194
  273. package/src/inflate/inflate.ts +0 -96
  274. package/src/inflate/md.ts +0 -20
  275. package/src/inflate/setup-auth.ts +0 -40
  276. package/src/inflate/setup-cors.ts +0 -40
  277. package/src/inflate/setup-db.ts +0 -113
  278. package/src/inflate/setup-http.ts +0 -643
  279. package/src/inflate/setup-log.ts +0 -44
  280. package/src/inflate/setup-server-config.ts +0 -47
  281. package/src/inflate/setup-test.ts +0 -23
  282. package/src/inflate/setup-ws.ts +0 -48
  283. package/src/inflate/utils/sea-utils.ts +0 -14
  284. package/src/lib.ts +0 -19
  285. package/src/main.ts +0 -87
  286. package/src/services/app.ts +0 -640
  287. package/src/services/editor.tsx +0 -101
  288. package/src/services/globals.ts +0 -143
  289. package/src/services/hot-reload.ts +0 -48
  290. package/src/services/migrations.ts +0 -66
  291. package/src/services/utils/admin-interface.ts +0 -37
  292. package/src/services/utils/cache.ts +0 -88
  293. package/src/services/utils/cluster-cache.ts +0 -230
  294. package/src/services/utils/cluster-ws.ts +0 -197
  295. package/src/services/utils/db-manager.ts +0 -92
  296. package/src/services/utils/get-route.ts +0 -70
  297. package/src/services/utils/log-transport.ts +0 -75
  298. package/src/services/utils/log.ts +0 -91
  299. package/src/services/utils/server-interface.ts +0 -172
  300. package/src/services/utils/websocketmanager.ts +0 -149
  301. package/src/types/@esbuild.d.ts +0 -1
  302. package/src/types/@miqro/core.d.ts +0 -2
  303. package/src/types/@miqro/jsx.d.ts +0 -2
  304. package/src/types/@miqro/parser.d.ts +0 -2
  305. package/src/types/@miqro/query.d.ts +0 -2
  306. package/src/types/@miqro/request.d.ts +0 -2
  307. package/src/types/@miqro/test.d.ts +0 -2
  308. package/src/types/@miqro.d.ts +0 -1
  309. package/src/types/@types.d.ts +0 -1
  310. package/src/types/browser.globals.d.ts +0 -9
  311. package/src/types/globals.d.ts +0 -2
  312. package/src/types/jsx.globals.d.ts +0 -37
  313. package/src/types/miqro.d.ts +0 -111
  314. package/src/types/postject.d.ts +0 -1
  315. package/src/types/server.globals.d.ts +0 -72
  316. package/src/types.ts +0 -204
  317. /package/{editor/http/admin/editor → build}/font.ttf +0 -0
  318. /package/{editor/http/admin/editor → build}/style.css +0 -0
@@ -1,640 +0,0 @@
1
- import cluster from "node:cluster";
2
- import { App, Router, Logger, LoggerHandler } from "@miqro/core";
3
- import { migration } from "@miqro/query";
4
- import { WebSocketManager } from "./utils/websocketmanager.js";
5
- import { DBManager } from "./utils/db-manager.js";
6
- import { inflateApp } from "../inflate/inflate.js";
7
- import { InflateError } from "../common/jsx.js";
8
- import { DBConfig, MigrateOptions, ServerInterface, ServerRequest, WSConfig } from "../types.js";
9
- import { RouteFileMap } from "../inflate/setup-http.js";
10
- import { ServerConfigMap, setupServerConfig } from "../inflate/setup-server-config.js";
11
- import { BASEEDITOR_PATH, LOG_SOCKET_PATH } from "../../editor/common/constants.js";
12
- import editorWSConfig from "../../editor/ws.js";
13
- import editorServerConfig from "../../editor/server.js";
14
-
15
- import { ClusterCache } from "./utils/cluster-cache.js";
16
- import { createEditorRouter } from "./editor.js";
17
- import { EDITOR_CONFIG_KEY, HOT_RELOAD_PATH } from "../common/constants.js";
18
- import { watchAndServer } from "../common/watch.js";
19
- import { LocalCache } from "./utils/cache.js";
20
- import { initGlobals } from "./globals.js";
21
- import { EditorAdminInterface } from "../../editor/common/admin-interface.js";
22
- import { LogProvider, LogProviderOptions } from "./utils/log.js";
23
- import { initAssets } from "../common/assets.js";
24
- import { setupExitHandlers } from "../common/exit.js";
25
- import { inflateDBConfig, inflateDBMigrations, MigrationModule } from "../inflate/setup-db.js";
26
- import { getServicePath } from "../common/paths.js";
27
- import { LogConfigMap } from "../inflate/setup-log.js";
28
- import { ServerInterfaceImpl } from "./utils/server-interface.js";
29
- import { getPORT } from "../common/arguments.js";
30
- import { createLogProviderOptions } from "./utils/log-transport.js";
31
- import { createAdminInterface } from "./utils/admin-interface.js";
32
-
33
- export interface MiqroOptions {
34
- name: string;
35
- logger?: Logger;
36
- logProviderOptions?: LogProviderOptions;
37
- services: string[];
38
- editor: boolean;
39
- port: string;
40
- hotreload?: boolean;
41
- }
42
-
43
- export interface InflateOptions {
44
- inflateDir?: string;
45
- inflateSea?: boolean;
46
- }
47
-
48
- export interface InflatedResult {
49
- router: Router;
50
- errors: InflateError[];
51
- fileMap: RouteFileMap;
52
- dbList: {
53
- dbConfig: DBConfig;
54
- service: string;
55
- migrations: MigrationModule[];
56
- }[];
57
- wsConfigList: WSConfig[];
58
- serverConfigMap: ServerConfigMap;
59
- logConfigMap: LogConfigMap;
60
- }
61
-
62
- export const MiqroApplicationMessageType = "$$$MiqroApplicationMessageType$$$";
63
-
64
- export interface MiqroClusterMessage {
65
- type: typeof MiqroApplicationMessageType;
66
- action: "reload" | "restart";
67
- target: string;
68
- fromPID: number;
69
- }
70
-
71
- export class Miqro {
72
- public status: "stopped" | "starting" | "stopping" | "reloading" | "started" = "stopped";
73
- public options: MiqroOptions;
74
- public server?: App | null = null;
75
- public cache: ClusterCache;
76
- public localCache: LocalCache;
77
- public webSocketManager: WebSocketManager;
78
- public dbManager: DBManager;
79
-
80
- public serverInterface: ServerInterface;
81
- public adminInterface: EditorAdminInterface;
82
-
83
- public inflated: InflatedResult | null | undefined = null;
84
- private listener: (msg: MiqroClusterMessage) => void;
85
- public serverRequestHandler: (req: ServerRequest) => void;
86
- public logger?: Logger;
87
- public loggerProvider: LogProvider;
88
- public static initAssetsPromise: Promise<any> | null = null;
89
- public watcher?: { stopWatch: () => void; };
90
-
91
- constructor(options?: Partial<MiqroOptions>) {
92
- this.options = {
93
- editor: false,
94
- name: "server",
95
- port: getPORT(),
96
- services: [],
97
- ...(options ? options : {})
98
- };
99
- this.loggerProvider = new LogProvider(createLogProviderOptions(this));
100
- //if (!this.options.logger) {
101
- const SERVER_IDENTIFIER = cluster.isPrimary ?
102
- "" :
103
- process.env["CLUSTER_NODE_NUMBER"] ?
104
- `WORKER_${process.env["CLUSTER_NODE_NUMBER"]}`.toUpperCase() :
105
- `WORKER`;
106
- this.logger = this.options.logger ? this.options.logger : this.loggerProvider.getLogger(SERVER_IDENTIFIER);
107
- //}
108
- this.listener = async (data: any) => {
109
- try {
110
- const msg = (data as MiqroClusterMessage);
111
- if (
112
- msg &&
113
- msg.action &&
114
- msg.type === MiqroApplicationMessageType &&
115
- msg.target === this.options.name,
116
- msg.fromPID !== process.pid,
117
- (msg.action === "reload" || msg.action === "restart")) {
118
- this.logger?.debug("remote server message from [%s] [%s]", msg.fromPID, msg.action);
119
- switch (msg.action) {
120
- case "reload":
121
- await this.reload(true);
122
- break;
123
- case "restart":
124
- await this.restart(true);
125
- break;
126
- default:
127
- throw new Error("unsopported message for ApplicaitonServer");
128
- }
129
- }
130
- } catch (e) {
131
- this.logger?.error(e);
132
- }
133
- };
134
- this.cache = new ClusterCache(`MiqroApplicationCache[${this.options.name}]`, this.logger);
135
- this.localCache = new LocalCache(`MiqroApplicationLocalCache[${this.options.name}]`, this.logger);
136
- this.webSocketManager = new WebSocketManager({
137
- logger: this.logger,
138
- name: `MiqroApplicationWebsocketManager[${this.options.name}]`,
139
- avoidLogSocket: this.options.editor
140
- });
141
- this.listener = this.listener.bind(this);
142
- //this.requestLoggerFactory = this.requestLoggerFactory.bind(this);
143
- //this.loggerFactory = this.loggerFactory.bind(this);
144
- this.dbManager = new DBManager({
145
- loggerProvider: this.loggerProvider,
146
- logger: this.logger
147
- });
148
-
149
- this.serverInterface = new ServerInterfaceImpl({
150
- cache: this.cache,
151
- localCache: this.localCache,
152
- dbManager: this.dbManager,
153
- wsManager: this.webSocketManager,
154
- app: this,
155
- logger: this.logger,
156
- loggerProvider: this.loggerProvider,
157
- port: this.options.port
158
- });
159
- this.serverRequestHandler = ServerRequestHandler(this.serverInterface);
160
-
161
- this.adminInterface = createAdminInterface(this);
162
-
163
- setupExitHandlers(this);
164
- }
165
-
166
- public connect() {
167
- if (process.send) {
168
- process.removeListener("message", this.listener);
169
- process.on("message", this.listener);
170
- }
171
- this.cache.connect();
172
- (this.adminInterface?.getCache() as ClusterCache)?.connect();
173
- }
174
-
175
- public disconnect() {
176
- if (this.server !== null) {
177
- throw new Error("already running! call stop() first");
178
- }
179
- if (process.send) {
180
- process.removeListener("message", this.listener);
181
- }
182
- this.cache.disconnect();
183
- (this.adminInterface?.getCache() as ClusterCache)?.disconnect();
184
- this.webSocketManager.disconnectAll();
185
- this.dbManager.closeAll();
186
- }
187
-
188
- public async inflateWith(inflated?: Partial<InflatedResult>) {
189
- if (this.inflated !== null) {
190
- throw new Error("already inflated! call deflate()");
191
- }
192
- initGlobals();
193
- // block others from inflating while inflateApp is running
194
- this.inflated = undefined;
195
- this.inflated = {
196
- router: inflated && inflated.router ? inflated.router : new Router(),
197
- errors: inflated && inflated.errors ? inflated.errors : [],
198
- fileMap: inflated && inflated.fileMap ? inflated.fileMap : {},
199
- logConfigMap: inflated && inflated.logConfigMap ? inflated.logConfigMap : {},
200
- //migrations: inflated && inflated.migrations ? inflated.migrations : [],
201
- dbList: inflated && inflated.dbList ? inflated.dbList : [],
202
- wsConfigList: inflated && inflated.wsConfigList ? inflated.wsConfigList : [],
203
- serverConfigMap: inflated && inflated.serverConfigMap ? inflated.serverConfigMap : {}
204
- };
205
- await Promise.all(this.inflated.dbList.map(db => this.dbManager.setupDB(db.dbConfig)));
206
- }
207
-
208
- public async loadServerConfig(options?: InflateOptions) {
209
- const serverConfigMap: ServerConfigMap = {};
210
- const errors: InflateError[] = [];
211
- for (const service of this.options.services) {
212
- const servicePath = getServicePath(service);
213
- await setupServerConfig(this.logger, servicePath, service, serverConfigMap, options && options.inflateSea ? options.inflateDir : undefined, errors);
214
- }
215
- return {
216
- serverConfigMap,
217
- errors
218
- }
219
- }
220
-
221
- public async loadDBConfig(options?: InflateOptions): Promise<{
222
- dbList: {
223
- dbConfig: DBConfig;
224
- service: string;
225
- migrations: MigrationModule[];
226
- }[]; errors: InflateError[]
227
- }> {
228
- const errors: InflateError[] = [];
229
- const dbList: {
230
- service: string;
231
- dbConfig: DBConfig;
232
- migrations: MigrationModule[];
233
- }[] = [];
234
- const dbConfigList: DBConfig[] = [];
235
- for (const service of this.options.services) {
236
- const dbConfig = await inflateDBConfig(this.logger, service, dbConfigList, options?.inflateSea ? options?.inflateDir : undefined, errors);
237
- if (dbConfig) {
238
- const migrations = await inflateDBMigrations(this.logger, service, dbConfig.name, options?.inflateSea ? options?.inflateDir : undefined, errors);
239
- dbList.push({
240
- service,
241
- dbConfig,
242
- migrations: migrations ? migrations : []
243
- });
244
- }
245
- }
246
- return { dbList, errors };
247
- }
248
-
249
- public async migrate({ direction, service, name, dbName }: MigrateOptions = { direction: "up" }) {
250
- // init assets only once for all ApplicationServer's
251
- if (Miqro.initAssetsPromise === null) {
252
- // init globals only once for all inflations
253
- initGlobals();
254
- Miqro.initAssetsPromise = initAssets(this.logger);
255
- }
256
- await Miqro.initAssetsPromise;
257
- const { dbList } = await this.loadDBConfig();
258
-
259
- for (const serviceDB of dbList) {
260
- if ((!service || serviceDB.service === service) && (!dbName || serviceDB.dbConfig.name === dbName)) {
261
- const db = this.dbManager.getDB(serviceDB.dbConfig.name) ? this.dbManager.getDB(serviceDB.dbConfig.name) : await this.dbManager.setupDB(serviceDB.dbConfig);
262
- if (db) {
263
- this.logger.info("\t\t====== [init migration table] ======");
264
- await migration.init(db, this.logger);
265
- const migrations = direction === "down" ? serviceDB.migrations.reverse() : serviceDB.migrations;
266
- if (!name) {
267
- for (const m of migrations) {
268
- if (direction === "down") {
269
- await migration.down.module(db, m.name, m, this.logger);
270
- } else {
271
- await migration.up.module(db, m.name, m, this.logger);
272
- }
273
- }
274
- } else {
275
- for (const m of migrations) {
276
- if (m.name === name) {
277
- if (direction === "down") {
278
- await migration.down.module(db, m.name, m, this.logger);
279
- } else {
280
- await migration.up.module(db, m.name, m, this.logger);
281
- }
282
- break;
283
- }
284
- }
285
- }
286
- }
287
- }
288
- }
289
- }
290
-
291
- public async inflate(options?: InflateOptions): Promise<InflatedResult> {
292
- if (this.inflated !== null) {
293
- throw new Error("already inflated! call await deflate() first!");
294
- }
295
- try {
296
- // block others from inflating while inflateApp is running
297
- this.inflated = undefined;
298
- // init assets only once for all ApplicationServer's
299
- if (Miqro.initAssetsPromise === null) {
300
- // init globals only once for all inflations
301
- initGlobals();
302
- Miqro.initAssetsPromise = initAssets(this.logger);
303
- }
304
- await Miqro.initAssetsPromise;
305
-
306
- // store the result
307
- const router = new Router();
308
- const wsConfigList: WSConfig[] = [];
309
-
310
- /* setup db connection before inflate app router and */
311
- const { dbList, errors: dbConfigErrors } = await this.loadDBConfig(options);
312
- await Promise.all(dbList.map(db => this.dbManager.setupDB(db.dbConfig)));
313
-
314
- /* setup server config before inflate app router and ws and bs for preload*/
315
- const { errors: serviceConfigErrors, serverConfigMap } = await this.loadServerConfig(options);
316
-
317
- // editor WSConfig must be put a head of the service WSConfig to avoid LOG_SOCKET replacement
318
- if (this.options.editor) {
319
- this.logger?.debug("setting up editor on %s", BASEEDITOR_PATH);
320
- const editorRouter = await createEditorRouter(this.adminInterface);
321
- router.use(editorRouter);
322
- this.logger?.debug("setting up log websocket on [%s]", LOG_SOCKET_PATH);
323
- wsConfigList.push(editorWSConfig);
324
- serverConfigMap[EDITOR_CONFIG_KEY] = editorServerConfig;
325
- }
326
-
327
- if (this.options?.hotreload/* && !options?.inflateTests*/) {
328
- this.logger?.debug("setting up websocket on [%s]", HOT_RELOAD_PATH);
329
- wsConfigList.push({
330
- path: HOT_RELOAD_PATH
331
- });
332
- }
333
-
334
- await notifiyServerConfig(this.logger, this.serverInterface, this.adminInterface, serverConfigMap, "preload");
335
-
336
- /* setup app (router, websocket servers files)*/
337
- const [serviceRouter, errors, fileMap/*, migrations*/, serviceWSConfigList/*, serverConfigMap*/, serviceLogConfigMap] = await inflateApp({
338
- logger: this.logger,
339
- services: this.options.services,
340
- serverInterface: this.serverInterface,
341
- //dbManager: this.dbManager,
342
- inflateDir: options?.inflateDir,
343
- inflateSea: options?.inflateSea ? true : false,
344
- //inflateTests: options?.inflateTests ? true : false,
345
- hotreload: this.options?.hotreload ? true : false
346
- });
347
-
348
- wsConfigList.push(...serviceWSConfigList);
349
- router.use(serviceRouter);
350
- this.inflated = {
351
- router,
352
- logConfigMap: serviceLogConfigMap,
353
- errors: (errors ? errors : []).concat(dbConfigErrors).concat(serviceConfigErrors),
354
- fileMap,
355
- //migrations,
356
- dbList,
357
- wsConfigList,
358
- serverConfigMap
359
- };
360
-
361
- return this.inflated;
362
- } catch (e) {
363
- this.inflated = null;
364
- throw e;
365
- }
366
- }
367
-
368
- public isInflated() {
369
- return this.inflated ? true : false;
370
- }
371
-
372
- public isRunning() {
373
- return this.server !== null;
374
- }
375
-
376
- public async deflate() {
377
- if (this.isRunning()) {
378
- throw new Error("cannot deflate app running. call app.stop() first.");
379
- }
380
- if (this.inflated !== null) {
381
- if (this.inflated === undefined) {
382
- throw new Error("cannot deflate an app that is currently inflating. wait for the result with await app.inflate() first.");
383
- } else {
384
- throw new Error("cannot deflate uninflated app. call await app.inflate() first.");
385
- }
386
- }
387
- await this.dbManager.closeAll();
388
- await this.dbManager.deleteAll();
389
- this.inflated = null;
390
- }
391
-
392
- public async start() {
393
- if (this.server !== null || this.status !== "stopped") {
394
- throw new Error("cannot start app already running.");
395
- }
396
- if (!this.isInflated()) {
397
- throw new Error("cannot start uninflated app. call await app.inflate() first.");
398
- }
399
- //this.logger?.debug("starting");
400
- this.logger?.debug("\t\t==start==");
401
-
402
- //this.disconnect();
403
- this.status = "starting";
404
- this.server = undefined;
405
- this.connect();
406
- await this.dbManager.connectAll();
407
- this.server = new App({
408
- onUpgrade: (req: ServerRequest, socket, head) => {
409
- req.server = this.serverInterface;
410
- return this.webSocketManager.onUpgrade(req, socket, head);
411
- },
412
- loggerFactory: this.loggerProvider.requestLoggerFactory
413
- });
414
-
415
- this.webSocketManager.replaceALLWS(this.inflated.wsConfigList);
416
-
417
- reloadInflatedRouter(this);
418
-
419
- await notifiyServerConfig(this.logger, this.serverInterface, this.adminInterface, this.inflated.serverConfigMap, "load");
420
-
421
- if (this.logger && (cluster.isPrimary || process.env["CLUSTER_NODE_NUMBER"] === "0")) {
422
- this.logger?.debug("\t\t==http routes==");
423
- this.server.logPaths({
424
- debug: this.logger.debug.bind(this.logger),
425
- error: this.logger.error.bind(this.logger),
426
- info: this.logger.debug.bind(this.logger),
427
- log: this.logger.debug.bind(this.logger),
428
- trace: this.logger.trace.bind(this.logger),
429
- warn: this.logger.warn.bind(this.logger)
430
- });
431
- }
432
-
433
- this.logger?.trace("calling listen on [%s]", this.options.port);
434
-
435
- await this.server.listen(this.options.port);
436
-
437
- if (this.logger && (cluster.isPrimary || process.env["CLUSTER_NODE_NUMBER"] === "0")) {
438
- this.logger?.log("\t\t==listening on [%s]==", this.options.port);
439
- } else {
440
- this.logger?.debug("\t\t==listening on [%s]==", this.options.port);
441
- }
442
-
443
- await notifiyServerConfig(this.logger, this.serverInterface, this.adminInterface, this.inflated.serverConfigMap, "start");
444
-
445
- if (this.options.hotreload && (cluster.isPrimary || process.env["CLUSTER_NODE_NUMBER"] === "0")) {
446
- this.watcher = await watchAndServer(this);
447
- }
448
-
449
- this.logger?.debug("\t\t==start done==");
450
-
451
- this.status = "started";
452
- return this.inflated.errors && this.inflated.errors.length > 0 ? this.inflated.errors : null;
453
- }
454
-
455
- public async stop() {
456
- if (!this.server || !this.inflated || this.status !== "started") {
457
- throw new Error("cannot stop server not running");
458
- }
459
- this.status = "stopping";
460
- if (this.watcher) {
461
- this.watcher.stopWatch();
462
- this.watcher = null;
463
- }
464
- const server = this.server;
465
- this.server = null;
466
- this.disconnect();
467
- this.logger?.debug("\t\t==stop==");
468
- this.logger?.debug("clear running server routes");
469
- server.clear();
470
- this.webSocketManager.disconnectAll();
471
- this.webSocketManager.deleteAllWS();
472
- const pD = this.dbManager.deleteAll();
473
- notifiyServerConfigSync(this, "unload");
474
- //server.ws.disconnectAll();
475
- this.logger?.debug("stopping");
476
- const p = server.close();
477
- await p;
478
- await pD;
479
- this.status = "stopped";
480
- notifiyServerConfigSync(this, "stop");
481
- this.logger?.debug("\t\t==stop done==");
482
- }
483
-
484
- public async restart(avoidSend?: boolean) {
485
- if (!this.server || !this.inflated || this.status !== "started") {
486
- throw new Error("cannot start server not running");
487
- }
488
- this.logger?.debug("\t\t==restart==");
489
- if (process.send && !avoidSend) {
490
- process.send({
491
- type: MiqroApplicationMessageType,
492
- target: this.options.name,
493
- action: "restart",
494
- fromPID: process.pid
495
- } as MiqroClusterMessage);
496
- }
497
- await this.stop();
498
- const ret = await this.start();
499
- this.logger?.debug("\t\t==restart done==");
500
- return ret;
501
- }
502
-
503
- public async reload(avoidSend?: boolean) {
504
- if (!this.server || !this.inflated || this.status !== "started") {
505
- throw new Error("cannot reload server not running");
506
- }
507
- this.status = "reloading";
508
- /*this.logger?.log("====================");
509
- this.logger?.log("=======reload=======");
510
- this.logger?.log("====================");*/
511
-
512
- if (!avoidSend) {
513
- this.logger?.debug("\t\t==reload==");
514
- } else {
515
- this.logger?.debug("\t\t==reload==");
516
- }
517
- // block others from calling this
518
- const oldServerConfigMap = this.inflated.serverConfigMap;
519
- this.inflated = undefined;
520
- if (process.send && !avoidSend) {
521
- process.send({
522
- type: MiqroApplicationMessageType,
523
- target: this.options.name,
524
- action: "reload",
525
- fromPID: process.pid
526
- } as MiqroClusterMessage);
527
- }
528
-
529
- this.logger?.debug("clear running server routes");
530
- this.server.clear();
531
- await this.webSocketManager.disconnectAllButLOGSocket();
532
- await notifiyServerConfig(this.logger, this.serverInterface, this.adminInterface, oldServerConfigMap, "unload");
533
-
534
- /* force deflation*/
535
- await this.dbManager.closeAll();
536
- await this.dbManager.deleteAll();
537
- this.inflated = null;
538
- /* re-inflation */
539
- this.inflated = await this.inflate();
540
- if (!this.inflated) {
541
- throw new Error("inflation failed!");
542
- }
543
-
544
- reloadInflatedRouter(this);
545
- await this.webSocketManager.disconnectAllButLOGSocket();
546
- this.webSocketManager.replaceALLWSBuLOGSocket(this.inflated.wsConfigList);
547
-
548
- await notifiyServerConfig(this.logger, this.serverInterface, this.adminInterface, this.inflated.serverConfigMap, "load");
549
-
550
- if (this.logger && (cluster.isPrimary || process.env["CLUSTER_NODE_NUMBER"] === "0")) {
551
- this.logger?.debug("\t\t==http routes==");
552
- this.server.logPaths({
553
- debug: this.logger.debug.bind(this.logger),
554
- error: this.logger.error.bind(this.logger),
555
- info: this.logger.debug.bind(this.logger),
556
- log: this.logger.debug.bind(this.logger),
557
- trace: this.logger.trace.bind(this.logger),
558
- warn: this.logger.warn.bind(this.logger)
559
- });
560
- }
561
-
562
- //this.logger?.log("=====================");
563
- this.logger?.debug("\t\t==reload done==");
564
- //this.logger?.log("=====================");
565
-
566
- this.status = "started";
567
- return this.inflated.errors && this.inflated.errors.length > 0 ? this.inflated.errors : null;
568
-
569
- }
570
- }
571
-
572
- export function ServerRequestHandler(server: ServerInterface) {
573
- return function ServerRequestHandler(req: ServerRequest) {
574
- req.server = server;
575
- }
576
- }
577
-
578
- function reloadInflatedRouter(app: Miqro) {
579
- if (!app.server) {
580
- throw new Error("not running");
581
- }
582
- if (!app.inflated) {
583
- throw new Error("not inflated");
584
- }
585
- app.logger?.debug("clear running server routes");
586
- app.server.clear();
587
- app.logger?.debug("load running server with new routes");
588
-
589
- app.server.use(app.serverRequestHandler);
590
-
591
- app.server.use(LoggerHandler());
592
- if (app.options.editor) {
593
- app.server.use(async (req, res) => {
594
- res.setHeader("x-uuid", req.uuid);
595
- });
596
- }
597
-
598
- app.server.use(app.inflated.router);
599
- }
600
-
601
- async function notifiyServerConfig(logger: Logger, serverInterface: ServerInterface, adminInterface: EditorAdminInterface, serverConfigMap: ServerConfigMap, method: "load" | "start" | "unload" | "stop" | "preload") {
602
- if (serverConfigMap) {
603
- await Promise.allSettled(Object.keys(serverConfigMap).map(name => {
604
- return new Promise<void>(async (resolve) => {
605
- try {
606
- const serverConfig = serverConfigMap[name];
607
- if (serverConfig && serverConfig[method]) {
608
- if (name === EDITOR_CONFIG_KEY) {
609
- await (serverConfig[method] as any)(serverInterface, adminInterface);
610
- } else {
611
- await serverConfig[method](serverInterface);
612
- }
613
-
614
- }
615
- resolve();
616
- } catch (e) {
617
- logger?.error(e);
618
- resolve();
619
- }
620
- })
621
- }));
622
- }
623
- }
624
-
625
- export function notifiyServerConfigSync(app: Miqro, method: "unload" | "stop") {
626
- if (app.inflated) {
627
- Object.keys(app.inflated.serverConfigMap).map(name => {
628
- try {
629
- if (app.inflated) {
630
- const serverConfig = app.inflated.serverConfigMap[name];
631
- if (serverConfig && serverConfig[method]) {
632
- serverConfig[method](app.serverInterface);
633
- }
634
- }
635
- } catch (e) {
636
- app.logger?.error(e);
637
- }
638
- });
639
- }
640
- }