@zuzjs/flare 0.2.25 → 0.2.27
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/README.md +92 -0
- package/dist/grpc.d.cts +1 -1
- package/dist/grpc.d.ts +1 -1
- package/dist/{index-D53u7tRA.d.cts → index-CnmBBd-u.d.cts} +6 -1
- package/dist/{index-CXCOH5iN.d.ts → index-DPlKzY-d.d.ts} +6 -1
- package/dist/{index-18tMqAtM.d.cts → index-J1xVXysN.d.cts} +4 -0
- package/dist/{index-18tMqAtM.d.ts → index-J1xVXysN.d.ts} +4 -0
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/react.cjs +1 -1
- package/dist/react.d.cts +79 -3
- package/dist/react.d.ts +79 -3
- package/dist/react.js +1 -1
- package/package.json +2 -2
package/dist/react.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
'use strict';require('./chunk-DGCKTOF5.cjs');var react=require('react');/* ZuzFlare Client */
|
|
2
|
-
var se=x=>{let{query:L,options:M,onData:D,forceReadyOnFirstEmission:Q=true,firstReadyEmptyRetryCount:f=1,firstReadyEmptyRetryDelayMs:z=120,stalledFirstEmissionRetryCount:g=2,stalledFirstEmissionTimeoutMs:A=500,debugTrace:I=false,debugLabel:U="useLiveQuery",emptyReadyGraceMs:Z=0}=x,G=react.useRef(null),$=react.useRef(null),v=react.useRef(""),V=react.useRef(0),o=react.useRef(false),m=react.useRef(false),R=react.useRef(D),b=react.useRef(L??null),p=react.useRef(M),H=react.useRef(Q),J=react.useRef(f),K=react.useRef(z),y=react.useRef(f),P=react.useRef(g),W=react.useRef(A),i=react.useRef(g),d=react.useRef(null),X=react.useRef(I),Y=react.useRef(U),h=react.useRef(Z),a=react.useRef(null),T=react.useRef(null),q=react.useRef(0),ee=()=>{let l=globalThis,O=l?.__ZUZ_LIVE_QUERY_TRACE,r=false,s=null;try{typeof window<"u"&&window.localStorage&&(r=window.localStorage.getItem("__ZUZ_LIVE_QUERY_TRACE")==="1",s=window.localStorage.getItem("__ZUZ_LIVE_QUERY_TRACE_FILTER"));}catch{}if(!O&&!r)return false;let S=l?.__ZUZ_LIVE_QUERY_TRACE_FILTER??s;return S?String(Y.current).toLowerCase().includes(String(S).toLowerCase()):true},u=(...l)=>{(X.current||ee())&&console.log(`[${Y.current}]`,...l);};react.useEffect(()=>{R.current=D;},[D]),react.useEffect(()=>{b.current=L??null;},[L]),react.useEffect(()=>{p.current=M;},[M]),react.useEffect(()=>{H.current=Q;},[Q]),react.useEffect(()=>{J.current=f,y.current=f;},[f]),react.useEffect(()=>{K.current=z;},[z]),react.useEffect(()=>{P.current=g,i.current=g;},[g]),react.useEffect(()=>{W.current=A;},[A]),react.useEffect(()=>{X.current=I;},[I]),react.useEffect(()=>{Y.current=U;},[U]),react.useEffect(()=>{h.current=Z;},[Z]);let _=react.useCallback(()=>{a.current!==null&&(clearTimeout(a.current),a.current=null),T.current=null;},[]),B=react.useCallback(()=>{d.current!==null&&(clearTimeout(d.current),d.current=null);},[]),E=react.useCallback(()=>{_(),B(),$.current?.(),G.current?.close(),$.current=null,o.current=false,m.current=false,q.current=0,v.current="";},[_,B]),N=react.useCallback((l,O=false)=>{E(),V.current+=1,O||(y.current=J.current,i.current=P.current),l&&(b.current=l),b.current&&(G.current=b.current.stream({flushMs:p.current?.flushMs??20,maxBatchSize:p.current?.maxBatchSize??20,insertAt:p.current?.insertAt??"end",maxDocs:p.current?.maxDocs??50}),$.current=G.current.subscribe((r,s)=>{d.current!==null&&B();let S=r.map(t=>`${t?.id??""}:${t?.updatedAt??t?.updated_at??t?.mtime??""}`).join(","),w=`${V.current}:${s?.ready?1:0}:${S}`;q.current+=1;let c=q.current;if(u("emission",{emissionNo:c,generation:V.current,ready:!!s?.ready,size:r.length,firstRetryRemaining:y.current,hasNonEmpty:m.current}),w===v.current){u("skip duplicate",{emissionNo:c,size:r.length,metaReady:!!s?.ready});return}v.current=w;let k=!o.current,re=k&&H.current&&r.length>0,C=k&&re?true:!!s?.ready,j=!!s?.ready;if(k&&!j&&r.length===0&&i.current>0){let t=Math.max(0,W.current),te=i.current-1;d.current=setTimeout(()=>{d.current=null,i.current=Math.max(0,i.current-1),u("stalled first emission timeout hit \u2014 rebuilding stream",{stallTimeout:t,retriesLeft:i.current}),N(void 0,true);},t),u("schedule stalled-first-emission retry",{emissionNo:c,stallTimeout:t,retriesLeft:te});return}if(j&&r.length===0&&!m.current&&y.current>0){y.current-=1;let t=Math.max(0,K.current);u("schedule first-ready-empty retry",{emissionNo:c,retryDelay:t,retriesLeft:y.current}),setTimeout(()=>{N(void 0,true);},t);return}if(a.current!==null&&r.length>0){_(),o.current=true,m.current=true,u("emit non-empty after grace wait",{emissionNo:c,ready:C,size:r.length}),R.current(r,{ready:C});return}if(j&&r.length===0&&h.current>0&&a.current===null){T.current={rows:r},o.current=true,a.current=setTimeout(()=>{a.current=null;let t=T.current;T.current=null,t&&(u("emit deferred empty after grace timeout",{size:t.rows.length}),R.current(t.rows,{ready:true}));},h.current),u("start empty-ready grace timer",{emissionNo:c,graceMs:h.current});return}if(!o.current){o.current=true,r.length>0&&(m.current=true),u("emit first payload",{emissionNo:c,ready:C,size:r.length}),R.current(r,{ready:C});return}u("emit update",{emissionNo:c,size:r.length,metaReady:!!s?.ready}),r.length>0&&(m.current=true),R.current(r,{ready:!!s?.ready});}));},[E]);return react.useEffect(()=>()=>{u("[Sidebar] Cleaning up boards stream"),E();},[E]),{buildStream:N,closeStream:E,cancelGraceTimer:_}};exports.useLiveQuery=se;
|
|
2
|
+
var ce=n=>{let{query:d,options:q,onData:e,forceReadyOnFirstEmission:E=true,firstReadyEmptyRetryCount:x=1,firstReadyEmptyRetryDelayMs:l=120,stalledFirstEmissionRetryCount:r=2,stalledFirstEmissionTimeoutMs:S=500,debugTrace:F=false,debugLabel:u="useLiveQuery",emptyReadyGraceMs:k=0}=n,B=react.useRef(null),z=react.useRef(null),w=react.useRef(""),N=react.useRef(0),Q=react.useRef(false),C=react.useRef(false),O=react.useRef(e),L=react.useRef(d??null),_=react.useRef(q),Z=react.useRef(E),t=react.useRef(x),a=react.useRef(l),o=react.useRef(x),s=react.useRef(r),c=react.useRef(S),y=react.useRef(r),p=react.useRef(null),m=react.useRef(F),v=react.useRef(u),T=react.useRef(k),h=react.useRef(null),g=react.useRef(null),$=react.useRef(0),J=()=>{let j=globalThis,X=j?.__ZUZ_LIVE_QUERY_TRACE,f=false,U=null;try{typeof window<"u"&&window.localStorage&&(f=window.localStorage.getItem("__ZUZ_LIVE_QUERY_TRACE")==="1",U=window.localStorage.getItem("__ZUZ_LIVE_QUERY_TRACE_FILTER"));}catch{}if(!X&&!f)return false;let K=j?.__ZUZ_LIVE_QUERY_TRACE_FILTER??U;return K?String(v.current).toLowerCase().includes(String(K).toLowerCase()):true},b=(...j)=>{(m.current||J())&&console.log(`[${v.current}]`,...j);};react.useEffect(()=>{O.current=e;},[e]),react.useEffect(()=>{L.current=d??null;},[d]),react.useEffect(()=>{_.current=q;},[q]),react.useEffect(()=>{Z.current=E;},[E]),react.useEffect(()=>{t.current=x,o.current=x;},[x]),react.useEffect(()=>{a.current=l;},[l]),react.useEffect(()=>{s.current=r,y.current=r;},[r]),react.useEffect(()=>{c.current=S;},[S]),react.useEffect(()=>{m.current=F;},[F]),react.useEffect(()=>{v.current=u;},[u]),react.useEffect(()=>{T.current=k;},[k]);let A=react.useCallback(()=>{h.current!==null&&(clearTimeout(h.current),h.current=null),g.current=null;},[]),G=react.useCallback(()=>{p.current!==null&&(clearTimeout(p.current),p.current=null);},[]),D=react.useCallback(()=>{A(),G(),z.current?.(),B.current?.close(),z.current=null,Q.current=false,C.current=false,$.current=0,w.current="";},[A,G]),W=react.useCallback((j,X=false)=>{D(),N.current+=1,X||(o.current=t.current,y.current=s.current),j&&(L.current=j),L.current&&(B.current=L.current.stream({flushMs:_.current?.flushMs??20,maxBatchSize:_.current?.maxBatchSize??20,insertAt:_.current?.insertAt??"end",maxDocs:_.current?.maxDocs??50}),z.current=B.current.subscribe((f,U)=>{p.current!==null&&G();let K=f.map(I=>`${I?.id??""}:${I?.updatedAt??I?.updated_at??I?.mtime??""}`).join(","),ne=`${N.current}:${U?.ready?1:0}:${K}`;$.current+=1;let P=$.current;if(b("emission",{emissionNo:P,generation:N.current,ready:!!U?.ready,size:f.length,firstRetryRemaining:o.current,hasNonEmpty:C.current}),ne===w.current){b("skip duplicate",{emissionNo:P,size:f.length,metaReady:!!U?.ready});return}w.current=ne;let ee=!Q.current,ae=ee&&Z.current&&f.length>0,V=ee&&ae?true:!!U?.ready,te=!!U?.ready;if(ee&&!te&&f.length===0&&y.current>0){let I=Math.max(0,c.current),oe=y.current-1;p.current=setTimeout(()=>{p.current=null,y.current=Math.max(0,y.current-1),b("stalled first emission timeout hit \u2014 rebuilding stream",{stallTimeout:I,retriesLeft:y.current}),W(void 0,true);},I),b("schedule stalled-first-emission retry",{emissionNo:P,stallTimeout:I,retriesLeft:oe});return}if(te&&f.length===0&&!C.current&&o.current>0){o.current-=1;let I=Math.max(0,a.current);b("schedule first-ready-empty retry",{emissionNo:P,retryDelay:I,retriesLeft:o.current}),setTimeout(()=>{W(void 0,true);},I);return}if(h.current!==null&&f.length>0){A(),Q.current=true,C.current=true,b("emit non-empty after grace wait",{emissionNo:P,ready:V,size:f.length}),O.current(f,{ready:V});return}if(te&&f.length===0&&T.current>0&&h.current===null){g.current={rows:f},Q.current=true,h.current=setTimeout(()=>{h.current=null;let I=g.current;g.current=null,I&&(b("emit deferred empty after grace timeout",{size:I.rows.length}),O.current(I.rows,{ready:true}));},T.current),b("start empty-ready grace timer",{emissionNo:P,graceMs:T.current});return}if(!Q.current){Q.current=true,f.length>0&&(C.current=true),b("emit first payload",{emissionNo:P,ready:V,size:f.length}),O.current(f,{ready:V});return}b("emit update",{emissionNo:P,size:f.length,metaReady:!!U?.ready}),f.length>0&&(C.current=true),O.current(f,{ready:!!U?.ready});}));},[D]);return react.useEffect(()=>()=>{b("[Sidebar] Cleaning up boards stream"),D();},[D]),{buildStream:W,closeStream:D,cancelGraceTimer:A}},ie=ce;var ue=(l=>(l[l.Error=-1]="Error",l[l.Idle=0]="Idle",l[l.FetchingServer=1]="FetchingServer",l[l.Uploading=2]="Uploading",l[l.Saving=3]="Saving",l[l.Saved=4]="Saved",l))(ue||{});function re(){return Date.now()}function de(){let n=globalThis.crypto?.randomUUID;return typeof n=="function"?n.call(globalThis.crypto).replace(/-/g,"").substring(0,20):`${re()}-${Math.random().toString(36).slice(2,10)}`}function me(n){return (String(n.file?.name??"file").trim()||"file").replace(/^\/+|\/+$/g,"")}function fe(n,d,q){let e=(q?.(n,d)??n.key??me(n)).trim();return {id:n.id??de(),file:n.file,bucket:String(n.bucket??"").trim(),objectKey:e,contentType:n.contentType,access:n.access,encrypt:n.encrypt,base64:n.base64,base64MaxBytes:n.base64MaxBytes,progress:0,speed:0,eta:0,bytes:Math.max(0,Number(n.file?.size??0)),uploadedBytes:0,status:0}}function ye(n,d){let q=n.total>0?n.total:d,e=Math.max(0,Math.min(n.loaded,q||n.loaded)),E=q>0?Math.round(e/q*100):Math.max(0,Math.min(100,n.percent||0));return {loaded:e,total:q,percent:E}}var pe=(n,d={})=>{let[,q]=react.useState(0),e=react.useRef({que:[],index:-1,speed:0,stamp:null,token:null,status:0}),E=react.useRef(false),x=react.useRef(false),l=react.useRef(null),r=react.useCallback(()=>{q(t=>t+1);},[]),S=react.useCallback((t,a)=>{let o=e.current.que.findIndex(s=>s.id===t);o<0||(e.current.que[o]=a(e.current.que[o]));},[]),F=react.useCallback(()=>e.current.que.some(t=>t.status===0||t.status===-1),[]),u=react.useCallback(()=>{let t=e.current,a=t.que[t.index];if(x.current&&a&&a.status===2){t.status=2,t.speed=a.speed;return}if(E.current&&t.que.some(o=>o.status===0||o.status===-1)){t.status=0,t.speed=0;return}if(t.que.length>0&&t.que.every(o=>o.status===4)){t.status=4,t.speed=0;return}if(t.que.some(o=>o.status===-1)){t.status=-1,t.speed=0;return}t.status=0,t.speed=0;},[]),k=react.useCallback(async()=>{if(x.current)return l.current??Promise.resolve();x.current=true;let t=(async()=>{for(;!E.current;){let o=e.current.que.findIndex(m=>m.status===0||m.status===-1);if(o<0)break;e.current.index=o;let s=e.current.que[o],c=re(),y=0,p=c;S(s.id,m=>({...m,status:2,progress:0,speed:0,eta:m.bytes>0?Number.POSITIVE_INFINITY:0,uploadedBytes:0,error:void 0})),e.current.stamp=c,u(),r();try{let m=await n.putObject({bucket:s.bucket,key:s.objectKey,body:s.file,contentType:s.contentType??s.file.type,access:s.access,encrypt:s.encrypt,base64:s.base64,base64MaxBytes:s.base64MaxBytes,onProgress:T=>{let h=re(),g=ye(T,s.bytes),$=Math.max(1,h-p),J=Math.max(0,g.loaded-y),b=Math.round(J*1e3/$),A=Math.max(0,g.total-g.loaded),G=b>0?Math.ceil(A/b):0;y=g.loaded,p=h,S(s.id,D=>({...D,progress:g.percent,speed:b,eta:G,uploadedBytes:g.loaded,bytes:g.total,status:2})),e.current.speed=b,e.current.stamp=h,r();}});S(s.id,T=>({...T,status:4,progress:100,speed:0,eta:0,uploadedBytes:T.bytes,result:m}));let v=e.current.que.find(T=>T.id===s.id);v&&d.onItemComplete?.(v,m);}catch(m){let v=m instanceof Error?m.message:String(m),T=m instanceof Error?m:new Error(v);S(s.id,g=>({...g,status:-1,speed:0,eta:0,error:v}));let h=e.current.que.find(g=>g.id===s.id);h&&d.onItemError?.(h,T);}e.current.speed=0,u(),r();}x.current=false,e.current.index=-1,e.current.speed=0,u(),F()||d.onQueueComplete?.(e.current.que),r();})();return l.current=t.finally(()=>{l.current=null;}),l.current},[F,d,u,S,n,r]),B=react.useCallback(t=>{let a=Array.isArray(t)?t:[t],o=[];for(let s of a){let c=fe(s,e.current.que.length,d.keyResolver);e.current.que.push(c),o.push(c.id);}return u(),r(),d.autoStartOnAdd!==false&&!E.current&&k(),o},[d.autoStartOnAdd,d.keyResolver,k,u,r]),z=react.useCallback(t=>{let a=e.current.que.findIndex(c=>c.id===t);if(a<0||e.current.que[e.current.index]?.id===t)return;let s=e.current.que[a];if(s.status===4){if(typeof n.deleteObject!="function"){let c=new Error("Storage driver does not implement deleteObject for completed uploads");S(t,p=>({...p,status:-1,speed:0,eta:0,error:c.message}));let y=e.current.que.find(p=>p.id===t);y&&d.onItemError?.(y,c),u(),r();return}S(t,c=>({...c,status:3,speed:0,eta:0,error:void 0})),u(),r(),(async()=>{try{await n.deleteObject?.({bucket:s.bucket,key:s.objectKey});let c=e.current.que.findIndex(p=>p.id===t);if(c<0||e.current.que[e.current.index]?.id===t)return;e.current.que.splice(c,1),e.current.index>c&&(e.current.index-=1),u(),r();}catch(c){let y=c instanceof Error?c.message:String(c),p=c instanceof Error?c:new Error(y);S(t,v=>({...v,status:-1,speed:0,eta:0,error:y}));let m=e.current.que.find(v=>v.id===t);m&&d.onItemError?.(m,p),u(),r();}})();return}e.current.que.splice(a,1),e.current.index>a&&(e.current.index-=1),u(),r();},[d,u,S,n,r]),w=react.useCallback(()=>{x.current||(e.current.que=[],e.current.index=-1,e.current.speed=0,e.current.stamp=null,e.current.token=null,e.current.status=0,E.current=true,r());},[r]),N=react.useCallback(()=>{let t=e.current.que[e.current.index]?.id;e.current.que=e.current.que.filter(a=>a.id===t?true:a.status!==4),e.current.index=e.current.que.findIndex(a=>a.id===t),u(),r();},[u,r]),Q=react.useCallback(t=>{S(t,a=>a.status!==-1?a:{...a,status:0,progress:0,speed:0,eta:0,uploadedBytes:0,error:void 0,result:void 0}),u(),r();},[u,S,r]),C=react.useCallback(()=>{e.current.que=e.current.que.map(t=>t.status!==-1?t:{...t,status:0,progress:0,speed:0,eta:0,uploadedBytes:0,error:void 0,result:void 0}),u(),r();},[u,r]),O=react.useCallback(()=>{E.current=true,u(),r();},[u,r]),L=react.useCallback(async()=>{E.current=false,u(),r(),await k();},[k,u,r]),_=react.useCallback(()=>{x.current||(E.current=true,e.current.que=e.current.que.map(t=>({...t,progress:0,speed:0,eta:0,uploadedBytes:0,error:void 0,result:void 0,status:0})),e.current.index=-1,e.current.speed=0,e.current.stamp=null,e.current.token=null,e.current.status=0,r());},[r]),Z=e.current.que[e.current.index]??null;return {...e.current,que:[...e.current.que],running:x.current,isPaused:E.current,hasPending:F(),current:Z,addToQueue:B,remove:z,clear:w,clearDone:N,retry:Q,retryAllFailed:C,start:L,pause:O,reset:_}},ge=pe;exports.Status=ue;exports.useLiveQuery=ie;exports.useStorage=ge;
|
package/dist/react.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as CollectionQuery } from './index-
|
|
2
|
-
import './index-
|
|
1
|
+
import { a as CollectionQuery } from './index-CnmBBd-u.cjs';
|
|
2
|
+
import { av as PutObjectResult, au as PutObjectInput, z as DeleteObjectInput } from './index-J1xVXysN.cjs';
|
|
3
3
|
import '@zuzjs/auth';
|
|
4
4
|
|
|
5
5
|
declare const useLiveQuery: (data: {
|
|
@@ -57,4 +57,80 @@ declare const useLiveQuery: (data: {
|
|
|
57
57
|
cancelGraceTimer: () => void;
|
|
58
58
|
};
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
declare enum Status {
|
|
61
|
+
Error = -1,
|
|
62
|
+
Idle = 0,
|
|
63
|
+
FetchingServer = 1,
|
|
64
|
+
Uploading = 2,
|
|
65
|
+
Saving = 3,
|
|
66
|
+
Saved = 4
|
|
67
|
+
}
|
|
68
|
+
interface QueItem {
|
|
69
|
+
id: string;
|
|
70
|
+
file: File;
|
|
71
|
+
bucket: string;
|
|
72
|
+
objectKey: string;
|
|
73
|
+
contentType?: string;
|
|
74
|
+
access?: "public" | "private";
|
|
75
|
+
encrypt?: boolean;
|
|
76
|
+
base64?: boolean;
|
|
77
|
+
base64MaxBytes?: number;
|
|
78
|
+
progress: number;
|
|
79
|
+
speed: number;
|
|
80
|
+
eta: number;
|
|
81
|
+
bytes: number;
|
|
82
|
+
uploadedBytes: number;
|
|
83
|
+
error?: string;
|
|
84
|
+
result?: PutObjectResult;
|
|
85
|
+
status: Status;
|
|
86
|
+
}
|
|
87
|
+
type Uploadify = {
|
|
88
|
+
que: QueItem[];
|
|
89
|
+
index: number;
|
|
90
|
+
speed: number;
|
|
91
|
+
stamp: number | null;
|
|
92
|
+
token: string | null;
|
|
93
|
+
status: Status;
|
|
94
|
+
};
|
|
95
|
+
type UseStorageInput = {
|
|
96
|
+
id?: string;
|
|
97
|
+
file: File;
|
|
98
|
+
bucket: string;
|
|
99
|
+
key?: string;
|
|
100
|
+
contentType?: string;
|
|
101
|
+
access?: "public" | "private";
|
|
102
|
+
encrypt?: boolean;
|
|
103
|
+
base64?: boolean;
|
|
104
|
+
base64MaxBytes?: number;
|
|
105
|
+
};
|
|
106
|
+
type UseStorageOptions = {
|
|
107
|
+
keyResolver?: (input: UseStorageInput, index: number) => string;
|
|
108
|
+
autoStartOnAdd?: boolean;
|
|
109
|
+
onItemComplete?: (item: QueItem, result: PutObjectResult) => void;
|
|
110
|
+
onItemError?: (item: QueItem, error: Error) => void;
|
|
111
|
+
onQueueComplete?: (items: QueItem[]) => void;
|
|
112
|
+
};
|
|
113
|
+
interface UseStorageDriver {
|
|
114
|
+
putObject(input: PutObjectInput): Promise<PutObjectResult>;
|
|
115
|
+
deleteObject?(input: DeleteObjectInput): Promise<{
|
|
116
|
+
ok: boolean;
|
|
117
|
+
}>;
|
|
118
|
+
}
|
|
119
|
+
type UseStorageHook = Uploadify & {
|
|
120
|
+
isPaused: boolean;
|
|
121
|
+
running: boolean;
|
|
122
|
+
hasPending: boolean;
|
|
123
|
+
current: QueItem | null;
|
|
124
|
+
addToQueue: (input: UseStorageInput | UseStorageInput[]) => string[];
|
|
125
|
+
remove: (id: string) => void;
|
|
126
|
+
clear: () => void;
|
|
127
|
+
clearDone: () => void;
|
|
128
|
+
retry: (id: string) => void;
|
|
129
|
+
retryAllFailed: () => void;
|
|
130
|
+
start: () => Promise<void>;
|
|
131
|
+
pause: () => void;
|
|
132
|
+
reset: () => void;
|
|
133
|
+
};
|
|
134
|
+
declare const useStorage: (storage: UseStorageDriver, options?: UseStorageOptions) => UseStorageHook;
|
|
135
|
+
|
|
136
|
+
export { type QueItem, Status, type Uploadify, useLiveQuery, useStorage };
|
package/dist/react.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as CollectionQuery } from './index-
|
|
2
|
-
import './index-
|
|
1
|
+
import { a as CollectionQuery } from './index-DPlKzY-d.js';
|
|
2
|
+
import { av as PutObjectResult, au as PutObjectInput, z as DeleteObjectInput } from './index-J1xVXysN.js';
|
|
3
3
|
import '@zuzjs/auth';
|
|
4
4
|
|
|
5
5
|
declare const useLiveQuery: (data: {
|
|
@@ -57,4 +57,80 @@ declare const useLiveQuery: (data: {
|
|
|
57
57
|
cancelGraceTimer: () => void;
|
|
58
58
|
};
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
declare enum Status {
|
|
61
|
+
Error = -1,
|
|
62
|
+
Idle = 0,
|
|
63
|
+
FetchingServer = 1,
|
|
64
|
+
Uploading = 2,
|
|
65
|
+
Saving = 3,
|
|
66
|
+
Saved = 4
|
|
67
|
+
}
|
|
68
|
+
interface QueItem {
|
|
69
|
+
id: string;
|
|
70
|
+
file: File;
|
|
71
|
+
bucket: string;
|
|
72
|
+
objectKey: string;
|
|
73
|
+
contentType?: string;
|
|
74
|
+
access?: "public" | "private";
|
|
75
|
+
encrypt?: boolean;
|
|
76
|
+
base64?: boolean;
|
|
77
|
+
base64MaxBytes?: number;
|
|
78
|
+
progress: number;
|
|
79
|
+
speed: number;
|
|
80
|
+
eta: number;
|
|
81
|
+
bytes: number;
|
|
82
|
+
uploadedBytes: number;
|
|
83
|
+
error?: string;
|
|
84
|
+
result?: PutObjectResult;
|
|
85
|
+
status: Status;
|
|
86
|
+
}
|
|
87
|
+
type Uploadify = {
|
|
88
|
+
que: QueItem[];
|
|
89
|
+
index: number;
|
|
90
|
+
speed: number;
|
|
91
|
+
stamp: number | null;
|
|
92
|
+
token: string | null;
|
|
93
|
+
status: Status;
|
|
94
|
+
};
|
|
95
|
+
type UseStorageInput = {
|
|
96
|
+
id?: string;
|
|
97
|
+
file: File;
|
|
98
|
+
bucket: string;
|
|
99
|
+
key?: string;
|
|
100
|
+
contentType?: string;
|
|
101
|
+
access?: "public" | "private";
|
|
102
|
+
encrypt?: boolean;
|
|
103
|
+
base64?: boolean;
|
|
104
|
+
base64MaxBytes?: number;
|
|
105
|
+
};
|
|
106
|
+
type UseStorageOptions = {
|
|
107
|
+
keyResolver?: (input: UseStorageInput, index: number) => string;
|
|
108
|
+
autoStartOnAdd?: boolean;
|
|
109
|
+
onItemComplete?: (item: QueItem, result: PutObjectResult) => void;
|
|
110
|
+
onItemError?: (item: QueItem, error: Error) => void;
|
|
111
|
+
onQueueComplete?: (items: QueItem[]) => void;
|
|
112
|
+
};
|
|
113
|
+
interface UseStorageDriver {
|
|
114
|
+
putObject(input: PutObjectInput): Promise<PutObjectResult>;
|
|
115
|
+
deleteObject?(input: DeleteObjectInput): Promise<{
|
|
116
|
+
ok: boolean;
|
|
117
|
+
}>;
|
|
118
|
+
}
|
|
119
|
+
type UseStorageHook = Uploadify & {
|
|
120
|
+
isPaused: boolean;
|
|
121
|
+
running: boolean;
|
|
122
|
+
hasPending: boolean;
|
|
123
|
+
current: QueItem | null;
|
|
124
|
+
addToQueue: (input: UseStorageInput | UseStorageInput[]) => string[];
|
|
125
|
+
remove: (id: string) => void;
|
|
126
|
+
clear: () => void;
|
|
127
|
+
clearDone: () => void;
|
|
128
|
+
retry: (id: string) => void;
|
|
129
|
+
retryAllFailed: () => void;
|
|
130
|
+
start: () => Promise<void>;
|
|
131
|
+
pause: () => void;
|
|
132
|
+
reset: () => void;
|
|
133
|
+
};
|
|
134
|
+
declare const useStorage: (storage: UseStorageDriver, options?: UseStorageOptions) => UseStorageHook;
|
|
135
|
+
|
|
136
|
+
export { type QueItem, Status, type Uploadify, useLiveQuery, useStorage };
|
package/dist/react.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {useRef,useEffect,useCallback}from'react';var ce=x=>{let{query:L,options:M,onData:D,forceReadyOnFirstEmission:Q=true,firstReadyEmptyRetryCount:f=1,firstReadyEmptyRetryDelayMs:z=120,stalledFirstEmissionRetryCount:g=2,stalledFirstEmissionTimeoutMs:A=500,debugTrace:I=false,debugLabel:U="useLiveQuery",emptyReadyGraceMs:Z=0}=x,G=useRef(null),$=useRef(null),v=useRef(""),V=useRef(0),o=useRef(false),m=useRef(false),R=useRef(D),b=useRef(L??null),p=useRef(M),H=useRef(Q),J=useRef(f),K=useRef(z),y=useRef(f),P=useRef(g),W=useRef(A),i=useRef(g),d=useRef(null),X=useRef(I),Y=useRef(U),h=useRef(Z),a=useRef(null),T=useRef(null),q=useRef(0),ee=()=>{let l=globalThis,O=l?.__ZUZ_LIVE_QUERY_TRACE,r=false,s=null;try{typeof window<"u"&&window.localStorage&&(r=window.localStorage.getItem("__ZUZ_LIVE_QUERY_TRACE")==="1",s=window.localStorage.getItem("__ZUZ_LIVE_QUERY_TRACE_FILTER"));}catch{}if(!O&&!r)return false;let S=l?.__ZUZ_LIVE_QUERY_TRACE_FILTER??s;return S?String(Y.current).toLowerCase().includes(String(S).toLowerCase()):true},u=(...l)=>{(X.current||ee())&&console.log(`[${Y.current}]`,...l);};useEffect(()=>{R.current=D;},[D]),useEffect(()=>{b.current=L??null;},[L]),useEffect(()=>{p.current=M;},[M]),useEffect(()=>{H.current=Q;},[Q]),useEffect(()=>{J.current=f,y.current=f;},[f]),useEffect(()=>{K.current=z;},[z]),useEffect(()=>{P.current=g,i.current=g;},[g]),useEffect(()=>{W.current=A;},[A]),useEffect(()=>{X.current=I;},[I]),useEffect(()=>{Y.current=U;},[U]),useEffect(()=>{h.current=Z;},[Z]);let _=useCallback(()=>{a.current!==null&&(clearTimeout(a.current),a.current=null),T.current=null;},[]),B=useCallback(()=>{d.current!==null&&(clearTimeout(d.current),d.current=null);},[]),E=useCallback(()=>{_(),B(),$.current?.(),G.current?.close(),$.current=null,o.current=false,m.current=false,q.current=0,v.current="";},[_,B]),N=useCallback((l,O=false)=>{E(),V.current+=1,O||(y.current=J.current,i.current=P.current),l&&(b.current=l),b.current&&(G.current=b.current.stream({flushMs:p.current?.flushMs??20,maxBatchSize:p.current?.maxBatchSize??20,insertAt:p.current?.insertAt??"end",maxDocs:p.current?.maxDocs??50}),$.current=G.current.subscribe((r,s)=>{d.current!==null&&B();let S=r.map(t=>`${t?.id??""}:${t?.updatedAt??t?.updated_at??t?.mtime??""}`).join(","),w=`${V.current}:${s?.ready?1:0}:${S}`;q.current+=1;let c=q.current;if(u("emission",{emissionNo:c,generation:V.current,ready:!!s?.ready,size:r.length,firstRetryRemaining:y.current,hasNonEmpty:m.current}),w===v.current){u("skip duplicate",{emissionNo:c,size:r.length,metaReady:!!s?.ready});return}v.current=w;let k=!o.current,re=k&&H.current&&r.length>0,C=k&&re?true:!!s?.ready,j=!!s?.ready;if(k&&!j&&r.length===0&&i.current>0){let t=Math.max(0,W.current),te=i.current-1;d.current=setTimeout(()=>{d.current=null,i.current=Math.max(0,i.current-1),u("stalled first emission timeout hit \u2014 rebuilding stream",{stallTimeout:t,retriesLeft:i.current}),N(void 0,true);},t),u("schedule stalled-first-emission retry",{emissionNo:c,stallTimeout:t,retriesLeft:te});return}if(j&&r.length===0&&!m.current&&y.current>0){y.current-=1;let t=Math.max(0,K.current);u("schedule first-ready-empty retry",{emissionNo:c,retryDelay:t,retriesLeft:y.current}),setTimeout(()=>{N(void 0,true);},t);return}if(a.current!==null&&r.length>0){_(),o.current=true,m.current=true,u("emit non-empty after grace wait",{emissionNo:c,ready:C,size:r.length}),R.current(r,{ready:C});return}if(j&&r.length===0&&h.current>0&&a.current===null){T.current={rows:r},o.current=true,a.current=setTimeout(()=>{a.current=null;let t=T.current;T.current=null,t&&(u("emit deferred empty after grace timeout",{size:t.rows.length}),R.current(t.rows,{ready:true}));},h.current),u("start empty-ready grace timer",{emissionNo:c,graceMs:h.current});return}if(!o.current){o.current=true,r.length>0&&(m.current=true),u("emit first payload",{emissionNo:c,ready:C,size:r.length}),R.current(r,{ready:C});return}u("emit update",{emissionNo:c,size:r.length,metaReady:!!s?.ready}),r.length>0&&(m.current=true),R.current(r,{ready:!!s?.ready});}));},[E]);return useEffect(()=>()=>{u("[Sidebar] Cleaning up boards stream"),E();},[E]),{buildStream:N,closeStream:E,cancelGraceTimer:_}};export{ce as useLiveQuery};
|
|
1
|
+
import {useRef,useEffect,useCallback,useState}from'react';var ie=n=>{let{query:d,options:q,onData:e,forceReadyOnFirstEmission:E=true,firstReadyEmptyRetryCount:x=1,firstReadyEmptyRetryDelayMs:l=120,stalledFirstEmissionRetryCount:r=2,stalledFirstEmissionTimeoutMs:S=500,debugTrace:F=false,debugLabel:u="useLiveQuery",emptyReadyGraceMs:k=0}=n,B=useRef(null),z=useRef(null),w=useRef(""),N=useRef(0),Q=useRef(false),C=useRef(false),O=useRef(e),L=useRef(d??null),_=useRef(q),Z=useRef(E),t=useRef(x),a=useRef(l),o=useRef(x),s=useRef(r),c=useRef(S),y=useRef(r),p=useRef(null),m=useRef(F),v=useRef(u),T=useRef(k),h=useRef(null),g=useRef(null),$=useRef(0),J=()=>{let j=globalThis,X=j?.__ZUZ_LIVE_QUERY_TRACE,f=false,U=null;try{typeof window<"u"&&window.localStorage&&(f=window.localStorage.getItem("__ZUZ_LIVE_QUERY_TRACE")==="1",U=window.localStorage.getItem("__ZUZ_LIVE_QUERY_TRACE_FILTER"));}catch{}if(!X&&!f)return false;let K=j?.__ZUZ_LIVE_QUERY_TRACE_FILTER??U;return K?String(v.current).toLowerCase().includes(String(K).toLowerCase()):true},b=(...j)=>{(m.current||J())&&console.log(`[${v.current}]`,...j);};useEffect(()=>{O.current=e;},[e]),useEffect(()=>{L.current=d??null;},[d]),useEffect(()=>{_.current=q;},[q]),useEffect(()=>{Z.current=E;},[E]),useEffect(()=>{t.current=x,o.current=x;},[x]),useEffect(()=>{a.current=l;},[l]),useEffect(()=>{s.current=r,y.current=r;},[r]),useEffect(()=>{c.current=S;},[S]),useEffect(()=>{m.current=F;},[F]),useEffect(()=>{v.current=u;},[u]),useEffect(()=>{T.current=k;},[k]);let A=useCallback(()=>{h.current!==null&&(clearTimeout(h.current),h.current=null),g.current=null;},[]),G=useCallback(()=>{p.current!==null&&(clearTimeout(p.current),p.current=null);},[]),D=useCallback(()=>{A(),G(),z.current?.(),B.current?.close(),z.current=null,Q.current=false,C.current=false,$.current=0,w.current="";},[A,G]),W=useCallback((j,X=false)=>{D(),N.current+=1,X||(o.current=t.current,y.current=s.current),j&&(L.current=j),L.current&&(B.current=L.current.stream({flushMs:_.current?.flushMs??20,maxBatchSize:_.current?.maxBatchSize??20,insertAt:_.current?.insertAt??"end",maxDocs:_.current?.maxDocs??50}),z.current=B.current.subscribe((f,U)=>{p.current!==null&&G();let K=f.map(I=>`${I?.id??""}:${I?.updatedAt??I?.updated_at??I?.mtime??""}`).join(","),ne=`${N.current}:${U?.ready?1:0}:${K}`;$.current+=1;let P=$.current;if(b("emission",{emissionNo:P,generation:N.current,ready:!!U?.ready,size:f.length,firstRetryRemaining:o.current,hasNonEmpty:C.current}),ne===w.current){b("skip duplicate",{emissionNo:P,size:f.length,metaReady:!!U?.ready});return}w.current=ne;let ee=!Q.current,oe=ee&&Z.current&&f.length>0,V=ee&&oe?true:!!U?.ready,te=!!U?.ready;if(ee&&!te&&f.length===0&&y.current>0){let I=Math.max(0,c.current),ce=y.current-1;p.current=setTimeout(()=>{p.current=null,y.current=Math.max(0,y.current-1),b("stalled first emission timeout hit \u2014 rebuilding stream",{stallTimeout:I,retriesLeft:y.current}),W(void 0,true);},I),b("schedule stalled-first-emission retry",{emissionNo:P,stallTimeout:I,retriesLeft:ce});return}if(te&&f.length===0&&!C.current&&o.current>0){o.current-=1;let I=Math.max(0,a.current);b("schedule first-ready-empty retry",{emissionNo:P,retryDelay:I,retriesLeft:o.current}),setTimeout(()=>{W(void 0,true);},I);return}if(h.current!==null&&f.length>0){A(),Q.current=true,C.current=true,b("emit non-empty after grace wait",{emissionNo:P,ready:V,size:f.length}),O.current(f,{ready:V});return}if(te&&f.length===0&&T.current>0&&h.current===null){g.current={rows:f},Q.current=true,h.current=setTimeout(()=>{h.current=null;let I=g.current;g.current=null,I&&(b("emit deferred empty after grace timeout",{size:I.rows.length}),O.current(I.rows,{ready:true}));},T.current),b("start empty-ready grace timer",{emissionNo:P,graceMs:T.current});return}if(!Q.current){Q.current=true,f.length>0&&(C.current=true),b("emit first payload",{emissionNo:P,ready:V,size:f.length}),O.current(f,{ready:V});return}b("emit update",{emissionNo:P,size:f.length,metaReady:!!U?.ready}),f.length>0&&(C.current=true),O.current(f,{ready:!!U?.ready});}));},[D]);return useEffect(()=>()=>{b("[Sidebar] Cleaning up boards stream"),D();},[D]),{buildStream:W,closeStream:D,cancelGraceTimer:A}},le=ie;var ae=(l=>(l[l.Error=-1]="Error",l[l.Idle=0]="Idle",l[l.FetchingServer=1]="FetchingServer",l[l.Uploading=2]="Uploading",l[l.Saving=3]="Saving",l[l.Saved=4]="Saved",l))(ae||{});function re(){return Date.now()}function me(){let n=globalThis.crypto?.randomUUID;return typeof n=="function"?n.call(globalThis.crypto).replace(/-/g,"").substring(0,20):`${re()}-${Math.random().toString(36).slice(2,10)}`}function fe(n){return (String(n.file?.name??"file").trim()||"file").replace(/^\/+|\/+$/g,"")}function ye(n,d,q){let e=(q?.(n,d)??n.key??fe(n)).trim();return {id:n.id??me(),file:n.file,bucket:String(n.bucket??"").trim(),objectKey:e,contentType:n.contentType,access:n.access,encrypt:n.encrypt,base64:n.base64,base64MaxBytes:n.base64MaxBytes,progress:0,speed:0,eta:0,bytes:Math.max(0,Number(n.file?.size??0)),uploadedBytes:0,status:0}}function pe(n,d){let q=n.total>0?n.total:d,e=Math.max(0,Math.min(n.loaded,q||n.loaded)),E=q>0?Math.round(e/q*100):Math.max(0,Math.min(100,n.percent||0));return {loaded:e,total:q,percent:E}}var ge=(n,d={})=>{let[,q]=useState(0),e=useRef({que:[],index:-1,speed:0,stamp:null,token:null,status:0}),E=useRef(false),x=useRef(false),l=useRef(null),r=useCallback(()=>{q(t=>t+1);},[]),S=useCallback((t,a)=>{let o=e.current.que.findIndex(s=>s.id===t);o<0||(e.current.que[o]=a(e.current.que[o]));},[]),F=useCallback(()=>e.current.que.some(t=>t.status===0||t.status===-1),[]),u=useCallback(()=>{let t=e.current,a=t.que[t.index];if(x.current&&a&&a.status===2){t.status=2,t.speed=a.speed;return}if(E.current&&t.que.some(o=>o.status===0||o.status===-1)){t.status=0,t.speed=0;return}if(t.que.length>0&&t.que.every(o=>o.status===4)){t.status=4,t.speed=0;return}if(t.que.some(o=>o.status===-1)){t.status=-1,t.speed=0;return}t.status=0,t.speed=0;},[]),k=useCallback(async()=>{if(x.current)return l.current??Promise.resolve();x.current=true;let t=(async()=>{for(;!E.current;){let o=e.current.que.findIndex(m=>m.status===0||m.status===-1);if(o<0)break;e.current.index=o;let s=e.current.que[o],c=re(),y=0,p=c;S(s.id,m=>({...m,status:2,progress:0,speed:0,eta:m.bytes>0?Number.POSITIVE_INFINITY:0,uploadedBytes:0,error:void 0})),e.current.stamp=c,u(),r();try{let m=await n.putObject({bucket:s.bucket,key:s.objectKey,body:s.file,contentType:s.contentType??s.file.type,access:s.access,encrypt:s.encrypt,base64:s.base64,base64MaxBytes:s.base64MaxBytes,onProgress:T=>{let h=re(),g=pe(T,s.bytes),$=Math.max(1,h-p),J=Math.max(0,g.loaded-y),b=Math.round(J*1e3/$),A=Math.max(0,g.total-g.loaded),G=b>0?Math.ceil(A/b):0;y=g.loaded,p=h,S(s.id,D=>({...D,progress:g.percent,speed:b,eta:G,uploadedBytes:g.loaded,bytes:g.total,status:2})),e.current.speed=b,e.current.stamp=h,r();}});S(s.id,T=>({...T,status:4,progress:100,speed:0,eta:0,uploadedBytes:T.bytes,result:m}));let v=e.current.que.find(T=>T.id===s.id);v&&d.onItemComplete?.(v,m);}catch(m){let v=m instanceof Error?m.message:String(m),T=m instanceof Error?m:new Error(v);S(s.id,g=>({...g,status:-1,speed:0,eta:0,error:v}));let h=e.current.que.find(g=>g.id===s.id);h&&d.onItemError?.(h,T);}e.current.speed=0,u(),r();}x.current=false,e.current.index=-1,e.current.speed=0,u(),F()||d.onQueueComplete?.(e.current.que),r();})();return l.current=t.finally(()=>{l.current=null;}),l.current},[F,d,u,S,n,r]),B=useCallback(t=>{let a=Array.isArray(t)?t:[t],o=[];for(let s of a){let c=ye(s,e.current.que.length,d.keyResolver);e.current.que.push(c),o.push(c.id);}return u(),r(),d.autoStartOnAdd!==false&&!E.current&&k(),o},[d.autoStartOnAdd,d.keyResolver,k,u,r]),z=useCallback(t=>{let a=e.current.que.findIndex(c=>c.id===t);if(a<0||e.current.que[e.current.index]?.id===t)return;let s=e.current.que[a];if(s.status===4){if(typeof n.deleteObject!="function"){let c=new Error("Storage driver does not implement deleteObject for completed uploads");S(t,p=>({...p,status:-1,speed:0,eta:0,error:c.message}));let y=e.current.que.find(p=>p.id===t);y&&d.onItemError?.(y,c),u(),r();return}S(t,c=>({...c,status:3,speed:0,eta:0,error:void 0})),u(),r(),(async()=>{try{await n.deleteObject?.({bucket:s.bucket,key:s.objectKey});let c=e.current.que.findIndex(p=>p.id===t);if(c<0||e.current.que[e.current.index]?.id===t)return;e.current.que.splice(c,1),e.current.index>c&&(e.current.index-=1),u(),r();}catch(c){let y=c instanceof Error?c.message:String(c),p=c instanceof Error?c:new Error(y);S(t,v=>({...v,status:-1,speed:0,eta:0,error:y}));let m=e.current.que.find(v=>v.id===t);m&&d.onItemError?.(m,p),u(),r();}})();return}e.current.que.splice(a,1),e.current.index>a&&(e.current.index-=1),u(),r();},[d,u,S,n,r]),w=useCallback(()=>{x.current||(e.current.que=[],e.current.index=-1,e.current.speed=0,e.current.stamp=null,e.current.token=null,e.current.status=0,E.current=true,r());},[r]),N=useCallback(()=>{let t=e.current.que[e.current.index]?.id;e.current.que=e.current.que.filter(a=>a.id===t?true:a.status!==4),e.current.index=e.current.que.findIndex(a=>a.id===t),u(),r();},[u,r]),Q=useCallback(t=>{S(t,a=>a.status!==-1?a:{...a,status:0,progress:0,speed:0,eta:0,uploadedBytes:0,error:void 0,result:void 0}),u(),r();},[u,S,r]),C=useCallback(()=>{e.current.que=e.current.que.map(t=>t.status!==-1?t:{...t,status:0,progress:0,speed:0,eta:0,uploadedBytes:0,error:void 0,result:void 0}),u(),r();},[u,r]),O=useCallback(()=>{E.current=true,u(),r();},[u,r]),L=useCallback(async()=>{E.current=false,u(),r(),await k();},[k,u,r]),_=useCallback(()=>{x.current||(E.current=true,e.current.que=e.current.que.map(t=>({...t,progress:0,speed:0,eta:0,uploadedBytes:0,error:void 0,result:void 0,status:0})),e.current.index=-1,e.current.speed=0,e.current.stamp=null,e.current.token=null,e.current.status=0,r());},[r]),Z=e.current.que[e.current.index]??null;return {...e.current,que:[...e.current.que],running:x.current,isPaused:E.current,hasPending:F(),current:Z,addToQueue:B,remove:z,clear:w,clearDone:N,retry:Q,retryAllFailed:C,start:L,pause:O,reset:_}},be=ge;export{ae as Status,le as useLiveQuery,be as useStorage};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zuzjs/flare",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.27",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"core",
|
|
6
6
|
"zuz",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"@grpc/grpc-js": "^1.14.0",
|
|
51
51
|
"@grpc/proto-loader": "^0.8.0",
|
|
52
52
|
"@zuzjs/auth": "^0.1.9",
|
|
53
|
-
"@zuzjs/core": "^0.3.
|
|
53
|
+
"@zuzjs/core": "^0.3.23"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
56
|
"react": "^19.2.3"
|