@cytario/web 2.1.3 → 2.1.5

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 (202) hide show
  1. package/README.md +20 -20
  2. package/app/.server/auth/README.md +8 -8
  3. package/app/.server/auth/authMiddleware.ts +9 -25
  4. package/app/.server/auth/exchangeAuthCode.ts +2 -6
  5. package/app/.server/auth/getS3Client.ts +3 -13
  6. package/app/.server/auth/getSessionCredentials.ts +6 -20
  7. package/app/.server/auth/getUserInfo.ts +2 -6
  8. package/app/.server/auth/keycloakAdmin/client.ts +2 -9
  9. package/app/.server/auth/keycloakAdmin/groups.ts +9 -26
  10. package/app/.server/auth/keycloakAdmin/users.ts +7 -23
  11. package/app/.server/auth/oauthState.ts +4 -13
  12. package/app/.server/auth/redirectIfAuthenticated.ts +1 -3
  13. package/app/.server/auth/refreshAuthTokens.ts +5 -19
  14. package/app/.server/auth/sessionMiddleware.ts +1 -4
  15. package/app/.server/auth/sessionStorage.ts +1 -4
  16. package/app/.server/auth/verifyIdToken.ts +1 -3
  17. package/app/.server/auth/wellKnownEndpoints.ts +1 -4
  18. package/app/.server/db/redis.ts +5 -1
  19. package/app/.server/logging.ts +1 -4
  20. package/app/.server/requestDurationMiddleware.ts +1 -4
  21. package/app/components/.client/ImageViewer/README.md +5 -5
  22. package/app/components/.client/ImageViewer/components/ChannelsController/ChannelsController.tsx +7 -9
  23. package/app/components/.client/ImageViewer/components/ChannelsController/ChannelsControllerBrightfieldItem.tsx +1 -2
  24. package/app/components/.client/ImageViewer/components/ChannelsController/ChannelsControllerItem.tsx +2 -5
  25. package/app/components/.client/ImageViewer/components/ChannelsController/ChannelsControllerItemList.tsx +7 -15
  26. package/app/components/.client/ImageViewer/components/ChannelsController/ColorPicker/ColorPicker.tsx +2 -9
  27. package/app/components/.client/ImageViewer/components/ChannelsController/ColorPicker/ColorSwatch.tsx +1 -4
  28. package/app/components/.client/ImageViewer/components/ChannelsController/DomainSlider.tsx +1 -3
  29. package/app/components/.client/ImageViewer/components/ChannelsController/Histogram.tsx +16 -18
  30. package/app/components/.client/ImageViewer/components/ChannelsController/HistogramChannel.tsx +2 -8
  31. package/app/components/.client/ImageViewer/components/ChannelsController/MinMaxSettings.tsx +6 -15
  32. package/app/components/.client/ImageViewer/components/FeatureBar/FeatureBarDragHandle.tsx +1 -5
  33. package/app/components/.client/ImageViewer/components/FeatureBar/FeatureBarToggle.tsx +1 -5
  34. package/app/components/.client/ImageViewer/components/FeatureBar/FeatureItem.tsx +1 -5
  35. package/app/components/.client/ImageViewer/components/FeatureBar/Presets.tsx +3 -11
  36. package/app/components/.client/ImageViewer/components/FeatureBar/useFeatureBar.tsx +16 -25
  37. package/app/components/.client/ImageViewer/components/Image/Channels/useChannelsLayer.ts +7 -18
  38. package/app/components/.client/ImageViewer/components/Image/ImageContainer.tsx +1 -1
  39. package/app/components/.client/ImageViewer/components/Image/ImagePanel.tsx +6 -26
  40. package/app/components/.client/ImageViewer/components/Image/ImagePreview.tsx +2 -9
  41. package/app/components/.client/ImageViewer/components/Image/Overlays/AdditivePolygonLayer.tsx +1 -5
  42. package/app/components/.client/ImageViewer/components/Image/Overlays/AdditiveScatterplotLayer.tsx +1 -5
  43. package/app/components/.client/ImageViewer/components/Image/Overlays/OverlaysLayer.tsx +6 -24
  44. package/app/components/.client/ImageViewer/components/Image/Overlays/markerUniforms.ts +2 -5
  45. package/app/components/.client/ImageViewer/components/Image/Overlays/useOverlaysLayer.tsx +7 -21
  46. package/app/components/.client/ImageViewer/components/Image/useInitializeChannels.ts +1 -7
  47. package/app/components/.client/ImageViewer/components/Image/useResizeObserver.ts +1 -1
  48. package/app/components/.client/ImageViewer/components/Magnifier.tsx +5 -13
  49. package/app/components/.client/ImageViewer/components/Measurements/ActiveViewStatePreview.tsx +3 -8
  50. package/app/components/.client/ImageViewer/components/Measurements/CursorTick.tsx +2 -7
  51. package/app/components/.client/ImageViewer/components/Measurements/Ruler.tsx +1 -8
  52. package/app/components/.client/ImageViewer/components/Measurements/SlideCarrier.tsx +3 -13
  53. package/app/components/.client/ImageViewer/components/Measurements/Tick.tsx +1 -1
  54. package/app/components/.client/ImageViewer/components/Measurements/calculateViewStateToFit.ts +1 -1
  55. package/app/components/.client/ImageViewer/components/Measurements/useMeasurements.ts +9 -28
  56. package/app/components/.client/ImageViewer/components/OverlaysController/AddOverlay.tsx +4 -13
  57. package/app/components/.client/ImageViewer/components/OverlaysController/OverlayPicker.modal.tsx +1 -6
  58. package/app/components/.client/ImageViewer/components/OverlaysController/OverlaysController.Item.tsx +24 -54
  59. package/app/components/.client/ImageViewer/components/OverlaysController/OverlaysController.tsx +1 -3
  60. package/app/components/.client/ImageViewer/components/SplitViewToggle.tsx +1 -3
  61. package/app/components/.client/ImageViewer/components/ViewerHeader.tsx +1 -3
  62. package/app/components/.client/ImageViewer/state/decoders/decodeJPEG2000.d.ts +9 -11
  63. package/app/components/.client/ImageViewer/state/decoders/decodeJPEG2000.js +11 -11
  64. package/app/components/.client/ImageViewer/state/decoders/decoder.worker.js +49 -49
  65. package/app/components/.client/ImageViewer/state/decoders/genericDecoder.ts +76 -81
  66. package/app/components/.client/ImageViewer/state/decoders/jp2k-decoder.ts +9 -9
  67. package/app/components/.client/ImageViewer/state/decoders/lzwDecoder.ts +9 -9
  68. package/app/components/.client/ImageViewer/state/loaders/loadBioformatsZarrWithCredentials.ts +10 -22
  69. package/app/components/.client/ImageViewer/state/store/ViewerStoreContext.tsx +4 -18
  70. package/app/components/.client/ImageViewer/state/store/createViewerStore.ts +110 -194
  71. package/app/components/.client/ImageViewer/state/store/getInitialChannelsState.ts +2 -6
  72. package/app/components/.client/ImageViewer/state/store/selectors.ts +9 -9
  73. package/app/components/.client/ImageViewer/state/store/types.ts +3 -12
  74. package/app/components/.client/ImageViewer/state/transport/CredentialedHTTPStore.ts +1 -5
  75. package/app/components/.client/ImageViewer/state/transport/SigV4TiffClient.ts +2 -9
  76. package/app/components/.client/ImageViewer/utils/getSelectionStats.ts +1 -4
  77. package/app/components/.client/ImageViewer/utils/handleImageViewerHover.ts +1 -1
  78. package/app/components/.client/ImageViewer/utils/mapChannelConfigsToState.ts +2 -4
  79. package/app/components/.client/ImageViewer/utils/useTilesLoading.ts +3 -3
  80. package/app/components/AppHeader.tsx +1 -4
  81. package/app/components/Breadcrumbs/Breadcrumbs.tsx +4 -13
  82. package/app/components/Breadcrumbs/getCrumbs.tsx +1 -1
  83. package/app/components/ClientOnly.tsx +1 -1
  84. package/app/components/Container.tsx +3 -15
  85. package/app/components/DataGrid/ConvertOverlay.modal.tsx +1 -6
  86. package/app/components/DataGrid/DataGrid.tsx +7 -27
  87. package/app/components/DataGrid/WktSvg.tsx +2 -4
  88. package/app/components/DataGrid/getParquetSchema.ts +1 -4
  89. package/app/components/DescriptionList.tsx +1 -3
  90. package/app/components/DirectoryView/ConnectionMenu.tsx +8 -22
  91. package/app/components/DirectoryView/DirectoryView.tsx +10 -46
  92. package/app/components/DirectoryView/DirectoryViewGrid.tsx +16 -49
  93. package/app/components/DirectoryView/DirectoryViewTableConnection.tsx +1 -4
  94. package/app/components/DirectoryView/DirectoryViewTableDirectory.tsx +2 -7
  95. package/app/components/DirectoryView/DirectoryViewTree.tsx +5 -21
  96. package/app/components/DirectoryView/FilterBar.tsx +9 -48
  97. package/app/components/DirectoryView/buildDirectoryTree.ts +6 -25
  98. package/app/components/DirectoryView/filterNodes.ts +4 -11
  99. package/app/components/DirectoryView/modals/Cyberduck.modal.tsx +6 -15
  100. package/app/components/DirectoryView/modals/FileInfo.modal.tsx +1 -5
  101. package/app/components/DirectoryView/useLayoutStore.ts +5 -25
  102. package/app/components/GlobalSearch/GlobalSearch.tsx +1 -4
  103. package/app/components/GlobalSearch/SearchBar.tsx +1 -7
  104. package/app/components/GlobalSearch/Suggestions.tsx +0 -1
  105. package/app/components/ImageViewer/state/formatRegistry.ts +5 -18
  106. package/app/components/LavaLoader.tsx +4 -11
  107. package/app/components/Layout/Footer.tsx +1 -4
  108. package/app/components/Pills/ScopePill.tsx +2 -8
  109. package/app/components/Table/ColumnFilterInput.tsx +5 -20
  110. package/app/components/Table/ColumnResizeHandle.tsx +1 -5
  111. package/app/components/Table/ColumnSortButton.tsx +1 -5
  112. package/app/components/Table/SelectionFooter.tsx +3 -5
  113. package/app/components/Table/Table.tsx +5 -21
  114. package/app/components/Table/TableBodyRow.tsx +19 -31
  115. package/app/components/Table/TableHeaderRow.tsx +7 -28
  116. package/app/components/Table/TableMenu.tsx +4 -20
  117. package/app/components/Table/state/createTableStore.ts +3 -9
  118. package/app/components/Table/state/useTableStore.ts +1 -3
  119. package/app/components/Table/types.ts +4 -10
  120. package/app/components/Table/useColumnFilters.ts +1 -4
  121. package/app/components/Table/useColumnVisibility.ts +4 -11
  122. package/app/components/Table/useColumnWidths.ts +1 -3
  123. package/app/components/Table/useTableSorting.ts +4 -12
  124. package/app/components/Tooltip/Tooltip.tsx +4 -17
  125. package/app/components/Tooltip/TooltipSpan.tsx +5 -28
  126. package/app/components/Tooltip/useCopyToClipboard.ts +1 -3
  127. package/app/components/Tooltip/useMiddleEllipsis.ts +2 -7
  128. package/app/components/Tooltip/useOverflowDetection.ts +2 -5
  129. package/app/components/UserMenu.tsx +2 -9
  130. package/app/entry.server.tsx +9 -19
  131. package/app/hooks/useSearchParam.ts +2 -4
  132. package/app/lib/bootstrapPluginsCore.ts +4 -9
  133. package/app/root.tsx +4 -15
  134. package/app/routes/admin/assertAdminScope.ts +1 -3
  135. package/app/routes/admin/assertGroupPathsInScope.ts +3 -11
  136. package/app/routes/admin/assertGroupsInScope.ts +3 -11
  137. package/app/routes/admin/assertUsersInScope.ts +2 -8
  138. package/app/routes/admin/bulkInvite/bulkInvite.action.ts +2 -13
  139. package/app/routes/admin/bulkInvite/bulkInvite.form.tsx +18 -35
  140. package/app/routes/admin/createGroup/createGroup.action.ts +3 -10
  141. package/app/routes/admin/createGroup/createGroup.form.tsx +2 -9
  142. package/app/routes/admin/createGroup/createGroup.modal.tsx +1 -5
  143. package/app/routes/admin/inviteUser/inviteUser.action.ts +1 -4
  144. package/app/routes/admin/inviteUser/inviteUser.form.tsx +2 -8
  145. package/app/routes/admin/inviteUser/inviteUser.loader.ts +1 -4
  146. package/app/routes/admin/inviteUser/inviteUser.modal.tsx +3 -16
  147. package/app/routes/admin/updateUser/updateUser.form.tsx +4 -15
  148. package/app/routes/admin/updateUser/updateUser.modal.tsx +5 -23
  149. package/app/routes/admin/updateUser/userDetail.action.ts +2 -10
  150. package/app/routes/admin/users/BulkActions.tsx +15 -38
  151. package/app/routes/admin/users/bulkUsers.action.ts +2 -9
  152. package/app/routes/admin/users/bulkUsers.schema.ts +1 -6
  153. package/app/routes/admin/users/users.route.tsx +14 -63
  154. package/app/routes/api/cyberduck-profile.$name.ts +6 -2
  155. package/app/routes/auth/callback.route.tsx +8 -33
  156. package/app/routes/auth/login.route.tsx +8 -11
  157. package/app/routes/auth/logout.route.tsx +4 -14
  158. package/app/routes/config.route.tsx +1 -5
  159. package/app/routes/connections/connection.form.tsx +5 -14
  160. package/app/routes/connections/connection.schema.ts +4 -16
  161. package/app/routes/connections/connections.loader.ts +11 -23
  162. package/app/routes/connections/connections.route.tsx +1 -5
  163. package/app/routes/connections/connections.server.ts +1 -3
  164. package/app/routes/connections/createConnection.action.ts +2 -8
  165. package/app/routes/connections/createConnection.modal.tsx +3 -13
  166. package/app/routes/connections/deleteConnection.action.ts +1 -4
  167. package/app/routes/connections/updateConnection.action.ts +2 -8
  168. package/app/routes/connections/updateConnection.modal.tsx +4 -14
  169. package/app/routes/home/home.route.tsx +8 -33
  170. package/app/routes/layouts/ModalOutlet.tsx +6 -18
  171. package/app/routes/objects/objects.loader.ts +5 -19
  172. package/app/routes/objects/objects.route.tsx +11 -30
  173. package/app/routes/presign.route.tsx +5 -18
  174. package/app/routes/recent.route.tsx +1 -4
  175. package/app/routes/search.route.tsx +4 -17
  176. package/app/routes.ts +1 -4
  177. package/app/tailwind.css +17 -12
  178. package/app/types/cornerstone-codecs.d.ts +25 -29
  179. package/app/utils/connectionsStore/selectors.ts +2 -6
  180. package/app/utils/connectionsStore/useConnectionsStore.ts +2 -6
  181. package/app/utils/db/convertCsvToParquet.ts +1 -3
  182. package/app/utils/db/createDatabase.ts +1 -3
  183. package/app/utils/db/createSingleton.ts +1 -1
  184. package/app/utils/db/getBlobFromObjectNode.ts +3 -9
  185. package/app/utils/db/getGeomQuery.ts +1 -1
  186. package/app/utils/db/getMarkerInfoWasm.ts +1 -3
  187. package/app/utils/db/getTileBoundingBox.ts +1 -4
  188. package/app/utils/db/sqlQueries.ts +1 -4
  189. package/app/utils/fileType.ts +80 -10
  190. package/app/utils/filterObjects.ts +2 -5
  191. package/app/utils/localFilesStore/useFileStore.ts +7 -7
  192. package/app/utils/recentlyViewed.server.ts +1 -4
  193. package/app/utils/resourceId.ts +3 -11
  194. package/app/utils/s3Provider.ts +3 -7
  195. package/app/utils/signedFetch.ts +4 -13
  196. package/bin-src/codegen.ts +4 -1
  197. package/package.json +5 -1
  198. package/prisma/seed.ts +1 -2
  199. package/public/favicon/site.webmanifest +1 -1
  200. package/server.js +1 -4
  201. package/server.js.map +1 -1
  202. package/vite-plugins/cytario-plugins.ts +2 -8
