Skip to content
This repository was archived by the owner on Jan 22, 2019. It is now read-only.

Commit 76a629c

Browse files
committed
feat: use new Sourcegraph extension API
Also: - run extension host in web worker, also pass init data - expose queryLSP (and queryGraphQL) to extensions
1 parent 90b2be3 commit 76a629c

File tree

10 files changed

+109
-46
lines changed

10 files changed

+109
-46
lines changed

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,12 @@
8585
"typescript": "^3.0.1",
8686
"uglifyjs-webpack-plugin": "^1.3.0",
8787
"web-ext": "^2.5.0",
88-
"webpack": "^4.6.0"
88+
"webpack": "^4.6.0",
89+
"worker-loader": "^2.0.0"
8990
},
9091
"dependencies": {
9192
"@sourcegraph/codeintellify": "^3.8.4",
92-
"@sourcegraph/extensions-client-common": "^8.2.0",
93+
"@sourcegraph/extensions-client-common": "^8.4.0",
9394
"@sourcegraph/react-loading-spinner": "0.0.6",
9495
"@sqs/jsonc-parser": "^1.0.3",
9596
"@types/uglifyjs-webpack-plugin": "^1.1.0",
@@ -114,7 +115,7 @@
114115
"reactstrap": "^5.0.0-beta.2",
115116
"rxjs": "^6.3.2",
116117
"socket.io-client": "^2.1.1",
117-
"sourcegraph": "^15.0.0",
118+
"sourcegraph": "^17.1.0",
118119
"string-score": "^1.0.1",
119120
"textarea-caret": "^3.1.0",
120121
"ts-key-enum": "^2.0.0",

src/extension/scripts/background.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import '../../config/polyfill'
44

55
import { without } from 'lodash'
66
import { ajax } from 'rxjs/ajax'
7+
import { InitData } from 'sourcegraph/module/extension/extensionHost'
8+
import ExtensionHostWorker from 'worker-loader?inline!./extensionHost.worker'
79
import * as browserAction from '../../browser/browserAction'
810
import * as contextMenus from '../../browser/contextMenu'
911
import * as omnibox from '../../browser/omnibox'
@@ -393,7 +395,18 @@ function spawnWebWorkerFromURL(url: string): Promise<Worker> {
393395
responseType: 'blob',
394396
})
395397
.toPromise()
396-
.then(response => new Worker(window.URL.createObjectURL(response.response)))
398+
.then(response => {
399+
const blobURL = window.URL.createObjectURL(response.response)
400+
try {
401+
const worker = new ExtensionHostWorker()
402+
const initData: InitData = { bundleURL: blobURL }
403+
worker.postMessage(initData)
404+
return worker
405+
} catch (err) {
406+
console.error(err)
407+
}
408+
throw new Error('failed to initialize extension host')
409+
})
397410
}
398411

