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,230 +0,0 @@
1
- import { Logger } from "@miqro/core";
2
- import { CacheInterface } from "../../types.js";
3
-
4
- const ClusterCacheType = "$$$$$$$$$$$ClusterCacheType$$$$$$$$$$$";
5
-
6
- interface ClusterCacheMessage {
7
- type: typeof ClusterCacheType;
8
- target: string;
9
- action: "set" | "unset" | "set_add" | "set_delete" | "array_push";
10
- fromPID: number;
11
- key: string;
12
- value?: string;
13
- }
14
-
15
- export class ClusterCache implements CacheInterface {
16
- private localCache = new Map<string, unknown>();
17
- //private logger: Logger;
18
- listener: (data: any) => Promise<void>;
19
-
20
- constructor(public name: string, public logger?: Logger) {
21
- this.listener = async (data) => {
22
- try {
23
- const msg = (data as ClusterCacheMessage);
24
-
25
- //console.dir(msg);
26
- if (
27
- msg &&
28
- msg.key &&
29
- msg.action &&
30
- msg.type === ClusterCacheType &&
31
- msg.fromPID !== process.pid,
32
- (msg.action === "set_add" || msg.action === "set" || msg.action === "unset" || msg.action === "set_delete" || msg.action === "array_push") &&
33
- msg.target === this.name) {
34
- this.logger?.debug("remote cluster cache message from [%s] [%s] [%s] [%s]", msg.fromPID, msg.target, msg.action, msg.key);
35
- switch (msg.action) {
36
- case "unset":
37
- this.localCache.delete(msg.key);
38
- break;
39
- case "set":
40
- this.localCache.set(msg.key, msg.value);
41
- break;
42
- case "set_add": {
43
- //this.localCache.set(msg.key, msg.value);
44
- const list = this.localCache.has(msg.key) ? this.localCache.get(msg.key) : new Set<string>();
45
- if (!(list instanceof Set)) {
46
- throw new Error("cannot apply push on non array");
47
- }
48
- if (list.has(msg.value)) {
49
- list.add(msg.value);
50
- }
51
- this.localCache.set(msg.key, list);
52
- break;
53
- }
54
- case "set_delete": {
55
- //this.localCache.set(msg.key, msg.value);
56
- const list = this.localCache.has(msg.key) ? this.localCache.get(msg.key) : new Set<string>();
57
- if (!(list instanceof Set)) {
58
- throw new Error("cannot apply push on non array");
59
- }
60
- if (list.has(msg.value)) {
61
- list.delete(msg.value);
62
- }
63
- this.localCache.set(msg.key, list);
64
- break;
65
- }
66
- case "array_push": {
67
- //this.localCache.set(msg.key, msg.value);
68
- const list = this.localCache.has(msg.key) ? this.localCache.get(msg.key) : [];
69
- if (!(list instanceof Array)) {
70
- throw new Error("cannot apply push on non array");
71
- }
72
- list.push(msg.value);
73
- this.localCache.set(msg.key, list);
74
- break;
75
- }
76
- }
77
- }
78
- } catch (e) {
79
- this.logger?.error(e);
80
- }
81
- };
82
- this.connect();
83
- }
84
-
85
- connect() {
86
- if (process.send) {
87
- process.removeListener("message", this.listener);
88
- process.on("message", this.listener);
89
- }
90
- }
91
-
92
- disconnect() {
93
- process.removeListener("message", this.listener);
94
- }
95
-
96
- get<T = any>(key: string): T | undefined {
97
- this.logger?.trace("get(%s)", key);
98
- return this.localCache.get(key) as T;
99
- }
100
- set(key: string, value: unknown): void {
101
- this.localCache.set(key, value);
102
- this.logger?.trace("set(%s, ...)", key);
103
- if (process.send) {
104
- setTimeout(() => {
105
- process.send({
106
- type: ClusterCacheType,
107
- action: "set",
108
- target: this.name,
109
- fromPID: process.pid,
110
- key,
111
- value
112
- } as ClusterCacheMessage);
113
- }, 10);
114
- }
115
- }
116
- unset(key: string): void {
117
- this.logger?.trace("unset(%s)", key);
118
- this.localCache.delete(key);
119
- if (process.send) {
120
- setTimeout(() => {
121
- process.send({
122
- type: ClusterCacheType,
123
- target: this.name,
124
- action: "unset",
125
- fromPID: process.pid,
126
- key
127
- } as ClusterCacheMessage);
128
- }, 10);
129
- }
130
- }
131
- has(key: string): boolean {
132
- this.logger?.trace("has(%s)", key);
133
- return this.localCache.has(key);
134
- }
135
-
136
- set_add(key: string, value: unknown): void {
137
- this.logger?.trace("push(%s)", key);
138
- const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
139
- if (!(list instanceof Set)) {
140
- throw new Error("cannot apply on non Set");
141
- }
142
- if (list.has(value)) {
143
- list.add(value);
144
- }
145
- this.localCache.set(key, list);
146
-
147
- if (process.send) {
148
- setTimeout(() => {
149
- process.send({
150
- type: ClusterCacheType,
151
- target: this.name,
152
- action: "set_add",
153
- fromPID: process.pid,
154
- key,
155
- value
156
- } as ClusterCacheMessage);
157
- }, 10);
158
- }
159
- }
160
- set_delete(key: string, value: unknown): void {
161
- this.logger?.trace("delete(%s)", key);
162
- const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
163
- if (!(list instanceof Set)) {
164
- throw new Error("cannot apply on non Set");
165
- }
166
- if (list.has(value)) {
167
- list.delete(value);
168
- }
169
- this.localCache.set(key, list);
170
- if (process.send) {
171
- setTimeout(() => {
172
- process.send({
173
- type: ClusterCacheType,
174
- target: this.name,
175
- action: "set_delete",
176
- fromPID: process.pid,
177
- key,
178
- value
179
- } as ClusterCacheMessage);
180
- }, 10);
181
- }
182
- }
183
- set_has(key: string, value: unknown): boolean {
184
- this.logger?.trace("set_has(%s)", key);
185
- const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
186
- if (!(list instanceof Set)) {
187
- throw new Error("cannot apply on non Set");
188
- }
189
- const ret = list.has(value);
190
- this.localCache.set(key, list);
191
- return ret;
192
- }
193
- set_clear(key: string): void {
194
- this.logger?.trace("set_clear(%s)", key);
195
- const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
196
- if (!(list instanceof Set)) {
197
- throw new Error("cannot apply on non Set");
198
- }
199
- list.clear();
200
- this.localCache.set(key, list);
201
- }
202
- array_push(key: string, value: unknown): void {
203
- this.logger?.trace("array_push(%s)", key);
204
- const list = this.localCache.has(key) ? this.localCache.get(key) : [];
205
- if (!(list instanceof Array)) {
206
- throw new Error("cannot apply on non Array");
207
- }
208
- list.push(value);
209
- this.localCache.set(key, list);
210
- if (process.send) {
211
- setTimeout(() => {
212
- process.send({
213
- type: ClusterCacheType,
214
- target: this.name,
215
- action: "array_push",
216
- fromPID: process.pid,
217
- key,
218
- value
219
- } as ClusterCacheMessage);
220
- }, 10);
221
- }
222
- }
223
- array_clear(key: string): void {
224
- this.logger?.trace("array_clear(%s)", key);
225
- if (this.localCache.has(key) && !(this.localCache.get(key) instanceof Array)) {
226
- throw new Error("cannot apply on non Array");
227
- }
228
- this.localCache.set(key, []);
229
- }
230
- }
@@ -1,197 +0,0 @@
1
- import { Logger, WebSocketServer, WebSocketServerOptions } from "@miqro/core";
2
- import { Serializable } from "node:child_process";
3
-
4
- const ClusterWebSocketServer2MessageType = "$$$$ClusterWebSocketServer2Message$$$$$";
5
-
6
- export interface ClusterWebSocketServer2Message {
7
- type: typeof ClusterWebSocketServer2MessageType;
8
- target: string;
9
- action: "connection" | "disconnection" | "sendMessage" | "error" | "sync";
10
- clientUUID?: string;
11
- errorMessage?: string;
12
- fromUUID?: string;
13
- fromPID: string,
14
- payload?: Serializable;
15
- }
16
-
17
- export class ClusterWebSocketServer2 extends WebSocketServer {
18
- public remoteClients: Set<string> = new Set();
19
- listener: (data: any) => Promise<void>;
20
- public constructor(protected name: string, options: WebSocketServerOptions) {
21
- super({
22
- ...options,
23
- validate: (req) => {
24
- if (
25
- this.options.maxConnections !== undefined &&
26
- this.clients.size + this.remoteClients.size >= this.options.maxConnections
27
- ) {
28
- return false;
29
- } else {
30
- return options.validate ? options.validate(req) : true;
31
- }
32
- },
33
- onError: (req, error) => {
34
- if (process.send) {
35
- process.send({
36
- type: ClusterWebSocketServer2MessageType,
37
- action: "error",
38
- target: this.name,
39
- clientUUID: req.uuid,
40
- fromPID: String(process.pid),
41
- errorMessage: error.message
42
- } as ClusterWebSocketServer2Message);
43
- }
44
- if (options.onError) {
45
- options.onError(req, error);
46
- }
47
- },
48
- onConnection: (req) => {
49
- if (process.send) {
50
- process.send({
51
- type: ClusterWebSocketServer2MessageType,
52
- action: "connection",
53
- target: this.name,
54
- fromPID: String(process.pid),
55
- clientUUID: req.uuid
56
- } as ClusterWebSocketServer2Message);
57
- }
58
- if (options.onConnection) {
59
- options.onConnection(req);
60
- }
61
- },
62
- onDisconnect: (req) => {
63
- if (process.send) {
64
- process.send({
65
- type: ClusterWebSocketServer2MessageType,
66
- action: "disconnection",
67
- target: this.name,
68
- fromPID: String(process.pid),
69
- clientUUID: req.uuid
70
- } as ClusterWebSocketServer2Message);
71
- }
72
- if (options.onDisconnect) {
73
- options.onDisconnect(req);
74
- }
75
- }
76
- });
77
- this.listener = async (data) => {
78
- try {
79
- const msg = (data as ClusterWebSocketServer2Message);
80
- if (
81
- msg &&
82
- msg.type === ClusterWebSocketServer2MessageType &&
83
- msg.target === this.name &&
84
- msg.action) {
85
- // receive message from cluster workers
86
- //console.dir(data);
87
- //this.logger?.debug("remote web socket server message from [%s] [%s] [%s]", msg.fromPID, msg.target, msg.action);
88
- switch (msg.action) {
89
- case "sync":
90
- if (process.send) {
91
- for (const clientUUID of this.clients.keys()) {
92
- process.send({
93
- type: ClusterWebSocketServer2MessageType,
94
- action: "connection",
95
- target: this.name,
96
- fromPID: String(process.pid),
97
- clientUUID
98
- } as ClusterWebSocketServer2Message);
99
- }
100
- }
101
- break;
102
- case "connection":
103
- if (!msg.clientUUID) {
104
- throw new Error(`action [${msg.action}] without clientUUID`);
105
- }
106
- if (!this.remoteClients.has(msg.clientUUID)) {
107
- this.remoteClients.add(msg.clientUUID);
108
- }
109
- break;
110
- case "disconnection":
111
- if (!msg.clientUUID) {
112
- throw new Error(`action [${msg.action}] without clientUUID`);
113
- }
114
- if (this.remoteClients.has(msg.clientUUID)) {
115
- this.remoteClients.delete(msg.clientUUID);
116
- }
117
- break;
118
- case "sendMessage": {
119
- const payload = String(msg.payload);
120
- if (!msg.clientUUID) {
121
- // broadcast to local clients
122
- await super.broadcast(payload, msg.fromUUID);
123
- } else if (this.isConnected(msg.clientUUID)) {
124
- // write if local client
125
- await super.writeTo(msg.clientUUID, payload);
126
- }
127
- break;
128
- }
129
- default:
130
- throw new Error(`action [${msg.action}] not supported`);
131
- }
132
- }
133
- } catch (e) {
134
- console.error(e);
135
- }
136
- };
137
-
138
- this.connect();
139
- }
140
-
141
- public connect() {
142
- if (process.send) {
143
- process.removeListener("message", this.listener);
144
- process.on("message", this.listener);
145
- process.send({
146
- type: ClusterWebSocketServer2MessageType,
147
- action: "sync",
148
- fromPID: String(process.pid),
149
- target: this.name
150
- } as ClusterWebSocketServer2Message);
151
- }
152
- }
153
-
154
- public dispose() {
155
- process.removeListener("message", this.listener);
156
- }
157
-
158
- public async broadcast(payload: string, fromUUID?: string): Promise<void> {
159
- if (process.send) {
160
- process.send({
161
- type: ClusterWebSocketServer2MessageType,
162
- action: "sendMessage",
163
- payload,
164
- target: this.name,
165
- fromPID: String(process.pid),
166
- fromUUID
167
- } as ClusterWebSocketServer2Message);
168
- }
169
- return super.broadcast(payload, fromUUID);
170
- }
171
-
172
- public async writeTo(clientUUID: string, payload: string): Promise<void> {
173
- if (this.remoteClients.has(clientUUID)) {
174
- // write to remote client via IPC
175
- if (process.send) {
176
- process.send({
177
- type: ClusterWebSocketServer2MessageType,
178
- action: "sendMessage",
179
- clientUUID,
180
- target: this.name,
181
- fromPID: String(process.pid),
182
- payload
183
- } as ClusterWebSocketServer2Message);
184
- return;
185
- }
186
- }
187
- // due to the implementation of isUUIDValid depends on this.remoteClients to be sync there can be two clients registered with the same UUID in the cluster
188
- if (this.clients.has(clientUUID)) {
189
- // write to local client
190
- return super.writeTo(clientUUID, payload);
191
- }
192
- }
193
-
194
- public isUUIDValid(uuid: string) {
195
- return !this.clients.has(uuid) && !this.remoteClients.has(uuid);
196
- }
197
- }
@@ -1,92 +0,0 @@
1
- import cluster from "node:cluster";
2
- import { Database } from "@miqro/query";
3
- import { DBConfig } from "../../types.js";
4
- import { LogProvider } from "./log.js";
5
- import { Logger } from "@miqro/core";
6
-
7
- export class DBManager {
8
- private map = new Map<string, Database>();
9
- public options: {
10
- loggerProvider?: LogProvider;
11
- logger?: Logger;
12
- };
13
-
14
- constructor(options?: {
15
- loggerProvider?: LogProvider;
16
- logger?: Logger;
17
- }) {
18
- this.options = options ? options : {};
19
- }
20
-
21
- async setupDB(config: DBConfig) {
22
- if (this.getDB(config.name)) {
23
- throw new Error("cannot override db");
24
- }
25
- if (!config.disabled) {
26
- const DB_IDENTIFIER = cluster.isPrimary ? "DATABASE" : process.env["CLUSTER_NODE_NUMBER"] ? `WORKER_${process.env["CLUSTER_NODE_NUMBER"]}_DATABASE` : "WORKER_DATABASE";
27
- this.options?.logger?.debug("setting up db connection [%s]", config.name);
28
- this.options?.logger?.trace("creating db connection [%s]", config.name);
29
- const db = new Database({
30
- dialect: config.dialect ? config.dialect as any : "node:sqlite",
31
- storage: config.storage ? config.storage : "./db.sqlite3",
32
- connectionString: config.url,
33
- logger: this.options?.loggerProvider?.getLogger(`${DB_IDENTIFIER}_${config.name}`)
34
- });
35
-
36
- this.options?.logger?.trace("connecting db connection [%s]", config.name);
37
- await db.connect();
38
- this.options?.logger?.trace("db connection [%s] connected", config.name);
39
-
40
- /*if (config.name && config.name !== name) {
41
- this.setDB(config.name, db);
42
- }*/
43
-
44
- this.setDB(config.name, db);
45
-
46
- return db;
47
- }
48
- }
49
-
50
- async connectAll() {
51
- this.options?.logger?.debug("connection all db connections");
52
- const tR = [];
53
- for (const name of this.map.keys()) {
54
- const db = this.map.get(name);
55
- if (db && db.status === "disconnected") {
56
- this.options?.logger?.debug("connecting db connection [%s]", name);
57
- tR.push(db.connect());
58
- }
59
- }
60
- await Promise.all(tR);
61
- }
62
-
63
- async closeAll() {
64
- this.options?.logger?.debug("closing all db connections");
65
- for (const name of this.map.keys()) {
66
- const db = this.map.get(name);
67
- if (db && db.status === "connected") {
68
- this.options?.logger?.debug("disconnecting db connection [%s]", name);
69
- await db.disconnect();
70
- }
71
- }
72
- }
73
-
74
- async deleteAll() {
75
- await this.closeAll();
76
- this.options?.logger?.debug("clear all db connections");
77
- this.map.clear();
78
- }
79
-
80
- getDB(name: string): Database | null {
81
- const db = this.map.get(name);
82
- return db ? db : null;
83
- }
84
-
85
- setDB(name: string, db: Database): void {
86
- if (this.getDB(name)) {
87
- throw new Error("cannot override db connection [" + name + "]");
88
- }
89
- this.map.set(name, db);
90
- }
91
-
92
- }
@@ -1,70 +0,0 @@
1
- import { APIRoute, normalizePath, RouterHandlerOptions } from "@miqro/core";
2
- import { join } from "node:path";
3
-
4
- export interface RouterUseCall {
5
- path?: string;
6
- method?: string;
7
- inflatePath: string;
8
- defaultInflatePath: string;
9
- options?: RouterHandlerOptions;
10
- }
11
-
12
- export function getRoutes(prePath: string, defaultPath: string, apiOptions?: Partial<APIRoute>): RouterUseCall[] {
13
- const ret: RouterUseCall[] = [];
14
- const path = apiOptions && apiOptions.path ? apiOptions.path : defaultPath;
15
- const defaultInflatePath = join(prePath, defaultPath);
16
- const method = apiOptions && apiOptions.method ? apiOptions.method : "GET";
17
-
18
- const methods = method instanceof Array ? method : [method];
19
- const paths = path instanceof Array ? path : [path];
20
-
21
- if (apiOptions && apiOptions.path === null) {
22
- for (const m of methods) {
23
- ret.push({
24
- options: {
25
- apiName: apiOptions?.apiName,
26
- description: apiOptions?.description,
27
- identifier: apiOptions?.identifier,
28
- middleware: apiOptions?.middleware,
29
- name: apiOptions?.name,
30
- parser: apiOptions?.parser,
31
- policy: apiOptions?.policy,
32
- request: apiOptions?.request,
33
- response: apiOptions?.response,
34
- session: apiOptions?.session
35
- },
36
- inflatePath: defaultInflatePath,
37
- defaultInflatePath,
38
- method: m.toLocaleLowerCase() !== "use" ? m.toUpperCase() : undefined,
39
- path: undefined
40
- });
41
- }
42
- } else {
43
- for (const p of paths) {
44
- for (const m of methods) {
45
- ret.push({
46
- options: {
47
- apiName: apiOptions?.apiName,
48
- description: apiOptions?.description,
49
- identifier: apiOptions?.identifier,
50
- middleware: apiOptions?.middleware,
51
- name: apiOptions?.name,
52
- parser: apiOptions?.parser,
53
- policy: apiOptions?.policy,
54
- request: apiOptions?.request,
55
- response: apiOptions?.response,
56
- session: apiOptions?.session
57
- },
58
- inflatePath: p !== "/" ? join(prePath, p) : defaultInflatePath,
59
- defaultInflatePath,
60
- method: m.toLocaleLowerCase() !== "use" ? m.toUpperCase() : undefined,
61
- path: normalizePath(join(prePath, p))
62
- });
63
- }
64
- }
65
- }
66
-
67
-
68
-
69
- return ret;
70
- }
@@ -1,75 +0,0 @@
1
- import { ConsoleTransport, FileTransport, LoggerTransportWriteArgs, LogLevel, WriteArgs } from "@miqro/core";
2
- import { format } from "node:util";
3
- import { LOG_SOCKET_PATH, LOG_WRITE_EVENT } from "../../../editor/common/constants.js";
4
- import { Miqro } from "../app.js";
5
-
6
- export function createLogProviderOptions(app: Miqro) {
7
- const defaultConsole = ConsoleTransport();
8
- const defaultFile = FileTransport();
9
- const defaultWrite = async (args: LoggerTransportWriteArgs, level?: LogLevel) => {
10
- try {
11
- const serviceNamesWithLogConfigReplaceConsole = level === undefined && app.inflated ?
12
- Object.keys(app.inflated.logConfigMap).filter(serviceName => app.inflated.logConfigMap[serviceName].replaceConsoleTransport) : [];
13
- const serviceNamesWithLogConfigReplaceFile = level === undefined && app.inflated ?
14
- Object.keys(app.inflated.logConfigMap).filter(serviceName => app.inflated.logConfigMap[serviceName].replaceFileTransport) : [];
15
- await Promise.allSettled((level === undefined ?
16
- [
17
- level === undefined && serviceNamesWithLogConfigReplaceConsole.length === 0 ?
18
- defaultConsole.write(args) : Promise.resolve(),
19
- level === undefined && serviceNamesWithLogConfigReplaceFile.length === 0 ?
20
- defaultFile.write(args) : Promise.resolve()
21
- ] : []).concat(app.inflated ?
22
- Object.keys(app.inflated.logConfigMap).map(serviceName => app.inflated.logConfigMap[serviceName]).filter(c => c.level === level).map(c => c.write(args)) : []
23
- ));
24
- } catch (e) {
25
- console.error(e);
26
- }
27
- }
28
- return {
29
- name: app.options.name,
30
- formatter: (args: WriteArgs) => {
31
- const params: string[] = args.optionalParams;
32
- return format(
33
- `${new Date().toISOString()} PID[${process.pid}] ${args.identifier ? `[${args.identifier}] ` : ""}${args.level !== "info" ? (args.level === "error" || args.level === "warn" ? `[${args.level.toUpperCase()}] ` : `[${args.level}] `) : ""}${args.message}`,
34
- ...params)
35
- },
36
- transports: [
37
- ...(([undefined, "error", "warn", "info", "debug", "trace"] as LogLevel[]).map(level => {
38
- return level ? {
39
- level,
40
- write: async (args) => {
41
- await defaultWrite(args, level);
42
- }
43
- } : {
44
- write: async (args) => {
45
- await defaultWrite(args, undefined);
46
- }
47
- }
48
- })), {
49
- level: "trace" as LogLevel,
50
- write: async (args) => {
51
- try {
52
- if (app.options.editor) {
53
- try {
54
- const ws = app.webSocketManager.getWS(LOG_SOCKET_PATH);
55
- if (ws) {
56
- //console.log("\n\n" + process.pid + " broadcasting " + LOG_SOCKET_PATH + "\n\n\n")
57
- await ws.broadcast(JSON.stringify({
58
- type: LOG_WRITE_EVENT,
59
- level: args.level,
60
- identifier: args.identifier,
61
- out: args.out
62
- }));
63
- }
64
- } catch (e) {
65
- console.error(e);
66
- }
67
- }
68
- } catch (e) {
69
- console.error(e);
70
- }
71
- }
72
- }],
73
- ...(app.options.logProviderOptions ? app.options.logProviderOptions : {})
74
- };
75
- }