@gitpod/gitpod-protocol 0.1.5-wth-update-mysql-dependencies-2.31 → 0.1.5-wth-test.80

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 (295) hide show
  1. package/data/gitpod-schema.json +25 -24
  2. package/lib/accounting-protocol.d.ts +3 -6
  3. package/lib/accounting-protocol.d.ts.map +1 -1
  4. package/lib/accounting-protocol.js +10 -16
  5. package/lib/accounting-protocol.js.map +1 -1
  6. package/lib/admin-protocol.d.ts +26 -4
  7. package/lib/admin-protocol.d.ts.map +1 -1
  8. package/lib/admin-protocol.js +15 -0
  9. package/lib/admin-protocol.js.map +1 -1
  10. package/lib/analytics.d.ts +44 -0
  11. package/lib/analytics.d.ts.map +1 -0
  12. package/lib/analytics.js +10 -0
  13. package/lib/analytics.js.map +1 -0
  14. package/lib/context-url.d.ts +31 -0
  15. package/lib/context-url.d.ts.map +1 -0
  16. package/lib/context-url.js +102 -0
  17. package/lib/context-url.js.map +1 -0
  18. package/lib/context-url.spec.d.ts +14 -0
  19. package/lib/context-url.spec.d.ts.map +1 -0
  20. package/lib/context-url.spec.js +94 -0
  21. package/lib/context-url.spec.js.map +1 -0
  22. package/lib/email-protocol.d.ts +1 -2
  23. package/lib/email-protocol.d.ts.map +1 -1
  24. package/lib/email-protocol.js +4 -4
  25. package/lib/email-protocol.js.map +1 -1
  26. package/lib/encryption/container-module.js +5 -4
  27. package/lib/encryption/container-module.js.map +1 -1
  28. package/lib/encryption/encryption-engine.js +19 -20
  29. package/lib/encryption/encryption-engine.js.map +1 -1
  30. package/lib/encryption/encryption-engine.spec.js +29 -36
  31. package/lib/encryption/encryption-engine.spec.js.map +1 -1
  32. package/lib/encryption/encryption-service.js +29 -43
  33. package/lib/encryption/encryption-service.js.map +1 -1
  34. package/lib/encryption/key-provider.js +25 -30
  35. package/lib/encryption/key-provider.js.map +1 -1
  36. package/lib/env.d.ts +1 -2
  37. package/lib/env.d.ts.map +1 -1
  38. package/lib/env.js +20 -21
  39. package/lib/env.js.map +1 -1
  40. package/lib/gitpod-file-parser.js +25 -41
  41. package/lib/gitpod-file-parser.js.map +1 -1
  42. package/lib/gitpod-file-parser.spec.js +116 -116
  43. package/lib/gitpod-file-parser.spec.js.map +1 -1
  44. package/lib/gitpod-service.d.ts +124 -22
  45. package/lib/gitpod-service.d.ts.map +1 -1
  46. package/lib/gitpod-service.js +169 -278
  47. package/lib/gitpod-service.js.map +1 -1
  48. package/lib/headless-workspace-log.d.ts +8 -11
  49. package/lib/headless-workspace-log.d.ts.map +1 -1
  50. package/lib/headless-workspace-log.js +4 -7
  51. package/lib/headless-workspace-log.js.map +1 -1
  52. package/lib/ide-protocol.d.ts +105 -0
  53. package/lib/ide-protocol.d.ts.map +1 -0
  54. package/lib/ide-protocol.js +8 -0
  55. package/lib/ide-protocol.js.map +1 -0
  56. package/lib/index.d.ts +6 -0
  57. package/lib/index.d.ts.map +1 -1
  58. package/lib/index.js +7 -1
  59. package/lib/index.js.map +1 -1
  60. package/lib/installation-admin-protocol.d.ts +27 -0
  61. package/lib/installation-admin-protocol.d.ts.map +1 -0
  62. package/lib/installation-admin-protocol.js +30 -0
  63. package/lib/installation-admin-protocol.js.map +1 -0
  64. package/lib/messaging/browser/connection.d.ts +5 -3
  65. package/lib/messaging/browser/connection.d.ts.map +1 -1
  66. package/lib/messaging/browser/connection.js +183 -33
  67. package/lib/messaging/browser/connection.js.map +1 -1
  68. package/lib/messaging/browser/window-connection.js +35 -55
  69. package/lib/messaging/browser/window-connection.js.map +1 -1
  70. package/lib/messaging/client-call-metrics.d.ts +35 -0
  71. package/lib/messaging/client-call-metrics.d.ts.map +1 -0
  72. package/lib/messaging/client-call-metrics.js +83 -0
  73. package/lib/messaging/client-call-metrics.js.map +1 -0
  74. package/lib/messaging/error.d.ts +3 -1
  75. package/lib/messaging/error.d.ts.map +1 -1
  76. package/lib/messaging/error.js +6 -2
  77. package/lib/messaging/error.js.map +1 -1
  78. package/lib/messaging/handler.d.ts +10 -0
  79. package/lib/messaging/handler.d.ts.map +1 -1
  80. package/lib/messaging/node/connection.d.ts +1 -17
  81. package/lib/messaging/node/connection.d.ts.map +1 -1
  82. package/lib/messaging/node/connection.js +23 -59
  83. package/lib/messaging/node/connection.js.map +1 -1
  84. package/lib/messaging/proxy-factory.d.ts +2 -0
  85. package/lib/messaging/proxy-factory.d.ts.map +1 -1
  86. package/lib/messaging/proxy-factory.js +74 -159
  87. package/lib/messaging/proxy-factory.js.map +1 -1
  88. package/lib/oss-allowlist.d.ts +14 -0
  89. package/lib/oss-allowlist.d.ts.map +1 -0
  90. package/lib/oss-allowlist.js +8 -0
  91. package/lib/oss-allowlist.js.map +1 -0
  92. package/lib/permission.d.ts +8 -1
  93. package/lib/permission.d.ts.map +1 -1
  94. package/lib/permission.js +36 -15
  95. package/lib/permission.js.map +1 -1
  96. package/lib/plans.d.ts +210 -0
  97. package/lib/plans.d.ts.map +1 -0
  98. package/lib/plans.js +570 -0
  99. package/lib/plans.js.map +1 -0
  100. package/lib/protocol.d.ts +121 -54
  101. package/lib/protocol.d.ts.map +1 -1
  102. package/lib/protocol.js +117 -131
  103. package/lib/protocol.js.map +1 -1
  104. package/lib/snapshot-url.d.ts +14 -0
  105. package/lib/snapshot-url.d.ts.map +1 -0
  106. package/lib/snapshot-url.js +26 -0
  107. package/lib/snapshot-url.js.map +1 -0
  108. package/{src/util/without.ts → lib/snapshot-url.spec.d.ts} +2 -3
  109. package/lib/snapshot-url.spec.d.ts.map +1 -0
  110. package/lib/snapshot-url.spec.js +41 -0
  111. package/lib/snapshot-url.spec.js.map +1 -0
  112. package/lib/team-subscription-protocol.d.ts +4 -4
  113. package/lib/team-subscription-protocol.d.ts.map +1 -1
  114. package/lib/team-subscription-protocol.js +15 -12
  115. package/lib/team-subscription-protocol.js.map +1 -1
  116. package/lib/teams-projects-protocol.d.ts +113 -0
  117. package/lib/teams-projects-protocol.d.ts.map +1 -0
  118. package/lib/teams-projects-protocol.js +30 -0
  119. package/lib/teams-projects-protocol.js.map +1 -0
  120. package/lib/util/analytics.d.ts +8 -0
  121. package/lib/util/analytics.d.ts.map +1 -0
  122. package/lib/util/analytics.js +88 -0
  123. package/lib/util/analytics.js.map +1 -0
  124. package/lib/util/async-iterator.js +55 -133
  125. package/lib/util/async-iterator.js.map +1 -1
  126. package/lib/util/cancelable.js +17 -59
  127. package/lib/util/cancelable.js.map +1 -1
  128. package/lib/util/date-time.js +8 -8
  129. package/lib/util/date-time.js.map +1 -1
  130. package/lib/util/deferred.js +10 -12
  131. package/lib/util/deferred.js.map +1 -1
  132. package/lib/util/disposable.js +26 -39
  133. package/lib/util/disposable.js.map +1 -1
  134. package/lib/util/event.js +58 -74
  135. package/lib/util/event.js.map +1 -1
  136. package/lib/util/garbage-collected-cache.d.ts +1 -0
  137. package/lib/util/garbage-collected-cache.d.ts.map +1 -1
  138. package/lib/util/garbage-collected-cache.js +26 -46
  139. package/lib/util/garbage-collected-cache.js.map +1 -1
  140. package/lib/util/generate-workspace-id.d.ts +1 -1
  141. package/lib/util/generate-workspace-id.d.ts.map +1 -1
  142. package/lib/util/generate-workspace-id.js +31 -68
  143. package/lib/util/generate-workspace-id.js.map +1 -1
  144. package/lib/util/generate-workspace-id.spec.js +57 -78
  145. package/lib/util/generate-workspace-id.spec.js.map +1 -1
  146. package/lib/util/gitpod-cookie.d.ts +20 -0
  147. package/lib/util/gitpod-cookie.d.ts.map +1 -0
  148. package/lib/util/gitpod-cookie.js +44 -0
  149. package/lib/util/gitpod-cookie.js.map +1 -0
  150. package/lib/util/gitpod-host-url.d.ts +1 -2
  151. package/lib/util/gitpod-host-url.d.ts.map +1 -1
  152. package/lib/util/gitpod-host-url.js +95 -98
  153. package/lib/util/gitpod-host-url.js.map +1 -1
  154. package/lib/util/gitpod-host-url.spec.d.ts +7 -1
  155. package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
  156. package/lib/util/gitpod-host-url.spec.js +103 -31
  157. package/lib/util/gitpod-host-url.spec.js.map +1 -1
  158. package/lib/util/grpc.d.ts +15 -0
  159. package/lib/util/grpc.d.ts.map +1 -0
  160. package/lib/util/grpc.js +18 -0
  161. package/lib/util/grpc.js.map +1 -0
  162. package/lib/util/jaeger-client-types.d.ts +68 -0
  163. package/lib/util/jaeger-client-types.d.ts.map +1 -0
  164. package/lib/util/{without.js → jaeger-client-types.js} +1 -1
  165. package/lib/util/jaeger-client-types.js.map +1 -0
  166. package/lib/util/logging.d.ts +49 -33
  167. package/lib/util/logging.d.ts.map +1 -1
  168. package/lib/util/logging.js +107 -110
  169. package/lib/util/logging.js.map +1 -1
  170. package/lib/util/make-link.js +2 -2
  171. package/lib/util/make-link.js.map +1 -1
  172. package/lib/util/parse-workspace-id.d.ts +10 -0
  173. package/lib/util/parse-workspace-id.d.ts.map +1 -1
  174. package/lib/util/parse-workspace-id.js +32 -7
  175. package/lib/util/parse-workspace-id.js.map +1 -1
  176. package/lib/util/parse-workspace-id.spec.d.ts +4 -0
  177. package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
  178. package/lib/util/parse-workspace-id.spec.js +123 -84
  179. package/lib/util/parse-workspace-id.spec.js.map +1 -1
  180. package/lib/util/queue.js +16 -55
  181. package/lib/util/queue.js.map +1 -1
  182. package/lib/util/queue.spec.js +144 -288
  183. package/lib/util/queue.spec.js.map +1 -1
  184. package/lib/util/repeat.d.ts +15 -0
  185. package/lib/util/repeat.d.ts.map +1 -0
  186. package/lib/util/repeat.js +55 -0
  187. package/lib/util/repeat.js.map +1 -0
  188. package/lib/util/semaphore.js +15 -46
  189. package/lib/util/semaphore.js.map +1 -1
  190. package/lib/util/skip-if.js +6 -6
  191. package/lib/util/skip-if.js.map +1 -1
  192. package/lib/util/timeutil.js +28 -16
  193. package/lib/util/timeutil.js.map +1 -1
  194. package/lib/util/timeutil.spec.js +21 -24
  195. package/lib/util/timeutil.spec.js.map +1 -1
  196. package/lib/util/tracing.d.ts +51 -5
  197. package/lib/util/tracing.d.ts.map +1 -1
  198. package/lib/util/tracing.js +197 -62
  199. package/lib/util/tracing.js.map +1 -1
  200. package/lib/util/tracing.spec.d.ts +7 -0
  201. package/lib/util/tracing.spec.d.ts.map +1 -0
  202. package/lib/util/tracing.spec.js +121 -0
  203. package/lib/util/tracing.spec.js.map +1 -0
  204. package/lib/util/workspace-port-authentication.js +3 -2
  205. package/lib/util/workspace-port-authentication.js.map +1 -1
  206. package/lib/workspace-cluster.d.ts +76 -0
  207. package/lib/workspace-cluster.d.ts.map +1 -0
  208. package/lib/workspace-cluster.js +33 -0
  209. package/lib/workspace-cluster.js.map +1 -0
  210. package/lib/workspace-instance.d.ts +24 -2
  211. package/lib/workspace-instance.d.ts.map +1 -1
  212. package/lib/wsready.d.ts +1 -1
  213. package/lib/wsready.js +2 -2
  214. package/package.json +31 -17
  215. package/pkg-yarn.lock +17 -9
  216. package/provenance-bundle.jsonl +2 -0
  217. package/src/accounting-protocol.ts +4 -10
  218. package/src/admin-protocol.ts +47 -5
  219. package/src/analytics.ts +52 -0
  220. package/src/context-url.spec.ts +53 -0
  221. package/src/context-url.ts +107 -0
  222. package/src/email-protocol.ts +2 -3
  223. package/src/env.ts +10 -10
  224. package/src/gitpod-service.ts +181 -44
  225. package/src/headless-workspace-log.ts +7 -11
  226. package/src/ide-frontend-service.ts +1 -1
  227. package/src/ide-protocol.ts +119 -0
  228. package/src/index.ts +7 -1
  229. package/src/installation-admin-protocol.ts +42 -0
  230. package/src/messaging/browser/connection.ts +195 -14
  231. package/src/messaging/client-call-metrics.ts +97 -0
  232. package/src/messaging/error.ts +8 -2
  233. package/src/messaging/handler.ts +12 -0
  234. package/src/messaging/node/connection.ts +21 -68
  235. package/src/messaging/proxy-factory.ts +14 -6
  236. package/src/oss-allowlist.ts +15 -0
  237. package/src/permission.ts +24 -4
  238. package/src/plans.ts +632 -0
  239. package/src/protocol.ts +196 -85
  240. package/src/snapshot-url.spec.ts +25 -0
  241. package/src/snapshot-url.ts +27 -0
  242. package/src/team-subscription-protocol.ts +7 -5
  243. package/src/teams-projects-protocol.ts +147 -0
  244. package/src/util/analytics.ts +105 -0
  245. package/src/util/deferred.ts +1 -1
  246. package/src/util/garbage-collected-cache.ts +9 -3
  247. package/src/util/generate-workspace-id.spec.ts +20 -3
  248. package/src/util/generate-workspace-id.ts +22 -2
  249. package/src/util/gitpod-cookie.ts +39 -0
  250. package/src/util/gitpod-host-url.spec.ts +25 -1
  251. package/src/util/gitpod-host-url.ts +22 -13
  252. package/src/util/grpc.ts +15 -0
  253. package/src/util/jaeger-client-types.ts +102 -0
  254. package/src/util/logging.ts +102 -38
  255. package/src/util/parse-workspace-id.spec.ts +21 -1
  256. package/src/util/parse-workspace-id.ts +32 -6
  257. package/src/util/queue.spec.ts +1 -1
  258. package/src/util/repeat.ts +45 -0
  259. package/src/util/semaphore.ts +2 -2
  260. package/src/util/skip-if.ts +1 -1
  261. package/src/util/timeutil.ts +4 -4
  262. package/src/util/tracing.spec.ts +83 -0
  263. package/src/util/tracing.ts +183 -17
  264. package/src/workspace-cluster.ts +104 -0
  265. package/src/workspace-instance.ts +45 -13
  266. package/src/wsready.ts +2 -2
  267. package/lib/messaging/connection-error-handler.d.ts +0 -27
  268. package/lib/messaging/connection-error-handler.d.ts.map +0 -1
  269. package/lib/messaging/connection-error-handler.js +0 -46
  270. package/lib/messaging/connection-error-handler.js.map +0 -1
  271. package/lib/util/context-url.d.ts +0 -13
  272. package/lib/util/context-url.d.ts.map +0 -1
  273. package/lib/util/context-url.js +0 -26
  274. package/lib/util/context-url.js.map +0 -1
  275. package/lib/util/context-url.spec.d.ts +0 -10
  276. package/lib/util/context-url.spec.d.ts.map +0 -1
  277. package/lib/util/context-url.spec.js +0 -52
  278. package/lib/util/context-url.spec.js.map +0 -1
  279. package/lib/util/repeater.d.ts +0 -22
  280. package/lib/util/repeater.d.ts.map +0 -1
  281. package/lib/util/repeater.js +0 -118
  282. package/lib/util/repeater.js.map +0 -1
  283. package/lib/util/safe-promise.d.ts +0 -11
  284. package/lib/util/safe-promise.d.ts.map +0 -1
  285. package/lib/util/safe-promise.js +0 -34
  286. package/lib/util/safe-promise.js.map +0 -1
  287. package/lib/util/without.d.ts +0 -7
  288. package/lib/util/without.d.ts.map +0 -1
  289. package/lib/util/without.js.map +0 -1
  290. package/src/messaging/connection-error-handler.ts +0 -62
  291. package/src/util/context-url.spec.ts +0 -25
  292. package/src/util/context-url.ts +0 -23
  293. package/src/util/jaeger-client.d.ts +0 -105
  294. package/src/util/repeater.ts +0 -49
  295. package/src/util/safe-promise.ts +0 -26
