@mgsoftwarebv/mg-dashboard-mcp 3.10.1 → 3.10.2
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/index.js +63 -26
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2149,52 +2149,89 @@ async function r2List(bucket, prefix, options) {
|
|
|
2149
2149
|
} while (continuationToken && entries.length < options.maxResults);
|
|
2150
2150
|
return entries;
|
|
2151
2151
|
}
|
|
2152
|
+
function r2WrapError(bucket, key, e) {
|
|
2153
|
+
const err = e;
|
|
2154
|
+
const status = err?.$metadata?.httpStatusCode;
|
|
2155
|
+
const name = err?.name || "";
|
|
2156
|
+
if (name === "NoSuchKey" || name === "NotFound" || status === 404) {
|
|
2157
|
+
return new Error(`r2://${bucket}/${key} not found`);
|
|
2158
|
+
}
|
|
2159
|
+
if (name === "NoSuchBucket") return new Error(`R2 bucket "${bucket}" not found`);
|
|
2160
|
+
if (status === 403 || name === "AccessDenied") return new Error(`Access denied for r2://${bucket}/${key} (check R2_ACCESS_KEY_ID / R2_SECRET_ACCESS_KEY)`);
|
|
2161
|
+
return new Error(`R2 error (${name || "unknown"}${status ? ` ${status}` : ""}): ${err?.message || String(e)}`);
|
|
2162
|
+
}
|
|
2152
2163
|
async function r2GetObject(bucket, key, maxBytes) {
|
|
2153
2164
|
const client = getR2Client();
|
|
2154
|
-
|
|
2155
|
-
|
|
2165
|
+
let size = 0;
|
|
2166
|
+
try {
|
|
2167
|
+
const head = await client.send(new HeadObjectCommand({ Bucket: bucket, Key: key }));
|
|
2168
|
+
size = head.ContentLength || 0;
|
|
2169
|
+
} catch (e) {
|
|
2170
|
+
throw r2WrapError(bucket, key, e);
|
|
2171
|
+
}
|
|
2156
2172
|
if (size > maxBytes) {
|
|
2157
2173
|
throw new Error(`Object too large: ${size} bytes (max ${maxBytes} for inline read; use sftp-write with sourcePath to mirror locally instead, or pass { offset, length } for a ranged read)`);
|
|
2158
2174
|
}
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2175
|
+
try {
|
|
2176
|
+
const result = await client.send(new GetObjectCommand({ Bucket: bucket, Key: key }));
|
|
2177
|
+
const body = result.Body;
|
|
2178
|
+
if (!body?.transformToString) throw new Error("R2 returned no readable body");
|
|
2179
|
+
return await body.transformToString();
|
|
2180
|
+
} catch (e) {
|
|
2181
|
+
throw r2WrapError(bucket, key, e);
|
|
2182
|
+
}
|
|
2163
2183
|
}
|
|
2164
2184
|
async function r2GetObjectRange(bucket, key, range) {
|
|
2165
2185
|
const client = getR2Client();
|
|
2166
|
-
|
|
2167
|
-
|
|
2186
|
+
let size = 0;
|
|
2187
|
+
try {
|
|
2188
|
+
const head = await client.send(new HeadObjectCommand({ Bucket: bucket, Key: key }));
|
|
2189
|
+
size = head.ContentLength || 0;
|
|
2190
|
+
} catch (e) {
|
|
2191
|
+
throw r2WrapError(bucket, key, e);
|
|
2192
|
+
}
|
|
2168
2193
|
if (range.offset >= size && size > 0) throw new Error(`offset ${range.offset} is past end of object (size ${size})`);
|
|
2169
2194
|
const MAX = 1048576;
|
|
2170
2195
|
const remaining = Math.max(0, size - range.offset);
|
|
2171
2196
|
const effectiveLen = range.length !== void 0 ? Math.min(range.length, remaining, MAX) : Math.min(remaining, MAX);
|
|
2172
2197
|
const end = range.offset + effectiveLen - 1;
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2198
|
+
try {
|
|
2199
|
+
const result = await client.send(new GetObjectCommand({
|
|
2200
|
+
Bucket: bucket,
|
|
2201
|
+
Key: key,
|
|
2202
|
+
Range: `bytes=${range.offset}-${end}`
|
|
2203
|
+
}));
|
|
2204
|
+
const body = result.Body;
|
|
2205
|
+
if (!body?.transformToString) throw new Error("R2 returned no readable body");
|
|
2206
|
+
const text = await body.transformToString();
|
|
2207
|
+
const header = `# range: bytes ${range.offset}-${end} of ${size} (${effectiveLen} bytes)`;
|
|
2208
|
+
return `${header}
|
|
2183
2209
|
${text}`;
|
|
2210
|
+
} catch (e) {
|
|
2211
|
+
throw r2WrapError(bucket, key, e);
|
|
2212
|
+
}
|
|
2184
2213
|
}
|
|
2185
2214
|
async function r2PutObject(bucket, key, body, contentLength) {
|
|
2186
2215
|
const client = getR2Client();
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2216
|
+
try {
|
|
2217
|
+
await client.send(new PutObjectCommand({
|
|
2218
|
+
Bucket: bucket,
|
|
2219
|
+
Key: key,
|
|
2220
|
+
Body: body,
|
|
2221
|
+
ContentLength: contentLength,
|
|
2222
|
+
ContentType: "application/octet-stream"
|
|
2223
|
+
}));
|
|
2224
|
+
} catch (e) {
|
|
2225
|
+
throw r2WrapError(bucket, key, e);
|
|
2226
|
+
}
|
|
2194
2227
|
}
|
|
2195
2228
|
async function r2DeleteObject(bucket, key) {
|
|
2196
2229
|
const client = getR2Client();
|
|
2197
|
-
|
|
2230
|
+
try {
|
|
2231
|
+
await client.send(new DeleteObjectCommand({ Bucket: bucket, Key: key }));
|
|
2232
|
+
} catch (e) {
|
|
2233
|
+
throw r2WrapError(bucket, key, e);
|
|
2234
|
+
}
|
|
2198
2235
|
}
|
|
2199
2236
|
async function r2DeletePrefix(bucket, prefix) {
|
|
2200
2237
|
const client = getR2Client();
|