miqro 5.0.5 → 6.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/.eslintrc +15 -0
  2. package/README.md +618 -20
  3. package/bin/miqro +34 -0
  4. package/build/editor.bundle.js +61154 -0
  5. package/build/esm/editor/auth.d.ts +6 -0
  6. package/build/esm/editor/auth.js +42 -0
  7. package/build/esm/editor/auth.js.map +1 -0
  8. package/build/esm/editor/common/admin-interface.d.ts +36 -0
  9. package/build/esm/editor/common/admin-interface.js +45 -0
  10. package/build/esm/editor/common/admin-interface.js.map +1 -0
  11. package/build/esm/editor/common/constants.d.ts +4 -0
  12. package/build/esm/editor/common/constants.js +21 -0
  13. package/build/esm/editor/common/constants.js.map +1 -0
  14. package/build/esm/editor/common/constants.server.d.ts +2 -0
  15. package/build/esm/editor/common/constants.server.js +5 -0
  16. package/build/esm/editor/common/constants.server.js.map +1 -0
  17. package/build/esm/editor/common/editor-index.d.ts +2 -0
  18. package/build/esm/editor/common/editor-index.js +15 -0
  19. package/build/esm/editor/common/editor-index.js.map +1 -0
  20. package/build/esm/editor/common/html-encode.d.ts +1 -0
  21. package/build/esm/editor/common/html-encode.js +15 -0
  22. package/build/esm/editor/common/html-encode.js.map +1 -0
  23. package/build/esm/editor/common/log-socket.d.ts +13 -0
  24. package/build/esm/editor/common/log-socket.js +68 -0
  25. package/build/esm/editor/common/log-socket.js.map +1 -0
  26. package/build/esm/editor/common/templates.d.ts +11 -0
  27. package/build/esm/editor/common/templates.js +444 -0
  28. package/build/esm/editor/common/templates.js.map +1 -0
  29. package/build/esm/editor/components/api-preview.d.ts +11 -0
  30. package/build/esm/editor/components/api-preview.js +91 -0
  31. package/build/esm/editor/components/api-preview.js.map +1 -0
  32. package/build/esm/editor/components/editor.d.ts +16 -0
  33. package/build/esm/editor/components/editor.js +355 -0
  34. package/build/esm/editor/components/editor.js.map +1 -0
  35. package/build/esm/editor/components/file-browser.d.ts +37 -0
  36. package/build/esm/editor/components/file-browser.js +122 -0
  37. package/build/esm/editor/components/file-browser.js.map +1 -0
  38. package/build/esm/editor/components/file-editor-toolbar.d.ts +22 -0
  39. package/build/esm/editor/components/file-editor-toolbar.js +94 -0
  40. package/build/esm/editor/components/file-editor-toolbar.js.map +1 -0
  41. package/build/esm/editor/components/file-editor.d.ts +32 -0
  42. package/build/esm/editor/components/file-editor.js +60 -0
  43. package/build/esm/editor/components/file-editor.js.map +1 -0
  44. package/build/esm/editor/components/filter-query.d.ts +1 -0
  45. package/build/esm/editor/components/filter-query.js +23 -0
  46. package/build/esm/editor/components/filter-query.js.map +1 -0
  47. package/build/esm/editor/components/highlight-text-area.d.ts +11 -0
  48. package/build/esm/editor/components/highlight-text-area.js +139 -0
  49. package/build/esm/editor/components/highlight-text-area.js.map +1 -0
  50. package/build/esm/editor/components/log-viewer.d.ts +6 -0
  51. package/build/esm/editor/components/log-viewer.js +70 -0
  52. package/build/esm/editor/components/log-viewer.js.map +1 -0
  53. package/build/esm/editor/components/new-file.d.ts +10 -0
  54. package/build/esm/editor/components/new-file.js +118 -0
  55. package/build/esm/editor/components/new-file.js.map +1 -0
  56. package/build/esm/editor/components/scroll-query.d.ts +7 -0
  57. package/build/esm/editor/components/scroll-query.js +22 -0
  58. package/build/esm/editor/components/scroll-query.js.map +1 -0
  59. package/build/esm/editor/components/start-page.d.ts +13 -0
  60. package/build/esm/editor/components/start-page.js +31 -0
  61. package/build/esm/editor/components/start-page.js.map +1 -0
  62. package/build/esm/editor/http/admin/editor/api/fs/delete.api.d.ts +3 -0
  63. package/build/esm/editor/http/admin/editor/api/fs/delete.api.js +30 -0
  64. package/build/esm/editor/http/admin/editor/api/fs/delete.api.js.map +1 -0
  65. package/build/esm/editor/http/admin/editor/api/fs/read.api.d.ts +5 -0
  66. package/build/esm/editor/http/admin/editor/api/fs/read.api.js +50 -0
  67. package/build/esm/editor/http/admin/editor/api/fs/read.api.js.map +1 -0
  68. package/build/esm/editor/http/admin/editor/api/fs/rename.api.d.ts +4 -0
  69. package/build/esm/editor/http/admin/editor/api/fs/rename.api.js +40 -0
  70. package/build/esm/editor/http/admin/editor/api/fs/rename.api.js.map +1 -0
  71. package/build/esm/editor/http/admin/editor/api/fs/scan.api.d.ts +26 -0
  72. package/build/esm/editor/http/admin/editor/api/fs/scan.api.js +150 -0
  73. package/build/esm/editor/http/admin/editor/api/fs/scan.api.js.map +1 -0
  74. package/build/esm/editor/http/admin/editor/api/fs/write.api.d.ts +3 -0
  75. package/build/esm/editor/http/admin/editor/api/fs/write.api.js +39 -0
  76. package/build/esm/editor/http/admin/editor/api/fs/write.api.js.map +1 -0
  77. package/build/esm/editor/http/admin/editor/api/server/reload.api.d.ts +10 -0
  78. package/build/esm/editor/http/admin/editor/api/server/reload.api.js +46 -0
  79. package/build/esm/editor/http/admin/editor/api/server/reload.api.js.map +1 -0
  80. package/build/esm/editor/http/admin/editor/api/server/restart.api.d.ts +10 -0
  81. package/build/esm/editor/http/admin/editor/api/server/restart.api.js +46 -0
  82. package/build/esm/editor/http/admin/editor/api/server/restart.api.js.map +1 -0
  83. package/build/esm/editor/http/admin/editor/editor.js +8 -0
  84. package/build/esm/editor/http/admin/editor/editor.js.map +1 -0
  85. package/build/esm/editor/http/admin/editor/index.api.d.ts +3 -0
  86. package/build/esm/editor/http/admin/editor/index.api.js +22 -0
  87. package/build/esm/editor/http/admin/editor/index.api.js.map +1 -0
  88. package/build/esm/editor/server.d.ts +3 -0
  89. package/build/esm/editor/server.js +50 -0
  90. package/build/esm/editor/server.js.map +1 -0
  91. package/build/esm/editor/ws.d.ts +3 -0
  92. package/build/esm/editor/ws.js +12 -0
  93. package/build/esm/editor/ws.js.map +1 -0
  94. package/build/esm/src/bin/compile.d.ts +3 -0
  95. package/build/esm/src/bin/compile.js +31 -0
  96. package/build/esm/src/bin/compile.js.map +1 -0
  97. package/build/{utils/doc/md.d.ts → esm/src/bin/doc-md.d.ts} +2 -4
  98. package/build/{utils/doc/md.js → esm/src/bin/doc-md.js} +32 -18
  99. package/build/esm/src/bin/doc-md.js.map +1 -0
  100. package/build/esm/src/bin/generate-doc.d.ts +4 -0
  101. package/build/esm/src/bin/generate-doc.js +47 -0
  102. package/build/esm/src/bin/generate-doc.js.map +1 -0
  103. package/build/esm/src/bin/test.d.ts +3 -0
  104. package/build/esm/src/bin/test.js +68 -0
  105. package/build/esm/src/bin/test.js.map +1 -0
  106. package/build/esm/src/bin/types.d.ts +3 -0
  107. package/build/esm/src/bin/types.js +21 -0
  108. package/build/esm/src/bin/types.js.map +1 -0
  109. package/build/esm/src/cluster.js +11 -0
  110. package/build/esm/src/cluster.js.map +1 -0
  111. package/build/esm/src/common/arguments.d.ts +22 -0
  112. package/build/esm/src/common/arguments.js +310 -0
  113. package/build/esm/src/common/arguments.js.map +1 -0
  114. package/build/esm/src/common/assets.d.ts +11 -0
  115. package/build/esm/src/common/assets.js +121 -0
  116. package/build/esm/src/common/assets.js.map +1 -0
  117. package/build/esm/src/common/checksum.d.ts +19 -0
  118. package/build/esm/src/common/checksum.js +57 -0
  119. package/build/esm/src/common/checksum.js.map +1 -0
  120. package/build/esm/src/common/constants.d.ts +10 -0
  121. package/build/esm/src/common/constants.js +14 -0
  122. package/build/esm/src/common/constants.js.map +1 -0
  123. package/build/esm/src/common/content-type.d.ts +4 -0
  124. package/build/esm/src/common/content-type.js +82 -0
  125. package/build/esm/src/common/content-type.js.map +1 -0
  126. package/build/esm/src/common/esbuild.d.ts +17 -0
  127. package/build/esm/src/common/esbuild.js +79 -0
  128. package/build/esm/src/common/esbuild.js.map +1 -0
  129. package/build/esm/src/common/exit.d.ts +2 -0
  130. package/build/esm/src/common/exit.js +84 -0
  131. package/build/esm/src/common/exit.js.map +1 -0
  132. package/build/esm/src/common/fs.d.ts +8 -0
  133. package/build/esm/src/common/fs.js +17 -0
  134. package/build/esm/src/common/fs.js.map +1 -0
  135. package/build/esm/src/common/help.d.ts +3 -0
  136. package/build/esm/src/common/help.js +44 -0
  137. package/build/esm/src/common/help.js.map +1 -0
  138. package/build/esm/src/common/jsx.d.ts +52 -0
  139. package/build/esm/src/common/jsx.js +365 -0
  140. package/build/esm/src/common/jsx.js.map +1 -0
  141. package/build/esm/src/common/paths.d.ts +14 -0
  142. package/build/esm/src/common/paths.js +110 -0
  143. package/build/esm/src/common/paths.js.map +1 -0
  144. package/build/esm/src/common/watch.d.ts +3 -0
  145. package/build/esm/src/common/watch.js +74 -0
  146. package/build/esm/src/common/watch.js.map +1 -0
  147. package/build/esm/src/inflate/inflate-sea.d.ts +5 -0
  148. package/build/esm/src/inflate/inflate-sea.js +175 -0
  149. package/build/esm/src/inflate/inflate-sea.js.map +1 -0
  150. package/build/esm/src/inflate/inflate.d.ts +14 -0
  151. package/build/esm/src/inflate/inflate.js +65 -0
  152. package/build/esm/src/inflate/inflate.js.map +1 -0
  153. package/build/esm/src/inflate/md.d.ts +2 -0
  154. package/build/esm/src/inflate/md.js +19 -0
  155. package/build/esm/src/inflate/md.js.map +1 -0
  156. package/build/esm/src/inflate/setup-auth.d.ts +3 -0
  157. package/build/esm/src/inflate/setup-auth.js +38 -0
  158. package/build/esm/src/inflate/setup-auth.js.map +1 -0
  159. package/build/esm/src/inflate/setup-cors.d.ts +3 -0
  160. package/build/esm/src/inflate/setup-cors.js +38 -0
  161. package/build/esm/src/inflate/setup-cors.js.map +1 -0
  162. package/build/esm/src/inflate/setup-db.d.ts +8 -0
  163. package/build/esm/src/inflate/setup-db.js +99 -0
  164. package/build/esm/src/inflate/setup-db.js.map +1 -0
  165. package/build/esm/src/inflate/setup-http.d.ts +37 -0
  166. package/build/esm/src/inflate/setup-http.js +543 -0
  167. package/build/esm/src/inflate/setup-http.js.map +1 -0
  168. package/build/esm/src/inflate/setup-log.d.ts +7 -0
  169. package/build/esm/src/inflate/setup-log.js +37 -0
  170. package/build/esm/src/inflate/setup-log.js.map +1 -0
  171. package/build/esm/src/inflate/setup-server-config.d.ts +7 -0
  172. package/build/esm/src/inflate/setup-server-config.js +37 -0
  173. package/build/esm/src/inflate/setup-server-config.js.map +1 -0
  174. package/build/esm/src/inflate/setup-test.d.ts +2 -0
  175. package/build/esm/src/inflate/setup-test.js +22 -0
  176. package/build/esm/src/inflate/setup-test.js.map +1 -0
  177. package/build/esm/src/inflate/setup-ws.d.ts +4 -0
  178. package/build/esm/src/inflate/setup-ws.js +46 -0
  179. package/build/esm/src/inflate/setup-ws.js.map +1 -0
  180. package/build/esm/src/inflate/utils/sea-utils.d.ts +2 -0
  181. package/build/esm/src/inflate/utils/sea-utils.js +13 -0
  182. package/build/esm/src/inflate/utils/sea-utils.js.map +1 -0
  183. package/build/esm/src/lib.d.ts +13 -0
  184. package/build/esm/src/lib.js +17 -0
  185. package/build/esm/src/lib.js.map +1 -0
  186. package/build/esm/src/main.d.ts +2 -0
  187. package/build/esm/src/main.js +92 -0
  188. package/build/esm/src/main.js.map +1 -0
  189. package/build/esm/src/services/app.d.ts +88 -0
  190. package/build/esm/src/services/app.js +619 -0
  191. package/build/esm/src/services/app.js.map +1 -0
  192. package/build/esm/src/services/editor.d.ts +3 -0
  193. package/build/esm/src/services/editor.js +61 -0
  194. package/build/esm/src/services/editor.js.map +1 -0
  195. package/build/esm/src/services/globals.d.ts +3 -0
  196. package/build/esm/src/services/globals.js +139 -0
  197. package/build/esm/src/services/globals.js.map +1 -0
  198. package/build/esm/src/services/hot-reload.d.ts +1 -0
  199. package/build/esm/src/services/hot-reload.js +45 -0
  200. package/build/esm/src/services/hot-reload.js.map +1 -0
  201. package/build/esm/src/services/migrations.d.ts +4 -0
  202. package/build/esm/src/services/migrations.js +61 -0
  203. package/build/esm/src/services/migrations.js.map +1 -0
  204. package/build/esm/src/services/utils/cache.d.ts +19 -0
  205. package/build/esm/src/services/utils/cache.js +85 -0
  206. package/build/esm/src/services/utils/cache.js.map +1 -0
  207. package/build/esm/src/services/utils/cluster-cache.d.ts +20 -0
  208. package/build/esm/src/services/utils/cluster-cache.js +211 -0
  209. package/build/esm/src/services/utils/cluster-cache.js.map +1 -0
  210. package/build/esm/src/services/utils/cluster-ws.d.ts +24 -0
  211. package/build/esm/src/services/utils/cluster-ws.js +176 -0
  212. package/build/esm/src/services/utils/cluster-ws.js.map +1 -0
  213. package/build/esm/src/services/utils/db-manager.d.ts +20 -0
  214. package/build/esm/src/services/utils/db-manager.js +59 -0
  215. package/build/esm/src/services/utils/db-manager.js.map +1 -0
  216. package/build/esm/src/services/utils/get-route.d.ts +9 -0
  217. package/build/esm/src/services/utils/get-route.js +58 -0
  218. package/build/esm/src/services/utils/get-route.js.map +1 -0
  219. package/build/esm/src/services/utils/log.d.ts +17 -0
  220. package/build/esm/src/services/utils/log.js +74 -0
  221. package/build/esm/src/services/utils/log.js.map +1 -0
  222. package/build/esm/src/services/utils/server-interface.d.ts +41 -0
  223. package/build/esm/src/services/utils/server-interface.js +74 -0
  224. package/build/esm/src/services/utils/server-interface.js.map +1 -0
  225. package/build/esm/src/services/utils/websocketmanager.d.ts +23 -0
  226. package/build/esm/src/services/utils/websocketmanager.js +128 -0
  227. package/build/esm/src/services/utils/websocketmanager.js.map +1 -0
  228. package/build/esm/src/types.d.ts +166 -0
  229. package/build/esm/src/types.js +2 -0
  230. package/build/esm/src/types.js.map +1 -0
  231. package/build/jsx.dom.js +1585 -0
  232. package/build/lib.cjs +14009 -0
  233. package/build/postject.base64.cjs +1 -0
  234. package/editor/auth.ts +51 -0
  235. package/editor/common/admin-interface.ts +84 -0
  236. package/editor/common/constants.server.ts +5 -0
  237. package/editor/common/constants.ts +21 -0
  238. package/editor/common/editor-index.tsx +17 -0
  239. package/editor/common/html-encode.ts +14 -0
  240. package/editor/common/log-socket.tsx +82 -0
  241. package/editor/common/templates.ts +448 -0
  242. package/editor/components/api-preview.tsx +116 -0
  243. package/editor/components/editor.tsx +483 -0
  244. package/editor/components/file-browser.tsx +295 -0
  245. package/editor/components/file-editor-toolbar.tsx +187 -0
  246. package/editor/components/file-editor.tsx +122 -0
  247. package/editor/components/filter-query.tsx +22 -0
  248. package/editor/components/highlight-text-area.tsx +159 -0
  249. package/editor/components/log-viewer.tsx +110 -0
  250. package/editor/components/new-file.tsx +169 -0
  251. package/editor/components/scroll-query.tsx +22 -0
  252. package/editor/components/start-page.tsx +49 -0
  253. package/editor/http/admin/editor/api/fs/delete.api.tsx +32 -0
  254. package/editor/http/admin/editor/api/fs/read.api.tsx +55 -0
  255. package/editor/http/admin/editor/api/fs/rename.api.tsx +41 -0
  256. package/editor/http/admin/editor/api/fs/scan.api.tsx +181 -0
  257. package/editor/http/admin/editor/api/fs/write.api.tsx +41 -0
  258. package/editor/http/admin/editor/api/server/reload.api.ts +52 -0
  259. package/editor/http/admin/editor/api/server/restart.api.tsx +52 -0
  260. package/editor/http/admin/editor/editor.tsx +8 -0
  261. package/editor/http/admin/editor/font.ttf +0 -0
  262. package/editor/http/admin/editor/index.api.tsx +39 -0
  263. package/editor/http/admin/editor/style.css +620 -0
  264. package/editor/server.ts +57 -0
  265. package/editor/static/android-chrome-192x192.png +0 -0
  266. package/editor/static/android-chrome-512x512.png +0 -0
  267. package/editor/static/apple-touch-icon.png +0 -0
  268. package/editor/static/editor.bundle.in.mjs +20 -0
  269. package/editor/static/favicon-16x16.png +0 -0
  270. package/editor/static/favicon-32x32.png +0 -0
  271. package/editor/static/favicon.ico +0 -0
  272. package/editor/static/site.webmanifest +19 -0
  273. package/editor/ws.ts +15 -0
  274. package/package.json +43 -24
  275. package/package.json--OLD +36 -0
  276. package/sea/app.sh +33 -0
  277. package/sea/base64.js +3 -0
  278. package/sea/basic-compile.base64.sh +1 -0
  279. package/sea/basic-compile.sh +73 -0
  280. package/sea/basic-config.json +9 -0
  281. package/sea/compile.sh +124 -0
  282. package/sea/copy-types.sh +46 -0
  283. package/sea/editor-assets/editor.bundle.in.mjs +19 -0
  284. package/sea/esbuild.sh +31 -0
  285. package/sea/generate-global-types-asset-json.js +34 -0
  286. package/sea/install-esbuild.sh +53 -0
  287. package/sea/install-nodejs.sh +49 -0
  288. package/sea/main.sh +34 -0
  289. package/sea/node.sh +33 -0
  290. package/sea/node.version.tag +1 -0
  291. package/sea/precompile.sh +7 -0
  292. package/sea/release-tar.sh +5 -0
  293. package/sea/sign-add.sh +22 -0
  294. package/sea/sign-remove.sh +22 -0
  295. package/sea/tsc.sh +1 -0
  296. package/sea/types.json +1 -0
  297. package/src/bin/compile.ts +35 -0
  298. package/src/bin/doc-md.ts +210 -0
  299. package/src/bin/generate-doc.ts +55 -0
  300. package/src/bin/test.ts +92 -0
  301. package/src/bin/types.ts +22 -0
  302. package/src/cluster.ts +16 -0
  303. package/src/common/arguments.ts +366 -0
  304. package/src/common/assets.ts +124 -0
  305. package/src/common/checksum.ts +58 -0
  306. package/src/common/constants.ts +18 -0
  307. package/src/common/content-type.ts +84 -0
  308. package/src/common/esbuild.ts +94 -0
  309. package/src/common/exit.ts +91 -0
  310. package/src/common/fs.ts +17 -0
  311. package/src/common/help.ts +46 -0
  312. package/src/common/jsx.ts +414 -0
  313. package/src/common/paths.ts +117 -0
  314. package/src/common/watch.ts +80 -0
  315. package/src/inflate/inflate-sea.ts +193 -0
  316. package/src/inflate/inflate.ts +96 -0
  317. package/src/inflate/md.ts +20 -0
  318. package/src/inflate/setup-auth.ts +40 -0
  319. package/src/inflate/setup-cors.ts +40 -0
  320. package/src/inflate/setup-db.ts +113 -0
  321. package/src/inflate/setup-http.ts +643 -0
  322. package/src/inflate/setup-log.ts +44 -0
  323. package/src/inflate/setup-server-config.ts +47 -0
  324. package/src/inflate/setup-test.ts +23 -0
  325. package/src/inflate/setup-ws.ts +48 -0
  326. package/src/inflate/utils/sea-utils.ts +14 -0
  327. package/src/lib.ts +19 -0
  328. package/src/main.ts +87 -0
  329. package/src/services/app.ts +718 -0
  330. package/src/services/editor.tsx +93 -0
  331. package/src/services/globals.ts +143 -0
  332. package/src/services/hot-reload.ts +46 -0
  333. package/src/services/migrations.ts +66 -0
  334. package/src/services/utils/cache.ts +88 -0
  335. package/src/services/utils/cluster-cache.ts +225 -0
  336. package/src/services/utils/cluster-ws.ts +192 -0
  337. package/src/services/utils/db-manager.ts +79 -0
  338. package/src/services/utils/get-route.ts +70 -0
  339. package/src/services/utils/log.ts +91 -0
  340. package/src/services/utils/server-interface.ts +166 -0
  341. package/src/services/utils/websocketmanager.ts +139 -0
  342. package/src/types/@esbuild.d.ts +1 -0
  343. package/src/types/@miqro/core.d.ts +2 -0
  344. package/src/types/@miqro/jsx.d.ts +2 -0
  345. package/src/types/@miqro/parser.d.ts +2 -0
  346. package/src/types/@miqro/query.d.ts +2 -0
  347. package/src/types/@miqro/request.d.ts +2 -0
  348. package/src/types/@miqro/test.d.ts +2 -0
  349. package/src/types/@miqro.d.ts +1 -0
  350. package/src/types/@types.d.ts +1 -0
  351. package/src/types/browser.globals.d.ts +9 -0
  352. package/src/types/globals.d.ts +2 -0
  353. package/src/types/jsx.globals.d.ts +37 -0
  354. package/src/types/miqro.d.ts +109 -0
  355. package/src/types/postject.d.ts +1 -0
  356. package/src/types/server.globals.d.ts +72 -0
  357. package/src/types.ts +199 -0
  358. package/tsconfig.json +35 -0
  359. package/build/cli.js +0 -4
  360. package/build/cmd-map.d.ts +0 -90
  361. package/build/cmd-map.js +0 -460
  362. package/build/index.js +0 -2
  363. package/build/utils/doc/json.d.ts +0 -7
  364. package/build/utils/doc/json.js +0 -12
  365. package/build/utils/exec.d.ts +0 -32
  366. package/build/utils/exec.js +0 -102
  367. package/build/utils/templates.d.ts +0 -33
  368. package/build/utils/templates.js +0 -302
  369. package/build/utils/watch.d.ts +0 -1
  370. package/build/utils/watch.js +0 -35
  371. /package/build/{index.d.ts → esm/editor/http/admin/editor/editor.d.ts} +0 -0
  372. /package/build/{cli.d.ts → esm/src/cluster.d.ts} +0 -0