399412
/**
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { extensionHostWorkerMain } from 'sourcegraph/module/extension/workerMain'
2+
3+
// We're running in a Web Worker, so `self` is a DedicatedWorkerGlobalScope. For simplicity, our TypeScript config
4+
// doesn't include lib.webworker.d.ts, so `self` here is actually not the correct type and requires this cast.
5+
extensionHostWorkerMain(self as any)

src/libs/github/inject.tsx

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,19 @@ import {
1010
import { propertyIsDefined } from '@sourcegraph/codeintellify/lib/helpers'
1111
import { HoverMerged } from '@sourcegraph/codeintellify/lib/types'
1212
import { CommandListPopoverButton } from '@sourcegraph/extensions-client-common/lib/app/CommandList'
13-
import { ExtensionStatusPopover } from '@sourcegraph/extensions-client-common/lib/app/ExtensionStatus'
1413
import {
1514
Controller as ClientController,
1615
createController,
1716
} from '@sourcegraph/extensions-client-common/lib/client/controller'
1817
import { Controller } from '@sourcegraph/extensions-client-common/lib/controller'
1918
import { isErrorLike } from '@sourcegraph/extensions-client-common/lib/errors'
19+
import { ConfigurationCascade } from '@sourcegraph/extensions-client-common/lib/settings'
20+
import { ConfigurationSubject } from '@sourcegraph/extensions-client-common/lib/settings'
2021
import {
2122
ConfigurationCascadeOrError,
2223
ConfiguredSubject,
2324
Settings,
2425
} from '@sourcegraph/extensions-client-common/lib/settings'
25-
import { ConfigurationSubject } from '@sourcegraph/extensions-client-common/lib/settings'
26-
import { ConfigurationCascade } from '@sourcegraph/extensions-client-common/lib/settings'
2726
import { identity } from 'lodash'
2827
import mermaid from 'mermaid'
2928
import * as React from 'react'
@@ -34,8 +33,8 @@ import { ContributableMenu } from 'sourcegraph/module/protocol'
3433
import { Disposable } from 'vscode-languageserver'
3534
import { findElementWithOffset, getTargetLineAndOffset, GitHubBlobUrl } from '.'
3635
import storage from '../../browser/storage'
37-
import { applyDecoration, createMessageTransports } from '../../shared/backend/extensions'
3836
import { createExtensionsContextController } from '../../shared/backend/extensions'
37+
import { applyDecoration, createMessageTransports } from '../../shared/backend/extensions'
3938
import {
4039
createJumpURLFetcher,
4140
createLSPFromExtensions,
@@ -133,10 +132,10 @@ function injectCodeIntelligence(): void {
133132
if (isSingleCodeFile && useExtensions && filePath) {
134133
extensionsContextController = createExtensionsContextController(sourcegraphUrl)
135134
extensionsController = createController(extensionsContextController.context, createMessageTransports)
136-
simpleProviderFns = createLSPFromExtensions(extensionsController)
135+
simpleProviderFns = createLSPFromExtensions(extensionsController!)
137136

138-
const constExtensionsContextController = extensionsContextController
139-
const constController = extensionsController
137+
const constExtensionsContextController = extensionsContextController!
138+
const constController = extensionsController!
140139

141140
injectExtensionsGlobalComponents({
142141
extensionsController: constController,
@@ -220,11 +219,8 @@ function injectCodeIntelligence(): void {
220219
document: {
221220
uri: toURIWithPath({ repoPath, commitID, filePath }),
222221
languageId: getModeFromPath(filePath) || 'could not determine mode',
223-
version: 0,
224222
text: gitHubCurrentFileContent,
225223
},
226-
selections: [],
227-
visibleRanges: [],
228224
},
229225
extensions: configuredExtensions,
230226
configuration: logThenDropConfigurationErrors(configurationCascade),
@@ -322,17 +318,6 @@ function injectExtensionsGlobalComponents({
322318
extensionsController: ClientController<ConfigurationSubject, Settings>
323319
extensionsContextController: Controller<ConfigurationSubject, Settings>
324320
}): void {
325-
const statusElem = document.createElement('div')
326-
statusElem.className = 'sourcegraph-extensions-global'
327-
document.body.appendChild(statusElem)
328-
render(
329-
<ExtensionStatusPopover
330-
extensionsController={extensionsController}
331-
caretIcon={extensionsContextController.context.icons.CaretDown}
332-
loaderIcon={extensionsContextController.context.icons.Loader}
333-
/>,
334-
statusElem
335-
)
336321
const headerElem = document.querySelector('div.HeaderMenu>div:last-child')
337322
if (headerElem) {
338323
const commandListElem = document.createElement('div')

src/shared/backend/PortMessageTransports.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { MessageTransports } from 'sourcegraph/module/jsonrpc2/connection'
2-
import { Message } from 'sourcegraph/module/jsonrpc2/messages'
1+
import { MessageTransports } from 'sourcegraph/module/protocol/jsonrpc2/connection'
2+
import { Message } from 'sourcegraph/module/protocol/jsonrpc2/messages'
33
import {
44
AbstractMessageReader,
55
AbstractMessageWriter,
66
DataCallback,
77
MessageReader,
88
MessageWriter,
9-
} from 'sourcegraph/module/jsonrpc2/transport'
9+
} from 'sourcegraph/module/protocol/jsonrpc2/transport'
1010
import { ExtensionConnectionInfo } from '../../extension/scripts/background'
1111

1212
class PortMessageReader extends AbstractMessageReader implements MessageReader {

src/shared/backend/extensions.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,26 @@ import {
1111
Settings,
1212
} from '@sourcegraph/extensions-client-common/lib/settings'
1313
import { LoadingSpinner } from '@sourcegraph/react-loading-spinner'
14-
import { applyEdits } from '@sqs/jsonc-parser'
1514
import * as JSONC from '@sqs/jsonc-parser'
15+
import { applyEdits } from '@sqs/jsonc-parser'
1616
import { removeProperty, setProperty } from '@sqs/jsonc-parser/lib/edit'
1717
import { isEqual } from 'lodash'
1818
import Alert from 'mdi-react/AlertIcon'
1919
import MenuDown from 'mdi-react/MenuDownIcon'
2020
import Menu from 'mdi-react/MenuIcon'
2121
import { combineLatest, from, Observable, throwError } from 'rxjs'
2222
import { distinctUntilChanged, map, mergeMap, switchMap, take } from 'rxjs/operators'
23-
import { ClientOptions } from 'sourcegraph/module/client/client'
24-
import { MessageTransports } from 'sourcegraph/module/jsonrpc2/connection'
25-
import { TextDocumentDecoration } from 'sourcegraph/module/protocol'
23+
import { MessageTransports } from 'sourcegraph/module/protocol/jsonrpc2/connection'
24+
import { TextDocumentDecoration } from 'sourcegraph/module/protocol/plainTypes'
2625
import uuid from 'uuid'
2726
import { Disposable } from 'vscode-languageserver'
2827
import storage, { StorageItems } from '../../browser/storage'
29-
import { ExtensionConnectionInfo } from '../../extension/scripts/background'
3028
import { onFirstMessage } from '../../extension/scripts/background'
29+
import { ExtensionConnectionInfo } from '../../extension/scripts/background'
3130
import { getContext } from './context'
3231
import { createAggregateError, isErrorLike } from './errors'
3332
import { queryGraphQL } from './graphql'
33+
import { sendLSPHTTPRequests } from './lsp'
3434
import { createPortMessageTransports } from './PortMessageTransports'
3535

3636
const createPlatformMessageTransports = (connectionInfo: ExtensionConnectionInfo) =>
@@ -48,8 +48,7 @@ const createPlatformMessageTransports = (connectionInfo: ExtensionConnectionInfo
4848
})
4949

5050
export function createMessageTransports(
51-
extension: Pick<ConfiguredExtension, 'id' | 'manifest'>,
52-
options: ClientOptions
51+
extension: Pick<ConfiguredExtension, 'id' | 'manifest'>
5352
): Promise<MessageTransports> {
5453
if (!extension.manifest) {
5554
throw new Error(`unable to connect to extension ${JSON.stringify(extension.id)}: no manifest found`)
@@ -263,6 +262,7 @@ export function createExtensionsContextController(
263262
queryGraphQL(getContext({ repoKey: '', isRepoSpecific: false }), request, variables, url)
264263
)
265264
),
265+
queryLSP: requests => sendLSPHTTPRequests(requests),
266266
icons: {
267267
Loader: LoadingSpinner as React.ComponentType<{ className: string; onClick?: () => void }>,
268268
Warning: Alert as React.ComponentType<{ className: string; onClick?: () => void }>,

src/shared/backend/lsp.tsx

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { ConfigurationSubject, Settings } from '@sourcegraph/extensions-client-c
44
import { from, Observable, of, OperatorFunction, throwError as error } from 'rxjs'
55
import { ajax, AjaxResponse } from 'rxjs/ajax'
66
import { catchError, map, tap } from 'rxjs/operators'
7+
import { HoverMerged } from 'sourcegraph/module/client/types/hover'
78
import { TextDocumentPositionParams } from 'sourcegraph/module/protocol'
8-
import { HoverMerged } from 'sourcegraph/module/types/hover'
99
import { Definition, TextDocumentIdentifier } from 'vscode-languageserver-types'
1010
import { InitializeResult, ServerCapabilities } from 'vscode-languageserver/lib/main'
1111
import {
@@ -44,6 +44,31 @@ export function isEmptyHover(hover: HoverMerged | null): boolean {
4444
return !hover || !hover.contents || (Array.isArray(hover.contents) && hover.contents.length === 0)
4545
}
4646

47+
export function sendLSPHTTPRequests(requests: any[]): Observable<any> {
48+
const urlPathHint = requests[1] && requests[1].method
49+
return ajax({
50+
method: 'POST',
51+
url: `${sourcegraphUrl}/.api/xlang/${urlPathHint || ''}`,
52+
headers: getHeaders(),
53+
crossDomain: true,
54+
withCredentials: true,
55+
body: JSON.stringify(requests),
56+
async: true,
57+
}).pipe(
58+
// Workaround for https://github.com/ReactiveX/rxjs/issues/3606
59+
tap(response => {
60+
if (response.status === 0) {
61+
throw Object.assign(new Error('Ajax status 0'), response)
62+
}
63+
}),
64+
catchError<AjaxResponse, never>(err => {
65+
normalizeAjaxError(err)
66+
throw err
67+
}),
68+
map(({ response }) => response)
69+
)
70+
}
71+
4772
function wrapLSP(req: LSPRequest, ctx: AbsoluteRepo, path: string): any[] {
4873
return [
4974
{

src/shared/repo/tooltips.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { highlightBlock, registerLanguage } from 'highlight.js/lib/highlight'
22
import * as _ from 'lodash'
33
import marked from 'marked'
4-
import { HoverMerged } from 'sourcegraph/module/types/hover'
5-
import { MarkedString, MarkupContent } from 'vscode-languageserver-types'
4+
import { MarkupContent } from 'sourcegraph'
5+
import { HoverMerged } from 'sourcegraph/module/client/types/hover'
6+
import { MarkedString } from 'vscode-languageserver-types'
67
import { AbsoluteRepoFile, AbsoluteRepoFilePosition, parseBrowserRepoURL } from '.'
78
import { makeCloseIcon, makeSourcegraphIcon } from '../components/Icons'
89
import { getModeFromPath, sourcegraphUrl } from '../util/context'

src/types/globals/index.d.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,15 @@ declare module '*.json' {
2121
const value: any
2222
export default value
2323
}
24+
25+
/**
26+
* For Web Worker entrypoints using Webpack's worker-loader.
27+
*
28+
* See https://github.com/webpack-contrib/worker-loader#integrating-with-typescript.
29+
*/
30+
declare module 'worker-loader*' {
31+
class WebpackWorker extends Worker {
32+
constructor()
33+
}
34+
export default WebpackWorker
35+
}

