@nosana/api 2.11.2 → 2.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/dist/client/createClient.d.ts +5 -3
- package/dist/client/createClient.d.ts.map +1 -1
- package/dist/client/createClient.js +4 -2
- package/dist/client/createClient.js.map +1 -1
- package/dist/client/deployment-manager/schema.d.ts +268 -41
- package/dist/client/deployment-manager/schema.d.ts.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/node/index.d.ts +23 -0
- package/dist/client/node/index.d.ts.map +1 -0
- package/dist/client/node/index.js +24 -0
- package/dist/client/node/index.js.map +1 -0
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +3 -0
- package/dist/defaults/index.js.map +1 -1
- package/dist/index.d.ts +32 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -7
- package/dist/index.js.map +1 -1
- package/dist/routes/auth/index.d.ts.map +1 -1
- package/dist/routes/auth/index.js +12 -0
- package/dist/routes/auth/index.js.map +1 -1
- package/dist/routes/auth/types.d.ts +8 -0
- package/dist/routes/auth/types.d.ts.map +1 -1
- package/dist/routes/deployments/deployment/actions/deploymentAddSshKeys.d.ts +9 -0
- package/dist/routes/deployments/deployment/actions/deploymentAddSshKeys.d.ts.map +1 -0
- package/dist/routes/deployments/deployment/actions/deploymentAddSshKeys.js +17 -0
- package/dist/routes/deployments/deployment/actions/deploymentAddSshKeys.js.map +1 -0
- package/dist/routes/deployments/deployment/actions/deploymentDuplicate.d.ts +17 -0
- package/dist/routes/deployments/deployment/actions/deploymentDuplicate.d.ts.map +1 -0
- package/dist/routes/deployments/deployment/actions/deploymentDuplicate.js +22 -0
- package/dist/routes/deployments/deployment/actions/deploymentDuplicate.js.map +1 -0
- package/dist/routes/deployments/deployment/actions/deploymentGetSshKeys.d.ts +7 -0
- package/dist/routes/deployments/deployment/actions/deploymentGetSshKeys.d.ts.map +1 -0
- package/dist/routes/deployments/deployment/actions/deploymentGetSshKeys.js +14 -0
- package/dist/routes/deployments/deployment/actions/deploymentGetSshKeys.js.map +1 -0
- package/dist/routes/deployments/deployment/actions/deploymentRemoveSshKeys.d.ts +9 -0
- package/dist/routes/deployments/deployment/actions/deploymentRemoveSshKeys.d.ts.map +1 -0
- package/dist/routes/deployments/deployment/actions/deploymentRemoveSshKeys.js +17 -0
- package/dist/routes/deployments/deployment/actions/deploymentRemoveSshKeys.js.map +1 -0
- package/dist/routes/deployments/deployment/actions/deploymentStream.d.ts.map +1 -1
- package/dist/routes/deployments/deployment/actions/deploymentStream.js +10 -30
- package/dist/routes/deployments/deployment/actions/deploymentStream.js.map +1 -1
- package/dist/routes/deployments/deployment/actions/deploymentUpdateMarket.d.ts +13 -0
- package/dist/routes/deployments/deployment/actions/deploymentUpdateMarket.d.ts.map +1 -0
- package/dist/routes/deployments/deployment/actions/deploymentUpdateMarket.js +24 -0
- package/dist/routes/deployments/deployment/actions/deploymentUpdateMarket.js.map +1 -0
- package/dist/routes/deployments/deployment/actions/index.d.ts +5 -0
- package/dist/routes/deployments/deployment/actions/index.d.ts.map +1 -1
- package/dist/routes/deployments/deployment/actions/index.js +5 -0
- package/dist/routes/deployments/deployment/actions/index.js.map +1 -1
- package/dist/routes/deployments/deployment/createDeployment.d.ts.map +1 -1
- package/dist/routes/deployments/deployment/createDeployment.js +95 -12
- package/dist/routes/deployments/deployment/createDeployment.js.map +1 -1
- package/dist/routes/deployments/types.d.ts +51 -11
- package/dist/routes/deployments/types.d.ts.map +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +1 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/jobs/index.d.ts +8 -2
- package/dist/routes/jobs/index.d.ts.map +1 -1
- package/dist/routes/jobs/index.js +28 -14
- package/dist/routes/jobs/index.js.map +1 -1
- package/dist/routes/jobs/types.d.ts +16 -1
- package/dist/routes/jobs/types.d.ts.map +1 -1
- package/dist/routes/node/__tests__/fixtures.d.ts +30 -0
- package/dist/routes/node/__tests__/fixtures.d.ts.map +1 -0
- package/dist/routes/node/__tests__/fixtures.js +38 -0
- package/dist/routes/node/__tests__/fixtures.js.map +1 -0
- package/dist/routes/node/actions/authorization.d.ts +4 -0
- package/dist/routes/node/actions/authorization.d.ts.map +1 -0
- package/dist/routes/node/actions/authorization.js +9 -0
- package/dist/routes/node/actions/authorization.js.map +1 -0
- package/dist/routes/node/actions/nodeInfo.d.ts +4 -0
- package/dist/routes/node/actions/nodeInfo.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeInfo.js +9 -0
- package/dist/routes/node/actions/nodeInfo.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/index.d.ts +14 -0
- package/dist/routes/node/actions/nodeJob/index.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/index.js +14 -0
- package/dist/routes/node/actions/nodeJob/index.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobDefinition.d.ts +4 -0
- package/dist/routes/node/actions/nodeJob/nodeJobDefinition.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobDefinition.js +9 -0
- package/dist/routes/node/actions/nodeJob/nodeJobDefinition.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobEndpoints.d.ts +4 -0
- package/dist/routes/node/actions/nodeJob/nodeJobEndpoints.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobEndpoints.js +9 -0
- package/dist/routes/node/actions/nodeJob/nodeJobEndpoints.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobGroup.d.ts +4 -0
- package/dist/routes/node/actions/nodeJob/nodeJobGroup.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobGroup.js +11 -0
- package/dist/routes/node/actions/nodeJob/nodeJobGroup.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobOperation.d.ts +3 -0
- package/dist/routes/node/actions/nodeJob/nodeJobOperation.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobOperation.js +9 -0
- package/dist/routes/node/actions/nodeJob/nodeJobOperation.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobOperations.d.ts +4 -0
- package/dist/routes/node/actions/nodeJob/nodeJobOperations.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobOperations.js +9 -0
- package/dist/routes/node/actions/nodeJob/nodeJobOperations.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobResults.d.ts +4 -0
- package/dist/routes/node/actions/nodeJob/nodeJobResults.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobResults.js +9 -0
- package/dist/routes/node/actions/nodeJob/nodeJobResults.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobStats.d.ts +4 -0
- package/dist/routes/node/actions/nodeJob/nodeJobStats.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/nodeJobStats.js +9 -0
- package/dist/routes/node/actions/nodeJob/nodeJobStats.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/restartNodeJobGroup.d.ts +3 -0
- package/dist/routes/node/actions/nodeJob/restartNodeJobGroup.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/restartNodeJobGroup.js +10 -0
- package/dist/routes/node/actions/nodeJob/restartNodeJobGroup.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/restartNodeJobOperation.d.ts +3 -0
- package/dist/routes/node/actions/nodeJob/restartNodeJobOperation.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/restartNodeJobOperation.js +10 -0
- package/dist/routes/node/actions/nodeJob/restartNodeJobOperation.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/setNodeJobDefinition.d.ts +4 -0
- package/dist/routes/node/actions/nodeJob/setNodeJobDefinition.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/setNodeJobDefinition.js +12 -0
- package/dist/routes/node/actions/nodeJob/setNodeJobDefinition.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJob.d.ts +3 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJob.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJob.js +11 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJob.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJobGroup.d.ts +3 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJobGroup.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJobGroup.js +10 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJobGroup.js.map +1 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJobOperation.d.ts +3 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJobOperation.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJobOperation.js +10 -0
- package/dist/routes/node/actions/nodeJob/stopNodeJobOperation.js.map +1 -0
- package/dist/routes/node/actions/nodeJobSsh/index.d.ts +4 -0
- package/dist/routes/node/actions/nodeJobSsh/index.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJobSsh/index.js +4 -0
- package/dist/routes/node/actions/nodeJobSsh/index.js.map +1 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshAdd.d.ts +5 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshAdd.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshAdd.js +25 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshAdd.js.map +1 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshKeys.d.ts +4 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshKeys.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshKeys.js +12 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshKeys.js.map +1 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshRemove.d.ts +4 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshRemove.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshRemove.js +14 -0
- package/dist/routes/node/actions/nodeJobSsh/nodeJobSshRemove.js.map +1 -0
- package/dist/routes/node/actions/nodeJobStreams/index.d.ts +3 -0
- package/dist/routes/node/actions/nodeJobStreams/index.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJobStreams/index.js +3 -0
- package/dist/routes/node/actions/nodeJobStreams/index.js.map +1 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeJobInfoStream.d.ts +4 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeJobInfoStream.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeJobInfoStream.js +5 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeJobInfoStream.js.map +1 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeJobStatsStream.d.ts +4 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeJobStatsStream.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeJobStatsStream.js +6 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeJobStatsStream.js.map +1 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeStream.d.ts +5 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeStream.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeStream.js +10 -0
- package/dist/routes/node/actions/nodeJobStreams/nodeStream.js.map +1 -0
- package/dist/routes/node/actions/nodeSocket/index.d.ts +4 -0
- package/dist/routes/node/actions/nodeSocket/index.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeSocket/index.js +4 -0
- package/dist/routes/node/actions/nodeSocket/index.js.map +1 -0
- package/dist/routes/node/actions/nodeSocket/nodeJobLogs.d.ts +3 -0
- package/dist/routes/node/actions/nodeSocket/nodeJobLogs.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeSocket/nodeJobLogs.js +10 -0
- package/dist/routes/node/actions/nodeSocket/nodeJobLogs.js.map +1 -0
- package/dist/routes/node/actions/nodeSocket/nodeJobStatus.d.ts +3 -0
- package/dist/routes/node/actions/nodeSocket/nodeJobStatus.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeSocket/nodeJobStatus.js +5 -0
- package/dist/routes/node/actions/nodeSocket/nodeJobStatus.js.map +1 -0
- package/dist/routes/node/actions/nodeSocket/socket.d.ts +19 -0
- package/dist/routes/node/actions/nodeSocket/socket.d.ts.map +1 -0
- package/dist/routes/node/actions/nodeSocket/socket.js +38 -0
- package/dist/routes/node/actions/nodeSocket/socket.js.map +1 -0
- package/dist/routes/node/actions/terminal/grant.d.ts +21 -0
- package/dist/routes/node/actions/terminal/grant.d.ts.map +1 -0
- package/dist/routes/node/actions/terminal/grant.js +28 -0
- package/dist/routes/node/actions/terminal/grant.js.map +1 -0
- package/dist/routes/node/actions/terminal/openTerminal.d.ts +4 -0
- package/dist/routes/node/actions/terminal/openTerminal.d.ts.map +1 -0
- package/dist/routes/node/actions/terminal/openTerminal.js +22 -0
- package/dist/routes/node/actions/terminal/openTerminal.js.map +1 -0
- package/dist/routes/node/actions/terminal/session.d.ts +7 -0
- package/dist/routes/node/actions/terminal/session.d.ts.map +1 -0
- package/dist/routes/node/actions/terminal/session.js +133 -0
- package/dist/routes/node/actions/terminal/session.js.map +1 -0
- package/dist/routes/node/createNodeJob.d.ts +3 -0
- package/dist/routes/node/createNodeJob.d.ts.map +1 -0
- package/dist/routes/node/createNodeJob.js +39 -0
- package/dist/routes/node/createNodeJob.js.map +1 -0
- package/dist/routes/node/index.d.ts +8 -0
- package/dist/routes/node/index.d.ts.map +1 -0
- package/dist/routes/node/index.js +21 -0
- package/dist/routes/node/index.js.map +1 -0
- package/dist/routes/node/types.d.ts +148 -0
- package/dist/routes/node/types.d.ts.map +1 -0
- package/dist/routes/node/types.js +2 -0
- package/dist/routes/node/types.js.map +1 -0
- package/dist/types.d.ts +31 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/eventStream.d.ts +15 -0
- package/dist/utils/eventStream.d.ts.map +1 -0
- package/dist/utils/eventStream.js +36 -0
- package/dist/utils/eventStream.js.map +1 -0
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +10 -0
- package/dist/utils/json.js.map +1 -0
- package/package.json +7 -3
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { NOSANA_API_AUTH_MESSAGE } from '../../../../client/createClient.js';
|
|
2
|
+
import { tryParseJson } from '../../../../utils/json.js';
|
|
3
|
+
import { requireNodeAuthorization } from '../authorization.js';
|
|
4
|
+
/** The node's WebSocket endpoint, derived from the client's HTTP base URL. */
|
|
5
|
+
export function nodeSocketUrl(client, path = '') {
|
|
6
|
+
return `${client.connection.baseUrl.replace(/^http/, 'ws')}${path}`;
|
|
7
|
+
}
|
|
8
|
+
/** A fresh socket to the node, from the caller's factory or the runtime's `WebSocket`. */
|
|
9
|
+
export function openNodeWebSocket(client, path, factory = (url) => new WebSocket(url)) {
|
|
10
|
+
return factory(nodeSocketUrl(client, path));
|
|
11
|
+
}
|
|
12
|
+
export function openNodeSocket(context, handshake, handlers, parse, options = {}) {
|
|
13
|
+
const authorize = requireNodeAuthorization(context, options.authorizationProvider);
|
|
14
|
+
const socket = openNodeWebSocket(context.client, '', options.webSocketFactory);
|
|
15
|
+
socket.onopen = async () => {
|
|
16
|
+
try {
|
|
17
|
+
socket.send(JSON.stringify({ ...handshake, header: await authorize(NOSANA_API_AUTH_MESSAGE) }));
|
|
18
|
+
handlers.onOpen?.();
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
handlers.onError?.(error);
|
|
22
|
+
socket.close();
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
socket.onmessage = (event) => {
|
|
26
|
+
if (typeof event.data !== 'string')
|
|
27
|
+
return;
|
|
28
|
+
const frame = tryParseJson(event.data);
|
|
29
|
+
if (typeof frame !== 'object' || frame === null)
|
|
30
|
+
return;
|
|
31
|
+
const data = parse(frame.data);
|
|
32
|
+
if (data !== undefined)
|
|
33
|
+
handlers.onData(data);
|
|
34
|
+
};
|
|
35
|
+
socket.onerror = (event) => handlers.onError?.(event);
|
|
36
|
+
return { close: () => socket.close() };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../../src/routes/node/actions/nodeSocket/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAoB/D,8EAA8E;AAC9E,MAAM,UAAU,aAAa,CAAC,MAAkB,EAAE,IAAI,GAAG,EAAE;IACzD,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;AACtE,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,iBAAiB,CAC/B,MAAkB,EAClB,IAAY,EACZ,UAAsC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC;IAEjE,OAAO,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAuB,EACvB,SAA8B,EAC9B,QAA+B,EAC/B,KAAuC,EACvC,UAA6B,EAAE;IAE/B,MAAM,SAAS,GAAG,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE/E,MAAM,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC;YAChG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,CAAC,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE;QACzC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAA0C,CAAC;QAChF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS;YAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC;IACF,MAAM,CAAC,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAE7D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { buildTerminalAuthorizationMessage, isSafeTerminalOperation, TERMINAL_AUTHORIZATION_AUDIENCE, TERMINAL_AUTHORIZATION_MAX_TTL_MS, TERMINAL_AUTHORIZATION_MESSAGE_HEADER } from '@nosana/ssh';
|
|
2
|
+
import type { NodeAuthorizationProvider, TerminalAuthorizationGrant } from '../../types.js';
|
|
3
|
+
export { buildTerminalAuthorizationMessage, isSafeTerminalOperation, TERMINAL_AUTHORIZATION_AUDIENCE, TERMINAL_AUTHORIZATION_MAX_TTL_MS, TERMINAL_AUTHORIZATION_MESSAGE_HEADER, };
|
|
4
|
+
export type { TerminalAuthorizationMessageOptions } from '@nosana/ssh';
|
|
5
|
+
export declare const DEFAULT_TERMINAL_AUTHORIZATION_TTL_MS: number;
|
|
6
|
+
export interface CreateTerminalAuthorizationGrantOptions {
|
|
7
|
+
job: string;
|
|
8
|
+
node: string;
|
|
9
|
+
network: string;
|
|
10
|
+
op?: string;
|
|
11
|
+
ttlMs?: number;
|
|
12
|
+
now?: Date;
|
|
13
|
+
authorize: NodeAuthorizationProvider;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Signs a short-lived grant for one terminal session on one job. The node
|
|
17
|
+
* verifies the raw signature over the message, so it is pulled back out of
|
|
18
|
+
* the `message:signature` authorization string the signer produces.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createTerminalAuthorizationGrant({ job, node, network, op, ttlMs, now, authorize, }: CreateTerminalAuthorizationGrantOptions): Promise<TerminalAuthorizationGrant>;
|
|
21
|
+
//# sourceMappingURL=grant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant.d.ts","sourceRoot":"","sources":["../../../../../src/routes/node/actions/terminal/grant.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,iCAAiC,EACjC,uBAAuB,EACvB,+BAA+B,EAC/B,iCAAiC,EACjC,qCAAqC,EACtC,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAI5F,OAAO,EACL,iCAAiC,EACjC,uBAAuB,EACvB,+BAA+B,EAC/B,iCAAiC,EACjC,qCAAqC,GACtC,CAAC;AACF,YAAY,EAAE,mCAAmC,EAAE,MAAM,aAAa,CAAC;AAEvE,eAAO,MAAM,qCAAqC,QAAgB,CAAC;AAEnE,MAAM,WAAW,uCAAuC;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,yBAAyB,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAsB,gCAAgC,CAAC,EACrD,GAAG,EACH,IAAI,EACJ,OAAO,EACP,EAAE,EACF,KAA6C,EAC7C,GAAgB,EAChB,SAAS,GACV,EAAE,uCAAuC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAmB/E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { parseAuthorization } from '@nosana/authorization';
|
|
2
|
+
import { bytesToBase64, buildTerminalAuthorizationMessage, isSafeTerminalOperation, TERMINAL_AUTHORIZATION_AUDIENCE, TERMINAL_AUTHORIZATION_MAX_TTL_MS, TERMINAL_AUTHORIZATION_MESSAGE_HEADER, } from '@nosana/ssh';
|
|
3
|
+
// The message contract now lives in @nosana/ssh, shared with the node; re-exported
|
|
4
|
+
// here so existing importers of this module keep resolving it.
|
|
5
|
+
export { buildTerminalAuthorizationMessage, isSafeTerminalOperation, TERMINAL_AUTHORIZATION_AUDIENCE, TERMINAL_AUTHORIZATION_MAX_TTL_MS, TERMINAL_AUTHORIZATION_MESSAGE_HEADER, };
|
|
6
|
+
export const DEFAULT_TERMINAL_AUTHORIZATION_TTL_MS = 4 * 60 * 1000;
|
|
7
|
+
/**
|
|
8
|
+
* Signs a short-lived grant for one terminal session on one job. The node
|
|
9
|
+
* verifies the raw signature over the message, so it is pulled back out of
|
|
10
|
+
* the `message:signature` authorization string the signer produces.
|
|
11
|
+
*/
|
|
12
|
+
export async function createTerminalAuthorizationGrant({ job, node, network, op, ttlMs = DEFAULT_TERMINAL_AUTHORIZATION_TTL_MS, now = new Date(), authorize, }) {
|
|
13
|
+
if (ttlMs <= 0 || ttlMs > TERMINAL_AUTHORIZATION_MAX_TTL_MS) {
|
|
14
|
+
throw new Error(`Terminal authorization TTL must be between 1 and ${TERMINAL_AUTHORIZATION_MAX_TTL_MS} milliseconds.`);
|
|
15
|
+
}
|
|
16
|
+
if (op && !isSafeTerminalOperation(op)) {
|
|
17
|
+
throw new Error('Invalid terminal operation selector.');
|
|
18
|
+
}
|
|
19
|
+
const expiresAt = new Date(now.getTime() + ttlMs).toISOString();
|
|
20
|
+
const message = buildTerminalAuthorizationMessage({ job, node, expiresAt, op, network });
|
|
21
|
+
// A grant is scoped to this job, operation and expiry. It must neither reuse
|
|
22
|
+
// a cached API authentication header nor replace one in a wallet's store.
|
|
23
|
+
const { signature } = parseAuthorization(await authorize(message, { skipCache: true }), {
|
|
24
|
+
expected_message: message,
|
|
25
|
+
});
|
|
26
|
+
return { message, signature: bytesToBase64(signature), expiresAt };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=grant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant.js","sourceRoot":"","sources":["../../../../../src/routes/node/actions/terminal/grant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,aAAa,EACb,iCAAiC,EACjC,uBAAuB,EACvB,+BAA+B,EAC/B,iCAAiC,EACjC,qCAAqC,GACtC,MAAM,aAAa,CAAC;AAIrB,mFAAmF;AACnF,+DAA+D;AAC/D,OAAO,EACL,iCAAiC,EACjC,uBAAuB,EACvB,+BAA+B,EAC/B,iCAAiC,EACjC,qCAAqC,GACtC,CAAC;AAGF,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAYnE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,EACrD,GAAG,EACH,IAAI,EACJ,OAAO,EACP,EAAE,EACF,KAAK,GAAG,qCAAqC,EAC7C,GAAG,GAAG,IAAI,IAAI,EAAE,EAChB,SAAS,GAC+B;IACxC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,iCAAiC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CACb,oDAAoD,iCAAiC,gBAAgB,CACtG,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,OAAO,GAAG,iCAAiC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACzF,6EAA6E;IAC7E,0EAA0E;IAC1E,MAAM,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE;QACtF,gBAAgB,EAAE,OAAO;KAC1B,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { NodeJobContext, NodeTerminalOptions, TerminalSession } from '../../types.js';
|
|
2
|
+
/** Signs a short-lived grant for the job, then hands a fresh WebSocket to a session. */
|
|
3
|
+
export declare function openNodeJobTerminal(context: NodeJobContext, options: NodeTerminalOptions): Promise<TerminalSession>;
|
|
4
|
+
//# sourceMappingURL=openTerminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openTerminal.d.ts","sourceRoot":"","sources":["../../../../../src/routes/node/actions/terminal/openTerminal.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE3F,wFAAwF;AACxF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAiB1B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { requireNodeAuthorization } from '../authorization.js';
|
|
2
|
+
import { openNodeWebSocket } from '../nodeSocket/index.js';
|
|
3
|
+
import { createTerminalAuthorizationGrant } from './grant.js';
|
|
4
|
+
import { openTerminalSession } from './session.js';
|
|
5
|
+
/** Signs a short-lived grant for the job, then hands a fresh WebSocket to a session. */
|
|
6
|
+
export async function openNodeJobTerminal(context, options) {
|
|
7
|
+
options.signal?.throwIfAborted();
|
|
8
|
+
const authorize = requireNodeAuthorization(context, options.authorizationProvider);
|
|
9
|
+
options.onStatus?.('authorizing');
|
|
10
|
+
const authorization = await createTerminalAuthorizationGrant({
|
|
11
|
+
job: context.job,
|
|
12
|
+
node: context.node,
|
|
13
|
+
network: context.environment,
|
|
14
|
+
op: options.op,
|
|
15
|
+
ttlMs: options.ttlMs,
|
|
16
|
+
authorize,
|
|
17
|
+
});
|
|
18
|
+
options.signal?.throwIfAborted();
|
|
19
|
+
const socket = openNodeWebSocket(context.client, '/terminal', options.webSocketFactory);
|
|
20
|
+
return openTerminalSession(socket, context.job, authorization, options);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=openTerminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openTerminal.js","sourceRoot":"","sources":["../../../../../src/routes/node/actions/terminal/openTerminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gCAAgC,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAInD,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAuB,EACvB,OAA4B;IAE5B,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACnF,OAAO,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC;IAElC,MAAM,aAAa,GAAG,MAAM,gCAAgC,CAAC;QAC3D,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,WAAW;QAC5B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS;KACV,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAEjC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxF,OAAO,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { NodeTerminalOptions, TerminalAuthorizationGrant, TerminalSession } from '../../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Drives one terminal WebSocket: sends the signed handshake once the socket
|
|
4
|
+
* opens, relays frames in both directions, and reports each status change once.
|
|
5
|
+
*/
|
|
6
|
+
export declare function openTerminalSession(socket: WebSocket, job: string, authorization: TerminalAuthorizationGrant, options: NodeTerminalOptions): TerminalSession;
|
|
7
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../../src/routes/node/actions/terminal/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AAgBxB;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,0BAA0B,EACzC,OAAO,EAAE,mBAAmB,GAC3B,eAAe,CA+FjB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { tryParseJson } from '../../../../utils/json.js';
|
|
2
|
+
const WEB_SOCKET_OPEN = 1;
|
|
3
|
+
const DEFAULT_CONNECTION_TIMEOUT_MS = 10000;
|
|
4
|
+
const UNREACHABLE = 'Could not reach the node terminal.';
|
|
5
|
+
const encoder = new TextEncoder();
|
|
6
|
+
/**
|
|
7
|
+
* Drives one terminal WebSocket: sends the signed handshake once the socket
|
|
8
|
+
* opens, relays frames in both directions, and reports each status change once.
|
|
9
|
+
*/
|
|
10
|
+
export function openTerminalSession(socket, job, authorization, options) {
|
|
11
|
+
let phase = 'connecting';
|
|
12
|
+
const report = (status, detail) => options.onStatus?.(status, detail);
|
|
13
|
+
const timeout = setTimeout(() => end('error', 'The node terminal did not respond in time.'), options.timeoutMs ?? DEFAULT_CONNECTION_TIMEOUT_MS);
|
|
14
|
+
/** Ends the session once; later calls are ignored. */
|
|
15
|
+
function end(status, detail) {
|
|
16
|
+
if (phase === 'closed')
|
|
17
|
+
return;
|
|
18
|
+
phase = 'closed';
|
|
19
|
+
clearTimeout(timeout);
|
|
20
|
+
options.signal?.removeEventListener('abort', close);
|
|
21
|
+
socket.onopen = socket.onmessage = socket.onclose = socket.onerror = null;
|
|
22
|
+
closeQuietly(socket);
|
|
23
|
+
report(status, detail);
|
|
24
|
+
}
|
|
25
|
+
function close() {
|
|
26
|
+
end('closed');
|
|
27
|
+
}
|
|
28
|
+
function connected() {
|
|
29
|
+
if (phase !== 'connecting')
|
|
30
|
+
return;
|
|
31
|
+
phase = 'connected';
|
|
32
|
+
clearTimeout(timeout);
|
|
33
|
+
report('connected');
|
|
34
|
+
}
|
|
35
|
+
function send(frame) {
|
|
36
|
+
if (socket.readyState === WEB_SOCKET_OPEN)
|
|
37
|
+
socket.send(JSON.stringify(frame));
|
|
38
|
+
}
|
|
39
|
+
/** Terminal output; the first frame of any kind means the node accepted the session. */
|
|
40
|
+
function deliver(bytes) {
|
|
41
|
+
if (phase === 'closed')
|
|
42
|
+
return;
|
|
43
|
+
connected();
|
|
44
|
+
options.onData(bytes);
|
|
45
|
+
}
|
|
46
|
+
function receive(frame) {
|
|
47
|
+
if (frame.kind === 'error') {
|
|
48
|
+
end('error', frame.message);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (frame.kind === 'data') {
|
|
52
|
+
deliver(frame.bytes);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
connected();
|
|
56
|
+
if (frame.kind === 'exit')
|
|
57
|
+
options.onExit?.(frame.code);
|
|
58
|
+
}
|
|
59
|
+
socket.binaryType = 'arraybuffer';
|
|
60
|
+
socket.onopen = () => socket.send(JSON.stringify({
|
|
61
|
+
path: '/terminal',
|
|
62
|
+
body: {
|
|
63
|
+
jobAddress: job,
|
|
64
|
+
message: authorization.message,
|
|
65
|
+
signature: authorization.signature,
|
|
66
|
+
op: options.op,
|
|
67
|
+
cols: options.cols,
|
|
68
|
+
rows: options.rows,
|
|
69
|
+
},
|
|
70
|
+
}));
|
|
71
|
+
socket.onmessage = (event) => {
|
|
72
|
+
if (typeof event.data === 'string') {
|
|
73
|
+
receive(parseTextFrame(event.data));
|
|
74
|
+
}
|
|
75
|
+
else if (typeof Blob !== 'undefined' && event.data instanceof Blob) {
|
|
76
|
+
void event.data.arrayBuffer().then((buffer) => deliver(new Uint8Array(buffer)));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const bytes = viewBytes(event.data);
|
|
80
|
+
if (bytes)
|
|
81
|
+
deliver(bytes);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
socket.onclose = (event) => {
|
|
85
|
+
const abnormal = event.code >= 3000 || event.code === 1006 || event.code === 1011;
|
|
86
|
+
end(abnormal ? 'error' : 'closed', event.reason || (abnormal ? UNREACHABLE : undefined));
|
|
87
|
+
};
|
|
88
|
+
socket.onerror = () => end('error', UNREACHABLE);
|
|
89
|
+
options.signal?.addEventListener('abort', close, { once: true });
|
|
90
|
+
report('connecting');
|
|
91
|
+
return {
|
|
92
|
+
authorization,
|
|
93
|
+
socket,
|
|
94
|
+
sendInput: (data) => send({ type: 'stdin', data }),
|
|
95
|
+
resize: (cols, rows) => send({ type: 'resize', cols, rows }),
|
|
96
|
+
close,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Text frames are JSON control messages; anything that is not JSON is terminal output. */
|
|
100
|
+
function parseTextFrame(text) {
|
|
101
|
+
const payload = tryParseJson(text);
|
|
102
|
+
if (payload === undefined)
|
|
103
|
+
return { kind: 'data', bytes: encoder.encode(text) };
|
|
104
|
+
if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {
|
|
105
|
+
return { kind: 'control' };
|
|
106
|
+
}
|
|
107
|
+
const frame = payload;
|
|
108
|
+
if (frame.type === 'error') {
|
|
109
|
+
const message = typeof frame.message === 'string' ? frame.message : undefined;
|
|
110
|
+
return { kind: 'error', message: message ?? 'Terminal connection failed.' };
|
|
111
|
+
}
|
|
112
|
+
if (frame.type === 'exit') {
|
|
113
|
+
return { kind: 'exit', code: typeof frame.code === 'number' ? frame.code : null };
|
|
114
|
+
}
|
|
115
|
+
return { kind: 'control' };
|
|
116
|
+
}
|
|
117
|
+
function viewBytes(data) {
|
|
118
|
+
if (data instanceof ArrayBuffer)
|
|
119
|
+
return new Uint8Array(data);
|
|
120
|
+
if (ArrayBuffer.isView(data)) {
|
|
121
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
122
|
+
}
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
function closeQuietly(socket) {
|
|
126
|
+
try {
|
|
127
|
+
socket.close();
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Already closing or closed.
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../../../src/routes/node/actions/terminal/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNodeJob.d.ts","sourceRoot":"","sources":["../../../src/routes/node/createNodeJob.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CAgCjE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createSshCommand } from '@nosana/ssh';
|
|
2
|
+
import { nodeJobDefinition, nodeJobEndpoints, nodeJobGroup, nodeJobOperation, nodeJobOperations, nodeJobResults, nodeJobStats, restartNodeJobGroup, restartNodeJobOperation, setNodeJobDefinition, stopNodeJob, stopNodeJobGroup, stopNodeJobOperation, } from './actions/nodeJob/index.js';
|
|
3
|
+
import { nodeJobSshAdd, nodeJobSshKeys, nodeJobSshRemove } from './actions/nodeJobSsh/index.js';
|
|
4
|
+
import { nodeJobInfoStream, nodeJobStatsStream } from './actions/nodeJobStreams/index.js';
|
|
5
|
+
import { nodeJobLogs, nodeJobStatus } from './actions/nodeSocket/index.js';
|
|
6
|
+
import { openNodeJobTerminal } from './actions/terminal/openTerminal.js';
|
|
7
|
+
export function createNodeJob(context) {
|
|
8
|
+
const { client, job, node } = context;
|
|
9
|
+
const target = { job, node, nodeDomain: context.domain };
|
|
10
|
+
return {
|
|
11
|
+
address: job,
|
|
12
|
+
node,
|
|
13
|
+
definition: () => nodeJobDefinition(client, job),
|
|
14
|
+
setDefinition: (definition) => setNodeJobDefinition(client, job, definition),
|
|
15
|
+
results: () => nodeJobResults(client, job),
|
|
16
|
+
operations: () => nodeJobOperations(client, job),
|
|
17
|
+
operation: (op) => nodeJobOperation(client, job, op),
|
|
18
|
+
group: (group) => nodeJobGroup(client, job, group),
|
|
19
|
+
restartGroup: (group) => restartNodeJobGroup(client, job, group),
|
|
20
|
+
restartOperation: (group, op) => restartNodeJobOperation(client, job, group, op),
|
|
21
|
+
stopGroup: (group) => stopNodeJobGroup(client, job, group),
|
|
22
|
+
stopOperation: (group, op) => stopNodeJobOperation(client, job, group, op),
|
|
23
|
+
stop: () => stopNodeJob(client, job),
|
|
24
|
+
endpoints: () => nodeJobEndpoints(client, job),
|
|
25
|
+
stats: (query) => nodeJobStats(client, job, query),
|
|
26
|
+
streamInfo: (handlers) => nodeJobInfoStream(client, job, handlers),
|
|
27
|
+
streamStats: (handlers, query) => nodeJobStatsStream(client, job, handlers, query),
|
|
28
|
+
logs: (handlers, filter, options) => nodeJobLogs(context, handlers, filter, options),
|
|
29
|
+
status: (handlers, options) => nodeJobStatus(context, handlers, options),
|
|
30
|
+
ssh: {
|
|
31
|
+
keys: (options) => nodeJobSshKeys(client, job, options),
|
|
32
|
+
add: (publicKey, options) => nodeJobSshAdd(client, job, publicKey, options),
|
|
33
|
+
remove: (publicKey, options) => nodeJobSshRemove(client, job, publicKey, options),
|
|
34
|
+
command: (options) => createSshCommand(target, options),
|
|
35
|
+
},
|
|
36
|
+
terminal: (options) => openNodeJobTerminal(context, options),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=createNodeJob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNodeJob.js","sourceRoot":"","sources":["../../../src/routes/node/createNodeJob.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NodeRouteDeps, NosanaNodeApi } from './types.js';
|
|
2
|
+
export type * from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Talks to nodes directly. Each node runs the same API on its own host, checks
|
|
5
|
+
* the job owner's wallet signature, and knows only about the jobs it runs.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createNosanaNodeApi({ environment, authParams, options }: NodeRouteDeps): NosanaNodeApi;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/node/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAW,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAExE,mBAAmB,YAAY,CAAC;AAEhC;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,aAAa,GAAG,aAAa,CActG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createNodeClient, nodeDomain } from '../../client/node/index.js';
|
|
2
|
+
import { nodeInfo } from './actions/nodeInfo.js';
|
|
3
|
+
import { createNodeJob } from './createNodeJob.js';
|
|
4
|
+
/**
|
|
5
|
+
* Talks to nodes directly. Each node runs the same API on its own host, checks
|
|
6
|
+
* the job owner's wallet signature, and knows only about the jobs it runs.
|
|
7
|
+
*/
|
|
8
|
+
export function createNosanaNodeApi({ environment, authParams, options }) {
|
|
9
|
+
const domain = nodeDomain(environment, options);
|
|
10
|
+
const authorize = authParams?.generate;
|
|
11
|
+
return (address) => {
|
|
12
|
+
const client = createNodeClient(environment, address, authParams, options);
|
|
13
|
+
return {
|
|
14
|
+
address,
|
|
15
|
+
url: client.connection.baseUrl,
|
|
16
|
+
info: () => nodeInfo(client),
|
|
17
|
+
job: (job) => createNodeJob({ client, environment, domain, authorize, node: address, job }),
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMnD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAiB;IACrF,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,UAAU,EAAE,QAAQ,CAAC;IAEvC,OAAO,CAAC,OAAO,EAAW,EAAE;QAC1B,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAE3E,OAAO;YACL,OAAO;YACP,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO;YAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC5B,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;SAC5F,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { FlowState, JobDefinition, NodeApiSchema } from '@nosana/types';
|
|
2
|
+
import type { SshCommandOptions, SshConnectionDescriptor } from '@nosana/ssh';
|
|
3
|
+
import type { NodeClient } from '../../client/node/index.js';
|
|
4
|
+
import type { CreateNosanaApiOptions, NosanaNetwork, SignedHeaderAuth, StreamLifecycleHandlers, StreamSubscription } from '../../types.js';
|
|
5
|
+
type Schemas = NodeApiSchema.components['schemas'];
|
|
6
|
+
export type NodeInfo = Schemas['NodeInfo'];
|
|
7
|
+
export type NodeJobInfo = Schemas['JobInfo'];
|
|
8
|
+
export type NodeOperationStatuses = Schemas['OperationStatuses'];
|
|
9
|
+
export type NodeJobEndpoints = Schemas['JobEndpoints'];
|
|
10
|
+
export type NodeTaskStat = Schemas['TaskStat'];
|
|
11
|
+
/** One log line from the job's task manager, as streamed over `/flog`. */
|
|
12
|
+
export type NodeTaskLog = Schemas['TaskLog'];
|
|
13
|
+
export type NodeSshAuthorization = Schemas['SshAuthorization'];
|
|
14
|
+
export type NodeSshAuthorizedKey = Schemas['SshAuthorizedKey'];
|
|
15
|
+
export type NodeSshRevocation = Schemas['SshRevocation'];
|
|
16
|
+
export interface NodeStatsQuery {
|
|
17
|
+
/** Seconds between samples. */
|
|
18
|
+
interval?: number;
|
|
19
|
+
/** Unix milliseconds. */
|
|
20
|
+
start?: number;
|
|
21
|
+
end?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface NodeLogsFilter {
|
|
24
|
+
group?: string;
|
|
25
|
+
opId?: string;
|
|
26
|
+
type?: string;
|
|
27
|
+
}
|
|
28
|
+
export type NodeStreamSubscription = StreamSubscription;
|
|
29
|
+
export interface NodeStreamHandlers<T> extends StreamLifecycleHandlers {
|
|
30
|
+
onData: (data: T) => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Signs a message the way the API's signer does, answering with the standard
|
|
34
|
+
* `message:base58-signature` authorization string. Lets a deployment's wallet
|
|
35
|
+
* sign for its jobs, through the deployment manager, instead of the client's.
|
|
36
|
+
*/
|
|
37
|
+
export type NodeAuthorizationProvider = SignedHeaderAuth['generate'];
|
|
38
|
+
export interface NodeSshKeyOptions {
|
|
39
|
+
signal?: AbortSignal;
|
|
40
|
+
}
|
|
41
|
+
export interface NodeSshAddKeyOptions extends NodeSshKeyOptions {
|
|
42
|
+
/** Omit for access until the key is removed or the job ends. */
|
|
43
|
+
expiresAt?: Date;
|
|
44
|
+
}
|
|
45
|
+
/** SSH access to one job, mirroring `deployment.ssh`. */
|
|
46
|
+
export interface NodeJobSsh {
|
|
47
|
+
/** The keys currently allowed to reach the job, with their expiry when temporary. */
|
|
48
|
+
keys(options?: NodeSshKeyOptions): Promise<NodeSshAuthorizedKey[]>;
|
|
49
|
+
add(publicKey: string, options?: NodeSshAddKeyOptions): Promise<NodeSshAuthorization>;
|
|
50
|
+
remove(publicKey: string, options?: NodeSshKeyOptions): Promise<NodeSshRevocation>;
|
|
51
|
+
/** The `ssh` command that reaches the job; `identityFile` picks the private key to connect with. */
|
|
52
|
+
command(options?: SshCommandOptions): SshConnectionDescriptor;
|
|
53
|
+
}
|
|
54
|
+
export type TerminalStatus = 'authorizing' | 'connecting' | 'connected' | 'closed' | 'error';
|
|
55
|
+
/** A signed, short-lived permission the node checks before opening a terminal. */
|
|
56
|
+
export interface TerminalAuthorizationGrant {
|
|
57
|
+
message: string;
|
|
58
|
+
/** Base64 of the raw 64-byte signature over `message`. */
|
|
59
|
+
signature: string;
|
|
60
|
+
expiresAt: string;
|
|
61
|
+
}
|
|
62
|
+
export interface TerminalSession {
|
|
63
|
+
readonly authorization: TerminalAuthorizationGrant;
|
|
64
|
+
readonly socket: WebSocket;
|
|
65
|
+
sendInput(data: string): void;
|
|
66
|
+
resize(cols: number, rows: number): void;
|
|
67
|
+
close(): void;
|
|
68
|
+
}
|
|
69
|
+
export interface NodeSocketOptions {
|
|
70
|
+
authorizationProvider?: NodeAuthorizationProvider;
|
|
71
|
+
webSocketFactory?: (url: string) => WebSocket;
|
|
72
|
+
}
|
|
73
|
+
export interface NodeTerminalOptions extends NodeSocketOptions {
|
|
74
|
+
cols: number;
|
|
75
|
+
rows: number;
|
|
76
|
+
/** Attach to one operation of the job instead of opening a shell. */
|
|
77
|
+
op?: string;
|
|
78
|
+
/** Lifetime of the signed grant; defaults to four minutes and is capped at five. */
|
|
79
|
+
ttlMs?: number;
|
|
80
|
+
/** How long to wait for the node's first frame; defaults to ten seconds. */
|
|
81
|
+
timeoutMs?: number;
|
|
82
|
+
signal?: AbortSignal;
|
|
83
|
+
onData: (data: Uint8Array) => void;
|
|
84
|
+
onStatus?: (status: TerminalStatus, detail?: string) => void;
|
|
85
|
+
onExit?: (code: number | null) => void;
|
|
86
|
+
}
|
|
87
|
+
/** Everything the node knows about one job it runs. */
|
|
88
|
+
export interface NodeJobApi {
|
|
89
|
+
readonly address: string;
|
|
90
|
+
readonly node: string;
|
|
91
|
+
definition(): Promise<JobDefinition>;
|
|
92
|
+
/** Accepted only while the job waits for its definition. */
|
|
93
|
+
setDefinition(definition: JobDefinition): Promise<void>;
|
|
94
|
+
/** The finished flow; the node hands it over once and marks it collected. */
|
|
95
|
+
results(): Promise<FlowState>;
|
|
96
|
+
operations(): Promise<NodeOperationStatuses>;
|
|
97
|
+
operation(op: string): Promise<string>;
|
|
98
|
+
/** Status of one group's operations; the current group when none is named. */
|
|
99
|
+
group(group?: string): Promise<NodeOperationStatuses>;
|
|
100
|
+
restartGroup(group: string): Promise<void>;
|
|
101
|
+
restartOperation(group: string, op: string): Promise<void>;
|
|
102
|
+
stopGroup(group: string): Promise<void>;
|
|
103
|
+
stopOperation(group: string, op: string): Promise<void>;
|
|
104
|
+
stop(): Promise<void>;
|
|
105
|
+
endpoints(): Promise<NodeJobEndpoints>;
|
|
106
|
+
stats(query?: NodeStatsQuery): Promise<NodeTaskStat[]>;
|
|
107
|
+
/** Server-sent events: the flow and task status, whenever they change. */
|
|
108
|
+
streamInfo(handlers: NodeStreamHandlers<NodeJobInfo>): NodeStreamSubscription;
|
|
109
|
+
streamStats(handlers: NodeStreamHandlers<NodeTaskStat[]>, query?: Pick<NodeStatsQuery, 'interval'>): NodeStreamSubscription;
|
|
110
|
+
/** Task manager logs over WebSocket: history first, then live. */
|
|
111
|
+
logs(handlers: NodeStreamHandlers<NodeTaskLog>, filter?: NodeLogsFilter, options?: NodeSocketOptions): NodeStreamSubscription;
|
|
112
|
+
/** The node's state updates for this job over WebSocket. */
|
|
113
|
+
status(handlers: NodeStreamHandlers<unknown>, options?: NodeSocketOptions): NodeStreamSubscription;
|
|
114
|
+
ssh: NodeJobSsh;
|
|
115
|
+
/** Opens a web terminal into the job; progress arrives through `onStatus`. */
|
|
116
|
+
terminal(options: NodeTerminalOptions): Promise<TerminalSession>;
|
|
117
|
+
}
|
|
118
|
+
export interface NodeApi {
|
|
119
|
+
readonly address: string;
|
|
120
|
+
readonly url: string;
|
|
121
|
+
/** Public: what the node is, what it runs on and what it holds. */
|
|
122
|
+
info(): Promise<NodeInfo>;
|
|
123
|
+
job(address: string): NodeJobApi;
|
|
124
|
+
}
|
|
125
|
+
/** Addresses one node. Nothing is fetched until a method is called. */
|
|
126
|
+
export type NosanaNodeApi = (address: string) => NodeApi;
|
|
127
|
+
export interface NodeRouteDeps {
|
|
128
|
+
environment: NosanaNetwork;
|
|
129
|
+
/**
|
|
130
|
+
* Signs the `authorization` header a node verifies against the job owner. A
|
|
131
|
+
* wallet signs directly; an API-key caller uses a client-manager-backed signer.
|
|
132
|
+
*/
|
|
133
|
+
authParams: SignedHeaderAuth | undefined;
|
|
134
|
+
options?: CreateNosanaApiOptions;
|
|
135
|
+
}
|
|
136
|
+
/** What every action on one job needs, resolved once when the node is addressed. */
|
|
137
|
+
export interface NodeJobContext {
|
|
138
|
+
client: NodeClient;
|
|
139
|
+
environment: NosanaNetwork;
|
|
140
|
+
/** The domain the node answers under; also where its SSH proxy lives. */
|
|
141
|
+
domain: string;
|
|
142
|
+
/** Signs on behalf of the API's wallet; absent when none is configured. */
|
|
143
|
+
authorize: NodeAuthorizationProvider | undefined;
|
|
144
|
+
node: string;
|
|
145
|
+
job: string;
|
|
146
|
+
}
|
|
147
|
+
export {};
|
|
148
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/routes/node/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/routes/node/types.ts"],"names":[],"mappings":""}
|