@yinuo-ngm/server 1.0.14 → 1.0.16

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 (257) hide show
  1. package/lib/app.js +2 -0
  2. package/lib/plugins/error-handler.plugin.js +5 -0
  3. package/lib/plugins/nginx.binding.store.d.ts +4 -0
  4. package/lib/plugins/nginx.binding.store.js +39 -0
  5. package/lib/plugins/nginx.plugin.d.ts +3 -0
  6. package/lib/plugins/nginx.plugin.js +23 -0
  7. package/lib/plugins/ws/topics/index.d.ts +1 -0
  8. package/lib/plugins/ws/topics/index.js +1 -0
  9. package/lib/plugins/ws/topics/nginx.ws.d.ts +7 -0
  10. package/lib/plugins/ws/topics/nginx.ws.js +59 -0
  11. package/lib/plugins/ws/ws.plugin.js +3 -0
  12. package/lib/routes/api-client/hub-cookie-jar.d.ts +3 -0
  13. package/lib/routes/api-client/hub-cookie-jar.js +54 -0
  14. package/lib/routes/api-client/hub-token.routes.d.ts +2 -0
  15. package/lib/routes/api-client/hub-token.routes.js +284 -0
  16. package/lib/routes/api-client/index.d.ts +1 -0
  17. package/lib/routes/api-client/index.js +1 -0
  18. package/lib/routes/api-client/send.routes.js +60 -1
  19. package/lib/routes/hub.routes.d.ts +2 -0
  20. package/lib/routes/hub.routes.js +103 -0
  21. package/lib/routes/index.js +7 -0
  22. package/lib/routes/nginx/nginx-config.routes.d.ts +2 -0
  23. package/lib/routes/nginx/nginx-config.routes.js +94 -0
  24. package/lib/routes/nginx/nginx-lifecycle.routes.d.ts +2 -0
  25. package/lib/routes/nginx/nginx-lifecycle.routes.js +108 -0
  26. package/lib/routes/nginx/nginx-log.routes.d.ts +2 -0
  27. package/lib/routes/nginx/nginx-log.routes.js +47 -0
  28. package/lib/routes/nginx/nginx-module.routes.d.ts +2 -0
  29. package/lib/routes/nginx/nginx-module.routes.js +123 -0
  30. package/lib/routes/nginx/nginx-route.context.d.ts +9 -0
  31. package/lib/routes/nginx/nginx-route.context.js +36 -0
  32. package/lib/routes/nginx/nginx-server.routes.d.ts +2 -0
  33. package/lib/routes/nginx/nginx-server.routes.js +97 -0
  34. package/lib/routes/nginx.routes.d.ts +2 -0
  35. package/lib/routes/nginx.routes.js +17 -0
  36. package/lib/routes/node-version.routes.d.ts +2 -0
  37. package/lib/routes/node-version.routes.js +56 -0
  38. package/lib/routes/project.routes.js +5 -0
  39. package/lib/routes/sprite-browse.routes.js +19 -5
  40. package/lib/routes/sprite.routes.js +17 -11
  41. package/lib/routes/static-files.routes.js +16 -0
  42. package/lib/routes/task.routes.js +7 -0
  43. package/package.json +5 -4
  44. package/www/3rdpartylicenses.txt +75 -0
  45. package/www/browser/assets/vs/_commonjsHelpers-CT9FvmAN.js +1 -0
  46. package/www/browser/assets/vs/abap-D-t0cyap.js +1 -0
  47. package/www/browser/assets/vs/apex-CcIm7xu6.js +1 -0
  48. package/www/browser/assets/vs/assets/css.worker-HnVq6Ewq.js +93 -0
  49. package/www/browser/assets/vs/assets/editor.worker-Be8ye1pW.js +26 -0
  50. package/www/browser/assets/vs/assets/html.worker-B51mlPHg.js +470 -0
  51. package/www/browser/assets/vs/assets/json.worker-DKiEKt88.js +58 -0
  52. package/www/browser/assets/vs/assets/ts.worker-CMbG-7ft.js +67731 -0
  53. package/www/browser/assets/vs/azcli-BA0tQDCg.js +1 -0
  54. package/www/browser/assets/vs/basic-languages/monaco.contribution.js +1 -0
  55. package/www/browser/assets/vs/bat-C397hTD6.js +1 -0
  56. package/www/browser/assets/vs/bicep-DF5aW17k.js +2 -0
  57. package/www/browser/assets/vs/cameligo-plsz8qhj.js +1 -0
  58. package/www/browser/assets/vs/clojure-Y2auQMzK.js +1 -0
  59. package/www/browser/assets/vs/coffee-Bu45yuWE.js +1 -0
  60. package/www/browser/assets/vs/cpp-CkKPQIni.js +1 -0
  61. package/www/browser/assets/vs/csharp-CX28MZyh.js +1 -0
  62. package/www/browser/assets/vs/csp-D8uWnyxW.js +1 -0
  63. package/www/browser/assets/vs/css-CaeNmE3S.js +3 -0
  64. package/www/browser/assets/vs/cssMode-CjiAH6dQ.js +1 -0
  65. package/www/browser/assets/vs/cypher-DVThT8BS.js +1 -0
  66. package/www/browser/assets/vs/dart-CmGfCvrO.js +1 -0
  67. package/www/browser/assets/vs/dockerfile-CZqqYdch.js +1 -0
  68. package/www/browser/assets/vs/ecl-30fUercY.js +1 -0
  69. package/www/browser/assets/vs/editor/editor.main.css +1 -0
  70. package/www/browser/assets/vs/editor/editor.main.js +5 -0
  71. package/www/browser/assets/vs/editor.api-CalNCsUg.js +903 -0
  72. package/www/browser/assets/vs/elixir-xjPaIfzF.js +1 -0
  73. package/www/browser/assets/vs/flow9-DqtmStfK.js +1 -0
  74. package/www/browser/assets/vs/freemarker2-Cz_sV6Md.js +3 -0
  75. package/www/browser/assets/vs/fsharp-BOMdg4U1.js +1 -0
  76. package/www/browser/assets/vs/go-D_hbi-Jt.js +1 -0
  77. package/www/browser/assets/vs/graphql-CKUU4kLG.js +1 -0
  78. package/www/browser/assets/vs/handlebars-OwglfO-1.js +1 -0
  79. package/www/browser/assets/vs/hcl-DTaboeZW.js +1 -0
  80. package/www/browser/assets/vs/html-Pa1xEWsY.js +1 -0
  81. package/www/browser/assets/vs/htmlMode-Bz67EXwp.js +1 -0
  82. package/www/browser/assets/vs/ini-CsNwO04R.js +1 -0
  83. package/www/browser/assets/vs/java-CI4ZMsH9.js +1 -0
  84. package/www/browser/assets/vs/javascript-PczUCGdz.js +1 -0
  85. package/www/browser/assets/vs/jsonMode-DULH5oaX.js +7 -0
  86. package/www/browser/assets/vs/julia-BwzEvaQw.js +1 -0
  87. package/www/browser/assets/vs/kotlin-IUYPiTV8.js +1 -0
  88. package/www/browser/assets/vs/language/css/monaco.contribution.js +1 -0
  89. package/www/browser/assets/vs/language/html/monaco.contribution.js +1 -0
  90. package/www/browser/assets/vs/language/json/monaco.contribution.js +1 -0
  91. package/www/browser/assets/vs/language/typescript/monaco.contribution.js +1 -0
  92. package/www/browser/assets/vs/less-C0eDYdqa.js +2 -0
  93. package/www/browser/assets/vs/lexon-iON-Kj97.js +1 -0
  94. package/www/browser/assets/vs/liquid-DqKjdPGy.js +1 -0
  95. package/www/browser/assets/vs/loader.js +1368 -0
  96. package/www/browser/assets/vs/lspLanguageFeatures-kM9O9rjY.js +4 -0
  97. package/www/browser/assets/vs/lua-DtygF91M.js +1 -0
  98. package/www/browser/assets/vs/m3-CsR4AuFi.js +1 -0
  99. package/www/browser/assets/vs/markdown-C_rD0bIw.js +1 -0
  100. package/www/browser/assets/vs/mdx-DEWtB1K5.js +1 -0
  101. package/www/browser/assets/vs/mips-CiYP61RB.js +1 -0
  102. package/www/browser/assets/vs/monaco.contribution-D2OdxNBt.js +1 -0
  103. package/www/browser/assets/vs/monaco.contribution-DO3azKX8.js +1 -0
  104. package/www/browser/assets/vs/monaco.contribution-EcChJV6a.js +1 -0
  105. package/www/browser/assets/vs/monaco.contribution-qLAYrEOP.js +1 -0
  106. package/www/browser/assets/vs/msdax-C38-sJlp.js +1 -0
  107. package/www/browser/assets/vs/mysql-CdtbpvbG.js +1 -0
  108. package/www/browser/assets/vs/nls.messages-loader.js +1 -0
  109. package/www/browser/assets/vs/nls.messages.cs.js.js +17 -0
  110. package/www/browser/assets/vs/nls.messages.de.js.js +17 -0
  111. package/www/browser/assets/vs/nls.messages.es.js.js +17 -0
  112. package/www/browser/assets/vs/nls.messages.fr.js.js +15 -0
  113. package/www/browser/assets/vs/nls.messages.it.js.js +15 -0
  114. package/www/browser/assets/vs/nls.messages.ja.js.js +17 -0
  115. package/www/browser/assets/vs/nls.messages.js.js +10 -0
  116. package/www/browser/assets/vs/nls.messages.ko.js.js +25 -0
  117. package/www/browser/assets/vs/nls.messages.pl.js.js +17 -0
  118. package/www/browser/assets/vs/nls.messages.pt-br.js.js +6 -0
  119. package/www/browser/assets/vs/nls.messages.ru.js.js +17 -0
  120. package/www/browser/assets/vs/nls.messages.tr.js.js +15 -0
  121. package/www/browser/assets/vs/nls.messages.zh-cn.js.js +17 -0
  122. package/www/browser/assets/vs/nls.messages.zh-tw.js.js +15 -0
  123. package/www/browser/assets/vs/objective-c-CntZFaHX.js +1 -0
  124. package/www/browser/assets/vs/pascal-r6kuqfl_.js +1 -0
  125. package/www/browser/assets/vs/pascaligo-BiXoTmXh.js +1 -0
  126. package/www/browser/assets/vs/perl-DABw_TcH.js +1 -0
  127. package/www/browser/assets/vs/pgsql-me_jFXeX.js +1 -0
  128. package/www/browser/assets/vs/php-D_kh-9LK.js +1 -0
  129. package/www/browser/assets/vs/pla-VfZjczW0.js +1 -0
  130. package/www/browser/assets/vs/postiats-BBSzz8Pk.js +1 -0
  131. package/www/browser/assets/vs/powerquery-Dt-g_2cc.js +1 -0
  132. package/www/browser/assets/vs/powershell-B-7ap1zc.js +1 -0
  133. package/www/browser/assets/vs/protobuf-BmtuEB1A.js +2 -0
  134. package/www/browser/assets/vs/pug-BRpRNeEb.js +1 -0
  135. package/www/browser/assets/vs/python-Cr0UkIbn.js +1 -0
  136. package/www/browser/assets/vs/qsharp-BzsFaUU9.js +1 -0
  137. package/www/browser/assets/vs/r-f8dDdrp4.js +1 -0
  138. package/www/browser/assets/vs/razor-BYAHOTkz.js +1 -0
  139. package/www/browser/assets/vs/redis-fvZQY4PI.js +1 -0
  140. package/www/browser/assets/vs/redshift-45Et0LQi.js +1 -0
  141. package/www/browser/assets/vs/restructuredtext-C7UUFKFD.js +1 -0
  142. package/www/browser/assets/vs/ruby-CZO8zYTz.js +1 -0
  143. package/www/browser/assets/vs/rust-Bfetafyc.js +1 -0
  144. package/www/browser/assets/vs/sb-3GYllVck.js +1 -0
  145. package/www/browser/assets/vs/scala-foMgrKo1.js +1 -0
  146. package/www/browser/assets/vs/scheme-CHdMtr7p.js +1 -0
  147. package/www/browser/assets/vs/scss-C1cmLt9V.js +3 -0
  148. package/www/browser/assets/vs/shell-ClXCKCEW.js +1 -0
  149. package/www/browser/assets/vs/solidity-MZ6ExpPy.js +1 -0
  150. package/www/browser/assets/vs/sophia-DWkuSsPQ.js +1 -0
  151. package/www/browser/assets/vs/sparql-AUGFYSyk.js +1 -0
  152. package/www/browser/assets/vs/sql-32GpJSV2.js +1 -0
  153. package/www/browser/assets/vs/st-CuDFIVZ_.js +1 -0
  154. package/www/browser/assets/vs/swift-n-2HociN.js +3 -0
  155. package/www/browser/assets/vs/systemverilog-Ch4vA8Yt.js +1 -0
  156. package/www/browser/assets/vs/tcl-D74tq1nH.js +1 -0
  157. package/www/browser/assets/vs/tsMode-CZz1Umrk.js +11 -0
  158. package/www/browser/assets/vs/twig-C6taOxMV.js +1 -0
  159. package/www/browser/assets/vs/typescript-DfOrAzoV.js +1 -0
  160. package/www/browser/assets/vs/typespec-D-PIh9Xw.js +1 -0
  161. package/www/browser/assets/vs/vb-Dyb2648j.js +1 -0
  162. package/www/browser/assets/vs/wgsl-BhLXMOR0.js +298 -0
  163. package/www/browser/assets/vs/workers-DcJshg-q.js +1 -0
  164. package/www/browser/assets/vs/xml-CdsdnY8S.js +1 -0
  165. package/www/browser/assets/vs/yaml-DYGvmE88.js +1 -0
  166. package/www/browser/chunk-2BZRE4G7.js +1 -0
  167. package/www/browser/chunk-2X3MRS27.js +1 -0
  168. package/www/browser/chunk-4KETC6EB.js +1 -0
  169. package/www/browser/{chunk-SNCDDYQR.js → chunk-5T5KA5PG.js} +1 -1
  170. package/www/browser/chunk-6CGHNKJI.js +1 -0
  171. package/www/browser/chunk-76TVIB33.js +63 -0
  172. package/www/browser/chunk-7J24TP36.js +1 -0
  173. package/www/browser/chunk-ACAZUX6C.js +1 -0
  174. package/www/browser/chunk-B6MBYCXI.js +1 -0
  175. package/www/browser/chunk-BYEU6KGP.js +2 -0
  176. package/www/browser/chunk-CZ5AZ3VW.js +1 -0
  177. package/www/browser/chunk-DW7F5PEA.js +1 -0
  178. package/www/browser/chunk-DXF7BVK5.js +1 -0
  179. package/www/browser/{chunk-HEKO7RQP.js → chunk-EEVPZGEY.js} +1 -1
  180. package/www/browser/chunk-G2W3B7TJ.js +1 -0
  181. package/www/browser/chunk-GDWS2L66.js +1 -0
  182. package/www/browser/chunk-HGONFYP6.js +1 -0
  183. package/www/browser/chunk-HHBPULJW.js +2 -0
  184. package/www/browser/chunk-HRXCR3IN.js +1 -0
  185. package/www/browser/chunk-INL2PELS.js +1 -0
  186. package/www/browser/chunk-JHMEKUZ5.js +1 -0
  187. package/www/browser/{chunk-OC62FHHS.js → chunk-JU3TEDBV.js} +2 -2
  188. package/www/browser/chunk-JZULA5JV.js +1 -0
  189. package/www/browser/{chunk-HZ73CM45.js → chunk-KVFR7GFV.js} +1 -1
  190. package/www/browser/chunk-L5D75AMV.js +1 -0
  191. package/www/browser/chunk-L7TMCSHV.js +1 -0
  192. package/www/browser/{chunk-E6LF4XBJ.js → chunk-LQ5OXSW7.js} +2 -2
  193. package/www/browser/chunk-MVQTKINJ.js +1 -0
  194. package/www/browser/chunk-N4LRZJBP.js +1 -0
  195. package/www/browser/chunk-O2EYEF7J.js +1 -0
  196. package/www/browser/chunk-OMDHJIUB.js +1 -0
  197. package/www/browser/chunk-OWUAAOHW.js +2 -0
  198. package/www/browser/chunk-PIK5YPIB.js +1 -0
  199. package/www/browser/chunk-RHLQRQDK.js +9 -0
  200. package/www/browser/chunk-RW2JPJV7.js +1 -0
  201. package/www/browser/chunk-S3SJ4VVM.js +11 -0
  202. package/www/browser/chunk-SPRWNZHF.js +15 -0
  203. package/www/browser/chunk-SQQNR223.js +1 -0
  204. package/www/browser/chunk-SVQWPHF5.js +1 -0
  205. package/www/browser/{chunk-56SDBJDG.js → chunk-SYCNSLAW.js} +4 -4
  206. package/www/browser/chunk-T3KK7ZXB.js +2 -0
  207. package/www/browser/chunk-TMX5TTV3.js +1 -0
  208. package/www/browser/chunk-UFY3FLDK.js +1 -0
  209. package/www/browser/chunk-UJOHBN2Y.js +1 -0
  210. package/www/browser/chunk-UQGCUFNM.js +1 -0
  211. package/www/browser/chunk-UXXWRMM6.js +1 -0
  212. package/www/browser/chunk-UZRJGJTD.js +2 -0
  213. package/www/browser/chunk-WD4IAQR3.js +1 -0
  214. package/www/browser/chunk-WF2QTF5L.js +1 -0
  215. package/www/browser/chunk-WI67LAOV.js +4 -0
  216. package/www/browser/chunk-WNCM6QKB.js +1 -0
  217. package/www/browser/chunk-XJ5KZQNN.js +1 -0
  218. package/www/browser/chunk-YETDFSQE.js +1 -0
  219. package/www/browser/chunk-YMTC5GZK.js +1 -0
  220. package/www/browser/chunk-YVZHJ76K.js +1 -0
  221. package/www/browser/chunk-ZNTJRLVH.js +1 -0
  222. package/www/browser/favicon.ico +0 -0
  223. package/www/browser/index.html +2 -2
  224. package/www/browser/main-6LN5C22E.js +34 -0
  225. package/www/browser/scripts-U25HCVEI.js +6 -0
  226. package/www/browser/chunk-25RT7L2O.js +0 -1
  227. package/www/browser/chunk-2P5WKSWB.js +0 -5
  228. package/www/browser/chunk-2XZHN52E.js +0 -1
  229. package/www/browser/chunk-3MBM5AMR.js +0 -1
  230. package/www/browser/chunk-3V5PIKHE.js +0 -11
  231. package/www/browser/chunk-42JVTVYH.js +0 -1
  232. package/www/browser/chunk-4IQIZX7Y.js +0 -1
  233. package/www/browser/chunk-4UAHOL42.js +0 -1
  234. package/www/browser/chunk-5DD65JMJ.js +0 -1
  235. package/www/browser/chunk-5EQOKH7G.js +0 -12
  236. package/www/browser/chunk-6JH45SUC.js +0 -1
  237. package/www/browser/chunk-6X6PEDE5.js +0 -1
  238. package/www/browser/chunk-AI6SNMEH.js +0 -1
  239. package/www/browser/chunk-AMXCOT2F.js +0 -1
  240. package/www/browser/chunk-DP3VTELD.js +0 -1
  241. package/www/browser/chunk-EMK65RIU.js +0 -1
  242. package/www/browser/chunk-EYGWZTTT.js +0 -1
  243. package/www/browser/chunk-GKY4LJF4.js +0 -1
  244. package/www/browser/chunk-HJC5MNP5.js +0 -1
  245. package/www/browser/chunk-ITXWAN4J.js +0 -1
  246. package/www/browser/chunk-IZNTCWTR.js +0 -1
  247. package/www/browser/chunk-KN3WZJH7.js +0 -1
  248. package/www/browser/chunk-KPO75P5E.js +0 -1
  249. package/www/browser/chunk-LWBZC6ZL.js +0 -2
  250. package/www/browser/chunk-NYXWJKSW.js +0 -1
  251. package/www/browser/chunk-QM5ROT66.js +0 -1
  252. package/www/browser/chunk-SJG2JCPL.js +0 -4
  253. package/www/browser/chunk-W633D3VG.js +0 -1
  254. package/www/browser/chunk-X3HFJACM.js +0 -2
  255. package/www/browser/chunk-YFAKNLWB.js +0 -2
  256. package/www/browser/chunk-ZSPNEYSK.js +0 -1
  257. package/www/browser/main-O5GAJRDW.js +0 -34
