UNPKG

@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
import{a as j}from"../chunk-6JG4A6NZ.js";import{u as N,x as z}from"../chunk-4LH4BY34.js";import"../chunk-STOZMFXW.js";import{e as t,f as h,g as u,h as y,j as Q}from"../chunk-BTBUZ646.js";Q();var W,T,C,M,_,m,L,x,k,B,A,O,E,v,G,P,b,I,$,c,K,D,w,J,F=class F extends j{constructor(e,r){super();h(this,c);h(this,W);h(this,T,0);h(this,C,!1);h(this,M,!1);h(this,_,!1);h(this,m,new EventTarget);h(this,L);h(this,x,!1);h(this,k);h(this,B);h(this,A);h(this,O);h(this,E);h(this,v);h(this,G);h(this,P,new Map);h(this,b,new Set);h(this,I);h(this,$,[]);u(this,k,e),u(this,L,N()),u(this,I,r?.extensions??{}),u(this,A,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,O,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,m).addEventListener("connected",()=>{r()})}))})})}get debug(){return t(this,T)}get ready(){return t(this,C)}get closed(){return t(this,M)}get isLeader(){return t(this,_)}async close(){var e;t(this,M)||(u(this,M,!0),t(this,E)?.close(),t(this,v)?.close(),(e=t(this,G))==null||e.call(this),t(this,k).terminate())}async[Symbol.asyncDispose](){await this.close()}async execProtocolRaw(e){return await y(this,c,w).call(this,"execProtocolRaw",e)}async execProtocol(e){return await y(this,c,w).call(this,"execProtocol",e)}async syncToFs(){await y(this,c,w).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(){return await y(this,c,w).call(this,"dumpDataDir")}onLeaderChange(e){return t(this,m).addEventListener("leader-change",e),()=>{t(this,m).removeEventListener("leader-change",e)}}offLeaderChange(e){t(this,m).removeEventListener("leader-change",e)}async _handleBlob(e){await y(this,c,w).call(this,"_handleBlob",e)}async _getWrittenBlob(){return await y(this,c,w).call(this,"_getWrittenBlob")}async _cleanupBlob(){await y(this,c,w).call(this,"_cleanupBlob")}async _checkReady(){await this.waitReady}async _runExclusiveQuery(e){await y(this,c,w).call(this,"_acquireQueryLock");try{return await e()}finally{await y(this,c,w).call(this,"_releaseQueryLock")}}async _runExclusiveTransaction(e){await y(this,c,w).call(this,"_acquireTransactionLock");try{return await e()}finally{await y(this,c,w).call(this,"_releaseTransactionLock")}}};W=new WeakMap,T=new WeakMap,C=new WeakMap,M=new WeakMap,_=new WeakMap,m=new WeakMap,L=new WeakMap,x=new WeakMap,k=new WeakMap,B=new WeakMap,A=new WeakMap,O=new WeakMap,E=new WeakMap,v=new WeakMap,G=new WeakMap,P=new WeakMap,b=new WeakMap,I=new WeakMap,$=new WeakMap,c=new WeakSet,K=async function(e={}){for(let[o,p]of Object.entries(t(this,I))){if(p instanceof URL)throw new Error("URL extensions are not supported on the client side of a worker");{let d=await p.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,A);let{extensions:r,...a}=e;t(this,k).postMessage({type:"init",options:a}),await t(this,O);let s=`pglite-tab-close:${t(this,L)}`;u(this,G,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,m).dispatchEvent(new Event("leader-change")),y(this,c,D).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,m).dispatchEvent(new Event("connected")),u(this,T,await y(this,c,w).call(this,"getDebugLevel")),u(this,C,!0))}),t(this,k).addEventListener("message",async o=>{o.data.type==="leader-now"&&(u(this,_,!0),t(this,m).dispatchEvent(new Event("leader-change")))}),y(this,c,D).call(this),this._initArrayTypes()},D=async function(){t(this,x)||(t(this,E).postMessage({type:"tab-here",id:t(this,L)}),setTimeout(()=>y(this,c,D).call(this),16))},w=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"))},p=()=>{d(),n(new U)},d=()=>{t(this,v).removeEventListener("message",o),t(this,m).removeEventListener("leader-change",p)};t(this,m).addEventListener("leader-change",p),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(p=>{addEventListener("message",d=>{d.data.type==="init"&&p(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 p=>{let d=p.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((p,d)=>{s.postMessage({type:"notify",channel:p,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:p,method:d,args:R}=o;try{let f=await l[d](...R);s.postMessage({type:"rpc-return",callId:p,result:f})}catch(f){console.error(f),s.postMessage({type:"rpc-error",callId:p,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),p=new Uint8Array(o);return p.set(n),{messages:l,data:p}}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),p=new Uint8Array(o);return p.set(n),p}else return n},async dumpDataDir(){return await i.dumpDataDir()},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