@peerbit/server 3.0.0 → 4.0.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.
Files changed (44) hide show
  1. package/lib/esm/aws.browser.d.ts +0 -0
  2. package/lib/esm/aws.browser.js +3 -0
  3. package/lib/esm/aws.browser.js.map +1 -0
  4. package/lib/esm/aws.d.ts +19 -0
  5. package/lib/esm/aws.js +185 -1
  6. package/lib/esm/aws.js.map +1 -1
  7. package/lib/esm/cli.js +592 -324
  8. package/lib/esm/cli.js.map +1 -1
  9. package/lib/esm/client.d.ts +11 -5
  10. package/lib/esm/client.js +64 -11
  11. package/lib/esm/client.js.map +1 -1
  12. package/lib/esm/docker.browser.d.ts +0 -0
  13. package/lib/esm/docker.browser.js +3 -0
  14. package/lib/esm/docker.browser.js.map +1 -0
  15. package/lib/esm/domain.js +1 -1
  16. package/lib/esm/domain.js.map +1 -1
  17. package/lib/esm/peerbit.d.ts +1 -1
  18. package/lib/esm/remotes.d.ts +15 -2
  19. package/lib/esm/remotes.js +8 -8
  20. package/lib/esm/remotes.js.map +1 -1
  21. package/lib/esm/routes.d.ts +3 -2
  22. package/lib/esm/routes.js +5 -4
  23. package/lib/esm/routes.js.map +1 -1
  24. package/lib/esm/server.d.ts +3 -1
  25. package/lib/esm/server.js +32 -19
  26. package/lib/esm/server.js.map +1 -1
  27. package/lib/esm/trust.d.ts +1 -1
  28. package/lib/esm/trust.js.map +1 -1
  29. package/lib/ui/assets/aws.browser-4ed993c7.js +1 -0
  30. package/lib/ui/assets/index-5ed0229d.js +77 -0
  31. package/lib/ui/index.html +1 -1
  32. package/package.json +13 -7
  33. package/src/aws.browser.ts +1 -0
  34. package/src/aws.ts +250 -1
  35. package/src/cli.ts +676 -354
  36. package/src/client.ts +76 -11
  37. package/src/docker.browser.ts +1 -0
  38. package/src/domain.ts +1 -1
  39. package/src/peerbit.ts +1 -1
  40. package/src/remotes.ts +24 -10
  41. package/src/routes.ts +5 -4
  42. package/src/server.ts +43 -23
  43. package/src/trust.ts +1 -1
  44. package/lib/ui/assets/index-cac7195d.js +0 -77
File without changes
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ // Unsupported
3
+ //# sourceMappingURL=aws.browser.js.map
@@ -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 { getMyIp } from "./domain.js";
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
+ export const AWS_LINUX_ARM_AMIs = {
54
+ /* "af-south-1" */
55
+ "ap-northeast-1": "ami-0342c9aa06b2a6488",
56
+ "ap-northeast-2": "ami-00fdfe418c69b624a",
57
+ "ap-northeast-3": "ami-0d053887907187d0a",
58
+ "ap-south-1": "ami-0df6182e39efe7c4d",
59
+ /* "ap-south-2",
60
+ "ap-southeast-1", */
61
+ "ap-southeast-2": "ami-0641fc20c25fdd380",
62
+ /* "ap-southeast-3",
63
+ "ap-southeast-4", */
64
+ "ca-central-1": "ami-0dfbb7075b12dcc91",
65
+ /* "cn-north-1",
66
+ "cn-northwest-1", */
67
+ "eu-central-1": "ami-0d85ad3aa712d96af",
68
+ /* "eu-central-2", */
69
+ "eu-north-1": "ami-0ff124a3d7381bfec",
70
+ /* "eu-south-1",
71
+ "eu-south-2", */
72
+ "eu-west-1": "ami-09c59b011574e4c96",
73
+ "eu-west-2": "ami-0e3f80b3d2a794117",
74
+ "eu-west-3": "ami-0d031bec3dde37593",
75
+ /* "il-central-1",
76
+ "me-central-1",
77
+ "me-south-1", */
78
+ "sa-east-1": "ami-0aba9f6e2597c6993",
79
+ "us-east-1": "ami-0a0c8eebcdd6dcbd0",
80
+ "us-east-2": "ami-08fdd91d87f63bb09",
81
+ /* "us-gov-east-1",
82
+ "us-gov-west-1", */
83
+ "us-west-2": "ami-0c79a55dda52434da",
84
+ "us-west-1": "ami-07655b4bbf3eb3bd0",
85
+ };
86
+ export const launchNodes = async (properties) => {
87
+ if (properties.count && properties.count > 10) {
88
+ throw new Error("Unexpected node launch count: " +
89
+ properties.count +
90
+ ". To prevent unwanted behaviour you can also launch 10 nodes at once");
91
+ }
92
+ const count = properties.count || 1;
93
+ const { EC2Client, CreateTagsCommand, RunInstancesCommand, DescribeSecurityGroupsCommand, CreateSecurityGroupCommand, AuthorizeSecurityGroupIngressCommand, DescribeInstancesCommand, } = await import("@aws-sdk/client-ec2");
94
+ const client = new EC2Client({ region: properties.region });
95
+ const regionString = await client.config.region();
96
+ // Ubuntu Server 22.04 LTS (HVM), SSD Volume Type, ARM
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
@@ -1 +1 @@
1
- {"version":3,"file":"aws.js","sourceRoot":"","sources":["../../src/aws.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,OAKlC,EAAiB,EAAE;IACnB,MAAM,EAAE,aAAa,EAAE,+BAA+B,EAAE,GAAG,MAAM,MAAM,CACtE,0BAA0B,CAC1B,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;IAE/C,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAExB,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;KACnC;IACD,8EAA8E;IAC9E,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAC/B,CAAC,CAAC;gBACA,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,WAAW;gBAC5C,eAAe,EAAE,OAAO,CAAC,WAAW,CAAC,eAAe;aACnD;YACH,CAAC,CAAC,SAAS;KACZ,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,+BAA+B,CAAC;QAC/C,WAAW,EAAE;YACZ,OAAO,EAAE;gBACR;oBACC,MAAM,EAAE,QAAQ;oBAChB,iBAAiB,EAAE;wBAClB,IAAI,EAAE,OAAO,CAAC,MAAM;wBACpB,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;wBACvB,GAAG,EAAE,EAAE;wBACP,eAAe,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;qBAClC;iBACD;aACD;SACD;QACD,YAAY,EAAE,OAAO,CAAC,YAAY;KAClC,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC,CAAC"}
1
+ {"version":3,"file":"aws.js","sourceRoot":"","sources":["../../src/aws.ts"],"names":[],"mappings":"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"}