@@ -0,0 +1,107 @@
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 { Workspace } from ".";
8
+
9
+ /**
10
+ * The whole point of these methods is to overcome inconsistencies in our data model.
11
+ * Ideally we remove it at some point once we fixed our model, as it:
12
+ * - duplicates logic
13
+ * - but additional burden on clients (using this, copying this to other languages!)
14
+ *
15
+ * TODO(gpl) See if we can get this into `server` code to remove the burden from clients
16
+ */
17
+ export namespace ContextURL {
18
+ export const INCREMENTAL_PREBUILD_PREFIX = "incremental-prebuild";
19
+ export const PREBUILD_PREFIX = "prebuild";
20
+ export const IMAGEBUILD_PREFIX = "imagebuild";
21
+ export const SNAPSHOT_PREFIX = "snapshot";
22
+ export const REFERRER_PREFIX = 'referrer:';
23
+
24
+ /**
25
+ * This function will (try to) return the HTTP(S) URL of the context the user originally created this workspace on.
26
+ * Especially it will not contain any modifiers or be of different scheme than HTTP(S).
27
+ *
28
+ * Use this function if you need to provided a _working_ URL to the original context.
29
+ * @param ws
30
+ * @returns
31
+ */
32
+ export function getNormalizedURL(ws: Pick<Workspace, "context" | "contextURL"> | undefined): URL | undefined {
33
+ const normalized = normalize(ws);
34
+ if (!normalized) {
35
+ return undefined;
36
+ }
37
+
38
+ try {
39
+ return new URL(normalized);
40
+ } catch (err) {
41
+ console.error(`unable to parse URL from normalized contextURL: '${normalized}'`, err);
42
+ }
43
+ return undefined;
44
+ }
45
+
46
+ function normalize(ws: Pick<Workspace, "context" | "contextURL"> | undefined): string | undefined {
47
+ if (!ws) {
48
+ return undefined;
49
+ }
50
+ if (ws.context.normalizedContextURL) {
51
+ return ws.context.normalizedContextURL;
52
+ }
53
+
54
+ // fallback: we do not yet set normalizedContextURL on all workspaces, yet, let alone older existing workspaces
55
+ let fallback: string | undefined = undefined;
56
+ try {
57
+ fallback = removePrefixes(ws.contextURL);
58
+ } catch (err) {
59
+ console.error(`unable to remove prefixes from contextURL: '${ws.contextURL}'`, err);
60
+ }
61
+ return fallback;
62
+ }
63
+
64
+ /**
65
+ * The field "contextUrl" might contain prefixes like:
66
+ * - envvar1=value1/...
67
+ * - prebuild/...
68
+ * This is the analogon to the (Prefix)ContextParser structure in "server".
69
+ */
70
+ function removePrefixes(contextUrl: string | undefined): string | undefined {
71
+ if (contextUrl === undefined) {
72
+ return undefined;
73
+ }
74
+
75
+ const segments = contextUrl.split("/");
76
+ if (segments.length === 1) {
77
+ return segments[0]; // this might be something, we just try
78
+ }
79
+
80
+ const segmentsToURL = (offset: number): string => {
81
+ let rest = segments.slice(offset).join("/");
82
+ if (/^git@[^:\/]+:/.test(rest)) {
83
+ rest = rest.replace(/^git@([^:\/]+):/, 'https://$1/');
84
+ }
85
+ if (!rest.startsWith("http")) {
86
+ rest = 'https://' + rest;
87
+ }
88
+ return rest;
89
+ };
90
+
91
+ const firstSegment = segments[0];
92
+ if (firstSegment === PREBUILD_PREFIX ||
93
+ firstSegment === INCREMENTAL_PREBUILD_PREFIX ||
94
+ firstSegment === IMAGEBUILD_PREFIX ||
95
+ firstSegment === SNAPSHOT_PREFIX ||
96
+ firstSegment.startsWith(REFERRER_PREFIX)) {
97
+ return segmentsToURL(1);
98
+ }
99
+
100
+ // check for env vars
101
+ if (firstSegment.indexOf("=") !== -1) {
102
+ return segmentsToURL(1);
103
+ }
104
+
105
+ return segmentsToURL(0);
106
+ }
107
+ }
@@ -4,8 +4,7 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- import { Without } from "./util/without";
8
- import uuidv4 = require("uuid/v4");
7
+ import { v4 as uuidv4 } from 'uuid';
9
8
 
