cloudbridge-sdk
Version:
CloudBridge Node.js + TypeScript SDK (simple file upload)
121 lines (116 loc) • 4.35 kB
JavaScript
;
var axios = require('axios');
var crypto = require('crypto');
var fs = require('fs');
var path = require('path');
var FormData = require('form-data');
var mimeTypes = require('mime-types');
var http = require('http');
var https = require('https');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var axios__default = /*#__PURE__*/_interopDefault(axios);
var fs__default = /*#__PURE__*/_interopDefault(fs);
var path__default = /*#__PURE__*/_interopDefault(path);
var FormData__default = /*#__PURE__*/_interopDefault(FormData);
// src/index.ts
var CloudBridgeError = class extends Error {
status;
statusCode;
errors;
constructor(message, opts) {
super(message);
this.name = "CloudBridgeError";
this.status = opts?.status;
this.statusCode = opts?.statusCode;
this.errors = opts?.errors;
}
};
var CloudBridgeClient = class _CloudBridgeClient {
static BASE_URL = "https://api.cloudbridge.nugitech.com";
accessKey;
secretKey;
axios;
constructor(options) {
const envAccess = process.env.CLOUDBRIDGE_ACCESS_KEY;
const envSecret = process.env.CLOUDBRIDGE_SECRET_KEY;
this.accessKey = options?.accessKey ?? envAccess;
this.secretKey = options?.secretKey ?? envSecret;
const httpAgent = new http.Agent({ keepAlive: true });
const httpsAgent = new https.Agent({ keepAlive: true });
this.axios = axios__default.default.create({
baseURL: _CloudBridgeClient.BASE_URL,
timeout: options?.timeoutMs ?? 6e4,
httpAgent,
httpsAgent,
// Allow reading structured error responses without axios throwing
validateStatus: (status) => status >= 200 && status < 600,
maxBodyLength: Infinity,
maxContentLength: Infinity
});
}
async uploadFiles(filePaths, opts) {
if (!Array.isArray(filePaths) || filePaths.length === 0) {
throw new CloudBridgeError("filePaths must be a non-empty array of paths");
}
if (!opts?.folder) {
throw new CloudBridgeError("opts.folder is required");
}
if (!this.accessKey || !this.secretKey) {
throw new CloudBridgeError(
"Missing credentials: accessKey and secretKey are required (via constructor or environment)",
{ status: "error" }
);
}
const signature = crypto.createHmac("sha256", this.secretKey).update(this.accessKey).digest("hex");
const form = new FormData__default.default();
form.append("folder", opts.folder);
for (const filePath of filePaths) {
const stream = fs__default.default.createReadStream(filePath);
const filename = path__default.default.basename(filePath);
const contentType = mimeTypes.lookup(filePath) || void 0;
form.append("files", stream, { filename, contentType });
}
const headers = {
...form.getHeaders(),
"x-access-key": this.accessKey,
"x-signature": signature
};
const url = `${_CloudBridgeClient.BASE_URL}/api/v1/public/upload`;
try {
const response = await this.axios.post(url, form, { headers });
const data = response.data;
if (data && data.status === "success" && data.data?.files) {
return data.data.files;
}
if (data && data.status === "error") {
const message = data.message || `Request failed with status ${response.status}`;
throw new CloudBridgeError(message, {
status: data.status,
statusCode: response.status,
errors: data.errors
});
}
throw new CloudBridgeError(`Unexpected response (status ${response.status})`);
} catch (err) {
if (err instanceof CloudBridgeError) {
throw err;
}
const anyErr = err;
const statusCode = anyErr?.response?.status;
const data = anyErr?.response?.data;
if (data && data.status === "error") {
throw new CloudBridgeError(data.message || "Request failed", {
status: data.status,
statusCode,
errors: data.errors
});
}
const message = anyErr?.message || `Request failed${statusCode ? ` with status ${statusCode}` : ""}`;
throw new CloudBridgeError(message, { statusCode });
}
}
};
exports.CloudBridgeClient = CloudBridgeClient;
exports.CloudBridgeError = CloudBridgeError;
//# sourceMappingURL=index.cjs.map
//# sourceMappingURL=index.cjs.map