2 lines
8.0 KiB
JavaScript
2 lines
8.0 KiB
JavaScript
import{d as g}from"./chunk-YL6J3L2T.js";import{a as D,b as T,c as S,d as W,e as B}from"./chunk-CC3P7GPW.js";import{g as f}from"./chunk-X3G665AK.js";import{a as x,c as R,d as A}from"./chunk-TF5C7XJX.js";import{j as v}from"./chunk-DWY47FQV.js";import{createServer as $}from"http";import{promisify as H}from"util";import F from"@prisma/get-platform";async function k(t,e){let{port:r}=e;if(e.dryRun)return O(r,null);let n=await j(t,e),{promise:a,reject:l,resolve:i}=R(),{serve:o}=await import("@hono/node-server"),s=o({createServer:$,fetch:n.fetch,overrideGlobalObjects:!1,port:r},i);s.on("error",m=>{if(typeof m=="object"&&"code"in m&&m.code==="EADDRINUSE")return l(new f(r));console.error("[Accelerate]",m)});let{port:c}=await a;return e.port=c,O(c,s)}function O(t,e){return{async close(){e&&await Promise.allSettled([H(e.close.bind(e))(),A.stopAll()])},port:t,url:`http://localhost:${t}`}}async function j(t,e){let{debug:r}=e,[{Hono:n},{accelerateRoute:a},{utilityRoute:l}]=await Promise.all([import("hono/tiny"),import("./accelerate-HWGEFOM5.js"),import("./utility-Q5A254LJ.js")]),i=new n,o=await F.getPlatformInfo();if(r&&console.debug("[Accelerate] platform info: %s",JSON.stringify(o)),r){let{logger:c}=await import("hono/logger");i.use("*",c((...m)=>console.log("[Accelerate]",...m)))}i.use("*",async(c,m)=>(c.set("databaseDumpPath",e.databaseDumpPath),c.set("db",t),c.set("debug",!!r),c.set("name",e.name),c.set("platform",o),c.set("shadowDBPort",e.shadowDatabasePort),await m()));let s=new n;return s.route("/",a),s.route("/",l),i.route("/",s),i}import{randomUUID as L}from"crypto";import{setTimeout as C}from"timers/promises";import{process as K}from"std-env";var V="application/json",E={connection:"close","content-type":V},q={interpreter:{apiVersion:"durable.streams/stream-interpreter/v1",format:"durable.streams/state-protocol/v1",touch:{enabled:!0,onMissingBefore:"coarse"}}};async function N(t){let{dbServer:e,debug:r,name:n,persistenceMode:a,port:l,walBridge:i}=t,o=a==="stateless",s=o?X(n):n;K.env.DS_LOCAL_DATA_ROOT=T(),o&&await v(S(s));let{startLocalDurableStreamsServer:c}=await import("@prisma/streams-local"),m=await c({hostname:"127.0.0.1",name:s,port:l}),p={serverUrl:m.exports.http.url,sqlitePath:m.exports.sqlite.path,streamName:D,url:W(m.exports.http.url)};try{await J(p);let u=new P({dbServer:e,debug:r,streamUrl:p.url}),d=i.subscribe(U=>{u.enqueue(U)});return{close:async()=>{d(),await u.close(),await m.close(),await C(100),o&&await v(S(s))},experimental:p}}catch(u){throw await m.close().catch(()=>{}),await C(100),o&&await v(S(s)).catch(()=>{}),u}}var P=class{#n;#a;#e;#r;#t;constructor(e){this.#n=e.dbServer,this.#a=e.debug,this.#e=Promise.resolve(),this.#r=e.streamUrl,this.#t=new Set}enqueue(e){e.length!==0&&(this.#e=this.#e.then(async()=>{let r=await this.#s(e);r.length!==0&&(await z(this.#r,r),this.#a&&console.debug(`[streams] appended ${r.length} state-protocol record(s) to ${this.#r}`))}).catch(r=>{console.error("[streams] failed to ingest WAL events into prisma-wal",r)}))}async close(){await this.#e}async#s(e){let r=[],n=new Date().toISOString();for(let a of e)r.push(...await this.#i(a,n));return r}async#i(e,r){let n=`${e.schema}.${e.table}`,a=await this.#n.getPrimaryKeyColumns(e.schema,e.table),l=_(e.record),i=_(e.oldRecord),o=this.#o(n,a,i),s=this.#o(n,a,l),c=e.txid===""?void 0:e.txid;return e.type==="insert"?l&&s?[{headers:{operation:"insert",timestamp:r,txid:c},key:s,oldValue:null,type:n,value:l}]:[]:e.type==="delete"?i&&o?[{headers:{operation:"delete",timestamp:r,txid:c},key:o,oldValue:i,type:n,value:null}]:[]:!l||!i||!o||!s?[]:o!==s?[{headers:{operation:"delete",timestamp:r,txid:c},key:o,oldValue:i,type:n,value:null},{headers:{operation:"insert",timestamp:r,txid:c},key:s,oldValue:null,type:n,value:l}]:[{headers:{operation:"update",timestamp:r,txid:c},key:s,oldValue:i,type:n,value:l}]}#o(e,r,n){if(!n)return null;let a=G(n,r);return a||(this.#t.has(e)||(this.#t.add(e),console.warn(`[streams] falling back to full-row keys for ${e} because no primary key could be resolved`)),Q(n))}};async function J(t){let e=await fetch(t.url,{headers:E,method:"PUT"});if(!e.ok)throw await w(e,`Failed to create ${t.streamName}`);let r=await fetch(`${t.url}/_schema`,{body:JSON.stringify(q),headers:E,method:"POST"});if(!r.ok)throw await w(r,`Failed to configure ${t.streamName}`)}async function z(t,e){let r=await fetch(t,{body:JSON.stringify(e),headers:E,method:"POST"});if(!r.ok)throw await w(r,"Failed to append to prisma-wal")}async function w(t,e){let r=await t.text().catch(()=>"");return new Error(`${e}: HTTP ${t.status}${r?` ${r}`:""}`)}function G(t,e){if(e.length===0)return null;let r=[];for(let n of e){if(!Object.prototype.hasOwnProperty.call(t,n))return null;let a=Y(t[n]);if(a==null)return null;r.push(e.length===1?a:`${n}=${a}`)}return r.join("|")}function Q(t){return JSON.stringify(b(t))}function b(t){return Array.isArray(t)?t.map(e=>b(e)):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).sort(([e],[r])=>e.localeCompare(r)).map(([e,r])=>[e,b(r)])):t}function _(t){return t?structuredClone(t):null}function Y(t){if(t===null)return"null";if(t===void 0)return"undefined";if(typeof t=="string")return t;if(typeof t=="number")return Number.isFinite(t)?String(t):null;if(typeof t=="bigint")return t.toString();if(typeof t=="boolean")return t?"true":"false";try{return JSON.stringify(t)}catch{return null}}function X(t){return`${t}.${L().replaceAll("-","")}`}async function I(t){let e=await B.createExclusively(t),r=null,n=null,a=null,l=null;try{[r,a]=await Promise.all([g("database",e),g("shadow_database",e)]);let i;e.dryRun?(i=te(),l=ne()):(i=await r.attachWalEventBridge(),l=await N({dbServer:r,debug:e.debug,name:e.name,port:e.streamsPort,persistenceMode:e.persistenceMode,walBridge:i})),n=await k(r,e);let o=Z(r,a,n,e);await e.writeServerDump(o,e.dryRun?{}:{streams:l.experimental});let s=re(i),c=r,m=a,p=n,u=l,d=async()=>{s.close(),await M(e,[p,u,c,m])};return{close:d,dbServer:r,httpServer:n,server:{...o,close:d,experimental:{streams:l.experimental,wal:s.api},name:e.name},serverState:e,shadowDbServer:a,streamsServer:l,walBridge:i}}catch(i){return await ee(e,[n,l,r,a],i)}}function Z(t,e,r,n){let a=`prisma+postgres://localhost:${r.port}/?${new URLSearchParams({api_key:x({databaseUrl:t.prismaORMConnectionString,name:n.name,shadowDatabaseUrl:e.prismaORMConnectionString})}).toString()}`;return{database:{connectionString:t.connectionString,prismaORMConnectionString:t.prismaORMConnectionString,terminalCommand:t.terminalCommand},http:{url:r.url},ppg:{url:a},shadowDatabase:{connectionString:e.prismaORMConnectionString,prismaORMConnectionString:e.prismaORMConnectionString,terminalCommand:e.terminalCommand}}}async function M(t,e){let n=(await Promise.allSettled(e.map(a=>a.close()))).filter(a=>a.status==="rejected").map(a=>new Error(a.reason));try{await t.close()}catch(a){n.push(a)}if(n.length>0)throw new AggregateError(n,"Failed to close some servers")}async function ee(t,e,r){try{await M(t,e.filter(n=>n!==null))}catch(n){throw new AggregateError([r,n],"Failed to start Prisma Dev server cleanly")}throw r}function re(t){let e=new Set;return{api:{stream:()=>{let r=()=>{},n=ae(t,()=>{e.delete(r)});return r=()=>n.close(),e.add(r),n.stream},subscribe:r=>t.subscribe(r)},close:()=>{for(let r of[...e])r();e.clear()}}}function te(){return{async close(){},async poll(){},subscribe(){return()=>{}}}}function ne(){return{async close(){},experimental:{serverUrl:"",sqlitePath:"",streamName:"",url:""}}}function ae(t,e){let r=[],n=!1,a=null,l=t.subscribe(o=>{if(!n){if(a){let s=a;a=null,s.resolve({done:!1,value:o});return}r.push(o)}}),i=()=>{if(!n&&(n=!0,l(),r.length=0,e(),a)){let o=a;a=null,o.resolve({done:!0,value:void 0})}};return{close:i,stream:{[Symbol.asyncIterator](){return this},next(){return r.length>0?Promise.resolve({done:!1,value:r.shift()}):n?Promise.resolve({done:!0,value:void 0}):new Promise((o,s)=>{a={reject:s,resolve:o}})},return(){return i(),Promise.resolve({done:!0,value:void 0})},throw(o){let s=a;return i(),s&&s.reject(o),Promise.reject(o instanceof Error?o:new Error(String(o)))}}}}async function oe(t){let{server:e}=await I(t);return e}async function Ie(t){return await oe(t)}export{oe as a,Ie as b};
|