@gitpod/gitpod-protocol 0.1.5-wth-update-mysql-dependencies-2.30 → 0.1.5-wth-test.41

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 (250) hide show
  1. package/data/builtin-theia-plugins.json +9 -9
  2. package/data/gitpod-schema.json +8 -22
  3. package/lib/accounting-protocol.d.ts +155 -0
  4. package/lib/accounting-protocol.d.ts.map +1 -0
  5. package/lib/accounting-protocol.js +109 -0
  6. package/lib/accounting-protocol.js.map +1 -0
  7. package/lib/admin-protocol.d.ts +20 -4
  8. package/lib/admin-protocol.d.ts.map +1 -1
  9. package/lib/admin-protocol.js +15 -0
  10. package/lib/admin-protocol.js.map +1 -1
  11. package/lib/analytics.d.ts +45 -0
  12. package/lib/analytics.d.ts.map +1 -0
  13. package/lib/{util/without.js → analytics.js} +4 -2
  14. package/lib/analytics.js.map +1 -0
  15. package/lib/context-url.d.ts +18 -0
  16. package/lib/context-url.d.ts.map +1 -0
  17. package/lib/context-url.js +49 -0
  18. package/lib/context-url.js.map +1 -0
  19. package/lib/{util/context-url.spec.d.ts → context-url.spec.d.ts} +3 -1
  20. package/lib/context-url.spec.d.ts.map +1 -0
  21. package/lib/context-url.spec.js +73 -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.js +5 -4
  28. package/lib/encryption/container-module.js.map +1 -1
  29. package/lib/encryption/encryption-engine.js +19 -20
  30. package/lib/encryption/encryption-engine.js.map +1 -1
  31. package/lib/encryption/encryption-engine.spec.js +29 -36
  32. package/lib/encryption/encryption-engine.spec.js.map +1 -1
  33. package/lib/encryption/encryption-service.js +29 -43
  34. package/lib/encryption/encryption-service.js.map +1 -1
  35. package/lib/encryption/key-provider.js +25 -30
  36. package/lib/encryption/key-provider.js.map +1 -1
  37. package/lib/env.d.ts +1 -2
  38. package/lib/env.d.ts.map +1 -1
  39. package/lib/env.js +20 -21
  40. package/lib/env.js.map +1 -1
  41. package/lib/gitpod-file-parser.js +25 -41
  42. package/lib/gitpod-file-parser.js.map +1 -1
  43. package/lib/gitpod-file-parser.spec.js +116 -116
  44. package/lib/gitpod-file-parser.spec.js.map +1 -1
  45. package/lib/gitpod-service.d.ts +132 -18
  46. package/lib/gitpod-service.d.ts.map +1 -1
  47. package/lib/gitpod-service.js +168 -256
  48. package/lib/gitpod-service.js.map +1 -1
  49. package/lib/headless-workspace-log.d.ts +8 -11
  50. package/lib/headless-workspace-log.d.ts.map +1 -1
  51. package/lib/headless-workspace-log.js +4 -7
  52. package/lib/headless-workspace-log.js.map +1 -1
  53. package/lib/index.d.ts +4 -0
  54. package/lib/index.d.ts.map +1 -1
  55. package/lib/index.js +5 -1
  56. package/lib/index.js.map +1 -1
  57. package/lib/messaging/browser/connection.d.ts +5 -3
  58. package/lib/messaging/browser/connection.d.ts.map +1 -1
  59. package/lib/messaging/browser/connection.js +183 -33
  60. package/lib/messaging/browser/connection.js.map +1 -1
  61. package/lib/messaging/browser/window-connection.js +35 -55
  62. package/lib/messaging/browser/window-connection.js.map +1 -1
  63. package/lib/messaging/client-call-metrics.d.ts +35 -0
  64. package/lib/messaging/client-call-metrics.d.ts.map +1 -0
  65. package/lib/messaging/client-call-metrics.js +83 -0
  66. package/lib/messaging/client-call-metrics.js.map +1 -0
  67. package/lib/messaging/connection-error-handler.js +11 -23
  68. package/lib/messaging/connection-error-handler.js.map +1 -1
  69. package/lib/messaging/error.d.ts +3 -1
  70. package/lib/messaging/error.d.ts.map +1 -1
  71. package/lib/messaging/error.js +6 -2
  72. package/lib/messaging/error.js.map +1 -1
  73. package/lib/messaging/handler.d.ts +10 -0
  74. package/lib/messaging/handler.d.ts.map +1 -1
  75. package/lib/messaging/node/connection.js +22 -22
  76. package/lib/messaging/node/connection.js.map +1 -1
  77. package/lib/messaging/proxy-factory.d.ts +2 -0
  78. package/lib/messaging/proxy-factory.d.ts.map +1 -1
  79. package/lib/messaging/proxy-factory.js +74 -159
  80. package/lib/messaging/proxy-factory.js.map +1 -1
  81. package/lib/payment-protocol.d.ts +18 -0
  82. package/lib/payment-protocol.d.ts.map +1 -0
  83. package/lib/payment-protocol.js +13 -0
  84. package/lib/payment-protocol.js.map +1 -0
  85. package/lib/permission.d.ts +2 -1
  86. package/lib/permission.d.ts.map +1 -1
  87. package/lib/permission.js +14 -13
  88. package/lib/permission.js.map +1 -1
  89. package/lib/plans.d.ts +210 -0
  90. package/lib/plans.d.ts.map +1 -0
  91. package/lib/plans.js +570 -0
  92. package/lib/plans.js.map +1 -0
  93. package/lib/protocol.d.ts +94 -15
  94. package/lib/protocol.d.ts.map +1 -1
  95. package/lib/protocol.js +104 -130
  96. package/lib/protocol.js.map +1 -1
  97. package/lib/snapshot-url.d.ts +14 -0
  98. package/lib/snapshot-url.d.ts.map +1 -0
  99. package/lib/snapshot-url.js +26 -0
  100. package/lib/snapshot-url.js.map +1 -0
  101. package/{src/util/without.ts → lib/snapshot-url.spec.d.ts} +2 -3
  102. package/lib/snapshot-url.spec.d.ts.map +1 -0
  103. package/lib/snapshot-url.spec.js +41 -0
  104. package/lib/snapshot-url.spec.js.map +1 -0
  105. package/lib/team-subscription-protocol.d.ts +73 -0
  106. package/lib/team-subscription-protocol.d.ts.map +1 -0
  107. package/lib/team-subscription-protocol.js +63 -0
  108. package/lib/team-subscription-protocol.js.map +1 -0
  109. package/lib/teams-projects-protocol.d.ts +103 -0
  110. package/lib/teams-projects-protocol.d.ts.map +1 -0
  111. package/lib/teams-projects-protocol.js +23 -0
  112. package/lib/teams-projects-protocol.js.map +1 -0
  113. package/lib/util/analytics.d.ts +8 -0
  114. package/lib/util/analytics.d.ts.map +1 -0
  115. package/lib/util/analytics.js +79 -0
  116. package/lib/util/analytics.js.map +1 -0
  117. package/lib/util/async-iterator.js +55 -133
  118. package/lib/util/async-iterator.js.map +1 -1
  119. package/lib/util/cancelable.js +17 -59
  120. package/lib/util/cancelable.js.map +1 -1
  121. package/lib/util/date-time.js +8 -8
  122. package/lib/util/date-time.js.map +1 -1
  123. package/lib/util/deferred.js +10 -12
  124. package/lib/util/deferred.js.map +1 -1
  125. package/lib/util/disposable.js +26 -39
  126. package/lib/util/disposable.js.map +1 -1
  127. package/lib/util/event.js +58 -74
  128. package/lib/util/event.js.map +1 -1
  129. package/lib/util/garbage-collected-cache.js +22 -46
  130. package/lib/util/garbage-collected-cache.js.map +1 -1
  131. package/lib/util/generate-workspace-id.d.ts.map +1 -1
  132. package/lib/util/generate-workspace-id.js +13 -67
  133. package/lib/util/generate-workspace-id.js.map +1 -1
  134. package/lib/util/generate-workspace-id.spec.js +34 -79
  135. package/lib/util/generate-workspace-id.spec.js.map +1 -1
  136. package/lib/util/gitpod-cookie.d.ts +20 -0
  137. package/lib/util/gitpod-cookie.d.ts.map +1 -0
  138. package/lib/util/gitpod-cookie.js +44 -0
  139. package/lib/util/gitpod-cookie.js.map +1 -0
  140. package/lib/util/gitpod-host-url.d.ts +1 -1
  141. package/lib/util/gitpod-host-url.d.ts.map +1 -1
  142. package/lib/util/gitpod-host-url.js +98 -98
  143. package/lib/util/gitpod-host-url.js.map +1 -1
  144. package/lib/util/gitpod-host-url.spec.d.ts +7 -1
  145. package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
  146. package/lib/util/gitpod-host-url.spec.js +103 -31
  147. package/lib/util/gitpod-host-url.spec.js.map +1 -1
  148. package/lib/util/grpc.d.ts +15 -0
  149. package/lib/util/grpc.d.ts.map +1 -0
  150. package/lib/util/grpc.js +18 -0
  151. package/lib/util/grpc.js.map +1 -0
  152. package/lib/util/logging.d.ts +49 -33
  153. package/lib/util/logging.d.ts.map +1 -1
  154. package/lib/util/logging.js +107 -110
  155. package/lib/util/logging.js.map +1 -1
  156. package/lib/util/make-link.js +2 -2
  157. package/lib/util/make-link.js.map +1 -1
  158. package/lib/util/parse-workspace-id.d.ts +10 -0
  159. package/lib/util/parse-workspace-id.d.ts.map +1 -1
  160. package/lib/util/parse-workspace-id.js +32 -7
  161. package/lib/util/parse-workspace-id.js.map +1 -1
  162. package/lib/util/parse-workspace-id.spec.d.ts +4 -0
  163. package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
  164. package/lib/util/parse-workspace-id.spec.js +123 -84
  165. package/lib/util/parse-workspace-id.spec.js.map +1 -1
  166. package/lib/util/queue.js +16 -55
  167. package/lib/util/queue.js.map +1 -1
  168. package/lib/util/queue.spec.js +144 -288
  169. package/lib/util/queue.spec.js.map +1 -1
  170. package/lib/util/repeater.js +35 -88
  171. package/lib/util/repeater.js.map +1 -1
  172. package/lib/util/safe-promise.js +9 -12
  173. package/lib/util/safe-promise.js.map +1 -1
  174. package/lib/util/semaphore.js +15 -46
  175. package/lib/util/semaphore.js.map +1 -1
  176. package/lib/util/skip-if.js +6 -6
  177. package/lib/util/skip-if.js.map +1 -1
  178. package/lib/util/timeutil.js +28 -16
  179. package/lib/util/timeutil.js.map +1 -1
  180. package/lib/util/timeutil.spec.js +21 -24
  181. package/lib/util/timeutil.spec.js.map +1 -1
  182. package/lib/util/tracing.js +43 -47
  183. package/lib/util/tracing.js.map +1 -1
  184. package/lib/util/workspace-port-authentication.js +3 -2
  185. package/lib/util/workspace-port-authentication.js.map +1 -1
  186. package/lib/workspace-cluster.d.ts +74 -0
  187. package/lib/workspace-cluster.d.ts.map +1 -0
  188. package/lib/workspace-cluster.js +16 -0
  189. package/lib/workspace-cluster.js.map +1 -0
  190. package/lib/workspace-instance.d.ts +5 -2
  191. package/lib/workspace-instance.d.ts.map +1 -1
  192. package/lib/wsready.d.ts +1 -1
  193. package/lib/wsready.js +2 -2
  194. package/package.json +28 -16
  195. package/pkg-yarn.lock +17 -9
  196. package/src/accounting-protocol.ts +229 -0
  197. package/src/admin-protocol.ts +39 -5
  198. package/src/analytics.ts +54 -0
  199. package/src/context-url.spec.ts +39 -0
  200. package/src/context-url.ts +51 -0
  201. package/src/email-protocol.ts +2 -3
  202. package/src/env.ts +10 -10
  203. package/src/gitpod-service.ts +198 -33
  204. package/src/headless-workspace-log.ts +7 -11
  205. package/src/index.ts +5 -1
  206. package/src/messaging/browser/connection.ts +195 -14
  207. package/src/messaging/client-call-metrics.ts +97 -0
  208. package/src/messaging/error.ts +8 -2
  209. package/src/messaging/handler.ts +12 -0
  210. package/src/messaging/node/connection.ts +2 -2
  211. package/src/messaging/proxy-factory.ts +14 -6
  212. package/src/payment-protocol.ts +20 -0
  213. package/src/permission.ts +2 -1
  214. package/src/plans.ts +632 -0
  215. package/src/protocol.ts +153 -43
  216. package/src/snapshot-url.spec.ts +25 -0
  217. package/src/snapshot-url.ts +27 -0
  218. package/src/team-subscription-protocol.ts +113 -0
  219. package/src/teams-projects-protocol.ts +132 -0
  220. package/src/util/analytics.ts +87 -0
  221. package/src/util/deferred.ts +1 -1
  222. package/src/util/garbage-collected-cache.ts +2 -2
  223. package/src/util/generate-workspace-id.spec.ts +3 -3
  224. package/src/util/generate-workspace-id.ts +2 -0
  225. package/src/util/gitpod-cookie.ts +39 -0
  226. package/src/util/gitpod-host-url.spec.ts +25 -1
  227. package/src/util/gitpod-host-url.ts +23 -10
  228. package/src/util/grpc.ts +15 -0
  229. package/src/util/logging.ts +102 -38
  230. package/src/util/parse-workspace-id.spec.ts +21 -1
  231. package/src/util/parse-workspace-id.ts +32 -6
  232. package/src/util/queue.spec.ts +1 -1
  233. package/src/util/semaphore.ts +2 -2
  234. package/src/util/skip-if.ts +1 -1
  235. package/src/util/timeutil.ts +4 -4
  236. package/src/workspace-cluster.ts +96 -0
  237. package/src/workspace-instance.ts +25 -13
  238. package/src/wsready.ts +2 -2
  239. package/lib/util/context-url.d.ts +0 -13
  240. package/lib/util/context-url.d.ts.map +0 -1
  241. package/lib/util/context-url.js +0 -26
  242. package/lib/util/context-url.js.map +0 -1
  243. package/lib/util/context-url.spec.d.ts.map +0 -1
  244. package/lib/util/context-url.spec.js +0 -52
  245. package/lib/util/context-url.spec.js.map +0 -1
  246. package/lib/util/without.d.ts +0 -7
  247. package/lib/util/without.d.ts.map +0 -1
  248. package/lib/util/without.js.map +0 -1
  249. package/src/util/context-url.spec.ts +0 -25
  250. package/src/util/context-url.ts +0 -23
