@peerbit/server 3.0.0 → 4.0.1
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/lib/esm/aws.browser.d.ts +0 -0
- package/lib/esm/aws.browser.js +3 -0
- package/lib/esm/aws.browser.js.map +1 -0
- package/lib/esm/aws.d.ts +19 -0
- package/lib/esm/aws.js +185 -1
- package/lib/esm/aws.js.map +1 -1
- package/lib/esm/cli.js +590 -324
- package/lib/esm/cli.js.map +1 -1
- package/lib/esm/client.d.ts +11 -5
- package/lib/esm/client.js +64 -11
- package/lib/esm/client.js.map +1 -1
- package/lib/esm/docker.browser.d.ts +0 -0
- package/lib/esm/docker.browser.js +3 -0
- package/lib/esm/docker.browser.js.map +1 -0
- package/lib/esm/domain.js +1 -1
- package/lib/esm/domain.js.map +1 -1
- package/lib/esm/peerbit.d.ts +1 -1
- package/lib/esm/remotes.d.ts +15 -2
- package/lib/esm/remotes.js +8 -8
- package/lib/esm/remotes.js.map +1 -1
- package/lib/esm/routes.d.ts +3 -2
- package/lib/esm/routes.js +5 -4
- package/lib/esm/routes.js.map +1 -1
- package/lib/esm/server.d.ts +3 -1
- package/lib/esm/server.js +32 -19
- package/lib/esm/server.js.map +1 -1
- package/lib/esm/trust.d.ts +1 -1
- package/lib/esm/trust.js.map +1 -1
- package/lib/ui/assets/aws.browser-4ed993c7.js +1 -0
- package/lib/ui/assets/index-5ed0229d.js +77 -0
- package/lib/ui/index.html +1 -1
- package/package.json +13 -7
- package/src/aws.browser.ts +1 -0
- package/src/aws.ts +250 -1
- package/src/cli.ts +677 -354
- package/src/client.ts +76 -11
- package/src/docker.browser.ts +1 -0
- package/src/domain.ts +1 -1
- package/src/peerbit.ts +1 -1
- package/src/remotes.ts +24 -10
- package/src/routes.ts +5 -4
- package/src/server.ts +43 -23
- package/src/trust.ts +1 -1
- package/lib/ui/assets/index-cac7195d.js +0 -77
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws.browser.js","sourceRoot":"","sources":["../../src/aws.browser.ts"],"names":[],"mappings":";AAAA,cAAc"}
|
package/lib/esm/aws.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type PeerId } from "@libp2p/interface/peer-id";
|
|
1
2
|
export declare const createRecord: (options: {
|
|
2
3
|
domain: string;
|
|
3
4
|
region?: string;
|
|
@@ -7,3 +8,21 @@ export declare const createRecord: (options: {
|
|
|
7
8
|
secretAccessKey: string;
|
|
8
9
|
};
|
|
9
10
|
}) => Promise<void>;
|
|
11
|
+
export declare const AWS_LINUX_ARM_AMIs: Record<string, string>;
|
|
12
|
+
export declare const launchNodes: (properties: {
|
|
13
|
+
region?: string;
|
|
14
|
+
email: string;
|
|
15
|
+
count?: number;
|
|
16
|
+
size?: "micro" | "small" | "medium" | "large" | "xlarge" | "2xlarge";
|
|
17
|
+
namePrefix?: string;
|
|
18
|
+
grantAccess?: PeerId[];
|
|
19
|
+
}) => Promise<{
|
|
20
|
+
instanceId: string;
|
|
21
|
+
publicIp: string;
|
|
22
|
+
name: string;
|
|
23
|
+
region: string;
|
|
24
|
+
}[]>;
|
|
25
|
+
export declare const terminateNode: (properties: {
|
|
26
|
+
instanceId: string;
|
|
27
|
+
region?: string;
|
|
28
|
+
}) => Promise<void>;
|
package/lib/esm/aws.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { delay } from "@peerbit/time";
|
|
2
2
|
export const createRecord = async (options) => {
|
|
3
3
|
const { Route53Client, ChangeResourceRecordSetsCommand } = await import("@aws-sdk/client-route-53");
|
|
4
4
|
const { isIPv4, isIPv6 } = await import("net");
|
|
5
|
+
const { getMyIp } = await import("./domain.js");
|
|
5
6
|
const myIp = await getMyIp();
|
|
6
7
|
const v4 = isIPv4(myIp);
|
|
7
8
|
const v6 = isIPv6(myIp);
|
|
@@ -36,4 +37,187 @@ export const createRecord = async (options) => {
|
|
|
36
37
|
});
|
|
37
38
|
await client.send(cmd);
|
|
38
39
|
};
|
|
40
|
+
const setupUserData = (email, grantAccess = []) => {
|
|
41
|
+
const peerIdStrings = grantAccess.map((x) => x.toString());
|
|
42
|
+
return `#!/bin/bash
|
|
43
|
+
cd /home/ubuntu
|
|
44
|
+
curl -fsSL https://deb.nodesource.com/setup_19.x | sudo -E bash - &&\
|
|
45
|
+
sudo apt-get install -y nodejs
|
|
46
|
+
npm install -g @peerbit/server
|
|
47
|
+
sudo peerbit domain test --email ${email}
|
|
48
|
+
peerbit start ${peerIdStrings.map((key) => `--ga ${key}`)} > log.txt 2>&1 &
|
|
49
|
+
`;
|
|
50
|
+
};
|
|
51
|
+
const PURPOSE_TAG_NAME = "Purpose";
|
|
52
|
+
const PURPOSE_TAG_VALUE = "Peerbit";
|
|
53
|
+
// Ubuntu Server 20.04 LTS (HVM), SSD Volume Type (64-bit (Arm))
|
|
54
|
+
export const AWS_LINUX_ARM_AMIs = {
|
|
55
|
+
/* "af-south-1" */
|
|
56
|
+
"ap-northeast-1": "ami-01444f83954203c6f",
|
|
57
|
+
"ap-northeast-2": "ami-0ac62099928d25fec",
|
|
58
|
+
"ap-northeast-3": "ami-0efdceaebc778c5f3",
|
|
59
|
+
"ap-south-1": "ami-0df6182e39efe7c4d",
|
|
60
|
+
"ap-southeast-1": "ami-01d87e25d3c65ec37",
|
|
61
|
+
"ap-southeast-2": "ami-0641fc20c25fdd380",
|
|
62
|
+
/* "ap-south-2", */
|
|
63
|
+
/* "ap-southeast-3",
|
|
64
|
+
"ap-southeast-4", */
|
|
65
|
+
"ca-central-1": "ami-0a3e942fe4813672b",
|
|
66
|
+
/* "cn-north-1",
|
|
67
|
+
"cn-northwest-1", */
|
|
68
|
+
"eu-central-1": "ami-0d85ad3aa712d96af",
|
|
69
|
+
/* "eu-central-2", */
|
|
70
|
+
"eu-north-1": "ami-0ff124a3d7381bfec",
|
|
71
|
+
/* "eu-south-1",
|
|
72
|
+
"eu-south-2", */
|
|
73
|
+
"eu-west-1": "ami-09c59b011574e4c96",
|
|
74
|
+
"eu-west-2": "ami-03e26d11b665ac7be",
|
|
75
|
+
"eu-west-3": "ami-00771c0ac817397bd",
|
|
76
|
+
/* "il-central-1",
|
|
77
|
+
"me-central-1",
|
|
78
|
+
"me-south-1", */
|
|
79
|
+
"sa-east-1": "ami-08dc4b989f93eafb9",
|
|
80
|
+
"us-east-1": "ami-097d5b19d4f1a7d1b",
|
|
81
|
+
"us-east-2": "ami-0071e4b30f26879e2",
|
|
82
|
+
/* "us-gov-east-1",
|
|
83
|
+
"us-gov-west-1", */
|
|
84
|
+
"us-west-1": "ami-0dca369228f3b2ce7",
|
|
85
|
+
"us-west-2": "ami-0c79a55dda52434da",
|
|
86
|
+
};
|
|
87
|
+
export const launchNodes = async (properties) => {
|
|
88
|
+
if (properties.count && properties.count > 10) {
|
|
89
|
+
throw new Error("Unexpected node launch count: " +
|
|
90
|
+
properties.count +
|
|
91
|
+
". To prevent unwanted behaviour you can also launch 10 nodes at once");
|
|
92
|
+
}
|
|
93
|
+
const count = properties.count || 1;
|
|
94
|
+
const { EC2Client, CreateTagsCommand, RunInstancesCommand, DescribeSecurityGroupsCommand, CreateSecurityGroupCommand, AuthorizeSecurityGroupIngressCommand, DescribeInstancesCommand, } = await import("@aws-sdk/client-ec2");
|
|
95
|
+
const client = new EC2Client({ region: properties.region });
|
|
96
|
+
const regionString = await client.config.region();
|
|
97
|
+
let securityGroupOut = (await client.send(new DescribeSecurityGroupsCommand({
|
|
98
|
+
Filters: [
|
|
99
|
+
{ Name: "tag:" + PURPOSE_TAG_NAME, Values: [PURPOSE_TAG_VALUE] },
|
|
100
|
+
],
|
|
101
|
+
})))?.SecurityGroups?.[0];
|
|
102
|
+
if (!securityGroupOut) {
|
|
103
|
+
securityGroupOut = await client.send(new CreateSecurityGroupCommand({
|
|
104
|
+
GroupName: "peerbit-node",
|
|
105
|
+
Description: "Security group for running Peerbit nodes",
|
|
106
|
+
}));
|
|
107
|
+
await client.send(new CreateTagsCommand({
|
|
108
|
+
Resources: [securityGroupOut.GroupId],
|
|
109
|
+
Tags: [{ Key: PURPOSE_TAG_NAME, Value: PURPOSE_TAG_VALUE }],
|
|
110
|
+
}));
|
|
111
|
+
await client.send(new AuthorizeSecurityGroupIngressCommand({
|
|
112
|
+
GroupId: securityGroupOut.GroupId,
|
|
113
|
+
IpPermissions: [
|
|
114
|
+
{
|
|
115
|
+
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
116
|
+
IpProtocol: "tcp",
|
|
117
|
+
FromPort: 80,
|
|
118
|
+
ToPort: 80,
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
122
|
+
IpProtocol: "tcp",
|
|
123
|
+
FromPort: 443,
|
|
124
|
+
ToPort: 443,
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
128
|
+
IpProtocol: "tcp",
|
|
129
|
+
FromPort: 9002,
|
|
130
|
+
ToPort: 9002,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
134
|
+
IpProtocol: "tcp",
|
|
135
|
+
FromPort: 8082,
|
|
136
|
+
ToPort: 8082,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
140
|
+
IpProtocol: "tcp",
|
|
141
|
+
FromPort: 4002,
|
|
142
|
+
ToPort: 4005,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
146
|
+
IpProtocol: "tcp",
|
|
147
|
+
FromPort: 22,
|
|
148
|
+
ToPort: 22,
|
|
149
|
+
}, // SSH
|
|
150
|
+
],
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
const instanceTag = "Peerbit" + (properties.namePrefix ? "-" + properties.namePrefix : "");
|
|
154
|
+
let existingCounter = (await client.send(new DescribeInstancesCommand({
|
|
155
|
+
Filters: [{ Name: "tag:Purpose", Values: [instanceTag] }],
|
|
156
|
+
}))).Reservations?.length || 0;
|
|
157
|
+
console.log(regionString, AWS_LINUX_ARM_AMIs[regionString]);
|
|
158
|
+
const instanceOut = await client.send(new RunInstancesCommand({
|
|
159
|
+
ImageId: AWS_LINUX_ARM_AMIs[regionString],
|
|
160
|
+
SecurityGroupIds: [securityGroupOut.GroupId],
|
|
161
|
+
InstanceType: "t4g." + (properties.size || "micro"),
|
|
162
|
+
UserData: Buffer.from(setupUserData(properties.email, properties.grantAccess)).toString("base64"),
|
|
163
|
+
MinCount: count,
|
|
164
|
+
MaxCount: count,
|
|
165
|
+
// InstanceInitiatedShutdownBehavior: 'terminate' // to enable termination when node shutting itself down
|
|
166
|
+
}));
|
|
167
|
+
if (!instanceOut.Instances || instanceOut.Instances.length === 0) {
|
|
168
|
+
throw new Error("Failed to create instance");
|
|
169
|
+
}
|
|
170
|
+
const names = [];
|
|
171
|
+
for (const instance of instanceOut.Instances) {
|
|
172
|
+
existingCounter++;
|
|
173
|
+
const name = (properties.namePrefix ? properties.namePrefix : "peerbit-node") +
|
|
174
|
+
"-" +
|
|
175
|
+
existingCounter;
|
|
176
|
+
names.push(name);
|
|
177
|
+
await client.send(new CreateTagsCommand({
|
|
178
|
+
Resources: [instance.InstanceId],
|
|
179
|
+
Tags: [
|
|
180
|
+
{ Key: "Name", Value: name },
|
|
181
|
+
{ Key: "Purpose", Value: instanceTag },
|
|
182
|
+
],
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
// wait for instance ips to become available
|
|
186
|
+
let publicIps = [];
|
|
187
|
+
for (let i = 0; i < 10; i++) {
|
|
188
|
+
const info = await client.send(new DescribeInstancesCommand({
|
|
189
|
+
InstanceIds: instanceOut.Instances.map((x) => x.InstanceId),
|
|
190
|
+
}));
|
|
191
|
+
const foundInstances = info
|
|
192
|
+
.Reservations.map((x) => x.Instances.map((y) => y))
|
|
193
|
+
.flat();
|
|
194
|
+
const foundIps = [];
|
|
195
|
+
for (const out of instanceOut.Instances) {
|
|
196
|
+
const foundInstance = foundInstances.find((x) => x.InstanceId === out.InstanceId);
|
|
197
|
+
if (!foundInstance.PublicIpAddress) {
|
|
198
|
+
await delay(3000);
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
foundIps.push(foundInstance.PublicIpAddress);
|
|
202
|
+
}
|
|
203
|
+
publicIps = foundIps;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
if (publicIps.length === 0) {
|
|
207
|
+
throw new Error("Failed to resolve IPs for created instances");
|
|
208
|
+
}
|
|
209
|
+
return publicIps.map((v, ix) => {
|
|
210
|
+
return {
|
|
211
|
+
instanceId: instanceOut.Instances[ix].InstanceId,
|
|
212
|
+
publicIp: v,
|
|
213
|
+
name: names[ix],
|
|
214
|
+
region: regionString,
|
|
215
|
+
};
|
|
216
|
+
}); // TODO types
|
|
217
|
+
};
|
|
218
|
+
export const terminateNode = async (properties) => {
|
|
219
|
+
const { EC2Client, TerminateInstancesCommand } = await import("@aws-sdk/client-ec2");
|
|
220
|
+
const client = new EC2Client({ region: properties.region });
|
|
221
|
+
await client.send(new TerminateInstancesCommand({ InstanceIds: [properties.instanceId] }));
|
|
222
|
+
};
|
|
39
223
|
//# sourceMappingURL=aws.js.map
|
package/lib/esm/aws.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aws.js","sourceRoot":"","sources":["../../src/aws.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"aws.js","sourceRoot":"","sources":["../../src/aws.ts"],"names":[],"mappings":"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"}
|