@@ -0,0 +1,93 @@
1
+ import { APIRoute, Handler, Router, RouterHandlerOptions, SessionHandler } from "@miqro/core";
2
+ import { getAsset } from "../common/assets.js";
3
+
4
+ import { BASEEDITOR_PATH } from "../../editor/common/constants.js";
5
+ import EDITOR_AUTH from "../../editor/auth.js";
6
+
7
+ /*import writeAPI from "../../editor/http/admin/editor/api/fs/write.api.js";
8
+ import renameAPI from "../../editor/http/admin/editor/api/fs/rename.api.js";
9
+ import deleteAPI from "../../editor/http/admin/editor/api/fs/delete.api.js";
10
+ import readAPI from "../../editor/http/admin/editor/api/fs/read.api.js";
11
+ import scanAPI from "../../editor/http/admin/editor/api/fs/scan.api.js";
12
+ import restartAPI from "../../editor/http/admin/editor/api/server/restart.api.js";
13
+ import reloadAPI from "../../editor/http/admin/editor/api/server/reload.api.js";*/
14
+
15
+ import { AdminRequest, EditorAdminInterface } from "../../editor/common/admin-interface.js";
16
+ import { CONTENT_TYPE_MAP } from "../common/content-type.js";
17
+
18
+ export async function createEditorRouter(adminInterface: EditorAdminInterface): Promise<Router> {
19
+ const router = new Router();
20
+
21
+ router.use(async (req: AdminRequest, res) => {
22
+ res.setHeader("x-uuid", req.uuid);
23
+ req.editor = adminInterface;
24
+ });
25
+
26
+ const editorFont = Buffer.from(getAsset("editor-assets/font.ttf"));
27
+ const editorJS = Buffer.from(getAsset("editor-assets/editor.bundle.js")).toString().trim();
28
+ const editorCSS = Buffer.from(getAsset("editor-assets/style.css")).toString().trim().split("\n").map(l => l.trim()).filter(l => l).join("");
29
+
30
+ const writeAPI = (await import("../../editor/http/admin/editor/api/fs/write.api.js")).default;
31
+ const renameAPI = (await import("../../editor/http/admin/editor/api/fs/rename.api.js")).default;
32
+ const deleteAPI = (await import("../../editor/http/admin/editor/api/fs/delete.api.js")).default;
33
+ const readAPI = (await import("../../editor/http/admin/editor/api/fs/read.api.js")).default;
34
+ const scanAPI = (await import("../../editor/http/admin/editor/api/fs/scan.api.js")).default;
35
+ const restartAPI = (await import("../../editor/http/admin/editor/api/server/restart.api.js")).default;
36
+ const reloadAPI = (await import("../../editor/http/admin/editor/api/server/reload.api.js")).default;
37
+
38
+ const authHandler = SessionHandler(EDITOR_AUTH);
39
+
40
+ const { EditorIndex } = await import("../../editor/common/editor-index.js");
41
+
42
+ router.post(`${BASEEDITOR_PATH}/api/fs/write`, getHandler(authHandler, writeAPI));
43
+
44
+ router.post(`${BASEEDITOR_PATH}/api/fs/rename`, getHandler(authHandler, renameAPI));
45
+
46
+ router.post(`${BASEEDITOR_PATH}/api/fs/read`, getHandler(authHandler, readAPI));
47
+
48
+ router.post(`${BASEEDITOR_PATH}/api/fs/delete`, getHandler(authHandler, deleteAPI));
49
+
50
+ router.get(`${BASEEDITOR_PATH}/api/fs/scan`, getHandler(authHandler, scanAPI));
51
+
52
+ router.post(`${BASEEDITOR_PATH}/api/server/restart`, getHandler(authHandler, restartAPI));
53
+
54
+ router.post(`${BASEEDITOR_PATH}/api/server/reload`, getHandler(authHandler, reloadAPI));
55
+
56
+ router.get(`${BASEEDITOR_PATH}/font.ttf`, async (_req, res) => {
57
+ return await res.asyncEnd({
58
+ status: 200,
59
+ headers: {
60
+ ["Content-Type"]: CONTENT_TYPE_MAP[".ttf"]
61
+ },
62
+ body: editorFont
63
+ })
64
+ });
65
+
66
+ router.get(BASEEDITOR_PATH, [authHandler, EditorIndex(editorCSS, editorJS, false)]);
67
+
68
+
69
+
70
+ router.use(async (req: AdminRequest, res) => {
71
+ delete req.editor;
72
+ });
73
+
74
+ return router;
75
+ }
76
+
77
+ function getHandlerOptions(router: APIRoute): RouterHandlerOptions {
78
+ return {
79
+ description: router.description,
80
+ //handler: router,
81
+ middleware: router.middleware,
82
+ request: router.request,
83
+ response: router.response,
84
+ };
85
+ }
86
+
87
+ function getHandler(auth: Handler, router: APIRoute): Router {
88
+ const ret = new Router();
89
+ ret.use(auth);
90
+ ret.use(router.handler, undefined, undefined, getHandlerOptions(router));
91
+ return ret;
92
+
93
+ }
@@ -0,0 +1,143 @@
1
+ //@ts-ignore
2
+ import { ReadBuffer, URLEncodedParser, JSONParser, TextParser, CORS, SessionHandler } from "@miqro/core";
3
+ import { strictEqual } from "node:assert";
4
+ import { HTMLEncode } from "@miqro/jsx-node";
5
+ import { createElement as realCreateElement, enableDebugLog, useRuntime, Link, Router, usePathname, Fragment, useEffect, useRef, useState, useQuery, useRefresh, useElement, createContext, useContext, Component, Props } from "@miqro/jsx";
6
+
7
+ import { jsx2HTML } from "../common/jsx.js";
8
+ import { inflateMD2HTML } from "../inflate/md.js";
9
+ import { EXIT_CODES } from "../common/constants.js";
10
+ import { ServerGlobal } from "../lib.js";
11
+
12
+ /*const globaljsx: any = Object.freeze({
13
+ useContext,
14
+ useRuntime,
15
+ createContext,
16
+ useState,
17
+ useEffect,
18
+ useQuery,
19
+ useRef,
20
+ useElement,
21
+ useRefresh,
22
+ Link,
23
+ Router,
24
+ usePathname
25
+ });*/
26
+ const globalJSX: any = Object.freeze({
27
+ createElement: (...args: [tag: string | Component | typeof Fragment, attributes: Props | null | undefined, ...children: Array<any>]) => {
28
+ const ret = realCreateElement(...args);
29
+ ret.toString = () => jsx2HTML(ret)
30
+ return ret;
31
+ },
32
+ Fragment,
33
+ enableDebugLog
34
+ });
35
+ const globaljsx: any = Object.freeze({
36
+ useContext,
37
+ useRuntime,
38
+ createContext,
39
+ useState,
40
+ useEffect,
41
+ useQuery,
42
+ useRef,
43
+ useElement,
44
+ useRefresh,
45
+ Link,
46
+ Router,
47
+ usePathname,
48
+ define: function define() {
49
+ /*const callSites = getCallSite();
50
+ const caller = callSites[2];
51
+ if (CLEAR_JSX_CACHE) {
52
+ const scriptName = basename(caller.scriptName);
53
+ const originalName = scriptName.substring(0, scriptName.length - ".mjs".length);
54
+ //server.logger.debug("browser.define not available server side!");
55
+ //server.logger.trace("browser.define not available server side! %s", originalName);
56
+ } else {
57
+ //server.logger.debug("browser.define not available server side!");
58
+ //server.logger.trace("browser.define not available server side! %s:%s:%s", caller.scriptName, caller.lineNumber, caller.column);
59
+ }*/
60
+ }
61
+ });
62
+ const globalWindow: any = Object.freeze({
63
+ addEventListener: function define() {
64
+ /*const callSites = getCallSite();
65
+ const caller = callSites[2];
66
+ if (CLEAR_JSX_CACHE) {
67
+ const scriptName = basename(caller.scriptName);
68
+ //server.logger.debug("window.addEventListener not available server side!");
69
+ server.logger.trace("window.addEventListener not available server side! %s", scriptName.substring(0, scriptName.length - ".mjs".length));
70
+ } else {
71
+ //server.logger.debug("window.addEventListener not available server side!");
72
+ server.logger.trace("window.addEventListener not available server side! %s:%s:%s", caller.scriptName, caller.lineNumber, caller.column);
73
+ }*/
74
+ }
75
+ });
76
+ const globalServer: ServerGlobal = Object.freeze<ServerGlobal>({
77
+ middleware: Object.freeze({
78
+ buffer: ReadBuffer,
79
+ url: URLEncodedParser,
80
+ json: JSONParser,
81
+ text: TextParser,
82
+ cors: CORS,
83
+ session: SessionHandler
84
+ }),
85
+ encodeHTML: HTMLEncode,
86
+ inflateMDtoHTML: inflateMD2HTML
87
+ }) as ServerGlobal;
88
+
89
+ export function browserJSXGlobals(inFile: string, jsxPath: string | false = false, useExport = true): string {
90
+ const PRE = `import { enableDebugLog, useRuntime, Link, usePathname, createContext, useContext, useElement, useRefresh, useQuery, define, Router, useState, useEffect, useRef, createElement, Fragment } from "${jsxPath}";
91
+ globalThis.JSX = Object.freeze({
92
+ createElement,
93
+ Fragment,
94
+ enableDebugLog
95
+ });
96
+
97
+ globalThis.newParser = () => new Parser();
98
+ globalThis.jsx = Object.freeze({
99
+ define,
100
+ useRuntime,
101
+ createContext,
102
+ useContext,
103
+ useState,
104
+ useEffect,
105
+ useQuery,
106
+ useRef,
107
+ useElement,
108
+ useRefresh,
109
+ usePathname,
110
+ Link,
111
+ Router
112
+ });`;
113
+ return `${jsxPath ? PRE : ""}\n${useExport ? `export * from "${inFile}";import * as lib from "${inFile}";export default lib.default;` : `import * as lib from "${inFile}"`}`;
114
+ }
115
+
116
+ export function initGlobals() {//webSocketManager: WebSocketManager, dbManager: DBManager) {
117
+ //const logger = getLogger(SERVER_IDENTIFIER);
118
+ globalThis.server = globalServer;
119
+ //globalThis.jsx = globaljsx;
120
+ /*for (const key of Object.keys(globaljsx)) {
121
+ globalThis[key] = globaljsx[key];
122
+ }*/
123
+ globalThis.JSX = globalJSX;
124
+ globalThis.jsx = globaljsx;
125
+ globalThis.window = globalWindow;
126
+ }
127
+
128
+ export function assertGlobalTampered() {
129
+ try {
130
+ //strictEqual(globalThis.utils, globalUtils, "globalThis.utils tamperered");
131
+ strictEqual(globalThis.JSX, globalJSX, "globalThis.JSX tamperered");
132
+ //strictEqual(globalThis.jsx, globaljsx, "globalThis.jsx tamperered");
133
+ /*for (const key of Object.keys(globaljsx)) {
134
+ strictEqual(globalThis[key], globaljsx[key], "globalThis.jsx tamperered");
135
+ }*/
136
+ strictEqual(globalThis.server, globalServer, "globalThis.server tamperered");
137
+ strictEqual(globalThis.jsx, globaljsx, "globalThis.jsx tamperered");
138
+ strictEqual(globalThis.window, globalWindow, "globalThis.window tamperered");
139
+ } catch (e) {
140
+ console.error(e);
141
+ process.exit(EXIT_CODES.GLOBALS_ALTERED);
142
+ }
143
+ }
@@ -0,0 +1,46 @@
1
+ //import { checkEnvVariable } from "@miqro/core";
2
+
3
+ export function getHotReloadScript() {
4
+ const HOT_RELOAD_JS_SCRIPT = `
5
+ // Create WebSocket connection.
6
+
7
+ function getSocket() {
8
+ return new WebSocket("/hot-reload");
9
+ }
10
+
11
+ const socket = getSocket();
12
+
13
+ let timeout;
14
+
15
+ function tryConnection() {
16
+ try {
17
+ const newSocket = getSocket();
18
+ newSocket.addEventListener("open", (event) => {
19
+ console.log("reloading");
20
+ window.location.reload();
21
+ });
22
+ newSocket.addEventListener("error", (err) => {
23
+ console.error(err);
24
+ timeout = setTimeout(tryConnection, 500);
25
+ });
26
+ } catch (e) {
27
+ console.error(e);
28
+ timeout = setTimeout(tryConnection, 500);
29
+ }
30
+ }
31
+
32
+ // Connection closed
33
+ socket.addEventListener("close", (event) => {
34
+ clearTimeout(timeout);
35
+ timeout = setTimeout(tryConnection, 500);
36
+ });
37
+
38
+ socket.addEventListener("error", (err) => {
39
+ console.error(err);
40
+ });`;
41
+ return `<script>${HOT_RELOAD_JS_SCRIPT}</script>`;
42
+ }
43
+
44
+ /*export function isHotReloadEnabled() {
45
+ return checkEnvVariable("HOT_RELOAD", "0") === "1";
46
+ }*/
@@ -0,0 +1,66 @@
1
+ import { Logger } from "@miqro/core";
2
+ import { Database, DatabaseLogger, migration } from "@miqro/query";
3
+ import { dirname, extname, relative, resolve } from "node:path";
4
+ import { mkdirSync, writeFileSync } from "node:fs";
5
+ import { cwd } from "node:process";
6
+
7
+ import { getMigrationsPath } from "../common/paths.js";
8
+ import { importJSXFile, inflateJSX } from "../common/jsx.js";
9
+
10
+ export async function runMigrations(logger: Logger | undefined, db: Database | null, servicePath: string, service: string, inflateDir: string | undefined | false, migrations: string[]) {
11
+ const migrationsFolderPath = getMigrationsPath(servicePath);
12
+ if (migrationsFolderPath) {
13
+ logger?.debug("running migrations from [%s]", service);
14
+ if (!db) {
15
+ throw new Error("cannot run migrations with the database disabled!");
16
+ }
17
+ const serviceMigrations = await migration.up.folder(db as any, migrationsFolderPath, logger as DatabaseLogger, (inFile: string) => importJSXFile(inFile, logger));
18
+ migrations.push(...serviceMigrations);
19
+
20
+ if (inflateDir) {
21
+ for (const migration of serviceMigrations) {
22
+ const inflatePath = resolve(inflateDir, service, "migration", migration.substring(0, migration.length - extname(migration).length) + ".js");
23
+ mkdirSync(dirname(inflatePath), {
24
+ recursive: true
25
+ });
26
+ logger?.log("writing [%s]", relative(cwd(), inflatePath));
27
+ writeFileSync(inflatePath, await inflateJSX(resolve(migrationsFolderPath, migration), {
28
+ embemedJSX: false,
29
+ minify: false,
30
+ useExport: true,
31
+ logger
32
+ }));
33
+ }
34
+ }
35
+ }
36
+ return migrations;
37
+ }
38
+
39
+ export async function runMigrationsDown(logger: Logger | Console | undefined, db: Database | null, servicePath: string, service: string, inflateDir: string | undefined, migrations: string[]) {
40
+ const migrationsFolderPath = getMigrationsPath(servicePath)
41
+ if (migrationsFolderPath) {
42
+ logger?.debug("running migrations from [%s]", service);
43
+ if (!db) {
44
+ throw new Error("cannot run migrations with the database disabled!");
45
+ }
46
+ const serviceMigrations = await migration.down.folder(db as any, migrationsFolderPath, logger as DatabaseLogger, (inFile: string) => importJSXFile(inFile, logger));
47
+ migrations.push(...serviceMigrations);
48
+
49
+ if (inflateDir) {
50
+ for (const migration of serviceMigrations) {
51
+ const inflatePath = resolve(inflateDir, service, "migration", migration.substring(0, migration.length - extname(migration).length) + ".js");
52
+ mkdirSync(dirname(inflatePath), {
53
+ recursive: true
54
+ });
55
+ logger?.log("writing [%s]", relative(cwd(), inflatePath));
56
+ writeFileSync(inflatePath, await inflateJSX(resolve(migrationsFolderPath, migration), {
57
+ embemedJSX: false,
58
+ minify: false,
59
+ useExport: true,
60
+ logger
61
+ }));
62
+ }
63
+ }
64
+ }
65
+ return migrations;
66
+ }
@@ -0,0 +1,88 @@
1
+ import { Logger } from "@miqro/core";
2
+ import { CacheInterface } from "../../types.js";
3
+
4
+ export class LocalCache implements CacheInterface {
5
+ private localCache = new Map<string, unknown>();
6
+
7
+ constructor(public name: string, public logger?: Logger) {
8
+ }
9
+
10
+ dispose() {
11
+
12
+ }
13
+
14
+ get<T = any>(key: string): T | undefined {
15
+ this.logger?.trace("get(%s)", key);
16
+ return this.localCache.get(key) as T;
17
+ }
18
+ set(key: string, value: unknown): void {
19
+ this.localCache.set(key, value);
20
+ this.logger?.trace("set(%s, ...)", key);
21
+ }
22
+ unset(key: string): void {
23
+ this.logger?.trace("unset(%s)", key);
24
+ this.localCache.delete(key);
25
+ }
26
+ has(key: string): boolean {
27
+ this.logger?.trace("has(%s)", key);
28
+ return this.localCache.has(key);
29
+ }
30
+
31
+ set_add(key: string, value: unknown): void {
32
+ this.logger?.trace("set_add(%s)", key);
33
+ const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
34
+ if (!(list instanceof Set)) {
35
+ throw new Error("cannot apply on non Set");
36
+ }
37
+ if (list.has(value)) {
38
+ list.add(value);
39
+ }
40
+ this.localCache.set(key, list);
41
+ }
42
+ set_delete(key: string, value: unknown): void {
43
+ this.logger?.trace("set_delete(%s)", key);
44
+ const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
45
+ if (!(list instanceof Set)) {
46
+ throw new Error("cannot apply on non Set");
47
+ }
48
+ if (list.has(value)) {
49
+ list.delete(value);
50
+ }
51
+ this.localCache.set(key, list);
52
+ }
53
+ set_has(key: string, value: unknown): boolean {
54
+ this.logger?.trace("set_has(%s)", key);
55
+ const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
56
+ if (!(list instanceof Set)) {
57
+ throw new Error("cannot apply on non Set");
58
+ }
59
+ const ret = list.has(value);
60
+ this.localCache.set(key, list);
61
+ return ret;
62
+ }
63
+ set_clear(key: string): void {
64
+ this.logger?.trace("set_clear(%s)", key);
65
+ const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
66
+ if (!(list instanceof Set)) {
67
+ throw new Error("cannot apply on non Set");
68
+ }
69
+ list.clear();
70
+ this.localCache.set(key, list);
71
+ }
72
+ array_push(key: string, value: unknown): void {
73
+ this.logger?.trace("array_push(%s)", key);
74
+ const list = this.localCache.has(key) ? this.localCache.get(key) : [];
75
+ if (!(list instanceof Array)) {
76
+ throw new Error("cannot apply on non Array");
77
+ }
78
+ list.push(value);
79
+ this.localCache.set(key, list);
80
+ }
81
+ array_clear(key: string): void {
82
+ this.logger?.trace("array_clear(%s)", key);
83
+ if (this.localCache.has(key) && !(this.localCache.get(key) instanceof Array)) {
84
+ throw new Error("cannot apply on non Array");
85
+ }
86
+ this.localCache.set(key, []);
87
+ }
88
+ }
@@ -0,0 +1,225 @@
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
+ if (process.send) {
83
+ process.on("message", this.listener);
84
+ }
85
+ }
86
+
87
+ dispose() {
88
+ process.removeListener("message", this.listener);
89
+ }
90
+
91
+ get<T = any>(key: string): T | undefined {
92
+ this.logger?.trace("get(%s)", key);
93
+ return this.localCache.get(key) as T;
94
+ }
95
+ set(key: string, value: unknown): void {
96
+ this.localCache.set(key, value);
97
+ this.logger?.trace("set(%s, ...)", key);
98
+ if (process.send) {
99
+ setTimeout(() => {
100
+ process.send({
101
+ type: ClusterCacheType,
102
+ action: "set",
103
+ target: this.name,
104
+ fromPID: process.pid,
105
+ key,
106
+ value
107
+ } as ClusterCacheMessage);
108
+ }, 10);
109
+ }
110
+ }
111
+ unset(key: string): void {
112
+ this.logger?.trace("unset(%s)", key);
113
+ this.localCache.delete(key);
114
+ if (process.send) {
115
+ setTimeout(() => {
116
+ process.send({
117
+ type: ClusterCacheType,
118
+ target: this.name,
119
+ action: "unset",
120
+ fromPID: process.pid,
121
+ key
122
+ } as ClusterCacheMessage);
123
+ }, 10);
124
+ }
125
+ }
126
+ has(key: string): boolean {
127
+ this.logger?.trace("has(%s)", key);
128
+ return this.localCache.has(key);
129
+ }
130
+
131
+ set_add(key: string, value: unknown): void {
132
+ this.logger?.trace("push(%s)", key);
133
+ const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
134
+ if (!(list instanceof Set)) {
135
+ throw new Error("cannot apply on non Set");
136
+ }
137
+ if (list.has(value)) {
138
+ list.add(value);
139
+ }
140
+ this.localCache.set(key, list);
141
+
142
+ if (process.send) {
143
+ setTimeout(() => {
144
+ process.send({
145
+ type: ClusterCacheType,
146
+ target: this.name,
147
+ action: "set_add",
148
+ fromPID: process.pid,
149
+ key,
150
+ value
151
+ } as ClusterCacheMessage);
152
+ }, 10);
153
+ }
154
+ }
155
+ set_delete(key: string, value: unknown): void {
156
+ this.logger?.trace("delete(%s)", key);
157
+ const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
158
+ if (!(list instanceof Set)) {
159
+ throw new Error("cannot apply on non Set");
160
+ }
161
+ if (list.has(value)) {
162
+ list.delete(value);
163
+ }
164
+ this.localCache.set(key, list);
165
+ if (process.send) {
166
+ setTimeout(() => {
167
+ process.send({
168
+ type: ClusterCacheType,
169
+ target: this.name,
170
+ action: "set_delete",
171
+ fromPID: process.pid,
172
+ key,
173
+ value
174
+ } as ClusterCacheMessage);
175
+ }, 10);
176
+ }
177
+ }
178
+ set_has(key: string, value: unknown): boolean {
179
+ this.logger?.trace("set_has(%s)", key);
180
+ const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
181
+ if (!(list instanceof Set)) {
182
+ throw new Error("cannot apply on non Set");
183
+ }
184
+ const ret = list.has(value);
185
+ this.localCache.set(key, list);
186
+ return ret;
187
+ }
188
+ set_clear(key: string): void {
189
+ this.logger?.trace("set_clear(%s)", key);
190
+ const list = this.localCache.has(key) ? this.localCache.get(key) : new Set<string>();
191
+ if (!(list instanceof Set)) {
192
+ throw new Error("cannot apply on non Set");
193
+ }
194
+ list.clear();
195
+ this.localCache.set(key, list);
196
+ }
197
+ array_push(key: string, value: unknown): void {
198
+ this.logger?.trace("array_push(%s)", key);
199
+ const list = this.localCache.has(key) ? this.localCache.get(key) : [];
200
+ if (!(list instanceof Array)) {
201
+ throw new Error("cannot apply on non Array");
202
+ }
203
+ list.push(value);
204
+ this.localCache.set(key, list);
205
+ if (process.send) {
206
+ setTimeout(() => {
207
+ process.send({
208
+ type: ClusterCacheType,
209
+ target: this.name,
210
+ action: "array_push",
211
+ fromPID: process.pid,
212
+ key,
213
+ value
214
+ } as ClusterCacheMessage);
215
+ }, 10);
216
+ }
217
+ }
218
+ array_clear(key: string): void {
219
+ this.logger?.trace("array_clear(%s)", key);
220
+ if (this.localCache.has(key) && !(this.localCache.get(key) instanceof Array)) {
221
+ throw new Error("cannot apply on non Array");
222
+ }
223
+ this.localCache.set(key, []);
224
+ }
225
+ }