@hyperframes/engine 0.8.50 → 0.8.52

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.
Files changed (57) hide show
  1. package/dist/config.d.ts +16 -4
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +9 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/index.d.ts +4 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +4 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/services/audioMixer.d.ts.map +1 -1
  10. package/dist/services/audioMixer.js +55 -17
  11. package/dist/services/audioMixer.js.map +1 -1
  12. package/dist/services/audioMixer.types.d.ts +3 -2
  13. package/dist/services/audioMixer.types.d.ts.map +1 -1
  14. package/dist/services/browserManager.d.ts.map +1 -1
  15. package/dist/services/browserManager.js +4 -0
  16. package/dist/services/browserManager.js.map +1 -1
  17. package/dist/services/captureFailure.d.ts.map +1 -1
  18. package/dist/services/captureFailure.js +10 -1
  19. package/dist/services/captureFailure.js.map +1 -1
  20. package/dist/services/chromeHostCeiling.d.ts +5 -0
  21. package/dist/services/chromeHostCeiling.d.ts.map +1 -0
  22. package/dist/services/chromeHostCeiling.js +17 -0
  23. package/dist/services/chromeHostCeiling.js.map +1 -0
  24. package/dist/services/chromeMemorySampler.d.ts +55 -0
  25. package/dist/services/chromeMemorySampler.d.ts.map +1 -0
  26. package/dist/services/chromeMemorySampler.js +85 -0
  27. package/dist/services/chromeMemorySampler.js.map +1 -0
  28. package/dist/services/chunkEncoder.d.ts +16 -0
  29. package/dist/services/chunkEncoder.d.ts.map +1 -1
  30. package/dist/services/chunkEncoder.js +55 -22
  31. package/dist/services/chunkEncoder.js.map +1 -1
  32. package/dist/services/frameCapture.d.ts +25 -0
  33. package/dist/services/frameCapture.d.ts.map +1 -1
  34. package/dist/services/frameCapture.js +65 -3
  35. package/dist/services/frameCapture.js.map +1 -1
  36. package/dist/services/parallelCoordinator.d.ts +40 -1
  37. package/dist/services/parallelCoordinator.d.ts.map +1 -1
  38. package/dist/services/parallelCoordinator.js +56 -9
  39. package/dist/services/parallelCoordinator.js.map +1 -1
  40. package/dist/services/referenceResolver.d.ts +6 -0
  41. package/dist/services/referenceResolver.d.ts.map +1 -1
  42. package/dist/services/referenceResolver.js +1 -1
  43. package/dist/services/referenceResolver.js.map +1 -1
  44. package/dist/services/streamingEncoder.d.ts.map +1 -1
  45. package/dist/services/streamingEncoder.js +11 -2
  46. package/dist/services/streamingEncoder.js.map +1 -1
  47. package/dist/services/videoFrameExtractor.d.ts +7 -22
  48. package/dist/services/videoFrameExtractor.d.ts.map +1 -1
  49. package/dist/services/videoFrameExtractor.js +43 -83
  50. package/dist/services/videoFrameExtractor.js.map +1 -1
  51. package/dist/types.d.ts +13 -0
  52. package/dist/types.d.ts.map +1 -1
  53. package/dist/utils/processRss.d.ts +23 -0
  54. package/dist/utils/processRss.d.ts.map +1 -0
  55. package/dist/utils/processRss.js +93 -0
  56. package/dist/utils/processRss.js.map +1 -0
  57. package/package.json +7 -3
