miqro 6.0.13 → 6.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 (323) hide show
  1. package/README.md +12 -0
  2. package/build/editor.bundle.js +41 -50413
  3. package/build/esm/src/cluster.js +0 -1
  4. package/build/esm/src/common/arguments.d.ts +12 -0
  5. package/build/esm/src/common/arguments.js +111 -10
  6. package/build/esm/src/common/assets.js +2 -3
  7. package/build/esm/src/common/checksum.js +0 -1
  8. package/build/esm/src/common/constants.d.ts +1 -0
  9. package/build/esm/src/common/constants.js +2 -3
  10. package/build/esm/src/common/content-type.js +0 -1
  11. package/build/esm/src/common/esbuild.js +0 -1
  12. package/build/esm/src/common/exit.js +0 -1
  13. package/build/esm/src/common/fs.js +0 -1
  14. package/build/esm/src/common/help.d.ts +1 -1
  15. package/build/esm/src/common/help.js +4 -1
  16. package/build/esm/src/common/jsx.d.ts +8 -1
  17. package/build/esm/src/common/jsx.js +84 -2
  18. package/build/esm/src/common/paths.d.ts +4 -0
  19. package/build/esm/src/common/paths.js +41 -2
  20. package/build/esm/src/common/watch.js +0 -1
  21. package/build/esm/src/inflate/inflate-sea.js +27 -16
  22. package/build/esm/src/inflate/inflate.js +2 -1
  23. package/build/esm/src/inflate/md.d.ts +1 -0
  24. package/build/esm/src/inflate/md.js +9 -6
  25. package/build/esm/src/inflate/setup-auth.js +0 -1
  26. package/build/esm/src/inflate/setup-cors.js +0 -1
  27. package/build/esm/src/inflate/setup-db.js +0 -1
  28. package/build/esm/src/inflate/setup-error.d.ts +3 -0
  29. package/build/esm/src/inflate/setup-error.js +40 -0
  30. package/build/esm/src/inflate/setup-http.js +13 -4
  31. package/build/esm/src/inflate/setup-log.js +0 -1
  32. package/build/esm/src/inflate/setup-middleware.d.ts +4 -0
  33. package/build/esm/src/inflate/setup-middleware.js +42 -0
  34. package/build/esm/src/inflate/setup-server-config.js +0 -1
  35. package/build/esm/src/inflate/setup-test.js +0 -1
  36. package/build/esm/src/inflate/setup-ws.js +0 -1
  37. package/build/esm/src/inflate/setup.doc.d.ts +4 -0
  38. package/build/esm/src/inflate/setup.doc.js +62 -0
  39. package/build/esm/src/inflate/utils/sea-utils.js +0 -1
  40. package/build/esm/src/lib.js +0 -1
  41. package/build/esm/src/main.js +3 -4
  42. package/build/esm/src/services/app.d.ts +1 -0
  43. package/build/esm/src/services/app.js +21 -5
  44. package/build/esm/src/services/editor.js +0 -1
  45. package/build/esm/src/services/globals.js +0 -1
  46. package/build/esm/src/services/hot-reload.js +2 -2
  47. package/build/esm/src/services/migrations.js +0 -1
  48. package/build/esm/src/services/utils/admin-interface.js +0 -1
  49. package/build/esm/src/services/utils/cache.js +0 -1
  50. package/build/esm/src/services/utils/cluster-cache.js +0 -1
  51. package/build/esm/src/services/utils/cluster-ws.js +0 -1
  52. package/build/esm/src/services/utils/db-manager.js +0 -1
  53. package/build/esm/src/services/utils/get-route.js +0 -1
  54. package/build/esm/src/services/utils/log-transport.js +0 -1
  55. package/build/esm/src/services/utils/log.js +2 -2
  56. package/build/esm/src/services/utils/server-interface.js +0 -1
  57. package/build/esm/src/services/utils/websocketmanager.js +0 -1
  58. package/build/esm/src/types.d.ts +16 -1
  59. package/build/esm/src/types.js +0 -1
  60. package/build/lib.cjs +895 -326
  61. package/package.json +4 -2
  62. package/sea/types.json +1 -1
  63. package/tsconfig.json +1 -1
  64. package/bin/miqro +0 -34
  65. package/build/esm/editor/auth.d.ts +0 -6
  66. package/build/esm/editor/auth.js +0 -42
  67. package/build/esm/editor/auth.js.map +0 -1
  68. package/build/esm/editor/common/admin-interface.d.ts +0 -36
  69. package/build/esm/editor/common/admin-interface.js +0 -45
  70. package/build/esm/editor/common/admin-interface.js.map +0 -1
  71. package/build/esm/editor/common/constants.d.ts +0 -4
  72. package/build/esm/editor/common/constants.js +0 -21
  73. package/build/esm/editor/common/constants.js.map +0 -1
  74. package/build/esm/editor/common/constants.server.d.ts +0 -2
  75. package/build/esm/editor/common/constants.server.js +0 -5
  76. package/build/esm/editor/common/constants.server.js.map +0 -1
  77. package/build/esm/editor/common/editor-index.d.ts +0 -2
  78. package/build/esm/editor/common/editor-index.js +0 -15
  79. package/build/esm/editor/common/editor-index.js.map +0 -1
  80. package/build/esm/editor/common/html-encode.d.ts +0 -1
  81. package/build/esm/editor/common/html-encode.js +0 -15
  82. package/build/esm/editor/common/html-encode.js.map +0 -1
  83. package/build/esm/editor/common/log-socket.d.ts +0 -15
  84. package/build/esm/editor/common/log-socket.js +0 -71
  85. package/build/esm/editor/common/log-socket.js.map +0 -1
  86. package/build/esm/editor/common/templates.d.ts +0 -11
  87. package/build/esm/editor/common/templates.js +0 -444
  88. package/build/esm/editor/common/templates.js.map +0 -1
  89. package/build/esm/editor/components/api-preview.d.ts +0 -11
  90. package/build/esm/editor/components/api-preview.js +0 -91
  91. package/build/esm/editor/components/api-preview.js.map +0 -1
  92. package/build/esm/editor/components/editor.d.ts +0 -16
  93. package/build/esm/editor/components/editor.js +0 -358
  94. package/build/esm/editor/components/editor.js.map +0 -1
  95. package/build/esm/editor/components/file-browser.d.ts +0 -37
  96. package/build/esm/editor/components/file-browser.js +0 -127
  97. package/build/esm/editor/components/file-browser.js.map +0 -1
  98. package/build/esm/editor/components/file-editor-toolbar.d.ts +0 -22
  99. package/build/esm/editor/components/file-editor-toolbar.js +0 -94
  100. package/build/esm/editor/components/file-editor-toolbar.js.map +0 -1
  101. package/build/esm/editor/components/file-editor.d.ts +0 -32
  102. package/build/esm/editor/components/file-editor.js +0 -60
  103. package/build/esm/editor/components/file-editor.js.map +0 -1
  104. package/build/esm/editor/components/filter-query.d.ts +0 -1
  105. package/build/esm/editor/components/filter-query.js +0 -23
  106. package/build/esm/editor/components/filter-query.js.map +0 -1
  107. package/build/esm/editor/components/highlight-text-area.d.ts +0 -11
  108. package/build/esm/editor/components/highlight-text-area.js +0 -139
  109. package/build/esm/editor/components/highlight-text-area.js.map +0 -1
  110. package/build/esm/editor/components/log-viewer.d.ts +0 -6
  111. package/build/esm/editor/components/log-viewer.js +0 -70
  112. package/build/esm/editor/components/log-viewer.js.map +0 -1
  113. package/build/esm/editor/components/new-file.d.ts +0 -10
  114. package/build/esm/editor/components/new-file.js +0 -118
  115. package/build/esm/editor/components/new-file.js.map +0 -1
  116. package/build/esm/editor/components/scroll-query.d.ts +0 -7
  117. package/build/esm/editor/components/scroll-query.js +0 -22
  118. package/build/esm/editor/components/scroll-query.js.map +0 -1
  119. package/build/esm/editor/components/start-page.d.ts +0 -13
  120. package/build/esm/editor/components/start-page.js +0 -31
  121. package/build/esm/editor/components/start-page.js.map +0 -1
  122. package/build/esm/editor/http/admin/editor/api/fs/delete.api.d.ts +0 -3
  123. package/build/esm/editor/http/admin/editor/api/fs/delete.api.js +0 -30
  124. package/build/esm/editor/http/admin/editor/api/fs/delete.api.js.map +0 -1
  125. package/build/esm/editor/http/admin/editor/api/fs/read.api.d.ts +0 -5
  126. package/build/esm/editor/http/admin/editor/api/fs/read.api.js +0 -50
  127. package/build/esm/editor/http/admin/editor/api/fs/read.api.js.map +0 -1
  128. package/build/esm/editor/http/admin/editor/api/fs/rename.api.d.ts +0 -4
  129. package/build/esm/editor/http/admin/editor/api/fs/rename.api.js +0 -40
  130. package/build/esm/editor/http/admin/editor/api/fs/rename.api.js.map +0 -1
  131. package/build/esm/editor/http/admin/editor/api/fs/scan.api.d.ts +0 -26
  132. package/build/esm/editor/http/admin/editor/api/fs/scan.api.js +0 -150
  133. package/build/esm/editor/http/admin/editor/api/fs/scan.api.js.map +0 -1
  134. package/build/esm/editor/http/admin/editor/api/fs/write.api.d.ts +0 -3
  135. package/build/esm/editor/http/admin/editor/api/fs/write.api.js +0 -39
  136. package/build/esm/editor/http/admin/editor/api/fs/write.api.js.map +0 -1
  137. package/build/esm/editor/http/admin/editor/api/server/reload.api.d.ts +0 -10
  138. package/build/esm/editor/http/admin/editor/api/server/reload.api.js +0 -47
  139. package/build/esm/editor/http/admin/editor/api/server/reload.api.js.map +0 -1
  140. package/build/esm/editor/http/admin/editor/api/server/restart.api.d.ts +0 -10
  141. package/build/esm/editor/http/admin/editor/api/server/restart.api.js +0 -46
  142. package/build/esm/editor/http/admin/editor/api/server/restart.api.js.map +0 -1
  143. package/build/esm/editor/http/admin/editor/editor.d.ts +0 -1
  144. package/build/esm/editor/http/admin/editor/editor.js +0 -8
  145. package/build/esm/editor/http/admin/editor/editor.js.map +0 -1
  146. package/build/esm/editor/http/admin/editor/index.api.d.ts +0 -3
  147. package/build/esm/editor/http/admin/editor/index.api.js +0 -22
  148. package/build/esm/editor/http/admin/editor/index.api.js.map +0 -1
  149. package/build/esm/editor/server.d.ts +0 -3
  150. package/build/esm/editor/server.js +0 -50
  151. package/build/esm/editor/server.js.map +0 -1
  152. package/build/esm/editor/ws.d.ts +0 -3
  153. package/build/esm/editor/ws.js +0 -12
  154. package/build/esm/editor/ws.js.map +0 -1
  155. package/build/esm/src/bin/compile.d.ts +0 -3
  156. package/build/esm/src/bin/compile.js +0 -31
  157. package/build/esm/src/bin/compile.js.map +0 -1
  158. package/build/esm/src/bin/doc-md.d.ts +0 -17
  159. package/build/esm/src/bin/doc-md.js +0 -187
  160. package/build/esm/src/bin/doc-md.js.map +0 -1
  161. package/build/esm/src/bin/generate-doc.d.ts +0 -4
  162. package/build/esm/src/bin/generate-doc.js +0 -49
  163. package/build/esm/src/bin/generate-doc.js.map +0 -1
  164. package/build/esm/src/bin/test.d.ts +0 -3
  165. package/build/esm/src/bin/test.js +0 -68
  166. package/build/esm/src/bin/test.js.map +0 -1
  167. package/build/esm/src/bin/types.d.ts +0 -3
  168. package/build/esm/src/bin/types.js +0 -21
  169. package/build/esm/src/bin/types.js.map +0 -1
  170. package/build/esm/src/cluster.js.map +0 -1
  171. package/build/esm/src/common/arguments.js.map +0 -1
  172. package/build/esm/src/common/assets.js.map +0 -1
  173. package/build/esm/src/common/checksum.js.map +0 -1
  174. package/build/esm/src/common/constants.js.map +0 -1
  175. package/build/esm/src/common/content-type.js.map +0 -1
  176. package/build/esm/src/common/esbuild.js.map +0 -1
  177. package/build/esm/src/common/exit.js.map +0 -1
  178. package/build/esm/src/common/fs.js.map +0 -1
  179. package/build/esm/src/common/help.js.map +0 -1
  180. package/build/esm/src/common/jsx.js.map +0 -1
  181. package/build/esm/src/common/paths.js.map +0 -1
  182. package/build/esm/src/common/watch.js.map +0 -1
  183. package/build/esm/src/inflate/inflate-sea.js.map +0 -1
  184. package/build/esm/src/inflate/inflate.js.map +0 -1
  185. package/build/esm/src/inflate/md.js.map +0 -1
  186. package/build/esm/src/inflate/setup-auth.js.map +0 -1
  187. package/build/esm/src/inflate/setup-cors.js.map +0 -1
  188. package/build/esm/src/inflate/setup-db.js.map +0 -1
  189. package/build/esm/src/inflate/setup-http.js.map +0 -1
  190. package/build/esm/src/inflate/setup-log.js.map +0 -1
  191. package/build/esm/src/inflate/setup-server-config.js.map +0 -1
  192. package/build/esm/src/inflate/setup-test.js.map +0 -1
  193. package/build/esm/src/inflate/setup-ws.js.map +0 -1
  194. package/build/esm/src/inflate/utils/sea-utils.js.map +0 -1
  195. package/build/esm/src/lib.js.map +0 -1
  196. package/build/esm/src/main.js.map +0 -1
  197. package/build/esm/src/services/app.js.map +0 -1
  198. package/build/esm/src/services/editor.js.map +0 -1
  199. package/build/esm/src/services/globals.js.map +0 -1
  200. package/build/esm/src/services/hot-reload.js.map +0 -1
  201. package/build/esm/src/services/migrations.js.map +0 -1
  202. package/build/esm/src/services/utils/admin-interface.js.map +0 -1
  203. package/build/esm/src/services/utils/cache.js.map +0 -1
  204. package/build/esm/src/services/utils/cluster-cache.js.map +0 -1
  205. package/build/esm/src/services/utils/cluster-ws.js.map +0 -1
  206. package/build/esm/src/services/utils/db-manager.js.map +0 -1
  207. package/build/esm/src/services/utils/get-route.js.map +0 -1
  208. package/build/esm/src/services/utils/log-transport.js.map +0 -1
  209. package/build/esm/src/services/utils/log.js.map +0 -1
  210. package/build/esm/src/services/utils/server-interface.js.map +0 -1
  211. package/build/esm/src/services/utils/websocketmanager.js.map +0 -1
  212. package/build/esm/src/types.js.map +0 -1
  213. package/editor/auth.ts +0 -51
  214. package/editor/common/admin-interface.ts +0 -84
  215. package/editor/common/constants.server.ts +0 -5
  216. package/editor/common/constants.ts +0 -21
  217. package/editor/common/editor-index.tsx +0 -17
  218. package/editor/common/html-encode.ts +0 -14
  219. package/editor/common/log-socket.tsx +0 -85
  220. package/editor/common/templates.ts +0 -448
  221. package/editor/components/api-preview.tsx +0 -116
  222. package/editor/components/editor.tsx +0 -486
  223. package/editor/components/file-browser.tsx +0 -308
  224. package/editor/components/file-editor-toolbar.tsx +0 -191
  225. package/editor/components/file-editor.tsx +0 -122
  226. package/editor/components/filter-query.tsx +0 -22
  227. package/editor/components/highlight-text-area.tsx +0 -159
  228. package/editor/components/log-viewer.tsx +0 -110
  229. package/editor/components/new-file.tsx +0 -169
  230. package/editor/components/scroll-query.tsx +0 -22
  231. package/editor/components/start-page.tsx +0 -49
  232. package/editor/http/admin/editor/api/fs/delete.api.tsx +0 -32
  233. package/editor/http/admin/editor/api/fs/read.api.tsx +0 -55
  234. package/editor/http/admin/editor/api/fs/rename.api.tsx +0 -41
  235. package/editor/http/admin/editor/api/fs/scan.api.tsx +0 -181
  236. package/editor/http/admin/editor/api/fs/write.api.tsx +0 -41
  237. package/editor/http/admin/editor/api/server/reload.api.ts +0 -53
  238. package/editor/http/admin/editor/api/server/restart.api.tsx +0 -52
  239. package/editor/http/admin/editor/editor.tsx +0 -8
  240. package/editor/http/admin/editor/index.api.tsx +0 -39
  241. package/editor/server.ts +0 -57
  242. package/editor/static/android-chrome-192x192.png +0 -0
  243. package/editor/static/android-chrome-512x512.png +0 -0
  244. package/editor/static/apple-touch-icon.png +0 -0
  245. package/editor/static/editor.bundle.in.mjs +0 -20
  246. package/editor/static/favicon-16x16.png +0 -0
  247. package/editor/static/favicon-32x32.png +0 -0
  248. package/editor/static/favicon.ico +0 -0
  249. package/editor/static/site.webmanifest +0 -19
  250. package/editor/ws.ts +0 -15
  251. package/sea/base64.js +0 -3
  252. package/sea/compile.sh +0 -127
  253. package/sea/copy-types.sh +0 -46
  254. package/sea/editor-assets/editor.bundle.in.mjs +0 -19
  255. package/sea/generate-global-types-asset-json.js +0 -34
  256. package/sea/release-tar.sh +0 -5
  257. package/sea/tsc.sh +0 -1
  258. package/sea/version.tag.js +0 -11
  259. package/src/bin/compile.ts +0 -35
  260. package/src/bin/doc-md.ts +0 -210
  261. package/src/bin/generate-doc.ts +0 -58
  262. package/src/bin/test.ts +0 -92
  263. package/src/bin/types.ts +0 -22
  264. package/src/cluster.ts +0 -27
  265. package/src/common/arguments.ts +0 -382
  266. package/src/common/assets.ts +0 -128
  267. package/src/common/checksum.ts +0 -58
  268. package/src/common/constants.ts +0 -18
  269. package/src/common/content-type.ts +0 -84
  270. package/src/common/esbuild.ts +0 -94
  271. package/src/common/exit.ts +0 -91
  272. package/src/common/fs.ts +0 -17
  273. package/src/common/help.ts +0 -47
  274. package/src/common/jsx.ts +0 -426
  275. package/src/common/paths.ts +0 -117
  276. package/src/common/watch.ts +0 -85
  277. package/src/inflate/inflate-sea.ts +0 -194
  278. package/src/inflate/inflate.ts +0 -96
  279. package/src/inflate/md.ts +0 -20
  280. package/src/inflate/setup-auth.ts +0 -40
  281. package/src/inflate/setup-cors.ts +0 -40
  282. package/src/inflate/setup-db.ts +0 -113
  283. package/src/inflate/setup-http.ts +0 -643
  284. package/src/inflate/setup-log.ts +0 -44
  285. package/src/inflate/setup-server-config.ts +0 -47
  286. package/src/inflate/setup-test.ts +0 -23
  287. package/src/inflate/setup-ws.ts +0 -48
  288. package/src/inflate/utils/sea-utils.ts +0 -14
  289. package/src/lib.ts +0 -19
  290. package/src/main.ts +0 -87
  291. package/src/services/app.ts +0 -640
  292. package/src/services/editor.tsx +0 -101
  293. package/src/services/globals.ts +0 -143
  294. package/src/services/hot-reload.ts +0 -46
  295. package/src/services/migrations.ts +0 -66
  296. package/src/services/utils/admin-interface.ts +0 -37
  297. package/src/services/utils/cache.ts +0 -88
  298. package/src/services/utils/cluster-cache.ts +0 -230
  299. package/src/services/utils/cluster-ws.ts +0 -197
  300. package/src/services/utils/db-manager.ts +0 -92
  301. package/src/services/utils/get-route.ts +0 -70
  302. package/src/services/utils/log-transport.ts +0 -75
  303. package/src/services/utils/log.ts +0 -91
  304. package/src/services/utils/server-interface.ts +0 -172
  305. package/src/services/utils/websocketmanager.ts +0 -149
  306. package/src/types/@esbuild.d.ts +0 -1
  307. package/src/types/@miqro/core.d.ts +0 -2
  308. package/src/types/@miqro/jsx.d.ts +0 -2
  309. package/src/types/@miqro/parser.d.ts +0 -2
  310. package/src/types/@miqro/query.d.ts +0 -2
  311. package/src/types/@miqro/request.d.ts +0 -2
  312. package/src/types/@miqro/test.d.ts +0 -2
  313. package/src/types/@miqro.d.ts +0 -1
  314. package/src/types/@types.d.ts +0 -1
  315. package/src/types/browser.globals.d.ts +0 -9
  316. package/src/types/globals.d.ts +0 -2
  317. package/src/types/jsx.globals.d.ts +0 -37
  318. package/src/types/miqro.d.ts +0 -111
  319. package/src/types/postject.d.ts +0 -1
  320. package/src/types/server.globals.d.ts +0 -72
  321. package/src/types.ts +0 -204
  322. /package/{editor/http/admin/editor → build}/font.ttf +0 -0
  323. /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 } 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 [/hot-reload]");
329
- wsConfigList.push({
330
- path: "/hot-reload/"
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
- }