@gitpod/gitpod-protocol 0.1.5-wth-argo.0 → 0.1.5-yh-vmoptions-fork.1

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 (352) hide show
  1. package/data/gitpod-schema.json +206 -28
  2. package/lib/accounting-protocol.d.ts +162 -0
  3. package/lib/accounting-protocol.d.ts.map +1 -0
  4. package/lib/accounting-protocol.js +107 -0
  5. package/lib/accounting-protocol.js.map +1 -0
  6. package/lib/admin-protocol.d.ts +32 -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/auth.d.ts.map +1 -1
  15. package/lib/context-url.d.ts +31 -0
  16. package/lib/context-url.d.ts.map +1 -0
  17. package/lib/context-url.js +102 -0
  18. package/lib/context-url.js.map +1 -0
  19. package/lib/context-url.spec.d.ts +14 -0
  20. package/lib/context-url.spec.d.ts.map +1 -0
  21. package/lib/context-url.spec.js +109 -0
  22. package/lib/context-url.spec.js.map +1 -0
  23. package/lib/email-protocol.d.ts +1 -2
  24. package/lib/email-protocol.d.ts.map +1 -1
  25. package/lib/email-protocol.js +4 -4
  26. package/lib/email-protocol.js.map +1 -1
  27. package/lib/encryption/container-module.d.ts.map +1 -1
  28. package/lib/encryption/container-module.js +5 -4
  29. package/lib/encryption/container-module.js.map +1 -1
  30. package/lib/encryption/encryption-engine.d.ts.map +1 -1
  31. package/lib/encryption/encryption-engine.js +25 -26
  32. package/lib/encryption/encryption-engine.js.map +1 -1
  33. package/lib/encryption/encryption-engine.spec.d.ts.map +1 -1
  34. package/lib/encryption/encryption-engine.spec.js +29 -37
  35. package/lib/encryption/encryption-engine.spec.js.map +1 -1
  36. package/lib/encryption/encryption-service.d.ts.map +1 -1
  37. package/lib/encryption/encryption-service.js +30 -44
  38. package/lib/encryption/encryption-service.js.map +1 -1
  39. package/lib/encryption/key-provider.d.ts.map +1 -1
  40. package/lib/encryption/key-provider.js +31 -38
  41. package/lib/encryption/key-provider.js.map +1 -1
  42. package/lib/env.d.ts +0 -6
  43. package/lib/env.d.ts.map +1 -1
  44. package/lib/env.js +7 -27
  45. package/lib/env.js.map +1 -1
  46. package/lib/gitpod-file-parser.d.ts.map +1 -1
  47. package/lib/gitpod-file-parser.js +26 -42
  48. package/lib/gitpod-file-parser.js.map +1 -1
  49. package/lib/gitpod-file-parser.spec.js +145 -142
  50. package/lib/gitpod-file-parser.spec.js.map +1 -1
  51. package/lib/gitpod-service.d.ts +180 -33
  52. package/lib/gitpod-service.d.ts.map +1 -1
  53. package/lib/gitpod-service.js +194 -273
  54. package/lib/gitpod-service.js.map +1 -1
  55. package/lib/headless-workspace-log.d.ts +9 -11
  56. package/lib/headless-workspace-log.d.ts.map +1 -1
  57. package/lib/headless-workspace-log.js +6 -8
  58. package/lib/headless-workspace-log.js.map +1 -1
  59. package/lib/ide-frontend-service.d.ts +5 -1
  60. package/lib/ide-frontend-service.d.ts.map +1 -1
  61. package/lib/ide-protocol.d.ts +105 -0
  62. package/lib/ide-protocol.d.ts.map +1 -0
  63. package/lib/{util/without.js → ide-protocol.js} +2 -2
  64. package/lib/ide-protocol.js.map +1 -0
  65. package/lib/index.d.ts +16 -10
  66. package/lib/index.d.ts.map +1 -1
  67. package/lib/index.js +7 -1
  68. package/lib/index.js.map +1 -1
  69. package/lib/installation-admin-protocol.d.ts +27 -0
  70. package/lib/installation-admin-protocol.d.ts.map +1 -0
  71. package/lib/installation-admin-protocol.js +30 -0
  72. package/lib/installation-admin-protocol.js.map +1 -0
  73. package/lib/license-protocol.d.ts +7 -0
  74. package/lib/license-protocol.d.ts.map +1 -1
  75. package/lib/license-protocol.js.map +1 -1
  76. package/lib/messaging/browser/connection.d.ts +5 -3
  77. package/lib/messaging/browser/connection.d.ts.map +1 -1
  78. package/lib/messaging/browser/connection.js +184 -34
  79. package/lib/messaging/browser/connection.js.map +1 -1
  80. package/lib/messaging/browser/window-connection.d.ts +4 -4
  81. package/lib/messaging/browser/window-connection.d.ts.map +1 -1
  82. package/lib/messaging/browser/window-connection.js +42 -59
  83. package/lib/messaging/browser/window-connection.js.map +1 -1
  84. package/lib/messaging/client-call-metrics.d.ts +35 -0
  85. package/lib/messaging/client-call-metrics.d.ts.map +1 -0
  86. package/lib/messaging/client-call-metrics.js +83 -0
  87. package/lib/messaging/client-call-metrics.js.map +1 -0
  88. package/lib/messaging/error.d.ts +6 -1
  89. package/lib/messaging/error.d.ts.map +1 -1
  90. package/lib/messaging/error.js +12 -2
  91. package/lib/messaging/error.js.map +1 -1
  92. package/lib/messaging/handler.d.ts +10 -0
  93. package/lib/messaging/handler.d.ts.map +1 -1
  94. package/lib/messaging/handler.js +1 -1
  95. package/lib/messaging/node/connection.d.ts +1 -17
  96. package/lib/messaging/node/connection.d.ts.map +1 -1
  97. package/lib/messaging/node/connection.js +24 -60
  98. package/lib/messaging/node/connection.js.map +1 -1
  99. package/lib/messaging/proxy-factory.d.ts +3 -1
  100. package/lib/messaging/proxy-factory.d.ts.map +1 -1
  101. package/lib/messaging/proxy-factory.js +75 -162
  102. package/lib/messaging/proxy-factory.js.map +1 -1
  103. package/lib/oss-allowlist.d.ts +14 -0
  104. package/lib/oss-allowlist.d.ts.map +1 -0
  105. package/lib/oss-allowlist.js +8 -0
  106. package/lib/oss-allowlist.js.map +1 -0
  107. package/lib/payment-protocol.d.ts +18 -0
  108. package/lib/payment-protocol.d.ts.map +1 -0
  109. package/lib/payment-protocol.js +13 -0
  110. package/lib/payment-protocol.js.map +1 -0
  111. package/lib/permission.d.ts +10 -3
  112. package/lib/permission.d.ts.map +1 -1
  113. package/lib/permission.js +41 -31
  114. package/lib/permission.js.map +1 -1
  115. package/lib/plans.d.ts +210 -0
  116. package/lib/plans.d.ts.map +1 -0
  117. package/lib/plans.js +605 -0
  118. package/lib/plans.js.map +1 -0
  119. package/lib/protocol.d.ts +196 -83
  120. package/lib/protocol.d.ts.map +1 -1
  121. package/lib/protocol.js +264 -200
  122. package/lib/protocol.js.map +1 -1
  123. package/lib/snapshot-url.d.ts +14 -0
  124. package/lib/snapshot-url.d.ts.map +1 -0
  125. package/lib/snapshot-url.js +26 -0
  126. package/lib/snapshot-url.js.map +1 -0
  127. package/{src/util/without.ts → lib/snapshot-url.spec.d.ts} +2 -3
  128. package/lib/snapshot-url.spec.d.ts.map +1 -0
  129. package/lib/snapshot-url.spec.js +41 -0
  130. package/lib/snapshot-url.spec.js.map +1 -0
  131. package/lib/team-subscription-protocol.d.ts +91 -0
  132. package/lib/team-subscription-protocol.d.ts.map +1 -0
  133. package/lib/team-subscription-protocol.js +74 -0
  134. package/lib/team-subscription-protocol.js.map +1 -0
  135. package/lib/teams-projects-protocol.d.ts +118 -0
  136. package/lib/teams-projects-protocol.d.ts.map +1 -0
  137. package/lib/teams-projects-protocol.js +30 -0
  138. package/lib/teams-projects-protocol.js.map +1 -0
  139. package/lib/typings/globals.d.ts +2 -2
  140. package/lib/typings/globals.d.ts.map +1 -1
  141. package/lib/util/analytics.d.ts +8 -0
  142. package/lib/util/analytics.d.ts.map +1 -0
  143. package/lib/util/analytics.js +88 -0
  144. package/lib/util/analytics.js.map +1 -0
  145. package/lib/util/async-iterator.d.ts.map +1 -1
  146. package/lib/util/async-iterator.js +57 -135
  147. package/lib/util/async-iterator.js.map +1 -1
  148. package/lib/util/cancelable.js +17 -59
  149. package/lib/util/cancelable.js.map +1 -1
  150. package/lib/util/date-time.js +11 -11
  151. package/lib/util/date-time.js.map +1 -1
  152. package/lib/util/deferred.js +10 -12
  153. package/lib/util/deferred.js.map +1 -1
  154. package/lib/util/disposable.d.ts.map +1 -1
  155. package/lib/util/disposable.js +27 -40
  156. package/lib/util/disposable.js.map +1 -1
  157. package/lib/util/event.d.ts.map +1 -1
  158. package/lib/util/event.js +63 -77
  159. package/lib/util/event.js.map +1 -1
  160. package/lib/util/garbage-collected-cache.d.ts +1 -0
  161. package/lib/util/garbage-collected-cache.d.ts.map +1 -1
  162. package/lib/util/garbage-collected-cache.js +27 -47
  163. package/lib/util/garbage-collected-cache.js.map +1 -1
  164. package/lib/util/generate-workspace-id.d.ts +6 -1
  165. package/lib/util/generate-workspace-id.d.ts.map +1 -1
  166. package/lib/util/generate-workspace-id.js +469 -502
  167. package/lib/util/generate-workspace-id.js.map +1 -1
  168. package/lib/util/generate-workspace-id.spec.js +68 -78
  169. package/lib/util/generate-workspace-id.spec.js.map +1 -1
  170. package/lib/util/gitpod-cookie.d.ts +20 -0
  171. package/lib/util/gitpod-cookie.d.ts.map +1 -0
  172. package/lib/util/gitpod-cookie.js +41 -0
  173. package/lib/util/gitpod-cookie.js.map +1 -0
  174. package/lib/util/gitpod-host-url.d.ts +1 -2
  175. package/lib/util/gitpod-host-url.d.ts.map +1 -1
  176. package/lib/util/gitpod-host-url.js +108 -109
  177. package/lib/util/gitpod-host-url.js.map +1 -1
  178. package/lib/util/gitpod-host-url.spec.d.ts +7 -1
  179. package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
  180. package/lib/util/gitpod-host-url.spec.js +113 -31
  181. package/lib/util/gitpod-host-url.spec.js.map +1 -1
  182. package/lib/util/grpc.d.ts +15 -0
  183. package/lib/util/grpc.d.ts.map +1 -0
  184. package/lib/util/grpc.js +18 -0
  185. package/lib/util/grpc.js.map +1 -0
  186. package/lib/util/jaeger-client-types.d.ts +68 -0
  187. package/lib/util/jaeger-client-types.d.ts.map +1 -0
  188. package/lib/{theia-plugins.js → util/jaeger-client-types.js} +1 -1
  189. package/lib/util/jaeger-client-types.js.map +1 -0
  190. package/lib/util/logging.d.ts +49 -33
  191. package/lib/util/logging.d.ts.map +1 -1
  192. package/lib/util/logging.js +125 -129
  193. package/lib/util/logging.js.map +1 -1
  194. package/lib/util/make-link.js +5 -5
  195. package/lib/util/make-link.js.map +1 -1
  196. package/lib/util/parse-workspace-id.d.ts +10 -0
  197. package/lib/util/parse-workspace-id.d.ts.map +1 -1
  198. package/lib/util/parse-workspace-id.js +31 -7
  199. package/lib/util/parse-workspace-id.js.map +1 -1
  200. package/lib/util/parse-workspace-id.spec.d.ts +4 -0
  201. package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
  202. package/lib/util/parse-workspace-id.spec.js +123 -84
  203. package/lib/util/parse-workspace-id.spec.js.map +1 -1
  204. package/lib/util/queue.js +16 -55
  205. package/lib/util/queue.js.map +1 -1
  206. package/lib/util/queue.spec.js +147 -288
  207. package/lib/util/queue.spec.js.map +1 -1
  208. package/lib/util/repeat.d.ts +15 -0
  209. package/lib/util/repeat.d.ts.map +1 -0
  210. package/lib/util/repeat.js +55 -0
  211. package/lib/util/repeat.js.map +1 -0
  212. package/lib/util/semaphore.d.ts.map +1 -1
  213. package/lib/util/semaphore.js +15 -46
  214. package/lib/util/semaphore.js.map +1 -1
  215. package/lib/util/skip-if.d.ts.map +1 -1
  216. package/lib/util/skip-if.js +6 -6
  217. package/lib/util/skip-if.js.map +1 -1
  218. package/lib/util/timeutil.d.ts +1 -0
  219. package/lib/util/timeutil.d.ts.map +1 -1
  220. package/lib/util/timeutil.js +35 -17
  221. package/lib/util/timeutil.js.map +1 -1
  222. package/lib/util/timeutil.spec.d.ts.map +1 -1
  223. package/lib/util/timeutil.spec.js +21 -24
  224. package/lib/util/timeutil.spec.js.map +1 -1
  225. package/lib/util/tracing.d.ts +52 -6
  226. package/lib/util/tracing.d.ts.map +1 -1
  227. package/lib/util/tracing.js +197 -64
  228. package/lib/util/tracing.js.map +1 -1
  229. package/lib/util/tracing.spec.d.ts +7 -0
  230. package/lib/util/tracing.spec.d.ts.map +1 -0
  231. package/lib/util/tracing.spec.js +121 -0
  232. package/lib/util/tracing.spec.js.map +1 -0
  233. package/lib/util/workspace-port-authentication.d.ts +7 -7
  234. package/lib/util/workspace-port-authentication.d.ts.map +1 -1
  235. package/lib/util/workspace-port-authentication.js +10 -12
  236. package/lib/util/workspace-port-authentication.js.map +1 -1
  237. package/lib/workspace-cluster.d.ts +76 -0
  238. package/lib/workspace-cluster.d.ts.map +1 -0
  239. package/lib/workspace-cluster.js +31 -0
  240. package/lib/workspace-cluster.js.map +1 -0
  241. package/lib/workspace-instance.d.ts +45 -5
  242. package/lib/workspace-instance.d.ts.map +1 -1
  243. package/lib/wsready.d.ts +1 -1
  244. package/lib/wsready.d.ts.map +1 -1
  245. package/lib/wsready.js +2 -2
  246. package/package.json +32 -18
  247. package/pkg-yarn.lock +18 -10
  248. package/provenance-bundle.jsonl +2 -0
  249. package/src/accounting-protocol.ts +241 -0
  250. package/src/admin-protocol.ts +70 -19
  251. package/src/analytics.ts +52 -0
  252. package/src/auth.ts +2 -2
  253. package/src/context-url.spec.ts +67 -0
  254. package/src/context-url.ts +109 -0
  255. package/src/email-protocol.ts +5 -7
  256. package/src/encryption/container-module.ts +2 -3
  257. package/src/encryption/encryption-engine.spec.ts +9 -8
  258. package/src/encryption/encryption-engine.ts +14 -14
  259. package/src/encryption/encryption-service.ts +4 -5
  260. package/src/encryption/key-provider.ts +16 -19
  261. package/src/env.ts +0 -22
  262. package/src/gitpod-file-parser.spec.ts +55 -61
  263. package/src/gitpod-file-parser.ts +16 -17
  264. package/src/gitpod-service.ts +348 -110
  265. package/src/headless-workspace-log.ts +12 -14
  266. package/src/ide-frontend-service.ts +6 -2
  267. package/src/ide-protocol.ts +119 -0
  268. package/src/index.ts +16 -10
  269. package/src/installation-admin-protocol.ts +42 -0
  270. package/src/license-protocol.ts +12 -6
  271. package/src/messaging/browser/connection.ts +197 -18
  272. package/src/messaging/browser/window-connection.ts +39 -29
  273. package/src/messaging/client-call-metrics.ts +96 -0
  274. package/src/messaging/error.ts +18 -5
  275. package/src/messaging/handler.ts +13 -1
  276. package/src/messaging/node/connection.ts +23 -70
  277. package/src/messaging/proxy-factory.ts +35 -34
  278. package/src/oss-allowlist.ts +15 -0
  279. package/src/payment-protocol.ts +20 -0
  280. package/src/permission.ts +42 -33
  281. package/src/plans.ts +679 -0
  282. package/src/protocol.ts +493 -275
  283. package/src/snapshot-url.spec.ts +27 -0
  284. package/src/snapshot-url.ts +27 -0
  285. package/src/team-subscription-protocol.ts +147 -0
  286. package/src/teams-projects-protocol.ts +153 -0
  287. package/src/typings/globals.ts +4 -4
  288. package/src/util/analytics.ts +109 -0
  289. package/src/util/async-iterator.ts +4 -5
  290. package/src/util/cancelable.ts +3 -3
  291. package/src/util/date-time.ts +8 -8
  292. package/src/util/deferred.ts +6 -6
  293. package/src/util/disposable.ts +3 -6
  294. package/src/util/event.ts +9 -11
  295. package/src/util/garbage-collected-cache.ts +11 -8
  296. package/src/util/generate-workspace-id.spec.ts +37 -10
  297. package/src/util/generate-workspace-id.ts +464 -438
  298. package/src/util/gitpod-cookie.ts +38 -0
  299. package/src/util/gitpod-host-url.spec.ts +59 -8
  300. package/src/util/gitpod-host-url.ts +52 -40
  301. package/src/util/grpc.ts +15 -0
  302. package/src/util/jaeger-client-types.ts +102 -0
  303. package/src/util/logging.ts +145 -72
  304. package/src/util/make-link.ts +6 -7
  305. package/src/util/parse-workspace-id.spec.ts +37 -8
  306. package/src/util/parse-workspace-id.ts +32 -7
  307. package/src/util/queue.spec.ts +28 -26
  308. package/src/util/repeat.ts +45 -0
  309. package/src/util/semaphore.ts +6 -8
  310. package/src/util/skip-if.ts +10 -7
  311. package/src/util/timeutil.spec.ts +14 -15
  312. package/src/util/timeutil.ts +25 -15
  313. package/src/util/tracing.spec.ts +88 -0
  314. package/src/util/tracing.ts +200 -31
  315. package/src/util/workspace-port-authentication.ts +10 -13
  316. package/src/workspace-cluster.ts +107 -0
  317. package/src/workspace-instance.ts +98 -31
  318. package/src/wsready.ts +3 -3
  319. package/data/builtin-theia-plugins.json +0 -372
  320. package/lib/messaging/connection-error-handler.d.ts +0 -27
  321. package/lib/messaging/connection-error-handler.d.ts.map +0 -1
  322. package/lib/messaging/connection-error-handler.js +0 -46
  323. package/lib/messaging/connection-error-handler.js.map +0 -1
  324. package/lib/theia-plugins.d.ts +0 -11
  325. package/lib/theia-plugins.d.ts.map +0 -1
  326. package/lib/theia-plugins.js.map +0 -1
  327. package/lib/util/context-url.d.ts +0 -13
  328. package/lib/util/context-url.d.ts.map +0 -1
  329. package/lib/util/context-url.js +0 -26
  330. package/lib/util/context-url.js.map +0 -1
  331. package/lib/util/context-url.spec.d.ts +0 -10
  332. package/lib/util/context-url.spec.d.ts.map +0 -1
  333. package/lib/util/context-url.spec.js +0 -52
  334. package/lib/util/context-url.spec.js.map +0 -1
  335. package/lib/util/repeater.d.ts +0 -22
  336. package/lib/util/repeater.d.ts.map +0 -1
  337. package/lib/util/repeater.js +0 -118
  338. package/lib/util/repeater.js.map +0 -1
  339. package/lib/util/safe-promise.d.ts +0 -11
  340. package/lib/util/safe-promise.d.ts.map +0 -1
  341. package/lib/util/safe-promise.js +0 -34
  342. package/lib/util/safe-promise.js.map +0 -1
  343. package/lib/util/without.d.ts +0 -7
  344. package/lib/util/without.d.ts.map +0 -1
  345. package/lib/util/without.js.map +0 -1
  346. package/src/messaging/connection-error-handler.ts +0 -62
  347. package/src/theia-plugins.ts +0 -11
  348. package/src/util/context-url.spec.ts +0 -25
  349. package/src/util/context-url.ts +0 -23
  350. package/src/util/jaeger-client.d.ts +0 -105
  351. package/src/util/repeater.ts +0 -49
  352. package/src/util/safe-promise.ts +0 -26
