@gitpod/gitpod-protocol 0.1.5-server-vscode-oauth2.11 → 0.1.5-server-vscode-oauth2.25

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 (319) hide show
  1. package/data/gitpod-schema.json +49 -4
  2. package/lib/accounting-protocol.d.ts +10 -11
  3. package/lib/accounting-protocol.d.ts.map +1 -1
  4. package/lib/accounting-protocol.js +26 -36
  5. package/lib/accounting-protocol.js.map +1 -1
  6. package/lib/admin-protocol.d.ts +12 -0
  7. package/lib/admin-protocol.d.ts.map +1 -1
  8. package/lib/admin-protocol.js.map +1 -1
  9. package/lib/analytics.d.ts +4 -4
  10. package/lib/analytics.d.ts.map +1 -1
  11. package/lib/analytics.js.map +1 -1
  12. package/lib/auth.d.ts.map +1 -1
  13. package/lib/context-url.d.ts +18 -5
  14. package/lib/context-url.d.ts.map +1 -1
  15. package/lib/context-url.js +59 -6
  16. package/lib/context-url.js.map +1 -1
  17. package/lib/context-url.spec.d.ts +2 -0
  18. package/lib/context-url.spec.d.ts.map +1 -1
  19. package/lib/context-url.spec.js +40 -4
  20. package/lib/context-url.spec.js.map +1 -1
  21. package/lib/email-protocol.d.ts +1 -1
  22. package/lib/email-protocol.d.ts.map +1 -1
  23. package/lib/email-protocol.js +2 -2
  24. package/lib/email-protocol.js.map +1 -1
  25. package/lib/encryption/container-module.d.ts.map +1 -1
  26. package/lib/encryption/container-module.js +1 -1
  27. package/lib/encryption/container-module.js.map +1 -1
  28. package/lib/encryption/encryption-engine.d.ts.map +1 -1
  29. package/lib/encryption/encryption-engine.js +8 -8
  30. package/lib/encryption/encryption-engine.js.map +1 -1
  31. package/lib/encryption/encryption-engine.spec.d.ts.map +1 -1
  32. package/lib/encryption/encryption-engine.spec.js +2 -3
  33. package/lib/encryption/encryption-engine.spec.js.map +1 -1
  34. package/lib/encryption/encryption-service.d.ts.map +1 -1
  35. package/lib/encryption/encryption-service.js +4 -4
  36. package/lib/encryption/encryption-service.js.map +1 -1
  37. package/lib/encryption/key-provider.d.ts.map +1 -1
  38. package/lib/encryption/key-provider.js +9 -11
  39. package/lib/encryption/key-provider.js.map +1 -1
  40. package/lib/env.d.ts +1 -1
  41. package/lib/env.d.ts.map +1 -1
  42. package/lib/env.js +6 -6
  43. package/lib/env.js.map +1 -1
  44. package/lib/gitpod-file-parser.d.ts.map +1 -1
  45. package/lib/gitpod-file-parser.js +7 -7
  46. package/lib/gitpod-file-parser.js.map +1 -1
  47. package/lib/gitpod-file-parser.spec.js +42 -39
  48. package/lib/gitpod-file-parser.spec.js.map +1 -1
  49. package/lib/gitpod-service.d.ts +57 -31
  50. package/lib/gitpod-service.d.ts.map +1 -1
  51. package/lib/gitpod-service.js +26 -27
  52. package/lib/gitpod-service.js.map +1 -1
  53. package/lib/headless-workspace-log.d.ts +1 -0
  54. package/lib/headless-workspace-log.d.ts.map +1 -1
  55. package/lib/headless-workspace-log.js +2 -1
  56. package/lib/headless-workspace-log.js.map +1 -1
  57. package/lib/ide-frontend-service.d.ts +1 -1
  58. package/lib/ide-protocol.d.ts +105 -0
  59. package/lib/ide-protocol.d.ts.map +1 -0
  60. package/lib/ide-protocol.js +8 -0
  61. package/lib/ide-protocol.js.map +1 -0
  62. package/lib/index.d.ts +16 -13
  63. package/lib/index.d.ts.map +1 -1
  64. package/lib/index.js +3 -0
  65. package/lib/index.js.map +1 -1
  66. package/lib/installation-admin-protocol.d.ts +27 -0
  67. package/lib/installation-admin-protocol.d.ts.map +1 -0
  68. package/lib/installation-admin-protocol.js +30 -0
  69. package/lib/installation-admin-protocol.js.map +1 -0
  70. package/lib/license-protocol.d.ts.map +1 -1
  71. package/lib/license-protocol.js.map +1 -1
  72. package/lib/messaging/browser/connection.d.ts +1 -1
  73. package/lib/messaging/browser/connection.d.ts.map +1 -1
  74. package/lib/messaging/browser/connection.js +21 -21
  75. package/lib/messaging/browser/connection.js.map +1 -1
  76. package/lib/messaging/browser/window-connection.d.ts +4 -4
  77. package/lib/messaging/browser/window-connection.d.ts.map +1 -1
  78. package/lib/messaging/browser/window-connection.js +10 -7
  79. package/lib/messaging/browser/window-connection.js.map +1 -1
  80. package/lib/messaging/client-call-metrics.d.ts +2 -2
  81. package/lib/messaging/client-call-metrics.d.ts.map +1 -1
  82. package/lib/messaging/client-call-metrics.js +21 -21
  83. package/lib/messaging/client-call-metrics.js.map +1 -1
  84. package/lib/messaging/error.d.ts +2 -1
  85. package/lib/messaging/error.d.ts.map +1 -1
  86. package/lib/messaging/error.js +4 -2
  87. package/lib/messaging/error.js.map +1 -1
  88. package/lib/messaging/handler.d.ts.map +1 -1
  89. package/lib/messaging/handler.js +1 -1
  90. package/lib/messaging/node/connection.d.ts +1 -17
  91. package/lib/messaging/node/connection.d.ts.map +1 -1
  92. package/lib/messaging/node/connection.js +23 -59
  93. package/lib/messaging/node/connection.js.map +1 -1
  94. package/lib/messaging/proxy-factory.d.ts +1 -1
  95. package/lib/messaging/proxy-factory.d.ts.map +1 -1
  96. package/lib/messaging/proxy-factory.js +7 -9
  97. package/lib/messaging/proxy-factory.js.map +1 -1
  98. package/lib/oss-allowlist.d.ts +14 -0
  99. package/lib/oss-allowlist.d.ts.map +1 -0
  100. package/lib/oss-allowlist.js +8 -0
  101. package/lib/oss-allowlist.js.map +1 -0
  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 +9 -3
  106. package/lib/permission.d.ts.map +1 -1
  107. package/lib/permission.js +34 -25
  108. package/lib/permission.js.map +1 -1
  109. package/lib/plans.d.ts +4 -4
  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 -78
  114. package/lib/protocol.d.ts.map +1 -1
  115. package/lib/protocol.js +96 -85
  116. package/lib/protocol.js.map +1 -1
  117. package/lib/snapshot-url.d.ts +14 -0
  118. package/lib/snapshot-url.d.ts.map +1 -0
  119. package/lib/snapshot-url.js +26 -0
  120. package/lib/snapshot-url.js.map +1 -0
  121. package/{src/theia-plugins.ts → lib/snapshot-url.spec.d.ts} +2 -6
  122. package/lib/snapshot-url.spec.d.ts.map +1 -0
  123. package/lib/snapshot-url.spec.js +41 -0
  124. package/lib/snapshot-url.spec.js.map +1 -0
  125. package/lib/team-subscription-protocol.d.ts +5 -3
  126. package/lib/team-subscription-protocol.d.ts.map +1 -1
  127. package/lib/team-subscription-protocol.js +7 -7
  128. package/lib/team-subscription-protocol.js.map +1 -1
  129. package/lib/teams-projects-protocol.d.ts +13 -2
  130. package/lib/teams-projects-protocol.d.ts.map +1 -1
  131. package/lib/teams-projects-protocol.js +10 -3
  132. package/lib/teams-projects-protocol.js.map +1 -1
  133. package/lib/typings/globals.d.ts +2 -2
  134. package/lib/typings/globals.d.ts.map +1 -1
  135. package/lib/util/analytics.d.ts.map +1 -1
  136. package/lib/util/analytics.js +12 -3
  137. package/lib/util/analytics.js.map +1 -1
  138. package/lib/util/async-iterator.d.ts.map +1 -1
  139. package/lib/util/async-iterator.js +3 -3
  140. package/lib/util/async-iterator.js.map +1 -1
  141. package/lib/util/cancelable.js.map +1 -1
  142. package/lib/util/date-time.js +6 -6
  143. package/lib/util/date-time.js.map +1 -1
  144. package/lib/util/deferred.js.map +1 -1
  145. package/lib/util/disposable.d.ts.map +1 -1
  146. package/lib/util/disposable.js +2 -2
  147. package/lib/util/disposable.js.map +1 -1
  148. package/lib/util/event.d.ts.map +1 -1
  149. package/lib/util/event.js +5 -3
  150. package/lib/util/event.js.map +1 -1
  151. package/lib/util/garbage-collected-cache.d.ts +1 -0
  152. package/lib/util/garbage-collected-cache.d.ts.map +1 -1
  153. package/lib/util/garbage-collected-cache.js +6 -2
  154. package/lib/util/garbage-collected-cache.js.map +1 -1
  155. package/lib/util/generate-workspace-id.d.ts +1 -1
  156. package/lib/util/generate-workspace-id.d.ts.map +1 -1
  157. package/lib/util/generate-workspace-id.js +452 -435
  158. package/lib/util/generate-workspace-id.js.map +1 -1
  159. package/lib/util/generate-workspace-id.spec.js +29 -1
  160. package/lib/util/generate-workspace-id.spec.js.map +1 -1
  161. package/lib/util/gitpod-cookie.d.ts +1 -1
  162. package/lib/util/gitpod-cookie.d.ts.map +1 -1
  163. package/lib/util/gitpod-cookie.js +1 -4
  164. package/lib/util/gitpod-cookie.js.map +1 -1
  165. package/lib/util/gitpod-host-url.d.ts +1 -1
  166. package/lib/util/gitpod-host-url.d.ts.map +1 -1
  167. package/lib/util/gitpod-host-url.js +35 -33
  168. package/lib/util/gitpod-host-url.js.map +1 -1
  169. package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
  170. package/lib/util/gitpod-host-url.spec.js +15 -5
  171. package/lib/util/gitpod-host-url.spec.js.map +1 -1
  172. package/lib/util/grpc.d.ts.map +1 -1
  173. package/lib/util/grpc.js.map +1 -1
  174. package/lib/util/jaeger-client-types.d.ts +68 -0
  175. package/lib/util/jaeger-client-types.d.ts.map +1 -0
  176. package/lib/{theia-plugins.js → util/jaeger-client-types.js} +1 -1
  177. package/lib/util/jaeger-client-types.js.map +1 -0
  178. package/lib/util/logging.d.ts +33 -33
  179. package/lib/util/logging.d.ts.map +1 -1
  180. package/lib/util/logging.js +22 -23
  181. package/lib/util/logging.js.map +1 -1
  182. package/lib/util/make-link.js +5 -5
  183. package/lib/util/make-link.js.map +1 -1
  184. package/lib/util/parse-workspace-id.d.ts.map +1 -1
  185. package/lib/util/parse-workspace-id.js +2 -3
  186. package/lib/util/parse-workspace-id.js.map +1 -1
  187. package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
  188. package/lib/util/parse-workspace-id.spec.js +12 -12
  189. package/lib/util/parse-workspace-id.spec.js.map +1 -1
  190. package/lib/util/queue.spec.js +13 -10
  191. package/lib/util/queue.spec.js.map +1 -1
  192. package/lib/util/repeat.d.ts +15 -0
  193. package/lib/util/repeat.d.ts.map +1 -0
  194. package/lib/util/repeat.js +55 -0
  195. package/lib/util/repeat.js.map +1 -0
  196. package/lib/util/semaphore.d.ts.map +1 -1
  197. package/lib/util/semaphore.js.map +1 -1
  198. package/lib/util/skip-if.d.ts.map +1 -1
  199. package/lib/util/skip-if.js.map +1 -1
  200. package/lib/util/timeutil.d.ts.map +1 -1
  201. package/lib/util/timeutil.js +8 -8
  202. package/lib/util/timeutil.js.map +1 -1
  203. package/lib/util/timeutil.spec.d.ts.map +1 -1
  204. package/lib/util/timeutil.spec.js +2 -2
  205. package/lib/util/timeutil.spec.js.map +1 -1
  206. package/lib/util/tracing.d.ts +52 -6
  207. package/lib/util/tracing.d.ts.map +1 -1
  208. package/lib/util/tracing.js +161 -22
  209. package/lib/util/tracing.js.map +1 -1
  210. package/lib/util/tracing.spec.d.ts +7 -0
  211. package/lib/util/tracing.spec.d.ts.map +1 -0
  212. package/lib/util/tracing.spec.js +121 -0
  213. package/lib/util/tracing.spec.js.map +1 -0
  214. package/lib/util/workspace-port-authentication.d.ts +7 -7
  215. package/lib/util/workspace-port-authentication.d.ts.map +1 -1
  216. package/lib/util/workspace-port-authentication.js +8 -11
  217. package/lib/util/workspace-port-authentication.js.map +1 -1
  218. package/lib/workspace-cluster.d.ts +10 -8
  219. package/lib/workspace-cluster.d.ts.map +1 -1
  220. package/lib/workspace-cluster.js +17 -2
  221. package/lib/workspace-cluster.js.map +1 -1
  222. package/lib/workspace-instance.d.ts +23 -4
  223. package/lib/workspace-instance.d.ts.map +1 -1
  224. package/lib/wsready.d.ts +1 -1
  225. package/lib/wsready.d.ts.map +1 -1
  226. package/lib/wsready.js +2 -2
  227. package/package.json +21 -14
  228. package/pkg-yarn.lock +12 -8
  229. package/provenance-bundle.jsonl +2 -0
  230. package/src/accounting-protocol.ts +53 -53
  231. package/src/admin-protocol.ts +35 -18
  232. package/src/analytics.ts +27 -27
  233. package/src/auth.ts +2 -2
  234. package/src/context-url.spec.ts +37 -9
  235. package/src/context-url.ts +94 -36
  236. package/src/email-protocol.ts +5 -6
  237. package/src/encryption/container-module.ts +2 -3
  238. package/src/encryption/encryption-engine.spec.ts +9 -8
  239. package/src/encryption/encryption-engine.ts +14 -14
  240. package/src/encryption/encryption-service.ts +4 -5
  241. package/src/encryption/key-provider.ts +16 -19
  242. package/src/env.ts +9 -9
  243. package/src/gitpod-file-parser.spec.ts +55 -61
  244. package/src/gitpod-file-parser.ts +16 -17
  245. package/src/gitpod-service.ts +167 -113
  246. package/src/headless-workspace-log.ts +6 -4
  247. package/src/ide-frontend-service.ts +2 -2
  248. package/src/ide-protocol.ts +119 -0
  249. package/src/index.ts +16 -13
  250. package/src/installation-admin-protocol.ts +42 -0
  251. package/src/license-protocol.ts +5 -6
  252. package/src/messaging/browser/connection.ts +45 -47
  253. package/src/messaging/browser/window-connection.ts +39 -29
  254. package/src/messaging/client-call-metrics.ts +70 -71
  255. package/src/messaging/error.ts +6 -5
  256. package/src/messaging/handler.ts +6 -6
  257. package/src/messaging/node/connection.ts +23 -70
  258. package/src/messaging/proxy-factory.ts +23 -30
  259. package/src/oss-allowlist.ts +15 -0
  260. package/src/payment-protocol.ts +2 -2
  261. package/src/permission.ts +40 -32
  262. package/src/plans.ts +236 -189
  263. package/src/protocol.ts +280 -277
  264. package/src/snapshot-url.spec.ts +27 -0
  265. package/src/snapshot-url.ts +27 -0
  266. package/src/team-subscription-protocol.ts +33 -23
  267. package/src/teams-projects-protocol.ts +24 -8
  268. package/src/typings/globals.ts +4 -4
  269. package/src/util/analytics.ts +46 -24
  270. package/src/util/async-iterator.ts +4 -5
  271. package/src/util/cancelable.ts +3 -3
  272. package/src/util/date-time.ts +8 -8
  273. package/src/util/deferred.ts +6 -6
  274. package/src/util/disposable.ts +3 -6
  275. package/src/util/event.ts +9 -11
  276. package/src/util/garbage-collected-cache.ts +9 -6
  277. package/src/util/generate-workspace-id.spec.ts +26 -6
  278. package/src/util/generate-workspace-id.ts +458 -440
  279. package/src/util/gitpod-cookie.ts +8 -9
  280. package/src/util/gitpod-host-url.spec.ts +40 -13
  281. package/src/util/gitpod-host-url.ts +41 -38
  282. package/src/util/grpc.ts +1 -1
  283. package/src/util/jaeger-client-types.ts +102 -0
  284. package/src/util/logging.ts +81 -71
  285. package/src/util/make-link.ts +6 -7
  286. package/src/util/parse-workspace-id.spec.ts +17 -8
  287. package/src/util/parse-workspace-id.ts +6 -7
  288. package/src/util/queue.spec.ts +27 -25
  289. package/src/util/repeat.ts +45 -0
  290. package/src/util/semaphore.ts +4 -6
  291. package/src/util/skip-if.ts +9 -6
  292. package/src/util/timeutil.spec.ts +14 -15
  293. package/src/util/timeutil.ts +15 -11
  294. package/src/util/tracing.spec.ts +88 -0
  295. package/src/util/tracing.ts +202 -31
  296. package/src/util/workspace-port-authentication.ts +10 -13
  297. package/src/workspace-cluster.ts +26 -15
  298. package/src/workspace-instance.ts +48 -24
  299. package/src/wsready.ts +3 -3
  300. package/data/builtin-theia-plugins.json +0 -372
  301. package/lib/messaging/connection-error-handler.d.ts +0 -27
  302. package/lib/messaging/connection-error-handler.d.ts.map +0 -1
  303. package/lib/messaging/connection-error-handler.js +0 -34
  304. package/lib/messaging/connection-error-handler.js.map +0 -1
  305. package/lib/theia-plugins.d.ts +0 -11
  306. package/lib/theia-plugins.d.ts.map +0 -1
  307. package/lib/theia-plugins.js.map +0 -1
  308. package/lib/util/repeater.d.ts +0 -22
  309. package/lib/util/repeater.d.ts.map +0 -1
  310. package/lib/util/repeater.js +0 -65
  311. package/lib/util/repeater.js.map +0 -1
  312. package/lib/util/safe-promise.d.ts +0 -11
  313. package/lib/util/safe-promise.d.ts.map +0 -1
  314. package/lib/util/safe-promise.js +0 -31
  315. package/lib/util/safe-promise.js.map +0 -1
  316. package/src/messaging/connection-error-handler.ts +0 -62
  317. package/src/util/jaeger-client.d.ts +0 -105
  318. package/src/util/repeater.ts +0 -49
  319. package/src/util/safe-promise.ts +0 -26
