@nhost/hasura-storage-js
Version:
Hasura-storage client
3 lines (2 loc) • 11.2 kB
JavaScript
;var C=Object.defineProperty;var N=(t,e,r)=>e in t?C(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var f=(t,e,r)=>N(t,typeof e!="symbol"?e+"":e,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x=require("fetch-ponyfill"),T=require("form-data"),d=require("xstate");let M=globalThis.fetch;const O=async(t,e,{accessToken:r,name:s,fileId:a,bucketId:i,adminSecret:o,onUploadProgress:l,headers:c={}}={})=>{var L;const h={...c};i&&e.append("bucket-id",i),o&&(h["x-hasura-admin-secret"]=o),r&&(h.Authorization=`Bearer ${r}`);const U=`${t}/files`;if(typeof XMLHttpRequest=="undefined")try{e instanceof T&&(M=x().fetch);const u=await M(U,{method:"POST",headers:h,body:e}),n=await u.json();return u.ok?{fileMetadata:n,error:null}:{error:{status:u.status,message:((L=n==null?void 0:n.error)==null?void 0:L.message)||u.statusText,error:u.statusText},fileMetadata:null}}catch(u){return{error:{status:0,message:u.message,error:u.message},fileMetadata:null}}return new Promise(u=>{let n=new XMLHttpRequest;n.responseType="json",n.onload=()=>{var p,g,w,S,F,_,I,R;if(n.status<200||n.status>=300){const b={error:(F=(S=(g=(p=n.response)==null?void 0:p.error)==null?void 0:g.message)!=null?S:(w=n.response)==null?void 0:w.error)!=null?F:n.response,message:(R=(I=(_=n.response)==null?void 0:_.error)==null?void 0:I.message)!=null?R:n.response,status:n.status};return u({fileMetadata:null,error:b})}return u({fileMetadata:n.response,error:null})},n.onerror=()=>{const p={error:n.statusText,message:n.statusText,status:n.status};return u({fileMetadata:null,error:p})},l&&n.upload.addEventListener("progress",l,!1),n.open("POST",U,!0),Object.entries(h).forEach(([p,g])=>{n.setRequestHeader(p,g)}),n.send(e)})};function A(t,e){if(!e||Object.keys(e).length===0)return t;const r=new URL(t),s=Object.entries(e).reduce((a,[i,o])=>({...a,[i.charAt(0)]:o}),{});return Object.entries(s).forEach(([a,i])=>{i&&r.searchParams.set(a,i)}),r.toString()}let m;typeof m=="undefined"&&(m=x().fetch);class k{constructor({url:e}){f(this,"url");f(this,"accessToken");f(this,"adminSecret");f(this,"headers",{});this.url=e}async uploadFormData({formData:e,bucketId:r,headers:s}){const{error:a,fileMetadata:i}=await O(this.url,e,{bucketId:r,headers:{...this.headers,...s},accessToken:this.accessToken,adminSecret:this.adminSecret});return a?{fileMetadata:null,error:a}:i&&!("processedFiles"in i)?{fileMetadata:{processedFiles:[i]},error:null}:{fileMetadata:i,error:null}}async uploadFile({file:e,bucketId:r,id:s,name:a,headers:i}){const o=typeof window=="undefined"?new T:new FormData;o.append("file[]",e),o.append("metadata[]",JSON.stringify({id:s,name:a}));const{error:l,fileMetadata:c}=await O(this.url,o,{accessToken:this.accessToken,adminSecret:this.adminSecret,bucketId:r,fileId:s,name:a,headers:{...this.headers,...i}});return l?{fileMetadata:null,error:l}:c&&"processedFiles"in c?{fileMetadata:c.processedFiles[0],error:null}:{fileMetadata:c,error:null}}async downloadFile(e){try{const{fileId:r,headers:s,...a}=e,i=A(`${this.url}/files/${r}`,a),o=await m(i,{method:"GET",headers:{...this.generateAuthHeaders(),...this.headers,...s}});if(!o.ok)throw new Error(await o.text());return{file:await o.blob(),error:null}}catch(r){return{file:null,error:r}}}async getPresignedUrl(e){try{const{fileId:r,headers:s}=e,a=await m(`${this.url}/files/${r}/presignedurl`,{method:"GET",headers:{...this.generateAuthHeaders(),...this.headers,...s}});if(!a.ok)throw new Error(await a.text());return{presignedUrl:await a.json(),error:null}}catch(r){return{presignedUrl:null,error:r}}}async delete(e){try{const{fileId:r,headers:s}=e,a=await m(`${this.url}/files/${r}`,{method:"DELETE",headers:{...this.generateAuthHeaders(),...this.headers,...s}});if(!a.ok)throw new Error(await a.text());return{error:null}}catch(r){return{error:r}}}setAccessToken(e){return this.accessToken=e,this}setAdminSecret(e){return this.adminSecret=e,this}getHeaders(){return this.headers}setHeaders(e){return e?(this.headers={...this.headers,...e},this):this}unsetHeaders(){const e=this.headers["x-hasura-role"];return this.headers=e?{"x-hasura-role":e}:{},this}generateAuthHeaders(){if(!(!this.adminSecret&&!this.accessToken))return this.adminSecret?{"x-hasura-admin-secret":this.adminSecret}:{Authorization:`Bearer ${this.accessToken}`}}}class ${constructor({url:e,adminSecret:r}){f(this,"url");f(this,"api");this.url=e,this.api=new k({url:e}),this.setAdminSecret(r)}async upload(e){return"file"in e?this.api.uploadFile(e):this.api.uploadFormData(e)}getPublicUrl(e){const{fileId:r,...s}=e;return A(`${this.url}/files/${r}`,s)}async getPresignedUrl(e){const{fileId:r,headers:s,...a}=e,{presignedUrl:i,error:o}=await this.api.getPresignedUrl(e);if(o)return{presignedUrl:null,error:o};if(!i)return{presignedUrl:null,error:new Error("Invalid file id")};const l=A(i.url,a);return{presignedUrl:{...i,url:l},error:null}}async download(e){const{file:r,error:s}=await this.api.downloadFile(e);return s?{file:null,error:s}:r?{file:r,error:null}:{file:null,error:new Error("File does not exist")}}async delete(e){const{error:r}=await this.api.delete(e);return r?{error:r}:{error:null}}setAccessToken(e){return this.api.setAccessToken(e),this}setAdminSecret(e){return this.api.setAdminSecret(e),this}getHeaders(){return this.api.getHeaders()}setHeaders(e){return this.api.setHeaders(e),this}unsetHeaders(){return this.api.unsetHeaders(),this}}let D;typeof D=="undefined"&&(D=T);const y={progress:null,loaded:0,error:null,bucketId:void 0,file:void 0,id:void 0},H=()=>d.createMachine({predictableActionArguments:!0,schema:{context:{},events:{}},tsTypes:{},context:{...y},initial:"idle",on:{DESTROY:{actions:"sendDestroy",target:"stopped"}},states:{idle:{on:{ADD:{actions:"addFile"},UPLOAD:{cond:"hasFile",target:"uploading"}}},uploading:{entry:"resetProgress",on:{UPLOAD_PROGRESS:{actions:["incrementProgress","sendProgress"]},UPLOAD_DONE:"uploaded",UPLOAD_ERROR:"error",CANCEL:"idle"},invoke:{src:"uploadFile"}},uploaded:{entry:["setFileMetadata","sendDone"],on:{ADD:{actions:"addFile",target:"idle"},UPLOAD:{actions:"resetContext",target:"uploading"}}},error:{entry:["setError","sendError"],on:{ADD:{actions:"addFile",target:"idle"},UPLOAD:{actions:"resetContext",target:"uploading"}}},stopped:{type:"final"}}},{guards:{hasFile:(t,e)=>!!t.file||!!e.file},actions:{incrementProgress:d.assign({loaded:(t,{loaded:e})=>e,progress:(t,{progress:e})=>e}),setFileMetadata:d.assign({id:(t,{id:e})=>e,bucketId:(t,{bucketId:e})=>e,progress:t=>100}),setError:d.assign({error:(t,{error:e})=>e}),sendProgress:()=>{},sendError:()=>{},sendDestroy:()=>{},sendDone:()=>{},resetProgress:d.assign({progress:t=>null,loaded:t=>0}),resetContext:d.assign(t=>y),addFile:d.assign({file:(t,{file:e})=>e,bucketId:(t,{bucketId:e})=>e,id:(t,{id:e})=>e})},services:{uploadFile:(t,e)=>r=>{const s=e.file||t.file,a=new D;a.append("file[]",s);let i=0;return O(e.url,a,{fileId:e.id||t.id,bucketId:e.bucketId||t.bucketId,accessToken:e.accessToken,adminSecret:e.adminSecret,name:e.name||s.name,onUploadProgress:o=>{const l=o.total?Math.round(o.loaded*s.size/o.total):0,c=l-i;i=l,r({type:"UPLOAD_PROGRESS",progress:o.total?Math.round(l*100/o.total):0,loaded:l,additions:c})}}).then(({fileMetadata:o,error:l})=>{if(l&&r({type:"UPLOAD_ERROR",error:l}),o&&!("processedFiles"in o)){const{id:c,bucketId:h}=o;r({type:"UPLOAD_DONE",id:c,bucketId:h})}if(o&&"processedFiles"in o){const{id:c,bucketId:h}=o.processedFiles[0];r({type:"UPLOAD_DONE",id:c,bucketId:h})}}),()=>{}}}}),{pure:E,sendParent:P}=d.actions,j=()=>d.createMachine({id:"files-list",schema:{context:{},events:{}},tsTypes:{},predictableActionArguments:!0,context:{progress:null,files:[],loaded:0,total:0},initial:"idle",on:{UPLOAD:{cond:"hasFileToDownload",actions:"addItem",target:"uploading"},ADD:{actions:"addItem"},REMOVE:{actions:"removeItem"}},states:{idle:{entry:["resetProgress","resetLoaded","resetTotal"],on:{CLEAR:{actions:"clearList",target:"idle"}}},uploading:{entry:["upload","startProgress","resetLoaded","resetTotal"],on:{UPLOAD_PROGRESS:{actions:["incrementProgress"]},UPLOAD_DONE:[{cond:"isAllUploaded",target:"uploaded"},{cond:"isAllUploadedOrError",target:"error"}],UPLOAD_ERROR:[{cond:"isAllUploaded",target:"uploaded"},{cond:"isAllUploadedOrError",target:"error"}],CANCEL:{actions:"cancel",target:"idle"}}},uploaded:{entry:"setUploaded",on:{CLEAR:{actions:"clearList",target:"idle"}}},error:{on:{CLEAR:{actions:"clearList",target:"idle"}}}}},{guards:{hasFileToDownload:(t,e)=>t.files.some(r=>r.getSnapshot().matches("idle"))||!!e.files,isAllUploaded:t=>t.files.every(e=>{var r;return(r=e.getSnapshot())==null?void 0:r.matches("uploaded")}),isAllUploadedOrError:t=>t.files.every(e=>{const r=e.getSnapshot();return(r==null?void 0:r.matches("error"))||(r==null?void 0:r.matches("uploaded"))})},actions:{incrementProgress:d.assign((t,e)=>{const r=t.loaded+e.additions,s=Math.round(r*100/t.total);return{...t,loaded:r,progress:s}}),setUploaded:d.assign({progress:t=>100,loaded:({files:t})=>t.map(e=>e.getSnapshot()).filter(e=>e.matches("uploaded")).reduce((e,r)=>{var s;return e+((s=r.context.file)==null?void 0:s.size)},0)}),resetTotal:d.assign({total:({files:t})=>t.map(e=>e.getSnapshot()).filter(e=>!e.matches("uploaded")).reduce((e,r)=>{var s;return e+((s=r.context.file)==null?void 0:s.size)},0)}),resetLoaded:d.assign({loaded:t=>0}),startProgress:d.assign({progress:t=>0}),resetProgress:d.assign({progress:t=>null}),addItem:d.assign((t,{files:e,bucketId:r})=>{const s=e?Array.isArray(e)?e:"item"in e?Array.from(e):[e]:[],a=t.total+s.reduce((o,l)=>o+l.size,0),i=Math.round(t.loaded*100/a);return{files:[...t.files,...s.map(o=>d.spawn(H().withConfig({actions:{sendProgress:P((l,{additions:c})=>({type:"UPLOAD_PROGRESS",additions:c})),sendDone:P("UPLOAD_DONE"),sendError:P("UPLOAD_ERROR"),sendDestroy:P("REMOVE")}}).withContext({...y,file:o,bucketId:r}),{sync:!0}))],total:a,loaded:t.loaded,progress:i}}),removeItem:d.assign({files:t=>t.files.filter(e=>{var s,a;const r=(s=e.getSnapshot())==null?void 0:s.matches("stopped");return r&&((a=e.stop)==null||a.call(e)),!r})}),clearList:E(t=>t.files.map(e=>d.send({type:"DESTROY"},{to:e.id}))),upload:E((t,e)=>t.files.map(r=>d.send(e,{to:r.id}))),cancel:E(t=>t.files.map(e=>d.send({type:"CANCEL"},{to:e.id})))}}),q=async(t,e)=>new Promise(r=>{e.send({type:"UPLOAD",...t}),e.subscribe(s=>{var a;s.matches("error")?r({error:s.context.error,isError:!0,isUploaded:!1}):s.matches("uploaded")&&r({error:null,isError:!1,isUploaded:!0,id:s.context.id,bucketId:s.context.id,name:(a=s.context.file)==null?void 0:a.name})})}),z=async(t,e)=>new Promise(r=>{e.send({type:"UPLOAD",...t,files:t.files}),e.onTransition(s=>{s.matches("error")?r({errors:s.context.files.filter(a=>{var i;return(i=a.getSnapshot())==null?void 0:i.context.error}),isError:!0,files:[]}):s.matches("uploaded")&&r({errors:[],isError:!1,files:s.context.files})})});exports.HasuraStorageApi=k;exports.HasuraStorageClient=$;exports.INITIAL_FILE_CONTEXT=y;exports.appendImageTransformationParameters=A;exports.createFileUploadMachine=H;exports.createMultipleFilesUploadMachine=j;exports.uploadFilePromise=q;exports.uploadMultipleFilesPromise=z;
//# sourceMappingURL=index.cjs.js.map