@gitpod/gitpod-protocol 0.1.5-se-prebuilds-failed.3 → 0.1.5-se-playground.14

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 (293) hide show
  1. package/data/gitpod-schema.json +181 -4
  2. package/lib/accounting-protocol.d.ts +17 -10
  3. package/lib/accounting-protocol.d.ts.map +1 -1
  4. package/lib/accounting-protocol.js +30 -32
  5. package/lib/accounting-protocol.js.map +1 -1
  6. package/lib/admin-protocol.d.ts.map +1 -1
  7. package/lib/admin-protocol.js.map +1 -1
  8. package/lib/analytics.d.ts.map +1 -1
  9. package/lib/analytics.js.map +1 -1
  10. package/lib/auth.d.ts.map +1 -1
  11. package/lib/context-url.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.d.ts.map +1 -1
  15. package/lib/context-url.spec.js +20 -5
  16. package/lib/context-url.spec.js.map +1 -1
  17. package/lib/email-protocol.d.ts +1 -1
  18. package/lib/email-protocol.d.ts.map +1 -1
  19. package/lib/email-protocol.js.map +1 -1
  20. package/lib/encryption/container-module.d.ts.map +1 -1
  21. package/lib/encryption/container-module.js +1 -1
  22. package/lib/encryption/container-module.js.map +1 -1
  23. package/lib/encryption/encryption-engine.d.ts.map +1 -1
  24. package/lib/encryption/encryption-engine.js +7 -7
  25. package/lib/encryption/encryption-engine.js.map +1 -1
  26. package/lib/encryption/encryption-engine.spec.d.ts.map +1 -1
  27. package/lib/encryption/encryption-engine.spec.js +2 -3
  28. package/lib/encryption/encryption-engine.spec.js.map +1 -1
  29. package/lib/encryption/encryption-service.d.ts.map +1 -1
  30. package/lib/encryption/encryption-service.js +1 -1
  31. package/lib/encryption/encryption-service.js.map +1 -1
  32. package/lib/encryption/key-provider.d.ts.map +1 -1
  33. package/lib/encryption/key-provider.js +7 -9
  34. package/lib/encryption/key-provider.js.map +1 -1
  35. package/lib/env.d.ts +0 -5
  36. package/lib/env.d.ts.map +1 -1
  37. package/lib/env.js +1 -20
  38. package/lib/env.js.map +1 -1
  39. package/lib/experiments/always-default.d.ts +8 -0
  40. package/lib/experiments/always-default.d.ts.map +1 -0
  41. package/lib/experiments/always-default.js +20 -0
  42. package/lib/experiments/always-default.js.map +1 -0
  43. package/lib/experiments/configcat-server.d.ts +8 -0
  44. package/lib/experiments/configcat-server.d.ts.map +1 -0
  45. package/lib/experiments/configcat-server.js +34 -0
  46. package/lib/experiments/configcat-server.js.map +1 -0
  47. package/lib/experiments/configcat.d.ts +21 -0
  48. package/lib/experiments/configcat.d.ts.map +1 -0
  49. package/lib/experiments/configcat.js +47 -0
  50. package/lib/experiments/configcat.js.map +1 -0
  51. package/lib/experiments/types.d.ts +19 -0
  52. package/lib/experiments/types.d.ts.map +1 -0
  53. package/lib/{theia-plugins.js → experiments/types.js} +2 -2
  54. package/lib/experiments/types.js.map +1 -0
  55. package/lib/gitpod-file-parser.d.ts.map +1 -1
  56. package/lib/gitpod-file-parser.js +6 -6
  57. package/lib/gitpod-file-parser.js.map +1 -1
  58. package/lib/gitpod-file-parser.spec.js +42 -39
  59. package/lib/gitpod-file-parser.spec.js.map +1 -1
  60. package/lib/gitpod-service.d.ts +33 -26
  61. package/lib/gitpod-service.d.ts.map +1 -1
  62. package/lib/gitpod-service.js +39 -32
  63. package/lib/gitpod-service.js.map +1 -1
  64. package/lib/headless-workspace-log.d.ts.map +1 -1
  65. package/lib/headless-workspace-log.js +1 -1
  66. package/lib/headless-workspace-log.js.map +1 -1
  67. package/lib/ide-frontend-service.d.ts +1 -1
  68. package/lib/ide-protocol.d.ts +6 -6
  69. package/lib/ide-protocol.d.ts.map +1 -1
  70. package/lib/index.d.ts +16 -16
  71. package/lib/installation-admin-protocol.d.ts +3 -0
  72. package/lib/installation-admin-protocol.d.ts.map +1 -1
  73. package/lib/installation-admin-protocol.js +3 -2
  74. package/lib/installation-admin-protocol.js.map +1 -1
  75. package/lib/license-protocol.d.ts +7 -0
  76. package/lib/license-protocol.d.ts.map +1 -1
  77. package/lib/license-protocol.js.map +1 -1
  78. package/lib/messaging/browser/connection.d.ts +1 -1
  79. package/lib/messaging/browser/connection.d.ts.map +1 -1
  80. package/lib/messaging/browser/connection.js +19 -19
  81. package/lib/messaging/browser/connection.js.map +1 -1
  82. package/lib/messaging/browser/window-connection.d.ts +4 -4
  83. package/lib/messaging/browser/window-connection.d.ts.map +1 -1
  84. package/lib/messaging/browser/window-connection.js +9 -6
  85. package/lib/messaging/browser/window-connection.js.map +1 -1
  86. package/lib/messaging/client-call-metrics.d.ts +2 -2
  87. package/lib/messaging/client-call-metrics.d.ts.map +1 -1
  88. package/lib/messaging/client-call-metrics.js +20 -20
  89. package/lib/messaging/client-call-metrics.js.map +1 -1
  90. package/lib/messaging/error.d.ts +2 -0
  91. package/lib/messaging/error.d.ts.map +1 -1
  92. package/lib/messaging/error.js +4 -0
  93. package/lib/messaging/error.js.map +1 -1
  94. package/lib/messaging/handler.d.ts.map +1 -1
  95. package/lib/messaging/handler.js +1 -1
  96. package/lib/messaging/node/connection.js +8 -8
  97. package/lib/messaging/node/connection.js.map +1 -1
  98. package/lib/messaging/proxy-factory.d.ts +1 -1
  99. package/lib/messaging/proxy-factory.d.ts.map +1 -1
  100. package/lib/messaging/proxy-factory.js +7 -9
  101. package/lib/messaging/proxy-factory.js.map +1 -1
  102. package/lib/payment-protocol.d.ts.map +1 -1
  103. package/lib/payment-protocol.js +1 -1
  104. package/lib/payment-protocol.js.map +1 -1
  105. package/lib/permission.d.ts +2 -2
  106. package/lib/permission.d.ts.map +1 -1
  107. package/lib/permission.js +12 -23
  108. package/lib/permission.js.map +1 -1
  109. package/lib/plans.d.ts +3 -3
  110. package/lib/plans.d.ts.map +1 -1
  111. package/lib/plans.js +206 -171
  112. package/lib/plans.js.map +1 -1
  113. package/lib/protocol.d.ts +83 -35
  114. package/lib/protocol.d.ts.map +1 -1
  115. package/lib/protocol.js +165 -87
  116. package/lib/protocol.js.map +1 -1
  117. package/lib/snapshot-url.spec.js.map +1 -1
  118. package/lib/team-subscription-protocol.d.ts +21 -3
  119. package/lib/team-subscription-protocol.d.ts.map +1 -1
  120. package/lib/team-subscription-protocol.js +16 -5
  121. package/lib/team-subscription-protocol.js.map +1 -1
  122. package/lib/teams-projects-protocol.d.ts +9 -3
  123. package/lib/teams-projects-protocol.d.ts.map +1 -1
  124. package/lib/teams-projects-protocol.js +1 -1
  125. package/lib/teams-projects-protocol.js.map +1 -1
  126. package/lib/typings/globals.d.ts +2 -2
  127. package/lib/typings/globals.d.ts.map +1 -1
  128. package/lib/util/analytics.d.ts.map +1 -1
  129. package/lib/util/analytics.js +6 -6
  130. package/lib/util/analytics.js.map +1 -1
  131. package/lib/util/async-iterator.d.ts.map +1 -1
  132. package/lib/util/async-iterator.js +3 -3
  133. package/lib/util/async-iterator.js.map +1 -1
  134. package/lib/util/cancelable.js.map +1 -1
  135. package/lib/util/date-time.js +6 -6
  136. package/lib/util/date-time.js.map +1 -1
  137. package/lib/util/debug-app.d.ts +25 -0
  138. package/lib/util/debug-app.d.ts.map +1 -0
  139. package/lib/util/debug-app.js +100 -0
  140. package/lib/util/debug-app.js.map +1 -0
  141. package/lib/util/deferred.js.map +1 -1
  142. package/lib/util/disposable.d.ts.map +1 -1
  143. package/lib/util/disposable.js +2 -2
  144. package/lib/util/disposable.js.map +1 -1
  145. package/lib/util/event.d.ts.map +1 -1
  146. package/lib/util/event.js +5 -3
  147. package/lib/util/event.js.map +1 -1
  148. package/lib/util/garbage-collected-cache.d.ts.map +1 -1
  149. package/lib/util/garbage-collected-cache.js +1 -1
  150. package/lib/util/garbage-collected-cache.js.map +1 -1
  151. package/lib/util/generate-workspace-id.d.ts +5 -0
  152. package/lib/util/generate-workspace-id.d.ts.map +1 -1
  153. package/lib/util/generate-workspace-id.js +446 -442
  154. package/lib/util/generate-workspace-id.js.map +1 -1
  155. package/lib/util/generate-workspace-id.spec.js +18 -7
  156. package/lib/util/generate-workspace-id.spec.js.map +1 -1
  157. package/lib/util/gitpod-cookie.d.ts +1 -1
  158. package/lib/util/gitpod-cookie.d.ts.map +1 -1
  159. package/lib/util/gitpod-cookie.js +0 -3
  160. package/lib/util/gitpod-cookie.js.map +1 -1
  161. package/lib/util/gitpod-host-url.d.ts.map +1 -1
  162. package/lib/util/gitpod-host-url.js +31 -29
  163. package/lib/util/gitpod-host-url.js.map +1 -1
  164. package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
  165. package/lib/util/gitpod-host-url.spec.js +15 -5
  166. package/lib/util/gitpod-host-url.spec.js.map +1 -1
  167. package/lib/util/grpc.d.ts.map +1 -1
  168. package/lib/util/grpc.js.map +1 -1
  169. package/lib/util/jaeger-client-types.d.ts.map +1 -1
  170. package/lib/util/logging.d.ts +1 -1
  171. package/lib/util/logging.d.ts.map +1 -1
  172. package/lib/util/logging.js +31 -25
  173. package/lib/util/logging.js.map +1 -1
  174. package/lib/util/make-link.js +5 -5
  175. package/lib/util/make-link.js.map +1 -1
  176. package/lib/util/parse-workspace-id.d.ts.map +1 -1
  177. package/lib/util/parse-workspace-id.js +1 -2
  178. package/lib/util/parse-workspace-id.js.map +1 -1
  179. package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
  180. package/lib/util/parse-workspace-id.spec.js.map +1 -1
  181. package/lib/util/queue.spec.js +9 -6
  182. package/lib/util/queue.spec.js.map +1 -1
  183. package/lib/util/semaphore.d.ts.map +1 -1
  184. package/lib/util/semaphore.js.map +1 -1
  185. package/lib/util/skip-if.d.ts.map +1 -1
  186. package/lib/util/skip-if.js.map +1 -1
  187. package/lib/util/timeutil.d.ts +1 -0
  188. package/lib/util/timeutil.d.ts.map +1 -1
  189. package/lib/util/timeutil.js +9 -3
  190. package/lib/util/timeutil.js.map +1 -1
  191. package/lib/util/timeutil.spec.d.ts.map +1 -1
  192. package/lib/util/timeutil.spec.js.map +1 -1
  193. package/lib/util/tracing.d.ts +6 -6
  194. package/lib/util/tracing.d.ts.map +1 -1
  195. package/lib/util/tracing.js +14 -16
  196. package/lib/util/tracing.js.map +1 -1
  197. package/lib/util/tracing.spec.js +3 -3
  198. package/lib/util/tracing.spec.js.map +1 -1
  199. package/lib/util/workspace-port-authentication.d.ts +7 -7
  200. package/lib/util/workspace-port-authentication.d.ts.map +1 -1
  201. package/lib/util/workspace-port-authentication.js +8 -11
  202. package/lib/util/workspace-port-authentication.js.map +1 -1
  203. package/lib/workspace-cluster.d.ts +1 -1
  204. package/lib/workspace-cluster.d.ts.map +1 -1
  205. package/lib/workspace-cluster.js +2 -4
  206. package/lib/workspace-cluster.js.map +1 -1
  207. package/lib/workspace-instance.d.ts +18 -3
  208. package/lib/workspace-instance.d.ts.map +1 -1
  209. package/lib/wsready.d.ts +1 -1
  210. package/lib/wsready.d.ts.map +1 -1
  211. package/lib/wsready.js +2 -2
  212. package/package.json +9 -6
  213. package/pkg-yarn.lock +7 -5
  214. package/provenance-bundle.jsonl +1 -1
  215. package/src/accounting-protocol.ts +63 -51
  216. package/src/admin-protocol.ts +22 -20
  217. package/src/analytics.ts +21 -21
  218. package/src/auth.ts +2 -2
  219. package/src/context-url.spec.ts +25 -11
  220. package/src/context-url.ts +80 -78
  221. package/src/email-protocol.ts +5 -6
  222. package/src/encryption/container-module.ts +2 -3
  223. package/src/encryption/encryption-engine.spec.ts +9 -8
  224. package/src/encryption/encryption-engine.ts +14 -14
  225. package/src/encryption/encryption-service.ts +4 -5
  226. package/src/encryption/key-provider.ts +16 -19
  227. package/src/env.ts +0 -22
  228. package/src/experiments/always-default.ts +24 -0
  229. package/src/experiments/configcat-server.ts +37 -0
  230. package/src/experiments/configcat.ts +53 -0
  231. package/src/experiments/types.ts +32 -0
  232. package/src/gitpod-file-parser.spec.ts +55 -61
  233. package/src/gitpod-file-parser.ts +16 -17
  234. package/src/gitpod-service.ts +153 -110
  235. package/src/headless-workspace-log.ts +5 -4
  236. package/src/ide-frontend-service.ts +2 -2
  237. package/src/ide-protocol.ts +8 -8
  238. package/src/index.ts +16 -16
  239. package/src/installation-admin-protocol.ts +11 -8
  240. package/src/license-protocol.ts +12 -6
  241. package/src/messaging/browser/connection.ts +45 -47
  242. package/src/messaging/browser/window-connection.ts +39 -29
  243. package/src/messaging/client-call-metrics.ts +70 -71
  244. package/src/messaging/error.ts +7 -3
  245. package/src/messaging/handler.ts +6 -6
  246. package/src/messaging/node/connection.ts +8 -8
  247. package/src/messaging/proxy-factory.ts +23 -30
  248. package/src/oss-allowlist.ts +3 -3
  249. package/src/payment-protocol.ts +2 -2
  250. package/src/permission.ts +20 -31
  251. package/src/plans.ts +236 -189
  252. package/src/protocol.ts +343 -237
  253. package/src/snapshot-url.spec.ts +9 -7
  254. package/src/team-subscription-protocol.ts +57 -23
  255. package/src/teams-projects-protocol.ts +15 -8
  256. package/src/typings/globals.ts +4 -4
  257. package/src/util/analytics.ts +46 -42
  258. package/src/util/async-iterator.ts +4 -5
  259. package/src/util/cancelable.ts +3 -3
  260. package/src/util/date-time.ts +8 -8
  261. package/src/util/debug-app.ts +81 -0
  262. package/src/util/deferred.ts +6 -6
  263. package/src/util/disposable.ts +3 -6
  264. package/src/util/event.ts +9 -11
  265. package/src/util/garbage-collected-cache.ts +3 -6
  266. package/src/util/generate-workspace-id.spec.ts +26 -16
  267. package/src/util/generate-workspace-id.ts +460 -454
  268. package/src/util/gitpod-cookie.ts +8 -9
  269. package/src/util/gitpod-host-url.spec.ts +40 -13
  270. package/src/util/gitpod-host-url.ts +37 -34
  271. package/src/util/grpc.ts +1 -1
  272. package/src/util/jaeger-client-types.ts +2 -2
  273. package/src/util/logging.ts +60 -42
  274. package/src/util/make-link.ts +6 -7
  275. package/src/util/parse-workspace-id.spec.ts +17 -8
  276. package/src/util/parse-workspace-id.ts +5 -6
  277. package/src/util/queue.spec.ts +27 -25
  278. package/src/util/repeat.ts +1 -1
  279. package/src/util/semaphore.ts +4 -6
  280. package/src/util/skip-if.ts +9 -6
  281. package/src/util/timeutil.spec.ts +14 -15
  282. package/src/util/timeutil.ts +21 -11
  283. package/src/util/tracing.spec.ts +28 -23
  284. package/src/util/tracing.ts +54 -51
  285. package/src/util/workspace-port-authentication.ts +10 -13
  286. package/src/workspace-cluster.ts +15 -12
  287. package/src/workspace-instance.ts +52 -24
  288. package/src/wsready.ts +3 -3
  289. package/data/builtin-theia-plugins.json +0 -372
  290. package/lib/theia-plugins.d.ts +0 -11
  291. package/lib/theia-plugins.d.ts.map +0 -1
  292. package/lib/theia-plugins.js.map +0 -1
  293. package/src/theia-plugins.ts +0 -11
