/*--------------------------------------------------------------------------------------------- * 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 { 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 { // 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(module: URI, activationTimesBuilder: ExtensionActivationTimesBuilder): Promise { 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 (_module.exports !== _exports ? _module.exports : _exports); } finally { activationTimesBuilder.codeLoadingStop(); } } async $setRemoteEnvironment(_env: { [key: string]: string | null }): Promise { throw new Error('Not supported'); } } function ensureSuffix(path: string, suffix: string): string { return path.endsWith(suffix) ? path : path + suffix; }