@@ -0,0 +1,241 @@
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 { v4 as uuidv4 } from "uuid";
8
+ import { User } from "./protocol";
9
+ import { oneMonthLater } from "./util/timeutil";
10
+
11
+ /*
12
+ * Subscription and acocunting data
13
+ */
14
+ export interface AccountEntry {
15
+ uid: string;
16
+
17
+ userId: string;
18
+
19
+ /** [hours] */
20
+ amount: number;
21
+
22
+ /**
23
+ * credit: start of validity,
24
+ * session: end of (split-) session
25
+ */
26
+ date: string;
27
+
28
+ /**
29
+ * debits (session, expiry, loss): relation to credit
30
+ */
31
+ creditId?: string;
32
+
33
+ /**
34
+ * credit: end of validity
35
+ */
36
+ expiryDate?: string; // exclusive
37
+
38
+ kind: AccountEntryKind;
39
+
40
+ /**
41
+ * credit: amount - accounted debits
42
+ * [hours]
43
+ */
44
+ remainingAmount?: number;
45
+
46
+ description?: object;
47
+ }
48
+ export namespace AccountEntry {
49
+ export function create<T extends AccountEntry>(entry: Omit<T, "uid">): T {
50
+ const result = entry as T;
51
+ result.uid = uuidv4();
52
+ return result;
53
+ }
54
+ }
55
+
56
+ export type DebitAccountEntryKind = "session" | "expiry" | "loss";
57
+ export type AccountEntryKind = "credit" | DebitAccountEntryKind | "carry" | "open";
58
+
59
+ export interface Credit extends AccountEntry {
60
+ kind: "credit";
61
+ expiryDate: string;
62
+ }
63
+ export type Debit = LossDebit | ExpiryDebit | SessionDebit;
64
+ export interface LossDebit extends AccountEntry {
65
+ kind: "loss";
66
+ }
67
+ export interface ExpiryDebit extends AccountEntry {
68
+ kind: "expiry";
69
+ creditId: undefined;
70
+ }
71
+ export interface SessionDebit extends AccountEntry {
72
+ kind: DebitAccountEntryKind;
73
+ creditId: string;
74
+ }
75
+
76
+ export type AccountEntryDescription = SessionDescription | CreditDescription;
77
+ export interface CreditDescription {
78
+ subscriptionId: string;
79
+ planId: string;
80
+ }
81
+ export namespace CreditDescription {
82
+ export function is(obj: any): obj is CreditDescription {
83
+ return !!obj && obj.hasOwnProperty("subscriptionId") && obj.hasOwnProperty("planId");
84
+ }
85
+ }
86
+ export interface SessionDescription {
87
+ contextTitle: string;
88
+ contextUrl: string;
89
+ workspaceId: string;
90
+ workspaceInstanceId: string;
91
+ }
92
+ export namespace SessionDescription {
93
+ export function is(obj: any): obj is SessionDescription {
94
+ return (
95
+ !!obj &&
96
+ obj.hasOwnProperty("contextTitle") &&
97
+ obj.hasOwnProperty("contextUrl") &&
98
+ obj.hasOwnProperty("workspaceId") &&
99
+ obj.hasOwnProperty("workspaceInstanceId")
100
+ );
101
+ }
102
+ }
103
+
104
+ /**
105
+ * - The earliest subscription may start with User.creationDate
106
+ * - There may be multiple Gitpod subscriptions for a user at any given time
107
+ * - The dates form an interval of the form: [startDate, endDate)
108
+ * - Subscriptions that directly map to a Chargebee plan have their paymentReference set and MAY carry additional paymentData (UserPaidSubscription)
109
+ * - Subscriptions that are assigned to a user through a Team Subscription carry a teamSubscriptionSlotId (AssignedTeamSubscription)
110
+ */
111
+ export interface Subscription {
112
+ uid: string;
113
+ userId: string;
114
+ startDate: string; // inclusive
115
+ /** When the subscription will end (must be >= cancellationDate!) */
116
+ endDate?: string; // exclusive
117
+ /** When the subscription was cancelled */
118
+ cancellationDate?: string; // exclusive
119
+ /** Number of granted hours */
120
+ amount: number;
121
+ /** Number of granted hours for the first month: If this is set, use this value for the first month */
122
+ firstMonthAmount?: number;
123
+ planId?: string;
124
+ paymentReference?: string;
125
+ paymentData?: PaymentData;
126
+ teamSubscriptionSlotId?: string;
127
+ teamMembershipId?: string;
128
+ /** marks the subscription as deleted */
129
+ deleted?: boolean;
130
+ }
131
+
132
+ export interface SubscriptionAndUser extends Subscription {
133
+ user: User;
134
+ }
135
+
136
+ export interface PaymentData {
137
+ /** Marks the date as of which the _switch_ is effective. */
138
+ downgradeDate?: string;
139
+ /** Determines the new plan the dowgrade is targeted against (optional for backwards compatibility) */
140
+ newPlan?: string;
141
+ }
142
+
143
+ export interface UserPaidSubscription extends Subscription {
144
+ paymentReference: string;
145
+ paymentData?: PaymentData;
146
+ }
147
+ export namespace UserPaidSubscription {
148
+ export function is(data: any): data is UserPaidSubscription {
149
+ return !!data && data.hasOwnProperty("paymentReference");
150
+ }
151
+ }
152
+
153
+ export interface AssignedTeamSubscription extends Subscription {
154
+ teamSubscriptionSlotId: string;
155
+ }
156
+ export namespace AssignedTeamSubscription {
157
+ export function is(data: any): data is AssignedTeamSubscription {
158
+ return !!data && data.hasOwnProperty("teamSubscriptionSlotId");
159
+ }
160
+ }
161
+
162
+ export interface AssignedTeamSubscription2 extends Subscription {
163
+ teamMembershipId: string;
164
+ }
165
+ export namespace AssignedTeamSubscription2 {
166
+ export function is(data: any): data is AssignedTeamSubscription2 {
167
+ return typeof data === "object" && data.hasOwnProperty("teamMembershipId");
168
+ }
169
+ }
170
+
171
+ export namespace Subscription {
172
+ export function create(newSubscription: Omit<Subscription, "uid">) {
173
+ const subscription = newSubscription as Subscription;
174
+ subscription.uid = uuidv4();
175
+ return subscription;
176
+ }
177
+ export function cancelSubscription(s: Subscription, cancellationDate: string, endDate?: string) {
178
+ s.endDate = endDate || cancellationDate;
179
+ s.cancellationDate = cancellationDate;
180
+ }
181
+ export function isSame(s1: Subscription | undefined, s2: Subscription | undefined): boolean {
182
+ return (
183
+ !!s1 &&
184
+ !!s2 &&
185
+ s1.userId === s2.userId &&
186
+ s1.planId === s2.planId &&
187
+ s1.startDate === s2.startDate &&
188
+ s1.endDate === s2.endDate &&
189
+ s1.amount === s2.amount &&
190
+ s1.cancellationDate === s2.cancellationDate &&
191
+ s1.deleted === s2.deleted &&
192
+ ((s1.paymentData === undefined && s2.paymentData === undefined) ||
193
+ (!!s1.paymentData &&
194
+ !!s2.paymentData &&
195
+ s1.paymentData.downgradeDate === s2.paymentData.downgradeDate &&
196
+ s1.paymentData.newPlan === s2.paymentData.newPlan))
197
+ );
198
+ }
199
+ export function isActive(s: Subscription, date: string): boolean {
200
+ return s.startDate <= date && (s.endDate === undefined || date < s.endDate);
201
+ }
202
+ export function isDowngraded(s: Subscription) {
203
+ return s.paymentData && s.paymentData.downgradeDate;
204
+ }
205
+ export function calculateCurrentPeriod(startDate: string, now: Date) {
206
+ let nextStartDate = startDate;
207
+ do {
208
+ startDate = nextStartDate;
209
+ nextStartDate = oneMonthLater(startDate, new Date(startDate).getDate());
210
+ } while (nextStartDate < now.toISOString());
211
+ return { startDate, endDate: nextStartDate };
212
+ }
213
+ }
214
+
215
+ export type MaybeSubscription = Subscription | undefined;
216
+
217
+ export interface Period {
218
+ startDate: string; // inclusive
219
+ endDate: string; // exclusive
220
+ }
221
+
222
+ export type MaybePeriod = Period | undefined;
223
+
224
+ export type AccountEntryFixedPeriod = Omit<AccountEntry, "uid"> & { expiryDate: string };
225
+ export interface AccountStatement extends Period {
226
+ userId: string;
227
+ /**
228
+ * The subscriptions that have not been cancelled yet at the end of the period
229
+ */
230
+ subscriptions: Subscription[];
231
+ credits: Credit[];
232
+ debits: Debit[];
233
+ /** Remaining valid hours (accumulated from credits) */
234
+ remainingHours: RemainingHours;
235
+ }
236
+ export type RemainingHours = number | "unlimited";
237
+
238
+ export interface CreditAlert {
239
+ userId: string;
240
+ remainingUsageHours: number;
241
+ }
@@ -5,9 +5,12 @@
5
5
  */
