@gitpod/gitpod-protocol 0.1.5-sje-installer-helm.1 → 0.1.5-sje-installer-namespace-docs.0

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.
Files changed (224) hide show
  1. package/data/gitpod-schema.json +4 -0
  2. package/lib/accounting-protocol.d.ts +0 -1
  3. package/lib/accounting-protocol.d.ts.map +1 -1
  4. package/lib/accounting-protocol.js +10 -11
  5. package/lib/accounting-protocol.js.map +1 -1
  6. package/lib/admin-protocol.d.ts +8 -2
  7. package/lib/admin-protocol.d.ts.map +1 -1
  8. package/lib/admin-protocol.js +2 -13
  9. package/lib/admin-protocol.js.map +1 -1
  10. package/lib/analytics.d.ts +1 -0
  11. package/lib/analytics.d.ts.map +1 -1
  12. package/lib/context-url.js +4 -4
  13. package/lib/context-url.js.map +1 -1
  14. package/lib/context-url.spec.js +45 -48
  15. package/lib/context-url.spec.js.map +1 -1
  16. package/lib/email-protocol.js +4 -4
  17. package/lib/email-protocol.js.map +1 -1
  18. package/lib/encryption/container-module.js +4 -4
  19. package/lib/encryption/container-module.js.map +1 -1
  20. package/lib/encryption/encryption-engine.js +19 -20
  21. package/lib/encryption/encryption-engine.js.map +1 -1
  22. package/lib/encryption/encryption-engine.spec.js +29 -36
  23. package/lib/encryption/encryption-engine.spec.js.map +1 -1
  24. package/lib/encryption/encryption-service.js +29 -43
  25. package/lib/encryption/encryption-service.js.map +1 -1
  26. package/lib/encryption/key-provider.js +25 -30
  27. package/lib/encryption/key-provider.js.map +1 -1
  28. package/lib/env.js +12 -13
  29. package/lib/env.js.map +1 -1
  30. package/lib/gitpod-file-parser.js +25 -41
  31. package/lib/gitpod-file-parser.js.map +1 -1
  32. package/lib/gitpod-file-parser.spec.js +116 -116
  33. package/lib/gitpod-file-parser.spec.js.map +1 -1
  34. package/lib/gitpod-service.d.ts +20 -8
  35. package/lib/gitpod-service.d.ts.map +1 -1
  36. package/lib/gitpod-service.js +149 -295
  37. package/lib/gitpod-service.js.map +1 -1
  38. package/lib/ide-protocol.d.ts +81 -0
  39. package/lib/ide-protocol.d.ts.map +1 -0
  40. package/lib/ide-protocol.js +8 -0
  41. package/lib/ide-protocol.js.map +1 -0
  42. package/lib/index.d.ts +2 -0
  43. package/lib/index.d.ts.map +1 -1
  44. package/lib/index.js +2 -0
  45. package/lib/index.js.map +1 -1
  46. package/lib/messaging/browser/connection.d.ts +3 -3
  47. package/lib/messaging/browser/connection.d.ts.map +1 -1
  48. package/lib/messaging/browser/connection.js +172 -35
  49. package/lib/messaging/browser/connection.js.map +1 -1
  50. package/lib/messaging/browser/window-connection.js +35 -55
  51. package/lib/messaging/browser/window-connection.js.map +1 -1
  52. package/lib/messaging/client-call-metrics.js +17 -18
  53. package/lib/messaging/client-call-metrics.js.map +1 -1
  54. package/lib/messaging/connection-error-handler.js +11 -23
  55. package/lib/messaging/connection-error-handler.js.map +1 -1
  56. package/lib/messaging/error.d.ts +1 -1
  57. package/lib/messaging/error.d.ts.map +1 -1
  58. package/lib/messaging/error.js +2 -2
  59. package/lib/messaging/error.js.map +1 -1
  60. package/lib/messaging/handler.d.ts +10 -0
  61. package/lib/messaging/handler.d.ts.map +1 -1
  62. package/lib/messaging/node/connection.d.ts +0 -10
  63. package/lib/messaging/node/connection.d.ts.map +1 -1
  64. package/lib/messaging/node/connection.js +11 -49
  65. package/lib/messaging/node/connection.js.map +1 -1
  66. package/lib/messaging/proxy-factory.d.ts +2 -0
  67. package/lib/messaging/proxy-factory.d.ts.map +1 -1
  68. package/lib/messaging/proxy-factory.js +73 -160
  69. package/lib/messaging/proxy-factory.js.map +1 -1
  70. package/lib/oss-allowlist.d.ts +14 -0
  71. package/lib/oss-allowlist.d.ts.map +1 -0
  72. package/lib/oss-allowlist.js +8 -0
  73. package/lib/oss-allowlist.js.map +1 -0
  74. package/lib/permission.js +12 -12
  75. package/lib/permission.js.map +1 -1
  76. package/lib/plans.d.ts +1 -1
  77. package/lib/plans.d.ts.map +1 -1
  78. package/lib/plans.js +38 -57
  79. package/lib/plans.js.map +1 -1
  80. package/lib/protocol.d.ts +9 -7
  81. package/lib/protocol.d.ts.map +1 -1
  82. package/lib/protocol.js +44 -114
  83. package/lib/protocol.js.map +1 -1
  84. package/lib/snapshot-url.d.ts +14 -0
  85. package/lib/snapshot-url.d.ts.map +1 -0
  86. package/lib/snapshot-url.js +26 -0
  87. package/lib/snapshot-url.js.map +1 -0
  88. package/lib/snapshot-url.spec.d.ts +7 -0
  89. package/lib/snapshot-url.spec.d.ts.map +1 -0
  90. package/lib/snapshot-url.spec.js +41 -0
  91. package/lib/snapshot-url.spec.js.map +1 -0
  92. package/lib/team-subscription-protocol.js +13 -13
  93. package/lib/team-subscription-protocol.js.map +1 -1
  94. package/lib/teams-projects-protocol.d.ts +9 -0
  95. package/lib/teams-projects-protocol.d.ts.map +1 -1
  96. package/lib/teams-projects-protocol.js +4 -15
  97. package/lib/teams-projects-protocol.js.map +1 -1
  98. package/lib/util/analytics.js +25 -32
  99. package/lib/util/analytics.js.map +1 -1
  100. package/lib/util/async-iterator.js +55 -133
  101. package/lib/util/async-iterator.js.map +1 -1
  102. package/lib/util/cancelable.js +17 -59
  103. package/lib/util/cancelable.js.map +1 -1
  104. package/lib/util/date-time.js +8 -8
  105. package/lib/util/date-time.js.map +1 -1
  106. package/lib/util/deferred.js +10 -12
  107. package/lib/util/deferred.js.map +1 -1
  108. package/lib/util/disposable.js +26 -39
  109. package/lib/util/disposable.js.map +1 -1
  110. package/lib/util/event.js +58 -74
  111. package/lib/util/event.js.map +1 -1
  112. package/lib/util/garbage-collected-cache.d.ts +1 -0
  113. package/lib/util/garbage-collected-cache.d.ts.map +1 -1
  114. package/lib/util/garbage-collected-cache.js +26 -46
  115. package/lib/util/garbage-collected-cache.js.map +1 -1
  116. package/lib/util/generate-workspace-id.js +11 -67
  117. package/lib/util/generate-workspace-id.js.map +1 -1
  118. package/lib/util/generate-workspace-id.spec.js +34 -79
  119. package/lib/util/generate-workspace-id.spec.js.map +1 -1
  120. package/lib/util/gitpod-cookie.d.ts +20 -0
  121. package/lib/util/gitpod-cookie.d.ts.map +1 -0
  122. package/lib/util/gitpod-cookie.js +44 -0
  123. package/lib/util/gitpod-cookie.js.map +1 -0
  124. package/lib/util/gitpod-host-url.d.ts +1 -0
  125. package/lib/util/gitpod-host-url.d.ts.map +1 -1
  126. package/lib/util/gitpod-host-url.js +96 -103
  127. package/lib/util/gitpod-host-url.js.map +1 -1
  128. package/lib/util/gitpod-host-url.spec.js +87 -135
  129. package/lib/util/gitpod-host-url.spec.js.map +1 -1
  130. package/lib/util/grpc.js +3 -3
  131. package/lib/util/grpc.js.map +1 -1
  132. package/lib/util/jaeger-client-types.d.ts +68 -0
  133. package/lib/util/jaeger-client-types.d.ts.map +1 -0
  134. package/lib/util/jaeger-client-types.js +8 -0
  135. package/lib/util/jaeger-client-types.js.map +1 -0
  136. package/lib/util/logging.d.ts +32 -32
  137. package/lib/util/logging.d.ts.map +1 -1
  138. package/lib/util/logging.js +50 -113
  139. package/lib/util/logging.js.map +1 -1
  140. package/lib/util/make-link.js +2 -2
  141. package/lib/util/make-link.js.map +1 -1
  142. package/lib/util/parse-workspace-id.d.ts +10 -0
  143. package/lib/util/parse-workspace-id.d.ts.map +1 -1
  144. package/lib/util/parse-workspace-id.js +31 -7
  145. package/lib/util/parse-workspace-id.js.map +1 -1
  146. package/lib/util/parse-workspace-id.spec.d.ts +4 -0
  147. package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
  148. package/lib/util/parse-workspace-id.spec.js +123 -84
  149. package/lib/util/parse-workspace-id.spec.js.map +1 -1
  150. package/lib/util/queue.js +16 -55
  151. package/lib/util/queue.js.map +1 -1
  152. package/lib/util/queue.spec.js +144 -288
  153. package/lib/util/queue.spec.js.map +1 -1
  154. package/lib/util/repeat.d.ts +15 -0
  155. package/lib/util/repeat.d.ts.map +1 -0
  156. package/lib/util/repeat.js +55 -0
  157. package/lib/util/repeat.js.map +1 -0
  158. package/lib/util/safe-promise.js +9 -12
  159. package/lib/util/safe-promise.js.map +1 -1
  160. package/lib/util/semaphore.js +15 -46
  161. package/lib/util/semaphore.js.map +1 -1
  162. package/lib/util/skip-if.js +6 -6
  163. package/lib/util/skip-if.js.map +1 -1
  164. package/lib/util/timeutil.js +16 -16
  165. package/lib/util/timeutil.js.map +1 -1
  166. package/lib/util/timeutil.spec.js +21 -24
  167. package/lib/util/timeutil.spec.js.map +1 -1
  168. package/lib/util/tracing.d.ts +50 -5
  169. package/lib/util/tracing.d.ts.map +1 -1
  170. package/lib/util/tracing.js +169 -63
  171. package/lib/util/tracing.js.map +1 -1
  172. package/lib/util/tracing.spec.d.ts +7 -0
  173. package/lib/util/tracing.spec.d.ts.map +1 -0
  174. package/lib/util/tracing.spec.js +121 -0
  175. package/lib/util/tracing.spec.js.map +1 -0
  176. package/lib/util/workspace-port-authentication.js +2 -2
  177. package/lib/util/workspace-port-authentication.js.map +1 -1
  178. package/lib/workspace-cluster.d.ts +11 -1
  179. package/lib/workspace-cluster.d.ts.map +1 -1
  180. package/lib/workspace-cluster.js +3 -3
  181. package/lib/workspace-cluster.js.map +1 -1
  182. package/lib/workspace-instance.d.ts +3 -2
  183. package/lib/workspace-instance.d.ts.map +1 -1
  184. package/lib/wsready.js +1 -1
  185. package/package.json +20 -12
  186. package/pkg-yarn.lock +12 -7
  187. package/src/accounting-protocol.ts +1 -3
  188. package/src/admin-protocol.ts +9 -3
  189. package/src/analytics.ts +2 -0
  190. package/src/email-protocol.ts +1 -1
  191. package/src/gitpod-service.ts +25 -13
  192. package/src/ide-protocol.ts +92 -0
  193. package/src/index.ts +2 -0
  194. package/src/messaging/browser/connection.ts +176 -10
  195. package/src/messaging/error.ts +2 -2
  196. package/src/messaging/handler.ts +12 -0
  197. package/src/messaging/node/connection.ts +1 -45
  198. package/src/messaging/proxy-factory.ts +10 -4
  199. package/src/oss-allowlist.ts +15 -0
  200. package/src/protocol.ts +11 -8
  201. package/src/snapshot-url.spec.ts +25 -0
  202. package/src/snapshot-url.ts +27 -0
  203. package/src/team-subscription-protocol.ts +1 -1
  204. package/src/teams-projects-protocol.ts +12 -1
  205. package/src/util/garbage-collected-cache.ts +7 -1
  206. package/src/util/gitpod-cookie.ts +39 -0
  207. package/src/util/gitpod-host-url.ts +9 -5
  208. package/src/util/grpc.ts +3 -3
  209. package/src/util/jaeger-client-types.ts +102 -0
  210. package/src/util/logging.ts +32 -32
  211. package/src/util/parse-workspace-id.spec.ts +21 -1
  212. package/src/util/parse-workspace-id.ts +32 -6
  213. package/src/util/repeat.ts +45 -0
  214. package/src/util/tracing.spec.ts +83 -0
  215. package/src/util/tracing.ts +153 -17
  216. package/src/workspace-cluster.ts +8 -1
  217. package/src/workspace-instance.ts +9 -6
  218. package/src/wsready.ts +1 -1
  219. package/lib/util/repeater.d.ts +0 -22
  220. package/lib/util/repeater.d.ts.map +0 -1
  221. package/lib/util/repeater.js +0 -118
  222. package/lib/util/repeater.js.map +0 -1
  223. package/src/util/jaeger-client.d.ts +0 -105
  224. package/src/util/repeater.ts +0 -49