@@ -0,0 +1,93 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readFile } from "node:fs/promises";
3
+ import { promisify } from "node:util";
4
+ const KB_PER_MB = 1024;
5
+ const defaultReadFile = (path) => readFile(path, "utf8");
6
+ function defaultExec() {
7
+ // promisify lazily so vitest module mocks of child_process still take effect
8
+ // (same reason psnr.ts does this).
9
+ const execFileP = promisify(execFile);
10
+ return async (file, args) => {
11
+ const { stdout } = await execFileP(file, [...args], { windowsHide: true, timeout: 5_000 });
12
+ return { stdout: String(stdout) };
13
+ };
14
+ }
15
+ /** `ps -o pid=,rss=` output: one "<pid> <rss-kb>" pair per line. */
16
+ export function parsePsRss(stdout) {
17
+ const samples = [];
18
+ for (const line of stdout.split("\n")) {
19
+ const match = /^\s*(\d+)\s+(\d+)\s*$/.exec(line);
20
+ if (!match)
21
+ continue;
22
+ const pid = Number(match[1]);
23
+ const rssKb = Number(match[2]);
24
+ if (!Number.isFinite(pid) || !Number.isFinite(rssKb))
25
+ continue;
26
+ samples.push({ pid, rssMb: Math.round(rssKb / KB_PER_MB) });
27
+ }
28
+ return samples;
29
+ }
30
+ /** `tasklist /FO CSV /NH /FI "PID eq N"`: `"image","pid","session","sess#","12,345 K"`. */
31
+ export function parseTasklistCsv(pid, stdout) {
32
+ const line = stdout.split(/\r?\n/).find((l) => l.startsWith('"'));
33
+ if (!line)
34
+ return [];
35
+ const cells = line.split('","').map((c) => c.replace(/^"|"$/g, ""));
36
+ const memCell = cells[4];
37
+ if (typeof memCell !== "string")
38
+ return [];
39
+ const kb = Number(memCell.replace(/[^0-9]/g, ""));
40
+ if (!Number.isFinite(kb) || kb <= 0)
41
+ return [];
42
+ return [{ pid, rssMb: Math.round(kb / KB_PER_MB) }];
43
+ }
44
+ /** `/proc/<pid>/status` line `VmRSS:\t 12345 kB`; absent for a zombie. */
45
+ export function parseProcStatusRss(pid, status) {
46
+ const match = /^VmRSS:\s*(\d+)\s*kB/m.exec(status);
47
+ if (!match)
48
+ return [];
49
+ const kb = Number(match[1]);
50
+ if (!Number.isFinite(kb) || kb <= 0)
51
+ return [];
52
+ return [{ pid, rssMb: Math.round(kb / KB_PER_MB) }];
53
+ }
54
+ /**
55
+ * Resident set size per pid, in MiB. Zero dependencies: `/proc/<pid>/status`
56
+ * on Linux (the render images are `node:*-slim` and ship no `ps`; same
57
+ * precedent as the CLI's orphanCleanup / processTree), `ps` on other POSIX
58
+ * (one call for all pids), `tasklist` on Windows (one call per pid). Never
59
+ * rejects; a pid that exited between discovery and sampling is simply absent.
60
+ */
61
+ export async function sampleProcessRss(pids, exec = defaultExec(), platform = process.platform, readStatus = defaultReadFile) {
62
+ const unique = [...new Set(pids.filter((p) => Number.isInteger(p) && p > 0))];
63
+ if (unique.length === 0)
64
+ return [];
65
+ if (platform === "linux") {
66
+ // Per-pid catch: one exited pid must not erase the others' samples.
67
+ const perPid = await Promise.all(unique.map(async (pid) => {
68
+ try {
69
+ return parseProcStatusRss(pid, await readStatus(`/proc/${pid}/status`));
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ }));
75
+ return perPid.flat();
76
+ }
77
+ try {
78
+ if (platform === "win32") {
79
+ const results = [];
80
+ for (const pid of unique) {
81
+ const { stdout } = await exec("tasklist", ["/FO", "CSV", "/NH", "/FI", `PID eq ${pid}`]);
82
+ results.push(...parseTasklistCsv(pid, stdout));
83
+ }
84
+ return results;
85
+ }
86
+ const { stdout } = await exec("ps", ["-o", "pid=,rss=", "-p", unique.join(",")]);
87
+ return parsePsRss(stdout);
88
+ }
89
+ catch {
90
+ return [];
91
+ }
92
+ }
93
+ //# sourceMappingURL=processRss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processRss.js","sourceRoot":"","sources":["../../src/utils/processRss.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperframes/engine",
3
- "version": "0.8.50",
3
+ "version": "0.8.52",
4
4
  "description": "Seekable web page to video rendering engine (Puppeteer + FFmpeg)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,6 +23,10 @@
23
23
  "import": "./dist/utils/alphaBlit.js",
24
24
  "types": "./dist/utils/alphaBlit.d.ts"
25
25
  },
26
+ "./chrome-host-ceiling": {
27
+ "import": "./dist/services/chromeHostCeiling.js",
28
+ "types": "./dist/services/chromeHostCeiling.d.ts"
29
+ },
26
30
  "./shader-transitions": {
27
31
  "import": "./dist/utils/shaderTransitions.js",
28
32
  "types": "./dist/utils/shaderTransitions.d.ts"
@@ -38,8 +42,8 @@
38
42
  "linkedom": "^0.18.12",
39
43
  "puppeteer": "^25.8.0",
40
44
  "puppeteer-core": "^25.8.0",
41
- "@hyperframes/core": "^0.8.50",
42
- "@hyperframes/parsers": "^0.8.50"
45
+ "@hyperframes/parsers": "^0.8.52",
46
+ "@hyperframes/core": "^0.8.52"
43
47
  },
44
48
  "devDependencies": {
45
49
  "@types/node": "^25.0.10",