@@ -4,9 +4,9 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- import * as uuidv4 from 'uuid/v4';
8
- import { User } from './protocol';
9
- import { oneMonthLater } from './util/timeutil';
7
+ import { v4 as uuidv4 } from "uuid";
8
+ import { User } from "./protocol";
9
+ import { oneMonthLater } from "./util/timeutil";
10
10
 
11
11
  /*
12
12
  * Subscription and acocunting data
@@ -33,7 +33,7 @@ export interface AccountEntry {
33
33
  /**
34
34
  * credit: end of validity
35
35
  */
36
- expiryDate?: string; // exclusive
36
+ expiryDate?: string; // exclusive
37
37
 
38
38
  kind: AccountEntryKind;
39
39
 
@@ -46,26 +46,26 @@ export interface AccountEntry {
46
46
  description?: object;
47
47
  }
48
48
  export namespace AccountEntry {
49
- export function create<T extends AccountEntry>(entry: Omit<T, 'uid'>): T {
49
+ export function create<T extends AccountEntry>(entry: Omit<T, "uid">): T {
50
50
  const result = entry as T;
51
51
  result.uid = uuidv4();
52
52
  return result;
53
- };
53
+ }
54
54
  }
55
55
 
56
- export type DebitAccountEntryKind = 'session' | 'expiry' | 'loss';
57
- export type AccountEntryKind = 'credit' | DebitAccountEntryKind | 'carry' | 'open';
56
+ export type DebitAccountEntryKind = "session" | "expiry" | "loss";
57
+ export type AccountEntryKind = "credit" | DebitAccountEntryKind | "carry" | "open";
58
58
 
