@prisma/composer-prisma-cloud 0.2.0-dev.13 → 0.2.0-dev.14
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/local-target.mjs +89 -37
- package/dist/local-target.mjs.map +1 -1
- package/dist/postgres-main.mjs +106 -16
- package/dist/postgres-main.mjs.map +1 -1
- package/package.json +17 -17
package/dist/postgres-main.mjs
CHANGED
|
@@ -92,9 +92,56 @@ function isPrismaDevModule(value) {
|
|
|
92
92
|
* number matching the candidate we just tried — is what actually survives
|
|
93
93
|
* that boundary.
|
|
94
94
|
*/
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
/**
|
|
96
|
+
* The port a start refusal is about, when it is one of THIS attempt's ports.
|
|
97
|
+
* Duck-typed (`instanceof` fails across the dynamic-import boundary): every
|
|
98
|
+
* `@prisma/dev` port refusal — not-available, requested-twice, and
|
|
99
|
+
* belongs-to-another-server (its registry can claim a port no bind probe
|
|
100
|
+
* sees) — carries the offending port as `.port`, and any of the four ports
|
|
101
|
+
* we requested (database + the three aux listeners) can be the one refused.
|
|
102
|
+
*/
|
|
103
|
+
function portConflictOf(err, ports) {
|
|
104
|
+
if (typeof err !== "object" || err === null || !("port" in err)) return void 0;
|
|
105
|
+
const port = err.port;
|
|
106
|
+
return typeof port === "number" && ports.includes(port) ? port : void 0;
|
|
107
|
+
}
|
|
108
|
+
function isPrismaDevServer(value) {
|
|
109
|
+
if (!isStringKeyedRecord(value) || typeof value["close"] !== "function") return false;
|
|
110
|
+
const database = value["database"];
|
|
111
|
+
return isStringKeyedRecord(database) && typeof database["connectionString"] === "string";
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The live server behind a "name is already running" refusal, when there is
|
|
115
|
+
* one. A start that fails mid-boot (e.g. on a port another server's
|
|
116
|
+
* registry claims) can leave its state entry behind, so OUR OWN next
|
|
117
|
+
* attempt for the same name is refused. `@prisma/dev`'s
|
|
118
|
+
* `ServerAlreadyRunningError` carries the running server as a `.server`
|
|
119
|
+
* getter (duck-typed — `instanceof` fails across the dynamic-import
|
|
120
|
+
* boundary); its parent class (state entry exists but nothing actually
|
|
121
|
+
* runs) has no such getter, and a dead ghost resolves to null — both mean
|
|
122
|
+
* "nothing to adopt".
|
|
123
|
+
*/
|
|
124
|
+
async function adoptableServerOf(err) {
|
|
125
|
+
if (!isStringKeyedRecord(err) || !("server" in err)) return void 0;
|
|
126
|
+
if (err["name"] !== "ServerAlreadyRunningError") return void 0;
|
|
127
|
+
try {
|
|
128
|
+
const server = await err["server"];
|
|
129
|
+
return isPrismaDevServer(server) ? server : void 0;
|
|
130
|
+
} catch {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function isNameAlreadyTaken(err) {
|
|
135
|
+
return isStringKeyedRecord(err) && (err["name"] === "ServerAlreadyRunningError" || err["name"] === "ServerStateAlreadyExistsError");
|
|
136
|
+
}
|
|
137
|
+
/** The port of a postgres connection URL, when it parses as one. */
|
|
138
|
+
function databasePortOf(connectionString) {
|
|
139
|
+
try {
|
|
140
|
+
const port = Number(new URL(connectionString).port);
|
|
141
|
+
return Number.isInteger(port) && port > 0 ? port : void 0;
|
|
142
|
+
} catch {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
98
145
|
}
|
|
99
146
|
/**
|
|
100
147
|
* A dynamic `import()` failure's own message routinely names a SECOND path
|
|
@@ -212,10 +259,10 @@ function main() {
|
|
|
212
259
|
for (const appRec of Object.values(state)) for (const db of Object.values(appRec.databases)) ports.add(db.databasePort);
|
|
213
260
|
return ports;
|
|
214
261
|
}
|
|
215
|
-
async function smallestUnusedDatabasePort(min) {
|
|
262
|
+
async function smallestUnusedDatabasePort(min, alsoExclude = /* @__PURE__ */ new Set()) {
|
|
216
263
|
return getPorts({
|
|
217
264
|
port: portNumbers(min, MAX_DATABASE_PORT),
|
|
218
|
-
exclude: usedDatabasePorts()
|
|
265
|
+
exclude: [...usedDatabasePorts(), ...alsoExclude]
|
|
219
266
|
});
|
|
220
267
|
}
|
|
221
268
|
/** Three fresh, mutually distinct ports for a server's own HTTP/shadow-database/streams listeners — never persisted, only unique right now. */
|
|
@@ -244,18 +291,29 @@ function main() {
|
|
|
244
291
|
})
|
|
245
292
|
};
|
|
246
293
|
}
|
|
247
|
-
|
|
248
|
-
|
|
294
|
+
const inflightEnsures = /* @__PURE__ */ new Map();
|
|
295
|
+
/** Concurrent PUTs for the same database coalesce onto one start — a second `startPrismaDevServer` for a name whose first start is still booting fails as "already running". */
|
|
296
|
+
function ensureDatabase(app, id, prismaDevModulePath) {
|
|
249
297
|
const instanceName = instanceNameFor(app, id);
|
|
298
|
+
const inflight = inflightEnsures.get(instanceName);
|
|
299
|
+
if (inflight) return inflight;
|
|
300
|
+
const run = ensureDatabaseSerialized(app, id, prismaDevModulePath, instanceName).finally(() => {
|
|
301
|
+
inflightEnsures.delete(instanceName);
|
|
302
|
+
});
|
|
303
|
+
inflightEnsures.set(instanceName, run);
|
|
304
|
+
return run;
|
|
305
|
+
}
|
|
306
|
+
async function ensureDatabaseSerialized(app, id, prismaDevModulePath, instanceName) {
|
|
307
|
+
const appRec = getOrCreateApp(app);
|
|
250
308
|
const existingRecord = appRec.databases[id];
|
|
251
309
|
const runningServer = runtimes.get(instanceName);
|
|
252
310
|
if (existingRecord && runningServer) return { url: existingRecord.url };
|
|
253
311
|
const prismaDev = await importPrismaDev(prismaDevModulePath);
|
|
254
312
|
const isFreshAllocation = existingRecord === void 0;
|
|
255
|
-
const maxAttempts = isFreshAllocation ? MAX_FRESH_PORT_CANDIDATES : 1;
|
|
256
313
|
let dbPort = existingRecord?.databasePort ?? await smallestUnusedDatabasePort(MIN_DATABASE_PORT);
|
|
314
|
+
const conflicted = /* @__PURE__ */ new Set();
|
|
257
315
|
for (let attempt = 1;; attempt++) {
|
|
258
|
-
const aux = await allocateAuxPorts(/* @__PURE__ */ new Set([dbPort]));
|
|
316
|
+
const aux = await allocateAuxPorts(/* @__PURE__ */ new Set([dbPort, ...conflicted]));
|
|
259
317
|
try {
|
|
260
318
|
const server = await prismaDev.startPrismaDevServer({
|
|
261
319
|
name: instanceName,
|
|
@@ -284,11 +342,37 @@ function main() {
|
|
|
284
342
|
schedulePersist();
|
|
285
343
|
return { url };
|
|
286
344
|
} catch (err) {
|
|
287
|
-
if (
|
|
345
|
+
if (isNameAlreadyTaken(err)) {
|
|
346
|
+
const ghost = await adoptableServerOf(err);
|
|
347
|
+
if (ghost !== void 0) {
|
|
348
|
+
const url = ghost.database.connectionString;
|
|
349
|
+
runtimes.set(instanceName, ghost);
|
|
350
|
+
appRec.databases[id] = {
|
|
351
|
+
id,
|
|
352
|
+
instanceName,
|
|
353
|
+
databasePort: databasePortOf(url) ?? dbPort,
|
|
354
|
+
url
|
|
355
|
+
};
|
|
356
|
+
schedulePersist();
|
|
357
|
+
return { url };
|
|
358
|
+
}
|
|
359
|
+
if (attempt < MAX_FRESH_PORT_CANDIDATES) {
|
|
360
|
+
await (await importPrismaDevInternalState(prismaDevModulePath)).deleteServer(instanceName);
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
const conflictPort = portConflictOf(err, [
|
|
365
|
+
dbPort,
|
|
366
|
+
aux.httpPort,
|
|
367
|
+
aux.shadowDatabasePort,
|
|
368
|
+
aux.streamsPort
|
|
369
|
+
]);
|
|
370
|
+
if (!(conflictPort !== void 0 && attempt < MAX_FRESH_PORT_CANDIDATES && (conflictPort !== dbPort || isFreshAllocation))) {
|
|
288
371
|
const reason = err instanceof Error ? err.message : String(err);
|
|
289
372
|
throw new Error(`postgres emulator failed to start database "${instanceName}" on port ${String(dbPort)}: ${maskCredentials(firstLine(reason))}`);
|
|
290
373
|
}
|
|
291
|
-
|
|
374
|
+
conflicted.add(conflictPort);
|
|
375
|
+
if (conflictPort === dbPort) dbPort = await smallestUnusedDatabasePort(dbPort + 1, conflicted);
|
|
292
376
|
}
|
|
293
377
|
}
|
|
294
378
|
}
|
|
@@ -296,17 +380,17 @@ function main() {
|
|
|
296
380
|
const appRec = state[app];
|
|
297
381
|
if (!appRec) return;
|
|
298
382
|
const entries = Object.values(appRec.databases);
|
|
299
|
-
|
|
383
|
+
for (const db of entries) {
|
|
300
384
|
const server = runtimes.get(db.instanceName);
|
|
301
385
|
if (server) {
|
|
302
|
-
await server.close();
|
|
386
|
+
await server.close().catch(() => void 0);
|
|
303
387
|
runtimes.delete(db.instanceName);
|
|
304
388
|
releaseAuxPorts(db.instanceName);
|
|
305
389
|
}
|
|
306
|
-
}
|
|
390
|
+
}
|
|
307
391
|
if (entries.length > 0 && prismaDevModulePathHint) {
|
|
308
392
|
const { deleteServer } = await importPrismaDevInternalState(prismaDevModulePathHint);
|
|
309
|
-
|
|
393
|
+
for (const db of entries) await deleteServer(db.instanceName);
|
|
310
394
|
}
|
|
311
395
|
delete state[app];
|
|
312
396
|
schedulePersist();
|
|
@@ -378,13 +462,19 @@ function main() {
|
|
|
378
462
|
});
|
|
379
463
|
});
|
|
380
464
|
async function shutdown() {
|
|
381
|
-
|
|
465
|
+
for (const server of runtimes.values()) await server.close().catch(() => void 0);
|
|
382
466
|
await stateFile.flush();
|
|
383
467
|
server.close();
|
|
384
468
|
process.exit(0);
|
|
385
469
|
}
|
|
386
470
|
process.on("SIGTERM", () => void shutdown());
|
|
387
471
|
process.on("SIGINT", () => void shutdown());
|
|
472
|
+
process.on("unhandledRejection", (reason) => {
|
|
473
|
+
console.error("postgres-main: unhandled rejection from background work:", reason instanceof Error ? maskCredentials(reason.stack ?? reason.message) : reason);
|
|
474
|
+
});
|
|
475
|
+
process.on("uncaughtException", (err) => {
|
|
476
|
+
console.error("postgres-main: uncaught exception from background work:", err instanceof Error ? maskCredentials(err.stack ?? err.message) : err);
|
|
477
|
+
});
|
|
388
478
|
readJsonFile(appsJsonPath, isAppsState).then((loaded) => {
|
|
389
479
|
if (loaded) state = loaded;
|
|
390
480
|
server.listen(port, "127.0.0.1", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-main.mjs","names":["getPort"],"sources":["../../../1-prisma-cloud/0-lowering/dev-emulators/dist/instance-name-BF6J_weL.mjs","../../../1-prisma-cloud/0-lowering/dev-emulators/dist/postgres-main.mjs"],"sourcesContent":["//#region src/instance-name.ts\n/**\n* `pcdev-<app>-<database-id>` instance-name derivation (local-dev spec § 2\n* `postgres-main.ts`): each half lowercased, every char outside `[a-z0-9]`\n* replaced by `-`, runs collapsed, the combined name trimmed to 63 chars.\n*\n* A separate, side-effect-free module (not defined inline in\n* `postgres-main.ts`) so it can be imported directly by tests without also\n* running that file's own `main()` — `postgres-main.ts` is a daemon\n* entrypoint script, always invoked as a subprocess, and calls `main()`\n* unconditionally at module load.\n*/\n/**\n* Deliberately linear, no ambiguous quantifiers: a per-character replace\n* (no `+`, so no run-length backtracking surface), a bounded-quantifier\n* collapse (`{2,}`, not alternation-with-quantifiers), and plain\n* index-walking for the leading/trailing trim instead of a regex — a\n* combined `+`-plus-alternation trim (`/^-+|-+$/g`) is exactly the shape\n* CodeQL's polynomial-ReDoS check flags, whether or not this particular\n* instance is provably safe.\n*/\nfunction slug(segment) {\n\tconst collapsed = segment.toLowerCase().replace(/[^a-z0-9]/g, \"-\").replace(/-{2,}/g, \"-\");\n\tlet start = 0;\n\tlet end = collapsed.length;\n\twhile (start < end && collapsed[start] === \"-\") start++;\n\twhile (end > start && collapsed[end - 1] === \"-\") end--;\n\treturn collapsed.slice(start, end);\n}\nfunction instanceNameFor(app, id) {\n\treturn `pcdev-${slug(app)}-${slug(id)}`.slice(0, 63);\n}\n//#endregion\nexport { slug as n, instanceNameFor as t };\n\n//# sourceMappingURL=instance-name-BF6J_weL.mjs.map","import { c as readOwnVersion, f as StateFile, p as readJsonFile, t as isValidSegment } from \"./segments-NpKN-46R.mjs\";\nimport { t as instanceNameFor } from \"./instance-name-BF6J_weL.mjs\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport getPort, { portNumbers } from \"get-port\";\nimport * as http from \"node:http\";\n//#region src/postgres-main.ts\n/**\n* The Postgres emulator daemon (local-dev spec § 2 `postgres-main.ts`): a\n* small local counterpart of hosted Postgres, hosting `@prisma/dev`'s\n* `startPrismaDevServer()` — one named, persistent server per `Database`\n* resource, several servers in this one daemon process. Loopback\n* `node:http` JSON admin API; state under its `--state-dir`.\n*\n* `@prisma/dev` is imported dynamically from a CALLER-RESOLVED path (each\n* admin request that needs it carries `prismaDevModulePath`) so the app\n* owns its own Prisma version — this daemon has no `@prisma/dev` dependency\n* of its own.\n*\n* Runs as its own OS process, started by `daemon.ts`'s `ensureDaemon` via\n* `process.execPath <this file> --port <n> --state-dir <dir>`.\n*/\nconst MIN_DATABASE_PORT = 51300;\nconst MAX_DATABASE_PORT = 65535;\nconst APPS_STATE_MODE = 384;\n/** Spec § 2 step 5's pattern, applied to a fresh database-port allocation. */\nconst MAX_FRESH_PORT_CANDIDATES = 5;\nconst NOT_INSTALLED_MESSAGE = \"local dev needs @prisma/dev for its local Postgres emulator — add \\\"prisma\\\" to your app's devDependencies.\";\nfunction maskCredentials(text) {\n\treturn text.replace(/:\\/\\/([^:@/\\s]+):[^@/\\s]+@/g, \"://$1:***@\");\n}\nfunction firstLine(text) {\n\treturn (text.split(\"\\n\")[0] ?? text).trim();\n}\nfunction isDatabaseRecord(value) {\n\treturn typeof value === \"object\" && value !== null && \"id\" in value && typeof value.id === \"string\" && \"instanceName\" in value && typeof value.instanceName === \"string\" && \"databasePort\" in value && typeof value.databasePort === \"number\" && \"url\" in value && typeof value.url === \"string\";\n}\nfunction isAppRecord(value) {\n\treturn typeof value === \"object\" && value !== null && \"databases\" in value && typeof value.databases === \"object\" && value.databases !== null && Object.values(value.databases).every(isDatabaseRecord);\n}\nfunction isAppsState(value) {\n\treturn typeof value === \"object\" && value !== null && Object.values(value).every(isAppRecord);\n}\nfunction isDatabaseBody(value) {\n\treturn typeof value === \"object\" && value !== null && \"prismaDevModulePath\" in value && typeof value.prismaDevModulePath === \"string\";\n}\nfunction isPrismaDevModule(value) {\n\treturn typeof value === \"object\" && value !== null && \"startPrismaDevServer\" in value && typeof value.startPrismaDevServer === \"function\";\n}\n/**\n* `@prisma/dev` exports a `PortNotAvailableError` class with a `readonly\n* port: number`, but the daemon dynamically imports the module from a\n* caller-given path while the class identity checked here would come from\n* whatever module graph THIS file's own bundle produced — two separate\n* instantiations of the same logical class, so `instanceof` doesn't match\n* across them (confirmed empirically: a real port conflict's `err\n* instanceof mod.PortNotAvailableError` is `false` even though the error IS\n* the port-conflict one). Duck-typing the documented shape — a `port`\n* number matching the candidate we just tried — is what actually survives\n* that boundary.\n*/\nfunction isPortConflict(err, port) {\n\tif (typeof err !== \"object\" || err === null || !(\"port\" in err)) return false;\n\treturn err.port === port;\n}\n/**\n* A dynamic `import()` failure's own message routinely names a SECOND path\n* (e.g. bun's \"Cannot find module '<target>' from '<importer>'\") — the\n* importer half is this daemon's own internal location, not anything the\n* caller gave us, and has no business in a response body. Rather than try\n* to scrub an arbitrary underlying message for every runtime's own error\n* phrasing, the resolution-failure case names only what the caller\n* supplied — the pinned message plus the given `prismaDevModulePath`, and\n* nothing else. (A DIFFERENT case — a module that resolves fine but whose\n* `startPrismaDevServer()` call itself fails — still surfaces its\n* underlying text verbatim, credential-masked, per spec § 2.)\n*/\nasync function importPrismaDev(prismaDevModulePath) {\n\tlet mod;\n\ttry {\n\t\tmod = await import(pathToFileURL(prismaDevModulePath).href);\n\t} catch {\n\t\tthrow new Error(`${NOT_INSTALLED_MESSAGE} (could not resolve \"${prismaDevModulePath}\")`);\n\t}\n\tif (!isPrismaDevModule(mod)) throw new Error(`${NOT_INSTALLED_MESSAGE} (\"${prismaDevModulePath}\" is not a @prisma/dev module)`);\n\treturn mod;\n}\nfunction isStringKeyedRecord(value) {\n\treturn typeof value === \"object\" && value !== null;\n}\nfunction isPrismaDevInternalStateModule(value) {\n\treturn isStringKeyedRecord(value) && typeof value[\"deleteServer\"] === \"function\";\n}\n/**\n* `@prisma/dev`'s own package.json declares `./internal/state`, whose\n* `deleteServer(name)` actually removes a stateful server's persisted PGlite\n* data — `startPrismaDevServer`'s public surface only starts/closes a live\n* server, never deletes what a closed one left on disk. Resolved by reading\n* the SAME package's own `exports` map (walked up from the caller-given\n* entry path to find `@prisma/dev`'s `package.json`), never by guessing at\n* `dist/` file layout.\n*/\nasync function importPrismaDevInternalState(prismaDevModulePath) {\n\tlet dir = path.dirname(prismaDevModulePath);\n\tfor (;;) {\n\t\tconst pkgPath = path.join(dir, \"package.json\");\n\t\tif (fs.existsSync(pkgPath)) {\n\t\t\tconst pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"));\n\t\t\tif (isStringKeyedRecord(pkg) && pkg[\"name\"] === \"@prisma/dev\" && isStringKeyedRecord(pkg[\"exports\"])) {\n\t\t\t\tconst entry = pkg[\"exports\"][\"./internal/state\"];\n\t\t\t\tconst target = resolveExportTarget(entry);\n\t\t\t\tif (target === void 0) throw new Error(`\"@prisma/dev\" at \"${dir}\" does not declare an \"./internal/state\" export — cannot delete its persisted database data.`);\n\t\t\t\tconst mod = await import(pathToFileURL(path.join(dir, target)).href);\n\t\t\t\tif (isPrismaDevInternalStateModule(mod)) return mod;\n\t\t\t\tthrow new Error(`\"@prisma/dev\"'s \"./internal/state\" export at \"${dir}\" has no deleteServer.`);\n\t\t\t}\n\t\t}\n\t\tconst parent = path.dirname(dir);\n\t\tif (parent === dir) throw new Error(`could not find \"@prisma/dev\"'s package.json above \"${prismaDevModulePath}\".`);\n\t\tdir = parent;\n\t}\n}\nfunction resolveExportTarget(entry) {\n\tif (typeof entry === \"string\") return entry;\n\tif (!isStringKeyedRecord(entry)) return void 0;\n\tconst nested = entry[\"import\"] ?? entry[\"require\"] ?? entry[\"default\"];\n\tif (typeof nested === \"string\") return nested;\n\tif (isStringKeyedRecord(nested)) {\n\t\tconst def = nested[\"default\"];\n\t\tif (typeof def === \"string\") return def;\n\t}\n}\nfunction parseArgs(argv) {\n\tlet port;\n\tlet stateDir;\n\tfor (let i = 0; i < argv.length; i++) if (argv[i] === \"--port\") port = Number(argv[i + 1]);\n\telse if (argv[i] === \"--state-dir\") stateDir = argv[i + 1];\n\tif (port === void 0 || Number.isNaN(port)) throw new Error(\"postgres-main: --port <n> is required\");\n\tif (stateDir === void 0) throw new Error(\"postgres-main: --state-dir <dir> is required\");\n\treturn {\n\t\tport,\n\t\tstateDir\n\t};\n}\nfunction readBody(req) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks = [];\n\t\treq.on(\"data\", (chunk) => chunks.push(chunk));\n\t\treq.on(\"end\", () => resolve(Buffer.concat(chunks)));\n\t\treq.on(\"error\", reject);\n\t});\n}\nfunction main() {\n\tconst { port, stateDir } = parseArgs(process.argv.slice(2));\n\tconst ownVersion = readOwnVersion();\n\tconst appsJsonPath = path.join(stateDir, \"apps.json\");\n\tconst stateFile = new StateFile(appsJsonPath, APPS_STATE_MODE);\n\tlet state = {};\n\tconst runtimes = /* @__PURE__ */ new Map();\n\tconst liveAuxPorts = /* @__PURE__ */ new Set();\n\tconst auxPortsByInstance = /* @__PURE__ */ new Map();\n\tfunction releaseAuxPorts(instanceName) {\n\t\tfor (const p of auxPortsByInstance.get(instanceName) ?? []) liveAuxPorts.delete(p);\n\t\tauxPortsByInstance.delete(instanceName);\n\t}\n\tfunction schedulePersist() {\n\t\tstateFile.write(state);\n\t}\n\tfunction getOrCreateApp(app) {\n\t\tlet appRec = state[app];\n\t\tif (!appRec) {\n\t\t\tappRec = { databases: {} };\n\t\t\tstate[app] = appRec;\n\t\t}\n\t\treturn appRec;\n\t}\n\tfunction usedDatabasePorts() {\n\t\tconst ports = /* @__PURE__ */ new Set();\n\t\tfor (const appRec of Object.values(state)) for (const db of Object.values(appRec.databases)) ports.add(db.databasePort);\n\t\treturn ports;\n\t}\n\tasync function smallestUnusedDatabasePort(min) {\n\t\treturn getPort({\n\t\t\tport: portNumbers(min, MAX_DATABASE_PORT),\n\t\t\texclude: usedDatabasePorts()\n\t\t});\n\t}\n\t/** Three fresh, mutually distinct ports for a server's own HTTP/shadow-database/streams listeners — never persisted, only unique right now. */\n\tasync function allocateAuxPorts(excluding) {\n\t\tconst taken = /* @__PURE__ */ new Set([\n\t\t\t...usedDatabasePorts(),\n\t\t\t...liveAuxPorts,\n\t\t\t...excluding\n\t\t]);\n\t\tconst httpPort = await getPort({\n\t\t\tport: portNumbers(MIN_DATABASE_PORT, MAX_DATABASE_PORT),\n\t\t\texclude: taken\n\t\t});\n\t\ttaken.add(httpPort);\n\t\tconst shadowDatabasePort = await getPort({\n\t\t\tport: portNumbers(MIN_DATABASE_PORT, MAX_DATABASE_PORT),\n\t\t\texclude: taken\n\t\t});\n\t\ttaken.add(shadowDatabasePort);\n\t\treturn {\n\t\t\thttpPort,\n\t\t\tshadowDatabasePort,\n\t\t\tstreamsPort: await getPort({\n\t\t\t\tport: portNumbers(MIN_DATABASE_PORT, MAX_DATABASE_PORT),\n\t\t\t\texclude: taken\n\t\t\t})\n\t\t};\n\t}\n\tasync function ensureDatabase(app, id, prismaDevModulePath) {\n\t\tconst appRec = getOrCreateApp(app);\n\t\tconst instanceName = instanceNameFor(app, id);\n\t\tconst existingRecord = appRec.databases[id];\n\t\tconst runningServer = runtimes.get(instanceName);\n\t\tif (existingRecord && runningServer) return { url: existingRecord.url };\n\t\tconst prismaDev = await importPrismaDev(prismaDevModulePath);\n\t\tconst isFreshAllocation = existingRecord === void 0;\n\t\tconst maxAttempts = isFreshAllocation ? MAX_FRESH_PORT_CANDIDATES : 1;\n\t\tlet dbPort = existingRecord?.databasePort ?? await smallestUnusedDatabasePort(MIN_DATABASE_PORT);\n\t\tfor (let attempt = 1;; attempt++) {\n\t\t\tconst aux = await allocateAuxPorts(/* @__PURE__ */ new Set([dbPort]));\n\t\t\ttry {\n\t\t\t\tconst server = await prismaDev.startPrismaDevServer({\n\t\t\t\t\tname: instanceName,\n\t\t\t\t\tdatabasePort: dbPort,\n\t\t\t\t\tport: aux.httpPort,\n\t\t\t\t\tshadowDatabasePort: aux.shadowDatabasePort,\n\t\t\t\t\tstreamsPort: aux.streamsPort,\n\t\t\t\t\tpersistenceMode: \"stateful\"\n\t\t\t\t});\n\t\t\t\tconst url = server.database.connectionString;\n\t\t\t\truntimes.set(instanceName, server);\n\t\t\t\tliveAuxPorts.add(aux.httpPort);\n\t\t\t\tliveAuxPorts.add(aux.shadowDatabasePort);\n\t\t\t\tliveAuxPorts.add(aux.streamsPort);\n\t\t\t\tauxPortsByInstance.set(instanceName, [\n\t\t\t\t\taux.httpPort,\n\t\t\t\t\taux.shadowDatabasePort,\n\t\t\t\t\taux.streamsPort\n\t\t\t\t]);\n\t\t\t\tappRec.databases[id] = {\n\t\t\t\t\tid,\n\t\t\t\t\tinstanceName,\n\t\t\t\t\tdatabasePort: dbPort,\n\t\t\t\t\turl\n\t\t\t\t};\n\t\t\t\tschedulePersist();\n\t\t\t\treturn { url };\n\t\t\t} catch (err) {\n\t\t\t\tif (!(isFreshAllocation && isPortConflict(err, dbPort) && attempt < maxAttempts)) {\n\t\t\t\t\tconst reason = err instanceof Error ? err.message : String(err);\n\t\t\t\t\tthrow new Error(`postgres emulator failed to start database \"${instanceName}\" on port ${String(dbPort)}: ${maskCredentials(firstLine(reason))}`);\n\t\t\t\t}\n\t\t\t\tdbPort = await smallestUnusedDatabasePort(dbPort + 1);\n\t\t\t}\n\t\t}\n\t}\n\tasync function deleteApp(app, prismaDevModulePathHint) {\n\t\tconst appRec = state[app];\n\t\tif (!appRec) return;\n\t\tconst entries = Object.values(appRec.databases);\n\t\tawait Promise.all(entries.map(async (db) => {\n\t\t\tconst server = runtimes.get(db.instanceName);\n\t\t\tif (server) {\n\t\t\t\tawait server.close();\n\t\t\t\truntimes.delete(db.instanceName);\n\t\t\t\treleaseAuxPorts(db.instanceName);\n\t\t\t}\n\t\t}));\n\t\tif (entries.length > 0 && prismaDevModulePathHint) {\n\t\t\tconst { deleteServer } = await importPrismaDevInternalState(prismaDevModulePathHint);\n\t\t\tawait Promise.all(entries.map((db) => deleteServer(db.instanceName)));\n\t\t}\n\t\tdelete state[app];\n\t\tschedulePersist();\n\t}\n\tfunction json(res, status, body) {\n\t\tres.writeHead(status, { \"content-type\": \"application/json\" });\n\t\tres.end(JSON.stringify(body));\n\t}\n\tfunction text(res, status, body) {\n\t\tres.writeHead(status, { \"content-type\": \"text/plain; charset=utf-8\" });\n\t\tres.end(body);\n\t}\n\tfunction badSegment(res, segment) {\n\t\ttext(res, 400, `invalid path segment \"${segment}\": must match /^[a-z0-9][a-z0-9-]*$/ and be at most 63 characters`);\n\t}\n\tfunction databaseView(db) {\n\t\treturn {\n\t\t\tid: db.id,\n\t\t\turl: db.url,\n\t\t\tinstanceName: db.instanceName,\n\t\t\tdatabasePort: db.databasePort\n\t\t};\n\t}\n\t/** The most recently observed `prismaDevModulePath` for any database of `app` — DELETE has no body of its own to carry one. */\n\tconst recentPrismaDevModulePath = /* @__PURE__ */ new Map();\n\tfunction lastKnownPrismaDevModulePath(app) {\n\t\treturn recentPrismaDevModulePath.get(app);\n\t}\n\tasync function handleRequest(req, res) {\n\t\tconst url = new URL(req.url ?? \"/\", `http://127.0.0.1:${String(port)}`);\n\t\tconst method = req.method ?? \"GET\";\n\t\tconst segments = url.pathname.split(\"/\").filter((s) => s.length > 0).map((s) => decodeURIComponent(s));\n\t\tif (method === \"GET\" && segments.length === 1 && segments[0] === \"health\") return json(res, 200, { version: ownVersion });\n\t\tif (segments[0] === \"apps\" && segments.length >= 2) {\n\t\t\tconst app = segments[1];\n\t\t\tif (app === void 0 || !isValidSegment(app)) return badSegment(res, app ?? \"\");\n\t\t\tif (method === \"PUT\" && segments.length === 4 && segments[2] === \"databases\") {\n\t\t\t\tconst id = segments[3];\n\t\t\t\tif (id === void 0 || !isValidSegment(id)) return badSegment(res, id ?? \"\");\n\t\t\t\tconst raw = await readBody(req);\n\t\t\t\tlet parsed;\n\t\t\t\ttry {\n\t\t\t\t\tparsed = JSON.parse(raw.toString(\"utf8\"));\n\t\t\t\t} catch {\n\t\t\t\t\treturn text(res, 400, \"malformed JSON body\");\n\t\t\t\t}\n\t\t\t\tif (!isDatabaseBody(parsed)) return text(res, 400, \"malformed database body: expected { \\\"prismaDevModulePath\\\": string }\");\n\t\t\t\trecentPrismaDevModulePath.set(app, parsed.prismaDevModulePath);\n\t\t\t\treturn json(res, 200, await ensureDatabase(app, id, parsed.prismaDevModulePath));\n\t\t\t}\n\t\t\tif (method === \"GET\" && segments.length === 3 && segments[2] === \"databases\") {\n\t\t\t\tconst appRec = state[app];\n\t\t\t\treturn json(res, 200, appRec ? Object.values(appRec.databases).map(databaseView) : []);\n\t\t\t}\n\t\t\tif (method === \"DELETE\" && segments.length === 2) {\n\t\t\t\tawait deleteApp(app, lastKnownPrismaDevModulePath(app));\n\t\t\t\tres.writeHead(204);\n\t\t\t\tres.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tres.writeHead(404);\n\t\tres.end();\n\t}\n\tconst server = http.createServer((req, res) => {\n\t\thandleRequest(req, res).catch((err) => {\n\t\t\tif (!res.headersSent) res.writeHead(500, { \"content-type\": \"text/plain\" });\n\t\t\tres.end(err instanceof Error ? maskCredentials(err.message) : String(err));\n\t\t});\n\t});\n\tasync function shutdown() {\n\t\tawait Promise.all([...runtimes.values()].map((server) => server.close().catch(() => void 0)));\n\t\tawait stateFile.flush();\n\t\tserver.close();\n\t\tprocess.exit(0);\n\t}\n\tprocess.on(\"SIGTERM\", () => void shutdown());\n\tprocess.on(\"SIGINT\", () => void shutdown());\n\treadJsonFile(appsJsonPath, isAppsState).then((loaded) => {\n\t\tif (loaded) state = loaded;\n\t\tserver.listen(port, \"127.0.0.1\", () => {\n\t\t\tconsole.log(`[dev-emulators] postgres-main listening on 127.0.0.1:${String(port)}`);\n\t\t});\n\t}).catch((err) => {\n\t\tconsole.error(\"postgres-main: failed to load state\", err);\n\t\tprocess.exit(1);\n\t});\n}\nmain();\n//#endregion\nexport {};\n\n//# sourceMappingURL=postgres-main.mjs.map"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAS,KAAK,SAAS;CACtB,MAAM,YAAY,QAAQ,YAAY,CAAC,CAAC,QAAQ,cAAc,GAAG,CAAC,CAAC,QAAQ,UAAU,GAAG;CACxF,IAAI,QAAQ;CACZ,IAAI,MAAM,UAAU;CACpB,OAAO,QAAQ,OAAO,UAAU,WAAW,KAAK;CAChD,OAAO,MAAM,SAAS,UAAU,MAAM,OAAO,KAAK;CAClD,OAAO,UAAU,MAAM,OAAO,GAAG;AAClC;AACA,SAAS,gBAAgB,KAAK,IAAI;CACjC,OAAO,SAAS,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,MAAM,GAAG,EAAE;AACpD;;;;;;;;;;;;;;;;;;ACRA,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAC1B,MAAM,kBAAkB;;AAExB,MAAM,4BAA4B;AAClC,MAAM,wBAAwB;AAC9B,SAAS,gBAAgB,MAAM;CAC9B,OAAO,KAAK,QAAQ,+BAA+B,YAAY;AAChE;AACA,SAAS,UAAU,MAAM;CACxB,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAA,CAAM,KAAK;AAC3C;AACA,SAAS,iBAAiB,OAAO;CAChC,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,QAAQ,SAAS,OAAO,MAAM,OAAO,YAAY,kBAAkB,SAAS,OAAO,MAAM,iBAAiB,YAAY,kBAAkB,SAAS,OAAO,MAAM,iBAAiB,YAAY,SAAS,SAAS,OAAO,MAAM,QAAQ;AACzR;AACA,SAAS,YAAY,OAAO;CAC3B,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,eAAe,SAAS,OAAO,MAAM,cAAc,YAAY,MAAM,cAAc,QAAQ,OAAO,OAAO,MAAM,SAAS,CAAC,CAAC,MAAM,gBAAgB;AACvM;AACA,SAAS,YAAY,OAAO;CAC3B,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,WAAW;AAC7F;AACA,SAAS,eAAe,OAAO;CAC9B,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,yBAAyB,SAAS,OAAO,MAAM,wBAAwB;AAC9H;AACA,SAAS,kBAAkB,OAAO;CACjC,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,0BAA0B,SAAS,OAAO,MAAM,yBAAyB;AAChI;;;;;;;;;;;;;AAaA,SAAS,eAAe,KAAK,MAAM;CAClC,IAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,EAAE,UAAU,MAAM,OAAO;CACxE,OAAO,IAAI,SAAS;AACrB;;;;;;;;;;;;;AAaA,eAAe,gBAAgB,qBAAqB;CACnD,IAAI;CACJ,IAAI;EACH,MAAM,MAAM,OAAO,cAAc,mBAAmB,CAAC,CAAC;CACvD,QAAQ;EACP,MAAM,IAAI,MAAM,GAAG,sBAAsB,uBAAuB,oBAAoB,GAAG;CACxF;CACA,IAAI,CAAC,kBAAkB,GAAG,GAAG,MAAM,IAAI,MAAM,GAAG,sBAAsB,KAAK,oBAAoB,+BAA+B;CAC9H,OAAO;AACR;AACA,SAAS,oBAAoB,OAAO;CACnC,OAAO,OAAO,UAAU,YAAY,UAAU;AAC/C;AACA,SAAS,+BAA+B,OAAO;CAC9C,OAAO,oBAAoB,KAAK,KAAK,OAAO,MAAM,oBAAoB;AACvE;;;;;;;;;;AAUA,eAAe,6BAA6B,qBAAqB;CAChE,IAAI,MAAM,KAAK,QAAQ,mBAAmB;CAC1C,SAAS;EACR,MAAM,UAAU,KAAK,KAAK,KAAK,cAAc;EAC7C,IAAI,GAAG,WAAW,OAAO,GAAG;GAC3B,MAAM,MAAM,KAAK,MAAM,GAAG,aAAa,SAAS,MAAM,CAAC;GACvD,IAAI,oBAAoB,GAAG,KAAK,IAAI,YAAY,iBAAiB,oBAAoB,IAAI,UAAU,GAAG;IACrG,MAAM,QAAQ,IAAI,UAAU,CAAC;IAC7B,MAAM,SAAS,oBAAoB,KAAK;IACxC,IAAI,WAAW,KAAK,GAAG,MAAM,IAAI,MAAM,qBAAqB,IAAI,6FAA6F;IAC7J,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC;IAC/D,IAAI,+BAA+B,GAAG,GAAG,OAAO;IAChD,MAAM,IAAI,MAAM,iDAAiD,IAAI,uBAAuB;GAC7F;EACD;EACA,MAAM,SAAS,KAAK,QAAQ,GAAG;EAC/B,IAAI,WAAW,KAAK,MAAM,IAAI,MAAM,sDAAsD,oBAAoB,GAAG;EACjH,MAAM;CACP;AACD;AACA,SAAS,oBAAoB,OAAO;CACnC,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,CAAC,oBAAoB,KAAK,GAAG,OAAO,KAAK;CAC7C,MAAM,SAAS,MAAM,aAAa,MAAM,cAAc,MAAM;CAC5D,IAAI,OAAO,WAAW,UAAU,OAAO;CACvC,IAAI,oBAAoB,MAAM,GAAG;EAChC,MAAM,MAAM,OAAO;EACnB,IAAI,OAAO,QAAQ,UAAU,OAAO;CACrC;AACD;AACA,SAAS,UAAU,MAAM;CACxB,IAAI;CACJ,IAAI;CACJ,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,OAAO,UAAU,OAAO,OAAO,KAAK,IAAI,EAAE;MACpF,IAAI,KAAK,OAAO,eAAe,WAAW,KAAK,IAAI;CACxD,IAAI,SAAS,KAAK,KAAK,OAAO,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,uCAAuC;CAClG,IAAI,aAAa,KAAK,GAAG,MAAM,IAAI,MAAM,8CAA8C;CACvF,OAAO;EACN;EACA;CACD;AACD;AACA,SAAS,SAAS,KAAK;CACtB,OAAO,IAAI,SAAS,SAAS,WAAW;EACvC,MAAM,SAAS,CAAC;EAChB,IAAI,GAAG,SAAS,UAAU,OAAO,KAAK,KAAK,CAAC;EAC5C,IAAI,GAAG,aAAa,QAAQ,OAAO,OAAO,MAAM,CAAC,CAAC;EAClD,IAAI,GAAG,SAAS,MAAM;CACvB,CAAC;AACF;AACA,SAAS,OAAO;CACf,MAAM,EAAE,MAAM,aAAa,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC;CAC1D,MAAM,aAAa,eAAe;CAClC,MAAM,eAAe,KAAK,KAAK,UAAU,WAAW;CACpD,MAAM,YAAY,IAAI,UAAU,cAAc,eAAe;CAC7D,IAAI,QAAQ,CAAC;CACb,MAAM,2BAA2B,IAAI,IAAI;CACzC,MAAM,+BAA+B,IAAI,IAAI;CAC7C,MAAM,qCAAqC,IAAI,IAAI;CACnD,SAAS,gBAAgB,cAAc;EACtC,KAAK,MAAM,KAAK,mBAAmB,IAAI,YAAY,KAAK,CAAC,GAAG,aAAa,OAAO,CAAC;EACjF,mBAAmB,OAAO,YAAY;CACvC;CACA,SAAS,kBAAkB;EAC1B,UAAU,MAAM,KAAK;CACtB;CACA,SAAS,eAAe,KAAK;EAC5B,IAAI,SAAS,MAAM;EACnB,IAAI,CAAC,QAAQ;GACZ,SAAS,EAAE,WAAW,CAAC,EAAE;GACzB,MAAM,OAAO;EACd;EACA,OAAO;CACR;CACA,SAAS,oBAAoB;EAC5B,MAAM,wBAAwB,IAAI,IAAI;EACtC,KAAK,MAAM,UAAU,OAAO,OAAO,KAAK,GAAG,KAAK,MAAM,MAAM,OAAO,OAAO,OAAO,SAAS,GAAG,MAAM,IAAI,GAAG,YAAY;EACtH,OAAO;CACR;CACA,eAAe,2BAA2B,KAAK;EAC9C,OAAOA,SAAQ;GACd,MAAM,YAAY,KAAK,iBAAiB;GACxC,SAAS,kBAAkB;EAC5B,CAAC;CACF;;CAEA,eAAe,iBAAiB,WAAW;EAC1C,MAAM,wBAAwB,IAAI,IAAI;GACrC,GAAG,kBAAkB;GACrB,GAAG;GACH,GAAG;EACJ,CAAC;EACD,MAAM,WAAW,MAAMA,SAAQ;GAC9B,MAAM,YAAY,mBAAmB,iBAAiB;GACtD,SAAS;EACV,CAAC;EACD,MAAM,IAAI,QAAQ;EAClB,MAAM,qBAAqB,MAAMA,SAAQ;GACxC,MAAM,YAAY,mBAAmB,iBAAiB;GACtD,SAAS;EACV,CAAC;EACD,MAAM,IAAI,kBAAkB;EAC5B,OAAO;GACN;GACA;GACA,aAAa,MAAMA,SAAQ;IAC1B,MAAM,YAAY,mBAAmB,iBAAiB;IACtD,SAAS;GACV,CAAC;EACF;CACD;CACA,eAAe,eAAe,KAAK,IAAI,qBAAqB;EAC3D,MAAM,SAAS,eAAe,GAAG;EACjC,MAAM,eAAe,gBAAgB,KAAK,EAAE;EAC5C,MAAM,iBAAiB,OAAO,UAAU;EACxC,MAAM,gBAAgB,SAAS,IAAI,YAAY;EAC/C,IAAI,kBAAkB,eAAe,OAAO,EAAE,KAAK,eAAe,IAAI;EACtE,MAAM,YAAY,MAAM,gBAAgB,mBAAmB;EAC3D,MAAM,oBAAoB,mBAAmB,KAAK;EAClD,MAAM,cAAc,oBAAoB,4BAA4B;EACpE,IAAI,SAAS,gBAAgB,gBAAgB,MAAM,2BAA2B,iBAAiB;EAC/F,KAAK,IAAI,UAAU,IAAI,WAAW;GACjC,MAAM,MAAM,MAAM,iCAAiC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;GACpE,IAAI;IACH,MAAM,SAAS,MAAM,UAAU,qBAAqB;KACnD,MAAM;KACN,cAAc;KACd,MAAM,IAAI;KACV,oBAAoB,IAAI;KACxB,aAAa,IAAI;KACjB,iBAAiB;IAClB,CAAC;IACD,MAAM,MAAM,OAAO,SAAS;IAC5B,SAAS,IAAI,cAAc,MAAM;IACjC,aAAa,IAAI,IAAI,QAAQ;IAC7B,aAAa,IAAI,IAAI,kBAAkB;IACvC,aAAa,IAAI,IAAI,WAAW;IAChC,mBAAmB,IAAI,cAAc;KACpC,IAAI;KACJ,IAAI;KACJ,IAAI;IACL,CAAC;IACD,OAAO,UAAU,MAAM;KACtB;KACA;KACA,cAAc;KACd;IACD;IACA,gBAAgB;IAChB,OAAO,EAAE,IAAI;GACd,SAAS,KAAK;IACb,IAAI,EAAE,qBAAqB,eAAe,KAAK,MAAM,KAAK,UAAU,cAAc;KACjF,MAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;KAC9D,MAAM,IAAI,MAAM,+CAA+C,aAAa,YAAY,OAAO,MAAM,EAAE,IAAI,gBAAgB,UAAU,MAAM,CAAC,GAAG;IAChJ;IACA,SAAS,MAAM,2BAA2B,SAAS,CAAC;GACrD;EACD;CACD;CACA,eAAe,UAAU,KAAK,yBAAyB;EACtD,MAAM,SAAS,MAAM;EACrB,IAAI,CAAC,QAAQ;EACb,MAAM,UAAU,OAAO,OAAO,OAAO,SAAS;EAC9C,MAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,OAAO;GAC3C,MAAM,SAAS,SAAS,IAAI,GAAG,YAAY;GAC3C,IAAI,QAAQ;IACX,MAAM,OAAO,MAAM;IACnB,SAAS,OAAO,GAAG,YAAY;IAC/B,gBAAgB,GAAG,YAAY;GAChC;EACD,CAAC,CAAC;EACF,IAAI,QAAQ,SAAS,KAAK,yBAAyB;GAClD,MAAM,EAAE,iBAAiB,MAAM,6BAA6B,uBAAuB;GACnF,MAAM,QAAQ,IAAI,QAAQ,KAAK,OAAO,aAAa,GAAG,YAAY,CAAC,CAAC;EACrE;EACA,OAAO,MAAM;EACb,gBAAgB;CACjB;CACA,SAAS,KAAK,KAAK,QAAQ,MAAM;EAChC,IAAI,UAAU,QAAQ,EAAE,gBAAgB,mBAAmB,CAAC;EAC5D,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC;CAC7B;CACA,SAAS,KAAK,KAAK,QAAQ,MAAM;EAChC,IAAI,UAAU,QAAQ,EAAE,gBAAgB,4BAA4B,CAAC;EACrE,IAAI,IAAI,IAAI;CACb;CACA,SAAS,WAAW,KAAK,SAAS;EACjC,KAAK,KAAK,KAAK,yBAAyB,QAAQ,kEAAkE;CACnH;CACA,SAAS,aAAa,IAAI;EACzB,OAAO;GACN,IAAI,GAAG;GACP,KAAK,GAAG;GACR,cAAc,GAAG;GACjB,cAAc,GAAG;EAClB;CACD;;CAEA,MAAM,4CAA4C,IAAI,IAAI;CAC1D,SAAS,6BAA6B,KAAK;EAC1C,OAAO,0BAA0B,IAAI,GAAG;CACzC;CACA,eAAe,cAAc,KAAK,KAAK;EACtC,MAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,oBAAoB,OAAO,IAAI,GAAG;EACtE,MAAM,SAAS,IAAI,UAAU;EAC7B,MAAM,WAAW,IAAI,SAAS,MAAM,GAAG,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,mBAAmB,CAAC,CAAC;EACrG,IAAI,WAAW,SAAS,SAAS,WAAW,KAAK,SAAS,OAAO,UAAU,OAAO,KAAK,KAAK,KAAK,EAAE,SAAS,WAAW,CAAC;EACxH,IAAI,SAAS,OAAO,UAAU,SAAS,UAAU,GAAG;GACnD,MAAM,MAAM,SAAS;GACrB,IAAI,QAAQ,KAAK,KAAK,CAAC,eAAe,GAAG,GAAG,OAAO,WAAW,KAAK,OAAO,EAAE;GAC5E,IAAI,WAAW,SAAS,SAAS,WAAW,KAAK,SAAS,OAAO,aAAa;IAC7E,MAAM,KAAK,SAAS;IACpB,IAAI,OAAO,KAAK,KAAK,CAAC,eAAe,EAAE,GAAG,OAAO,WAAW,KAAK,MAAM,EAAE;IACzE,MAAM,MAAM,MAAM,SAAS,GAAG;IAC9B,IAAI;IACJ,IAAI;KACH,SAAS,KAAK,MAAM,IAAI,SAAS,MAAM,CAAC;IACzC,QAAQ;KACP,OAAO,KAAK,KAAK,KAAK,qBAAqB;IAC5C;IACA,IAAI,CAAC,eAAe,MAAM,GAAG,OAAO,KAAK,KAAK,KAAK,uEAAuE;IAC1H,0BAA0B,IAAI,KAAK,OAAO,mBAAmB;IAC7D,OAAO,KAAK,KAAK,KAAK,MAAM,eAAe,KAAK,IAAI,OAAO,mBAAmB,CAAC;GAChF;GACA,IAAI,WAAW,SAAS,SAAS,WAAW,KAAK,SAAS,OAAO,aAAa;IAC7E,MAAM,SAAS,MAAM;IACrB,OAAO,KAAK,KAAK,KAAK,SAAS,OAAO,OAAO,OAAO,SAAS,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,CAAC;GACtF;GACA,IAAI,WAAW,YAAY,SAAS,WAAW,GAAG;IACjD,MAAM,UAAU,KAAK,6BAA6B,GAAG,CAAC;IACtD,IAAI,UAAU,GAAG;IACjB,IAAI,IAAI;IACR;GACD;EACD;EACA,IAAI,UAAU,GAAG;EACjB,IAAI,IAAI;CACT;CACA,MAAM,SAAS,KAAK,cAAc,KAAK,QAAQ;EAC9C,cAAc,KAAK,GAAG,CAAC,CAAC,OAAO,QAAQ;GACtC,IAAI,CAAC,IAAI,aAAa,IAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;GACzE,IAAI,IAAI,eAAe,QAAQ,gBAAgB,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC;EAC1E,CAAC;CACF,CAAC;CACD,eAAe,WAAW;EACzB,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,OAAO,MAAM,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC;EAC5F,MAAM,UAAU,MAAM;EACtB,OAAO,MAAM;EACb,QAAQ,KAAK,CAAC;CACf;CACA,QAAQ,GAAG,iBAAiB,KAAK,SAAS,CAAC;CAC3C,QAAQ,GAAG,gBAAgB,KAAK,SAAS,CAAC;CAC1C,aAAa,cAAc,WAAW,CAAC,CAAC,MAAM,WAAW;EACxD,IAAI,QAAQ,QAAQ;EACpB,OAAO,OAAO,MAAM,mBAAmB;GACtC,QAAQ,IAAI,wDAAwD,OAAO,IAAI,GAAG;EACnF,CAAC;CACF,CAAC,CAAC,CAAC,OAAO,QAAQ;EACjB,QAAQ,MAAM,uCAAuC,GAAG;EACxD,QAAQ,KAAK,CAAC;CACf,CAAC;AACF;AACA,KAAK"}
|
|
1
|
+
{"version":3,"file":"postgres-main.mjs","names":["getPort"],"sources":["../../../1-prisma-cloud/0-lowering/dev-emulators/dist/instance-name-BF6J_weL.mjs","../../../1-prisma-cloud/0-lowering/dev-emulators/dist/postgres-main.mjs"],"sourcesContent":["//#region src/instance-name.ts\n/**\n* `pcdev-<app>-<database-id>` instance-name derivation (local-dev spec § 2\n* `postgres-main.ts`): each half lowercased, every char outside `[a-z0-9]`\n* replaced by `-`, runs collapsed, the combined name trimmed to 63 chars.\n*\n* A separate, side-effect-free module (not defined inline in\n* `postgres-main.ts`) so it can be imported directly by tests without also\n* running that file's own `main()` — `postgres-main.ts` is a daemon\n* entrypoint script, always invoked as a subprocess, and calls `main()`\n* unconditionally at module load.\n*/\n/**\n* Deliberately linear, no ambiguous quantifiers: a per-character replace\n* (no `+`, so no run-length backtracking surface), a bounded-quantifier\n* collapse (`{2,}`, not alternation-with-quantifiers), and plain\n* index-walking for the leading/trailing trim instead of a regex — a\n* combined `+`-plus-alternation trim (`/^-+|-+$/g`) is exactly the shape\n* CodeQL's polynomial-ReDoS check flags, whether or not this particular\n* instance is provably safe.\n*/\nfunction slug(segment) {\n\tconst collapsed = segment.toLowerCase().replace(/[^a-z0-9]/g, \"-\").replace(/-{2,}/g, \"-\");\n\tlet start = 0;\n\tlet end = collapsed.length;\n\twhile (start < end && collapsed[start] === \"-\") start++;\n\twhile (end > start && collapsed[end - 1] === \"-\") end--;\n\treturn collapsed.slice(start, end);\n}\nfunction instanceNameFor(app, id) {\n\treturn `pcdev-${slug(app)}-${slug(id)}`.slice(0, 63);\n}\n//#endregion\nexport { slug as n, instanceNameFor as t };\n\n//# sourceMappingURL=instance-name-BF6J_weL.mjs.map","import { c as readOwnVersion, f as StateFile, p as readJsonFile, t as isValidSegment } from \"./segments-NpKN-46R.mjs\";\nimport { t as instanceNameFor } from \"./instance-name-BF6J_weL.mjs\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport getPort, { portNumbers } from \"get-port\";\nimport * as http from \"node:http\";\n//#region src/postgres-main.ts\n/**\n* The Postgres emulator daemon (local-dev spec § 2 `postgres-main.ts`): a\n* small local counterpart of hosted Postgres, hosting `@prisma/dev`'s\n* `startPrismaDevServer()` — one named, persistent server per `Database`\n* resource, several servers in this one daemon process. Loopback\n* `node:http` JSON admin API; state under its `--state-dir`.\n*\n* `@prisma/dev` is imported dynamically from a CALLER-RESOLVED path (each\n* admin request that needs it carries `prismaDevModulePath`) so the app\n* owns its own Prisma version — this daemon has no `@prisma/dev` dependency\n* of its own.\n*\n* Runs as its own OS process, started by `daemon.ts`'s `ensureDaemon` via\n* `process.execPath <this file> --port <n> --state-dir <dir>`.\n*/\nconst MIN_DATABASE_PORT = 51300;\nconst MAX_DATABASE_PORT = 65535;\nconst APPS_STATE_MODE = 384;\n/** Spec § 2 step 5's pattern, applied to a fresh database-port allocation. */\nconst MAX_FRESH_PORT_CANDIDATES = 5;\nconst NOT_INSTALLED_MESSAGE = \"local dev needs @prisma/dev for its local Postgres emulator — add \\\"prisma\\\" to your app's devDependencies.\";\nfunction maskCredentials(text) {\n\treturn text.replace(/:\\/\\/([^:@/\\s]+):[^@/\\s]+@/g, \"://$1:***@\");\n}\nfunction firstLine(text) {\n\treturn (text.split(\"\\n\")[0] ?? text).trim();\n}\nfunction isDatabaseRecord(value) {\n\treturn typeof value === \"object\" && value !== null && \"id\" in value && typeof value.id === \"string\" && \"instanceName\" in value && typeof value.instanceName === \"string\" && \"databasePort\" in value && typeof value.databasePort === \"number\" && \"url\" in value && typeof value.url === \"string\";\n}\nfunction isAppRecord(value) {\n\treturn typeof value === \"object\" && value !== null && \"databases\" in value && typeof value.databases === \"object\" && value.databases !== null && Object.values(value.databases).every(isDatabaseRecord);\n}\nfunction isAppsState(value) {\n\treturn typeof value === \"object\" && value !== null && Object.values(value).every(isAppRecord);\n}\nfunction isDatabaseBody(value) {\n\treturn typeof value === \"object\" && value !== null && \"prismaDevModulePath\" in value && typeof value.prismaDevModulePath === \"string\";\n}\nfunction isPrismaDevModule(value) {\n\treturn typeof value === \"object\" && value !== null && \"startPrismaDevServer\" in value && typeof value.startPrismaDevServer === \"function\";\n}\n/**\n* `@prisma/dev` exports a `PortNotAvailableError` class with a `readonly\n* port: number`, but the daemon dynamically imports the module from a\n* caller-given path while the class identity checked here would come from\n* whatever module graph THIS file's own bundle produced — two separate\n* instantiations of the same logical class, so `instanceof` doesn't match\n* across them (confirmed empirically: a real port conflict's `err\n* instanceof mod.PortNotAvailableError` is `false` even though the error IS\n* the port-conflict one). Duck-typing the documented shape — a `port`\n* number matching the candidate we just tried — is what actually survives\n* that boundary.\n*/\n/**\n* The port a start refusal is about, when it is one of THIS attempt's ports.\n* Duck-typed (`instanceof` fails across the dynamic-import boundary): every\n* `@prisma/dev` port refusal — not-available, requested-twice, and\n* belongs-to-another-server (its registry can claim a port no bind probe\n* sees) — carries the offending port as `.port`, and any of the four ports\n* we requested (database + the three aux listeners) can be the one refused.\n*/\nfunction portConflictOf(err, ports) {\n\tif (typeof err !== \"object\" || err === null || !(\"port\" in err)) return void 0;\n\tconst port = err.port;\n\treturn typeof port === \"number\" && ports.includes(port) ? port : void 0;\n}\nfunction isPrismaDevServer(value) {\n\tif (!isStringKeyedRecord(value) || typeof value[\"close\"] !== \"function\") return false;\n\tconst database = value[\"database\"];\n\treturn isStringKeyedRecord(database) && typeof database[\"connectionString\"] === \"string\";\n}\n/**\n* The live server behind a \"name is already running\" refusal, when there is\n* one. A start that fails mid-boot (e.g. on a port another server's\n* registry claims) can leave its state entry behind, so OUR OWN next\n* attempt for the same name is refused. `@prisma/dev`'s\n* `ServerAlreadyRunningError` carries the running server as a `.server`\n* getter (duck-typed — `instanceof` fails across the dynamic-import\n* boundary); its parent class (state entry exists but nothing actually\n* runs) has no such getter, and a dead ghost resolves to null — both mean\n* \"nothing to adopt\".\n*/\nasync function adoptableServerOf(err) {\n\tif (!isStringKeyedRecord(err) || !(\"server\" in err)) return void 0;\n\tif (err[\"name\"] !== \"ServerAlreadyRunningError\") return void 0;\n\ttry {\n\t\tconst server = await err[\"server\"];\n\t\treturn isPrismaDevServer(server) ? server : void 0;\n\t} catch {\n\t\treturn;\n\t}\n}\nfunction isNameAlreadyTaken(err) {\n\treturn isStringKeyedRecord(err) && (err[\"name\"] === \"ServerAlreadyRunningError\" || err[\"name\"] === \"ServerStateAlreadyExistsError\");\n}\n/** The port of a postgres connection URL, when it parses as one. */\nfunction databasePortOf(connectionString) {\n\ttry {\n\t\tconst port = Number(new URL(connectionString).port);\n\t\treturn Number.isInteger(port) && port > 0 ? port : void 0;\n\t} catch {\n\t\treturn;\n\t}\n}\n/**\n* A dynamic `import()` failure's own message routinely names a SECOND path\n* (e.g. bun's \"Cannot find module '<target>' from '<importer>'\") — the\n* importer half is this daemon's own internal location, not anything the\n* caller gave us, and has no business in a response body. Rather than try\n* to scrub an arbitrary underlying message for every runtime's own error\n* phrasing, the resolution-failure case names only what the caller\n* supplied — the pinned message plus the given `prismaDevModulePath`, and\n* nothing else. (A DIFFERENT case — a module that resolves fine but whose\n* `startPrismaDevServer()` call itself fails — still surfaces its\n* underlying text verbatim, credential-masked, per spec § 2.)\n*/\nasync function importPrismaDev(prismaDevModulePath) {\n\tlet mod;\n\ttry {\n\t\tmod = await import(pathToFileURL(prismaDevModulePath).href);\n\t} catch {\n\t\tthrow new Error(`${NOT_INSTALLED_MESSAGE} (could not resolve \"${prismaDevModulePath}\")`);\n\t}\n\tif (!isPrismaDevModule(mod)) throw new Error(`${NOT_INSTALLED_MESSAGE} (\"${prismaDevModulePath}\" is not a @prisma/dev module)`);\n\treturn mod;\n}\nfunction isStringKeyedRecord(value) {\n\treturn typeof value === \"object\" && value !== null;\n}\nfunction isPrismaDevInternalStateModule(value) {\n\treturn isStringKeyedRecord(value) && typeof value[\"deleteServer\"] === \"function\";\n}\n/**\n* `@prisma/dev`'s own package.json declares `./internal/state`, whose\n* `deleteServer(name)` actually removes a stateful server's persisted PGlite\n* data — `startPrismaDevServer`'s public surface only starts/closes a live\n* server, never deletes what a closed one left on disk. Resolved by reading\n* the SAME package's own `exports` map (walked up from the caller-given\n* entry path to find `@prisma/dev`'s `package.json`), never by guessing at\n* `dist/` file layout.\n*/\nasync function importPrismaDevInternalState(prismaDevModulePath) {\n\tlet dir = path.dirname(prismaDevModulePath);\n\tfor (;;) {\n\t\tconst pkgPath = path.join(dir, \"package.json\");\n\t\tif (fs.existsSync(pkgPath)) {\n\t\t\tconst pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"));\n\t\t\tif (isStringKeyedRecord(pkg) && pkg[\"name\"] === \"@prisma/dev\" && isStringKeyedRecord(pkg[\"exports\"])) {\n\t\t\t\tconst entry = pkg[\"exports\"][\"./internal/state\"];\n\t\t\t\tconst target = resolveExportTarget(entry);\n\t\t\t\tif (target === void 0) throw new Error(`\"@prisma/dev\" at \"${dir}\" does not declare an \"./internal/state\" export — cannot delete its persisted database data.`);\n\t\t\t\tconst mod = await import(pathToFileURL(path.join(dir, target)).href);\n\t\t\t\tif (isPrismaDevInternalStateModule(mod)) return mod;\n\t\t\t\tthrow new Error(`\"@prisma/dev\"'s \"./internal/state\" export at \"${dir}\" has no deleteServer.`);\n\t\t\t}\n\t\t}\n\t\tconst parent = path.dirname(dir);\n\t\tif (parent === dir) throw new Error(`could not find \"@prisma/dev\"'s package.json above \"${prismaDevModulePath}\".`);\n\t\tdir = parent;\n\t}\n}\nfunction resolveExportTarget(entry) {\n\tif (typeof entry === \"string\") return entry;\n\tif (!isStringKeyedRecord(entry)) return void 0;\n\tconst nested = entry[\"import\"] ?? entry[\"require\"] ?? entry[\"default\"];\n\tif (typeof nested === \"string\") return nested;\n\tif (isStringKeyedRecord(nested)) {\n\t\tconst def = nested[\"default\"];\n\t\tif (typeof def === \"string\") return def;\n\t}\n}\nfunction parseArgs(argv) {\n\tlet port;\n\tlet stateDir;\n\tfor (let i = 0; i < argv.length; i++) if (argv[i] === \"--port\") port = Number(argv[i + 1]);\n\telse if (argv[i] === \"--state-dir\") stateDir = argv[i + 1];\n\tif (port === void 0 || Number.isNaN(port)) throw new Error(\"postgres-main: --port <n> is required\");\n\tif (stateDir === void 0) throw new Error(\"postgres-main: --state-dir <dir> is required\");\n\treturn {\n\t\tport,\n\t\tstateDir\n\t};\n}\nfunction readBody(req) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks = [];\n\t\treq.on(\"data\", (chunk) => chunks.push(chunk));\n\t\treq.on(\"end\", () => resolve(Buffer.concat(chunks)));\n\t\treq.on(\"error\", reject);\n\t});\n}\nfunction main() {\n\tconst { port, stateDir } = parseArgs(process.argv.slice(2));\n\tconst ownVersion = readOwnVersion();\n\tconst appsJsonPath = path.join(stateDir, \"apps.json\");\n\tconst stateFile = new StateFile(appsJsonPath, APPS_STATE_MODE);\n\tlet state = {};\n\tconst runtimes = /* @__PURE__ */ new Map();\n\tconst liveAuxPorts = /* @__PURE__ */ new Set();\n\tconst auxPortsByInstance = /* @__PURE__ */ new Map();\n\tfunction releaseAuxPorts(instanceName) {\n\t\tfor (const p of auxPortsByInstance.get(instanceName) ?? []) liveAuxPorts.delete(p);\n\t\tauxPortsByInstance.delete(instanceName);\n\t}\n\tfunction schedulePersist() {\n\t\tstateFile.write(state);\n\t}\n\tfunction getOrCreateApp(app) {\n\t\tlet appRec = state[app];\n\t\tif (!appRec) {\n\t\t\tappRec = { databases: {} };\n\t\t\tstate[app] = appRec;\n\t\t}\n\t\treturn appRec;\n\t}\n\tfunction usedDatabasePorts() {\n\t\tconst ports = /* @__PURE__ */ new Set();\n\t\tfor (const appRec of Object.values(state)) for (const db of Object.values(appRec.databases)) ports.add(db.databasePort);\n\t\treturn ports;\n\t}\n\tasync function smallestUnusedDatabasePort(min, alsoExclude = /* @__PURE__ */ new Set()) {\n\t\treturn getPort({\n\t\t\tport: portNumbers(min, MAX_DATABASE_PORT),\n\t\t\texclude: [...usedDatabasePorts(), ...alsoExclude]\n\t\t});\n\t}\n\t/** Three fresh, mutually distinct ports for a server's own HTTP/shadow-database/streams listeners — never persisted, only unique right now. */\n\tasync function allocateAuxPorts(excluding) {\n\t\tconst taken = /* @__PURE__ */ new Set([\n\t\t\t...usedDatabasePorts(),\n\t\t\t...liveAuxPorts,\n\t\t\t...excluding\n\t\t]);\n\t\tconst httpPort = await getPort({\n\t\t\tport: portNumbers(MIN_DATABASE_PORT, MAX_DATABASE_PORT),\n\t\t\texclude: taken\n\t\t});\n\t\ttaken.add(httpPort);\n\t\tconst shadowDatabasePort = await getPort({\n\t\t\tport: portNumbers(MIN_DATABASE_PORT, MAX_DATABASE_PORT),\n\t\t\texclude: taken\n\t\t});\n\t\ttaken.add(shadowDatabasePort);\n\t\treturn {\n\t\t\thttpPort,\n\t\t\tshadowDatabasePort,\n\t\t\tstreamsPort: await getPort({\n\t\t\t\tport: portNumbers(MIN_DATABASE_PORT, MAX_DATABASE_PORT),\n\t\t\t\texclude: taken\n\t\t\t})\n\t\t};\n\t}\n\tconst inflightEnsures = /* @__PURE__ */ new Map();\n\t/** Concurrent PUTs for the same database coalesce onto one start — a second `startPrismaDevServer` for a name whose first start is still booting fails as \"already running\". */\n\tfunction ensureDatabase(app, id, prismaDevModulePath) {\n\t\tconst instanceName = instanceNameFor(app, id);\n\t\tconst inflight = inflightEnsures.get(instanceName);\n\t\tif (inflight) return inflight;\n\t\tconst run = ensureDatabaseSerialized(app, id, prismaDevModulePath, instanceName).finally(() => {\n\t\t\tinflightEnsures.delete(instanceName);\n\t\t});\n\t\tinflightEnsures.set(instanceName, run);\n\t\treturn run;\n\t}\n\tasync function ensureDatabaseSerialized(app, id, prismaDevModulePath, instanceName) {\n\t\tconst appRec = getOrCreateApp(app);\n\t\tconst existingRecord = appRec.databases[id];\n\t\tconst runningServer = runtimes.get(instanceName);\n\t\tif (existingRecord && runningServer) return { url: existingRecord.url };\n\t\tconst prismaDev = await importPrismaDev(prismaDevModulePath);\n\t\tconst isFreshAllocation = existingRecord === void 0;\n\t\tlet dbPort = existingRecord?.databasePort ?? await smallestUnusedDatabasePort(MIN_DATABASE_PORT);\n\t\tconst conflicted = /* @__PURE__ */ new Set();\n\t\tfor (let attempt = 1;; attempt++) {\n\t\t\tconst aux = await allocateAuxPorts(/* @__PURE__ */ new Set([dbPort, ...conflicted]));\n\t\t\ttry {\n\t\t\t\tconst server = await prismaDev.startPrismaDevServer({\n\t\t\t\t\tname: instanceName,\n\t\t\t\t\tdatabasePort: dbPort,\n\t\t\t\t\tport: aux.httpPort,\n\t\t\t\t\tshadowDatabasePort: aux.shadowDatabasePort,\n\t\t\t\t\tstreamsPort: aux.streamsPort,\n\t\t\t\t\tpersistenceMode: \"stateful\"\n\t\t\t\t});\n\t\t\t\tconst url = server.database.connectionString;\n\t\t\t\truntimes.set(instanceName, server);\n\t\t\t\tliveAuxPorts.add(aux.httpPort);\n\t\t\t\tliveAuxPorts.add(aux.shadowDatabasePort);\n\t\t\t\tliveAuxPorts.add(aux.streamsPort);\n\t\t\t\tauxPortsByInstance.set(instanceName, [\n\t\t\t\t\taux.httpPort,\n\t\t\t\t\taux.shadowDatabasePort,\n\t\t\t\t\taux.streamsPort\n\t\t\t\t]);\n\t\t\t\tappRec.databases[id] = {\n\t\t\t\t\tid,\n\t\t\t\t\tinstanceName,\n\t\t\t\t\tdatabasePort: dbPort,\n\t\t\t\t\turl\n\t\t\t\t};\n\t\t\t\tschedulePersist();\n\t\t\t\treturn { url };\n\t\t\t} catch (err) {\n\t\t\t\tif (isNameAlreadyTaken(err)) {\n\t\t\t\t\tconst ghost = await adoptableServerOf(err);\n\t\t\t\t\tif (ghost !== void 0) {\n\t\t\t\t\t\tconst url = ghost.database.connectionString;\n\t\t\t\t\t\truntimes.set(instanceName, ghost);\n\t\t\t\t\t\tappRec.databases[id] = {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tinstanceName,\n\t\t\t\t\t\t\tdatabasePort: databasePortOf(url) ?? dbPort,\n\t\t\t\t\t\t\turl\n\t\t\t\t\t\t};\n\t\t\t\t\t\tschedulePersist();\n\t\t\t\t\t\treturn { url };\n\t\t\t\t\t}\n\t\t\t\t\tif (attempt < MAX_FRESH_PORT_CANDIDATES) {\n\t\t\t\t\t\tawait (await importPrismaDevInternalState(prismaDevModulePath)).deleteServer(instanceName);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst conflictPort = portConflictOf(err, [\n\t\t\t\t\tdbPort,\n\t\t\t\t\taux.httpPort,\n\t\t\t\t\taux.shadowDatabasePort,\n\t\t\t\t\taux.streamsPort\n\t\t\t\t]);\n\t\t\t\tif (!(conflictPort !== void 0 && attempt < MAX_FRESH_PORT_CANDIDATES && (conflictPort !== dbPort || isFreshAllocation))) {\n\t\t\t\t\tconst reason = err instanceof Error ? err.message : String(err);\n\t\t\t\t\tthrow new Error(`postgres emulator failed to start database \"${instanceName}\" on port ${String(dbPort)}: ${maskCredentials(firstLine(reason))}`);\n\t\t\t\t}\n\t\t\t\tconflicted.add(conflictPort);\n\t\t\t\tif (conflictPort === dbPort) dbPort = await smallestUnusedDatabasePort(dbPort + 1, conflicted);\n\t\t\t}\n\t\t}\n\t}\n\tasync function deleteApp(app, prismaDevModulePathHint) {\n\t\tconst appRec = state[app];\n\t\tif (!appRec) return;\n\t\tconst entries = Object.values(appRec.databases);\n\t\tfor (const db of entries) {\n\t\t\tconst server = runtimes.get(db.instanceName);\n\t\t\tif (server) {\n\t\t\t\tawait server.close().catch(() => void 0);\n\t\t\t\truntimes.delete(db.instanceName);\n\t\t\t\treleaseAuxPorts(db.instanceName);\n\t\t\t}\n\t\t}\n\t\tif (entries.length > 0 && prismaDevModulePathHint) {\n\t\t\tconst { deleteServer } = await importPrismaDevInternalState(prismaDevModulePathHint);\n\t\t\tfor (const db of entries) await deleteServer(db.instanceName);\n\t\t}\n\t\tdelete state[app];\n\t\tschedulePersist();\n\t}\n\tfunction json(res, status, body) {\n\t\tres.writeHead(status, { \"content-type\": \"application/json\" });\n\t\tres.end(JSON.stringify(body));\n\t}\n\tfunction text(res, status, body) {\n\t\tres.writeHead(status, { \"content-type\": \"text/plain; charset=utf-8\" });\n\t\tres.end(body);\n\t}\n\tfunction badSegment(res, segment) {\n\t\ttext(res, 400, `invalid path segment \"${segment}\": must match /^[a-z0-9][a-z0-9-]*$/ and be at most 63 characters`);\n\t}\n\tfunction databaseView(db) {\n\t\treturn {\n\t\t\tid: db.id,\n\t\t\turl: db.url,\n\t\t\tinstanceName: db.instanceName,\n\t\t\tdatabasePort: db.databasePort\n\t\t};\n\t}\n\t/** The most recently observed `prismaDevModulePath` for any database of `app` — DELETE has no body of its own to carry one. */\n\tconst recentPrismaDevModulePath = /* @__PURE__ */ new Map();\n\tfunction lastKnownPrismaDevModulePath(app) {\n\t\treturn recentPrismaDevModulePath.get(app);\n\t}\n\tasync function handleRequest(req, res) {\n\t\tconst url = new URL(req.url ?? \"/\", `http://127.0.0.1:${String(port)}`);\n\t\tconst method = req.method ?? \"GET\";\n\t\tconst segments = url.pathname.split(\"/\").filter((s) => s.length > 0).map((s) => decodeURIComponent(s));\n\t\tif (method === \"GET\" && segments.length === 1 && segments[0] === \"health\") return json(res, 200, { version: ownVersion });\n\t\tif (segments[0] === \"apps\" && segments.length >= 2) {\n\t\t\tconst app = segments[1];\n\t\t\tif (app === void 0 || !isValidSegment(app)) return badSegment(res, app ?? \"\");\n\t\t\tif (method === \"PUT\" && segments.length === 4 && segments[2] === \"databases\") {\n\t\t\t\tconst id = segments[3];\n\t\t\t\tif (id === void 0 || !isValidSegment(id)) return badSegment(res, id ?? \"\");\n\t\t\t\tconst raw = await readBody(req);\n\t\t\t\tlet parsed;\n\t\t\t\ttry {\n\t\t\t\t\tparsed = JSON.parse(raw.toString(\"utf8\"));\n\t\t\t\t} catch {\n\t\t\t\t\treturn text(res, 400, \"malformed JSON body\");\n\t\t\t\t}\n\t\t\t\tif (!isDatabaseBody(parsed)) return text(res, 400, \"malformed database body: expected { \\\"prismaDevModulePath\\\": string }\");\n\t\t\t\trecentPrismaDevModulePath.set(app, parsed.prismaDevModulePath);\n\t\t\t\treturn json(res, 200, await ensureDatabase(app, id, parsed.prismaDevModulePath));\n\t\t\t}\n\t\t\tif (method === \"GET\" && segments.length === 3 && segments[2] === \"databases\") {\n\t\t\t\tconst appRec = state[app];\n\t\t\t\treturn json(res, 200, appRec ? Object.values(appRec.databases).map(databaseView) : []);\n\t\t\t}\n\t\t\tif (method === \"DELETE\" && segments.length === 2) {\n\t\t\t\tawait deleteApp(app, lastKnownPrismaDevModulePath(app));\n\t\t\t\tres.writeHead(204);\n\t\t\t\tres.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tres.writeHead(404);\n\t\tres.end();\n\t}\n\tconst server = http.createServer((req, res) => {\n\t\thandleRequest(req, res).catch((err) => {\n\t\t\tif (!res.headersSent) res.writeHead(500, { \"content-type\": \"text/plain\" });\n\t\t\tres.end(err instanceof Error ? maskCredentials(err.message) : String(err));\n\t\t});\n\t});\n\tasync function shutdown() {\n\t\tfor (const server of runtimes.values()) await server.close().catch(() => void 0);\n\t\tawait stateFile.flush();\n\t\tserver.close();\n\t\tprocess.exit(0);\n\t}\n\tprocess.on(\"SIGTERM\", () => void shutdown());\n\tprocess.on(\"SIGINT\", () => void shutdown());\n\tprocess.on(\"unhandledRejection\", (reason) => {\n\t\tconsole.error(\"postgres-main: unhandled rejection from background work:\", reason instanceof Error ? maskCredentials(reason.stack ?? reason.message) : reason);\n\t});\n\tprocess.on(\"uncaughtException\", (err) => {\n\t\tconsole.error(\"postgres-main: uncaught exception from background work:\", err instanceof Error ? maskCredentials(err.stack ?? err.message) : err);\n\t});\n\treadJsonFile(appsJsonPath, isAppsState).then((loaded) => {\n\t\tif (loaded) state = loaded;\n\t\tserver.listen(port, \"127.0.0.1\", () => {\n\t\t\tconsole.log(`[dev-emulators] postgres-main listening on 127.0.0.1:${String(port)}`);\n\t\t});\n\t}).catch((err) => {\n\t\tconsole.error(\"postgres-main: failed to load state\", err);\n\t\tprocess.exit(1);\n\t});\n}\nmain();\n//#endregion\nexport {};\n\n//# sourceMappingURL=postgres-main.mjs.map"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma/composer-prisma-cloud",
|
|
3
|
-
"version": "0.2.0-dev.
|
|
3
|
+
"version": "0.2.0-dev.14",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "The Prisma Cloud target for Prisma Composer: compute(), postgres(), the target extension, and first-party modules realized on Prisma Cloud (cron).",
|
|
6
6
|
"exports": {
|
|
@@ -32,14 +32,14 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@effect/platform-bun": "4.0.0-beta.97",
|
|
34
34
|
"@effect/platform-node": "4.0.0-beta.92",
|
|
35
|
-
"@internal/dev-emulators": "0.2.0-dev.
|
|
35
|
+
"@internal/dev-emulators": "0.2.0-dev.14",
|
|
36
36
|
"@prisma-next/cli": "0.16.0",
|
|
37
37
|
"@prisma-next/config-loader": "0.16.0",
|
|
38
38
|
"@prisma-next/contract": "0.16.0",
|
|
39
39
|
"@prisma-next/migration-tools": "0.16.0",
|
|
40
40
|
"@prisma-next/postgres": "0.16.0",
|
|
41
41
|
"@prisma-next/sql-contract": "0.16.0",
|
|
42
|
-
"@prisma/composer": "0.2.0-dev.
|
|
42
|
+
"@prisma/composer": "0.2.0-dev.14",
|
|
43
43
|
"@prisma/management-api-sdk": "^1.50.0",
|
|
44
44
|
"@standard-schema/spec": "^1.1.0",
|
|
45
45
|
"alchemy": "2.0.0-beta.59",
|
|
@@ -51,20 +51,20 @@
|
|
|
51
51
|
"tsdown": "^0.22.7"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@internal/core": "0.2.0-dev.
|
|
55
|
-
"@internal/cron": "0.2.0-dev.
|
|
56
|
-
"@internal/email": "0.2.0-dev.
|
|
57
|
-
"@internal/foundation": "0.2.0-dev.
|
|
58
|
-
"@internal/local-target": "0.2.0-dev.
|
|
59
|
-
"@internal/lowering": "0.2.0-dev.
|
|
60
|
-
"@internal/nextjs": "0.2.0-dev.
|
|
61
|
-
"@internal/node": "0.2.0-dev.
|
|
62
|
-
"@internal/prisma-cloud": "0.2.0-dev.
|
|
63
|
-
"@internal/s3-protocol": "0.2.0-dev.
|
|
64
|
-
"@internal/service-rpc": "0.2.0-dev.
|
|
65
|
-
"@internal/storage": "0.2.0-dev.
|
|
66
|
-
"@internal/streams": "0.2.0-dev.
|
|
67
|
-
"@internal/tsdown-config": "0.2.0-dev.
|
|
54
|
+
"@internal/core": "0.2.0-dev.14",
|
|
55
|
+
"@internal/cron": "0.2.0-dev.14",
|
|
56
|
+
"@internal/email": "0.2.0-dev.14",
|
|
57
|
+
"@internal/foundation": "0.2.0-dev.14",
|
|
58
|
+
"@internal/local-target": "0.2.0-dev.14",
|
|
59
|
+
"@internal/lowering": "0.2.0-dev.14",
|
|
60
|
+
"@internal/nextjs": "0.2.0-dev.14",
|
|
61
|
+
"@internal/node": "0.2.0-dev.14",
|
|
62
|
+
"@internal/prisma-cloud": "0.2.0-dev.14",
|
|
63
|
+
"@internal/s3-protocol": "0.2.0-dev.14",
|
|
64
|
+
"@internal/service-rpc": "0.2.0-dev.14",
|
|
65
|
+
"@internal/storage": "0.2.0-dev.14",
|
|
66
|
+
"@internal/streams": "0.2.0-dev.14",
|
|
67
|
+
"@internal/tsdown-config": "0.2.0-dev.14",
|
|
68
68
|
"@types/node": "^25.9.3",
|
|
69
69
|
"typescript": "^6.0.3"
|
|
70
70
|
},
|