@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/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-D53u7tRA.cjs';
2
- import './index-18tMqAtM.cjs';
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
- export { useLiveQuery };
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-CXCOH5iN.js';
2
- import './index-18tMqAtM.js';
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
- export { useLiveQuery };
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.25",
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.22"
53
+ "@zuzjs/core": "^0.3.23"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "react": "^19.2.3"