package/lib/app.js CHANGED
@@ -13,6 +13,7 @@ const static_plugin_1 = __importDefault(require("./plugins/static.plugin"));
13
13
  const success_handle_plugin_1 = __importDefault(require("./plugins/success-handle.plugin"));
14
14
  const ws_plugin_1 = __importDefault(require("./plugins/ws/ws.plugin"));
15
15
  const api_client_plugin_1 = __importDefault(require("./plugins/api-client.plugin"));
16
+ const nginx_plugin_1 = __importDefault(require("./plugins/nginx.plugin"));
16
17
  const env_1 = require("./env");
17
18
  function normalizeLogLevel(v) {
18
19
  const lv = (v ?? "").toLowerCase().trim();
@@ -57,6 +58,7 @@ async function createServer() {
57
58
  await fastify.register(error_handler_plugin_1.errorHandlerPlugin);
58
59
  await fastify.register(success_handle_plugin_1.default);
59
60
  await fastify.register(core_plugin_1.default);
61
+ await fastify.register(nginx_plugin_1.default);
60
62
  await fastify.register(ws_plugin_1.default);
61
63
  await fastify.register(api_client_plugin_1.default);
62
64
  await fastify.register(routes_plugin_1.default);
@@ -89,6 +89,11 @@ exports.ERROR_STATUS = {
89
89
  SPRITE_CONFIG_NOT_FOUND: 404,
90
90
  SPRITE_ICONS_ROOT_NOT_FOUND: 404,
91
91
  SPRITE_GROUP_NOT_FOUND: 404,
92
+ NO_VERSION_MANAGER: 503,
93
+ NO_AVAILABLE_VERSIONS: 409,
94
+ VERSION_REQUIRED: 400,
95
+ PROJECT_PATH_REQUIRED: 400,
96
+ SWITCH_VERSION_FAILED: 500,
92
97
  };
93
98
  function mapStatus(code) {
94
99
  return exports.ERROR_STATUS[code] ?? 400;
@@ -0,0 +1,4 @@
1
+ export declare function getNginxBindingStorePath(): string;
2
+ export declare function loadPersistedNginxPath(): Promise<string | null>;
3
+ export declare function savePersistedNginxPath(path: string): Promise<void>;
4
+ export declare function clearPersistedNginxPath(): Promise<void>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNginxBindingStorePath = getNginxBindingStorePath;
4
+ exports.loadPersistedNginxPath = loadPersistedNginxPath;
5
+ exports.savePersistedNginxPath = savePersistedNginxPath;
6
+ exports.clearPersistedNginxPath = clearPersistedNginxPath;
7
+ const promises_1 = require("fs/promises");
8
+ const path_1 = require("path");
9
+ const env_1 = require("../env");
10
+ const bindingStorePath = (0, path_1.join)(env_1.env.dataDir, 'nginx', 'binding.json');
11
+ function getNginxBindingStorePath() {
12
+ return bindingStorePath;
13
+ }
14
+ async function loadPersistedNginxPath() {
15
+ try {
16
+ const raw = await (0, promises_1.readFile)(bindingStorePath, 'utf-8');
17
+ const parsed = JSON.parse(raw);
18
+ const persistedPath = parsed.path?.trim();
19
+ return persistedPath || null;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ async function savePersistedNginxPath(path) {
26
+ const normalizedPath = path.trim();
27
+ if (!normalizedPath) {
28
+ return;
29
+ }
30
+ await (0, promises_1.mkdir)((0, path_1.dirname)(bindingStorePath), { recursive: true });
31
+ const payload = {
32
+ path: normalizedPath,
33
+ updatedAt: new Date().toISOString(),
34
+ };
35
+ await (0, promises_1.writeFile)(bindingStorePath, JSON.stringify(payload, null, 2), 'utf-8');
36
+ }
37
+ async function clearPersistedNginxPath() {
38
+ await (0, promises_1.rm)(bindingStorePath, { force: true });
39
+ }
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ declare const _default: (fastify: FastifyInstance) => Promise<void>;
3
+ export default _default;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const nginx_1 = require("@yinuo-ngm/nginx");
7
+ const fastify_plugin_1 = __importDefault(require("fastify-plugin"));
8
+ const nginx_binding_store_1 = require("./nginx.binding.store");
9
+ exports.default = (0, fastify_plugin_1.default)(async function nginxPlugin(fastify) {
10
+ const nginxApp = new nginx_1.NginxApp();
11
+ fastify.decorate('nginx', nginxApp);
12
+ const persistedPath = await (0, nginx_binding_store_1.loadPersistedNginxPath)();
13
+ if (persistedPath) {
14
+ try {
15
+ await nginxApp.service.bind(persistedPath);
16
+ fastify.log.info(`[nginx] restored binding from ${persistedPath}`);
17
+ }
18
+ catch (error) {
19
+ fastify.log.warn(`[nginx] failed to restore binding from ${(0, nginx_binding_store_1.getNginxBindingStorePath)()}: ${error?.message || error}`);
20
+ }
21
+ }
22
+ fastify.log.info('[nginx] nginx module initialized');
23
+ });
@@ -1,3 +1,4 @@
1
1
  export * from "./task.ws";
2
2
  export * from "./syslog.ws";
3
3
  export * from "./svn.ws";
4
+ export * from "./nginx.ws";
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./task.ws"), exports);
18
18
  __exportStar(require("./syslog.ws"), exports);
19
19
  __exportStar(require("./svn.ws"), exports);
20
+ __exportStar(require("./nginx.ws"), exports);
@@ -0,0 +1,7 @@
1
+ import type { NginxLogService } from "@yinuo-ngm/nginx";
2
+ import { WsContext } from "../ws.context";
3
+ import type { TopicHandler } from "../ws.router";
4
+ export type NginxWsDeps = {
5
+ logService: NginxLogService;
6
+ };
7
+ export declare function createNginxTopicHandler(deps: NginxWsDeps, getAllClients: () => Iterable<WsContext>): TopicHandler;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNginxTopicHandler = createNginxTopicHandler;
4
+ function createNginxTopicHandler(deps, getAllClients) {
5
+ const { logService } = deps;
6
+ const onLog = (entry) => {
7
+ const msg = {
8
+ op: "nginx.log.append",
9
+ logType: entry.type,
10
+ line: entry.line,
11
+ ts: entry.timestamp
12
+ };
13
+ for (const client of getAllClients()) {
14
+ if (client.hasSub("nginx", `nginx:${entry.type}`)) {
15
+ client.send(msg);
16
+ }
17
+ }
18
+ };
19
+ logService.on("log", onLog);
20
+ return {
21
+ topic: "nginx",
22
+ async sub(ctx, msg) {
23
+ const logType = msg.logType;
24
+ if (!logType || (logType !== "error" && logType !== "access")) {
25
+ ctx.send({
26
+ op: "error",
27
+ code: "BAD_MSG",
28
+ message: "logType must be 'error' or 'access'",
29
+ ts: Date.now()
30
+ });
31
+ return;
32
+ }
33
+ const subKey = `nginx:${logType}`;
34
+ ctx.addSub("nginx", subKey);
35
+ logService.startWatching(logType);
36
+ const tail = Math.max(0, Number(msg.tail ?? 0));
37
+ if (tail > 0) {
38
+ const lines = await logService.readLogTail(logType, tail);
39
+ const response = {
40
+ op: "nginx.log.tail",
41
+ logType,
42
+ lines,
43
+ ts: Date.now()
44
+ };
45
+ ctx.send(response);
46
+ }
47
+ },
48
+ unsub(ctx, msg) {
49
+ const logType = msg.logType;
50
+ if (logType) {
51
+ ctx.delSub("nginx", `nginx:${logType}`);
52
+ }
53
+ else {
54
+ ctx.delSub("nginx", "nginx:error");
55
+ ctx.delSub("nginx", "nginx:access");
56
+ }
57
+ }
58
+ };
59
+ }
@@ -28,6 +28,8 @@ exports.default = (0, fastify_plugin_1.default)(async function wsPlugin(fastify)
28
28
  getSvnRuntimeByProjectId: (projectId, tail) => fastify.core.svnSync.getRuntimeByProjectId(projectId, tail),
29
29
  }, () => clients.values());
30
30
  router.register(svnSyncHandler);
31
+ const nginxHandler = (0, topics_1.createNginxTopicHandler)({ logService: fastify.nginx.log }, () => clients.values());
32
+ router.register(nginxHandler);
31
33
  const offs = [];
32
34
  const events = fastify.core.events;
33
35
  offs.push(events.on(core_1.Events.TASK_OUTPUT, (e) => {
@@ -76,6 +78,7 @@ exports.default = (0, fastify_plugin_1.default)(async function wsPlugin(fastify)
76
78
  }
77
79
  catch { }
78
80
  });
81
+ fastify.nginx.log.stopAll();
79
82
  clients.clear();
80
83
  });
81
84
  fastify.get("/ws", { websocket: true }, (ws) => {
@@ -0,0 +1,3 @@
1
+ export declare function getCookieJar(sessionKey: string): string | undefined;
2
+ export declare function clearCookieJar(sessionKey: string): void;
3
+ export declare function mergeCookieJar(sessionKey: string, setCookies: string[]): string | undefined;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCookieJar = getCookieJar;
4
+ exports.clearCookieJar = clearCookieJar;
5
+ exports.mergeCookieJar = mergeCookieJar;
6
+ const jars = new Map();
7
+ function cookieNameFromSetCookie(setCookie) {
8
+ const pair = String(setCookie ?? "").split(";")[0]?.trim();
9
+ if (!pair)
10
+ return null;
11
+ const idx = pair.indexOf("=");
12
+ if (idx <= 0)
13
+ return null;
14
+ return pair.slice(0, idx).trim().toLowerCase();
15
+ }
16
+ function mergeCookieString(oldCookie, setCookies) {
17
+ const next = new Map();
18
+ for (const token of String(oldCookie ?? "").split(";")) {
19
+ const pair = token.trim();
20
+ if (!pair)
21
+ continue;
22
+ const idx = pair.indexOf("=");
23
+ if (idx <= 0)
24
+ continue;
25
+ const name = pair.slice(0, idx).trim().toLowerCase();
26
+ next.set(name, pair);
27
+ }
28
+ for (const sc of setCookies ?? []) {
29
+ const pair = String(sc ?? "").split(";")[0]?.trim();
30
+ if (!pair)
31
+ continue;
32
+ const name = cookieNameFromSetCookie(sc);
33
+ if (!name)
34
+ continue;
35
+ next.set(name, pair);
36
+ }
37
+ return Array.from(next.values()).join("; ");
38
+ }
39
+ function getCookieJar(sessionKey) {
40
+ return jars.get(sessionKey)?.value;
41
+ }
42
+ function clearCookieJar(sessionKey) {
43
+ jars.delete(sessionKey);
44
+ }
45
+ function mergeCookieJar(sessionKey, setCookies) {
46
+ if (!Array.isArray(setCookies) || setCookies.length === 0)
47
+ return jars.get(sessionKey)?.value;
48
+ const oldCookie = jars.get(sessionKey)?.value ?? "";
49
+ const merged = mergeCookieString(oldCookie, setCookies);
50
+ if (!merged)
51
+ return undefined;
52
+ jars.set(sessionKey, { value: merged, updatedAt: Date.now() });
53
+ return merged;
54
+ }
@@ -0,0 +1,2 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ export declare function apiClientHubTokenRoutes(fastify: FastifyInstance): Promise<void>;
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apiClientHubTokenRoutes = apiClientHubTokenRoutes;
4
+ const core_1 = require("@yinuo-ngm/core");
5
+ const api_1 = require("@yinuo-ngm/api");
6
+ const node_stream_1 = require("node:stream");
7
+ function normalizeNonEmptyString(value, field) {
8
+ if (typeof value !== "string" || value.trim() === "") {
9
+ throw new core_1.AppError("BAD_REQUEST", `${field} is required`);
10
+ }
11
+ return value.trim();
12
+ }
13
+ function readHubTokenConfigFromProject(project) {
14
+ const env = (project?.env ?? {});
15
+ const baseUrl = env.NGM_HUB_V2_BASE_URL ?? env.HUB_V2_BASE_URL;
16
+ const token = env.NGM_HUB_V2_TOKEN ?? env.HUB_V2_TOKEN;
17
+ const personalToken = env.NGM_HUB_V2_PERSONAL_TOKEN ?? env.HUB_V2_PERSONAL_TOKEN;
18
+ const projectKey = env.NGM_HUB_V2_PROJECT_KEY ?? env.HUB_V2_PROJECT_KEY;
19
+ return {
20
+ baseUrl: baseUrl?.trim() || "",
21
+ token: token?.trim() || "",
22
+ personalToken: personalToken?.trim() || "",
23
+ projectKey: projectKey?.trim() || undefined,
24
+ };
25
+ }
26
+ async function resolveHubTokenConfig(app, body, tokenType) {
27
+ const inlineBaseUrl = body.baseUrl?.trim();
28
+ const inlineToken = tokenType === "personal"
29
+ ? body.personalToken?.trim() || body.token?.trim()
30
+ : body.token?.trim();
31
+ if (inlineBaseUrl && inlineToken) {
32
+ return { baseUrl: inlineBaseUrl, token: inlineToken };
33
+ }
34
+ if (!body.projectId) {
35
+ throw new core_1.AppError("BAD_REQUEST", "projectId is required when baseUrl/token are not provided");
36
+ }
37
+ const project = await app.core.project.get(body.projectId);
38
+ const config = readHubTokenConfigFromProject(project);
39
+ const resolvedToken = tokenType === "personal" ? body.personalToken?.trim() || config.personalToken : config.token;
40
+ if (!config.baseUrl || !resolvedToken) {
41
+ throw new core_1.AppError("BAD_REQUEST", tokenType === "personal"
42
+ ? "project hub-v2 config missing (NGM_HUB_V2_BASE_URL/NGM_HUB_V2_PERSONAL_TOKEN)"
43
+ : "project hub-v2 config missing (NGM_HUB_V2_BASE_URL/NGM_HUB_V2_TOKEN)");
44
+ }
45
+ return {
46
+ baseUrl: config.baseUrl,
47
+ token: resolvedToken,
48
+ projectKey: config.projectKey,
49
+ };
50
+ }
51
+ async function apiClientHubTokenRoutes(fastify) {
52
+ fastify.get("/projects/:projectId/issues/:issueId/attachments/:attachmentId/raw", async (req, reply) => {
53
+ const params = (req.params ?? {});
54
+ const projectId = normalizeNonEmptyString(params.projectId, "projectId");
55
+ const issueId = normalizeNonEmptyString(params.issueId, "issueId");
56
+ const attachmentId = normalizeNonEmptyString(params.attachmentId, "attachmentId");
57
+ const { baseUrl, token, projectKey } = await resolveHubTokenConfig(fastify, { projectId }, "project");
58
+ const normalizedPath = normalizeHubTokenPath(`/issues/${issueId}/attachments/${attachmentId}/raw`, projectKey);
59
+ const response = await requestHubApiRaw(baseUrl, "/api/token", token, "GET", normalizedPath);
60
+ if (!response.ok) {
61
+ const payload = await parseJson(response);
62
+ throw new core_1.AppError("BAD_REQUEST", payload?.message || `hub-v2 request failed (${response.status})`, {
63
+ status: response.status,
64
+ response: payload,
65
+ });
66
+ }
67
+ copyRawResponseHeaders(response, reply);
68
+ const body = response.body;
69
+ if (!body) {
70
+ return reply.status(response.status).send();
71
+ }
72
+ return reply.status(response.status).send(node_stream_1.Readable.fromWeb(body));
73
+ });
74
+ fastify.get("/projects/:projectId/issues/:issueId/uploads/:uploadId/raw", async (req, reply) => {
75
+ const params = (req.params ?? {});
76
+ const projectId = normalizeNonEmptyString(params.projectId, "projectId");
77
+ const issueId = normalizeNonEmptyString(params.issueId, "issueId");
78
+ const uploadId = normalizeNonEmptyString(params.uploadId, "uploadId");
79
+ const { baseUrl, token, projectKey } = await resolveHubTokenConfig(fastify, { projectId }, "project");
80
+ const normalizedPath = normalizeHubTokenPath(`/issues/${issueId}/uploads/${uploadId}/raw`, projectKey);
81
+ const response = await requestHubApiRaw(baseUrl, "/api/token", token, "GET", normalizedPath);
82
+ if (!response.ok) {
83
+ const payload = await parseJson(response);
84
+ throw new core_1.AppError("BAD_REQUEST", payload?.message || `hub-v2 request failed (${response.status})`, {
85
+ status: response.status,
86
+ response: payload,
87
+ });
88
+ }
89
+ copyRawResponseHeaders(response, reply);
90
+ const body = response.body;
91
+ if (!body) {
92
+ return reply.status(response.status).send();
93
+ }
94
+ return reply.status(response.status).send(node_stream_1.Readable.fromWeb(body));
95
+ });
96
+ fastify.get("/projects/:projectId/rd-items/:itemId/uploads/:uploadId/raw", async (req, reply) => {
97
+ const params = (req.params ?? {});
98
+ const projectId = normalizeNonEmptyString(params.projectId, "projectId");
99
+ const itemId = normalizeNonEmptyString(params.itemId, "itemId");
100
+ const uploadId = normalizeNonEmptyString(params.uploadId, "uploadId");
101
+ const { baseUrl, token, projectKey } = await resolveHubTokenConfig(fastify, { projectId }, "project");
102
+ const normalizedPath = normalizeHubTokenPath(`/rd-items/${itemId}/uploads/${uploadId}/raw`, projectKey);
103
+ const response = await requestHubApiRaw(baseUrl, "/api/token", token, "GET", normalizedPath);
104
+ if (!response.ok) {
105
+ const payload = await parseJson(response);
106
+ throw new core_1.AppError("BAD_REQUEST", payload?.message || `hub-v2 request failed (${response.status})`, {
107
+ status: response.status,
108
+ response: payload,
109
+ });
110
+ }
111
+ copyRawResponseHeaders(response, reply);
112
+ const body = response.body;
113
+ if (!body) {
114
+ return reply.status(response.status).send();
115
+ }
116
+ return reply.status(response.status).send(node_stream_1.Readable.fromWeb(body));
117
+ });
118
+ fastify.post("/request", async (req) => {
119
+ const body = (req.body ?? {});
120
+ const path = normalizeNonEmptyString(body.path, "path");
121
+ assertPathProjectSegmentNotLocalProjectId(path, body.projectId);
122
+ const method = (body.method ?? "GET").toUpperCase();
123
+ const tokenType = body.tokenType === "personal" ? "personal" : "project";
124
+ const { baseUrl, token, projectKey } = await resolveHubTokenConfig(fastify, body, tokenType);
125
+ const query = { ...(body.query ?? {}) };
126
+ if (query.projectKey === undefined && projectKey) {
127
+ query.projectKey = projectKey;
128
+ }
129
+ else if (typeof query.projectKey === "string") {
130
+ query.projectKey = String(query.projectKey).trim();
131
+ }
132
+ const normalizedPath = tokenType === "personal"
133
+ ? normalizeHubPersonalPath(path, projectKey)
134
+ : normalizeHubTokenPath(path, projectKey);
135
+ const data = tokenType === "project"
136
+ ? await requestByProjectTokenClient(baseUrl, token, method, normalizedPath, query, body.body, body.headers)
137
+ : await requestHubApi(baseUrl, "/api/personal", token, method, normalizedPath, query, body.body, body.headers);
138
+ return data;
139
+ });
140
+ fastify.post("/resolve", async (req) => {
141
+ const body = (req.body ?? {});
142
+ const resolvedProject = await resolveHubTokenConfig(fastify, body, "project");
143
+ let personalTokenConfigured = false;
144
+ try {
145
+ await resolveHubTokenConfig(fastify, body, "personal");
146
+ personalTokenConfigured = true;
147
+ }
148
+ catch {
149
+ personalTokenConfigured = false;
150
+ }
151
+ return {
152
+ baseUrl: resolvedProject.baseUrl,
153
+ tokenConfigured: !!resolvedProject.token,
154
+ personalTokenConfigured,
155
+ projectKey: resolvedProject.projectKey ?? null,
156
+ };
157
+ });
158
+ }
159
+ function copyRawResponseHeaders(response, reply) {
160
+ const passthroughHeaders = [
161
+ "content-type",
162
+ "content-disposition",
163
+ "content-length",
164
+ "cache-control",
165
+ "etag",
166
+ "last-modified",
167
+ ];
168
+ for (const key of passthroughHeaders) {
169
+ const value = response.headers.get(key);
170
+ if (!value) {
171
+ continue;
172
+ }
173
+ reply.header(key, value);
174
+ }
175
+ }
176
+ async function requestByProjectTokenClient(baseUrl, token, method, path, query, body, headers) {
177
+ const client = new api_1.ProjectTokenApiClient({ baseUrl, apiToken: token });
178
+ return client.request({
179
+ method,
180
+ path,
181
+ query,
182
+ body,
183
+ headers,
184
+ });
185
+ }
186
+ async function requestHubApi(baseUrl, apiPrefix, token, method, path, query, body, headers) {
187
+ const root = baseUrl.replace(/\/+$/, "");
188
+ const url = new URL(`${root}${apiPrefix}${path}`);
189
+ for (const [key, value] of Object.entries(query ?? {})) {
190
+ if (value === undefined || value === null || value === "") {
191
+ continue;
192
+ }
193
+ url.searchParams.set(key, String(value));
194
+ }
195
+ const requestHeaders = {
196
+ authorization: `Bearer ${token}`,
197
+ ...(headers ?? {}),
198
+ };
199
+ if (body !== undefined) {
200
+ requestHeaders["content-type"] = "application/json";
201
+ }
202
+ const response = await fetch(url.toString(), {
203
+ method,
204
+ headers: requestHeaders,
205
+ body: body === undefined ? undefined : JSON.stringify(body),
206
+ });
207
+ const payload = await parseJson(response);
208
+ if (!response.ok) {
209
+ throw new core_1.AppError("BAD_REQUEST", payload?.message || `hub-v2 request failed (${response.status})`, {
210
+ status: response.status,
211
+ response: payload,
212
+ });
213
+ }
214
+ if (payload && typeof payload === "object" && "code" in payload) {
215
+ if (payload.code !== "OK") {
216
+ throw new core_1.AppError("BAD_REQUEST", payload.message || "hub-v2 response error", {
217
+ response: payload,
218
+ });
219
+ }
220
+ return payload.data;
221
+ }
222
+ return payload;
223
+ }
224
+ async function requestHubApiRaw(baseUrl, apiPrefix, token, method, path, query, headers) {
225
+ const root = baseUrl.replace(/\/+$/, "");
226
+ const url = new URL(`${root}${apiPrefix}${path}`);
227
+ for (const [key, value] of Object.entries(query ?? {})) {
228
+ if (value === undefined || value === null || value === "") {
229
+ continue;
230
+ }
231
+ url.searchParams.set(key, String(value));
232
+ }
233
+ const requestHeaders = {
234
+ authorization: `Bearer ${token}`,
235
+ ...(headers ?? {}),
236
+ };
237
+ return fetch(url.toString(), {
238
+ method,
239
+ headers: requestHeaders,
240
+ });
241
+ }
242
+ async function parseJson(response) {
243
+ try {
244
+ return await response.json();
245
+ }
246
+ catch {
247
+ return null;
248
+ }
249
+ }
250
+ function assertPathProjectSegmentNotLocalProjectId(path, projectId) {
251
+ const localProjectId = projectId?.trim();
252
+ if (!localProjectId) {
253
+ return;
254
+ }
255
+ const normalizedPath = path.startsWith("/") ? path : `/${path}`;
256
+ const matched = normalizedPath.match(/^\/projects\/([^\/]+)(?:\/|$)/i);
257
+ if (!matched) {
258
+ return;
259
+ }
260
+ const projectSegment = (matched[1] ?? "").trim();
261
+ if (projectSegment && projectSegment === localProjectId) {
262
+ throw new core_1.AppError("BAD_REQUEST", "path must use projectKey (or business relative path), not local projectId");
263
+ }
264
+ }
265
+ function normalizeHubTokenPath(path, projectKey) {
266
+ const p = path.startsWith("/") ? path : `/${path}`;
267
+ const m = p.match(/^\/projects\/([^\/]+)(\/.*)?$/i);
268
+ if (m) {
269
+ const key = (m[1] ?? "").trim();
270
+ const rest = m[2] ?? "";
271
+ return `/projects/${key}${rest}`;
272
+ }
273
+ if (!projectKey) {
274
+ throw new core_1.AppError("BAD_REQUEST", "projectKey is required when path does not include /projects/:projectKey");
275
+ }
276
+ return `/projects/${projectKey}${p}`;
277
+ }
278
+ function normalizeHubPersonalPath(path, projectKey) {
279
+ const p = path.startsWith("/") ? path : `/${path}`;
280
+ if (/^\/me(?:\/|$)/i.test(p)) {
281
+ return p;
282
+ }
283
+ return normalizeHubTokenPath(p, projectKey);
284
+ }
@@ -3,3 +3,4 @@ export * from './request.routes';
3
3
  export * from './history.routes';
4
4
  export * from './send.routes';
5
5
  export * from './collection.routes';
6
+ export * from './hub-token.routes';
@@ -19,3 +19,4 @@ __exportStar(require("./request.routes"), exports);
19
19
  __exportStar(require("./history.routes"), exports);
20
20
  __exportStar(require("./send.routes"), exports);
21
21
  __exportStar(require("./collection.routes"), exports);
22
+ __exportStar(require("./hub-token.routes"), exports);
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.apiClientSendRoutes = apiClientSendRoutes;
4
+ const hub_cookie_jar_1 = require("./hub-cookie-jar");
4
5
  async function apiClientSendRoutes(fastify) {
5
6
  const api = fastify.api;
6
7
  fastify.post("/", async (req) => {
@@ -10,13 +11,71 @@ async function apiClientSendRoutes(fastify) {
10
11
  throw new Error("projectId is required when scope=project");
11
12
  if (!body.request && !body.requestId)
12
13
  throw new Error("request or requestId is required");
13
- return await api.send({
14
+ const useCookieJar = body.useCookieJar !== false;
15
+ const sessionKey = body.sessionKey ?? `${scope}:${body.projectId ?? "global"}:${body.envId ?? "default"}`;
16
+ if (body.clearCookieJar) {
17
+ (0, hub_cookie_jar_1.clearCookieJar)(sessionKey);
18
+ }
19
+ const cookieFromJar = useCookieJar ? (0, hub_cookie_jar_1.getCookieJar)(sessionKey) : undefined;
20
+ const nextRequest = await buildRequestWithCookie(api, {
14
21
  scope,
15
22
  projectId: body.projectId,
16
23
  requestId: body.requestId,
17
24
  request: body.request,
25
+ cookie: cookieFromJar,
26
+ });
27
+ const result = await api.send({
28
+ scope,
29
+ projectId: body.projectId,
30
+ requestId: nextRequest ? undefined : body.requestId,
31
+ request: nextRequest ?? body.request,
18
32
  envId: body.envId,
19
33
  projectRoot: body.projectRoot,
20
34
  });
35
+ if (useCookieJar) {
36
+ const setCookies = extractSetCookieHeader(result?.response?.headers?.["set-cookie"]);
37
+ if (setCookies.length > 0) {
38
+ (0, hub_cookie_jar_1.mergeCookieJar)(sessionKey, setCookies);
39
+ }
40
+ }
41
+ return result;
21
42
  });
22
43
  }
44
+ async function buildRequestWithCookie(api, params) {
45
+ if (!params.cookie)
46
+ return params.request;
47
+ const requestEntity = params.request
48
+ ?? (params.requestId
49
+ ? await api.getRequest(params.requestId, params.scope, params.projectId)
50
+ : undefined);
51
+ if (!requestEntity)
52
+ return params.request;
53
+ const next = {
54
+ ...requestEntity,
55
+ headers: Array.isArray(requestEntity.headers) ? [...requestEntity.headers] : [],
56
+ auth: requestEntity.auth ? { ...requestEntity.auth } : undefined,
57
+ };
58
+ if (next.auth?.type === "cookie" && next.auth?.cookie?.value) {
59
+ return next;
60
+ }
61
+ const cookieHeader = next.headers.find((h) => String(h?.key ?? "").toLowerCase() === "cookie");
62
+ if (cookieHeader && cookieHeader.value) {
63
+ return next;
64
+ }
65
+ if (cookieHeader) {
66
+ cookieHeader.value = params.cookie;
67
+ cookieHeader.enabled = true;
68
+ return next;
69
+ }
70
+ next.headers.push({
71
+ key: "cookie",
72
+ value: params.cookie,
73
+ enabled: true,
74
+ });
75
+ return next;
76
+ }
77
+ function extractSetCookieHeader(raw) {
78
+ if (!raw)
79
+ return [];
80
+ return [raw];
81
+ }
@@ -0,0 +1,2 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ export default function hubRoutes(app: FastifyInstance): Promise<void>;