@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 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
- const head = await client.send(new HeadObjectCommand({ Bucket: bucket, Key: key }));
2155
- const size = head.ContentLength || 0;
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
- const result = await client.send(new GetObjectCommand({ Bucket: bucket, Key: key }));
2160
- const body = result.Body;
2161
- if (!body?.transformToString) throw new Error("R2 returned no readable body");
2162
- return body.transformToString();
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
- const head = await client.send(new HeadObjectCommand({ Bucket: bucket, Key: key }));
2167
- const size = head.ContentLength || 0;
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
- const result = await client.send(new GetObjectCommand({
2174
- Bucket: bucket,
2175
- Key: key,
2176
- Range: `bytes=${range.offset}-${end}`
2177
- }));
2178
- const body = result.Body;
2179
- if (!body?.transformToString) throw new Error("R2 returned no readable body");
2180
- const text = await body.transformToString();
2181
- const header = `# range: bytes ${range.offset}-${end} of ${size} (${effectiveLen} bytes)`;
2182
- return `${header}
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
- await client.send(new PutObjectCommand({
2188
- Bucket: bucket,
2189
- Key: key,
2190
- Body: body,
2191
- ContentLength: contentLength,
2192
- ContentType: "application/octet-stream"
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
- await client.send(new DeleteObjectCommand({ Bucket: bucket, Key: key }));
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();