Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Download all WordPress assets on boot #1532

Merged
merged 31 commits into from
Jul 10, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
6d9e165
ZIP WP assets
bgrgicak Jun 20, 2024
75bc2bb
Add afterWordPressInstall hook to boot
bgrgicak Jun 21, 2024
6c2b0ad
Download assets after WordPress is installed
bgrgicak Jun 21, 2024
57daebb
Merge branch 'trunk' into add/wp-static-asset-zip
bgrgicak Jun 21, 2024
42be4fc
Use getWordPressVersionFromPhp
bgrgicak Jun 21, 2024
8beee0c
Remove bootWordPress hook
bgrgicak Jun 24, 2024
6cf5fef
Use wordPressSiteUrl
bgrgicak Jun 24, 2024
1f2347e
Stream static asset response instead of awaiting
bgrgicak Jun 24, 2024
f1e2784
Use request handler to get document root
bgrgicak Jun 24, 2024
3c98912
Add warning if assets weren't downloaded
bgrgicak Jun 25, 2024
e703eff
Merge branch 'trunk' into add/wp-static-asset-zip
bgrgicak Jun 25, 2024
2e3910c
Async fetch
bgrgicak Jun 25, 2024
d2ca9c2
Update error messages
bgrgicak Jun 25, 2024
4a1f8d0
Use wpVersionToStaticAssetsDirectory
bgrgicak Jun 25, 2024
efb4b57
Use getLoadedWordPressVersion
bgrgicak Jun 25, 2024
b2ba22b
downloadWordPressAssets on load
bgrgicak Jun 26, 2024
1aad0d0
Remove logs
bgrgicak Jun 26, 2024
db8c25f
Merge branch 'trunk' into add/wp-static-asset-zip
bgrgicak Jun 26, 2024
de206a1
Merge branch 'trunk' into add/wp-static-asset-zip
bgrgicak Jun 28, 2024
a6f20bd
Empty remote asset paths after done instead of deleting it, update co…
bgrgicak Jun 28, 2024
ebfa224
Merge branch 'trunk' into add/wp-static-asset-zip
bgrgicak Jul 1, 2024
37c0b91
Update packages/playground/remote/src/lib/worker-thread.ts
bgrgicak Jul 2, 2024
ee044ae
Linter fixes
bgrgicak Jul 2, 2024
f8dab44
Build static assets
bgrgicak Jul 2, 2024
6f48337
Use unzipFile
bgrgicak Jul 4, 2024
d34f066
Fix dependencies
bgrgicak Jul 4, 2024
1feb41a
Update static asset zips
bgrgicak Jul 4, 2024
f3fe08d
Merge branch 'trunk' into add/wp-static-asset-zip
bgrgicak Jul 4, 2024
f0378d0
Remove unused zip delete
bgrgicak Jul 10, 2024
7c205fa
Update remote asset PR comment
bgrgicak Jul 10, 2024
e03c9ad
Merge branch 'trunk' into add/wp-static-asset-zip
bgrgicak Jul 10, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 41 additions & 1 deletion packages/playground/remote/src/lib/worker-thread.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,15 @@ import transportFetch from './playground-mu-plugin/playground-includes/wp_http_f
import transportDummy from './playground-mu-plugin/playground-includes/wp_http_dummy.php?raw';
/** @ts-ignore */
import playgroundWebMuPlugin from './playground-mu-plugin/0-playground.php?raw';
import { PHPWorker } from '@php-wasm/universal';
import { PHP, PHPWorker } from '@php-wasm/universal';
import { decodeZip } from '@php-wasm/stream-compression';
import {
bootWordPress,
getLoadedWordPressVersion,
isSupportedWordPressVersion,
} from '@wp-playground/wordpress';
import { logger } from '@php-wasm/logger';
import { getWordPressVersionFromPhp } from '@wp-playground/wordpress';

const scope = Math.random().toFixed(16);