yarn.lock

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -868,9 +868,9 @@
868868
rxjs "^6.3.2"
869869
vscode-languageserver-types "^3.8.2"
870870

871-
"@sourcegraph/extensions-client-common@^8.2.0":
872-
version "8.2.0"
873-
resolved "https://registry.yarnpkg.com/@sourcegraph/extensions-client-common/-/extensions-client-common-8.2.0.tgz#c0b2c927680e743f354a8ba5557f339304390a13"
871+
"@sourcegraph/extensions-client-common@^8.4.0":
872+
version "8.4.1"
873+
resolved "https://registry.yarnpkg.com/@sourcegraph/extensions-client-common/-/extensions-client-common-8.4.1.tgz#292192a708b45ff00dca97d4eec1a914f2cc24a6"
874874
dependencies:
875875
bootstrap "^4.1.3"
876876
lodash-es "^4.17.10"
@@ -879,6 +879,7 @@
879879
react-router-dom "^4.3.1"
880880
reactstrap "^6.4.0"
881881
rxjs "^6.3.2"
882+
sourcegraph "^17.0.0"
882883
string-score "^1.0.1"
883884
ts-key-enum "^2.0.0"
884885

@@ -6531,7 +6532,7 @@ loader-runner@^2.3.0:
65316532
version "2.3.0"
65326533
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
65336534