package/prisma/seed.ts CHANGED
@@ -17,8 +17,7 @@ const pool = new Pool({ connectionString: process.env.DATABASE_URL });
17
17
  const prisma = new PrismaClient({ adapter: new PrismaPg(pool) });
18
18
 
19
19
  const TEST_CONNECTION_NAME = process.env.E2E_CONNECTION_NAME || "Exchange";
20
- const TEST_PREFIX_CONNECTION_NAME =
21
- process.env.E2E_PREFIX_CONNECTION_NAME || "Exchange-prefixed";
20
+ const TEST_PREFIX_CONNECTION_NAME = process.env.E2E_PREFIX_CONNECTION_NAME || "Exchange-prefixed";
22
21
 
23
22
  const SHARED_BUCKET = {
24
23
  ownerScope: "cytario",
@@ -18,4 +18,4 @@
18
18
  "theme_color": "#ffffff",
19
19
  "background_color": "#ffffff",
20
20
  "display": "standalone"
21
- }
21
+ }
package/server.js CHANGED
@@ -27,10 +27,7 @@ app.use(
27
27
  maxAge: "1y"
28
28
  })
29
29
  );
30
- app.use(
31
- buildModule.publicPath,
32
- express.static(buildModule.assetsBuildDirectory, { maxAge: "1h" })
33
- );
30
+ app.use(buildModule.publicPath, express.static(buildModule.assetsBuildDirectory, { maxAge: "1h" }));
34
31
  app.use(express.static("public", { maxAge: "1h" }));