package/src/protocol.ts CHANGED
@@ -114,6 +114,8 @@ export interface EmailNotificationSettings {
114
114
 
115
115
  export type IDESettings = {
116
116
  defaultIde?: string
117
+ useDesktopIde?: boolean
118
+ defaultDesktopIde?: string
117
119
  }
118
120
 
119
121
  export interface UserPlatform {
@@ -135,14 +137,6 @@ export interface UserPlatform {
135
137
  }
136
138
 
137
139
  export interface UserFeatureSettings {
138
- /**
139
- * This field is used as marker to grant users a free trial for using private repositories,
140
- * independent of any subscription or Chargebee.
141
- * - it is set when the user uses their first private repo
142
- * - whether the trial is expired or not is juged by the UserService
143
- */
144
- privateRepoTrialStartDate?: string;
145
-
146
140
  /**
147
141
  * Permanent feature flags are added to each and every workspace instance
148
142
  * this user starts.
@@ -378,11 +372,16 @@ export interface PendingGithubEvent {
378
372
  export interface Snapshot {
379
373
  id: string;
380
374
  creationTime: string;
375
+ availableTime?: string;
381
376
  originalWorkspaceId: string;
382
377
  bucketId: string;
383
378
  layoutData?: string;
379
+ state: SnapshotState;
380
+ message?: string;
384
381
  }
385
382
 
383
+ export type SnapshotState = 'pending' | 'available' | 'error';
384
+
386
385
  export interface LayoutData {
387
386
  workspaceId: string;
388
387
  lastUpdatedTime: string;
@@ -559,6 +558,9 @@ export interface WorkspaceConfig {
559
558
  github?: GithubAppConfig;
560
559
  vscode?: VSCodeConfig;
561
560
 
561
+ /** deprecated. Enabled by default **/
562
+ experimentalNetwork?: boolean;
563
+
562
564
  /**
563
565
  * Where the config object originates from.
564
566
  *
@@ -769,6 +771,7 @@ export namespace ExternalImageConfigFile {
769
771
 
770
772
  export interface WorkspaceContext {
771
773
  title: string;
774
+ /** This contains the URL portion of the contextURL (which might contain other modifiers as well). It's optional because it's not set for older workspaces. */
772
775
  normalizedContextURL?: string;
773
776
  forceCreateNewWorkspace?: boolean;
774
777
  forceImageBuild?: boolean;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Copyright (c) 2020 Gitpod GmbH. All rights reserved.
3
+ * Licensed under the GNU Affero General Public License (AGPL).
4
+ * See License-AGPL.txt in the project root for license information.
5
+ */
6
+
7
+ import { suite, test } from "mocha-typescript"
8
+ import * as chai from "chai"
9
+ import { SnapshotUrl } from ".";
10
+
11
+ const expect = chai.expect
12
+
13
+ @suite class TestSnapshotUrlParser {
14
+
15
+ @test public testPositive() {
16
+ const actual = SnapshotUrl.parse("workspaces/c362d434-6faa-4ce0-9ad4-91b4a87c4abe/3f0556f7-4afa-11e9-98d5-52f8983b9279.tar@gitpod-prodcopy-user-e1e28f18-0354-4a5d-b6b4-8879a2ff73fd");
17
+
18
+ expect(actual).to.deep.equal(<SnapshotUrl>{
19
+ bucketId: "gitpod-prodcopy-user-e1e28f18-0354-4a5d-b6b4-8879a2ff73fd",
20
+ filename: "3f0556f7-4afa-11e9-98d5-52f8983b9279.tar",
21
+ fullPath: "workspaces/c362d434-6faa-4ce0-9ad4-91b4a87c4abe/3f0556f7-4afa-11e9-98d5-52f8983b9279.tar",
22
+ });
23
+ }
24
+ }
25
+ module.exports = new TestSnapshotUrlParser() // Only to circumvent no usage warning :-/
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Copyright (c) 2021 Gitpod GmbH. All rights reserved.
3
+ * Licensed under the GNU Affero General Public License (AGPL).
4
+ * See License-AGPL.txt in the project root for license information.
5
+ */
6
+
7
+ export interface SnapshotUrl {
8
+ bucketId: string;
9
+ fullPath: string;
10
+ filename: string;
11
+ }
12
+ export namespace SnapshotUrl {
13
+ export function parse(url: string): SnapshotUrl {
14
+ const parts = url.split("@");
15
+ if (parts.length !== 2) {
16
+ throw new Error(`cannot parse snapshot URL: ${url}`);
17
+ }
18
+ const [fullPath, bucketId] = parts;
19
+
20
+ const pathParts = fullPath.split("/");
21
+ if (pathParts.length < 1) {
22
+ throw new Error(`cannot parse snapshot URL: ${url}`);
23
+ }
24
+ const filename = pathParts[pathParts.length - 1];
25
+ return { bucketId, fullPath, filename };
26
+ }
27
+ }
@@ -4,7 +4,7 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- import uuidv4 = require("uuid/v4");
7
+ import { v4 as uuidv4 } from 'uuid';
8
8
  import { Subscription } from "./accounting-protocol";
9
9
 
10
10
  export interface TeamSubscription {
@@ -5,20 +5,27 @@
5
5
  */
6
6
 
7
7
  import { PrebuiltWorkspaceState } from "./protocol";
8
- import uuidv4 = require("uuid/v4");
8
+ import { v4 as uuidv4 } from 'uuid';
9
+ import { DeepPartial } from "./util/deep-partial";
9
10
 
10
11
  export interface ProjectConfig {
11
12
  '.gitpod.yml': string;
12
13
  }
13
14
 
15
+ export interface ProjectSettings {
16
+ useIncrementalPrebuilds?: boolean;
17
+ }
18
+
14
19
  export interface Project {
15
20
  id: string;
16
21
  name: string;
22
+ slug?: string;
17
23
  cloneUrl: string;
18
24
  teamId?: string;
19
25
  userId?: string;
20
26
  appInstallationId: string;
21
27
  config?: ProjectConfig;
28
+ settings?: ProjectSettings;
22
29
  creationTime: string;
23
30
  /** This is a flag that triggers the HARD DELETION of this entity */
24
31
  deleted?: boolean;
@@ -54,6 +61,8 @@ export namespace Project {
54
61
  }
55
62
  }
56
63
 
64
+ export type PartialProject = DeepPartial<Project> & Pick<Project, 'id'>;
65
+
57
66
  export interface PrebuildWithStatus {
58
67
  info: PrebuildInfo;
59
68
  status: PrebuiltWorkspaceState;
@@ -63,6 +72,7 @@ export interface PrebuildWithStatus {
63
72
  export interface PrebuildInfo {
64
73
  id: string;
65
74
  buildWorkspaceId: string;
75
+ basedOnPrebuildId?: string;
66
76
 
67
77
  teamId?: string;
68
78
  userId?: string;
@@ -92,6 +102,7 @@ export namespace PrebuildInfo {
92
102
  }
93
103
 
94
104
  export interface StartPrebuildResult {
105
+ prebuildId: string;
95
106
  wsid: string;
96
107
  done: boolean;
97
108
  }
@@ -4,6 +4,8 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
+ import { repeat } from "./repeat";
8
+
7
9
 
8
10
  interface CacheEntry<T> {
9
11
  key: string;
@@ -41,8 +43,12 @@ export class GarbageCollectedCache<T> {
41
43
  return entry.value;
42
44
  }
43
45
 
46
+ public delete(key: string) {
47
+ this.store.delete(key);
48
+ }
49
+
44
50
  protected regularlyCollectGarbage() {
45
- setInterval(() => this.collectGarbage(), this.gcIntervalSeconds * 1000);
51
+ repeat(() => this.collectGarbage(), this.gcIntervalSeconds * 1000);
46
52
  }
47
53
 
48
54
  protected collectGarbage() {
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Copyright (c) 2021 Gitpod GmbH. All rights reserved.
3
+ * Licensed under the GNU Affero General Public License (AGPL).
4
+ * See License-AGPL.txt in the project root for license information.
5
+ */
6
+ import * as cookie from 'cookie';
7
+
8
+
9
+ /**
10
+ * This cookie indicates whether the connected client is a Gitpod user (= "has logged in within the last year") or not.
11
+ * This is used by "gitpod.io" and "www.gitpod.io" to display different content/buttons.
12
+ */
13
+ export const NAME = "gitpod-user";
14
+ export const VALUE = "true";
15
+
16
+ /**
17
+ * @param domain The domain the Gitpod installation is installed onto
18
+ * @returns
19
+ */
20
+ export function options(domain: string): cookie.CookieSerializeOptions {
21
+ // Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
22
+ return {
23
+ path: "/", // make sure we send the cookie to all sub-pages
24
+ httpOnly: false,
25
+ secure: false,
26
+ maxAge: 60 * 60 * 24 * 365, // 1 year
27
+ sameSite: "lax", // default: true. "Lax" needed to ensure we see cookies from users that neavigate to gitpod.io from external sites
28
+ domain: `.${domain}`, // explicilty include subdomains to not only cover "gitpod.io", but also "www.gitpod.io" or workspaces
29
+ };
30
+ };
31
+
32
+ export function generateCookie(domain: string): string {
33
+ return cookie.serialize(NAME, VALUE, options(domain));
34
+ };
35
+
36
+ export function isPresent(cookies: string): boolean {
37
+ // needs to match the old (gitpod-user=loggedIn) and new (gitpod-user=true) values to ensure a smooth transition during rollout.
38
+ return !!cookies.match(`${NAME}=`);
39
+ };
@@ -85,23 +85,27 @@ export class GitpodHostUrl {
85
85
  }
86
86
 
87
87
  asDashboard(): GitpodHostUrl {
88
- return this.with(url => ({ pathname: '/workspaces/' }));
88
+ return this.with(url => ({ pathname: '/' }));
89
89
  }
90
90
 
91
91
  asLogin(): GitpodHostUrl {
92
- return this.with(url => ({ pathname: '/login/' }));
92
+ return this.with(url => ({ pathname: '/login' }));
93
93
  }
94
94
 
95
95
  asUpgradeSubscription(): GitpodHostUrl {
96
- return this.with(url => ({ pathname: '/plans/' }));
96
+ return this.with(url => ({ pathname: '/plans' }));
97
97
  }
98
98
 
99
99
  asAccessControl(): GitpodHostUrl {
100
- return this.with(url => ({ pathname: '/access-control/' }));
100
+ return this.with(url => ({ pathname: '/integrations' }));
101
101
  }
102
102
 
103
103
  asSettings(): GitpodHostUrl {
104
- return this.with(url => ({ pathname: '/settings/' }));
104
+ return this.with(url => ({ pathname: '/settings' }));
105
+ }
106
+
107
+ asPreferences(): GitpodHostUrl {
108
+ return this.with(url => ({ pathname: '/preferences' }));
105
109
  }
106
110
 
107
111
  asGraphQLApi(): GitpodHostUrl {
package/src/util/grpc.ts CHANGED
@@ -5,9 +5,9 @@
5
5
  */
6
6
 
7
7
  export const defaultGRPCOptions = {
8
- "grpc.keepalive_timeout_ms": 1000,
9
- "grpc.keepalive_time_ms": 5000,
10
- "grpc.http2.min_time_between_pings_ms": 1000,
8
+ "grpc.keepalive_timeout_ms": 10000,
9
+ "grpc.keepalive_time_ms": 60000,
10
+ "grpc.http2.min_time_between_pings_ms": 10000,
11
11
  "grpc.keepalive_permit_without_calls": 1,
12
12
  "grpc-node.max_session_memory": 50,
13
13
  "grpc.max_reconnect_backoff_ms": 5000,
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Copyright (c) 2020 Gitpod GmbH. All rights reserved.
3
+ * Licensed under the GNU Affero General Public License (AGPL).
4
+ * See License-AGPL.txt in the project root for license information.
5
+ */
6
+
7
+ import { opentracing } from "jaeger-client";
8
+
9
+ // Type definitions for jaeger-client which are not exported by @types/jaeger-client
10
+ // Project: https://github.com/uber/jaeger-client-node
11
+ // Definitions by: Julian Steger <https://github.com/julianste>
12
+ // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
13
+
14
+ export interface TracingConfig {
15
+ serviceName?: string;
16
+ disable?: boolean;
17
+ sampler?: SamplerConfig;
18
+ reporter?: ReporterConfig;
19
+ }
20
+
21
+ export interface TracingOptions {
22
+ reporter?: Reporter;
23
+ metrics?: MetricsFactory;
24
+ logger?: Logger;
25
+ tags?: any;
26
+ }
27
+
28
+ export interface ReporterConfig {
29
+ logSpans?: boolean;
30
+ agentHost?: string;
31
+ agentPort?: number;
32
+ flushIntervalMs?: number;
33
+ }
34
+
35
+ export interface SamplerConfig {
36
+ type: string;
37
+ param: number;
38
+ host?: string;
39
+ port?: number;
40
+ refreshIntervalMs?: number;
41
+ }
42
+
43
+ export interface Logger {
44
+ info(msg: string): void;
45
+ error(msg: string): void;
46
+ }
47
+
48
+ export interface Reporter {
49
+ report(span: opentracing.Span): void;
50
+ close(callback?: () => void): void;
51
+ setProcess(serviceName: string, tags: any): void;
52
+ }
53
+
54
+ export interface MetricsFactory {
55
+ createCounter(name: string, tags: any): Counter;
56
+ createTimer(name: string, tags: any): Timer;
57
+ createGauge(name: string, tags: any): Gauge;
58
+ }
59
+
60
+ // Counter tracks the number of times an event has occurred
61
+ export interface Counter {
62
+ // Adds the given value to the counter.
63
+ increment(delta: number): void;
64
+ }
65
+
66
+ // Timer tracks how long an operation took and also computes percentiles.
67
+ export interface Timer {
68
+ // Records the time passed in.
69
+ record(value: number): void;
70
+ }
71
+
72
+ // Gauge returns instantaneous measurements of something as an int64 value
73
+ export interface Gauge {
74
+ // Update the gauge to the value passed in.
75
+ update(value: number): void;
76
+ }
77
+
78
+ // export function initTracer(
79
+ // tracingConfig: TracingConfig,
80
+ // tracingOptions: TracingOptions,
81
+ // ): opentracing.Tracer;
82
+
83
+ // export function initTracerFromEnv(
84
+ // tracingConfig: TracingConfig,
85
+ // tracingOptions: TracingOptions,
86
+ // ): opentracing.Tracer;
87
+
88
+ export interface SamplingDecision {
89
+ sample: boolean;
90
+ retryable: boolean;
91
+ tags: any;
92
+ }
93
+
94
+ // added by TypeFox
95
+ export interface Sampler {
96
+ name(): string
97
+ isSampled(operation: string, tags: any): boolean;
98
+ onCreateSpan(span: opentracing.Span): SamplingDecision;
99
+ onSetOperationName(span: opentracing.Span, operationName: string): SamplingDecision;
100
+ onSetTag(span: opentracing.Span, key: string, value: any): SamplingDecision;
101
+ close(callback: () => void): void
102
+ }
@@ -30,66 +30,66 @@ export interface LogPayload {
30
30
  };
31
31
 
32
32
  export namespace log {
33
- export function error(context: LogContext, message: string, error: Error, payload: LogPayload): void;
34
- export function error(context: LogContext, message: string, error: Error): void;
33
+ export function error(context: LogContext, message: string, error: any, payload: LogPayload): void;
34
+ export function error(context: LogContext, message: string, error: any): void;
35
35
  export function error(context: LogContext, message: string, payload: LogPayload): void;
36
36
  export function error(context: LogContext, message: string): void;
37
- export function error(context: LogContext, error: Error, payload: LogPayload): void;
38
- export function error(context: LogContext, error: Error): void;
39
- export function error(message: string, error: Error, payload: LogPayload): void;
40
- export function error(message: string, error: Error): void;
37
+ export function error(context: LogContext, error: any, payload: LogPayload): void;
38
+ export function error(context: LogContext, error: any): void;
39
+ export function error(message: string, error: any, payload: LogPayload): void;
40
+ export function error(message: string, error: any): void;
41
41
  export function error(message: string, payload: LogPayload): void;
42
42
  export function error(message: string): void;
43
- export function error(error: Error, payload: LogPayload): void;
44
- export function error(error: Error): void;
43
+ export function error(error: any, payload: LogPayload): void;
44
+ export function error(error: any): void;
45
45
  export function error(...args: any[]): void {
46
46
  errorLog(false, args);
47
47
  }
48
48
 
49
- export function warn(context: LogContext, message: string, error: Error, payload: LogPayload): void;
50
- export function warn(context: LogContext, message: string, error: Error): void;
49
+ export function warn(context: LogContext, message: string, error: any, payload: LogPayload): void;
50
+ export function warn(context: LogContext, message: string, error: any): void;
51
51
  export function warn(context: LogContext, message: string, payload: LogPayload): void;
52
52
  export function warn(context: LogContext, message: string): void;
53
- export function warn(context: LogContext, error: Error, payload: LogPayload): void;
54
- export function warn(context: LogContext, error: Error): void;
55
- export function warn(message: string, error: Error, payload: LogPayload): void;
56
- export function warn(message: string, error: Error): void;
53
+ export function warn(context: LogContext, error: any, payload: LogPayload): void;
54
+ export function warn(context: LogContext, error: any): void;
55
+ export function warn(message: string, error: any, payload: LogPayload): void;
56
+ export function warn(message: string, error: any): void;
57
57
  export function warn(message: string, payload: LogPayload): void;
58
58
  export function warn(message: string): void;
59
- export function warn(error: Error, payload: LogPayload): void;
60
- export function warn(error: Error): void;
59
+ export function warn(error: any, payload: LogPayload): void;
60
+ export function warn(error: any): void;
61
61
  export function warn(...args: any[]): void {
62
62
  warnLog(false, args);
63
63
  }
64
64
 
65
- export function info(context: LogContext, message: string, error: Error, payload: LogPayload): void;
66
- export function info(context: LogContext, message: string, error: Error): void;
65
+ export function info(context: LogContext, message: string, error: any, payload: LogPayload): void;
66
+ export function info(context: LogContext, message: string, error: any): void;
67
67
  export function info(context: LogContext, message: string, payload: LogPayload): void;
68
68
  export function info(context: LogContext, message: string): void;
69
- export function info(context: LogContext, error: Error, payload: LogPayload): void;
70
- export function info(context: LogContext, error: Error): void;
71
- export function info(message: string, error: Error, payload: LogPayload): void;
72
- export function info(message: string, error: Error): void;
69
+ export function info(context: LogContext, error: any, payload: LogPayload): void;
70
+ export function info(context: LogContext, error: any): void;
71
+ export function info(message: string, error: any, payload: LogPayload): void;
72
+ export function info(message: string, error: any): void;
73
73
  export function info(message: string, payload: LogPayload): void;
74
74
  export function info(message: string): void;
75
- export function info(error: Error, payload: LogPayload): void;
76
- export function info(error: Error): void;
75
+ export function info(error: any, payload: LogPayload): void;
76
+ export function info(error: any): void;
77
77
  export function info(...args: any[]): void {
78
78
  infoLog(false, args);
79
79
  }
80
80
 
81
- export function debug(context: LogContext, message: string, error: Error, payload: LogPayload): void;
82
- export function debug(context: LogContext, message: string, error: Error): void;
81
+ export function debug(context: LogContext, message: string, error: any, payload: LogPayload): void;
82
+ export function debug(context: LogContext, message: string, error: any): void;
83
83
  export function debug(context: LogContext, message: string, payload: LogPayload): void;
84
84
  export function debug(context: LogContext, message: string): void;
85
- export function debug(context: LogContext, error: Error, payload: LogPayload): void;
86
- export function debug(context: LogContext, error: Error): void;
87
- export function debug(message: string, error: Error, payload: LogPayload): void;
88
- export function debug(message: string, error: Error): void;
85
+ export function debug(context: LogContext, error: any, payload: LogPayload): void;
86
+ export function debug(context: LogContext, error: any): void;
87
+ export function debug(message: string, error: any, payload: LogPayload): void;
88
+ export function debug(message: string, error: any): void;
89
89
  export function debug(message: string, payload: LogPayload): void;
90
90
  export function debug(message: string): void;
91
- export function debug(error: Error, payload: LogPayload): void;
92
- export function debug(error: Error): void;
91
+ export function debug(error: any, payload: LogPayload): void;
92
+ export function debug(error: any): void;
93
93
  export function debug(...args: any[]): void {
94
94
  debugLog(false, args);
95
95
  }
@@ -6,7 +6,7 @@
6
6
 
7
7
  import * as chai from 'chai';
8
8
  import { suite, test } from 'mocha-typescript';
9
- import { parseWorkspaceIdFromHostname } from './parse-workspace-id';
9
+ import { matchesInstanceIdOrLegacyWorkspaceIdExactly, matchesNewWorkspaceIdExactly, parseWorkspaceIdFromHostname } from './parse-workspace-id';
10
10
  const expect = chai.expect;
11
11
 
12
12
  @suite
@@ -52,5 +52,25 @@ export class ParseWorkspaceIdTest {
52
52
  const actual = parseWorkspaceIdFromHostname("webview-3000-ca81a50f-09d7-465c-acd9-264a747d5351.ws-eu01.some.subdomain.somehost.com");
53
53
  expect(actual).to.equal("ca81a50f-09d7-465c-acd9-264a747d5351");
54
54
  }
55
+
56
+ // match - instance ID
57
+ @test public matchesInstanceIdOrLegacyWorkspaceIdExactly_positive() {
58
+ const actual = matchesInstanceIdOrLegacyWorkspaceIdExactly("b7e0eaf8-ec73-44ec-81ea-04859263b656");
59
+ expect(actual).to.be.true;
60
+ }
61
+ @test public matchesInstanceIdOrLegacyWorkspaceIdExactly_negative() {
62
+ const actual = matchesInstanceIdOrLegacyWorkspaceIdExactly("b7e0eaf8-ec73-44ec-81a-04859263b656");
63
+ expect(actual).to.be.false;
64
+ }
65
+
66
+ // match - new workspace ID
67
+ @test public matchesWorkspaceIdExactly_new_positive() {
68
+ const actual = matchesNewWorkspaceIdExactly("moccasin-ferret-155799b3");
69
+ expect(actual).to.be.true;
70
+ }
71
+ @test public matchesWorkspaceIdExactly_new_negative() {
72
+ const actual = matchesNewWorkspaceIdExactly("moccasin-ferret-15599b3");
73
+ expect(actual).to.be.false;
74
+ }
55
75
  }
56
76
  module.exports = new ParseWorkspaceIdTest()
@@ -4,6 +4,14 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
+ const REGEX_WORKSPACE_ID = /[0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8}/;
8
+ const REGEX_WORKSPACE_ID_EXACT = new RegExp(`^${REGEX_WORKSPACE_ID.source}$`);
9
+ // We need to parse the workspace id precisely here to get the case '<some-str>-<port>-<wsid>.ws.' right
10
+ const REGEX_WORKSPACE_ID_FROM_HOSTNAME = new RegExp(`(${REGEX_WORKSPACE_ID.source})\.ws`);
11
+
12
+ const REGEX_WORKSPACE_ID_LEGACY = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/;
13
+ const REGEX_WORKSPACE_ID_LEGACY_EXACT = new RegExp(`^${REGEX_WORKSPACE_ID_LEGACY.source}$`);
14
+ const REGEX_WORKSPACE_ID_LEGACY_FROM_HOSTNAME = new RegExp(`(${REGEX_WORKSPACE_ID_LEGACY.source})\.ws`);
7
15
 
8
16
  /**
9
17
  * Hostname may be of the form:
@@ -13,17 +21,35 @@
13
21
  * @param hostname The hostname the request is headed to
14
22
  */
15
23
  export const parseWorkspaceIdFromHostname = function(hostname: string) {
16
- // We need to parse the workspace id precisely here to get the case '<some-str>-<port>-<wsid>.ws.' right
17
- const wsIdExpression = /([0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8})\.ws/g;
18
- const match = wsIdExpression.exec(hostname);
24
+ const match = REGEX_WORKSPACE_ID_FROM_HOSTNAME.exec(hostname);
19
25
  if (match && match.length >= 2) {
20
26
  return match[1];
21
27
  } else {
22
- const legacyUrlFormat = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.ws/g;
23
- const legacyMatch = legacyUrlFormat.exec(hostname);
28
+ const legacyMatch = REGEX_WORKSPACE_ID_LEGACY_FROM_HOSTNAME.exec(hostname);
24
29
  if (legacyMatch && legacyMatch.length >= 2) {
25
30
  return legacyMatch[1];
26
31
  }
27
32
  return undefined;
28
33
  }
29
- }
34
+ };
35
+
36
+ /** Equalls UUIDv4 (and REGEX_WORKSPACE_ID_LEGACY!) */
37
+ const REGEX_INSTANCE_ID = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/;
38
+ const REGEX_INSTANCE_ID_EXACT = new RegExp(`^${REGEX_INSTANCE_ID.source}$`);
39
+
40
+ /**
41
+ * @param maybeId
42
+ * @returns
43
+ */
44
+ export const matchesInstanceIdOrLegacyWorkspaceIdExactly = function(maybeId: string): boolean {
45
+ return REGEX_INSTANCE_ID_EXACT.test(maybeId)
46
+ || REGEX_WORKSPACE_ID_LEGACY_EXACT.test(maybeId);
47
+ };
48
+
49
+ /**
50
+ * @param maybeWorkspaceId
51
+ * @returns
52
+ */
53
+ export const matchesNewWorkspaceIdExactly = function(maybeWorkspaceId: string): boolean {
54
+ return REGEX_WORKSPACE_ID_EXACT.test(maybeWorkspaceId);
55
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Copyright (c) 2021 Gitpod GmbH. All rights reserved.
3
+ * Licensed under the GNU Affero General Public License (AGPL).
4
+ * See License-AGPL.txt in the project root for license information.
5
+ */
6
+
7
+ import { Disposable } from "..";
8
+ import { log } from "./logging";
9
+
10
+ /**
11
+ * This intends to be a drop-in replacement for 'setInterval' implemented with a 'setTimeout' chain
12
+ * to ensure we're not creating more timeouts than we can process.
13
+ * @param op
14
+ * @param everyMilliseconds
15
+ * @returns
16
+ */
17
+ export function repeat(op: () => Promise<void> | void, everyMilliseconds: number): Disposable {
18
+ let timer: NodeJS.Timeout | undefined = undefined;
19
+ let stopped = false;
20
+ const repeated = () => {
21
+ if (stopped) {
22
+ // in case we missed the clearTimeout i 'await'
23
+ return;
24
+ }
25
+
26
+ timer = setTimeout(async () => {
27
+ try {
28
+ await op();
29
+ } catch (err) {
30
+ // catch error here to
31
+ log.error(err);
32
+ }
33
+
34
+ repeated(); // chain ourselves - after the 'await'
35
+ }, everyMilliseconds);
36
+ };
37
+ repeated();
38
+
39
+ return Disposable.create(() => {
40
+ stopped = true;
41
+ if (timer) {
42
+ clearTimeout(timer);
43
+ }
44
+ });
45
+ }