@hyperframes/aws-lambda 0.8.49 → 0.8.50

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperframes/aws-lambda",
3
- "version": "0.8.49",
3
+ "version": "0.8.50",
4
4
  "description": "AWS Lambda adapter for HyperFrames distributed rendering — handler, client-side SDK, and CDK construct.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -45,7 +45,7 @@
45
45
  "ffprobe-static": "^3.1.0",
46
46
  "puppeteer-core": "^25.8.0",
47
47
  "tar": "^7.4.3",
48
- "@hyperframes/producer": "^0.8.49"
48
+ "@hyperframes/producer": "^0.8.50"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@types/aws-lambda": "^8.10.146",
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env tsx
2
+ /** Reports whether the pinned Linux Chromium gets a hardware WebGPU adapter; software-only is not a failure. */
3
+ // Dynamic `puppeteer-core` import from a real file, same as probe-beginframe.ts —
4
+ // an inline `bun -e` eval's synthetic `/app/[eval]` path can't see the hoisted dep.
5
+ // Usage: bun probe-webgpu-adapter.ts --executable-path /opt/chrome/chrome-headless-shell
6
+
7
+ import { createServer } from "node:http";
8
+ import type { AddressInfo } from "node:net";
9
+ import { resolve } from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+ import {
12
+ buildChromeArgs,
13
+ assertWebGpuAdapterAvailable,
14
+ WebGpuUnavailableError,
15
+ } from "../../engine/src/services/browserManager.ts";
16
+
17
+ const PROBE_HTML = '<div data-composition-id="probe" data-requires-webgpu></div>';
18
+
19
+ function parseExecutablePath(args: string[]): string {
20
+ for (let i = 0; i < args.length; i += 1) {
21
+ if (args[i] === "--executable-path") return resolve(args[i + 1]);
22
+ if (args[i].startsWith("--executable-path=")) {
23
+ return resolve(args[i].slice("--executable-path=".length));
24
+ }
25
+ }
26
+ throw new Error("--executable-path is required");
27
+ }
28
+
29
+ async function main(): Promise<void> {
30
+ const executablePath = parseExecutablePath(process.argv.slice(2));
31
+ const puppeteer = await import("puppeteer-core");
32
+
33
+ // navigator.gpu only exists on a secure-context origin; file:// is not one, http://127.0.0.1 is.
34
+ const server = createServer((_req, res) => res.end(PROBE_HTML));
35
+ await new Promise<void>((done) => server.listen(0, "127.0.0.1", done));
36
+ try {
37
+ const args = buildChromeArgs(
38
+ {
39
+ width: 800,
40
+ height: 600,
41
+ captureMode: "screenshot",
42
+ platform: "linux",
43
+ requiresWebGpu: true,
44
+ },
45
+ { browserGpuMode: "software" },
46
+ );
47
+ const browser = await puppeteer.launch({ executablePath, headless: true, args });
48
+ try {
49
+ const page = await browser.newPage();
50
+ await page.goto(`http://127.0.0.1:${(server.address() as AddressInfo).port}/`);
51
+ await assertWebGpuAdapterAvailable(page, true);
52
+ console.log("WebGPU adapter probe: hardware adapter available");
53
+ } catch (err) {
54
+ if (!(err instanceof WebGpuUnavailableError)) throw err;
55
+ console.log(
56
+ "WebGPU adapter probe: no usable adapter; data-requires-webgpu compositions will not render on this host",
57
+ );
58
+ } finally {
59
+ await browser.close();
60
+ }
61
+ } finally {
62
+ server.close();
63
+ }
64
+ }
65
+
66
+ const invokedPath = process.argv[1] ? resolve(process.argv[1]) : "";
67
+ if (invokedPath === fileURLToPath(import.meta.url)) {
68
+ void main().catch((err) => {
69
+ console.error("[probe-webgpu-adapter] FAIL —", err instanceof Error ? err.message : err);
70
+ process.exit(1);
71
+ });
72
+ }