59
59
  export interface Credit extends AccountEntry {
60
- kind: 'credit';
60
+ kind: "credit";
61
61
  expiryDate: string;
62
62
  }
63
63
  export type Debit = LossDebit | ExpiryDebit | SessionDebit;
64
64
  export interface LossDebit extends AccountEntry {
65
- kind: 'loss';
65
+ kind: "loss";
66
66
  }
67
67
  export interface ExpiryDebit extends AccountEntry {
68
- kind: 'expiry';
68
+ kind: "expiry";
69
69
  creditId: undefined;
70
70
  }
71
71
  export interface SessionDebit extends AccountEntry {
@@ -80,9 +80,7 @@ export interface CreditDescription {
80
80
  }
81
81
  export namespace CreditDescription {
82
82
  export function is(obj: any): obj is CreditDescription {
83
- return !!obj
84
- && obj.hasOwnProperty('subscriptionId')
85
- && obj.hasOwnProperty('planId');
83
+ return !!obj && obj.hasOwnProperty("subscriptionId") && obj.hasOwnProperty("planId");
86
84
  }
87
85
  }
88
86
  export interface SessionDescription {
@@ -90,16 +88,16 @@ export interface SessionDescription {
90
88
  contextUrl: string;
91
89
  workspaceId: string;
92
90
  workspaceInstanceId: string;
93
- private: boolean;
94
91
  }
95
92
  export namespace SessionDescription {
96
93
  export function is(obj: any): obj is SessionDescription {
97
- return !!obj
98
- && obj.hasOwnProperty('contextTitle')
99
- && obj.hasOwnProperty('contextUrl')
100
- && obj.hasOwnProperty('workspaceId')
101
- && obj.hasOwnProperty('workspaceInstanceId')
102
- && obj.hasOwnProperty('private');
94
+ return (
95
+ !!obj &&
96
+ obj.hasOwnProperty("contextTitle") &&
97
+ obj.hasOwnProperty("contextUrl") &&
98
+ obj.hasOwnProperty("workspaceId") &&
99
+ obj.hasOwnProperty("workspaceInstanceId")
100
+ );
103
101
  }
104
102
  }
105
103
 
@@ -113,11 +111,11 @@ export namespace SessionDescription {
113
111
  export interface Subscription {
114
112
  uid: string;
115
113
  userId: string;
116
- startDate: string; // inclusive
114
+ startDate: string; // inclusive
117
115
  /** When the subscription will end (must be >= cancellationDate!) */
118
- endDate?: string; // exclusive
116
+ endDate?: string; // exclusive
119
117
  /** When the subscription was cancelled */
120
- cancellationDate?: string; // exclusive
118
+ cancellationDate?: string; // exclusive
121
119
  /** Number of granted hours */
122
120
  amount: number;
123
121
  /** Number of granted hours for the first month: If this is set, use this value for the first month */
@@ -147,8 +145,7 @@ export interface UserPaidSubscription extends Subscription {
147
145
  }
148
146
  export namespace UserPaidSubscription {
149
147
  export function is(data: any): data is UserPaidSubscription {
150
- return !!data
151
- && data.hasOwnProperty('paymentReference');
148
+ return !!data && data.hasOwnProperty("paymentReference");
152
149
  }
153
150
  }
154
151
 
@@ -157,41 +154,44 @@ export interface AssignedTeamSubscription extends Subscription {
157
154
  }
158
155
  export namespace AssignedTeamSubscription {
159
156
  export function is(data: any): data is AssignedTeamSubscription {
160
- return !!data
161
- && data.hasOwnProperty('teamSubscriptionSlotId');
157
+ return !!data && data.hasOwnProperty("teamSubscriptionSlotId");
162
158
  }
163
159
  }
164
160
 
165
161
  export namespace Subscription {
166
- export function create(newSubscription: Omit<Subscription, 'uid'>) {
162
+ export function create(newSubscription: Omit<Subscription, "uid">) {
167
163
  const subscription = newSubscription as Subscription;
168
164
  subscription.uid = uuidv4();
169
165
  return subscription;
170
- };
166
+ }
171
167
  export function cancelSubscription(s: Subscription, cancellationDate: string, endDate?: string) {
172
168
  s.endDate = endDate || cancellationDate;
173
169
  s.cancellationDate = cancellationDate;
174
- };
170
+ }
175
171
  export function isSame(s1: Subscription | undefined, s2: Subscription | undefined): boolean {
176
- return !!s1 && !!s2
177
- && s1.userId === s2.userId
178
- && s1.planId === s2.planId
179
- && s1.startDate === s2.startDate
180
- && s1.endDate === s2.endDate
181
- && s1.amount === s2.amount
182
- && s1.cancellationDate === s2.cancellationDate
183
- && s1.deleted === s2.deleted
184
- && ((s1.paymentData === undefined && s2.paymentData === undefined)
185
- || (!!s1.paymentData && !!s2.paymentData
186
- && s1.paymentData.downgradeDate === s2.paymentData.downgradeDate
187
- && s1.paymentData.newPlan === s2.paymentData.newPlan));
188
- };
172
+ return (
173
+ !!s1 &&
174
+ !!s2 &&
175
+ s1.userId === s2.userId &&
176
+ s1.planId === s2.planId &&
177
+ s1.startDate === s2.startDate &&
178
+ s1.endDate === s2.endDate &&
179
+ s1.amount === s2.amount &&
180
+ s1.cancellationDate === s2.cancellationDate &&
181
+ s1.deleted === s2.deleted &&
182
+ ((s1.paymentData === undefined && s2.paymentData === undefined) ||
183
+ (!!s1.paymentData &&
184
+ !!s2.paymentData &&
185
+ s1.paymentData.downgradeDate === s2.paymentData.downgradeDate &&
186
+ s1.paymentData.newPlan === s2.paymentData.newPlan))
187
+ );
188
+ }
189
189
  export function isActive(s: Subscription, date: string): boolean {
190
190
  return s.startDate <= date && (s.endDate === undefined || date < s.endDate);
191
- };
191
+ }
192
192
  export function isDowngraded(s: Subscription) {
193
193
  return s.paymentData && s.paymentData.downgradeDate;
194
- };
194
+ }
195
195
  export function calculateCurrentPeriod(startDate: string, now: Date) {
196
196
  let nextStartDate = startDate;
197
197
  do {
@@ -199,19 +199,19 @@ export namespace Subscription {
199
199
  nextStartDate = oneMonthLater(startDate, new Date(startDate).getDate());
200
200
  } while (nextStartDate < now.toISOString());
201
201
  return { startDate, endDate: nextStartDate };
202
- };
202
+ }
203
203
  }