@@ -4,10 +4,9 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- import { v4 as uuidv4 } from 'uuid';
7
+ import { v4 as uuidv4 } from "uuid";
8
8
 
9
- export type EMailState = "scheduledInternal"
10
- | "scheduledSendgrid";
9
+ export type EMailState = "scheduledInternal" | "scheduledSendgrid";
11
10
 
12
11
  export interface EMailStatus {
13
12
  /** The time the email entry was inserted into the DB */
@@ -58,9 +57,9 @@ export type EMail = {
58
57
  } & EMailStatus;
59
58
 
60
59
  export namespace EMail {
61
- export const create = (ts: Omit<EMail, 'uid'>): EMail => {
60
+ export const create = (ts: Omit<EMail, "uid">): EMail => {
62
61
  const withId = ts as EMail;
63
62
  withId.uid = uuidv4();
64
63
  return withId;
65
- }
66
- }
64
+ };
65
+ }
@@ -19,10 +19,9 @@ import { EncryptionService, EncryptionServiceImpl } from "./encryption-service";
19
19
  * };
20
20
  * }).inSingletonScope();
21
21
  */
22
- export const encryptionModule: interfaces.ContainerModuleCallBack = bind => {
23
-
22
+ export const encryptionModule: interfaces.ContainerModuleCallBack = (bind) => {
24
23
  bind(KeyProvider).to(KeyProviderImpl).inSingletonScope();
25
24
 
26
25
  bind(EncryptionEngine).to(EncryptionEngineImpl).inSingletonScope();
27
26
  bind(EncryptionService).to(EncryptionServiceImpl).inSingletonScope();
28
- };
27
+ };
@@ -5,25 +5,26 @@
5
5
  */
