@gitpod/gitpod-protocol 0.1.5-se-multi-repo.11 → 0.1.5-se-multi-repo.19

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.
@@ -4,41 +4,95 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
+ import { Workspace } from ".";
8
+
9
+ /**
10
+ * The whole point of these methods is to overcome inconsistencies in our data model.
11
+ * Ideally we remove it at some point once we fixed our model, as it:
12
+ * - duplicates logic
13
+ * - but additional burden on clients (using this, copying this to other languages!)
14
+ *
15
+ * TODO(gpl) See if we can get this into `server` code to remove the burden from clients
16
+ */
7
17
  export namespace ContextURL {
8
18
  export const INCREMENTAL_PREBUILD_PREFIX = "incremental-prebuild";
9
19
  export const PREBUILD_PREFIX = "prebuild";
10
20
  export const IMAGEBUILD_PREFIX = "imagebuild";
21
+ export const SNAPSHOT_PREFIX = "snapshot";
11
22
  export const REFERRER_PREFIX = 'referrer:';
12
23
 
24
+ /**
25
+ * This function will (try to) return the HTTP(S) URL of the context the user originally created this workspace on.
26
+ * Especially it will not contain any modifiers or be of different scheme than HTTP(S).
27
+ *
28
+ * Use this function if you need to provided a _working_ URL to the original context.
29
+ * @param ws
30
+ * @returns
31
+ */
32
+ export function getNormalizedURL(ws: Pick<Workspace, "context" | "contextURL"> | undefined): URL | undefined {
33
+ const normalized = normalize(ws);
34
+ if (!normalized) {
35
+ return undefined;
36
+ }
37
+
38
+ try {
39
+ return new URL(normalized);
40
+ } catch (err) {
41
+ console.error(`unable to parse URL from normalized contextURL: '${normalized}'`, err);
42
+ }
43
+ return undefined;
44
+ }
45
+
46
+ function normalize(ws: Pick<Workspace, "context" | "contextURL"> | undefined): string | undefined {
47
+ if (!ws) {
48
+ return undefined;
49
+ }
50
+ if (ws.context.normalizedContextURL) {
51
+ return ws.context.normalizedContextURL;
52
+ }
53
+
54
+ // fallback: we do not yet set normalizedContextURL on all workspaces, yet, let alone older existing workspaces
55
+ let fallback: string | undefined = undefined;
56
+ try {
57
+ fallback = removePrefixes(ws.contextURL);
58
+ } catch (err) {
59
+ console.error(`unable to remove prefixes from contextURL: '${ws.contextURL}'`, err);
60
+ }
61
+ return fallback;
62
+ }
63
+
13
64
  /**
14
65
  * The field "contextUrl" might contain prefixes like:
15
66
  * - envvar1=value1/...
16
67
  * - prebuild/...
17
68
  * This is the analogon to the (Prefix)ContextParser structure in "server".
18
69
  */
19
- export function parseToURL(contextUrl: string | undefined): URL | undefined {
70
+ function removePrefixes(contextUrl: string | undefined): string | undefined {
20
71
  if (contextUrl === undefined) {
21
72
  return undefined;
22
73
  }
23
74
 
24
75
  const segments = contextUrl.split("/");
25
76
  if (segments.length === 1) {
26
- return new URL(segments[0]); // this might be something, we just try
77
+ return segments[0]; // this might be something, we just try
27
78
  }
28
79
 
29
- const segmentsToURL = (offset: number): URL => {
80
+ const segmentsToURL = (offset: number): string => {
30
81
  let rest = segments.slice(offset).join("/");
82
+ if (/^git@[^:\/]+:/.test(rest)) {
83
+ rest = rest.replace(/^git@([^:\/]+):/, 'https://$1/');
84
+ }
31
85
  if (!rest.startsWith("http")) {
32
86
  rest = 'https://' + rest;
33
87
  }
34
- return new URL(rest);
88
+ return rest;
35
89
  };
36
90
 
37
-
38
91
  const firstSegment = segments[0];
39
92
  if (firstSegment === PREBUILD_PREFIX ||
40
93
  firstSegment === INCREMENTAL_PREBUILD_PREFIX ||
41
94
  firstSegment === IMAGEBUILD_PREFIX ||
95
+ firstSegment === SNAPSHOT_PREFIX ||
42
96
  firstSegment.startsWith(REFERRER_PREFIX)) {
43
97
  return segmentsToURL(1);
44
98
  }
@@ -72,6 +72,7 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
72
72
  getWorkspaceOwner(workspaceId: string): Promise<UserInfo | undefined>;
73
73
  getWorkspaceUsers(workspaceId: string): Promise<WorkspaceInstanceUser[]>;
74
74
  getFeaturedRepositories(): Promise<WhitelistedRepository[]>;
75
+ getSuggestedContextURLs(): Promise<string[]>;
75
76
  /**
76
77
  * **Security:**
77
78
  * Sensitive information like an owner token is erased, since it allows access for all team members.
@@ -252,6 +253,16 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
252
253
  identifyUser(event: RemoteIdentifyMessage): Promise<void>;
253
254
  }
254
255
 
256
+ export interface RateLimiterError {
257
+ method?: string,
258
+
259
+ /**
260
+ * Retry after this many seconds, earliest.
261
+ * cmp.: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After
262
+ */
263
+ retryAfter: number,
264
+ }
265
+
255
266
  export interface CreateProjectParams {
256
267
  name: string;
257
268
  slug?: string;
@@ -102,6 +102,11 @@ export interface IDEOption {
102
102
  */
103
103
  image: string;
104
104
 
105
+ /**
106
+ * The latest image ref to the IDE image, this image ref always resolve to digest.
107
+ */
108
+ latestImage?: string;
109
+
105
110
  /**
106
111
  * When this is `true`, the tag of this image is resolved to the latest
107
112
  * image digest regularly.
package/src/protocol.ts CHANGED
@@ -119,6 +119,7 @@ export type IDESettings = {
119
119
  defaultIde?: string
120
120
  useDesktopIde?: boolean
121
121
  defaultDesktopIde?: string
122
+ useLatestVersion?: boolean
122
123
  }
123
124
 
124
125
  export interface UserPlatform {
@@ -566,14 +567,14 @@ export interface VSCodeConfig {
566
567
  extensions?: string[];
567
568
  }
568
569
 
569
- export interface SubRepository {
570
+ export interface RepositoryCloneInformation {
570
571
  url: string;
571
572
  checkoutLocation?: string;
572
573
  }
573
574
 
574
575
  export interface WorkspaceConfig {
575
- mainRepository?: string;
576
- subRepositories?: SubRepository[];
576
+ mainConfiguration?: string;
577
+ additionalRepositories?: RepositoryCloneInformation[];
577
578
  image?: ImageConfig;
578
579
  ports?: PortConfig[];
579
580
  tasks?: TaskConfig[];
@@ -1217,6 +1218,8 @@ export interface AuthProviderEntry {
1217
1218
  readonly status: AuthProviderEntry.Status;
1218
1219
 
1219
1220
  readonly oauth: OAuth2Config;
1221
+ /** A random string that is to change whenever oauth changes (enforced on DB level) */
1222
+ readonly oauthRevision?: string;
1220
1223
  }
1221
1224
 
1222
1225
  export interface OAuth2Config {
@@ -1,27 +0,0 @@
1
- import { Message } from "vscode-jsonrpc";
2
- export interface ResolvedConnectionErrorHandlerOptions {
3
- readonly serverName: string;
4
- /**
5
- * The maximum amount of errors allowed before stopping the server.
6
- */
7
- readonly maxErrors: number;
8
- /**
9
- * The maimum amount of restarts allowed in the restart interval.
10
- */
11
- readonly maxRestarts: number;
12
- /**
13
- * In minutes.
14
- */
15
- readonly restartInterval: number;
16
- }
17
- export declare type ConnectionErrorHandlerOptions = Partial<ResolvedConnectionErrorHandlerOptions> & {
18
- readonly serverName: string;
19
- };
20
- export declare class ConnectionErrorHandler {
21
- protected readonly options: ResolvedConnectionErrorHandlerOptions;
22
- constructor(options: ConnectionErrorHandlerOptions);
23
- shouldStop(error: Error, message?: Message, count?: number): boolean;
24
- protected readonly restarts: number[];
25
- shouldRestart(): boolean;
26
- }
27
- //# sourceMappingURL=connection-error-handler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection-error-handler.d.ts","sourceRoot":"","sources":["../../src/messaging/connection-error-handler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,MAAM,WAAW,qCAAqC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CACnC;AAED,oBAAY,6BAA6B,GAAG,OAAO,CAAC,qCAAqC,CAAC,GAAG;IACzF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC9B,CAAC;AAEF,qBAAa,sBAAsB;IAE/B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qCAAqC,CAAC;gBACtD,OAAO,EAAE,6BAA6B;IASlD,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAIpE,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAM;IAC3C,aAAa,IAAI,OAAO;CAc3B"}
@@ -1,34 +0,0 @@
1
- "use strict";
2
- /*
3
- * Copyright (C) 2017 TypeFox and others.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.ConnectionErrorHandler = void 0;
10
- const logging_1 = require("../util/logging");
11
- class ConnectionErrorHandler {
12
- constructor(options) {
13
- this.restarts = [];
14
- this.options = Object.assign({ maxErrors: 3, maxRestarts: 5, restartInterval: 3 }, options);
15
- }
16
- shouldStop(error, message, count) {
17
- return !count || count > this.options.maxErrors;
18
- }
19
- shouldRestart() {
20
- this.restarts.push(Date.now());
21
- if (this.restarts.length <= this.options.maxRestarts) {
22
- return true;
23
- }
24
- const diff = this.restarts[this.restarts.length - 1] - this.restarts[0];
25
- if (diff <= this.options.restartInterval * 60 * 1000) {
26
- logging_1.log.error(`Server ${this.options.serverName} crashed ${this.options.maxRestarts} times in the last ${this.options.restartInterval} minutes. Will not restart`);
27
- return false;
28
- }
29
- this.restarts.shift();
30
- return true;
31
- }
32
- }
33
- exports.ConnectionErrorHandler = ConnectionErrorHandler;
34
- //# sourceMappingURL=connection-error-handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection-error-handler.js","sourceRoot":"","sources":["../../src/messaging/connection-error-handler.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,6CAAsC;AAsBtC,MAAa,sBAAsB;IAG/B,YAAY,OAAsC;QAa/B,aAAQ,GAAa,EAAE,CAAC;QAZvC,IAAI,CAAC,OAAO,mBACR,SAAS,EAAE,CAAC,EACZ,WAAW,EAAE,CAAC,EACd,eAAe,EAAE,CAAC,IACf,OAAO,CACb,CAAC;IACN,CAAC;IAED,UAAU,CAAC,KAAY,EAAE,OAAiB,EAAE,KAAc;QACtD,OAAO,CAAC,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACpD,CAAC;IAGD,aAAa;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;YAClD,OAAO,IAAI,CAAC;SACf;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,EAAE,GAAG,IAAI,EAAE;YAClD,aAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,UAAU,YAAY,IAAI,CAAC,OAAO,CAAC,WAAW,sBAAsB,IAAI,CAAC,OAAO,CAAC,eAAe,4BAA4B,CAAC,CAAC;YAC/J,OAAO,KAAK,CAAC;SAChB;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IAChB,CAAC;CAEJ;AA/BD,wDA+BC"}
@@ -1,11 +0,0 @@
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
- import { LogContext } from './logging';
7
- export declare class SafePromise {
8
- static catchAndLog<T>(p: Promise<T>, logCtx?: LogContext): Promise<T>;
9
- static catch<T>(p: Promise<T>, handler: (err: any) => void): Promise<T>;
10
- }
11
- //# sourceMappingURL=safe-promise.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safe-promise.d.ts","sourceRoot":"","sources":["../../src/util/safe-promise.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAO,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,qBAAa,WAAW;WACN,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,UAAU;WASjD,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;CAMjF"}
@@ -1,31 +0,0 @@
1
- "use strict";
2
- /**
3
- * Copyright (c) 2020 Gitpod GmbH. All rights reserved.
4
- * Licensed under the GNU Affero General Public License (AGPL).
5
- * See License-AGPL.txt in the project root for license information.
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.SafePromise = void 0;
9
- const logging_1 = require("./logging");
10
- class SafePromise {
11
- static catchAndLog(p, logCtx) {
12
- return SafePromise.catch(p, (err) => {
13
- if (logCtx) {
14
- logging_1.log.error(logCtx, err);
15
- }
16
- else {
17
- logging_1.log.error(err);
18
- }
19
- });
20
- }
21
- ;
22
- static catch(p, handler) {
23
- return p.catch((err) => {
24
- handler(err);
25
- return {}; // Nobody will ever see this value as the Promise already failed. It's just there to please the compiler
26
- });
27
- }
28
- ;
29
- }
30
- exports.SafePromise = SafePromise;
31
- //# sourceMappingURL=safe-promise.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safe-promise.js","sourceRoot":"","sources":["../../src/util/safe-promise.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,uCAA4C;AAE5C,MAAa,WAAW;IACb,MAAM,CAAC,WAAW,CAAI,CAAa,EAAE,MAAmB;QAC3D,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;YAChC,IAAI,MAAM,EAAE;gBACR,aAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;aAC1B;iBAAM;gBACH,aAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aAClB;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAAA,CAAC;IACK,MAAM,CAAC,KAAK,CAAI,CAAa,EAAE,OAA2B;QAC7D,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,CAAC;YACb,OAAO,EAAO,CAAC,CAAC,wGAAwG;QAC5H,CAAC,CAAC,CAAC;IACP,CAAC;IAAA,CAAC;CACL;AAhBD,kCAgBC"}
@@ -1,62 +0,0 @@
1
- /*
2
- * Copyright (C) 2017 TypeFox and others.
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
5
- * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
- */
7
-
8
- import { Message } from "vscode-jsonrpc";
9
- import { log } from '../util/logging';
10
-
11
- export interface ResolvedConnectionErrorHandlerOptions {
12
- readonly serverName: string
13
- /**
14
- * The maximum amount of errors allowed before stopping the server.
15
- */
16
- readonly maxErrors: number
17
- /**
18
- * The maimum amount of restarts allowed in the restart interval.
19
- */
20
- readonly maxRestarts: number
21
- /**
22
- * In minutes.
23
- */
24
- readonly restartInterval: number
25
- }
26
-
27
- export type ConnectionErrorHandlerOptions = Partial<ResolvedConnectionErrorHandlerOptions> & {
28
- readonly serverName: string
29
- };
30
-
31
- export class ConnectionErrorHandler {
32
-
33
- protected readonly options: ResolvedConnectionErrorHandlerOptions;
34
- constructor(options: ConnectionErrorHandlerOptions) {
35
- this.options = {
36
- maxErrors: 3,
37
- maxRestarts: 5,
38
- restartInterval: 3,
39
- ...options
40
- };
41
- }
42
-
43
- shouldStop(error: Error, message?: Message, count?: number): boolean {
44
- return !count || count > this.options.maxErrors;
45
- }
46
-
47
- protected readonly restarts: number[] = [];
48
- shouldRestart(): boolean {
49
- this.restarts.push(Date.now());
50
- if (this.restarts.length <= this.options.maxRestarts) {
51
- return true;
52
- }
53
- const diff = this.restarts[this.restarts.length - 1] - this.restarts[0];
54
- if (diff <= this.options.restartInterval * 60 * 1000) {
55
- log.error(`Server ${this.options.serverName} crashed ${this.options.maxRestarts} times in the last ${this.options.restartInterval} minutes. Will not restart`);
56
- return false;
57
- }
58
- this.restarts.shift();
59
- return true;
60
- }
61
-
62
- }
@@ -1,26 +0,0 @@
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
-
8
- import { log, LogContext } from './logging';
9
-
10
- export class SafePromise {
11
- public static catchAndLog<T>(p: Promise<T>, logCtx?: LogContext) {
12
- return SafePromise.catch(p, (err) => {
13
- if (logCtx) {
14
- log.error(logCtx, err);
15
- } else {
16
- log.error(err);
17
- }
18
- });
19
- };
20
- public static catch<T>(p: Promise<T>, handler: (err: any) => void): Promise<T> {
21
- return p.catch((err) => {
22
- handler(err);
23
- return {} as T; // Nobody will ever see this value as the Promise already failed. It's just there to please the compiler
24
- });
25
- };
26
- }