204
204
 
205
205
  export type MaybeSubscription = Subscription | undefined;
206
206
 
207
207
  export interface Period {
208
- startDate: string; // inclusive
209
- endDate: string; // exclusive
208
+ startDate: string; // inclusive
209
+ endDate: string; // exclusive
210
210
  }
211
211
 
212
212
  export type MaybePeriod = Period | undefined;
213
213
 
214
- export type AccountEntryFixedPeriod = Omit<AccountEntry, 'uid'> & { expiryDate: string };
214
+ export type AccountEntryFixedPeriod = Omit<AccountEntry, "uid"> & { expiryDate: string };
215
215
  export interface AccountStatement extends Period {
216
216
  userId: string;
217
217
  /**
@@ -223,9 +223,9 @@ export interface AccountStatement extends Period {
223
223
  /** Remaining valid hours (accumulated from credits) */
224
224
  remainingHours: RemainingHours;
225
225
  }
226
- export type RemainingHours = number | 'unlimited';
226
+ export type RemainingHours = number | "unlimited";
227
227
 
228
228
  export interface CreditAlert {
229
- userId: string,
230
- remainingUsageHours: number
229
+ userId: string;
230
+ remainingUsageHours: number;
231
231
  }
@@ -5,9 +5,12 @@
5
5
  */
