@peerbit/server 5.9.6 → 5.10.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/dist/src/aws.d.ts.map +1 -1
- package/dist/src/aws.js +2 -1
- package/dist/src/aws.js.map +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +142 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +7 -1
- package/dist/src/client.js.map +1 -1
- package/dist/src/docker.d.ts.map +1 -1
- package/dist/src/docker.js +122 -32
- package/dist/src/docker.js.map +1 -1
- package/dist/src/hetzner.browser.d.ts +2 -0
- package/dist/src/hetzner.browser.d.ts.map +1 -0
- package/dist/src/hetzner.browser.js +3 -0
- package/dist/src/hetzner.browser.js.map +1 -0
- package/dist/src/hetzner.d.ts +26 -0
- package/dist/src/hetzner.d.ts.map +1 -0
- package/dist/src/hetzner.js +161 -0
- package/dist/src/hetzner.js.map +1 -0
- package/dist/src/remotes.d.ts +6 -1
- package/dist/src/remotes.d.ts.map +1 -1
- package/dist/src/remotes.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/assets/{index-BEgs1gyX.js → index-Dst3R_bZ.js} +6 -6
- package/dist/ui/index.html +1 -1
- package/package.json +5 -4
- package/src/aws.ts +2 -1
- package/src/cli.ts +164 -1
- package/src/client.ts +6 -1
- package/src/docker.ts +141 -31
- package/src/hetzner.browser.ts +1 -0
- package/src/hetzner.ts +242 -0
- package/src/remotes.ts +7 -1
package/dist/src/docker.js
CHANGED
|
@@ -1,41 +1,131 @@
|
|
|
1
1
|
import { delay, waitFor } from "@peerbit/time";
|
|
2
|
-
|
|
2
|
+
const execCommand = async (cmd) => {
|
|
3
3
|
const { exec } = await import("child_process");
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
return true;
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
if (!(await dockerExist())) {
|
|
22
|
-
await new Promise((resolve, reject) => {
|
|
23
|
-
exec("sudo snap install docker", (error, stdout, stderr) => {
|
|
24
|
-
if (error || stderr) {
|
|
25
|
-
reject();
|
|
26
|
-
}
|
|
27
|
-
resolve(stdout);
|
|
28
|
-
});
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
exec(cmd, (error, stdout, stderr) => {
|
|
6
|
+
if (error) {
|
|
7
|
+
error.stdout = stdout;
|
|
8
|
+
error.stderr = stderr;
|
|
9
|
+
reject(error);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
resolve({ stdout, stderr });
|
|
29
13
|
});
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
const commandExists = async (command) => {
|
|
17
|
+
try {
|
|
18
|
+
await execCommand(`command -v ${command}`);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const getSudoPrefix = async () => {
|
|
26
|
+
const isRoot = typeof process.getuid === "function" && process.getuid() === 0;
|
|
27
|
+
if (isRoot) {
|
|
28
|
+
return "";
|
|
29
|
+
}
|
|
30
|
+
if (await commandExists("sudo")) {
|
|
31
|
+
return "sudo ";
|
|
32
|
+
}
|
|
33
|
+
throw new Error("Docker installation requires elevated privileges (sudo not found)");
|
|
34
|
+
};
|
|
35
|
+
const dockerCliExists = async () => {
|
|
36
|
+
try {
|
|
37
|
+
await execCommand("docker --version");
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const dockerDaemonAccessible = async () => {
|
|
45
|
+
try {
|
|
46
|
+
await execCommand("docker info");
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const stderr = error?.stderr || "";
|
|
51
|
+
if (stderr.includes("Got permission denied") ||
|
|
52
|
+
stderr.toLowerCase().includes("permission denied")) {
|
|
53
|
+
throw new Error("Docker is installed but the current user cannot access the Docker daemon. Add the user to the 'docker' group or run with elevated privileges.");
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const startDockerDaemon = async (sudoPrefix) => {
|
|
59
|
+
if (await commandExists("snap")) {
|
|
30
60
|
try {
|
|
31
|
-
await
|
|
32
|
-
timeout: 30 * 1000,
|
|
33
|
-
delayInterval: 1000,
|
|
34
|
-
});
|
|
61
|
+
await execCommand(`${sudoPrefix}snap start docker`);
|
|
35
62
|
}
|
|
36
|
-
catch
|
|
37
|
-
|
|
63
|
+
catch { }
|
|
64
|
+
}
|
|
65
|
+
if (await commandExists("systemctl")) {
|
|
66
|
+
try {
|
|
67
|
+
await execCommand(`${sudoPrefix}systemctl enable --now docker`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
catch { }
|
|
71
|
+
try {
|
|
72
|
+
await execCommand(`${sudoPrefix}systemctl start docker`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
catch { }
|
|
76
|
+
}
|
|
77
|
+
if (await commandExists("service")) {
|
|
78
|
+
try {
|
|
79
|
+
await execCommand(`${sudoPrefix}service docker start`);
|
|
80
|
+
}
|
|
81
|
+
catch { }
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const installDockerWithSnap = async (sudoPrefix) => {
|
|
85
|
+
await execCommand(`${sudoPrefix}snap install docker`);
|
|
86
|
+
};
|
|
87
|
+
const installDockerWithApt = async (sudoPrefix) => {
|
|
88
|
+
await execCommand(`${sudoPrefix}apt-get update`);
|
|
89
|
+
await execCommand(`${sudoPrefix}DEBIAN_FRONTEND=noninteractive apt-get install -y docker.io`);
|
|
90
|
+
};
|
|
91
|
+
export const installDocker = async () => {
|
|
92
|
+
const sudoPrefix = await getSudoPrefix();
|
|
93
|
+
if (!(await dockerCliExists())) {
|
|
94
|
+
let lastError;
|
|
95
|
+
if (await commandExists("snap")) {
|
|
96
|
+
try {
|
|
97
|
+
await installDockerWithSnap(sudoPrefix);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
lastError = error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (!(await dockerCliExists()) && (await commandExists("apt-get"))) {
|
|
104
|
+
try {
|
|
105
|
+
await installDockerWithApt(sudoPrefix);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
lastError = error;
|
|
109
|
+
}
|
|
38
110
|
}
|
|
111
|
+
if (!(await dockerCliExists())) {
|
|
112
|
+
const suffix = lastError instanceof Error
|
|
113
|
+
? `: ${lastError.message}`
|
|
114
|
+
: lastError
|
|
115
|
+
? `: ${String(lastError)}`
|
|
116
|
+
: "";
|
|
117
|
+
throw new Error(`Failed to install docker (no supported installer succeeded)${suffix}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
await startDockerDaemon(sudoPrefix);
|
|
121
|
+
try {
|
|
122
|
+
await waitFor(async () => dockerDaemonAccessible(), {
|
|
123
|
+
timeout: 2 * 60 * 1000,
|
|
124
|
+
delayInterval: 2000,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw new Error(`Docker is installed but not available: ${error?.message || "unknown error"}`);
|
|
39
129
|
}
|
|
40
130
|
};
|
|
41
131
|
export const startContainer = async (cmd, errorMessage) => {
|
package/dist/src/docker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hetzner.browser.d.ts","sourceRoot":"","sources":["../../src/hetzner.browser.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hetzner.browser.js","sourceRoot":"","sources":["../../src/hetzner.browser.ts"],"names":[],"mappings":";AAAA,cAAc"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type PeerId } from "@libp2p/interface";
|
|
2
|
+
export declare const HETZNER_LOCATIONS: readonly ["fsn1", "nbg1", "hel1", "ash", "hil"];
|
|
3
|
+
export type HetznerLocation = (typeof HETZNER_LOCATIONS)[number];
|
|
4
|
+
export declare const HETZNER_SERVER_TYPES: readonly ["cx11", "cx21", "cx31", "cx41", "cx51", "cax11", "cax21", "cax31", "cax41"];
|
|
5
|
+
export type HetznerServerType = (typeof HETZNER_SERVER_TYPES)[number];
|
|
6
|
+
export declare const launchNodes: (properties: {
|
|
7
|
+
token?: string;
|
|
8
|
+
location?: string;
|
|
9
|
+
email: string;
|
|
10
|
+
count?: number;
|
|
11
|
+
serverType?: string;
|
|
12
|
+
namePrefix?: string;
|
|
13
|
+
grantAccess?: PeerId[];
|
|
14
|
+
serverVersion?: string;
|
|
15
|
+
image?: string;
|
|
16
|
+
}) => Promise<{
|
|
17
|
+
serverId: number;
|
|
18
|
+
publicIp: string;
|
|
19
|
+
name: string;
|
|
20
|
+
location: string;
|
|
21
|
+
}[]>;
|
|
22
|
+
export declare const terminateNode: (properties: {
|
|
23
|
+
token?: string;
|
|
24
|
+
serverId: number | string;
|
|
25
|
+
}) => Promise<void>;
|
|
26
|
+
//# sourceMappingURL=hetzner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hetzner.d.ts","sourceRoot":"","sources":["../../src/hetzner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,eAAO,MAAM,iBAAiB,iDAMpB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,eAAO,MAAM,oBAAoB,uFAUvB,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAwHtE,eAAO,MAAM,WAAW,GAAU,YAAY;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CACV;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,CAiExE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,YAAY;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B,kBAeA,CAAC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
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 HETZNER_LOCATIONS = [
|
|
6
|
+
"fsn1",
|
|
7
|
+
"nbg1",
|
|
8
|
+
"hel1",
|
|
9
|
+
"ash",
|
|
10
|
+
"hil",
|
|
11
|
+
];
|
|
12
|
+
export const HETZNER_SERVER_TYPES = [
|
|
13
|
+
"cx11",
|
|
14
|
+
"cx21",
|
|
15
|
+
"cx31",
|
|
16
|
+
"cx41",
|
|
17
|
+
"cx51",
|
|
18
|
+
"cax11",
|
|
19
|
+
"cax21",
|
|
20
|
+
"cax31",
|
|
21
|
+
"cax41",
|
|
22
|
+
];
|
|
23
|
+
const HCLOUD_API_BASE = "https://api.hetzner.cloud/v1";
|
|
24
|
+
const getToken = (token) => {
|
|
25
|
+
const resolved = token ||
|
|
26
|
+
process.env.HCLOUD_TOKEN ||
|
|
27
|
+
process.env.HETZNER_TOKEN ||
|
|
28
|
+
process.env.HETZNER_CLOUD_TOKEN;
|
|
29
|
+
if (!resolved) {
|
|
30
|
+
throw new Error("Missing Hetzner Cloud API token. Provide --token or set HCLOUD_TOKEN.");
|
|
31
|
+
}
|
|
32
|
+
return resolved;
|
|
33
|
+
};
|
|
34
|
+
const setupUserData = (email, grantAccess = [], serverVersion) => {
|
|
35
|
+
const peerIdStrings = grantAccess.map((x) => x.toString());
|
|
36
|
+
const grantArgs = peerIdStrings.map((key) => `--ga ${key}`).join(" ");
|
|
37
|
+
const versionSpec = serverVersion ? `@${serverVersion}` : "";
|
|
38
|
+
// better-sqlite3 forces users to install build-essentials for `make` command
|
|
39
|
+
return `#!/bin/bash
|
|
40
|
+
set -e
|
|
41
|
+
cd /root
|
|
42
|
+
curl -fsSL https://deb.nodesource.com/setup_22.x | bash - &&\
|
|
43
|
+
apt-get install -y nodejs
|
|
44
|
+
apt-get install -y build-essential
|
|
45
|
+
npm install -g @peerbit/server${versionSpec}
|
|
46
|
+
peerbit domain test --email ${email}
|
|
47
|
+
peerbit start ${grantArgs} > log.txt 2>&1 &
|
|
48
|
+
`;
|
|
49
|
+
};
|
|
50
|
+
const createHcloudClient = async (token) => {
|
|
51
|
+
const { default: axios } = await import("axios");
|
|
52
|
+
return axios.create({
|
|
53
|
+
baseURL: HCLOUD_API_BASE,
|
|
54
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
55
|
+
timeout: 60_000,
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
const parseAxiosError = (error) => {
|
|
59
|
+
const status = error?.response?.status;
|
|
60
|
+
const data = error?.response?.data;
|
|
61
|
+
const message = error?.message || String(error);
|
|
62
|
+
if (!status) {
|
|
63
|
+
return message;
|
|
64
|
+
}
|
|
65
|
+
const details = typeof data === "string"
|
|
66
|
+
? data
|
|
67
|
+
: data?.error?.message || JSON.stringify(data);
|
|
68
|
+
return `${message} (HTTP ${status})${details ? `: ${details}` : ""}`;
|
|
69
|
+
};
|
|
70
|
+
const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
71
|
+
const getHighestNameCounter = (servers, prefix) => {
|
|
72
|
+
const pattern = new RegExp(`^${escapeRegExp(prefix)}-(\\d+)$`);
|
|
73
|
+
let max = 0;
|
|
74
|
+
for (const server of servers) {
|
|
75
|
+
const match = server.name.match(pattern);
|
|
76
|
+
if (!match)
|
|
77
|
+
continue;
|
|
78
|
+
const n = Number(match[1]);
|
|
79
|
+
if (Number.isFinite(n)) {
|
|
80
|
+
max = Math.max(max, n);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return max;
|
|
84
|
+
};
|
|
85
|
+
const waitForServerPublicIp = async (client, serverId, timeoutMs = 3 * 60 * 1000, pollIntervalMs = 5000) => {
|
|
86
|
+
const start = Date.now();
|
|
87
|
+
while (Date.now() - start < timeoutMs) {
|
|
88
|
+
try {
|
|
89
|
+
const info = await client.get(`/servers/${serverId}`);
|
|
90
|
+
const server = info.data?.server;
|
|
91
|
+
const ip = server?.public_net?.ipv4?.ip;
|
|
92
|
+
if (ip) {
|
|
93
|
+
return ip;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error?.response?.status !== 404 && error?.response?.status !== 429) {
|
|
98
|
+
throw new Error(`Failed while waiting for Hetzner server ${serverId} IP: ${parseAxiosError(error)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
await delay(pollIntervalMs);
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`Timed out waiting for Hetzner server ${serverId} to get a public IPv4`);
|
|
104
|
+
};
|
|
105
|
+
export const launchNodes = async (properties) => {
|
|
106
|
+
if (properties.count && properties.count > 10) {
|
|
107
|
+
throw new Error("Unexpected node launch count: " +
|
|
108
|
+
properties.count +
|
|
109
|
+
". To prevent unwanted behaviour you can also launch 10 nodes at once");
|
|
110
|
+
}
|
|
111
|
+
const count = properties.count || 1;
|
|
112
|
+
const token = getToken(properties.token);
|
|
113
|
+
const client = await createHcloudClient(token);
|
|
114
|
+
const location = properties.location || "fsn1";
|
|
115
|
+
const serverType = properties.serverType || "cx11";
|
|
116
|
+
const image = properties.image || "ubuntu-22.04";
|
|
117
|
+
const namePrefix = properties.namePrefix || "peerbit-node";
|
|
118
|
+
const existingServers = (await client.get("/servers")).data?.servers;
|
|
119
|
+
const existingCounter = getHighestNameCounter(existingServers || [], namePrefix);
|
|
120
|
+
const created = [];
|
|
121
|
+
for (let ix = 1; ix <= count; ix++) {
|
|
122
|
+
const name = `${namePrefix}-${existingCounter + ix}`;
|
|
123
|
+
try {
|
|
124
|
+
const resp = await client.post("/servers", {
|
|
125
|
+
name,
|
|
126
|
+
server_type: serverType,
|
|
127
|
+
image,
|
|
128
|
+
location,
|
|
129
|
+
user_data: setupUserData(properties.email, properties.grantAccess, properties.serverVersion),
|
|
130
|
+
});
|
|
131
|
+
const serverId = resp.data?.server?.id;
|
|
132
|
+
if (!serverId) {
|
|
133
|
+
throw new Error("Missing server id in Hetzner response");
|
|
134
|
+
}
|
|
135
|
+
created.push({ serverId, name });
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
throw new Error(`Failed to create Hetzner server '${name}': ${parseAxiosError(error)}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const nodes = [];
|
|
142
|
+
for (const { serverId, name } of created) {
|
|
143
|
+
const publicIp = await waitForServerPublicIp(client, serverId);
|
|
144
|
+
nodes.push({ serverId, publicIp, name, location });
|
|
145
|
+
}
|
|
146
|
+
return nodes;
|
|
147
|
+
};
|
|
148
|
+
export const terminateNode = async (properties) => {
|
|
149
|
+
const token = getToken(properties.token);
|
|
150
|
+
const client = await createHcloudClient(token);
|
|
151
|
+
try {
|
|
152
|
+
await client.delete(`/servers/${properties.serverId}`);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (error?.response?.status === 404) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
throw new Error(`Failed to terminate Hetzner server ${properties.serverId}: ${parseAxiosError(error)}`);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=hetzner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hetzner.js","sourceRoot":"","sources":["../../src/hetzner.ts"],"names":[],"mappings":"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"}
|
package/dist/src/remotes.d.ts
CHANGED
|
@@ -3,7 +3,12 @@ interface AWSOrigin {
|
|
|
3
3
|
region: string;
|
|
4
4
|
instanceId: string;
|
|
5
5
|
}
|
|
6
|
-
|
|
6
|
+
interface HetznerOrigin {
|
|
7
|
+
type: "hetzner";
|
|
8
|
+
location: string;
|
|
9
|
+
serverId: number;
|
|
10
|
+
}
|
|
11
|
+
export type RemoteOrigin = AWSOrigin | HetznerOrigin;
|
|
7
12
|
export declare const DEFAULT_REMOTE_GROUP = "default";
|
|
8
13
|
export interface RemoteObject {
|
|
9
14
|
address: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remotes.d.ts","sourceRoot":"","sources":["../../src/remotes.ts"],"names":[],"mappings":"AAEA,UAAU,SAAS;IAClB,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"remotes.d.ts","sourceRoot":"","sources":["../../src/remotes.ts"],"names":[],"mappings":"AAEA,UAAU,SAAS;IAClB,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,aAAa;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,aAAa,CAAC;AAErD,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,qBAAa,OAAO;IAGP,QAAQ,CAAC,IAAI,EAAE,MAAM;IAFjC,OAAO,CAAC,IAAI,CAAgB;gBAEP,IAAI,EAAE,MAAM;IAYjC,IAAI;IAIJ,SAAS,CAAC,IAAI,EAAE,MAAM;IAItB,UAAU,CAAC,KAAK,EAAE,MAAM;IAIxB,YAAY,CAAC,OAAO,EAAE,MAAM;IAI5B,GAAG,CAAC,MAAM,EAAE,YAAY;IAUxB,MAAM,CAAC,IAAI,EAAE,MAAM;IASb,GAAG,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;CAGpC"}
|
package/dist/src/remotes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remotes.js","sourceRoot":"","sources":["../../src/remotes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"remotes.js","sourceRoot":"","sources":["../../src/remotes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAgBpB,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAa9C,MAAM,OAAO,OAAO;IAGE;IAFb,IAAI,CAAgB;IAE5B,YAAqB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAChC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CACrB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACtB,CAAC;QACpB,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,IAAI,GAAG;gBACX,OAAO,EAAE,EAAE;aACX,CAAC;QACH,CAAC;IACF,CAAC;IAED,IAAI;QACH,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,SAAS,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,UAAU,CAAC,KAAa;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,YAAY,CAAC,OAAe;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,GAAG,CAAC,MAAoB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5E,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;QACtC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED,MAAM,CAAC,IAAY;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACrE,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC1B,CAAC;CACD"}
|