@peerbit/server 5.9.5 → 5.10.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.
@@ -1,41 +1,131 @@
1
1
  import { delay, waitFor } from "@peerbit/time";
2
- export const installDocker = async () => {
2
+ const execCommand = async (cmd) => {
3
3
  const { exec } = await import("child_process");
4
- // check if docker is installed
5
- const dockerExist = async () => {
6
- try {
7
- await new Promise((resolve, reject) => {
8
- exec("docker --version", (error, stdout, stderr) => {
9
- if (error || stderr) {
10
- reject();
11
- }
12
- resolve(stdout);
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 waitFor(() => dockerExist(), {
32
- timeout: 30 * 1000,
33
- delayInterval: 1000,
34
- });
61
+ await execCommand(`${sudoPrefix}snap start docker`);
35
62
  }
36
- catch (error) {
37
- throw new Error("Failed to install docker");
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) => {
@@ -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;AAE/C,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;IACvC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAE/C,+BAA+B;IAC/B,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;QAC9B,IAAI,CAAC;YACJ,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;oBAClD,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;wBACrB,MAAM,EAAE,CAAC;oBACV,CAAC;oBACD,OAAO,CAAC,MAAM,CAAC,CAAC;gBACjB,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC,CAAC;IAEF,IAAI,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,0BAA0B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBAC1D,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;oBACrB,MAAM,EAAE,CAAC;gBACV,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACJ,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE;gBAClC,OAAO,EAAE,EAAE,GAAG,IAAI;gBAClB,aAAa,EAAE,IAAI;aACnB,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC7C,CAAC;IACF,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,GAAW,EAAE,YAAqB,EAAE,EAAE;IAC1E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,GAAG,EAAE,CAC3B,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,KAAK,EAAE,CAAC;gBACX,MAAM,CACL,CAAC,YAAY,IAAI,oCAAoC,CAAC;oBACrD,KAAK,CAAC,OAAO,CACd,CAAC;YACH,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IACJ,IAAI,CAAC;QACJ,MAAM,cAAc,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,4BAA4B;QAC5B,KAAK;QACL,2FAA2F;QAC3F,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,cAAc,EAAE,CAAC;IACxB,CAAC;AACF,CAAC,CAAC"}
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hetzner.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hetzner.browser.d.ts","sourceRoot":"","sources":["../../src/hetzner.browser.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export {};
2
+ // Unsupported
3
+ //# sourceMappingURL=hetzner.browser.js.map
@@ -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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"}
@@ -3,7 +3,12 @@ interface AWSOrigin {
3
3
  region: string;
4
4
  instanceId: string;
5
5
  }
6
- export type RemoteOrigin = AWSOrigin;
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;AAErC,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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"remotes.js","sourceRoot":"","sources":["../../src/remotes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAUpB,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"}
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"}