6
6
 
7
7
  import { User, Workspace, NamedWorkspaceFeatureFlag } from "./protocol";
8
+ import { FindPrebuildsParams } from "./gitpod-service";
9
+ import { Project, Team, PrebuildWithStatus, TeamMemberInfo, TeamMemberRole } from "./teams-projects-protocol";
8
10
  import { WorkspaceInstance, WorkspaceInstancePhase } from "./workspace-instance";
9
11
  import { RoleOrPermission } from "./permission";
10
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,11 +20,20 @@ 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>;
23
31
  adminRestoreSoftDeletedWorkspace(id: string): Promise<void>;
24
32
 
33
+ adminGetProjectsBySearchTerm(req: AdminGetListRequest<Project>): Promise<AdminGetListResult<Project>>;
34
+ adminGetProjectById(id: string): Promise<Project | undefined>;
35
+
36
+ adminFindPrebuilds(params: FindPrebuildsParams): Promise<PrebuildWithStatus[]>;
25
37
  adminSetLicense(key: string): Promise<void>;
26
38
 
27
39
  adminGetAccountStatement(userId: string): Promise<AccountStatement>;
@@ -29,43 +41,48 @@ export interface AdminServer {
29
41
  adminIsStudent(userId: string): Promise<boolean>;
30
42
  adminAddStudentEmailDomain(userId: string, domain: string): Promise<void>;
31
43
  adminGrantExtraHours(userId: string, extraHours: number): Promise<void>;
44
+
45
+ adminGetSettings(): Promise<InstallationAdminSettings>;
46
+ adminUpdateSettings(settings: InstallationAdminSettings): Promise<void>;
32
47
  }
