Split up NotebookProvider into separate providers for handling file serialization and cell execution. (#17176)

This commit is contained in:
Cory Rivera
2021-09-29 16:15:28 -07:00
committed by GitHub
parent dfc2635aa7
commit 14904bb671
51 changed files with 1426 additions and 971 deletions

View File

@@ -11,8 +11,8 @@ import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol';
import { Event, Emitter } from 'vs/base/common/event';
import { URI } from 'vs/base/common/uri';
import { INotebookService, INotebookProvider, INotebookManager } from 'sql/workbench/services/notebook/browser/notebookService';
import { INotebookManagerDetails, INotebookSessionDetails, INotebookKernelDetails, FutureMessageType, INotebookFutureDetails, INotebookFutureDone } from 'sql/workbench/api/common/sqlExtHostTypes';
import { INotebookService, IExecuteProvider, IExecuteManager, ISerializationProvider, ISerializationManager } from 'sql/workbench/services/notebook/browser/notebookService';
import { IExecuteManagerDetails, INotebookSessionDetails, INotebookKernelDetails, FutureMessageType, INotebookFutureDetails, INotebookFutureDone, ISerializationManagerDetails } from 'sql/workbench/api/common/sqlExtHostTypes';
import { LocalContentManager } from 'sql/workbench/services/notebook/common/localContentManager';
import { Deferred } from 'sql/base/common/promise';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
@@ -22,7 +22,8 @@ import type { FutureInternal } from 'sql/workbench/services/notebook/browser/int
export class MainThreadNotebook extends Disposable implements MainThreadNotebookShape {
private _proxy: ExtHostNotebookShape;
private _providers = new Map<number, NotebookProviderWrapper>();
private _serializationProviders = new Map<number, SerializationProviderWrapper>();
private _executeProviders = new Map<number, ExecuteProviderWrapper>();
private _futures = new Map<number, FutureWrapper>();
constructor(
@@ -45,22 +46,41 @@ export class MainThreadNotebook extends Disposable implements MainThreadNotebook
}
//#region Extension host callable methods
public $registerNotebookProvider(providerId: string, handle: number): void {
public $registerSerializationProvider(providerId: string, handle: number): void {
let proxy: Proxies = {
main: this,
ext: this._proxy
};
let notebookProvider = this.instantiationService.createInstance(NotebookProviderWrapper, proxy, providerId, handle);
this._providers.set(handle, notebookProvider);
this.notebookService.registerProvider(providerId, notebookProvider);
let notebookProvider = this.instantiationService.createInstance(SerializationProviderWrapper, proxy, providerId, handle);
this._serializationProviders.set(handle, notebookProvider);
this.notebookService.registerSerializationProvider(providerId, notebookProvider);
}
public $unregisterNotebookProvider(handle: number): void {
let registration = this._providers.get(handle);
public $registerExecuteProvider(providerId: string, handle: number): void {
let proxy: Proxies = {
main: this,
ext: this._proxy
};
let notebookProvider = this.instantiationService.createInstance(ExecuteProviderWrapper, proxy, providerId, handle);
this._executeProviders.set(handle, notebookProvider);
this.notebookService.registerExecuteProvider(providerId, notebookProvider);
}
public $unregisterSerializationProvider(handle: number): void {
let registration = this._serializationProviders.get(handle);
if (registration) {
this.notebookService.unregisterProvider(registration.providerId);
this.notebookService.unregisterSerializationProvider(registration.providerId);
registration.dispose();
this._providers.delete(handle);
this._serializationProviders.delete(handle);
}
}
public $unregisterExecuteProvider(handle: number): void {
let registration = this._executeProviders.get(handle);
if (registration) {
this.notebookService.unregisterExecuteProvider(registration.providerId);
registration.dispose();
this._executeProviders.delete(handle);
}
}
@@ -86,8 +106,8 @@ interface Proxies {
ext: ExtHostNotebookShape;
}
class NotebookProviderWrapper extends Disposable implements INotebookProvider {
private _notebookUriToManagerMap = new Map<string, NotebookManagerWrapper>();
class SerializationProviderWrapper extends Disposable implements ISerializationProvider {
private _notebookUriToManagerMap = new Map<string, SerializationManagerWrapper>();
constructor(
private _proxy: Proxies,
@@ -98,16 +118,45 @@ class NotebookProviderWrapper extends Disposable implements INotebookProvider {
super();
}
getNotebookManager(notebookUri: URI): Thenable<INotebookManager> {
getSerializationManager(notebookUri: URI): Thenable<ISerializationManager> {
// TODO must call through to setup in the extension host
return this.doGetNotebookManager(notebookUri);
return this.doGetSerializationManager(notebookUri);
}
private async doGetNotebookManager(notebookUri: URI): Promise<INotebookManager> {
private async doGetSerializationManager(notebookUri: URI): Promise<ISerializationManager> {
let uriString = notebookUri.toString();
let manager = this._notebookUriToManagerMap.get(uriString);
if (!manager) {
manager = this.instantiationService.createInstance(NotebookManagerWrapper, this._proxy, this.providerId, notebookUri);
manager = this.instantiationService.createInstance(SerializationManagerWrapper, this._proxy, this.providerId, notebookUri);
await manager.initialize(this.providerHandle);
this._notebookUriToManagerMap.set(uriString, manager);
}
return manager;
}
}
class ExecuteProviderWrapper extends Disposable implements IExecuteProvider {
private _notebookUriToManagerMap = new Map<string, ExecuteManagerWrapper>();
constructor(
private _proxy: Proxies,
public readonly providerId: string,
public readonly providerHandle: number,
@IInstantiationService private readonly instantiationService: IInstantiationService
) {
super();
}
getExecuteManager(notebookUri: URI): Thenable<IExecuteManager> {
// TODO must call through to setup in the extension host
return this.doGetExecuteManager(notebookUri);
}
private async doGetExecuteManager(notebookUri: URI): Promise<IExecuteManager> {
let uriString = notebookUri.toString();
let manager = this._notebookUriToManagerMap.get(uriString);
if (!manager) {
manager = this.instantiationService.createInstance(ExecuteManagerWrapper, this._proxy, this.providerId, notebookUri);
await manager.initialize(this.providerHandle);
this._notebookUriToManagerMap.set(uriString, manager);
}
@@ -120,11 +169,9 @@ class NotebookProviderWrapper extends Disposable implements INotebookProvider {
}
}
class NotebookManagerWrapper implements INotebookManager {
private _sessionManager: azdata.nb.SessionManager;
class SerializationManagerWrapper implements ISerializationManager {
private _contentManager: azdata.nb.ContentManager;
private _serverManager: azdata.nb.ServerManager;
private managerDetails: INotebookManagerDetails;
private managerDetails: ISerializationManagerDetails;
constructor(private _proxy: Proxies,
public readonly providerId: string,
@@ -132,10 +179,35 @@ class NotebookManagerWrapper implements INotebookManager {
@IInstantiationService private readonly instantiationService: IInstantiationService
) { }
public async initialize(providerHandle: number): Promise<NotebookManagerWrapper> {
this.managerDetails = await this._proxy.ext.$getNotebookManager(providerHandle, this.notebookUri);
public async initialize(providerHandle: number): Promise<SerializationManagerWrapper> {
this.managerDetails = await this._proxy.ext.$getSerializationManagerDetails(providerHandle, this.notebookUri);
let managerHandle = this.managerDetails.handle;
this._contentManager = this.managerDetails.hasContentManager ? new ContentManagerWrapper(managerHandle, this._proxy) : this.instantiationService.createInstance(LocalContentManager);
return this;
}
public get contentManager(): azdata.nb.ContentManager {
return this._contentManager;
}
public get managerHandle(): number {
return this.managerDetails.handle;
}
}
class ExecuteManagerWrapper implements IExecuteManager {
private _sessionManager: azdata.nb.SessionManager;
private _serverManager: azdata.nb.ServerManager;
private managerDetails: IExecuteManagerDetails;
constructor(private _proxy: Proxies,
public readonly providerId: string,
private notebookUri: URI
) { }
public async initialize(providerHandle: number): Promise<ExecuteManagerWrapper> {
this.managerDetails = await this._proxy.ext.$getExecuteManagerDetails(providerHandle, this.notebookUri);
let managerHandle = this.managerDetails.handle;
this._serverManager = this.managerDetails.hasServerManager ? new ServerManagerWrapper(managerHandle, this._proxy) : undefined;
this._sessionManager = new SessionManagerWrapper(managerHandle, this._proxy);
return this;
@@ -144,9 +216,6 @@ class NotebookManagerWrapper implements INotebookManager {
public get sessionManager(): azdata.nb.SessionManager {
return this._sessionManager;
}
public get contentManager(): azdata.nb.ContentManager {
return this._contentManager;
}
public get serverManager(): azdata.nb.ServerManager {
return this._serverManager;
}
@@ -160,12 +229,12 @@ class ContentManagerWrapper implements azdata.nb.ContentManager {
constructor(private handle: number, private _proxy: Proxies) {
}
getNotebookContents(notebookUri: URI): Thenable<azdata.nb.INotebookContents> {
return this._proxy.ext.$getNotebookContents(this.handle, notebookUri);
deserializeNotebook(contents: string): Thenable<azdata.nb.INotebookContents> {
return this._proxy.ext.$deserializeNotebook(this.handle, contents);
}
save(path: URI, notebook: azdata.nb.INotebookContents): Thenable<azdata.nb.INotebookContents> {
return this._proxy.ext.$save(this.handle, path, notebook);
serializeNotebook(notebook: azdata.nb.INotebookContents): Thenable<string> {
return this._proxy.ext.$serializeNotebook(this.handle, notebook);
}
}

View File

@@ -12,9 +12,9 @@ import { localize } from 'vs/nls';
import { URI, UriComponents } from 'vs/base/common/uri';
import { ExtHostNotebookShape, MainThreadNotebookShape, SqlMainContext } from 'sql/workbench/api/common/sqlExtHost.protocol';
import { INotebookManagerDetails, INotebookSessionDetails, INotebookKernelDetails, INotebookFutureDetails, FutureMessageType } from 'sql/workbench/api/common/sqlExtHostTypes';
import { IExecuteManagerDetails, INotebookSessionDetails, INotebookKernelDetails, INotebookFutureDetails, FutureMessageType, ISerializationManagerDetails } from 'sql/workbench/api/common/sqlExtHostTypes';
type Adapter = azdata.nb.NotebookProvider | azdata.nb.NotebookManager | azdata.nb.ISession | azdata.nb.IKernel | azdata.nb.IFuture;
type Adapter = azdata.nb.NotebookSerializationProvider | azdata.nb.SerializationManager | azdata.nb.NotebookExecuteProvider | azdata.nb.ExecuteManager | azdata.nb.ISession | azdata.nb.IKernel | azdata.nb.IFuture;
export class ExtHostNotebook implements ExtHostNotebookShape {
private static _handlePool: number = 0;
@@ -28,26 +28,40 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
}
//#region APIs called by main thread
async $getNotebookManager(providerHandle: number, notebookUri: UriComponents): Promise<INotebookManagerDetails> {
async $getSerializationManagerDetails(providerHandle: number, notebookUri: UriComponents): Promise<ISerializationManagerDetails> {
let uri = URI.revive(notebookUri);
let uriString = uri.toString();
let adapter = this.findManagerForUri(uriString);
let adapter = this.findSerializationManagerForUri(uriString);
if (!adapter) {
adapter = await this._withProvider(providerHandle, (provider) => {
return this.getOrCreateManager(provider, uri);
adapter = await this._withSerializationProvider(providerHandle, (provider) => {
return this.getOrCreateSerializationManager(provider, uri);
});
}
return {
handle: adapter.handle,
hasContentManager: !!adapter.contentManager
};
}
async $getExecuteManagerDetails(providerHandle: number, notebookUri: UriComponents): Promise<IExecuteManagerDetails> {
let uri = URI.revive(notebookUri);
let uriString = uri.toString();
let adapter = this.findExecuteManagerForUri(uriString);
if (!adapter) {
adapter = await this._withExecuteProvider(providerHandle, (provider) => {
return this.getOrCreateExecuteManager(provider, uri);
});
}
return {
handle: adapter.handle,
hasContentManager: !!adapter.contentManager,
hasServerManager: !!adapter.serverManager
};
}
$handleNotebookClosed(notebookUri: UriComponents): void {
let uri = URI.revive(notebookUri);
let uriString = uri.toString();
let manager = this.findManagerForUri(uriString);
let manager = this.findExecuteManagerForUri(uriString);
if (manager) {
manager.provider.handleNotebookClosed(uri);
this._adapters.delete(manager.handle);
@@ -62,12 +76,12 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
return this._withServerManager(managerHandle, (serverManager) => serverManager.stopServer());
}
$getNotebookContents(managerHandle: number, notebookUri: UriComponents): Thenable<azdata.nb.INotebookContents> {
return this._withContentManager(managerHandle, (contentManager) => contentManager.getNotebookContents(URI.revive(notebookUri)));
$deserializeNotebook(managerHandle: number, contents: string): Thenable<azdata.nb.INotebookContents> {
return this._withContentManager(managerHandle, (contentManager) => contentManager.deserializeNotebook(contents));
}
$save(managerHandle: number, notebookUri: UriComponents, notebook: azdata.nb.INotebookContents): Thenable<azdata.nb.INotebookContents> {
return this._withContentManager(managerHandle, (contentManager) => contentManager.save(URI.revive(notebookUri), notebook));
$serializeNotebook(managerHandle: number, notebook: azdata.nb.INotebookContents): Thenable<string> {
return this._withContentManager(managerHandle, (contentManager) => contentManager.serializeNotebook(notebook));
}
$refreshSpecs(managerHandle: number): Thenable<azdata.nb.IAllKernels> {
@@ -222,12 +236,21 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
//#endregion
//#region APIs called by extensions
registerNotebookProvider(provider: azdata.nb.NotebookProvider): vscode.Disposable {
registerExecuteProvider(provider: azdata.nb.NotebookExecuteProvider): vscode.Disposable {
if (!provider || !provider.providerId) {
throw new Error(localize('providerRequired', "A NotebookProvider with valid providerId must be passed to this method"));
throw new Error(localize('executeProviderRequired', "A NotebookExecuteProvider with valid providerId must be passed to this method"));
}
const handle = this._addNewAdapter(provider);
this._proxy.$registerNotebookProvider(provider.providerId, handle);
this._proxy.$registerExecuteProvider(provider.providerId, handle);
return this._createDisposable(handle);
}
registerSerializationProvider(provider: azdata.nb.NotebookSerializationProvider): vscode.Disposable {
if (!provider || !provider.providerId) {
throw new Error(localize('serializationProviderRequired', "A NotebookSerializationProvider with valid providerId must be passed to this method"));
}
const handle = this._addNewAdapter(provider);
this._proxy.$registerSerializationProvider(provider.providerId, handle);
return this._createDisposable(handle);
}
//#endregion
@@ -245,8 +268,8 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
return matchingAdapters;
}
private findManagerForUri(uriString: string): NotebookManagerAdapter {
for (let manager of this.getAdapters(NotebookManagerAdapter)) {
private findSerializationManagerForUri(uriString: string): SerializationManagerAdapter {
for (let manager of this.getAdapters(SerializationManagerAdapter)) {
if (manager.uriString === uriString) {
return manager;
}
@@ -254,10 +277,27 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
return undefined;
}
private async getOrCreateManager(provider: azdata.nb.NotebookProvider, notebookUri: URI): Promise<NotebookManagerAdapter> {
let manager = await provider.getNotebookManager(notebookUri);
private findExecuteManagerForUri(uriString: string): ExecuteManagerAdapter {
for (let manager of this.getAdapters(ExecuteManagerAdapter)) {
if (manager.uriString === uriString) {
return manager;
}
}
return undefined;
}
private async getOrCreateSerializationManager(provider: azdata.nb.NotebookSerializationProvider, notebookUri: URI): Promise<SerializationManagerAdapter> {
let manager = await provider.getSerializationManager(notebookUri);
let uriString = notebookUri.toString();
let adapter = new NotebookManagerAdapter(provider, manager, uriString);
let adapter = new SerializationManagerAdapter(provider, manager, uriString);
adapter.handle = this._addNewAdapter(adapter);
return adapter;
}
private async getOrCreateExecuteManager(provider: azdata.nb.NotebookExecuteProvider, notebookUri: URI): Promise<ExecuteManagerAdapter> {
let manager = await provider.getExecuteManager(notebookUri);
let uriString = notebookUri.toString();
let adapter = new ExecuteManagerAdapter(provider, manager, uriString);
adapter.handle = this._addNewAdapter(adapter);
return adapter;
}
@@ -272,23 +312,39 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
return ExtHostNotebook._handlePool++;
}
private _withProvider<R>(handle: number, callback: (provider: azdata.nb.NotebookProvider) => R | PromiseLike<R>): Promise<R> {
let provider = this._adapters.get(handle) as azdata.nb.NotebookProvider;
private _withSerializationProvider(handle: number, callback: (provider: azdata.nb.NotebookSerializationProvider) => SerializationManagerAdapter | PromiseLike<SerializationManagerAdapter>): Promise<SerializationManagerAdapter> {
let provider = this._adapters.get(handle) as azdata.nb.NotebookSerializationProvider;
if (provider === undefined) {
return Promise.reject(new Error(localize('errNoProvider', "no notebook provider found")));
return Promise.reject(new Error(localize('errNoSerializationProvider', "No notebook serialization provider found")));
}
return Promise.resolve(callback(provider));
}
private _withNotebookManager<R>(handle: number, callback: (manager: NotebookManagerAdapter) => R | PromiseLike<R>): Promise<R> {
let manager = this._adapters.get(handle) as NotebookManagerAdapter;
if (manager === undefined) {
return Promise.reject(new Error(localize('errNoManager', "No Manager found")));
private _withExecuteProvider(handle: number, callback: (provider: azdata.nb.NotebookExecuteProvider) => ExecuteManagerAdapter | PromiseLike<ExecuteManagerAdapter>): Promise<ExecuteManagerAdapter> {
let provider = this._adapters.get(handle) as azdata.nb.NotebookExecuteProvider;
if (provider === undefined) {
return Promise.reject(new Error(localize('errNoExecuteProvider', "No notebook execute provider found")));
}
return this.callbackWithErrorWrap<R>(callback, manager);
return Promise.resolve(callback(provider));
}
private async callbackWithErrorWrap<R>(callback: (manager: NotebookManagerAdapter) => R | PromiseLike<R>, manager: NotebookManagerAdapter): Promise<R> {
private _withSerializationManager<R>(handle: number, callback: (manager: SerializationManagerAdapter) => R | PromiseLike<R>): Promise<R> {
let manager = this._adapters.get(handle) as SerializationManagerAdapter;
if (manager === undefined) {
return Promise.reject(new Error(localize('errNoSerializationManager', "No serialization manager found")));
}
return this.callbackWithErrorWrap<SerializationManagerAdapter, R>(callback, manager);
}
private _withExecuteManager<R>(handle: number, callback: (manager: ExecuteManagerAdapter) => R | PromiseLike<R>): Promise<R> {
let manager = this._adapters.get(handle) as ExecuteManagerAdapter;
if (manager === undefined) {
return Promise.reject(new Error(localize('errNoExecuteManager', "No execute manager found")));
}
return this.callbackWithErrorWrap<ExecuteManagerAdapter, R>(callback, manager);
}
private async callbackWithErrorWrap<A, R>(callback: (manager: A) => R | PromiseLike<R>, manager: A): Promise<R> {
try {
let value = await callback(manager);
return value;
@@ -298,7 +354,7 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
}
private _withServerManager<R>(handle: number, callback: (manager: azdata.nb.ServerManager) => PromiseLike<R>): Promise<R> {
return this._withNotebookManager(handle, (notebookManager) => {
return this._withExecuteManager(handle, (notebookManager) => {
let serverManager = notebookManager.serverManager;
if (!serverManager) {
return Promise.reject(new Error(localize('noServerManager', "Notebook Manager for notebook {0} does not have a server manager. Cannot perform operations on it", notebookManager.uriString)));
@@ -308,7 +364,7 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
}
private _withContentManager<R>(handle: number, callback: (manager: azdata.nb.ContentManager) => PromiseLike<R>): Promise<R> {
return this._withNotebookManager(handle, (notebookManager) => {
return this._withSerializationManager(handle, (notebookManager) => {
let contentManager = notebookManager.contentManager;
if (!contentManager) {
return Promise.reject(new Error(localize('noContentManager', "Notebook Manager for notebook {0} does not have a content manager. Cannot perform operations on it", notebookManager.uriString)));
@@ -318,7 +374,7 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
}
private _withSessionManager<R>(handle: number, callback: (manager: azdata.nb.SessionManager) => PromiseLike<R>): Promise<R> {
return this._withNotebookManager(handle, (notebookManager) => {
return this._withExecuteManager(handle, (notebookManager) => {
let sessionManager = notebookManager.sessionManager;
if (!sessionManager) {
return Promise.reject(new Error(localize('noSessionManager', "Notebook Manager for notebook {0} does not have a session manager. Cannot perform operations on it", notebookManager.uriString)));
@@ -344,12 +400,11 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
//#endregion
}
class NotebookManagerAdapter implements azdata.nb.NotebookManager {
class SerializationManagerAdapter implements azdata.nb.SerializationManager {
public handle: number;
constructor(
public readonly provider: azdata.nb.NotebookProvider,
private manager: azdata.nb.NotebookManager,
public readonly provider: azdata.nb.NotebookSerializationProvider,
private manager: azdata.nb.SerializationManager,
public readonly uriString: string
) {
}
@@ -357,6 +412,16 @@ class NotebookManagerAdapter implements azdata.nb.NotebookManager {
public get contentManager(): azdata.nb.ContentManager {
return this.manager.contentManager;
}
}
class ExecuteManagerAdapter implements azdata.nb.ExecuteManager {
public handle: number;
constructor(
public readonly provider: azdata.nb.NotebookExecuteProvider,
private manager: azdata.nb.ExecuteManager,
public readonly uriString: string
) {
}
public get sessionManager(): azdata.nb.SessionManager {
return this.manager.sessionManager;

View File

@@ -247,7 +247,7 @@ export class ExtHostNotebookDocumentsAndEditors implements ExtHostNotebookDocume
registerNavigationProvider(provider: azdata.nb.NavigationProvider): vscode.Disposable {
if (!provider || !provider.providerId) {
throw new Error(localize('providerRequired', "A NotebookProvider with valid providerId must be passed to this method"));
throw new Error(localize('navigationProviderRequired', "A NavigationProvider with valid providerId must be passed to this method"));
}
const handle = this._addNewAdapter(provider);
this._proxy.$registerNavigationProvider(provider.providerId, handle);

View File

@@ -546,8 +546,11 @@ export function createAdsApiFactory(accessor: ServicesAccessor): IAdsExtensionAp
showNotebookDocument(uri: vscode.Uri, showOptions: azdata.nb.NotebookShowOptions) {
return extHostNotebookDocumentsAndEditors.showNotebookDocument(uri, showOptions);
},
registerNotebookProvider(provider: azdata.nb.NotebookProvider): vscode.Disposable {
return extHostNotebook.registerNotebookProvider(provider);
registerSerializationProvider(provider: azdata.nb.NotebookSerializationProvider): vscode.Disposable {
return extHostNotebook.registerSerializationProvider(provider);
},
registerExecuteProvider(provider: azdata.nb.NotebookExecuteProvider): vscode.Disposable {
return extHostNotebook.registerExecuteProvider(provider);
},
registerNavigationProvider(provider: azdata.nb.NavigationProvider): vscode.Disposable {
return extHostNotebookDocumentsAndEditors.registerNavigationProvider(provider);

View File

@@ -18,9 +18,10 @@ import { ITreeComponentItem } from 'sql/workbench/common/views';
import { ITaskHandlerDescription } from 'sql/workbench/services/tasks/common/tasks';
import {
IItemConfig, IComponentShape, IModelViewDialogDetails, IModelViewTabDetails, IModelViewButtonDetails,
IModelViewWizardDetails, IModelViewWizardPageDetails, INotebookManagerDetails, INotebookSessionDetails,
IModelViewWizardDetails, IModelViewWizardPageDetails, IExecuteManagerDetails, INotebookSessionDetails,
INotebookKernelDetails, INotebookFutureDetails, FutureMessageType, INotebookFutureDone, ISingleNotebookEditOperation,
NotebookChangeKind
NotebookChangeKind,
ISerializationManagerDetails
} from 'sql/workbench/api/common/sqlExtHostTypes';
import { IUndoStopOptions } from 'vs/workbench/api/common/extHost.protocol';
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
@@ -863,7 +864,8 @@ export interface ExtHostNotebookShape {
* Looks up a notebook manager for a given notebook URI
* @returns handle of the manager to be used when sending
*/
$getNotebookManager(providerHandle: number, notebookUri: UriComponents): Thenable<INotebookManagerDetails>;
$getSerializationManagerDetails(providerHandle: number, notebookUri: UriComponents): Thenable<ISerializationManagerDetails>;
$getExecuteManagerDetails(providerHandle: number, notebookUri: UriComponents): Thenable<IExecuteManagerDetails>;
$handleNotebookClosed(notebookUri: UriComponents): void;
// Server Manager APIs
@@ -871,8 +873,8 @@ export interface ExtHostNotebookShape {
$doStopServer(managerHandle: number): Thenable<void>;
// Content Manager APIs
$getNotebookContents(managerHandle: number, notebookUri: UriComponents): Thenable<azdata.nb.INotebookContents>;
$save(managerHandle: number, notebookUri: UriComponents, notebook: azdata.nb.INotebookContents): Thenable<azdata.nb.INotebookContents>;
$deserializeNotebook(managerHandle: number, contents: string): Thenable<azdata.nb.INotebookContents>;
$serializeNotebook(managerHandle: number, notebook: azdata.nb.INotebookContents): Thenable<string>;
// Session Manager APIs
$refreshSpecs(managerHandle: number): Thenable<azdata.nb.IAllKernels>;
@@ -899,8 +901,10 @@ export interface ExtHostNotebookShape {
}
export interface MainThreadNotebookShape extends IDisposable {
$registerNotebookProvider(providerId: string, handle: number): void;
$unregisterNotebookProvider(handle: number): void;
$registerSerializationProvider(providerId: string, handle: number): void;
$registerExecuteProvider(providerId: string, handle: number): void;
$unregisterSerializationProvider(handle: number): void;
$unregisterExecuteProvider(handle: number): void;
$onFutureMessage(futureId: number, type: FutureMessageType, payload: azdata.nb.IMessage): void;
$onFutureDone(futureId: number, done: INotebookFutureDone): void;
}

View File

@@ -551,9 +551,13 @@ export class SqlThemeIcon {
}
}
export interface INotebookManagerDetails {
export interface ISerializationManagerDetails {
handle: number;
hasContentManager: boolean;
}
export interface IExecuteManagerDetails {
handle: number;
hasServerManager: boolean;
}