@gitpod/gitpod-protocol 0.1.5-update-ovsx.0 → 0.1.5-update-yarnlock.0

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 (455) hide show
  1. package/data/gitpod-schema.json +159 -25
  2. package/lib/accounting-protocol.d.ts +165 -0
  3. package/lib/accounting-protocol.d.ts.map +1 -0
  4. package/lib/accounting-protocol.js +120 -0
  5. package/lib/accounting-protocol.js.map +1 -0
  6. package/lib/admin-protocol.d.ts +51 -6
  7. package/lib/admin-protocol.d.ts.map +1 -1
  8. package/lib/admin-protocol.js +17 -2
  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/attribution.d.ts +25 -0
  15. package/lib/attribution.d.ts.map +1 -0
  16. package/lib/attribution.js +58 -0
  17. package/lib/attribution.js.map +1 -0
  18. package/lib/auth.d.ts +25 -0
  19. package/lib/auth.d.ts.map +1 -0
  20. package/lib/auth.js +16 -0
  21. package/lib/auth.js.map +1 -0
  22. package/lib/billing-mode.d.ts +45 -0
  23. package/lib/billing-mode.d.ts.map +1 -0
  24. package/lib/billing-mode.js +44 -0
  25. package/lib/billing-mode.js.map +1 -0
  26. package/lib/blocked-repositories-protocol.d.ts +13 -0
  27. package/lib/blocked-repositories-protocol.d.ts.map +1 -0
  28. package/lib/blocked-repositories-protocol.js +8 -0
  29. package/lib/blocked-repositories-protocol.js.map +1 -0
  30. package/lib/context-url.d.ts +30 -0
  31. package/lib/context-url.d.ts.map +1 -0
  32. package/lib/context-url.js +100 -0
  33. package/lib/context-url.js.map +1 -0
  34. package/lib/context-url.spec.d.ts +12 -0
  35. package/lib/context-url.spec.d.ts.map +1 -0
  36. package/lib/context-url.spec.js +81 -0
  37. package/lib/context-url.spec.js.map +1 -0
  38. package/lib/encryption/container-module.d.ts +2 -2
  39. package/lib/encryption/container-module.d.ts.map +1 -1
  40. package/lib/encryption/container-module.js +8 -6
  41. package/lib/encryption/container-module.js.map +1 -1
  42. package/lib/encryption/encryption-engine.d.ts +2 -2
  43. package/lib/encryption/encryption-engine.d.ts.map +1 -1
  44. package/lib/encryption/encryption-engine.js +28 -28
  45. package/lib/encryption/encryption-engine.js.map +1 -1
  46. package/lib/encryption/encryption-engine.spec.d.ts +3 -3
  47. package/lib/encryption/encryption-engine.spec.d.ts.map +1 -1
  48. package/lib/encryption/encryption-engine.spec.js +32 -39
  49. package/lib/encryption/encryption-engine.spec.js.map +1 -1
  50. package/lib/encryption/encryption-service.d.ts +2 -2
  51. package/lib/encryption/encryption-service.d.ts.map +1 -1
  52. package/lib/encryption/encryption-service.js +33 -46
  53. package/lib/encryption/encryption-service.js.map +1 -1
  54. package/lib/encryption/key-provider.d.ts +3 -3
  55. package/lib/encryption/key-provider.d.ts.map +1 -1
  56. package/lib/encryption/key-provider.js +34 -40
  57. package/lib/encryption/key-provider.js.map +1 -1
  58. package/lib/env.d.ts +2 -8
  59. package/lib/env.d.ts.map +1 -1
  60. package/lib/env.js +10 -29
  61. package/lib/env.js.map +1 -1
  62. package/lib/experiments/always-default.d.ts +8 -0
  63. package/lib/experiments/always-default.d.ts.map +1 -0
  64. package/lib/experiments/always-default.js +20 -0
  65. package/lib/experiments/always-default.js.map +1 -0
  66. package/lib/experiments/configcat-server.d.ts +10 -0
  67. package/lib/experiments/configcat-server.d.ts.map +1 -0
  68. package/lib/experiments/configcat-server.js +37 -0
  69. package/lib/experiments/configcat-server.js.map +1 -0
  70. package/lib/experiments/configcat.d.ts +21 -0
  71. package/lib/experiments/configcat.d.ts.map +1 -0
  72. package/lib/experiments/configcat.js +51 -0
  73. package/lib/experiments/configcat.js.map +1 -0
  74. package/lib/experiments/types.d.ts +22 -0
  75. package/lib/experiments/types.d.ts.map +1 -0
  76. package/lib/experiments/types.js +10 -0
  77. package/lib/experiments/types.js.map +1 -0
  78. package/lib/frontend-dashboard-service.d.ts +99 -0
  79. package/lib/frontend-dashboard-service.d.ts.map +1 -0
  80. package/lib/frontend-dashboard-service.js +55 -0
  81. package/lib/frontend-dashboard-service.js.map +1 -0
  82. package/lib/gitpod-file-parser.d.ts +2 -2
  83. package/lib/gitpod-file-parser.d.ts.map +1 -1
  84. package/lib/gitpod-file-parser.js +29 -44
  85. package/lib/gitpod-file-parser.js.map +1 -1
  86. package/lib/gitpod-file-parser.spec.d.ts +2 -2
  87. package/lib/gitpod-file-parser.spec.js +147 -144
  88. package/lib/gitpod-file-parser.spec.js.map +1 -1
  89. package/lib/gitpod-service.d.ts +290 -50
  90. package/lib/gitpod-service.d.ts.map +1 -1
  91. package/lib/gitpod-service.js +288 -123
  92. package/lib/gitpod-service.js.map +1 -1
  93. package/lib/headless-workspace-log.d.ts +11 -13
  94. package/lib/headless-workspace-log.d.ts.map +1 -1
  95. package/lib/headless-workspace-log.js +8 -9
  96. package/lib/headless-workspace-log.js.map +1 -1
  97. package/lib/ide-frontend-service.d.ts +26 -0
  98. package/lib/ide-frontend-service.d.ts.map +1 -0
  99. package/lib/ide-frontend-service.js +8 -0
  100. package/lib/ide-frontend-service.js.map +1 -0
  101. package/lib/ide-protocol.d.ts +126 -0
  102. package/lib/ide-protocol.d.ts.map +1 -0
  103. package/lib/ide-protocol.js +18 -0
  104. package/lib/ide-protocol.js.map +1 -0
  105. package/lib/index.d.ts +18 -12
  106. package/lib/index.d.ts.map +1 -1
  107. package/lib/index.js +28 -13
  108. package/lib/index.js.map +1 -1
  109. package/lib/installation-admin-protocol.d.ts +30 -0
  110. package/lib/installation-admin-protocol.d.ts.map +1 -0
  111. package/lib/installation-admin-protocol.js +31 -0
  112. package/lib/installation-admin-protocol.js.map +1 -0
  113. package/lib/license-protocol.d.ts +9 -2
  114. package/lib/license-protocol.d.ts.map +1 -1
  115. package/lib/license-protocol.js +3 -2
  116. package/lib/license-protocol.js.map +1 -1
  117. package/lib/messaging/browser/connection.d.ts +6 -4
  118. package/lib/messaging/browser/connection.d.ts.map +1 -1
  119. package/lib/messaging/browser/connection.js +188 -48
  120. package/lib/messaging/browser/connection.js.map +1 -1
  121. package/lib/messaging/browser/window-connection.d.ts +9 -4
  122. package/lib/messaging/browser/window-connection.d.ts.map +1 -1
  123. package/lib/messaging/browser/window-connection.js +48 -59
  124. package/lib/messaging/browser/window-connection.js.map +1 -1
  125. package/lib/messaging/client-call-metrics.d.ts +21 -0
  126. package/lib/messaging/client-call-metrics.d.ts.map +1 -0
  127. package/lib/messaging/client-call-metrics.js +95 -0
  128. package/lib/messaging/client-call-metrics.js.map +1 -0
  129. package/lib/messaging/error.d.ts +18 -4
  130. package/lib/messaging/error.d.ts.map +1 -1
  131. package/lib/messaging/error.js +38 -7
  132. package/lib/messaging/error.js.map +1 -1
  133. package/lib/messaging/handler.d.ts +10 -0
  134. package/lib/messaging/handler.d.ts.map +1 -1
  135. package/lib/messaging/handler.js +2 -1
  136. package/lib/messaging/handler.js.map +1 -1
  137. package/lib/messaging/node/connection.d.ts +1 -17
  138. package/lib/messaging/node/connection.d.ts.map +1 -1
  139. package/lib/messaging/node/connection.js +24 -59
  140. package/lib/messaging/node/connection.js.map +1 -1
  141. package/lib/messaging/proxy-factory.d.ts +3 -1
  142. package/lib/messaging/proxy-factory.d.ts.map +1 -1
  143. package/lib/messaging/proxy-factory.js +76 -162
  144. package/lib/messaging/proxy-factory.js.map +1 -1
  145. package/lib/oss-allowlist.d.ts +14 -0
  146. package/lib/oss-allowlist.d.ts.map +1 -0
  147. package/lib/oss-allowlist.js +8 -0
  148. package/lib/oss-allowlist.js.map +1 -0
  149. package/lib/payment-protocol.d.ts +18 -0
  150. package/lib/payment-protocol.d.ts.map +1 -0
  151. package/lib/payment-protocol.js +13 -0
  152. package/lib/payment-protocol.js.map +1 -0
  153. package/lib/permission.d.ts +26 -15
  154. package/lib/permission.d.ts.map +1 -1
  155. package/lib/permission.js +50 -36
  156. package/lib/permission.js.map +1 -1
  157. package/lib/plans.d.ts +213 -0
  158. package/lib/plans.d.ts.map +1 -0
  159. package/lib/plans.js +625 -0
  160. package/lib/plans.js.map +1 -0
  161. package/lib/protocol.d.ts +338 -111
  162. package/lib/protocol.d.ts.map +1 -1
  163. package/lib/protocol.js +422 -201
  164. package/lib/protocol.js.map +1 -1
  165. package/lib/protocol.spec.d.ts +7 -0
  166. package/lib/protocol.spec.d.ts.map +1 -0
  167. package/lib/protocol.spec.js +127 -0
  168. package/lib/protocol.spec.js.map +1 -0
  169. package/lib/snapshot-url.d.ts +14 -0
  170. package/lib/snapshot-url.d.ts.map +1 -0
  171. package/lib/snapshot-url.js +26 -0
  172. package/lib/snapshot-url.js.map +1 -0
  173. package/lib/snapshot-url.spec.d.ts +7 -0
  174. package/lib/snapshot-url.spec.d.ts.map +1 -0
  175. package/lib/snapshot-url.spec.js +41 -0
  176. package/lib/snapshot-url.spec.js.map +1 -0
  177. package/lib/team-subscription-protocol.d.ts +93 -0
  178. package/lib/team-subscription-protocol.d.ts.map +1 -0
  179. package/lib/team-subscription-protocol.js +82 -0
  180. package/lib/team-subscription-protocol.js.map +1 -0
  181. package/lib/teams-projects-protocol.d.ts +136 -0
  182. package/lib/teams-projects-protocol.d.ts.map +1 -0
  183. package/lib/teams-projects-protocol.js +41 -0
  184. package/lib/teams-projects-protocol.js.map +1 -0
  185. package/lib/typings/globals.d.ts +8 -3
  186. package/lib/typings/globals.d.ts.map +1 -1
  187. package/lib/typings/globals.js +2 -2
  188. package/lib/usage.d.ts +73 -0
  189. package/lib/usage.d.ts.map +1 -0
  190. package/lib/usage.js +20 -0
  191. package/lib/usage.js.map +1 -0
  192. package/lib/util/analytics.d.ts +8 -0
  193. package/lib/util/analytics.d.ts.map +1 -0
  194. package/lib/util/analytics.js +88 -0
  195. package/lib/util/analytics.js.map +1 -0
  196. package/lib/util/async-iterator.d.ts +2 -2
  197. package/lib/util/async-iterator.d.ts.map +1 -1
  198. package/lib/util/async-iterator.js +60 -137
  199. package/lib/util/async-iterator.js.map +1 -1
  200. package/lib/util/cancelable.d.ts +2 -2
  201. package/lib/util/cancelable.js +20 -61
  202. package/lib/util/cancelable.js.map +1 -1
  203. package/lib/util/date-time.d.ts +2 -2
  204. package/lib/util/date-time.js +14 -13
  205. package/lib/util/date-time.js.map +1 -1
  206. package/lib/util/debug-app.d.ts +25 -0
  207. package/lib/util/debug-app.d.ts.map +1 -0
  208. package/lib/util/debug-app.js +100 -0
  209. package/lib/util/debug-app.js.map +1 -0
  210. package/lib/util/deep-partial.d.ts +2 -2
  211. package/lib/util/deep-partial.js +2 -2
  212. package/lib/util/deferred.d.ts +2 -2
  213. package/lib/util/deferred.js +13 -14
  214. package/lib/util/deferred.js.map +1 -1
  215. package/lib/util/disposable.d.ts +2 -2
  216. package/lib/util/disposable.d.ts.map +1 -1
  217. package/lib/util/disposable.js +28 -40
  218. package/lib/util/disposable.js.map +1 -1
  219. package/lib/util/event.d.ts +1 -1
  220. package/lib/util/event.d.ts.map +1 -1
  221. package/lib/util/event.js +64 -77
  222. package/lib/util/event.js.map +1 -1
  223. package/lib/util/garbage-collected-cache.d.ts +3 -2
  224. package/lib/util/garbage-collected-cache.d.ts.map +1 -1
  225. package/lib/util/garbage-collected-cache.js +35 -49
  226. package/lib/util/garbage-collected-cache.js.map +1 -1
  227. package/lib/util/generate-workspace-id.d.ts +9 -0
  228. package/lib/util/generate-workspace-id.d.ts.map +1 -0
  229. package/lib/util/generate-workspace-id.js +491 -0
  230. package/lib/util/generate-workspace-id.js.map +1 -0
  231. package/lib/util/generate-workspace-id.spec.d.ts +7 -0
  232. package/lib/util/generate-workspace-id.spec.d.ts.map +1 -0
  233. package/lib/util/generate-workspace-id.spec.js +98 -0
  234. package/lib/util/generate-workspace-id.spec.js.map +1 -0
  235. package/lib/util/gitpod-cookie.d.ts +20 -0
  236. package/lib/util/gitpod-cookie.d.ts.map +1 -0
  237. package/lib/util/gitpod-cookie.js +41 -0
  238. package/lib/util/gitpod-cookie.js.map +1 -0
  239. package/lib/util/gitpod-host-url.d.ts +20 -8
  240. package/lib/util/gitpod-host-url.d.ts.map +1 -1
  241. package/lib/util/gitpod-host-url.js +143 -85
  242. package/lib/util/gitpod-host-url.js.map +1 -1
  243. package/lib/util/gitpod-host-url.spec.d.ts +16 -0
  244. package/lib/util/gitpod-host-url.spec.d.ts.map +1 -0
  245. package/lib/util/gitpod-host-url.spec.js +134 -0
  246. package/lib/util/gitpod-host-url.spec.js.map +1 -0
  247. package/lib/util/grpc.d.ts +35 -0
  248. package/lib/util/grpc.d.ts.map +1 -0
  249. package/lib/util/grpc.js +90 -0
  250. package/lib/util/grpc.js.map +1 -0
  251. package/lib/util/jaeger-client-types.d.ts +68 -0
  252. package/lib/util/jaeger-client-types.d.ts.map +1 -0
  253. package/lib/util/jaeger-client-types.js +8 -0
  254. package/lib/util/jaeger-client-types.js.map +1 -0
  255. package/lib/util/logging.d.ts +58 -35
  256. package/lib/util/logging.d.ts.map +1 -1
  257. package/lib/util/logging.js +144 -129
  258. package/lib/util/logging.js.map +1 -1
  259. package/lib/util/logging.spec.d.ts +7 -0
  260. package/lib/util/logging.spec.d.ts.map +1 -0
  261. package/lib/util/logging.spec.js +52 -0
  262. package/lib/util/logging.spec.js.map +1 -0
  263. package/lib/util/make-link.d.ts +2 -2
  264. package/lib/util/make-link.js +8 -7
  265. package/lib/util/make-link.js.map +1 -1
  266. package/lib/util/nice-grpc.d.ts +9 -0
  267. package/lib/util/nice-grpc.d.ts.map +1 -0
  268. package/lib/util/nice-grpc.js +121 -0
  269. package/lib/util/nice-grpc.js.map +1 -0
  270. package/lib/util/parse-workspace-id.d.ts +15 -5
  271. package/lib/util/parse-workspace-id.d.ts.map +1 -1
  272. package/lib/util/parse-workspace-id.js +39 -9
  273. package/lib/util/parse-workspace-id.js.map +1 -1
  274. package/lib/util/parse-workspace-id.spec.d.ts +10 -2
  275. package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
  276. package/lib/util/parse-workspace-id.spec.js +130 -49
  277. package/lib/util/parse-workspace-id.spec.js.map +1 -1
  278. package/lib/util/queue.d.ts +2 -2
  279. package/lib/util/queue.js +19 -57
  280. package/lib/util/queue.js.map +1 -1
  281. package/lib/util/queue.spec.d.ts +2 -2
  282. package/lib/util/queue.spec.js +149 -288
  283. package/lib/util/queue.spec.js.map +1 -1
  284. package/lib/util/repeat.d.ts +15 -0
  285. package/lib/util/repeat.d.ts.map +1 -0
  286. package/lib/util/repeat.js +55 -0
  287. package/lib/util/repeat.js.map +1 -0
  288. package/lib/util/semaphore.d.ts +2 -2
  289. package/lib/util/semaphore.d.ts.map +1 -1
  290. package/lib/util/semaphore.js +18 -48
  291. package/lib/util/semaphore.js.map +1 -1
  292. package/lib/util/skip-if.d.ts +2 -2
  293. package/lib/util/skip-if.d.ts.map +1 -1
  294. package/lib/util/skip-if.js +9 -8
  295. package/lib/util/skip-if.js.map +1 -1
  296. package/lib/util/timeutil.d.ts +4 -2
  297. package/lib/util/timeutil.d.ts.map +1 -1
  298. package/lib/util/timeutil.js +43 -18
  299. package/lib/util/timeutil.js.map +1 -1
  300. package/lib/util/timeutil.spec.d.ts +4 -2
  301. package/lib/util/timeutil.spec.d.ts.map +1 -1
  302. package/lib/util/timeutil.spec.js +57 -25
  303. package/lib/util/timeutil.spec.js.map +1 -1
  304. package/lib/util/tracing.d.ts +55 -8
  305. package/lib/util/tracing.d.ts.map +1 -1
  306. package/lib/util/tracing.js +210 -66
  307. package/lib/util/tracing.js.map +1 -1
  308. package/lib/util/tracing.spec.d.ts +7 -0
  309. package/lib/util/tracing.spec.d.ts.map +1 -0
  310. package/lib/util/tracing.spec.js +121 -0
  311. package/lib/util/tracing.spec.js.map +1 -0
  312. package/lib/util/workspace-port-authentication.d.ts +9 -9
  313. package/lib/util/workspace-port-authentication.d.ts.map +1 -1
  314. package/lib/util/workspace-port-authentication.js +13 -14
  315. package/lib/util/workspace-port-authentication.js.map +1 -1
  316. package/lib/webhook-event.d.ts +44 -0
  317. package/lib/webhook-event.d.ts.map +1 -0
  318. package/lib/webhook-event.js +8 -0
  319. package/lib/webhook-event.js.map +1 -0
  320. package/lib/workspace-class.d.ts +14 -0
  321. package/lib/workspace-class.d.ts.map +1 -0
  322. package/lib/workspace-class.js +8 -0
  323. package/lib/workspace-class.js.map +1 -0
  324. package/lib/workspace-cluster.d.ts +80 -0
  325. package/lib/workspace-cluster.d.ts.map +1 -0
  326. package/lib/workspace-cluster.js +36 -0
  327. package/lib/workspace-cluster.js.map +1 -0
  328. package/lib/workspace-instance.d.ts +51 -8
  329. package/lib/workspace-instance.d.ts.map +1 -1
  330. package/lib/workspace-instance.js +2 -2
  331. package/lib/wsready.d.ts +8 -2
  332. package/lib/wsready.d.ts.map +1 -1
  333. package/lib/wsready.js +4 -3
  334. package/lib/wsready.js.map +1 -1
  335. package/package.json +42 -18
  336. package/pkg-yarn.lock +24 -10
  337. package/provenance-bundle.jsonl +2 -0
  338. package/src/accounting-protocol.ts +253 -0
  339. package/src/admin-protocol.ts +96 -21
  340. package/src/analytics.ts +52 -0
  341. package/src/attribution.ts +67 -0
  342. package/src/auth.ts +27 -0
  343. package/src/billing-mode.ts +84 -0
  344. package/src/blocked-repositories-protocol.ts +13 -0
  345. package/src/context-url.spec.ts +49 -0
  346. package/src/context-url.ts +107 -0
  347. package/src/encryption/container-module.ts +4 -5
  348. package/src/encryption/encryption-engine.spec.ts +11 -10
  349. package/src/encryption/encryption-engine.ts +22 -18
  350. package/src/encryption/encryption-service.ts +6 -7
  351. package/src/encryption/key-provider.ts +18 -21
  352. package/src/env.ts +3 -26
  353. package/src/experiments/always-default.ts +24 -0
  354. package/src/experiments/configcat-server.ts +42 -0
  355. package/src/experiments/configcat.ts +56 -0
  356. package/src/experiments/types.ts +34 -0
  357. package/src/frontend-dashboard-service.ts +148 -0
  358. package/src/gitpod-file-parser.spec.ts +57 -63
  359. package/src/gitpod-file-parser.ts +18 -19
  360. package/src/gitpod-service.ts +602 -99
  361. package/src/headless-workspace-log.ts +14 -16
  362. package/src/ide-frontend-service.ts +28 -0
  363. package/src/ide-protocol.ts +147 -0
  364. package/src/index.ts +18 -12
  365. package/src/installation-admin-protocol.ts +45 -0
  366. package/src/license-protocol.ts +14 -8
  367. package/src/messaging/browser/connection.ts +202 -26
  368. package/src/messaging/browser/window-connection.ts +45 -29
  369. package/src/messaging/client-call-metrics.ts +94 -0
  370. package/src/messaging/error.ts +51 -10
  371. package/src/messaging/handler.ts +13 -1
  372. package/src/messaging/node/connection.ts +23 -70
  373. package/src/messaging/proxy-factory.ts +35 -34
  374. package/src/oss-allowlist.ts +15 -0
  375. package/src/payment-protocol.ts +20 -0
  376. package/src/permission.ts +53 -40
  377. package/src/plans.ts +699 -0
  378. package/src/protocol.spec.ts +97 -0
  379. package/src/protocol.ts +790 -302
  380. package/src/snapshot-url.spec.ts +27 -0
  381. package/src/snapshot-url.ts +27 -0
  382. package/src/team-subscription-protocol.ts +153 -0
  383. package/src/teams-projects-protocol.ts +180 -0
  384. package/src/typings/globals.ts +13 -5
  385. package/src/usage.ts +85 -0
  386. package/src/util/analytics.ts +109 -0
  387. package/src/util/async-iterator.ts +6 -7
  388. package/src/util/cancelable.ts +5 -5
  389. package/src/util/date-time.ts +10 -10
  390. package/src/util/debug-app.ts +81 -0
  391. package/src/util/deep-partial.ts +2 -2
  392. package/src/util/deferred.ts +8 -8
  393. package/src/util/disposable.ts +3 -6
  394. package/src/util/event.ts +9 -11
  395. package/src/util/garbage-collected-cache.ts +18 -10
  396. package/src/util/generate-workspace-id.spec.ts +58 -0
  397. package/src/util/generate-workspace-id.ts +481 -0
  398. package/src/util/gitpod-cookie.ts +38 -0
  399. package/src/util/gitpod-host-url.spec.ts +76 -0
  400. package/src/util/gitpod-host-url.ts +119 -40
  401. package/src/util/grpc.ts +107 -0
  402. package/src/util/jaeger-client-types.ts +102 -0
  403. package/src/util/logging.spec.ts +23 -0
  404. package/src/util/logging.ts +163 -73
  405. package/src/util/make-link.ts +8 -9
  406. package/src/util/nice-grpc.ts +96 -0
  407. package/src/util/parse-workspace-id.spec.ts +62 -12
  408. package/src/util/parse-workspace-id.ts +40 -10
  409. package/src/util/queue.spec.ts +30 -28
  410. package/src/util/queue.ts +2 -2
  411. package/src/util/repeat.ts +45 -0
  412. package/src/util/semaphore.ts +8 -10
  413. package/src/util/skip-if.ts +12 -9
  414. package/src/util/timeutil.spec.ts +42 -16
  415. package/src/util/timeutil.ts +33 -17
  416. package/src/util/tracing.spec.ts +88 -0
  417. package/src/util/tracing.ts +211 -33
  418. package/src/util/workspace-port-authentication.ts +12 -15
  419. package/src/webhook-event.ts +55 -0
  420. package/src/workspace-class.ts +14 -0
  421. package/src/workspace-cluster.ts +121 -0
  422. package/src/workspace-instance.ts +120 -36
  423. package/src/wsready.ts +11 -4
  424. package/data/builtin-theia-plugins.json +0 -362
  425. package/lib/email-protocol.d.ts +0 -49
  426. package/lib/email-protocol.d.ts.map +0 -1
  427. package/lib/email-protocol.js +0 -27
  428. package/lib/email-protocol.js.map +0 -1
  429. package/lib/messaging/connection-error-handler.d.ts +0 -27
  430. package/lib/messaging/connection-error-handler.d.ts.map +0 -1
  431. package/lib/messaging/connection-error-handler.js +0 -45
  432. package/lib/messaging/connection-error-handler.js.map +0 -1
  433. package/lib/theia-plugins.d.ts +0 -11
  434. package/lib/theia-plugins.d.ts.map +0 -1
  435. package/lib/theia-plugins.js +0 -8
  436. package/lib/theia-plugins.js.map +0 -1
  437. package/lib/util/repeater.d.ts +0 -22
  438. package/lib/util/repeater.d.ts.map +0 -1
  439. package/lib/util/repeater.js +0 -117
  440. package/lib/util/repeater.js.map +0 -1
  441. package/lib/util/safe-promise.d.ts +0 -11
  442. package/lib/util/safe-promise.d.ts.map +0 -1
  443. package/lib/util/safe-promise.js +0 -33
  444. package/lib/util/safe-promise.js.map +0 -1
  445. package/lib/util/without.d.ts +0 -7
  446. package/lib/util/without.d.ts.map +0 -1
  447. package/lib/util/without.js +0 -8
  448. package/lib/util/without.js.map +0 -1
  449. package/src/email-protocol.ts +0 -67
  450. package/src/messaging/connection-error-handler.ts +0 -62
  451. package/src/theia-plugins.ts +0 -11
  452. package/src/util/jaeger-client.d.ts +0 -105
  453. package/src/util/repeater.ts +0 -49
  454. package/src/util/safe-promise.ts +0 -26
  455. package/src/util/without.ts +0 -8