33
48
 
34
49
  export interface AdminGetListRequest<T> {
35
- offset: number
36
- limit: number
37
- orderBy: keyof T
38
- orderDir: "asc" | "desc"
50
+ offset: number;
51
+ limit: number;
52
+ orderBy: keyof T;
53
+ orderDir: "asc" | "desc";
39
54
  searchTerm?: string;
40
55
  }
41
56
 
42
57
  export interface AdminGetListResult<T> {
43
- total: number
44
- rows: T[]
58
+ total: number;
59
+ rows: T[];
45
60
  }
46
61
 
47
62
  export interface AdminBlockUserRequest {
48
- id: string
49
- blocked: boolean
63
+ id: string;
64
+ blocked: boolean;
50
65
  }
51
66
 
52
67
  export interface AdminModifyRoleOrPermissionRequest {
53
68
  id: string;
54
69
  rpp: {
55
- r: RoleOrPermission
56
- add: boolean
57
- }[]
70
+ r: RoleOrPermission;
71
+ add: boolean;
72
+ }[];
58
73
  }
59
74
 
60
75
  export interface AdminModifyPermanentWorkspaceFeatureFlagRequest {
61
76
  id: string;
62
77
  changes: {
63
- featureFlag: NamedWorkspaceFeatureFlag
64
- add: boolean
65
- }[]
78
+ featureFlag: NamedWorkspaceFeatureFlag;
79
+ add: boolean;
80
+ }[];
66
81
  }
