/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { nb } from 'azdata'; import { localize } from 'vs/nls'; import { FutureInternal } from 'sql/workbench/parts/notebook/models/modelInterfaces'; import { ConnectionProfile } from 'sql/platform/connection/common/connectionProfile'; export const noKernel: string = localize('noKernel', 'No Kernel'); const runNotebookDisabled = localize('runNotebookDisabled', 'Cannot run cells as no kernel has been configured'); let noKernelSpec: nb.IKernelSpec = ({ name: noKernel, language: 'python', display_name: noKernel }); export class SessionManager implements nb.SessionManager { public get isReady(): boolean { return true; } public get ready(): Thenable { return Promise.resolve(); } public get specs(): nb.IAllKernels { let allKernels: nb.IAllKernels = { defaultKernel: noKernel, kernels: [noKernelSpec] }; return allKernels; } startNew(options: nb.ISessionOptions): Thenable { let session = new EmptySession(options); return Promise.resolve(session); } shutdown(id: string): Thenable { return Promise.resolve(); } } export class EmptySession implements nb.ISession { private _kernel: EmptyKernel; private _defaultKernelLoaded = false; public set defaultKernelLoaded(value) { this._defaultKernelLoaded = value; } public get defaultKernelLoaded(): boolean { return this._defaultKernelLoaded; } constructor(private options: nb.ISessionOptions) { this._kernel = new EmptyKernel(); } public get canChangeKernels(): boolean { return true; } public get id(): string { return this.options.kernelId || ''; } public get path(): string { return this.options.path; } public get name(): string { return this.options.name || ''; } public get type(): string { return this.options.type || ''; } public get status(): nb.KernelStatus { return 'connected'; } public get kernel(): nb.IKernel { return this._kernel; } changeKernel(kernelInfo: nb.IKernelSpec): Thenable { return Promise.resolve(this.kernel); } // No kernel config necessary for empty session configureKernel(kernelInfo: nb.IKernelSpec): Thenable { return Promise.resolve(); } configureConnection(connection: ConnectionProfile): Thenable { return Promise.resolve(); } } class EmptyKernel implements nb.IKernel { public get id(): string { return '-1'; } public get name(): string { return noKernel; } public get supportsIntellisense(): boolean { return false; } public get requiresConnection(): boolean { return false; } public get isReady(): boolean { return true; } public get ready(): Thenable { return Promise.resolve(); } public get info(): nb.IInfoReply { let info: nb.IInfoReply = { protocol_version: '', implementation: '', implementation_version: '', language_info: { name: '', version: '', }, banner: '', help_links: [{ text: '', url: '' }] }; return info; } getSpec(): Thenable { return Promise.resolve(noKernelSpec); } requestExecute(content: nb.IExecuteRequest, disposeOnDone?: boolean): nb.IFuture { return new EmptyFuture(); } requestComplete(content: nb.ICompleteRequest): Thenable { let response: Partial = {}; return Promise.resolve(response as nb.ICompleteReplyMsg); } interrupt(): Thenable { return Promise.resolve(undefined); } } export class EmptyFuture implements FutureInternal { get inProgress(): boolean { return false; } get msg(): nb.IMessage { return undefined; } get done(): Thenable { let msg: nb.IShellMessage = { channel: 'shell', type: 'shell', content: runNotebookDisabled, header: undefined, metadata: undefined, parent_header: undefined }; return Promise.resolve(msg); } sendInputReply(content: nb.IInputReply): void { // no-op } dispose() { // No-op } setReplyHandler(handler: nb.MessageHandler): void { // no-op } setStdInHandler(handler: nb.MessageHandler): void { // no-op } setIOPubHandler(handler: nb.MessageHandler): void { setTimeout(() => { let msg: nb.IIOPubMessage = { channel: 'iopub', type: 'iopub', header: { msg_id: '0', msg_type: 'error' }, content: { ename: localize('errorName', 'Error'), evalue: runNotebookDisabled, output_type: 'error' }, metadata: undefined, parent_header: undefined }; handler.handle(msg); }, 10); } registerMessageHook(hook: (msg: nb.IIOPubMessage) => boolean | Thenable): void { // no-op } removeMessageHook(hook: (msg: nb.IIOPubMessage) => boolean | Thenable): void { // no-op } }