@@ -1,42 +1,40 @@
1
1
  /**
2
- * Copyright (c) 2020 TypeFox GmbH. All rights reserved.
2
+ * Copyright (c) 2020 Gitpod GmbH. All rights reserved.
3
3
  * Licensed under the GNU Affero General Public License (AGPL).
4
- * See License-AGPL.txt in the project root for license information.
4
+ * See License.AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
-
8
7
  export enum HeadlessWorkspaceEventType {
9
8
  LogOutput = "log-output",
10
9
  FinishedSuccessfully = "finish-success",
11
10
  FinishedButFailed = "finish-fail",
12
11
  AbortedTimedOut = "aborted-timeout",
13
12
  Aborted = "aborted",
14
- Started = "started"
13
+ Failed = "failed",
14
+ Started = "started",
15
15
  }
16
16
  export namespace HeadlessWorkspaceEventType {
17
17
  export function isRunning(t: HeadlessWorkspaceEventType) {
18
18
  return t === HeadlessWorkspaceEventType.LogOutput;
19
19
  }
20
20
  export function didFinish(t: HeadlessWorkspaceEventType) {
21
- return t === HeadlessWorkspaceEventType.FinishedButFailed || t === HeadlessWorkspaceEventType.FinishedSuccessfully;
21
+ return (
22
+ t === HeadlessWorkspaceEventType.FinishedButFailed || t === HeadlessWorkspaceEventType.FinishedSuccessfully
23
+ );
22
24
  }
23
25
  }
24
26
 
25
- export interface HeadlessLogEvent {
27
+ export interface HeadlessWorkspaceEvent {
26
28
  workspaceID: string;
27
29
  text: string;
28
30
  type: HeadlessWorkspaceEventType;
29
31
  }
30
32
 
31
- export enum TheiaHeadlessLogType {
32
- TaskLogLabel = "workspaceTaskOutput",
33
- TaskFailedLabel = "workspaceTaskFailed",
34
- TaskSuccessfulLabel = "workspaceTaskDone"
33
+ export interface HeadlessLogUrls {
34
+ // A map of id to URL
35
+ streams: { [streamID: string]: string };
35
36
  }
36
37
 
37
- export interface TheiaHeadlessLogMessage {
38
- type: TheiaHeadlessLogType;
39
- data?: string;
40
- error?: string;
41
- snapshotURL?: string;
42
- }
38
+ /** cmp. @const HEADLESS_LOG_STREAM_STATUS_CODE_REGEX */
39
+ export const HEADLESS_LOG_STREAM_STATUS_CODE = "X-LogStream-StatusCode";
40
+ export const HEADLESS_LOG_STREAM_STATUS_CODE_REGEX = /X-LogStream-StatusCode: ([0-9]{3})/;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Copyright (c) 2020 Gitpod GmbH. All rights reserved.
3
+ * Licensed under the GNU Affero General Public License (AGPL).
4
+ * See License.AGPL.txt in the project root for license information.
5
+ */
6
+
7
+ import { Event } from "./util/event";
8
+ import { Disposable } from "./util/disposable";
9
+
10
+ export type IDEFrontendState = "init" | "ready" | "terminated";
11
+
12
+ export interface IDEFrontendService {
13
+ readonly state: IDEFrontendState;
14
+ /**
15
+ * A cause of the ide frontend application failure when state is terminated.
16
+ */
17
+ readonly failureCause?: Error;
18
+ readonly onDidChange: Event<void>;
19
+ /**
20
+ * Starts the ide frontend application.
21
+ * Returns the disposable object which is triggered when the ide application should be stopped.
22
+ *
23
+ * On stop the application should store the unsaved changes.
24
+ * It won't receive any `beforeunload` events from window anymore to prevent
25
+ * confirmation dialogs for stopped workspaces.
26
+ */
27
+ start(): Disposable;
28
+ }
@@ -0,0 +1,147 @@
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
+ /**
8
+ * `IDEServer` provides a list of available IDEs.
9
+ */
10
+ export interface IDEServer {
11
+ /**
12
+ * Returns the IDE preferences.
13
+ */
14
+ getIDEOptions(): Promise<IDEOptions>;
15
+ }
16
+
17
+ export interface IDEOptions {
18
+ /**
19
+ * A list of available IDEs.
20
+ */
21
+ options: { [key: string]: IDEOption };
22
+
23
+ /**
24
+ * The default (browser) IDE when the user has not specified one.
25
+ */
26
+ defaultIde: string;
27
+
28
+ /**
29
+ * The default desktop IDE when the user has not specified one.
30
+ */
31
+ defaultDesktopIde: string;
32
+
33
+ /**
34
+ * Client specific IDE options.
35
+ */
36
+ clients?: { [id: string]: IDEClient };
37
+ }
38
+
39
+ export namespace IDEOptions {
40
+ export function asArray(options: IDEOptions): (IDEOption & { id: string })[] {
41
+ return Object.keys(options.options)
42
+ .map((id) => ({ ...options.options[id], id }))
43
+ .sort((a, b) => (a.orderKey || "").localeCompare(b.orderKey || ""));
44
+ }
45
+ }
46
+
47
+ export interface IDEClient {
48
+ /**
49
+ * The default desktop IDE when the user has not specified one.
50
+ */
51
+ defaultDesktopIDE?: string;
52
+
53
+ /**
54
+ * Desktop IDEs supported by the client.
55
+ */
56
+ desktopIDEs?: string[];
57
+
58
+ /**
59
+ * Steps to install the client on user machine.
60
+ */
61
+ installationSteps?: string[];
62
+ }
63
+
64
+ export interface IDEOption {
65
+ /**
66
+ * To ensure a stable order one can set an `orderKey`.
67
+ */
68
+ orderKey?: string;
69
+
70
+ /**
71
+ * Human readable title text of the IDE (plain text only).
72
+ */
73
+ title: string;
74
+
75
+ /**
76
+ * The type of the IDE, currently 'browser' or 'desktop'.
77
+ */
78
+ type: "browser" | "desktop";
79
+
80
+ /**
81
+ * The logo for the IDE. That could be a key in (see
82
+ * components/dashboard/src/images/ideLogos.ts) or a URL.
83
+ */
84
+ logo: string;
85
+
86
+ /**
87
+ * Text of an optional tooltip (plain text only).
88
+ */
89
+ tooltip?: string;
90
+
91
+ /**
92
+ * Text of an optional label next to the IDE option like “Insiders” (plain
93
+ * text only).
94
+ */
95
+ label?: string;
96
+
97
+ /**
98
+ * Notes to the IDE option that are rendered in the preferences when a user
99
+ * chooses this IDE.
100
+ */
101
+ notes?: string[];
102
+
103
+ /**
104
+ * If `true` this IDE option is not visible in the IDE preferences.
105
+ */
106
+ hidden?: boolean;
107
+
108
+ /**
109
+ * The image ref to the IDE image.
110
+ */
111
+ image: string;
112
+
113
+ /**
114
+ * The latest image ref to the IDE image, this image ref always resolve to digest.
115
+ */
116
+ latestImage?: string;
117
+
118
+ /**
119
+ * When this is `true`, the tag of this image is resolved to the latest
120
+ * image digest regularly.
121
+ *
122
+ * This is useful if this image points to a tag like `nightly` that will be
123
+ * updated regularly. When `resolveImageDigest` is `true`, we make sure that
124
+ * we resolve the tag regularly to the most recent image version.
125
+ */
126
+ resolveImageDigest?: boolean;
127
+
128
+ /**
129
+ * The plugin image ref for the IDE image, this image ref always resolve to digest.
130
+ */
131
+ pluginImage?: string;
132
+
133
+ /**
134
+ * The latest plugin image ref for the latest IDE image, this image ref always resolve to digest.
135
+ */
136
+ pluginLatestImage?: string;
137
+
138
+ /**
139
+ * ImageVersion the semantic version of the IDE image.
140
+ */
141
+ imageVersion?: string;
142
+
143
+ /**
144
+ * LatestImageVersion the semantic version of the latest IDE image.
145
+ */
146
+ latestImageVersion?: string;
147
+ }
package/src/index.ts CHANGED
@@ -1,16 +1,22 @@
1
1
  /**
2
- * Copyright (c) 2020 TypeFox GmbH. All rights reserved.
2
+ * Copyright (c) 2020 Gitpod GmbH. All rights reserved.
3
3
  * Licensed under the GNU Affero General Public License (AGPL).
4
- * See License-AGPL.txt in the project root for license information.
4
+ * See License.AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- export * from './protocol';
8
- export * from './gitpod-service';
9
- export * from './util/disposable';
10
- export * from './util/event';
11
- export * from './util/queue';
12
- export * from './license-protocol';
13
- export * from './workspace-instance';
14
- export * from './permission';
15
- export * from './admin-protocol';
16
- export * from './email-protocol';
7
+ export * from "./protocol";
8
+ export * from "./gitpod-service";
9
+ export * from "./util/disposable";
10
+ export * from "./util/event";
11
+ export * from "./util/queue";
12
+ export * from "./license-protocol";
13
+ export * from "./workspace-instance";
14
+ export * from "./permission";
15
+ export * from "./admin-protocol";
16
+ export * from "./headless-workspace-log";
17
+ export * from "./context-url";
18
+ export * from "./teams-projects-protocol";
19
+ export * from "./snapshot-url";
20
+ export * from "./oss-allowlist";
21
+ export * from "./installation-admin-protocol";
22
+ export * from "./webhook-event";
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Copyright (c) 2022 Gitpod GmbH. All rights reserved.
3
+ * Licensed under the GNU Affero General Public License (AGPL).
4
+ * See License.AGPL.txt in the project root for license information.
5
+ */
6
+
7
+ import { v4 as uuidv4 } from "uuid";
8
+
9
+ const InstallationAdminSettingsPrototype = {
10
+ sendTelemetry: true,
11
+ sendCustomerID: true,
12
+ };
13
+
14
+ export type InstallationAdminSettings = typeof InstallationAdminSettingsPrototype;
15
+
16
+ export namespace InstallationAdminSettings {
17
+ export function fields(): (keyof InstallationAdminSettings)[] {
18
+ return Object.keys(InstallationAdminSettingsPrototype) as (keyof InstallationAdminSettings)[];
19
+ }
20
+ }
21
+
22
+ export interface InstallationAdmin {
23
+ id: string;
24
+ settings: InstallationAdminSettings;
25
+ }
26
+
27
+ export interface TelemetryData {
28
+ installationAdmin: InstallationAdmin;
29
+ totalUsers: number;
30
+ totalWorkspaces: number;
31
+ totalInstances: number;
32
+ licenseType: string;
33
+ customerID?: string;
34
+ }
35
+
36
+ export namespace InstallationAdmin {
37
+ export function createDefault(): InstallationAdmin {
38
+ return {
39
+ id: uuidv4(),
40
+ settings: {
41
+ ...InstallationAdminSettingsPrototype,
42
+ },
43
+ };
44
+ }
45
+ }
@@ -1,14 +1,13 @@
1
1
  /**
2
- * Copyright (c) 2020 TypeFox GmbH. All rights reserved.
2
+ * Copyright (c) 2020 Gitpod GmbH. All rights reserved.
3
3
  * Licensed under the GNU Affero General Public License (AGPL).
4
- * See License-AGPL.txt in the project root for license information.
4
+ * See License.AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
-
8
7
  export interface LicenseValidationResult {
9
- valid: boolean
10
- msg?: string
11
- issue?: LicenseIssue
8
+ valid: boolean;
9
+ msg?: string;
10
+ issue?: LicenseIssue;
12
11
  }
13
12
 
14
13
  export type LicenseIssue = "seats-exhausted";
@@ -16,9 +15,15 @@ export type LicenseIssue = "seats-exhausted";
16
15
  export interface LicenseInfo {
17
16
  key: string;
18
17
  seats: number;
18
+ userCount?: number;
19
19
  valid: boolean;
20
20
  validUntil: string;
21
21
  plan?: string;
22
+ features?: string[];
23
+ enabledFeatures?: string[];
24
+ type?: string;
25
+ errorMsg?: string;
26
+ fallbackAllowed: boolean;
22
27
  }
23
28
 
24
29
  export interface GetLicenseInfoResult {
@@ -34,5 +39,6 @@ export enum LicenseFeature {
34
39
  export interface LicenseService {
35
40
  validateLicense(): Promise<LicenseValidationResult>;
36
41
  getLicenseInfo(): Promise<GetLicenseInfoResult>;
37
- licenseIncludesFeature(feature: LicenseFeature): Promise<boolean>
38
- }
42
+ adminGetLicense(): Promise<LicenseInfo>;
43
+ licenseIncludesFeature(feature: LicenseFeature): Promise<boolean>;
44
+ }
@@ -5,19 +5,20 @@
5
5
  * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
6
  */