67
82
 
68
- export interface WorkspaceAndInstance extends Omit<Workspace, "id"|"creationTime">, Omit<WorkspaceInstance, "id"|"creationTime"> {
83
+ export interface WorkspaceAndInstance
84
+ extends Omit<Workspace, "id" | "creationTime">,
85
+ Omit<WorkspaceInstance, "id" | "creationTime"> {
69
86
  workspaceId: string;
70
87
  workspaceCreationTime: string;
71
88
  instanceId: string;
@@ -78,7 +95,7 @@ export namespace WorkspaceAndInstance {
78
95
  return {
79
96
  id: wai.workspaceId,
80
97
  creationTime: wai.workspaceCreationTime,
81
- ... wai
98
+ ...wai,
82
99
  };
83
100
  }
84
101
 
@@ -89,7 +106,7 @@ export namespace WorkspaceAndInstance {
89
106
  return {
90
107
  id: wai.instanceId,
91
108
  creationTime: wai.instanceCreationTime,
92
- ... wai
109
+ ...wai,
93
110
  };
94
111
  }
95
112
  }
@@ -102,4 +119,4 @@ export type AdminGetWorkspacesQuery = {
102
119
  instanceId?: string;
103
120
  workspaceId?: string;
104
121
  ownerId?: string;
105
- };
122
+ };
package/src/analytics.ts CHANGED
@@ -4,49 +4,49 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
-
8
7
  export const IAnalyticsWriter = Symbol("IAnalyticsWriter");
9
8
 
10
9
  type Identity =
11
- | { userId: string | number }
10
+ | { userId: string | number; anonymousId?: string | number }
12
11
  | { userId?: string | number; anonymousId: string | number };
13
12
 
14
13
  interface Message {
15
14
  messageId?: string;
16
15
  }
17
16
 
18
- export type IdentifyMessage = Message & Identity & {
19
- traits?: any;
20
- timestamp?: Date;
21
- context?: any;
22
- };
23
-
24
- export type TrackMessage = Message & Identity & {
25
- event: string;
26
- properties?: any;
27
- timestamp?: Date;
28
- context?: any;
29
- };
30
-
31
- export type PageMessage = Message & Identity & {
32
- properties?: any;
33
- timestamp?: Date;
34
- context?: any;
35
- };
36
-
37
- export type RemoteTrackMessage = Omit<TrackMessage, "timestamp" | "userId" | "anonymousId"> & {
38
- anonymousId?: string | number;
39
- };
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
40
  export type RemotePageMessage = Omit<PageMessage, "timestamp" | "userId"> & {
41
- anonymousId?: string | number;
41
+ includePII?: boolean;
42
42
  };
43
43
 
