@gitpod/gitpod-protocol 0.1.5-main.648 → 0.1.5-main.6480
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.
- package/data/gitpod-schema.json +157 -29
- package/lib/accounting-protocol.d.ts +19 -14
- package/lib/accounting-protocol.d.ts.map +1 -1
- package/lib/accounting-protocol.js +44 -48
- package/lib/accounting-protocol.js.map +1 -1
- package/lib/admin-protocol.d.ts +44 -5
- package/lib/admin-protocol.d.ts.map +1 -1
- package/lib/admin-protocol.js +16 -1
- package/lib/admin-protocol.js.map +1 -1
- package/lib/analytics.d.ts +44 -0
- package/lib/analytics.d.ts.map +1 -0
- package/lib/analytics.js +10 -0
- package/lib/analytics.js.map +1 -0
- package/lib/attribution.d.ts +24 -0
- package/lib/attribution.d.ts.map +1 -0
- package/lib/attribution.js +54 -0
- package/lib/attribution.js.map +1 -0
- package/lib/auth.d.ts +1 -1
- package/lib/auth.d.ts.map +1 -1
- package/lib/auth.js +1 -1
- package/lib/billing-mode.d.ts +45 -0
- package/lib/billing-mode.d.ts.map +1 -0
- package/lib/billing-mode.js +44 -0
- package/lib/billing-mode.js.map +1 -0
- package/lib/blocked-repositories-protocol.d.ts +13 -0
- package/lib/blocked-repositories-protocol.d.ts.map +1 -0
- package/lib/blocked-repositories-protocol.js +8 -0
- package/lib/blocked-repositories-protocol.js.map +1 -0
- package/lib/context-url.d.ts +30 -0
- package/lib/context-url.d.ts.map +1 -0
- package/lib/context-url.js +100 -0
- package/lib/context-url.js.map +1 -0
- package/lib/context-url.spec.d.ts +12 -0
- package/lib/context-url.spec.d.ts.map +1 -0
- package/lib/context-url.spec.js +81 -0
- package/lib/context-url.spec.js.map +1 -0
- package/lib/encryption/container-module.d.ts +1 -1
- package/lib/encryption/container-module.d.ts.map +1 -1
- package/lib/encryption/container-module.js +5 -5
- package/lib/encryption/container-module.js.map +1 -1
- package/lib/encryption/encryption-engine.d.ts +1 -1
- package/lib/encryption/encryption-engine.d.ts.map +1 -1
- package/lib/encryption/encryption-engine.js +26 -27
- package/lib/encryption/encryption-engine.js.map +1 -1
- package/lib/encryption/encryption-engine.spec.d.ts +1 -1
- package/lib/encryption/encryption-engine.spec.d.ts.map +1 -1
- package/lib/encryption/encryption-engine.spec.js +30 -38
- package/lib/encryption/encryption-engine.spec.js.map +1 -1
- package/lib/encryption/encryption-service.d.ts +1 -1
- package/lib/encryption/encryption-service.d.ts.map +1 -1
- package/lib/encryption/encryption-service.js +31 -45
- package/lib/encryption/encryption-service.js.map +1 -1
- package/lib/encryption/key-provider.d.ts +1 -1
- package/lib/encryption/key-provider.d.ts.map +1 -1
- package/lib/encryption/key-provider.js +32 -39
- package/lib/encryption/key-provider.js.map +1 -1
- package/lib/env.d.ts +1 -7
- package/lib/env.d.ts.map +1 -1
- package/lib/env.js +8 -28
- package/lib/env.js.map +1 -1
- package/lib/experiments/always-default.d.ts +8 -0
- package/lib/experiments/always-default.d.ts.map +1 -0
- package/lib/experiments/always-default.js +20 -0
- package/lib/experiments/always-default.js.map +1 -0
- package/lib/experiments/configcat-server.d.ts +10 -0
- package/lib/experiments/configcat-server.d.ts.map +1 -0
- package/lib/experiments/configcat-server.js +37 -0
- package/lib/experiments/configcat-server.js.map +1 -0
- package/lib/experiments/configcat.d.ts +21 -0
- package/lib/experiments/configcat.d.ts.map +1 -0
- package/lib/experiments/configcat.js +51 -0
- package/lib/experiments/configcat.js.map +1 -0
- package/lib/experiments/types.d.ts +22 -0
- package/lib/experiments/types.d.ts.map +1 -0
- package/lib/experiments/types.js +10 -0
- package/lib/experiments/types.js.map +1 -0
- package/lib/frontend-dashboard-service.d.ts +90 -0
- package/lib/frontend-dashboard-service.d.ts.map +1 -0
- package/lib/frontend-dashboard-service.js +49 -0
- package/lib/frontend-dashboard-service.js.map +1 -0
- package/lib/gitpod-file-parser.d.ts +1 -1
- package/lib/gitpod-file-parser.d.ts.map +1 -1
- package/lib/gitpod-file-parser.js +27 -43
- package/lib/gitpod-file-parser.js.map +1 -1
- package/lib/gitpod-file-parser.spec.d.ts +1 -1
- package/lib/gitpod-file-parser.spec.js +146 -143
- package/lib/gitpod-file-parser.spec.js.map +1 -1
- package/lib/gitpod-service.d.ts +191 -55
- package/lib/gitpod-service.d.ts.map +1 -1
- package/lib/gitpod-service.js +204 -298
- package/lib/gitpod-service.js.map +1 -1
- package/lib/headless-workspace-log.d.ts +10 -12
- package/lib/headless-workspace-log.d.ts.map +1 -1
- package/lib/headless-workspace-log.js +7 -9
- package/lib/headless-workspace-log.js.map +1 -1
- package/lib/ide-frontend-service.d.ts +2 -2
- package/lib/ide-frontend-service.js +1 -1
- package/lib/ide-protocol.d.ts +126 -0
- package/lib/ide-protocol.d.ts.map +1 -0
- package/lib/ide-protocol.js +18 -0
- package/lib/ide-protocol.js.map +1 -0
- package/lib/index.d.ts +17 -11
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +8 -2
- package/lib/index.js.map +1 -1
- package/lib/installation-admin-protocol.d.ts +30 -0
- package/lib/installation-admin-protocol.d.ts.map +1 -0
- package/lib/installation-admin-protocol.js +31 -0
- package/lib/installation-admin-protocol.js.map +1 -0
- package/lib/license-protocol.d.ts +8 -1
- package/lib/license-protocol.d.ts.map +1 -1
- package/lib/license-protocol.js +1 -1
- package/lib/license-protocol.js.map +1 -1
- package/lib/messaging/browser/connection.d.ts +4 -6
- package/lib/messaging/browser/connection.d.ts.map +1 -1
- package/lib/messaging/browser/connection.js +176 -45
- package/lib/messaging/browser/connection.js.map +1 -1
- package/lib/messaging/browser/window-connection.d.ts +5 -5
- package/lib/messaging/browser/window-connection.d.ts.map +1 -1
- package/lib/messaging/browser/window-connection.js +43 -60
- package/lib/messaging/browser/window-connection.js.map +1 -1
- package/lib/messaging/client-call-metrics.d.ts +21 -0
- package/lib/messaging/client-call-metrics.d.ts.map +1 -0
- package/lib/messaging/client-call-metrics.js +95 -0
- package/lib/messaging/client-call-metrics.js.map +1 -0
- package/lib/messaging/error.d.ts +13 -3
- package/lib/messaging/error.d.ts.map +1 -1
- package/lib/messaging/error.js +25 -5
- package/lib/messaging/error.js.map +1 -1
- package/lib/messaging/handler.d.ts +10 -0
- package/lib/messaging/handler.d.ts.map +1 -1
- package/lib/messaging/handler.js +1 -1
- package/lib/messaging/node/connection.d.ts +1 -17
- package/lib/messaging/node/connection.d.ts.map +1 -1
- package/lib/messaging/node/connection.js +24 -60
- package/lib/messaging/node/connection.js.map +1 -1
- package/lib/messaging/proxy-factory.d.ts +3 -1
- package/lib/messaging/proxy-factory.d.ts.map +1 -1
- package/lib/messaging/proxy-factory.js +75 -162
- package/lib/messaging/proxy-factory.js.map +1 -1
- package/lib/oss-allowlist.d.ts +14 -0
- package/lib/oss-allowlist.d.ts.map +1 -0
- package/lib/oss-allowlist.js +8 -0
- package/lib/oss-allowlist.js.map +1 -0
- package/lib/payment-protocol.d.ts +1 -1
- package/lib/payment-protocol.d.ts.map +1 -1
- package/lib/payment-protocol.js +2 -2
- package/lib/payment-protocol.js.map +1 -1
- package/lib/permission.d.ts +14 -4
- package/lib/permission.d.ts.map +1 -1
- package/lib/permission.js +45 -32
- package/lib/permission.js.map +1 -1
- package/lib/plans.d.ts +6 -5
- package/lib/plans.d.ts.map +1 -1
- package/lib/plans.js +230 -210
- package/lib/plans.js.map +1 -1
- package/lib/protocol.d.ts +261 -105
- package/lib/protocol.d.ts.map +1 -1
- package/lib/protocol.js +346 -205
- package/lib/protocol.js.map +1 -1
- package/{src/util/without.ts → lib/protocol.spec.d.ts} +3 -4
- package/lib/protocol.spec.d.ts.map +1 -0
- package/lib/protocol.spec.js +127 -0
- package/lib/protocol.spec.js.map +1 -0
- package/lib/snapshot-url.d.ts +14 -0
- package/lib/snapshot-url.d.ts.map +1 -0
- package/lib/snapshot-url.js +26 -0
- package/lib/snapshot-url.js.map +1 -0
- package/lib/snapshot-url.spec.d.ts +7 -0
- package/lib/snapshot-url.spec.d.ts.map +1 -0
- package/lib/snapshot-url.spec.js +41 -0
- package/lib/snapshot-url.spec.js.map +1 -0
- package/lib/team-subscription-protocol.d.ts +24 -5
- package/lib/team-subscription-protocol.d.ts.map +1 -1
- package/lib/team-subscription-protocol.js +36 -18
- package/lib/team-subscription-protocol.js.map +1 -1
- package/lib/teams-projects-protocol.d.ts +137 -0
- package/lib/teams-projects-protocol.d.ts.map +1 -0
- package/lib/teams-projects-protocol.js +41 -0
- package/lib/teams-projects-protocol.js.map +1 -0
- package/lib/typings/globals.d.ts +3 -3
- package/lib/typings/globals.d.ts.map +1 -1
- package/lib/typings/globals.js +1 -1
- package/lib/usage.d.ts +73 -0
- package/lib/usage.d.ts.map +1 -0
- package/lib/usage.js +20 -0
- package/lib/usage.js.map +1 -0
- package/lib/util/analytics.d.ts +8 -0
- package/lib/util/analytics.d.ts.map +1 -0
- package/lib/util/analytics.js +88 -0
- package/lib/util/analytics.js.map +1 -0
- package/lib/util/async-iterator.d.ts +1 -1
- package/lib/util/async-iterator.d.ts.map +1 -1
- package/lib/util/async-iterator.js +58 -136
- package/lib/util/async-iterator.js.map +1 -1
- package/lib/util/cancelable.d.ts +1 -1
- package/lib/util/cancelable.js +18 -60
- package/lib/util/cancelable.js.map +1 -1
- package/lib/util/date-time.d.ts +1 -1
- package/lib/util/date-time.js +12 -12
- package/lib/util/date-time.js.map +1 -1
- package/lib/util/debug-app.d.ts +25 -0
- package/lib/util/debug-app.d.ts.map +1 -0
- package/lib/util/debug-app.js +100 -0
- package/lib/util/debug-app.js.map +1 -0
- package/lib/util/deep-partial.d.ts +1 -1
- package/lib/util/deep-partial.js +1 -1
- package/lib/util/deferred.d.ts +1 -1
- package/lib/util/deferred.js +11 -13
- package/lib/util/deferred.js.map +1 -1
- package/lib/util/disposable.d.ts.map +1 -1
- package/lib/util/disposable.js +27 -40
- package/lib/util/disposable.js.map +1 -1
- package/lib/util/event.d.ts.map +1 -1
- package/lib/util/event.js +63 -77
- package/lib/util/event.js.map +1 -1
- package/lib/util/garbage-collected-cache.d.ts +2 -1
- package/lib/util/garbage-collected-cache.d.ts.map +1 -1
- package/lib/util/garbage-collected-cache.js +33 -48
- package/lib/util/garbage-collected-cache.js.map +1 -1
- package/lib/util/generate-workspace-id.d.ts +6 -1
- package/lib/util/generate-workspace-id.d.ts.map +1 -1
- package/lib/util/generate-workspace-id.js +469 -502
- package/lib/util/generate-workspace-id.js.map +1 -1
- package/lib/util/generate-workspace-id.spec.d.ts +1 -1
- package/lib/util/generate-workspace-id.spec.js +69 -79
- package/lib/util/generate-workspace-id.spec.js.map +1 -1
- package/lib/util/gitpod-cookie.d.ts +20 -0
- package/lib/util/gitpod-cookie.d.ts.map +1 -0
- package/lib/util/gitpod-cookie.js +41 -0
- package/lib/util/gitpod-cookie.js.map +1 -0
- package/lib/util/gitpod-host-url.d.ts +12 -7
- package/lib/util/gitpod-host-url.d.ts.map +1 -1
- package/lib/util/gitpod-host-url.js +132 -110
- package/lib/util/gitpod-host-url.js.map +1 -1
- package/lib/util/gitpod-host-url.spec.d.ts +7 -1
- package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
- package/lib/util/gitpod-host-url.spec.js +113 -31
- package/lib/util/gitpod-host-url.spec.js.map +1 -1
- package/lib/util/grpc.d.ts +35 -0
- package/lib/util/grpc.d.ts.map +1 -0
- package/lib/util/grpc.js +90 -0
- package/lib/util/grpc.js.map +1 -0
- package/lib/util/jaeger-client-types.d.ts +68 -0
- package/lib/util/jaeger-client-types.d.ts.map +1 -0
- package/lib/{theia-plugins.js → util/jaeger-client-types.js} +2 -2
- package/lib/util/jaeger-client-types.js.map +1 -0
- package/lib/util/logging.d.ts +50 -34
- package/lib/util/logging.d.ts.map +1 -1
- package/lib/util/logging.js +133 -130
- package/lib/util/logging.js.map +1 -1
- package/lib/util/logging.spec.d.ts +7 -0
- package/lib/util/logging.spec.d.ts.map +1 -0
- package/lib/util/logging.spec.js +52 -0
- package/lib/util/logging.spec.js.map +1 -0
- package/lib/util/make-link.d.ts +1 -1
- package/lib/util/make-link.js +6 -6
- package/lib/util/make-link.js.map +1 -1
- package/lib/util/nice-grpc.d.ts +9 -0
- package/lib/util/nice-grpc.d.ts.map +1 -0
- package/lib/util/nice-grpc.js +121 -0
- package/lib/util/nice-grpc.js.map +1 -0
- package/lib/util/parse-workspace-id.d.ts +11 -1
- package/lib/util/parse-workspace-id.d.ts.map +1 -1
- package/lib/util/parse-workspace-id.js +31 -8
- package/lib/util/parse-workspace-id.js.map +1 -1
- package/lib/util/parse-workspace-id.spec.d.ts +5 -1
- package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
- package/lib/util/parse-workspace-id.spec.js +124 -85
- package/lib/util/parse-workspace-id.spec.js.map +1 -1
- package/lib/util/queue.d.ts +1 -1
- package/lib/util/queue.js +17 -56
- package/lib/util/queue.js.map +1 -1
- package/lib/util/queue.spec.d.ts +1 -1
- package/lib/util/queue.spec.js +148 -289
- package/lib/util/queue.spec.js.map +1 -1
- package/lib/util/repeat.d.ts +15 -0
- package/lib/util/repeat.d.ts.map +1 -0
- package/lib/util/repeat.js +55 -0
- package/lib/util/repeat.js.map +1 -0
- package/lib/util/semaphore.d.ts +1 -1
- package/lib/util/semaphore.d.ts.map +1 -1
- package/lib/util/semaphore.js +16 -47
- package/lib/util/semaphore.js.map +1 -1
- package/lib/util/skip-if.d.ts +1 -1
- package/lib/util/skip-if.d.ts.map +1 -1
- package/lib/util/skip-if.js +7 -7
- package/lib/util/skip-if.js.map +1 -1
- package/lib/util/timeutil.d.ts +3 -1
- package/lib/util/timeutil.d.ts.map +1 -1
- package/lib/util/timeutil.js +30 -18
- package/lib/util/timeutil.js.map +1 -1
- package/lib/util/timeutil.spec.d.ts +3 -1
- package/lib/util/timeutil.spec.d.ts.map +1 -1
- package/lib/util/timeutil.spec.js +55 -24
- package/lib/util/timeutil.spec.js.map +1 -1
- package/lib/util/tracing.d.ts +53 -7
- package/lib/util/tracing.d.ts.map +1 -1
- package/lib/util/tracing.js +198 -65
- package/lib/util/tracing.js.map +1 -1
- package/lib/util/tracing.spec.d.ts +7 -0
- package/lib/util/tracing.spec.d.ts.map +1 -0
- package/lib/util/tracing.spec.js +121 -0
- package/lib/util/tracing.spec.js.map +1 -0
- package/lib/util/workspace-port-authentication.d.ts +8 -8
- package/lib/util/workspace-port-authentication.d.ts.map +1 -1
- package/lib/util/workspace-port-authentication.js +10 -13
- package/lib/util/workspace-port-authentication.js.map +1 -1
- package/lib/webhook-event.d.ts +44 -0
- package/lib/webhook-event.d.ts.map +1 -0
- package/lib/webhook-event.js +8 -0
- package/lib/webhook-event.js.map +1 -0
- package/lib/workspace-class.d.ts +14 -0
- package/lib/workspace-class.d.ts.map +1 -0
- package/lib/workspace-class.js +8 -0
- package/lib/workspace-class.js.map +1 -0
- package/lib/workspace-cluster.d.ts +28 -8
- package/lib/workspace-cluster.d.ts.map +1 -1
- package/lib/workspace-cluster.js +20 -5
- package/lib/workspace-cluster.js.map +1 -1
- package/lib/workspace-instance.d.ts +46 -6
- package/lib/workspace-instance.d.ts.map +1 -1
- package/lib/workspace-instance.js +1 -1
- package/lib/wsready.d.ts +8 -2
- package/lib/wsready.d.ts.map +1 -1
- package/lib/wsready.js +3 -3
- package/package.json +40 -18
- package/pkg-yarn.lock +23 -10
- package/provenance-bundle.jsonl +2 -0
- package/src/accounting-protocol.ts +67 -58
- package/src/admin-protocol.ts +88 -20
- package/src/analytics.ts +52 -0
- package/src/attribution.ts +63 -0
- package/src/auth.ts +3 -3
- package/src/billing-mode.ts +84 -0
- package/src/blocked-repositories-protocol.ts +13 -0
- package/src/context-url.spec.ts +49 -0
- package/src/context-url.ts +107 -0
- package/src/encryption/container-module.ts +3 -4
- package/src/encryption/encryption-engine.spec.ts +10 -9
- package/src/encryption/encryption-engine.ts +21 -17
- package/src/encryption/encryption-service.ts +5 -6
- package/src/encryption/key-provider.ts +17 -20
- package/src/env.ts +2 -25
- package/src/experiments/always-default.ts +24 -0
- package/src/experiments/configcat-server.ts +42 -0
- package/src/experiments/configcat.ts +56 -0
- package/src/experiments/types.ts +34 -0
- package/src/frontend-dashboard-service.ts +125 -0
- package/src/gitpod-file-parser.spec.ts +56 -62
- package/src/gitpod-file-parser.ts +17 -18
- package/src/gitpod-service.ts +369 -146
- package/src/headless-workspace-log.ts +13 -15
- package/src/ide-frontend-service.ts +3 -3
- package/src/ide-protocol.ts +147 -0
- package/src/index.ts +17 -11
- package/src/installation-admin-protocol.ts +45 -0
- package/src/license-protocol.ts +13 -7
- package/src/messaging/browser/connection.ts +187 -28
- package/src/messaging/browser/window-connection.ts +40 -30
- package/src/messaging/client-call-metrics.ts +94 -0
- package/src/messaging/error.ts +36 -8
- package/src/messaging/handler.ts +13 -1
- package/src/messaging/node/connection.ts +23 -70
- package/src/messaging/proxy-factory.ts +35 -34
- package/src/oss-allowlist.ts +15 -0
- package/src/payment-protocol.ts +3 -3
- package/src/permission.ts +47 -34
- package/src/plans.ts +250 -199
- package/src/protocol.spec.ts +97 -0
- package/src/protocol.ts +636 -293
- package/src/snapshot-url.spec.ts +27 -0
- package/src/snapshot-url.ts +27 -0
- package/src/team-subscription-protocol.ts +62 -23
- package/src/teams-projects-protocol.ts +181 -0
- package/src/typings/globals.ts +6 -5
- package/src/usage.ts +85 -0
- package/src/util/analytics.ts +109 -0
- package/src/util/async-iterator.ts +5 -6
- package/src/util/cancelable.ts +4 -4
- package/src/util/date-time.ts +9 -9
- package/src/util/debug-app.ts +81 -0
- package/src/util/deep-partial.ts +1 -1
- package/src/util/deferred.ts +7 -7
- package/src/util/disposable.ts +3 -6
- package/src/util/event.ts +9 -11
- package/src/util/garbage-collected-cache.ts +17 -9
- package/src/util/generate-workspace-id.spec.ts +38 -11
- package/src/util/generate-workspace-id.ts +465 -439
- package/src/util/gitpod-cookie.ts +38 -0
- package/src/util/gitpod-host-url.spec.ts +59 -8
- package/src/util/gitpod-host-url.ts +88 -48
- package/src/util/grpc.ts +107 -0
- package/src/util/jaeger-client-types.ts +102 -0
- package/src/util/logging.spec.ts +23 -0
- package/src/util/logging.ts +157 -75
- package/src/util/make-link.ts +7 -8
- package/src/util/nice-grpc.ts +96 -0
- package/src/util/parse-workspace-id.spec.ts +38 -9
- package/src/util/parse-workspace-id.ts +33 -8
- package/src/util/queue.spec.ts +28 -26
- package/src/util/queue.ts +1 -1
- package/src/util/repeat.ts +45 -0
- package/src/util/semaphore.ts +7 -9
- package/src/util/skip-if.ts +11 -8
- package/src/util/timeutil.spec.ts +41 -15
- package/src/util/timeutil.ts +32 -16
- package/src/util/tracing.spec.ts +88 -0
- package/src/util/tracing.ts +201 -32
- package/src/util/workspace-port-authentication.ts +11 -14
- package/src/webhook-event.ts +55 -0
- package/src/workspace-class.ts +14 -0
- package/src/workspace-cluster.ts +47 -17
- package/src/workspace-instance.ts +106 -32
- package/src/wsready.ts +11 -4
- package/data/builtin-theia-plugins.json +0 -372
- package/lib/email-protocol.d.ts +0 -50
- package/lib/email-protocol.d.ts.map +0 -1
- package/lib/email-protocol.js +0 -28
- package/lib/email-protocol.js.map +0 -1
- package/lib/messaging/connection-error-handler.d.ts +0 -27
- package/lib/messaging/connection-error-handler.d.ts.map +0 -1
- package/lib/messaging/connection-error-handler.js +0 -46
- package/lib/messaging/connection-error-handler.js.map +0 -1
- package/lib/theia-plugins.d.ts +0 -11
- package/lib/theia-plugins.d.ts.map +0 -1
- package/lib/theia-plugins.js.map +0 -1
- package/lib/util/context-url.d.ts +0 -13
- package/lib/util/context-url.d.ts.map +0 -1
- package/lib/util/context-url.js +0 -26
- package/lib/util/context-url.js.map +0 -1
- package/lib/util/context-url.spec.d.ts +0 -10
- package/lib/util/context-url.spec.d.ts.map +0 -1
- package/lib/util/context-url.spec.js +0 -52
- package/lib/util/context-url.spec.js.map +0 -1
- package/lib/util/repeater.d.ts +0 -22
- package/lib/util/repeater.d.ts.map +0 -1
- package/lib/util/repeater.js +0 -118
- package/lib/util/repeater.js.map +0 -1
- package/lib/util/safe-promise.d.ts +0 -11
- package/lib/util/safe-promise.d.ts.map +0 -1
- package/lib/util/safe-promise.js +0 -34
- package/lib/util/safe-promise.js.map +0 -1
- package/lib/util/without.d.ts +0 -7
- package/lib/util/without.d.ts.map +0 -1
- package/lib/util/without.js +0 -8
- package/lib/util/without.js.map +0 -1
- package/src/email-protocol.ts +0 -67
- package/src/messaging/connection-error-handler.ts +0 -62
- package/src/theia-plugins.ts +0 -11
- package/src/util/context-url.spec.ts +0 -25
- package/src/util/context-url.ts +0 -23
- package/src/util/jaeger-client.d.ts +0 -105
- package/src/util/repeater.ts +0 -49
- package/src/util/safe-promise.ts +0 -26
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
import * as cookie from "cookie";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* This cookie indicates whether the connected client is a Gitpod user (= "has logged in within the last year") or not.
|
|
10
|
+
* This is used by "gitpod.io" and "www.gitpod.io" to display different content/buttons.
|
|
11
|
+
*/
|
|
12
|
+
export const NAME = "gitpod-user";
|
|
13
|
+
export const VALUE = "true";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param domain The domain the Gitpod installation is installed onto
|
|
17
|
+
* @returns
|
|
18
|
+
*/
|
|
19
|
+
export function options(domain: string): cookie.CookieSerializeOptions {
|
|
20
|
+
// Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
|
|
21
|
+
return {
|
|
22
|
+
path: "/", // make sure we send the cookie to all sub-pages
|
|
23
|
+
httpOnly: false,
|
|
24
|
+
secure: false,
|
|
25
|
+
maxAge: 60 * 60 * 24 * 365, // 1 year
|
|
26
|
+
sameSite: "lax", // default: true. "Lax" needed to ensure we see cookies from users that neavigate to gitpod.io from external sites
|
|
27
|
+
domain: `.${domain}`, // explicilty include subdomains to not only cover "gitpod.io", but also "www.gitpod.io" or workspaces
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function generateCookie(domain: string): string {
|
|
32
|
+
return cookie.serialize(NAME, VALUE, options(domain));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function isPresent(cookies: string): boolean {
|
|
36
|
+
// needs to match the old (gitpod-user=loggedIn) and new (gitpod-user=true) values to ensure a smooth transition during rollout.
|
|
37
|
+
return !!cookies.match(`${NAME}=`);
|
|
38
|
+
}
|
|
@@ -1,25 +1,76 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright (c) 2020 Gitpod GmbH. All rights reserved.
|
|
3
3
|
* Licensed under the GNU Affero General Public License (AGPL).
|
|
4
|
-
* See License
|
|
4
|
+
* See License.AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import * as chai from
|
|
8
|
-
import { suite, test } from
|
|
9
|
-
import { GitpodHostUrl } from
|
|
7
|
+
import * as chai from "chai";
|
|
8
|
+
import { suite, test } from "mocha-typescript";
|
|
9
|
+
import { GitpodHostUrl } from "./gitpod-host-url";
|
|
10
10
|
const expect = chai.expect;
|
|
11
11
|
|
|
12
12
|
@suite
|
|
13
13
|
export class GitpodHostUrlTest {
|
|
14
|
-
|
|
15
14
|
@test public parseWorkspaceId_pathBased() {
|
|
16
|
-
const actual = GitpodHostUrl.fromWorkspaceUrl(
|
|
15
|
+
const actual = GitpodHostUrl.fromWorkspaceUrl(
|
|
16
|
+
"http://35.223.201.195/workspace/bc77e03d-c781-4235-bca0-e24087f5e472/",
|
|
17
|
+
).workspaceId;
|
|
17
18
|
expect(actual).to.equal("bc77e03d-c781-4235-bca0-e24087f5e472");
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
@test public parseWorkspaceId_hosts_withEnvVarsInjected() {
|
|
21
|
-
const actual = GitpodHostUrl.fromWorkspaceUrl(
|
|
22
|
+
const actual = GitpodHostUrl.fromWorkspaceUrl(
|
|
23
|
+
"https://gray-grasshopper-nfbitfia.ws-eu02.gitpod-staging.com/#passedin=test%20value/https://github.com/gitpod-io/gitpod-test-repo",
|
|
24
|
+
).workspaceId;
|
|
22
25
|
expect(actual).to.equal("gray-grasshopper-nfbitfia");
|
|
23
26
|
}
|
|
27
|
+
|
|
28
|
+
@test public async testWithoutWorkspacePrefix() {
|
|
29
|
+
expect(
|
|
30
|
+
GitpodHostUrl.fromWorkspaceUrl("https://3000-moccasin-ferret-155799b3.ws-eu02.gitpod-staging.com/")
|
|
31
|
+
.withoutWorkspacePrefix()
|
|
32
|
+
.toString(),
|
|
33
|
+
).to.equal("https://gitpod-staging.com/");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@test public async testWithoutWorkspacePrefix2() {
|
|
37
|
+
expect(
|
|
38
|
+
GitpodHostUrl.fromWorkspaceUrl("https://gitpod-staging.com/").withoutWorkspacePrefix().toString(),
|
|
39
|
+
).to.equal("https://gitpod-staging.com/");
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@test public async testWithoutWorkspacePrefix3() {
|
|
43
|
+
expect(
|
|
44
|
+
GitpodHostUrl.fromWorkspaceUrl("https://gray-rook-5523v5d8.ws-dev.my-branch-1234.staging.gitpod-dev.com/")
|
|
45
|
+
.withoutWorkspacePrefix()
|
|
46
|
+
.toString(),
|
|
47
|
+
).to.equal("https://my-branch-1234.staging.gitpod-dev.com/");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@test public async testWithoutWorkspacePrefix4() {
|
|
51
|
+
expect(
|
|
52
|
+
GitpodHostUrl.fromWorkspaceUrl("https://my-branch-1234.staging.gitpod-dev.com/")
|
|
53
|
+
.withoutWorkspacePrefix()
|
|
54
|
+
.toString(),
|
|
55
|
+
).to.equal("https://my-branch-1234.staging.gitpod-dev.com/");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@test public async testWithoutWorkspacePrefix5() {
|
|
59
|
+
expect(
|
|
60
|
+
GitpodHostUrl.fromWorkspaceUrl("https://abc-nice-brunch-4224.staging.gitpod-dev.com/")
|
|
61
|
+
.withoutWorkspacePrefix()
|
|
62
|
+
.toString(),
|
|
63
|
+
).to.equal("https://abc-nice-brunch-4224.staging.gitpod-dev.com/");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@test public async testWithoutWorkspacePrefix6() {
|
|
67
|
+
expect(
|
|
68
|
+
GitpodHostUrl.fromWorkspaceUrl(
|
|
69
|
+
"https://gray-rook-5523v5d8.ws-dev.abc-nice-brunch-4224.staging.gitpod-dev.com/",
|
|
70
|
+
)
|
|
71
|
+
.withoutWorkspacePrefix()
|
|
72
|
+
.toString(),
|
|
73
|
+
).to.equal("https://abc-nice-brunch-4224.staging.gitpod-dev.com/");
|
|
74
|
+
}
|
|
24
75
|
}
|
|
25
|
-
module.exports = new GitpodHostUrlTest()
|
|
76
|
+
module.exports = new GitpodHostUrlTest();
|
|
@@ -1,33 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright (c) 2020 Gitpod GmbH. All rights reserved.
|
|
3
3
|
* Licensed under the GNU Affero General Public License (AGPL).
|
|
4
|
-
* See License
|
|
4
|
+
* See License.AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
const URL = require(
|
|
8
|
-
import { log } from
|
|
7
|
+
const URL = require("url").URL || window.URL;
|
|
8
|
+
import { log } from "./logging";
|
|
9
9
|
|
|
10
10
|
export interface UrlChange {
|
|
11
|
-
(old: URL): Partial<URL
|
|
11
|
+
(old: URL): Partial<URL>;
|
|
12
12
|
}
|
|
13
13
|
export type UrlUpdate = UrlChange | Partial<URL>;
|
|
14
14
|
|
|
15
|
+
const baseWorkspaceIDRegex =
|
|
16
|
+
"(([a-f][0-9a-f]{7}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})|([0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8,11}))";
|
|
17
|
+
|
|
15
18
|
// this pattern matches v4 UUIDs as well as the new generated workspace ids (e.g. pink-panda-ns35kd21)
|
|
16
|
-
|
|
19
|
+
const workspaceIDRegex = RegExp(`^(?:debug-)?${baseWorkspaceIDRegex}$`);
|
|
20
|
+
|
|
21
|
+
// this pattern matches URL prefixes of workspaces
|
|
22
|
+
const workspaceUrlPrefixRegex = RegExp(`^(([0-9]{4,6}|debug)-)?${baseWorkspaceIDRegex}\\.`);
|
|
17
23
|
|
|
18
24
|
export class GitpodHostUrl {
|
|
19
25
|
readonly url: URL;
|
|
20
26
|
|
|
21
27
|
constructor(urlParam?: string | URL) {
|
|
22
|
-
if (urlParam === undefined || typeof urlParam ===
|
|
23
|
-
this.url = new URL(urlParam ||
|
|
24
|
-
this.url.search =
|
|
25
|
-
this.url.hash =
|
|
26
|
-
this.url.pathname =
|
|
28
|
+
if (urlParam === undefined || typeof urlParam === "string") {
|
|
29
|
+
this.url = new URL(urlParam || "https://gitpod.io");
|
|
30
|
+
this.url.search = "";
|
|
31
|
+
this.url.hash = "";
|
|
32
|
+
this.url.pathname = "";
|
|
27
33
|
} else if (urlParam instanceof URL) {
|
|
28
34
|
this.url = urlParam;
|
|
29
35
|
} else {
|
|
30
|
-
log.error(
|
|
36
|
+
log.error("Unexpected urlParam", { urlParam });
|
|
31
37
|
}
|
|
32
38
|
}
|
|
33
39
|
|
|
@@ -40,11 +46,11 @@ export class GitpodHostUrl {
|
|
|
40
46
|
}
|
|
41
47
|
|
|
42
48
|
withDomainPrefix(prefix: string): GitpodHostUrl {
|
|
43
|
-
return this.with(url => ({ host: prefix + url.host }))
|
|
49
|
+
return this.with((url) => ({ host: prefix + url.host }));
|
|
44
50
|
}
|
|
45
51
|
|
|
46
52
|
withoutWorkspacePrefix(): GitpodHostUrl {
|
|
47
|
-
if (!this.url.host.match(
|
|
53
|
+
if (!this.url.host.match(workspaceUrlPrefixRegex)) {
|
|
48
54
|
// URL has no workspace prefix
|
|
49
55
|
return this;
|
|
50
56
|
}
|
|
@@ -53,14 +59,14 @@ export class GitpodHostUrl {
|
|
|
53
59
|
}
|
|
54
60
|
|
|
55
61
|
withoutDomainPrefix(removeSegmentsCount: number): GitpodHostUrl {
|
|
56
|
-
return this.with(url => ({ host: url.host.split(
|
|
62
|
+
return this.with((url) => ({ host: url.host.split(".").splice(removeSegmentsCount).join(".") }));
|
|
57
63
|
}
|
|
58
64
|
|
|
59
65
|
with(urlUpdate: UrlUpdate) {
|
|
60
|
-
const update = typeof urlUpdate ===
|
|
61
|
-
const addSlashToPath = update.pathname && update.pathname.length > 0 && !update.pathname.startsWith(
|
|
66
|
+
const update = typeof urlUpdate === "function" ? urlUpdate(this.url) : urlUpdate;
|
|
67
|
+
const addSlashToPath = update.pathname && update.pathname.length > 0 && !update.pathname.startsWith("/");
|
|
62
68
|
if (addSlashToPath) {
|
|
63
|
-
update.pathname =
|
|
69
|
+
update.pathname = "/" + update.pathname;
|
|
64
70
|
}
|
|
65
71
|
const result = Object.assign(new URL(this.toString()), update);
|
|
66
72
|
return new GitpodHostUrl(result);
|
|
@@ -68,50 +74,55 @@ export class GitpodHostUrl {
|
|
|
68
74
|
|
|
69
75
|
withApi(urlUpdate?: UrlUpdate) {
|
|
70
76
|
const updated = urlUpdate ? this.with(urlUpdate) : this;
|
|
71
|
-
return updated.with(url => ({ pathname: `/api${url.pathname}` }));
|
|
77
|
+
return updated.with((url) => ({ pathname: `/api${url.pathname}` }));
|
|
72
78
|
}
|
|
73
79
|
|
|
74
|
-
withContext(
|
|
75
|
-
|
|
80
|
+
withContext(
|
|
81
|
+
contextUrl: string,
|
|
82
|
+
startOptions?: { showOptions?: boolean; editor?: string; workspaceClass?: string },
|
|
83
|
+
) {
|
|
84
|
+
const searchParams = new URLSearchParams();
|
|
85
|
+
if (startOptions?.showOptions) {
|
|
86
|
+
searchParams.append("showOptions", "true");
|
|
87
|
+
}
|
|
88
|
+
return this.with((url) => ({ hash: contextUrl, search: searchParams.toString() }));
|
|
76
89
|
}
|
|
77
90
|
|
|
78
91
|
asWebsocket(): GitpodHostUrl {
|
|
79
|
-
return this.with(url => ({ protocol: url.protocol ===
|
|
92
|
+
return this.with((url) => ({ protocol: url.protocol === "https:" ? "wss:" : "ws:" }));
|
|
80
93
|
}
|
|
81
94
|
|
|
82
|
-
|
|
83
|
-
return this.with(url => ({ pathname:
|
|
95
|
+
asWorkspacePage(): GitpodHostUrl {
|
|
96
|
+
return this.with((url) => ({ pathname: "/workspaces" }));
|
|
84
97
|
}
|
|
85
98
|
|
|
86
|
-
|
|
87
|
-
return this.with(url => ({ pathname:
|
|
99
|
+
asDashboard(): GitpodHostUrl {
|
|
100
|
+
return this.with((url) => ({ pathname: "/" }));
|
|
88
101
|
}
|
|
89
102
|
|
|
90
|
-
|
|
91
|
-
return this.with(url => ({ pathname:
|
|
103
|
+
asLogin(): GitpodHostUrl {
|
|
104
|
+
return this.with((url) => ({ pathname: "/login" }));
|
|
92
105
|
}
|
|
93
106
|
|
|
94
107
|
asAccessControl(): GitpodHostUrl {
|
|
95
|
-
return this.with(url => ({ pathname:
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
asSettings(): GitpodHostUrl {
|
|
99
|
-
return this.with(url => ({ pathname: '/settings/' }));
|
|
108
|
+
return this.with((url) => ({ pathname: "/integrations" }));
|
|
100
109
|
}
|
|
101
110
|
|
|
102
|
-
|
|
103
|
-
return this.with(url => ({ pathname:
|
|
111
|
+
asPreferences(): GitpodHostUrl {
|
|
112
|
+
return this.with((url) => ({ pathname: "/user/preferences" }));
|
|
104
113
|
}
|
|
105
114
|
|
|
106
115
|
asStart(workspaceId = this.workspaceId): GitpodHostUrl {
|
|
107
116
|
return this.withoutWorkspacePrefix().with({
|
|
108
|
-
pathname:
|
|
109
|
-
hash:
|
|
117
|
+
pathname: "/start/",
|
|
118
|
+
hash: "#" + workspaceId,
|
|
110
119
|
});
|
|
111
120
|
}
|
|
112
121
|
|
|
113
|
-
asWorkspaceAuth(instanceID: string
|
|
114
|
-
return this.with(url => ({
|
|
122
|
+
asWorkspaceAuth(instanceID: string): GitpodHostUrl {
|
|
123
|
+
return this.with((url) => ({
|
|
124
|
+
pathname: `/api/auth/workspace-cookie/${instanceID}`,
|
|
125
|
+
}));
|
|
115
126
|
}
|
|
116
127
|
|
|
117
128
|
toString() {
|
|
@@ -120,43 +131,72 @@ export class GitpodHostUrl {
|
|
|
120
131
|
|
|
121
132
|
toStringWoRootSlash() {
|
|
122
133
|
let result = this.toString();
|
|
123
|
-
if (result.endsWith(
|
|
134
|
+
if (result.endsWith("/")) {
|
|
124
135
|
result = result.slice(0, result.length - 1);
|
|
125
136
|
}
|
|
126
137
|
return result;
|
|
127
138
|
}
|
|
128
139
|
|
|
140
|
+
get debugWorkspace(): boolean {
|
|
141
|
+
return this.url.host.match(workspaceUrlPrefixRegex)?.[2] === "debug";
|
|
142
|
+
}
|
|
143
|
+
|
|
129
144
|
get workspaceId(): string | undefined {
|
|
130
145
|
const hostSegs = this.url.host.split(".");
|
|
131
|
-
if (hostSegs.length > 1
|
|
132
|
-
|
|
133
|
-
|
|
146
|
+
if (hostSegs.length > 1) {
|
|
147
|
+
const matchResults = hostSegs[0].match(workspaceIDRegex);
|
|
148
|
+
if (matchResults) {
|
|
149
|
+
// URL has a workspace prefix
|
|
150
|
+
// port prefixes are excluded
|
|
151
|
+
return matchResults[1];
|
|
152
|
+
}
|
|
134
153
|
}
|
|
135
154
|
|
|
136
|
-
const pathSegs = this.url.pathname.split("/")
|
|
155
|
+
const pathSegs = this.url.pathname.split("/");
|
|
137
156
|
if (pathSegs.length > 3 && pathSegs[1] === "workspace") {
|
|
138
157
|
return pathSegs[2];
|
|
139
158
|
}
|
|
140
159
|
|
|
160
|
+
const cleanHash = this.url.hash.replace(/^#/, "");
|
|
161
|
+
if (this.url.pathname == "/start/" && cleanHash.match(workspaceIDRegex)) {
|
|
162
|
+
return cleanHash;
|
|
163
|
+
}
|
|
164
|
+
|
|
141
165
|
return undefined;
|
|
142
166
|
}
|
|
143
167
|
|
|
144
|
-
get blobServe(): boolean
|
|
168
|
+
get blobServe(): boolean {
|
|
145
169
|
const hostSegments = this.url.host.split(".");
|
|
146
|
-
if (hostSegments[0] ===
|
|
170
|
+
if (hostSegments[0] === "blobserve") {
|
|
147
171
|
return true;
|
|
148
172
|
}
|
|
149
173
|
|
|
150
|
-
const pathSegments = this.url.pathname.split("/")
|
|
174
|
+
const pathSegments = this.url.pathname.split("/");
|
|
151
175
|
return pathSegments[0] === "blobserve";
|
|
152
176
|
}
|
|
153
177
|
|
|
154
178
|
asSorry(message: string) {
|
|
155
|
-
return this.with({ pathname:
|
|
179
|
+
return this.with({ pathname: "/sorry", hash: message });
|
|
156
180
|
}
|
|
157
181
|
|
|
158
182
|
asApiLogout(): GitpodHostUrl {
|
|
159
|
-
return this.withApi(url => ({ pathname:
|
|
183
|
+
return this.withApi((url) => ({ pathname: "/logout/" }));
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
asIDEProxy(): GitpodHostUrl {
|
|
187
|
+
const hostSegments = this.url.host.split(".");
|
|
188
|
+
if (hostSegments[0] === "ide") {
|
|
189
|
+
return this;
|
|
190
|
+
}
|
|
191
|
+
return this.with((url) => ({ host: "ide." + url.host }));
|
|
160
192
|
}
|
|
161
193
|
|
|
194
|
+
asIDEMetrics(): GitpodHostUrl {
|
|
195
|
+
let newUrl: GitpodHostUrl = this;
|
|
196
|
+
const hostSegments = this.url.host.split(".");
|
|
197
|
+
if (hostSegments[0] !== "ide") {
|
|
198
|
+
newUrl = newUrl.asIDEProxy();
|
|
199
|
+
}
|
|
200
|
+
return newUrl.with((url) => ({ pathname: "/metrics-api" }));
|
|
201
|
+
}
|
|
162
202
|
}
|
package/src/util/grpc.ts
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
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 * as grpc from "@grpc/grpc-js";
|
|
8
|
+
import { Status } from "@grpc/grpc-js/build/src/constants";
|
|
9
|
+
|
|
10
|
+
export const defaultGRPCOptions = {
|
|
11
|
+
"grpc.keepalive_timeout_ms": 10000,
|
|
12
|
+
"grpc.keepalive_time_ms": 60000,
|
|
13
|
+
"grpc.http2.min_time_between_pings_ms": 10000,
|
|
14
|
+
"grpc.keepalive_permit_without_calls": 1,
|
|
15
|
+
"grpc-node.max_session_memory": 50,
|
|
16
|
+
"grpc.max_reconnect_backoff_ms": 5000,
|
|
17
|
+
"grpc.max_receive_message_length": 1024 * 1024 * 16,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type GrpcMethodType = "unary" | "client_stream" | "server_stream" | "bidi_stream";
|
|
21
|
+
|
|
22
|
+
export interface IGrpcCallMetricsLabels {
|
|
23
|
+
service: string;
|
|
24
|
+
method: string;
|
|
25
|
+
type: GrpcMethodType;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface IGrpcCallMetricsLabelsWithCode extends IGrpcCallMetricsLabels {
|
|
29
|
+
code: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const IClientCallMetrics = Symbol("IClientCallMetrics");
|
|
33
|
+
|
|
34
|
+
export interface IClientCallMetrics {
|
|
35
|
+
started(labels: IGrpcCallMetricsLabels): void;
|
|
36
|
+
sent(labels: IGrpcCallMetricsLabels): void;
|
|
37
|
+
received(labels: IGrpcCallMetricsLabels): void;
|
|
38
|
+
handled(labels: IGrpcCallMetricsLabelsWithCode): void;
|
|
39
|
+
startHandleTimer(
|
|
40
|
+
labels: IGrpcCallMetricsLabels,
|
|
41
|
+
): (labels?: Partial<Record<string, string | number>> | undefined) => number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function getGrpcMethodType(requestStream: boolean, responseStream: boolean): GrpcMethodType {
|
|
45
|
+
if (requestStream) {
|
|
46
|
+
if (responseStream) {
|
|
47
|
+
return "bidi_stream";
|
|
48
|
+
} else {
|
|
49
|
+
return "client_stream";
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
if (responseStream) {
|
|
53
|
+
return "server_stream";
|
|
54
|
+
} else {
|
|
55
|
+
return "unary";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function createClientCallMetricsInterceptor(metrics: IClientCallMetrics): grpc.Interceptor {
|
|
61
|
+
return (options, nextCall): grpc.InterceptingCall => {
|
|
62
|
+
const methodDef = options.method_definition;
|
|
63
|
+
const method = methodDef.path.substring(methodDef.path.lastIndexOf("/") + 1);
|
|
64
|
+
const service = methodDef.path.substring(1, methodDef.path.length - method.length - 1);
|
|
65
|
+
const labels = {
|
|
66
|
+
service,
|
|
67
|
+
method,
|
|
68
|
+
type: getGrpcMethodType(options.method_definition.requestStream, options.method_definition.responseStream),
|
|
69
|
+
};
|
|
70
|
+
const requester = new grpc.RequesterBuilder()
|
|
71
|
+
.withStart((metadata, listener, next) => {
|
|
72
|
+
const newListener = new grpc.ListenerBuilder()
|
|
73
|
+
.withOnReceiveStatus((status, next) => {
|
|
74
|
+
try {
|
|
75
|
+
metrics.handled({
|
|
76
|
+
...labels,
|
|
77
|
+
code: Status[status.code],
|
|
78
|
+
});
|
|
79
|
+
} finally {
|
|
80
|
+
next(status);
|
|
81
|
+
}
|
|
82
|
+
})
|
|
83
|
+
.withOnReceiveMessage((message, next) => {
|
|
84
|
+
try {
|
|
85
|
+
metrics.received(labels);
|
|
86
|
+
} finally {
|
|
87
|
+
next(message);
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
.build();
|
|
91
|
+
try {
|
|
92
|
+
metrics.started(labels);
|
|
93
|
+
} finally {
|
|
94
|
+
next(metadata, newListener);
|
|
95
|
+
}
|
|
96
|
+
})
|
|
97
|
+
.withSendMessage((message, next) => {
|
|
98
|
+
try {
|
|
99
|
+
metrics.sent(labels);
|
|
100
|
+
} finally {
|
|
101
|
+
next(message);
|
|
102
|
+
}
|
|
103
|
+
})
|
|
104
|
+
.build();
|
|
105
|
+
return new grpc.InterceptingCall(nextCall(options), requester);
|
|
106
|
+
};
|
|
107
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
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 { opentracing } from "jaeger-client";
|
|
8
|
+
|
|
9
|
+
// Type definitions for jaeger-client which are not exported by @types/jaeger-client
|
|
10
|
+
// Project: https://github.com/uber/jaeger-client-node
|
|
11
|
+
// Definitions by: Julian Steger <https://github.com/julianste>
|
|
12
|
+
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
|
13
|
+
|
|
14
|
+
export interface TracingConfig {
|
|
15
|
+
serviceName?: string;
|
|
16
|
+
disable?: boolean;
|
|
17
|
+
sampler?: SamplerConfig;
|
|
18
|
+
reporter?: ReporterConfig;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface TracingOptions {
|
|
22
|
+
reporter?: Reporter;
|
|
23
|
+
metrics?: MetricsFactory;
|
|
24
|
+
logger?: Logger;
|
|
25
|
+
tags?: any;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ReporterConfig {
|
|
29
|
+
logSpans?: boolean;
|
|
30
|
+
agentHost?: string;
|
|
31
|
+
agentPort?: number;
|
|
32
|
+
flushIntervalMs?: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface SamplerConfig {
|
|
36
|
+
type: string;
|
|
37
|
+
param: number;
|
|
38
|
+
host?: string;
|
|
39
|
+
port?: number;
|
|
40
|
+
refreshIntervalMs?: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface Logger {
|
|
44
|
+
info(msg: string): void;
|
|
45
|
+
error(msg: string): void;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface Reporter {
|
|
49
|
+
report(span: opentracing.Span): void;
|
|
50
|
+
close(callback?: () => void): void;
|
|
51
|
+
setProcess(serviceName: string, tags: any): void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface MetricsFactory {
|
|
55
|
+
createCounter(name: string, tags: any): Counter;
|
|
56
|
+
createTimer(name: string, tags: any): Timer;
|
|
57
|
+
createGauge(name: string, tags: any): Gauge;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Counter tracks the number of times an event has occurred
|
|
61
|
+
export interface Counter {
|
|
62
|
+
// Adds the given value to the counter.
|
|
63
|
+
increment(delta: number): void;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Timer tracks how long an operation took and also computes percentiles.
|
|
67
|
+
export interface Timer {
|
|
68
|
+
// Records the time passed in.
|
|
69
|
+
record(value: number): void;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Gauge returns instantaneous measurements of something as an int64 value
|
|
73
|
+
export interface Gauge {
|
|
74
|
+
// Update the gauge to the value passed in.
|
|
75
|
+
update(value: number): void;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// export function initTracer(
|
|
79
|
+
// tracingConfig: TracingConfig,
|
|
80
|
+
// tracingOptions: TracingOptions,
|
|
81
|
+
// ): opentracing.Tracer;
|
|
82
|
+
|
|
83
|
+
// export function initTracerFromEnv(
|
|
84
|
+
// tracingConfig: TracingConfig,
|
|
85
|
+
// tracingOptions: TracingOptions,
|
|
86
|
+
// ): opentracing.Tracer;
|
|
87
|
+
|
|
88
|
+
export interface SamplingDecision {
|
|
89
|
+
sample: boolean;
|
|
90
|
+
retryable: boolean;
|
|
91
|
+
tags: any;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// added by TypeFox
|
|
95
|
+
export interface Sampler {
|
|
96
|
+
name(): string;
|
|
97
|
+
isSampled(operation: string, tags: any): boolean;
|
|
98
|
+
onCreateSpan(span: opentracing.Span): SamplingDecision;
|
|
99
|
+
onSetOperationName(span: opentracing.Span, operationName: string): SamplingDecision;
|
|
100
|
+
onSetTag(span: opentracing.Span, key: string, value: any): SamplingDecision;
|
|
101
|
+
close(callback: () => void): void;
|
|
102
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
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 { log } from "./logging";
|
|
9
|
+
|
|
10
|
+
@suite
|
|
11
|
+
class TestLogging {
|
|
12
|
+
@test public async testLogInfo_output() {
|
|
13
|
+
const testObj = {
|
|
14
|
+
null: null,
|
|
15
|
+
undefined: undefined,
|
|
16
|
+
empty: "",
|
|
17
|
+
foo: "bar",
|
|
18
|
+
number: 0,
|
|
19
|
+
};
|
|
20
|
+
log.info("info logging test", testObj);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
module.exports = new TestLogging();
|