6
6
 
7
7
  import { suite, test } from "mocha-typescript";
8
- import * as chai from 'chai';
9
- import * as path from 'path';
8
+ import * as chai from "chai";
9
+ import * as path from "path";
10
10
  import * as fs from "fs";
11
11
 
12
12
  import { EncryptionEngineImpl } from "./encryption-engine";
13
13
 
14
14
  const expect = chai.expect;
15
15
 
16
- @suite class TestEncryptionEngineImpl {
16
+ @suite
17
+ class TestEncryptionEngineImpl {
17
18
  // Created with openssl rand -rand /dev/urandom -out key -base64 32
18
- protected get testkey () {
19
- const keyFilePath = path.resolve(__dirname, '../../test/fixtures/encryption/testkey');
19
+ protected get testkey() {
20
+ const keyFilePath = path.resolve(__dirname, "../../test/fixtures/encryption/testkey");
20
21
  const keyBuffer = fs.readFileSync(keyFilePath);
21
22
  return keyBuffer.toString().trim();
22
- };
23
+ }
23
24
 
24
25
  @test basicSymmetry() {
25
26
  const plaintext = "12345678901234567890";
26
- const key = new Buffer(this.testkey, 'base64');
27
+ const key = new Buffer(this.testkey, "base64");
27
28
 
28
29
  const cut = new EncryptionEngineImpl();
29
30
  const encryptedData = cut.encrypt(plaintext, key);
@@ -33,4 +34,4 @@ const expect = chai.expect;
33
34
  expect(decryptedPlaintext).equals(plaintext);
34
35
  }
35
36
  }
36
- export const t = new TestEncryptionEngineImpl();
37
+ export const t = new TestEncryptionEngineImpl();
@@ -4,20 +4,20 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- import * as crypto from 'crypto';
8
- import { injectable } from 'inversify';
7
+ import * as crypto from "crypto";
8
+ import { injectable } from "inversify";
9
9
 
10
10
  export interface KeyParams {
11
- iv: string
11
+ iv: string;
12
12
  }
13
13
 
14
14
  export interface EncryptedData {
15
15
  /** utf8 encoded string */
16
- data: string,
17
- keyParams: KeyParams
16
+ data: string;
17
+ keyParams: KeyParams;
18
18
  }
19
19
 
20
- export const EncryptionEngine = Symbol('EncryptionEngine');
20
+ export const EncryptionEngine = Symbol("EncryptionEngine");
21
21
  export interface EncryptionEngine {
22
22
  /**
23
23
  * @param data utf8 encoded string
@@ -32,21 +32,21 @@ export interface EncryptionEngine {
32
32
  * - no salt, as we pass in a real key (no salting needed to turn a password into a key)
33
33
  * The implementation closely follows the exampes in https://nodejs.org/api/crypto.html.
34
34
  */
35
- @injectable()
35
+ @injectable()
36
36
  export class EncryptionEngineImpl {
37
- readonly algorithm = 'aes-256-cbc';
38
- readonly enc = 'base64';
37
+ readonly algorithm = "aes-256-cbc";
38
+ readonly enc = "base64";
39
39
 
40
40
  encrypt(data: string, key: Buffer): EncryptedData {
41
41
  const iv = crypto.randomBytes(16);
42
42
  const cipher = crypto.createCipheriv(this.algorithm, key, iv);
43
- const encrypted = cipher.update(new Buffer(data, 'utf8'));
43
+ const encrypted = cipher.update(new Buffer(data, "utf8"));
44
44
  const finalEncrypted = Buffer.concat([encrypted, cipher.final()]);
45
45
  return {
46
46
  data: finalEncrypted.toString(this.enc),
47
47
  keyParams: {
48
- iv: iv.toString(this.enc)
49
- }
48
+ iv: iv.toString(this.enc),
49
+ },
50
50
  };
51
51
  }
52
52
 
@@ -54,6 +54,6 @@ export class EncryptionEngineImpl {
54
54
  const decipher = crypto.createDecipheriv(this.algorithm, key, new Buffer(encryptedData.keyParams.iv, this.enc));
55
55
  let decrypted = decipher.update(new Buffer(encryptedData.data, this.enc));
56
56
  const finalDecrypted = Buffer.concat([decrypted, decipher.final()]);
57
- return finalDecrypted.toString('utf8');
57
+ return finalDecrypted.toString("utf8");
58
58
  }
59
- }
59
+ }
@@ -9,12 +9,11 @@ import { injectable, inject } from "inversify";
9
9
  import { EncryptedData, EncryptionEngine } from "./encryption-engine";