35
32
  app.use(morgan("tiny"));
36
33
  app.all(
package/server.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["server.ts"],"sourcesContent":["import \"dotenv/config\";\nimport { createRequestHandler } from \"@react-router/express\";\nimport compression from \"compression\";\nimport express from \"express\";\nimport morgan from \"morgan\";\nimport path from \"node:path\";\nimport url from \"node:url\";\n\nconst BUILD_PATH = path.resolve(\"build/server/index.js\");\n\nconst buildModule = await import(url.pathToFileURL(BUILD_PATH).href);\n\nconst app = express();\n\n// Trust the first proxy (Traefik) so req.protocol reflects X-Forwarded-Proto\n// and req.ip reflects X-Forwarded-For. This is critical for secure cookie\n// handling when TLS is terminated at the reverse proxy.\napp.set(\"trust proxy\", 1);\n\napp.disable(\"x-powered-by\");\n\nlet isShuttingDown = false;\n\n// Kubernetes readiness/liveness probe — before all middleware so it's fast and\n// never blocked by compression, static-file serving, or request logging.\napp.get(\"/healthz\", (_req, res) => {\n if (isShuttingDown) {\n res.status(503).send(\"shutting down\");\n } else {\n res.status(200).send(\"ok\");\n }\n});\n\napp.use(compression());\n\n// Vite-fingerprinted assets — immutable, cache forever\napp.use(\n path.posix.join(buildModule.publicPath, \"assets\"),\n express.static(path.join(buildModule.assetsBuildDirectory, \"assets\"), {\n immutable: true,\n maxAge: \"1y\",\n }),\n);\n\n// Other build assets — short cache\napp.use(\n buildModule.publicPath,\n express.static(buildModule.assetsBuildDirectory, { maxAge: \"1h\" }),\n);\n\n// Public static files (fonts, logos, etc.)\napp.use(express.static(\"public\", { maxAge: \"1h\" }));\n\napp.use(morgan(\"tiny\"));\n\napp.all(\n \"*\",\n createRequestHandler({\n build: buildModule,\n mode: process.env.NODE_ENV,\n }),\n);\n\nconst port = Number.parseInt(process.env.PORT || \"3000\", 10);\nconst host = process.env.HOST || \"0.0.0.0\";\n\nconst server = app.listen(port, host, () => {\n console.log(`[cytario-web] http://${host}:${port}`);\n});\n\n// Graceful shutdown on SIGTERM/SIGINT\nconst SHUTDOWN_DELAY_MS = 5_000;\nconst DRAIN_TIMEOUT_MS = 15_000;\n\nfor (const signal of [\"SIGTERM\", \"SIGINT\"]) {\n process.once(signal, () => {\n console.log(`[cytario-web] ${signal} received, shutting down gracefully`);\n isShuttingDown = true;\n\n // Wait for load balancer to deregister the pod before closing connections\n setTimeout(() => {\n console.log(\"[cytario-web] closing server to new connections\");\n server.close((err) => {\n if (err) {\n console.error(\"[cytario-web] error during close:\", err);\n } else {\n console.log(\"[cytario-web] all connections drained, exiting\");\n }\n process.exit(err ? 1 : 0);\n });\n\n // Force exit if connections don't drain in time\n setTimeout(() => {\n console.error(\"[cytario-web] drain timeout, forcing exit\");\n process.exit(1);\n }, DRAIN_TIMEOUT_MS).unref();\n }, SHUTDOWN_DELAY_MS);\n });\n}\n"],"mappings":";AAAA,OAAO;AACP,SAAS,4BAA4B;AACrC,OAAO,iBAAiB;AACxB,OAAO,aAAa;AACpB,OAAO,YAAY;AACnB,OAAO,UAAU;AACjB,OAAO,SAAS;AAEhB,IAAM,aAAa,KAAK,QAAQ,uBAAuB;AAEvD,IAAM,cAAc,MAAM,OAAO,IAAI,cAAc,UAAU,EAAE;AAE/D,IAAM,MAAM,QAAQ;AAKpB,IAAI,IAAI,eAAe,CAAC;AAExB,IAAI,QAAQ,cAAc;AAE1B,IAAI,iBAAiB;AAIrB,IAAI,IAAI,YAAY,CAAC,MAAM,QAAQ;AACjC,MAAI,gBAAgB;AAClB,QAAI,OAAO,GAAG,EAAE,KAAK,eAAe;AAAA,EACtC,OAAO;AACL,QAAI,OAAO,GAAG,EAAE,KAAK,IAAI;AAAA,EAC3B;AACF,CAAC;AAED,IAAI,IAAI,YAAY,CAAC;AAGrB,IAAI;AAAA,EACF,KAAK,MAAM,KAAK,YAAY,YAAY,QAAQ;AAAA,EAChD,QAAQ,OAAO,KAAK,KAAK,YAAY,sBAAsB,QAAQ,GAAG;AAAA,IACpE,WAAW;AAAA,IACX,QAAQ;AAAA,EACV,CAAC;AACH;AAGA,IAAI;AAAA,EACF,YAAY;AAAA,EACZ,QAAQ,OAAO,YAAY,sBAAsB,EAAE,QAAQ,KAAK,CAAC;AACnE;AAGA,IAAI,IAAI,QAAQ,OAAO,UAAU,EAAE,QAAQ,KAAK,CAAC,CAAC;AAElD,IAAI,IAAI,OAAO,MAAM,CAAC;AAEtB,IAAI;AAAA,EACF;AAAA,EACA,qBAAqB;AAAA,IACnB,OAAO;AAAA,IACP,MAAM,QAAQ,IAAI;AAAA,EACpB,CAAC;AACH;AAEA,IAAM,OAAO,OAAO,SAAS,QAAQ,IAAI,QAAQ,QAAQ,EAAE;AAC3D,IAAM,OAAO,QAAQ,IAAI,QAAQ;AAEjC,IAAM,SAAS,IAAI,OAAO,MAAM,MAAM,MAAM;AAC1C,UAAQ,IAAI,wBAAwB,IAAI,IAAI,IAAI,EAAE;AACpD,CAAC;AAGD,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AAEzB,WAAW,UAAU,CAAC,WAAW,QAAQ,GAAG;AAC1C,UAAQ,KAAK,QAAQ,MAAM;AACzB,YAAQ,IAAI,iBAAiB,MAAM,qCAAqC;AACxE,qBAAiB;AAGjB,eAAW,MAAM;AACf,cAAQ,IAAI,iDAAiD;AAC7D,aAAO,MAAM,CAAC,QAAQ;AACpB,YAAI,KAAK;AACP,kBAAQ,MAAM,qCAAqC,GAAG;AAAA,QACxD,OAAO;AACL,kBAAQ,IAAI,gDAAgD;AAAA,QAC9D;AACA,gBAAQ,KAAK,MAAM,IAAI,CAAC;AAAA,MAC1B,CAAC;AAGD,iBAAW,MAAM;AACf,gBAAQ,MAAM,2CAA2C;AACzD,gBAAQ,KAAK,CAAC;AAAA,MAChB,GAAG,gBAAgB,EAAE,MAAM;AAAA,IAC7B,GAAG,iBAAiB;AAAA,EACtB,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["server.ts"],"sourcesContent":["import \"dotenv/config\";\nimport { createRequestHandler } from \"@react-router/express\";\nimport compression from \"compression\";\nimport express from \"express\";\nimport morgan from \"morgan\";\nimport path from \"node:path\";\nimport url from \"node:url\";\n\nconst BUILD_PATH = path.resolve(\"build/server/index.js\");\n\nconst buildModule = await import(url.pathToFileURL(BUILD_PATH).href);\n\nconst app = express();\n\n// Trust the first proxy (Traefik) so req.protocol reflects X-Forwarded-Proto\n// and req.ip reflects X-Forwarded-For. This is critical for secure cookie\n// handling when TLS is terminated at the reverse proxy.\napp.set(\"trust proxy\", 1);\n\napp.disable(\"x-powered-by\");\n\nlet isShuttingDown = false;\n\n// Kubernetes readiness/liveness probe — before all middleware so it's fast and\n// never blocked by compression, static-file serving, or request logging.\napp.get(\"/healthz\", (_req, res) => {\n if (isShuttingDown) {\n res.status(503).send(\"shutting down\");\n } else {\n res.status(200).send(\"ok\");\n }\n});\n\napp.use(compression());\n\n// Vite-fingerprinted assets — immutable, cache forever\napp.use(\n path.posix.join(buildModule.publicPath, \"assets\"),\n express.static(path.join(buildModule.assetsBuildDirectory, \"assets\"), {\n immutable: true,\n maxAge: \"1y\",\n }),\n);\n\n// Other build assets — short cache\napp.use(buildModule.publicPath, express.static(buildModule.assetsBuildDirectory, { maxAge: \"1h\" }));\n\n// Public static files (fonts, logos, etc.)\napp.use(express.static(\"public\", { maxAge: \"1h\" }));\n\napp.use(morgan(\"tiny\"));\n\napp.all(\n \"*\",\n createRequestHandler({\n build: buildModule,\n mode: process.env.NODE_ENV,\n }),\n);\n\nconst port = Number.parseInt(process.env.PORT || \"3000\", 10);\nconst host = process.env.HOST || \"0.0.0.0\";\n\nconst server = app.listen(port, host, () => {\n console.log(`[cytario-web] http://${host}:${port}`);\n});\n\n// Graceful shutdown on SIGTERM/SIGINT\nconst SHUTDOWN_DELAY_MS = 5_000;\nconst DRAIN_TIMEOUT_MS = 15_000;\n\nfor (const signal of [\"SIGTERM\", \"SIGINT\"]) {\n process.once(signal, () => {\n console.log(`[cytario-web] ${signal} received, shutting down gracefully`);\n isShuttingDown = true;\n\n // Wait for load balancer to deregister the pod before closing connections\n setTimeout(() => {\n console.log(\"[cytario-web] closing server to new connections\");\n server.close((err) => {\n if (err) {\n console.error(\"[cytario-web] error during close:\", err);\n } else {\n console.log(\"[cytario-web] all connections drained, exiting\");\n }\n process.exit(err ? 1 : 0);\n });\n\n // Force exit if connections don't drain in time\n setTimeout(() => {\n console.error(\"[cytario-web] drain timeout, forcing exit\");\n process.exit(1);\n }, DRAIN_TIMEOUT_MS).unref();\n }, SHUTDOWN_DELAY_MS);\n });\n}\n"],"mappings":";AAAA,OAAO;AACP,SAAS,4BAA4B;AACrC,OAAO,iBAAiB;AACxB,OAAO,aAAa;AACpB,OAAO,YAAY;AACnB,OAAO,UAAU;AACjB,OAAO,SAAS;AAEhB,IAAM,aAAa,KAAK,QAAQ,uBAAuB;AAEvD,IAAM,cAAc,MAAM,OAAO,IAAI,cAAc,UAAU,EAAE;AAE/D,IAAM,MAAM,QAAQ;AAKpB,IAAI,IAAI,eAAe,CAAC;AAExB,IAAI,QAAQ,cAAc;AAE1B,IAAI,iBAAiB;AAIrB,IAAI,IAAI,YAAY,CAAC,MAAM,QAAQ;AACjC,MAAI,gBAAgB;AAClB,QAAI,OAAO,GAAG,EAAE,KAAK,eAAe;AAAA,EACtC,OAAO;AACL,QAAI,OAAO,GAAG,EAAE,KAAK,IAAI;AAAA,EAC3B;AACF,CAAC;AAED,IAAI,IAAI,YAAY,CAAC;AAGrB,IAAI;AAAA,EACF,KAAK,MAAM,KAAK,YAAY,YAAY,QAAQ;AAAA,EAChD,QAAQ,OAAO,KAAK,KAAK,YAAY,sBAAsB,QAAQ,GAAG;AAAA,IACpE,WAAW;AAAA,IACX,QAAQ;AAAA,EACV,CAAC;AACH;AAGA,IAAI,IAAI,YAAY,YAAY,QAAQ,OAAO,YAAY,sBAAsB,EAAE,QAAQ,KAAK,CAAC,CAAC;AAGlG,IAAI,IAAI,QAAQ,OAAO,UAAU,EAAE,QAAQ,KAAK,CAAC,CAAC;AAElD,IAAI,IAAI,OAAO,MAAM,CAAC;AAEtB,IAAI;AAAA,EACF;AAAA,EACA,qBAAqB;AAAA,IACnB,OAAO;AAAA,IACP,MAAM,QAAQ,IAAI;AAAA,EACpB,CAAC;AACH;AAEA,IAAM,OAAO,OAAO,SAAS,QAAQ,IAAI,QAAQ,QAAQ,EAAE;AAC3D,IAAM,OAAO,QAAQ,IAAI,QAAQ;AAEjC,IAAM,SAAS,IAAI,OAAO,MAAM,MAAM,MAAM;AAC1C,UAAQ,IAAI,wBAAwB,IAAI,IAAI,IAAI,EAAE;AACpD,CAAC;AAGD,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AAEzB,WAAW,UAAU,CAAC,WAAW,QAAQ,GAAG;AAC1C,UAAQ,KAAK,QAAQ,MAAM;AACzB,YAAQ,IAAI,iBAAiB,MAAM,qCAAqC;AACxE,qBAAiB;AAGjB,eAAW,MAAM;AACf,cAAQ,IAAI,iDAAiD;AAC7D,aAAO,MAAM,CAAC,QAAQ;AACpB,YAAI,KAAK;AACP,kBAAQ,MAAM,qCAAqC,GAAG;AAAA,QACxD,OAAO;AACL,kBAAQ,IAAI,gDAAgD;AAAA,QAC9D;AACA,gBAAQ,KAAK,MAAM,IAAI,CAAC;AAAA,MAC1B,CAAC;AAGD,iBAAW,MAAM;AACf,gBAAQ,MAAM,2CAA2C;AACzD,gBAAQ,KAAK,CAAC;AAAA,MAChB,GAAG,gBAAgB,EAAE,MAAM;AAAA,IAC7B,GAAG,iBAAiB;AAAA,EACtB,CAAC;AACH;","names":[]}
@@ -3,11 +3,7 @@ import { dirname, resolve } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import type { Plugin } from "vite";
5
5
 
6
- import {
7
- GENERATED_PATH,
8
- generatePluginsModule,
9
- parseCytarioPluginsEnv,
10
- } from "../bin-src/codegen";
6
+ import { GENERATED_PATH, generatePluginsModule, parseCytarioPluginsEnv } from "../bin-src/codegen";
11
7
 
12
8
  const HERE = dirname(fileURLToPath(import.meta.url));
13
9
  const ROOT = resolve(HERE, "..");
@@ -25,9 +21,7 @@ export function cytarioPlugins(): Plugin {
25
21
  if (didWrite) return;
26
22
  const input = parseCytarioPluginsEnv(process.env.CYTARIO_PLUGINS);
27
23
  const next = generatePluginsModule(input);
28
- const current = existsSync(FULL_PATH)
29
- ? readFileSync(FULL_PATH, "utf8")
30
- : "";
24
+ const current = existsSync(FULL_PATH) ? readFileSync(FULL_PATH, "utf8") : "";
31
25
  if (current !== next) {
32
26
  writeFileSync(FULL_PATH, next, "utf8");
33
27
  }