6
6
 
7
7
  import { User, Workspace, NamedWorkspaceFeatureFlag } from "./protocol";
8
- import { Without } from "./util/without";
8
+ import { FindPrebuildsParams } from "./gitpod-service";
9
+ import { Project, Team, PrebuildWithStatus, TeamMemberInfo, TeamMemberRole } from "./teams-projects-protocol";
9
10
  import { WorkspaceInstance, WorkspaceInstancePhase } from "./workspace-instance";
10
11
  import { RoleOrPermission } from "./permission";
12
+ import { AccountStatement } from "./accounting-protocol";
13
+ import { InstallationAdminSettings } from "./installation-admin-protocol";
11
14
 
12
15
  export interface AdminServer {
13
16
  adminGetUsers(req: AdminGetListRequest<User>): Promise<AdminGetListResult<User>>;
@@ -17,48 +20,69 @@ export interface AdminServer {
17
20
  adminModifyRoleOrPermission(req: AdminModifyRoleOrPermissionRequest): Promise<User>;
18
21
  adminModifyPermanentWorkspaceFeatureFlag(req: AdminModifyPermanentWorkspaceFeatureFlagRequest): Promise<User>;
19
22
 
23
+ adminGetTeamMembers(teamId: string): Promise<TeamMemberInfo[]>;
24
+ adminGetTeams(req: AdminGetListRequest<Team>): Promise<AdminGetListResult<Team>>;
25
+ adminGetTeamById(id: string): Promise<Team | undefined>;
26
+ adminSetTeamMemberRole(teamId: string, userId: string, role: TeamMemberRole): Promise<void>;
27
+
20
28
  adminGetWorkspaces(req: AdminGetWorkspacesRequest): Promise<AdminGetListResult<WorkspaceAndInstance>>;
21
29
  adminGetWorkspace(id: string): Promise<WorkspaceAndInstance>;
22
30
  adminForceStopWorkspace(id: string): Promise<void>;
31
+ adminRestoreSoftDeletedWorkspace(id: string): Promise<void>;
32
+
33
+ adminGetProjectsBySearchTerm(req: AdminGetListRequest<Project>): Promise<AdminGetListResult<Project>>;
34
+ adminGetProjectById(id: string): Promise<Project | undefined>;
23
35
 
36
+ adminFindPrebuilds(params: FindPrebuildsParams): Promise<PrebuildWithStatus[]>;
24
37
  adminSetLicense(key: string): Promise<void>;
38
+
39
+ adminGetAccountStatement(userId: string): Promise<AccountStatement>;
40
+ adminSetProfessionalOpenSource(userId: string, shouldGetProfOSS: boolean): Promise<void>;
41
+ adminIsStudent(userId: string): Promise<boolean>;
42
+ adminAddStudentEmailDomain(userId: string, domain: string): Promise<void>;
43
+ adminGrantExtraHours(userId: string, extraHours: number): Promise<void>;
44
+
45
+ adminGetSettings(): Promise<InstallationAdminSettings>;
46
+ adminUpdateSettings(settings: InstallationAdminSettings): Promise<void>;
25
47
  }
26
48
 
27
49
  export interface AdminGetListRequest<T> {
28
- offset: number
29
- limit: number
30
- orderBy: keyof T
31
- orderDir: "asc" | "desc"
50
+ offset: number;
51
+ limit: number;
52
+ orderBy: keyof T;
53
+ orderDir: "asc" | "desc";
32
54
  searchTerm?: string;
33
55
  }
34
56
 
35
57
  export interface AdminGetListResult<T> {
36
- total: number
37
- rows: T[]
58
+ total: number;
59
+ rows: T[];
38
60
  }
39
61
 
40
62
  export interface AdminBlockUserRequest {
41
- id: string
42
- blocked: boolean
63
+ id: string;
64
+ blocked: boolean;
43
65
  }
44
66
 
45
67
  export interface AdminModifyRoleOrPermissionRequest {
46
68
  id: string;
47
69
  rpp: {
48
- r: RoleOrPermission
49
- add: boolean
50
- }[]
70
+ r: RoleOrPermission;
71
+ add: boolean;
72
+ }[];
51
73
  }