7
7
 
8
- import { injectable } from "inversify";
9
- import { listen as doListen, Logger, ConsoleLogger } from "vscode-ws-jsonrpc";
8
+ import { Logger, ConsoleLogger, toSocket, IWebSocket } from "vscode-ws-jsonrpc";
9
+ import { createMessageConnection } from "vscode-jsonrpc";
10
+ import { AbstractMessageWriter } from "vscode-jsonrpc/lib/messageWriter";
11
+ import { AbstractMessageReader } from "vscode-jsonrpc/lib/messageReader";
10
12
  import { JsonRpcProxyFactory, JsonRpcProxy } from "../proxy-factory";
11
- import { ConnectionHandler } from "../handler";
12
- import ReconnectingWebSocket from 'reconnecting-websocket';
13
+ import { ConnectionEventHandler, ConnectionHandler } from "../handler";
14
+ import ReconnectingWebSocket, { Event } from "reconnecting-websocket";
13
15
 
14
16
  export interface WebSocketOptions {
15
17
  onerror?: (event: Event) => void;
18
+ onListening?: (socket: ReconnectingWebSocket) => void;
16
19
  }
17
20
 
18
- @injectable()
19
21
  export class WebSocketConnectionProvider {
20
-
21
22
  /**
22
23
  * Create a proxy object to remote interface of T type
23
24
  * over a web socket connection for the given path.
@@ -25,38 +26,57 @@ export class WebSocketConnectionProvider {
25
26
  * An optional target can be provided to handle
26
27
  * notifications and requests from a remote side.
27
28
  */
28
- createProxy<T extends object>(path: string, target?: object, options?: WebSocketOptions): JsonRpcProxy<T> {
29
+ createProxy<T extends object>(
30
+ path: string | Promise<string>,
31
+ target?: object,
32
+ options?: WebSocketOptions,
33
+ ): JsonRpcProxy<T> {
29
34
  const factory = new JsonRpcProxyFactory<T>(target);
30
- this.listen({
31
- path,
32
- onConnection: c => factory.listen(c)
33
- }, options);
35
+ const startListening = (path: string) => {
36
+ const socket = this.listen(
37
+ {
38
+ path,
39
+ onConnection: (c) => factory.listen(c),
40
+ },
41
+ {
42
+ onTransportDidClose: () => factory.fireConnectionClosed(),
43
+ onTransportDidOpen: () => factory.fireConnectionOpened(),
44
+ },
45
+ options,
46
+ );
47
+ if (options?.onListening) {
48
+ options.onListening(socket as any as ReconnectingWebSocket);
49
+ }
50
+ };
51
+
52
+ if (typeof path === "string") {
53
+ startListening(path);
54
+ } else {
55
+ path.then((path) => startListening(path));
56
+ }
34
57
  return factory.createProxy();
35
58
  }
36
59
 
37
60
  /**
38
61
  * Install a connection handler for the given path.
39
62
  */
40
- listen(handler: ConnectionHandler, options?: WebSocketOptions): void {
63
+ listen(handler: ConnectionHandler, eventHandler: ConnectionEventHandler, options?: WebSocketOptions): WebSocket {
41
64
  const url = handler.path;
42
- const webSocket = this.createWebSocket(url, options);
65
+ const webSocket = this.createWebSocket(url);
43
66
 
44
67
  const logger = this.createLogger();
45
68
  if (options && options.onerror) {
46
69
  const onerror = options.onerror;
47
- webSocket.addEventListener('error', (event) => {
70
+ webSocket.addEventListener("error", (event) => {
48
71
  onerror(event);
49
72
  });
50
73
  } else {
51
- webSocket.addEventListener('error', (error: Event) => {
74
+ webSocket.addEventListener("error", (error: Event) => {
52
75
  logger.error(JSON.stringify(error));
53
76
  });
54
77
  }
55
- doListen({
56
- webSocket,
57
- onConnection: connection => handler.onConnection(connection),
58
- logger
59
- });
78
+ doListen(webSocket as any as ReconnectingWebSocket, handler, eventHandler, logger);
79
+ return webSocket;
60
80
  }
61
81
 
62
82
  protected createLogger(): Logger {
@@ -66,16 +86,172 @@ export class WebSocketConnectionProvider {
66
86
  /**
67
87
  * Creates a web socket for the given url
68
88
  */
69
- createWebSocket(url: string, options?: WebSocketOptions): WebSocket {
70
- const socketOptions = {
89
+ createWebSocket(url: string): WebSocket {
90
+ return new ReconnectingWebSocket(url, undefined, {
71
91
  maxReconnectionDelay: 10000,
72
92
  minReconnectionDelay: 1000,
73
93
  reconnectionDelayGrowFactor: 1.3,
74
94
  maxRetries: Infinity,
75
- debug: false
76
- };
77
- const result = new ReconnectingWebSocket(url, undefined, socketOptions);
78
- return result as any; //HACK ReconnectingWebScoket does not fully implement the WebScoket type.
95
+ debug: false,
96
+ WebSocket: WebSocket,
97
+ }) as any;
98
+ }
99
+ }
100
+
101
+ // The following was extracted from vscode-ws-jsonrpc to make these changes:
102
+ // - switch from WebSocket to ReconnectingWebSocket
103
+ // - webSocket.onopen: making sure it's only ever called once so we're re-using MessageConnection
104
+ // - WebSocketMessageWriter: buffer and re-try messages instead of throwing an error immidiately
105
+ // - WebSocketMessageReader: don't close MessageConnection on 'socket.onclose'
106
+ function doListen(
107
+ resocket: ReconnectingWebSocket,
108
+ handler: ConnectionHandler,
109
+ eventHandler: ConnectionEventHandler,
110
+ logger: Logger,
111
+ ) {
112
+ resocket.addEventListener("close", () => eventHandler.onTransportDidClose());
113
+
114
+ let alreadyOpened = false;
115
+ resocket.onopen = () => {
116
+ // trigerr "open" every time we re-open the underlying websocket
117
+ eventHandler.onTransportDidOpen();
118
+
119
+ // make sure we're only ever creating one MessageConnection, irregardless of how many times we have to re-open the underlying (reconnecting) websocket
120
+ if (alreadyOpened) {
121
+ return;
122
+ }
123
+ alreadyOpened = true;
124
+
125
+ const connection = createWebSocketConnection(resocket, logger);
126
+ handler.onConnection(connection);
127
+ };
128
+ }
129
+
130
+ function createWebSocketConnection(resocket: ReconnectingWebSocket, logger: Logger) {
131
+ const socket = toSocket(resocket as any);
132
+ const messageReader = new NonClosingWebSocketMessageReader(socket);
133
+ const messageWriter = new BufferingWebSocketMessageWriter(resocket, logger);
134
+ const connection = createMessageConnection(messageReader, messageWriter, logger);
135
+ connection.onClose(() => connection.dispose());
136
+ return connection;
137
+ }
138
+
139
+ /**
140
+ * This takes vscode-ws-jsonrpc/lib/socket/writer/WebSocketMessageWriter and adds a buffer
141
+ */
142
+ class BufferingWebSocketMessageWriter extends AbstractMessageWriter {
143
+ protected readonly socket: ReconnectingWebSocket;
144
+ protected readonly logger: Logger;
145
+ protected errorCount: number = 0;
146
+
147
+ protected buffer: any[] = [];
148
+
149
+ constructor(socket: ReconnectingWebSocket, logger: Logger) {
150
+ super();
151
+ this.socket = socket;
152
+ this.logger = logger;
153
+
154
+ socket.addEventListener("open", (event: Event) => this.flushBuffer());
155
+ }
156
+
157
+ write(msg: any) {
158
+ if (this.socket.readyState !== ReconnectingWebSocket.OPEN) {
159
+ this.bufferMsg(msg);
160
+ return;
161
+ }
162
+
163
+ try {
164
+ const content = JSON.stringify(msg);
165
+ this.socket.send(content);
166
+ } catch (e) {
167
+ this.errorCount++;
168
+ this.fireError(e, msg, this.errorCount);
169
+
170
+ this.bufferMsg(msg);
171
+ }
172
+ }
173
+
174
+ protected flushBuffer() {
175
+ if (this.buffer.length === 0) {
176
+ return;
177
+ }
178
+
179
+ const buffer = [...this.buffer];
180
+ this.buffer = [];
181
+ for (const msg of buffer) {
182
+ this.write(msg);
183
+ }
184
+ //this.logger.info(`flushed buffer (${this.buffer.length})`)
79
185
  }
80
186
 
187
+ protected bufferMsg(msg: any) {
188
+ this.buffer.push(msg);
189
+ //this.logger.info(`buffered message (${this.buffer.length})`);
190
+ }
191
+ }
192
+
193
+ /**
194
+ * This takes vscode-ws-jsonrpc/lib/socket/reader/WebSocketMessageReader and removes the "onClose -> fireClose" connection
195
+ */
196
+ class NonClosingWebSocketMessageReader extends AbstractMessageReader {
197
+ protected readonly socket: IWebSocket;
198
+ protected readonly events: any[] = [];
199
+ protected state: "initial" | "listening" | "closed" = "initial";
200
+ protected callback: (message: any) => void = () => {};
201
+
202
+ constructor(socket: IWebSocket) {
203
+ super();
204
+ this.socket = socket;
205
+ this.socket.onMessage((message) => this.readMessage(message));
206
+ this.socket.onError((error) => this.fireError(error));
207
+ this.socket.onClose((code, reason) => {
208
+ if (code !== 1000) {
209
+ const error = {
210
+ name: "" + code,
211
+ message: `Error during socket reconnect: code = ${code}, reason = ${reason}`,
212
+ };
213
+ this.fireError(error);
214
+ }
215
+ // this.fireClose(); // <-- reason for this class to be copied over
216
+ });
217
+ }
218
+ listen(callback: (message: any) => void) {
219
+ if (this.state === "initial") {
220
+ this.state = "listening";
221
+ this.callback = callback;
222
+ while (this.events.length !== 0) {
223
+ const event = this.events.pop();
224
+ if (event.message) {
225
+ this.readMessage(event.message);
226
+ } else if (event.error) {
227
+ this.fireError(event.error);
228
+ } else {
229
+ this.fireClose();
230
+ }
231
+ }
232
+ }
233
+ }
234
+ readMessage(message: any) {
235
+ if (this.state === "initial") {
236
+ this.events.splice(0, 0, { message });
237
+ } else if (this.state === "listening") {
238
+ const data = JSON.parse(message);
239
+ this.callback(data);
240
+ }
241
+ }
242
+ fireError(error: any) {
243
+ if (this.state === "initial") {
244
+ this.events.splice(0, 0, { error });
245
+ } else if (this.state === "listening") {
246
+ super.fireError(error);
247
+ }
248
+ }
249
+ fireClose() {
250
+ if (this.state === "initial") {
251
+ this.events.splice(0, 0, {});
252
+ } else if (this.state === "listening") {
253
+ super.fireClose();
254
+ }
255
+ this.state = "closed";
256
+ }
81
257
  }