@taleshape/shaper 0.1.1 → 0.1.3

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/bin/SHA256SUMS ADDED
@@ -0,0 +1,4 @@
1
+ 3da468d156101dd6e822f68bd824c8bf886f66c7b612dac02f8b4a94e591bead shaper-linux-arm64
2
+ 47a702931428bbbe36bdb889340daeeee564eea6dc601a46bd4ca0402dc055aa shaper-darwin-amd64
3
+ da2a4bb02f9613775c35bc20cb32164303fa39cb4244852d48570f7cb1cfa7a3 shaper-darwin-arm64
4
+ f7248e7fd8c0efafe9b91d81ed528d3f76c2be6dc2ff2227be7276b4f5fbafc6 shaper-linux-amd64
package/bin/shaper ADDED
@@ -0,0 +1,8 @@
1
+ #!/bin/sh
2
+
3
+ # Get the directory where the script is located
4
+ SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
5
+ BINARY="$SCRIPT_DIR/bin/shaper"
6
+
7
+ # Execute the binary with all arguments
8
+ exec "$BINARY" "$@"
package/install.js CHANGED
@@ -1,6 +1,7 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
3
  const os = require('os');
4
+ const crypto = require('crypto');
4
5
  const axios = require('axios');
5
6
 
6
7
  const BIN_DIR = path.join(__dirname, 'bin');
@@ -30,11 +31,9 @@ async function getRelease(version) {
30
31
  return response.data;
31
32
  } catch (error) {
32
33
  if (error.response?.status === 404) {
33
- console.error(`Version v${version} not found. Please check if this version exists in the releases.`);
34
- } else {
35
- console.error('Error fetching release:', error.message);
34
+ throw new Error(`Version v${version} not found. Please check if this version exists in the releases.`);
36
35
  }
37
- process.exit(1);
36
+ throw new Error(`Error fetching release: ${error.message}`);
38
37
  }
39
38
  }
40
39
 
