@electric-sql/client 1.5.3 → 1.5.4

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.
@@ -1,6 +1,7 @@
1
- var Fs=Object.defineProperty,Ns=Object.defineProperties;var qs=Object.getOwnPropertyDescriptors;var Je=Object.getOwnPropertySymbols;var rs=Object.prototype.hasOwnProperty,ns=Object.prototype.propertyIsEnumerable;var as=n=>{throw TypeError(n)};var ss=(n,t,e)=>t in n?Fs(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,E=(n,t)=>{for(var e in t||(t={}))rs.call(t,e)&&ss(n,e,t[e]);if(Je)for(var e of Je(t))ns.call(t,e)&&ss(n,e,t[e]);return n},w=(n,t)=>Ns(n,qs(t));var we=(n,t)=>{var e={};for(var s in n)rs.call(n,s)&&t.indexOf(s)<0&&(e[s]=n[s]);if(n!=null&&Je)for(var s of Je(n))t.indexOf(s)<0&&ns.call(n,s)&&(e[s]=n[s]);return e};var wt=(n,t,e)=>t.has(n)||as("Cannot "+e);var r=(n,t,e)=>(wt(n,t,"read from private field"),e?e.call(n):t.get(n)),p=(n,t,e)=>t.has(n)?as("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(n):t.set(n,e),h=(n,t,e,s)=>(wt(n,t,"write to private field"),s?s.call(n,e):t.set(n,e),e),f=(n,t,e)=>(wt(n,t,"access private method"),e);var re=(n,t,e,s)=>({set _(a){h(n,t,a,e)},get _(){return r(n,t,s)}});var P=class n extends Error{constructor(e,s,a,o,i,l){super(l||`HTTP Error ${e} at ${i}: ${s!=null?s:JSON.stringify(a)}`);this.url=i;this.name="FetchError",this.status=e,this.text=s,this.json=a,this.headers=o}static async fromResponse(e,s){let a=e.status,o=Object.fromEntries([...e.headers.entries()]),i,l,u=e.headers.get("content-type");return e.bodyUsed||(u&&u.includes("application/json")?l=await e.json():i=await e.text()),new n(a,i,l,o,s)}},H=class extends Error{constructor(){super("Fetch with backoff aborted"),this.name="FetchBackoffAbortError"}};var Xe=class extends Error{constructor(){super("Invalid shape options: missing required url parameter"),this.name="MissingShapeUrlError"}},Ze=class extends Error{constructor(){super("Invalid signal option. It must be an instance of AbortSignal."),this.name="InvalidSignalError"}},et=class extends Error{constructor(){super("shapeHandle is required if this isn't an initial fetch (i.e. offset > -1)"),this.name="MissingShapeHandleError"}},tt=class extends Error{constructor(t){super(`Cannot use reserved Electric parameter names in custom params: ${t.join(", ")}`),this.name="ReservedParamError"}},st=class extends Error{constructor(t){super(`Column "${t!=null?t:"unknown"}" does not allow NULL values`),this.name="ParserNullValueError"}};var G=class extends Error{constructor(t,e){let s=`The response for the shape request to ${t} didn't include the following required headers:
2
- `;e.forEach(a=>{s+=`- ${a}
1
+ var Xs=Object.defineProperty,Zs=Object.defineProperties;var er=Object.getOwnPropertyDescriptors;var et=Object.getOwnPropertySymbols;var hs=Object.prototype.hasOwnProperty,us=Object.prototype.propertyIsEnumerable;var ds=r=>{throw TypeError(r)};var ls=(r,t,e)=>t in r?Xs(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e,E=(r,t)=>{for(var e in t||(t={}))hs.call(t,e)&&ls(r,e,t[e]);if(et)for(var e of et(t))us.call(t,e)&&ls(r,e,t[e]);return r},A=(r,t)=>Zs(r,er(t));var Ce=(r,t)=>{var e={};for(var s in r)hs.call(r,s)&&t.indexOf(s)<0&&(e[s]=r[s]);if(r!=null&&et)for(var s of et(r))t.indexOf(s)<0&&us.call(r,s)&&(e[s]=r[s]);return e};var Mt=(r,t,e)=>t.has(r)||ds("Cannot "+e);var a=(r,t,e)=>(Mt(r,t,"read from private field"),e?e.call(r):t.get(r)),f=(r,t,e)=>t.has(r)?ds("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(r):t.set(r,e),u=(r,t,e,s)=>(Mt(r,t,"write to private field"),s?s.call(r,e):t.set(r,e),e),m=(r,t,e)=>(Mt(r,t,"access private method"),e);var ae=(r,t,e,s)=>({set _(n){u(r,t,n,e)},get _(){return a(r,t,s)}});var v=class r extends Error{constructor(e,s,n,o,i,c){super(c||`HTTP Error ${e} at ${i}: ${s!=null?s:JSON.stringify(n)}`);this.url=i;this.name="FetchError",this.status=e,this.text=s,this.json=n,this.headers=o}static async fromResponse(e,s){let n=e.status,o=Object.fromEntries([...e.headers.entries()]),i,c,h=e.headers.get("content-type");return e.bodyUsed||(h&&h.includes("application/json")?c=await e.json():i=await e.text()),new r(n,i,c,o,s)}},H=class extends Error{constructor(){super("Fetch with backoff aborted"),this.name="FetchBackoffAbortError"}};var tt=class extends Error{constructor(){super("Invalid shape options: missing required url parameter"),this.name="MissingShapeUrlError"}},st=class extends Error{constructor(){super("Invalid signal option. It must be an instance of AbortSignal."),this.name="InvalidSignalError"}},rt=class extends Error{constructor(){super("shapeHandle is required if this isn't an initial fetch (i.e. offset > -1)"),this.name="MissingShapeHandleError"}},nt=class extends Error{constructor(t){super(`Cannot use reserved Electric parameter names in custom params: ${t.join(", ")}`),this.name="ReservedParamError"}},at=class extends Error{constructor(t){super(`Column "${t!=null?t:"unknown"}" does not allow NULL values`),this.name="ParserNullValueError"}};var X=class extends Error{constructor(t,e){let s=`The response for the shape request to ${t} didn't include the following required headers:
2
+ `;e.forEach(n=>{s+=`- ${n}
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)}},Pe=class extends Error{constructor(t){super(t),this.name="StaleCacheError"}};var rt=n=>Number(n),$s=n=>n==="true"||n==="t",js=n=>BigInt(n),os=n=>JSON.parse(n),Ys=n=>n,Vs={int2:rt,int4:rt,int8:js,bool:$s,float4:rt,float8:rt,json:os,jsonb:os};function Ws(n,t){let e=0,s=null,a="",o=!1,i=0,l;function u(c,S,x){let A=c.slice(S,x);return A=A==="NULL"?null:A,t?t(A):A}function g(c){let S=[];for(;e<c.length;e++){if(s=c[e],o)s==="\\"?a+=c[++e]:s==='"'?(S.push(t?t(a):a),a="",o=c[e+1]==='"',i=e+2):a+=s;else if(s==='"')o=!0;else if(s==="{")i=++e,S.push(g(c));else if(s==="}"){o=!1,i<e&&S.push(u(c,i,e)),i=e+1;break}else s===","&&l!=="}"&&l!=='"'&&(S.push(u(c,i,e)),i=e+1);l=s}return i<e&&S.push(S.push(u(c,i,e+1))),S}return g(n)[0]}var nt=class{constructor(t,e){this.parser=E(E({},Vs),t),this.transformer=e}parse(t,e){return JSON.parse(t,(s,a)=>(s==="value"||s==="old_value")&&typeof a=="object"&&a!==null?this.transformMessageValue(a,e):a)}parseSnapshotData(t,e){return t.map(s=>{let a=s;return a.value&&typeof a.value=="object"&&a.value!==null&&(a.value=this.transformMessageValue(a.value,e)),a.old_value&&typeof a.old_value=="object"&&a.old_value!==null&&(a.old_value=this.transformMessageValue(a.old_value,e)),a})}transformMessageValue(t,e){let s=t;return Object.keys(s).forEach(a=>{s[a]=this.parseRow(a,s[a],e)}),this.transformer?this.transformer(s):s}parseRow(t,e,s){var S;let a=s[t];if(!a)return e;let c=a,{type:o,dims:i}=c,l=we(c,["type","dims"]),u=(S=this.parser[o])!=null?S:Ys,g=is(u,a,t);return i&&i>0?is((A,R)=>Ws(A,g),a,t)(e):g(e,l)}};function is(n,t,e){var a;let s=!((a=t.not_null)!=null&&a);return o=>{if(o===null){if(!s)throw new st(e!=null?e:"unknown");return null}return n(o,t)}}function _e(n){return`"${n.replace(/"/g,'""')}"`}function Pt(n){var l,u,g,c;let t=(u=(l=n.match(/^_+/))==null?void 0:l[0])!=null?u:"",e=n.slice(t.length),s=(c=(g=e.match(/_+$/))==null?void 0:g[0])!=null?c:"",i=(s?e.slice(0,e.length-s.length):e).toLowerCase().replace(/_+([a-z])/g,(S,x)=>x.toUpperCase());return t+i+s}function cs(n){return n.replace(/([a-z])([A-Z])/g,"$1_$2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").toLowerCase()}function ls(n){let t={};for(let[e,s]of Object.entries(n))t[s]=e;return{decode:e=>{var s;return(s=n[e])!=null?s:e},encode:e=>{var s;return(s=t[e])!=null?s:e}}}function ne(n,t){if(!n||!t)return n!=null?n:"";let e=new Set(["SELECT","FROM","WHERE","AND","OR","NOT","IN","IS","NULL","NULLS","FIRST","LAST","TRUE","FALSE","LIKE","ILIKE","BETWEEN","ASC","DESC","LIMIT","OFFSET","ORDER","BY","GROUP","HAVING","DISTINCT","AS","ON","JOIN","LEFT","RIGHT","INNER","OUTER","CROSS","CASE","WHEN","THEN","ELSE","END","CAST","LOWER","UPPER","COALESCE","NULLIF"]),s=[],a=0;for(;a<n.length;){let l=n[a];if(l==="'"||l==='"'){let u=a,g=l;for(a++;a<n.length;)if(n[a]===g)if(n[a+1]===g)a+=2;else{a++;break}else a++;s.push({start:u,end:a})}else a++}let o=l=>s.some(u=>l>=u.start&&l<u.end),i=new RegExp("(?<![a-zA-Z0-9_])([a-zA-Z_][a-zA-Z0-9_]*)(?![a-zA-Z0-9_])","g");return n.replace(i,(l,u,g)=>o(g)||e.has(l.toUpperCase())||l.startsWith("$")?l:t(l))}function Ks(n){if(n){let t={};for(let e of Object.keys(n))t[e]=Pt(e);return ls(t)}return{decode:t=>Pt(t),encode:t=>cs(t)}}function ae(n){return"key"in n}function at(n){return!ae(n)}function _t(n){return at(n)&&n.headers.control==="up-to-date"}function hs(n){if(n.headers.control!="up-to-date")return;let t=n.headers.global_last_seen_lsn;return t?`${t}_0`:void 0}function Ct(n,t){let e=BigInt(n),s=BigInt(t.xmin),a=BigInt(t.xmax),o=t.xip_list.map(BigInt);return e<s||e<a&&!o.includes(e)}var us="electric-cursor",oe="electric-handle",ot="electric-offset",vt="electric-schema",ds="electric-up-to-date",Mt="columns",Ce="cursor",ve="expired_handle",J="handle",D="live",X="offset",ps="table",fs="where",ms="replica",gs="params",Ss="experimental_live_sse",Ut="live_sse",kt="force-disconnect-and-refresh",ys="pause-stream",Lt="system-wake",Bt="log",ie="subset__where",Me="subset__limit",Ue="subset__offset",ce="subset__order_by",ke="subset__params",Dt="subset__where_expr",Ot="subset__order_by_expr",Le="cache-buster",Ht=[D,Ut,J,X,Ce,ve,Bt,ie,Me,Ue,ce,ke,Dt,Ot,Le];var Qs=[429],ct={initialDelay:100,maxDelay:6e4,multiplier:1.3,maxRetries:1/0};function zs(n){if(!n)return 0;let t=Number(n);if(Number.isFinite(t)&&t>0)return t*1e3;let e=Date.parse(n);if(!isNaN(e)){let s=e-Date.now();return Math.max(0,Math.min(s,36e5))}return 0}function Es(n,t=ct){let{initialDelay:e,maxDelay:s,multiplier:a,debug:o=!1,onFailedAttempt:i,maxRetries:l=1/0}=t;return async(...u)=>{var A;let g=u[0],c=u[1],S=e,x=0;for(;;)try{let R=await n(...u);if(R.ok)return R;throw await P.fromResponse(R,g.toString())}catch(R){if(i==null||i(),(A=c==null?void 0:c.signal)!=null&&A.aborted)throw new H;if(R instanceof P&&!Qs.includes(R.status)&&R.status>=400&&R.status<500)throw R;{if(x++,x>l)throw o&&console.log(`Max retries reached (${x}/${l}), giving up`),R;let y=R instanceof P&&R.headers?zs(R.headers["retry-after"]):0,L=Math.random()*S,B=Math.min(L,s),Ge=Math.max(y,B);if(o){let Tt=y>0?"server+client":"client";console.log(`Retry attempt #${x} after ${Ge}ms (${Tt}, serverMin=${y}ms, clientBackoff=${B}ms)`)}await new Promise(Tt=>setTimeout(Tt,Ge)),S=Math.min(S*a,s)}}}}var Gs=[201,204,205];function Rs(n){return async(...t)=>{var a,o;let e=t[0],s=await n(...t);try{if(s.status<200||Gs.includes(s.status))return s;let i=await s.text();return new Response(i,s)}catch(i){throw(o=(a=t[1])==null?void 0:a.signal)!=null&&o.aborted?new H:new P(s.status,void 0,void 0,Object.fromEntries([...s.headers.entries()]),e.toString(),i instanceof Error?i.message:typeof i=="string"?i:"failed to read body")}}}var Js={maxChunksToPrefetch:2};function bs(n,t=Js){let{maxChunksToPrefetch:e}=t,s;return async(...o)=>{let i=o[0].toString(),l=s==null?void 0:s.consume(...o);if(l)return l;s==null||s.abort(),s=void 0;let u=await n(...o),g=Ft(i,u);return g&&(s=new It({fetchClient:n,maxPrefetchedRequests:e,url:g,requestInit:o[1]})),u}}var Xs=["electric-offset","electric-handle"],Zs=["electric-cursor"],er=["electric-schema"];function xs(n){return async(...t)=>{let e=await n(...t);if(e.ok){let s=e.headers,a=[],o=c=>a.push(...c.filter(S=>!s.has(S))),l=t[0].toString(),u=new URL(l);if([ie,ke,Me,Ue,ce].some(c=>u.searchParams.has(c)))return e;if(o(Xs),u.searchParams.get(D)==="true"&&o(Zs),(!u.searchParams.has(D)||u.searchParams.get(D)==="false")&&o(er),a.length>0)throw new G(l,a)}return e}}var Be,De,k,Z,I,le,it,It=class{constructor(t){p(this,le);p(this,Be);p(this,De);p(this,k,new Map);p(this,Z);p(this,I);var e;h(this,Be,(e=t.fetchClient)!=null?e:(...s)=>fetch(...s)),h(this,De,t.maxPrefetchedRequests),h(this,Z,t.url.toString()),h(this,I,r(this,Z)),f(this,le,it).call(this,t.url,t.requestInit)}abort(){r(this,k).forEach(([t,e])=>e.abort()),r(this,k).clear()}consume(...t){let e=t[0].toString(),s=r(this,k).get(e);if(!s||e!==r(this,Z))return;let[a,o]=s;if(o.signal.aborted){r(this,k).delete(e);return}return r(this,k).delete(e),a.then(i=>{let l=Ft(e,i);h(this,Z,l),r(this,I)&&!r(this,k).has(r(this,I))&&f(this,le,it).call(this,r(this,I),t[1])}).catch(()=>{}),a}};Be=new WeakMap,De=new WeakMap,k=new WeakMap,Z=new WeakMap,I=new WeakMap,le=new WeakSet,it=function(...t){var a,o;let e=t[0].toString();if(r(this,k).size>=r(this,De))return;let s=new AbortController;try{let{signal:i,cleanup:l}=tr(s,(a=t[1])==null?void 0:a.signal),u=r(this,Be).call(this,e,w(E({},(o=t[1])!=null?o:{}),{signal:i}));r(this,k).set(e,[u,s]),u.then(g=>{if(!g.ok||s.signal.aborted)return;let c=Ft(e,g);if(!c||c===e){h(this,I,void 0);return}return h(this,I,c),f(this,le,it).call(this,c,t[1])}).catch(()=>{}).finally(l)}catch(i){}};function Ft(n,t){let e=t.headers.get(oe),s=t.headers.get(ot),a=t.headers.has(ds);if(!e||!s||a)return;let o=new URL(n);if(o.searchParams.has(D))return;let i=o.searchParams.get(ve);if(i&&e===i){console.warn(`[Electric] Received stale cached response with expired shape handle. This should not happen and indicates a proxy/CDN caching misconfiguration. The response contained handle "${e}" which was previously marked as expired. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. Skipping prefetch to prevent infinite 409 loop.`);return}return o.searchParams.set(J,e),o.searchParams.set(X,s),o.searchParams.sort(),o.toString()}function tr(n,t){let e=sr;if(t)if(t.aborted)n.abort();else{let s=()=>n.abort();t.addEventListener("abort",s,{once:!0,signal:n.signal}),e=()=>t.removeEventListener("abort",s)}return{signal:n.signal,cleanup:e}}function sr(){}function Oe(n,t){switch(n.type){case"ref":{let e=t?t(n.column):n.column;return _e(e)}case"val":return`$${n.paramIndex}`;case"func":return rr(n,t);default:{let e=n;throw new Error(`Unknown expression type: ${JSON.stringify(e)}`)}}}function rr(n,t){let e=n.args.map(s=>Oe(s,t));switch(n.name){case"eq":return`${e[0]} = ${e[1]}`;case"gt":return`${e[0]} > ${e[1]}`;case"gte":return`${e[0]} >= ${e[1]}`;case"lt":return`${e[0]} < ${e[1]}`;case"lte":return`${e[0]} <= ${e[1]}`;case"and":return e.map(s=>`(${s})`).join(" AND ");case"or":return e.map(s=>`(${s})`).join(" OR ");case"not":return`NOT (${e[0]})`;case"in":return`${e[0]} = ANY(${e[1]})`;case"like":return`${e[0]} LIKE ${e[1]}`;case"ilike":return`${e[0]} ILIKE ${e[1]}`;case"isNull":case"isUndefined":return`${e[0]} IS NULL`;case"upper":return`UPPER(${e[0]})`;case"lower":return`LOWER(${e[0]})`;case"length":return`LENGTH(${e[0]})`;case"concat":return`CONCAT(${e.join(", ")})`;case"coalesce":return`COALESCE(${e.join(", ")})`;default:throw new Error(`Unknown function: ${n.name}`)}}function lt(n,t){return n.map(e=>{let s=t?t(e.column):e.column,a=_e(s);return e.direction==="desc"&&(a+=" DESC"),e.nulls==="first"&&(a+=" NULLS FIRST"),e.nulls==="last"&&(a+=" NULLS LAST"),a}).join(", ")}import{fetchEventSource as nr}from"@microsoft/fetch-event-source";var Nt=class{constructor(){this.data={};this.max=250;this.storageKey="electric_expired_shapes";this.load()}getExpiredHandle(t){let e=this.data[t];return e?(e.lastUsed=Date.now(),this.save(),e.expiredHandle):null}markExpired(t,e){this.data[t]={expiredHandle:e,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(t){}}load(){if(typeof localStorage!="undefined")try{let t=localStorage.getItem(this.storageKey);t&&(this.data=JSON.parse(t))}catch(t){this.data={}}}clear(){this.data={},this.save()}},He=new Nt;var qt=class{constructor(){this.data={};this.storageKey="electric_up_to_date_tracker";this.cacheTTL=6e4;this.maxEntries=250;this.writeThrottleMs=6e4;this.lastWriteTime=0;this.load(),this.cleanup()}recordUpToDate(t,e){this.data[t]={timestamp:Date.now(),cursor:e};let s=Object.keys(this.data);if(s.length>this.maxEntries){let a=s.reduce((o,i)=>this.data[i].timestamp<this.data[o].timestamp?i:o);delete this.data[a]}this.scheduleSave()}scheduleSave(){let t=Date.now(),e=t-this.lastWriteTime;if(e>=this.writeThrottleMs)this.lastWriteTime=t,this.save();else if(!this.pendingSaveTimer){let s=this.writeThrottleMs-e;this.pendingSaveTimer=setTimeout(()=>{this.lastWriteTime=Date.now(),this.pendingSaveTimer=void 0,this.save()},s)}}shouldEnterReplayMode(t){let e=this.data[t];return!e||Date.now()-e.timestamp>=this.cacheTTL?null:e.cursor}cleanup(){let t=Date.now(),e=Object.keys(this.data),s=!1;for(let a of e)t-this.data[a].timestamp>this.cacheTTL&&(delete this.data[a],s=!0);s&&this.save()}save(){if(typeof localStorage!="undefined")try{localStorage.setItem(this.storageKey,JSON.stringify(this.data))}catch(t){}}load(){if(typeof localStorage!="undefined")try{let t=localStorage.getItem(this.storageKey);t&&(this.data=JSON.parse(t))}catch(t){this.data={}}}clear(){this.data={},this.pendingSaveTimer&&(clearTimeout(this.pendingSaveTimer),this.pendingSaveTimer=void 0),this.save()}},$t=new qt;var ht=class{constructor(){this.activeSnapshots=new Map;this.xmaxSnapshots=new Map;this.snapshotsByDatabaseLsn=new Map}addSnapshot(t,e){var o,i,l,u;this.activeSnapshots.set(t.snapshot_mark,{xmin:BigInt(t.xmin),xmax:BigInt(t.xmax),xip_list:t.xip_list.map(BigInt),keys:e});let s=(i=(o=this.xmaxSnapshots.get(BigInt(t.xmax)))==null?void 0:o.add(t.snapshot_mark))!=null?i:new Set([t.snapshot_mark]);this.xmaxSnapshots.set(BigInt(t.xmax),s);let a=(u=(l=this.snapshotsByDatabaseLsn.get(BigInt(t.database_lsn)))==null?void 0:l.add(t.snapshot_mark))!=null?u:new Set([t.snapshot_mark]);this.snapshotsByDatabaseLsn.set(BigInt(t.database_lsn),a)}removeSnapshot(t){this.activeSnapshots.delete(t)}shouldRejectMessage(t){let e=t.headers.txids||[];if(e.length===0)return!1;let s=Math.max(...e);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(t.key)&&Ct(s,a))}lastSeenUpdate(t){for(let[e,s]of this.snapshotsByDatabaseLsn.entries())if(e<=t)for(let a of s)this.removeSnapshot(a)}};var Ie=class{get isUpToDate(){return!1}get staleCacheBuster(){}get staleCacheRetryCount(){return 0}get sseFallbackToLongPolling(){return!1}get consecutiveShortSseConnections(){return 0}get replayCursor(){}canEnterReplayMode(){return!1}enterReplayMode(t){return this}shouldUseSse(t){return!1}handleSseConnectionClosed(t){return{state:this,fellBackToLongPolling:!1,wasShortConnection:!1}}applyUrlParams(t,e){}handleResponseMetadata(t){return{action:"ignored",state:this}}handleMessageBatch(t){return{state:this,suppressBatch:!1,becameUpToDate:!1}}pause(){return new qe(this)}toErrorState(t){return new $e(this,t)}markMustRefetch(t){return new ut({handle:t,offset:"-1",liveCacheBuster:"",lastSyncedAt:this.lastSyncedAt,schema:void 0})}},b,Fe=class extends Ie{constructor(e){super();p(this,b);h(this,b,e)}get handle(){return r(this,b).handle}get offset(){return r(this,b).offset}get schema(){return r(this,b).schema}get liveCacheBuster(){return r(this,b).liveCacheBuster}get lastSyncedAt(){return r(this,b).lastSyncedAt}get currentFields(){return r(this,b)}applyUrlParams(e,s){e.searchParams.set(X,r(this,b).offset),r(this,b).handle&&e.searchParams.set(J,r(this,b).handle)}parseResponseFields(e){var g,c,S;let s=e.responseHandle,a=s&&s!==e.expiredHandle?s:r(this,b).handle,o=(g=e.responseOffset)!=null?g:r(this,b).offset,i=(c=e.responseCursor)!=null?c:r(this,b).liveCacheBuster,l=(S=r(this,b).schema)!=null?S:e.responseSchema,u=e.status===204?e.now:r(this,b).lastSyncedAt;return{handle:a,offset:o,schema:l,liveCacheBuster:i,lastSyncedAt:u}}checkStaleResponse(e){let s=e.responseHandle,a=e.expiredHandle;if(!s||s!==a)return null;if(r(this,b).handle===void 0||r(this,b).handle===a){let o=this.staleCacheRetryCount+1;return{action:"stale-retry",state:new Yt(w(E({},this.currentFields),{staleCacheBuster:e.createCacheBuster(),staleCacheRetryCount:o})),exceededMaxRetries:o>e.maxStaleCacheRetries}}return{action:"ignored",state:this}}handleMessageBatch(e){if(!e.hasMessages||!e.hasUpToDateMessage)return{state:this,suppressBatch:!1,becameUpToDate:!1};let s=r(this,b).offset;e.isSse&&e.upToDateOffset&&(s=e.upToDateOffset);let a={handle:r(this,b).handle,offset:s,schema:r(this,b).schema,liveCacheBuster:r(this,b).liveCacheBuster,lastSyncedAt:e.now};return this.onUpToDate(a,e)}onUpToDate(e,s){return{state:new dt(e),suppressBatch:!1,becameUpToDate:!0}}};b=new WeakMap;var Ne=class extends Fe{handleResponseMetadata(t){let e=this.checkStaleResponse(t);if(e)return e;let s=this.parseResponseFields(t);return{action:"accepted",state:new jt(s)}}canEnterReplayMode(){return!0}enterReplayMode(t){return new Vt(w(E({},this.currentFields),{replayCursor:t}))}},ut=class n extends Ne{constructor(e){super(e);this.kind="initial"}withHandle(e){return new n(w(E({},this.currentFields),{handle:e}))}},jt=class n extends Ne{constructor(e){super(e);this.kind="syncing"}withHandle(e){return new n(w(E({},this.currentFields),{handle:e}))}},ee,ue,Wt=class Wt extends Ne{constructor(e){let i=e,{staleCacheBuster:s,staleCacheRetryCount:a}=i,o=we(i,["staleCacheBuster","staleCacheRetryCount"]);super(o);this.kind="stale-retry";p(this,ee);p(this,ue);h(this,ee,s),h(this,ue,a)}get staleCacheBuster(){return r(this,ee)}get staleCacheRetryCount(){return r(this,ue)}canEnterReplayMode(){return!1}withHandle(e){return new Wt(w(E({},this.currentFields),{handle:e,staleCacheBuster:r(this,ee),staleCacheRetryCount:r(this,ue)}))}applyUrlParams(e,s){super.applyUrlParams(e,s),e.searchParams.set(Le,r(this,ee))}};ee=new WeakMap,ue=new WeakMap;var Yt=Wt,te,$,he=class he extends Fe{constructor(e,s){var a,o;super(e);this.kind="live";p(this,te);p(this,$);h(this,te,(a=s==null?void 0:s.consecutiveShortSseConnections)!=null?a:0),h(this,$,(o=s==null?void 0:s.sseFallbackToLongPolling)!=null?o:!1)}get isUpToDate(){return!0}get consecutiveShortSseConnections(){return r(this,te)}get sseFallbackToLongPolling(){return r(this,$)}withHandle(e){return new he(w(E({},this.currentFields),{handle:e}),this.sseState)}applyUrlParams(e,s){super.applyUrlParams(e,s),s.isSnapshotRequest||(e.searchParams.set(Ce,this.liveCacheBuster),s.canLongPoll&&e.searchParams.set(D,"true"))}get sseState(){return{consecutiveShortSseConnections:r(this,te),sseFallbackToLongPolling:r(this,$)}}handleResponseMetadata(e){let s=this.checkStaleResponse(e);if(s)return s;let a=this.parseResponseFields(e);return{action:"accepted",state:new he(a,this.sseState)}}onUpToDate(e,s){return{state:new he(e,this.sseState),suppressBatch:!1,becameUpToDate:!0}}shouldUseSse(e){return e.liveSseEnabled&&!e.isRefreshing&&!e.resumingFromPause&&!r(this,$)}handleSseConnectionClosed(e){let s=r(this,te),a=r(this,$),o=!1,i=!1;return e.connectionDuration<e.minConnectionDuration&&!e.wasAborted?(i=!0,s=s+1,s>=e.maxShortConnections&&(a=!0,o=!0)):e.connectionDuration>=e.minConnectionDuration&&(s=0),{state:new he(this.currentFields,{consecutiveShortSseConnections:s,sseFallbackToLongPolling:a}),fellBackToLongPolling:o,wasShortConnection:i}}};te=new WeakMap,$=new WeakMap;var dt=he,j,pt=class pt extends Fe{constructor(e){let o=e,{replayCursor:s}=o,a=we(o,["replayCursor"]);super(a);this.kind="replaying";p(this,j);h(this,j,s)}get replayCursor(){return r(this,j)}withHandle(e){return new pt(w(E({},this.currentFields),{handle:e,replayCursor:r(this,j)}))}handleResponseMetadata(e){let s=this.checkStaleResponse(e);if(s)return s;let a=this.parseResponseFields(e);return{action:"accepted",state:new pt(w(E({},a),{replayCursor:r(this,j)}))}}onUpToDate(e,s){let a=!s.isSse&&r(this,j)===s.currentCursor;return{state:new dt(e),suppressBatch:a,becameUpToDate:!0}}};j=new WeakMap;var Vt=pt,qe=class n extends Ie{constructor(e){super();this.kind="paused";this.previousState=e}get handle(){return this.previousState.handle}get offset(){return this.previousState.offset}get schema(){return this.previousState.schema}get liveCacheBuster(){return this.previousState.liveCacheBuster}get lastSyncedAt(){return this.previousState.lastSyncedAt}get isUpToDate(){return this.previousState.isUpToDate}get staleCacheBuster(){return this.previousState.staleCacheBuster}get staleCacheRetryCount(){return this.previousState.staleCacheRetryCount}get sseFallbackToLongPolling(){return this.previousState.sseFallbackToLongPolling}get consecutiveShortSseConnections(){return this.previousState.consecutiveShortSseConnections}get replayCursor(){return this.previousState.replayCursor}withHandle(e){return new n(this.previousState.withHandle(e))}applyUrlParams(e,s){this.previousState.applyUrlParams(e,s)}pause(){return this}resume(){return this.previousState}},$e=class n extends Ie{constructor(e,s){super();this.kind="error";this.previousState=e,this.error=s}get handle(){return this.previousState.handle}get offset(){return this.previousState.offset}get schema(){return this.previousState.schema}get liveCacheBuster(){return this.previousState.liveCacheBuster}get lastSyncedAt(){return this.previousState.lastSyncedAt}get isUpToDate(){return this.previousState.isUpToDate}withHandle(e){return new n(this.previousState.withHandle(e),this.error)}applyUrlParams(e,s){this.previousState.applyUrlParams(e,s)}retry(){return this.previousState}reset(e){return this.previousState.markMustRefetch(e)}};function As(n){return new ut({handle:n.handle,offset:n.offset,liveCacheBuster:"",lastSyncedAt:void 0,schema:void 0})}var U,je,Ye,ft=class{constructor(t){p(this,U,new Set);p(this,je);p(this,Ye);h(this,je,t.onAcquired),h(this,Ye,t.onReleased)}acquire(t){if(r(this,U).has(t)){console.warn(`[Electric] PauseLock: "${t}" already held \u2014 ignoring duplicate acquire`);return}let e=r(this,U).size===0;r(this,U).add(t),e&&r(this,je).call(this)}release(t){if(!r(this,U).delete(t)){console.warn(`[Electric] PauseLock: "${t}" not held \u2014 ignoring release (possible acquire/release mismatch)`);return}r(this,U).size===0&&r(this,Ye).call(this)}get isPaused(){return r(this,U).size>0}isHeldBy(t){return r(this,U).has(t)}releaseAllMatching(t){for(let e of r(this,U))e.startsWith(t)&&r(this,U).delete(e)}};U=new WeakMap,je=new WeakMap,Ye=new WeakMap;var ar=new Set([Ce,J,D,X,Le]);async function Zt(n){return typeof n=="function"?n():n}async function or(n){let t=Object.entries(n),e=await Promise.all(t.map(async([s,a])=>{if(a===void 0)return[s,void 0];let o=await Zt(a);return[s,Array.isArray(o)?o.join(","):o]}));return Object.fromEntries(e.filter(([s,a])=>a!==void 0))}async function ir(n){if(!n)return{};let t=Object.entries(n),e=await Promise.all(t.map(async([s,a])=>[s,await Zt(a)]));return Object.fromEntries(e)}function de(n){let t=new URL(n.origin+n.pathname);for(let[e,s]of n.searchParams)Ht.includes(e)||t.searchParams.set(e,s);return t.searchParams.sort(),t.toString()}var fe,me,ge,se,Y,O,m,F,V,Se,_,W,yt,d,Qt,N,ye,Ee,Re,We,C,q,Ke,Et,Rt,bt,xt,Qe,be,xe,Ve,mt,pe,gt,ws,zt,St,Ps,_s,Cs,vs,Gt,Jt,Xt,Ms,Us,ks,Ls,Kt=class{constructor(t){p(this,d);p(this,fe,null);p(this,me);p(this,ge);p(this,se);p(this,Y,new Map);p(this,O,!1);p(this,m);p(this,F,!1);p(this,V);p(this,Se);p(this,_);p(this,W,0);p(this,yt,0);p(this,N);p(this,ye);p(this,Ee);p(this,Re,Promise.resolve([]));p(this,We,new ht);p(this,C);p(this,q);p(this,Ke);p(this,Et,1e3);p(this,Rt,3);p(this,bt,100);p(this,xt,5e3);p(this,Qe);p(this,be);p(this,xe,3);var i,l,u,g;this.options=E({subscribe:!0},t),cr(this.options),h(this,m,As({offset:(i=this.options.offset)!=null?i:"-1",handle:this.options.handle})),h(this,C,new ft({onAcquired:()=>{var c;h(this,m,r(this,m).pause()),r(this,O)&&((c=r(this,_))==null||c.abort(ys))},onReleased:()=>{var c;r(this,O)&&((c=this.options.signal)!=null&&c.aborted||f(this,d,Ve).call(this).catch(()=>{}))}}));let e;if(t.columnMapper){let c=S=>{let x={};for(let[A,R]of Object.entries(S)){let y=t.columnMapper.decode(A);x[y]=R}return x};e=t.transformer?S=>t.transformer(c(S)):c}else e=t.transformer;h(this,se,new nt(t.parser,e)),h(this,Se,this.options.onError),h(this,V,(l=this.options.log)!=null?l:"full");let s=(u=t.fetchClient)!=null?u:(...c)=>fetch(...c),a=w(E({},(g=t.backoffOptions)!=null?g:ct),{onFailedAttempt:()=>{var c,S;h(this,F,!1),(S=(c=t.backoffOptions)==null?void 0:c.onFailedAttempt)==null||S.call(c)}}),o=Es(s,a);h(this,ge,xs(bs(o))),h(this,me,Rs(r(this,ge))),f(this,d,Ms).call(this),f(this,d,Us).call(this)}get shapeHandle(){return r(this,m).handle}get error(){return r(this,fe)}get isUpToDate(){return r(this,m).isUpToDate}get lastOffset(){return r(this,m).offset}get mode(){return r(this,V)}subscribe(t,e=()=>{}){let s={};return r(this,Y).set(s,[t,e]),r(this,O)||f(this,d,Ve).call(this),()=>{r(this,Y).delete(s)}}unsubscribeAll(){var t,e;r(this,Y).clear(),(t=r(this,Qe))==null||t.call(this),(e=r(this,be))==null||e.call(this)}lastSyncedAt(){return r(this,m).lastSyncedAt}lastSynced(){return r(this,m).lastSyncedAt===void 0?1/0:Date.now()-r(this,m).lastSyncedAt}isConnected(){return r(this,F)}isLoading(){return!r(this,m).isUpToDate}hasStarted(){return r(this,O)}isPaused(){return r(this,C).isPaused}async forceDisconnectAndRefresh(){var t,e;re(this,W)._++;try{r(this,m).isUpToDate&&!((t=r(this,_))!=null&&t.signal.aborted)&&((e=r(this,_))==null||e.abort(kt)),await f(this,d,vs).call(this)}finally{re(this,W)._--}}async requestSnapshot(t){if(r(this,V)==="full")throw new Error(`Snapshot requests are not supported in ${r(this,V)} mode, as the consumer is guaranteed to observe all data`);r(this,O)||f(this,d,Ve).call(this).catch(()=>{});let e=`snapshot-${++re(this,yt)._}`;r(this,C).acquire(e);let s=setTimeout(()=>{console.warn(`[Electric] Snapshot "${e}" has held the pause lock for 30s \u2014 possible hung request or leaked lock. Current holders: ${[...new Set([e])].join(", ")}`)},3e4);try{let{metadata:a,data:o}=await this.fetchSnapshot(t),i=o.concat([{headers:E({control:"snapshot-end"},a)},{headers:E({control:"subset-end"},t)}]);return r(this,We).addSnapshot(a,new Set(o.map(l=>l.key))),f(this,d,St).call(this,i,!1),{metadata:a,data:o}}finally{clearTimeout(s),r(this,C).release(e)}}async fetchSnapshot(t){var x,A,R;let s=((A=(x=t.method)!=null?x:this.options.subsetMethod)!=null?A:"GET")==="POST",a,o;if(s){let y=await f(this,d,gt).call(this,this.options.url,!0);a=y.fetchUrl,o={method:"POST",headers:w(E({},y.requestHeaders),{"Content-Type":"application/json"}),body:JSON.stringify(f(this,d,Ls).call(this,t))}}else{let y=await f(this,d,gt).call(this,this.options.url,!0,t);a=y.fetchUrl,o={headers:y.requestHeaders}}let i=r(this,m).handle,l;try{l=await r(this,me).call(this,a.toString(),o)}catch(y){if(y instanceof P&&y.status===409){if(i){let B=de(a);He.markExpired(B,i)}let L=y.headers[oe]||`${i!=null?i:"handle"}-next`;return h(this,m,r(this,m).withHandle(L)),this.fetchSnapshot(t)}throw y}if(!l.ok)throw await P.fromResponse(l,a.toString());let u=(R=r(this,m).schema)!=null?R:Ts(l.headers,{required:!0,url:a.toString()}),{metadata:g,data:c}=await l.json(),S=r(this,se).parseSnapshotData(c,u);return{metadata:g,data:S}}};fe=new WeakMap,me=new WeakMap,ge=new WeakMap,se=new WeakMap,Y=new WeakMap,O=new WeakMap,m=new WeakMap,F=new WeakMap,V=new WeakMap,Se=new WeakMap,_=new WeakMap,W=new WeakMap,yt=new WeakMap,d=new WeakSet,Qt=function(){return r(this,W)>0},N=new WeakMap,ye=new WeakMap,Ee=new WeakMap,Re=new WeakMap,We=new WeakMap,C=new WeakMap,q=new WeakMap,Ke=new WeakMap,Et=new WeakMap,Rt=new WeakMap,bt=new WeakMap,xt=new WeakMap,Qe=new WeakMap,be=new WeakMap,xe=new WeakMap,Ve=async function(){var t,e;h(this,O,!0);try{await f(this,d,pe).call(this)}catch(s){if(h(this,fe,s),s instanceof Error&&h(this,m,r(this,m).toErrorState(s)),r(this,Se)){let a=await r(this,Se).call(this,s),o=!(s instanceof G);if(a&&typeof a=="object"&&o){a.params&&(this.options.params=E(E({},(t=this.options.params)!=null?t:{}),a.params)),a.headers&&(this.options.headers=E(E({},(e=this.options.headers)!=null?e:{}),a.headers)),h(this,fe,null),r(this,m)instanceof $e&&h(this,m,r(this,m).retry()),h(this,O,!1),await f(this,d,Ve).call(this);return}s instanceof Error&&f(this,d,Jt).call(this,s),f(this,d,mt).call(this);return}throw s instanceof Error&&f(this,d,Jt).call(this,s),f(this,d,mt).call(this),s}f(this,d,mt).call(this)},mt=function(){var t,e;h(this,F,!1),(t=r(this,Ee))==null||t.call(this),(e=r(this,be))==null||e.call(this)},pe=async function(){var u,g;if(r(this,C).isPaused||!this.options.subscribe&&((u=this.options.signal)!=null&&u.aborted||r(this,m).isUpToDate))return;let t=!1;r(this,m)instanceof qe&&(t=!0,h(this,m,r(this,m).resume()));let{url:e,signal:s}=this.options,{fetchUrl:a,requestHeaders:o}=await f(this,d,gt).call(this,e,t),i=await f(this,d,ws).call(this,s),l=r(this,_);if(r(this,C).isPaused){i&&s&&s.removeEventListener("abort",i),h(this,_,void 0);return}try{await f(this,d,Ps).call(this,{fetchUrl:a,requestAbortController:l,headers:o,resumingFromPause:t})}catch(c){let S=l.signal.reason,x=l.signal.aborted&&(S===kt||S===Lt);if((c instanceof P||c instanceof H)&&x)return f(this,d,pe).call(this);if(c instanceof H)return;if(c instanceof Pe)return f(this,d,pe).call(this);if(!(c instanceof P))throw c;if(c.status==409){if(r(this,m).handle){let R=de(a);He.markExpired(R,r(this,m).handle)}let A=c.headers[oe]||`${r(this,m).handle}-next`;return f(this,d,ks).call(this,A),await f(this,d,Gt).call(this,Array.isArray(c.json)?c.json:[c.json]),f(this,d,pe).call(this)}else throw c}finally{i&&s&&s.removeEventListener("abort",i),h(this,_,void 0)}return(g=r(this,ye))==null||g.call(this),f(this,d,pe).call(this)},gt=async function(t,e,s){var g,c,S,x,A,R;let[a,o]=await Promise.all([ir(this.options.headers),this.options.params?or(lr(this.options.params)):void 0]);o&&Bs(o);let i=new URL(t);if(o){if(o.table&&v(i,ps,o.table),o.where&&typeof o.where=="string"){let L=ne(o.where,(g=this.options.columnMapper)==null?void 0:g.encode);v(i,fs,L)}if(o.columns){let L=await Zt((c=this.options.params)==null?void 0:c.columns);if(Array.isArray(L)){let B=L.map(String);this.options.columnMapper&&(B=B.map(this.options.columnMapper.encode));let Ge=B.map(_e).join(",");v(i,Mt,Ge)}else v(i,Mt,o.columns)}o.replica&&v(i,ms,o.replica),o.params&&v(i,gs,o.params);let y=E({},o);delete y.table,delete y.where,delete y.columns,delete y.replica,delete y.params;for(let[L,B]of Object.entries(y))v(i,L,B)}if(s){if(s.whereExpr){let y=Oe(s.whereExpr,(S=this.options.columnMapper)==null?void 0:S.encode);v(i,ie,y),i.searchParams.set(Dt,JSON.stringify(s.whereExpr))}else if(s.where&&typeof s.where=="string"){let y=ne(s.where,(x=this.options.columnMapper)==null?void 0:x.encode);v(i,ie,y)}if(s.params&&i.searchParams.set(ke,JSON.stringify(s.params)),s.limit&&v(i,Me,s.limit),s.offset&&v(i,Ue,s.offset),s.orderByExpr){let y=lt(s.orderByExpr,(A=this.options.columnMapper)==null?void 0:A.encode);v(i,ce,y),i.searchParams.set(Ot,JSON.stringify(s.orderByExpr))}else if(s.orderBy&&typeof s.orderBy=="string"){let y=ne(s.orderBy,(R=this.options.columnMapper)==null?void 0:R.encode);v(i,ce,y)}}r(this,m).applyUrlParams(i,{isSnapshotRequest:s!==void 0,canLongPoll:!r(this,d,Qt)&&!e}),i.searchParams.set(Bt,r(this,V));let l=de(i),u=He.getExpiredHandle(l);return u&&i.searchParams.set(ve,u),i.searchParams.sort(),{fetchUrl:i,requestHeaders:a}},ws=async function(t){var e;if(h(this,_,new AbortController),t){let s=()=>{var a;(a=r(this,_))==null||a.abort(t.reason)};return t.addEventListener("abort",s,{once:!0}),t.aborted&&((e=r(this,_))==null||e.abort(t.reason)),s}},zt=async function(t){var u,g,c;let{headers:e,status:s}=t,a=e.get(oe),o=r(this,q)?de(r(this,q)):null,i=o?He.getExpiredHandle(o):null,l=r(this,m).handleResponseMetadata({status:s,responseHandle:a,responseOffset:e.get(ot),responseCursor:e.get(us),responseSchema:Ts(e),expiredHandle:i,now:Date.now(),maxStaleCacheRetries:r(this,xe),createCacheBuster:()=>`${Date.now()}-${Math.random().toString(36).substring(2,9)}`});if(h(this,m,l.state),l.action==="stale-retry")throw await((u=t.body)==null?void 0:u.cancel()),l.exceededMaxRetries?new P(502,void 0,void 0,{},(c=(g=r(this,q))==null?void 0:g.toString())!=null?c:"",`CDN continues serving stale cached responses after ${r(this,xe)} retry attempts. This indicates a severe proxy/CDN misconfiguration. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. For more information visit the troubleshooting guide: https://electric-sql.com/docs/guides/troubleshooting`):(console.warn(`[Electric] Received stale cached response with expired shape handle. This should not happen and indicates a proxy/CDN caching misconfiguration. The response contained handle "${a}" which was previously marked as expired. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. For more information visit the troubleshooting guide: https://electric-sql.com/docs/guides/troubleshooting Retrying with a random cache buster to bypass the stale cache (attempt ${r(this,m).staleCacheRetryCount}/${r(this,xe)}).`),new Pe(`Received stale cached response with expired handle "${a}". This indicates a proxy/CDN caching misconfiguration. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key.`));return l.action==="ignored"?(console.warn(`[Electric] Received stale cached response with expired shape handle. This should not happen and indicates a proxy/CDN caching misconfiguration. The response contained handle "${a}" which was previously marked as expired. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. Ignoring the stale response and continuing with handle "${r(this,m).handle}".`),!1):!0},St=async function(t,e=!1){if(t.length===0)return;let s=t[t.length-1],a=_t(s),o=a?hs(s):void 0,i=r(this,m).handleMessageBatch({hasMessages:!0,hasUpToDateMessage:a,isSse:e,upToDateOffset:o,now:Date.now(),currentCursor:r(this,m).liveCacheBuster});if(h(this,m,i.state),a){if(i.suppressBatch)return;if(r(this,q)){let u=de(r(this,q));$t.recordUpToDate(u,r(this,m).liveCacheBuster)}}let l=t.filter(u=>ae(u)?!r(this,We).shouldRejectMessage(u):!0);await f(this,d,Gt).call(this,l)},Ps=async function(t){var s;if(h(this,q,t.fetchUrl),!r(this,m).isUpToDate&&r(this,m).canEnterReplayMode()){let a=de(t.fetchUrl),o=$t.shouldEnterReplayMode(a);o&&h(this,m,r(this,m).enterReplayMode(o))}let e=(s=this.options.liveSse)!=null?s:this.options.experimentalLiveSse;return r(this,m).shouldUseSse({liveSseEnabled:!!e,isRefreshing:r(this,d,Qt),resumingFromPause:!!t.resumingFromPause})?(t.fetchUrl.searchParams.set(Ss,"true"),t.fetchUrl.searchParams.set(Ut,"true"),f(this,d,Cs).call(this,t)):f(this,d,_s).call(this,t)},_s=async function(t){let{fetchUrl:e,requestAbortController:s,headers:a}=t,o=await r(this,me).call(this,e.toString(),{signal:s.signal,headers:a});if(h(this,F,!0),!await f(this,d,zt).call(this,o))return;let l=r(this,m).schema,g=await o.text()||"[]",c=r(this,se).parse(g,l);await f(this,d,St).call(this,c)},Cs=async function(t){let{fetchUrl:e,requestAbortController:s,headers:a}=t,o=r(this,ge);h(this,Ke,Date.now());let i=w(E({},a),{Accept:"text/event-stream"}),l=!1;try{let u=[];await nr(e.toString(),{headers:i,fetch:o,onopen:async g=>{if(h(this,F,!0),!await f(this,d,zt).call(this,g))throw l=!0,new Error("stale response ignored")},onmessage:g=>{if(g.data){let c=r(this,m).schema,S=r(this,se).parse(g.data,c);u.push(S),_t(S)&&(f(this,d,St).call(this,u,!0),u=[])}},onerror:g=>{throw g},signal:s.signal})}catch(u){if(l)return;throw s.signal.aborted?new H:u}finally{let u=Date.now()-r(this,Ke),g=s.signal.aborted,c=r(this,m).handleSseConnectionClosed({connectionDuration:u,wasAborted:g,minConnectionDuration:r(this,Et),maxShortConnections:r(this,Rt)});if(h(this,m,c.state),c.fellBackToLongPolling)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 if(c.wasShortConnection){let S=Math.min(r(this,xt),r(this,bt)*Math.pow(2,r(this,m).consecutiveShortSseConnections)),x=Math.floor(Math.random()*S);await new Promise(A=>setTimeout(A,x))}}},vs=async function(){if(r(this,C).isPaused)throw new Error("Cannot wait for next tick while PauseLock is held \u2014 this would deadlock because the request loop is paused");return r(this,N)?r(this,N):(h(this,N,new Promise((t,e)=>{h(this,ye,t),h(this,Ee,e)})),r(this,N).finally(()=>{h(this,N,void 0),h(this,ye,void 0),h(this,Ee,void 0)}),r(this,N))},Gt=async function(t){return h(this,Re,r(this,Re).then(()=>Promise.all(Array.from(r(this,Y).values()).map(async([e,s])=>{try{await e(t)}catch(a){queueMicrotask(()=>{throw a})}})))),r(this,Re)},Jt=function(t){r(this,Y).forEach(([e,s])=>{s==null||s(t)})},Xt=function(){return typeof document=="object"&&typeof document.hidden=="boolean"&&typeof document.addEventListener=="function"},Ms=function(){if(f(this,d,Xt).call(this)){let t=()=>{document.hidden?r(this,C).acquire("visibility"):r(this,C).release("visibility")};document.addEventListener("visibilitychange",t),h(this,Qe,()=>{document.removeEventListener("visibilitychange",t)})}},Us=function(){if(f(this,d,Xt).call(this))return;let t=2e3,e=4e3,s=Date.now(),a=setInterval(()=>{let o=Date.now(),i=o-s;s=o,i>t+e&&!r(this,C).isPaused&&r(this,_)&&(re(this,W)._++,r(this,_).abort(Lt),queueMicrotask(()=>{re(this,W)._--}))},t);typeof a=="object"&&"unref"in a&&a.unref(),h(this,be,()=>{clearInterval(a)})},ks=function(t){h(this,m,r(this,m).markMustRefetch(t)),h(this,F,!1),r(this,C).releaseAllMatching("snapshot")},Ls=function(t){var s,a,o,i;let e={};return t.whereExpr?(e.where=Oe(t.whereExpr,(s=this.options.columnMapper)==null?void 0:s.encode),e.where_expr=t.whereExpr):t.where&&typeof t.where=="string"&&(e.where=ne(t.where,(a=this.options.columnMapper)==null?void 0:a.encode)),t.params&&(e.params=t.params),t.limit!==void 0&&(e.limit=t.limit),t.offset!==void 0&&(e.offset=t.offset),t.orderByExpr?(e.order_by=lt(t.orderByExpr,(o=this.options.columnMapper)==null?void 0:o.encode),e.order_by_expr=t.orderByExpr):t.orderBy&&typeof t.orderBy=="string"&&(e.order_by=ne(t.orderBy,(i=this.options.columnMapper)==null?void 0:i.encode)),e},Kt.Replica={FULL:"full",DEFAULT:"default"};function Ts(n,t){let e=n.get(vt);if(!e){if(t!=null&&t.required&&(t!=null&&t.url))throw new G(t.url,[vt]);return{}}return JSON.parse(e)}function Bs(n){if(!n)return;let t=Object.keys(n).filter(e=>ar.has(e));if(t.length>0)throw new tt(t)}function cr(n){if(!n.url)throw new Xe;if(n.signal&&!(n.signal instanceof AbortSignal))throw new Ze;if(n.offset!==void 0&&n.offset!=="-1"&&n.offset!=="now"&&!n.handle)throw new et;Bs(n.params)}function v(n,t,e){if(!(e===void 0||e==null))if(typeof e=="string")n.searchParams.set(t,e);else if(typeof e=="object")for(let[s,a]of Object.entries(e))n.searchParams.set(`${t}[${s}]`,a);else n.searchParams.set(t,e.toString())}function lr(n){return Array.isArray(n.params)?w(E({},n),{params:Object.fromEntries(n.params.map((t,e)=>[e+1,t]))}):n}var M,K,Q,ze,Ae,Te,z,T,Os,Hs,es,At,Is,ts,Ds=class{constructor(t){p(this,T);p(this,M,new Map);p(this,K,new Map);p(this,Q,new Set);p(this,ze,new Set);p(this,Ae,!1);p(this,Te,"syncing");p(this,z,!1);this.stream=t,this.stream.subscribe(f(this,T,Os).bind(this),f(this,T,Is).bind(this))}get isUpToDate(){return r(this,Te)==="up-to-date"}get lastOffset(){return this.stream.lastOffset}get handle(){return this.stream.shapeHandle}get rows(){return this.value.then(t=>Array.from(t.values()))}get currentRows(){return Array.from(this.currentValue.values())}get value(){return new Promise((t,e)=>{if(this.stream.isUpToDate)t(this.currentValue);else{let s=this.subscribe(({value:a})=>{s(),r(this,z)&&e(r(this,z)),t(a)})}})}get currentValue(){return r(this,M)}get error(){return r(this,z)}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}async requestSnapshot(t){let e=JSON.stringify(t);r(this,ze).add(e),await f(this,T,es).call(this),await this.stream.requestSnapshot(t)}subscribe(t){let e={};return r(this,K).set(e,t),()=>{r(this,K).delete(e)}}unsubscribeAll(){r(this,K).clear()}get numSubscribers(){return r(this,K).size}};M=new WeakMap,K=new WeakMap,Q=new WeakMap,ze=new WeakMap,Ae=new WeakMap,Te=new WeakMap,z=new WeakMap,T=new WeakSet,Os=function(t){let e=!1;t.forEach(s=>{if(ae(s))if(e=f(this,T,At).call(this,"syncing"),this.mode==="full")switch(s.headers.operation){case"insert":r(this,M).set(s.key,s.value);break;case"update":r(this,M).set(s.key,E(E({},r(this,M).get(s.key)),s.value));break;case"delete":r(this,M).delete(s.key);break}else switch(s.headers.operation){case"insert":r(this,Q).add(s.key),r(this,M).set(s.key,s.value);break;case"update":r(this,Q).has(s.key)&&r(this,M).set(s.key,E(E({},r(this,M).get(s.key)),s.value));break;case"delete":r(this,Q).has(s.key)&&(r(this,M).delete(s.key),r(this,Q).delete(s.key));break}if(at(s))switch(s.headers.control){case"up-to-date":e=f(this,T,At).call(this,"up-to-date"),r(this,Ae)&&(h(this,Ae,!1),f(this,T,Hs).call(this));break;case"must-refetch":r(this,M).clear(),r(this,Q).clear(),h(this,z,!1),e=f(this,T,At).call(this,"syncing"),h(this,Ae,!0);break}}),e&&f(this,T,ts).call(this)},Hs=async function(){await f(this,T,es).call(this),await Promise.all(Array.from(r(this,ze)).map(async t=>{try{let e=JSON.parse(t);await this.stream.requestSnapshot(e)}catch(e){}}))},es=async function(){this.stream.isUpToDate||await new Promise(t=>{let e=()=>{this.stream.isUpToDate&&(clearInterval(s),a(),t())},s=setInterval(e,10),a=this.stream.subscribe(()=>e(),()=>e());e()})},At=function(t){let e=r(this,Te)!==t;return h(this,Te,t),e&&t==="up-to-date"},Is=function(t){t instanceof P&&(h(this,z,t),f(this,T,ts).call(this))},ts=function(){r(this,K).forEach(t=>{t({value:this.currentValue,rows:this.currentRows})})};export{ct as BackoffDefaults,Ht as ELECTRIC_PROTOCOL_QUERY_PARAMS,P as FetchError,Ds as Shape,Kt as ShapeStream,cs as camelToSnake,Oe as compileExpression,lt as compileOrderBy,ls as createColumnMapper,ae as isChangeMessage,at as isControlMessage,Ct as isVisibleInSnapshot,Zt as resolveValue,Ks as snakeCamelMapper,Pt as snakeToCamel};
5
+ For more information visit the troubleshooting guide: /docs/guides/troubleshooting/missing-headers`,super(s)}},Me=class extends Error{constructor(t){super(t),this.name="StaleCacheError"}};var ot=r=>Number(r),tr=r=>r==="true"||r==="t",sr=r=>BigInt(r),ps=r=>JSON.parse(r),rr=r=>r,nr={int2:ot,int4:ot,int8:sr,bool:tr,float4:ot,float8:ot,json:ps,jsonb:ps};function ar(r,t){let e=0,s=null,n="",o=!1,i=0,c;function h(l,S,x){let b=l.slice(S,x);return b=b==="NULL"?null:b,t?t(b):b}function d(l){let S=[];for(;e<l.length;e++){if(s=l[e],o)s==="\\"?n+=l[++e]:s==='"'?(S.push(t?t(n):n),n="",o=l[e+1]==='"',i=e+2):n+=s;else if(s==='"')o=!0;else if(s==="{")i=++e,S.push(d(l));else if(s==="}"){o=!1,i<e&&S.push(h(l,i,e)),i=e+1;break}else s===","&&c!=="}"&&c!=='"'&&(S.push(h(l,i,e)),i=e+1);c=s}return i<e&&S.push(S.push(h(l,i,e+1))),S}return d(r)[0]}var it=class{constructor(t,e){this.parser=E(E({},nr),t),this.transformer=e}parse(t,e){return JSON.parse(t,(s,n)=>(s==="value"||s==="old_value")&&typeof n=="object"&&n!==null?this.transformMessageValue(n,e):n)}parseSnapshotData(t,e){return t.map(s=>{let n=s;return n.value&&typeof n.value=="object"&&n.value!==null&&(n.value=this.transformMessageValue(n.value,e)),n.old_value&&typeof n.old_value=="object"&&n.old_value!==null&&(n.old_value=this.transformMessageValue(n.old_value,e)),n})}transformMessageValue(t,e){let s=t;return Object.keys(s).forEach(n=>{s[n]=this.parseRow(n,s[n],e)}),this.transformer?this.transformer(s):s}parseRow(t,e,s){var S;let n=s[t];if(!n)return e;let l=n,{type:o,dims:i}=l,c=Ce(l,["type","dims"]),h=(S=this.parser[o])!=null?S:rr,d=fs(h,n,t);return i&&i>0?fs((b,R)=>ar(b,d),n,t)(e):d(e,c)}};function fs(r,t,e){var n;let s=!((n=t.not_null)!=null&&n);return o=>{if(o===null){if(!s)throw new at(e!=null?e:"unknown");return null}return r(o,t)}}function Ue(r){return`"${r.replace(/"/g,'""')}"`}function Ut(r){var c,h,d,l;let t=(h=(c=r.match(/^_+/))==null?void 0:c[0])!=null?h:"",e=r.slice(t.length),s=(l=(d=e.match(/_+$/))==null?void 0:d[0])!=null?l:"",i=(s?e.slice(0,e.length-s.length):e).toLowerCase().replace(/_+([a-z])/g,(S,x)=>x.toUpperCase());return t+i+s}function ms(r){return r.replace(/([a-z])([A-Z])/g,"$1_$2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").toLowerCase()}function gs(r){let t={};for(let[e,s]of Object.entries(r))t[s]=e;return{decode:e=>{var s;return(s=r[e])!=null?s:e},encode:e=>{var s;return(s=t[e])!=null?s:e}}}function oe(r,t){if(!r||!t)return r!=null?r:"";let e=new Set(["SELECT","FROM","WHERE","AND","OR","NOT","IN","IS","NULL","NULLS","FIRST","LAST","TRUE","FALSE","LIKE","ILIKE","BETWEEN","ASC","DESC","LIMIT","OFFSET","ORDER","BY","GROUP","HAVING","DISTINCT","AS","ON","JOIN","LEFT","RIGHT","INNER","OUTER","CROSS","CASE","WHEN","THEN","ELSE","END","CAST","LOWER","UPPER","COALESCE","NULLIF"]),s=[],n=0;for(;n<r.length;){let c=r[n];if(c==="'"||c==='"'){let h=n,d=c;for(n++;n<r.length;)if(r[n]===d)if(r[n+1]===d)n+=2;else{n++;break}else n++;s.push({start:h,end:n})}else n++}let o=c=>s.some(h=>c>=h.start&&c<h.end),i=new RegExp("(?<![a-zA-Z0-9_])([a-zA-Z_][a-zA-Z0-9_]*)(?![a-zA-Z0-9_])","g");return r.replace(i,(c,h,d)=>o(d)||e.has(c.toUpperCase())||c.startsWith("$")?c:t(c))}function or(r){if(r){let t={};for(let e of Object.keys(r))t[e]=Ut(e);return gs(t)}return{decode:t=>Ut(t),encode:t=>ms(t)}}function ie(r){return"key"in r}function ct(r){return!ie(r)}function kt(r){return ct(r)&&r.headers.control==="up-to-date"}function Ss(r){if(r.headers.control!="up-to-date")return;let t=r.headers.global_last_seen_lsn;return t?`${t}_0`:void 0}function Ot(r,t){let e=BigInt(r),s=BigInt(t.xmin),n=BigInt(t.xmax),o=t.xip_list.map(BigInt);return e<s||e<n&&!o.includes(e)}var ys="electric-cursor",ce="electric-handle",lt="electric-offset",Lt="electric-schema",Es="electric-up-to-date",Bt="columns",ke="cursor",Oe="expired_handle",Z="handle",B="live",ee="offset",Rs="table",bs="where",xs="replica",ws="params",Ts="experimental_live_sse",Dt="live_sse",It="force-disconnect-and-refresh",As="pause-stream",Ht="system-wake",Ft="log",le="subset__where",Le="subset__limit",Be="subset__offset",he="subset__order_by",De="subset__params",Nt="subset__where_expr",qt="subset__order_by_expr",Ie="cache-buster",$t=[B,Dt,Z,ee,ke,Oe,Ft,le,Le,Be,he,De,Nt,qt,Ie];var ir=[429],ut={initialDelay:100,maxDelay:6e4,multiplier:1.3,maxRetries:1/0};function cr(r){if(!r)return 0;let t=Number(r);if(Number.isFinite(t)&&t>0)return t*1e3;let e=Date.parse(r);if(!isNaN(e)){let s=e-Date.now();return Math.max(0,Math.min(s,36e5))}return 0}function vs(r,t=ut){let{initialDelay:e,maxDelay:s,multiplier:n,debug:o=!1,onFailedAttempt:i,maxRetries:c=1/0}=t;return async(...h)=>{var b;let d=h[0],l=h[1],S=e,x=0;for(;;)try{let R=await r(...h);if(R.ok)return R;throw await v.fromResponse(R,d.toString())}catch(R){if(i==null||i(),(b=l==null?void 0:l.signal)!=null&&b.aborted)throw new H;if(R instanceof v&&!ir.includes(R.status)&&R.status>=400&&R.status<500)throw R;{if(x++,x>c)throw o&&console.log(`Max retries reached (${x}/${c}), giving up`),R;let y=R instanceof v&&R.headers?cr(R.headers["retry-after"]):0,M=Math.random()*S,P=Math.min(M,s),I=Math.max(y,P);if(o){let Pe=y>0?"server+client":"client";console.log(`Retry attempt #${x} after ${I}ms (${Pe}, serverMin=${y}ms, clientBackoff=${P}ms)`)}await new Promise(Pe=>setTimeout(Pe,I)),S=Math.min(S*n,s)}}}}var lr=[201,204,205];function Ps(r){return async(...t)=>{var n,o;let e=t[0],s=await r(...t);try{if(s.status<200||lr.includes(s.status))return s;let i=await s.text();return new Response(i,s)}catch(i){throw(o=(n=t[1])==null?void 0:n.signal)!=null&&o.aborted?new H:new v(s.status,void 0,void 0,Object.fromEntries([...s.headers.entries()]),e.toString(),i instanceof Error?i.message:typeof i=="string"?i:"failed to read body")}}}var hr={maxChunksToPrefetch:2};function _s(r,t=hr){let{maxChunksToPrefetch:e}=t,s;return async(...o)=>{let i=o[0].toString(),c=s==null?void 0:s.consume(...o);if(c)return c;s==null||s.abort(),s=void 0;let h=await r(...o),d=Yt(i,h);return d&&(s=new jt({fetchClient:r,maxPrefetchedRequests:e,url:d,requestInit:o[1]})),h}}var ur=["electric-offset","electric-handle"],dr=["electric-cursor"],pr=["electric-schema"];function Cs(r){return async(...t)=>{let e=await r(...t);if(e.ok){let s=e.headers,n=[],o=l=>n.push(...l.filter(S=>!s.has(S))),c=t[0].toString(),h=new URL(c);if([le,De,Le,Be,he].some(l=>h.searchParams.has(l)))return e;if(o(ur),h.searchParams.get(B)==="true"&&o(dr),(!h.searchParams.has(B)||h.searchParams.get(B)==="false")&&o(pr),n.length>0)throw new X(c,n)}return e}}var He,Fe,L,te,F,ue,ht,jt=class{constructor(t){f(this,ue);f(this,He);f(this,Fe);f(this,L,new Map);f(this,te);f(this,F);var e;u(this,He,(e=t.fetchClient)!=null?e:(...s)=>fetch(...s)),u(this,Fe,t.maxPrefetchedRequests),u(this,te,t.url.toString()),u(this,F,a(this,te)),m(this,ue,ht).call(this,t.url,t.requestInit)}abort(){a(this,L).forEach(([t,e])=>e.abort()),a(this,L).clear()}consume(...t){let e=t[0].toString(),s=a(this,L).get(e);if(!s||e!==a(this,te))return;let[n,o]=s;if(o.signal.aborted){a(this,L).delete(e);return}return a(this,L).delete(e),n.then(i=>{let c=Yt(e,i);u(this,te,c),a(this,F)&&!a(this,L).has(a(this,F))&&m(this,ue,ht).call(this,a(this,F),t[1])}).catch(()=>{}),n}};He=new WeakMap,Fe=new WeakMap,L=new WeakMap,te=new WeakMap,F=new WeakMap,ue=new WeakSet,ht=function(...t){var n,o;let e=t[0].toString();if(a(this,L).size>=a(this,Fe))return;let s=new AbortController;try{let{signal:i,cleanup:c}=fr(s,(n=t[1])==null?void 0:n.signal),h=a(this,He).call(this,e,A(E({},(o=t[1])!=null?o:{}),{signal:i}));a(this,L).set(e,[h,s]),h.then(d=>{if(!d.ok||s.signal.aborted)return;let l=Yt(e,d);if(!l||l===e){u(this,F,void 0);return}return u(this,F,l),m(this,ue,ht).call(this,l,t[1])}).catch(()=>{}).finally(c)}catch(i){}};function Yt(r,t){let e=t.headers.get(ce),s=t.headers.get(lt),n=t.headers.has(Es);if(!e||!s||n)return;let o=new URL(r);if(o.searchParams.has(B))return;let i=o.searchParams.get(Oe);if(i&&e===i){console.warn(`[Electric] Received stale cached response with expired shape handle. This should not happen and indicates a proxy/CDN caching misconfiguration. The response contained handle "${e}" which was previously marked as expired. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. Skipping prefetch to prevent infinite 409 loop.`);return}return o.searchParams.set(Z,e),o.searchParams.set(ee,s),o.searchParams.sort(),o.toString()}function fr(r,t){let e=mr;if(t)if(t.aborted)r.abort();else{let s=()=>r.abort();t.addEventListener("abort",s,{once:!0,signal:r.signal}),e=()=>t.removeEventListener("abort",s)}return{signal:r.signal,cleanup:e}}function mr(){}function Ne(r,t){switch(r.type){case"ref":{let e=t?t(r.column):r.column;return Ue(e)}case"val":return`$${r.paramIndex}`;case"func":return gr(r,t);default:{let e=r;throw new Error(`Unknown expression type: ${JSON.stringify(e)}`)}}}function gr(r,t){let e=r.args.map(s=>Ne(s,t));switch(r.name){case"eq":return`${e[0]} = ${e[1]}`;case"gt":return`${e[0]} > ${e[1]}`;case"gte":return`${e[0]} >= ${e[1]}`;case"lt":return`${e[0]} < ${e[1]}`;case"lte":return`${e[0]} <= ${e[1]}`;case"and":return e.map(s=>`(${s})`).join(" AND ");case"or":return e.map(s=>`(${s})`).join(" OR ");case"not":return`NOT (${e[0]})`;case"in":return`${e[0]} = ANY(${e[1]})`;case"like":return`${e[0]} LIKE ${e[1]}`;case"ilike":return`${e[0]} ILIKE ${e[1]}`;case"isNull":case"isUndefined":return`${e[0]} IS NULL`;case"upper":return`UPPER(${e[0]})`;case"lower":return`LOWER(${e[0]})`;case"length":return`LENGTH(${e[0]})`;case"concat":return`CONCAT(${e.join(", ")})`;case"coalesce":return`COALESCE(${e.join(", ")})`;default:throw new Error(`Unknown function: ${r.name}`)}}function dt(r,t){return r.map(e=>{let s=t?t(e.column):e.column,n=Ue(s);return e.direction==="desc"&&(n+=" DESC"),e.nulls==="first"&&(n+=" NULLS FIRST"),e.nulls==="last"&&(n+=" NULLS LAST"),n}).join(", ")}async function Us(r,t){let e=r.getReader(),s;for(;!(s=await e.read()).done;)t(s.value)}function ks(r){let t,e,s,n=!1;return function(i){t===void 0?(t=i,e=0,s=-1):t=Sr(t,i);let c=t.length,h=0;for(;e<c;){n&&(t[e]===10&&(h=++e),n=!1);let d=-1;for(;e<c&&d===-1;++e)switch(t[e]){case 58:s===-1&&(s=e-h);break;case 13:n=!0;case 10:d=e;break}if(d===-1)break;r(t.subarray(h,d),s),h=e,s=-1}h===c?t=void 0:h!==0&&(t=t.subarray(h),e-=h)}}function Os(r,t,e){let s=Ms(),n=new TextDecoder;return function(i,c){if(i.length===0)e==null||e(s),s=Ms();else if(c>0){let h=n.decode(i.subarray(0,c)),d=c+(i[c+1]===32?2:1),l=n.decode(i.subarray(d));switch(h){case"data":s.data=s.data?s.data+`
6
+ `+l:l;break;case"event":s.event=l;break;case"id":r(s.id=l);break;case"retry":let S=parseInt(l,10);isNaN(S)||t(s.retry=S);break}}}}function Sr(r,t){let e=new Uint8Array(r.length+t.length);return e.set(r),e.set(t,r.length),e}function Ms(){return{data:"",event:"",id:"",retry:void 0}}var yr=function(r,t){var e={};for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&t.indexOf(s)<0&&(e[s]=r[s]);if(r!=null&&typeof Object.getOwnPropertySymbols=="function")for(var n=0,s=Object.getOwnPropertySymbols(r);n<s.length;n++)t.indexOf(s[n])<0&&Object.prototype.propertyIsEnumerable.call(r,s[n])&&(e[s[n]]=r[s[n]]);return e},pt="text/event-stream",Er=1e3,Ls="last-event-id";function Vt(r,t){var{signal:e,headers:s,onopen:n,onmessage:o,onclose:i,onerror:c,openWhenHidden:h,fetch:d}=t,l=yr(t,["signal","headers","onopen","onmessage","onclose","onerror","openWhenHidden","fetch"]);return new Promise((S,x)=>{let b=Object.assign({},s);b.accept||(b.accept=pt);let R;function y(){R.abort(),typeof document!="undefined"&&!document.hidden&&_t()}typeof document!="undefined"&&!h&&document.addEventListener("visibilitychange",y);let M=Er,P=0;function I(){typeof document!="undefined"&&document.removeEventListener("visibilitychange",y),clearTimeout(P),R.abort()}e==null||e.addEventListener("abort",()=>{I()});let Pe=d!=null?d:window.fetch,Js=n!=null?n:Rr;async function _t(){var Ct;R=new AbortController;let cs=e.aborted?e:R.signal;try{let _e=await Pe(r,Object.assign(Object.assign({},l),{headers:b,signal:cs}));await Js(_e),await Us(_e.body,ks(Os(j=>{j?b[Ls]=j:delete b[Ls]},j=>{M=j},o))),i==null||i(),I(),S()}catch(_e){if(cs.aborted)I(),x(_e);else if(!R.signal.aborted)try{let j=(Ct=c==null?void 0:c(_e))!==null&&Ct!==void 0?Ct:M;clearTimeout(P),P=setTimeout(_t,j)}catch(j){I(),x(j)}}}_t()})}function Rr(r){let t=r.headers.get("content-type");if(!(t!=null&&t.startsWith(pt)))throw new Error(`Expected content-type to be ${pt}, Actual: ${t}`)}var Wt=class{constructor(){this.data={};this.max=250;this.storageKey="electric_expired_shapes";this.load()}getExpiredHandle(t){let e=this.data[t];return e?(e.lastUsed=Date.now(),this.save(),e.expiredHandle):null}markExpired(t,e){this.data[t]={expiredHandle:e,lastUsed:Date.now()};let s=Object.keys(this.data);if(s.length>this.max){let n=s.reduce((o,i)=>this.data[i].lastUsed<this.data[o].lastUsed?i:o);delete this.data[n]}this.save()}save(){if(typeof localStorage!="undefined")try{localStorage.setItem(this.storageKey,JSON.stringify(this.data))}catch(t){}}load(){if(typeof localStorage!="undefined")try{let t=localStorage.getItem(this.storageKey);t&&(this.data=JSON.parse(t))}catch(t){this.data={}}}clear(){this.data={},this.save()}},qe=new Wt;var Kt=class{constructor(){this.data={};this.storageKey="electric_up_to_date_tracker";this.cacheTTL=6e4;this.maxEntries=250;this.writeThrottleMs=6e4;this.lastWriteTime=0;this.load(),this.cleanup()}recordUpToDate(t,e){this.data[t]={timestamp:Date.now(),cursor:e};let s=Object.keys(this.data);if(s.length>this.maxEntries){let n=s.reduce((o,i)=>this.data[i].timestamp<this.data[o].timestamp?i:o);delete this.data[n]}this.scheduleSave()}scheduleSave(){let t=Date.now(),e=t-this.lastWriteTime;if(e>=this.writeThrottleMs)this.lastWriteTime=t,this.save();else if(!this.pendingSaveTimer){let s=this.writeThrottleMs-e;this.pendingSaveTimer=setTimeout(()=>{this.lastWriteTime=Date.now(),this.pendingSaveTimer=void 0,this.save()},s)}}shouldEnterReplayMode(t){let e=this.data[t];return!e||Date.now()-e.timestamp>=this.cacheTTL?null:e.cursor}cleanup(){let t=Date.now(),e=Object.keys(this.data),s=!1;for(let n of e)t-this.data[n].timestamp>this.cacheTTL&&(delete this.data[n],s=!0);s&&this.save()}save(){if(typeof localStorage!="undefined")try{localStorage.setItem(this.storageKey,JSON.stringify(this.data))}catch(t){}}load(){if(typeof localStorage!="undefined")try{let t=localStorage.getItem(this.storageKey);t&&(this.data=JSON.parse(t))}catch(t){this.data={}}}clear(){this.data={},this.pendingSaveTimer&&(clearTimeout(this.pendingSaveTimer),this.pendingSaveTimer=void 0),this.save()}},Qt=new Kt;var ft=class{constructor(){this.activeSnapshots=new Map;this.xmaxSnapshots=new Map;this.snapshotsByDatabaseLsn=new Map}addSnapshot(t,e){var o,i,c,h;this.activeSnapshots.set(t.snapshot_mark,{xmin:BigInt(t.xmin),xmax:BigInt(t.xmax),xip_list:t.xip_list.map(BigInt),keys:e});let s=(i=(o=this.xmaxSnapshots.get(BigInt(t.xmax)))==null?void 0:o.add(t.snapshot_mark))!=null?i:new Set([t.snapshot_mark]);this.xmaxSnapshots.set(BigInt(t.xmax),s);let n=(h=(c=this.snapshotsByDatabaseLsn.get(BigInt(t.database_lsn)))==null?void 0:c.add(t.snapshot_mark))!=null?h:new Set([t.snapshot_mark]);this.snapshotsByDatabaseLsn.set(BigInt(t.database_lsn),n)}removeSnapshot(t){this.activeSnapshots.delete(t)}shouldRejectMessage(t){let e=t.headers.txids||[];if(e.length===0)return!1;let s=Math.max(...e);for(let[n,o]of this.xmaxSnapshots.entries())if(s>=n)for(let i of o)this.removeSnapshot(i);return[...this.activeSnapshots.values()].some(n=>n.keys.has(t.key)&&Ot(s,n))}lastSeenUpdate(t){for(let[e,s]of this.snapshotsByDatabaseLsn.entries())if(e<=t)for(let n of s)this.removeSnapshot(n)}};var $e=class{get isUpToDate(){return!1}get staleCacheBuster(){}get staleCacheRetryCount(){return 0}get sseFallbackToLongPolling(){return!1}get consecutiveShortSseConnections(){return 0}get replayCursor(){}canEnterReplayMode(){return!1}enterReplayMode(t){return this}shouldUseSse(t){return!1}handleSseConnectionClosed(t){return{state:this,fellBackToLongPolling:!1,wasShortConnection:!1}}applyUrlParams(t,e){}handleResponseMetadata(t){return{action:"ignored",state:this}}handleMessageBatch(t){return{state:this,suppressBatch:!1,becameUpToDate:!1}}pause(){return new Ve(this)}toErrorState(t){return new We(this,t)}markMustRefetch(t){return new mt({handle:t,offset:"-1",liveCacheBuster:"",lastSyncedAt:this.lastSyncedAt,schema:void 0})}},w,je=class extends $e{constructor(e){super();f(this,w);u(this,w,e)}get handle(){return a(this,w).handle}get offset(){return a(this,w).offset}get schema(){return a(this,w).schema}get liveCacheBuster(){return a(this,w).liveCacheBuster}get lastSyncedAt(){return a(this,w).lastSyncedAt}get currentFields(){return a(this,w)}applyUrlParams(e,s){e.searchParams.set(ee,a(this,w).offset),a(this,w).handle&&e.searchParams.set(Z,a(this,w).handle)}parseResponseFields(e){var d,l,S;let s=e.responseHandle,n=s&&s!==e.expiredHandle?s:a(this,w).handle,o=(d=e.responseOffset)!=null?d:a(this,w).offset,i=(l=e.responseCursor)!=null?l:a(this,w).liveCacheBuster,c=(S=a(this,w).schema)!=null?S:e.responseSchema,h=e.status===204?e.now:a(this,w).lastSyncedAt;return{handle:n,offset:o,schema:c,liveCacheBuster:i,lastSyncedAt:h}}checkStaleResponse(e){let s=e.responseHandle,n=e.expiredHandle;if(!s||s!==n)return null;if(a(this,w).handle===void 0||a(this,w).handle===n){let o=this.staleCacheRetryCount+1;return{action:"stale-retry",state:new Gt(A(E({},this.currentFields),{staleCacheBuster:e.createCacheBuster(),staleCacheRetryCount:o})),exceededMaxRetries:o>e.maxStaleCacheRetries}}return{action:"ignored",state:this}}handleMessageBatch(e){if(!e.hasMessages||!e.hasUpToDateMessage)return{state:this,suppressBatch:!1,becameUpToDate:!1};let s=a(this,w).offset;e.isSse&&e.upToDateOffset&&(s=e.upToDateOffset);let n={handle:a(this,w).handle,offset:s,schema:a(this,w).schema,liveCacheBuster:a(this,w).liveCacheBuster,lastSyncedAt:e.now};return this.onUpToDate(n,e)}onUpToDate(e,s){return{state:new gt(e),suppressBatch:!1,becameUpToDate:!0}}};w=new WeakMap;var Ye=class extends je{handleResponseMetadata(t){let e=this.checkStaleResponse(t);if(e)return e;let s=this.parseResponseFields(t);return{action:"accepted",state:new zt(s)}}canEnterReplayMode(){return!0}enterReplayMode(t){return new Jt(A(E({},this.currentFields),{replayCursor:t}))}},mt=class r extends Ye{constructor(e){super(e);this.kind="initial"}withHandle(e){return new r(A(E({},this.currentFields),{handle:e}))}},zt=class r extends Ye{constructor(e){super(e);this.kind="syncing"}withHandle(e){return new r(A(E({},this.currentFields),{handle:e}))}},se,pe,Xt=class Xt extends Ye{constructor(e){let i=e,{staleCacheBuster:s,staleCacheRetryCount:n}=i,o=Ce(i,["staleCacheBuster","staleCacheRetryCount"]);super(o);this.kind="stale-retry";f(this,se);f(this,pe);u(this,se,s),u(this,pe,n)}get staleCacheBuster(){return a(this,se)}get staleCacheRetryCount(){return a(this,pe)}canEnterReplayMode(){return!1}withHandle(e){return new Xt(A(E({},this.currentFields),{handle:e,staleCacheBuster:a(this,se),staleCacheRetryCount:a(this,pe)}))}applyUrlParams(e,s){super.applyUrlParams(e,s),e.searchParams.set(Ie,a(this,se))}};se=new WeakMap,pe=new WeakMap;var Gt=Xt,re,Y,de=class de extends je{constructor(e,s){var n,o;super(e);this.kind="live";f(this,re);f(this,Y);u(this,re,(n=s==null?void 0:s.consecutiveShortSseConnections)!=null?n:0),u(this,Y,(o=s==null?void 0:s.sseFallbackToLongPolling)!=null?o:!1)}get isUpToDate(){return!0}get consecutiveShortSseConnections(){return a(this,re)}get sseFallbackToLongPolling(){return a(this,Y)}withHandle(e){return new de(A(E({},this.currentFields),{handle:e}),this.sseState)}applyUrlParams(e,s){super.applyUrlParams(e,s),s.isSnapshotRequest||(e.searchParams.set(ke,this.liveCacheBuster),s.canLongPoll&&e.searchParams.set(B,"true"))}get sseState(){return{consecutiveShortSseConnections:a(this,re),sseFallbackToLongPolling:a(this,Y)}}handleResponseMetadata(e){let s=this.checkStaleResponse(e);if(s)return s;let n=this.parseResponseFields(e);return{action:"accepted",state:new de(n,this.sseState)}}onUpToDate(e,s){return{state:new de(e,this.sseState),suppressBatch:!1,becameUpToDate:!0}}shouldUseSse(e){return e.liveSseEnabled&&!e.isRefreshing&&!e.resumingFromPause&&!a(this,Y)}handleSseConnectionClosed(e){let s=a(this,re),n=a(this,Y),o=!1,i=!1;return e.connectionDuration<e.minConnectionDuration&&!e.wasAborted?(i=!0,s=s+1,s>=e.maxShortConnections&&(n=!0,o=!0)):e.connectionDuration>=e.minConnectionDuration&&(s=0),{state:new de(this.currentFields,{consecutiveShortSseConnections:s,sseFallbackToLongPolling:n}),fellBackToLongPolling:o,wasShortConnection:i}}};re=new WeakMap,Y=new WeakMap;var gt=de,V,St=class St extends je{constructor(e){let o=e,{replayCursor:s}=o,n=Ce(o,["replayCursor"]);super(n);this.kind="replaying";f(this,V);u(this,V,s)}get replayCursor(){return a(this,V)}withHandle(e){return new St(A(E({},this.currentFields),{handle:e,replayCursor:a(this,V)}))}handleResponseMetadata(e){let s=this.checkStaleResponse(e);if(s)return s;let n=this.parseResponseFields(e);return{action:"accepted",state:new St(A(E({},n),{replayCursor:a(this,V)}))}}onUpToDate(e,s){let n=!s.isSse&&a(this,V)===s.currentCursor;return{state:new gt(e),suppressBatch:n,becameUpToDate:!0}}};V=new WeakMap;var Jt=St,Ve=class r extends $e{constructor(e){super();this.kind="paused";this.previousState=e}get handle(){return this.previousState.handle}get offset(){return this.previousState.offset}get schema(){return this.previousState.schema}get liveCacheBuster(){return this.previousState.liveCacheBuster}get lastSyncedAt(){return this.previousState.lastSyncedAt}get isUpToDate(){return this.previousState.isUpToDate}get staleCacheBuster(){return this.previousState.staleCacheBuster}get staleCacheRetryCount(){return this.previousState.staleCacheRetryCount}get sseFallbackToLongPolling(){return this.previousState.sseFallbackToLongPolling}get consecutiveShortSseConnections(){return this.previousState.consecutiveShortSseConnections}get replayCursor(){return this.previousState.replayCursor}withHandle(e){return new r(this.previousState.withHandle(e))}applyUrlParams(e,s){this.previousState.applyUrlParams(e,s)}pause(){return this}resume(){return this.previousState}},We=class r extends $e{constructor(e,s){super();this.kind="error";this.previousState=e,this.error=s}get handle(){return this.previousState.handle}get offset(){return this.previousState.offset}get schema(){return this.previousState.schema}get liveCacheBuster(){return this.previousState.liveCacheBuster}get lastSyncedAt(){return this.previousState.lastSyncedAt}get isUpToDate(){return this.previousState.isUpToDate}withHandle(e){return new r(this.previousState.withHandle(e),this.error)}applyUrlParams(e,s){this.previousState.applyUrlParams(e,s)}retry(){return this.previousState}reset(e){return this.previousState.markMustRefetch(e)}};function Bs(r){return new mt({handle:r.handle,offset:r.offset,liveCacheBuster:"",lastSyncedAt:void 0,schema:void 0})}var O,Ke,Qe,yt=class{constructor(t){f(this,O,new Set);f(this,Ke);f(this,Qe);u(this,Ke,t.onAcquired),u(this,Qe,t.onReleased)}acquire(t){if(a(this,O).has(t)){console.warn(`[Electric] PauseLock: "${t}" already held \u2014 ignoring duplicate acquire`);return}let e=a(this,O).size===0;a(this,O).add(t),e&&a(this,Ke).call(this)}release(t){if(!a(this,O).delete(t)){console.warn(`[Electric] PauseLock: "${t}" not held \u2014 ignoring release (possible acquire/release mismatch)`);return}a(this,O).size===0&&a(this,Qe).call(this)}get isPaused(){return a(this,O).size>0}isHeldBy(t){return a(this,O).has(t)}releaseAllMatching(t){for(let e of a(this,O))e.startsWith(t)&&a(this,O).delete(e)}};O=new WeakMap,Ke=new WeakMap,Qe=new WeakMap;var br=new Set([ke,Z,B,ee,Ie]);async function as(r){return typeof r=="function"?r():r}async function xr(r){let t=Object.entries(r),e=await Promise.all(t.map(async([s,n])=>{if(n===void 0)return[s,void 0];let o=await as(n);return[s,Array.isArray(o)?o.join(","):o]}));return Object.fromEntries(e.filter(([s,n])=>n!==void 0))}async function wr(r){if(!r)return{};let t=Object.entries(r),e=await Promise.all(t.map(async([s,n])=>[s,await as(n)]));return Object.fromEntries(e)}function fe(r){let t=new URL(r.origin+r.pathname);for(let[e,s]of r.searchParams)$t.includes(e)||t.searchParams.set(e,s);return t.searchParams.sort(),t.toString()}var ge,Se,ye,ne,W,D,g,N,K,Ee,_,Q,xt,p,es,q,Re,be,xe,Ge,C,$,Je,wt,Tt,At,vt,Xe,we,Te,ze,Et,me,Rt,Is,ts,bt,Hs,Fs,Ns,qs,ss,rs,ns,$s,js,Ys,Vs,Zt=class{constructor(t){f(this,p);f(this,ge,null);f(this,Se);f(this,ye);f(this,ne);f(this,W,new Map);f(this,D,!1);f(this,g);f(this,N,!1);f(this,K);f(this,Ee);f(this,_);f(this,Q,0);f(this,xt,0);f(this,q);f(this,Re);f(this,be);f(this,xe,Promise.resolve([]));f(this,Ge,new ft);f(this,C);f(this,$);f(this,Je);f(this,wt,1e3);f(this,Tt,3);f(this,At,100);f(this,vt,5e3);f(this,Xe);f(this,we);f(this,Te,3);var i,c,h,d;this.options=E({subscribe:!0},t),Tr(this.options),u(this,g,Bs({offset:(i=this.options.offset)!=null?i:"-1",handle:this.options.handle})),u(this,C,new yt({onAcquired:()=>{var l;u(this,g,a(this,g).pause()),a(this,D)&&((l=a(this,_))==null||l.abort(As))},onReleased:()=>{var l;a(this,D)&&((l=this.options.signal)!=null&&l.aborted||m(this,p,ze).call(this).catch(()=>{}))}}));let e;if(t.columnMapper){let l=S=>{let x={};for(let[b,R]of Object.entries(S)){let y=t.columnMapper.decode(b);x[y]=R}return x};e=t.transformer?S=>t.transformer(l(S)):l}else e=t.transformer;u(this,ne,new it(t.parser,e)),u(this,Ee,this.options.onError),u(this,K,(c=this.options.log)!=null?c:"full");let s=(h=t.fetchClient)!=null?h:(...l)=>fetch(...l),n=A(E({},(d=t.backoffOptions)!=null?d:ut),{onFailedAttempt:()=>{var l,S;u(this,N,!1),(S=(l=t.backoffOptions)==null?void 0:l.onFailedAttempt)==null||S.call(l)}}),o=vs(s,n);u(this,ye,Cs(_s(o))),u(this,Se,Ps(a(this,ye))),m(this,p,$s).call(this),m(this,p,js).call(this)}get shapeHandle(){return a(this,g).handle}get error(){return a(this,ge)}get isUpToDate(){return a(this,g).isUpToDate}get lastOffset(){return a(this,g).offset}get mode(){return a(this,K)}subscribe(t,e=()=>{}){let s={};return a(this,W).set(s,[t,e]),a(this,D)||m(this,p,ze).call(this),()=>{a(this,W).delete(s)}}unsubscribeAll(){var t,e;a(this,W).clear(),(t=a(this,Xe))==null||t.call(this),(e=a(this,we))==null||e.call(this)}lastSyncedAt(){return a(this,g).lastSyncedAt}lastSynced(){return a(this,g).lastSyncedAt===void 0?1/0:Date.now()-a(this,g).lastSyncedAt}isConnected(){return a(this,N)}isLoading(){return!a(this,g).isUpToDate}hasStarted(){return a(this,D)}isPaused(){return a(this,C).isPaused}async forceDisconnectAndRefresh(){var t,e;ae(this,Q)._++;try{a(this,g).isUpToDate&&!((t=a(this,_))!=null&&t.signal.aborted)&&((e=a(this,_))==null||e.abort(It)),await m(this,p,qs).call(this)}finally{ae(this,Q)._--}}async requestSnapshot(t){if(a(this,K)==="full")throw new Error(`Snapshot requests are not supported in ${a(this,K)} mode, as the consumer is guaranteed to observe all data`);a(this,D)||m(this,p,ze).call(this).catch(()=>{});let e=`snapshot-${++ae(this,xt)._}`;a(this,C).acquire(e);let s=setTimeout(()=>{console.warn(`[Electric] Snapshot "${e}" has held the pause lock for 30s \u2014 possible hung request or leaked lock. Current holders: ${[...new Set([e])].join(", ")}`)},3e4);try{let{metadata:n,data:o}=await this.fetchSnapshot(t),i=o.concat([{headers:E({control:"snapshot-end"},n)},{headers:E({control:"subset-end"},t)}]);return a(this,Ge).addSnapshot(n,new Set(o.map(c=>c.key))),m(this,p,bt).call(this,i,!1),{metadata:n,data:o}}finally{clearTimeout(s),a(this,C).release(e)}}async fetchSnapshot(t){var x,b,R;let s=((b=(x=t.method)!=null?x:this.options.subsetMethod)!=null?b:"GET")==="POST",n,o;if(s){let y=await m(this,p,Rt).call(this,this.options.url,!0);n=y.fetchUrl,o={method:"POST",headers:A(E({},y.requestHeaders),{"Content-Type":"application/json"}),body:JSON.stringify(m(this,p,Vs).call(this,t))}}else{let y=await m(this,p,Rt).call(this,this.options.url,!0,t);n=y.fetchUrl,o={headers:y.requestHeaders}}let i=a(this,g).handle,c;try{c=await a(this,Se).call(this,n.toString(),o)}catch(y){if(y instanceof v&&y.status===409){if(i){let P=fe(n);qe.markExpired(P,i)}let M=y.headers[ce]||`${i!=null?i:"handle"}-next`;return u(this,g,a(this,g).withHandle(M)),this.fetchSnapshot(t)}throw y}if(!c.ok)throw await v.fromResponse(c,n.toString());let h=(R=a(this,g).schema)!=null?R:Ds(c.headers,{required:!0,url:n.toString()}),{metadata:d,data:l}=await c.json(),S=a(this,ne).parseSnapshotData(l,h);return{metadata:d,data:S}}};ge=new WeakMap,Se=new WeakMap,ye=new WeakMap,ne=new WeakMap,W=new WeakMap,D=new WeakMap,g=new WeakMap,N=new WeakMap,K=new WeakMap,Ee=new WeakMap,_=new WeakMap,Q=new WeakMap,xt=new WeakMap,p=new WeakSet,es=function(){return a(this,Q)>0},q=new WeakMap,Re=new WeakMap,be=new WeakMap,xe=new WeakMap,Ge=new WeakMap,C=new WeakMap,$=new WeakMap,Je=new WeakMap,wt=new WeakMap,Tt=new WeakMap,At=new WeakMap,vt=new WeakMap,Xe=new WeakMap,we=new WeakMap,Te=new WeakMap,ze=async function(){var t,e;u(this,D,!0);try{await m(this,p,me).call(this)}catch(s){if(u(this,ge,s),s instanceof Error&&u(this,g,a(this,g).toErrorState(s)),a(this,Ee)){let n=await a(this,Ee).call(this,s),o=!(s instanceof X);if(n&&typeof n=="object"&&o){n.params&&(this.options.params=E(E({},(t=this.options.params)!=null?t:{}),n.params)),n.headers&&(this.options.headers=E(E({},(e=this.options.headers)!=null?e:{}),n.headers)),u(this,ge,null),a(this,g)instanceof We&&u(this,g,a(this,g).retry()),u(this,D,!1),await m(this,p,ze).call(this);return}s instanceof Error&&m(this,p,rs).call(this,s),m(this,p,Et).call(this);return}throw s instanceof Error&&m(this,p,rs).call(this,s),m(this,p,Et).call(this),s}m(this,p,Et).call(this)},Et=function(){var t,e;u(this,N,!1),(t=a(this,be))==null||t.call(this),(e=a(this,we))==null||e.call(this)},me=async function(){var h,d;if(a(this,C).isPaused||!this.options.subscribe&&((h=this.options.signal)!=null&&h.aborted||a(this,g).isUpToDate))return;let t=!1;a(this,g)instanceof Ve&&(t=!0,u(this,g,a(this,g).resume()));let{url:e,signal:s}=this.options,{fetchUrl:n,requestHeaders:o}=await m(this,p,Rt).call(this,e,t),i=await m(this,p,Is).call(this,s),c=a(this,_);if(a(this,C).isPaused){i&&s&&s.removeEventListener("abort",i),u(this,_,void 0);return}try{await m(this,p,Hs).call(this,{fetchUrl:n,requestAbortController:c,headers:o,resumingFromPause:t})}catch(l){let S=c.signal.reason,x=c.signal.aborted&&(S===It||S===Ht);if((l instanceof v||l instanceof H)&&x)return m(this,p,me).call(this);if(l instanceof H)return;if(l instanceof Me)return m(this,p,me).call(this);if(!(l instanceof v))throw l;if(l.status==409){if(a(this,g).handle){let R=fe(n);qe.markExpired(R,a(this,g).handle)}let b=l.headers[ce]||`${a(this,g).handle}-next`;return m(this,p,Ys).call(this,b),await m(this,p,ss).call(this,Array.isArray(l.json)?l.json:[l.json]),m(this,p,me).call(this)}else throw l}finally{i&&s&&s.removeEventListener("abort",i),u(this,_,void 0)}return(d=a(this,Re))==null||d.call(this),m(this,p,me).call(this)},Rt=async function(t,e,s){var d,l,S,x,b,R;let[n,o]=await Promise.all([wr(this.options.headers),this.options.params?xr(Ar(this.options.params)):void 0]);o&&Ws(o);let i=new URL(t);if(o){if(o.table&&U(i,Rs,o.table),o.where&&typeof o.where=="string"){let M=oe(o.where,(d=this.options.columnMapper)==null?void 0:d.encode);U(i,bs,M)}if(o.columns){let M=await as((l=this.options.params)==null?void 0:l.columns);if(Array.isArray(M)){let P=M.map(String);this.options.columnMapper&&(P=P.map(this.options.columnMapper.encode));let I=P.map(Ue).join(",");U(i,Bt,I)}else U(i,Bt,o.columns)}o.replica&&U(i,xs,o.replica),o.params&&U(i,ws,o.params);let y=E({},o);delete y.table,delete y.where,delete y.columns,delete y.replica,delete y.params;for(let[M,P]of Object.entries(y))U(i,M,P)}if(s){if(s.whereExpr){let y=Ne(s.whereExpr,(S=this.options.columnMapper)==null?void 0:S.encode);U(i,le,y),i.searchParams.set(Nt,JSON.stringify(s.whereExpr))}else if(s.where&&typeof s.where=="string"){let y=oe(s.where,(x=this.options.columnMapper)==null?void 0:x.encode);U(i,le,y)}if(s.params&&i.searchParams.set(De,JSON.stringify(s.params)),s.limit&&U(i,Le,s.limit),s.offset&&U(i,Be,s.offset),s.orderByExpr){let y=dt(s.orderByExpr,(b=this.options.columnMapper)==null?void 0:b.encode);U(i,he,y),i.searchParams.set(qt,JSON.stringify(s.orderByExpr))}else if(s.orderBy&&typeof s.orderBy=="string"){let y=oe(s.orderBy,(R=this.options.columnMapper)==null?void 0:R.encode);U(i,he,y)}}a(this,g).applyUrlParams(i,{isSnapshotRequest:s!==void 0,canLongPoll:!a(this,p,es)&&!e}),i.searchParams.set(Ft,a(this,K));let c=fe(i),h=qe.getExpiredHandle(c);return h&&i.searchParams.set(Oe,h),i.searchParams.sort(),{fetchUrl:i,requestHeaders:n}},Is=async function(t){var e;if(u(this,_,new AbortController),t){let s=()=>{var n;(n=a(this,_))==null||n.abort(t.reason)};return t.addEventListener("abort",s,{once:!0}),t.aborted&&((e=a(this,_))==null||e.abort(t.reason)),s}},ts=async function(t){var h,d,l;let{headers:e,status:s}=t,n=e.get(ce),o=a(this,$)?fe(a(this,$)):null,i=o?qe.getExpiredHandle(o):null,c=a(this,g).handleResponseMetadata({status:s,responseHandle:n,responseOffset:e.get(lt),responseCursor:e.get(ys),responseSchema:Ds(e),expiredHandle:i,now:Date.now(),maxStaleCacheRetries:a(this,Te),createCacheBuster:()=>`${Date.now()}-${Math.random().toString(36).substring(2,9)}`});if(u(this,g,c.state),c.action==="stale-retry")throw await((h=t.body)==null?void 0:h.cancel()),c.exceededMaxRetries?new v(502,void 0,void 0,{},(l=(d=a(this,$))==null?void 0:d.toString())!=null?l:"",`CDN continues serving stale cached responses after ${a(this,Te)} retry attempts. This indicates a severe proxy/CDN misconfiguration. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. For more information visit the troubleshooting guide: https://electric-sql.com/docs/guides/troubleshooting`):(console.warn(`[Electric] Received stale cached response with expired shape handle. This should not happen and indicates a proxy/CDN caching misconfiguration. The response contained handle "${n}" which was previously marked as expired. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. For more information visit the troubleshooting guide: https://electric-sql.com/docs/guides/troubleshooting Retrying with a random cache buster to bypass the stale cache (attempt ${a(this,g).staleCacheRetryCount}/${a(this,Te)}).`),new Me(`Received stale cached response with expired handle "${n}". This indicates a proxy/CDN caching misconfiguration. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key.`));return c.action==="ignored"?(console.warn(`[Electric] Received stale cached response with expired shape handle. This should not happen and indicates a proxy/CDN caching misconfiguration. The response contained handle "${n}" which was previously marked as expired. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. Ignoring the stale response and continuing with handle "${a(this,g).handle}".`),!1):!0},bt=async function(t,e=!1){if(t.length===0)return;let s=t[t.length-1],n=kt(s),o=n?Ss(s):void 0,i=a(this,g).handleMessageBatch({hasMessages:!0,hasUpToDateMessage:n,isSse:e,upToDateOffset:o,now:Date.now(),currentCursor:a(this,g).liveCacheBuster});if(u(this,g,i.state),n){if(i.suppressBatch)return;if(a(this,$)){let h=fe(a(this,$));Qt.recordUpToDate(h,a(this,g).liveCacheBuster)}}let c=t.filter(h=>ie(h)?!a(this,Ge).shouldRejectMessage(h):!0);await m(this,p,ss).call(this,c)},Hs=async function(t){var s;if(u(this,$,t.fetchUrl),!a(this,g).isUpToDate&&a(this,g).canEnterReplayMode()){let n=fe(t.fetchUrl),o=Qt.shouldEnterReplayMode(n);o&&u(this,g,a(this,g).enterReplayMode(o))}let e=(s=this.options.liveSse)!=null?s:this.options.experimentalLiveSse;return a(this,g).shouldUseSse({liveSseEnabled:!!e,isRefreshing:a(this,p,es),resumingFromPause:!!t.resumingFromPause})?(t.fetchUrl.searchParams.set(Ts,"true"),t.fetchUrl.searchParams.set(Dt,"true"),m(this,p,Ns).call(this,t)):m(this,p,Fs).call(this,t)},Fs=async function(t){let{fetchUrl:e,requestAbortController:s,headers:n}=t,o=await a(this,Se).call(this,e.toString(),{signal:s.signal,headers:n});if(u(this,N,!0),!await m(this,p,ts).call(this,o))return;let c=a(this,g).schema,d=await o.text()||"[]",l=a(this,ne).parse(d,c);await m(this,p,bt).call(this,l)},Ns=async function(t){let{fetchUrl:e,requestAbortController:s,headers:n}=t,o=a(this,ye);u(this,Je,Date.now());let i=A(E({},n),{Accept:"text/event-stream"}),c=!1;try{let h=[];await Vt(e.toString(),{headers:i,fetch:o,onopen:async d=>{if(u(this,N,!0),!await m(this,p,ts).call(this,d))throw c=!0,new Error("stale response ignored")},onmessage:d=>{if(d.data){let l=a(this,g).schema,S=a(this,ne).parse(d.data,l);h.push(S),kt(S)&&(m(this,p,bt).call(this,h,!0),h=[])}},onerror:d=>{throw d},signal:s.signal})}catch(h){if(c)return;throw s.signal.aborted?new H:h}finally{let h=Date.now()-a(this,Je),d=s.signal.aborted,l=a(this,g).handleSseConnectionClosed({connectionDuration:h,wasAborted:d,minConnectionDuration:a(this,wt),maxShortConnections:a(this,Tt)});if(u(this,g,l.state),l.fellBackToLongPolling)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 if(l.wasShortConnection){let S=Math.min(a(this,vt),a(this,At)*Math.pow(2,a(this,g).consecutiveShortSseConnections)),x=Math.floor(Math.random()*S);await new Promise(b=>setTimeout(b,x))}}},qs=async function(){if(a(this,C).isPaused)throw new Error("Cannot wait for next tick while PauseLock is held \u2014 this would deadlock because the request loop is paused");return a(this,q)?a(this,q):(u(this,q,new Promise((t,e)=>{u(this,Re,t),u(this,be,e)})),a(this,q).finally(()=>{u(this,q,void 0),u(this,Re,void 0),u(this,be,void 0)}),a(this,q))},ss=async function(t){return u(this,xe,a(this,xe).then(()=>Promise.all(Array.from(a(this,W).values()).map(async([e,s])=>{try{await e(t)}catch(n){queueMicrotask(()=>{throw n})}})))),a(this,xe)},rs=function(t){a(this,W).forEach(([e,s])=>{s==null||s(t)})},ns=function(){return typeof document=="object"&&typeof document.hidden=="boolean"&&typeof document.addEventListener=="function"},$s=function(){if(m(this,p,ns).call(this)){let t=()=>{document.hidden?a(this,C).acquire("visibility"):a(this,C).release("visibility")};document.addEventListener("visibilitychange",t),u(this,Xe,()=>{document.removeEventListener("visibilitychange",t)})}},js=function(){if(m(this,p,ns).call(this))return;let t=2e3,e=4e3,s=Date.now(),n=setInterval(()=>{let o=Date.now(),i=o-s;s=o,i>t+e&&!a(this,C).isPaused&&a(this,_)&&(ae(this,Q)._++,a(this,_).abort(Ht),queueMicrotask(()=>{ae(this,Q)._--}))},t);typeof n=="object"&&"unref"in n&&n.unref(),u(this,we,()=>{clearInterval(n)})},Ys=function(t){u(this,g,a(this,g).markMustRefetch(t)),u(this,N,!1),a(this,C).releaseAllMatching("snapshot")},Vs=function(t){var s,n,o,i;let e={};return t.whereExpr?(e.where=Ne(t.whereExpr,(s=this.options.columnMapper)==null?void 0:s.encode),e.where_expr=t.whereExpr):t.where&&typeof t.where=="string"&&(e.where=oe(t.where,(n=this.options.columnMapper)==null?void 0:n.encode)),t.params&&(e.params=t.params),t.limit!==void 0&&(e.limit=t.limit),t.offset!==void 0&&(e.offset=t.offset),t.orderByExpr?(e.order_by=dt(t.orderByExpr,(o=this.options.columnMapper)==null?void 0:o.encode),e.order_by_expr=t.orderByExpr):t.orderBy&&typeof t.orderBy=="string"&&(e.order_by=oe(t.orderBy,(i=this.options.columnMapper)==null?void 0:i.encode)),e},Zt.Replica={FULL:"full",DEFAULT:"default"};function Ds(r,t){let e=r.get(Lt);if(!e){if(t!=null&&t.required&&(t!=null&&t.url))throw new X(t.url,[Lt]);return{}}return JSON.parse(e)}function Ws(r){if(!r)return;let t=Object.keys(r).filter(e=>br.has(e));if(t.length>0)throw new nt(t)}function Tr(r){if(!r.url)throw new tt;if(r.signal&&!(r.signal instanceof AbortSignal))throw new st;if(r.offset!==void 0&&r.offset!=="-1"&&r.offset!=="now"&&!r.handle)throw new rt;Ws(r.params)}function U(r,t,e){if(!(e===void 0||e==null))if(typeof e=="string")r.searchParams.set(t,e);else if(typeof e=="object")for(let[s,n]of Object.entries(e))r.searchParams.set(`${t}[${s}]`,n);else r.searchParams.set(t,e.toString())}function Ar(r){return Array.isArray(r.params)?A(E({},r),{params:Object.fromEntries(r.params.map((t,e)=>[e+1,t]))}):r}var k,z,G,Ze,Ae,ve,J,T,Qs,zs,os,Pt,Gs,is,Ks=class{constructor(t){f(this,T);f(this,k,new Map);f(this,z,new Map);f(this,G,new Set);f(this,Ze,new Set);f(this,Ae,!1);f(this,ve,"syncing");f(this,J,!1);this.stream=t,this.stream.subscribe(m(this,T,Qs).bind(this),m(this,T,Gs).bind(this))}get isUpToDate(){return a(this,ve)==="up-to-date"}get lastOffset(){return this.stream.lastOffset}get handle(){return this.stream.shapeHandle}get rows(){return this.value.then(t=>Array.from(t.values()))}get currentRows(){return Array.from(this.currentValue.values())}get value(){return new Promise((t,e)=>{if(this.stream.isUpToDate)t(this.currentValue);else{let s=this.subscribe(({value:n})=>{s(),a(this,J)&&e(a(this,J)),t(n)})}})}get currentValue(){return a(this,k)}get error(){return a(this,J)}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}async requestSnapshot(t){let e=JSON.stringify(t);a(this,Ze).add(e),await m(this,T,os).call(this),await this.stream.requestSnapshot(t)}subscribe(t){let e={};return a(this,z).set(e,t),()=>{a(this,z).delete(e)}}unsubscribeAll(){a(this,z).clear()}get numSubscribers(){return a(this,z).size}};k=new WeakMap,z=new WeakMap,G=new WeakMap,Ze=new WeakMap,Ae=new WeakMap,ve=new WeakMap,J=new WeakMap,T=new WeakSet,Qs=function(t){let e=!1;t.forEach(s=>{if(ie(s))if(e=m(this,T,Pt).call(this,"syncing"),this.mode==="full")switch(s.headers.operation){case"insert":a(this,k).set(s.key,s.value);break;case"update":a(this,k).set(s.key,E(E({},a(this,k).get(s.key)),s.value));break;case"delete":a(this,k).delete(s.key);break}else switch(s.headers.operation){case"insert":a(this,G).add(s.key),a(this,k).set(s.key,s.value);break;case"update":a(this,G).has(s.key)&&a(this,k).set(s.key,E(E({},a(this,k).get(s.key)),s.value));break;case"delete":a(this,G).has(s.key)&&(a(this,k).delete(s.key),a(this,G).delete(s.key));break}if(ct(s))switch(s.headers.control){case"up-to-date":e=m(this,T,Pt).call(this,"up-to-date"),a(this,Ae)&&(u(this,Ae,!1),m(this,T,zs).call(this));break;case"must-refetch":a(this,k).clear(),a(this,G).clear(),u(this,J,!1),e=m(this,T,Pt).call(this,"syncing"),u(this,Ae,!0);break}}),e&&m(this,T,is).call(this)},zs=async function(){await m(this,T,os).call(this),await Promise.all(Array.from(a(this,Ze)).map(async t=>{try{let e=JSON.parse(t);await this.stream.requestSnapshot(e)}catch(e){}}))},os=async function(){this.stream.isUpToDate||await new Promise(t=>{let e=()=>{this.stream.isUpToDate&&(clearInterval(s),n(),t())},s=setInterval(e,10),n=this.stream.subscribe(()=>e(),()=>e());e()})},Pt=function(t){let e=a(this,ve)!==t;return u(this,ve,t),e&&t==="up-to-date"},Gs=function(t){t instanceof v&&(u(this,J,t),m(this,T,is).call(this))},is=function(){a(this,z).forEach(t=>{t({value:this.currentValue,rows:this.currentRows})})};export{ut as BackoffDefaults,$t as ELECTRIC_PROTOCOL_QUERY_PARAMS,v as FetchError,Ks as Shape,Zt as ShapeStream,ms as camelToSnake,Ne as compileExpression,dt as compileOrderBy,gs as createColumnMapper,ie as isChangeMessage,ct as isControlMessage,Ot as isVisibleInSnapshot,as as resolveValue,or as snakeCamelMapper,Ut as snakeToCamel};
6
7
  //# sourceMappingURL=index.browser.mjs.map