@gen3/workspaces 0.12.55 → 0.12.57
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.
- package/dist/dts/api/hatcheryApiHandler.d.ts.map +1 -1
- package/dist/dts/api/hatcheryApiHandler.js +3 -0
- package/dist/dts/api/hatcheryApiHandler.js.map +1 -1
- package/dist/dts/api/kernelApiHandler.d.ts.map +1 -1
- package/dist/dts/api/kernelApiHandler.js +0 -2
- package/dist/dts/api/kernelApiHandler.js.map +1 -1
- package/dist/dts/api/workspaceAssetsApi.d.ts +17 -0
- package/dist/dts/api/workspaceAssetsApi.d.ts.map +1 -1
- package/dist/dts/api/workspaceAssetsApi.js +115 -123
- package/dist/dts/api/workspaceAssetsApi.js.map +1 -1
- package/dist/dts/auth/auth.js +1 -1
- package/dist/dts/auth/auth.js.map +1 -1
- package/dist/dts/components/AutoFitIframe.d.ts +1 -1
- package/dist/dts/components/AutoFitIframe.d.ts.map +1 -1
- package/dist/dts/components/CodingAssistantPanel/CodingAssistantPanel.d.ts +2 -1
- package/dist/dts/components/CodingAssistantPanel/CodingAssistantPanel.d.ts.map +1 -1
- package/dist/dts/components/CodingAssistantPanel/CodingAssistantPanel.js +0 -1
- package/dist/dts/components/CodingAssistantPanel/CodingAssistantPanel.js.map +1 -1
- package/dist/dts/components/CodingAssistantPanel/CodingAssistantPanel.stories.d.ts +1 -1
- package/dist/dts/components/CodingAssistantPanel/MessageBubble.d.ts +3 -2
- package/dist/dts/components/CodingAssistantPanel/MessageBubble.d.ts.map +1 -1
- package/dist/dts/components/CodingAssistantPanel/MessageBubble.js +3 -3
- package/dist/dts/components/CodingAssistantPanel/MessageBubble.js.map +1 -1
- package/dist/dts/components/CodingAssistantPanel/MessageBubble.stories.d.ts +1 -1
- package/dist/dts/components/CompactDictionaryPanel/CompactDictionaryPanel.d.ts +2 -1
- package/dist/dts/components/CompactDictionaryPanel/CompactDictionaryPanel.d.ts.map +1 -1
- package/dist/dts/components/CompactDictionaryPanel/CompactDictionaryPanel.js.map +1 -1
- package/dist/dts/components/CompactDictionaryPanel/CompactDictionaryPanel.stories.d.ts +1 -1
- package/dist/dts/components/CompactDictionaryPanel/FieldLinkCountBadge.d.ts +2 -1
- package/dist/dts/components/CompactDictionaryPanel/FieldLinkCountBadge.d.ts.map +1 -1
- package/dist/dts/components/DataToolsPanel.d.ts +2 -1
- package/dist/dts/components/DataToolsPanel.d.ts.map +1 -1
- package/dist/dts/components/DataToolsPanel.stories.d.ts +1 -1
- package/dist/dts/components/DataToolsRail.d.ts +2 -1
- package/dist/dts/components/DataToolsRail.d.ts.map +1 -1
- package/dist/dts/components/DataToolsRail.stories.d.ts +1 -1
- package/dist/dts/components/HorizontalAccordian.d.ts +2 -1
- package/dist/dts/components/HorizontalAccordian.d.ts.map +1 -1
- package/dist/dts/components/InfrastructureRightPanel.d.ts +2 -1
- package/dist/dts/components/InfrastructureRightPanel.d.ts.map +1 -1
- package/dist/dts/components/InfrastructureRightPanel.stories.d.ts +1 -1
- package/dist/dts/components/KernelLifecyclePanel/ActiveKernelInfoPanel.d.ts +2 -1
- package/dist/dts/components/KernelLifecyclePanel/ActiveKernelInfoPanel.d.ts.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/ActiveKernelInfoPanel.js +2 -2
- package/dist/dts/components/KernelLifecyclePanel/ActiveKernelInfoPanel.js.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/ActiveKernelsPanel.d.ts +2 -1
- package/dist/dts/components/KernelLifecyclePanel/ActiveKernelsPanel.d.ts.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/ActiveKernelsPanel.js +12 -4
- package/dist/dts/components/KernelLifecyclePanel/ActiveKernelsPanel.js.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/ConnectionStatusBadge.d.ts +2 -1
- package/dist/dts/components/KernelLifecyclePanel/ConnectionStatusBadge.d.ts.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/ConnectionStatusBadge.js +1 -1
- package/dist/dts/components/KernelLifecyclePanel/ConnectionStatusBadge.js.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/ConnectionStatusBadge.stories.d.ts +1 -1
- package/dist/dts/components/KernelLifecyclePanel/GatewayConnectionPanel.d.ts +2 -1
- package/dist/dts/components/KernelLifecyclePanel/GatewayConnectionPanel.d.ts.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/GatewayConnectionPanel.js +5 -1
- package/dist/dts/components/KernelLifecyclePanel/GatewayConnectionPanel.js.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/KernelLifecyclePanel.d.ts +2 -1
- package/dist/dts/components/KernelLifecyclePanel/KernelLifecyclePanel.d.ts.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/KernelLifecyclePanel.js +2 -2
- package/dist/dts/components/KernelLifecyclePanel/KernelLifecyclePanel.js.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/KernelLifecyclePanel.stories.d.ts +1 -1
- package/dist/dts/components/KernelLifecyclePanel/KernelSelector.d.ts +2 -1
- package/dist/dts/components/KernelLifecyclePanel/KernelSelector.d.ts.map +1 -1
- package/dist/dts/components/KernelLifecyclePanel/KernelSelector.js +1 -1
- package/dist/dts/components/KernelLifecyclePanel/KernelSelector.js.map +1 -1
- package/dist/dts/components/MicroContainerPanel.stories.d.ts +3 -4
- package/dist/dts/components/MicroContainerPanel.stories.d.ts.map +1 -1
- package/dist/dts/components/MicroContainerReduxPanel.d.ts +2 -1
- package/dist/dts/components/MicroContainerReduxPanel.d.ts.map +1 -1
- package/dist/dts/components/MicroContainerReduxPanel.js +1 -1
- package/dist/dts/components/MicroContainerReduxPanel.js.map +1 -1
- package/dist/dts/components/TierSelectorLanding.d.ts +2 -1
- package/dist/dts/components/TierSelectorLanding.d.ts.map +1 -1
- package/dist/dts/components/TierSelectorLanding.stories.d.ts +1 -1
- package/dist/dts/components/UpgradeActionsPanel.d.ts +2 -1
- package/dist/dts/components/UpgradeActionsPanel.d.ts.map +1 -1
- package/dist/dts/components/UpgradeActionsPanel.stories.d.ts +1 -1
- package/dist/dts/components/WorkspaceTierCard.d.ts +2 -1
- package/dist/dts/components/WorkspaceTierCard.d.ts.map +1 -1
- package/dist/dts/components/WorkspaceTierCard.stories.d.ts +1 -1
- package/dist/dts/core/hatcheryApi.js +1 -1
- package/dist/dts/core/hatcheryApi.js.map +1 -1
- package/dist/dts/providers/JEGWorkspaceProvider.d.ts +2 -2
- package/dist/dts/providers/JEGWorkspaceProvider.d.ts.map +1 -1
- package/dist/dts/providers/MicroContainerReduxProvider.d.ts +2 -2
- package/dist/dts/providers/MicroContainerReduxProvider.d.ts.map +1 -1
- package/dist/dts/providers/WorkspacesGatewayProvider.d.ts +1 -1
- package/dist/dts/providers/WorkspacesGatewayProvider.d.ts.map +1 -1
- package/dist/dts/providers/useMicroContainerRedux.d.ts.map +1 -1
- package/dist/dts/providers/useMicroContainerRedux.js +4 -1
- package/dist/dts/providers/useMicroContainerRedux.js.map +1 -1
- package/dist/dts/server/kernelLifecycleProxy.js +2 -2
- package/dist/dts/server/kernelLifecycleProxy.js.map +1 -1
- package/dist/dts/server/withJupyterWorkspaces.js +1 -1
- package/dist/dts/server/withJupyterWorkspaces.js.map +1 -1
- package/dist/dts/server/workspaceAssetsHandler.d.ts +20 -1
- package/dist/dts/server/workspaceAssetsHandler.d.ts.map +1 -1
- package/dist/dts/server/workspaceAssetsHandler.js +71 -20
- package/dist/dts/server/workspaceAssetsHandler.js.map +1 -1
- package/dist/dts/workspace/WorkspaceCenter.d.ts +2 -1
- package/dist/dts/workspace/WorkspaceCenter.d.ts.map +1 -1
- package/dist/dts/workspace/WorkspaceLayout/SettingsPanel.d.ts +2 -1
- package/dist/dts/workspace/WorkspaceLayout/SettingsPanel.d.ts.map +1 -1
- package/dist/dts/workspace/WorkspaceLayout/ToolsPanel.d.ts +2 -1
- package/dist/dts/workspace/WorkspaceLayout/ToolsPanel.d.ts.map +1 -1
- package/dist/dts/workspace/WorkspaceLayout/WorkspaceLayout.d.ts +2 -2
- package/dist/dts/workspace/WorkspaceLayout/WorkspaceLayout.d.ts.map +1 -1
- package/dist/dts/workspace/tiers/FreeWorkspace.d.ts +2 -1
- package/dist/dts/workspace/tiers/FreeWorkspace.d.ts.map +1 -1
- package/dist/dts/workspace/tiers/FreeWorkspace.js.map +1 -1
- package/dist/index/cjs/index.js +41 -34
- package/dist/index/cjs/index.js.map +1 -1
- package/dist/index/esm/index.js +41 -34
- package/dist/index/esm/index.js.map +1 -1
- package/dist/jupyterlite-builds/free-private/requirements.txt +1 -1
- package/dist/jupyterlite-builds/remote-private/requirements.txt +1 -1
- package/dist/server/cjs/server.js +140 -131
- package/dist/server/cjs/server.js.map +1 -1
- package/dist/server/esm/server.js +140 -131
- package/dist/server/esm/server.js.map +1 -1
- package/dist/server.d.ts +38 -0
- package/jupyterlite-builds/free-private/requirements.txt +1 -1
- package/jupyterlite-builds/remote-private/requirements.txt +1 -1
- package/package.json +9 -8
- package/dist/dts/hooks/useMicroContainer.d.ts +0 -1
- package/dist/dts/hooks/useMicroContainer.d.ts.map +0 -1
- package/dist/dts/hooks/useMicroContainer.js +0 -319
- package/dist/dts/hooks/useMicroContainer.js.map +0 -1
package/dist/server.d.ts
CHANGED
|
@@ -15,6 +15,10 @@ declare const GEN3_HATCHERY_API: string;
|
|
|
15
15
|
* export default createWorkspaceAssetsHandler({
|
|
16
16
|
* gatewayBaseUrl: '/api/workspace/gateway/',
|
|
17
17
|
* });
|
|
18
|
+
*
|
|
19
|
+
* `workspaceAssetsApi` (this package's default wiring) builds its options from
|
|
20
|
+
* `<GEN3_FRONTEND_CONFIGURATION_ROOT>/<GEN3_COMMONS_NAME>/workspaceAssets.json`,
|
|
21
|
+
* so per-commons branding and gateway routing need no code changes.
|
|
18
22
|
*/
|
|
19
23
|
|
|
20
24
|
interface WorkspaceAssetsHandlerOptions {
|
|
@@ -31,6 +35,22 @@ interface WorkspaceAssetsHandlerOptions {
|
|
|
31
35
|
appName?: string;
|
|
32
36
|
/** Favicon URL injected into JupyterLite config data (opt-in branding). */
|
|
33
37
|
faviconUrl?: string;
|
|
38
|
+
/**
|
|
39
|
+
* `<title>` override for served JupyterLite HTML. Defaults to `appName` when
|
|
40
|
+
* omitted; set it when the window title should differ from the config-data
|
|
41
|
+
* `appName` JupyterLite reports internally.
|
|
42
|
+
*/
|
|
43
|
+
pageTitle?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Origin-relative path used to build the absolute `remoteKernelsBaseUrl`
|
|
46
|
+
* injected into the remote tier (e.g. `/lw-workspace/proxy/jeg-proxy`).
|
|
47
|
+
* The origin is resolved per-request from forwarding headers so JupyterLite
|
|
48
|
+
* does not resolve kernel endpoints relative to the assets route.
|
|
49
|
+
* Omitted → `remoteKernelsBaseUrl` is not injected.
|
|
50
|
+
*/
|
|
51
|
+
remoteKernelsPath?: string;
|
|
52
|
+
/** Override for the remote tier's `fullThemesUrl` (default: `/workspace-api/workspace-assets/remote/build/themes`). */
|
|
53
|
+
fullThemesUrl?: string;
|
|
34
54
|
}
|
|
35
55
|
declare function createWorkspaceAssetsHandler(options?: WorkspaceAssetsHandlerOptions): (req: NextApiRequest, res: NextApiResponse) => void;
|
|
36
56
|
|
|
@@ -161,6 +181,24 @@ interface KernelLifecycleProxyConfig {
|
|
|
161
181
|
}
|
|
162
182
|
declare function createKernelProxyHandler(config: KernelLifecycleProxyConfig): (req: NextApiRequest, res: NextApiResponse) => Promise<void>;
|
|
163
183
|
|
|
184
|
+
/**
|
|
185
|
+
* Next.js API route for JupyterLite static assets.
|
|
186
|
+
*
|
|
187
|
+
* The handler options are read from a per-commons JSON file:
|
|
188
|
+
*
|
|
189
|
+
* <GEN3_FRONTEND_CONFIGURATION_ROOT>/<GEN3_COMMONS_NAME>/workspaceAssets.json
|
|
190
|
+
*
|
|
191
|
+
* matching the convention used by the rest of the framework's server-side
|
|
192
|
+
* configuration (see `FilesystemContent` / `GEN3_FRONTEND_CONFIGURATION_ROOT`).
|
|
193
|
+
* The file is optional — DEFAULT_OPTIONS below is used when it is absent or
|
|
194
|
+
* unreadable, so a bad config never takes down the whole assets route.
|
|
195
|
+
*
|
|
196
|
+
* The upstream handler is built lazily on first request rather than at import
|
|
197
|
+
* time: `createWorkspaceAssetsHandler` recursively walks both tier asset trees
|
|
198
|
+
* when constructed, and this module is imported transitively by
|
|
199
|
+
* `next.config.js` (via `@gen3/workspaces/server`) where that I/O is wasted.
|
|
200
|
+
*/
|
|
201
|
+
|
|
164
202
|
declare function handler$3(req: NextApiRequest, res: NextApiResponse): void;
|
|
165
203
|
|
|
166
204
|
declare function handler$2(req: NextApiRequest, res: NextApiResponse): Promise<void>;
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gen3/workspaces",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.57",
|
|
4
4
|
"description": "Workspaces for Gen3",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"author": "Center for Translational Data Science",
|
|
8
8
|
"engines": {
|
|
9
|
-
"npm": ">=11.
|
|
10
|
-
"node": ">=24.
|
|
9
|
+
"npm": ">=11.16.0",
|
|
10
|
+
"node": ">=24.18.0"
|
|
11
11
|
},
|
|
12
12
|
"main": "dist/index/cjs/index.js",
|
|
13
13
|
"module": "dist/index/esm/index.js",
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"gen3-validate-jupyterlite": "dist/jupyterlite-builds/scripts/validate-jupyterlite-assets.sh"
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
|
21
|
-
"lint": "
|
|
21
|
+
"lint": "oxlint",
|
|
22
|
+
"lint:fix": "oxlint --fix",
|
|
22
23
|
"compile": "tsc",
|
|
23
24
|
"types": "tsc --emitDeclarationOnly",
|
|
24
25
|
"clean": "rm -rf dist",
|
|
@@ -51,8 +52,8 @@
|
|
|
51
52
|
"./jupyterlite-builds/*": "./dist/jupyterlite-builds/*"
|
|
52
53
|
},
|
|
53
54
|
"dependencies": {
|
|
54
|
-
"@gen3/core": "^0.12.
|
|
55
|
-
"@gen3/frontend": "^0.12.
|
|
55
|
+
"@gen3/core": "^0.12.57",
|
|
56
|
+
"@gen3/frontend": "^0.12.57",
|
|
56
57
|
"camelcase-keys": "^10.0.2"
|
|
57
58
|
},
|
|
58
59
|
"peerDependencies": {
|
|
@@ -63,10 +64,10 @@
|
|
|
63
64
|
"@mantine/modals": "^9.4.0",
|
|
64
65
|
"@mantine/notifications": "^9.4.0",
|
|
65
66
|
"mantine-react-table-open": "^9.0.3",
|
|
66
|
-
"next": "^16.2.
|
|
67
|
+
"next": "^16.2.12",
|
|
67
68
|
"react": "^19.2.4",
|
|
68
69
|
"react-dom": "^19.2.4",
|
|
69
70
|
"tailwindcss": "^3.4.18"
|
|
70
71
|
},
|
|
71
|
-
"gitHead": "
|
|
72
|
+
"gitHead": "7aa79afd104ef75cda892ec5cb0912aabbc6da3e"
|
|
72
73
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=useMicroContainer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useMicroContainer.d.ts","sourceRoot":"","sources":["../../../src/hooks/useMicroContainer.ts"],"names":[],"mappings":""}
|
|
@@ -1,319 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
-
// import { useDeepCompareEffect } from 'use-deep-compare';
|
|
4
|
-
//
|
|
5
|
-
// /* ------------------------------------------------------------------ */
|
|
6
|
-
// /* Types */
|
|
7
|
-
// /* ------------------------------------------------------------------ */
|
|
8
|
-
//
|
|
9
|
-
// export type MicroContainerStatus =
|
|
10
|
-
// | 'unknown'
|
|
11
|
-
// | 'not-running'
|
|
12
|
-
// | 'launching'
|
|
13
|
-
// | 'running'
|
|
14
|
-
// | 'terminating'
|
|
15
|
-
// | 'error';
|
|
16
|
-
//
|
|
17
|
-
// export type UseMicroContainerReturn = {
|
|
18
|
-
// /** Current lifecycle status of the micro container pod. */
|
|
19
|
-
// status: MicroContainerStatus;
|
|
20
|
-
// /** The Hatchery container hash/id matching the identifierTag (used for launch/terminate). */
|
|
21
|
-
// containerHash: string | null;
|
|
22
|
-
// /** Error message from the last operation, if any. */
|
|
23
|
-
// lastError: string | null;
|
|
24
|
-
// /** Launch the micro container. No-op if already launching or running. */
|
|
25
|
-
// launch: () => Promise<void>;
|
|
26
|
-
// /** Terminate the micro container. */
|
|
27
|
-
// terminate: () => Promise<void>;
|
|
28
|
-
// };
|
|
29
|
-
//
|
|
30
|
-
// /* ------------------------------------------------------------------ */
|
|
31
|
-
// /* Poll intervals (ms) */
|
|
32
|
-
// /* ------------------------------------------------------------------ */
|
|
33
|
-
//
|
|
34
|
-
// const POLL_INTERVALS = {
|
|
35
|
-
// 'not-running': 0, // stopped — no traffic
|
|
36
|
-
// launching: 5_000, // fast — user is waiting
|
|
37
|
-
// running: 30_000, // slow — just drift-check
|
|
38
|
-
// terminating: 5_000, // fast — waiting for pod deletion
|
|
39
|
-
// error: 0, // stopped on confirmed failure
|
|
40
|
-
// unknown: 10_000, // initial probe
|
|
41
|
-
// } as const;
|
|
42
|
-
//
|
|
43
|
-
// /* ------------------------------------------------------------------ */
|
|
44
|
-
// /* Hook */
|
|
45
|
-
// /* ------------------------------------------------------------------ */
|
|
46
|
-
//
|
|
47
|
-
// /**
|
|
48
|
-
// * Manages the lifecycle of a Hatchery-hosted micro container.
|
|
49
|
-
// *
|
|
50
|
-
// * The identifierTag is read from NEXT_PUBLIC_MICRO_CONTAINER_TAG by default;
|
|
51
|
-
// * override via the identifierTag prop for testing.
|
|
52
|
-
// *
|
|
53
|
-
// * Adaptive polling:
|
|
54
|
-
// * not-running → 0 ms (no polling — zero traffic when idle)
|
|
55
|
-
// * launching → 5 s (fast detection of pod Running)
|
|
56
|
-
// * running → 30 s (drift-check only)
|
|
57
|
-
// *
|
|
58
|
-
// * Visibility-change handler fires an immediate status check whenever
|
|
59
|
-
// * the tab becomes visible (covers tab-sleep / laptop-wake drops).
|
|
60
|
-
// */
|
|
61
|
-
// export function useMicroContainer({
|
|
62
|
-
// identifierTag,
|
|
63
|
-
// hatcheryBaseUrl = '/api/workspace/hatchery',
|
|
64
|
-
// jwt,
|
|
65
|
-
// enabled = true,
|
|
66
|
-
// }: {
|
|
67
|
-
// identifierTag?: string;
|
|
68
|
-
// /** Base URL of the Hatchery proxy API route. Default: /api/workspace/hatchery */
|
|
69
|
-
// hatcheryBaseUrl?: string;
|
|
70
|
-
// jwt?: string;
|
|
71
|
-
// /** When false, the hook is a no-op and returns 'not-running'. */
|
|
72
|
-
// enabled?: boolean;
|
|
73
|
-
// }): UseMicroContainerReturn {
|
|
74
|
-
// const tag =
|
|
75
|
-
// identifierTag ?? (process.env.NEXT_PUBLIC_MICRO_CONTAINER_TAG || '');
|
|
76
|
-
//
|
|
77
|
-
// const [status, setStatus] = useState<MicroContainerStatus>('unknown');
|
|
78
|
-
// const [containerHash, setContainerHash] = useState<string | null>(null);
|
|
79
|
-
// const [lastError, setLastError] = useState<string | null>(null);
|
|
80
|
-
//
|
|
81
|
-
// // Track current status in a ref so poll callbacks don't close over stale values
|
|
82
|
-
// const statusRef = useRef<MicroContainerStatus>('unknown');
|
|
83
|
-
// const mountedRef = useRef(true);
|
|
84
|
-
// const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);
|
|
85
|
-
// // Abort controllers for in-flight fetchOptions / fetchStatus requests.
|
|
86
|
-
// const optionsAbortRef = useRef<AbortController | null>(null);
|
|
87
|
-
// const statusAbortRef = useRef<AbortController | null>(null);
|
|
88
|
-
//
|
|
89
|
-
// const updateStatus = useCallback((s: MicroContainerStatus) => {
|
|
90
|
-
// statusRef.current = s;
|
|
91
|
-
// if (mountedRef.current) setStatus(s);
|
|
92
|
-
// }, []);
|
|
93
|
-
//
|
|
94
|
-
// /* ── Fetch /options once to resolve containerHash ── */
|
|
95
|
-
// const fetchOptions = useCallback(async (): Promise<string | null> => {
|
|
96
|
-
// if (!tag) return null;
|
|
97
|
-
// optionsAbortRef.current?.abort();
|
|
98
|
-
// const controller = new AbortController();
|
|
99
|
-
// optionsAbortRef.current = controller;
|
|
100
|
-
// try {
|
|
101
|
-
// const res = await fetch(`${hatcheryBaseUrl}/options`, {
|
|
102
|
-
// signal: controller.signal,
|
|
103
|
-
// credentials: 'include',
|
|
104
|
-
// headers: jwt ? { Authorization: `Bearer ${jwt}` } : {},
|
|
105
|
-
// });
|
|
106
|
-
// if (!res.ok) return null;
|
|
107
|
-
// // Hatchery /options returns an array of container specs
|
|
108
|
-
// const options = (await res.json()) as Array<{
|
|
109
|
-
// name?: string;
|
|
110
|
-
// hash?: string;
|
|
111
|
-
// id?: string;
|
|
112
|
-
// }>;
|
|
113
|
-
// const match = options.find((o) => o.name?.includes(tag));
|
|
114
|
-
// return match?.hash ?? match?.id ?? null;
|
|
115
|
-
// } catch (err) {
|
|
116
|
-
// if ((err as { name?: string }).name === 'AbortError') return null;
|
|
117
|
-
// return null;
|
|
118
|
-
// }
|
|
119
|
-
// }, [hatcheryBaseUrl, jwt, tag]);
|
|
120
|
-
//
|
|
121
|
-
// /* ── Poll /status ── */
|
|
122
|
-
// const fetchStatus = useCallback(async (): Promise<void> => {
|
|
123
|
-
// if (!mountedRef.current) return;
|
|
124
|
-
// statusAbortRef.current?.abort();
|
|
125
|
-
// const controller = new AbortController();
|
|
126
|
-
// statusAbortRef.current = controller;
|
|
127
|
-
//
|
|
128
|
-
// const hash = containerHash;
|
|
129
|
-
// const query = hash ? `?id=${encodeURIComponent(hash)}` : '';
|
|
130
|
-
// try {
|
|
131
|
-
// const res = await fetch(`${hatcheryBaseUrl}/status${query}`, {
|
|
132
|
-
// signal: controller.signal,
|
|
133
|
-
// credentials: 'include',
|
|
134
|
-
// headers: jwt ? { Authorization: `Bearer ${jwt}` } : {},
|
|
135
|
-
// });
|
|
136
|
-
// if (!mountedRef.current) return;
|
|
137
|
-
// if (!res.ok) {
|
|
138
|
-
// // 404 = no pod = not-running
|
|
139
|
-
// if (res.status === 404) {
|
|
140
|
-
// updateStatus('not-running');
|
|
141
|
-
// return;
|
|
142
|
-
// }
|
|
143
|
-
// throw new Error(`Status ${res.status}`);
|
|
144
|
-
// }
|
|
145
|
-
// const data = (await res.json()) as { status?: string };
|
|
146
|
-
// const raw = (data.status || '').toLowerCase();
|
|
147
|
-
//
|
|
148
|
-
// // While terminating, stay in that state until backend confirms gone
|
|
149
|
-
// if (statusRef.current === 'terminating') {
|
|
150
|
-
// if (raw === 'not-running' || raw === 'stopped' || raw === '') {
|
|
151
|
-
// updateStatus('not-running');
|
|
152
|
-
// }
|
|
153
|
-
// // else keep polling — pod still shutting down
|
|
154
|
-
// return;
|
|
155
|
-
// }
|
|
156
|
-
//
|
|
157
|
-
// if (raw === 'running') {
|
|
158
|
-
// updateStatus('running');
|
|
159
|
-
// setLastError(null);
|
|
160
|
-
// } else if (
|
|
161
|
-
// raw === 'launching' ||
|
|
162
|
-
// raw === 'pending' ||
|
|
163
|
-
// raw === 'starting'
|
|
164
|
-
// ) {
|
|
165
|
-
// updateStatus('launching');
|
|
166
|
-
// } else if (
|
|
167
|
-
// raw === 'not-running' ||
|
|
168
|
-
// raw === 'stopped' ||
|
|
169
|
-
// raw === 'terminated' ||
|
|
170
|
-
// raw === ''
|
|
171
|
-
// ) {
|
|
172
|
-
// updateStatus('not-running');
|
|
173
|
-
// } else if (raw === 'terminating' || raw === 'stopping') {
|
|
174
|
-
// // Pod is still shutting down — transition or stay in terminating, keep polling.
|
|
175
|
-
// updateStatus('terminating');
|
|
176
|
-
// } else {
|
|
177
|
-
// // Unknown state — treat as launching if we just launched, else not-running.
|
|
178
|
-
// if (statusRef.current === 'launching') {
|
|
179
|
-
// updateStatus('launching');
|
|
180
|
-
// } else {
|
|
181
|
-
// updateStatus('not-running');
|
|
182
|
-
// }
|
|
183
|
-
// }
|
|
184
|
-
// } catch (err) {
|
|
185
|
-
// if ((err as { name?: string }).name === 'AbortError') return;
|
|
186
|
-
// if (!mountedRef.current) return;
|
|
187
|
-
// const msg = err instanceof Error ? err.message : String(err);
|
|
188
|
-
// setLastError(msg);
|
|
189
|
-
// // Don't immediately go to error — could be a transient network issue
|
|
190
|
-
// if (statusRef.current !== 'launching') {
|
|
191
|
-
// updateStatus('not-running');
|
|
192
|
-
// }
|
|
193
|
-
// }
|
|
194
|
-
// }, [hatcheryBaseUrl, jwt, containerHash, updateStatus]);
|
|
195
|
-
//
|
|
196
|
-
// /* ── Manage poll interval based on status ── */
|
|
197
|
-
// const schedulePoll = useCallback(() => {
|
|
198
|
-
// if (intervalRef.current) {
|
|
199
|
-
// clearInterval(intervalRef.current);
|
|
200
|
-
// intervalRef.current = null;
|
|
201
|
-
// }
|
|
202
|
-
// const ms = POLL_INTERVALS[statusRef.current];
|
|
203
|
-
// if (ms > 0) {
|
|
204
|
-
// intervalRef.current = setInterval(() => {
|
|
205
|
-
// void fetchStatus();
|
|
206
|
-
// }, ms);
|
|
207
|
-
// }
|
|
208
|
-
// }, [fetchStatus]);
|
|
209
|
-
//
|
|
210
|
-
// /* ── Initial options fetch + status check on mount ── */
|
|
211
|
-
// useDeepCompareEffect(() => {
|
|
212
|
-
// if (!enabled) return;
|
|
213
|
-
// mountedRef.current = true;
|
|
214
|
-
//
|
|
215
|
-
// void (async () => {
|
|
216
|
-
// const hash = await fetchOptions();
|
|
217
|
-
// if (mountedRef.current && hash && !containerHash) {
|
|
218
|
-
// setContainerHash(hash);
|
|
219
|
-
// }
|
|
220
|
-
// await fetchStatus();
|
|
221
|
-
// schedulePoll();
|
|
222
|
-
// })();
|
|
223
|
-
//
|
|
224
|
-
// return () => {
|
|
225
|
-
// mountedRef.current = false;
|
|
226
|
-
// optionsAbortRef.current?.abort();
|
|
227
|
-
// statusAbortRef.current?.abort();
|
|
228
|
-
// if (intervalRef.current) clearInterval(intervalRef.current);
|
|
229
|
-
// };
|
|
230
|
-
// }, [containerHash, enabled, fetchOptions, fetchStatus, schedulePoll]);
|
|
231
|
-
//
|
|
232
|
-
// /* ── Reschedule poll when status changes ── */
|
|
233
|
-
// useEffect(() => {
|
|
234
|
-
// if (!enabled) return;
|
|
235
|
-
// schedulePoll();
|
|
236
|
-
// return () => {
|
|
237
|
-
// if (intervalRef.current) clearInterval(intervalRef.current);
|
|
238
|
-
// };
|
|
239
|
-
// }, [enabled, status, schedulePoll]);
|
|
240
|
-
//
|
|
241
|
-
// /* ── Visibility-change handler: immediate status check on tab-wake ── */
|
|
242
|
-
// useEffect(() => {
|
|
243
|
-
// if (!enabled) return;
|
|
244
|
-
// const handler = () => {
|
|
245
|
-
// if (document.visibilityState === 'visible') {
|
|
246
|
-
// void fetchStatus();
|
|
247
|
-
// }
|
|
248
|
-
// };
|
|
249
|
-
// document.addEventListener('visibilitychange', handler);
|
|
250
|
-
// return () => document.removeEventListener('visibilitychange', handler);
|
|
251
|
-
// }, [enabled, fetchStatus]);
|
|
252
|
-
//
|
|
253
|
-
// /* ── Actions ── */
|
|
254
|
-
//
|
|
255
|
-
// const launch = useCallback(async (): Promise<void> => {
|
|
256
|
-
// if (
|
|
257
|
-
// !enabled ||
|
|
258
|
-
// statusRef.current === 'launching' ||
|
|
259
|
-
// statusRef.current === 'running'
|
|
260
|
-
// )
|
|
261
|
-
// return;
|
|
262
|
-
// setLastError(null);
|
|
263
|
-
// updateStatus('launching');
|
|
264
|
-
//
|
|
265
|
-
// try {
|
|
266
|
-
// const hash = containerHash || (await fetchOptions());
|
|
267
|
-
// if (hash && !containerHash) setContainerHash(hash);
|
|
268
|
-
//
|
|
269
|
-
// const query = hash ? `?id=${encodeURIComponent(hash)}` : '';
|
|
270
|
-
// const res = await fetch(`${hatcheryBaseUrl}/launch${query}`, {
|
|
271
|
-
// method: 'POST',
|
|
272
|
-
// credentials: 'include',
|
|
273
|
-
// headers: jwt ? { Authorization: `Bearer ${jwt}` } : {},
|
|
274
|
-
// });
|
|
275
|
-
// if (!res.ok) {
|
|
276
|
-
// throw new Error(`Launch failed: ${res.status} ${res.statusText}`);
|
|
277
|
-
// }
|
|
278
|
-
// // Status will resolve to 'running' on the next poll
|
|
279
|
-
// } catch (err) {
|
|
280
|
-
// const msg = err instanceof Error ? err.message : String(err);
|
|
281
|
-
// setLastError(msg);
|
|
282
|
-
// updateStatus('error');
|
|
283
|
-
// }
|
|
284
|
-
// }, [
|
|
285
|
-
// enabled,
|
|
286
|
-
// updateStatus,
|
|
287
|
-
// containerHash,
|
|
288
|
-
// fetchOptions,
|
|
289
|
-
// hatcheryBaseUrl,
|
|
290
|
-
// jwt,
|
|
291
|
-
// ]);
|
|
292
|
-
//
|
|
293
|
-
// const terminate = useCallback(async (): Promise<void> => {
|
|
294
|
-
// setLastError(null);
|
|
295
|
-
// updateStatus('terminating');
|
|
296
|
-
//
|
|
297
|
-
// try {
|
|
298
|
-
// const hash = containerHash;
|
|
299
|
-
// const query = hash ? `?id=${encodeURIComponent(hash)}` : '';
|
|
300
|
-
// const res = await fetch(`${hatcheryBaseUrl}/terminate${query}`, {
|
|
301
|
-
// method: 'POST',
|
|
302
|
-
// credentials: 'include',
|
|
303
|
-
// headers: jwt ? { Authorization: `Bearer ${jwt}` } : {},
|
|
304
|
-
// });
|
|
305
|
-
// if (!res.ok && res.status !== 404) {
|
|
306
|
-
// throw new Error(`Terminate failed: ${res.status} ${res.statusText}`);
|
|
307
|
-
// }
|
|
308
|
-
// // Kick off an immediate status poll rather than waiting the full 5s interval.
|
|
309
|
-
// void fetchStatus();
|
|
310
|
-
// } catch (err) {
|
|
311
|
-
// const msg = err instanceof Error ? err.message : String(err);
|
|
312
|
-
// setLastError(msg);
|
|
313
|
-
// updateStatus('not-running');
|
|
314
|
-
// }
|
|
315
|
-
// }, [updateStatus, containerHash, hatcheryBaseUrl, jwt, fetchStatus]);
|
|
316
|
-
//
|
|
317
|
-
// return { status, containerHash, lastError, launch, terminate };
|
|
318
|
-
// }
|
|
319
|
-
//# sourceMappingURL=useMicroContainer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useMicroContainer.js","sourceRoot":"","sources":["../../../src/hooks/useMicroContainer.ts"],"names":[],"mappings":"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"}
|