@@ -42,7 +41,9 @@ async function downloadFile(url, dest) {
42
41
  const response = await axios({
43
42
  method: 'GET',
44
43
  url: url,
45
- responseType: 'stream'
44
+ responseType: 'stream',
45
+ maxContentLength: 100 * 1024 * 1024, // 100MB max
46
+ validateStatus: status => status === 200
46
47
  });
47
48
 
48
49
  const writer = fs.createWriteStream(dest);
@@ -51,40 +52,94 @@ async function downloadFile(url, dest) {
51
52
  return new Promise((resolve, reject) => {
52
53
  writer.on('finish', resolve);
53
54
  writer.on('error', reject);
55
+ response.data.on('error', reject);
54
56
  });
55
57
  }
56
58
 
57
- async function main() {
58
- // Create bin directory if it doesn't exist
59
- if (!fs.existsSync(BIN_DIR)) {
60
- fs.mkdirSync(BIN_DIR, { recursive: true });
61
- }
59
+ function calculateSHA256(filePath) {
60
+ return new Promise((resolve, reject) => {
61
+ const hash = crypto.createHash('sha256');
62
+ const stream = fs.createReadStream(filePath);
63
+
64
+ stream.on('error', err => reject(err));
65
+ stream.on('data', chunk => hash.update(chunk));
66
+ stream.on('end', () => resolve(hash.digest('hex')));
67
+ });
68
+ }
62
69
 
63
- const platform = `${process.platform}-${process.arch}`;
64
- const assetName = PLATFORM_MAP[platform];
70
+ async function verifyChecksum(filePath, expectedChecksum) {
71
+ const actualChecksum = await calculateSHA256(filePath);
72
+ if (actualChecksum !== expectedChecksum) {
73
+ throw new Error(`Checksum verification failed for ${path.basename(filePath)}\nExpected: ${expectedChecksum}\nActual: ${actualChecksum}`);
74
+ }
75
+ }
65
76
 
66
- if (!assetName) {
67
- console.error(`Unsupported platform: ${platform}`);
68
- process.exit(1);
77
+ function loadChecksums() {
78
+ const checksumsPath = path.join(__dirname, 'bin', 'SHA256SUMS');
79
+ if (!fs.existsSync(checksumsPath)) {
80
+ throw new Error('SHA256SUMS file not found in package');
69
81
  }
70
82
 
83
+ const checksumsContent = fs.readFileSync(checksumsPath, 'utf8');
84
+ const checksums = {};
85
+ checksumsContent.split('\n').forEach(line => {
86
+ if (line.trim()) {
87
+ const [checksum, filename] = line.split(/\s+/);
88
+ checksums[filename] = checksum;
89
+ }
90
+ });
91
+
92
+ return checksums;
93
+ }
94
+
95
+ async function main() {
71
96
  try {
97
+ // Create bin directory if it doesn't exist
98
+ if (!fs.existsSync(BIN_DIR)) {
99
+ fs.mkdirSync(BIN_DIR, { recursive: true });
100
+ }
101
+
102
+ const platform = `${process.platform}-${process.arch}`;
103
+ const assetName = PLATFORM_MAP[platform];
104
+
105
+ if (!assetName) {
106
+ throw new Error(`Unsupported platform: ${platform}`);
107
+ }
108
+
109
+ // Load checksums from the package
110
+ console.log('Loading checksums...');
111
+ const checksums = loadChecksums();
112
+ const expectedChecksum = checksums[assetName];
113
+
114
+ if (!expectedChecksum) {
115
+ throw new Error(`No checksum found for ${assetName} in SHA256SUMS`);
116
+ }
117
+
72
118
  const release = await getRelease(VERSION);
73
119
  const asset = release.assets.find(a => a.name === assetName);
74
120
 
75
121
  if (!asset) {
76
- console.error(`Asset not found for platform ${platform} in version v${VERSION}`);
77
- process.exit(1);
122
+ throw new Error(`Asset not found for platform ${platform} in version v${VERSION}`);
78
123
  }
79
124
 
80
125
  console.log(`Downloading shaper v${VERSION} for ${platform}...`);
81
126
  const binaryPath = path.join(BIN_DIR, 'shaper');
82
127
  await downloadFile(asset.browser_download_url, binaryPath);
128
+
129
+ // Verify checksum
130
+ console.log('Verifying checksum...');
131
+ await verifyChecksum(binaryPath, expectedChecksum);
132
+ console.log('Checksum verified successfully');
133
+
134
+ // Set executable permissions
83
135
  fs.chmodSync(binaryPath, '755');
84
136
 
85
137
  console.log('Installation complete!');
86
138
  } catch (error) {
87
- console.error('Installation failed:', error);
139
+ console.error('Installation failed:', error.message);
140
+ // Clean up binary if verification failed
141
+ const binaryPath = path.join(BIN_DIR, 'shaper');
142
+ if (fs.existsSync(binaryPath)) fs.unlinkSync(binaryPath);
88
143
  process.exit(1);
89
144
  }
90
145
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@taleshape/shaper",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Minimal Embedded Analytics and Data Platform",
5
5
  "main": "index.js",
6
6
  "bin": {
7
- "shaper": "./shaper.js"
7
+ "shaper": "./bin/shaper"
8
8
  },
9
9
  "scripts": {
10
10
  "postinstall": "node install.js",
package/shaper.js DELETED
@@ -1,20 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const path = require('path');
4
- const { spawn } = require('child_process');
5
-
6
- const binaryPath = path.join(__dirname, 'bin', 'shaper');
7
-
8
- // Forward all arguments to the binary
9
- const args = process.argv.slice(2);
10
-
11
- // Spawn the binary with the forwarded arguments
12
- const child = spawn(binaryPath, args, {
13
- stdio: 'inherit',
14
- shell: false
15
- });
16
-
17
- // Forward the exit code
18
- child.on('exit', (code) => {
19
- process.exit(code);
20
- });