@nexim/upload-sdk
Version:
TypeScript SDK for seamless integration with Nexim Media Upload Service. It provides state machine-based upload handling, progress tracking, and type-safe API for image optimization and file uploads.
5 lines (4 loc) • 4 kB
JavaScript
/** 📦 @nexim/upload-sdk v2.0.0-alpha.2 */
__dev_mode__: console.debug("📦 @nexim/upload-sdk v2.0.0-alpha.2");
;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var main_exports={};__export(main_exports,{optimizeImage:()=>optimizeImage,pickAndProcessFile:()=>pickAndProcessFile,uploadFile:()=>uploadFile,uploadImage:()=>uploadImage});module.exports=__toCommonJS(main_exports);var import_package_tracer=require("@alwatr/package-tracer");var import_logger=require("@alwatr/logger");var logger=(0,import_logger.createLogger)("@nexim/upload-sdk");async function uploadFile(file,options){logger.logMethodArgs?.("uploadFile",{options});const buffer=await file.arrayBuffer();const headers={"Content-Type":"application/octet-stream",authorization:`Alwatr ${options.auth.id}:${options.auth.token}`,"x-upload-path":encodeURIComponent(options.path),"x-upload-description":encodeURIComponent(options.description),...options.extraHeaders};let attempt=0;const maxRetries=options.maxRetries??3;const retryDelay=options.retryDelay??2e3;while(attempt<maxRetries){try{const response=await fetch(options.apiEndpoint,{method:"POST",headers,body:buffer});if(!response.ok){throw new Error(`Upload failed with status: ${response.status}`)}const data=await response.json();return data}catch(err){attempt++;logger.error("uploadFile","upload_failed",{attempt,err});if(attempt>=maxRetries){throw err}await new Promise(resolve=>setTimeout(resolve,retryDelay))}}throw new Error("Upload failed after maximum retries")}async function uploadImage(file,options){logger.logMethodArgs?.("uploadImage",{options});let fileToUpload=file;try{fileToUpload=await optimizeImage(file,options.preset.client)}catch(err){logger.error("uploadImage","optimization_failed",{err});if(options.throwOnClientOptimizationError){throw err}}return uploadFile(fileToUpload,{...options,extraHeaders:{"x-upload-preset":btoa(JSON.stringify(options.preset))}})}function optimizeImage(rawImage,clientConfig){logger.logMethod?.("optimizeImage");return new Promise((resolve,reject)=>{const canvas=document.createElement("canvas");const context=canvas.getContext("2d");if(!context){resolve(rawImage);return}let width=clientConfig.width;let height=clientConfig.height;const image=new Image;const objectUrl=URL.createObjectURL(rawImage);image.onload=()=>{const aspect=image.width/image.height;if(width&&height===-1){height=width/aspect}else if(height&&width===-1){width=height*aspect}canvas.width=width;canvas.height=height;context.drawImage(image,0,0,width,height);URL.revokeObjectURL(objectUrl);canvas.toBlob(blob=>{if(blob){resolve(blob)}else{reject(new Error("Failed to create blob from canvas."))}},rawImage.type,clientConfig.quality/100)};image.addEventListener("error",error=>{URL.revokeObjectURL(objectUrl);reject(new Error(error.message||"Image load error"))});image.src=objectUrl})}function pickAndProcessFile(accept,callback){logger.logMethod?.("pickAndProcessFile");const input=document.createElement("input");input.type="file";input.accept=accept;input.addEventListener("change",async()=>{logger.logOther?.("changed");if(input.files===null||input.files.length===0)return;const file=input.files[0];logger.logOther?.("pickAndProcessFile.change",{file});input.remove();await callback(file)});input.click()}__dev_mode__:import_package_tracer.packageTracer.add("@nexim/upload-sdk","2.0.0-alpha.2");
//# sourceMappingURL=main.cjs.map