44
- export interface IAnalyticsWriter {
44
+ export type RemoteIdentifyMessage = Omit<IdentifyMessage, "timestamp" | "userId">;
45
45
 
46
+ export interface IAnalyticsWriter {
46
47
  identify(msg: IdentifyMessage): void;
47
48
 
48
49
  track(msg: TrackMessage): void;
49
50
 
50
51
  page(msg: PageMessage): void;
51
-
52
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 {
@@ -4,36 +4,64 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- import * as chai from 'chai';
8
- import { suite, test } from 'mocha-typescript';
9
- import { ContextURL } from './context-url';
7
+ import * as chai from "chai";
8
+ import { suite, test } from "mocha-typescript";
9
+ import { Workspace } from ".";
10
+ import { ContextURL } from "./context-url";
10
11
  const expect = chai.expect;
11
12
 
13
+ type WsContextUrl = Pick<Workspace, "context" | "contextURL">;
14
+
12
15
  @suite
13
16
  export class ContextUrlTest {
14
-
15
17
  @test public parseContextUrl_withEnvVar() {
16
- const actual = ContextURL.parseToURL("passedin=test%20value/https://github.com/gitpod-io/gitpod-test-repo");
18
+ const actual = ContextURL.getNormalizedURL({
19
+ contextURL: "passedin=test%20value/https://github.com/gitpod-io/gitpod-test-repo",
20
+ context: {},
21
+ } as WsContextUrl);
17
22
  expect(actual?.host).to.equal("github.com");
18
23
  expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
19
24
  }
20
25
 
21
26
  @test public parseContextUrl_withEnvVar_withoutSchema() {
22
- const actual = ContextURL.parseToURL("passedin=test%20value/github.com/gitpod-io/gitpod-test-repo");
27
+ const actual = ContextURL.getNormalizedURL({
28
+ contextURL: "passedin=test%20value/github.com/gitpod-io/gitpod-test-repo",
29
+ context: {},
30
+ } as WsContextUrl);
23
31
  expect(actual?.host).to.equal("github.com");
24
32
  expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
25
33
  }
26
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
+
27
44
  @test public parseContextUrl_withPrebuild() {
28
- const actual = ContextURL.parseToURL("prebuild/https://github.com/gitpod-io/gitpod-test-repo");
45
+ const actual = ContextURL.getNormalizedURL({
46
+ contextURL: "prebuild/https://github.com/gitpod-io/gitpod-test-repo",
47
+ context: {},
48
+ } as WsContextUrl);
29
49
  expect(actual?.host).to.equal("github.com");
30
50
  expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
31
51
  }
32
52
 
33
53
  @test public parseContextUrl_withPrebuild_withoutSchema() {
34
- const actual = ContextURL.parseToURL("prebuild/github.com/gitpod-io/gitpod-test-repo");
54
+ const actual = ContextURL.getNormalizedURL({
55
+ contextURL: "prebuild/github.com/gitpod-io/gitpod-test-repo",
56
+ context: {},
57
+ } as WsContextUrl);
35
58
  expect(actual?.host).to.equal("github.com");
36
59
  expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
37
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
+ }
38
66
  }
39
- module.exports = new ContextUrlTest()
67
+ module.exports = new ContextUrlTest();
@@ -4,48 +4,106 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
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
+ */
7
17
  export namespace ContextURL {
8
- export const INCREMENTAL_PREBUILD_PREFIX = "incremental-prebuild";
9
- export const PREBUILD_PREFIX = "prebuild";
10
- export const IMAGEBUILD_PREFIX = "imagebuild";
11
-
12
- /**
13
- * The field "contextUrl" might contain prefixes like:
14
- * - envvar1=value1/...
15
- * - prebuild/...
16
- * This is the analogon to the (Prefix)ContextParser structure in "server".
17
- */
18
- export function parseToURL(contextUrl: string | undefined): URL | undefined {
19
- if (contextUrl === undefined) {
20
- return undefined;
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;
21
44
  }
22
45
 
23
- const segments = contextUrl.split("/");
24
- if (segments.length === 1) {
25
- return new URL(segments[0]); // this might be something, we just try
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;
26
62
  }
27
63
 
28
- const segmentsToURL = (offset: number): URL => {
29
- let rest = segments.slice(offset).join("/");
30
- if (!rest.startsWith("http")) {
31
- rest = 'https://' + rest;
32
- }
33
- return new URL(rest);
34
- };
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
+ }
35
74
 
75
+ const segments = contextUrl.split("/");
76
+ if (segments.length === 1) {
77
+ return segments[0]; // this might be something, we just try
78
+ }
36
79
 
37
- const firstSegment = segments[0];
38
- if (firstSegment === PREBUILD_PREFIX ||
39
- firstSegment === INCREMENTAL_PREBUILD_PREFIX ||
40
- firstSegment === IMAGEBUILD_PREFIX) {
41
- return segmentsToURL(1);
42
- }
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
+ };
43
90
 
44
- // check for env vars
45
- if (firstSegment.indexOf("=") !== -1) {
46
- return segmentsToURL(1);
47
- }
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
+ }
48
101
 
49
- return segmentsToURL(0);
50
- }
51
- }
102
+ // check for env vars
103
+ if (firstSegment.indexOf("=") !== -1) {
104
+ return segmentsToURL(1);
105
+ }
106
+
107
+ return segmentsToURL(0);
108
+ }
109
+ }