@peerbit/server 6.0.42 → 7.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.
Files changed (84) hide show
  1. package/dist/src/cli.d.ts.map +1 -1
  2. package/dist/src/cli.js +161 -352
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/client.d.ts +1 -1
  5. package/dist/src/client.d.ts.map +1 -1
  6. package/dist/src/client.js +2 -5
  7. package/dist/src/client.js.map +1 -1
  8. package/dist/src/docker.d.ts +70 -1
  9. package/dist/src/docker.d.ts.map +1 -1
  10. package/dist/src/docker.js +559 -14
  11. package/dist/src/docker.js.map +1 -1
  12. package/dist/src/domain-lease.d.ts +126 -0
  13. package/dist/src/domain-lease.d.ts.map +1 -0
  14. package/dist/src/domain-lease.js +800 -0
  15. package/dist/src/domain-lease.js.map +1 -0
  16. package/dist/src/domain.d.ts +50 -2
  17. package/dist/src/domain.d.ts.map +1 -1
  18. package/dist/src/domain.js +484 -67
  19. package/dist/src/domain.js.map +1 -1
  20. package/dist/src/hetzner.d.ts +4 -21
  21. package/dist/src/hetzner.d.ts.map +1 -1
  22. package/dist/src/hetzner.js +4 -116
  23. package/dist/src/hetzner.js.map +1 -1
  24. package/dist/src/nginx-template.conf +19 -1
  25. package/dist/src/remotes.browser.d.ts +4 -1
  26. package/dist/src/remotes.browser.d.ts.map +1 -1
  27. package/dist/src/remotes.browser.js +1 -2
  28. package/dist/src/remotes.browser.js.map +1 -1
  29. package/dist/src/remotes.d.ts +2 -1
  30. package/dist/src/remotes.d.ts.map +1 -1
  31. package/dist/src/remotes.js +1 -0
  32. package/dist/src/remotes.js.map +1 -1
  33. package/dist/src/server.d.ts.map +1 -1
  34. package/dist/src/server.js +3 -5
  35. package/dist/src/server.js.map +1 -1
  36. package/dist/test/api.spec.js +2 -1
  37. package/dist/test/api.spec.js.map +1 -1
  38. package/dist/test/cli.spec.js +48 -1
  39. package/dist/test/cli.spec.js.map +1 -1
  40. package/dist/test/docker.spec.d.ts +2 -0
  41. package/dist/test/docker.spec.d.ts.map +1 -0
  42. package/dist/test/docker.spec.js +822 -0
  43. package/dist/test/docker.spec.js.map +1 -0
  44. package/dist/test/domain-lease.spec.d.ts +2 -0
  45. package/dist/test/domain-lease.spec.d.ts.map +1 -0
  46. package/dist/test/domain-lease.spec.js +530 -0
  47. package/dist/test/domain-lease.spec.js.map +1 -0
  48. package/dist/test/domain.integration.spec.js +358 -75
  49. package/dist/test/domain.integration.spec.js.map +1 -1
  50. package/dist/test/remotes.spec.d.ts +2 -0
  51. package/dist/test/remotes.spec.d.ts.map +1 -0
  52. package/dist/test/remotes.spec.js +15 -0
  53. package/dist/test/remotes.spec.js.map +1 -0
  54. package/dist/tsconfig.tsbuildinfo +1 -1
  55. package/dist/ui/assets/index-CjZwCewh.js +10 -0
  56. package/dist/ui/assets/index-e3g42MbC.js +9 -0
  57. package/dist/ui/index.html +1 -1
  58. package/package.json +14 -19
  59. package/src/cli.ts +204 -408
  60. package/src/client.ts +2 -6
  61. package/src/docker.ts +841 -20
  62. package/src/domain-lease.ts +1118 -0
  63. package/src/domain.ts +650 -90
  64. package/src/hetzner.ts +4 -184
  65. package/src/nginx-template.conf +19 -1
  66. package/src/remotes.browser.ts +7 -1
  67. package/src/remotes.ts +6 -1
  68. package/src/server.ts +3 -5
  69. package/dist/src/aws.browser.d.ts +0 -2
  70. package/dist/src/aws.browser.d.ts.map +0 -1
  71. package/dist/src/aws.browser.js +0 -3
  72. package/dist/src/aws.browser.js.map +0 -1
  73. package/dist/src/aws.d.ts +0 -30
  74. package/dist/src/aws.d.ts.map +0 -1
  75. package/dist/src/aws.js +0 -240
  76. package/dist/src/aws.js.map +0 -1
  77. package/dist/test/launch.spec.d.ts +0 -2
  78. package/dist/test/launch.spec.d.ts.map +0 -1
  79. package/dist/test/launch.spec.js +0 -23
  80. package/dist/test/launch.spec.js.map +0 -1
  81. package/dist/ui/assets/index-BBTKOM0z.js +0 -6
  82. package/dist/ui/assets/index-DVtj_GOf.js +0 -13
  83. package/src/aws.browser.ts +0 -1
  84. package/src/aws.ts +0 -327
