@rstreamlabs/rstream-cli 1.0.0 → 1.1.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.
- package/README.md +3 -0
- package/package.json +11 -24
- package/dist/install.js +0 -201
package/README.md
ADDED
package/package.json
CHANGED
|
@@ -1,32 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rstreamlabs/rstream-cli",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Command-line interface for rstream.",
|
|
5
5
|
"author": "@uartnet <hello@rstream.io>",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"homepage": "https://rstream.io",
|
|
8
|
-
"keywords": [
|
|
9
|
-
"networking",
|
|
10
|
-
"enterprise",
|
|
11
|
-
"secure",
|
|
12
|
-
"scalable",
|
|
13
|
-
"serverless",
|
|
14
|
-
"developpers",
|
|
15
|
-
"devops",
|
|
16
|
-
"sysadmins",
|
|
17
|
-
"infrastructure",
|
|
18
|
-
"cloud"
|
|
19
|
-
],
|
|
20
8
|
"main": "dist/main.js",
|
|
21
9
|
"bin": {
|
|
22
10
|
"rstream": "dist/main.js"
|
|
23
11
|
},
|
|
24
12
|
"files": [
|
|
25
|
-
"dist"
|
|
13
|
+
"dist",
|
|
14
|
+
"README.md"
|
|
26
15
|
],
|
|
27
16
|
"scripts": {
|
|
28
17
|
"format": "prettier --write \"**/*.{ts,tsx,md}\"",
|
|
29
|
-
"install": "
|
|
18
|
+
"install": "rstream-installer",
|
|
30
19
|
"prepack": "bash -c \"! [[ -d dist ]] || rm -r dist\" && tsc",
|
|
31
20
|
"type-check": "tsc --noEmit"
|
|
32
21
|
},
|
|
@@ -34,18 +23,16 @@
|
|
|
34
23
|
"engines": {
|
|
35
24
|
"node": ">=12"
|
|
36
25
|
},
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"tar": "^7.4.3"
|
|
40
|
-
},
|
|
41
|
-
"rstream": {
|
|
26
|
+
"@rstreamlabs/installer": {
|
|
27
|
+
"name": "rstream",
|
|
42
28
|
"channel": "stable",
|
|
43
29
|
"registry": "https://rstream.io"
|
|
44
30
|
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@rstreamlabs/installer": "^1.0.2"
|
|
33
|
+
},
|
|
45
34
|
"devDependencies": {
|
|
46
|
-
"@types/
|
|
47
|
-
"@types/node": "^22.15.21",
|
|
48
|
-
"@types/tar": "^6.1.13",
|
|
35
|
+
"@types/node": "^22.15.28",
|
|
49
36
|
"prettier": "^3.5.3",
|
|
50
37
|
"tsx": "4.19.4",
|
|
51
38
|
"typescript": "^5.8.3"
|
package/dist/install.js
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { createGunzip } from "node:zlib";
|
|
3
|
-
import AdmZip from "adm-zip";
|
|
4
|
-
import fs from "fs";
|
|
5
|
-
import https from "https";
|
|
6
|
-
import os from "os";
|
|
7
|
-
import path from "path";
|
|
8
|
-
import * as tar from "tar";
|
|
9
|
-
const name = "rstream";
|
|
10
|
-
const npm_package_json = process.env.npm_package_json;
|
|
11
|
-
if (npm_package_json === undefined) {
|
|
12
|
-
console.error("npm_package_json environment variable is not set. Please run this script from an npm script.");
|
|
13
|
-
process.exit(1);
|
|
14
|
-
}
|
|
15
|
-
const dirname = path.dirname(npm_package_json);
|
|
16
|
-
const config = JSON.parse(fs.readFileSync(path.resolve(npm_package_json), "utf8"));
|
|
17
|
-
const channel = config.rstream.channel;
|
|
18
|
-
const version = config.version;
|
|
19
|
-
const registry = config.rstream.registry;
|
|
20
|
-
function getOS() {
|
|
21
|
-
const platform = os.platform();
|
|
22
|
-
switch (platform) {
|
|
23
|
-
case "win32":
|
|
24
|
-
return "windows";
|
|
25
|
-
case "darwin":
|
|
26
|
-
return "macos";
|
|
27
|
-
case "linux":
|
|
28
|
-
return "linux";
|
|
29
|
-
case "freebsd":
|
|
30
|
-
return "freebsd";
|
|
31
|
-
case "netbsd":
|
|
32
|
-
return "netbsd";
|
|
33
|
-
case "openbsd":
|
|
34
|
-
return "openbsd";
|
|
35
|
-
default:
|
|
36
|
-
throw new Error(`Unsupported platform '${platform}'`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
function getArch() {
|
|
40
|
-
const machine = os.arch();
|
|
41
|
-
switch (machine) {
|
|
42
|
-
case "ppc64":
|
|
43
|
-
return "ppc64";
|
|
44
|
-
case "mips":
|
|
45
|
-
return "mips";
|
|
46
|
-
case "mipsel":
|
|
47
|
-
return "mipsle";
|
|
48
|
-
case "arm":
|
|
49
|
-
return "armv6";
|
|
50
|
-
case "arm64":
|
|
51
|
-
return "arm64";
|
|
52
|
-
case "x64":
|
|
53
|
-
return "x86_64";
|
|
54
|
-
case "ia32":
|
|
55
|
-
return "x86_i686";
|
|
56
|
-
default:
|
|
57
|
-
throw new Error(`Unsupported architecture '${machine}'`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
async function getPackageId(registry, name, version, channel, os, arch) {
|
|
61
|
-
return new Promise((resolve, reject) => {
|
|
62
|
-
const url = `${registry}/api/packages?name=${name}&version=${version}&channel=${channel}&os=${os}&arch=${arch}&format=plain`;
|
|
63
|
-
https
|
|
64
|
-
.get(url, (response) => {
|
|
65
|
-
let data = "";
|
|
66
|
-
response.on("data", (chunk) => {
|
|
67
|
-
data += chunk;
|
|
68
|
-
});
|
|
69
|
-
response.on("end", () => {
|
|
70
|
-
if (response.statusCode === 200) {
|
|
71
|
-
const lines = data.split("\r\n");
|
|
72
|
-
if (lines.length > 0) {
|
|
73
|
-
const id = lines[0].split(":")[0];
|
|
74
|
-
resolve(id);
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
reject(new Error("No package ID found in the response"));
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
reject(new Error(`Failed to fetch package ID : ${response.statusCode}`));
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
})
|
|
85
|
-
.on("error", (err) => {
|
|
86
|
-
reject(err);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
async function download(url, dst, redirects = 5) {
|
|
91
|
-
return new Promise((resolve, reject) => {
|
|
92
|
-
if (redirects === 0) {
|
|
93
|
-
reject(new Error("Too many redirects"));
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
https
|
|
97
|
-
.get(url, async (response) => {
|
|
98
|
-
const location = response.headers.location;
|
|
99
|
-
if (location !== undefined) {
|
|
100
|
-
response.on("data", () => { });
|
|
101
|
-
response.on("end", async () => {
|
|
102
|
-
await download(location, dst, redirects - 1)
|
|
103
|
-
.then(resolve)
|
|
104
|
-
.catch(reject);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
else if (response.statusCode !== 200) {
|
|
108
|
-
reject(new Error(`Failed to download file : server responded with status code ${response.statusCode}`));
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
const file = fs.createWriteStream(dst);
|
|
112
|
-
file.on("error", (err) => {
|
|
113
|
-
file.close(() => {
|
|
114
|
-
reject(err);
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
file.on("finish", () => {
|
|
118
|
-
file.close(() => {
|
|
119
|
-
resolve();
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
response.pipe(file);
|
|
123
|
-
}
|
|
124
|
-
})
|
|
125
|
-
.on("error", (err) => {
|
|
126
|
-
reject(err);
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
function rmSync(dir) {
|
|
132
|
-
if (fs.existsSync(dir)) {
|
|
133
|
-
fs.readdirSync(dir).forEach((file) => {
|
|
134
|
-
const current = path.join(dir, file);
|
|
135
|
-
if (fs.lstatSync(current).isDirectory()) {
|
|
136
|
-
rmSync(current);
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
fs.unlinkSync(current);
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
fs.rmdirSync(dir);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
async function extract(src, dst) {
|
|
146
|
-
rmSync(dst);
|
|
147
|
-
fs.mkdirSync(dst, { recursive: true });
|
|
148
|
-
return new Promise((resolve, reject) => {
|
|
149
|
-
const extname = src.endsWith(".tar.gz") ? ".tar.gz" : path.extname(src);
|
|
150
|
-
if (extname === ".zip") {
|
|
151
|
-
return new Promise((resolve, reject) => {
|
|
152
|
-
try {
|
|
153
|
-
const zip = new AdmZip(src);
|
|
154
|
-
zip.extractAllTo(dst, true);
|
|
155
|
-
resolve();
|
|
156
|
-
}
|
|
157
|
-
catch (err) {
|
|
158
|
-
reject(err);
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
else if (extname === ".tar.gz") {
|
|
163
|
-
const extractor = tar.extract({ cwd: dst });
|
|
164
|
-
fs.createReadStream(src)
|
|
165
|
-
.pipe(createGunzip())
|
|
166
|
-
.pipe(extractor)
|
|
167
|
-
.on("error", reject);
|
|
168
|
-
extractor.on("finish", resolve);
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
reject(new Error(`Unsupported archive format '${extname}'`));
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
async function install() {
|
|
176
|
-
try {
|
|
177
|
-
const platform = getOS();
|
|
178
|
-
const arch = getArch();
|
|
179
|
-
const id = await getPackageId(registry, name, version, channel, platform, arch);
|
|
180
|
-
console.log("Installation summary :");
|
|
181
|
-
console.log(`Package name : ${name}`);
|
|
182
|
-
console.log(`Package version : ${version}`);
|
|
183
|
-
console.log(`Package channel : ${channel}`);
|
|
184
|
-
console.log(`OS : ${platform}`);
|
|
185
|
-
console.log(`Arch : ${arch}`);
|
|
186
|
-
console.log(`Package ID : ${id}`);
|
|
187
|
-
console.log(`Downloading and installing ${name} version '${version}'...`);
|
|
188
|
-
const url = `${registry}/api/packages/${id}/download`;
|
|
189
|
-
const dst = path.join(os.tmpdir(), `${name}-${version}-${os}-${arch}.${platform === "windows" ? "zip" : "tar.gz"}`);
|
|
190
|
-
await download(url, dst);
|
|
191
|
-
await extract(dst, path.resolve(dirname, "release"));
|
|
192
|
-
fs.unlinkSync(dst);
|
|
193
|
-
console.log(`Installation successful!`);
|
|
194
|
-
}
|
|
195
|
-
catch (err) {
|
|
196
|
-
console.error(`Installation failed : ${err}`);
|
|
197
|
-
process.exit(1);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
install();
|
|
201
|
-
export default install;
|