10
10
  import { KeyProvider, KeyMetadata } from "./key-provider";
11
11
 
12
-
13
12
  export interface Encrypted<_T> extends EncryptedData {
14
- keyMetadata: KeyMetadata
13
+ keyMetadata: KeyMetadata;
15
14
  }
16
15
 
17
- export const EncryptionService = Symbol('EncryptionService');
16
+ export const EncryptionService = Symbol("EncryptionService");
18
17
  export interface EncryptionService {
19
18
  encrypt<T>(data: T): Encrypted<T>;
20
19
  decrypt<T>(encrypted: Encrypted<T>): T;
@@ -32,7 +31,7 @@ export class EncryptionServiceImpl implements EncryptionService {
32
31
  const encryptedData = this.engine.encrypt(dataStr, key.material);
33
32
  return {
34
33
  ...encryptedData,
35
- keyMetadata: key.metadata
34
+ keyMetadata: key.metadata,
36
35
  };
37
36
  }
38
37
 
@@ -49,4 +48,4 @@ export class EncryptionServiceImpl implements EncryptionService {
49
48
  protected deserialize<T>(data: string): T {
50
49
  return JSON.parse(data) as T;
51
50
  }
52
- }
51
+ }
@@ -7,16 +7,16 @@
7
7
  import { injectable, inject } from "inversify";