10
9
  export type EMailState = "scheduledInternal"
11
10
  | "scheduledSendgrid";
@@ -59,7 +58,7 @@ export type EMail = {
59
58
  } & EMailStatus;
60
59
 
61
60
  export namespace EMail {
62
- export const create = (ts: Without<EMail, 'uid'>): EMail => {
61
+ export const create = (ts: Omit<EMail, 'uid'>): EMail => {
63
62
  const withId = ts as EMail;
64
63
  withId.uid = uuidv4();
65
64
  return withId;
package/src/env.ts CHANGED
@@ -13,18 +13,18 @@ const legacyStagenameTranslation: { [key: string]: KubeStage } = {
13
13
  "dev": "dev"
14
14
  }
15
15
 
16
+ export function translateLegacyStagename(kubeStage: string): KubeStage {
17
+ const stage = legacyStagenameTranslation[kubeStage];
18
+ if (!stage) {
19
+ throw new Error(`Invalid KUBE_STAGE: ${kubeStage}`);
20
+ }
21
+
22
+ return stage;
23
+ }
24
+
16
25
  @injectable()
17
26
  export abstract class AbstractComponentEnv {
18
- readonly kubeStage: KubeStage = getEnvVarParsed('KUBE_STAGE', (kubeStage) => {
19
- const stage = legacyStagenameTranslation[kubeStage];
20
- if (!stage) {
21
- throw new Error(`Environment variable invalid: KUBE_STAGE=${kubeStage}`);
22
- }
23
-
24
- return stage;
25
- });
26
- readonly kubeNamespace: string = getEnvVar('KUBE_NAMESPACE');
27
- readonly version: string = getEnvVar('VERSION');
27
+ readonly kubeStage: KubeStage = getEnvVarParsed('KUBE_STAGE', translateLegacyStagename);
28
28
 
29
29
  readonly installationLongname: string = getEnvVar("GITPOD_INSTALLATION_LONGNAME")
30
30
  readonly installationShortname: string = getEnvVar("GITPOD_INSTALLATION_SHORTNAME")
@@ -5,14 +5,19 @@
5
5
  */
6
6
 
7
7
  import {
8
- User, WorkspaceInfo, WorkspaceCreationResult, UserMessage, WorkspaceInstanceUser,
9
- WhitelistedRepository, WorkspaceImageBuild, AuthProviderInfo, Branding, CreateWorkspaceMode,
8
+ User, WorkspaceInfo, WorkspaceCreationResult, WorkspaceInstanceUser,
9
+ WhitelistedRepository, WorkspaceImageBuild, AuthProviderInfo, CreateWorkspaceMode,
10
10
  Token, UserEnvVarValue, ResolvePluginsParams, PreparePluginUploadParams, Terms,
11
- ResolvedPlugins, Configuration, InstallPluginsParams, UninstallPluginParams, UserInfo, GitpodTokenType, GitpodToken, AuthProviderEntry
11
+ ResolvedPlugins, Configuration, InstallPluginsParams, UninstallPluginParams, UserInfo, GitpodTokenType,
12
+ GitpodToken, AuthProviderEntry, GuessGitTokenScopesParams, GuessedGitTokenScopes, ProjectEnvVar
12
13
  } from './protocol';
14
+ import {
15
+ Team, TeamMemberInfo,
16
+ TeamMembershipInvite, Project, TeamMemberRole, PrebuildWithStatus, StartPrebuildResult, PartialProject
17
+ } from './teams-projects-protocol';
13
18
  import { JsonRpcProxy, JsonRpcServer } from './messaging/proxy-factory';
14
19
  import { Disposable, CancellationTokenSource } from 'vscode-jsonrpc';
15
- import { HeadlessLogEvent } from './headless-workspace-log';
20
+ import { HeadlessLogUrls } from './headless-workspace-log';
16
21
  import { WorkspaceInstance, WorkspaceInstancePort, WorkspaceInstancePhase } from './workspace-instance';
17
22
  import { AdminServer } from './admin-protocol';
18
23
  import { GitpodHostUrl } from './util/gitpod-host-url';
@@ -23,11 +28,15 @@ import { Emitter } from './util/event';
23
28
  import { AccountStatement, CreditAlert } from './accounting-protocol';
24
29
  import { GithubUpgradeURL, PlanCoupon } from './payment-protocol';
25
30
  import { TeamSubscription, TeamSubscriptionSlot, TeamSubscriptionSlotResolved } from './team-subscription-protocol';
31
+ import { RemotePageMessage, RemoteTrackMessage, RemoteIdentifyMessage } from './analytics';
32
+ import { IDEServer } from './ide-protocol';
33
+ import { InstallationAdminSettings, TelemetryData } from './installation-admin-protocol';
26
34
 
27
35
  export interface GitpodClient {
28
36
  onInstanceUpdate(instance: WorkspaceInstance): void;
29
37
  onWorkspaceImageBuildLogs: WorkspaceImageBuild.LogCallback;
30
- onHeadlessWorkspaceLogs(evt: HeadlessLogEvent): void;
38
+
39
+ onPrebuildUpdate(update: PrebuildWithStatus): void;
31
40
 
32
41
  onCreditAlert(creditAlert: CreditAlert): void;
33
42
 
@@ -38,18 +47,18 @@ export interface GitpodClient {
38
47
  }
39
48
 
40
49
  export const GitpodServer = Symbol('GitpodServer');
41
- export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer, LicenseService {
50
+ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer, LicenseService, IDEServer {
42
51
  // User related API
43
52
  getLoggedInUser(): Promise<User>;
44
53
  getTerms(): Promise<Terms>;
45
54
  updateLoggedInUser(user: Partial<User>): Promise<User>;
46
55
  getAuthProviders(): Promise<AuthProviderInfo[]>;
47
56
  getOwnAuthProviders(): Promise<AuthProviderEntry[]>;
48
- updateOwnAuthProvider(params: GitpodServer.UpdateOwnAuthProviderParams): Promise<void>;
57
+ updateOwnAuthProvider(params: GitpodServer.UpdateOwnAuthProviderParams): Promise<AuthProviderEntry>;
49
58
  deleteOwnAuthProvider(params: GitpodServer.DeleteOwnAuthProviderParams): Promise<void>;
50
- getBranding(): Promise<Branding>;
51
59
  getConfiguration(): Promise<Configuration>;
52
60
  getToken(query: GitpodServer.GetTokenSearchOptions): Promise<Token | undefined>;
61
+ getGitpodTokenScopes(tokenHash: string): Promise<string[]>;
53
62
  /**
54
63
  * @deprecated
55
64
  */
@@ -63,8 +72,15 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
63
72
  getWorkspaceOwner(workspaceId: string): Promise<UserInfo | undefined>;
64
73
  getWorkspaceUsers(workspaceId: string): Promise<WorkspaceInstanceUser[]>;
65
74
  getFeaturedRepositories(): Promise<WhitelistedRepository[]>;
75
+ getSuggestedContextURLs(): Promise<string[]>;
76
+ /**
77
+ * **Security:**
78
+ * Sensitive information like an owner token is erased, since it allows access for all team members.
79
+ * If you need to access an owner token use `getOwnerToken` instead.
80
+ */
66
81
  getWorkspace(id: string): Promise<WorkspaceInfo>;
67
82
  isWorkspaceOwner(workspaceId: string): Promise<boolean>;
83
+ getOwnerToken(workspaceId: string): Promise<string>;
68
84
 
69
85
  /**
70
86
  * Creates and starts a workspace for the given context URL.
@@ -81,8 +97,8 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
81
97
  updateWorkspaceUserPin(id: string, action: GitpodServer.PinAction): Promise<void>;
82
98
  sendHeartBeat(options: GitpodServer.SendHeartBeatOptions): Promise<void>;
83
99
  watchWorkspaceImageBuildLogs(workspaceId: string): Promise<void>;
84
- watchHeadlessWorkspaceLogs(workspaceId: string): Promise<void>;
85
100
  isPrebuildDone(pwsid: string): Promise<boolean>;
101
+ getHeadlessLog(instanceId: string): Promise<HeadlessLogUrls>;
86
102
 
87
103
  // Workspace timeout
88
104
  setWorkspaceTimeout(workspaceId: string, duration: WorkspaceTimeoutDuration): Promise<SetWorkspaceTimeoutResult>;
@@ -96,19 +112,52 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
96
112
  openPort(workspaceId: string, port: WorkspaceInstancePort): Promise<WorkspaceInstancePort | undefined>;
97
113
  closePort(workspaceId: string, port: number): Promise<void>;
98
114
 
99
- // User messages
100
- getUserMessages(options: GitpodServer.GetUserMessagesOptions): Promise<UserMessage[]>;
101
- updateUserMessages(options: GitpodServer.UpdateUserMessagesOptions): Promise<void>;
102
-
103
115
  // User storage
104
116
  getUserStorageResource(options: GitpodServer.GetUserStorageResourceOptions): Promise<string>;
105
117
  updateUserStorageResource(options: GitpodServer.UpdateUserStorageResourceOptions): Promise<void>;
106
118
 
107
- // user env vars
119
+ // User env vars
108
120
  getEnvVars(): Promise<UserEnvVarValue[]>;
121
+ getAllEnvVars(): Promise<UserEnvVarValue[]>;
109
122
  setEnvVar(variable: UserEnvVarValue): Promise<void>;
110
123
  deleteEnvVar(variable: UserEnvVarValue): Promise<void>;
111
124
 
125
+ // Teams
126
+ getTeams(): Promise<Team[]>;
127
+ getTeamMembers(teamId: string): Promise<TeamMemberInfo[]>;
128
+ createTeam(name: string): Promise<Team>;
129
+ joinTeam(inviteId: string): Promise<Team>;
130
+ setTeamMemberRole(teamId: string, userId: string, role: TeamMemberRole): Promise<void>;
131
+ removeTeamMember(teamId: string, userId: string): Promise<void>;
132
+ getGenericInvite(teamId: string): Promise<TeamMembershipInvite>;
133
+ resetGenericInvite(inviteId: string): Promise<TeamMembershipInvite>;
134
+ deleteTeam(teamId: string, userId: string): Promise<void>;
135
+
136
+ // Admin Settings
137
+ adminGetSettings(): Promise<InstallationAdminSettings>;
138
+ adminUpdateSettings(settings: InstallationAdminSettings): Promise<void>;
139
+ adminGetTelemetryData(): Promise<TelemetryData>;
140
+
141
+ // Projects
142
+ getProviderRepositoriesForUser(params: GetProviderRepositoriesParams): Promise<ProviderRepository[]>;
143
+ createProject(params: CreateProjectParams): Promise<Project>;
144
+ deleteProject(projectId: string): Promise<void>;
145
+ getTeamProjects(teamId: string): Promise<Project[]>;
146
+ getUserProjects(): Promise<Project[]>;
147
+ getProjectOverview(projectId: string): Promise<Project.Overview | undefined>;
148
+ findPrebuilds(params: FindPrebuildsParams): Promise<PrebuildWithStatus[]>;
149
+ triggerPrebuild(projectId: string, branchName: string | null): Promise<StartPrebuildResult>;
150
+ cancelPrebuild(projectId: string, prebuildId: string): Promise<void>;
151
+ fetchProjectRepositoryConfiguration(projectId: string): Promise<string | undefined>;
152
+ guessProjectConfiguration(projectId: string): Promise<string | undefined>;
153
+ fetchRepositoryConfiguration(cloneUrl: string): Promise<string | undefined>;
154
+ guessRepositoryConfiguration(cloneUrl: string): Promise<string | undefined>;
155
+ setProjectConfiguration(projectId: string, configString: string): Promise<void>;
156
+ updateProjectPartial(partialProject: PartialProject): Promise<void>;
157
+ setProjectEnvironmentVariable(projectId: string, name: string, value: string, censored: boolean): Promise<void>;
158
+ getProjectEnvironmentVariables(projectId: string): Promise<ProjectEnvVar[]>;
159
+ deleteProjectEnvironmentVariable(variableId: string): Promise<void>;
160
+
112
161
  // content service
113
162
  getContentBlobUploadUrl(name: string): Promise<string>
114
163
  getContentBlobDownloadUrl(name: string): Promise<string>
@@ -123,10 +172,15 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
123
172
  registerGithubApp(installationId: string): Promise<void>;
124
173
 
125
174
  /**
126
- * Stores a new snapshot for the given workspace and bucketId
175
+ * Stores a new snapshot for the given workspace and bucketId. Returns _before_ the actual snapshot is done. To wait for that, use `waitForSnapshot`.
127
176
  * @return the snapshot id
128
177
  */
129
178
  takeSnapshot(options: GitpodServer.TakeSnapshotOptions): Promise<string>;
179
+ /**
180
+ *
181
+ * @param snapshotId
182
+ */
183
+ waitForSnapshot(snapshotId: string): Promise<void>;
130
184
 
131
185
  /**
132
186
  * Returns the list of snapshots that exist for a workspace.
@@ -152,20 +206,20 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
152
206
  installUserPlugins(params: InstallPluginsParams): Promise<boolean>;
153
207
  uninstallUserPlugin(params: UninstallPluginParams): Promise<boolean>;
154
208
 
209
+ guessGitTokenScopes(params: GuessGitTokenScopesParams): Promise<GuessedGitTokenScopes>;
210
+
155
211
  /**
156
212
  * gitpod.io concerns
157
213
  */
158
214
  isStudent(): Promise<boolean>;
159
- getPrivateRepoTrialEndDate(): Promise<string | undefined>;
160
-
161
215
  /**
162
- *
216
+ *
163
217
  */
164
218
  getAccountStatement(options: GitpodServer.GetAccountStatementOptions): Promise<AccountStatement | undefined>;
165
219
  getRemainingUsageHours(): Promise<number>;
166
220
 
167
221
  /**
168
- *
222
+ *
169
223
  */
170
224
  getChargebeeSiteId(): Promise<string>;
171
225
  createPortalSession(): Promise<{}>;
@@ -175,7 +229,6 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
175
229
 
176
230
  getShowPaymentUI(): Promise<boolean>;
177
231
  isChargebeeCustomer(): Promise<boolean>;
178
- mayAccessPrivateRepo(): Promise<boolean>;
179
232
 
180
233
  subscriptionUpgradeTo(subscriptionId: string, chargebeePlanId: string): Promise<void>;
181
234
  subscriptionDowngradeTo(subscriptionId: string, chargebeePlanId: string): Promise<void>;
@@ -186,13 +239,71 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
186
239
  tsGetSlots(): Promise<TeamSubscriptionSlotResolved[]>;
187
240
  tsGetUnassignedSlot(teamSubscriptionId: string): Promise<TeamSubscriptionSlot | undefined>
188
241
  tsAddSlots(teamSubscriptionId: string, quantity: number): Promise<void>;
189
- tsAssignSlot(teamSubscriptionId: string, teamSubscriptionSlotId: string, identityStr: string|undefined): Promise<void>
242
+ tsAssignSlot(teamSubscriptionId: string, teamSubscriptionSlotId: string, identityStr: string | undefined): Promise<void>
190
243
  tsReassignSlot(teamSubscriptionId: string, teamSubscriptionSlotId: string, newIdentityStr: string): Promise<void>;
191
244
  tsDeactivateSlot(teamSubscriptionId: string, teamSubscriptionSlotId: string): Promise<void>;
192
245
  tsReactivateSlot(teamSubscriptionId: string, teamSubscriptionSlotId: string): Promise<void>;
193
246
 
194
247
  getGithubUpgradeUrls(): Promise<GithubUpgradeURL[]>;
195
248
 
249
+ /**
250
+ * Analytics
251
+ */
252
+ trackEvent(event: RemoteTrackMessage): Promise<void>;
253
+ trackLocation(event: RemotePageMessage): Promise<void>;
254
+ identifyUser(event: RemoteIdentifyMessage): Promise<void>;
255
+ }
256
+
257
+ export interface RateLimiterError {
258
+ method?: string,
259
+
260
+ /**
261
+ * Retry after this many seconds, earliest.
262
+ * cmp.: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After
263
+ */
264
+ retryAfter: number,
265
+ }
266
+
267
+ export interface CreateProjectParams {
268
+ name: string;
269
+ slug?: string;
270
+ account: string;
271
+ provider: string;
272
+ cloneUrl: string;
273
+ teamId?: string;
274
+ userId?: string;
275
+ appInstallationId: string;
276
+ }
277
+ export interface FindPrebuildsParams {
278
+ projectId: string;
279
+ branch?: string;
280
+ latest?: boolean;
281
+ prebuildId?: string;
282
+ // default: 30
283
+ limit?: number;
284
+ }
285
+ export interface GetProviderRepositoriesParams {
286
+ provider: string;
287
+ hints?: { installationId: string } | object;
288
+ }
289
+ export interface ProviderRepository {
290
+ name: string;
291
+ path?: string;
292
+ account: string;
293
+ accountAvatarUrl: string;
294
+ cloneUrl: string;
295
+ updatedAt: string;
296
+ installationId?: number;
297
+ installationUpdatedAt?: string;
298
+
299
+ inUse?: { userName: string };
300
+ }
301
+
302
+ export interface ClientHeaderFields {
303
+ ip?: string;
304
+ userAgent?: string;
305
+ dnt?: string;
306
+ clientRegion?: string;
196
307
  }
197
308
 
198
309
  export const WorkspaceTimeoutValues = ["30m", "60m", "180m"] as const;
@@ -205,6 +316,7 @@ export const createServerMock = function <C extends GitpodClient, S extends Gitp
205
316
  methods.setClient = methods.setClient || (() => { });
206
317
  methods.dispose = methods.dispose || (() => { });
207
318
  return new Proxy<JsonRpcProxy<S>>(methods as any as JsonRpcProxy<S>, {
319
+ // @ts-ignore
208
320
  get: (target: S, property: keyof S) => {
209
321
  const result = target[property];
210
322
  if (!result) {
@@ -237,6 +349,8 @@ export namespace GitpodServer {
237
349
  limit?: number;
238
350
  searchString?: string;
239
351
  pinnedOnly?: boolean;
352
+ projectId?: string | string[];
353
+ includeWithoutProject?: boolean;
240
354
  }
241
355
  export interface GetAccountStatementOptions {
242
356
  date?: string;
@@ -244,6 +358,7 @@ export namespace GitpodServer {
244
358
  export interface CreateWorkspaceOptions {
245
359
  contextUrl: string;
246
360
  mode?: CreateWorkspaceMode;
361
+ forceDefaultConfig?: boolean;
247
362
  }
248
363
  export interface StartWorkspaceOptions {
249
364
  forceDefaultImage: boolean;
@@ -251,13 +366,8 @@ export namespace GitpodServer {
251
366
  export interface TakeSnapshotOptions {
252
367
  workspaceId: string;
253
368
  layoutData?: string;
254
- }
255
- export interface GetUserMessagesOptions {
256
- readonly releaseNotes?: boolean;
257
- readonly workspaceInstanceId: string;
258
- }
259
- export interface UpdateUserMessagesOptions {
260
- readonly messageIds: string[];
369
+ /* this is here to enable backwards-compatibility and untangling rollout between workspace, IDE and meta */
370
+ dontWait?: boolean;
261
371
  }
262
372
  export interface GetUserStorageResourceOptions {
263
373
  readonly uri: string;
@@ -299,10 +409,12 @@ export class GitpodCompositeClient<Client extends GitpodClient> implements Gitpo
299
409
 
300
410
  public registerClient(client: Partial<Client>): Disposable {
301
411
  this.clients.push(client);
302
- const index = this.clients.length;
303
412
  return {
304
413
  dispose: () => {
305
- this.clients.slice(index, 1);
414
+ const index = this.clients.indexOf(client);
415
+ if (index > -1) {
416
+ this.clients.splice(index, 1);
417
+ }
306
418
  }
307
419
  }
308
420
  }
@@ -319,11 +431,11 @@ export class GitpodCompositeClient<Client extends GitpodClient> implements Gitpo
319
431
  }
320
432
  }
321
433
 
322
- onWorkspaceImageBuildLogs(info: WorkspaceImageBuild.StateInfo, content: WorkspaceImageBuild.LogContent | undefined): void {
434
+ onPrebuildUpdate(update: PrebuildWithStatus): void {
323
435
  for (const client of this.clients) {
324
- if (client.onWorkspaceImageBuildLogs) {
436
+ if (client.onPrebuildUpdate) {
325
437
  try {
326
- client.onWorkspaceImageBuildLogs(info, content);
438
+ client.onPrebuildUpdate(update);
327
439
  } catch (error) {
328
440
  console.error(error)
329
441
  }
@@ -331,11 +443,11 @@ export class GitpodCompositeClient<Client extends GitpodClient> implements Gitpo
331
443
  }
332
444
  }
333
445
 
334
- onHeadlessWorkspaceLogs(evt: HeadlessLogEvent): void {
446
+ onWorkspaceImageBuildLogs(info: WorkspaceImageBuild.StateInfo, content: WorkspaceImageBuild.LogContent | undefined): void {
335
447
  for (const client of this.clients) {
336
- if (client.onHeadlessWorkspaceLogs) {
448
+ if (client.onWorkspaceImageBuildLogs) {
337
449
  try {
338
- client.onHeadlessWorkspaceLogs(evt);
450
+ client.onWorkspaceImageBuildLogs(info, content);
339
451
  } catch (error) {
340
452
  console.error(error)
341
453
  }
@@ -399,7 +511,7 @@ export class WorkspaceInstanceUpdateListener {
399
511
  private readonly onDidChangeEmitter = new Emitter<void>();
400
512
  readonly onDidChange = this.onDidChangeEmitter.event;
401
513
 
402
- private source: 'sync' | 'update' = 'sync';
514
+ private source: 'sync' | 'update' = 'sync';
403
515
 
404
516
  get info(): WorkspaceInfo {
405
517
  return this._info;
@@ -491,11 +603,15 @@ export class WorkspaceInstanceUpdateListener {
491
603
 
492
604
  }
493
605
 
606
+ export interface GitpodServiceOptions {
607
+ onReconnect?: () => (void | Promise<void>)
608
+ }
609
+
494
610
  export class GitpodServiceImpl<Client extends GitpodClient, Server extends GitpodServer> {
495
611
 
496
612
  private readonly compositeClient = new GitpodCompositeClient<Client>();
497
613
 
498
- constructor(public readonly server: JsonRpcProxy<Server>) {
614
+ constructor(public readonly server: JsonRpcProxy<Server>, private options?: GitpodServiceOptions) {
499
615
  server.setClient(this.compositeClient);
500
616
  server.onDidOpenConnection(() => this.compositeClient.notifyDidOpenConnection());
501
617
  server.onDidCloseConnection(() => this.compositeClient.notifyDidCloseConnection());
@@ -515,13 +631,34 @@ export class GitpodServiceImpl<Client extends GitpodClient, Server extends Gitpo
515
631
  this.instanceListeners.set(workspaceId, listener);
516
632
  return listener;
517
633
  }
634
+
635
+ async reconnect(): Promise<void> {
636
+ if (this.options?.onReconnect) {
637
+ await this.options.onReconnect();
638
+ }
639
+ }
518
640
  }
519
641
 
520
- export function createGitpodService<C extends GitpodClient, S extends GitpodServer>(serverUrl: string) {
521
- const url = new GitpodHostUrl(serverUrl)
522
- .asWebsocket()
523
- .withApi({ pathname: GitpodServerPath });
642
+ export function createGitpodService<C extends GitpodClient, S extends GitpodServer>(serverUrl: string | Promise<string>) {
643
+ const toWsUrl = (serverUrl: string) => {
644
+ return new GitpodHostUrl(serverUrl)
645
+ .asWebsocket()
646
+ .withApi({ pathname: GitpodServerPath })
647
+ .toString();
648
+ };
649
+ let url: string | Promise<string>;
650
+ if (typeof serverUrl === "string") {
651
+ url = toWsUrl(serverUrl);
652
+ } else {
653
+ url = serverUrl.then(url => toWsUrl(url));
654
+ }
655
+
524
656
  const connectionProvider = new WebSocketConnectionProvider();
525
- const gitpodServer = connectionProvider.createProxy<S>(url.toString());
526
- return new GitpodServiceImpl<C, S>(gitpodServer);
657
+ let onReconnect = () => { };
658
+ const gitpodServer = connectionProvider.createProxy<S>(url, undefined, {
659
+ onListening: socket => {
660
+ onReconnect = () => socket.reconnect();
661
+ }
662
+ });
663
+ return new GitpodServiceImpl<C, S>(gitpodServer, { onReconnect });
527
664
  }
@@ -22,21 +22,17 @@ export namespace HeadlessWorkspaceEventType {
22
22
  }
23
23
  }
24
24
 
25
- export interface HeadlessLogEvent {
25
+ export interface HeadlessWorkspaceEvent {
26
26
  workspaceID: string;
27
27
  text: string;
28
28
  type: HeadlessWorkspaceEventType;
29
29
  }
30
30
 
31
- export enum TheiaHeadlessLogType {
32
- TaskLogLabel = "workspaceTaskOutput",
33
- TaskFailedLabel = "workspaceTaskFailed",
34
- TaskSuccessfulLabel = "workspaceTaskDone"
31
+ export interface HeadlessLogUrls {
32
+ // A map of id to URL
33
+ streams: { [streamID: string]: string };
35
34
  }
36
35
 
37
- export interface TheiaHeadlessLogMessage {
38
- type: TheiaHeadlessLogType;
39
- data?: string;
40
- error?: string;
41
- snapshotURL?: string;
42
- }
36
+ /** cmp. @const HEADLESS_LOG_STREAM_STATUS_CODE_REGEX */
37
+ export const HEADLESS_LOG_STREAM_STATUS_CODE = "X-LogStream-StatusCode";
38
+ export const HEADLESS_LOG_STREAM_STATUS_CODE_REGEX = /X-LogStream-StatusCode: ([0-9]{3})/;
@@ -7,7 +7,7 @@
7
7
  import { Event } from "./util/event";
8
8
  import { Disposable } from "./util/disposable";
9
9
 
10
- export type IDEFrontendState = 'init' | 'ready' | 'terminated';
10
+ export type IDEFrontendState = 'init' | 'ready' | 'terminated';
11
11
 
12
12
  export interface IDEFrontendService {
13
13
  readonly state: IDEFrontendState;