From 36e6ad796a794a715dc53e22a5ba45a47225314f Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Tue, 8 Jul 2025 19:14:07 +0200 Subject: [PATCH 1/3] feat: dispatch touch even on build on MacOS --- src/constants/dev.constants.ts | 3 +- .../functions/build/build.rust.services.ts | 3 + .../functions/build/build.services.ts | 18 +++--- .../functions/build/touch.services.ts | 59 +++++++++++++++++++ 4 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 src/services/functions/build/touch.services.ts diff --git a/src/constants/dev.constants.ts b/src/constants/dev.constants.ts index 067c2c1a..ff4a3307 100644 --- a/src/constants/dev.constants.ts +++ b/src/constants/dev.constants.ts @@ -52,4 +52,5 @@ export const DEPLOY_SPUTNIK_PATH = join(DEPLOY_LOCAL_REPLICA_PATH, SPUTNIK_INDEX export const JUNO_ACTION_SPUTNIK_PATH = '/juno/src/sputnik'; export const SPUTNIK_CARGO_TOML = join(JUNO_ACTION_SPUTNIK_PATH, CARGO_TOML); -export const SATELLITE_OUTPUT = join(DEPLOY_LOCAL_REPLICA_PATH, 'satellite.wasm'); +export const SATELLITE_WASM = 'satellite.wasm'; +export const SATELLITE_OUTPUT = join(DEPLOY_LOCAL_REPLICA_PATH, SATELLITE_WASM); diff --git a/src/services/functions/build/build.rust.services.ts b/src/services/functions/build/build.rust.services.ts index 6874b3a9..bf8413ff 100644 --- a/src/services/functions/build/build.rust.services.ts +++ b/src/services/functions/build/build.rust.services.ts @@ -31,6 +31,7 @@ import {formatTime} from '../../../utils/format.utils'; import {readPackageJson} from '../../../utils/pkg.utils'; import {readEmulatorConfigAndCreateDeployTargetDir} from '../../emulator.services'; import {prepareJunoPkgForSatellite, prepareJunoPkgForSputnik} from './build.metadata.services'; +import {dispatchEmulatorTouchSatellite} from './touch.services'; export const buildRust = async ({ paths, @@ -155,6 +156,8 @@ export const buildRust = async ({ await rename(`${SATELLITE_OUTPUT}.tmp.gz`, `${SATELLITE_OUTPUT}.gz`); + await dispatchEmulatorTouchSatellite(); + await successMsg(spinner); } finally { spinner.stop(); diff --git a/src/services/functions/build/build.services.ts b/src/services/functions/build/build.services.ts index fdad173a..65e90263 100644 --- a/src/services/functions/build/build.services.ts +++ b/src/services/functions/build/build.services.ts @@ -16,6 +16,7 @@ import {type BuildArgs} from '../../../types/build'; import {buildArgs} from '../../../utils/build.utils'; import {buildJavaScript, buildTypeScript} from './build.javascript.services'; import {buildRust} from './build.rust.services'; +import {dispatchEmulatorTouchSputnik} from './touch.services'; export const build = async (args?: string[]) => { const {watch, ...params} = buildArgs(args); @@ -116,14 +117,17 @@ const executeSputnikBuild = async ({ const withToolchain = nonNullish(paths?.cargo) || ENV.ci; - if (withToolchain) { - const rustPaths = { - ...paths, - cargo: paths?.cargo ?? SPUTNIK_CARGO_TOML - }; - - await buildRust({paths: rustPaths, target: 'wasm32-wasip1'}); + if (!withToolchain) { + await dispatchEmulatorTouchSputnik(); + return; } + + const rustPaths = { + ...paths, + cargo: paths?.cargo ?? SPUTNIK_CARGO_TOML + }; + + await buildRust({paths: rustPaths, target: 'wasm32-wasip1'}); }; export const watchBuild = ({watch, paths, ...params}: BuildArgs) => { diff --git a/src/services/functions/build/touch.services.ts b/src/services/functions/build/touch.services.ts new file mode 100644 index 00000000..07f1c0e6 --- /dev/null +++ b/src/services/functions/build/touch.services.ts @@ -0,0 +1,59 @@ +import {red} from 'kleur'; +import {readEmulatorConfig} from '../../../configs/emulator.config'; +import {SATELLITE_WASM, SPUTNIK_INDEX_MJS} from '../../../constants/dev.constants'; +import {EMULATOR_SKYLAB} from '../../../constants/emulator.constants'; + +export const dispatchEmulatorTouchSatellite = async () => { + await dispatchTouch({filename: `${SATELLITE_WASM}.gz`}); +}; + +export const dispatchEmulatorTouchSputnik = async () => { + await dispatchTouch({filename: SPUTNIK_INDEX_MJS}); +}; + +/** + * Workaround Podman and Apple container issues on macOS: + * - https://github.com/containers/podman/issues/22343 + * - https://github.com/apple/container/issues/141 + */ +const dispatchTouch = async ({filename}: {filename: string}) => { + if (process.platform !== 'darwin') { + // Workaround only required on macOS. Not sure if it's required on old Intel process, maybe not but + // for simplicity reasons let's consider all Apple devices require the workaround. + return; + } + + const parsedResult = await readEmulatorConfig(); + + if (!parsedResult.success) { + return; + } + + const { + config: { + config, + derivedConfig: {emulatorType, runner} + } + } = parsedResult; + + if (runner === 'docker') { + // No need of the workaround for Docker + return; + } + + const adminPort = config[emulatorType]?.ports?.admin ?? EMULATOR_SKYLAB.ports.admin; + + try { + const response = await fetch( + `http://localhost:${adminPort}/admin/touch?file=${encodeURIComponent(filename)}` + ); + + if (!response.ok) { + console.log( + red(`Invalid response from the emulator. Touching '${filename}' did not succeed.`) + ); + } + } catch (_error: unknown) { + // We silence the error. Maybe the emulator is not running on purpose. + } +}; From ae9170e590bb2d6c1076e444d55b9572ef47173d Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Tue, 8 Jul 2025 19:15:32 +0200 Subject: [PATCH 2/3] feat: touch after spinner ends --- src/services/functions/build/build.rust.services.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/functions/build/build.rust.services.ts b/src/services/functions/build/build.rust.services.ts index bf8413ff..e4fc4efb 100644 --- a/src/services/functions/build/build.rust.services.ts +++ b/src/services/functions/build/build.rust.services.ts @@ -156,12 +156,12 @@ export const buildRust = async ({ await rename(`${SATELLITE_OUTPUT}.tmp.gz`, `${SATELLITE_OUTPUT}.gz`); - await dispatchEmulatorTouchSatellite(); - await successMsg(spinner); } finally { spinner.stop(); } + + await dispatchEmulatorTouchSatellite(); }; const SATELLITE_DID_FILE = join(DEVELOPER_PROJECT_SATELLITE_PATH, 'satellite.did'); From a83dc544cdeddf197da9c7422d1c812d741955ca Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Wed, 9 Jul 2025 07:26:49 +0200 Subject: [PATCH 3/3] feat: timeout --- src/services/functions/build/touch.services.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/functions/build/touch.services.ts b/src/services/functions/build/touch.services.ts index 07f1c0e6..d172bb0f 100644 --- a/src/services/functions/build/touch.services.ts +++ b/src/services/functions/build/touch.services.ts @@ -45,7 +45,8 @@ const dispatchTouch = async ({filename}: {filename: string}) => { try { const response = await fetch( - `http://localhost:${adminPort}/admin/touch?file=${encodeURIComponent(filename)}` + `http://localhost:${adminPort}/admin/touch?file=${encodeURIComponent(filename)}`, + {signal: AbortSignal.timeout(5000)} ); if (!response.ok) {