8
8
 
9
9
  export interface KeyMetadata {
10
- name: string,
11
- version: number
10
+ name: string;
11
+ version: number;
12
12
  }
13
13
 
14
14
  export interface Key {
15
- metadata: KeyMetadata,
16
- material: Buffer
15
+ metadata: KeyMetadata;
16
+ material: Buffer;
17
17
  }
18
18
 
19
- export const KeyProvider = Symbol('KeyProvider');
19
+ export const KeyProvider = Symbol("KeyProvider");
20
20
  export interface KeyProvider {
21
21
  getPrimaryKey(): Key;
22
22
  getKeyFor(metadata: KeyMetadata): Key;
@@ -24,24 +24,21 @@ export interface KeyProvider {
24
24
 
25
25
  export type KeyConfig = KeyMetadata & {
26
26
  /** base64 encoded */
27
- material: string,
28
- primary?: boolean
29
- }
27
+ material: string;
28
+ primary?: boolean;
29
+ };
30
30
 
31
- export const KeyProviderConfig = Symbol('KeyProviderConfig');
31
+ export const KeyProviderConfig = Symbol("KeyProviderConfig");
32
32
  export interface KeyProviderConfig {
33
- keys: KeyConfig[]
33
+ keys: KeyConfig[];
34
34
  }
35
35
 
36
36
  @injectable()
37
37
  export class KeyProviderImpl implements KeyProvider {
38
-
39
38
  static loadKeyConfigFromJsonString(configStr: string): KeyConfig[] {
40
39
  const keys = (JSON.parse(configStr) || []) as KeyConfig[];
41
- if (!Array.isArray(keys)
42
- || keys.length < 0
43
- || 1 !== keys.reduce((p, k) => k.primary ? p + 1 : p, 0)) {
44
- throw new Error('Invalid key config!');
40
+ if (!Array.isArray(keys) || keys.length < 0 || 1 !== keys.reduce((p, k) => (k.primary ? p + 1 : p), 0)) {
41
+ throw new Error("Invalid key config!");
45
42
  }
46
43
  return keys;
47
44
  }
@@ -49,13 +46,13 @@ export class KeyProviderImpl implements KeyProvider {
49
46
  constructor(@inject(KeyProviderConfig) protected readonly config: KeyProviderConfig) {}
50
47
 
51
48
  protected get keys() {
52
- return this.config.keys
49
+ return this.config.keys;
53
50
  }
54
51
 
55
52
  getPrimaryKey(): Key {
56
53
  const primaryKey = this.keys.find((key) => !!key.primary);
57
54
  if (!primaryKey) {
58
- throw new Error('No primary encryption key found!');
55
+ throw new Error("No primary encryption key found!");
59
56
  }
60
57
  return this.configToKey(primaryKey);
61
58
  }
@@ -72,9 +69,9 @@ export class KeyProviderImpl implements KeyProvider {
72
69
  return {
73
70
  metadata: {
74
71
  name: config.name,
75
- version: config.version
72
+ version: config.version,
76
73
  },
77
- material: new Buffer(config.material, 'base64')
74
+ material: new Buffer(config.material, "base64"),
78
75
  };
79
76
  }
80
77
  }
package/src/env.ts CHANGED
@@ -6,32 +6,10 @@
6
6
 
7
7
  import { injectable } from "inversify";
8
8
 
9
- const legacyStagenameTranslation: { [key: string]: KubeStage } = {
10
- "production": "production",
11
- "staging": "prodcopy",
12
- "devstaging": "dev",
13
- "dev": "dev"
14
- }
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
-
25
9
  @injectable()
26
10
  export abstract class AbstractComponentEnv {
27
- readonly kubeStage: KubeStage = getEnvVarParsed('KUBE_STAGE', translateLegacyStagename);
28
-
29
- readonly installationLongname: string = getEnvVar("GITPOD_INSTALLATION_LONGNAME")
30
- readonly installationShortname: string = getEnvVar("GITPOD_INSTALLATION_SHORTNAME")
31
11
  }
32
12
 
33
- export type KubeStage = 'production' | 'prodcopy' | 'staging' | 'dev';
34
-
35
13
  export function getEnvVar(name: string, defaultValue?: string): string {
36
14
  const value = process.env[name] || defaultValue;
37
15
  if (!value) {
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Copyright (c) 2022 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 { Attributes, Client } from "./types";
7
+
8
+ // AlwaysReturningDefaultValueClient is an implemention of an experiments.Client which performs no lookup/network operation
9
+ // and always returns the default value for a given experimentName.
10
+ // This client is used for non-SaaS version of Gitpod, in particular for self-hosted installations where external
11
+ // network connections are not desirable or even possible.
12
+ class AlwaysReturningDefaultValueClient implements Client {
13
+ getValueAsync<T>(experimentName: string, defaultValue: T, attributes: Attributes): Promise<T> {
14
+ return Promise.resolve(defaultValue);
15
+ }
16
+
17
+ dispose(): void {
18
+ // there is nothing to dispose, no-op.
19
+ }
20
+ }
21
+
22
+ export function newAlwaysReturningDefaultValueClient(): Client {
23
+ return new AlwaysReturningDefaultValueClient();
24
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Copyright (c) 2022 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 { Client } from "./types";
8
+ import * as configcat from "configcat-node";
9
+ import { LogLevel } from "configcat-common";
10
+ import { ConfigCatClient } from "./configcat";
11
+ import { newAlwaysReturningDefaultValueClient } from "./always-default";
12
+
13
+ let client: Client | undefined;
14
+
15
+ export function getExperimentsClientForBackend(): Client {
16
+ // We have already instantiated a client, we can just re-use it.
17
+ if (client !== undefined) {
18
+ return client;
19
+ }
20
+
21
+ // Retrieve SDK key from ENV Variable
22
+ const sdkKey = process.env.CONFIGCAT_SDK_KEY;
23
+
24
+ // Self-hosted installations do not set the ConfigCat SDK key, so always use a client which returns the default value.
25
+ if (sdkKey === undefined || sdkKey === "") {
26
+ client = newAlwaysReturningDefaultValueClient();
27
+ return client;
28
+ }
29
+
30
+ const configCatClient = configcat.createClient(sdkKey, {
31
+ logger: configcat.createConsoleLogger(LogLevel.Error),
32
+ maxInitWaitTimeSeconds: 0,
33
+ });
34
+
35
+ client = new ConfigCatClient(configCatClient);
36
+ return client;
37
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Copyright (c) 2022 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 { Attributes, Client } from "./types";
8
+ import { User } from "configcat-common/lib/RolloutEvaluator";
9
+ import { IConfigCatClient } from "configcat-common/lib/ConfigCatClient";
10
+
11
+ export const PROJECT_ID_ATTRIBUTE = "project_id";
12
+ export const TEAM_ID_ATTRIBUTE = "team_id";
13
+ export const TEAM_IDS_ATTRIBUTE = "team_ids";
14
+ export const TEAM_NAME_ATTRIBUTE = "team_name";
15
+ export const TEAM_NAMES_ATTRIBUTE = "team_names";
16
+
17
+ export class ConfigCatClient implements Client {
18
+ private client: IConfigCatClient;
19
+
20
+ constructor(cc: IConfigCatClient) {
21
+ this.client = cc;
22
+ }
23
+
24
+ getValueAsync<T>(experimentName: string, defaultValue: T, attributes: Attributes): Promise<T> {
25
+ return this.client.getValueAsync(experimentName, defaultValue, attributesToUser(attributes));
26
+ }
27
+
28
+ dispose(): void {
29
+ return this.client.dispose();
30
+ }
31
+ }
32
+
33
+ export function attributesToUser(attributes: Attributes): User {
34
+ const userId = attributes.userId || "";
35
+ const email = attributes.email || "";
36
+
37
+ const custom: { [key: string]: string } = {};
38
+ if (attributes.projectId) {
39
+ custom[PROJECT_ID_ATTRIBUTE] = attributes.projectId;
40
+ }
41
+ if (attributes.teamId) {
42
+ custom[TEAM_ID_ATTRIBUTE] = attributes.teamId;
43
+ }
44
+ if (attributes.teamName) {
45
+ custom[TEAM_NAME_ATTRIBUTE] = attributes.teamName;
46
+ }
47
+ if (attributes.teams) {
48
+ custom[TEAM_NAMES_ATTRIBUTE] = attributes.teams.map((t) => t.name).join(",");
49
+ custom[TEAM_IDS_ATTRIBUTE] = attributes.teams.map((t) => t.id).join(",");
50
+ }
51
+
52
+ return new User(userId, email, "", custom);
53
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright (c) 2022 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 { Team } from "../teams-projects-protocol";
8
+
9
+ // Attributes define attributes which can be used to segment audiences.
10
+ // Set the attributes which you want to use to group audiences into.
11
+ export interface Attributes {
12
+ userId?: string;
13
+ email?: string;
14
+
15
+ // Currently selected Gitpod Project ID
16
+ projectId?: string;
17
+
18
+ // Currently selected Gitpod Team ID
19
+ teamId?: string;
20
+ // Currently selected Gitpod Team Name
21
+ teamName?: string;
22
+
23
+ // All the Gitpod Teams that the user is a member (or owner) of
24
+ teams?: Array<Team>;
25
+ }
26
+
27
+ export interface Client {
28
+ getValueAsync<T>(experimentName: string, defaultValue: T, attributes: Attributes): Promise<T>;
29
+
30
+ // dispose will dispose of the client, no longer retrieving flags
31
+ dispose(): void;
32
+ }
@@ -4,19 +4,19 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- import { suite, test } from "mocha-typescript"
8
- import * as chai from "chai"
7
+ import { suite, test } from "mocha-typescript";
8
+ import * as chai from "chai";
9
9
 
10
- import { WorkspaceConfig } from './protocol';
11
- import { GitpodFileParser } from './gitpod-file-parser';
10
+ import { WorkspaceConfig } from "./protocol";
11
+ import { GitpodFileParser } from "./gitpod-file-parser";
12
12
 
13
- const expect = chai.expect
13
+ const expect = chai.expect;
14
14
 
15
15
  const DEFAULT_IMAGE = "default-image";
16
16
  const DEFAULT_CONFIG = <WorkspaceConfig>{ image: DEFAULT_IMAGE };
17
17
 
18
- @suite class TestGitpodFileParser {
19
-
18
+ @suite
19
+ class TestGitpodFileParser {
20
20
  protected parser: GitpodFileParser;
21
21
 
22
22
  public before() {
@@ -24,107 +24,102 @@ const DEFAULT_CONFIG = <WorkspaceConfig>{ image: DEFAULT_IMAGE };
24
24
  }
25
25
 
26
26
  @test public testOnlyOnePort() {
27
- const content =
28
- `ports:\n` +
29
- ` - port: 5555`;
27
+ const content = `ports:\n` + ` - port: 5555`;
30
28
 
31
29
  const result = this.parser.parse(content, {}, DEFAULT_CONFIG);
32
30
  expect(result.config).to.deep.equal({
33
- ports: [{
34
- port: 5555
35
- }],
36
- image: DEFAULT_IMAGE
31
+ ports: [
32
+ {
33
+ port: 5555,
34
+ },
35
+ ],
36
+ image: DEFAULT_IMAGE,
37
37
  });
38
38
  }
39
39
 
40
40
  @test public testPortRange() {
41
- const content =
42
- `ports:\n` +
43
- ` - port: 5555\n` +
44
- ` - port: 3000-3999`; // should be filtered out by default
41
+ const content = `ports:\n` + ` - port: 5555\n` + ` - port: 3000-3999`; // should be filtered out by default
45
42
 
46
43
  const result = this.parser.parse(content, {}, DEFAULT_CONFIG);
47
44
  expect(result.config).to.deep.equal({
48
- ports: [{
49
- port: 5555
50
- }],
51
- image: DEFAULT_IMAGE
45
+ ports: [
46
+ {
47
+ port: 5555,
48
+ },
49
+ ],
50
+ image: DEFAULT_IMAGE,
52
51
  });
53
52
  }
54
53
 
55
54
  @test public testPortRangeAccepted() {
56
- const content =
57
- `ports:\n` +
58
- ` - port: 5555\n` +
59
- ` - port: 3000-3999`; // should be included if explicitly supported
55
+ const content = `ports:\n` + ` - port: 5555\n` + ` - port: 3000-3999`; // should be included if explicitly supported
60
56
 
61
57
  const result = this.parser.parse(content, { acceptPortRanges: true }, DEFAULT_CONFIG);
62
58
  expect(result.config).to.deep.equal({
63
- ports: [{
64
- port: 5555
65
- }, {
66
- port: '3000-3999'
67
- }],
68
- image: DEFAULT_IMAGE
59
+ ports: [
60
+ {
61
+ port: 5555,
62
+ },
63
+ {
64
+ port: "3000-3999",
65
+ },
66
+ ],
67
+ image: DEFAULT_IMAGE,
69
68
  });
70
69
  }
71
70
 
72
71
  @test public testSimpleTask() {
73
- const content =
74
- `tasks:\n` +
75
- ` - command: yarn`;
72
+ const content = `tasks:\n` + ` - command: yarn`;
76
73
 
77
74
  const result = this.parser.parse(content, {}, DEFAULT_CONFIG);
78
75
  expect(result.config).to.deep.equal({
79
- tasks: [{
80
- command: "yarn"
81
- }],
82
- image: DEFAULT_IMAGE
76
+ tasks: [
77
+ {
78
+ command: "yarn",
79
+ },
80
+ ],
81
+ image: DEFAULT_IMAGE,
83
82
  });
84
83
  }
85
84
 
86
85
  @test public testSimpleImage() {
87
86
  const imageName = "my-test-org/my-test-image:some-tag";
88
- const content =
89
- `image: "${imageName}"\n`;
87
+ const content = `image: "${imageName}"\n`;
90
88
 
91
89
  const result = this.parser.parse(content);
92
90
  expect(result.config).to.deep.equal({
93
- image: imageName
91
+ image: imageName,
94
92
  });
95
93
  }
96
94
 
97
95
  @test public testComplexImageWithoutContext() {
98
- const dockerFileName = 'Dockerfile';
99
- const content =
100
- `image:\n file: ${dockerFileName}\n`;
96
+ const dockerFileName = "Dockerfile";
97
+ const content = `image:\n file: ${dockerFileName}\n`;
101
98
 
102
99
  const result = this.parser.parse(content);
103
100
  expect(result.config).to.deep.equal({
104
101
  image: {
105
- file: dockerFileName
106
- }
102
+ file: dockerFileName,
103
+ },
107
104
  });
108
105
  }
109
106
 
110
107
  @test public testComplexImageWithContext() {
111
- const dockerFileName = 'Dockerfile';
112
- const dockerContext = 'docker';
113
- const content =
114
- `image:\n file: ${dockerFileName}\n context: ${dockerContext}\n`;
108
+ const dockerFileName = "Dockerfile";
109
+ const dockerContext = "docker";
110
+ const content = `image:\n file: ${dockerFileName}\n context: ${dockerContext}\n`;
115
111
 
116
112
  const result = this.parser.parse(content);
117
113
  expect(result.config).to.deep.equal({
118
114
  image: {
119
115
  file: dockerFileName,
120
- context: dockerContext
121
- }
116
+ context: dockerContext,
117
+ },
122
118
  });
123
119
  }
124
120
 
125
121
  @test public testGitconfig() {
126
- const content =
127
- `
122
+ const content = `
128
123
  gitConfig:
129
124
  core.autocrlf: input
130
125
  `;
@@ -132,20 +127,19 @@ gitConfig:
132
127
  const result = this.parser.parse(content, {}, DEFAULT_CONFIG);
133
128
  expect(result.config).to.deep.equal({
134
129
  gitConfig: {
135
- "core.autocrlf": "input"
130
+ "core.autocrlf": "input",
136
131
  },
137
- image: DEFAULT_IMAGE
132
+ image: DEFAULT_IMAGE,
138
133
  });
139
134
  }
140
135
 
141
136
  @test public testBrokenConfig() {
142
- const content =
143
- `image: 42\n`;
137
+ const content = `image: 42\n`;
144
138
 
145
139
  const result = this.parser.parse(content, {}, DEFAULT_CONFIG);
146
140
  expect(result.config).to.deep.equal({
147
- image: DEFAULT_IMAGE
141
+ image: DEFAULT_IMAGE,
148
142
  });
149
143
  }
150
144
  }
151
- module.exports = new TestGitpodFileParser() // Only to circumvent no usage warning :-/
145
+ module.exports = new TestGitpodFileParser(); // Only to circumvent no usage warning :-/