@prisma/dev 0.0.0-dev.202505282352 → 0.0.0-dev.202505290933
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/daemon/client.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as url from 'url';
|
|
2
2
|
import { SockDaemonClient } from 'sock-daemon/client';
|
|
3
|
-
import { S as ServerOptions, a as Server } from '../index-
|
|
3
|
+
import { S as ServerOptions, a as Server } from '../index-BtR4iL6u.js';
|
|
4
4
|
import { MessageBase } from 'sock-daemon/server';
|
|
5
5
|
|
|
6
6
|
type Kind = "START_SERVER" | "STOP_SERVER";
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { D as DEFAULT_DATABASE_PORT, b as DEFAULT_SERVER_PORT, c as DEFAULT_SHADOW_DATABASE_PORT, P as PortAssignableService, d as PortNotAvailableError, a as Server, u as unstable_startServer } from './index-
|
|
1
|
+
export { D as DEFAULT_DATABASE_PORT, b as DEFAULT_SERVER_PORT, c as DEFAULT_SHADOW_DATABASE_PORT, P as PortAssignableService, d as PortNotAvailableError, a as Server, u as unstable_startServer } from './index-BtR4iL6u.js';
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{HTTPException as E}from"hono/http-exception";import{object as ye,optional as
|
|
3
|
-
`).find(fe=>fe.includes("Started query engine http server"));if(!m)return;s.stdout.removeListener("data",i);let{fields:p}=JSON.parse(m);if(p==null)return r(new Error(`Unexpected data during initialization, "fields" are missing: ${
|
|
4
|
-
Received data: ${
|
|
2
|
+
import{HTTPException as E}from"hono/http-exception";import{object as ye,optional as be,parseJson as we,pipe as I,regex as U,safeParse as Se,string as _,url as F}from"valibot";var V=/^(postgres|postgresql):\/\//,Pe=I(_(),we(),ye({databaseUrl:I(_(),F(),U(V)),shadowDatabaseUrl:be(I(_(),F(),U(V)))}));function q(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function ve(t){let e=Buffer.from(t,"base64url").toString("utf8"),{issues:r,output:n,success:o}=Se(Pe,e,{abortEarly:!0});return o?[null,n]:[r]}var g=(t,e)=>{let{authorization:r}=t;if(!r)throw new E(401,{message:"Missing API Key"});let[n,o="",s]=r.split(" ");if(n!=="Bearer"||s)throw new E(401,{message:"Invalid API Key"});let[i,a]=ve(o);if(i)throw new E(401,{message:"Invalid API Key",cause:i.join(", ")});let{databaseUrl:c}=a;if(c!==e.var.db.connectionString)throw new E(401,{message:"Wrong API Key; Check your Prisma schema's `provider.url` value (probably defined in `.env`'s `DATABASE_URL` environment variable) is aligned with `prisma dev`'s output"});return{decodedAPIKey:a}};import{PGlite as $e}from"@electric-sql/pglite";import{PGLiteSocketServer as He}from"@electric-sql/pglite-socket";import{pgDump as ke}from"@electric-sql/pglite-tools/pg_dump";import{filename as Ce}from"pathe/utils";import{createWriteStream as Ee,WriteStream as Te}from"fs";import{access as Ae,chmod as Re,constants as De,writeFile as Oe}from"fs/promises";import xe from"env-paths";import{inflate as Ie}from"pako";var K=xe("prisma-dev");function Q(t,e){return`${K.cache}/engine/${t}/${e}`}function G(t){return`${K.data}/${t}`}async function J(t){try{return await Ae(t,De.F_OK),!0}catch(e){if(_e(e))return!1;throw e}}async function z(t,e){let r=Ie(t);await Oe(e,r),await Re(e,"755")}async function W(t,e){await t.stream().pipeTo(Te.toWeb(Ee(e,{encoding:"utf-8"})))}function _e(t){return t!=null&&typeof t=="object"&&"code"in t&&t.code==="ENOENT"}var Y=51214,X=51213,Z=51215,h=class extends Error{constructor(r,n){super(`Port number \`${r}\` is not available for service ${n}.`);this.port=r;this.service=n}name="PortNotAvailableError"};var d={connectionLimit:1,connectTimeout:0,database:"template1",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},Be=`postgres://${d.username}:${d.password}@localhost`,Le=new URLSearchParams({connection_limit:String(d.connectionLimit),connect_timeout:String(d.connectTimeout),max_idle_connection_lifetime:String(d.maxIdleConnectionLifetime),pool_timeout:String(d.poolTimeout),socket_timeout:String(d.socketTimeout),sslmode:d.sslMode});async function $(t,e){let r=t==="database"?e.databasePort:e.shadowDatabasePort;if(e.dryRun)return ee(t,e,{db:null,port:r,server:null});let{debug:n}=e,o=await $e.create({database:d.database,dataDir:t==="database"?e.pgliteDataDirPath:"memory://",debug:n?5:void 0,defaultDataTransferContainer:"file",relaxedDurability:!1,username:d.username});n&&o.onNotification((i,a)=>{console.debug(`[${t}][${i}] ${a}`)});let s=new He({db:o,debug:n,inspect:n,port:r});n&&(s.addEventListener("listening",i=>{let{detail:a}=i;console.debug(`[${t}] server listening on ${JSON.stringify(a)}`)}),s.addEventListener("connection",i=>{let{clientAddress:a,clientPort:c}=i.detail;console.debug(`[${t}] client connected from ${a}:${c}`)}),s.addEventListener("error",i=>{let{detail:a}=i;console.error(`[${t}] server error:`,a)}));try{await s.start()}catch(i){throw i instanceof Error&&"code"in i&&i.code==="EADDRINUSE"?new h(r,t):i}return ee(t,e,{db:o,port:r,server:s})}function ee(t,e,r){let{debug:n}=e,{db:o,port:s,server:i}=r||{};return n&&console.debug(`[${t}] server started on port ${s}`),{...d,close:async()=>{let a=[];try{await i?.stop(),n&&console.debug(`[${t}] server stopped on port ${s}`)}catch(c){console.error(`[${t}] server stop error`,c),a.push(c)}if(t==="database")try{await o?.syncToFs(),n&&console.debug(`[${t}] synced to filesystem`)}catch(c){console.error(`[${t}] sync error`,c),a.push(c)}try{await o?.close(),n&&console.debug(`[${t}] closed`)}catch(c){console.error(`[${t}] close error`,c),a.push(c)}if(a.length>0)throw new AggregateError(a,`Failed to close ${t} properly`)},connectionString:Me(s),dump:async()=>{if(!o||t==="shadow_database")return{dumpPath:""};let{databaseDumpPath:a}=e,c=await ke({args:["--format=custom","--quote-all-identifiers","--schema-only","--verbose"],fileName:Ce(a),pg:o});return await W(c,a),{dumpPath:a}},port:s}}function Me(t){return`${Be}:${t}/${d.database}?${Le.toString()}`}import{createServer as ht}from"http";import{promisify as ft}from"util";import{serve as yt}from"@hono/node-server";import bt from"@prisma/get-platform";function T(){let t,e,r=new Promise((s,i)=>{t=s,e=i}),n=s=>{n=o=null,e(s)},o=s=>{o=n=null,t(s)};return{promise:r,reject:s=>n?.(s),resolve:s=>o?.(s)}}import{logger as wt}from"hono/logger";import{Hono as ge}from"hono/tiny";import{Hono as lt}from"hono/tiny";import{validator as S}from"hono/validator";import{array as je,literal as Ne,minLength as Ue,object as Fe,pipe as Ve,safeParse as qe,string as Ke,union as Qe}from"valibot";var Ge=Fe({tags:Qe([Ve(je(Ke()),Ue(1)),Ne("all")])});async function te(t){let{output:e,success:r}=qe(Ge,await t.req.json(),{abortEarly:!0});return r?e:t.text("Invalid input",400)}import{spawn as Je}from"child_process";import{once as ze}from"events";import{mkdir as We}from"fs/promises";import{join as Ye}from"path";import{setTimeout as Xe}from"timers/promises";import{proxySignals as Ze}from"foreground-child/proxy-signals";import{process as et}from"std-env";var{PRISMA_DEV_FORCE_ENGINE_BINARY_DOWNLOAD:tt,PRISMA_DEV_FORCE_ENGINE_BINARY_PATH:rt,PRISMA_DEV_FORCE_NETWORK_DELAY_MS:re}=et.env,y=class t{static#r=new Map;#e;#t;constructor(e){this.#e=e,this.#t=null}static async get(e){let{debug:r}=e,n=`${e.schemaHash}:${e.clientVersion}`;try{let o=t.#r.get(n);if(o)return o;let s=new t(e);return t.#r.set(n,s),r&&console.debug("[Query Engine] starting...",e),await s.start(),r&&console.debug("[Query Engine] started!"),s}finally{t.stopAll(n)}}static async stopAll(e){let n=(await Promise.allSettled(Array.from(t.#r.entries()).filter(([o])=>o!==e).map(async([o,s])=>{try{await s.stop()}finally{t.#r.delete(o)}}))).filter(o=>o.status==="rejected").map(o=>o.reason);if(n.length>0)throw new AggregateError(n,"Failed to stop engines")}async commitTransaction(e,r){return await this.#i(e,r,"commit")}async request(e,r){let{url:n}=await this.start(),o=this.#s(r),s=await fetch(n,{body:typeof e=="string"?e:JSON.stringify(e),headers:{...o,"Content-Type":"application/json"},method:"POST"});if(!s.ok)throw await f.fromResponse(s);return await s.text()}async rollbackTransaction(e,r){return await this.#i(e,r,"rollback")}async startTransaction(e,r){let{url:n}=await this.start(),o=this.#s(r),s=await fetch(`${n}/transaction/start`,{body:JSON.stringify(e),headers:{...o,"Content-Type":"application/json"},method:"POST"});if(!s.ok)throw await f.fromResponse(s);return await s.json()}async start(){if(this.#t!=null)return await this.#t;let{promise:e,reject:r,resolve:n}=T();this.#t=e;let o=rt||await this.#o();this.#e.debug&&console.debug("[Query Engine] spinning up at path...",o);let s=Je(o,["--enable-raw-queries","--enable-telemetry-in-response","--port","0"],{env:{LOG_QUERIES:"y",PRISMA_DML:this.#e.base64Schema,QE_LOG_LEVEL:"TRACE",RUST_BACKTRACE:"1",RUST_LOG:"info"},stdio:["ignore","pipe","pipe"],windowsHide:!0});Ze(s),s.stderr.setEncoding("utf8"),s.stdout.setEncoding("utf8");let i=l=>{let m=l.split(`
|
|
3
|
+
`).find(fe=>fe.includes("Started query engine http server"));if(!m)return;s.stdout.removeListener("data",i);let{fields:p}=JSON.parse(m);if(p==null)return r(new Error(`Unexpected data during initialization, "fields" are missing: ${l}`));let{ip:u,port:N}=p;if(u==null||N==null)return r(new Error(`This version of query-engine is not compatible with minippg, "ip" and "port" are missing in the startup log entry.
|
|
4
|
+
Received data: ${l}`));n({childProcess:s,url:`http://${u}:${N}`})},a=l=>{this.#t=null,r(new w(String(l))),s.removeListener("exit",c),s.kill()};s.once("error",a);let c=(l,m)=>{this.#t=null,r(new w(`Query Engine exited with code ${l} and signal ${m}`))};return s.once("exit",c),s.stdout.on("data",i),this.#e.debug&&(s.stderr.on("data",console.error.bind(console,"[Query Engine]")),s.stdout.on("data",console.debug.bind(console,"[Query Engine]"))),await this.#t}async stop(){if(this.#t==null)return;let{childProcess:e}=await this.#t;e.exitCode==null&&e.signalCode==null&&(this.#t=null,e.kill(),await ze(e,"exit"))}async#o(){this.#e.debug&&console.debug("[Query Engine] getting engine commit hash...");let e=await this.#n();this.#e.debug&&console.debug("[Query Engine] got engine commit hash",e);let r=Q(this.#e.clientVersion,e);this.#e.debug&&console.debug("[Query Engine] cache directory path",r),await We(r,{recursive:!0});let{platform:n}=this.#e.platform,o=n==="windows"?".exe":"",s=Ye(r,`query-engine-${n}${o}`);return this.#e.debug&&console.debug("[Query Engine] binary path",s),(tt==="1"||await J(s)===!1)&&await this.#a({commitHash:e,extension:o,engineBinaryPath:s}),s}async#n(){let e=await fetch(`https://registry.npmjs.org/@prisma/client/${this.#e.clientVersion}`);if(!e.ok)throw new Error(`Couldn't fetch package.json from npm registry, status code: ${e.status}`);let n=(await e.json()).devDependencies?.["@prisma/engines-version"];if(!n)throw new Error("Couldn't find engines version in package.json");let o=n.split(".").at(-1);if(!o)throw new Error("Couldn't find commit hash in engines version");return o}async#a(e){let{commitHash:r,extension:n,engineBinaryPath:o}=e,{binaryTarget:s}=this.#e.platform,i=`https://binaries.prisma.sh/all_commits/${r}/${s}/query-engine${n}.gz`;this.#e.debug&&console.debug("[Query Engine] downloading engine from url",i);let a=await fetch(i);if(!a.ok)throw new Error(`Couldn't download engine. URL: ${i}, status code: ${a.status}`);re&&await Xe(Number(re)),await z(await a.arrayBuffer(),o),this.#e.debug&&console.debug("[Query Engine] downloaded and saved at",o)}#s(e){let r={};for(let[n,o]of Object.entries(e))o!=null&&(r[n]=o);return r}async#i(e,r,n){let{url:o}=await this.#t,s=this.#s(r),i=await fetch(`${o}/transaction/${e}/${n}`,{headers:{...s,"Content-Type":"application/json"},method:"POST"});if(!i.ok)throw await f.fromResponse(i);try{return await i.json()}catch{return{}}}};function A(t,e){return console.error(t),t instanceof w?e.json({EngineNotStarted:{reason:{EngineStartupError:{logs:[],msg:t.message}}}},500):t instanceof f?e.text(t.responseBody,t.statusCode):e.body(null,500)}var w=class extends Error{name="EngineStartError"},f=class t extends Error{constructor(r,n,o){super(`${r}: Query Engine response status ${n}, body: ${o}`);this.action=r;this.statusCode=n;this.responseBody=o}name="EngineHttpError";static async fromResponse(r){let n=new URL(r.url),o=await r.text();return new t(n.pathname,r.status,o)}};import{Buffer as ne}from"buffer";var R=new Map;async function H(t){let r=new TextEncoder().encode(t),n=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(n)).map(i=>i.toString(16).padStart(2,"0")).join("")}function oe(t){let e=t.req.param("schemaHash"),r=R.get(e);return r==null?t.json({EngineNotStarted:{reason:"SchemaMissing"}},404):{schemaHash:e,schemas:r}}var nt=/datasource\s+db\s+\{\s*provider\s*=\s*"postgres(!?ql)?"\s+url\s*=\s*.+\s*\}/;async function se(t,e){let r=ne.from(t,"base64").toString("utf8"),n=`datasource db {
|
|
5
5
|
provider = "postgresql"
|
|
6
6
|
url = "${e.toString()}"
|
|
7
|
-
}`,o=r.replace(
|
|
8
|
-
`,{encoding:"utf-8"})}};async function
|
|
7
|
+
}`,o=r.replace(nt,n),s=await H(o);return{base64Override:ne.from(o,"utf8").toString("base64"),overrideHash:s}}function D(t){let{req:e}=t;return{traceparent:e.header("traceparent"),"X-capture-telemetry":e.header("X-capture-telemetry")}}import{integer as ie,looseObject as ot,minValue as ae,number as k,object as st,optional as it,pipe as ce,safeParse as de,string as le,union as at}from"valibot";var ct=st({isolation_level:it(le()),max_wait:ce(k(),ie(),ae(0)),timeout:ce(k(),ie(),ae(0))});async function ue(t){let{issues:e,output:r,success:n}=de(ct,await t.req.json(),{abortEarly:!0});return n?r:t.json({EngineNotStarted:{reason:"InvalidRequest",issues:e}},400)}var dt=ot({id:at([le(),k()])});function me(t,e){let{output:r,success:n}=de(dt,t);return n?r:e.json({EngineMalfunction:{}},500)}var P=new lt;P.post("/invalidate",S("header",g),async t=>{let e=await te(t);return e instanceof Response?e:t.body(null)});var ut="/:clientVersion/:schemaHash",v=P.basePath(ut);P.route("/",v);var mt=["/graphql","/itx/:transactionId/graphql"];v.on("POST",[...mt],S("header",g),async t=>{let{req:e}=t;try{let r=await C(t);if(r instanceof Response)return r;let n=await e.text(),o=e.param("transactionId"),s=await r.request(n,{...D(t),"X-transaction-id":o});return t.text(s)}catch(r){return A(r,t)}});v.basePath("/itx/:transactionId").on("POST",["/commit","/rollback"],S("header",g),async t=>{let{req:e}=t;try{let r=await C(t);if(r instanceof Response)return r;let o=`${e.routePath.split("/").filter(Boolean).at(-1)}Transaction`,s=e.param("transactionId"),i=await r[o](s,D(t));return t.json(i)}catch(r){return A(r,t)}});v.put("/schema",S("header",g),async t=>{let{req:e}=t,r=await e.text();if(!r)return t.text("Missing schema",400);let n=e.param("schemaHash"),o=R.get(n);if(o==null){if(n!==await H(r))return t.text("Schema hash mismatch",400);let s=new URL(t.get("db").connectionString);s.searchParams.set("single_use_connections","true");let i=await se(r,s);return R.set(n,{base64Original:r,...i}),t.text(n)}return r!==o.base64Original?t.text("Schema mismatch",400):t.text(n)});v.post("/transaction/start",S("header",g),async t=>{let{req:e}=t,r=await ue(t);if(r instanceof Response)return r;try{let n=await C(t);if(n instanceof Response)return n;let o=await n.startTransaction(r,D(t)),s=me(o,t);if(s instanceof Response)return s;let{id:i}=s,a=e.param("clientVersion"),c=t.get("port"),l=t.get("protocol"),m=e.param("schemaHash");return t.json({...o,"data-proxy":{endpoint:`${l}://localhost:${c}/${a}/${m}/itx/${i}`}})}catch(n){return A(n,t)}});async function C(t){let{req:e}=t,r=oe(t);if(r instanceof Response)return r;let{base64Override:n,overrideHash:o}=r.schemas;return await y.get({base64Schema:n,clientVersion:process.env.PRISMA_DEV_FORCE_CLIENT_VERSION||e.param("clientVersion"),debug:t.get("debug"),platform:t.get("platform"),schemaHash:o})}import{Hono as pt}from"hono/tiny";import{StatusCodes as gt}from"http-status-codes";var O=new pt;O.post("/database/dump",async t=>{let r=await t.get("db").dump();return t.json(r,gt.CREATED)});O.get("/health",t=>t.json({name:t.get("serverState").name}));async function he(t,e){let{port:r}=e;if(e.dryRun)return pe(r,null);let n=await St(r,t,e),{promise:o,reject:s,resolve:i}=T(),a=yt({createServer:ht,fetch:n.fetch,port:r},i);return a.on("error",c=>{if(typeof c=="object"&&"code"in c&&c.code==="EADDRINUSE")return s(new h(r,"server"));console.error("[Accelerate]",c)}),await o,pe(r,a)}function pe(t,e){return{async close(){e&&await Promise.allSettled([ft(e.close.bind(e))(),y.stopAll()])},port:t,url:`http://localhost:${t}`}}async function St(t,e,r){let{debug:n}=r,o=new ge,s=await bt.getPlatformInfo();return n&&console.debug("[Accelerate] platform info: %s",JSON.stringify(s)),n&&o.use("*",wt((...i)=>console.log("[Accelerate]",...i))),o.use("*",async(i,a)=>(i.set("db",e),i.set("debug",!!n),i.set("platform",s),i.set("port",t),i.set("protocol","http"),i.set("serverState",r),await a())),o.route("/",B),o}var B=new ge;B.route("/",P);B.route("/",O);import{mkdir as Pt,writeFile as vt}from"fs/promises";import{join as x}from"pathe";import{lock as Et}from"proper-lockfile";import{process as Tt}from"std-env";var j=Symbol("initialize"),b=class{databasePort;debug;dryRun;name;persistenceMode;port;shadowDatabasePort;constructor(e){this.databasePort=e.databasePort??51214,this.debug=e.debug??!1,this.dryRun=e.dryRun??!1,this.name=e.name??"default",this.persistenceMode=e.persistenceMode,this.port=e.port??51213,this.shadowDatabasePort=e.shadowDatabasePort??51215}static async get(e){let r=e?.dryRun!==!0&&e?.persistenceMode!=="stateless"?new M(e):new L(e);return await r[j](),r}},L=class extends b{constructor(e){super({...e,persistenceMode:"stateless"})}get databaseDumpPath(){return"<DUMP_PATH>"}get pgliteDataDirPath(){return"memory://"}async[j](){}async close(){}async writeServerDump(){}},M=class extends b{#r;#e;#t;#o;#n=null;constructor(e){super({...e,persistenceMode:"stateful"}),this.#e=G(this.name),this.#r=x(this.#e,"db_dump.bak"),this.#t=x(this.#e,".pglite"),this.#o=x(this.#e,"server.json")}get databaseDumpPath(){return this.#r}get pgliteDataDirPath(){return this.#t}async[j](){await Pt(this.#e,{recursive:!0}),this.debug&&console.debug(`[State] using data directory: ${this.#e}`);try{this.#n=await Et(this.#e,{lockfilePath:x(this.#e,".lock")}),this.debug&&console.debug(`[State] obtained lock on: ${this.#e}`),await this.writeServerDump()}catch(e){throw e instanceof Error&&"code"in e&&e.code==="ELOCKED"?new Error(`A server with the name "${this.name}" is already running. `):e}}async close(){this.#n!=null&&(await this.#n(),this.debug&&console.debug(`[State] released lock on: ${this.#e}`))}async writeServerDump(e){await vt(this.#o,`${JSON.stringify({name:this.name,version:"1",pid:Tt.pid,port:this.port,databasePort:this.databasePort,shadowDatabasePort:this.shadowDatabasePort,exports:e},null,2)}
|
|
8
|
+
`,{encoding:"utf-8"})}};async function Ur(t){let e=await b.get(t),[r,n]=await Promise.all([$("database",e),$("shadow_database",e)]),o=await he(r,e),s=`prisma+postgres://localhost:${o.port}/?${new URLSearchParams({api_key:q({databaseUrl:r.connectionString,shadowDatabaseUrl:n.connectionString})}).toString()}`,i={database:{connectionString:r.connectionString},http:{url:o.url},ppg:{url:s},shadowDatabase:{connectionString:n.connectionString}};return await e.writeServerDump(i),{...i,close:()=>a(e,[o,r,n])};async function a(c,l){let p=(await Promise.allSettled(l.map(u=>u.close()))).filter(u=>u.status==="rejected").map(u=>new Error(u.reason));try{await c.close()}catch(u){p.push(u)}if(p.length>0)throw new AggregateError(p,"Failed to close some servers")}}export{Y as DEFAULT_DATABASE_PORT,X as DEFAULT_SERVER_PORT,Z as DEFAULT_SHADOW_DATABASE_PORT,h as PortNotAvailableError,Ur as unstable_startServer};
|
package/package.json
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
type DBServerPurpose = "database" | "shadow_database";
|
|
2
|
-
|
|
3
1
|
interface ServerOptions {
|
|
4
2
|
/**
|
|
5
3
|
* The port the database server will listen on.
|
|
@@ -52,6 +50,8 @@ interface ServerOptions {
|
|
|
52
50
|
}
|
|
53
51
|
type PersistenceMode = "stateless" | "stateful";
|
|
54
52
|
|
|
53
|
+
type DBServerPurpose = "database" | "shadow_database";
|
|
54
|
+
|
|
55
55
|
declare const DEFAULT_DATABASE_PORT = 51214;
|
|
56
56
|
declare const DEFAULT_SERVER_PORT = 51213;
|
|
57
57
|
declare const DEFAULT_SHADOW_DATABASE_PORT = 51215;
|