@@ -0,0 +1,97 @@
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 { injectable } from 'inversify';
8
+ import * as prometheusClient from 'prom-client';
9
+
10
+ type GrpcMethodType = 'unary' | 'client_stream' | 'server_stream' | 'bidi_stream';
11
+ export interface IGrpcCallMetricsLabels {
12
+ service: string,
13
+ method: string,
14
+ type: GrpcMethodType,
15
+ }
16
+
17
+ export interface IGrpcCallMetricsLabelsWithCode extends IGrpcCallMetricsLabels {
18
+ code: string
19
+ }
20
+
21
+ export const IClientCallMetrics = Symbol("IClientCallMetrics");
22
+
23
+ export interface IClientCallMetrics {
24
+ started(labels: IGrpcCallMetricsLabels) : void;
25
+ sent(labels: IGrpcCallMetricsLabels) : void;
26
+ received(labels: IGrpcCallMetricsLabels) : void;
27
+ handled(labels: IGrpcCallMetricsLabelsWithCode) : void;
28
+ }
29
+
30
+ @injectable()
31
+ export class PrometheusClientCallMetrics implements IClientCallMetrics {
32
+
33
+ readonly startedCounter: prometheusClient.Counter<string>;
34
+ readonly sentCounter: prometheusClient.Counter<string>;
35
+ readonly receivedCounter: prometheusClient.Counter<string>;
36
+ readonly handledCounter: prometheusClient.Counter<string>;
37
+
38
+ constructor() {
39
+ this.startedCounter = new prometheusClient.Counter({
40
+ name: 'grpc_client_started_total',
41
+ help: 'Total number of RPCs started on the client.',
42
+ labelNames: ['grpc_service', 'grpc_method', 'grpc_type'],
43
+ registers: [prometheusClient.register]
44
+ });
45
+ this.sentCounter = new prometheusClient.Counter({
46
+ name: 'grpc_client_msg_sent_total',
47
+ help: ' Total number of gRPC stream messages sent by the client.',
48
+ labelNames: ['grpc_service', 'grpc_method', 'grpc_type'],
49
+ registers: [prometheusClient.register]
50
+ });
51
+ this.receivedCounter = new prometheusClient.Counter({
52
+ name: 'grpc_client_msg_received_total',
53
+ help: 'Total number of RPC stream messages received by the client.',
54
+ labelNames: ['grpc_service', 'grpc_method', 'grpc_type'],
55
+ registers: [prometheusClient.register]
56
+ });
57
+ this.handledCounter = new prometheusClient.Counter({
58
+ name: 'grpc_client_handled_total',
59
+ help: 'Total number of RPCs completed by the client, regardless of success or failure.',
60
+ labelNames: ['grpc_service', 'grpc_method', 'grpc_type', 'grpc_code'],
61
+ registers: [prometheusClient.register]
62
+ });
63
+ }
64
+
65
+ started(labels: IGrpcCallMetricsLabels): void {
66
+ this.startedCounter.inc({
67
+ grpc_service: labels.service,
68
+ grpc_method: labels.method,
69
+ grpc_type: labels.type
70
+ });
71
+ }
72
+
73
+ sent(labels: IGrpcCallMetricsLabels): void {
74
+ this.sentCounter.inc({
75
+ grpc_service: labels.service,
76
+ grpc_method: labels.method,
77
+ grpc_type: labels.type
78
+ });
79
+ }
80
+
81
+ received(labels: IGrpcCallMetricsLabels): void {
82
+ this.receivedCounter.inc({
83
+ grpc_service: labels.service,
84
+ grpc_method: labels.method,
85
+ grpc_type: labels.type
86
+ });
87
+ }
88
+
89
+ handled(labels: IGrpcCallMetricsLabelsWithCode): void {
90
+ this.handledCounter.inc({
91
+ grpc_service: labels.service,
92
+ grpc_method: labels.method,
93
+ grpc_type: labels.type,
94
+ grpc_code: labels.code
95
+ });
96
+ }
97
+ }
@@ -34,6 +34,9 @@ export namespace ErrorCodes {
34
34
  // 460 Context Parse Error (custom status code)
35
35
  export const CONTEXT_PARSE_ERROR = 460;
36
36
 
37
+ // 461 Invalid gitpod yml
38
+ export const INVALID_GITPOD_YML = 461;
39
+
37
40
  // 450 Payment error
38
41
  export const PAYMENT_ERROR = 450;
39
42
 
@@ -64,12 +67,15 @@ export namespace ErrorCodes {
64
67
  // 555 EE License Required
65
68
  export const EE_LICENSE_REQUIRED = 555;
66
69
 
70
+ // 601 SaaS Feature
71
+ export const SAAS_FEATURE = 601;
72
+
67
73
  // 610 Invalid Team Subscription Quantity
68
74
  export const TEAM_SUBSCRIPTION_INVALID_QUANTITY = 610;
69
75
 
70
76
  // 620 Team Subscription Assignment Failed
71
77
  export const TEAM_SUBSCRIPTION_ASSIGNMENT_FAILED = 620;
72
78
 
73
- // 666 Not Implemented TODO IO-SPLIT remove
74
- export const NOT_IMPLEMENTED = 666;
79
+ // 630 Snapshot Error
80
+ export const SNAPSHOT_ERROR = 630;
75
81
  }
@@ -13,3 +13,15 @@ export interface ConnectionHandler {
13
13
  readonly path: string;
14
14
  onConnection(connection: MessageConnection, session?: object): void;
15
15
  }
16
+
17
+ export interface ConnectionEventHandler {
18
+ /**
19
+ * Called when the transport underpinning the connection got closed
20
+ */
21
+ onTransportDidClose(): void;
22
+
23
+ /**
24
+ * Called when the transport underpinning the connection is (re-)opened
25
+ */
26
+ onTransportDidOpen(): void;
27
+ }
@@ -65,13 +65,13 @@ export function toIWebSocket(webSocket: ws) {
65
65
  send: content => {
66
66
  if (webSocket.readyState !== ws.OPEN) {
67
67
  if (sendsAfterOpen++ > 3) {
68
- log.error(`Repeated try to send on closed web socket (readyState was ${webSocket.readyState})`, { ws });
68
+ //log.debug(`Repeated try to send on closed web socket (readyState was ${webSocket.readyState})`, { ws });
69
69
  }
70
70
  return;
71
71
  }
72
72
  webSocket.send(content, err => {
73
73
  if (err) {
74
- log.error('Error in ws.send()', err, { ws });
74
+ log.error('error in ws.send()', err, { ws });
75
75
  }
76
76
  })
77
77
  },
@@ -105,13 +105,19 @@ export class JsonRpcProxyFactory<T extends object> implements ProxyHandler<T> {
105
105
  this.connectionPromiseResolve = resolve
106
106
  );
107
107
  this.connectionPromise.then(connection => {
108
- connection.onClose(() =>
109
- this.onDidCloseConnectionEmitter.fire(undefined)
110
- );
111
- this.onDidOpenConnectionEmitter.fire(undefined);
108
+ connection.onClose(() => this.fireConnectionClosed());
109
+ this.fireConnectionOpened();
112
110
  });
113
111
  }
114
112
 
113
+ fireConnectionClosed() {
114
+ this.onDidCloseConnectionEmitter.fire(undefined)
115
+ }
116
+
117
+ fireConnectionOpened() {
118
+ this.onDidOpenConnectionEmitter.fire(undefined);
119
+ }
120
+
115
121
  /**
116
122
  * Connect a MessageConnection to the factory.
117
123
  *
@@ -158,7 +164,9 @@ export class JsonRpcProxyFactory<T extends object> implements ProxyHandler<T> {
158
164
  * methods calls.
159
165
  */
160
166
  protected onNotification(method: string, ...args: any[]): void {
161
- this.target[method](...args);
167
+ if (this.target[method]) {
168
+ this.target[method](...args);
169
+ }
162
170
  }
163
171
 
164
172
  /**
@@ -214,7 +222,7 @@ export class JsonRpcProxyFactory<T extends object> implements ProxyHandler<T> {
214
222
  try {
215
223
  if (isNotify) {
216
224
  connection.sendNotification(p.toString(), ...args);
217
- resolve();
225
+ resolve(undefined);
218
226
  } else {
219
227
  const resultPromise = connection.sendRequest(p.toString(), ...args) as Promise<any>;
220
228
  resultPromise
@@ -0,0 +1,20 @@
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 namespace PaymentProtocol {
8
+ export const UPDATE_GITPOD_SUBSCRIPTION_PATH = '/payment/chargebee'
9
+ }
10
+
11
+ export interface PlanCoupon {
12
+ chargebeePlanID: string;
13
+ newPrice: number;
14
+ description: string;
15
+ }
16
+
17
+ export interface GithubUpgradeURL {
18
+ url: string;
19
+ planID: number;
20
+ }
package/src/permission.ts CHANGED
@@ -14,7 +14,8 @@ export const Permissions = {
14
14
  "admin-users": undefined,
15
15
  "admin-workspaces": undefined,
16
16
  "admin-api": undefined,
17
- "ide-settings": undefined
17
+ "ide-settings": undefined,
18
+ "new-workspace-cluster": undefined,
18
19
  };
19
20
  export type PermissionName = keyof (typeof Permissions);
20
21
  export const Roles = {"devops": undefined, "viewer": undefined, "admin": undefined };