52
74
 
53
75
  export interface AdminModifyPermanentWorkspaceFeatureFlagRequest {
54
76
  id: string;
55
77
  changes: {
56
- featureFlag: NamedWorkspaceFeatureFlag
57
- add: boolean
58
- }[]
78
+ featureFlag: NamedWorkspaceFeatureFlag;
79
+ add: boolean;
80
+ }[];
59
81
  }
60
82
 
61
- export interface WorkspaceAndInstance extends Without<Workspace, "id"|"creationTime">, Without<WorkspaceInstance, "id"|"creationTime"> {
83
+ export interface WorkspaceAndInstance
84
+ extends Omit<Workspace, "id" | "creationTime">,
85
+ Omit<WorkspaceInstance, "id" | "creationTime"> {
62
86
  workspaceId: string;
63
87
  workspaceCreationTime: string;
64
88
  instanceId: string;
@@ -66,6 +90,33 @@ export interface WorkspaceAndInstance extends Without<Workspace, "id"|"creationT
66
90
  phase: WorkspaceInstancePhase;
67
91
  }
68
92
 
69
- export interface AdminGetWorkspacesRequest extends AdminGetListRequest<WorkspaceAndInstance> {
70
- ownerId?: string
71
- }
93
+ export namespace WorkspaceAndInstance {
94
+ export function toWorkspace(wai: WorkspaceAndInstance): Workspace {
95
+ return {
96
+ id: wai.workspaceId,
97
+ creationTime: wai.workspaceCreationTime,
98
+ ...wai,
99
+ };
100
+ }
101
+
102
+ export function toInstance(wai: WorkspaceAndInstance): WorkspaceInstance | undefined {
103
+ if (!wai.instanceId) {
104
+ return undefined;
105
+ }
106
+ return {
107
+ id: wai.instanceId,
108
+ creationTime: wai.instanceCreationTime,
109
+ ...wai,
110
+ };
111
+ }
112
+ }
113
+
114
+ export type AdminGetWorkspacesRequest = AdminGetListRequest<WorkspaceAndInstance> & AdminGetWorkspacesQuery;
115
+ /** The fields are meant to be used either OR (not combined) */
116
+ export type AdminGetWorkspacesQuery = {
117
+ /** we use this field in case we have a UUIDv4 and don't know whether it's an (old) workspace or instance id */
118
+ instanceIdOrWorkspaceId?: string;
119
+ instanceId?: string;
120
+ workspaceId?: string;
121
+ ownerId?: string;
122
+ };
@@ -0,0 +1,52 @@
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 const IAnalyticsWriter = Symbol("IAnalyticsWriter");
8
+
9
+ type Identity =
10
+ | { userId: string | number; anonymousId?: string | number }
11
+ | { userId?: string | number; anonymousId: string | number };
12
+
13
+ interface Message {
14
+ messageId?: string;
15
+ }
16
+
17
+ export type IdentifyMessage = Message &
18
+ Identity & {
19
+ traits?: any;
20
+ timestamp?: Date;
21
+ context?: any;
22
+ };
23
+
24
+ export type TrackMessage = Message &
25
+ Identity & {
26
+ event: string;
27
+ properties?: any;
28
+ timestamp?: Date;
29
+ context?: any;
30
+ };
31
+
32
+ export type PageMessage = Message &
33
+ Identity & {
34
+ properties?: any;
35
+ timestamp?: Date;
36
+ context?: any;
37
+ };
38
+
39
+ export type RemoteTrackMessage = Omit<TrackMessage, "timestamp" | "userId">;
40
+ export type RemotePageMessage = Omit<PageMessage, "timestamp" | "userId"> & {
41
+ includePII?: boolean;
42
+ };
43
+
44
+ export type RemoteIdentifyMessage = Omit<IdentifyMessage, "timestamp" | "userId">;
45
+
46
+ export interface IAnalyticsWriter {
47
+ identify(msg: IdentifyMessage): void;
48
+
49
+ track(msg: TrackMessage): void;
50
+
51
+ page(msg: PageMessage): void;
52
+ }
package/src/auth.ts CHANGED
@@ -11,14 +11,14 @@ export interface SelectAccountPayload {
11
11
  authHost: string;
12
12
  authName: string;
13
13
  authProviderType: string;
14
- },
14
+ };
15
15
  otherUser: {
16
16
  name: string;
17
17
  avatarUrl: string;
18
18
  authHost: string;
19
19
  authName: string;
20
20
  authProviderType: string;
21
- }
21
+ };
22
22
  }
