blogwright-core 0.1.0
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/LICENSE +24 -0
- package/README.md +7 -0
- package/dist/adapters/memory-fs.d.ts +9 -0
- package/dist/adapters/memory-fs.js +54 -0
- package/dist/adapters/memory-fs.js.map +1 -0
- package/dist/adapters/node-fs.d.ts +4 -0
- package/dist/adapters/node-fs.js +65 -0
- package/dist/adapters/node-fs.js.map +1 -0
- package/dist/adapters/node-terminal.d.ts +29 -0
- package/dist/adapters/node-terminal.js +58 -0
- package/dist/adapters/node-terminal.js.map +1 -0
- package/dist/adapters/script-terminal.d.ts +22 -0
- package/dist/adapters/script-terminal.js +38 -0
- package/dist/adapters/script-terminal.js.map +1 -0
- package/dist/aws/acm.d.ts +20 -0
- package/dist/aws/acm.js +55 -0
- package/dist/aws/acm.js.map +1 -0
- package/dist/aws/cloudfront.d.ts +72 -0
- package/dist/aws/cloudfront.js +341 -0
- package/dist/aws/cloudfront.js.map +1 -0
- package/dist/aws/credentials.d.ts +19 -0
- package/dist/aws/credentials.js +36 -0
- package/dist/aws/credentials.js.map +1 -0
- package/dist/aws/endpoint.d.ts +29 -0
- package/dist/aws/endpoint.js +58 -0
- package/dist/aws/endpoint.js.map +1 -0
- package/dist/aws/errors.d.ts +20 -0
- package/dist/aws/errors.js +35 -0
- package/dist/aws/errors.js.map +1 -0
- package/dist/aws/form.d.ts +2 -0
- package/dist/aws/form.js +11 -0
- package/dist/aws/form.js.map +1 -0
- package/dist/aws/iam.d.ts +18 -0
- package/dist/aws/iam.js +122 -0
- package/dist/aws/iam.js.map +1 -0
- package/dist/aws/logs.d.ts +32 -0
- package/dist/aws/logs.js +148 -0
- package/dist/aws/logs.js.map +1 -0
- package/dist/aws/microvms.d.ts +85 -0
- package/dist/aws/microvms.js +182 -0
- package/dist/aws/microvms.js.map +1 -0
- package/dist/aws/route53.d.ts +19 -0
- package/dist/aws/route53.js +71 -0
- package/dist/aws/route53.js.map +1 -0
- package/dist/aws/s3.d.ts +31 -0
- package/dist/aws/s3.js +178 -0
- package/dist/aws/s3.js.map +1 -0
- package/dist/aws/secretsmanager.d.ts +21 -0
- package/dist/aws/secretsmanager.js +84 -0
- package/dist/aws/secretsmanager.js.map +1 -0
- package/dist/aws/signer.d.ts +44 -0
- package/dist/aws/signer.js +144 -0
- package/dist/aws/signer.js.map +1 -0
- package/dist/aws/sts.d.ts +7 -0
- package/dist/aws/sts.js +22 -0
- package/dist/aws/sts.js.map +1 -0
- package/dist/aws/xml.d.ts +18 -0
- package/dist/aws/xml.js +65 -0
- package/dist/aws/xml.js.map +1 -0
- package/dist/clients.d.ts +33 -0
- package/dist/clients.js +38 -0
- package/dist/clients.js.map +1 -0
- package/dist/colors.d.ts +11 -0
- package/dist/colors.js +24 -0
- package/dist/colors.js.map +1 -0
- package/dist/config.d.ts +136 -0
- package/dist/config.js +236 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/ports.d.ts +53 -0
- package/dist/ports.js +15 -0
- package/dist/ports.js.map +1 -0
- package/dist/repo-root.d.ts +8 -0
- package/dist/repo-root.js +20 -0
- package/dist/repo-root.js.map +1 -0
- package/dist/state.d.ts +23 -0
- package/dist/state.js +44 -0
- package/dist/state.js.map +1 -0
- package/dist/util.d.ts +15 -0
- package/dist/util.js +38 -0
- package/dist/util.js.map +1 -0
- package/package.json +42 -0
package/dist/aws/iam.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { AwsError } from './errors.js';
|
|
2
|
+
import { formEncode } from './form.js';
|
|
3
|
+
import { allTags, textTag } from './xml.js';
|
|
4
|
+
const VERSION = '2010-05-08';
|
|
5
|
+
/** IAM client (query protocol) — roles with inline policies. */
|
|
6
|
+
export class IamClient {
|
|
7
|
+
client;
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
async call(params) {
|
|
12
|
+
const res = await this.client.send({
|
|
13
|
+
service: 'iam',
|
|
14
|
+
method: 'POST',
|
|
15
|
+
path: '/',
|
|
16
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded; charset=utf-8' },
|
|
17
|
+
body: formEncode({ ...params, Version: VERSION }),
|
|
18
|
+
});
|
|
19
|
+
return res.text();
|
|
20
|
+
}
|
|
21
|
+
/** Return the role ARN, or undefined if the role does not exist. */
|
|
22
|
+
async getRoleArn(roleName) {
|
|
23
|
+
try {
|
|
24
|
+
const xml = await this.call({ Action: 'GetRole', RoleName: roleName });
|
|
25
|
+
return textTag(xml, 'Arn');
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (err instanceof AwsError && err.isNotFound)
|
|
29
|
+
return undefined;
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Create a role (idempotent) and return its ARN. */
|
|
34
|
+
async ensureRole(roleName, assumeRolePolicy, description) {
|
|
35
|
+
try {
|
|
36
|
+
const xml = await this.call({
|
|
37
|
+
Action: 'CreateRole',
|
|
38
|
+
RoleName: roleName,
|
|
39
|
+
AssumeRolePolicyDocument: JSON.stringify(assumeRolePolicy),
|
|
40
|
+
Description: description,
|
|
41
|
+
});
|
|
42
|
+
const arn = textTag(xml, 'Arn');
|
|
43
|
+
if (!arn)
|
|
44
|
+
throw new Error('CreateRole returned no Arn');
|
|
45
|
+
return arn;
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
if (err instanceof AwsError && err.isAlreadyExists) {
|
|
49
|
+
const arn = await this.getRoleArn(roleName);
|
|
50
|
+
if (arn) {
|
|
51
|
+
// CreateRole's trust document is ignored for an existing role, so a
|
|
52
|
+
// changed trust (e.g. a renamed githubRepo in the OIDC sub claim)
|
|
53
|
+
// would silently keep granting the old principal. Reconcile it.
|
|
54
|
+
await this.call({
|
|
55
|
+
Action: 'UpdateAssumeRolePolicy',
|
|
56
|
+
RoleName: roleName,
|
|
57
|
+
PolicyDocument: JSON.stringify(assumeRolePolicy),
|
|
58
|
+
});
|
|
59
|
+
return arn;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async putRolePolicy(roleName, policyName, policy) {
|
|
66
|
+
await this.call({
|
|
67
|
+
Action: 'PutRolePolicy',
|
|
68
|
+
RoleName: roleName,
|
|
69
|
+
PolicyName: policyName,
|
|
70
|
+
PolicyDocument: JSON.stringify(policy),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async listRolePolicies(roleName) {
|
|
74
|
+
const names = [];
|
|
75
|
+
let marker;
|
|
76
|
+
do {
|
|
77
|
+
const xml = await this.call({
|
|
78
|
+
Action: 'ListRolePolicies',
|
|
79
|
+
RoleName: roleName,
|
|
80
|
+
Marker: marker,
|
|
81
|
+
});
|
|
82
|
+
for (const m of allTags(xml, 'member'))
|
|
83
|
+
names.push(m.trim());
|
|
84
|
+
marker = textTag(xml, 'IsTruncated') === 'true' ? textTag(xml, 'Marker') : undefined;
|
|
85
|
+
} while (marker);
|
|
86
|
+
return names;
|
|
87
|
+
}
|
|
88
|
+
async deleteRolePolicy(roleName, policyName) {
|
|
89
|
+
await this.call({ Action: 'DeleteRolePolicy', RoleName: roleName, PolicyName: policyName });
|
|
90
|
+
}
|
|
91
|
+
/** Create an OIDC identity provider (idempotent). Account-global; never deleted here. */
|
|
92
|
+
async ensureOidcProvider(url, clientId, thumbprint) {
|
|
93
|
+
try {
|
|
94
|
+
await this.call({
|
|
95
|
+
Action: 'CreateOpenIDConnectProvider',
|
|
96
|
+
Url: url,
|
|
97
|
+
'ClientIDList.member.1': clientId,
|
|
98
|
+
'ThumbprintList.member.1': thumbprint,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
if (err instanceof AwsError && err.isAlreadyExists)
|
|
103
|
+
return;
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Delete a role, first removing any inline policies. Idempotent. */
|
|
108
|
+
async deleteRole(roleName) {
|
|
109
|
+
try {
|
|
110
|
+
for (const policy of await this.listRolePolicies(roleName)) {
|
|
111
|
+
await this.deleteRolePolicy(roleName, policy);
|
|
112
|
+
}
|
|
113
|
+
await this.call({ Action: 'DeleteRole', RoleName: roleName });
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
if (err instanceof AwsError && err.isNotFound)
|
|
117
|
+
return;
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=iam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam.js","sourceRoot":"","sources":["../../src/aws/iam.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SigningClient } from './signer.js';
|
|
2
|
+
export interface LogEvent {
|
|
3
|
+
eventId: string;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
message: string;
|
|
6
|
+
}
|
|
7
|
+
export interface FilterEventsOptions {
|
|
8
|
+
startTime?: number | undefined;
|
|
9
|
+
endTime?: number | undefined;
|
|
10
|
+
}
|
|
11
|
+
/** CloudWatch Logs client (AWS JSON 1.1). */
|
|
12
|
+
export declare class LogsClient {
|
|
13
|
+
private readonly client;
|
|
14
|
+
constructor(client: SigningClient);
|
|
15
|
+
private call;
|
|
16
|
+
ensureLogGroup(name: string): Promise<void>;
|
|
17
|
+
putRetentionPolicy(name: string, retentionInDays: number): Promise<void>;
|
|
18
|
+
logGroupExists(name: string): Promise<boolean>;
|
|
19
|
+
deleteLogGroup(name: string): Promise<void>;
|
|
20
|
+
/** Fetch events across a log group within an optional time window. */
|
|
21
|
+
filterEvents(logGroupName: string, opts?: FilterEventsOptions): Promise<LogEvent[]>;
|
|
22
|
+
putDeliverySource(name: string, resourceArn: string, logType: string): Promise<string>;
|
|
23
|
+
putDeliveryDestination(name: string, logGroupArn: string): Promise<string>;
|
|
24
|
+
createDelivery(deliverySourceName: string, deliveryDestinationArn: string): Promise<void>;
|
|
25
|
+
/** The delivery id linking a given source (needed to delete it), or undefined if none. */
|
|
26
|
+
findDeliveryIdBySource(deliverySourceName: string): Promise<string | undefined>;
|
|
27
|
+
/** Ids of every delivery attached to a delivery source. */
|
|
28
|
+
deliveriesForSource(sourceName: string): Promise<string[]>;
|
|
29
|
+
deleteDelivery(id: string): Promise<void>;
|
|
30
|
+
deleteDeliverySource(name: string): Promise<void>;
|
|
31
|
+
deleteDeliveryDestination(name: string): Promise<void>;
|
|
32
|
+
}
|
package/dist/aws/logs.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { AwsError } from './errors.js';
|
|
2
|
+
const TARGET = 'Logs_20140328';
|
|
3
|
+
/** CloudWatch Logs client (AWS JSON 1.1). */
|
|
4
|
+
export class LogsClient {
|
|
5
|
+
client;
|
|
6
|
+
constructor(client) {
|
|
7
|
+
this.client = client;
|
|
8
|
+
}
|
|
9
|
+
async call(op, payload) {
|
|
10
|
+
const res = await this.client.send({
|
|
11
|
+
service: 'logs',
|
|
12
|
+
method: 'POST',
|
|
13
|
+
path: '/',
|
|
14
|
+
headers: {
|
|
15
|
+
'content-type': 'application/x-amz-json-1.1',
|
|
16
|
+
'x-amz-target': `${TARGET}.${op}`,
|
|
17
|
+
},
|
|
18
|
+
body: JSON.stringify(payload),
|
|
19
|
+
});
|
|
20
|
+
const text = res.text();
|
|
21
|
+
return (text ? JSON.parse(text) : {});
|
|
22
|
+
}
|
|
23
|
+
async ensureLogGroup(name) {
|
|
24
|
+
try {
|
|
25
|
+
await this.call('CreateLogGroup', { logGroupName: name });
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (err instanceof AwsError && err.isAlreadyExists)
|
|
29
|
+
return;
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async putRetentionPolicy(name, retentionInDays) {
|
|
34
|
+
await this.call('PutRetentionPolicy', { logGroupName: name, retentionInDays });
|
|
35
|
+
}
|
|
36
|
+
async logGroupExists(name) {
|
|
37
|
+
const out = await this.call('DescribeLogGroups', { logGroupNamePrefix: name });
|
|
38
|
+
return (out.logGroups ?? []).some((g) => g.logGroupName === name);
|
|
39
|
+
}
|
|
40
|
+
async deleteLogGroup(name) {
|
|
41
|
+
try {
|
|
42
|
+
await this.call('DeleteLogGroup', { logGroupName: name });
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
if (err instanceof AwsError && err.isNotFound)
|
|
46
|
+
return;
|
|
47
|
+
throw err;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Fetch events across a log group within an optional time window. */
|
|
51
|
+
async filterEvents(logGroupName, opts = {}) {
|
|
52
|
+
const events = [];
|
|
53
|
+
let nextToken;
|
|
54
|
+
do {
|
|
55
|
+
const out = await this.call('FilterLogEvents', {
|
|
56
|
+
logGroupName,
|
|
57
|
+
...(opts.startTime !== undefined ? { startTime: opts.startTime } : {}),
|
|
58
|
+
...(opts.endTime !== undefined ? { endTime: opts.endTime } : {}),
|
|
59
|
+
...(nextToken ? { nextToken } : {}),
|
|
60
|
+
});
|
|
61
|
+
for (const e of out.events ?? []) {
|
|
62
|
+
events.push({ eventId: e.eventId, timestamp: e.timestamp, message: e.message });
|
|
63
|
+
}
|
|
64
|
+
nextToken = out.nextToken;
|
|
65
|
+
} while (nextToken);
|
|
66
|
+
return events;
|
|
67
|
+
}
|
|
68
|
+
// --- CloudWatch vended log delivery (used to send CloudFront access logs here) ---
|
|
69
|
+
async putDeliverySource(name, resourceArn, logType) {
|
|
70
|
+
const out = await this.call('PutDeliverySource', {
|
|
71
|
+
name,
|
|
72
|
+
resourceArn,
|
|
73
|
+
logType,
|
|
74
|
+
});
|
|
75
|
+
return out.deliverySource?.arn ?? '';
|
|
76
|
+
}
|
|
77
|
+
async putDeliveryDestination(name, logGroupArn) {
|
|
78
|
+
const out = await this.call('PutDeliveryDestination', { name, deliveryDestinationConfiguration: { destinationResourceArn: logGroupArn } });
|
|
79
|
+
return out.deliveryDestination?.arn ?? '';
|
|
80
|
+
}
|
|
81
|
+
async createDelivery(deliverySourceName, deliveryDestinationArn) {
|
|
82
|
+
try {
|
|
83
|
+
await this.call('CreateDelivery', { deliverySourceName, deliveryDestinationArn });
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
if (err instanceof AwsError && err.isAlreadyExists)
|
|
87
|
+
return;
|
|
88
|
+
throw err;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** The delivery id linking a given source (needed to delete it), or undefined if none. */
|
|
92
|
+
async findDeliveryIdBySource(deliverySourceName) {
|
|
93
|
+
let nextToken;
|
|
94
|
+
do {
|
|
95
|
+
const out = await this.call('DescribeDeliveries', nextToken ? { nextToken } : {});
|
|
96
|
+
const match = (out.deliveries ?? []).find((d) => d.deliverySourceName === deliverySourceName);
|
|
97
|
+
if (match?.id)
|
|
98
|
+
return match.id;
|
|
99
|
+
nextToken = out.nextToken;
|
|
100
|
+
} while (nextToken);
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
/** Ids of every delivery attached to a delivery source. */
|
|
104
|
+
async deliveriesForSource(sourceName) {
|
|
105
|
+
const ids = [];
|
|
106
|
+
let nextToken;
|
|
107
|
+
do {
|
|
108
|
+
const out = await this.call('DescribeDeliveries', nextToken ? { nextToken } : {});
|
|
109
|
+
for (const d of out.deliveries ?? []) {
|
|
110
|
+
if (d.deliverySourceName === sourceName)
|
|
111
|
+
ids.push(d.id);
|
|
112
|
+
}
|
|
113
|
+
nextToken = out.nextToken;
|
|
114
|
+
} while (nextToken);
|
|
115
|
+
return ids;
|
|
116
|
+
}
|
|
117
|
+
async deleteDelivery(id) {
|
|
118
|
+
try {
|
|
119
|
+
await this.call('DeleteDelivery', { id });
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
if (err instanceof AwsError && err.isNotFound)
|
|
123
|
+
return;
|
|
124
|
+
throw err;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async deleteDeliverySource(name) {
|
|
128
|
+
try {
|
|
129
|
+
await this.call('DeleteDeliverySource', { name });
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
if (err instanceof AwsError && err.isNotFound)
|
|
133
|
+
return;
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async deleteDeliveryDestination(name) {
|
|
138
|
+
try {
|
|
139
|
+
await this.call('DeleteDeliveryDestination', { name });
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
if (err instanceof AwsError && err.isNotFound)
|
|
143
|
+
return;
|
|
144
|
+
throw err;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/aws/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { SigningClient } from './signer.js';
|
|
2
|
+
export interface CreateImageInput {
|
|
3
|
+
name: string;
|
|
4
|
+
codeArtifactUri: string;
|
|
5
|
+
baseImageArn: string;
|
|
6
|
+
buildRoleArn: string;
|
|
7
|
+
/** Baseline memory in GB (converted to minimumMemoryInMiB). */
|
|
8
|
+
memoryGb?: number | undefined;
|
|
9
|
+
logGroupName?: string | undefined;
|
|
10
|
+
description?: string | undefined;
|
|
11
|
+
clientToken?: string | undefined;
|
|
12
|
+
/** Image-level environment variables baked into the snapshot (max 50). */
|
|
13
|
+
environmentVariables?: Record<string, string> | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Enable lifecycle hooks (listener on the given port). The /run hook is what makes
|
|
16
|
+
* the execution role's credentials available at runtime; the service also requires
|
|
17
|
+
* the /ready hook whenever any hook is enabled.
|
|
18
|
+
*/
|
|
19
|
+
hooks?: {
|
|
20
|
+
port: number;
|
|
21
|
+
} | undefined;
|
|
22
|
+
}
|
|
23
|
+
export interface MicrovmImage {
|
|
24
|
+
imageArn: string;
|
|
25
|
+
imageName: string;
|
|
26
|
+
state: string;
|
|
27
|
+
imageVersion: string | undefined;
|
|
28
|
+
}
|
|
29
|
+
export interface RunMicrovmInput {
|
|
30
|
+
imageIdentifier: string;
|
|
31
|
+
executionRoleArn: string;
|
|
32
|
+
/** Idempotency token so a retried launch does not start a second MicroVM. */
|
|
33
|
+
clientToken?: string | undefined;
|
|
34
|
+
/** Only valid when the image has the run hook enabled; omit for hookless images. */
|
|
35
|
+
runHookPayload?: string | undefined;
|
|
36
|
+
maximumDurationInSeconds: number;
|
|
37
|
+
idlePolicy: {
|
|
38
|
+
autoResumeEnabled: boolean;
|
|
39
|
+
maxIdleDurationSeconds: number;
|
|
40
|
+
suspendedDurationSeconds: number;
|
|
41
|
+
};
|
|
42
|
+
ingressNetworkConnectors: string[];
|
|
43
|
+
egressNetworkConnectors: string[];
|
|
44
|
+
logGroupName?: string | undefined;
|
|
45
|
+
}
|
|
46
|
+
export interface Microvm {
|
|
47
|
+
microvmId: string;
|
|
48
|
+
state: string;
|
|
49
|
+
endpoint: string;
|
|
50
|
+
/** ARN of the image this MicroVM was launched from (scopes cleanup to one stack). */
|
|
51
|
+
imageArn?: string | undefined;
|
|
52
|
+
imageVersion?: string | undefined;
|
|
53
|
+
}
|
|
54
|
+
/** Lambda-managed network connector ARNs (region-templated). */
|
|
55
|
+
export declare function networkConnectors(region: string): {
|
|
56
|
+
allIngress: string;
|
|
57
|
+
internetEgress: string;
|
|
58
|
+
};
|
|
59
|
+
export declare class MicrovmsClient {
|
|
60
|
+
private readonly client;
|
|
61
|
+
constructor(client: SigningClient);
|
|
62
|
+
private call;
|
|
63
|
+
private imageBody;
|
|
64
|
+
createImage(input: CreateImageInput): Promise<MicrovmImage>;
|
|
65
|
+
updateImage(id: string, input: CreateImageInput): Promise<MicrovmImage>;
|
|
66
|
+
getImage(id: string): Promise<MicrovmImage | undefined>;
|
|
67
|
+
deleteImage(id: string): Promise<void>;
|
|
68
|
+
runMicrovm(input: RunMicrovmInput): Promise<Microvm>;
|
|
69
|
+
getMicrovm(id: string): Promise<Microvm | undefined>;
|
|
70
|
+
/**
|
|
71
|
+
* MicroVMs in the account (paginated), for quota accounting and cleanup. Pass
|
|
72
|
+
* `imageIdentifier` to scope the list to one builder image server-side.
|
|
73
|
+
*
|
|
74
|
+
* `maxResults` is always sent: the ListMicrovms operation defines it as a defaulted
|
|
75
|
+
* query parameter, and the service normalizes a missing default into the request before
|
|
76
|
+
* validating the SigV4 signature — so omitting it produces an intermittent
|
|
77
|
+
* SignatureDoesNotMatch that GetMicrovm/DeleteMicrovm (no query params) never hit.
|
|
78
|
+
*/
|
|
79
|
+
listMicrovms(opts?: {
|
|
80
|
+
imageIdentifier?: string | undefined;
|
|
81
|
+
maxResults?: number | undefined;
|
|
82
|
+
}): Promise<Microvm[]>;
|
|
83
|
+
terminateMicrovm(id: string): Promise<void>;
|
|
84
|
+
createAuthToken(id: string, expirationInMinutes: number): Promise<string>;
|
|
85
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { AwsError } from './errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Lambda MicroVMs control-plane client (`lambda-microvms` API, 2025-09-09).
|
|
4
|
+
*
|
|
5
|
+
* The API is served off the standard Lambda endpoint (`lambda.<region>.amazonaws.com`,
|
|
6
|
+
* SigV4 signing name `lambda`) and is REST-JSON, with operations distinguished by the
|
|
7
|
+
* `/2025-09-09/` path prefix. Shapes below follow the published API reference. The floci
|
|
8
|
+
* emulator does not implement this service, so it is covered by transport mocks in tests.
|
|
9
|
+
*/
|
|
10
|
+
const API = '/2025-09-09';
|
|
11
|
+
const PATHS = {
|
|
12
|
+
images: `${API}/microvm-images`,
|
|
13
|
+
image: (id) => `${API}/microvm-images/${encodeURIComponent(id)}`,
|
|
14
|
+
microvms: `${API}/microvms`,
|
|
15
|
+
microvm: (id) => `${API}/microvms/${encodeURIComponent(id)}`,
|
|
16
|
+
authToken: (id) => `${API}/microvms/${encodeURIComponent(id)}/auth-token`,
|
|
17
|
+
};
|
|
18
|
+
function normalizeMicrovm(res) {
|
|
19
|
+
return {
|
|
20
|
+
microvmId: res.microvmId ?? res.id ?? '',
|
|
21
|
+
state: res.state ?? '',
|
|
22
|
+
endpoint: res.endpoint ?? '',
|
|
23
|
+
...(res.imageArn ? { imageArn: res.imageArn } : {}),
|
|
24
|
+
...(res.imageVersion ? { imageVersion: res.imageVersion } : {}),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Lambda-managed network connector ARNs (region-templated). */
|
|
28
|
+
export function networkConnectors(region) {
|
|
29
|
+
return {
|
|
30
|
+
allIngress: `arn:aws:lambda:${region}:aws:network-connector:aws-network-connector:ALL_INGRESS`,
|
|
31
|
+
internetEgress: `arn:aws:lambda:${region}:aws:network-connector:aws-network-connector:INTERNET_EGRESS`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function normalizeImage(res) {
|
|
35
|
+
return {
|
|
36
|
+
imageArn: res.imageArn ?? '',
|
|
37
|
+
imageName: res.name ?? '',
|
|
38
|
+
state: res.state ?? '',
|
|
39
|
+
imageVersion: res.imageVersion ?? res.latestActiveImageVersion,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export class MicrovmsClient {
|
|
43
|
+
client;
|
|
44
|
+
constructor(client) {
|
|
45
|
+
this.client = client;
|
|
46
|
+
}
|
|
47
|
+
async call(method, path, payload, query) {
|
|
48
|
+
const res = await this.client.send({
|
|
49
|
+
service: 'microvms',
|
|
50
|
+
method,
|
|
51
|
+
path,
|
|
52
|
+
...(query ? { query } : {}),
|
|
53
|
+
headers: { 'content-type': 'application/json' },
|
|
54
|
+
...(payload !== undefined ? { body: JSON.stringify(payload) } : {}),
|
|
55
|
+
});
|
|
56
|
+
const text = res.text();
|
|
57
|
+
return (text ? JSON.parse(text) : {});
|
|
58
|
+
}
|
|
59
|
+
imageBody(input) {
|
|
60
|
+
return {
|
|
61
|
+
codeArtifact: { uri: input.codeArtifactUri },
|
|
62
|
+
baseImageArn: input.baseImageArn,
|
|
63
|
+
buildRoleArn: input.buildRoleArn,
|
|
64
|
+
...(input.memoryGb !== undefined
|
|
65
|
+
? { resources: [{ minimumMemoryInMiB: Math.round(input.memoryGb * 1024) }] }
|
|
66
|
+
: {}),
|
|
67
|
+
...(input.logGroupName ? { logging: { cloudWatch: { logGroup: input.logGroupName } } } : {}),
|
|
68
|
+
...(input.environmentVariables ? { environmentVariables: input.environmentVariables } : {}),
|
|
69
|
+
...(input.hooks
|
|
70
|
+
? {
|
|
71
|
+
hooks: {
|
|
72
|
+
port: input.hooks.port,
|
|
73
|
+
microvmHooks: { run: 'ENABLED', runTimeoutInSeconds: 60 },
|
|
74
|
+
microvmImageHooks: { ready: 'ENABLED', readyTimeoutInSeconds: 120 },
|
|
75
|
+
},
|
|
76
|
+
}
|
|
77
|
+
: {}),
|
|
78
|
+
...(input.description !== undefined ? { description: input.description } : {}),
|
|
79
|
+
...(input.clientToken !== undefined ? { clientToken: input.clientToken } : {}),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async createImage(input) {
|
|
83
|
+
const body = { name: input.name, ...this.imageBody(input) };
|
|
84
|
+
return normalizeImage(await this.call('POST', PATHS.images, body));
|
|
85
|
+
}
|
|
86
|
+
async updateImage(id, input) {
|
|
87
|
+
// A PUT is idempotent on the image itself, so no clientToken is needed — and reusing one
|
|
88
|
+
// across separate update attempts triggers "clientToken used with different parameters".
|
|
89
|
+
const { clientToken, ...body } = this.imageBody(input);
|
|
90
|
+
void clientToken;
|
|
91
|
+
return normalizeImage(await this.call('PUT', PATHS.image(id), body));
|
|
92
|
+
}
|
|
93
|
+
async getImage(id) {
|
|
94
|
+
try {
|
|
95
|
+
return normalizeImage(await this.call('GET', PATHS.image(id)));
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
if (err instanceof AwsError && err.isNotFound)
|
|
99
|
+
return undefined;
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async deleteImage(id) {
|
|
104
|
+
try {
|
|
105
|
+
await this.call('DELETE', PATHS.image(id));
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
if (err instanceof AwsError && err.isNotFound)
|
|
109
|
+
return;
|
|
110
|
+
throw err;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async runMicrovm(input) {
|
|
114
|
+
const body = {
|
|
115
|
+
imageIdentifier: input.imageIdentifier,
|
|
116
|
+
executionRoleArn: input.executionRoleArn,
|
|
117
|
+
idlePolicy: input.idlePolicy,
|
|
118
|
+
ingressNetworkConnectors: input.ingressNetworkConnectors,
|
|
119
|
+
egressNetworkConnectors: input.egressNetworkConnectors,
|
|
120
|
+
maximumDurationInSeconds: input.maximumDurationInSeconds,
|
|
121
|
+
...(input.clientToken ? { clientToken: input.clientToken } : {}),
|
|
122
|
+
...(input.runHookPayload ? { runHookPayload: input.runHookPayload } : {}),
|
|
123
|
+
...(input.logGroupName ? { logging: { cloudWatch: { logGroup: input.logGroupName } } } : {}),
|
|
124
|
+
};
|
|
125
|
+
return this.call('POST', PATHS.microvms, body);
|
|
126
|
+
}
|
|
127
|
+
async getMicrovm(id) {
|
|
128
|
+
try {
|
|
129
|
+
return await this.call('GET', PATHS.microvm(id));
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
if (err instanceof AwsError && err.isNotFound)
|
|
133
|
+
return undefined;
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* MicroVMs in the account (paginated), for quota accounting and cleanup. Pass
|
|
139
|
+
* `imageIdentifier` to scope the list to one builder image server-side.
|
|
140
|
+
*
|
|
141
|
+
* `maxResults` is always sent: the ListMicrovms operation defines it as a defaulted
|
|
142
|
+
* query parameter, and the service normalizes a missing default into the request before
|
|
143
|
+
* validating the SigV4 signature — so omitting it produces an intermittent
|
|
144
|
+
* SignatureDoesNotMatch that GetMicrovm/DeleteMicrovm (no query params) never hit.
|
|
145
|
+
*/
|
|
146
|
+
async listMicrovms(opts = {}) {
|
|
147
|
+
const all = [];
|
|
148
|
+
let token;
|
|
149
|
+
do {
|
|
150
|
+
const query = {
|
|
151
|
+
maxResults: opts.maxResults ?? 50, // service cap; larger values are rejected (400)
|
|
152
|
+
...(opts.imageIdentifier ? { imageIdentifier: opts.imageIdentifier } : {}),
|
|
153
|
+
...(token ? { nextToken: token } : {}),
|
|
154
|
+
};
|
|
155
|
+
// The ListMicrovms response nests the collection under `items` (with `microvms` kept
|
|
156
|
+
// as a defensive fallback), each item carrying microvmId/state/imageArn.
|
|
157
|
+
const page = await this.call('GET', PATHS.microvms, undefined, query);
|
|
158
|
+
for (const item of page.items ?? page.microvms ?? [])
|
|
159
|
+
all.push(normalizeMicrovm(item));
|
|
160
|
+
token = page.nextToken;
|
|
161
|
+
} while (token);
|
|
162
|
+
return all;
|
|
163
|
+
}
|
|
164
|
+
async terminateMicrovm(id) {
|
|
165
|
+
try {
|
|
166
|
+
await this.call('DELETE', PATHS.microvm(id));
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
if (err instanceof AwsError && err.isNotFound)
|
|
170
|
+
return;
|
|
171
|
+
throw err;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async createAuthToken(id, expirationInMinutes) {
|
|
175
|
+
const out = await this.call('POST', PATHS.authToken(id), {
|
|
176
|
+
allowedPorts: [{ allPorts: {} }],
|
|
177
|
+
expirationInMinutes,
|
|
178
|
+
});
|
|
179
|
+
return out.authToken?.['X-aws-proxy-auth'] ?? '';
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=microvms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microvms.js","sourceRoot":"","sources":["../../src/aws/microvms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SigningClient } from './signer.js';
|
|
2
|
+
export interface DnsRecord {
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
value: string;
|
|
6
|
+
ttl?: number;
|
|
7
|
+
}
|
|
8
|
+
/** Route53 client (REST-XML). Global service, signed in us-east-1. */
|
|
9
|
+
export declare class Route53Client {
|
|
10
|
+
private readonly client;
|
|
11
|
+
constructor(client: SigningClient);
|
|
12
|
+
/** Find the hosted zone id for a domain (e.g. "preview.example.com"). */
|
|
13
|
+
hostedZoneId(dnsName: string): Promise<string | undefined>;
|
|
14
|
+
private change;
|
|
15
|
+
/** Create or update a record (idempotent). */
|
|
16
|
+
upsertRecord(zoneId: string, record: DnsRecord): Promise<void>;
|
|
17
|
+
/** Delete a record; ignores an already-absent record. */
|
|
18
|
+
deleteRecord(zoneId: string, record: DnsRecord): Promise<void>;
|
|
19
|
+
}
|