@gitpod/gitpod-protocol 0.1.5-wth-update-mysql-dependencies-2.30 → 0.1.5-wth-test.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/builtin-theia-plugins.json +9 -9
- package/data/gitpod-schema.json +8 -22
- package/lib/accounting-protocol.d.ts +155 -0
- package/lib/accounting-protocol.d.ts.map +1 -0
- package/lib/accounting-protocol.js +109 -0
- package/lib/accounting-protocol.js.map +1 -0
- package/lib/admin-protocol.d.ts +20 -4
- package/lib/admin-protocol.d.ts.map +1 -1
- package/lib/admin-protocol.js +15 -0
- package/lib/admin-protocol.js.map +1 -1
- package/lib/analytics.d.ts +45 -0
- package/lib/analytics.d.ts.map +1 -0
- package/lib/{util/without.js → analytics.js} +4 -2
- package/lib/analytics.js.map +1 -0
- package/lib/context-url.d.ts +18 -0
- package/lib/context-url.d.ts.map +1 -0
- package/lib/context-url.js +49 -0
- package/lib/context-url.js.map +1 -0
- package/lib/{util/context-url.spec.d.ts → context-url.spec.d.ts} +3 -1
- package/lib/context-url.spec.d.ts.map +1 -0
- package/lib/context-url.spec.js +73 -0
- package/lib/context-url.spec.js.map +1 -0
- package/lib/email-protocol.d.ts +1 -2
- package/lib/email-protocol.d.ts.map +1 -1
- package/lib/email-protocol.js +4 -4
- package/lib/email-protocol.js.map +1 -1
- package/lib/encryption/container-module.js +5 -4
- package/lib/encryption/container-module.js.map +1 -1
- package/lib/encryption/encryption-engine.js +19 -20
- package/lib/encryption/encryption-engine.js.map +1 -1
- package/lib/encryption/encryption-engine.spec.js +29 -36
- package/lib/encryption/encryption-engine.spec.js.map +1 -1
- package/lib/encryption/encryption-service.js +29 -43
- package/lib/encryption/encryption-service.js.map +1 -1
- package/lib/encryption/key-provider.js +25 -30
- package/lib/encryption/key-provider.js.map +1 -1
- package/lib/env.d.ts +1 -2
- package/lib/env.d.ts.map +1 -1
- package/lib/env.js +20 -21
- package/lib/env.js.map +1 -1
- package/lib/gitpod-file-parser.js +25 -41
- package/lib/gitpod-file-parser.js.map +1 -1
- package/lib/gitpod-file-parser.spec.js +116 -116
- package/lib/gitpod-file-parser.spec.js.map +1 -1
- package/lib/gitpod-service.d.ts +132 -18
- package/lib/gitpod-service.d.ts.map +1 -1
- package/lib/gitpod-service.js +168 -256
- package/lib/gitpod-service.js.map +1 -1
- package/lib/headless-workspace-log.d.ts +8 -11
- package/lib/headless-workspace-log.d.ts.map +1 -1
- package/lib/headless-workspace-log.js +4 -7
- package/lib/headless-workspace-log.js.map +1 -1
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/messaging/browser/connection.d.ts +5 -3
- package/lib/messaging/browser/connection.d.ts.map +1 -1
- package/lib/messaging/browser/connection.js +183 -33
- package/lib/messaging/browser/connection.js.map +1 -1
- package/lib/messaging/browser/window-connection.js +35 -55
- package/lib/messaging/browser/window-connection.js.map +1 -1
- package/lib/messaging/client-call-metrics.d.ts +35 -0
- package/lib/messaging/client-call-metrics.d.ts.map +1 -0
- package/lib/messaging/client-call-metrics.js +83 -0
- package/lib/messaging/client-call-metrics.js.map +1 -0
- package/lib/messaging/connection-error-handler.js +11 -23
- package/lib/messaging/connection-error-handler.js.map +1 -1
- package/lib/messaging/error.d.ts +3 -1
- package/lib/messaging/error.d.ts.map +1 -1
- package/lib/messaging/error.js +6 -2
- 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/node/connection.js +22 -22
- package/lib/messaging/node/connection.js.map +1 -1
- package/lib/messaging/proxy-factory.d.ts +2 -0
- package/lib/messaging/proxy-factory.d.ts.map +1 -1
- package/lib/messaging/proxy-factory.js +74 -159
- package/lib/messaging/proxy-factory.js.map +1 -1
- package/lib/payment-protocol.d.ts +18 -0
- package/lib/payment-protocol.d.ts.map +1 -0
- package/lib/payment-protocol.js +13 -0
- package/lib/payment-protocol.js.map +1 -0
- package/lib/permission.d.ts +2 -1
- package/lib/permission.d.ts.map +1 -1
- package/lib/permission.js +14 -13
- package/lib/permission.js.map +1 -1
- package/lib/plans.d.ts +210 -0
- package/lib/plans.d.ts.map +1 -0
- package/lib/plans.js +570 -0
- package/lib/plans.js.map +1 -0
- package/lib/protocol.d.ts +94 -15
- package/lib/protocol.d.ts.map +1 -1
- package/lib/protocol.js +104 -130
- package/lib/protocol.js.map +1 -1
- 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/{src/util/without.ts → lib/snapshot-url.spec.d.ts} +2 -3
- 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 +73 -0
- package/lib/team-subscription-protocol.d.ts.map +1 -0
- package/lib/team-subscription-protocol.js +63 -0
- package/lib/team-subscription-protocol.js.map +1 -0
- package/lib/teams-projects-protocol.d.ts +103 -0
- package/lib/teams-projects-protocol.d.ts.map +1 -0
- package/lib/teams-projects-protocol.js +23 -0
- package/lib/teams-projects-protocol.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 +79 -0
- package/lib/util/analytics.js.map +1 -0
- package/lib/util/async-iterator.js +55 -133
- package/lib/util/async-iterator.js.map +1 -1
- package/lib/util/cancelable.js +17 -59
- package/lib/util/cancelable.js.map +1 -1
- package/lib/util/date-time.js +8 -8
- package/lib/util/date-time.js.map +1 -1
- package/lib/util/deferred.js +10 -12
- package/lib/util/deferred.js.map +1 -1
- package/lib/util/disposable.js +26 -39
- package/lib/util/disposable.js.map +1 -1
- package/lib/util/event.js +58 -74
- package/lib/util/event.js.map +1 -1
- package/lib/util/garbage-collected-cache.js +22 -46
- package/lib/util/garbage-collected-cache.js.map +1 -1
- package/lib/util/generate-workspace-id.d.ts.map +1 -1
- package/lib/util/generate-workspace-id.js +13 -67
- package/lib/util/generate-workspace-id.js.map +1 -1
- package/lib/util/generate-workspace-id.spec.js +34 -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 +44 -0
- package/lib/util/gitpod-cookie.js.map +1 -0
- package/lib/util/gitpod-host-url.d.ts +1 -1
- package/lib/util/gitpod-host-url.d.ts.map +1 -1
- package/lib/util/gitpod-host-url.js +98 -98
- 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 +103 -31
- package/lib/util/gitpod-host-url.spec.js.map +1 -1
- package/lib/util/grpc.d.ts +15 -0
- package/lib/util/grpc.d.ts.map +1 -0
- package/lib/util/grpc.js +18 -0
- package/lib/util/grpc.js.map +1 -0
- package/lib/util/logging.d.ts +49 -33
- package/lib/util/logging.d.ts.map +1 -1
- package/lib/util/logging.js +107 -110
- package/lib/util/logging.js.map +1 -1
- package/lib/util/make-link.js +2 -2
- package/lib/util/make-link.js.map +1 -1
- package/lib/util/parse-workspace-id.d.ts +10 -0
- package/lib/util/parse-workspace-id.d.ts.map +1 -1
- package/lib/util/parse-workspace-id.js +32 -7
- package/lib/util/parse-workspace-id.js.map +1 -1
- package/lib/util/parse-workspace-id.spec.d.ts +4 -0
- package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
- package/lib/util/parse-workspace-id.spec.js +123 -84
- package/lib/util/parse-workspace-id.spec.js.map +1 -1
- package/lib/util/queue.js +16 -55
- package/lib/util/queue.js.map +1 -1
- package/lib/util/queue.spec.js +144 -288
- package/lib/util/queue.spec.js.map +1 -1
- package/lib/util/repeater.js +35 -88
- package/lib/util/repeater.js.map +1 -1
- package/lib/util/safe-promise.js +9 -12
- package/lib/util/safe-promise.js.map +1 -1
- package/lib/util/semaphore.js +15 -46
- package/lib/util/semaphore.js.map +1 -1
- package/lib/util/skip-if.js +6 -6
- package/lib/util/skip-if.js.map +1 -1
- package/lib/util/timeutil.js +28 -16
- package/lib/util/timeutil.js.map +1 -1
- package/lib/util/timeutil.spec.js +21 -24
- package/lib/util/timeutil.spec.js.map +1 -1
- package/lib/util/tracing.js +43 -47
- package/lib/util/tracing.js.map +1 -1
- package/lib/util/workspace-port-authentication.js +3 -2
- package/lib/util/workspace-port-authentication.js.map +1 -1
- package/lib/workspace-cluster.d.ts +74 -0
- package/lib/workspace-cluster.d.ts.map +1 -0
- package/lib/workspace-cluster.js +16 -0
- package/lib/workspace-cluster.js.map +1 -0
- package/lib/workspace-instance.d.ts +5 -2
- package/lib/workspace-instance.d.ts.map +1 -1
- package/lib/wsready.d.ts +1 -1
- package/lib/wsready.js +2 -2
- package/package.json +28 -16
- package/pkg-yarn.lock +17 -9
- package/src/accounting-protocol.ts +229 -0
- package/src/admin-protocol.ts +39 -5
- package/src/analytics.ts +54 -0
- package/src/context-url.spec.ts +39 -0
- package/src/context-url.ts +51 -0
- package/src/email-protocol.ts +2 -3
- package/src/env.ts +10 -10
- package/src/gitpod-service.ts +198 -33
- package/src/headless-workspace-log.ts +7 -11
- package/src/index.ts +5 -1
- package/src/messaging/browser/connection.ts +195 -14
- package/src/messaging/client-call-metrics.ts +97 -0
- package/src/messaging/error.ts +8 -2
- package/src/messaging/handler.ts +12 -0
- package/src/messaging/node/connection.ts +2 -2
- package/src/messaging/proxy-factory.ts +14 -6
- package/src/payment-protocol.ts +20 -0
- package/src/permission.ts +2 -1
- package/src/plans.ts +632 -0
- package/src/protocol.ts +153 -43
- package/src/snapshot-url.spec.ts +25 -0
- package/src/snapshot-url.ts +27 -0
- package/src/team-subscription-protocol.ts +113 -0
- package/src/teams-projects-protocol.ts +132 -0
- package/src/util/analytics.ts +87 -0
- package/src/util/deferred.ts +1 -1
- package/src/util/garbage-collected-cache.ts +2 -2
- package/src/util/generate-workspace-id.spec.ts +3 -3
- package/src/util/generate-workspace-id.ts +2 -0
- package/src/util/gitpod-cookie.ts +39 -0
- package/src/util/gitpod-host-url.spec.ts +25 -1
- package/src/util/gitpod-host-url.ts +23 -10
- package/src/util/grpc.ts +15 -0
- package/src/util/logging.ts +102 -38
- package/src/util/parse-workspace-id.spec.ts +21 -1
- package/src/util/parse-workspace-id.ts +32 -6
- package/src/util/queue.spec.ts +1 -1
- package/src/util/semaphore.ts +2 -2
- package/src/util/skip-if.ts +1 -1
- package/src/util/timeutil.ts +4 -4
- package/src/workspace-cluster.ts +96 -0
- package/src/workspace-instance.ts +25 -13
- package/src/wsready.ts +2 -2
- 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.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/without.d.ts +0 -7
- package/lib/util/without.d.ts.map +0 -1
- package/lib/util/without.js.map +0 -1
- package/src/util/context-url.spec.ts +0 -25
- package/src/util/context-url.ts +0 -23
package/src/gitpod-service.ts
CHANGED
|
@@ -5,14 +5,19 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
|
-
User, WorkspaceInfo, WorkspaceCreationResult,
|
|
8
|
+
User, WorkspaceInfo, WorkspaceCreationResult, WorkspaceInstanceUser,
|
|
9
9
|
WhitelistedRepository, WorkspaceImageBuild, AuthProviderInfo, Branding, CreateWorkspaceMode,
|
|
10
10
|
Token, UserEnvVarValue, ResolvePluginsParams, PreparePluginUploadParams, Terms,
|
|
11
|
-
ResolvedPlugins, Configuration, InstallPluginsParams, UninstallPluginParams, UserInfo, GitpodTokenType,
|
|
11
|
+
ResolvedPlugins, Configuration, InstallPluginsParams, UninstallPluginParams, UserInfo, GitpodTokenType,
|
|
12
|
+
GitpodToken, AuthProviderEntry, GuessGitTokenScopesParams, GuessedGitTokenScopes
|
|
12
13
|
} from './protocol';
|
|
14
|
+
import {
|
|
15
|
+
Team, TeamMemberInfo,
|
|
16
|
+
TeamMembershipInvite, Project, TeamMemberRole, PrebuildWithStatus, StartPrebuildResult
|
|
17
|
+
} from './teams-projects-protocol';
|
|
13
18
|
import { JsonRpcProxy, JsonRpcServer } from './messaging/proxy-factory';
|
|
14
19
|
import { Disposable, CancellationTokenSource } from 'vscode-jsonrpc';
|
|
15
|
-
import {
|
|
20
|
+
import { HeadlessLogUrls } from './headless-workspace-log';
|
|
16
21
|
import { WorkspaceInstance, WorkspaceInstancePort, WorkspaceInstancePhase } from './workspace-instance';
|
|
17
22
|
import { AdminServer } from './admin-protocol';
|
|
18
23
|
import { GitpodHostUrl } from './util/gitpod-host-url';
|
|
@@ -20,11 +25,18 @@ import { WebSocketConnectionProvider } from './messaging/browser/connection';
|
|
|
20
25
|
import { PermissionName } from './permission';
|
|
21
26
|
import { LicenseService } from './license-protocol';
|
|
22
27
|
import { Emitter } from './util/event';
|
|
28
|
+
import { AccountStatement, CreditAlert } from './accounting-protocol';
|
|
29
|
+
import { GithubUpgradeURL, PlanCoupon } from './payment-protocol';
|
|
30
|
+
import { TeamSubscription, TeamSubscriptionSlot, TeamSubscriptionSlotResolved } from './team-subscription-protocol';
|
|
31
|
+
import { RemotePageMessage, RemoteTrackMessage, RemoteIdentifyMessage } from './analytics';
|
|
23
32
|
|
|
24
33
|
export interface GitpodClient {
|
|
25
34
|
onInstanceUpdate(instance: WorkspaceInstance): void;
|
|
26
35
|
onWorkspaceImageBuildLogs: WorkspaceImageBuild.LogCallback;
|
|
27
|
-
|
|
36
|
+
|
|
37
|
+
onPrebuildUpdate(update: PrebuildWithStatus): void;
|
|
38
|
+
|
|
39
|
+
onCreditAlert(creditAlert: CreditAlert): void;
|
|
28
40
|
|
|
29
41
|
//#region propagating reconnection to iframe
|
|
30
42
|
notifyDidOpenConnection(): void;
|
|
@@ -40,11 +52,12 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
|
|
|
40
52
|
updateLoggedInUser(user: Partial<User>): Promise<User>;
|
|
41
53
|
getAuthProviders(): Promise<AuthProviderInfo[]>;
|
|
42
54
|
getOwnAuthProviders(): Promise<AuthProviderEntry[]>;
|
|
43
|
-
updateOwnAuthProvider(params: GitpodServer.UpdateOwnAuthProviderParams): Promise<
|
|
55
|
+
updateOwnAuthProvider(params: GitpodServer.UpdateOwnAuthProviderParams): Promise<AuthProviderEntry>;
|
|
44
56
|
deleteOwnAuthProvider(params: GitpodServer.DeleteOwnAuthProviderParams): Promise<void>;
|
|
45
57
|
getBranding(): Promise<Branding>;
|
|
46
58
|
getConfiguration(): Promise<Configuration>;
|
|
47
59
|
getToken(query: GitpodServer.GetTokenSearchOptions): Promise<Token | undefined>;
|
|
60
|
+
getGitpodTokenScopes(tokenHash: string): Promise<string[]>;
|
|
48
61
|
/**
|
|
49
62
|
* @deprecated
|
|
50
63
|
*/
|
|
@@ -76,8 +89,8 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
|
|
|
76
89
|
updateWorkspaceUserPin(id: string, action: GitpodServer.PinAction): Promise<void>;
|
|
77
90
|
sendHeartBeat(options: GitpodServer.SendHeartBeatOptions): Promise<void>;
|
|
78
91
|
watchWorkspaceImageBuildLogs(workspaceId: string): Promise<void>;
|
|
79
|
-
watchHeadlessWorkspaceLogs(workspaceId: string): Promise<void>;
|
|
80
92
|
isPrebuildDone(pwsid: string): Promise<boolean>;
|
|
93
|
+
getHeadlessLog(instanceId: string): Promise<HeadlessLogUrls>;
|
|
81
94
|
|
|
82
95
|
// Workspace timeout
|
|
83
96
|
setWorkspaceTimeout(workspaceId: string, duration: WorkspaceTimeoutDuration): Promise<SetWorkspaceTimeoutResult>;
|
|
@@ -91,19 +104,41 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
|
|
|
91
104
|
openPort(workspaceId: string, port: WorkspaceInstancePort): Promise<WorkspaceInstancePort | undefined>;
|
|
92
105
|
closePort(workspaceId: string, port: number): Promise<void>;
|
|
93
106
|
|
|
94
|
-
// User messages
|
|
95
|
-
getUserMessages(options: GitpodServer.GetUserMessagesOptions): Promise<UserMessage[]>;
|
|
96
|
-
updateUserMessages(options: GitpodServer.UpdateUserMessagesOptions): Promise<void>;
|
|
97
|
-
|
|
98
107
|
// User storage
|
|
99
108
|
getUserStorageResource(options: GitpodServer.GetUserStorageResourceOptions): Promise<string>;
|
|
100
109
|
updateUserStorageResource(options: GitpodServer.UpdateUserStorageResourceOptions): Promise<void>;
|
|
101
110
|
|
|
102
|
-
//
|
|
111
|
+
// User env vars
|
|
103
112
|
getEnvVars(): Promise<UserEnvVarValue[]>;
|
|
113
|
+
getAllEnvVars(): Promise<UserEnvVarValue[]>;
|
|
104
114
|
setEnvVar(variable: UserEnvVarValue): Promise<void>;
|
|
105
115
|
deleteEnvVar(variable: UserEnvVarValue): Promise<void>;
|
|
106
116
|
|
|
117
|
+
// Teams
|
|
118
|
+
getTeams(): Promise<Team[]>;
|
|
119
|
+
getTeamMembers(teamId: string): Promise<TeamMemberInfo[]>;
|
|
120
|
+
createTeam(name: string): Promise<Team>;
|
|
121
|
+
joinTeam(inviteId: string): Promise<Team>;
|
|
122
|
+
setTeamMemberRole(teamId: string, userId: string, role: TeamMemberRole): Promise<void>;
|
|
123
|
+
removeTeamMember(teamId: string, userId: string): Promise<void>;
|
|
124
|
+
getGenericInvite(teamId: string): Promise<TeamMembershipInvite>;
|
|
125
|
+
resetGenericInvite(inviteId: string): Promise<TeamMembershipInvite>;
|
|
126
|
+
deleteTeam(teamId: string, userId: string): Promise<void>;
|
|
127
|
+
|
|
128
|
+
// Projects
|
|
129
|
+
getProviderRepositoriesForUser(params: GetProviderRepositoriesParams): Promise<ProviderRepository[]>;
|
|
130
|
+
createProject(params: CreateProjectParams): Promise<Project>;
|
|
131
|
+
deleteProject(projectId: string): Promise<void>;
|
|
132
|
+
getTeamProjects(teamId: string): Promise<Project[]>;
|
|
133
|
+
getUserProjects(): Promise<Project[]>;
|
|
134
|
+
getProjectOverview(projectId: string): Promise<Project.Overview | undefined>;
|
|
135
|
+
findPrebuilds(params: FindPrebuildsParams): Promise<PrebuildWithStatus[]>;
|
|
136
|
+
triggerPrebuild(projectId: string, branchName: string | null): Promise<StartPrebuildResult>;
|
|
137
|
+
cancelPrebuild(projectId: string, prebuildId: string): Promise<void>;
|
|
138
|
+
setProjectConfiguration(projectId: string, configString: string): Promise<void>;
|
|
139
|
+
fetchProjectRepositoryConfiguration(projectId: string): Promise<string | undefined>;
|
|
140
|
+
guessProjectConfiguration(projectId: string): Promise<string | undefined>;
|
|
141
|
+
|
|
107
142
|
// content service
|
|
108
143
|
getContentBlobUploadUrl(name: string): Promise<string>
|
|
109
144
|
getContentBlobDownloadUrl(name: string): Promise<string>
|
|
@@ -118,10 +153,15 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
|
|
|
118
153
|
registerGithubApp(installationId: string): Promise<void>;
|
|
119
154
|
|
|
120
155
|
/**
|
|
121
|
-
* Stores a new snapshot for the given workspace and bucketId
|
|
156
|
+
* Stores a new snapshot for the given workspace and bucketId. Returns _before_ the actual snapshot is done. To wait for that, use `waitForSnapshot`.
|
|
122
157
|
* @return the snapshot id
|
|
123
158
|
*/
|
|
124
159
|
takeSnapshot(options: GitpodServer.TakeSnapshotOptions): Promise<string>;
|
|
160
|
+
/**
|
|
161
|
+
*
|
|
162
|
+
* @param snapshotId
|
|
163
|
+
*/
|
|
164
|
+
waitForSnapshot(snapshotId: string): Promise<void>;
|
|
125
165
|
|
|
126
166
|
/**
|
|
127
167
|
* Returns the list of snapshots that exist for a workspace.
|
|
@@ -146,6 +186,95 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
|
|
|
146
186
|
resolvePlugins(workspaceId: string, params: ResolvePluginsParams): Promise<ResolvedPlugins>;
|
|
147
187
|
installUserPlugins(params: InstallPluginsParams): Promise<boolean>;
|
|
148
188
|
uninstallUserPlugin(params: UninstallPluginParams): Promise<boolean>;
|
|
189
|
+
|
|
190
|
+
guessGitTokenScopes(params: GuessGitTokenScopesParams): Promise<GuessedGitTokenScopes>;
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* gitpod.io concerns
|
|
194
|
+
*/
|
|
195
|
+
isStudent(): Promise<boolean>;
|
|
196
|
+
/**
|
|
197
|
+
*
|
|
198
|
+
*/
|
|
199
|
+
getAccountStatement(options: GitpodServer.GetAccountStatementOptions): Promise<AccountStatement | undefined>;
|
|
200
|
+
getRemainingUsageHours(): Promise<number>;
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
*
|
|
204
|
+
*/
|
|
205
|
+
getChargebeeSiteId(): Promise<string>;
|
|
206
|
+
createPortalSession(): Promise<{}>;
|
|
207
|
+
checkout(planId: string, planQuantity?: number): Promise<{}>;
|
|
208
|
+
getAvailableCoupons(): Promise<PlanCoupon[]>;
|
|
209
|
+
getAppliedCoupons(): Promise<PlanCoupon[]>;
|
|
210
|
+
|
|
211
|
+
getShowPaymentUI(): Promise<boolean>;
|
|
212
|
+
isChargebeeCustomer(): Promise<boolean>;
|
|
213
|
+
|
|
214
|
+
subscriptionUpgradeTo(subscriptionId: string, chargebeePlanId: string): Promise<void>;
|
|
215
|
+
subscriptionDowngradeTo(subscriptionId: string, chargebeePlanId: string): Promise<void>;
|
|
216
|
+
subscriptionCancel(subscriptionId: string): Promise<void>;
|
|
217
|
+
subscriptionCancelDowngrade(subscriptionId: string): Promise<void>;
|
|
218
|
+
|
|
219
|
+
tsGet(): Promise<TeamSubscription[]>;
|
|
220
|
+
tsGetSlots(): Promise<TeamSubscriptionSlotResolved[]>;
|
|
221
|
+
tsGetUnassignedSlot(teamSubscriptionId: string): Promise<TeamSubscriptionSlot | undefined>
|
|
222
|
+
tsAddSlots(teamSubscriptionId: string, quantity: number): Promise<void>;
|
|
223
|
+
tsAssignSlot(teamSubscriptionId: string, teamSubscriptionSlotId: string, identityStr: string | undefined): Promise<void>
|
|
224
|
+
tsReassignSlot(teamSubscriptionId: string, teamSubscriptionSlotId: string, newIdentityStr: string): Promise<void>;
|
|
225
|
+
tsDeactivateSlot(teamSubscriptionId: string, teamSubscriptionSlotId: string): Promise<void>;
|
|
226
|
+
tsReactivateSlot(teamSubscriptionId: string, teamSubscriptionSlotId: string): Promise<void>;
|
|
227
|
+
|
|
228
|
+
getGithubUpgradeUrls(): Promise<GithubUpgradeURL[]>;
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Analytics
|
|
232
|
+
*/
|
|
233
|
+
trackEvent(event: RemoteTrackMessage): Promise<void>;
|
|
234
|
+
trackLocation(event: RemotePageMessage): Promise<void>;
|
|
235
|
+
identifyUser(event: RemoteIdentifyMessage): Promise<void>;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export interface CreateProjectParams {
|
|
239
|
+
name: string;
|
|
240
|
+
slug?: string;
|
|
241
|
+
account: string;
|
|
242
|
+
provider: string;
|
|
243
|
+
cloneUrl: string;
|
|
244
|
+
teamId?: string;
|
|
245
|
+
userId?: string;
|
|
246
|
+
appInstallationId: string;
|
|
247
|
+
}
|
|
248
|
+
export interface FindPrebuildsParams {
|
|
249
|
+
projectId: string;
|
|
250
|
+
branch?: string;
|
|
251
|
+
latest?: boolean;
|
|
252
|
+
prebuildId?: string;
|
|
253
|
+
// default: 30
|
|
254
|
+
limit?: number;
|
|
255
|
+
}
|
|
256
|
+
export interface GetProviderRepositoriesParams {
|
|
257
|
+
provider: string;
|
|
258
|
+
hints?: { installationId: string } | object;
|
|
259
|
+
}
|
|
260
|
+
export interface ProviderRepository {
|
|
261
|
+
name: string;
|
|
262
|
+
path?: string;
|
|
263
|
+
account: string;
|
|
264
|
+
accountAvatarUrl: string;
|
|
265
|
+
cloneUrl: string;
|
|
266
|
+
updatedAt: string;
|
|
267
|
+
installationId?: number;
|
|
268
|
+
installationUpdatedAt?: string;
|
|
269
|
+
|
|
270
|
+
inUse?: boolean;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export interface ClientHeaderFields {
|
|
274
|
+
ip?: string;
|
|
275
|
+
userAgent?: string;
|
|
276
|
+
dnt?: string;
|
|
277
|
+
clientRegion?: string;
|
|
149
278
|
}
|
|
150
279
|
|
|
151
280
|
export const WorkspaceTimeoutValues = ["30m", "60m", "180m"] as const;
|
|
@@ -158,6 +287,7 @@ export const createServerMock = function <C extends GitpodClient, S extends Gitp
|
|
|
158
287
|
methods.setClient = methods.setClient || (() => { });
|
|
159
288
|
methods.dispose = methods.dispose || (() => { });
|
|
160
289
|
return new Proxy<JsonRpcProxy<S>>(methods as any as JsonRpcProxy<S>, {
|
|
290
|
+
// @ts-ignore
|
|
161
291
|
get: (target: S, property: keyof S) => {
|
|
162
292
|
const result = target[property];
|
|
163
293
|
if (!result) {
|
|
@@ -190,6 +320,8 @@ export namespace GitpodServer {
|
|
|
190
320
|
limit?: number;
|
|
191
321
|
searchString?: string;
|
|
192
322
|
pinnedOnly?: boolean;
|
|
323
|
+
projectId?: string | string[];
|
|
324
|
+
includeWithoutProject?: boolean;
|
|
193
325
|
}
|
|
194
326
|
export interface GetAccountStatementOptions {
|
|
195
327
|
date?: string;
|
|
@@ -197,6 +329,7 @@ export namespace GitpodServer {
|
|
|
197
329
|
export interface CreateWorkspaceOptions {
|
|
198
330
|
contextUrl: string;
|
|
199
331
|
mode?: CreateWorkspaceMode;
|
|
332
|
+
forceDefaultConfig?: boolean;
|
|
200
333
|
}
|
|
201
334
|
export interface StartWorkspaceOptions {
|
|
202
335
|
forceDefaultImage: boolean;
|
|
@@ -204,13 +337,8 @@ export namespace GitpodServer {
|
|
|
204
337
|
export interface TakeSnapshotOptions {
|
|
205
338
|
workspaceId: string;
|
|
206
339
|
layoutData?: string;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
readonly releaseNotes?: boolean;
|
|
210
|
-
readonly workspaceInstanceId: string;
|
|
211
|
-
}
|
|
212
|
-
export interface UpdateUserMessagesOptions {
|
|
213
|
-
readonly messageIds: string[];
|
|
340
|
+
/* this is here to enable backwards-compatibility and untangling rollout between workspace, IDE and meta */
|
|
341
|
+
dontWait?: boolean;
|
|
214
342
|
}
|
|
215
343
|
export interface GetUserStorageResourceOptions {
|
|
216
344
|
readonly uri: string;
|
|
@@ -272,11 +400,11 @@ export class GitpodCompositeClient<Client extends GitpodClient> implements Gitpo
|
|
|
272
400
|
}
|
|
273
401
|
}
|
|
274
402
|
|
|
275
|
-
|
|
403
|
+
onPrebuildUpdate(update: PrebuildWithStatus): void {
|
|
276
404
|
for (const client of this.clients) {
|
|
277
|
-
if (client.
|
|
405
|
+
if (client.onPrebuildUpdate) {
|
|
278
406
|
try {
|
|
279
|
-
client.
|
|
407
|
+
client.onPrebuildUpdate(update);
|
|
280
408
|
} catch (error) {
|
|
281
409
|
console.error(error)
|
|
282
410
|
}
|
|
@@ -284,11 +412,11 @@ export class GitpodCompositeClient<Client extends GitpodClient> implements Gitpo
|
|
|
284
412
|
}
|
|
285
413
|
}
|
|
286
414
|
|
|
287
|
-
|
|
415
|
+
onWorkspaceImageBuildLogs(info: WorkspaceImageBuild.StateInfo, content: WorkspaceImageBuild.LogContent | undefined): void {
|
|
288
416
|
for (const client of this.clients) {
|
|
289
|
-
if (client.
|
|
417
|
+
if (client.onWorkspaceImageBuildLogs) {
|
|
290
418
|
try {
|
|
291
|
-
client.
|
|
419
|
+
client.onWorkspaceImageBuildLogs(info, content);
|
|
292
420
|
} catch (error) {
|
|
293
421
|
console.error(error)
|
|
294
422
|
}
|
|
@@ -320,6 +448,18 @@ export class GitpodCompositeClient<Client extends GitpodClient> implements Gitpo
|
|
|
320
448
|
}
|
|
321
449
|
}
|
|
322
450
|
|
|
451
|
+
onCreditAlert(creditAlert: CreditAlert): void {
|
|
452
|
+
for (const client of this.clients) {
|
|
453
|
+
if (client.onCreditAlert) {
|
|
454
|
+
try {
|
|
455
|
+
client.onCreditAlert(creditAlert);
|
|
456
|
+
} catch (error) {
|
|
457
|
+
console.error(error)
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
323
463
|
}
|
|
324
464
|
|
|
325
465
|
export type GitpodService = GitpodServiceImpl<GitpodClient, GitpodServer>;
|
|
@@ -340,7 +480,7 @@ export class WorkspaceInstanceUpdateListener {
|
|
|
340
480
|
private readonly onDidChangeEmitter = new Emitter<void>();
|
|
341
481
|
readonly onDidChange = this.onDidChangeEmitter.event;
|
|
342
482
|
|
|
343
|
-
private source: 'sync'
|
|
483
|
+
private source: 'sync' | 'update' = 'sync';
|
|
344
484
|
|
|
345
485
|
get info(): WorkspaceInfo {
|
|
346
486
|
return this._info;
|
|
@@ -432,11 +572,15 @@ export class WorkspaceInstanceUpdateListener {
|
|
|
432
572
|
|
|
433
573
|
}
|
|
434
574
|
|
|
575
|
+
export interface GitpodServiceOptions {
|
|
576
|
+
onReconnect?: () => (void | Promise<void>)
|
|
577
|
+
}
|
|
578
|
+
|
|
435
579
|
export class GitpodServiceImpl<Client extends GitpodClient, Server extends GitpodServer> {
|
|
436
580
|
|
|
437
581
|
private readonly compositeClient = new GitpodCompositeClient<Client>();
|
|
438
582
|
|
|
439
|
-
constructor(public readonly server: JsonRpcProxy<Server
|
|
583
|
+
constructor(public readonly server: JsonRpcProxy<Server>, private options?: GitpodServiceOptions) {
|
|
440
584
|
server.setClient(this.compositeClient);
|
|
441
585
|
server.onDidOpenConnection(() => this.compositeClient.notifyDidOpenConnection());
|
|
442
586
|
server.onDidCloseConnection(() => this.compositeClient.notifyDidCloseConnection());
|
|
@@ -456,13 +600,34 @@ export class GitpodServiceImpl<Client extends GitpodClient, Server extends Gitpo
|
|
|
456
600
|
this.instanceListeners.set(workspaceId, listener);
|
|
457
601
|
return listener;
|
|
458
602
|
}
|
|
603
|
+
|
|
604
|
+
async reconnect(): Promise<void> {
|
|
605
|
+
if (this.options?.onReconnect) {
|
|
606
|
+
await this.options.onReconnect();
|
|
607
|
+
}
|
|
608
|
+
}
|
|
459
609
|
}
|
|
460
610
|
|
|
461
|
-
export function createGitpodService<C extends GitpodClient, S extends GitpodServer>(serverUrl: string) {
|
|
462
|
-
const
|
|
463
|
-
|
|
464
|
-
|
|
611
|
+
export function createGitpodService<C extends GitpodClient, S extends GitpodServer>(serverUrl: string | Promise<string>) {
|
|
612
|
+
const toWsUrl = (serverUrl: string) => {
|
|
613
|
+
return new GitpodHostUrl(serverUrl)
|
|
614
|
+
.asWebsocket()
|
|
615
|
+
.withApi({ pathname: GitpodServerPath })
|
|
616
|
+
.toString();
|
|
617
|
+
};
|
|
618
|
+
let url: string | Promise<string>;
|
|
619
|
+
if (typeof serverUrl === "string") {
|
|
620
|
+
url = toWsUrl(serverUrl);
|
|
621
|
+
} else {
|
|
622
|
+
url = serverUrl.then(url => toWsUrl(url));
|
|
623
|
+
}
|
|
624
|
+
|
|
465
625
|
const connectionProvider = new WebSocketConnectionProvider();
|
|
466
|
-
|
|
467
|
-
|
|
626
|
+
let onReconnect = () => { };
|
|
627
|
+
const gitpodServer = connectionProvider.createProxy<S>(url, undefined, {
|
|
628
|
+
onListening: socket => {
|
|
629
|
+
onReconnect = () => socket.reconnect();
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
return new GitpodServiceImpl<C, S>(gitpodServer, { onReconnect });
|
|
468
633
|
}
|
|
@@ -22,21 +22,17 @@ export namespace HeadlessWorkspaceEventType {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
export interface
|
|
25
|
+
export interface HeadlessWorkspaceEvent {
|
|
26
26
|
workspaceID: string;
|
|
27
27
|
text: string;
|
|
28
28
|
type: HeadlessWorkspaceEventType;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
export
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
TaskSuccessfulLabel = "workspaceTaskDone"
|
|
31
|
+
export interface HeadlessLogUrls {
|
|
32
|
+
// A map of id to URL
|
|
33
|
+
streams: { [streamID: string]: string };
|
|
35
34
|
}
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
error?: string;
|
|
41
|
-
snapshotURL?: string;
|
|
42
|
-
}
|
|
36
|
+
/** cmp. @const HEADLESS_LOG_STREAM_STATUS_CODE_REGEX */
|
|
37
|
+
export const HEADLESS_LOG_STREAM_STATUS_CODE = "X-LogStream-StatusCode";
|
|
38
|
+
export const HEADLESS_LOG_STREAM_STATUS_CODE_REGEX = /X-LogStream-StatusCode: ([0-9]{3})/;
|
package/src/index.ts
CHANGED
|
@@ -13,4 +13,8 @@ export * from './license-protocol';
|
|
|
13
13
|
export * from './workspace-instance';
|
|
14
14
|
export * from './permission';
|
|
15
15
|
export * from './admin-protocol';
|
|
16
|
-
export * from './email-protocol';
|
|
16
|
+
export * from './email-protocol';
|
|
17
|
+
export * from './headless-workspace-log';
|
|
18
|
+
export * from './context-url';
|
|
19
|
+
export * from './teams-projects-protocol';
|
|
20
|
+
export * from './snapshot-url';
|
|
@@ -5,13 +5,17 @@
|
|
|
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 {
|
|
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";
|
|
9
12
|
import { JsonRpcProxyFactory, JsonRpcProxy } from "../proxy-factory";
|
|
10
|
-
import { ConnectionHandler } from "../handler";
|
|
11
|
-
import ReconnectingWebSocket from 'reconnecting-websocket';
|
|
13
|
+
import { ConnectionEventHandler, ConnectionHandler } from "../handler";
|
|
14
|
+
import ReconnectingWebSocket, { Event } from 'reconnecting-websocket';
|
|
12
15
|
|
|
13
16
|
export interface WebSocketOptions {
|
|
14
17
|
onerror?: (event: Event) => void;
|
|
18
|
+
onListening?: (socket: ReconnectingWebSocket) => void;
|
|
15
19
|
}
|
|
16
20
|
|
|
17
21
|
export class WebSocketConnectionProvider {
|
|
@@ -23,19 +27,35 @@ export class WebSocketConnectionProvider {
|
|
|
23
27
|
* An optional target can be provided to handle
|
|
24
28
|
* notifications and requests from a remote side.
|
|
25
29
|
*/
|
|
26
|
-
createProxy<T extends object>(path: string
|
|
30
|
+
createProxy<T extends object>(path: string | Promise<string>, target?: object, options?: WebSocketOptions): JsonRpcProxy<T> {
|
|
27
31
|
const factory = new JsonRpcProxyFactory<T>(target);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
const startListening = (path: string) => {
|
|
33
|
+
const socket = this.listen({
|
|
34
|
+
path,
|
|
35
|
+
onConnection: c => factory.listen(c),
|
|
36
|
+
}, {
|
|
37
|
+
onTransportDidClose: () => factory.fireConnectionClosed(),
|
|
38
|
+
onTransportDidOpen: () => factory.fireConnectionOpened(),
|
|
39
|
+
},
|
|
40
|
+
options
|
|
41
|
+
);
|
|
42
|
+
if (options?.onListening) {
|
|
43
|
+
options.onListening(socket as any as ReconnectingWebSocket)
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
if (typeof path === "string") {
|
|
48
|
+
startListening(path);
|
|
49
|
+
} else {
|
|
50
|
+
path.then(path => startListening(path));
|
|
51
|
+
}
|
|
32
52
|
return factory.createProxy();
|
|
33
53
|
}
|
|
34
54
|
|
|
35
55
|
/**
|
|
36
56
|
* Install a connection handler for the given path.
|
|
37
57
|
*/
|
|
38
|
-
listen(handler: ConnectionHandler, options?: WebSocketOptions):
|
|
58
|
+
listen(handler: ConnectionHandler, eventHandler: ConnectionEventHandler, options?: WebSocketOptions): WebSocket {
|
|
39
59
|
const url = handler.path;
|
|
40
60
|
const webSocket = this.createWebSocket(url);
|
|
41
61
|
|
|
@@ -50,11 +70,13 @@ export class WebSocketConnectionProvider {
|
|
|
50
70
|
logger.error(JSON.stringify(error));
|
|
51
71
|
});
|
|
52
72
|
}
|
|
53
|
-
doListen(
|
|
54
|
-
webSocket,
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
73
|
+
doListen(
|
|
74
|
+
webSocket as any as ReconnectingWebSocket,
|
|
75
|
+
handler,
|
|
76
|
+
eventHandler,
|
|
77
|
+
logger,
|
|
78
|
+
);
|
|
79
|
+
return webSocket;
|
|
58
80
|
}
|
|
59
81
|
|
|
60
82
|
protected createLogger(): Logger {
|
|
@@ -76,3 +98,162 @@ export class WebSocketConnectionProvider {
|
|
|
76
98
|
}
|
|
77
99
|
|
|
78
100
|
}
|
|
101
|
+
|
|
102
|
+
// The following was extracted from vscode-ws-jsonrpc to make these changes:
|
|
103
|
+
// - switch from WebSocket to ReconnectingWebSocket
|
|
104
|
+
// - webSocket.onopen: making sure it's only ever called once so we're re-using MessageConnection
|
|
105
|
+
// - WebSocketMessageWriter: buffer and re-try messages instead of throwing an error immidiately
|
|
106
|
+
// - WebSocketMessageReader: don't close MessageConnection on 'socket.onclose'
|
|
107
|
+
function doListen(resocket: ReconnectingWebSocket, handler: ConnectionHandler, eventHandler: ConnectionEventHandler, logger: Logger) {
|
|
108
|
+
resocket.addEventListener("close", () => eventHandler.onTransportDidClose());
|
|
109
|
+
|
|
110
|
+
let alreadyOpened = false;
|
|
111
|
+
resocket.onopen = () => {
|
|
112
|
+
// trigerr "open" every time we re-open the underlying websocket
|
|
113
|
+
eventHandler.onTransportDidOpen();
|
|
114
|
+
|
|
115
|
+
// make sure we're only ever creating one MessageConnection, irregardless of how many times we have to re-open the underlying (reconnecting) websocket
|
|
116
|
+
if (alreadyOpened) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
alreadyOpened = true;
|
|
120
|
+
|
|
121
|
+
const connection = createWebSocketConnection(resocket, logger);
|
|
122
|
+
handler.onConnection(connection);
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function createWebSocketConnection(resocket: ReconnectingWebSocket, logger: Logger) {
|
|
127
|
+
const socket = toSocket(resocket as any);
|
|
128
|
+
const messageReader = new NonClosingWebSocketMessageReader(socket);
|
|
129
|
+
const messageWriter = new BufferingWebSocketMessageWriter(resocket, logger);
|
|
130
|
+
const connection = createMessageConnection(messageReader, messageWriter, logger);
|
|
131
|
+
connection.onClose(() => connection.dispose());
|
|
132
|
+
return connection;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* This takes vscode-ws-jsonrpc/lib/socket/writer/WebSocketMessageWriter and adds a buffer
|
|
137
|
+
*/
|
|
138
|
+
class BufferingWebSocketMessageWriter extends AbstractMessageWriter {
|
|
139
|
+
protected readonly socket: ReconnectingWebSocket;
|
|
140
|
+
protected readonly logger: Logger;
|
|
141
|
+
protected errorCount: number = 0;
|
|
142
|
+
|
|
143
|
+
protected buffer: any[] = [];
|
|
144
|
+
|
|
145
|
+
constructor(socket: ReconnectingWebSocket, logger: Logger) {
|
|
146
|
+
super();
|
|
147
|
+
this.socket = socket;
|
|
148
|
+
this.logger = logger;
|
|
149
|
+
|
|
150
|
+
socket.addEventListener("open", (event: Event) => this.flushBuffer());
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
write(msg: any) {
|
|
154
|
+
if (this.socket.readyState !== ReconnectingWebSocket.OPEN) {
|
|
155
|
+
this.bufferMsg(msg);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
try {
|
|
160
|
+
const content = JSON.stringify(msg);
|
|
161
|
+
this.socket.send(content);
|
|
162
|
+
} catch (e) {
|
|
163
|
+
this.errorCount++;
|
|
164
|
+
this.fireError(e, msg, this.errorCount);
|
|
165
|
+
|
|
166
|
+
this.bufferMsg(msg);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
protected flushBuffer() {
|
|
171
|
+
if (this.buffer.length === 0) {
|
|
172
|
+
return
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const buffer = [...this.buffer];
|
|
176
|
+
this.buffer = [];
|
|
177
|
+
for (const msg of buffer) {
|
|
178
|
+
this.write(msg);
|
|
179
|
+
}
|
|
180
|
+
//this.logger.info(`flushed buffer (${this.buffer.length})`)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
protected bufferMsg(msg: any) {
|
|
184
|
+
this.buffer.push(msg);
|
|
185
|
+
//this.logger.info(`buffered message (${this.buffer.length})`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* This takes vscode-ws-jsonrpc/lib/socket/reader/WebSocketMessageReader and removes the "onClose -> fireClose" connection
|
|
192
|
+
*/
|
|
193
|
+
class NonClosingWebSocketMessageReader extends AbstractMessageReader {
|
|
194
|
+
protected readonly socket: IWebSocket;
|
|
195
|
+
protected readonly events: any[] = [];
|
|
196
|
+
protected state: 'initial' | 'listening' | 'closed' = 'initial';
|
|
197
|
+
protected callback: (message: any) => void = () => {};
|
|
198
|
+
|
|
199
|
+
constructor(socket: IWebSocket) {
|
|
200
|
+
super();
|
|
201
|
+
this.socket = socket;
|
|
202
|
+
this.socket.onMessage(message => this.readMessage(message));
|
|
203
|
+
this.socket.onError(error => this.fireError(error));
|
|
204
|
+
this.socket.onClose((code, reason) => {
|
|
205
|
+
if (code !== 1000) {
|
|
206
|
+
const error = {
|
|
207
|
+
name: '' + code,
|
|
208
|
+
message: `Error during socket reconnect: code = ${code}, reason = ${reason}`
|
|
209
|
+
};
|
|
210
|
+
this.fireError(error);
|
|
211
|
+
}
|
|
212
|
+
// this.fireClose(); // <-- reason for this class to be copied over
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
listen(callback: (message: any) => void) {
|
|
216
|
+
if (this.state === 'initial') {
|
|
217
|
+
this.state = 'listening';
|
|
218
|
+
this.callback = callback;
|
|
219
|
+
while (this.events.length !== 0) {
|
|
220
|
+
const event = this.events.pop();
|
|
221
|
+
if (event.message) {
|
|
222
|
+
this.readMessage(event.message);
|
|
223
|
+
}
|
|
224
|
+
else if (event.error) {
|
|
225
|
+
this.fireError(event.error);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
this.fireClose();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
readMessage(message: any) {
|
|
234
|
+
if (this.state === 'initial') {
|
|
235
|
+
this.events.splice(0, 0, { message });
|
|
236
|
+
}
|
|
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
|
+
}
|
|
246
|
+
else if (this.state === 'listening') {
|
|
247
|
+
super.fireError(error);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
fireClose() {
|
|
251
|
+
if (this.state === 'initial') {
|
|
252
|
+
this.events.splice(0, 0, {});
|
|
253
|
+
}
|
|
254
|
+
else if (this.state === 'listening') {
|
|
255
|
+
super.fireClose();
|
|
256
|
+
}
|
|
257
|
+
this.state = 'closed';
|
|
258
|
+
}
|
|
259
|
+
}
|