@mavogel/cdk-vscode-server 0.0.62 → 0.0.63
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/.jsii +117 -178
- package/API.md +96 -199
- package/CLAUDE.md +214 -57
- package/README.md +39 -1
- package/assets/idle-monitor-enabler/idle-monitor-enabler.lambda/index.js +67 -0
- package/assets/installer/installer.lambda/index.js +67 -30
- package/awslint.json +5 -0
- package/examples/git-repo/main.ts +30 -0
- package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.assets.json +2 -2
- package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.template.json +1 -1
- package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.assets.json +8 -8
- package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.template.json +257 -94
- package/integ-tests/{integ.stop-on-idle.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.al2023.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/{integ.ubuntu.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.al2023.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
- package/integ-tests/integ.al2023.ts.snapshot/integ.json +1 -1
- package/integ-tests/integ.al2023.ts.snapshot/manifest.json +19 -3
- package/integ-tests/integ.al2023.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.assets.json +2 -2
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.template.json +1 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.assets.json +8 -8
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.template.json +270 -94
- package/integ-tests/{integ.ubuntu.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.custom-domain.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/{integ.al2023.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.custom-domain.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
- package/integ-tests/integ.custom-domain.ts.snapshot/integ.json +1 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/manifest.json +19 -3
- package/integ-tests/integ.custom-domain.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.stop-on-idle.ts +1 -4
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.assets.json +2 -2
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.template.json +4 -4
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.assets.json +23 -9
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.template.json +755 -194
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.22c8a6c357b704e370bef317ae1b52c59f684aa7640422a3d1dfe813d1f77853.lambda/index.js +67 -0
- package/integ-tests/{integ.custom-domain.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.stop-on-idle.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/integ.stop-on-idle.ts.snapshot/manifest.json +353 -72
- package/integ-tests/integ.stop-on-idle.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +2 -2
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +1 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.assets.json +8 -8
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.template.json +270 -94
- package/integ-tests/{integ.al2023.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.ubuntu.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/{integ.custom-domain.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.ubuntu.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
- package/integ-tests/integ.ubuntu.ts.snapshot/integ.json +1 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/manifest.json +19 -3
- package/integ-tests/integ.ubuntu.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.ubuntu24.ts +69 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +33 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +337 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.assets.json +118 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.template.json +2725 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d/index.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda/index.js +180 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +30676 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.781ab0ab74634cdaf61539ab208ab777829ef07097ac21f95b9e15a3b1eedc1b.lambda/index.js +57 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/__entrypoint__.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/index.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.9d043014be736e8162bcc7ec5590cc6d2ff24fd0d9c73a5c5d595151c5fdad00/index.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js +3 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9/index.js +6017 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/integ.json +23 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/manifest.json +1473 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/tree.json +1 -0
- package/lib/idle-monitor/idle-monitor-function.js +2 -2
- package/lib/idle-monitor/idle-monitor.js +5 -2
- package/lib/idle-monitor-enabler/idle-monitor-enabler-function.d.ts +13 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler-function.js +22 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.d.ts +25 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.js +76 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.d.ts +9 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.js +48 -0
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -2
- package/lib/installer/installer-function.js +2 -2
- package/lib/installer/installer.d.ts +100 -0
- package/lib/installer/installer.js +658 -301
- package/lib/installer/installer.lambda.js +64 -30
- package/lib/secret-retriever/secret-retriever-function.js +2 -2
- package/lib/vscode-server.d.ts +40 -0
- package/lib/vscode-server.js +27 -4
- package/package.json +12 -12
- package/.claude/hooks/file_checker.sh +0 -178
- package/.qlty/.gitignore +0 -7
- package/.qlty/configs/.yamllint.yaml +0 -21
- package/.qlty/qlty.toml +0 -115
- package/assets/status-check/status-check.lambda/index.js +0 -123
- package/integ-tests/integ.al2023.ts.snapshot/cdk.out +0 -1
- package/integ-tests/integ.al2023.ts.snapshot/read.13497.1.lock +0 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/read.13497.1.lock +0 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/cdk.out +0 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/read.13497.1.lock +0 -1
- package/lib/status-check/status-check-function.d.ts +0 -13
- package/lib/status-check/status-check-function.js +0 -22
- package/lib/status-check/status-check.d.ts +0 -36
- package/lib/status-check/status-check.js +0 -109
- package/lib/status-check/status-check.lambda.d.ts +0 -2
- package/lib/status-check/status-check.lambda.js +0 -104
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/idle-monitor-enabler/idle-monitor-enabler.lambda.ts
|
|
21
|
+
var idle_monitor_enabler_lambda_exports = {};
|
|
22
|
+
__export(idle_monitor_enabler_lambda_exports, {
|
|
23
|
+
handler: () => handler
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(idle_monitor_enabler_lambda_exports);
|
|
26
|
+
var import_client_eventbridge = require("@aws-sdk/client-eventbridge");
|
|
27
|
+
var eventBridge = new import_client_eventbridge.EventBridge();
|
|
28
|
+
var handler = async (event) => {
|
|
29
|
+
console.log("Event: %j", { ...event, ResponseURL: "..." });
|
|
30
|
+
const ruleName = event.ResourceProperties.RuleName;
|
|
31
|
+
if (!ruleName) {
|
|
32
|
+
throw new Error("RuleName is required in ResourceProperties");
|
|
33
|
+
}
|
|
34
|
+
switch (event.RequestType) {
|
|
35
|
+
case "Create":
|
|
36
|
+
case "Update":
|
|
37
|
+
console.log(`Enabling EventBridge rule: ${ruleName}`);
|
|
38
|
+
await eventBridge.send(
|
|
39
|
+
new import_client_eventbridge.EnableRuleCommand({
|
|
40
|
+
Name: ruleName
|
|
41
|
+
})
|
|
42
|
+
);
|
|
43
|
+
console.log(`Successfully enabled rule: ${ruleName}`);
|
|
44
|
+
return {
|
|
45
|
+
PhysicalResourceId: `idle-monitor-enabler-${ruleName}`
|
|
46
|
+
};
|
|
47
|
+
case "Delete":
|
|
48
|
+
console.log(`Disabling EventBridge rule on deletion: ${ruleName}`);
|
|
49
|
+
try {
|
|
50
|
+
await eventBridge.send(
|
|
51
|
+
new import_client_eventbridge.DisableRuleCommand({
|
|
52
|
+
Name: ruleName
|
|
53
|
+
})
|
|
54
|
+
);
|
|
55
|
+
console.log(`Successfully disabled rule: ${ruleName}`);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.log(`Error disabling rule (ignoring): ${error.message}`);
|
|
58
|
+
}
|
|
59
|
+
return {};
|
|
60
|
+
default:
|
|
61
|
+
throw new Error(`Unsupported RequestType: ${event.RequestType}`);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
65
|
+
0 && (module.exports = {
|
|
66
|
+
handler
|
|
67
|
+
});
|
|
@@ -59,47 +59,89 @@ var handler = async (event, context) => {
|
|
|
59
59
|
parameters[key] = [value];
|
|
60
60
|
}
|
|
61
61
|
console.log("mapped parameters: %j", parameters);
|
|
62
|
-
let attemptNo = 0;
|
|
63
|
-
let timeRemaining = context.getRemainingTimeInMillis();
|
|
64
62
|
console.log(
|
|
65
63
|
`Running SSM Document '${documentName}' on EC2 instance '${instanceId}'. Logging to '${cloudWatchLogGroupName}' with parameters: '${JSON.stringify(parameters)}'`
|
|
66
64
|
);
|
|
65
|
+
let commandId;
|
|
66
|
+
let attemptNo = 0;
|
|
67
67
|
while (true) {
|
|
68
68
|
attemptNo += 1;
|
|
69
|
+
const timeRemaining = context.getRemainingTimeInMillis();
|
|
69
70
|
console.log(
|
|
70
|
-
`
|
|
71
|
+
`Send attempt: ${attemptNo}. Time Remaining: ${timeRemaining / 1e3}s`
|
|
71
72
|
);
|
|
72
73
|
try {
|
|
73
|
-
const response = await ssm.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
74
|
+
const response = await ssm.send(
|
|
75
|
+
new import_client_ssm.SendCommandCommand({
|
|
76
|
+
DocumentName: documentName,
|
|
77
|
+
InstanceIds: [instanceId],
|
|
78
|
+
CloudWatchOutputConfig: {
|
|
79
|
+
CloudWatchLogGroupName: cloudWatchLogGroupName,
|
|
80
|
+
CloudWatchOutputEnabled: true
|
|
81
|
+
},
|
|
82
|
+
Parameters: parameters
|
|
83
|
+
})
|
|
84
|
+
);
|
|
85
|
+
console.log(`sendCommand response: ${JSON.stringify(response)}`);
|
|
83
86
|
const command = response.Command;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
commandId = command.CommandId;
|
|
88
|
+
console.log(`Command sent successfully. CommandId: ${commandId}`);
|
|
89
|
+
break;
|
|
90
|
+
} catch (error) {
|
|
91
|
+
console.log("Error sending command:", error);
|
|
92
|
+
const isUnauthorized = error.name === "UnauthorizedException" || error.name === "AccessDeniedException" || error.message && error.message.includes("not authorized");
|
|
93
|
+
const isThrottled = error.name === "ThrottlingException" || error.name === "TooManyRequestsException";
|
|
94
|
+
const isRetryable = isUnauthorized || isThrottled;
|
|
95
|
+
const remainingTime = context.getRemainingTimeInMillis();
|
|
96
|
+
if (isRetryable && remainingTime > SLEEP_MS) {
|
|
97
|
+
console.log(
|
|
98
|
+
`Retryable error encountered (${error.name}). Attempt ${attemptNo}. Sleeping: ${SLEEP_MS / 1e3}s before retry`
|
|
99
|
+
);
|
|
100
|
+
await new Promise((resolve) => setTimeout(resolve, SLEEP_MS));
|
|
101
|
+
} else {
|
|
102
|
+
console.log("Non-retryable error or timeout. Failing...");
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
let pollAttemptNo = 0;
|
|
108
|
+
const responseData = { CommandId: commandId };
|
|
109
|
+
while (true) {
|
|
110
|
+
pollAttemptNo += 1;
|
|
111
|
+
const timeRemaining = context.getRemainingTimeInMillis();
|
|
112
|
+
console.log(
|
|
113
|
+
`Poll attempt: ${pollAttemptNo}. Time Remaining: ${timeRemaining / 1e3}s`
|
|
114
|
+
);
|
|
115
|
+
try {
|
|
116
|
+
const invocationResponse = await ssm.send(
|
|
117
|
+
new import_client_ssm.GetCommandInvocationCommand({
|
|
118
|
+
CommandId: commandId,
|
|
119
|
+
InstanceId: instanceId
|
|
120
|
+
})
|
|
121
|
+
);
|
|
122
|
+
console.log(
|
|
123
|
+
`getCommandInvocation response: ${JSON.stringify(invocationResponse)}`
|
|
124
|
+
);
|
|
125
|
+
const status = invocationResponse.Status;
|
|
126
|
+
switch (status) {
|
|
87
127
|
case "Pending":
|
|
88
128
|
case "InProgress":
|
|
89
|
-
|
|
129
|
+
case "Delayed":
|
|
90
130
|
if (timeRemaining > SLEEP_MS) {
|
|
91
131
|
console.log(
|
|
92
|
-
`
|
|
132
|
+
`Command ${commandId} status: '${status}'. Sleeping: ${SLEEP_MS / 1e3}s`
|
|
93
133
|
);
|
|
94
134
|
await new Promise((resolve) => setTimeout(resolve, SLEEP_MS));
|
|
95
135
|
break;
|
|
96
136
|
} else {
|
|
97
137
|
throw new Error(
|
|
98
|
-
`SSM Document ${documentName} on EC2 instance ${instanceId} timed out while lambda
|
|
138
|
+
`SSM Document ${documentName} on EC2 instance ${instanceId} timed out while lambda waiting (status: ${status})`
|
|
99
139
|
);
|
|
100
140
|
}
|
|
101
141
|
case "Success":
|
|
102
|
-
console.log(
|
|
142
|
+
console.log(
|
|
143
|
+
`Instance ${instanceId} successfully bootstrapped. Command ${commandId} completed.`
|
|
144
|
+
);
|
|
103
145
|
return { Data: responseData };
|
|
104
146
|
case "TimedOut":
|
|
105
147
|
throw new Error(
|
|
@@ -115,23 +157,18 @@ var handler = async (event, context) => {
|
|
|
115
157
|
);
|
|
116
158
|
default:
|
|
117
159
|
throw new Error(
|
|
118
|
-
`SSM Document ${documentName} on EC2 instance ${instanceId} status ${
|
|
160
|
+
`SSM Document ${documentName} on EC2 instance ${instanceId} unknown status: ${status}`
|
|
119
161
|
);
|
|
120
162
|
}
|
|
121
|
-
return { Data: responseData };
|
|
122
163
|
} catch (error) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const isThrottled = error.name === "ThrottlingException" || error.name === "TooManyRequestsException";
|
|
126
|
-
const isRetryable = isUnauthorized || isThrottled;
|
|
127
|
-
timeRemaining = context.getRemainingTimeInMillis();
|
|
128
|
-
if (isRetryable && timeRemaining > SLEEP_MS) {
|
|
164
|
+
const remainingTime = context.getRemainingTimeInMillis();
|
|
165
|
+
if (error.name === "InvocationDoesNotExist" && remainingTime > SLEEP_MS) {
|
|
129
166
|
console.log(
|
|
130
|
-
`
|
|
167
|
+
`Invocation not yet available. Sleeping: ${SLEEP_MS / 1e3}s`
|
|
131
168
|
);
|
|
132
169
|
await new Promise((resolve) => setTimeout(resolve, SLEEP_MS));
|
|
133
170
|
} else {
|
|
134
|
-
console.log("
|
|
171
|
+
console.log("Error checking command status:", error);
|
|
135
172
|
throw error;
|
|
136
173
|
}
|
|
137
174
|
}
|