MCPcopy Create free account
hub / github.com/deepnote/vscode-deepnote / waitForIdleOnSession

Function waitForIdleOnSession

src/kernels/common/helpers.ts:17–84  ·  view source on GitHub ↗
(
    kernelConnectionMetadata: KernelConnectionMetadata,
    resource: Resource,
    session: Session.ISessionConnection,
    timeout: number,
    token: CancellationToken
)

Source from the content-addressed store, hash-verified

15import { KernelConnectionMetadata } from '../types';
16
17export async function waitForIdleOnSession(
18 kernelConnectionMetadata: KernelConnectionMetadata,
19 resource: Resource,
20 session: Session.ISessionConnection,
21 timeout: number,
22 token: CancellationToken
23): Promise<void> {
24 if (!session.kernel) {
25 throw new JupyterInvalidKernelError(kernelConnectionMetadata);
26 }
27
28 const progress = KernelProgressReporter.reportProgress(resource, DataScience.waitingForJupyterSessionToBeIdle);
29 const disposables: IDisposable[] = [];
30 if (progress) {
31 disposables.push(progress);
32 }
33 try {
34 logger.trace(`Waiting for idle on (kernel): ${session.kernel.id} -> ${session.kernel.status}`);
35
36 // When our kernel connects and gets a status message it triggers the ready promise
37 const kernelStatus = createDeferred<string>();
38 token.onCancellationRequested(() => kernelStatus.reject(new CancellationError()), undefined, disposables);
39 const handler = (_session: Kernel.IKernelConnection, status: KernelMessage.Status) => {
40 logger.trace(`Got status ${status} in waitForIdleOnSession`);
41 if (status == 'idle') {
42 kernelStatus.resolve(status);
43 }
44 };
45 session.kernel.statusChanged?.connect(handler);
46 disposables.push(
47 new Disposable(() => swallowExceptions(() => session.kernel?.statusChanged?.disconnect(handler)))
48 );
49 if (session.kernel.status == 'idle') {
50 kernelStatus.resolve(session.kernel.status);
51 }
52 // Check for possibility that kernel has died.
53 const sessionDisposed = createDeferred<string>();
54 const sessionDisposedHandler = () => sessionDisposed.resolve('');
55 session.disposed.connect(sessionDisposedHandler, sessionDisposed);
56 disposables.push(
57 new Disposable(() =>
58 swallowExceptions(() => session.disposed.disconnect(sessionDisposedHandler, sessionDisposed))
59 )
60 );
61 sessionDisposed.promise.catch(noop);
62 kernelStatus.promise.catch(noop);
63 const result = await raceTimeout(timeout, '', kernelStatus.promise, sessionDisposed.promise);
64 if (session.isDisposed) {
65 logger.error('Session disposed while waiting for session to be idle.');
66 throw new JupyterInvalidKernelError(kernelConnectionMetadata);
67 }
68
69 logger.trace(`Finished waiting for idle on (kernel): ${session.kernel.id} -> ${session.kernel.status}`);
70
71 if (result == 'idle') {
72 return;
73 }
74 logger.error(

Callers 4

waitForIdleMethod · 0.90
waitForIdleMethod · 0.90

Calls 13

createDeferredFunction · 0.90
swallowExceptionsFunction · 0.90
raceTimeoutFunction · 0.90
disposeFunction · 0.90
pushMethod · 0.65
traceMethod · 0.65
rejectMethod · 0.65
connectMethod · 0.65
disconnectMethod · 0.65
resolveMethod · 0.65
errorMethod · 0.65
ciMethod · 0.65

Tested by

no test coverage detected