6534-
loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0:
6535+
loader-utils@^1.0.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0:
65356536
version "1.1.0"
65366537
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
65376538
dependencies:
@@ -9791,6 +9792,13 @@ schema-utils@^0.3.0:
97919792
dependencies:
97929793
ajv "^5.0.0"
97939794

9795+
schema-utils@^0.4.0:
9796+
version "0.4.7"
9797+
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
9798+
dependencies:
9799+
ajv "^6.1.0"
9800+
ajv-keywords "^3.1.0"
9801+
97949802
schema-utils@^0.4.4, schema-utils@^0.4.5:
97959803
version "0.4.5"
97969804
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
@@ -10425,13 +10433,19 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
1042510433
version "0.6.1"
1042610434
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
1042710435

10428-
sourcegraph@^15.0.0:
10429-
version "15.0.0"
10430-
resolved "https://registry.yarnpkg.com/sourcegraph/-/sourcegraph-15.0.0.tgz#4507c054bd195cd454e8147cf0e0220262719e33"
10436+
sourcegraph@^17.0.0:
10437+
version "17.0.0"
10438+
resolved "https://registry.yarnpkg.com/sourcegraph/-/sourcegraph-17.0.0.tgz#1819355f35ac6633983780a17b69a657ff2f4770"
10439+
dependencies:
10440+
minimatch "^3.0.4"
10441+
rxjs "^6.3.2"
10442+
10443+
sourcegraph@^17.1.0:
10444+
version "17.1.0"
10445+
resolved "https://registry.yarnpkg.com/sourcegraph/-/sourcegraph-17.1.0.tgz#ea45c2cd119508d2d0be0a2bd6e1407572c30b4d"
1043110446
dependencies:
1043210447
minimatch "^3.0.4"
1043310448
rxjs "^6.3.2"
10434-
uuid "^3.3.2"
1043510449

1043610450
spawn-error-forwarder@~1.0.0:
1043710451
version "1.0.0"
@@ -11908,6 +11922,13 @@ worker-farm@^1.5.2, worker-farm@^1.6.0:
1190811922
dependencies:
1190911923
errno "~0.1.7"
1191011924

11925+
worker-loader@^2.0.0:
11926+
version "2.0.0"
11927+
resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-2.0.0.tgz#45fda3ef76aca815771a89107399ee4119b430ac"
11928+
dependencies:
11929+
loader-utils "^1.0.0"
11930+
schema-utils "^0.4.0"
11931+
1191111932
wrap-ansi@^2.0.0:
1191211933
version "2.1.0"
1191311934
resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"

0 commit comments

Comments
 (0)