Skip to content

feat: Proxy extHost load module through messagePort

Paul Slaughter requested to merge ps-proxy-ext-host-to-message-port into main

Description

See this thread for more context.

the situation:

  • For us to securely enable extension marketplace we need to resolve https://gitlab.com/gitlab-org/gitlab-web-ide/-/issues/150+ by adding webEndpointUrlTemplate in workbench configuration.
  • This creates a separate origin for extensions.
  • This creates CORS issue when extension tries to pull assets when starting up.
  • VSCode expects the extensions assets to be hosted somewhere that enables CORS. Since the Web IDE is self-hosted we don't really have control of how the Web IDE assets are self hosted. Right now we don't require any CORS headers and this would be a breaking change for many users/customers.

the solution:

Proxy fetch to the outer context through messagePorts API since we're already using that. This allows us to work around CORS by proxying the request to the relevant origin.

How to test?

  1. In Web IDE, checkout out the branch for this MR feat: Add cross origin extension host (gitlab-web-ide!293 - merged)

  2. Apply this patch in Web IDE:

    diff --git a/packages/vscode-bootstrap/src/start.ts b/packages/vscode-bootstrap/src/start.ts
    index 425afff..1fcd1ce 100644
    --- a/packages/vscode-bootstrap/src/start.ts
    +++ b/packages/vscode-bootstrap/src/start.ts
    @@ -92,12 +92,12 @@ const BASE_OPTIONS: Partial<IWorkbenchConstructionOptions> = {
         privacyStatementUrl: '',
         showTelemetryOptOut: false,
         // 'commit' should be same as vscode_version.json
    -    commit: 'cc647a6c3fe1bc82cbcae763de7ec0939cc092c3',
    +    commit: '70051d40636e6d3e6b5f14ead1c4f12761b98e9e',
         quality: 'stable',
         webviewContentExternalBaseUrlTemplate:
    -      'https://{{uuid}}.cdn.web-ide.gitlab-static.net/web-ide-vscode/{{quality}}/{{commit}}/out/vs/workbench/contrib/webview/browser/pre/',
    +      'https://{{uuid}}.staging.cdn.web-ide.gitlab-static.net/web-ide-vscode/{{quality}}/{{commit}}/out/vs/workbench/contrib/webview/browser/pre/',
         webEndpointUrlTemplate:
    -      'https://{{uuid}}.cdn.web-ide.gitlab-static.net/web-ide-vscode/{{quality}}/{{commit}}',
    +      'https://{{uuid}}.staging.cdn.web-ide.gitlab-static.net/web-ide-vscode/{{quality}}/{{commit}}',
         trustedExtensionAuthAccess: ['gitlab.gitlab-workflow', 'gitlab.gitlab-web-ide'],
       },
     };
    
    
  3. Start Web IDE with yarn run start:example and visit with a custom host setup in /etc/host.

Screenshot

Before After
Screenshot_2024-03-04_at_12.34.07_AM Screenshot_2024-03-04_at_12.05.08_AM
Edited by Paul Slaughter

Merge request reports