@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,45 @@
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 { Disposable } from "..";
8
+ import { log } from "./logging";
9
+
10
+ /**
11
+ * This intends to be a drop-in replacement for 'setInterval' implemented with a 'setTimeout' chain
12
+ * to ensure we're not creating more timeouts than we can process.
13
+ * @param op
14
+ * @param everyMilliseconds
15
+ * @returns
16
+ */
17
+ export function repeat(op: () => Promise<void> | void, everyMilliseconds: number): Disposable {
18
+ let timer: NodeJS.Timeout | undefined = undefined;
19
+ let stopped = false;
20
+ const repeated = () => {
21
+ if (stopped) {
22
+ // in case we missed the clearTimeout i 'await'
23
+ return;
24
+ }
25
+
26
+ timer = setTimeout(async () => {
27
+ try {
28
+ await op();
29
+ } catch (err) {
30
+ // catch error here to
31
+ log.error(err);
32
+ }
33
+
34
+ repeated(); // chain ourselves - after the 'await'
35
+ }, everyMilliseconds);
36
+ };
37
+ repeated();
38
+
39
+ return Disposable.create(() => {
40
+ stopped = true;
41
+ if (timer) {
42
+ clearTimeout(timer);
43
+ }
44
+ });
45
+ }
@@ -4,20 +4,19 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
-
8
7
  export class Semaphore {
9
8
  protected queue: (() => void)[] = [];
10
9
  protected used: number;
11
10
 
12
- constructor(protected readonly capacity: number) {
13
- if(capacity < 1) {
11
+ constructor(protected readonly capacity: number) {
12
+ if (capacity < 1) {
14
13
  throw new Error("Capacity cannot be less than 1");
15
14
  }
16
15
  }
17
16
 
18
17
  public release() {
19
- if(this.used == 0) return;
20
-
18
+ if (this.used == 0) return;
19
+
21
20
  const queued = this.queue.shift();
22
21
  if (queued) {
23
22
  queued();
@@ -28,7 +27,7 @@ export class Semaphore {
28
27
 
29
28
  public async acquire(): Promise<void> {
30
29
  this.used++;
31
- if(this.used <= this.capacity) {
30
+ if (this.used <= this.capacity) {
32
31
  return Promise.resolve();
33
32
  }
34
33
 
@@ -36,5 +35,4 @@ export class Semaphore {
36
35
  this.queue.push(rs);
37
36
  });
38
37
  }
39
-
40
- }
38
+ }
@@ -4,7 +4,6 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
-
8
7
  /**
9
8
  * The subset of actually available fields and methods which are not exported but we care about
10
9
  */
@@ -18,16 +17,20 @@ interface TestSuiteContext extends Mocha.ISuiteCallbackContext {
18
17
  * @param doSkip A function which takes a TestSuite and decides if it should be skipped
19
18
  */
20
19
  export function skipIf(doSkip: (suite: TestSuiteContext) => boolean): MochaTypeScript.SuiteTrait {
21
- const trait: MochaTypeScript.SuiteTrait = function(this: Mocha.ISuiteCallbackContext, ctx: Mocha.ISuiteCallbackContext, ctor: Function): void {
22
- const suite = ctx as any as TestSuiteContext; // No idea why those fields are not exported in the types
20
+ const trait: MochaTypeScript.SuiteTrait = function (
21
+ this: Mocha.ISuiteCallbackContext,
22
+ ctx: Mocha.ISuiteCallbackContext,
23
+ ctor: Function,
24
+ ): void {
25
+ const suite = ctx as any as TestSuiteContext; // No idea why those fields are not exported in the types
23
26
  const skip = doSkip(suite);
24
- suite.beforeEach(function(this: Mocha.IHookCallbackContext) {
27
+ suite.beforeEach(function (this: Mocha.IHookCallbackContext) {
25
28
  if (skip) {
26
29
  this.skip();
27
30
  }
28
- })
31
+ });
29
32
  };
30
-
33
+
31
34
  // Mark as "trait": mimics the behavior of https://github.com/testdeck/testdeck/blob/9d2dd6a458c2c86c945f6f2999b8278b7528a7a7/index.ts#L433
32
35
  (trait as any)["__mts_isTrait"] = true;
33
36
  return trait;
@@ -45,4 +48,4 @@ export function skipIfEnvVarNotSet(name: string): MochaTypeScript.SuiteTrait {
45
48
  }
46
49
  return skip;
47
50
  });
48
- }
51
+ }
@@ -4,40 +4,39 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- import * as chai from 'chai';
7
+ import * as chai from "chai";
8
8
  const expect = chai.expect;
9
- import { suite, test } from 'mocha-typescript';
10
- import { oneMonthLater } from './timeutil';
9
+ import { suite, test } from "mocha-typescript";
10
+ import { oneMonthLater } from "./timeutil";
11
11
 
12
12
  @suite()
13
13
  export class TimeutilSpec {
14
-
15
14
  @test
16
15
  testTimeutil() {
17
16
  // targeting a 1st, 1th of Jan => 1st of Feb
18
- this.isOneMonthLater(new Date(2000, 0, 1), 1, new Date(2000, 1, 1))
17
+ this.isOneMonthLater(new Date(2000, 0, 1), 1, new Date(2000, 1, 1));
19
18
 
20
19
  // targeting a 31th, 30th of Apr => 31st of May
21
- this.isOneMonthLater(new Date(2000, 3, 30), 31, new Date(2000, 4, 31))
20
+ this.isOneMonthLater(new Date(2000, 3, 30), 31, new Date(2000, 4, 31));
22
21
 
23
22
  // targeting a 31th, 31th of Mar => 30th of Apr
24
- this.isOneMonthLater(new Date(2000, 2, 31), 31, new Date(2000, 3, 30))
23
+ this.isOneMonthLater(new Date(2000, 2, 31), 31, new Date(2000, 3, 30));
25
24
 
26
25
  // targeting a 30th, 30th of Mar => 30th of Apr
27
- this.isOneMonthLater(new Date(2000, 2, 30), 30, new Date(2000, 3, 30))
26
+ this.isOneMonthLater(new Date(2000, 2, 30), 30, new Date(2000, 3, 30));
28
27
 
29
28
  // next year
30
- this.isOneMonthLater(new Date(2000, 11, 1), 1, new Date(2001, 0, 1))
31
- this.isOneMonthLater(new Date(2000, 11, 31), 31, new Date(2001, 0, 31))
29
+ this.isOneMonthLater(new Date(2000, 11, 1), 1, new Date(2001, 0, 1));
30
+ this.isOneMonthLater(new Date(2000, 11, 31), 31, new Date(2001, 0, 31));
32
31
 
33
32
  // Feb
34
- this.isOneMonthLater(new Date(2001, 0, 31), 31, new Date(2001, 1, 28))
33
+ this.isOneMonthLater(new Date(2001, 0, 31), 31, new Date(2001, 1, 28));
35
34
  // Feb leap year
36
- this.isOneMonthLater(new Date(2000, 0, 31), 31, new Date(2000, 1, 29))
35
+ this.isOneMonthLater(new Date(2000, 0, 31), 31, new Date(2000, 1, 29));
37
36
  }
38
37
 
39
38
  isOneMonthLater(from: Date, day: number, expectation: Date) {
40
- const later = oneMonthLater(from.toISOString(), day)
41
- expect(later, `expected ${later} to be equal ${expectation}`).to.be.equal(expectation.toISOString())
39
+ const later = oneMonthLater(from.toISOString(), day);
40
+ expect(later, `expected ${later} to be equal ${expectation}`).to.be.equal(expectation.toISOString());
42
41
  }
43
- }
42
+ }
@@ -6,12 +6,12 @@
6
6
 
7
7
  /**
8
8
  * Returns the <code>day</code>th of the next month from <code>formDate</code>.
9
- * If the next month does not have a <code>day</code>th, the last day of that
9
+ * If the next month does not have a <code>day</code>th, the last day of that
10
10
  * month is taken.
11
11
  * The time is copied from <code>fromDate</code>.
12
- *
13
- * @param fromDate
14
- * @param day
12
+ *
13
+ * @param fromDate
14
+ * @param day
15
15
  */
16
16
  export function oneMonthLater(fromDate: string, day?: number): string {
17
17
  const later = new Date(fromDate);
@@ -24,28 +24,38 @@ export function oneMonthLater(fromDate: string, day?: number): string {
24
24
  }
25
25
  return later.toISOString();
26
26
  }
27
- export const yearsLater = (fromDate: string, years: number): string => liftDate1(fromDate, (d) => {
28
- d.setUTCFullYear(d.getUTCFullYear() + years);
29
- return d.toISOString();
30
- });
27
+ export const yearsLater = (fromDate: string, years: number): string =>
28
+ liftDate1(fromDate, (d) => {
29
+ d.setUTCFullYear(d.getUTCFullYear() + years);
30
+ return d.toISOString();
31
+ });
31
32
 
32
33
  // tslint:disable-next-line:no-shadowed-variable
33
- export const addMillis = (d1: string, millis: number) => liftDate1(d1, (d1) => new Date(d1.getTime() + millis).toISOString());
34
- export const durationInHours = (d1: string, d2: string) => liftDate(d1, d2, (d1, d2) => millisecondsToHours(d1.getTime() - d2.getTime()));
34
+ export const addMillis = (d1: string, millis: number) =>
35
+ liftDate1(d1, (d1) => new Date(d1.getTime() + millis).toISOString());
36
+ export const durationInHours = (d1: string, d2: string) =>
37
+ liftDate(d1, d2, (d1, d2) => millisecondsToHours(d1.getTime() - d2.getTime()));
35
38
  export const durationInMillis = (d1: string, d2: string) => liftDate(d1, d2, (d1, d2) => d1.getTime() - d2.getTime());
36
39
  // tslint:disable-next-line:no-shadowed-variable
37
- export const isDateGreaterOrEqual = (d1: string, d2: string): boolean => liftDate(d1, d2, (d1, d2) => d1.getTime() >= d2.getTime());
40
+ export const isDateGreaterOrEqual = (d1: string, d2: string): boolean =>
41
+ liftDate(d1, d2, (d1, d2) => d1.getTime() >= d2.getTime());
38
42
  export const isDateSmallerOrEqual = (d1: string, d2: string | undefined) => !d2 || d1 <= d2;
39
43
  export const isDateSmaller = (d1: string, d2: string | undefined) => !d2 || d1 < d2;
40
- export const oldest = (d1: string, d2: string): string => d1 > d2 ? d1 : d2;
41
- export const earliest = (d1: string, d2: string): string => d1 < d2 ? d1 : d2;
44
+ export const oldest = (d1: string, d2: string): string => (d1 > d2 ? d1 : d2);
45
+ export const earliest = (d1: string, d2: string): string => (d1 < d2 ? d1 : d2);
42
46
  export const orderAsc = (d1: string, d2: string): number => liftDate(d1, d2, (d1, d2) => d1.getTime() - d2.getTime());
43
47
  export const liftDate1 = <T>(d1: string, f: (d1: Date) => T): T => f(new Date(d1));
44
48
  export const liftDate = <T>(d1: string, d2: string, f: (d1: Date, d2: Date) => T): T => f(new Date(d1), new Date(d2));
45
49
 
50
+ export function hoursBefore(date: string, hours: number): string {
51
+ const result = new Date(date);
52
+ result.setHours(result.getHours() - hours);
53
+ return result.toISOString();
54
+ }
55
+
46
56
  export function hoursLater(date: string, hours: number): string {
47
- const result = new Date(date)
48
- result.setHours(result.getHours() + hours)
57
+ const result = new Date(date);
58
+ result.setHours(result.getHours() + hours);
49
59
  return result.toISOString();
50
60
  }
51
61
 
@@ -0,0 +1,88 @@
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 { suite, test } from "mocha-typescript";
8
+ import * as chai from "chai";
9
+ import { TraceContext } from "./tracing";
10
+ import { MockTracer } from "opentracing";
11
+
12
+ const expect = chai.expect;
13
+
14
+ @suite
15
+ class TestTracing {
16
+ @test public async testTracingContext_addNestedTags() {
17
+ const tracer = new MockTracer();
18
+ const span = tracer.startSpan("testTracingContext_addNestedTags");
19
+ TraceContext.addNestedTags(
20
+ { span },
21
+ {
22
+ rpc: {
23
+ system: "jsonrpc",
24
+ jsonrpc: {
25
+ version: "1.0",
26
+ method: "test",
27
+ parameters: ["abc", "def"],
28
+ },
29
+ },
30
+ },
31
+ );
32
+
33
+ const mockSpan = tracer.report().spans[0];
34
+ expect(mockSpan.tags()).to.deep.equal({
35
+ "rpc.system": "jsonrpc",
36
+ "rpc.jsonrpc.version": "1.0",
37
+ "rpc.jsonrpc.method": "test",
38
+ "rpc.jsonrpc.parameters.0": "abc",
39
+ "rpc.jsonrpc.parameters.1": "def",
40
+ });
41
+ }
42
+
43
+ @test public async testTracingContext_addNestedTags_null() {
44
+ const tracer = new MockTracer();
45
+ const span = tracer.startSpan("testTracingContext_addNestedTags_null");
46
+ TraceContext.addNestedTags(
47
+ { span },
48
+ {
49
+ someShape: {
50
+ thisIsNull: null,
51
+ thisIsUndefined: undefined,
52
+ },
53
+ },
54
+ );
55
+
56
+ const mockSpan = tracer.report().spans[0];
57
+ expect(mockSpan.tags()).to.deep.equal({
58
+ "someShape.thisIsNull": null,
59
+ "someShape.thisIsUndefined": undefined,
60
+ });
61
+ }
62
+
63
+ @test public async testTracingContext_addJsonRPCParameters() {
64
+ const tracer = new MockTracer();
65
+ const span = tracer.startSpan("testTracingContext_addJsonRPCParameters");
66
+ const ctx = { span };
67
+ TraceContext.addJsonRPCParameters(ctx, {
68
+ one: "one",
69
+ two: {
70
+ name: "two",
71
+ some: "shape",
72
+ containing: "PII",
73
+ },
74
+ three: "three",
75
+ });
76
+
77
+ const mockSpan = tracer.report().spans[0];
78
+ expect(mockSpan.tags()).to.deep.equal({
79
+ "rpc.jsonrpc.parameters.one": "one",
80
+ "rpc.jsonrpc.parameters.two.containing": "PII",
81
+ "rpc.jsonrpc.parameters.two.name": "two",
82
+ "rpc.jsonrpc.parameters.two.some": "shape",
83
+ "rpc.jsonrpc.parameters.three": "three",
84
+ "rpc.system": "jsonrpc",
85
+ });
86
+ }
87
+ }
88
+ module.exports = new TestTracing();
@@ -4,48 +4,192 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
-
8
- import * as opentracing from 'opentracing';
9
- import { TracingConfig, initTracerFromEnv, Sampler, SamplingDecision } from 'jaeger-client';
10
- import { initGlobalTracer } from 'opentracing';
11
- import { injectable } from 'inversify';
7
+ import * as opentracing from "opentracing";
8
+ import { TracingConfig, initTracerFromEnv } from "jaeger-client";
9
+ import { Sampler, SamplingDecision } from "./jaeger-client-types";
10
+ import { initGlobalTracer } from "opentracing";
11
+ import { injectable } from "inversify";
12
+ import { ResponseError } from "vscode-jsonrpc";
13
+ import { log, LogContext } from "./logging";
12
14
 
13
15
  export interface TraceContext {
14
- span?: opentracing.Span
16
+ span?: opentracing.Span;
15
17
  }
18
+ export type TraceContextWithSpan = TraceContext & {
19
+ span: opentracing.Span;
20
+ };
16
21
 
17
22
  export namespace TraceContext {
18
- export function startSpan(operation: string, ctx: TraceContext): opentracing.Span {
19
- const options: opentracing.SpanOptions = {
20
- childOf: ctx.span
23
+ export function startSpan(operation: string, parentCtx?: TraceContext): opentracing.Span {
24
+ const options: opentracing.SpanOptions = {};
25
+
26
+ // references should contain span id.
27
+ // cf. https://github.com/jaegertracing/jaeger-client-node/issues/432
28
+ if (!!parentCtx?.span) {
29
+ const ctx = parentCtx?.span?.context();
30
+ if (ctx && !!ctx.toTraceId() && !!ctx.toSpanId()) {
31
+ options.references = [opentracing.followsFrom(ctx)];
32
+ }
21
33
  }
34
+
22
35
  return opentracing.globalTracer().startSpan(operation, options);
23
36
  }
24
37
 
25
- export function startAsyncSpan(operation: string, ctx: TraceContext): opentracing.Span {
26
- const options: opentracing.SpanOptions = {};
27
- if (!!ctx.span) {
28
- options.references = [opentracing.followsFrom(ctx.span.context())];
38
+ export function childContext(operation: string, parentCtx: TraceContext): TraceContextWithSpan {
39
+ const span = startSpan(operation, parentCtx);
40
+ return { span };
41
+ }
42
+
43
+ export function withSpan(operation: string, callback: (ctx: TraceContext) => void, ctx?: TraceContext): void {
44
+ // if we don't have a parent span, don't create a trace here as those <trace-without-root-spans> are not useful.
45
+ if (!ctx || !ctx.span || !ctx.span.context()) {
46
+ callback({});
47
+ return;
48
+ }
49
+
50
+ const span = TraceContext.startSpan(operation, ctx);
51
+ try {
52
+ callback({ span });
53
+ } catch (e) {
54
+ TraceContext.setError({ span }, e);
55
+ throw e;
56
+ } finally {
57
+ span.finish();
58
+ }
59
+ }
60
+
61
+ export function setError(ctx: TraceContext, err: Error) {
62
+ if (!ctx.span) {
63
+ return;
64
+ }
65
+
66
+ TraceContext.addNestedTags(ctx, {
67
+ error: {
68
+ message: err.message,
69
+ stacktrace: err.stack,
70
+ },
71
+ });
72
+ ctx.span.setTag("error", true);
73
+ }
74
+
75
+ export function setJsonRPCMetadata(ctx: TraceContext, method?: string) {
76
+ if (!ctx.span) {
77
+ return;
78
+ }
79
+
80
+ const tags: { [key: string]: any } = {
81
+ rpc: {
82
+ system: "jsonrpc",
83
+ // version,
84
+ },
85
+ };
86
+ if (method) {
87
+ tags.rpc.method = method;
88
+ }
89
+ addNestedTags(ctx, tags);
90
+ }
91
+
92
+ export function setJsonRPCError(
93
+ ctx: TraceContext,
94
+ method: string,
95
+ err: ResponseError<any>,
96
+ withStatusCode: boolean = false,
97
+ ) {
98
+ if (!ctx.span) {
99
+ return;
100
+ }
101
+ // not use setError bc this is (most likely) a working operation
102
+
103
+ setJsonRPCMetadata(ctx, method);
104
+ // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/rpc.md#json-rpc
105
+ addNestedTags(ctx, {
106
+ rpc: {
107
+ jsonrpc: {
108
+ error_code: err.code,
109
+ error_message: err.message,
110
+ },
111
+ },
112
+ });
113
+
114
+ // the field "status_code" is used by honeycomb to derive insights like success rate, etc. Defaults to "0".
115
+ if (withStatusCode) {
116
+ ctx.span.setTag("status_code", err.code);
29
117
  }
30
- return opentracing.globalTracer().startSpan(operation, options);
31
118
  }
32
119
 
33
- export function logError(ctx: TraceContext, err: Error) {
120
+ export function addJsonRPCParameters(ctx: TraceContext, params: { [key: string]: any }) {
34
121
  if (!ctx.span) {
35
122
  return;
36
123
  }
37
124
 
38
- ctx.span.log({
39
- "error": err.message,
40
- "stacktrace": err.stack
41
- })
42
- ctx.span.setTag("error", true)
125
+ setJsonRPCMetadata(ctx);
126
+ addNestedTags(ctx, {
127
+ rpc: {
128
+ jsonrpc: {
129
+ parameters: params,
130
+ },
131
+ },
132
+ });
133
+ }
134
+
135
+ /**
136
+ * Does what one would expect from `span.addTags`: Calls `span.addTag` for all keys in map, recursively for objects.
137
+ * Example:
138
+ * ```
139
+ * TraceContext.addNestedTags(ctx, {
140
+ * rpc: {
141
+ * system: "jsonrpc",
142
+ * jsonrpc: {
143
+ * version: "1.0",
144
+ * method: "test",
145
+ * parameters: ["abc", "def"],
146
+ * },
147
+ * },
148
+ * });
149
+ * ```
150
+ * gives
151
+ * rpc.system = "jsonrpc"
152
+ * rpc.jsonrpc.version = "1.0"
153
+ * rpc.jsonrpc.method = "test"
154
+ * rpc.jsonrpc.parameters.0 = "abc"
155
+ * rpc.jsonrpc.parameters.1 = "def"
156
+ * @param ctx
157
+ * @param keyValueMap
158
+ * @returns
159
+ */
160
+ export function addNestedTags(ctx: TraceContext, keyValueMap: { [key: string]: any }, _namespace?: string) {
161
+ if (!ctx.span) {
162
+ return;
163
+ }
164
+ const namespace = _namespace ? `${_namespace}.` : "";
165
+
166
+ try {
167
+ for (const k of Object.keys(keyValueMap)) {
168
+ const v = keyValueMap[k];
169
+ if (v instanceof Object) {
170
+ addNestedTags(ctx, v, `${namespace}${k}`);
171
+ } else {
172
+ ctx.span.setTag(`${namespace}${k}`, v);
173
+ }
174
+ }
175
+ } catch (err) {
176
+ // general resilience against odd shapes/parameters
177
+ log.error("Tracing.addNestedTags", err, { namespace });
178
+ }
179
+ }
180
+
181
+ export function setOWI(ctx: TraceContext, owi: LogContext) {
182
+ if (!ctx.span) {
183
+ return;
184
+ }
185
+ addNestedTags(ctx, {
186
+ context: owi,
187
+ });
43
188
  }
44
189
  }
45
190
 
46
191
  @injectable()
47
192
  export class TracingManager {
48
-
49
193
  public setup(serviceName: string, opts?: CustomTracerOpts) {
50
194
  initGlobalTracer(this.getTracerForService(serviceName, opts));
51
195
  }
@@ -54,13 +198,18 @@ export class TracingManager {
54
198
  const config: TracingConfig = {
55
199
  disable: false,
56
200
  reporter: {
57
- logSpans: false
201
+ logSpans: false,
58
202
  },
59
- serviceName
60
- }
203
+ serviceName,
204
+ };
61
205
  const t = initTracerFromEnv(config, {
62
- logger: console
206
+ logger: console,
207
+ tags: {
208
+ "service.build.commit": process.env.GITPOD_BUILD_GIT_COMMIT,
209
+ "service.build.version": process.env.GITPOD_BUILD_VERSION,
210
+ },
63
211
  });
212
+
64
213
  if (opts) {
65
214
  if (opts.perOpSampling) {
66
215
  (t as any)._sampler = new PerOperationSampler((t as any)._sampler, opts.perOpSampling);
@@ -68,24 +217,22 @@ export class TracingManager {
68
217
  }
69
218
  return t;
70
219
  }
71
-
72
220
  }
73
221
 
74
222
  export interface CustomTracerOpts {
75
- perOpSampling?: PerOperationSampling
223
+ perOpSampling?: PerOperationSampling;
76
224
  }
77
225
 
78
-
79
226
  // has to conform to https://github.com/jaegertracing/jaeger-client-node/blob/0042b1c0a0796bb655eb93e77ff76ab5e94c2bb6/src/_flow/sampler-thrift.js#L32
80
227
  export interface PerOperationSampling {
81
- [key: string]: boolean
228
+ [key: string]: boolean;
82
229
  }
83
230
 
84
231
  export class PerOperationSampler implements Sampler {
85
232
  constructor(protected readonly fallback: Sampler, protected readonly strategies: PerOperationSampling) {}
86
233
 
87
234
  name(): string {
88
- return 'PerOperationSampler';
235
+ return "PerOperationSampler";
89
236
  }
90
237
 
91
238
  toString(): string {
@@ -125,10 +272,32 @@ export class PerOperationSampler implements Sampler {
125
272
  return false; // TODO equal should be removed
126
273
  }
127
274
 
128
- close(callback: ()=>void): void {
275
+ close(callback: () => void): void {
129
276
  // all nested samplers are of simple types, so we do not need to Close them
130
277
  if (callback) {
131
278
  callback();
132
279
  }
133
280
  }
134
281
  }
282
+
283
+ // Augment interfaces with an leading parameter "TraceContext" on every method
284
+ type IsValidArg<T> = T extends object ? (keyof T extends never ? false : true) : true;
285
+ type AddTraceContext<T> = T extends (a: infer A, b: infer B, c: infer C, d: infer D, e: infer E, f: infer F) => infer R
286
+ ? IsValidArg<F> extends true
287
+ ? (ctx: TraceContextWithSpan, a: A, b: B, c: C, d: D, e: E, f: F) => R
288
+ : IsValidArg<E> extends true
289
+ ? (ctx: TraceContextWithSpan, a: A, b: B, c: C, d: D, e: E) => R
290
+ : IsValidArg<D> extends true
291
+ ? (ctx: TraceContextWithSpan, a: A, b: B, c: C, d: D) => R
292
+ : IsValidArg<C> extends true
293
+ ? (ctx: TraceContextWithSpan, a: A, b: B, c: C) => R
294
+ : IsValidArg<B> extends true
295
+ ? (ctx: TraceContextWithSpan, a: A, b: B) => R
296
+ : IsValidArg<A> extends true
297
+ ? (ctx: TraceContextWithSpan, a: A) => R
298
+ : (ctx: TraceContextWithSpan) => Promise<R>
299
+ : never;
300
+
301
+ export type InterfaceWithTraceContext<T> = {
302
+ [P in keyof T]: AddTraceContext<T[P]>;
303
+ };
@@ -5,16 +5,13 @@
5
5
  */
6
6
 
7
7
  /**
8
- * These cookies are set in the Theia frontend. This pattern is relied upon in:
9
- * - proxy:
10
- * - to filter it out on port locations
11
- * - to forward it to the server for authentication
12
- * - server:
13
- * - to authenticate access to port locations
14
- */
15
- export const worspacePortAuthCookieName = function(host: string, workspaceId: string): string {
16
- return host
17
- .replace(/https?/, '')
18
- .replace(/[\W_]+/g, "_")
19
- + `_ws_${workspaceId}_port_auth_`;
20
- };
8
+ * These cookies are set in the Theia frontend. This pattern is relied upon in:
9
+ * - proxy:
10
+ * - to filter it out on port locations
11
+ * - to forward it to the server for authentication
12
+ * - server:
13
+ * - to authenticate access to port locations
14
+ */
15
+ export const worspacePortAuthCookieName = function (host: string, workspaceId: string): string {
16
+ return host.replace(/https?/, "").replace(/[\W_]+/g, "_") + `_ws_${workspaceId}_port_auth_`;
17
+ };