UNPKG

cloudbridge-sdk

Version:

CloudBridge Node.js + TypeScript SDK (simple file upload)

1 lines 8.69 kB
{"version":3,"sources":["../src/index.ts"],"names":["HttpAgent","HttpsAgent","axios","createHmac","FormData","fs","path","mimeLookup"],"mappings":";;;;;;;;;;;;;;;;;;;AA0BO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EAEA,WAAA,CAAY,SAAiB,IAAA,EAAmE;AAC9F,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,SAAS,IAAA,EAAM,MAAA;AACpB,IAAA,IAAA,CAAK,aAAa,IAAA,EAAM,UAAA;AACxB,IAAA,IAAA,CAAK,SAAS,IAAA,EAAM,MAAA;AAAA,EACtB;AACF;AAEO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA,EAC7B,OAAwB,QAAA,GAAW,sCAAA;AAAA,EAClB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EAEjB,YAAY,OAAA,EAAoC;AAC9C,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,sBAAA;AAC9B,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,sBAAA;AAE9B,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,SAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,SAAA;AAEvC,IAAA,MAAM,YAAY,IAAIA,UAAA,CAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,IAAA,MAAM,aAAa,IAAIC,WAAA,CAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAErD,IAAA,IAAA,CAAK,KAAA,GAAQC,uBAAM,MAAA,CAAO;AAAA,MACxB,SAAS,kBAAA,CAAkB,QAAA;AAAA,MAC3B,OAAA,EAAS,SAAS,SAAA,IAAa,GAAA;AAAA,MAC/B,SAAA;AAAA,MACA,UAAA;AAAA;AAAA,MAEA,cAAA,EAAgB,CAAC,MAAA,KAAW,MAAA,IAAU,OAAO,MAAA,GAAS,GAAA;AAAA,MACtD,aAAA,EAAe,QAAA;AAAA,MACf,gBAAA,EAAkB;AAAA,KACnB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CAAY,SAAA,EAAqB,IAAA,EAAqD;AAC1F,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,WAAW,CAAA,EAAG;AACvD,MAAA,MAAM,IAAI,iBAAiB,8CAA8C,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,MAAM,IAAI,iBAAiB,yBAAyB,CAAA;AAAA,IACtD;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,KAAK,SAAA,EAAW;AACtC,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,4FAAA;AAAA,QACA,EAAE,QAAQ,OAAA;AAAQ,OACpB;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAYC,iBAAA,CAAW,QAAA,EAAU,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAE1F,IAAA,MAAM,IAAA,GAAO,IAAIC,yBAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAEjC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,MAAA,GAASC,mBAAA,CAAG,gBAAA,CAAiB,QAAQ,CAAA;AAC3C,MAAA,MAAM,QAAA,GAAWC,qBAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AACvC,MAAA,MAAM,WAAA,GAAcC,gBAAA,CAAW,QAAQ,CAAA,IAAK,MAAA;AAC5C,MAAA,IAAA,CAAK,OAAO,OAAA,EAAS,MAAA,EAAQ,EAAE,QAAA,EAAU,aAAa,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,GAAG,KAAK,UAAA,EAAW;AAAA,MACnB,gBAAgB,IAAA,CAAK,SAAA;AAAA,MACrB,aAAA,EAAe;AAAA,KACjB;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,kBAAA,CAAkB,QAAQ,CAAA,qBAAA,CAAA;AAEzC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAK,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA;AAC7D,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AAOtB,MAAA,IAAI,QAAQ,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,MAAM,KAAA,EAAO;AACzD,QAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACnB;AAGA,MAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,OAAA,EAAS;AACnC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,CAAA,2BAAA,EAA8B,SAAS,MAAM,CAAA,CAAA;AAC7E,QAAA,MAAM,IAAI,iBAAiB,OAAA,EAAS;AAAA,UAClC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,YAAY,QAAA,CAAS,MAAA;AAAA,UACrB,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,4BAAA,EAA+B,QAAA,CAAS,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9E,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,eAAe,gBAAA,EAAkB;AACnC,QAAA,MAAM,GAAA;AAAA,MACR;AAEA,MAAA,MAAM,MAAA,GAAS,GAAA;AACf,MAAA,MAAM,UAAA,GAAiC,QAAQ,QAAA,EAAU,MAAA;AACzD,MAAA,MAAM,IAAA,GAAO,QAAQ,QAAA,EAAU,IAAA;AAG/B,MAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,OAAA,EAAS;AACnC,QAAA,MAAM,IAAI,gBAAA,CAAiB,IAAA,CAAK,OAAA,IAAW,gBAAA,EAAkB;AAAA,UAC3D,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,UAAA;AAAA,UACA,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA,cAAA,EAAiB,aAAa,CAAA,aAAA,EAAgB,UAAU,KAAK,EAAE,CAAA,CAAA;AAClG,MAAA,MAAM,IAAI,gBAAA,CAAiB,OAAA,EAAS,EAAE,YAAY,CAAA;AAAA,IACpD;AAAA,EACF;AACF","file":"index.cjs","sourcesContent":["import axios, { AxiosInstance } from \"axios\";\nimport { createHmac } from \"crypto\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport FormData from \"form-data\";\nimport { lookup as mimeLookup } from \"mime-types\";\nimport { Agent as HttpAgent } from \"http\";\nimport { Agent as HttpsAgent } from \"https\";\n\nexport type UploadFileItem = {\n id: string;\n filename: string;\n mime_type: string;\n size: number;\n public_url: string;\n short_url: string;\n nextcloud_path: string;\n created_at: string;\n};\n\nexport type CloudBridgeClientOptions = {\n accessKey?: string;\n secretKey?: string;\n timeoutMs?: number;\n};\n\nexport class CloudBridgeError extends Error {\n status?: string;\n statusCode?: number;\n errors?: unknown;\n\n constructor(message: string, opts?: { status?: string; statusCode?: number; errors?: unknown }) {\n super(message);\n this.name = \"CloudBridgeError\";\n this.status = opts?.status;\n this.statusCode = opts?.statusCode;\n this.errors = opts?.errors;\n }\n}\n\nexport class CloudBridgeClient {\n private static readonly BASE_URL = \"https://api.cloudbridge.nugitech.com\";\n private readonly accessKey?: string;\n private readonly secretKey?: string;\n private readonly axios: AxiosInstance;\n\n constructor(options?: CloudBridgeClientOptions) {\n const envAccess = process.env.CLOUDBRIDGE_ACCESS_KEY;\n const envSecret = process.env.CLOUDBRIDGE_SECRET_KEY;\n\n this.accessKey = options?.accessKey ?? envAccess;\n this.secretKey = options?.secretKey ?? envSecret;\n\n const httpAgent = new HttpAgent({ keepAlive: true });\n const httpsAgent = new HttpsAgent({ keepAlive: true });\n\n this.axios = axios.create({\n baseURL: CloudBridgeClient.BASE_URL,\n timeout: options?.timeoutMs ?? 60_000,\n httpAgent,\n httpsAgent,\n // Allow reading structured error responses without axios throwing\n validateStatus: (status) => status >= 200 && status < 600,\n maxBodyLength: Infinity,\n maxContentLength: Infinity\n });\n }\n\n async uploadFiles(filePaths: string[], opts: { folder: string }): Promise<UploadFileItem[]> {\n if (!Array.isArray(filePaths) || filePaths.length === 0) {\n throw new CloudBridgeError(\"filePaths must be a non-empty array of paths\");\n }\n if (!opts?.folder) {\n throw new CloudBridgeError(\"opts.folder is required\");\n }\n if (!this.accessKey || !this.secretKey) {\n throw new CloudBridgeError(\n \"Missing credentials: accessKey and secretKey are required (via constructor or environment)\",\n { status: \"error\" }\n );\n }\n\n const signature = createHmac(\"sha256\", this.secretKey).update(this.accessKey).digest(\"hex\");\n\n const form = new FormData();\n form.append(\"folder\", opts.folder);\n\n for (const filePath of filePaths) {\n const stream = fs.createReadStream(filePath);\n const filename = path.basename(filePath);\n const contentType = mimeLookup(filePath) || undefined;\n form.append(\"files\", stream, { filename, contentType });\n }\n\n const headers = {\n ...form.getHeaders(),\n \"x-access-key\": this.accessKey,\n \"x-signature\": signature\n } as Record<string, string>;\n\n const url = `${CloudBridgeClient.BASE_URL}/api/v1/public/upload`;\n\n try {\n const response = await this.axios.post(url, form, { headers });\n const data = response.data as unknown as {\n status?: string;\n message?: string;\n errors?: unknown;\n data?: { files?: UploadFileItem[] };\n };\n\n if (data && data.status === \"success\" && data.data?.files) {\n return data.data.files;\n }\n\n // Server-provided error envelope\n if (data && data.status === \"error\") {\n const message = data.message || `Request failed with status ${response.status}`;\n throw new CloudBridgeError(message, {\n status: data.status,\n statusCode: response.status,\n errors: data.errors\n });\n }\n\n // Fallback for unexpected structure\n throw new CloudBridgeError(`Unexpected response (status ${response.status})`);\n } catch (err) {\n if (err instanceof CloudBridgeError) {\n throw err;\n }\n // Axios or network error\n const anyErr = err as any;\n const statusCode: number | undefined = anyErr?.response?.status;\n const data = anyErr?.response?.data as\n | { status?: string; message?: string; errors?: unknown }\n | undefined;\n if (data && data.status === \"error\") {\n throw new CloudBridgeError(data.message || \"Request failed\", {\n status: data.status,\n statusCode,\n errors: data.errors\n });\n }\n const message = anyErr?.message || `Request failed${statusCode ? ` with status ${statusCode}` : \"\"}`;\n throw new CloudBridgeError(message, { statusCode });\n }\n }\n}\n\n\n"]}