23
23
  export namespace SelectAccountPayload {
24
24
  export function is(data: any): data is SelectAccountPayload {
@@ -0,0 +1,67 @@
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 * as chai from "chai";
8
+ import { suite, test } from "mocha-typescript";
9
+ import { Workspace } from ".";
10
+ import { ContextURL } from "./context-url";
11
+ const expect = chai.expect;
12
+
13
+ type WsContextUrl = Pick<Workspace, "context" | "contextURL">;
14
+
15
+ @suite
16
+ export class ContextUrlTest {
17
+ @test public parseContextUrl_withEnvVar() {
18
+ const actual = ContextURL.getNormalizedURL({
19
+ contextURL: "passedin=test%20value/https://github.com/gitpod-io/gitpod-test-repo",
20
+ context: {},
21
+ } as WsContextUrl);
22
+ expect(actual?.host).to.equal("github.com");
23
+ expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
24
+ }
25
+
26
+ @test public parseContextUrl_withEnvVar_withoutSchema() {
27
+ const actual = ContextURL.getNormalizedURL({
28
+ contextURL: "passedin=test%20value/github.com/gitpod-io/gitpod-test-repo",
29
+ context: {},
30
+ } as WsContextUrl);
31
+ expect(actual?.host).to.equal("github.com");
32
+ expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
33
+ }
34
+
35
+ @test public parseContextUrl_withEnvVar_sshUrl() {
36
+ const actual = ContextURL.getNormalizedURL({
37
+ contextURL: "passedin=test%20value/git@github.com:gitpod-io/gitpod-test-repo.git",
38
+ context: {},
39
+ } as WsContextUrl);
40
+ expect(actual?.host).to.equal("github.com");
41
+ expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo.git");
42
+ }
43
+
44
+ @test public parseContextUrl_withPrebuild() {
45
+ const actual = ContextURL.getNormalizedURL({
46
+ contextURL: "prebuild/https://github.com/gitpod-io/gitpod-test-repo",
47
+ context: {},
48
+ } as WsContextUrl);
49
+ expect(actual?.host).to.equal("github.com");
50
+ expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
51
+ }
52
+
53
+ @test public parseContextUrl_withPrebuild_withoutSchema() {
54
+ const actual = ContextURL.getNormalizedURL({
55
+ contextURL: "prebuild/github.com/gitpod-io/gitpod-test-repo",
56
+ context: {},
57
+ } as WsContextUrl);
58
+ expect(actual?.host).to.equal("github.com");
59
+ expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
60
+ }
61
+
62
+ @test public parseContextUrl_badUrl() {
63
+ const actual = ContextURL.getNormalizedURL({ contextURL: "[Object object]", context: {} } as WsContextUrl);
64
+ expect(actual).to.be.undefined;
65
+ }
66
+ }
67
+ module.exports = new ContextUrlTest();
@@ -0,0 +1,109 @@
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 (
93
+ firstSegment === PREBUILD_PREFIX ||
94
+ firstSegment === INCREMENTAL_PREBUILD_PREFIX ||
95
+ firstSegment === IMAGEBUILD_PREFIX ||
96
+ firstSegment === SNAPSHOT_PREFIX ||
97
+ firstSegment.startsWith(REFERRER_PREFIX)
98
+ ) {
99
+ return segmentsToURL(1);
100
+ }
101
+
102
+ // check for env vars
103
+ if (firstSegment.indexOf("=") !== -1) {
104
+ return segmentsToURL(1);
105
+ }
106
+
107
+ return segmentsToURL(0);
108
+ }
109
+ }
@@ -4,11 +4,9 @@
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
- export type EMailState = "scheduledInternal"
11
- | "scheduledSendgrid";
9
+ export type EMailState = "scheduledInternal" | "scheduledSendgrid";
12
10
 
13
11
  export interface EMailStatus {
14
12
  /** The time the email entry was inserted into the DB */
@@ -59,9 +57,9 @@ export type EMail = {
59
57
  } & EMailStatus;
60
58
 
61
59
  export namespace EMail {
62
- export const create = (ts: Without<EMail, 'uid'>): EMail => {
60
+ export const create = (ts: Omit<EMail, "uid">): EMail => {
63
61
  const withId = ts as EMail;
64
62
  withId.uid = uuidv4();
65
63
  return withId;
66
- }
67
- }
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
+ };