Skip to content

Commit ced27ad

Browse files
authored
feat: use photon & sharp for resizing img (#974)
* chore(web-integration): log time consume * feat(shared): add getPhoton function to load photon module and support image processing methods * feat(shared): add sharp as external dependency and integrate image processing with sharp in resizeImg function * feat(shared): update dependencies to @silvia-odwyer/photon and @silvia-odwyer/photon-node, and adjust image processing logic for Node.js and browser environments * fix(shared): update import statement for photon package to support webpackIgnore for browser environments * fix(shared): update sharp import type and adjust photon loading logic for better environment detection * fix(dependencies): downgrade sharp version from 0.34.1 to 0.33.5 in package.json and pnpm-lock.yaml * fix(shared): simplify photon import statement by removing webpackIgnore comment * fix(config): add SSR external configuration for @silvia-odwyer/photon in vitest.config.ts files * fix(shared): replace isNodeEnv checks with ifInNode for better environment detection
1 parent 5bfb42f commit ced27ad

File tree

22 files changed

+795
-281
lines changed

22 files changed

+795
-281
lines changed

apps/chrome-extension/static/manifest.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@
1414
"background": {
1515
"service_worker": "./scripts/worker.js"
1616
},
17+
"content_security_policy": {
18+
"extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
19+
},
20+
"web_accessible_resources": [
21+
{
22+
"resources": [
23+
"*.wasm"
24+
],
25+
"matches": [
26+
"<all_urls>"
27+
]
28+
}
29+
],
1730
"host_permissions": [
1831
"<all_urls>"
1932
],

apps/report/rsbuild.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ export default defineConfig({
137137
},
138138
},
139139
},
140+
externals: ['sharp'],
140141
},
141142
},
142143
output: {

packages/android/src/page/index.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ export class AndroidDevice implements AndroidDevicePage {
7474
this.connectingAdb = (async () => {
7575
let error: Error | null = null;
7676
debugPage(`Initializing ADB with device ID: ${this.deviceId}`);
77-
7877
try {
7978
const androidAdbPath =
8079
this.options?.androidAdbPath || getAIConfig(MIDSCENE_ADB_PATH);
@@ -139,10 +138,11 @@ ${Object.keys(size)
139138
return async (...args: any[]) => {
140139
try {
141140
debugPage(`adb ${String(prop)} ${args.join(' ')}`);
142-
return (originalMethod as (...args: any[]) => any).apply(
143-
target,
144-
args,
145-
);
141+
const result = await (
142+
originalMethod as (...args: any[]) => any
143+
).apply(target, args);
144+
debugPage(`adb ${String(prop)} ${args.join(' ')} end`);
145+
return result;
146146
} catch (error: any) {
147147
const methodName = String(prop);
148148
const deviceId = this.deviceId;
@@ -168,6 +168,7 @@ ${Object.keys(size)
168168
this.uri = uri;
169169

170170
try {
171+
debugPage(`Launching app: ${uri}`);
171172
if (
172173
uri.startsWith('http://') ||
173174
uri.startsWith('https://') ||
@@ -359,7 +360,9 @@ ${Object.keys(size)
359360
const androidScreenshotPath = `/data/local/tmp/midscene_screenshot_${randomUUID()}.png`;
360361

361362
try {
363+
debugPage('Taking screenshot via adb.takeScreenshot');
362364
screenshotBuffer = await adb.takeScreenshot(null);
365+
debugPage('adb.takeScreenshot completed');
363366

364367
// make sure screenshotBuffer is not null
365368
if (!screenshotBuffer) {
@@ -379,25 +382,34 @@ ${Object.keys(size)
379382
const screenshotPath = getTmpFile('png')!;
380383

381384
try {
385+
debugPage('Fallback: taking screenshot via shell screencap');
382386
try {
383387
// Take a screenshot and save it locally
384388
await adb.shell(`screencap -p ${androidScreenshotPath}`);
389+
debugPage('adb.shell screencap completed');
385390
} catch (error) {
391+
debugPage('screencap failed, using forceScreenshot');
386392
await this.forceScreenshot(androidScreenshotPath);
393+
debugPage('forceScreenshot completed');
387394
}
388395

396+
debugPage('Pulling screenshot file from device');
389397
await adb.pull(androidScreenshotPath, screenshotPath);
398+
debugPage('adb.pull completed');
390399
screenshotBuffer = await fs.promises.readFile(screenshotPath);
391400
} finally {
392401
await adb.shell(`rm -f ${androidScreenshotPath}`);
393402
}
394403
}
395404

405+
debugPage('Resizing screenshot image');
396406
const resizedScreenshotBuffer = await resizeImg(screenshotBuffer, {
397407
width,
398408
height,
399409
});
410+
debugPage('Image resize completed');
400411

412+
debugPage('Converting to base64');
401413
const result = `data:image/jpeg;base64,${resizedScreenshotBuffer.toString('base64')}`;
402414
debugPage('screenshotBase64 end');
403415
return result;

packages/android/vitest.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,7 @@ export default defineConfig({
3838
define: {
3939
__VERSION__: `'${version}'`,
4040
},
41+
ssr: {
42+
external: ['@silvia-odwyer/photon'],
43+
},
4144
});

packages/cli/vitest.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,7 @@ export default defineConfig({
1919
'@': path.resolve(__dirname, 'src'),
2020
},
2121
},
22+
ssr: {
23+
external: ['@silvia-odwyer/photon'],
24+
},
2225
});

packages/core/vitest.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,7 @@ export default defineConfig({
2828
'@': path.resolve(__dirname, 'src'),
2929
},
3030
},
31+
ssr: {
32+
external: ['@silvia-odwyer/photon'],
33+
},
3134
});

packages/evaluation/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"cli-progress": "3.12.0",
3232
"dotenv": "16.4.5",
3333
"playwright": "1.44.1",
34-
"sharp": "0.34.1",
34+
"sharp": "0.33.5",
3535
"typescript": "^5.8.3",
3636
"vitest": "3.0.5"
3737
},

packages/shared/modern.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export default defineConfig({
2626
env: './src/env.ts',
2727
types: './src/types/index.ts',
2828
},
29+
externals: ['sharp'],
2930
target: 'es2020',
3031
dts: {
3132
respectExternal: true,

packages/shared/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,12 @@
5656
"test:u": "vitest --run -u"
5757
},
5858
"dependencies": {
59+
"@silvia-odwyer/photon": "0.3.3",
60+
"@silvia-odwyer/photon-node": "0.3.3",
5961
"debug": "4.4.0",
6062
"jimp": "0.22.12",
61-
"js-sha256": "0.11.0"
63+
"js-sha256": "0.11.0",
64+
"sharp": "0.33.5"
6265
},
6366
"devDependencies": {
6467
"@modern-js/module-tools": "2.60.6",

packages/shared/src/common.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,21 @@ import { existsSync, mkdirSync } from 'node:fs';
22
import { tmpdir } from 'node:os';
33
import path from 'node:path';
44
import { MIDSCENE_RUN_DIR, getAIConfig } from './env';
5+
import { ifInNode } from './utils';
56

67
export const defaultRunDirName = 'midscene_run';
78
// Define locally for now to avoid import issues
8-
export const isNodeEnv =
9-
typeof process !== 'undefined' &&
10-
process.versions != null &&
11-
process.versions.node != null;
129

1310
export const getMidsceneRunDir = () => {
14-
if (!isNodeEnv) {
11+
if (!ifInNode) {
1512
return '';
1613
}
1714

1815
return getAIConfig(MIDSCENE_RUN_DIR) || defaultRunDirName;
1916
};
2017

2118
export const getMidsceneRunBaseDir = () => {
22-
if (!isNodeEnv) {
19+
if (!ifInNode) {
2320
return '';
2421
}
2522

@@ -49,7 +46,7 @@ export const getMidsceneRunBaseDir = () => {
4946
export const getMidsceneRunSubDir = (
5047
subdir: 'dump' | 'cache' | 'report' | 'tmp' | 'log' | 'output',
5148
): string => {
52-
if (!isNodeEnv) {
49+
if (!ifInNode) {
5350
return '';
5451
}
5552

0 commit comments

Comments
 (0)