UNPKG

@jupyterlab/services

Version:

Client APIs for the Jupyter services REST APIs

238 lines (219 loc) 7.32 kB
// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { ServerConnection } from '../serverconnection'; import { URLExt } from '@jupyterlab/coreutils'; import { validateModel, validateModels } from './validate'; /** * The kernel model provided by the server. * * #### Notes * See the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels). */ export interface IModel { /** * Unique identifier of the kernel on the server. */ readonly id: string; /** * The name of the kernel. */ readonly name: string; /** * The kernel execution state. */ readonly execution_state?: string; /** * The timestamp of the last activity on the kernel. */ // eslint-disable-next-line camelcase readonly last_activity?: string; /** * The number of active connections to the kernel. */ readonly connections?: number; /** * The reason the kernel died, if applicable. */ readonly reason?: string; /** * The traceback for a dead kernel, if applicable. */ readonly traceback?: string; } /** * The url for the kernel service. */ export const KERNEL_SERVICE_URL = 'api/kernels'; /** * Fetch the running kernels. * * @param settings - The optional server settings. * * @returns A promise that resolves with the list of running kernels. * * #### Notes * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response and rejected otherwise. */ export async function listRunning( settings: ServerConnection.ISettings = ServerConnection.makeSettings() ): Promise<IModel[]> { const url = URLExt.join(settings.baseUrl, KERNEL_SERVICE_URL); const response = await ServerConnection.makeRequest(url, {}, settings); if (response.status !== 200) { const err = await ServerConnection.ResponseError.create(response); throw err; } const data = await response.json(); validateModels(data); return data; } /** * Start a new kernel. * * @param options - The options used to create the kernel. * * @returns A promise that resolves with a kernel connection object. * * #### Notes * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response and rejected otherwise. */ export async function startNew( options: IKernelOptions = {}, settings: ServerConnection.ISettings = ServerConnection.makeSettings() ): Promise<IModel> { const url = URLExt.join(settings.baseUrl, KERNEL_SERVICE_URL); const init = { method: 'POST', body: JSON.stringify(options) }; const response = await ServerConnection.makeRequest(url, init, settings); if (response.status !== 201) { const err = await ServerConnection.ResponseError.create(response); throw err; } const data = await response.json(); validateModel(data); return data; } /** * The options object used to initialize a kernel. */ export type IKernelOptions = Partial<Pick<IModel, 'name'>>; /** * Restart a kernel. * * #### Notes * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response (and thus after a restart) and rejected otherwise. */ export async function restartKernel( id: string, settings: ServerConnection.ISettings = ServerConnection.makeSettings() ): Promise<void> { const url = URLExt.join( settings.baseUrl, KERNEL_SERVICE_URL, encodeURIComponent(id), 'restart' ); const init = { method: 'POST' }; const response = await ServerConnection.makeRequest(url, init, settings); if (response.status !== 200) { const err = await ServerConnection.ResponseError.create(response); throw err; } const data = await response.json(); validateModel(data); } /** * Interrupt a kernel. * * #### Notes * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response and rejected otherwise. */ export async function interruptKernel( id: string, settings: ServerConnection.ISettings = ServerConnection.makeSettings() ): Promise<void> { const url = URLExt.join( settings.baseUrl, KERNEL_SERVICE_URL, encodeURIComponent(id), 'interrupt' ); const init = { method: 'POST' }; const response = await ServerConnection.makeRequest(url, init, settings); if (response.status !== 204) { const err = await ServerConnection.ResponseError.create(response); throw err; } } /** * Shut down a kernel. * * @param id - The id of the running kernel. * * @param settings - The server settings for the request. * * @returns A promise that resolves when the kernel is shut down. * * * #### Notes * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response and rejected otherwise. */ export async function shutdownKernel( id: string, settings: ServerConnection.ISettings = ServerConnection.makeSettings() ): Promise<void> { const url = URLExt.join( settings.baseUrl, KERNEL_SERVICE_URL, encodeURIComponent(id) ); const init = { method: 'DELETE' }; const response = await ServerConnection.makeRequest(url, init, settings); if (response.status === 404) { const msg = `The kernel "${id}" does not exist on the server`; console.warn(msg); } else if (response.status !== 204) { const err = await ServerConnection.ResponseError.create(response); throw err; } } /** * Get a full kernel model from the server by kernel id string. * * #### Notes * Uses the [Jupyter Server API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model. * * The promise is fulfilled on a valid response and rejected otherwise. */ export async function getKernelModel( id: string, settings: ServerConnection.ISettings = ServerConnection.makeSettings() ): Promise<IModel | undefined> { const url = URLExt.join( settings.baseUrl, KERNEL_SERVICE_URL, encodeURIComponent(id) ); const response = await ServerConnection.makeRequest(url, {}, settings); if (response.status === 404) { return undefined; } else if (response.status !== 200) { const err = await ServerConnection.ResponseError.create(response); throw err; } const data = await response.json(); validateModel(data); return data; }