Expand Down Expand Up @@ -189,6 +191,41 @@ export class PlaygroundWorkerEndpoint extends PHPWorker {
}
}

async function downloadWordPressAssets(php: PHP) {
const wpVersion = await getWordPressVersionFromPhp(php);
fetch(`/wp-${wpVersion}/wordpress-static.zip`).then(async (response) => {
bgrgicak marked this conversation as resolved.
Show resolved Hide resolved
try {
const zipBytes = await response.arrayBuffer();
const zipStream = decodeZip(new Blob([zipBytes]).stream());
bgrgicak marked this conversation as resolved.
Show resolved Hide resolved
for await (const file of zipStream) {
const path = file.name.replace(
'wordpress-static',
'/wordpress'
);

if (file.type === 'directory' && !php.isDir(path)) {
php.mkdir(path);
} else if (!php.fileExists(path)) {
try {
php.writeFile(
path,
new Uint8Array(await file.arrayBuffer())
);
} catch (e) {
logger.warn(
'Failed to write a WordPress asset file',
path,
e
);
}
}
}
} catch (e) {
logger.warn('Failed to download WordPress assets', e);
}
});
}

const apiEndpoint = new PlaygroundWorkerEndpoint(
downloadMonitor,
scope,
Expand Down Expand Up @@ -242,6 +279,9 @@ try {
});
}
},
afterWordPressInstall(php) {
bgrgicak marked this conversation as resolved.
Show resolved Hide resolved
downloadWordPressAssets(php);
},
},
createFiles: {
'/internal/shared/mu-plugins': {
Expand Down
10 changes: 8 additions & 2 deletions packages/playground/wordpress-builds/build/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,17 @@ RUN rm -rf wordpress-static/wp-content/mu-plugins
# to request a remote asset or delegate the request for a missing file to PHP.
RUN find wordpress-static -type f | sed 's#^wordpress-static/##'> wordpress-remote-asset-paths

# Make the remote asset listing available remotely so it can be downloaded
# Make the remote asset listing available remotely so it can be downloaded
# directly in cases where an older minified WordPress build without this file
# has been saved to browser storage.
RUN cp wordpress-remote-asset-paths wordpress-static/

# ZIP the static files
RUN zip -r wordpress-static.zip wordpress-static/
bgrgicak marked this conversation as resolved.
Show resolved Hide resolved

# Move ZIP to the public output directory
RUN cp wordpress-static.zip wordpress-static/

# Move the static files to the final output directory
RUN mkdir /root/output/$OUT_FILENAME
RUN mv wordpress-static/* /root/output/$OUT_FILENAME/
Expand Down Expand Up @@ -135,6 +141,6 @@ RUN cd wordpress && \
# Build the final wp.zip file
RUN mv wordpress /wordpress && \
cp wordpress-remote-asset-paths /wordpress/ && \
cp wordpress-static.zip /wordpress/ && \
cd /wordpress && \
zip /root/output/$OUT_FILENAME.zip -r .

7 changes: 6 additions & 1 deletion packages/playground/wordpress/src/boot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export type Hook = (php: PHP) => void | Promise<void>;
export interface Hooks {
beforeWordPressFiles?: Hook;
beforeDatabaseSetup?: Hook;
afterWordPressInstall?: Hook;
}

export type DatabaseType = 'sqlite' | 'mysql' | 'custom';
Expand Down Expand Up @@ -212,14 +213,18 @@ export async function bootWordPress(options: BootOptions) {
throw new Error('WordPress installation has failed.');
}

if (options.hooks?.afterWordPressInstall) {
await options.hooks.afterWordPressInstall(php);
}

return requestHandler;
}

async function isWordPressInstalled(php: PHP) {
return (
(
await php.run({
code: `<?php
code: `<?php
require '${php.documentRoot}/wp-load.php';
echo is_blog_installed() ? '1' : '0';
`,
Expand Down
18 changes: 7 additions & 11 deletions packages/playground/wordpress/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,7 @@ import { PHP, UniversalPHP } from '@php-wasm/universal';
import { joinPaths, phpVar } from '@php-wasm/util';
import { unzipFile } from '@wp-playground/common';
export { bootWordPress } from './boot';
export {
getLoadedWordPressVersion,
isSupportedWordPressVersion,
} from './version-detect';

export * from './version-detect';
bgrgicak marked this conversation as resolved.
Show resolved Hide resolved
export * from './rewrite-rules';

/**
Expand All @@ -21,7 +17,7 @@ export async function setupPlatformLevelMuPlugins(php: UniversalPHP) {
await php.writeFile(
'/internal/shared/preload/env.php',
`<?php

// Allow adding filters/actions prior to loading WordPress.
// $function_to_add MUST be a string.
function playground_add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
Expand All @@ -31,7 +27,7 @@ export async function setupPlatformLevelMuPlugins(php: UniversalPHP) {
function playground_add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
playground_add_filter( $tag, $function_to_add, $priority, $accepted_args );
}

// Load our mu-plugins after customer mu-plugins
// NOTE: this means our mu-plugins can't use the muplugins_loaded action!
playground_add_action( 'muplugins_loaded', 'playground_load_mu_plugins', 0 );
Expand Down Expand Up @@ -60,7 +56,7 @@ export async function setupPlatformLevelMuPlugins(php: UniversalPHP) {
}
return $redirect_url;
} );

// Needed because gethostbyname( 'wordpress.org' ) returns
// a private network IP address for some reason.
add_filter( 'allowed_redirect_hosts', function( $deprecated = '' ) {
Expand All @@ -78,7 +74,7 @@ export async function setupPlatformLevelMuPlugins(php: UniversalPHP) {
if(!file_exists(WP_CONTENT_DIR . '/fonts')) {
mkdir(WP_CONTENT_DIR . '/fonts');
}

$log_file = WP_CONTENT_DIR . '/debug.log';
define('ERROR_LOG_FILE', $log_file);
ini_set('error_log', $log_file);
Expand All @@ -91,7 +87,7 @@ export async function setupPlatformLevelMuPlugins(php: UniversalPHP) {
await php.writeFile(
'/internal/shared/preload/error-handler.php',
`<?php
(function() {
(function() {
$playground_consts = [];
if(file_exists('/internal/shared/consts.json')) {
$playground_consts = @json_decode(file_get_contents('/internal/shared/consts.json'), true) ?: [];
Expand Down Expand Up @@ -207,7 +203,7 @@ export async function preloadSqliteIntegration(

/**
* Loads the SQLite integration plugin before WordPress is loaded
* and without creating a drop-in "db.php" file.
* and without creating a drop-in "db.php" file.
*
* Technically, it creates a global $wpdb object whose only two
* purposes are to:
Expand Down
8 changes: 6 additions & 2 deletions packages/playground/wordpress/src/version-detect.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import type { PHPRequestHandler } from '@php-wasm/universal';
import type { PHP, PHPRequestHandler } from '@php-wasm/universal';
import { SupportedWordPressVersions } from '@wp-playground/wordpress-builds';

export async function getLoadedWordPressVersion(
requestHandler: PHPRequestHandler
): Promise<string> {
const php = await requestHandler.getPrimaryPhp();
return getWordPressVersionFromPhp(php);
}
bgrgicak marked this conversation as resolved.
Show resolved Hide resolved

export async function getWordPressVersionFromPhp(php: PHP): Promise<string> {
const result = await php.run({
code: `<?php
require '${requestHandler.documentRoot}/wp-includes/version.php';
require '${php.documentRoot}/wp-includes/version.php';
echo $wp_version;
bgrgicak marked this conversation as resolved.
Show resolved Hide resolved
`,
});
Expand Down
Loading