@gitpod/gitpod-protocol 0.1.5-vn-integrate-gitpod-yml-tasks-into-jetbrainsa.5 → 0.1.5-vn-6525.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/gitpod-schema.json +28 -2
- package/lib/accounting-protocol.d.ts +10 -10
- package/lib/accounting-protocol.d.ts.map +1 -1
- package/lib/accounting-protocol.js +22 -31
- package/lib/accounting-protocol.js.map +1 -1
- package/lib/admin-protocol.d.ts +4 -2
- package/lib/admin-protocol.d.ts.map +1 -1
- package/lib/admin-protocol.js.map +1 -1
- package/lib/analytics.d.ts +4 -5
- package/lib/analytics.d.ts.map +1 -1
- package/lib/analytics.js.map +1 -1
- package/lib/auth.d.ts.map +1 -1
- package/lib/context-url.d.ts.map +1 -1
- package/lib/context-url.js +3 -3
- package/lib/context-url.js.map +1 -1
- package/lib/context-url.spec.d.ts.map +1 -1
- package/lib/context-url.spec.js +20 -5
- package/lib/context-url.spec.js.map +1 -1
- package/lib/email-protocol.d.ts +1 -1
- package/lib/email-protocol.d.ts.map +1 -1
- package/lib/email-protocol.js.map +1 -1
- package/lib/encryption/container-module.d.ts.map +1 -1
- package/lib/encryption/container-module.js +1 -1
- package/lib/encryption/container-module.js.map +1 -1
- package/lib/encryption/encryption-engine.d.ts.map +1 -1
- package/lib/encryption/encryption-engine.js +7 -7
- package/lib/encryption/encryption-engine.js.map +1 -1
- package/lib/encryption/encryption-engine.spec.d.ts.map +1 -1
- package/lib/encryption/encryption-engine.spec.js +2 -3
- package/lib/encryption/encryption-engine.spec.js.map +1 -1
- package/lib/encryption/encryption-service.d.ts.map +1 -1
- package/lib/encryption/encryption-service.js +1 -1
- package/lib/encryption/encryption-service.js.map +1 -1
- package/lib/encryption/key-provider.d.ts.map +1 -1
- package/lib/encryption/key-provider.js +7 -9
- package/lib/encryption/key-provider.js.map +1 -1
- package/lib/env.d.ts +1 -1
- package/lib/env.d.ts.map +1 -1
- package/lib/env.js +5 -5
- package/lib/env.js.map +1 -1
- package/lib/gitpod-file-parser.d.ts.map +1 -1
- package/lib/gitpod-file-parser.js +6 -6
- package/lib/gitpod-file-parser.js.map +1 -1
- package/lib/gitpod-file-parser.spec.js +42 -39
- package/lib/gitpod-file-parser.spec.js.map +1 -1
- package/lib/gitpod-service.d.ts +23 -26
- package/lib/gitpod-service.d.ts.map +1 -1
- package/lib/gitpod-service.js +32 -26
- package/lib/gitpod-service.js.map +1 -1
- package/lib/headless-workspace-log.d.ts +1 -0
- package/lib/headless-workspace-log.d.ts.map +1 -1
- package/lib/headless-workspace-log.js +2 -1
- package/lib/headless-workspace-log.js.map +1 -1
- package/lib/ide-frontend-service.d.ts +1 -1
- package/lib/ide-protocol.d.ts +6 -6
- package/lib/ide-protocol.d.ts.map +1 -1
- package/lib/index.d.ts +16 -16
- package/lib/installation-admin-protocol.d.ts +1 -1
- package/lib/installation-admin-protocol.d.ts.map +1 -1
- package/lib/installation-admin-protocol.js +2 -2
- package/lib/installation-admin-protocol.js.map +1 -1
- package/lib/license-protocol.d.ts.map +1 -1
- package/lib/license-protocol.js.map +1 -1
- package/lib/messaging/browser/connection.d.ts +1 -1
- package/lib/messaging/browser/connection.d.ts.map +1 -1
- package/lib/messaging/browser/connection.js +19 -19
- package/lib/messaging/browser/connection.js.map +1 -1
- package/lib/messaging/browser/window-connection.d.ts +4 -4
- package/lib/messaging/browser/window-connection.d.ts.map +1 -1
- package/lib/messaging/browser/window-connection.js +9 -6
- package/lib/messaging/browser/window-connection.js.map +1 -1
- package/lib/messaging/client-call-metrics.d.ts +2 -2
- package/lib/messaging/client-call-metrics.d.ts.map +1 -1
- package/lib/messaging/client-call-metrics.js +20 -20
- package/lib/messaging/client-call-metrics.js.map +1 -1
- package/lib/messaging/error.d.ts.map +1 -1
- package/lib/messaging/error.js.map +1 -1
- package/lib/messaging/handler.d.ts.map +1 -1
- package/lib/messaging/handler.js +1 -1
- package/lib/messaging/node/connection.js +8 -8
- package/lib/messaging/node/connection.js.map +1 -1
- package/lib/messaging/proxy-factory.d.ts +1 -1
- package/lib/messaging/proxy-factory.d.ts.map +1 -1
- package/lib/messaging/proxy-factory.js +7 -9
- package/lib/messaging/proxy-factory.js.map +1 -1
- package/lib/payment-protocol.d.ts.map +1 -1
- package/lib/payment-protocol.js +1 -1
- package/lib/payment-protocol.js.map +1 -1
- package/lib/permission.d.ts +2 -2
- package/lib/permission.d.ts.map +1 -1
- package/lib/permission.js +12 -23
- package/lib/permission.js.map +1 -1
- package/lib/plans.d.ts +3 -3
- package/lib/plans.d.ts.map +1 -1
- package/lib/plans.js +206 -171
- package/lib/plans.js.map +1 -1
- package/lib/protocol.d.ts +53 -37
- package/lib/protocol.d.ts.map +1 -1
- package/lib/protocol.js +85 -86
- package/lib/protocol.js.map +1 -1
- package/lib/snapshot-url.spec.js.map +1 -1
- package/lib/team-subscription-protocol.d.ts +5 -3
- package/lib/team-subscription-protocol.d.ts.map +1 -1
- package/lib/team-subscription-protocol.js +4 -4
- package/lib/team-subscription-protocol.js.map +1 -1
- package/lib/teams-projects-protocol.d.ts +3 -3
- package/lib/teams-projects-protocol.d.ts.map +1 -1
- package/lib/teams-projects-protocol.js +1 -1
- package/lib/teams-projects-protocol.js.map +1 -1
- package/lib/typings/globals.d.ts +2 -2
- package/lib/typings/globals.d.ts.map +1 -1
- package/lib/util/analytics.d.ts.map +1 -1
- package/lib/util/analytics.js +12 -3
- package/lib/util/analytics.js.map +1 -1
- package/lib/util/async-iterator.d.ts.map +1 -1
- package/lib/util/async-iterator.js +3 -3
- package/lib/util/async-iterator.js.map +1 -1
- package/lib/util/cancelable.js.map +1 -1
- package/lib/util/date-time.js +6 -6
- package/lib/util/date-time.js.map +1 -1
- package/lib/util/deferred.js.map +1 -1
- package/lib/util/disposable.d.ts.map +1 -1
- package/lib/util/disposable.js +2 -2
- package/lib/util/disposable.js.map +1 -1
- package/lib/util/event.d.ts.map +1 -1
- package/lib/util/event.js +5 -3
- package/lib/util/event.js.map +1 -1
- package/lib/util/garbage-collected-cache.d.ts.map +1 -1
- package/lib/util/garbage-collected-cache.js +1 -1
- package/lib/util/garbage-collected-cache.js.map +1 -1
- package/lib/util/generate-workspace-id.d.ts.map +1 -1
- package/lib/util/generate-workspace-id.js +435 -435
- package/lib/util/generate-workspace-id.js.map +1 -1
- package/lib/util/generate-workspace-id.spec.js +10 -6
- package/lib/util/generate-workspace-id.spec.js.map +1 -1
- package/lib/util/gitpod-cookie.d.ts +1 -1
- package/lib/util/gitpod-cookie.d.ts.map +1 -1
- package/lib/util/gitpod-cookie.js +0 -3
- package/lib/util/gitpod-cookie.js.map +1 -1
- package/lib/util/gitpod-host-url.d.ts.map +1 -1
- package/lib/util/gitpod-host-url.js +31 -29
- package/lib/util/gitpod-host-url.js.map +1 -1
- package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
- package/lib/util/gitpod-host-url.spec.js +15 -5
- package/lib/util/gitpod-host-url.spec.js.map +1 -1
- package/lib/util/grpc.d.ts.map +1 -1
- package/lib/util/grpc.js.map +1 -1
- package/lib/util/jaeger-client-types.d.ts.map +1 -1
- package/lib/util/logging.d.ts +1 -1
- package/lib/util/logging.d.ts.map +1 -1
- package/lib/util/logging.js +22 -23
- package/lib/util/logging.js.map +1 -1
- package/lib/util/make-link.js +5 -5
- package/lib/util/make-link.js.map +1 -1
- package/lib/util/parse-workspace-id.d.ts.map +1 -1
- package/lib/util/parse-workspace-id.js +1 -2
- package/lib/util/parse-workspace-id.js.map +1 -1
- package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
- package/lib/util/parse-workspace-id.spec.js.map +1 -1
- package/lib/util/queue.spec.js +9 -6
- package/lib/util/queue.spec.js.map +1 -1
- package/lib/util/semaphore.d.ts.map +1 -1
- package/lib/util/semaphore.js.map +1 -1
- package/lib/util/skip-if.d.ts.map +1 -1
- package/lib/util/skip-if.js.map +1 -1
- package/lib/util/timeutil.d.ts.map +1 -1
- package/lib/util/timeutil.js +2 -2
- package/lib/util/timeutil.js.map +1 -1
- package/lib/util/timeutil.spec.d.ts.map +1 -1
- package/lib/util/timeutil.spec.js.map +1 -1
- package/lib/util/tracing.d.ts +6 -6
- package/lib/util/tracing.d.ts.map +1 -1
- package/lib/util/tracing.js +6 -6
- package/lib/util/tracing.js.map +1 -1
- package/lib/util/tracing.spec.js +3 -3
- package/lib/util/tracing.spec.js.map +1 -1
- package/lib/util/workspace-port-authentication.d.ts +7 -7
- package/lib/util/workspace-port-authentication.d.ts.map +1 -1
- package/lib/util/workspace-port-authentication.js +8 -11
- package/lib/util/workspace-port-authentication.js.map +1 -1
- package/lib/workspace-cluster.d.ts +1 -1
- package/lib/workspace-cluster.d.ts.map +1 -1
- package/lib/workspace-cluster.js +2 -4
- package/lib/workspace-cluster.js.map +1 -1
- package/lib/workspace-instance.d.ts +2 -2
- package/lib/workspace-instance.d.ts.map +1 -1
- package/lib/wsready.d.ts +1 -1
- package/lib/wsready.d.ts.map +1 -1
- package/lib/wsready.js +2 -2
- package/package.json +2 -2
- package/pkg-yarn.lock +2 -2
- package/provenance-bundle.jsonl +1 -1
- package/src/accounting-protocol.ts +53 -51
- package/src/admin-protocol.ts +25 -21
- package/src/analytics.ts +26 -28
- package/src/auth.ts +2 -2
- package/src/context-url.spec.ts +25 -11
- package/src/context-url.ts +80 -78
- package/src/email-protocol.ts +5 -6
- package/src/encryption/container-module.ts +2 -3
- package/src/encryption/encryption-engine.spec.ts +9 -8
- package/src/encryption/encryption-engine.ts +14 -14
- package/src/encryption/encryption-service.ts +4 -5
- package/src/encryption/key-provider.ts +16 -19
- package/src/env.ts +9 -9
- package/src/gitpod-file-parser.spec.ts +55 -61
- package/src/gitpod-file-parser.ts +16 -17
- package/src/gitpod-service.ts +130 -104
- package/src/headless-workspace-log.ts +6 -4
- package/src/ide-frontend-service.ts +2 -2
- package/src/ide-protocol.ts +8 -8
- package/src/index.ts +16 -16
- package/src/installation-admin-protocol.ts +9 -9
- package/src/license-protocol.ts +5 -6
- package/src/messaging/browser/connection.ts +45 -47
- package/src/messaging/browser/window-connection.ts +39 -29
- package/src/messaging/client-call-metrics.ts +70 -71
- package/src/messaging/error.ts +1 -3
- package/src/messaging/handler.ts +6 -6
- package/src/messaging/node/connection.ts +8 -8
- package/src/messaging/proxy-factory.ts +23 -30
- package/src/oss-allowlist.ts +3 -3
- package/src/payment-protocol.ts +2 -2
- package/src/permission.ts +20 -31
- package/src/plans.ts +236 -189
- package/src/protocol.ts +239 -239
- package/src/snapshot-url.spec.ts +9 -7
- package/src/team-subscription-protocol.ts +33 -23
- package/src/teams-projects-protocol.ts +8 -8
- package/src/typings/globals.ts +4 -4
- package/src/util/analytics.ts +46 -24
- package/src/util/async-iterator.ts +4 -5
- package/src/util/cancelable.ts +3 -3
- package/src/util/date-time.ts +8 -8
- package/src/util/deferred.ts +6 -6
- package/src/util/disposable.ts +3 -6
- package/src/util/event.ts +9 -11
- package/src/util/garbage-collected-cache.ts +3 -6
- package/src/util/generate-workspace-id.spec.ts +18 -15
- package/src/util/generate-workspace-id.ts +453 -453
- package/src/util/gitpod-cookie.ts +8 -9
- package/src/util/gitpod-host-url.spec.ts +40 -13
- package/src/util/gitpod-host-url.ts +37 -34
- package/src/util/grpc.ts +1 -1
- package/src/util/jaeger-client-types.ts +2 -2
- package/src/util/logging.ts +49 -39
- package/src/util/make-link.ts +6 -7
- package/src/util/parse-workspace-id.spec.ts +17 -8
- package/src/util/parse-workspace-id.ts +5 -6
- package/src/util/queue.spec.ts +27 -25
- package/src/util/repeat.ts +1 -1
- package/src/util/semaphore.ts +4 -6
- package/src/util/skip-if.ts +9 -6
- package/src/util/timeutil.spec.ts +14 -15
- package/src/util/timeutil.ts +15 -11
- package/src/util/tracing.spec.ts +28 -23
- package/src/util/tracing.ts +46 -41
- package/src/util/workspace-port-authentication.ts +10 -13
- package/src/workspace-cluster.ts +15 -12
- package/src/workspace-instance.ts +27 -23
- package/src/wsready.ts +3 -3
- package/data/builtin-theia-plugins.json +0 -372
- package/lib/theia-plugins.d.ts +0 -11
- package/lib/theia-plugins.d.ts.map +0 -1
- package/lib/theia-plugins.js +0 -8
- package/lib/theia-plugins.js.map +0 -1
- package/src/theia-plugins.ts +0 -11
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
* Licensed under the GNU Affero General Public License (AGPL).
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
|
-
import * as cookie from
|
|
7
|
-
|
|
6
|
+
import * as cookie from "cookie";
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* This cookie indicates whether the connected client is a Gitpod user (= "has logged in within the last year") or not.
|
|
@@ -20,20 +19,20 @@ export const VALUE = "true";
|
|
|
20
19
|
export function options(domain: string): cookie.CookieSerializeOptions {
|
|
21
20
|
// Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
|
|
22
21
|
return {
|
|
23
|
-
path: "/",
|
|
22
|
+
path: "/", // make sure we send the cookie to all sub-pages
|
|
24
23
|
httpOnly: false,
|
|
25
24
|
secure: false,
|
|
26
|
-
maxAge: 60 * 60 * 24 * 365,
|
|
27
|
-
sameSite: "lax",
|
|
28
|
-
domain: `.${domain}`,
|
|
25
|
+
maxAge: 60 * 60 * 24 * 365, // 1 year
|
|
26
|
+
sameSite: "lax", // default: true. "Lax" needed to ensure we see cookies from users that neavigate to gitpod.io from external sites
|
|
27
|
+
domain: `.${domain}`, // explicilty include subdomains to not only cover "gitpod.io", but also "www.gitpod.io" or workspaces
|
|
29
28
|
};
|
|
30
|
-
}
|
|
29
|
+
}
|
|
31
30
|
|
|
32
31
|
export function generateCookie(domain: string): string {
|
|
33
32
|
return cookie.serialize(NAME, VALUE, options(domain));
|
|
34
|
-
}
|
|
33
|
+
}
|
|
35
34
|
|
|
36
35
|
export function isPresent(cookies: string): boolean {
|
|
37
36
|
// needs to match the old (gitpod-user=loggedIn) and new (gitpod-user=true) values to ensure a smooth transition during rollout.
|
|
38
37
|
return !!cookies.match(`${NAME}=`);
|
|
39
|
-
}
|
|
38
|
+
}
|
|
@@ -4,46 +4,73 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import * as chai from
|
|
8
|
-
import { suite, test } from
|
|
9
|
-
import { GitpodHostUrl } from
|
|
7
|
+
import * as chai from "chai";
|
|
8
|
+
import { suite, test } from "mocha-typescript";
|
|
9
|
+
import { GitpodHostUrl } from "./gitpod-host-url";
|
|
10
10
|
const expect = chai.expect;
|
|
11
11
|
|
|
12
12
|
@suite
|
|
13
13
|
export class GitpodHostUrlTest {
|
|
14
|
-
|
|
15
14
|
@test public parseWorkspaceId_pathBased() {
|
|
16
|
-
const actual = GitpodHostUrl.fromWorkspaceUrl(
|
|
15
|
+
const actual = GitpodHostUrl.fromWorkspaceUrl(
|
|
16
|
+
"http://35.223.201.195/workspace/bc77e03d-c781-4235-bca0-e24087f5e472/",
|
|
17
|
+
).workspaceId;
|
|
17
18
|
expect(actual).to.equal("bc77e03d-c781-4235-bca0-e24087f5e472");
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
@test public parseWorkspaceId_hosts_withEnvVarsInjected() {
|
|
21
|
-
const actual = GitpodHostUrl.fromWorkspaceUrl(
|
|
22
|
+
const actual = GitpodHostUrl.fromWorkspaceUrl(
|
|
23
|
+
"https://gray-grasshopper-nfbitfia.ws-eu02.gitpod-staging.com/#passedin=test%20value/https://github.com/gitpod-io/gitpod-test-repo",
|
|
24
|
+
).workspaceId;
|
|
22
25
|
expect(actual).to.equal("gray-grasshopper-nfbitfia");
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
@test public async testWithoutWorkspacePrefix() {
|
|
26
|
-
expect(
|
|
29
|
+
expect(
|
|
30
|
+
GitpodHostUrl.fromWorkspaceUrl("https://3000-moccasin-ferret-155799b3.ws-eu02.gitpod-staging.com/")
|
|
31
|
+
.withoutWorkspacePrefix()
|
|
32
|
+
.toString(),
|
|
33
|
+
).to.equal("https://gitpod-staging.com/");
|
|
27
34
|
}
|
|
28
35
|
|
|
29
36
|
@test public async testWithoutWorkspacePrefix2() {
|
|
30
|
-
expect(
|
|
37
|
+
expect(
|
|
38
|
+
GitpodHostUrl.fromWorkspaceUrl("https://gitpod-staging.com/").withoutWorkspacePrefix().toString(),
|
|
39
|
+
).to.equal("https://gitpod-staging.com/");
|
|
31
40
|
}
|
|
32
41
|
|
|
33
42
|
@test public async testWithoutWorkspacePrefix3() {
|
|
34
|
-
expect(
|
|
43
|
+
expect(
|
|
44
|
+
GitpodHostUrl.fromWorkspaceUrl("https://gray-rook-5523v5d8.ws-dev.my-branch-1234.staging.gitpod-dev.com/")
|
|
45
|
+
.withoutWorkspacePrefix()
|
|
46
|
+
.toString(),
|
|
47
|
+
).to.equal("https://my-branch-1234.staging.gitpod-dev.com/");
|
|
35
48
|
}
|
|
36
49
|
|
|
37
50
|
@test public async testWithoutWorkspacePrefix4() {
|
|
38
|
-
expect(
|
|
51
|
+
expect(
|
|
52
|
+
GitpodHostUrl.fromWorkspaceUrl("https://my-branch-1234.staging.gitpod-dev.com/")
|
|
53
|
+
.withoutWorkspacePrefix()
|
|
54
|
+
.toString(),
|
|
55
|
+
).to.equal("https://my-branch-1234.staging.gitpod-dev.com/");
|
|
39
56
|
}
|
|
40
57
|
|
|
41
58
|
@test public async testWithoutWorkspacePrefix5() {
|
|
42
|
-
expect(
|
|
59
|
+
expect(
|
|
60
|
+
GitpodHostUrl.fromWorkspaceUrl("https://abc-nice-brunch-4224.staging.gitpod-dev.com/")
|
|
61
|
+
.withoutWorkspacePrefix()
|
|
62
|
+
.toString(),
|
|
63
|
+
).to.equal("https://abc-nice-brunch-4224.staging.gitpod-dev.com/");
|
|
43
64
|
}
|
|
44
65
|
|
|
45
66
|
@test public async testWithoutWorkspacePrefix6() {
|
|
46
|
-
expect(
|
|
67
|
+
expect(
|
|
68
|
+
GitpodHostUrl.fromWorkspaceUrl(
|
|
69
|
+
"https://gray-rook-5523v5d8.ws-dev.abc-nice-brunch-4224.staging.gitpod-dev.com/",
|
|
70
|
+
)
|
|
71
|
+
.withoutWorkspacePrefix()
|
|
72
|
+
.toString(),
|
|
73
|
+
).to.equal("https://abc-nice-brunch-4224.staging.gitpod-dev.com/");
|
|
47
74
|
}
|
|
48
75
|
}
|
|
49
|
-
module.exports = new GitpodHostUrlTest()
|
|
76
|
+
module.exports = new GitpodHostUrlTest();
|
|
@@ -4,15 +4,16 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
const URL = require(
|
|
8
|
-
import { log } from
|
|
7
|
+
const URL = require("url").URL || window.URL;
|
|
8
|
+
import { log } from "./logging";
|
|
9
9
|
|
|
10
10
|
export interface UrlChange {
|
|
11
|
-
(old: URL): Partial<URL
|
|
11
|
+
(old: URL): Partial<URL>;
|
|
12
12
|
}
|
|
13
13
|
export type UrlUpdate = UrlChange | Partial<URL>;
|
|
14
14
|
|
|
15
|
-
const baseWorkspaceIDRegex =
|
|
15
|
+
const baseWorkspaceIDRegex =
|
|
16
|
+
"(([a-f][0-9a-f]{7}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})|([0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8,11}))";
|
|
16
17
|
|
|
17
18
|
// this pattern matches v4 UUIDs as well as the new generated workspace ids (e.g. pink-panda-ns35kd21)
|
|
18
19
|
const workspaceIDRegex = RegExp(`^${baseWorkspaceIDRegex}$`);
|
|
@@ -24,15 +25,15 @@ export class GitpodHostUrl {
|
|
|
24
25
|
readonly url: URL;
|
|
25
26
|
|
|
26
27
|
constructor(urlParam?: string | URL) {
|
|
27
|
-
if (urlParam === undefined || typeof urlParam ===
|
|
28
|
-
this.url = new URL(urlParam ||
|
|
29
|
-
this.url.search =
|
|
30
|
-
this.url.hash =
|
|
31
|
-
this.url.pathname =
|
|
28
|
+
if (urlParam === undefined || typeof urlParam === "string") {
|
|
29
|
+
this.url = new URL(urlParam || "https://gitpod.io");
|
|
30
|
+
this.url.search = "";
|
|
31
|
+
this.url.hash = "";
|
|
32
|
+
this.url.pathname = "";
|
|
32
33
|
} else if (urlParam instanceof URL) {
|
|
33
34
|
this.url = urlParam;
|
|
34
35
|
} else {
|
|
35
|
-
log.error(
|
|
36
|
+
log.error("Unexpected urlParam", { urlParam });
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
|
|
@@ -45,7 +46,7 @@ export class GitpodHostUrl {
|
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
withDomainPrefix(prefix: string): GitpodHostUrl {
|
|
48
|
-
return this.with(url => ({ host: prefix + url.host }))
|
|
49
|
+
return this.with((url) => ({ host: prefix + url.host }));
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
withoutWorkspacePrefix(): GitpodHostUrl {
|
|
@@ -58,14 +59,14 @@ export class GitpodHostUrl {
|
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
withoutDomainPrefix(removeSegmentsCount: number): GitpodHostUrl {
|
|
61
|
-
return this.with(url => ({ host: url.host.split(
|
|
62
|
+
return this.with((url) => ({ host: url.host.split(".").splice(removeSegmentsCount).join(".") }));
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
with(urlUpdate: UrlUpdate) {
|
|
65
|
-
const update = typeof urlUpdate ===
|
|
66
|
-
const addSlashToPath = update.pathname && update.pathname.length > 0 && !update.pathname.startsWith(
|
|
66
|
+
const update = typeof urlUpdate === "function" ? urlUpdate(this.url) : urlUpdate;
|
|
67
|
+
const addSlashToPath = update.pathname && update.pathname.length > 0 && !update.pathname.startsWith("/");
|
|
67
68
|
if (addSlashToPath) {
|
|
68
|
-
update.pathname =
|
|
69
|
+
update.pathname = "/" + update.pathname;
|
|
69
70
|
}
|
|
70
71
|
const result = Object.assign(new URL(this.toString()), update);
|
|
71
72
|
return new GitpodHostUrl(result);
|
|
@@ -73,50 +74,53 @@ export class GitpodHostUrl {
|
|
|
73
74
|
|
|
74
75
|
withApi(urlUpdate?: UrlUpdate) {
|
|
75
76
|
const updated = urlUpdate ? this.with(urlUpdate) : this;
|
|
76
|
-
return updated.with(url => ({ pathname: `/api${url.pathname}` }));
|
|
77
|
+
return updated.with((url) => ({ pathname: `/api${url.pathname}` }));
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
withContext(contextUrl: string) {
|
|
80
|
-
return this.with(url => ({ hash: contextUrl }));
|
|
81
|
+
return this.with((url) => ({ hash: contextUrl }));
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
asWebsocket(): GitpodHostUrl {
|
|
84
|
-
return this.with(url => ({ protocol: url.protocol ===
|
|
85
|
+
return this.with((url) => ({ protocol: url.protocol === "https:" ? "wss:" : "ws:" }));
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
asDashboard(): GitpodHostUrl {
|
|
88
|
-
return this.with(url => ({ pathname:
|
|
89
|
+
return this.with((url) => ({ pathname: "/" }));
|
|
89
90
|
}
|
|
90
91
|
|
|
91
92
|
asLogin(): GitpodHostUrl {
|
|
92
|
-
return this.with(url => ({ pathname:
|
|
93
|
+
return this.with((url) => ({ pathname: "/login" }));
|
|
93
94
|
}
|
|
94
95
|
|
|
95
96
|
asUpgradeSubscription(): GitpodHostUrl {
|
|
96
|
-
return this.with(url => ({ pathname:
|
|
97
|
+
return this.with((url) => ({ pathname: "/plans" }));
|
|
97
98
|
}
|
|
98
99
|
|
|
99
100
|
asAccessControl(): GitpodHostUrl {
|
|
100
|
-
return this.with(url => ({ pathname:
|
|
101
|
+
return this.with((url) => ({ pathname: "/integrations" }));
|
|
101
102
|
}
|
|
102
103
|
|
|
103
104
|
asSettings(): GitpodHostUrl {
|
|
104
|
-
return this.with(url => ({ pathname:
|
|
105
|
+
return this.with((url) => ({ pathname: "/settings" }));
|
|
105
106
|
}
|
|
106
107
|
|
|
107
108
|
asPreferences(): GitpodHostUrl {
|
|
108
|
-
return this.with(url => ({ pathname:
|
|
109
|
+
return this.with((url) => ({ pathname: "/preferences" }));
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
asStart(workspaceId = this.workspaceId): GitpodHostUrl {
|
|
112
113
|
return this.withoutWorkspacePrefix().with({
|
|
113
|
-
pathname:
|
|
114
|
-
hash:
|
|
114
|
+
pathname: "/start/",
|
|
115
|
+
hash: "#" + workspaceId,
|
|
115
116
|
});
|
|
116
117
|
}
|
|
117
118
|
|
|
118
119
|
asWorkspaceAuth(instanceID: string, redirect?: boolean): GitpodHostUrl {
|
|
119
|
-
return this.with(url => ({
|
|
120
|
+
return this.with((url) => ({
|
|
121
|
+
pathname: `/api/auth/workspace-cookie/${instanceID}`,
|
|
122
|
+
search: redirect ? "redirect" : "",
|
|
123
|
+
}));
|
|
120
124
|
}
|
|
121
125
|
|
|
122
126
|
toString() {
|
|
@@ -125,7 +129,7 @@ export class GitpodHostUrl {
|
|
|
125
129
|
|
|
126
130
|
toStringWoRootSlash() {
|
|
127
131
|
let result = this.toString();
|
|
128
|
-
if (result.endsWith(
|
|
132
|
+
if (result.endsWith("/")) {
|
|
129
133
|
result = result.slice(0, result.length - 1);
|
|
130
134
|
}
|
|
131
135
|
return result;
|
|
@@ -142,7 +146,7 @@ export class GitpodHostUrl {
|
|
|
142
146
|
}
|
|
143
147
|
}
|
|
144
148
|
|
|
145
|
-
const pathSegs = this.url.pathname.split("/")
|
|
149
|
+
const pathSegs = this.url.pathname.split("/");
|
|
146
150
|
if (pathSegs.length > 3 && pathSegs[1] === "workspace") {
|
|
147
151
|
return pathSegs[2];
|
|
148
152
|
}
|
|
@@ -152,20 +156,19 @@ export class GitpodHostUrl {
|
|
|
152
156
|
|
|
153
157
|
get blobServe(): boolean {
|
|
154
158
|
const hostSegments = this.url.host.split(".");
|
|
155
|
-
if (hostSegments[0] ===
|
|
159
|
+
if (hostSegments[0] === "blobserve") {
|
|
156
160
|
return true;
|
|
157
161
|
}
|
|
158
162
|
|
|
159
|
-
const pathSegments = this.url.pathname.split("/")
|
|
163
|
+
const pathSegments = this.url.pathname.split("/");
|
|
160
164
|
return pathSegments[0] === "blobserve";
|
|
161
165
|
}
|
|
162
166
|
|
|
163
167
|
asSorry(message: string) {
|
|
164
|
-
return this.with({ pathname:
|
|
168
|
+
return this.with({ pathname: "/sorry", hash: message });
|
|
165
169
|
}
|
|
166
170
|
|
|
167
171
|
asApiLogout(): GitpodHostUrl {
|
|
168
|
-
return this.withApi(url => ({ pathname:
|
|
172
|
+
return this.withApi((url) => ({ pathname: "/logout/" }));
|
|
169
173
|
}
|
|
170
|
-
|
|
171
174
|
}
|
package/src/util/grpc.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
export const defaultGRPCOptions = {
|
|
8
8
|
"grpc.keepalive_timeout_ms": 10000,
|
|
9
9
|
"grpc.keepalive_time_ms": 60000,
|
|
10
10
|
"grpc.http2.min_time_between_pings_ms": 10000,
|
|
@@ -93,10 +93,10 @@ export interface SamplingDecision {
|
|
|
93
93
|
|
|
94
94
|
// added by TypeFox
|
|
95
95
|
export interface Sampler {
|
|
96
|
-
name(): string
|
|
96
|
+
name(): string;
|
|
97
97
|
isSampled(operation: string, tags: any): boolean;
|
|
98
98
|
onCreateSpan(span: opentracing.Span): SamplingDecision;
|
|
99
99
|
onSetOperationName(span: opentracing.Span, operationName: string): SamplingDecision;
|
|
100
100
|
onSetTag(span: opentracing.Span, key: string, value: any): SamplingDecision;
|
|
101
|
-
close(callback: () => void): void
|
|
101
|
+
close(callback: () => void): void;
|
|
102
102
|
}
|
package/src/util/logging.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
const inspect: (object: any) => string = require(
|
|
7
|
+
const inspect: (object: any) => string = require("util").inspect; // undefined in frontend
|
|
8
8
|
|
|
9
9
|
let jsonLogging: boolean = false;
|
|
10
10
|
let component: string | undefined;
|
|
@@ -15,19 +15,19 @@ export interface LogContext {
|
|
|
15
15
|
sessionId?: string;
|
|
16
16
|
userId?: string;
|
|
17
17
|
workspaceId?: string;
|
|
18
|
-
}
|
|
18
|
+
}
|
|
19
19
|
export namespace LogContext {
|
|
20
|
-
export function from(params
|
|
20
|
+
export function from(params: { userId?: string; user?: any; request?: any }) {
|
|
21
21
|
return <LogContext>{
|
|
22
22
|
sessionId: params.request?.requestID,
|
|
23
|
-
userId: params.userId || params.user?.id
|
|
24
|
-
}
|
|
23
|
+
userId: params.userId || params.user?.id,
|
|
24
|
+
};
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
export interface LogPayload {
|
|
29
29
|
// placeholder to indicate that only dictionary-style objects should be passed as payload
|
|
30
|
-
}
|
|
30
|
+
}
|
|
31
31
|
|
|
32
32
|
export namespace log {
|
|
33
33
|
export function error(context: LogContext, message: string, error: any, payload: LogPayload): void;
|
|
@@ -97,7 +97,11 @@ export namespace log {
|
|
|
97
97
|
/**
|
|
98
98
|
* Do not use in frontend.
|
|
99
99
|
*/
|
|
100
|
-
export function enableJSONLogging(
|
|
100
|
+
export function enableJSONLogging(
|
|
101
|
+
componentArg: string,
|
|
102
|
+
versionArg: string | undefined,
|
|
103
|
+
logLevel?: LogrusLogLevel,
|
|
104
|
+
): void {
|
|
101
105
|
component = componentArg;
|
|
102
106
|
version = versionArg;
|
|
103
107
|
|
|
@@ -109,16 +113,16 @@ export namespace log {
|
|
|
109
113
|
|
|
110
114
|
console.error = function (...args: any[]): void {
|
|
111
115
|
errorLog(true, args);
|
|
112
|
-
}
|
|
116
|
+
};
|
|
113
117
|
console.warn = function (...args: any[]): void {
|
|
114
118
|
warnLog(true, args);
|
|
115
|
-
}
|
|
119
|
+
};
|
|
116
120
|
console.info = function (...args: any[]): void {
|
|
117
121
|
infoLog(true, args);
|
|
118
|
-
}
|
|
122
|
+
};
|
|
119
123
|
console.debug = function (...args: any[]): void {
|
|
120
124
|
debugLog(true, args);
|
|
121
|
-
}
|
|
125
|
+
};
|
|
122
126
|
|
|
123
127
|
console.log = console.info;
|
|
124
128
|
// FIXME wrap also other console methods (e.g. trace())
|
|
@@ -154,26 +158,26 @@ type DoLogFunction = (calledViaConsole: boolean, args: any[]) => void;
|
|
|
154
158
|
|
|
155
159
|
let errorLog = doErrorLog;
|
|
156
160
|
function doErrorLog(calledViaConsole: boolean, args: any[]): void {
|
|
157
|
-
doLog(calledViaConsole, errorConsoleLog,
|
|
161
|
+
doLog(calledViaConsole, errorConsoleLog, "ERROR", args);
|
|
158
162
|
}
|
|
159
163
|
|
|
160
164
|
let warnLog = doWarnLog;
|
|
161
165
|
function doWarnLog(calledViaConsole: boolean, args: any[]): void {
|
|
162
|
-
doLog(calledViaConsole, warnConsoleLog,
|
|
166
|
+
doLog(calledViaConsole, warnConsoleLog, "WARNING", args);
|
|
163
167
|
}
|
|
164
168
|
|
|
165
169
|
let infoLog = doInfoLog;
|
|
166
170
|
function doInfoLog(calledViaConsole: boolean, args: any[]): void {
|
|
167
|
-
doLog(calledViaConsole, infoConsoleLog,
|
|
171
|
+
doLog(calledViaConsole, infoConsoleLog, "INFO", args);
|
|
168
172
|
}
|
|
169
173
|
|
|
170
174
|
let debugLog = doDebugLog;
|
|
171
175
|
function doDebugLog(calledViaConsole: boolean, args: any[]): void {
|
|
172
|
-
doLog(calledViaConsole, debugConsoleLog,
|
|
176
|
+
doLog(calledViaConsole, debugConsoleLog, "DEBUG", args);
|
|
173
177
|
}
|
|
174
178
|
|
|
175
179
|
// Ref: https://github.com/sirupsen/logrus#level-logging
|
|
176
|
-
export type LogrusLogLevel = keyof
|
|
180
|
+
export type LogrusLogLevel = keyof typeof LogrusLogLevels;
|
|
177
181
|
export const LogrusLogLevels = {
|
|
178
182
|
trace: true,
|
|
179
183
|
debug: true,
|
|
@@ -182,7 +186,7 @@ export const LogrusLogLevels = {
|
|
|
182
186
|
error: true,
|
|
183
187
|
fatal: true,
|
|
184
188
|
panic: true,
|
|
185
|
-
}
|
|
189
|
+
};
|
|
186
190
|
export namespace LogrusLogLevel {
|
|
187
191
|
export function isGreatherOrEqual(lvl: LogrusLogLevel | undefined, ref: LogrusLogLevel | undefined): boolean {
|
|
188
192
|
if (lvl === undefined) {
|
|
@@ -194,8 +198,7 @@ export namespace LogrusLogLevel {
|
|
|
194
198
|
return getLevelArity(lvl) >= getLevelArity(ref);
|
|
195
199
|
}
|
|
196
200
|
function getLevelArity(lvl: LogrusLogLevel): number {
|
|
197
|
-
return Object.keys(LogrusLogLevels)
|
|
198
|
-
.findIndex((l) => l === lvl);
|
|
201
|
+
return Object.keys(LogrusLogLevels).findIndex((l) => l === lvl);
|
|
199
202
|
}
|
|
200
203
|
export function getFromEnv(): LogrusLogLevel | undefined {
|
|
201
204
|
const lvlStr = process.env.LOG_LEVEL;
|
|
@@ -203,7 +206,7 @@ export namespace LogrusLogLevel {
|
|
|
203
206
|
return undefined;
|
|
204
207
|
}
|
|
205
208
|
const lvl = lvlStr as LogrusLogLevel;
|
|
206
|
-
const exists = LogrusLogLevels[lvl]
|
|
209
|
+
const exists = LogrusLogLevels[lvl];
|
|
207
210
|
if (!exists) {
|
|
208
211
|
return undefined;
|
|
209
212
|
}
|
|
@@ -212,12 +215,12 @@ export namespace LogrusLogLevel {
|
|
|
212
215
|
}
|
|
213
216
|
|
|
214
217
|
// Source: https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
|
|
215
|
-
type GoogleLogSeverity =
|
|
218
|
+
type GoogleLogSeverity = "EMERGENCY" | "ALERT" | "CRITICAL" | "ERROR" | "WARNING" | "INFO" | "DEBUG";
|
|
216
219
|
namespace GoogleLogSeverity {
|
|
217
220
|
export const isGreaterOrEqualThanWarning = (severity: GoogleLogSeverity) => {
|
|
218
221
|
switch (severity) {
|
|
219
|
-
case
|
|
220
|
-
case
|
|
222
|
+
case "INFO":
|
|
223
|
+
case "DEBUG":
|
|
221
224
|
return false;
|
|
222
225
|
default:
|
|
223
226
|
return true;
|
|
@@ -245,7 +248,7 @@ function doLog(calledViaConsole: boolean, consoleLog: ConsoleLog, severity: Goog
|
|
|
245
248
|
// console.xyz(Error, ...any) / log.xyz(Error) / log.xyz(Error, LogPayload)
|
|
246
249
|
error = args[0];
|
|
247
250
|
payloadArgs = args.slice(1);
|
|
248
|
-
} else if (typeof args[0] ===
|
|
251
|
+
} else if (typeof args[0] === "string") {
|
|
249
252
|
message = args[0];
|
|
250
253
|
if (args.length < 2 || !(args[1] instanceof Error)) {
|
|
251
254
|
// console.xyz(string) / console.xyz(string, !Error, ...any) / log.xyz(string) / log.xyz(string, LogPayload)
|
|
@@ -265,7 +268,7 @@ function doLog(calledViaConsole: boolean, consoleLog: ConsoleLog, severity: Goog
|
|
|
265
268
|
// log.xyz(LogContext, Error) / log.xyz(LogContext, Error, LogPayload)
|
|
266
269
|
error = args[1];
|
|
267
270
|
payloadArgs = args.slice(2);
|
|
268
|
-
} else if (typeof args[1] ===
|
|
271
|
+
} else if (typeof args[1] === "string") {
|
|
269
272
|
message = args[1];
|
|
270
273
|
if (args.length < 3 || !(args[2] instanceof Error)) {
|
|
271
274
|
// log.xyz(LogContext, string) / log.xyz(LogContext, string, LogPayload)
|
|
@@ -288,9 +291,14 @@ function doLog(calledViaConsole: boolean, consoleLog: ConsoleLog, severity: Goog
|
|
|
288
291
|
}
|
|
289
292
|
}
|
|
290
293
|
|
|
291
|
-
function makeLogItem(
|
|
292
|
-
|
|
293
|
-
|
|
294
|
+
function makeLogItem(
|
|
295
|
+
severity: GoogleLogSeverity,
|
|
296
|
+
context: LogContext | undefined,
|
|
297
|
+
message: string | undefined,
|
|
298
|
+
error: Error | undefined,
|
|
299
|
+
payloadArgs: any[],
|
|
300
|
+
calledViaConsole: boolean,
|
|
301
|
+
): string | undefined {
|
|
294
302
|
if (context !== undefined && Object.keys(context).length == 0) {
|
|
295
303
|
context = undefined;
|
|
296
304
|
}
|
|
@@ -312,7 +320,7 @@ function makeLogItem(severity: GoogleLogSeverity, context: LogContext | undefine
|
|
|
312
320
|
message,
|
|
313
321
|
error,
|
|
314
322
|
payload,
|
|
315
|
-
loggedViaConsole: calledViaConsole ? true : undefined
|
|
323
|
+
loggedViaConsole: calledViaConsole ? true : undefined,
|
|
316
324
|
};
|
|
317
325
|
let result: string = stringifyLogItem(logItem);
|
|
318
326
|
|
|
@@ -323,11 +331,11 @@ function makeLogItem(severity: GoogleLogSeverity, context: LogContext | undefine
|
|
|
323
331
|
result = stringifyLogItem(logItem);
|
|
324
332
|
|
|
325
333
|
if (result.length <= maxAllowedLogItemLength) {
|
|
326
|
-
log.warn(
|
|
334
|
+
log.warn("Log item too large, stripping payload", { logItemStub: makeLogItemStub(logItem) });
|
|
327
335
|
}
|
|
328
336
|
}
|
|
329
337
|
if (result.length > maxAllowedLogItemLength) {
|
|
330
|
-
log.error(
|
|
338
|
+
log.error("Log item too large w/o payload, discarding", { logItemStub: makeLogItemStub(logItem) });
|
|
331
339
|
return undefined;
|
|
332
340
|
}
|
|
333
341
|
|
|
@@ -341,10 +349,10 @@ function makeReportedErrorEvent(error: Error | undefined) {
|
|
|
341
349
|
// Serves as marker only
|
|
342
350
|
"@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
|
|
343
351
|
// This is useful for filtering in the UI
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
}
|
|
352
|
+
serviceContext: {
|
|
353
|
+
service: component || "<ts-not-set>",
|
|
354
|
+
version: version || "<ts-not-set>",
|
|
355
|
+
},
|
|
348
356
|
};
|
|
349
357
|
|
|
350
358
|
if (error) {
|
|
@@ -364,9 +372,9 @@ function makeLogItemStub(logItem: any): any {
|
|
|
364
372
|
severity: logItem.severity,
|
|
365
373
|
time: logItem.time,
|
|
366
374
|
environment: logItem.environment,
|
|
367
|
-
region: logItem.region
|
|
375
|
+
region: logItem.region,
|
|
368
376
|
};
|
|
369
|
-
if (typeof
|
|
377
|
+
if (typeof logItem.message === "string") {
|
|
370
378
|
if (logItem.message.length <= maxMessageStubLength) {
|
|
371
379
|
result.message = logItem.message;
|
|
372
380
|
} else {
|
|
@@ -400,10 +408,12 @@ function stringifyLogItem(logItem: any): string {
|
|
|
400
408
|
* Jsonifies Errors properly, not as {} only.
|
|
401
409
|
*/
|
|
402
410
|
function jsonStringifyWithErrors(value: any): string {
|
|
403
|
-
return JSON.stringify(value, (key: string, value: any): any => {
|
|
411
|
+
return JSON.stringify(value, (key: string, value: any): any => {
|
|
412
|
+
return value instanceof Error ? value.stack : value;
|
|
413
|
+
});
|
|
404
414
|
}
|
|
405
415
|
|
|
406
|
-
type ConsoleLog = (message?: any, ...optionalArgs: any[]) => void;
|
|
416
|
+
type ConsoleLog = (message?: any, ...optionalArgs: any[]) => void; // signature of console.xyz
|
|
407
417
|
const logConsoleLog: ConsoleLog = console.log;
|
|
408
418
|
const errorConsoleLog: ConsoleLog = console.error;
|
|
409
419
|
const warnConsoleLog: ConsoleLog = console.warn;
|
package/src/util/make-link.ts
CHANGED
|
@@ -5,18 +5,17 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
function isOpenNewTab(event: MouseEvent): boolean {
|
|
8
|
-
return event.metaKey ||
|
|
8
|
+
return event.metaKey || event.ctrlKey;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export function makeLink(node: HTMLElement, url: string, hover: string): void {
|
|
12
|
-
node.onclick = event => {
|
|
13
|
-
let target =
|
|
12
|
+
node.onclick = (event) => {
|
|
13
|
+
let target = "_self";
|
|
14
14
|
if (isOpenNewTab(event)) {
|
|
15
|
-
target =
|
|
15
|
+
target = "_blank";
|
|
16
16
|
}
|
|
17
17
|
window.open(url, target);
|
|
18
|
-
}
|
|
19
|
-
node.style.cursor =
|
|
18
|
+
};
|
|
19
|
+
node.style.cursor = "pointer";
|
|
20
20
|
node.title = hover;
|
|
21
21
|
}
|
|
22
|
-
|
|
@@ -4,14 +4,17 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import * as chai from
|
|
8
|
-
import { suite, test } from
|
|
9
|
-
import {
|
|
7
|
+
import * as chai from "chai";
|
|
8
|
+
import { suite, test } from "mocha-typescript";
|
|
9
|
+
import {
|
|
10
|
+
matchesInstanceIdOrLegacyWorkspaceIdExactly,
|
|
11
|
+
matchesNewWorkspaceIdExactly,
|
|
12
|
+
parseWorkspaceIdFromHostname,
|
|
13
|
+
} from "./parse-workspace-id";
|
|
10
14
|
const expect = chai.expect;
|
|
11
15
|
|
|
12
16
|
@suite
|
|
13
17
|
export class ParseWorkspaceIdTest {
|
|
14
|
-
|
|
15
18
|
@test public parseWorkspaceIdFromHostname_fromWorkspaceLocation() {
|
|
16
19
|
const actual = parseWorkspaceIdFromHostname("moccasin-ferret-155799b3.ws-eu01.gitpod.io");
|
|
17
20
|
expect(actual).to.equal("moccasin-ferret-155799b3");
|
|
@@ -28,7 +31,9 @@ export class ParseWorkspaceIdTest {
|
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
@test public parseWorkspaceIdFromHostname_fromWorkspacePortLocationWithWebviewPrefixCustomHost() {
|
|
31
|
-
const actual = parseWorkspaceIdFromHostname(
|
|
34
|
+
const actual = parseWorkspaceIdFromHostname(
|
|
35
|
+
"webview-3000-moccasin-ferret-155799b3.ws-eu01.some.subdomain.somehost.com",
|
|
36
|
+
);
|
|
32
37
|
expect(actual).to.equal("moccasin-ferret-155799b3");
|
|
33
38
|
}
|
|
34
39
|
|
|
@@ -44,12 +49,16 @@ export class ParseWorkspaceIdTest {
|
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
@test public parseLegacyWorkspaceIdFromHostname_fromWorkspacePortLocationWithWebviewPrefix() {
|
|
47
|
-
const actual = parseWorkspaceIdFromHostname(
|
|
52
|
+
const actual = parseWorkspaceIdFromHostname(
|
|
53
|
+
"webview-3000-b7e0eaf8-ec73-44ec-81ea-04859263b656.ws-eu01.gitpod.io",
|
|
54
|
+
);
|
|
48
55
|
expect(actual).to.equal("b7e0eaf8-ec73-44ec-81ea-04859263b656");
|
|
49
56
|
}
|
|
50
57
|
|
|
51
58
|
@test public parseLegacyWorkspaceIdFromHostname_fromWorkspacePortLocationWithWebviewPrefixCustomHost() {
|
|
52
|
-
const actual = parseWorkspaceIdFromHostname(
|
|
59
|
+
const actual = parseWorkspaceIdFromHostname(
|
|
60
|
+
"webview-3000-ca81a50f-09d7-465c-acd9-264a747d5351.ws-eu01.some.subdomain.somehost.com",
|
|
61
|
+
);
|
|
53
62
|
expect(actual).to.equal("ca81a50f-09d7-465c-acd9-264a747d5351");
|
|
54
63
|
}
|
|
55
64
|
|
|
@@ -73,4 +82,4 @@ export class ParseWorkspaceIdTest {
|
|
|
73
82
|
expect(actual).to.be.false;
|
|
74
83
|
}
|
|
75
84
|
}
|
|
76
|
-
module.exports = new ParseWorkspaceIdTest()
|
|
85
|
+
module.exports = new ParseWorkspaceIdTest();
|