@mavogel/cdk-vscode-server 0.0.60 → 0.0.62
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/.claude/hooks/file_checker.sh +3 -0
- package/.jsii +454 -31
- package/API.md +514 -0
- package/README.md +57 -0
- package/assets/idle-monitor/idle-monitor.lambda/index.js +110 -0
- package/assets/status-check/status-check.lambda/index.js +123 -0
- package/examples/auto-stop/main.ts +75 -0
- package/integ-tests/functions/idle-test-handler.ts +178 -0
- package/integ-tests/functions/login-handler.ts +62 -33
- package/integ-tests/integ.al2023.ts.snapshot/read.13497.1.lock +1 -0
- package/integ-tests/integ.custom-domain.ts.snapshot/read.13497.1.lock +1 -0
- package/integ-tests/integ.stop-on-idle.ts +175 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.assets.json +33 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.template.json +692 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.assets.json +146 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.template.json +3077 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d/index.js +1 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda/index.js +143 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +30676 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.781ab0ab74634cdaf61539ab208ab777829ef07097ac21f95b9e15a3b1eedc1b.lambda/index.js +57 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/__entrypoint__.js +1 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/index.js +1 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.8dd4be31c5a6cd8750dc55c07c1e2f19596f8a27b032d02c18554ed44eabe065.lambda/index.js +110 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.9d043014be736e8162bcc7ec5590cc6d2ff24fd0d9c73a5c5d595151c5fdad00/index.js +1 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js +1 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js +1 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js +3 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js +1 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js +1 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.d061a1ca61c6339fcb77bb6fc19194a60c96bb16531eaf1e4e733b50089512ca/index.js +118 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9/index.js +6017 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/integ.json +20 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/manifest.json +1942 -0
- package/integ-tests/integ.stop-on-idle.ts.snapshot/tree.json +1 -0
- package/integ-tests/integ.ubuntu.ts.snapshot/read.13497.1.lock +1 -0
- package/lib/idle-monitor/idle-monitor-function.d.ts +13 -0
- package/lib/idle-monitor/idle-monitor-function.js +22 -0
- package/lib/idle-monitor/idle-monitor.d.ts +53 -0
- package/lib/idle-monitor/idle-monitor.js +84 -0
- package/lib/idle-monitor/idle-monitor.lambda.d.ts +2 -0
- package/lib/idle-monitor/idle-monitor.lambda.js +97 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/status-check/status-check-function.d.ts +13 -0
- package/lib/status-check/status-check-function.js +22 -0
- package/lib/status-check/status-check.d.ts +36 -0
- package/lib/status-check/status-check.js +109 -0
- package/lib/status-check/status-check.lambda.d.ts +2 -0
- package/lib/status-check/status-check.lambda.js +104 -0
- package/lib/vscode-server.d.ts +42 -0
- package/lib/vscode-server.js +51 -7
- package/mavogelcdkvscodeserver/go.mod +1 -1
- package/mavogelcdkvscodeserver/jsii/jsii.go +2 -2
- package/mavogelcdkvscodeserver/version +1 -1
- package/package.json +21 -16
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var h=Object.create,d=Object.defineProperty,P=Object.getOwnPropertyDescriptor,C=Object.getOwnPropertyNames,b=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty,E=(e,o)=>{for(var n in o)d(e,n,{get:o[n],enumerable:!0})},p=(e,o,n,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of C(o))!S.call(e,r)&&r!==n&&d(e,r,{get:()=>o[r],enumerable:!(t=P(o,r))||t.enumerable});return e},G=(e,o,n)=>(n=e!=null?h(b(e)):{},p(o||!e||!e.__esModule?d(n,"default",{value:e,enumerable:!0}):n,e)),x=e=>p(d({},"__esModule",{value:!0}),e),O={};E(O,{disableSleepForTesting:()=>I,handler:()=>q}),module.exports=x(O);var i=G(require("@aws-sdk/client-cloudwatch-logs")),w=!1;function I(){w=!0}async function R(e,o,n){await n(async()=>{try{let t={logGroupName:e},r=new i.CreateLogGroupCommand(t);await o.send(r)}catch(t){if(t.name==="ResourceAlreadyExistsException")return;throw t}})}async function k(e,o,n){await n(async()=>{try{let t={logGroupName:e},r=new i.DeleteLogGroupCommand(t);await o.send(r)}catch(t){if(t.name==="ResourceNotFoundException")return;throw t}})}async function y(e,o,n,t){await n(async()=>{if(t){let r={logGroupName:e,retentionInDays:t},s=new i.PutRetentionPolicyCommand(r);await o.send(s)}else{let r={logGroupName:e},s=new i.DeleteRetentionPolicyCommand(r);await o.send(s)}})}async function q(e,o){try{console.log(JSON.stringify({...e,ResponseURL:"..."}));let t=e.ResourceProperties.LogGroupName,r=e.ResourceProperties.LogGroupRegion,s=L(e.ResourceProperties.SdkRetry?.maxRetries)??10,a=N(s),m={logger:console,region:r},c=new i.CloudWatchLogsClient(m);if((e.RequestType==="Create"||e.RequestType==="Update")&&(await R(t,c,a),await y(t,c,a,L(e.ResourceProperties.RetentionInDays)),e.RequestType==="Create")){let g=new i.CloudWatchLogsClient({logger:console,region:process.env.AWS_REGION});await R(`/aws/lambda/${o.functionName}`,g,a),await y(`/aws/lambda/${o.functionName}`,g,a,1)}e.RequestType==="Delete"&&e.ResourceProperties.RemovalPolicy==="destroy"&&await k(t,c,a),await n("SUCCESS","OK",t)}catch(t){console.log(t),await n("FAILED",t.message,e.ResourceProperties.LogGroupName)}function n(t,r,s){let a=JSON.stringify({Status:t,Reason:r,PhysicalResourceId:s,StackId:e.StackId,RequestId:e.RequestId,LogicalResourceId:e.LogicalResourceId,Data:{LogGroupName:e.ResourceProperties.LogGroupName}});console.log("Responding",a);let m=require("url").parse(e.ResponseURL),c={hostname:m.hostname,path:m.path,method:"PUT",headers:{"content-type":"","content-length":Buffer.byteLength(a,"utf8")}};return new Promise((g,l)=>{try{let u=require("https").request(c,g);u.on("error",l),u.write(a),u.end()}catch(u){l(u)}})}}function L(e,o=10){if(e!==void 0)return parseInt(e,o)}function N(e,o=1e3,n=6e4){return async t=>{let r=0;do try{return await t()}catch(s){if(f("OperationAbortedException",s)||f("ThrottlingException",s))if(r<e){r++,await D(W(r,o,n));continue}else throw new Error("Out of attempts to change log group");throw s}while(!0)}}function f(e,o){return o.name===e||o.message.includes(e)}function W(e,o,n){return Math.min(Math.round(Math.random()*o*2**e),n)}async function D(e){w&&(e=0),await new Promise(o=>setTimeout(o,e))}
|
|
@@ -0,0 +1,143 @@
|
|
|
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/installer/installer.lambda.ts
|
|
21
|
+
var installer_lambda_exports = {};
|
|
22
|
+
__export(installer_lambda_exports, {
|
|
23
|
+
handler: () => handler
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(installer_lambda_exports);
|
|
26
|
+
var import_client_ssm = require("@aws-sdk/client-ssm");
|
|
27
|
+
var ssm = new import_client_ssm.SSM();
|
|
28
|
+
var SLEEP_MS = 2900;
|
|
29
|
+
var handler = async (event, context) => {
|
|
30
|
+
console.log("Event: %j", { ...event, ResponseURL: "..." });
|
|
31
|
+
if (event.RequestType !== "Create") {
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
const resourceProperties = event.ResourceProperties;
|
|
35
|
+
const instanceId = event.ResourceProperties.InstanceId;
|
|
36
|
+
const documentName = event.ResourceProperties.DocumentName;
|
|
37
|
+
const cloudWatchLogGroupName = event.ResourceProperties.CloudWatchLogGroupName;
|
|
38
|
+
console.log("ResourceProperties raw: %j", resourceProperties);
|
|
39
|
+
console.log("InstanceId: %s", event.ResourceProperties.InstanceId);
|
|
40
|
+
console.log("VSCodePassword: %s", event.ResourceProperties.VSCodePassword);
|
|
41
|
+
const resourcePropertiesPartial = resourceProperties;
|
|
42
|
+
console.log("ResourceProperties before: %j", resourcePropertiesPartial);
|
|
43
|
+
delete resourcePropertiesPartial.ServiceToken;
|
|
44
|
+
if (resourcePropertiesPartial.ServiceTimeout) {
|
|
45
|
+
delete resourcePropertiesPartial.ServiceTimeout;
|
|
46
|
+
}
|
|
47
|
+
delete resourcePropertiesPartial.InstanceId;
|
|
48
|
+
delete resourcePropertiesPartial.DocumentName;
|
|
49
|
+
delete resourcePropertiesPartial.CloudWatchLogGroupName;
|
|
50
|
+
if (resourcePropertiesPartial.PhysicalResourceId) {
|
|
51
|
+
delete resourcePropertiesPartial.PhysicalResourceId;
|
|
52
|
+
}
|
|
53
|
+
console.log(
|
|
54
|
+
"ResourceProperties filtered after: %j",
|
|
55
|
+
resourcePropertiesPartial
|
|
56
|
+
);
|
|
57
|
+
const parameters = {};
|
|
58
|
+
for (const [key, value] of Object.entries(resourcePropertiesPartial)) {
|
|
59
|
+
parameters[key] = [value];
|
|
60
|
+
}
|
|
61
|
+
console.log("mapped parameters: %j", parameters);
|
|
62
|
+
let attemptNo = 0;
|
|
63
|
+
let timeRemaining = context.getRemainingTimeInMillis();
|
|
64
|
+
console.log(
|
|
65
|
+
`Running SSM Document '${documentName}' on EC2 instance '${instanceId}'. Logging to '${cloudWatchLogGroupName}' with parameters: '${JSON.stringify(parameters)}'`
|
|
66
|
+
);
|
|
67
|
+
while (true) {
|
|
68
|
+
attemptNo += 1;
|
|
69
|
+
console.log(
|
|
70
|
+
`Attempt: ${attemptNo}. Time Remaining: ${timeRemaining / 1e3}s`
|
|
71
|
+
);
|
|
72
|
+
try {
|
|
73
|
+
const response = await ssm.sendCommand({
|
|
74
|
+
DocumentName: documentName,
|
|
75
|
+
InstanceIds: [instanceId],
|
|
76
|
+
CloudWatchOutputConfig: {
|
|
77
|
+
CloudWatchLogGroupName: cloudWatchLogGroupName,
|
|
78
|
+
CloudWatchOutputEnabled: true
|
|
79
|
+
},
|
|
80
|
+
Parameters: parameters
|
|
81
|
+
});
|
|
82
|
+
console.log(`response: ${JSON.stringify(response)}`);
|
|
83
|
+
const command = response.Command;
|
|
84
|
+
const commandId = command.CommandId;
|
|
85
|
+
const responseData = { CommandId: commandId };
|
|
86
|
+
switch (command.Status) {
|
|
87
|
+
case "Pending":
|
|
88
|
+
case "InProgress":
|
|
89
|
+
timeRemaining = context.getRemainingTimeInMillis();
|
|
90
|
+
if (timeRemaining > SLEEP_MS) {
|
|
91
|
+
console.log(
|
|
92
|
+
`Instance ${instanceId} not ready: 'InProgress'. Sleeping: ${SLEEP_MS / 1e3}s`
|
|
93
|
+
);
|
|
94
|
+
await new Promise((resolve) => setTimeout(resolve, SLEEP_MS));
|
|
95
|
+
break;
|
|
96
|
+
} else {
|
|
97
|
+
throw new Error(
|
|
98
|
+
`SSM Document ${documentName} on EC2 instance ${instanceId} timed out while lambda in progress`
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
case "Success":
|
|
102
|
+
console.log(`Instance ${instanceId} successfully bootstrapped`);
|
|
103
|
+
return { Data: responseData };
|
|
104
|
+
case "TimedOut":
|
|
105
|
+
throw new Error(
|
|
106
|
+
`SSM Document ${documentName} on EC2 instance ${instanceId} timed out`
|
|
107
|
+
);
|
|
108
|
+
case "Cancelled":
|
|
109
|
+
throw new Error(
|
|
110
|
+
`SSM Document ${documentName} on EC2 instance ${instanceId} cancelled`
|
|
111
|
+
);
|
|
112
|
+
case "Failed":
|
|
113
|
+
throw new Error(
|
|
114
|
+
`SSM Document ${documentName} on EC2 instance ${instanceId} failed`
|
|
115
|
+
);
|
|
116
|
+
default:
|
|
117
|
+
throw new Error(
|
|
118
|
+
`SSM Document ${documentName} on EC2 instance ${instanceId} status ${command.Status}`
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
return { Data: responseData };
|
|
122
|
+
} catch (error) {
|
|
123
|
+
console.log("Error occurred:", error);
|
|
124
|
+
const isUnauthorized = error.name === "UnauthorizedException" || error.name === "AccessDeniedException" || error.message && error.message.includes("not authorized");
|
|
125
|
+
const isThrottled = error.name === "ThrottlingException" || error.name === "TooManyRequestsException";
|
|
126
|
+
const isRetryable = isUnauthorized || isThrottled;
|
|
127
|
+
timeRemaining = context.getRemainingTimeInMillis();
|
|
128
|
+
if (isRetryable && timeRemaining > SLEEP_MS) {
|
|
129
|
+
console.log(
|
|
130
|
+
`Retryable error encountered (${error.name}). Attempt ${attemptNo}. Sleeping: ${SLEEP_MS / 1e3}s before retry`
|
|
131
|
+
);
|
|
132
|
+
await new Promise((resolve) => setTimeout(resolve, SLEEP_MS));
|
|
133
|
+
} else {
|
|
134
|
+
console.log("Non-retryable error or timeout. Failing...");
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
141
|
+
0 && (module.exports = {
|
|
142
|
+
handler
|
|
143
|
+
});
|