package/src/hetzner.ts CHANGED
@@ -1,30 +1,3 @@
1
- /* eslint-disable no-console */
2
- /* eslint-disable @typescript-eslint/naming-convention */
3
- import { type PeerId } from "@libp2p/interface";
4
- import { delay } from "@peerbit/time";
5
-
6
- export const HETZNER_LOCATIONS = [
7
- "fsn1",
8
- "nbg1",
9
- "hel1",
10
- "ash",
11
- "hil",
12
- ] as const;
13
- export type HetznerLocation = (typeof HETZNER_LOCATIONS)[number];
14
-
15
- export const HETZNER_SERVER_TYPES = [
16
- "cx11",
17
- "cx21",
18
- "cx31",
19
- "cx41",
20
- "cx51",
21
- "cax11",
22
- "cax21",
23
- "cax31",
24
- "cax41",
25
- ] as const;
26
- export type HetznerServerType = (typeof HETZNER_SERVER_TYPES)[number];
27
-
28
1
  const HCLOUD_API_BASE = "https://api.hetzner.cloud/v1";
29
2
 
30
3
  const getToken = (token?: string): string => {
@@ -41,34 +14,6 @@ const getToken = (token?: string): string => {
41
14
  return resolved;
42
15
  };
43
16
 
44
- const setupUserData = (
45
- email: string,
46
- grantAccess: PeerId[] = [],
47
- serverVersion?: string,
48
- ) => {
49
- const peerIdStrings = grantAccess.map((x) => x.toString());
50
- const grantArgs = peerIdStrings.map((key) => `--ga ${key}`).join(" ");
51
- const versionSpec = serverVersion ? `@${serverVersion}` : "";
52
-
53
- // better-sqlite3 forces users to install build-essentials for `make` command
54
- return `#!/bin/bash
55
- set -e
56
- cd /root
57
- curl -fsSL https://deb.nodesource.com/setup_22.x | bash - &&\
58
- apt-get install -y nodejs
59
- apt-get install -y build-essential
60
- npm install -g @peerbit/server${versionSpec}
61
- peerbit domain test --email ${email}
62
- peerbit start ${grantArgs} > log.txt 2>&1 &
63
- `;
64
- };
65
-
66
- type HcloudServer = {
67
- id: number;
68
- name: string;
69
- public_net?: { ipv4?: { ip?: string } };
70
- };
71
-
72
17
  const createHcloudClient = async (token: string) => {
73
18
  const { default: axios } = await import("axios");
74
19
  return axios.create({
@@ -92,135 +37,10 @@ const parseAxiosError = (error: any): string => {
92
37
  return `${message} (HTTP ${status})${details ? `: ${details}` : ""}`;
93
38
  };
94
39
 
95
- const escapeRegExp = (value: string): string =>
96
- value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
97
-
98
- const getHighestNameCounter = (
99
- servers: HcloudServer[],
100
- prefix: string,
101
- ): number => {
102
- const pattern = new RegExp(`^${escapeRegExp(prefix)}-(\\d+)$`);
103
- let max = 0;
104
- for (const server of servers) {
105
- const match = server.name.match(pattern);
106
- if (!match) continue;
107
- const n = Number(match[1]);
108
- if (Number.isFinite(n)) {
109
- max = Math.max(max, n);
110
- }
111
- }
112
- return max;
113
- };
114
-
115
- const waitForServerPublicIp = async (
116
- client: Awaited<ReturnType<typeof createHcloudClient>>,
117
- serverId: number,
118
- timeoutMs = 3 * 60 * 1000,
119
- pollIntervalMs = 5000,
120
- ): Promise<string> => {
121
- const start = Date.now();
122
- while (Date.now() - start < timeoutMs) {
123
- try {
124
- const info = await client.get(`/servers/${serverId}`);
125
- const server: HcloudServer | undefined = info.data?.server;
126
- const ip = server?.public_net?.ipv4?.ip;
127
- if (ip) {
128
- return ip;
129
- }
130
- } catch (error: any) {
131
- if (error?.response?.status !== 404 && error?.response?.status !== 429) {
132
- throw new Error(
133
- `Failed while waiting for Hetzner server ${serverId} IP: ${parseAxiosError(
134
- error,
135
- )}`,
136
- );
137
- }
138
- }
139
- await delay(pollIntervalMs);
140
- }
141
- throw new Error(
142
- `Timed out waiting for Hetzner server ${serverId} to get a public IPv4`,
143
- );
144
- };
145
-
146
- export const launchNodes = async (properties: {
147
- token?: string;
148
- location?: string;
149
- email: string;
150
- count?: number;
151
- serverType?: string;
152
- namePrefix?: string;
153
- grantAccess?: PeerId[];
154
- serverVersion?: string;
155
- image?: string;
156
- }): Promise<
157
- { serverId: number; publicIp: string; name: string; location: string }[]
158
- > => {
159
- if (properties.count && properties.count > 10) {
160
- throw new Error(
161
- "Unexpected node launch count: " +
162
- properties.count +
163
- ". To prevent unwanted behaviour you can also launch 10 nodes at once",
164
- );
165
- }
166
- const count = properties.count || 1;
167
-
168
- const token = getToken(properties.token);
169
- const client = await createHcloudClient(token);
170
-
171
- const location = properties.location || "fsn1";
172
- const serverType = properties.serverType || "cx11";
173
- const image = properties.image || "ubuntu-22.04";
174
- const namePrefix = properties.namePrefix || "peerbit-node";
175
-
176
- const existingServers = (await client.get("/servers")).data?.servers as
177
- | HcloudServer[]
178
- | undefined;
179
- const existingCounter = getHighestNameCounter(
180
- existingServers || [],
181
- namePrefix,
182
- );
183
-
184
- const created: Array<{ serverId: number; name: string }> = [];
185
- for (let ix = 1; ix <= count; ix++) {
186
- const name = `${namePrefix}-${existingCounter + ix}`;
187
- try {
188
- const resp = await client.post("/servers", {
189
- name,
190
- server_type: serverType,
191
- image,
192
- location,
193
- user_data: setupUserData(
194
- properties.email,
195
- properties.grantAccess,
196
- properties.serverVersion,
197
- ),
198
- });
199
- const serverId: number | undefined = resp.data?.server?.id;
200
- if (!serverId) {
201
- throw new Error("Missing server id in Hetzner response");
202
- }
203
- created.push({ serverId, name });
204
- } catch (error: any) {
205
- throw new Error(
206
- `Failed to create Hetzner server '${name}': ${parseAxiosError(error)}`,
207
- );
208
- }
209
- }
210
-
211
- const nodes: Array<{
212
- serverId: number;
213
- publicIp: string;
214
- name: string;
215
- location: string;
216
- }> = [];
217
- for (const { serverId, name } of created) {
218
- const publicIp = await waitForServerPublicIp(client, serverId);
219
- nodes.push({ serverId, publicIp, name, location });
220
- }
221
- return nodes;
222
- };
223
-
40
+ /**
41
+ * Retained so users can clean up Hetzner servers recorded by older releases.
42
+ * Creating new provider-managed servers is no longer supported.
43
+ */
224
44
  export const terminateNode = async (properties: {
225
45
  token?: string;
226
46
  serverId: number | string;
@@ -35,6 +35,14 @@ server {
35
35
  root /usr/share/nginx/html;
36
36
  index index.html index.htm;
37
37
 
38
+ # Each staged configuration writes an unpredictable file here. The CLI
39
+ # requires the exact value over HTTPS before activating that generation.
40
+ location ^~ /.well-known/peerbit-generation/ {
41
+ default_type text/plain;
42
+ add_header Cache-Control "no-store" always;
43
+ try_files $uri =404;
44
+ }
45
+
38
46
  location / {
39
47
  try_files $uri $uri/ =404;
40
48
  }
@@ -82,8 +90,18 @@ server {
82
90
  default_type text/plain;
83
91
  }
84
92
 
93
+ # Managed DNS leases prove continued control through a short-lived local
94
+ # challenge server. Keep the helper bound to loopback; only NGINX exposes
95
+ # this exact path on public port 80.
96
+ location ^~ /.well-known/peerbit-dns/ {
97
+ proxy_pass http://127.0.0.1:8093;
98
+ proxy_http_version 1.1;
99
+ proxy_buffering off;
100
+ proxy_set_header Host $host;
101
+ }
102
+
85
103
  # Everything else: redirect to HTTPS
86
104
  location / {
87
105
  return 301 https://$host$request_uri;
88
106
  }
89
- }
107
+ }
@@ -1 +1,7 @@
1
- // Not supported
1
+ export const getRetiredAWSManagementError = (origin: {
2
+ instanceId: string;
3
+ region: string;
4
+ }): Error =>
5
+ new Error(
6
+ `Automatic AWS management has been retired. Terminate EC2 instance ${origin.instanceId} in region ${origin.region} from the AWS console, then remove the local remote entry.`,
7
+ );
package/src/remotes.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import fs from "fs";
2
2
 
3
- interface AWSOrigin {
3
+ export interface AWSOrigin {
4
4
  type: "aws";
5
5
  region: string;
6
6
  instanceId: string;
@@ -14,6 +14,11 @@ interface HetznerOrigin {
14
14
 
15
15
  export type RemoteOrigin = AWSOrigin | HetznerOrigin;
16
16
 
17
+ export const getRetiredAWSManagementError = (origin: AWSOrigin): Error =>
18
+ new Error(
19
+ `Automatic AWS management has been retired. Terminate EC2 instance ${origin.instanceId} in region ${origin.region} from the AWS console, then remove the local remote entry.`,
20
+ );
21
+
17
22
  export const DEFAULT_REMOTE_GROUP = "default";
18
23
 
19
24
  export interface RemoteObject {
package/src/server.ts CHANGED
@@ -228,6 +228,9 @@ export const startServerWithNode = async (properties: {
228
228
  }
229
229
 
230
230
  const trust = new Trust(getTrustPath(properties.directory));
231
+ for (const id of trustPeerIds) {
232
+ trust.add(getPublicKeyFromPeerId(id).hashcode());
233
+ }
231
234
  const server = await startApiServer(peer, {
232
235
  port: properties.ports?.api,
233
236
  trust,
@@ -278,11 +281,6 @@ export const startServerWithNode = async (properties: {
278
281
  };
279
282
  await shutDownHook(peer, server);
280
283
 
281
- if (trustPeerIds.length > 0) {
282
- for (const id of trustPeerIds) {
283
- trust.add(getPublicKeyFromPeerId(id).hashcode());
284
- }
285
- }
286
284
  return { server, node: peer };
287
285
  };
288
286
 
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=aws.browser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aws.browser.d.ts","sourceRoot":"","sources":["../../src/aws.browser.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- export {};
2
- // Unsupported
3
- //# sourceMappingURL=aws.browser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aws.browser.js","sourceRoot":"","sources":["../../src/aws.browser.ts"],"names":[],"mappings":";AAAA,cAAc"}
package/dist/src/aws.d.ts DELETED
@@ -1,30 +0,0 @@
1
- import { type PeerId } from "@libp2p/interface";
2
- export declare const createRecord: (options: {
3
- domain: string;
4
- region?: string;
5
- hostedZoneId: string;
6
- credentials?: {
7
- accessKeyId: string;
8
- secretAccessKey: string;
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
- serverVersion?: string;
20
- }) => Promise<{
21
- instanceId: string;
22
- publicIp: string;
23
- name: string;
24
- region: string;
25
- }[]>;
26
- export declare const terminateNode: (properties: {
27
- instanceId: string;
28
- region?: string;
29
- }) => Promise<void>;
30
- //# sourceMappingURL=aws.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aws.d.ts","sourceRoot":"","sources":["../../src/aws.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,eAAO,MAAM,YAAY,GAAU,SAAS;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D,KAAG,OAAO,CAAC,IAAI,CAyCf,CAAC;AA0BF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgCrD,CAAC;AACF,eAAO,MAAM,WAAW,GAAU,YAAY;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,KAAG,OAAO,CACV;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CAkMxE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,YAAY;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,kBAQA,CAAC"}
package/dist/src/aws.js DELETED
@@ -1,240 +0,0 @@
1
- /* eslint-disable no-console */
2
- /* eslint-disable @typescript-eslint/naming-convention */
3
- import {} from "@libp2p/interface";
4
- import { delay } from "@peerbit/time";
5
- export const createRecord = async (options) => {
6
- const { Route53Client, ChangeResourceRecordSetsCommand } = await import("@aws-sdk/client-route-53");
7
- const { isIPv4, isIPv6 } = await import("net");
8
- const { getMyIp } = await import("./domain.js");
9
- const myIp = await getMyIp();
10
- const v4 = isIPv4(myIp);
11
- const v6 = isIPv6(myIp);
12
- if (!v6 && !v4) {
13
- throw new Error("Unknown ip type");
14
- }
15
- // TODO, make sure it works for ipv6 addresses with leading and trailing colon
16
- const client = new Route53Client({
17
- region: options.region,
18
- credentials: options.credentials
19
- ? {
20
- accessKeyId: options.credentials.accessKeyId,
21
- secretAccessKey: options.credentials.secretAccessKey,
22
- }
23
- : undefined,
24
- });
25
- const cmd = new ChangeResourceRecordSetsCommand({
26
- ChangeBatch: {
27
- Changes: [
28
- {
29
- Action: "CREATE",
30
- ResourceRecordSet: {
31
- Name: options.domain,
32
- Type: v4 ? "A" : "AAAA",
33
- TTL: 60,
34
- ResourceRecords: [{ Value: myIp }],
35
- },
36
- },
37
- ],
38
- },
39
- HostedZoneId: options.hostedZoneId,
40
- });
41
- await client.send(cmd);
42
- };
43
- const setupUserData = (email, grantAccess = [], serverVersion) => {
44
- const peerIdStrings = grantAccess.map((x) => x.toString());
45
- const grantArgs = peerIdStrings.map((key) => `--ga ${key}`).join(" ");
46
- // better-sqlite3 force use to install build-essentials for `make` command, TOOD dont bundle better-sqlite3 by default?
47
- const versionSpec = serverVersion ? `@${serverVersion}` : "";
48
- return `#!/bin/bash
49
- cd /home/ubuntu
50
- curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - &&\
51
- sudo apt-get install -y nodejs
52
- sudo apt-get install -y build-essential
53
- npm install -g @peerbit/server${versionSpec}
54
- sudo peerbit domain test --email ${email}
55
- peerbit start ${grantArgs} > log.txt 2>&1 &
56
- `;
57
- };
58
- const PURPOSE_TAG_NAME = "Purpose";
59
- const PURPOSE_TAG_VALUE = "Peerbit";
60
- // Ubuntu Server 20.04 LTS (HVM), SSD Volume Type (64-bit (Arm))
61
- export const AWS_LINUX_ARM_AMIs = {
62
- /* "af-south-1" */
63
- "ap-northeast-1": "ami-01444f83954203c6f",
64
- "ap-northeast-2": "ami-0ac62099928d25fec",
65
- "ap-northeast-3": "ami-0efdceaebc778c5f3",
66
- "ap-south-1": "ami-0df6182e39efe7c4d",
67
- "ap-southeast-1": "ami-01d87e25d3c65ec37",
68
- "ap-southeast-2": "ami-0641fc20c25fdd380",
69
- /* "ap-south-2", */
70
- /* "ap-southeast-3",
71
- "ap-southeast-4", */
72
- "ca-central-1": "ami-0a3e942fe4813672b",
73
- /* "cn-north-1",
74
- "cn-northwest-1", */
75
- "eu-central-1": "ami-0d85ad3aa712d96af",
76
- /* "eu-central-2", */
77
- "eu-north-1": "ami-0ff124a3d7381bfec",
78
- /* "eu-south-1",
79
- "eu-south-2", */
80
- "eu-west-1": "ami-09c59b011574e4c96",
81
- "eu-west-2": "ami-03e26d11b665ac7be",
82
- "eu-west-3": "ami-00771c0ac817397bd",
83
- /* "il-central-1",
84
- "me-central-1",
85
- "me-south-1", */
86
- "sa-east-1": "ami-08dc4b989f93eafb9",
87
- "us-east-1": "ami-097d5b19d4f1a7d1b",
88
- "us-east-2": "ami-0071e4b30f26879e2",
89
- /* "us-gov-east-1",
90
- "us-gov-west-1", */
91
- "us-west-1": "ami-0dca369228f3b2ce7",
92
- "us-west-2": "ami-0c79a55dda52434da",
93
- };
94
- export const launchNodes = async (properties) => {
95
- if (properties.count && properties.count > 10) {
96
- throw new Error("Unexpected node launch count: " +
97
- properties.count +
98
- ". To prevent unwanted behaviour you can also launch 10 nodes at once");
99
- }
100
- const count = properties.count || 1;
101
- const { EC2Client, CreateTagsCommand, RunInstancesCommand, DescribeSecurityGroupsCommand, CreateSecurityGroupCommand, AuthorizeSecurityGroupIngressCommand, DescribeInstancesCommand, } = await import("@aws-sdk/client-ec2");
102
- const client = new EC2Client({ region: properties.region });
103
- const regionString = await client.config.region();
104
- let securityGroupOut = (await client.send(new DescribeSecurityGroupsCommand({
105
- Filters: [
106
- { Name: "tag:" + PURPOSE_TAG_NAME, Values: [PURPOSE_TAG_VALUE] },
107
- ],
108
- })))?.SecurityGroups?.[0];
109
- if (!securityGroupOut) {
110
- securityGroupOut = await client.send(new CreateSecurityGroupCommand({
111
- GroupName: "peerbit-node",
112
- Description: "Security group for running Peerbit nodes",
113
- }));
114
- await client.send(new CreateTagsCommand({
115
- Resources: [securityGroupOut.GroupId],
116
- Tags: [{ Key: PURPOSE_TAG_NAME, Value: PURPOSE_TAG_VALUE }],
117
- }));
118
- await client.send(new AuthorizeSecurityGroupIngressCommand({
119
- GroupId: securityGroupOut.GroupId,
120
- IpPermissions: [
121
- {
122
- IpRanges: [{ CidrIp: "0.0.0.0/0" }],
123
- IpProtocol: "tcp",
124
- FromPort: 80,
125
- ToPort: 80,
126
- }, // Frontend
127
- {
128
- IpRanges: [{ CidrIp: "0.0.0.0/0" }],
129
- IpProtocol: "tcp",
130
- FromPort: 443,
131
- ToPort: 443,
132
- }, // Frontend SSL
133
- {
134
- IpRanges: [{ CidrIp: "0.0.0.0/0" }],
135
- IpProtocol: "tcp",
136
- FromPort: 9002,
137
- ToPort: 9002,
138
- }, // HTTPS api
139
- {
140
- IpRanges: [{ CidrIp: "0.0.0.0/0" }],
141
- IpProtocol: "tcp",
142
- FromPort: 8082,
143
- ToPort: 8082,
144
- }, // HTTP api
145
- {
146
- IpRanges: [{ CidrIp: "0.0.0.0/0" }],
147
- IpProtocol: "tcp",
148
- FromPort: 4002,
149
- ToPort: 4005,
150
- }, // libp2p
151
- {
152
- IpRanges: [{ CidrIp: "0.0.0.0/0" }],
153
- IpProtocol: "tcp",
154
- FromPort: 22,
155
- ToPort: 22,
156
- }, // SSH
157
- ],
158
- }));
159
- }
160
- const instanceTag = "Peerbit" + (properties.namePrefix ? "-" + properties.namePrefix : "");
161
- let existingCounter = (await client.send(new DescribeInstancesCommand({
162
- Filters: [{ Name: "tag:Purpose", Values: [instanceTag] }],
163
- }))).Reservations?.length || 0;
164
- console.log("Region: " + regionString);
165
- const instanceOut = await client.send(new RunInstancesCommand({
166
- ImageId: AWS_LINUX_ARM_AMIs[regionString],
167
- SecurityGroupIds: [securityGroupOut.GroupId],
168
- InstanceType: ("t4g." + (properties.size || "micro")), // TODO types
169
- UserData: Buffer.from(setupUserData(properties.email, properties.grantAccess, properties.serverVersion)).toString("base64"),
170
- MinCount: count,
171
- MaxCount: count,
172
- // InstanceInitiatedShutdownBehavior: 'terminate' // to enable termination when node shutting itself down
173
- }));
174
- if (!instanceOut.Instances || instanceOut.Instances.length === 0) {
175
- throw new Error("Failed to create instance");
176
- }
177
- const names = [];
178
- for (const instance of instanceOut.Instances) {
179
- existingCounter++;
180
- const name = (properties.namePrefix ? properties.namePrefix : "peerbit-node") +
181
- "-" +
182
- existingCounter;
183
- names.push(name);
184
- await client.send(new CreateTagsCommand({
185
- Resources: [instance.InstanceId],
186
- Tags: [
187
- { Key: "Name", Value: name },
188
- { Key: "Purpose", Value: instanceTag },
189
- ],
190
- }));
191
- }
192
- // wait for AWS to recognize the new instance IDs and for public IPs to be assigned
193
- const instanceIds = instanceOut.Instances.map((x) => x.InstanceId);
194
- const timeoutMs = 3 * 60 * 1000; // 3 minutes
195
- const pollIntervalMs = 5000;
196
- const start = Date.now();
197
- let foundInstances = [];
198
- while (Date.now() - start < timeoutMs) {
199
- try {
200
- const info = await client.send(new DescribeInstancesCommand({ InstanceIds: instanceIds }));
201
- foundInstances =
202
- info.Reservations?.flatMap((r) => r.Instances || []) || [];
203
- const allPresent = foundInstances.length >= instanceIds.length;
204
- const ips = new Map(foundInstances
205
- .filter((i) => i.InstanceId && i.PublicIpAddress)
206
- .map((i) => [i.InstanceId, i.PublicIpAddress]));
207
- const allHaveIp = instanceIds.every((id) => ips.has(id));
208
- if (allPresent && allHaveIp) {
209
- // reorder to original order
210
- let publicIps = instanceIds.map((id) => ips.get(id));
211
- if (publicIps.length > 0) {
212
- // success
213
- return publicIps.map((v, ix) => {
214
- return {
215
- instanceId: instanceOut.Instances[ix].InstanceId,
216
- publicIp: v,
217
- name: names[ix],
218
- region: regionString,
219
- };
220
- });
221
- }
222
- }
223
- }
224
- catch (e) {
225
- // AWS eventual consistency: sometimes returns InvalidInstanceID.NotFound immediately after RunInstances
226
- const code = e?.Code || e?.name || e?.code;
227
- if (code !== "InvalidInstanceID.NotFound") {
228
- throw e;
229
- }
230
- }
231
- await delay(pollIntervalMs);
232
- }
233
- throw new Error("Timed out waiting for instances to be describe-able with public IPs");
234
- };
235
- export const terminateNode = async (properties) => {
236
- const { EC2Client, TerminateInstancesCommand } = await import("@aws-sdk/client-ec2");
237
- const client = new EC2Client({ region: properties.region });
238
- await client.send(new TerminateInstancesCommand({ InstanceIds: [properties.instanceId] }));
239
- };
240
- //# sourceMappingURL=aws.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aws.js","sourceRoot":"","sources":["../../src/aws.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,yDAAyD;AACzD,OAAO,EAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,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;IAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAEhD,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,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;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;aACpD;YACF,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;AAEF,MAAM,aAAa,GAAG,CACrB,KAAa,EACb,cAAwB,EAAE,EAC1B,aAAsB,EACrB,EAAE;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEtE,uHAAuH;IACvH,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO;;;;;gCAKwB,WAAW;mCACR,KAAK;gBACxB,SAAS;CACxB,CAAC;AACF,CAAC,CAAC;AACF,MAAM,gBAAgB,GAAG,SAAS,CAAC;AACnC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAEpC,gEAAgE;AAChE,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACzD,mBAAmB;IACnB,gBAAgB,EAAE,uBAAuB;IACzC,gBAAgB,EAAE,uBAAuB;IACzC,gBAAgB,EAAE,uBAAuB;IACzC,YAAY,EAAE,uBAAuB;IACrC,gBAAgB,EAAE,uBAAuB;IACzC,gBAAgB,EAAE,uBAAuB;IACzC,oBAAoB;IACpB;4BACqB;IACrB,cAAc,EAAE,uBAAuB;IACvC;4BACqB;IACrB,cAAc,EAAE,uBAAuB;IACvC,sBAAsB;IACtB,YAAY,EAAE,uBAAuB;IACrC;wBACiB;IACjB,WAAW,EAAE,uBAAuB;IACpC,WAAW,EAAE,uBAAuB;IACpC,WAAW,EAAE,uBAAuB;IACpC;;wBAEiB;IACjB,WAAW,EAAE,uBAAuB;IACpC,WAAW,EAAE,uBAAuB;IACpC,WAAW,EAAE,uBAAuB;IACpC;2BACoB;IACpB,WAAW,EAAE,uBAAuB;IACpC,WAAW,EAAE,uBAAuB;CACpC,CAAC;AACF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,UAQjC,EAEC,EAAE;IACH,IAAI,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACd,gCAAgC;YAC/B,UAAU,CAAC,KAAK;YAChB,sEAAsE,CACvE,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;IAEpC,MAAM,EACL,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,EAC1B,oCAAoC,EACpC,wBAAwB,GACxB,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAElD,IAAI,gBAAgB,GAAG,CACtB,MAAM,MAAM,CAAC,IAAI,CAChB,IAAI,6BAA6B,CAAC;QACjC,OAAO,EAAE;YACR,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,MAAM,EAAE,CAAC,iBAAiB,CAAC,EAAE;SAChE;KACD,CAAC,CACF,CACD,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACvB,gBAAgB,GAAG,MAAM,MAAM,CAAC,IAAI,CACnC,IAAI,0BAA0B,CAAC;YAC9B,SAAS,EAAE,cAAc;YACzB,WAAW,EAAE,0CAA0C;SACvD,CAAC,CACF,CAAC;QACF,MAAM,MAAM,CAAC,IAAI,CAChB,IAAI,iBAAiB,CAAC;YACrB,SAAS,EAAE,CAAC,gBAAgB,CAAC,OAAQ,CAAC;YACtC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;SAC3D,CAAC,CACF,CAAC;QACF,MAAM,MAAM,CAAC,IAAI,CAChB,IAAI,oCAAoC,CAAC;YACxC,OAAO,EAAE,gBAAgB,CAAC,OAAO;YACjC,aAAa,EAAE;gBACd;oBACC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;oBACnC,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,EAAE;oBACZ,MAAM,EAAE,EAAE;iBACV,EAAE,WAAW;gBACd;oBACC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;oBACnC,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,GAAG;oBACb,MAAM,EAAE,GAAG;iBACX,EAAE,eAAe;gBAClB;oBACC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;oBACnC,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,IAAI;iBACZ,EAAE,YAAY;gBACf;oBACC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;oBACnC,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,IAAI;iBACZ,EAAE,WAAW;gBACd;oBACC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;oBACnC,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,IAAI;iBACZ,EAAE,SAAS;gBACZ;oBACC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;oBACnC,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,EAAE;oBACZ,MAAM,EAAE,EAAE;iBACV,EAAE,MAAM;aACT;SACD,CAAC,CACF,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAChB,SAAS,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,IAAI,eAAe,GAClB,CACC,MAAM,MAAM,CAAC,IAAI,CAChB,IAAI,wBAAwB,CAAC;QAC5B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;KACzD,CAAC,CACF,CACD,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC;IAE7B,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CACpC,IAAI,mBAAmB,CAAC;QACvB,OAAO,EAAE,kBAAkB,CAAC,YAAY,CAAC;QACzC,gBAAgB,EAAE,CAAC,gBAAgB,CAAC,OAAQ,CAAC;QAC7C,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,OAAO,CAAC,CAAQ,EAAE,aAAa;QAC3E,QAAQ,EAAE,MAAM,CAAC,IAAI,CACpB,aAAa,CACZ,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,WAAW,EACtB,UAAU,CAAC,aAAa,CACxB,CACD,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACpB,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,KAAK;QACf,yGAAyG;KACzG,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;QAC9C,eAAe,EAAE,CAAC;QAClB,MAAM,IAAI,GACT,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC;YAChE,GAAG;YACH,eAAe,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,MAAM,CAAC,IAAI,CAChB,IAAI,iBAAiB,CAAC;YACrB,SAAS,EAAE,CAAC,QAAQ,CAAC,UAAW,CAAC;YACjC,IAAI,EAAE;gBACL,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;gBAC5B,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;aACtC;SACD,CAAC,CACF,CAAC;IACH,CAAC;IAED,mFAAmF;IACnF,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAW,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;IAC7C,MAAM,cAAc,GAAG,IAAI,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,cAAc,GAGb,EAAE,CAAC;IAER,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAC7B,IAAI,wBAAwB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAC1D,CAAC;YACF,cAAc;gBACb,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YAC5D,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC;YAC/D,MAAM,GAAG,GAAG,IAAI,GAAG,CAClB,cAAc;iBACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,eAAe,CAAC;iBAChD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAW,EAAE,CAAC,CAAC,eAAgB,CAAC,CAAC,CACjD,CAAC;YACF,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;gBAC7B,4BAA4B;gBAC5B,IAAI,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC;gBACtD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,UAAU;oBACV,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;wBAC9B,OAAO;4BACN,UAAU,EAAE,WAAW,CAAC,SAAU,CAAC,EAAE,CAAC,CAAC,UAAW;4BAClD,QAAQ,EAAE,CAAC;4BACX,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;4BACf,MAAM,EAAE,YAAY;yBACpB,CAAC;oBACH,CAAC,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;QACF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACjB,wGAAwG;YACxG,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC;YAC3C,IAAI,IAAI,KAAK,4BAA4B,EAAE,CAAC;gBAC3C,MAAM,CAAC,CAAC;YACT,CAAC;QACF,CAAC;QACD,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,IAAI,KAAK,CACd,qEAAqE,CACrE,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,UAGnC,EAAE,EAAE;IACJ,MAAM,EAAE,SAAS,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAC5D,qBAAqB,CACrB,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,MAAM,CAAC,IAAI,CAChB,IAAI,yBAAyB,CAAC,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CACvE,CAAC;AACH,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=launch.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"launch.spec.d.ts","sourceRoot":"","sources":["../../test/launch.spec.ts"],"names":[],"mappings":""}
@@ -1,23 +0,0 @@
1
- describe("spawn", () => {
2
- it("no-test", () => { });
3
- /* it("launch and stop", async () => {
4
- const results = await launchNodes({
5
- email: "marcus@dao.xyz",
6
- count: 1,
7
- namePrefix: "test-counter",
8
- grantAccess: [await (await Ed25519Keypair.create()).publicKey.toPeerId()]
9
- });
10
- const domain = await waitForDomain(results[0].publicIp);
11
- const client = await createClient(await Ed25519Keypair.create(), {
12
- address: domain,
13
- origin: {
14
- type: "aws",
15
- instanceId: results[0].instanceId,
16
- region: "us-east-1",
17
- },
18
- });
19
- await client.terminate();
20
- }); */
21
- });
22
- export {};
23
- //# sourceMappingURL=launch.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"launch.spec.js","sourceRoot":"","sources":["../../test/launch.spec.ts"],"names":[],"mappings":"AAAA,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxB;;;;;;;;;;;;;;;;;UAiBM;AACP,CAAC,CAAC,CAAC"}