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