@wp-playground/cli 3.0.44 → 3.0.45
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/blueprints-v1/worker-thread-v1.d.ts +4 -0
- package/blueprints-v2/worker-thread-v2.d.ts +3 -1
- package/cli-output.d.ts +2 -0
- package/cli.cjs +1 -1
- package/cli.js +1 -1
- package/index.cjs +1 -1
- package/index.js +1 -1
- package/package.json +14 -14
- package/{run-cli-DOpShCrT.js → run-cli-BK0MGgcU.js} +230 -210
- package/run-cli-BK0MGgcU.js.map +1 -0
- package/{run-cli-le2xCSBZ.cjs → run-cli-BUDz-Yr3.cjs} +11 -11
- package/run-cli-BUDz-Yr3.cjs.map +1 -0
- package/run-cli.d.ts +2 -0
- package/sqlite-database-integration-develop.zip +0 -0
- package/worker-thread-v1.cjs +2 -2
- package/worker-thread-v1.cjs.map +1 -1
- package/worker-thread-v1.js +11 -9
- package/worker-thread-v1.js.map +1 -1
- package/worker-thread-v2.cjs +6 -6
- package/worker-thread-v2.cjs.map +1 -1
- package/worker-thread-v2.js +89 -85
- package/worker-thread-v2.js.map +1 -1
- package/run-cli-DOpShCrT.js.map +0 -1
- package/run-cli-le2xCSBZ.cjs.map +0 -1
package/worker-thread-v2.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { logger as
|
|
2
|
-
import { createNodeFsMountHandler as
|
|
3
|
-
import { EmscriptenDownloadMonitor as
|
|
4
|
-
import { exposeAPI as
|
|
5
|
-
import { sprintf as
|
|
6
|
-
import { runBlueprintV2 as
|
|
7
|
-
import { bootRequestHandler as
|
|
8
|
-
import { existsSync as
|
|
9
|
-
import
|
|
10
|
-
import { rootCertificates as
|
|
11
|
-
import { MessageChannel as
|
|
12
|
-
import { jspi as
|
|
13
|
-
import { s as
|
|
1
|
+
import { logger as $, errorLogPath as M } from "@php-wasm/logger";
|
|
2
|
+
import { createNodeFsMountHandler as T, loadNodeRuntime as S } from "@php-wasm/node";
|
|
3
|
+
import { EmscriptenDownloadMonitor as F } from "@php-wasm/progress";
|
|
4
|
+
import { exposeAPI as B, PHPWorker as _, consumeAPI as R, consumeAPISync as L, sandboxedSpawnHandlerFactory as g, PHPResponse as q, PHPExecutionFailureError as E } from "@php-wasm/universal";
|
|
5
|
+
import { sprintf as C } from "@php-wasm/util";
|
|
6
|
+
import { runBlueprintV2 as N } from "@wp-playground/blueprints";
|
|
7
|
+
import { bootRequestHandler as O } from "@wp-playground/wordpress";
|
|
8
|
+
import { existsSync as j } from "fs";
|
|
9
|
+
import W from "path";
|
|
10
|
+
import { rootCertificates as V } from "tls";
|
|
11
|
+
import { MessageChannel as D, parentPort as U } from "worker_threads";
|
|
12
|
+
import { jspi as Y } from "wasm-feature-detect";
|
|
13
|
+
import { s as z, b as K } from "./run-cli-BK0MGgcU.js";
|
|
14
14
|
async function m(s, e) {
|
|
15
15
|
for (const r of e)
|
|
16
16
|
try {
|
|
17
17
|
s.mkdir(r.vfsPath), await s.mount(
|
|
18
18
|
r.vfsPath,
|
|
19
|
-
|
|
19
|
+
T(r.hostPath)
|
|
20
20
|
);
|
|
21
21
|
} catch {
|
|
22
22
|
i.stderr(
|
|
@@ -25,11 +25,11 @@ async function m(s, e) {
|
|
|
25
25
|
), process.exit(1);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
function
|
|
28
|
+
function G(s, e, ...r) {
|
|
29
29
|
console.log(
|
|
30
30
|
performance.now().toFixed(6).padStart(15, "0"),
|
|
31
31
|
s.toString().padStart(16, "0"),
|
|
32
|
-
|
|
32
|
+
C(e, ...r)
|
|
33
33
|
);
|
|
34
34
|
}
|
|
35
35
|
Object.defineProperty(process.stdout, "isTTY", { value: !0 });
|
|
@@ -37,7 +37,7 @@ Object.defineProperty(process.stderr, "isTTY", { value: !0 });
|
|
|
37
37
|
const i = {
|
|
38
38
|
lastWriteWasProgress: !1,
|
|
39
39
|
progress(s) {
|
|
40
|
-
|
|
40
|
+
K(process.stdout) && (process.stdout.isTTY ? (i.lastWriteWasProgress || process.stdout.write(`
|
|
41
41
|
`), process.stdout.write("\r\x1B[K" + s), i.lastWriteWasProgress = !0) : console.log(s));
|
|
42
42
|
},
|
|
43
43
|
stdout(s) {
|
|
@@ -53,7 +53,7 @@ const i = {
|
|
|
53
53
|
`), i.lastWriteWasProgress && (i.lastWriteWasProgress = !1), process.stderr.write(s);
|
|
54
54
|
}
|
|
55
55
|
};
|
|
56
|
-
class
|
|
56
|
+
class J extends _ {
|
|
57
57
|
constructor(e) {
|
|
58
58
|
super(void 0, e), this.booted = !1, this.blueprintTargetResolved = !1, this.phpInstancesThatNeedMountsAfterTargetResolved = /* @__PURE__ */ new Set();
|
|
59
59
|
}
|
|
@@ -67,15 +67,15 @@ class K extends F {
|
|
|
67
67
|
* @see phpwasm-emscripten-library-file-locking-for-node.js
|
|
68
68
|
*/
|
|
69
69
|
async useFileLockManager(e) {
|
|
70
|
-
await
|
|
70
|
+
await Y() ? this.fileLockManager = R(e) : this.fileLockManager = await L(e);
|
|
71
71
|
}
|
|
72
72
|
async bootAndSetUpInitialWorker(e) {
|
|
73
73
|
const r = {
|
|
74
74
|
...e.constants || {}
|
|
75
|
-
},
|
|
75
|
+
}, c = {
|
|
76
76
|
...e,
|
|
77
77
|
createFiles: {
|
|
78
|
-
"/internal/shared/ca-bundle.crt":
|
|
78
|
+
"/internal/shared/ca-bundle.crt": V.join(`
|
|
79
79
|
`)
|
|
80
80
|
},
|
|
81
81
|
constants: r,
|
|
@@ -89,14 +89,14 @@ class K extends F {
|
|
|
89
89
|
);
|
|
90
90
|
}));
|
|
91
91
|
},
|
|
92
|
-
spawnHandler: () =>
|
|
93
|
-
() =>
|
|
92
|
+
spawnHandler: () => g(
|
|
93
|
+
() => x(e, this.fileLockManager)
|
|
94
94
|
)
|
|
95
95
|
};
|
|
96
|
-
await this.bootRequestHandler(
|
|
97
|
-
const
|
|
96
|
+
await this.bootRequestHandler(c);
|
|
97
|
+
const p = this.__internal_getPHP();
|
|
98
98
|
if (e.mode === "mount-only") {
|
|
99
|
-
await m(
|
|
99
|
+
await m(p, e.mountsAfterWpInstall || []);
|
|
100
100
|
return;
|
|
101
101
|
}
|
|
102
102
|
await this.runBlueprintV2({
|
|
@@ -116,25 +116,25 @@ class K extends F {
|
|
|
116
116
|
"deny from all"
|
|
117
117
|
);
|
|
118
118
|
},
|
|
119
|
-
spawnHandler: () =>
|
|
120
|
-
() =>
|
|
119
|
+
spawnHandler: () => g(
|
|
120
|
+
() => x(e, this.fileLockManager)
|
|
121
121
|
)
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
124
|
async runBlueprintV2(e) {
|
|
125
|
-
const r = this.__internal_getRequestHandler(), { php:
|
|
125
|
+
const r = this.__internal_getRequestHandler(), { php: c, reap: p } = await r.instanceManager.acquirePHPInstance({
|
|
126
126
|
considerPrimary: !1
|
|
127
127
|
}), o = this.__internal_getPHP();
|
|
128
|
-
let
|
|
128
|
+
let u = () => {
|
|
129
129
|
};
|
|
130
130
|
if (typeof e.blueprint == "string") {
|
|
131
|
-
const n =
|
|
132
|
-
|
|
131
|
+
const n = W.resolve(process.cwd(), e.blueprint);
|
|
132
|
+
j(n) && (o.mkdir("/internal/shared/cwd"), u = await o.mount(
|
|
133
133
|
"/internal/shared/cwd",
|
|
134
|
-
|
|
135
|
-
), e.blueprint =
|
|
134
|
+
T(W.dirname(n))
|
|
135
|
+
), e.blueprint = W.join(
|
|
136
136
|
"/internal/shared/cwd",
|
|
137
|
-
|
|
137
|
+
W.basename(e.blueprint)
|
|
138
138
|
));
|
|
139
139
|
}
|
|
140
140
|
try {
|
|
@@ -150,8 +150,8 @@ class K extends F {
|
|
|
150
150
|
"allow"
|
|
151
151
|
].filter((t) => t in e).map((t) => `--${t}=${e[t]}`);
|
|
152
152
|
l.push(`--site-url=${e.siteUrl}`);
|
|
153
|
-
const d = await
|
|
154
|
-
php:
|
|
153
|
+
const d = await N({
|
|
154
|
+
php: c,
|
|
155
155
|
blueprint: e.blueprint,
|
|
156
156
|
blueprintOverrides: {
|
|
157
157
|
additionalSteps: e["additional-blueprint-steps"],
|
|
@@ -181,14 +181,14 @@ class K extends F {
|
|
|
181
181
|
break;
|
|
182
182
|
}
|
|
183
183
|
case "blueprint.error": {
|
|
184
|
-
const a = "\x1B[31m",
|
|
184
|
+
const a = "\x1B[31m", w = "\x1B[1m", f = "\x1B[0m";
|
|
185
185
|
e.verbosity === "debug" && t.details ? i.stderr(
|
|
186
|
-
`${a}${
|
|
186
|
+
`${a}${w}Fatal error:${f} Uncaught ${t.details.exception}: ${t.details.message}
|
|
187
187
|
at ${t.details.file}:${t.details.line}
|
|
188
188
|
` + (t.details.trace ? t.details.trace + `
|
|
189
189
|
` : "")
|
|
190
190
|
) : i.stderr(
|
|
191
|
-
`${a}${
|
|
191
|
+
`${a}${w}Error:${f} ${t.message}
|
|
192
192
|
`
|
|
193
193
|
);
|
|
194
194
|
break;
|
|
@@ -209,8 +209,8 @@ class K extends F {
|
|
|
209
209
|
}
|
|
210
210
|
})
|
|
211
211
|
)), await d.finished, await d.exitCode !== 0) {
|
|
212
|
-
const t = await
|
|
213
|
-
throw new
|
|
212
|
+
const t = await q.fromStreamedResponse(d);
|
|
213
|
+
throw new E(
|
|
214
214
|
`PHP.run() failed with exit code ${t.exitCode}. ${t.errors} ${t.text}`,
|
|
215
215
|
t,
|
|
216
216
|
"request"
|
|
@@ -219,45 +219,47 @@ class K extends F {
|
|
|
219
219
|
} catch (n) {
|
|
220
220
|
let l = "";
|
|
221
221
|
try {
|
|
222
|
-
l =
|
|
222
|
+
l = c.readFileAsText(M);
|
|
223
223
|
} catch {
|
|
224
224
|
}
|
|
225
225
|
throw n.phpLogs = l, n;
|
|
226
226
|
} finally {
|
|
227
|
-
|
|
227
|
+
p(), u();
|
|
228
228
|
}
|
|
229
229
|
}
|
|
230
230
|
async bootRequestHandler({
|
|
231
231
|
siteUrl: e,
|
|
232
232
|
allow: r,
|
|
233
|
-
phpVersion:
|
|
234
|
-
createFiles:
|
|
233
|
+
phpVersion: c,
|
|
234
|
+
createFiles: p,
|
|
235
235
|
constants: o,
|
|
236
|
-
phpIniEntries:
|
|
236
|
+
phpIniEntries: u,
|
|
237
237
|
firstProcessId: n,
|
|
238
238
|
processIdSpaceLength: l,
|
|
239
239
|
trace: d,
|
|
240
240
|
nativeInternalDirPath: t,
|
|
241
241
|
withIntl: a,
|
|
242
|
-
|
|
242
|
+
withRedis: w,
|
|
243
|
+
withMemcached: f,
|
|
244
|
+
withXdebug: b,
|
|
243
245
|
onPHPInstanceCreated: h,
|
|
244
|
-
spawnHandler:
|
|
246
|
+
spawnHandler: I
|
|
245
247
|
}) {
|
|
246
248
|
if (this.booted)
|
|
247
249
|
throw new Error("Playground already booted");
|
|
248
250
|
this.booted = !0;
|
|
249
|
-
let
|
|
250
|
-
const
|
|
251
|
+
let y = n;
|
|
252
|
+
const v = n + l - 1;
|
|
251
253
|
try {
|
|
252
|
-
const P = await
|
|
254
|
+
const P = await O({
|
|
253
255
|
siteUrl: e,
|
|
254
256
|
createPhpRuntime: async () => {
|
|
255
|
-
const
|
|
256
|
-
return
|
|
257
|
+
const A = y;
|
|
258
|
+
return y < v ? y++ : y = n, await S(c, {
|
|
257
259
|
emscriptenOptions: {
|
|
258
260
|
fileLockManager: this.fileLockManager,
|
|
259
|
-
processId:
|
|
260
|
-
trace: d ?
|
|
261
|
+
processId: A,
|
|
262
|
+
trace: d ? G : void 0,
|
|
261
263
|
ENV: {
|
|
262
264
|
DOCROOT: "/wordpress"
|
|
263
265
|
},
|
|
@@ -265,23 +267,25 @@ class K extends F {
|
|
|
265
267
|
},
|
|
266
268
|
followSymlinks: r?.includes("follow-symlinks"),
|
|
267
269
|
withIntl: a,
|
|
268
|
-
|
|
270
|
+
withRedis: w,
|
|
271
|
+
withMemcached: f,
|
|
272
|
+
withXdebug: b
|
|
269
273
|
});
|
|
270
274
|
},
|
|
271
275
|
maxPhpInstances: 1,
|
|
272
276
|
onPHPInstanceCreated: h,
|
|
273
277
|
sapiName: "cli",
|
|
274
|
-
createFiles:
|
|
278
|
+
createFiles: p,
|
|
275
279
|
constants: o,
|
|
276
|
-
phpIniEntries:
|
|
280
|
+
phpIniEntries: u,
|
|
277
281
|
cookieStore: !1,
|
|
278
|
-
spawnHandler:
|
|
282
|
+
spawnHandler: I
|
|
279
283
|
});
|
|
280
284
|
this.__internal_setRequestHandler(P);
|
|
281
|
-
const
|
|
282
|
-
await this.setPrimaryPHP(
|
|
285
|
+
const H = await P.getPrimaryPhp();
|
|
286
|
+
await this.setPrimaryPHP(H), Q();
|
|
283
287
|
} catch (P) {
|
|
284
|
-
throw
|
|
288
|
+
throw X(P), P;
|
|
285
289
|
}
|
|
286
290
|
}
|
|
287
291
|
// Provide a named disposal method that can be invoked via comlink.
|
|
@@ -289,43 +293,43 @@ class K extends F {
|
|
|
289
293
|
await this[Symbol.asyncDispose]();
|
|
290
294
|
}
|
|
291
295
|
}
|
|
292
|
-
async function
|
|
296
|
+
async function x({
|
|
293
297
|
siteUrl: s,
|
|
294
298
|
allow: e,
|
|
295
299
|
phpVersion: r,
|
|
296
|
-
createFiles:
|
|
297
|
-
constants:
|
|
300
|
+
createFiles: c,
|
|
301
|
+
constants: p,
|
|
298
302
|
phpIniEntries: o,
|
|
299
|
-
firstProcessId:
|
|
303
|
+
firstProcessId: u,
|
|
300
304
|
processIdSpaceLength: n,
|
|
301
305
|
trace: l,
|
|
302
306
|
nativeInternalDirPath: d,
|
|
303
307
|
withXdebug: t,
|
|
304
308
|
mountsBeforeWpInstall: a,
|
|
305
|
-
mountsAfterWpInstall:
|
|
306
|
-
},
|
|
307
|
-
const b = await
|
|
309
|
+
mountsAfterWpInstall: w
|
|
310
|
+
}, f) {
|
|
311
|
+
const b = await z("v2"), h = R(
|
|
308
312
|
b.phpPort
|
|
309
313
|
);
|
|
310
|
-
return
|
|
314
|
+
return h.useFileLockManager(f), await h.bootWorker({
|
|
311
315
|
siteUrl: s,
|
|
312
316
|
allow: e,
|
|
313
317
|
phpVersion: r,
|
|
314
|
-
createFiles:
|
|
315
|
-
constants:
|
|
318
|
+
createFiles: c,
|
|
319
|
+
constants: p,
|
|
316
320
|
phpIniEntries: o,
|
|
317
|
-
firstProcessId:
|
|
321
|
+
firstProcessId: u,
|
|
318
322
|
processIdSpaceLength: n,
|
|
319
323
|
trace: l,
|
|
320
324
|
nativeInternalDirPath: d,
|
|
321
325
|
withXdebug: t,
|
|
322
326
|
mountsBeforeWpInstall: a,
|
|
323
|
-
mountsAfterWpInstall:
|
|
327
|
+
mountsAfterWpInstall: w
|
|
324
328
|
}), {
|
|
325
|
-
php:
|
|
329
|
+
php: h,
|
|
326
330
|
reap: () => {
|
|
327
331
|
try {
|
|
328
|
-
|
|
332
|
+
h.dispose();
|
|
329
333
|
} catch {
|
|
330
334
|
}
|
|
331
335
|
try {
|
|
@@ -336,21 +340,21 @@ async function g({
|
|
|
336
340
|
};
|
|
337
341
|
}
|
|
338
342
|
process.on("unhandledRejection", (s) => {
|
|
339
|
-
|
|
343
|
+
$.error("Unhandled rejection:", s);
|
|
340
344
|
});
|
|
341
|
-
const
|
|
342
|
-
new
|
|
345
|
+
const k = new D(), [Q, X] = B(
|
|
346
|
+
new J(new F()),
|
|
343
347
|
void 0,
|
|
344
|
-
|
|
348
|
+
k.port1
|
|
345
349
|
);
|
|
346
|
-
|
|
350
|
+
U?.postMessage(
|
|
347
351
|
{
|
|
348
352
|
command: "worker-script-initialized",
|
|
349
|
-
phpPort:
|
|
353
|
+
phpPort: k.port2
|
|
350
354
|
},
|
|
351
|
-
[
|
|
355
|
+
[k.port2]
|
|
352
356
|
);
|
|
353
357
|
export {
|
|
354
|
-
|
|
358
|
+
J as PlaygroundCliBlueprintV2Worker
|
|
355
359
|
};
|
|
356
360
|
//# sourceMappingURL=worker-thread-v2.js.map
|
package/worker-thread-v2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-thread-v2.js","sources":["../../../../packages/playground/cli/src/blueprints-v2/worker-thread-v2.ts"],"sourcesContent":["import { errorLogPath, logger } from '@php-wasm/logger';\nimport type { FileLockManager } from '@php-wasm/node';\nimport { createNodeFsMountHandler, loadNodeRuntime } from '@php-wasm/node';\nimport { EmscriptenDownloadMonitor } from '@php-wasm/progress';\nimport type {\n\tPHP,\n\tFileTree,\n\tRemoteAPI,\n\tSupportedPHPVersion,\n\tSpawnHandler,\n} from '@php-wasm/universal';\nimport {\n\tPHPExecutionFailureError,\n\tPHPResponse,\n\tPHPWorker,\n\tconsumeAPI,\n\tconsumeAPISync,\n\texposeAPI,\n\tsandboxedSpawnHandlerFactory,\n} from '@php-wasm/universal';\nimport { sprintf } from '@php-wasm/util';\nimport {\n\ttype BlueprintMessage,\n\trunBlueprintV2,\n\ttype BlueprintV1Declaration,\n} from '@wp-playground/blueprints';\nimport {\n\ttype ParsedBlueprintV2String,\n\ttype RawBlueprintV2Data,\n} from '@wp-playground/blueprints';\nimport { bootRequestHandler } from '@wp-playground/wordpress';\nimport { existsSync } from 'fs';\nimport path from 'path';\nimport { rootCertificates } from 'tls';\nimport { MessageChannel, type MessagePort, parentPort } from 'worker_threads';\nimport { jspi } from 'wasm-feature-detect';\nimport { spawnWorkerThread, type RunCLIArgs } from '../run-cli';\nimport type {\n\tPhpIniOptions,\n\tPHPInstanceCreatedHook,\n} from '@wp-playground/wordpress';\nimport { shouldRenderProgress } from '../utils/progress';\nimport type { Mount } from '@php-wasm/cli-util';\n\nasync function mountResources(php: PHP, mounts: Mount[]) {\n\tfor (const mount of mounts) {\n\t\ttry {\n\t\t\tphp.mkdir(mount.vfsPath);\n\t\t\tawait php.mount(\n\t\t\t\tmount.vfsPath,\n\t\t\t\tcreateNodeFsMountHandler(mount.hostPath)\n\t\t\t);\n\t\t} catch {\n\t\t\toutput.stderr(\n\t\t\t\t`\\x1b[31m\\x1b[1mError mounting path ${mount.hostPath} at ${mount.vfsPath}\\x1b[0m\\n`\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n}\n\n/**\n * Print trace messages from PHP-WASM.\n *\n * @param {number} processId - The process ID.\n * @param {string} format - The format string.\n * @param {...any} args - The arguments.\n */\nfunction tracePhpWasm(processId: number, format: string, ...args: any[]) {\n\t// eslint-disable-next-line no-console\n\tconsole.log(\n\t\tperformance.now().toFixed(6).padStart(15, '0'),\n\t\tprocessId.toString().padStart(16, '0'),\n\t\tsprintf(format, ...args)\n\t);\n}\n\n/**\n * Force TTY status to preserve ANSI control codes in the output\n * when the environment is interactive.\n *\n * This script is spawned as `new Worker()` and process.stdout and process.stderr are\n * WritableWorkerStdio objects. By default, they strip ANSI control codes from the output\n * causing every progress bar update to be printed in a new line instead of updating the\n * same line.\n */\nObject.defineProperty(process.stdout, 'isTTY', { value: true });\nObject.defineProperty(process.stderr, 'isTTY', { value: true });\n\n/**\n * Output writer that ensures that progress bars are not printed on the same line as other output.\n */\nconst output = {\n\tlastWriteWasProgress: false,\n\tprogress(data: string) {\n\t\tif (!shouldRenderProgress(process.stdout)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!process.stdout.isTTY) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log(data);\n\t\t} else {\n\t\t\tif (!output.lastWriteWasProgress) {\n\t\t\t\tprocess.stdout.write('\\n');\n\t\t\t}\n\t\t\tprocess.stdout.write('\\r\\x1b[K' + data);\n\t\t\toutput.lastWriteWasProgress = true;\n\t\t}\n\t},\n\tstdout(data: string) {\n\t\tprocess.stdout.write('\\n\\n\\n');\n\t\tif (output.lastWriteWasProgress) {\n\t\t\toutput.lastWriteWasProgress = false;\n\t\t}\n\t\tprocess.stdout.write(data);\n\t},\n\tstderr(data: string) {\n\t\tprocess.stdout.write('\\n\\n\\n');\n\t\tif (output.lastWriteWasProgress) {\n\t\t\toutput.lastWriteWasProgress = false;\n\t\t}\n\t\tprocess.stderr.write(data);\n\t},\n};\n\nexport type PrimaryWorkerBootArgs = Omit<\n\tRunCLIArgs,\n\t'mount-before-install' | 'mount'\n> & {\n\tphpVersion: SupportedPHPVersion;\n\tsiteUrl: string;\n\tfirstProcessId: number;\n\tprocessIdSpaceLength: number;\n\ttrace: boolean;\n\tblueprint:\n\t\t| RawBlueprintV2Data\n\t\t| ParsedBlueprintV2String\n\t\t| BlueprintV1Declaration;\n\tnativeInternalDirPath: string;\n\tmountsBeforeWpInstall?: Array<Mount>;\n\tmountsAfterWpInstall?: Array<Mount>;\n\t/**\n\t * PHP constants to define via php.defineConstant().\n\t * Process-specific, set for each PHP instance.\n\t */\n\tconstants?: Record<string, string | number | boolean | null>;\n};\n\ntype WorkerRunBlueprintArgs = Omit<\n\tRunCLIArgs,\n\t'mount-before-install' | 'mount'\n> & {\n\tsiteUrl: string;\n\tblueprint:\n\t\t| RawBlueprintV2Data\n\t\t| ParsedBlueprintV2String\n\t\t| BlueprintV1Declaration;\n\tmountsAfterWpInstall?: Array<Mount>;\n};\n\nexport type SecondaryWorkerBootArgs = {\n\tsiteUrl: string;\n\tallow?: string;\n\tphpVersion: SupportedPHPVersion;\n\tphpIniEntries?: PhpIniOptions;\n\tconstants?: Record<string, string | number | boolean | null>;\n\tcreateFiles?: FileTree;\n\tfirstProcessId: number;\n\tprocessIdSpaceLength: number;\n\ttrace: boolean;\n\tnativeInternalDirPath: string;\n\twithIntl?: boolean;\n\twithXdebug?: boolean;\n\tmountsBeforeWpInstall?: Array<Mount>;\n\tmountsAfterWpInstall?: Array<Mount>;\n};\n\nexport type WorkerBootRequestHandlerOptions = Omit<\n\tSecondaryWorkerBootArgs,\n\t'mountsBeforeWpInstall' | 'mountsAfterWpInstall'\n> & {\n\tonPHPInstanceCreated: PHPInstanceCreatedHook;\n\tspawnHandler: () => SpawnHandler;\n};\n\nexport class PlaygroundCliBlueprintV2Worker extends PHPWorker {\n\tbooted = false;\n\tblueprintTargetResolved = false;\n\tphpInstancesThatNeedMountsAfterTargetResolved = new Set<PHP>();\n\tfileLockManager: RemoteAPI<FileLockManager> | FileLockManager | undefined;\n\n\tconstructor(monitor: EmscriptenDownloadMonitor) {\n\t\tsuper(undefined, monitor);\n\t}\n\n\t/**\n\t * Call this method before boot() to use file locking.\n\t *\n\t * This method is separate from boot() to simplify the related Comlink.transferHandlers\n\t * setup – if an argument is a MessagePort, we're transferring it, not copying it.\n\t *\n\t * @see comlink-sync.ts\n\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t */\n\tasync useFileLockManager(port: MessagePort) {\n\t\tif (await jspi()) {\n\t\t\t/**\n\t\t\t * If JSPI is available, php.js supports both synchronous and asynchronous locking syscalls.\n\t\t\t * Web browsers, however, only support asynchronous message passing so let's use the\n\t\t\t * asynchronous API. Every method call will return a promise.\n\t\t\t *\n\t\t\t * @see comlink-sync.ts\n\t\t\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t\t\t */\n\t\t\tthis.fileLockManager = consumeAPI<FileLockManager>(port);\n\t\t} else {\n\t\t\t/**\n\t\t\t * If JSPI is not available, php.js only supports synchronous locking syscalls.\n\t\t\t * Let's use the synchronous API. Every method call will block this thread\n\t\t\t * until the result is available.\n\t\t\t *\n\t\t\t * @see comlink-sync.ts\n\t\t\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t\t\t */\n\t\t\tthis.fileLockManager = await consumeAPISync<FileLockManager>(port);\n\t\t}\n\t}\n\n\tasync bootAndSetUpInitialWorker(args: PrimaryWorkerBootArgs) {\n\t\t// Start with CLI-provided constants (if any)\n\t\tconst constants = {\n\t\t\t...(args.constants || {}),\n\t\t};\n\t\tconst requestHandlerOptions: WorkerBootRequestHandlerOptions = {\n\t\t\t...args,\n\t\t\tcreateFiles: {\n\t\t\t\t'/internal/shared/ca-bundle.crt': rootCertificates.join('\\n'),\n\t\t\t},\n\t\t\tconstants,\n\t\t\tphpIniEntries: {\n\t\t\t\t'openssl.cafile': '/internal/shared/ca-bundle.crt',\n\t\t\t},\n\t\t\tonPHPInstanceCreated: async (php: PHP) => {\n\t\t\t\tawait mountResources(php, args.mountsBeforeWpInstall || []);\n\t\t\t\tif (this.blueprintTargetResolved) {\n\t\t\t\t\tawait mountResources(php, args.mountsAfterWpInstall || []);\n\t\t\t\t} else {\n\t\t\t\t\t// NOTE: Today (2025-09-11), during boot with a plugin auto-mount,\n\t\t\t\t\t// the Blueprint runner fails unless post-resolution mounts are\n\t\t\t\t\t// added to existing PHP instances. So we track them here so they\n\t\t\t\t\t// can be mounted at the necessary time.\n\t\t\t\t\t// Only plugin auto-mounts seem to need this, so perhaps there\n\t\t\t\t\t// is a change we can make to the Blueprint runner so such\n\t\t\t\t\t// a dance is unnecessary.\n\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.add(php);\n\t\t\t\t\tphp.addEventListener('runtime.beforeExit', () => {\n\t\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.delete(\n\t\t\t\t\t\t\tphp\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tspawnHandler: () =>\n\t\t\t\tsandboxedSpawnHandlerFactory(() =>\n\t\t\t\t\tcreatePHPWorker(args, this.fileLockManager!)\n\t\t\t\t),\n\t\t};\n\t\tawait this.bootRequestHandler(requestHandlerOptions);\n\n\t\tconst primaryPhp = this.__internal_getPHP()!;\n\n\t\tif (args.mode === 'mount-only') {\n\t\t\tawait mountResources(primaryPhp, args.mountsAfterWpInstall || []);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.runBlueprintV2({\n\t\t\t...args,\n\t\t\tmountsAfterWpInstall: args.mountsAfterWpInstall || [],\n\t\t});\n\t}\n\n\tasync bootWorker(args: SecondaryWorkerBootArgs) {\n\t\tawait this.bootRequestHandler({\n\t\t\t...args,\n\t\t\tonPHPInstanceCreated: async (php: PHP) => {\n\t\t\t\tawait mountResources(php, args.mountsBeforeWpInstall || []);\n\t\t\t\tawait mountResources(php, args.mountsAfterWpInstall || []);\n\n\t\t\t\t// Temporary workaround for LOCK_EX in sqlite-database-integration.\n\t\t\t\t// Creation of these files results in this error:\n\t\t\t\t// PHP Warning: file_put_contents(): Exclusive locks are not supported for this stream\n\t\t\t\t// in\n\t\t\t\t// /wordpress/wp-content/plugins/sqlite-database-integration/wp-includes/sqlite/class-wp-sqlite-db.php\n\t\t\t\t// on line 670\n\t\t\t\tif (!php.isDir('/wordpress/wp-content')) {\n\t\t\t\t\tphp.mkdir('/wordpress/wp-content');\n\t\t\t\t}\n\t\t\t\tif (!php.isDir('/wordpress/wp-content/database')) {\n\t\t\t\t\tphp.mkdir('/wordpress/wp-content/database');\n\t\t\t\t}\n\t\t\t\tif (!php.isFile('/wordpress/wp-content/database/.htaccess')) {\n\t\t\t\t\tphp.writeFile(\n\t\t\t\t\t\t'/wordpress/wp-content/database/.htaccess',\n\t\t\t\t\t\t'deny from all'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!php.isFile('/wordpress/wp-content/database/index.php')) {\n\t\t\t\t\tphp.writeFile(\n\t\t\t\t\t\t'/wordpress/wp-content/database/index.php',\n\t\t\t\t\t\t'deny from all'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\tspawnHandler: () =>\n\t\t\t\tsandboxedSpawnHandlerFactory(() =>\n\t\t\t\t\tcreatePHPWorker(args, this.fileLockManager!)\n\t\t\t\t),\n\t\t});\n\t}\n\n\tasync runBlueprintV2(args: WorkerRunBlueprintArgs) {\n\t\tconst requestHandler = this.__internal_getRequestHandler()!;\n\t\tconst { php, reap } =\n\t\t\tawait requestHandler.instanceManager.acquirePHPInstance({\n\t\t\t\tconsiderPrimary: false,\n\t\t\t});\n\n\t\t// Mount the current working directory to the PHP runtime for the purposes of\n\t\t// Blueprint resolution.\n\t\tconst primaryPhp = this.__internal_getPHP()!;\n\t\tlet unmountCwd = () => {};\n\t\tif (typeof args.blueprint === 'string') {\n\t\t\tconst blueprintPath = path.resolve(process.cwd(), args.blueprint);\n\t\t\tif (existsSync(blueprintPath)) {\n\t\t\t\tprimaryPhp.mkdir('/internal/shared/cwd');\n\t\t\t\tunmountCwd = await primaryPhp.mount(\n\t\t\t\t\t'/internal/shared/cwd',\n\t\t\t\t\tcreateNodeFsMountHandler(path.dirname(blueprintPath))\n\t\t\t\t);\n\t\t\t\targs.blueprint = path.join(\n\t\t\t\t\t'/internal/shared/cwd',\n\t\t\t\t\tpath.basename(args.blueprint)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst cliArgsToPass: (keyof WorkerRunBlueprintArgs)[] = [\n\t\t\t\t'mode',\n\t\t\t\t'db-engine',\n\t\t\t\t'db-host',\n\t\t\t\t'db-user',\n\t\t\t\t'db-pass',\n\t\t\t\t'db-name',\n\t\t\t\t'db-path',\n\t\t\t\t'truncate-new-site-directory',\n\t\t\t\t'allow',\n\t\t\t];\n\t\t\tconst cliArgs = cliArgsToPass\n\t\t\t\t.filter((arg) => arg in args)\n\t\t\t\t.map((arg) => `--${arg}=${args[arg]}`);\n\t\t\tcliArgs.push(`--site-url=${args.siteUrl}`);\n\n\t\t\tconst streamedResponse = await runBlueprintV2({\n\t\t\t\tphp,\n\t\t\t\tblueprint: args.blueprint,\n\t\t\t\tblueprintOverrides: {\n\t\t\t\t\tadditionalSteps: args['additional-blueprint-steps'],\n\t\t\t\t\twordpressVersion: args.wp,\n\t\t\t\t},\n\t\t\t\tcliArgs,\n\t\t\t\tonMessage: async (message: BlueprintMessage) => {\n\t\t\t\t\tswitch (message.type) {\n\t\t\t\t\t\tcase 'blueprint.target_resolved': {\n\t\t\t\t\t\t\tif (!this.blueprintTargetResolved) {\n\t\t\t\t\t\t\t\tthis.blueprintTargetResolved = true;\n\t\t\t\t\t\t\t\tfor (const php of this\n\t\t\t\t\t\t\t\t\t.phpInstancesThatNeedMountsAfterTargetResolved) {\n\t\t\t\t\t\t\t\t\t// console.log('mounting resources for php', php);\n\t\t\t\t\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.delete(\n\t\t\t\t\t\t\t\t\t\tphp\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tawait mountResources(\n\t\t\t\t\t\t\t\t\t\tphp,\n\t\t\t\t\t\t\t\t\t\targs.mountsAfterWpInstall || []\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'blueprint.progress': {\n\t\t\t\t\t\t\tconst progressMessage = `${message.caption.trim()} – ${message.progress.toFixed(\n\t\t\t\t\t\t\t\t2\n\t\t\t\t\t\t\t)}%`;\n\t\t\t\t\t\t\toutput.progress(progressMessage);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'blueprint.error': {\n\t\t\t\t\t\t\tconst red = '\\x1b[31m';\n\t\t\t\t\t\t\tconst bold = '\\x1b[1m';\n\t\t\t\t\t\t\tconst reset = '\\x1b[0m';\n\t\t\t\t\t\t\tif (args.verbosity === 'debug' && message.details) {\n\t\t\t\t\t\t\t\toutput.stderr(\n\t\t\t\t\t\t\t\t\t`${red}${bold}Fatal error:${reset} Uncaught ${message.details.exception}: ${message.details.message}\\n` +\n\t\t\t\t\t\t\t\t\t\t` at ${message.details.file}:${message.details.line}\\n` +\n\t\t\t\t\t\t\t\t\t\t(message.details.trace\n\t\t\t\t\t\t\t\t\t\t\t? message.details.trace + '\\n'\n\t\t\t\t\t\t\t\t\t\t\t: '')\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutput.stderr(\n\t\t\t\t\t\t\t\t\t`${red}${bold}Error:${reset} ${message.message}\\n`\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t\t/**\n\t\t\t * When we're debugging, every bit of information matters – let's immediately output\n\t\t\t * everything we get from the PHP output streams.\n\t\t\t */\n\t\t\tif (args.verbosity === 'debug') {\n\t\t\t\tstreamedResponse!.stdout.pipeTo(\n\t\t\t\t\tnew WritableStream({\n\t\t\t\t\t\twrite(chunk) {\n\t\t\t\t\t\t\tprocess.stdout.write(chunk);\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t\tstreamedResponse!.stderr.pipeTo(\n\t\t\t\t\tnew WritableStream({\n\t\t\t\t\t\twrite(chunk) {\n\t\t\t\t\t\t\tprocess.stderr.write(chunk);\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait streamedResponse!.finished;\n\t\t\tif ((await streamedResponse!.exitCode) !== 0) {\n\t\t\t\t// exitCode != 1 means the blueprint execution failed. Let's throw an error.\n\t\t\t\t// and clean up.\n\t\t\t\tconst syncResponse =\n\t\t\t\t\tawait PHPResponse.fromStreamedResponse(streamedResponse);\n\t\t\t\tthrow new PHPExecutionFailureError(\n\t\t\t\t\t`PHP.run() failed with exit code ${syncResponse.exitCode}. ${syncResponse.errors} ${syncResponse.text}`,\n\t\t\t\t\tsyncResponse,\n\t\t\t\t\t'request'\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Capture the PHP error log details to provide more context for debugging.\n\t\t\tlet phpLogs = '';\n\t\t\ttry {\n\t\t\t\t// @TODO: Don't assume errorLogPath starts with /wordpress/\n\t\t\t\t// ...or maybe we can assume that in Playground CLI?\n\t\t\t\tphpLogs = php.readFileAsText(errorLogPath);\n\t\t\t} catch {\n\t\t\t\t// Ignore errors reading the PHP error log.\n\t\t\t}\n\t\t\t(error as any).phpLogs = phpLogs;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\treap();\n\t\t\tunmountCwd();\n\t\t}\n\t}\n\n\tasync bootRequestHandler({\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithIntl,\n\t\twithXdebug,\n\t\tonPHPInstanceCreated,\n\t\tspawnHandler,\n\t}: WorkerBootRequestHandlerOptions) {\n\t\tif (this.booted) {\n\t\t\tthrow new Error('Playground already booted');\n\t\t}\n\t\tthis.booted = true;\n\n\t\tlet nextProcessId = firstProcessId;\n\t\tconst lastProcessId = firstProcessId + processIdSpaceLength - 1;\n\n\t\ttry {\n\t\t\tconst requestHandler = await bootRequestHandler({\n\t\t\t\tsiteUrl,\n\t\t\t\tcreatePhpRuntime: async () => {\n\t\t\t\t\tconst processId = nextProcessId;\n\n\t\t\t\t\tif (nextProcessId < lastProcessId) {\n\t\t\t\t\t\tnextProcessId++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// We've reached the end of the process ID space. Start over.\n\t\t\t\t\t\tnextProcessId = firstProcessId;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn await loadNodeRuntime(phpVersion, {\n\t\t\t\t\t\temscriptenOptions: {\n\t\t\t\t\t\t\tfileLockManager: this.fileLockManager!,\n\t\t\t\t\t\t\tprocessId,\n\t\t\t\t\t\t\ttrace: trace ? tracePhpWasm : undefined,\n\t\t\t\t\t\t\tENV: {\n\t\t\t\t\t\t\t\tDOCROOT: '/wordpress',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tphpWasmInitOptions: { nativeInternalDirPath },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfollowSymlinks: allow?.includes('follow-symlinks'),\n\t\t\t\t\t\twithIntl: withIntl,\n\t\t\t\t\t\twithXdebug,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tmaxPhpInstances: 1,\n\t\t\t\tonPHPInstanceCreated,\n\t\t\t\tsapiName: 'cli',\n\t\t\t\tcreateFiles,\n\t\t\t\tconstants,\n\t\t\t\tphpIniEntries,\n\t\t\t\tcookieStore: false,\n\t\t\t\tspawnHandler,\n\t\t\t});\n\t\t\tthis.__internal_setRequestHandler(requestHandler);\n\n\t\t\tconst primaryPhp = await requestHandler.getPrimaryPhp();\n\t\t\tawait this.setPrimaryPHP(primaryPhp);\n\n\t\t\tsetApiReady();\n\t\t} catch (e) {\n\t\t\tsetAPIError(e as Error);\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t// Provide a named disposal method that can be invoked via comlink.\n\tasync dispose() {\n\t\tawait this[Symbol.asyncDispose]();\n\t}\n}\n\n/**\n * Spawns a new PHP process to be used in the PHP spawn handler (in proc_open() etc. calls).\n * It boots from this worker-thread-v1.ts file, but is a separate process.\n *\n * We explicitly avoid using PHPProcessManager.acquirePHPInstance() here.\n *\n * Why?\n *\n * Because each PHP instance acquires actual OS-level file locks via fcntl() and LockFileEx()\n * syscalls. Running multiple PHP instances from the same OS process would allow them to\n * acquire overlapping locks. Running every PHP instance in a separate OS process ensures\n * any locks that overlap between PHP instances conflict with each other as expected.\n *\n * @param options - The options for the worker.\n * @param fileLockManager - The file lock manager to use.\n * @returns A promise that resolves to the PHP worker.\n */\nasync function createPHPWorker(\n\t{\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithXdebug,\n\t\tmountsBeforeWpInstall,\n\t\tmountsAfterWpInstall,\n\t}: SecondaryWorkerBootArgs,\n\tfileLockManager: FileLockManager | RemoteAPI<FileLockManager>\n) {\n\tconst spawnedWorker = await spawnWorkerThread('v2');\n\n\tconst handler = consumeAPI<PlaygroundCliBlueprintV2Worker>(\n\t\tspawnedWorker.phpPort\n\t);\n\thandler.useFileLockManager(fileLockManager as any);\n\tawait handler.bootWorker({\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithXdebug,\n\t\tmountsBeforeWpInstall,\n\t\tmountsAfterWpInstall,\n\t});\n\n\treturn {\n\t\tphp: handler,\n\t\treap: () => {\n\t\t\ttry {\n\t\t\t\thandler.dispose();\n\t\t\t} catch {\n\t\t\t\t/** */\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tspawnedWorker.worker.terminate();\n\t\t\t} catch {\n\t\t\t\t/** */\n\t\t\t}\n\t\t},\n\t};\n}\n\nprocess.on('unhandledRejection', (e: any) => {\n\tlogger.error('Unhandled rejection:', e);\n});\n\nconst phpChannel = new MessageChannel();\n\nconst [setApiReady, setAPIError] = exposeAPI(\n\tnew PlaygroundCliBlueprintV2Worker(new EmscriptenDownloadMonitor()),\n\tundefined,\n\tphpChannel.port1\n);\n\nparentPort?.postMessage(\n\t{\n\t\tcommand: 'worker-script-initialized',\n\t\tphpPort: phpChannel.port2,\n\t},\n\t[phpChannel.port2 as any]\n);\n"],"names":["mountResources","php","mounts","mount","createNodeFsMountHandler","output","tracePhpWasm","processId","format","args","sprintf","data","shouldRenderProgress","PlaygroundCliBlueprintV2Worker","PHPWorker","monitor","port","jspi","consumeAPI","consumeAPISync","constants","requestHandlerOptions","rootCertificates","sandboxedSpawnHandlerFactory","createPHPWorker","primaryPhp","requestHandler","reap","unmountCwd","blueprintPath","path","existsSync","cliArgs","arg","streamedResponse","runBlueprintV2","message","progressMessage","red","bold","reset","chunk","syncResponse","PHPResponse","PHPExecutionFailureError","error","phpLogs","errorLogPath","siteUrl","allow","phpVersion","createFiles","phpIniEntries","firstProcessId","processIdSpaceLength","trace","nativeInternalDirPath","withIntl","withXdebug","onPHPInstanceCreated","spawnHandler","nextProcessId","lastProcessId","bootRequestHandler","loadNodeRuntime","setApiReady","e","setAPIError","mountsBeforeWpInstall","mountsAfterWpInstall","fileLockManager","spawnedWorker","spawnWorkerThread","handler","logger","phpChannel","MessageChannel","exposeAPI","EmscriptenDownloadMonitor","parentPort"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"worker-thread-v2.js","sources":["../../../../packages/playground/cli/src/blueprints-v2/worker-thread-v2.ts"],"sourcesContent":["import { errorLogPath, logger } from '@php-wasm/logger';\nimport type { FileLockManager } from '@php-wasm/node';\nimport { createNodeFsMountHandler, loadNodeRuntime } from '@php-wasm/node';\nimport { EmscriptenDownloadMonitor } from '@php-wasm/progress';\nimport type {\n\tPHP,\n\tFileTree,\n\tRemoteAPI,\n\tSupportedPHPVersion,\n\tSpawnHandler,\n} from '@php-wasm/universal';\nimport {\n\tPHPExecutionFailureError,\n\tPHPResponse,\n\tPHPWorker,\n\tconsumeAPI,\n\tconsumeAPISync,\n\texposeAPI,\n\tsandboxedSpawnHandlerFactory,\n} from '@php-wasm/universal';\nimport { sprintf } from '@php-wasm/util';\nimport {\n\ttype BlueprintMessage,\n\trunBlueprintV2,\n\ttype BlueprintV1Declaration,\n} from '@wp-playground/blueprints';\nimport {\n\ttype ParsedBlueprintV2String,\n\ttype RawBlueprintV2Data,\n} from '@wp-playground/blueprints';\nimport { bootRequestHandler } from '@wp-playground/wordpress';\nimport { existsSync } from 'fs';\nimport path from 'path';\nimport { rootCertificates } from 'tls';\nimport { MessageChannel, type MessagePort, parentPort } from 'worker_threads';\nimport { jspi } from 'wasm-feature-detect';\nimport { spawnWorkerThread, type RunCLIArgs } from '../run-cli';\nimport type {\n\tPhpIniOptions,\n\tPHPInstanceCreatedHook,\n} from '@wp-playground/wordpress';\nimport { shouldRenderProgress } from '../utils/progress';\nimport type { Mount } from '@php-wasm/cli-util';\n\nasync function mountResources(php: PHP, mounts: Mount[]) {\n\tfor (const mount of mounts) {\n\t\ttry {\n\t\t\tphp.mkdir(mount.vfsPath);\n\t\t\tawait php.mount(\n\t\t\t\tmount.vfsPath,\n\t\t\t\tcreateNodeFsMountHandler(mount.hostPath)\n\t\t\t);\n\t\t} catch {\n\t\t\toutput.stderr(\n\t\t\t\t`\\x1b[31m\\x1b[1mError mounting path ${mount.hostPath} at ${mount.vfsPath}\\x1b[0m\\n`\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n}\n\n/**\n * Print trace messages from PHP-WASM.\n *\n * @param {number} processId - The process ID.\n * @param {string} format - The format string.\n * @param {...any} args - The arguments.\n */\nfunction tracePhpWasm(processId: number, format: string, ...args: any[]) {\n\t// eslint-disable-next-line no-console\n\tconsole.log(\n\t\tperformance.now().toFixed(6).padStart(15, '0'),\n\t\tprocessId.toString().padStart(16, '0'),\n\t\tsprintf(format, ...args)\n\t);\n}\n\n/**\n * Force TTY status to preserve ANSI control codes in the output\n * when the environment is interactive.\n *\n * This script is spawned as `new Worker()` and process.stdout and process.stderr are\n * WritableWorkerStdio objects. By default, they strip ANSI control codes from the output\n * causing every progress bar update to be printed in a new line instead of updating the\n * same line.\n */\nObject.defineProperty(process.stdout, 'isTTY', { value: true });\nObject.defineProperty(process.stderr, 'isTTY', { value: true });\n\n/**\n * Output writer that ensures that progress bars are not printed on the same line as other output.\n */\nconst output = {\n\tlastWriteWasProgress: false,\n\tprogress(data: string) {\n\t\tif (!shouldRenderProgress(process.stdout)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!process.stdout.isTTY) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log(data);\n\t\t} else {\n\t\t\tif (!output.lastWriteWasProgress) {\n\t\t\t\tprocess.stdout.write('\\n');\n\t\t\t}\n\t\t\tprocess.stdout.write('\\r\\x1b[K' + data);\n\t\t\toutput.lastWriteWasProgress = true;\n\t\t}\n\t},\n\tstdout(data: string) {\n\t\tprocess.stdout.write('\\n\\n\\n');\n\t\tif (output.lastWriteWasProgress) {\n\t\t\toutput.lastWriteWasProgress = false;\n\t\t}\n\t\tprocess.stdout.write(data);\n\t},\n\tstderr(data: string) {\n\t\tprocess.stdout.write('\\n\\n\\n');\n\t\tif (output.lastWriteWasProgress) {\n\t\t\toutput.lastWriteWasProgress = false;\n\t\t}\n\t\tprocess.stderr.write(data);\n\t},\n};\n\nexport type PrimaryWorkerBootArgs = Omit<\n\tRunCLIArgs,\n\t'mount-before-install' | 'mount'\n> & {\n\tphpVersion: SupportedPHPVersion;\n\tsiteUrl: string;\n\tfirstProcessId: number;\n\tprocessIdSpaceLength: number;\n\ttrace: boolean;\n\tblueprint:\n\t\t| RawBlueprintV2Data\n\t\t| ParsedBlueprintV2String\n\t\t| BlueprintV1Declaration;\n\tnativeInternalDirPath: string;\n\tmountsBeforeWpInstall?: Array<Mount>;\n\tmountsAfterWpInstall?: Array<Mount>;\n\t/**\n\t * PHP constants to define via php.defineConstant().\n\t * Process-specific, set for each PHP instance.\n\t */\n\tconstants?: Record<string, string | number | boolean | null>;\n};\n\ntype WorkerRunBlueprintArgs = Omit<\n\tRunCLIArgs,\n\t'mount-before-install' | 'mount'\n> & {\n\tsiteUrl: string;\n\tblueprint:\n\t\t| RawBlueprintV2Data\n\t\t| ParsedBlueprintV2String\n\t\t| BlueprintV1Declaration;\n\tmountsAfterWpInstall?: Array<Mount>;\n};\n\nexport type SecondaryWorkerBootArgs = {\n\tsiteUrl: string;\n\tallow?: string;\n\tphpVersion: SupportedPHPVersion;\n\tphpIniEntries?: PhpIniOptions;\n\tconstants?: Record<string, string | number | boolean | null>;\n\tcreateFiles?: FileTree;\n\tfirstProcessId: number;\n\tprocessIdSpaceLength: number;\n\ttrace: boolean;\n\tnativeInternalDirPath: string;\n\twithIntl?: boolean;\n\twithRedis?: boolean;\n\twithMemcached?: boolean;\n\twithXdebug?: boolean;\n\tmountsBeforeWpInstall?: Array<Mount>;\n\tmountsAfterWpInstall?: Array<Mount>;\n};\n\nexport type WorkerBootRequestHandlerOptions = Omit<\n\tSecondaryWorkerBootArgs,\n\t'mountsBeforeWpInstall' | 'mountsAfterWpInstall'\n> & {\n\tonPHPInstanceCreated: PHPInstanceCreatedHook;\n\tspawnHandler: () => SpawnHandler;\n};\n\nexport class PlaygroundCliBlueprintV2Worker extends PHPWorker {\n\tbooted = false;\n\tblueprintTargetResolved = false;\n\tphpInstancesThatNeedMountsAfterTargetResolved = new Set<PHP>();\n\tfileLockManager: RemoteAPI<FileLockManager> | FileLockManager | undefined;\n\n\tconstructor(monitor: EmscriptenDownloadMonitor) {\n\t\tsuper(undefined, monitor);\n\t}\n\n\t/**\n\t * Call this method before boot() to use file locking.\n\t *\n\t * This method is separate from boot() to simplify the related Comlink.transferHandlers\n\t * setup – if an argument is a MessagePort, we're transferring it, not copying it.\n\t *\n\t * @see comlink-sync.ts\n\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t */\n\tasync useFileLockManager(port: MessagePort) {\n\t\tif (await jspi()) {\n\t\t\t/**\n\t\t\t * If JSPI is available, php.js supports both synchronous and asynchronous locking syscalls.\n\t\t\t * Web browsers, however, only support asynchronous message passing so let's use the\n\t\t\t * asynchronous API. Every method call will return a promise.\n\t\t\t *\n\t\t\t * @see comlink-sync.ts\n\t\t\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t\t\t */\n\t\t\tthis.fileLockManager = consumeAPI<FileLockManager>(port);\n\t\t} else {\n\t\t\t/**\n\t\t\t * If JSPI is not available, php.js only supports synchronous locking syscalls.\n\t\t\t * Let's use the synchronous API. Every method call will block this thread\n\t\t\t * until the result is available.\n\t\t\t *\n\t\t\t * @see comlink-sync.ts\n\t\t\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t\t\t */\n\t\t\tthis.fileLockManager = await consumeAPISync<FileLockManager>(port);\n\t\t}\n\t}\n\n\tasync bootAndSetUpInitialWorker(args: PrimaryWorkerBootArgs) {\n\t\t// Start with CLI-provided constants (if any)\n\t\tconst constants = {\n\t\t\t...(args.constants || {}),\n\t\t};\n\t\tconst requestHandlerOptions: WorkerBootRequestHandlerOptions = {\n\t\t\t...args,\n\t\t\tcreateFiles: {\n\t\t\t\t'/internal/shared/ca-bundle.crt': rootCertificates.join('\\n'),\n\t\t\t},\n\t\t\tconstants,\n\t\t\tphpIniEntries: {\n\t\t\t\t'openssl.cafile': '/internal/shared/ca-bundle.crt',\n\t\t\t},\n\t\t\tonPHPInstanceCreated: async (php: PHP) => {\n\t\t\t\tawait mountResources(php, args.mountsBeforeWpInstall || []);\n\t\t\t\tif (this.blueprintTargetResolved) {\n\t\t\t\t\tawait mountResources(php, args.mountsAfterWpInstall || []);\n\t\t\t\t} else {\n\t\t\t\t\t// NOTE: Today (2025-09-11), during boot with a plugin auto-mount,\n\t\t\t\t\t// the Blueprint runner fails unless post-resolution mounts are\n\t\t\t\t\t// added to existing PHP instances. So we track them here so they\n\t\t\t\t\t// can be mounted at the necessary time.\n\t\t\t\t\t// Only plugin auto-mounts seem to need this, so perhaps there\n\t\t\t\t\t// is a change we can make to the Blueprint runner so such\n\t\t\t\t\t// a dance is unnecessary.\n\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.add(php);\n\t\t\t\t\tphp.addEventListener('runtime.beforeExit', () => {\n\t\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.delete(\n\t\t\t\t\t\t\tphp\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tspawnHandler: () =>\n\t\t\t\tsandboxedSpawnHandlerFactory(() =>\n\t\t\t\t\tcreatePHPWorker(args, this.fileLockManager!)\n\t\t\t\t),\n\t\t};\n\t\tawait this.bootRequestHandler(requestHandlerOptions);\n\n\t\tconst primaryPhp = this.__internal_getPHP()!;\n\n\t\tif (args.mode === 'mount-only') {\n\t\t\tawait mountResources(primaryPhp, args.mountsAfterWpInstall || []);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.runBlueprintV2({\n\t\t\t...args,\n\t\t\tmountsAfterWpInstall: args.mountsAfterWpInstall || [],\n\t\t});\n\t}\n\n\tasync bootWorker(args: SecondaryWorkerBootArgs) {\n\t\tawait this.bootRequestHandler({\n\t\t\t...args,\n\t\t\tonPHPInstanceCreated: async (php: PHP) => {\n\t\t\t\tawait mountResources(php, args.mountsBeforeWpInstall || []);\n\t\t\t\tawait mountResources(php, args.mountsAfterWpInstall || []);\n\n\t\t\t\t// Temporary workaround for LOCK_EX in sqlite-database-integration.\n\t\t\t\t// Creation of these files results in this error:\n\t\t\t\t// PHP Warning: file_put_contents(): Exclusive locks are not supported for this stream\n\t\t\t\t// in\n\t\t\t\t// /wordpress/wp-content/plugins/sqlite-database-integration/wp-includes/sqlite/class-wp-sqlite-db.php\n\t\t\t\t// on line 670\n\t\t\t\tif (!php.isDir('/wordpress/wp-content')) {\n\t\t\t\t\tphp.mkdir('/wordpress/wp-content');\n\t\t\t\t}\n\t\t\t\tif (!php.isDir('/wordpress/wp-content/database')) {\n\t\t\t\t\tphp.mkdir('/wordpress/wp-content/database');\n\t\t\t\t}\n\t\t\t\tif (!php.isFile('/wordpress/wp-content/database/.htaccess')) {\n\t\t\t\t\tphp.writeFile(\n\t\t\t\t\t\t'/wordpress/wp-content/database/.htaccess',\n\t\t\t\t\t\t'deny from all'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!php.isFile('/wordpress/wp-content/database/index.php')) {\n\t\t\t\t\tphp.writeFile(\n\t\t\t\t\t\t'/wordpress/wp-content/database/index.php',\n\t\t\t\t\t\t'deny from all'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\tspawnHandler: () =>\n\t\t\t\tsandboxedSpawnHandlerFactory(() =>\n\t\t\t\t\tcreatePHPWorker(args, this.fileLockManager!)\n\t\t\t\t),\n\t\t});\n\t}\n\n\tasync runBlueprintV2(args: WorkerRunBlueprintArgs) {\n\t\tconst requestHandler = this.__internal_getRequestHandler()!;\n\t\tconst { php, reap } =\n\t\t\tawait requestHandler.instanceManager.acquirePHPInstance({\n\t\t\t\tconsiderPrimary: false,\n\t\t\t});\n\n\t\t// Mount the current working directory to the PHP runtime for the purposes of\n\t\t// Blueprint resolution.\n\t\tconst primaryPhp = this.__internal_getPHP()!;\n\t\tlet unmountCwd = () => {};\n\t\tif (typeof args.blueprint === 'string') {\n\t\t\tconst blueprintPath = path.resolve(process.cwd(), args.blueprint);\n\t\t\tif (existsSync(blueprintPath)) {\n\t\t\t\tprimaryPhp.mkdir('/internal/shared/cwd');\n\t\t\t\tunmountCwd = await primaryPhp.mount(\n\t\t\t\t\t'/internal/shared/cwd',\n\t\t\t\t\tcreateNodeFsMountHandler(path.dirname(blueprintPath))\n\t\t\t\t);\n\t\t\t\targs.blueprint = path.join(\n\t\t\t\t\t'/internal/shared/cwd',\n\t\t\t\t\tpath.basename(args.blueprint)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst cliArgsToPass: (keyof WorkerRunBlueprintArgs)[] = [\n\t\t\t\t'mode',\n\t\t\t\t'db-engine',\n\t\t\t\t'db-host',\n\t\t\t\t'db-user',\n\t\t\t\t'db-pass',\n\t\t\t\t'db-name',\n\t\t\t\t'db-path',\n\t\t\t\t'truncate-new-site-directory',\n\t\t\t\t'allow',\n\t\t\t];\n\t\t\tconst cliArgs = cliArgsToPass\n\t\t\t\t.filter((arg) => arg in args)\n\t\t\t\t.map((arg) => `--${arg}=${args[arg]}`);\n\t\t\tcliArgs.push(`--site-url=${args.siteUrl}`);\n\n\t\t\tconst streamedResponse = await runBlueprintV2({\n\t\t\t\tphp,\n\t\t\t\tblueprint: args.blueprint,\n\t\t\t\tblueprintOverrides: {\n\t\t\t\t\tadditionalSteps: args['additional-blueprint-steps'],\n\t\t\t\t\twordpressVersion: args.wp,\n\t\t\t\t},\n\t\t\t\tcliArgs,\n\t\t\t\tonMessage: async (message: BlueprintMessage) => {\n\t\t\t\t\tswitch (message.type) {\n\t\t\t\t\t\tcase 'blueprint.target_resolved': {\n\t\t\t\t\t\t\tif (!this.blueprintTargetResolved) {\n\t\t\t\t\t\t\t\tthis.blueprintTargetResolved = true;\n\t\t\t\t\t\t\t\tfor (const php of this\n\t\t\t\t\t\t\t\t\t.phpInstancesThatNeedMountsAfterTargetResolved) {\n\t\t\t\t\t\t\t\t\t// console.log('mounting resources for php', php);\n\t\t\t\t\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.delete(\n\t\t\t\t\t\t\t\t\t\tphp\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tawait mountResources(\n\t\t\t\t\t\t\t\t\t\tphp,\n\t\t\t\t\t\t\t\t\t\targs.mountsAfterWpInstall || []\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'blueprint.progress': {\n\t\t\t\t\t\t\tconst progressMessage = `${message.caption.trim()} – ${message.progress.toFixed(\n\t\t\t\t\t\t\t\t2\n\t\t\t\t\t\t\t)}%`;\n\t\t\t\t\t\t\toutput.progress(progressMessage);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'blueprint.error': {\n\t\t\t\t\t\t\tconst red = '\\x1b[31m';\n\t\t\t\t\t\t\tconst bold = '\\x1b[1m';\n\t\t\t\t\t\t\tconst reset = '\\x1b[0m';\n\t\t\t\t\t\t\tif (args.verbosity === 'debug' && message.details) {\n\t\t\t\t\t\t\t\toutput.stderr(\n\t\t\t\t\t\t\t\t\t`${red}${bold}Fatal error:${reset} Uncaught ${message.details.exception}: ${message.details.message}\\n` +\n\t\t\t\t\t\t\t\t\t\t` at ${message.details.file}:${message.details.line}\\n` +\n\t\t\t\t\t\t\t\t\t\t(message.details.trace\n\t\t\t\t\t\t\t\t\t\t\t? message.details.trace + '\\n'\n\t\t\t\t\t\t\t\t\t\t\t: '')\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutput.stderr(\n\t\t\t\t\t\t\t\t\t`${red}${bold}Error:${reset} ${message.message}\\n`\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t\t/**\n\t\t\t * When we're debugging, every bit of information matters – let's immediately output\n\t\t\t * everything we get from the PHP output streams.\n\t\t\t */\n\t\t\tif (args.verbosity === 'debug') {\n\t\t\t\tstreamedResponse!.stdout.pipeTo(\n\t\t\t\t\tnew WritableStream({\n\t\t\t\t\t\twrite(chunk) {\n\t\t\t\t\t\t\tprocess.stdout.write(chunk);\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t\tstreamedResponse!.stderr.pipeTo(\n\t\t\t\t\tnew WritableStream({\n\t\t\t\t\t\twrite(chunk) {\n\t\t\t\t\t\t\tprocess.stderr.write(chunk);\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait streamedResponse!.finished;\n\t\t\tif ((await streamedResponse!.exitCode) !== 0) {\n\t\t\t\t// exitCode != 1 means the blueprint execution failed. Let's throw an error.\n\t\t\t\t// and clean up.\n\t\t\t\tconst syncResponse =\n\t\t\t\t\tawait PHPResponse.fromStreamedResponse(streamedResponse);\n\t\t\t\tthrow new PHPExecutionFailureError(\n\t\t\t\t\t`PHP.run() failed with exit code ${syncResponse.exitCode}. ${syncResponse.errors} ${syncResponse.text}`,\n\t\t\t\t\tsyncResponse,\n\t\t\t\t\t'request'\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Capture the PHP error log details to provide more context for debugging.\n\t\t\tlet phpLogs = '';\n\t\t\ttry {\n\t\t\t\t// @TODO: Don't assume errorLogPath starts with /wordpress/\n\t\t\t\t// ...or maybe we can assume that in Playground CLI?\n\t\t\t\tphpLogs = php.readFileAsText(errorLogPath);\n\t\t\t} catch {\n\t\t\t\t// Ignore errors reading the PHP error log.\n\t\t\t}\n\t\t\t(error as any).phpLogs = phpLogs;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\treap();\n\t\t\tunmountCwd();\n\t\t}\n\t}\n\n\tasync bootRequestHandler({\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithIntl,\n\t\twithRedis,\n\t\twithMemcached,\n\t\twithXdebug,\n\t\tonPHPInstanceCreated,\n\t\tspawnHandler,\n\t}: WorkerBootRequestHandlerOptions) {\n\t\tif (this.booted) {\n\t\t\tthrow new Error('Playground already booted');\n\t\t}\n\t\tthis.booted = true;\n\n\t\tlet nextProcessId = firstProcessId;\n\t\tconst lastProcessId = firstProcessId + processIdSpaceLength - 1;\n\n\t\ttry {\n\t\t\tconst requestHandler = await bootRequestHandler({\n\t\t\t\tsiteUrl,\n\t\t\t\tcreatePhpRuntime: async () => {\n\t\t\t\t\tconst processId = nextProcessId;\n\n\t\t\t\t\tif (nextProcessId < lastProcessId) {\n\t\t\t\t\t\tnextProcessId++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// We've reached the end of the process ID space. Start over.\n\t\t\t\t\t\tnextProcessId = firstProcessId;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn await loadNodeRuntime(phpVersion, {\n\t\t\t\t\t\temscriptenOptions: {\n\t\t\t\t\t\t\tfileLockManager: this.fileLockManager!,\n\t\t\t\t\t\t\tprocessId,\n\t\t\t\t\t\t\ttrace: trace ? tracePhpWasm : undefined,\n\t\t\t\t\t\t\tENV: {\n\t\t\t\t\t\t\t\tDOCROOT: '/wordpress',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tphpWasmInitOptions: { nativeInternalDirPath },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfollowSymlinks: allow?.includes('follow-symlinks'),\n\t\t\t\t\t\twithIntl: withIntl,\n\t\t\t\t\t\twithRedis,\n\t\t\t\t\t\twithMemcached,\n\t\t\t\t\t\twithXdebug,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tmaxPhpInstances: 1,\n\t\t\t\tonPHPInstanceCreated,\n\t\t\t\tsapiName: 'cli',\n\t\t\t\tcreateFiles,\n\t\t\t\tconstants,\n\t\t\t\tphpIniEntries,\n\t\t\t\tcookieStore: false,\n\t\t\t\tspawnHandler,\n\t\t\t});\n\t\t\tthis.__internal_setRequestHandler(requestHandler);\n\n\t\t\tconst primaryPhp = await requestHandler.getPrimaryPhp();\n\t\t\tawait this.setPrimaryPHP(primaryPhp);\n\n\t\t\tsetApiReady();\n\t\t} catch (e) {\n\t\t\tsetAPIError(e as Error);\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t// Provide a named disposal method that can be invoked via comlink.\n\tasync dispose() {\n\t\tawait this[Symbol.asyncDispose]();\n\t}\n}\n\n/**\n * Spawns a new PHP process to be used in the PHP spawn handler (in proc_open() etc. calls).\n * It boots from this worker-thread-v1.ts file, but is a separate process.\n *\n * We explicitly avoid using PHPProcessManager.acquirePHPInstance() here.\n *\n * Why?\n *\n * Because each PHP instance acquires actual OS-level file locks via fcntl() and LockFileEx()\n * syscalls. Running multiple PHP instances from the same OS process would allow them to\n * acquire overlapping locks. Running every PHP instance in a separate OS process ensures\n * any locks that overlap between PHP instances conflict with each other as expected.\n *\n * @param options - The options for the worker.\n * @param fileLockManager - The file lock manager to use.\n * @returns A promise that resolves to the PHP worker.\n */\nasync function createPHPWorker(\n\t{\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithXdebug,\n\t\tmountsBeforeWpInstall,\n\t\tmountsAfterWpInstall,\n\t}: SecondaryWorkerBootArgs,\n\tfileLockManager: FileLockManager | RemoteAPI<FileLockManager>\n) {\n\tconst spawnedWorker = await spawnWorkerThread('v2');\n\n\tconst handler = consumeAPI<PlaygroundCliBlueprintV2Worker>(\n\t\tspawnedWorker.phpPort\n\t);\n\thandler.useFileLockManager(fileLockManager as any);\n\tawait handler.bootWorker({\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithXdebug,\n\t\tmountsBeforeWpInstall,\n\t\tmountsAfterWpInstall,\n\t});\n\n\treturn {\n\t\tphp: handler,\n\t\treap: () => {\n\t\t\ttry {\n\t\t\t\thandler.dispose();\n\t\t\t} catch {\n\t\t\t\t/** */\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tspawnedWorker.worker.terminate();\n\t\t\t} catch {\n\t\t\t\t/** */\n\t\t\t}\n\t\t},\n\t};\n}\n\nprocess.on('unhandledRejection', (e: any) => {\n\tlogger.error('Unhandled rejection:', e);\n});\n\nconst phpChannel = new MessageChannel();\n\nconst [setApiReady, setAPIError] = exposeAPI(\n\tnew PlaygroundCliBlueprintV2Worker(new EmscriptenDownloadMonitor()),\n\tundefined,\n\tphpChannel.port1\n);\n\nparentPort?.postMessage(\n\t{\n\t\tcommand: 'worker-script-initialized',\n\t\tphpPort: phpChannel.port2,\n\t},\n\t[phpChannel.port2 as any]\n);\n"],"names":["mountResources","php","mounts","mount","createNodeFsMountHandler","output","tracePhpWasm","processId","format","args","sprintf","data","shouldRenderProgress","PlaygroundCliBlueprintV2Worker","PHPWorker","monitor","port","jspi","consumeAPI","consumeAPISync","constants","requestHandlerOptions","rootCertificates","sandboxedSpawnHandlerFactory","createPHPWorker","primaryPhp","requestHandler","reap","unmountCwd","blueprintPath","path","existsSync","cliArgs","arg","streamedResponse","runBlueprintV2","message","progressMessage","red","bold","reset","chunk","syncResponse","PHPResponse","PHPExecutionFailureError","error","phpLogs","errorLogPath","siteUrl","allow","phpVersion","createFiles","phpIniEntries","firstProcessId","processIdSpaceLength","trace","nativeInternalDirPath","withIntl","withRedis","withMemcached","withXdebug","onPHPInstanceCreated","spawnHandler","nextProcessId","lastProcessId","bootRequestHandler","loadNodeRuntime","setApiReady","e","setAPIError","mountsBeforeWpInstall","mountsAfterWpInstall","fileLockManager","spawnedWorker","spawnWorkerThread","handler","logger","phpChannel","MessageChannel","exposeAPI","EmscriptenDownloadMonitor","parentPort"],"mappings":"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"}
|