@electric-sql/client 1.1.1 → 1.1.3
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 +74 -12
- package/dist/cjs/index.cjs +83 -65
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +45 -18
- package/dist/index.browser.mjs +3 -3
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.d.ts +45 -18
- package/dist/index.legacy-esm.js +83 -65
- package/dist/index.legacy-esm.js.map +1 -1
- package/dist/index.mjs +83 -65
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +142 -21
- package/src/constants.ts +1 -0
- package/src/fetch.ts +37 -88
package/dist/cjs/index.d.cts
CHANGED
|
@@ -145,28 +145,14 @@ interface BackoffOptions {
|
|
|
145
145
|
* Maximum number of retry attempts before giving up.
|
|
146
146
|
* Set to Infinity (default) for indefinite retries - needed for offline scenarios
|
|
147
147
|
* where clients may go offline and come back later.
|
|
148
|
-
*
|
|
149
|
-
* The retry budget provides protection against retry storms even with infinite retries.
|
|
150
148
|
*/
|
|
151
149
|
maxRetries?: number;
|
|
152
|
-
/**
|
|
153
|
-
* Percentage of requests that can be retries (0.1 = 10%)
|
|
154
|
-
*
|
|
155
|
-
* This is the primary load shedding mechanism. It limits the *rate* of retries,
|
|
156
|
-
* not the total count. Even with infinite retries, at most 10% of your traffic
|
|
157
|
-
* will be retries, preventing retry storms from amplifying server load.
|
|
158
|
-
*
|
|
159
|
-
* The budget resets every 60 seconds, so a temporary spike of errors won't
|
|
160
|
-
* permanently exhaust the budget.
|
|
161
|
-
*/
|
|
162
|
-
retryBudgetPercent?: number;
|
|
163
150
|
}
|
|
164
151
|
declare const BackoffDefaults: {
|
|
165
152
|
initialDelay: number;
|
|
166
153
|
maxDelay: number;
|
|
167
154
|
multiplier: number;
|
|
168
155
|
maxRetries: number;
|
|
169
|
-
retryBudgetPercent: number;
|
|
170
156
|
};
|
|
171
157
|
|
|
172
158
|
declare const LIVE_CACHE_BUSTER_QUERY_PARAM = "cursor";
|
|
@@ -318,10 +304,51 @@ interface ShapeStreamOptions<T = never> {
|
|
|
318
304
|
transformer?: TransformFunction<T>;
|
|
319
305
|
/**
|
|
320
306
|
* A function for handling shapestream errors.
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
*
|
|
324
|
-
*
|
|
307
|
+
*
|
|
308
|
+
* **Automatic retries**: The client automatically retries 5xx server errors, network
|
|
309
|
+
* errors, and 429 rate limits with exponential backoff. The `onError` callback is
|
|
310
|
+
* only invoked after these automatic retries are exhausted, or for non-retryable
|
|
311
|
+
* errors like 4xx client errors.
|
|
312
|
+
*
|
|
313
|
+
* When not provided, non-retryable errors will be thrown and syncing will stop.
|
|
314
|
+
*
|
|
315
|
+
* **Return value behavior**:
|
|
316
|
+
* - Return an **object** (RetryOpts or empty `{}`) to retry syncing:
|
|
317
|
+
* - `{}` - Retry with the same params and headers
|
|
318
|
+
* - `{ params }` - Retry with modified params
|
|
319
|
+
* - `{ headers }` - Retry with modified headers (e.g., refreshed auth token)
|
|
320
|
+
* - `{ params, headers }` - Retry with both modified
|
|
321
|
+
* - Return **void** or **undefined** to stop the stream permanently
|
|
322
|
+
*
|
|
323
|
+
* **Important**: If you want syncing to continue after an error (e.g., to retry
|
|
324
|
+
* on network failures), you MUST return at least an empty object `{}`. Simply
|
|
325
|
+
* logging the error and returning nothing will stop syncing.
|
|
326
|
+
*
|
|
327
|
+
* Supports async functions that return `Promise<void | RetryOpts>`.
|
|
328
|
+
*
|
|
329
|
+
* @example
|
|
330
|
+
* ```typescript
|
|
331
|
+
* // Retry on network errors, stop on others
|
|
332
|
+
* onError: (error) => {
|
|
333
|
+
* console.error('Stream error:', error)
|
|
334
|
+
* if (error instanceof FetchError && error.status >= 500) {
|
|
335
|
+
* return {} // Retry with same params
|
|
336
|
+
* }
|
|
337
|
+
* // Return void to stop on other errors
|
|
338
|
+
* }
|
|
339
|
+
* ```
|
|
340
|
+
*
|
|
341
|
+
* @example
|
|
342
|
+
* ```typescript
|
|
343
|
+
* // Refresh auth token on 401
|
|
344
|
+
* onError: async (error) => {
|
|
345
|
+
* if (error instanceof FetchError && error.status === 401) {
|
|
346
|
+
* const newToken = await refreshAuthToken()
|
|
347
|
+
* return { headers: { Authorization: `Bearer ${newToken}` } }
|
|
348
|
+
* }
|
|
349
|
+
* return {} // Retry other errors
|
|
350
|
+
* }
|
|
351
|
+
* ```
|
|
325
352
|
*/
|
|
326
353
|
onError?: ShapeStreamErrorHandler;
|
|
327
354
|
}
|
package/dist/index.browser.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
var
|
|
2
|
-
`;t.forEach(
|
|
1
|
+
var as=Object.defineProperty,os=Object.defineProperties;var cs=Object.getOwnPropertyDescriptors;var Ce=Object.getOwnPropertySymbols;var Pt=Object.prototype.hasOwnProperty,_t=Object.prototype.propertyIsEnumerable;var xt=r=>{throw TypeError(r)};var At=(r,e,t)=>e in r?as(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,S=(r,e)=>{for(var t in e||(e={}))Pt.call(e,t)&&At(r,t,e[t]);if(Ce)for(var t of Ce(e))_t.call(e,t)&&At(r,t,e[t]);return r},pe=(r,e)=>os(r,cs(e));var wt=(r,e)=>{var t={};for(var s in r)Pt.call(r,s)&&e.indexOf(s)<0&&(t[s]=r[s]);if(r!=null&&Ce)for(var s of Ce(r))e.indexOf(s)<0&&_t.call(r,s)&&(t[s]=r[s]);return t};var Xe=(r,e,t)=>e.has(r)||xt("Cannot "+t);var n=(r,e,t)=>(Xe(r,e,"read from private field"),t?t.call(r):e.get(r)),f=(r,e,t)=>e.has(r)?xt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),c=(r,e,t,s)=>(Xe(r,e,"write to private field"),s?s.call(r,t):e.set(r,t),t),d=(r,e,t)=>(Xe(r,e,"access private method"),t);var ke=(r,e,t,s)=>({set _(a){c(r,e,a,t)},get _(){return n(r,e,s)}});var g=(r,e,t)=>new Promise((s,a)=>{var o=l=>{try{h(t.next(l))}catch(p){a(p)}},i=l=>{try{h(t.throw(l))}catch(p){a(p)}},h=l=>l.done?s(l.value):Promise.resolve(l.value).then(o,i);h((t=t.apply(r,e)).next())});var y=class r extends Error{constructor(t,s,a,o,i,h){super(h||`HTTP Error ${t} at ${i}: ${s!=null?s:JSON.stringify(a)}`);this.url=i;this.name="FetchError",this.status=t,this.text=s,this.json=a,this.headers=o}static fromResponse(t,s){return g(this,null,function*(){let a=t.status,o=Object.fromEntries([...t.headers.entries()]),i,h,l=t.headers.get("content-type");return t.bodyUsed||(l&&l.includes("application/json")?h=yield t.json():i=yield t.text()),new r(a,i,h,o,s)})}},U=class extends Error{constructor(){super("Fetch with backoff aborted"),this.name="FetchBackoffAbortError"}};var Ue=class extends Error{constructor(){super("Invalid shape options: missing required url parameter"),this.name="MissingShapeUrlError"}},Oe=class extends Error{constructor(){super("Invalid signal option. It must be an instance of AbortSignal."),this.name="InvalidSignalError"}},He=class extends Error{constructor(){super("shapeHandle is required if this isn't an initial fetch (i.e. offset > -1)"),this.name="MissingShapeHandleError"}},Le=class extends Error{constructor(e){super(`Cannot use reserved Electric parameter names in custom params: ${e.join(", ")}`),this.name="ReservedParamError"}},De=class extends Error{constructor(e){super(`Column "${e!=null?e:"unknown"}" does not allow NULL values`),this.name="ParserNullValueError"}};var Ie=class extends Error{constructor(e,t){let s=`The response for the shape request to ${e} didn't include the following required headers:
|
|
2
|
+
`;t.forEach(a=>{s+=`- ${a}
|
|
3
3
|
`}),s+=`
|
|
4
4
|
This is often due to a proxy not setting CORS correctly so that all Electric headers can be read by the client.`,s+=`
|
|
5
|
-
For more information visit the troubleshooting guide: /docs/guides/troubleshooting/missing-headers`,super(s)}};var Be=r=>Number(r),ls=r=>r==="true"||r==="t",fs=r=>BigInt(r),wt=r=>JSON.parse(r),us=r=>r,ds={int2:Be,int4:Be,int8:fs,bool:ls,float4:Be,float8:Be,json:wt,jsonb:wt};function ps(r,e){let t=0,s=null,i="",o=!1,a=0,l;function f(m,E,Z){let b=m.slice(E,Z);return b=b==="NULL"?null:b,e?e(b):b}function d(m){let E=[];for(;t<m.length;t++){if(s=m[t],o)s==="\\"?i+=m[++t]:s==='"'?(E.push(e?e(i):i),i="",o=m[t+1]==='"',a=t+2):i+=s;else if(s==='"')o=!0;else if(s==="{")a=++t,E.push(d(m));else if(s==="}"){o=!1,a<t&&E.push(f(m,a,t)),a=t+1;break}else s===","&&l!=="}"&&l!=='"'&&(E.push(f(m,a,t)),a=t+1);l=s}return a<t&&E.push(E.push(f(m,a,t+1))),E}return d(r)[0]}var Fe=class{constructor(e,t){this.parser=S(S({},ds),e),this.transformer=t}parse(e,t){return JSON.parse(e,(s,i)=>{if((s==="value"||s==="old_value")&&typeof i=="object"&&i!==null){let o=i;Object.keys(o).forEach(a=>{o[a]=this.parseRow(a,o[a],t)}),this.transformer&&(i=this.transformer(i))}return i})}parseRow(e,t,s){var E;let i=s[e];if(!i)return t;let m=i,{type:o,dims:a}=m,l=xt(m,["type","dims"]),f=(E=this.parser[o])!=null?E:us,d=Tt(f,i,e);return a&&a>0?Tt((b,pe)=>ps(b,d),i,e)(t):d(t,l)}};function Tt(r,e,t){var i;let s=!((i=e.not_null)!=null&&i);return o=>{if(o===null){if(!s)throw new De(t!=null?t:"unknown");return null}return r(o,e)}}function te(r){return"key"in r}function Ne(r){return!te(r)}function ze(r){return Ne(r)&&r.headers.control==="up-to-date"}function Mt(r){let e=r.headers.global_last_seen_lsn;if(e)return`${e}_0`}function Xe(r,e){let t=BigInt(r),s=BigInt(e.xmin),i=BigInt(e.xmax),o=e.xip_list.map(BigInt);return t<s||t<i&&!o.includes(t)}var vt="electric-cursor",Ee="electric-handle",qe="electric-offset",Ct="electric-schema",Ut="electric-up-to-date",kt="columns",Ve="cursor",Ze="expired_handle",se="handle",k="live",re="offset",Ot="table",Ht="where",Lt="replica",Dt="params",It="experimental_live_sse",Bt="live_sse",et="force-disconnect-and-refresh",tt="pause-stream",st="log",Re="subset__where",Se="subset__limit",ye="subset__offset",be="subset__order_by",Ae="subset__params",rt=[k,se,re,Ve,Ze,st,Re,Se,ye,be,Ae];var ms=[429],Ye={initialDelay:100,maxDelay:6e4,multiplier:1.3,maxRetries:1/0,retryBudgetPercent:.1};function Ft(r,e=Ye){let{initialDelay:t,maxDelay:s,multiplier:i,debug:o=!1,onFailedAttempt:a,maxRetries:l=1/0,retryBudgetPercent:f=.1}=e,d=0,m=0,E=Date.now()+6e4;function Z(b){let pe=Date.now();if(pe>E&&(d=0,m=0,E=pe+6e4),d++,d<10)return!0;let K=m/d<b;return K&&m++,K}return(...b)=>g(this,null,function*(){var Et;let pe=b[0],Ce=b[1],K=t,me=0;for(;;)try{let A=yield r(...b);if(A.ok)return K=t,A;throw yield y.fromResponse(A,pe.toString())}catch(A){if(a==null||a(),(Et=Ce==null?void 0:Ce.signal)!=null&&Et.aborted)throw new U;if(A instanceof y&&!ms.includes(A.status)&&A.status>=400&&A.status<500)throw A;{if(me++,me>=l)throw o&&console.log(`Max retries reached (${me}/${l}), giving up`),A;if(!Z(f)){o&&console.log(`Retry budget exhausted (attempt ${me}), backing off`),yield new Promise(C=>setTimeout(C,s));continue}let ee=0;if(A instanceof y&&A.headers){let C=A.headers["retry-after"];if(C){let We=Number(C);if(Number.isFinite(We)&&We>0)ee=We*1e3;else{let yt=Date.parse(C);if(!isNaN(yt)){let as=yt-Date.now();ee=Math.max(0,Math.min(as,36e5))}}}}let is=Math.random()*K,Rt=Math.min(is,s),St=Math.max(ee,Rt);if(o){let C=ee>0?"server+client":"client";console.log(`Retry attempt #${me} after ${St}ms (${C}, serverMin=${ee}ms, clientBackoff=${Rt}ms)`)}yield new Promise(C=>setTimeout(C,St)),K=Math.min(K*i,s)}}})}var gs=[201,204,205];function Nt(r){return(...e)=>g(this,null,function*(){var i,o;let t=e[0],s=yield r(...e);try{if(s.status<200||gs.includes(s.status))return s;let a=yield s.text();return new Response(a,s)}catch(a){throw(o=(i=e[1])==null?void 0:i.signal)!=null&&o.aborted?new U:new y(s.status,void 0,void 0,Object.fromEntries([...s.headers.entries()]),t.toString(),a instanceof Error?a.message:typeof a=="string"?a:"failed to read body")}})}var Es={maxChunksToPrefetch:2};function qt(r,e=Es){let{maxChunksToPrefetch:t}=e,s;return(...o)=>g(this,null,function*(){let a=o[0].toString(),l=s==null?void 0:s.consume(...o);if(l)return l;s==null||s.abort();let f=yield r(...o),d=it(a,f);return d&&(s=new nt({fetchClient:r,maxPrefetchedRequests:t,url:d,requestInit:o[1]})),f})}var Rs=["electric-offset","electric-handle"],Ss=["electric-cursor"],ys=["electric-schema"];function Vt(r){return(...e)=>g(this,null,function*(){let t=yield r(...e);if(t.ok){let s=t.headers,i=[],o=m=>i.push(...m.filter(E=>!s.has(E))),l=e[0].toString(),f=new URL(l);if([Re,Ae,Se,ye,be].some(m=>f.searchParams.has(m)))return t;if(o(Rs),f.searchParams.get(k)==="true"&&o(Ss),(!f.searchParams.has(k)||f.searchParams.get(k)==="false")&&o(ys),i.length>0)throw new Ie(l,i)}return t})}var Pe,_e,O,W,H,ne,je,nt=class{constructor(e){p(this,ne);p(this,Pe);p(this,_e);p(this,O,new Map);p(this,W);p(this,H);var t;c(this,Pe,(t=e.fetchClient)!=null?t:(...s)=>fetch(...s)),c(this,_e,e.maxPrefetchedRequests),c(this,W,e.url.toString()),c(this,H,n(this,W)),u(this,ne,je).call(this,e.url,e.requestInit)}abort(){n(this,O).forEach(([e,t])=>t.abort())}consume(...e){var i;let t=e[0].toString(),s=(i=n(this,O).get(t))==null?void 0:i[0];if(!(!s||t!==n(this,W)))return n(this,O).delete(t),s.then(o=>{let a=it(t,o);c(this,W,a),n(this,H)&&!n(this,O).has(n(this,H))&&u(this,ne,je).call(this,n(this,H),e[1])}).catch(()=>{}),s}};Pe=new WeakMap,_e=new WeakMap,O=new WeakMap,W=new WeakMap,H=new WeakMap,ne=new WeakSet,je=function(...e){var i,o;let t=e[0].toString();if(n(this,O).size>=n(this,_e))return;let s=new AbortController;try{let{signal:a,cleanup:l}=bs(s,(i=e[1])==null?void 0:i.signal),f=n(this,Pe).call(this,t,ge(S({},(o=e[1])!=null?o:{}),{signal:a}));n(this,O).set(t,[f,s]),f.then(d=>{if(!d.ok||s.signal.aborted)return;let m=it(t,d);if(!m||m===t){c(this,H,void 0);return}return c(this,H,m),u(this,ne,je).call(this,m,e[1])}).catch(()=>{}).finally(l)}catch(a){}};function it(r,e){let t=e.headers.get(Ee),s=e.headers.get(qe),i=e.headers.has(Ut);if(!t||!s||i)return;let o=new URL(r);if(!o.searchParams.has(k))return o.searchParams.set(se,t),o.searchParams.set(re,s),o.searchParams.sort(),o.toString()}function bs(r,e){let t=As;if(e)if(e.aborted)r.abort();else{let s=()=>r.abort();e.addEventListener("abort",s,{once:!0,signal:r.signal}),t=()=>e.removeEventListener("abort",s)}return{signal:r.signal,cleanup:t}}function As(){}import{fetchEventSource as Ps}from"@microsoft/fetch-event-source";var at=class{constructor(){this.data={};this.max=250;this.storageKey="electric_expired_shapes";this.load()}getExpiredHandle(e){let t=this.data[e];return t?(t.lastUsed=Date.now(),this.save(),t.expiredHandle):null}markExpired(e,t){this.data[e]={expiredHandle:t,lastUsed:Date.now()};let s=Object.keys(this.data);if(s.length>this.max){let i=s.reduce((o,a)=>this.data[a].lastUsed<this.data[o].lastUsed?a:o);delete this.data[i]}this.save()}save(){if(typeof localStorage!="undefined")try{localStorage.setItem(this.storageKey,JSON.stringify(this.data))}catch(e){}}load(){if(typeof localStorage!="undefined")try{let e=localStorage.getItem(this.storageKey);e&&(this.data=JSON.parse(e))}catch(e){this.data={}}}clear(){this.data={},this.save()}},ot=new at;var Qe=class{constructor(){this.activeSnapshots=new Map;this.xmaxSnapshots=new Map;this.snapshotsByDatabaseLsn=new Map}addSnapshot(e,t){var o,a,l,f;this.activeSnapshots.set(e.snapshot_mark,{xmin:BigInt(e.xmin),xmax:BigInt(e.xmax),xip_list:e.xip_list.map(BigInt),keys:t});let s=(a=(o=this.xmaxSnapshots.get(BigInt(e.xmax)))==null?void 0:o.add(e.snapshot_mark))!=null?a:new Set([e.snapshot_mark]);this.xmaxSnapshots.set(BigInt(e.xmax),s);let i=(f=(l=this.snapshotsByDatabaseLsn.get(BigInt(e.database_lsn)))==null?void 0:l.add(e.snapshot_mark))!=null?f:new Set([e.snapshot_mark]);this.snapshotsByDatabaseLsn.set(BigInt(e.database_lsn),i)}removeSnapshot(e){this.activeSnapshots.delete(e)}shouldRejectMessage(e){let t=e.headers.txids||[];if(t.length===0)return!1;let s=Math.max(...t);for(let[i,o]of this.xmaxSnapshots.entries())if(s>=i)for(let a of o)this.removeSnapshot(a);return[...this.activeSnapshots.values()].some(i=>i.keys.has(e.key)&&Xe(s,i))}lastSeenUpdate(e){for(let[t,s]of this.snapshotsByDatabaseLsn.entries())if(t<=e)for(let i of s)this.removeSnapshot(i)}};var _s=new Set([Ve,se,k,re]);function Yt(r){return g(this,null,function*(){return typeof r=="function"?r():r})}function xs(r){return g(this,null,function*(){let e=Object.entries(r),t=yield Promise.all(e.map(o=>g(this,[o],function*([s,i]){if(i===void 0)return[s,void 0];let a=yield Yt(i);return[s,Array.isArray(a)?a.join(","):a]})));return Object.fromEntries(t.filter(([s,i])=>i!==void 0))})}function ws(r){return g(this,null,function*(){if(!r)return{};let e=Object.entries(r),t=yield Promise.all(e.map(o=>g(this,[o],function*([s,i]){return[s,yield Yt(i)]})));return Object.fromEntries(t)})}function jt(r){let e=new URL(r.origin+r.pathname);for(let[t,s]of r.searchParams)rt.includes(t)||e.searchParams.set(t,s);return e.searchParams.sort(),e.toString()}var Te,ie,ae,G,N,v,_,L,J,q,T,z,D,x,V,I,oe,M,X,B,ce,he,le,Me,j,F,fe,h,xe,we,ht,Qt,lt,$e,$t,Kt,Wt,ft,ut,Gt,Jt,dt,zt,Xt,pt,Zt,ct=class{constructor(e){p(this,h);p(this,Te,null);p(this,ie);p(this,ae);p(this,G);p(this,N,new Map);p(this,v,!1);p(this,_,"active");p(this,L);p(this,J);p(this,q);p(this,T,!1);p(this,z,!0);p(this,D,!1);p(this,x);p(this,V);p(this,I);p(this,oe);p(this,M);p(this,X,!1);p(this,B);p(this,ce);p(this,he);p(this,le,Promise.resolve([]));p(this,Me,new Qe);p(this,j,0);p(this,F);p(this,fe);var o,a,l,f;this.options=S({subscribe:!0},e),Ts(this.options),c(this,L,(o=this.options.offset)!=null?o:"-1"),c(this,J,""),c(this,x,this.options.handle),c(this,G,new Fe(e.parser,e.transformer)),c(this,oe,this.options.onError),c(this,V,(a=this.options.log)!=null?a:"full");let t=(l=e.fetchClient)!=null?l:(...d)=>fetch(...d),s=ge(S({},(f=e.backoffOptions)!=null?f:Ye),{onFailedAttempt:()=>{var d,m;c(this,D,!1),(m=(d=e.backoffOptions)==null?void 0:d.onFailedAttempt)==null||m.call(d)}}),i=Ft(t,s);c(this,ae,Vt(qt(i))),c(this,ie,Nt(n(this,ae))),u(this,h,Xt).call(this)}get shapeHandle(){return n(this,x)}get error(){return n(this,Te)}get isUpToDate(){return n(this,T)}get lastOffset(){return n(this,L)}get mode(){return n(this,V)}subscribe(e,t=()=>{}){let s=Math.random();return n(this,N).set(s,[e,t]),n(this,v)||u(this,h,xe).call(this),()=>{n(this,N).delete(s)}}unsubscribeAll(){n(this,N).clear()}lastSyncedAt(){return n(this,q)}lastSynced(){return n(this,q)===void 0?1/0:Date.now()-n(this,q)}isConnected(){return n(this,D)}isLoading(){return!n(this,T)}hasStarted(){return n(this,v)}isPaused(){return n(this,_)==="paused"}forceDisconnectAndRefresh(){return g(this,null,function*(){var e,t;c(this,X,!0),n(this,T)&&!((e=n(this,M))!=null&&e.signal.aborted)&&((t=n(this,M))==null||t.abort(et)),yield u(this,h,Gt).call(this),c(this,X,!1)})}requestSnapshot(e){return g(this,null,function*(){if(n(this,V)==="full")throw new Error(`Snapshot requests are not supported in ${n(this,V)} mode, as the consumer is guaranteed to observe all data`);n(this,v)||(yield u(this,h,xe).call(this)),yield u(this,h,Jt).call(this),Je(this,j)._++;try{n(this,j)===1&&u(this,h,ft).call(this);let{fetchUrl:t,requestHeaders:s}=yield u(this,h,ht).call(this,this.options.url,!0,e),{metadata:i,data:o}=yield u(this,h,Zt).call(this,t,s),a=o.concat([{headers:S({control:"snapshot-end"},i)}]);return n(this,Me).addSnapshot(i,new Set(o.map(l=>l.key))),u(this,h,$e).call(this,a,!1),{metadata:i,data:o}}finally{Je(this,j)._--,n(this,j)===0&&u(this,h,ut).call(this)}})}};Te=new WeakMap,ie=new WeakMap,ae=new WeakMap,G=new WeakMap,N=new WeakMap,v=new WeakMap,_=new WeakMap,L=new WeakMap,J=new WeakMap,q=new WeakMap,T=new WeakMap,z=new WeakMap,D=new WeakMap,x=new WeakMap,V=new WeakMap,I=new WeakMap,oe=new WeakMap,M=new WeakMap,X=new WeakMap,B=new WeakMap,ce=new WeakMap,he=new WeakMap,le=new WeakMap,Me=new WeakMap,j=new WeakMap,F=new WeakMap,fe=new WeakMap,h=new WeakSet,xe=function(){return g(this,null,function*(){var e;c(this,v,!0);try{yield u(this,h,we).call(this)}catch(t){if(c(this,Te,t),n(this,oe)){let s=yield n(this,oe).call(this,t);typeof s=="object"&&(u(this,h,pt).call(this),"params"in s&&(this.options.params=s.params),"headers"in s&&(this.options.headers=s.headers),c(this,v,!1),u(this,h,xe).call(this));return}throw t}finally{c(this,D,!1),(e=n(this,he))==null||e.call(this)}})},we=function(){return g(this,null,function*(){var f,d;if(n(this,_)==="pause-requested"){c(this,_,"paused");return}if(!this.options.subscribe&&((f=this.options.signal)!=null&&f.aborted||n(this,T)))return;let e=n(this,_)==="paused";c(this,_,"active");let{url:t,signal:s}=this.options,{fetchUrl:i,requestHeaders:o}=yield u(this,h,ht).call(this,t,e),a=yield u(this,h,Qt).call(this,s),l=n(this,M);try{yield u(this,h,$t).call(this,{fetchUrl:i,requestAbortController:l,headers:o,resumingFromPause:e})}catch(m){if((m instanceof y||m instanceof U)&&l.signal.aborted&&l.signal.reason===et)return u(this,h,we).call(this);if(m instanceof U){l.signal.aborted&&l.signal.reason===tt&&c(this,_,"paused");return}if(!(m instanceof y))throw m;if(m.status==409){if(n(this,x)){let Z=jt(i);ot.markExpired(Z,n(this,x))}let E=m.headers[Ee]||`${n(this,x)}-next`;return u(this,h,pt).call(this,E),yield u(this,h,dt).call(this,Array.isArray(m.json)?m.json:[m.json]),u(this,h,we).call(this)}else throw u(this,h,zt).call(this,m),m}finally{a&&s&&s.removeEventListener("abort",a),c(this,M,void 0)}return(d=n(this,ce))==null||d.call(this),u(this,h,we).call(this)})},ht=function(e,t,s){return g(this,null,function*(){let[i,o]=yield Promise.all([ws(this.options.headers),this.options.params?xs(Ms(this.options.params)):void 0]);o&&es(o);let a=new URL(e);if(o){o.table&&w(a,Ot,o.table),o.where&&w(a,Ht,o.where),o.columns&&w(a,kt,o.columns),o.replica&&w(a,Lt,o.replica),o.params&&w(a,Dt,o.params);let d=S({},o);delete d.table,delete d.where,delete d.columns,delete d.replica,delete d.params;for(let[m,E]of Object.entries(d))w(a,m,E)}s&&(s.where&&w(a,Re,s.where),s.params&&w(a,Ae,s.params),s.limit&&w(a,Se,s.limit),s.offset&&w(a,ye,s.offset),s.orderBy&&w(a,be,s.orderBy)),a.searchParams.set(re,n(this,L)),a.searchParams.set(st,n(this,V)),n(this,T)&&(!n(this,X)&&!t&&a.searchParams.set(k,"true"),a.searchParams.set(Ve,n(this,J))),n(this,x)&&a.searchParams.set(se,n(this,x));let l=jt(a),f=ot.getExpiredHandle(l);return f&&a.searchParams.set(Ze,f),a.searchParams.sort(),{fetchUrl:a,requestHeaders:i}})},Qt=function(e){return g(this,null,function*(){var t;if(c(this,M,new AbortController),e){let s=()=>{var i;(i=n(this,M))==null||i.abort(e.reason)};return e.addEventListener("abort",s,{once:!0}),e.aborted&&((t=n(this,M))==null||t.abort(e.reason)),s}})},lt=function(e){return g(this,null,function*(){var f;let{headers:t,status:s}=e,i=t.get(Ee);i&&c(this,x,i);let o=t.get(qe);o&&c(this,L,o);let a=t.get(vt);a&&c(this,J,a);let l=()=>{let d=t.get(Ct);return d?JSON.parse(d):{}};c(this,I,(f=n(this,I))!=null?f:l()),s===204&&c(this,q,Date.now())})},$e=function(e,t=!1){return g(this,null,function*(){var s;if(e.length>0){c(this,z,!0);let i=e[e.length-1];if(ze(i)){if(t){let a=Mt(i);a&&c(this,L,a)}c(this,q,Date.now()),c(this,T,!0),c(this,z,!1),(s=n(this,fe))==null||s.call(this)}let o=e.filter(a=>te(a)?!n(this,Me).shouldRejectMessage(a):!0);yield u(this,h,dt).call(this,o)}})},$t=function(e){return g(this,null,function*(){var s;let t=(s=this.options.liveSse)!=null?s:this.options.experimentalLiveSse;return n(this,T)&&t&&!n(this,X)&&!e.resumingFromPause?(e.fetchUrl.searchParams.set(It,"true"),e.fetchUrl.searchParams.set(Bt,"true"),u(this,h,Wt).call(this,e)):u(this,h,Kt).call(this,e)})},Kt=function(e){return g(this,null,function*(){let{fetchUrl:t,requestAbortController:s,headers:i}=e,o=yield n(this,ie).call(this,t.toString(),{signal:s.signal,headers:i});c(this,D,!0),yield u(this,h,lt).call(this,o);let a=n(this,I),f=(yield o.text())||"[]",d=n(this,G).parse(f,a);yield u(this,h,$e).call(this,d)})},Wt=function(e){return g(this,null,function*(){let{fetchUrl:t,requestAbortController:s,headers:i}=e,o=n(this,ae);try{let a=[];yield Ps(t.toString(),{headers:i,fetch:o,onopen:l=>g(this,null,function*(){c(this,D,!0),yield u(this,h,lt).call(this,l)}),onmessage:l=>{if(l.data){let f=n(this,I),d=n(this,G).parse(l.data,f);a.push(d),ze(d)&&(u(this,h,$e).call(this,a,!0),a=[])}},onerror:l=>{throw l},signal:s.signal})}catch(a){throw s.signal.aborted?new U:a}})},ft=function(){var e;n(this,v)&&n(this,_)==="active"&&(c(this,_,"pause-requested"),(e=n(this,M))==null||e.abort(tt))},ut=function(){n(this,v)&&n(this,_)==="paused"&&u(this,h,xe).call(this)},Gt=function(){return g(this,null,function*(){return n(this,B)?n(this,B):(c(this,B,new Promise((e,t)=>{c(this,ce,e),c(this,he,t)})),n(this,B).finally(()=>{c(this,B,void 0),c(this,ce,void 0),c(this,he,void 0)}),n(this,B))})},Jt=function(){return g(this,null,function*(){if(n(this,z))return n(this,F)?n(this,F):(c(this,F,new Promise(e=>{c(this,fe,e)})),n(this,F).finally(()=>{c(this,F,void 0),c(this,fe,void 0)}),n(this,F))})},dt=function(e){return g(this,null,function*(){return c(this,le,n(this,le).then(()=>Promise.all(Array.from(n(this,N).values()).map(i=>g(this,[i],function*([t,s]){try{yield t(e)}catch(o){queueMicrotask(()=>{throw o})}}))))),n(this,le)})},zt=function(e){n(this,N).forEach(([t,s])=>{s==null||s(e)})},Xt=function(){if(typeof document=="object"&&typeof document.hidden=="boolean"&&typeof document.addEventListener=="function"){let e=()=>{document.hidden?u(this,h,ft).call(this):u(this,h,ut).call(this)};document.addEventListener("visibilitychange",e)}},pt=function(e){c(this,L,"-1"),c(this,J,""),c(this,x,e),c(this,T,!1),c(this,z,!0),c(this,D,!1),c(this,I,void 0),c(this,j,0)},Zt=function(e,t){return g(this,null,function*(){let s=yield n(this,ie).call(this,e.toString(),{headers:t});if(!s.ok)throw new y(s.status,void 0,void 0,Object.fromEntries([...s.headers.entries()]),e.toString());let{metadata:i,data:o}=yield s.json(),a=n(this,G).parse(JSON.stringify(o),n(this,I));return{metadata:i,data:a}})},ct.Replica={FULL:"full",DEFAULT:"default"};function es(r){if(!r)return;let e=Object.keys(r).filter(t=>_s.has(t));if(e.length>0)throw new Le(e)}function Ts(r){if(!r.url)throw new ke;if(r.signal&&!(r.signal instanceof AbortSignal))throw new Oe;if(r.offset!==void 0&&r.offset!=="-1"&&r.offset!=="now"&&!r.handle)throw new He;es(r.params)}function w(r,e,t){if(!(t===void 0||t==null))if(typeof t=="string")r.searchParams.set(e,t);else if(typeof t=="object")for(let[s,i]of Object.entries(t))r.searchParams.set(`${e}[${s}]`,i);else r.searchParams.set(e,t.toString())}function Ms(r){return Array.isArray(r.params)?ge(S({},r),{params:Object.fromEntries(r.params.map((e,t)=>[t+1,e]))}):r}var P,Y,Q,ve,ue,de,$,R,ss,rs,mt,Ke,ns,gt,ts=class{constructor(e){p(this,R);p(this,P,new Map);p(this,Y,new Map);p(this,Q,new Set);p(this,ve,new Set);p(this,ue,!1);p(this,de,"syncing");p(this,$,!1);this.stream=e,this.stream.subscribe(u(this,R,ss).bind(this),u(this,R,ns).bind(this))}get isUpToDate(){return n(this,de)==="up-to-date"}get lastOffset(){return this.stream.lastOffset}get handle(){return this.stream.shapeHandle}get rows(){return this.value.then(e=>Array.from(e.values()))}get currentRows(){return Array.from(this.currentValue.values())}get value(){return new Promise((e,t)=>{if(this.stream.isUpToDate)e(this.currentValue);else{let s=this.subscribe(({value:i})=>{s(),n(this,$)&&t(n(this,$)),e(i)})}})}get currentValue(){return n(this,P)}get error(){return n(this,$)}lastSyncedAt(){return this.stream.lastSyncedAt()}lastSynced(){return this.stream.lastSynced()}isLoading(){return this.stream.isLoading()}isConnected(){return this.stream.isConnected()}get mode(){return this.stream.mode}requestSnapshot(e){return g(this,null,function*(){let t=JSON.stringify(e);n(this,ve).add(t),yield u(this,R,mt).call(this),yield this.stream.requestSnapshot(e)})}subscribe(e){let t=Math.random();return n(this,Y).set(t,e),()=>{n(this,Y).delete(t)}}unsubscribeAll(){n(this,Y).clear()}get numSubscribers(){return n(this,Y).size}};P=new WeakMap,Y=new WeakMap,Q=new WeakMap,ve=new WeakMap,ue=new WeakMap,de=new WeakMap,$=new WeakMap,R=new WeakSet,ss=function(e){let t=!1;e.forEach(s=>{if(te(s))if(t=u(this,R,Ke).call(this,"syncing"),this.mode==="full")switch(s.headers.operation){case"insert":n(this,P).set(s.key,s.value);break;case"update":n(this,P).set(s.key,S(S({},n(this,P).get(s.key)),s.value));break;case"delete":n(this,P).delete(s.key);break}else switch(s.headers.operation){case"insert":n(this,Q).add(s.key),n(this,P).set(s.key,s.value);break;case"update":n(this,Q).has(s.key)&&n(this,P).set(s.key,S(S({},n(this,P).get(s.key)),s.value));break;case"delete":n(this,Q).has(s.key)&&(n(this,P).delete(s.key),n(this,Q).delete(s.key));break}if(Ne(s))switch(s.headers.control){case"up-to-date":t=u(this,R,Ke).call(this,"up-to-date"),n(this,ue)&&(c(this,ue,!1),u(this,R,rs).call(this));break;case"must-refetch":n(this,P).clear(),n(this,Q).clear(),c(this,$,!1),t=u(this,R,Ke).call(this,"syncing"),c(this,ue,!0);break}}),t&&u(this,R,gt).call(this)},rs=function(){return g(this,null,function*(){yield u(this,R,mt).call(this),yield Promise.all(Array.from(n(this,ve)).map(e=>g(this,null,function*(){try{let t=JSON.parse(e);yield this.stream.requestSnapshot(t)}catch(t){}})))})},mt=function(){return g(this,null,function*(){this.stream.isUpToDate||(yield new Promise(e=>{let t=()=>{this.stream.isUpToDate&&(clearInterval(s),i(),e())},s=setInterval(t,10),i=this.stream.subscribe(()=>t(),()=>t());t()}))})},Ke=function(e){let t=n(this,de)!==e;return c(this,de,e),t&&e==="up-to-date"},ns=function(e){e instanceof y&&(c(this,$,e),u(this,R,gt).call(this))},gt=function(){n(this,Y).forEach(e=>{e({value:this.currentValue,rows:this.currentRows})})};export{Ye as BackoffDefaults,rt as ELECTRIC_PROTOCOL_QUERY_PARAMS,y as FetchError,ts as Shape,ct as ShapeStream,te as isChangeMessage,Ne as isControlMessage,Xe as isVisibleInSnapshot,Yt as resolveValue};
|
|
5
|
+
For more information visit the troubleshooting guide: /docs/guides/troubleshooting/missing-headers`,super(s)}};var Be=r=>Number(r),hs=r=>r==="true"||r==="t",ls=r=>BigInt(r),Tt=r=>JSON.parse(r),fs=r=>r,us={int2:Be,int4:Be,int8:ls,bool:hs,float4:Be,float8:Be,json:Tt,jsonb:Tt};function ds(r,e){let t=0,s=null,a="",o=!1,i=0,h;function l(m,E,k){let v=m.slice(E,k);return v=v==="NULL"?null:v,e?e(v):v}function p(m){let E=[];for(;t<m.length;t++){if(s=m[t],o)s==="\\"?a+=m[++t]:s==='"'?(E.push(e?e(a):a),a="",o=m[t+1]==='"',i=t+2):a+=s;else if(s==='"')o=!0;else if(s==="{")i=++t,E.push(p(m));else if(s==="}"){o=!1,i<t&&E.push(l(m,i,t)),i=t+1;break}else s===","&&h!=="}"&&h!=='"'&&(E.push(l(m,i,t)),i=t+1);h=s}return i<t&&E.push(E.push(l(m,i,t+1))),E}return p(r)[0]}var Fe=class{constructor(e,t){this.parser=S(S({},us),e),this.transformer=t}parse(e,t){return JSON.parse(e,(s,a)=>{if((s==="value"||s==="old_value")&&typeof a=="object"&&a!==null){let o=a;Object.keys(o).forEach(i=>{o[i]=this.parseRow(i,o[i],t)}),this.transformer&&(a=this.transformer(a))}return a})}parseRow(e,t,s){var E;let a=s[e];if(!a)return t;let m=a,{type:o,dims:i}=m,h=wt(m,["type","dims"]),l=(E=this.parser[o])!=null?E:fs,p=Mt(l,a,e);return i&&i>0?Mt((v,b)=>ds(v,p),a,e)(t):p(t,h)}};function Mt(r,e,t){var a;let s=!((a=e.not_null)!=null&&a);return o=>{if(o===null){if(!s)throw new De(t!=null?t:"unknown");return null}return r(o,e)}}function ee(r){return"key"in r}function Ne(r){return!ee(r)}function Ze(r){return Ne(r)&&r.headers.control==="up-to-date"}function vt(r){let e=r.headers.global_last_seen_lsn;if(e)return`${e}_0`}function et(r,e){let t=BigInt(r),s=BigInt(e.xmin),a=BigInt(e.xmax),o=e.xip_list.map(BigInt);return t<s||t<a&&!o.includes(t)}var Ct="electric-cursor",me="electric-handle",qe="electric-offset",kt="electric-schema",Ut="electric-up-to-date",Ot="columns",Ve="cursor",tt="expired_handle",te="handle",O="live",se="offset",Ht="table",Lt="where",Dt="replica",It="params",Bt="experimental_live_sse",st="live_sse",rt="force-disconnect-and-refresh",nt="pause-stream",it="log",ge="subset__where",Ee="subset__limit",Se="subset__offset",Re="subset__order_by",be="subset__params",at=[O,st,te,se,Ve,tt,it,ge,Ee,Se,Re,be];var ps=[429],Ye={initialDelay:100,maxDelay:6e4,multiplier:1.3,maxRetries:1/0};function ms(r){if(!r)return 0;let e=Number(r);if(Number.isFinite(e)&&e>0)return e*1e3;let t=Date.parse(r);if(!isNaN(t)){let s=t-Date.now();return Math.max(0,Math.min(s,36e5))}return 0}function Ft(r,e=Ye){let{initialDelay:t,maxDelay:s,multiplier:a,debug:o=!1,onFailedAttempt:i,maxRetries:h=1/0}=e;return(...l)=>g(this,null,function*(){var v;let p=l[0],m=l[1],E=t,k=0;for(;;)try{let b=yield r(...l);if(b.ok)return b;throw yield y.fromResponse(b,p.toString())}catch(b){if(i==null||i(),(v=m==null?void 0:m.signal)!=null&&v.aborted)throw new U;if(b instanceof y&&!ps.includes(b.status)&&b.status>=400&&b.status<500)throw b;{if(k++,k>h)throw o&&console.log(`Max retries reached (${k}/${h}), giving up`),b;let ve=b instanceof y&&b.headers?ms(b.headers["retry-after"]):0,is=Math.random()*E,bt=Math.min(is,s),yt=Math.max(ve,bt);if(o){let ze=ve>0?"server+client":"client";console.log(`Retry attempt #${k} after ${yt}ms (${ze}, serverMin=${ve}ms, clientBackoff=${bt}ms)`)}yield new Promise(ze=>setTimeout(ze,yt)),E=Math.min(E*a,s)}}})}var gs=[201,204,205];function Nt(r){return(...e)=>g(this,null,function*(){var a,o;let t=e[0],s=yield r(...e);try{if(s.status<200||gs.includes(s.status))return s;let i=yield s.text();return new Response(i,s)}catch(i){throw(o=(a=e[1])==null?void 0:a.signal)!=null&&o.aborted?new U:new y(s.status,void 0,void 0,Object.fromEntries([...s.headers.entries()]),t.toString(),i instanceof Error?i.message:typeof i=="string"?i:"failed to read body")}})}var Es={maxChunksToPrefetch:2};function qt(r,e=Es){let{maxChunksToPrefetch:t}=e,s;return(...o)=>g(this,null,function*(){let i=o[0].toString(),h=s==null?void 0:s.consume(...o);if(h)return h;s==null||s.abort();let l=yield r(...o),p=ct(i,l);return p&&(s=new ot({fetchClient:r,maxPrefetchedRequests:t,url:p,requestInit:o[1]})),l})}var Ss=["electric-offset","electric-handle"],Rs=["electric-cursor"],bs=["electric-schema"];function Vt(r){return(...e)=>g(this,null,function*(){let t=yield r(...e);if(t.ok){let s=t.headers,a=[],o=m=>a.push(...m.filter(E=>!s.has(E))),h=e[0].toString(),l=new URL(h);if([ge,be,Ee,Se,Re].some(m=>l.searchParams.has(m)))return t;if(o(Ss),l.searchParams.get(O)==="true"&&o(Rs),(!l.searchParams.has(O)||l.searchParams.get(O)==="false")&&o(bs),a.length>0)throw new Ie(h,a)}return t})}var ye,Ae,H,G,L,re,je,ot=class{constructor(e){f(this,re);f(this,ye);f(this,Ae);f(this,H,new Map);f(this,G);f(this,L);var t;c(this,ye,(t=e.fetchClient)!=null?t:(...s)=>fetch(...s)),c(this,Ae,e.maxPrefetchedRequests),c(this,G,e.url.toString()),c(this,L,n(this,G)),d(this,re,je).call(this,e.url,e.requestInit)}abort(){n(this,H).forEach(([e,t])=>t.abort())}consume(...e){var a;let t=e[0].toString(),s=(a=n(this,H).get(t))==null?void 0:a[0];if(!(!s||t!==n(this,G)))return n(this,H).delete(t),s.then(o=>{let i=ct(t,o);c(this,G,i),n(this,L)&&!n(this,H).has(n(this,L))&&d(this,re,je).call(this,n(this,L),e[1])}).catch(()=>{}),s}};ye=new WeakMap,Ae=new WeakMap,H=new WeakMap,G=new WeakMap,L=new WeakMap,re=new WeakSet,je=function(...e){var a,o;let t=e[0].toString();if(n(this,H).size>=n(this,Ae))return;let s=new AbortController;try{let{signal:i,cleanup:h}=ys(s,(a=e[1])==null?void 0:a.signal),l=n(this,ye).call(this,t,pe(S({},(o=e[1])!=null?o:{}),{signal:i}));n(this,H).set(t,[l,s]),l.then(p=>{if(!p.ok||s.signal.aborted)return;let m=ct(t,p);if(!m||m===t){c(this,L,void 0);return}return c(this,L,m),d(this,re,je).call(this,m,e[1])}).catch(()=>{}).finally(h)}catch(i){}};function ct(r,e){let t=e.headers.get(me),s=e.headers.get(qe),a=e.headers.has(Ut);if(!t||!s||a)return;let o=new URL(r);if(!o.searchParams.has(O))return o.searchParams.set(te,t),o.searchParams.set(se,s),o.searchParams.sort(),o.toString()}function ys(r,e){let t=As;if(e)if(e.aborted)r.abort();else{let s=()=>r.abort();e.addEventListener("abort",s,{once:!0,signal:r.signal}),t=()=>e.removeEventListener("abort",s)}return{signal:r.signal,cleanup:t}}function As(){}import{fetchEventSource as Ps}from"@microsoft/fetch-event-source";var ht=class{constructor(){this.data={};this.max=250;this.storageKey="electric_expired_shapes";this.load()}getExpiredHandle(e){let t=this.data[e];return t?(t.lastUsed=Date.now(),this.save(),t.expiredHandle):null}markExpired(e,t){this.data[e]={expiredHandle:t,lastUsed:Date.now()};let s=Object.keys(this.data);if(s.length>this.max){let a=s.reduce((o,i)=>this.data[i].lastUsed<this.data[o].lastUsed?i:o);delete this.data[a]}this.save()}save(){if(typeof localStorage!="undefined")try{localStorage.setItem(this.storageKey,JSON.stringify(this.data))}catch(e){}}load(){if(typeof localStorage!="undefined")try{let e=localStorage.getItem(this.storageKey);e&&(this.data=JSON.parse(e))}catch(e){this.data={}}}clear(){this.data={},this.save()}},lt=new ht;var Qe=class{constructor(){this.activeSnapshots=new Map;this.xmaxSnapshots=new Map;this.snapshotsByDatabaseLsn=new Map}addSnapshot(e,t){var o,i,h,l;this.activeSnapshots.set(e.snapshot_mark,{xmin:BigInt(e.xmin),xmax:BigInt(e.xmax),xip_list:e.xip_list.map(BigInt),keys:t});let s=(i=(o=this.xmaxSnapshots.get(BigInt(e.xmax)))==null?void 0:o.add(e.snapshot_mark))!=null?i:new Set([e.snapshot_mark]);this.xmaxSnapshots.set(BigInt(e.xmax),s);let a=(l=(h=this.snapshotsByDatabaseLsn.get(BigInt(e.database_lsn)))==null?void 0:h.add(e.snapshot_mark))!=null?l:new Set([e.snapshot_mark]);this.snapshotsByDatabaseLsn.set(BigInt(e.database_lsn),a)}removeSnapshot(e){this.activeSnapshots.delete(e)}shouldRejectMessage(e){let t=e.headers.txids||[];if(t.length===0)return!1;let s=Math.max(...t);for(let[a,o]of this.xmaxSnapshots.entries())if(s>=a)for(let i of o)this.removeSnapshot(i);return[...this.activeSnapshots.values()].some(a=>a.keys.has(e.key)&&et(s,a))}lastSeenUpdate(e){for(let[t,s]of this.snapshotsByDatabaseLsn.entries())if(t<=e)for(let a of s)this.removeSnapshot(a)}};var _s=new Set([Ve,te,O,se]);function Yt(r){return g(this,null,function*(){return typeof r=="function"?r():r})}function xs(r){return g(this,null,function*(){let e=Object.entries(r),t=yield Promise.all(e.map(o=>g(this,[o],function*([s,a]){if(a===void 0)return[s,void 0];let i=yield Yt(a);return[s,Array.isArray(i)?i.join(","):i]})));return Object.fromEntries(t.filter(([s,a])=>a!==void 0))})}function ws(r){return g(this,null,function*(){if(!r)return{};let e=Object.entries(r),t=yield Promise.all(e.map(o=>g(this,[o],function*([s,a]){return[s,yield Yt(a)]})));return Object.fromEntries(t)})}function jt(r){let e=new URL(r.origin+r.pathname);for(let[t,s]of r.searchParams)at.includes(t)||e.searchParams.set(t,s);return e.searchParams.sort(),e.toString()}var ne,ie,ae,J,N,C,P,D,z,q,w,X,T,_,V,I,oe,M,Z,B,ce,j,he,xe,Y,F,le,we,Te,Q,$e,fe,We,Ge,u,Pe,_e,ut,Qt,dt,Ke,Kt,$t,Wt,pt,mt,Gt,Jt,gt,Et,zt,Xt,Zt,ft=class{constructor(e){f(this,u);f(this,ne,null);f(this,ie);f(this,ae);f(this,J);f(this,N,new Map);f(this,C,!1);f(this,P,"active");f(this,D);f(this,z);f(this,q);f(this,w,!1);f(this,X,!0);f(this,T,!1);f(this,_);f(this,V);f(this,I);f(this,oe);f(this,M);f(this,Z,!1);f(this,B);f(this,ce);f(this,j);f(this,he,Promise.resolve([]));f(this,xe,new Qe);f(this,Y,0);f(this,F);f(this,le);f(this,we);f(this,Te,1e3);f(this,Q,0);f(this,$e,3);f(this,fe,!1);f(this,We,100);f(this,Ge,5e3);var o,i,h,l;this.options=S({subscribe:!0},e),Ts(this.options),c(this,D,(o=this.options.offset)!=null?o:"-1"),c(this,z,""),c(this,_,this.options.handle),c(this,J,new Fe(e.parser,e.transformer)),c(this,oe,this.options.onError),c(this,V,(i=this.options.log)!=null?i:"full");let t=(h=e.fetchClient)!=null?h:(...p)=>fetch(...p),s=pe(S({},(l=e.backoffOptions)!=null?l:Ye),{onFailedAttempt:()=>{var p,m;c(this,T,!1),(m=(p=e.backoffOptions)==null?void 0:p.onFailedAttempt)==null||m.call(p)}}),a=Ft(t,s);c(this,ae,Vt(qt(a))),c(this,ie,Nt(n(this,ae))),d(this,u,zt).call(this)}get shapeHandle(){return n(this,_)}get error(){return n(this,ne)}get isUpToDate(){return n(this,w)}get lastOffset(){return n(this,D)}get mode(){return n(this,V)}subscribe(e,t=()=>{}){let s=Math.random();return n(this,N).set(s,[e,t]),n(this,C)||d(this,u,Pe).call(this),()=>{n(this,N).delete(s)}}unsubscribeAll(){n(this,N).clear()}lastSyncedAt(){return n(this,q)}lastSynced(){return n(this,q)===void 0?1/0:Date.now()-n(this,q)}isConnected(){return n(this,T)}isLoading(){return!n(this,w)}hasStarted(){return n(this,C)}isPaused(){return n(this,P)==="paused"}forceDisconnectAndRefresh(){return g(this,null,function*(){var e,t;c(this,Z,!0),n(this,w)&&!((e=n(this,M))!=null&&e.signal.aborted)&&((t=n(this,M))==null||t.abort(rt)),yield d(this,u,Gt).call(this),c(this,Z,!1)})}requestSnapshot(e){return g(this,null,function*(){if(n(this,V)==="full")throw new Error(`Snapshot requests are not supported in ${n(this,V)} mode, as the consumer is guaranteed to observe all data`);n(this,C)||(yield d(this,u,Pe).call(this)),yield d(this,u,Jt).call(this),ke(this,Y)._++;try{n(this,Y)===1&&d(this,u,pt).call(this);let{fetchUrl:t,requestHeaders:s}=yield d(this,u,ut).call(this,this.options.url,!0,e),{metadata:a,data:o}=yield d(this,u,Zt).call(this,t,s),i=o.concat([{headers:S({control:"snapshot-end"},a)}]);return n(this,xe).addSnapshot(a,new Set(o.map(h=>h.key))),d(this,u,Ke).call(this,i,!1),{metadata:a,data:o}}finally{ke(this,Y)._--,n(this,Y)===0&&d(this,u,mt).call(this)}})}};ne=new WeakMap,ie=new WeakMap,ae=new WeakMap,J=new WeakMap,N=new WeakMap,C=new WeakMap,P=new WeakMap,D=new WeakMap,z=new WeakMap,q=new WeakMap,w=new WeakMap,X=new WeakMap,T=new WeakMap,_=new WeakMap,V=new WeakMap,I=new WeakMap,oe=new WeakMap,M=new WeakMap,Z=new WeakMap,B=new WeakMap,ce=new WeakMap,j=new WeakMap,he=new WeakMap,xe=new WeakMap,Y=new WeakMap,F=new WeakMap,le=new WeakMap,we=new WeakMap,Te=new WeakMap,Q=new WeakMap,$e=new WeakMap,fe=new WeakMap,We=new WeakMap,Ge=new WeakMap,u=new WeakSet,Pe=function(){return g(this,null,function*(){var e,t,s,a,o;c(this,C,!0);try{yield d(this,u,_e).call(this)}catch(i){if(c(this,ne,i),n(this,oe)){let h=yield n(this,oe).call(this,i);if(h&&typeof h=="object"){h.params&&(this.options.params=S(S({},(e=this.options.params)!=null?e:{}),h.params)),h.headers&&(this.options.headers=S(S({},(t=this.options.headers)!=null?t:{}),h.headers)),c(this,ne,null),c(this,C,!1),yield d(this,u,Pe).call(this);return}i instanceof Error&&d(this,u,Et).call(this,i),c(this,T,!1),(s=n(this,j))==null||s.call(this);return}throw i instanceof Error&&d(this,u,Et).call(this,i),c(this,T,!1),(a=n(this,j))==null||a.call(this),i}c(this,T,!1),(o=n(this,j))==null||o.call(this)})},_e=function(){return g(this,null,function*(){var l,p;if(n(this,P)==="pause-requested"){c(this,P,"paused");return}if(!this.options.subscribe&&((l=this.options.signal)!=null&&l.aborted||n(this,w)))return;let e=n(this,P)==="paused";c(this,P,"active");let{url:t,signal:s}=this.options,{fetchUrl:a,requestHeaders:o}=yield d(this,u,ut).call(this,t,e),i=yield d(this,u,Qt).call(this,s),h=n(this,M);try{yield d(this,u,Kt).call(this,{fetchUrl:a,requestAbortController:h,headers:o,resumingFromPause:e})}catch(m){if((m instanceof y||m instanceof U)&&h.signal.aborted&&h.signal.reason===rt)return d(this,u,_e).call(this);if(m instanceof U){h.signal.aborted&&h.signal.reason===nt&&c(this,P,"paused");return}if(!(m instanceof y))throw m;if(m.status==409){if(n(this,_)){let k=jt(a);lt.markExpired(k,n(this,_))}let E=m.headers[me]||`${n(this,_)}-next`;return d(this,u,Xt).call(this,E),yield d(this,u,gt).call(this,Array.isArray(m.json)?m.json:[m.json]),d(this,u,_e).call(this)}else throw m}finally{i&&s&&s.removeEventListener("abort",i),c(this,M,void 0)}return(p=n(this,ce))==null||p.call(this),d(this,u,_e).call(this)})},ut=function(e,t,s){return g(this,null,function*(){let[a,o]=yield Promise.all([ws(this.options.headers),this.options.params?xs(Ms(this.options.params)):void 0]);o&&es(o);let i=new URL(e);if(o){o.table&&x(i,Ht,o.table),o.where&&x(i,Lt,o.where),o.columns&&x(i,Ot,o.columns),o.replica&&x(i,Dt,o.replica),o.params&&x(i,It,o.params);let p=S({},o);delete p.table,delete p.where,delete p.columns,delete p.replica,delete p.params;for(let[m,E]of Object.entries(p))x(i,m,E)}s&&(s.where&&x(i,ge,s.where),s.params&&x(i,be,s.params),s.limit&&x(i,Ee,s.limit),s.offset&&x(i,Se,s.offset),s.orderBy&&x(i,Re,s.orderBy)),i.searchParams.set(se,n(this,D)),i.searchParams.set(it,n(this,V)),n(this,w)&&(!n(this,Z)&&!t&&i.searchParams.set(O,"true"),i.searchParams.set(Ve,n(this,z))),n(this,_)&&i.searchParams.set(te,n(this,_));let h=jt(i),l=lt.getExpiredHandle(h);return l&&i.searchParams.set(tt,l),i.searchParams.sort(),{fetchUrl:i,requestHeaders:a}})},Qt=function(e){return g(this,null,function*(){var t;if(c(this,M,new AbortController),e){let s=()=>{var a;(a=n(this,M))==null||a.abort(e.reason)};return e.addEventListener("abort",s,{once:!0}),e.aborted&&((t=n(this,M))==null||t.abort(e.reason)),s}})},dt=function(e){return g(this,null,function*(){var l;let{headers:t,status:s}=e,a=t.get(me);a&&c(this,_,a);let o=t.get(qe);o&&c(this,D,o);let i=t.get(Ct);i&&c(this,z,i);let h=()=>{let p=t.get(kt);return p?JSON.parse(p):{}};c(this,I,(l=n(this,I))!=null?l:h()),s===204&&c(this,q,Date.now())})},Ke=function(e,t=!1){return g(this,null,function*(){var s;if(e.length>0){c(this,X,!0);let a=e[e.length-1];if(Ze(a)){if(t){let i=vt(a);i&&c(this,D,i)}c(this,q,Date.now()),c(this,w,!0),c(this,X,!1),(s=n(this,le))==null||s.call(this)}let o=e.filter(i=>ee(i)?!n(this,xe).shouldRejectMessage(i):!0);yield d(this,u,gt).call(this,o)}})},Kt=function(e){return g(this,null,function*(){var s;let t=(s=this.options.liveSse)!=null?s:this.options.experimentalLiveSse;return n(this,w)&&t&&!n(this,Z)&&!e.resumingFromPause&&!n(this,fe)?(e.fetchUrl.searchParams.set(Bt,"true"),e.fetchUrl.searchParams.set(st,"true"),d(this,u,Wt).call(this,e)):d(this,u,$t).call(this,e)})},$t=function(e){return g(this,null,function*(){let{fetchUrl:t,requestAbortController:s,headers:a}=e,o=yield n(this,ie).call(this,t.toString(),{signal:s.signal,headers:a});c(this,T,!0),yield d(this,u,dt).call(this,o);let i=n(this,I),l=(yield o.text())||"[]",p=n(this,J).parse(l,i);yield d(this,u,Ke).call(this,p)})},Wt=function(e){return g(this,null,function*(){let{fetchUrl:t,requestAbortController:s,headers:a}=e,o=n(this,ae);c(this,we,Date.now());try{let i=[];yield Ps(t.toString(),{headers:a,fetch:o,onopen:h=>g(this,null,function*(){c(this,T,!0),yield d(this,u,dt).call(this,h)}),onmessage:h=>{if(h.data){let l=n(this,I),p=n(this,J).parse(h.data,l);i.push(p),Ze(p)&&(d(this,u,Ke).call(this,i,!0),i=[])}},onerror:h=>{throw h},signal:s.signal})}catch(i){throw s.signal.aborted?new U:i}finally{let i=Date.now()-n(this,we),h=s.signal.aborted;if(i<n(this,Te)&&!h)if(ke(this,Q)._++,n(this,Q)>=n(this,$e))c(this,fe,!0),console.warn("[Electric] SSE connections are closing immediately (possibly due to proxy buffering or misconfiguration). Falling back to long polling. Your proxy must support streaming SSE responses (not buffer the complete response). Configuration: Nginx add 'X-Accel-Buffering: no', Caddy add 'flush_interval -1' to reverse_proxy. Note: Do NOT disable caching entirely - Electric uses cache headers to enable request collapsing for efficiency.");else{let l=Math.min(n(this,Ge),n(this,We)*Math.pow(2,n(this,Q))),p=Math.floor(Math.random()*l);yield new Promise(m=>setTimeout(m,p))}else i>=n(this,Te)&&c(this,Q,0)}})},pt=function(){var e;n(this,C)&&n(this,P)==="active"&&(c(this,P,"pause-requested"),(e=n(this,M))==null||e.abort(nt))},mt=function(){n(this,C)&&n(this,P)==="paused"&&d(this,u,Pe).call(this)},Gt=function(){return g(this,null,function*(){return n(this,B)?n(this,B):(c(this,B,new Promise((e,t)=>{c(this,ce,e),c(this,j,t)})),n(this,B).finally(()=>{c(this,B,void 0),c(this,ce,void 0),c(this,j,void 0)}),n(this,B))})},Jt=function(){return g(this,null,function*(){if(n(this,X))return n(this,F)?n(this,F):(c(this,F,new Promise(e=>{c(this,le,e)})),n(this,F).finally(()=>{c(this,F,void 0),c(this,le,void 0)}),n(this,F))})},gt=function(e){return g(this,null,function*(){return c(this,he,n(this,he).then(()=>Promise.all(Array.from(n(this,N).values()).map(a=>g(this,[a],function*([t,s]){try{yield t(e)}catch(o){queueMicrotask(()=>{throw o})}}))))),n(this,he)})},Et=function(e){n(this,N).forEach(([t,s])=>{s==null||s(e)})},zt=function(){if(typeof document=="object"&&typeof document.hidden=="boolean"&&typeof document.addEventListener=="function"){let e=()=>{document.hidden?d(this,u,pt).call(this):d(this,u,mt).call(this)};document.addEventListener("visibilitychange",e)}},Xt=function(e){c(this,D,"-1"),c(this,z,""),c(this,_,e),c(this,w,!1),c(this,X,!0),c(this,T,!1),c(this,I,void 0),c(this,Y,0),c(this,Q,0),c(this,fe,!1)},Zt=function(e,t){return g(this,null,function*(){let s=yield n(this,ie).call(this,e.toString(),{headers:t});if(!s.ok)throw new y(s.status,void 0,void 0,Object.fromEntries([...s.headers.entries()]),e.toString());let{metadata:a,data:o}=yield s.json(),i=n(this,J).parse(JSON.stringify(o),n(this,I));return{metadata:a,data:i}})},ft.Replica={FULL:"full",DEFAULT:"default"};function es(r){if(!r)return;let e=Object.keys(r).filter(t=>_s.has(t));if(e.length>0)throw new Le(e)}function Ts(r){if(!r.url)throw new Ue;if(r.signal&&!(r.signal instanceof AbortSignal))throw new Oe;if(r.offset!==void 0&&r.offset!=="-1"&&r.offset!=="now"&&!r.handle)throw new He;es(r.params)}function x(r,e,t){if(!(t===void 0||t==null))if(typeof t=="string")r.searchParams.set(e,t);else if(typeof t=="object")for(let[s,a]of Object.entries(t))r.searchParams.set(`${e}[${s}]`,a);else r.searchParams.set(e,t.toString())}function Ms(r){return Array.isArray(r.params)?pe(S({},r),{params:Object.fromEntries(r.params.map((e,t)=>[t+1,e]))}):r}var A,K,$,Me,ue,de,W,R,ss,rs,St,Je,ns,Rt,ts=class{constructor(e){f(this,R);f(this,A,new Map);f(this,K,new Map);f(this,$,new Set);f(this,Me,new Set);f(this,ue,!1);f(this,de,"syncing");f(this,W,!1);this.stream=e,this.stream.subscribe(d(this,R,ss).bind(this),d(this,R,ns).bind(this))}get isUpToDate(){return n(this,de)==="up-to-date"}get lastOffset(){return this.stream.lastOffset}get handle(){return this.stream.shapeHandle}get rows(){return this.value.then(e=>Array.from(e.values()))}get currentRows(){return Array.from(this.currentValue.values())}get value(){return new Promise((e,t)=>{if(this.stream.isUpToDate)e(this.currentValue);else{let s=this.subscribe(({value:a})=>{s(),n(this,W)&&t(n(this,W)),e(a)})}})}get currentValue(){return n(this,A)}get error(){return n(this,W)}lastSyncedAt(){return this.stream.lastSyncedAt()}lastSynced(){return this.stream.lastSynced()}isLoading(){return this.stream.isLoading()}isConnected(){return this.stream.isConnected()}get mode(){return this.stream.mode}requestSnapshot(e){return g(this,null,function*(){let t=JSON.stringify(e);n(this,Me).add(t),yield d(this,R,St).call(this),yield this.stream.requestSnapshot(e)})}subscribe(e){let t=Math.random();return n(this,K).set(t,e),()=>{n(this,K).delete(t)}}unsubscribeAll(){n(this,K).clear()}get numSubscribers(){return n(this,K).size}};A=new WeakMap,K=new WeakMap,$=new WeakMap,Me=new WeakMap,ue=new WeakMap,de=new WeakMap,W=new WeakMap,R=new WeakSet,ss=function(e){let t=!1;e.forEach(s=>{if(ee(s))if(t=d(this,R,Je).call(this,"syncing"),this.mode==="full")switch(s.headers.operation){case"insert":n(this,A).set(s.key,s.value);break;case"update":n(this,A).set(s.key,S(S({},n(this,A).get(s.key)),s.value));break;case"delete":n(this,A).delete(s.key);break}else switch(s.headers.operation){case"insert":n(this,$).add(s.key),n(this,A).set(s.key,s.value);break;case"update":n(this,$).has(s.key)&&n(this,A).set(s.key,S(S({},n(this,A).get(s.key)),s.value));break;case"delete":n(this,$).has(s.key)&&(n(this,A).delete(s.key),n(this,$).delete(s.key));break}if(Ne(s))switch(s.headers.control){case"up-to-date":t=d(this,R,Je).call(this,"up-to-date"),n(this,ue)&&(c(this,ue,!1),d(this,R,rs).call(this));break;case"must-refetch":n(this,A).clear(),n(this,$).clear(),c(this,W,!1),t=d(this,R,Je).call(this,"syncing"),c(this,ue,!0);break}}),t&&d(this,R,Rt).call(this)},rs=function(){return g(this,null,function*(){yield d(this,R,St).call(this),yield Promise.all(Array.from(n(this,Me)).map(e=>g(this,null,function*(){try{let t=JSON.parse(e);yield this.stream.requestSnapshot(t)}catch(t){}})))})},St=function(){return g(this,null,function*(){this.stream.isUpToDate||(yield new Promise(e=>{let t=()=>{this.stream.isUpToDate&&(clearInterval(s),a(),e())},s=setInterval(t,10),a=this.stream.subscribe(()=>t(),()=>t());t()}))})},Je=function(e){let t=n(this,de)!==e;return c(this,de,e),t&&e==="up-to-date"},ns=function(e){e instanceof y&&(c(this,W,e),d(this,R,Rt).call(this))},Rt=function(){n(this,K).forEach(e=>{e({value:this.currentValue,rows:this.currentRows})})};export{Ye as BackoffDefaults,at as ELECTRIC_PROTOCOL_QUERY_PARAMS,y as FetchError,ts as Shape,ft as ShapeStream,ee as isChangeMessage,Ne as isControlMessage,et as isVisibleInSnapshot,Yt as resolveValue};
|
|
6
6
|
//# sourceMappingURL=index.browser.mjs.map
|