@electric-sql/pglite
Version:
PGlite is a WASM Postgres build packaged into a TypeScript client library that enables you to run Postgres in the browser, Node.js and Bun, with no need to install any other dependencies. It is only 3.7mb gzipped.
2 lines • 8.34 kB
JavaScript
import{a as j}from"../chunk-HWTMPVRX.js";import{u as N,x as z}from"../chunk-M6G2OE44.js";import"../chunk-STOZMFXW.js";import{e as t,f as p,g as u,h as y,j as Q}from"../chunk-BTBUZ646.js";Q();var W,M,C,T,_,w,L,x,k,B,O,A,E,v,D,P,b,G,$,c,K,I,m,J,F=class F extends j{constructor(e,r){super();p(this,c);p(this,W);p(this,M,0);p(this,C,!1);p(this,T,!1);p(this,_,!1);p(this,w,new EventTarget);p(this,L);p(this,x,!1);p(this,k);p(this,B);p(this,O);p(this,A);p(this,E);p(this,v);p(this,D);p(this,P,new Map);p(this,b,new Set);p(this,G);p(this,$,[]);u(this,k,e),u(this,L,N()),u(this,G,r?.extensions??{}),u(this,O,new Promise(a=>{t(this,k).addEventListener("message",s=>{if(s.data.type==="here")a();else throw new Error("Invalid message")},{once:!0})})),u(this,A,new Promise(a=>{let s=l=>{l.data.type==="ready"&&(u(this,B,l.data.id),t(this,k).removeEventListener("message",s),a())};t(this,k).addEventListener("message",s)})),u(this,W,y(this,c,K).call(this,r))}static async create(e,r){let a=new F(e,r);return await t(a,W),a}get waitReady(){return new Promise(e=>{t(this,W).then(()=>{t(this,x)?e():e(new Promise(r=>{t(this,w).addEventListener("connected",()=>{r()})}))})})}get debug(){return t(this,M)}get ready(){return t(this,C)}get closed(){return t(this,T)}get isLeader(){return t(this,_)}async close(){var e;t(this,T)||(u(this,T,!0),t(this,E)?.close(),t(this,v)?.close(),(e=t(this,D))==null||e.call(this),t(this,k).terminate())}async[Symbol.asyncDispose](){await this.close()}async execProtocolRaw(e){return await y(this,c,m).call(this,"execProtocolRaw",e)}async execProtocol(e){return await y(this,c,m).call(this,"execProtocol",e)}async syncToFs(){await y(this,c,m).call(this,"syncToFs")}async listen(e,r,a){let s=z(e),l=a??this;return t(this,P).has(s)||t(this,P).set(s,new Set),t(this,P).get(s).add(r),await l.exec(`LISTEN ${e}`),async n=>{await this.unlisten(s,r,n)}}async unlisten(e,r,a){await this.waitReady;let s=a??this;r?t(this,P).get(e)?.delete(r):t(this,P).delete(e),t(this,P).get(e)?.size===0&&await s.exec(`UNLISTEN ${e}`)}onNotification(e){return t(this,b).add(e),()=>{t(this,b).delete(e)}}offNotification(e){t(this,b).delete(e)}async dumpDataDir(e){return await y(this,c,m).call(this,"dumpDataDir",e)}onLeaderChange(e){return t(this,w).addEventListener("leader-change",e),()=>{t(this,w).removeEventListener("leader-change",e)}}offLeaderChange(e){t(this,w).removeEventListener("leader-change",e)}async _handleBlob(e){await y(this,c,m).call(this,"_handleBlob",e)}async _getWrittenBlob(){return await y(this,c,m).call(this,"_getWrittenBlob")}async _cleanupBlob(){await y(this,c,m).call(this,"_cleanupBlob")}async _checkReady(){await this.waitReady}async _runExclusiveQuery(e){await y(this,c,m).call(this,"_acquireQueryLock");try{return await e()}finally{await y(this,c,m).call(this,"_releaseQueryLock")}}async _runExclusiveTransaction(e){await y(this,c,m).call(this,"_acquireTransactionLock");try{return await e()}finally{await y(this,c,m).call(this,"_releaseTransactionLock")}}};W=new WeakMap,M=new WeakMap,C=new WeakMap,T=new WeakMap,_=new WeakMap,w=new WeakMap,L=new WeakMap,x=new WeakMap,k=new WeakMap,B=new WeakMap,O=new WeakMap,A=new WeakMap,E=new WeakMap,v=new WeakMap,D=new WeakMap,P=new WeakMap,b=new WeakMap,G=new WeakMap,$=new WeakMap,c=new WeakSet,K=async function(e={}){for(let[o,h]of Object.entries(t(this,G))){if(h instanceof URL)throw new Error("URL extensions are not supported on the client side of a worker");{let d=await h.setup(this,{},!0);if(d.emscriptenOpts&&console.warn(`PGlite extension ${o} returned emscriptenOpts, these are not supported on the client side of a worker`),d.namespaceObj){let R=this;R[o]=d.namespaceObj}d.bundlePath&&console.warn(`PGlite extension ${o} returned bundlePath, this is not supported on the client side of a worker`),d.init&&await d.init(),d.close&&t(this,$).push(d.close)}}await t(this,O);let{extensions:r,...a}=e;t(this,k).postMessage({type:"init",options:a}),await t(this,A);let s=`pglite-tab-close:${t(this,L)}`;u(this,D,await q(s));let l=`pglite-broadcast:${t(this,B)}`;u(this,E,new BroadcastChannel(l));let n=`pglite-tab:${t(this,L)}`;u(this,v,new BroadcastChannel(n)),t(this,E).addEventListener("message",async o=>{o.data.type==="leader-here"?(u(this,x,!1),t(this,w).dispatchEvent(new Event("leader-change")),y(this,c,I).call(this)):o.data.type==="notify"&&y(this,c,J).call(this,o.data.channel,o.data.payload)}),t(this,v).addEventListener("message",async o=>{o.data.type==="connected"&&(u(this,x,!0),t(this,w).dispatchEvent(new Event("connected")),u(this,M,await y(this,c,m).call(this,"getDebugLevel")),u(this,C,!0))}),t(this,k).addEventListener("message",async o=>{o.data.type==="leader-now"&&(u(this,_,!0),t(this,w).dispatchEvent(new Event("leader-change")))}),y(this,c,I).call(this),this._initArrayTypes()},I=async function(){t(this,x)||(t(this,E).postMessage({type:"tab-here",id:t(this,L)}),setTimeout(()=>y(this,c,I).call(this),16))},m=async function(e,...r){let a=N(),s={type:"rpc-call",callId:a,method:e,args:r};return t(this,v).postMessage(s),await new Promise((l,n)=>{let o=R=>{if(R.data.callId!==a)return;d();let f=R.data;if(f.type==="rpc-return")l(f.result);else if(f.type==="rpc-error"){let S=new Error(f.error.message);Object.assign(S,f.error),n(S)}else n(new Error("Invalid message"))},h=()=>{d(),n(new U)},d=()=>{t(this,v).removeEventListener("message",o),t(this,w).removeEventListener("leader-change",h)};t(this,w).addEventListener("leader-change",h),t(this,v).addEventListener("message",o)})},J=function(e,r){let a=t(this,P).get(e);if(a)for(let s of a)queueMicrotask(()=>s(r));for(let s of t(this,b))queueMicrotask(()=>s(e,r))};var H=F;async function se({init:g}){postMessage({type:"here"});let i=await new Promise(h=>{addEventListener("message",d=>{d.data.type==="init"&&h(d.data.options)},{once:!0})}),e=i.id??`${import.meta.url}:${i.dataDir??""}`;postMessage({type:"ready",id:e});let r=`pglite-election-lock:${e}`,a=`pglite-broadcast:${e}`,s=new BroadcastChannel(a),l=new Set;await q(r);let n=g(i);s.onmessage=async h=>{let d=h.data;switch(d.type){case"tab-here":V(d.id,await n,l);break}},s.postMessage({type:"leader-here",id:e}),postMessage({type:"leader-now"}),(await n).onNotification((h,d)=>{s.postMessage({type:"notify",channel:h,payload:d})})}function V(g,i,e){if(e.has(g))return;e.add(g);let r=`pglite-tab:${g}`,a=`pglite-tab-close:${g}`,s=new BroadcastChannel(r);navigator.locks.request(a,()=>new Promise(n=>{s.close(),e.delete(g),n()}));let l=X(g,i);s.addEventListener("message",async n=>{let o=n.data;switch(o.type){case"rpc-call":{await i.waitReady;let{callId:h,method:d,args:R}=o;try{let f=await l[d](...R);s.postMessage({type:"rpc-return",callId:h,result:f})}catch(f){console.error(f),s.postMessage({type:"rpc-error",callId:h,error:{message:f.message}})}break}}}),s.postMessage({type:"connected"})}function X(g,i){let e=null,r=null,a=`pglite-tab-close:${g}`;return q(a).then(()=>{r&&i.exec("ROLLBACK"),e?.(),r?.()}),{async getDebugLevel(){return i.debug},async close(){await i.close()},async execProtocol(s){let{messages:l,data:n}=await i.execProtocol(s);if(n.byteLength!==n.buffer.byteLength){let o=new ArrayBuffer(n.byteLength),h=new Uint8Array(o);return h.set(n),{messages:l,data:h}}else return{messages:l,data:n}},async execProtocolRaw(s,l={}){let n=await i.execProtocolRaw(s,l);if(n.byteLength!==n.buffer.byteLength){let o=new ArrayBuffer(n.byteLength),h=new Uint8Array(o);return h.set(n),h}else return n},async dumpDataDir(s){return await i.dumpDataDir(s)},async syncToFs(){return await i.syncToFs()},async _handleBlob(s){return await i._handleBlob(s)},async _getWrittenBlob(){return await i._getWrittenBlob()},async _cleanupBlob(){return await i._cleanupBlob()},async _checkReady(){return await i._checkReady()},async _acquireQueryLock(){return new Promise(s=>{i._runExclusiveQuery(()=>new Promise(l=>{e=l,s()}))})},async _releaseQueryLock(){e?.(),e=null},async _acquireTransactionLock(){return new Promise(s=>{i._runExclusiveTransaction(()=>new Promise(l=>{r=l,s()}))})},async _releaseTransactionLock(){r?.(),r=null}}}var U=class extends Error{constructor(){super("Leader changed, pending operation in indeterminate state")}};async function q(g){let i;return await new Promise(e=>{navigator.locks.request(g,()=>new Promise(r=>{i=r,e()}))}),i}export{U as LeaderChangedError,H as PGliteWorker,se as worker};
//# sourceMappingURL=index.js.map