Skip to content

Commit f284345

Browse files
committed
Add short canonical lifecycle probes
1 parent e909a01 commit f284345

3 files changed

Lines changed: 32 additions & 11 deletions

File tree

packages/runtime-cloudflare/src/worker.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ async function runBootProbe(phase: string, bucket: R2Bucket): Promise<Response>
566566
}
567567
}
568568

569-
if (["canonical-current-user", "canonical-init", "canonical-site-status", "canonical-wp-loaded", "canonical-wp-loaded-callbacks", "canonical-wp-loaded-exclude-rewrite-flush", "canonical-wp-loaded-exclude-core-template-header", "canonical-wp-loaded-exclude-playground", "canonical-wp-loaded-exclude-wp-cron", "canonical-wp-loaded-exclude-all"].includes(phase)) {
569+
if (canonicalLifecyclePhaseAliases[phase] || ["canonical-current-user", "canonical-init", "canonical-site-status", "canonical-wp-loaded", "canonical-wp-loaded-callbacks", "canonical-wp-loaded-exclude-rewrite-flush", "canonical-wp-loaded-exclude-core-template-header", "canonical-wp-loaded-exclude-playground", "canonical-wp-loaded-exclude-wp-cron", "canonical-wp-loaded-exclude-all"].includes(phase)) {
570570
const runtime = await bootWordPressRuntime("do-not-attempt-installing", true, true, undefined, await packagedCanonicalMarkdownSeed(), new Uint8Array(markdownPrimaryBootstrapIndex), "https://canonical-probe.invalid", {}, bucket, true)
571571
try {
572572
const evidence = (await runtime.php.run({ code: canonicalLifecycleProbeCode(phase) })).text.trim()
@@ -1003,7 +1003,15 @@ file_put_contents($settings_path, str_replace($needle, $replacement, $settings))
10031003
require '/wordpress/wp-load.php';`
10041004
}
10051005

1006+
const canonicalLifecyclePhaseAliases: Record<string, string> = {
1007+
"canon-wpl-no-rewrite": "canonical-wp-loaded-exclude-rewrite-flush",
1008+
"canon-wpl-no-core": "canonical-wp-loaded-exclude-core-template-header",
1009+
"canon-wpl-no-playground": "canonical-wp-loaded-exclude-playground",
1010+
"canon-wpl-no-cron": "canonical-wp-loaded-exclude-wp-cron",
1011+
}
1012+
10061013
function canonicalLifecycleProbeCode(phase: string): string {
1014+
const canonicalPhase = canonicalLifecyclePhaseAliases[phase] ?? phase
10071015
const wpLoadedExclusions: Record<string, { identifiers: string[]; retain: boolean }> = {
10081016
"canonical-wp-loaded-exclude-rewrite-flush": { identifiers: ["WP_Rewrite::flush_rules", "playground_maybe_flush_rewrite_rules"], retain: false },
10091017
"canonical-wp-loaded-exclude-core-template-header": { identifiers: ["_add_template_loader_filters", "_custom_header_background_just_in_time", "_custom_logo_header_styles"], retain: false },
@@ -1020,11 +1028,11 @@ function canonicalLifecycleProbeCode(phase: string): string {
10201028
"canonical-wp-loaded-callbacks": { needle: wpLoadedNeedle },
10211029
...Object.fromEntries(Object.keys(wpLoadedExclusions).map((name) => [name, { needle: wpLoadedNeedle }])),
10221030
}
1023-
const stop = stops[phase]
1031+
const stop = stops[canonicalPhase]
10241032
if (!stop) throw new Error(`Unknown canonical lifecycle probe phase: ${phase}`)
10251033

1026-
const wpLoadedProbe = phase === "canonical-wp-loaded-callbacks" || wpLoadedExclusions[phase]
1027-
const exclusion = wpLoadedExclusions[phase]
1034+
const wpLoadedProbe = canonicalPhase === "canonical-wp-loaded-callbacks" || wpLoadedExclusions[canonicalPhase]
1035+
const exclusion = wpLoadedExclusions[canonicalPhase]
10281036
const wpLoadedStop = !wpLoadedProbe ? "" : `function wp_codebox_canonical_wp_loaded_callback_identifier($callback) {
10291037
if (is_string($callback)) return $callback;
10301038
if ($callback instanceof Closure) return 'Closure';
@@ -1073,7 +1081,7 @@ function wp_codebox_canonical_wp_loaded_remove_snapshot($identifiers, $retain) {
10731081
return $removed;
10741082
}
10751083
$inventory = wp_codebox_canonical_wp_loaded_inventory();
1076-
${phase === "canonical-wp-loaded-callbacks" ? `echo json_encode(array('wordpressVersion' => $wp_version, 'bootstrapPhase' => '${phase}', 'callbacks' => $inventory, 'memoryBytes' => memory_get_usage(true), 'peakMemoryBytes' => memory_get_peak_usage(true)));
1084+
${canonicalPhase === "canonical-wp-loaded-callbacks" ? `echo json_encode(array('wordpressVersion' => $wp_version, 'bootstrapPhase' => '${phase}', 'callbacks' => $inventory, 'memoryBytes' => memory_get_usage(true), 'peakMemoryBytes' => memory_get_peak_usage(true)));
10771085
return;` : `$removed = wp_codebox_canonical_wp_loaded_remove_snapshot(${JSON.stringify(exclusion?.identifiers ?? [])}, ${exclusion?.retain ? "true" : "false"});
10781086
$memory_before = memory_get_usage(true);
10791087
do_action('wp_loaded');

scripts/cloudflare-local-gate.mjs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,12 @@ async function assertHealthResponse() {
171171
async function assertCanonicalProbes() {
172172
const wordpress = await (await request(`${origin}/?phase=canonical-wordpress`)).json()
173173
const setup = await (await request(`${origin}/?phase=canonical-bootstrap-setup`)).json()
174-
const lifecyclePhases = ["canonical-current-user", "canonical-init", "canonical-site-status", "canonical-wp-loaded-callbacks", "canonical-wp-loaded-exclude-rewrite-flush", "canonical-wp-loaded-exclude-core-template-header", "canonical-wp-loaded-exclude-playground", "canonical-wp-loaded-exclude-wp-cron", "canonical-wp-loaded-exclude-all"]
174+
const lifecyclePhases = ["canonical-current-user", "canonical-init", "canonical-site-status", "canonical-wp-loaded-callbacks", "canon-wpl-no-rewrite", "canon-wpl-no-core", "canon-wpl-no-playground", "canon-wpl-no-cron", "canonical-wp-loaded-exclude-all"]
175175
const expectedRemovedCallbacks = {
176-
"canonical-wp-loaded-exclude-rewrite-flush": ["WP_Rewrite::flush_rules"],
177-
"canonical-wp-loaded-exclude-core-template-header": ["_add_template_loader_filters", "_custom_header_background_just_in_time"],
178-
"canonical-wp-loaded-exclude-playground": ["playground_save_wp_env_info"],
179-
"canonical-wp-loaded-exclude-wp-cron": [],
176+
"canon-wpl-no-rewrite": ["WP_Rewrite::flush_rules"],
177+
"canon-wpl-no-core": ["_add_template_loader_filters", "_custom_header_background_just_in_time"],
178+
"canon-wpl-no-playground": ["playground_save_wp_env_info"],
179+
"canon-wpl-no-cron": [],
180180
"canonical-wp-loaded-exclude-all": ["WP_Rewrite::flush_rules", "_add_template_loader_filters", "_custom_header_background_just_in_time", "playground_save_wp_env_info"],
181181
}
182182
const lifecycle = await Promise.all(lifecyclePhases.map(async (phase) => {
@@ -197,7 +197,7 @@ async function assertCanonicalProbes() {
197197
for (const probe of lifecycle) {
198198
const evidence = probe.evidence
199199
const schedulingAttached = probe.phase === "canonical-current-user"
200-
const isWpLoadedProbe = probe.phase.startsWith("canonical-wp-loaded-")
200+
const isWpLoadedProbe = probe.phase.startsWith("canonical-wp-loaded-") || probe.phase.startsWith("canon-wpl-no-")
201201
const lifecycleEvidenceIsValid = !isWpLoadedProbe && evidence?.wpCronInitAttached === schedulingAttached && evidence?.updateScheduleInitAttached === schedulingAttached && evidence?.privacyScheduleInitAttached === schedulingAttached
202202
const wpLoadedEvidenceIsValid = isWpLoadedProbe && typeof evidence?.callbacks === "object" && evidence.callbacks !== null && !Array.isArray(evidence.callbacks) && (probe.phase === "canonical-wp-loaded-callbacks" || (evidence?.completed === true && Array.isArray(evidence?.removedCallbacks) && Number.isInteger(evidence?.memoryBeforeBytes)))
203203
if (probe.completed !== true || !lifecyclePhases.includes(probe.phase) || evidence?.bootstrapPhase !== probe.phase || typeof evidence?.wordpressVersion !== "string" || !Number.isInteger(evidence?.memoryBytes) || !Number.isInteger(evidence?.peakMemoryBytes) || (!lifecycleEvidenceIsValid && !wpLoadedEvidenceIsValid)) {

tests/cloudflare-runtime.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,12 +317,25 @@ test("Cloudflare canonical lifecycle diagnostics compose the disabled-cron patch
317317
const worker = await readFile(new URL("../packages/runtime-cloudflare/src/worker.ts", import.meta.url), "utf8")
318318
const probes = worker.slice(worker.indexOf("async function runBootProbe"), worker.indexOf("if (phase?.startsWith(\"seeded-\"))"))
319319
const lifecycle = worker.slice(worker.indexOf("function canonicalLifecycleProbeCode"), worker.indexOf("\nasync function bootWordPressRuntime"))
320+
const aliases = {
321+
"canon-wpl-no-rewrite": "canonical-wp-loaded-exclude-rewrite-flush",
322+
"canon-wpl-no-core": "canonical-wp-loaded-exclude-core-template-header",
323+
"canon-wpl-no-playground": "canonical-wp-loaded-exclude-playground",
324+
"canon-wpl-no-cron": "canonical-wp-loaded-exclude-wp-cron",
325+
}
320326

321327
for (const phase of ["canonical-current-user", "canonical-init", "canonical-site-status", "canonical-wp-loaded", "canonical-wp-loaded-callbacks", "canonical-wp-loaded-exclude-rewrite-flush", "canonical-wp-loaded-exclude-core-template-header", "canonical-wp-loaded-exclude-playground", "canonical-wp-loaded-exclude-wp-cron", "canonical-wp-loaded-exclude-all"]) {
322328
assert.match(probes, new RegExp(`"${phase}"`))
323329
assert.match(lifecycle, new RegExp(`"${phase}"`))
324330
assert.deepEqual(routeWorkerRequest(new Request(`https://worker.example/?phase=${phase}`)), { kind: "probe", phase })
325331
}
332+
for (const [alias, phase] of Object.entries(aliases)) {
333+
assert.ok(alias.length <= 24)
334+
assert.match(worker, new RegExp(`"${alias}"`))
335+
assert.match(worker, new RegExp(`"${alias}": "${phase}"`))
336+
assert.deepEqual(routeWorkerRequest(new Request(`https://worker.example/?phase=${alias}`)), { kind: "probe", phase: alias })
337+
}
338+
assert.match(lifecycle, /const canonicalPhase = canonicalLifecyclePhaseAliases\[phase\] \?\? phase/)
326339
assert.match(probes, /packagedCanonicalMarkdownSeed\(\), new Uint8Array\(markdownPrimaryBootstrapIndex\), "https:\/\/canonical-probe\.invalid", \{\}, bucket, true\)/)
327340
assert.match(lifecycle, /substr_count\(\$settings, \$needle\) !== 1/)
328341
assert.match(lifecycle, /WordPress canonical lifecycle probe needle was not uniquely found\./)

0 commit comments

Comments
 (0)