mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-23 10:08:49 +01:00
84 lines
3.1 KiB
TypeScript
84 lines
3.1 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { createApiFactoryAndRegisterActors } from 'vs/workbench/api/common/extHost.api.impl';
|
|
import { ExtensionActivationTimesBuilder } from 'vs/workbench/api/common/extHostExtensionActivator';
|
|
import { AbstractExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService';
|
|
import { endsWith } from 'vs/base/common/strings';
|
|
import { URI } from 'vs/base/common/uri';
|
|
import { RequireInterceptor } from 'vs/workbench/api/common/extHostRequireInterceptor';
|
|
|
|
class WorkerRequireInterceptor extends RequireInterceptor {
|
|
|
|
_installInterceptor() { }
|
|
|
|
getModule(request: string, parent: URI): undefined | any {
|
|
for (let alternativeModuleName of this._alternatives) {
|
|
let alternative = alternativeModuleName(request);
|
|
if (alternative) {
|
|
request = alternative;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (this._factories.has(request)) {
|
|
return this._factories.get(request)!.load(request, parent, () => { throw new Error('CANNOT LOAD MODULE from here.'); });
|
|
}
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
export class ExtHostExtensionService extends AbstractExtHostExtensionService {
|
|
|
|
private _fakeModules?: WorkerRequireInterceptor;
|
|
|
|
protected async _beforeAlmostReadyToRunExtensions(): Promise<void> {
|
|
// initialize API and register actors
|
|
const apiFactory = this._instaService.invokeFunction(createApiFactoryAndRegisterActors);
|
|
this._fakeModules = this._instaService.createInstance(WorkerRequireInterceptor, apiFactory, this._registry);
|
|
await this._fakeModules.install();
|
|
}
|
|
|
|
protected async _loadCommonJSModule<T>(module: URI, activationTimesBuilder: ExtensionActivationTimesBuilder): Promise<T> {
|
|
|
|
module = module.with({ path: ensureSuffix(module.path, '.js') });
|
|
const response = await fetch(module.toString(true));
|
|
|
|
if (response.status !== 200) {
|
|
throw new Error(response.statusText);
|
|
}
|
|
|
|
// fetch JS sources as text and create a new function around it
|
|
const initFn = new Function('module', 'exports', 'require', 'window', await response.text());
|
|
|
|
// define commonjs globals: `module`, `exports`, and `require`
|
|
const _exports = {};
|
|
const _module = { exports: _exports };
|
|
const _require = (request: string) => {
|
|
const result = this._fakeModules!.getModule(request, module);
|
|
if (result === undefined) {
|
|
throw new Error(`Cannot load module '${request}'`);
|
|
}
|
|
return result;
|
|
};
|
|
|
|
try {
|
|
activationTimesBuilder.codeLoadingStart();
|
|
initFn(_module, _exports, _require, self);
|
|
return <T>(_module.exports !== _exports ? _module.exports : _exports);
|
|
} finally {
|
|
activationTimesBuilder.codeLoadingStop();
|
|
}
|
|
}
|
|
|
|
async $setRemoteEnvironment(_env: { [key: string]: string | null }): Promise<void> {
|
|
throw new Error('Not supported');
|
|
}
|
|
}
|
|
|
|
function ensureSuffix(path: string, suffix: string): string {
|
|
return endsWith(path, suffix) ? path : path + suffix;
|
|
}
|