@vforsh/argus-watcher 0.1.12 → 0.1.14

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 (92) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/cdp/keyboard.d.ts +14 -1
  3. package/dist/cdp/keyboard.d.ts.map +1 -1
  4. package/dist/cdp/keyboard.js +77 -27
  5. package/dist/cdp/keyboard.js.map +1 -1
  6. package/dist/cdp/mouse.d.ts +19 -3
  7. package/dist/cdp/mouse.d.ts.map +1 -1
  8. package/dist/cdp/mouse.js +57 -9
  9. package/dist/cdp/mouse.js.map +1 -1
  10. package/dist/cdp/pageIndicator.d.ts +5 -0
  11. package/dist/cdp/pageIndicator.d.ts.map +1 -1
  12. package/dist/cdp/pageIndicator.js +21 -5
  13. package/dist/cdp/pageIndicator.js.map +1 -1
  14. package/dist/cdp/pageIndicatorScript.d.ts +4 -3
  15. package/dist/cdp/pageIndicatorScript.d.ts.map +1 -1
  16. package/dist/cdp/pageIndicatorScript.js +61 -7
  17. package/dist/cdp/pageIndicatorScript.js.map +1 -1
  18. package/dist/cdp/recording.d.ts +15 -0
  19. package/dist/cdp/recording.d.ts.map +1 -0
  20. package/dist/cdp/recording.js +389 -0
  21. package/dist/cdp/recording.js.map +1 -0
  22. package/dist/cdp/screenshot.d.ts.map +1 -1
  23. package/dist/cdp/screenshot.js +2 -133
  24. package/dist/cdp/screenshot.js.map +1 -1
  25. package/dist/cdp/visualCapture.d.ts +38 -0
  26. package/dist/cdp/visualCapture.d.ts.map +1 -0
  27. package/dist/cdp/visualCapture.js +156 -0
  28. package/dist/cdp/visualCapture.js.map +1 -0
  29. package/dist/events.d.ts +1 -1
  30. package/dist/events.d.ts.map +1 -1
  31. package/dist/http/routes/getExtensionDiagnostics.d.ts +2 -0
  32. package/dist/http/routes/getExtensionDiagnostics.d.ts.map +1 -0
  33. package/dist/http/routes/getExtensionDiagnostics.js +16 -0
  34. package/dist/http/routes/getExtensionDiagnostics.js.map +1 -0
  35. package/dist/http/routes/index.d.ts.map +1 -1
  36. package/dist/http/routes/index.js +6 -0
  37. package/dist/http/routes/index.js.map +1 -1
  38. package/dist/http/routes/netMock.js +3 -0
  39. package/dist/http/routes/netMock.js.map +1 -1
  40. package/dist/http/routes/postAttach.d.ts.map +1 -1
  41. package/dist/http/routes/postAttach.js +6 -3
  42. package/dist/http/routes/postAttach.js.map +1 -1
  43. package/dist/http/routes/postDetach.d.ts.map +1 -1
  44. package/dist/http/routes/postDetach.js +6 -3
  45. package/dist/http/routes/postDetach.js.map +1 -1
  46. package/dist/http/routes/postDomClick.d.ts.map +1 -1
  47. package/dist/http/routes/postDomClick.js +12 -20
  48. package/dist/http/routes/postDomClick.js.map +1 -1
  49. package/dist/http/routes/postDomDrag.d.ts +2 -0
  50. package/dist/http/routes/postDomDrag.d.ts.map +1 -0
  51. package/dist/http/routes/postDomDrag.js +54 -0
  52. package/dist/http/routes/postDomDrag.js.map +1 -0
  53. package/dist/http/routes/postDomKeydown.d.ts.map +1 -1
  54. package/dist/http/routes/postDomKeydown.js +22 -3
  55. package/dist/http/routes/postDomKeydown.js.map +1 -1
  56. package/dist/http/routes/postRecord.d.ts +3 -0
  57. package/dist/http/routes/postRecord.d.ts.map +1 -0
  58. package/dist/http/routes/postRecord.js +88 -0
  59. package/dist/http/routes/postRecord.js.map +1 -0
  60. package/dist/http/server.d.ts +3 -1
  61. package/dist/http/server.d.ts.map +1 -1
  62. package/dist/http/server.js.map +1 -1
  63. package/dist/native-messaging/control-session-manager.d.ts +24 -4
  64. package/dist/native-messaging/control-session-manager.d.ts.map +1 -1
  65. package/dist/native-messaging/control-session-manager.js +69 -23
  66. package/dist/native-messaging/control-session-manager.js.map +1 -1
  67. package/dist/native-messaging/types.d.ts +62 -3
  68. package/dist/native-messaging/types.d.ts.map +1 -1
  69. package/dist/net/NetMockController.d.ts +6 -4
  70. package/dist/net/NetMockController.d.ts.map +1 -1
  71. package/dist/net/NetMockController.js +37 -100
  72. package/dist/net/NetMockController.js.map +1 -1
  73. package/dist/net/NetMockInterception.d.ts +45 -0
  74. package/dist/net/NetMockInterception.d.ts.map +1 -0
  75. package/dist/net/NetMockInterception.js +144 -0
  76. package/dist/net/NetMockInterception.js.map +1 -0
  77. package/dist/runtime/watcherServices.d.ts +3 -0
  78. package/dist/runtime/watcherServices.d.ts.map +1 -1
  79. package/dist/runtime/watcherServices.js +12 -0
  80. package/dist/runtime/watcherServices.js.map +1 -1
  81. package/dist/sources/extension-control-source.d.ts.map +1 -1
  82. package/dist/sources/extension-control-source.js +25 -4
  83. package/dist/sources/extension-control-source.js.map +1 -1
  84. package/dist/sources/extension-source.d.ts.map +1 -1
  85. package/dist/sources/extension-source.js +16 -3
  86. package/dist/sources/extension-source.js.map +1 -1
  87. package/dist/sources/types.d.ts +7 -3
  88. package/dist/sources/types.d.ts.map +1 -1
  89. package/dist/startWatcherRuntime.d.ts.map +1 -1
  90. package/dist/startWatcherRuntime.js +21 -3
  91. package/dist/startWatcherRuntime.js.map +1 -1
  92. package/package.json +1 -1
@@ -15,9 +15,10 @@ const INFO_VISIBLE_CLASS = 'argus-indicator-info-visible';
15
15
  const INDICATOR_BUTTON_TRANSITION_PROPS = ['background', 'border-color', 'filter', 'opacity', 'transform'];
16
16
  /** Build the page-side installer script that owns all indicator DOM, events, and clipboard feedback. */
17
17
  export const buildInstallExpression = (params) => {
18
- const { info, position, ttlMs, bgColor, hoverBgColor, iconColor, margin, size } = params;
18
+ const { info, position, ttlMs, bgColor, hoverBgColor, iconColor, margin, size, state } = params;
19
19
  const iconJson = JSON.stringify(ICONS);
20
20
  const infoJson = JSON.stringify(info);
21
+ const stateJson = JSON.stringify(state);
21
22
  const positionStyle = resolvePositionStyle(position, margin);
22
23
  const tooltipText = JSON.stringify(`Argus Watcher: ${info.watcherId}`);
23
24
  const buttonSize = size + 12;
@@ -31,6 +32,7 @@ export const buildInstallExpression = (params) => {
31
32
  var INFO_VISIBLE_CLASS = '${INFO_VISIBLE_CLASS}';
32
33
  var ICONS = ${iconJson};
33
34
  var info = ${infoJson};
35
+ var indicatorState = ${stateJson};
34
36
  var ttlMs = ${ttlMs};
35
37
  var isHovering = false;
36
38
  var infoVisible = false;
@@ -45,6 +47,10 @@ export const buildInstallExpression = (params) => {
45
47
  wrapper.setAttribute('data-testid', INDICATOR_ID);
46
48
 
47
49
  var mainButton = createIconButton('argus-indicator-main', 'Argus watcher: copy info', ${tooltipText}, 'bot');
50
+ var recordingDot = document.createElement('span');
51
+ recordingDot.className = 'argus-indicator-recording-dot';
52
+ recordingDot.setAttribute('aria-hidden', 'true');
53
+ mainButton.appendChild(recordingDot);
48
54
  var infoButton = createIconButton('argus-indicator-info', 'Argus watcher details', 'Watcher details', 'info');
49
55
  wrapper.appendChild(mainButton);
50
56
  wrapper.appendChild(infoButton);
@@ -95,8 +101,10 @@ export const buildInstallExpression = (params) => {
95
101
  lastSeenMs: Date.now(),
96
102
  ttlMs: ttlMs,
97
103
  timerId: timerId,
98
- info: info
104
+ info: info,
105
+ recording: indicatorState.recording === true
99
106
  };
107
+ applyIndicatorState(indicatorState);
100
108
 
101
109
  function installStyle() {
102
110
  var existingStyle = document.getElementById(STYLE_ID);
@@ -114,12 +122,24 @@ export const buildInstallExpression = (params) => {
114
122
  'border-radius: 7px; padding: 6px; display: flex; align-items: center; justify-content: center; color: ${iconColor}; ' +
115
123
  'background: ${bgColor}; box-shadow: 0 4px 18px rgba(0, 0, 0, 0.22); cursor: pointer; transition: ${buttonTransition};' +
116
124
  '}' +
125
+ '#' + INDICATOR_ID + ' .argus-indicator-main { position: relative; }' +
117
126
  '#' + INDICATOR_ID + ' .argus-indicator-button:hover {' +
118
127
  'background: ${hoverBgColor}; border-color: rgba(255, 255, 255, 0.22); filter: brightness(1.15);' +
119
128
  '}' +
129
+ '#' + INDICATOR_ID + ' .argus-indicator-icon { display: flex; align-items: center; justify-content: center; }' +
120
130
  '#' + INDICATOR_ID + ' .argus-indicator-button svg {' +
121
131
  'max-width: ${size}px; max-height: ${size}px; flex: 0 0 auto; display: block;' +
122
132
  '}' +
133
+ '#' + INDICATOR_ID + ' .argus-indicator-recording-dot {' +
134
+ 'position: absolute; top: 4px; right: 4px; width: 8px; height: 8px; border-radius: 999px; pointer-events: none; opacity: 0; ' +
135
+ 'background: #ef4444; box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.72), 0 0 12px rgba(239, 68, 68, 0.95); ' +
136
+ 'opacity: var(--argus-recording-dot-opacity, 0); transform: scale(var(--argus-recording-dot-scale, 0.72)); ' +
137
+ 'animation: var(--argus-recording-dot-animation, none); transition: opacity 120ms ease, transform 120ms ease;' +
138
+ '}' +
139
+ '@keyframes argus-indicator-recording-pulse {' +
140
+ '0%, 100% { box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.72), 0 0 10px rgba(239, 68, 68, 0.75); }' +
141
+ '50% { box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.72), 0 0 18px rgba(239, 68, 68, 1); }' +
142
+ '}' +
123
143
  '#' + INDICATOR_ID + ' .argus-indicator-info {' +
124
144
  'position: absolute; right: 0; bottom: calc(100% + ${INFO_BUTTON_GAP_PX}px); opacity: 0; pointer-events: none; transform: translateY(2px);' +
125
145
  '}' +
@@ -148,12 +168,26 @@ export const buildInstallExpression = (params) => {
148
168
  button.className = 'argus-indicator-button ' + className;
149
169
  button.setAttribute('aria-label', ariaLabel);
150
170
  button.setAttribute('title', title);
151
- button.innerHTML = renderIcon(iconName);
171
+ button.innerHTML = '<span class="argus-indicator-icon">' + renderIcon(iconName) + '</span>';
152
172
  return button;
153
173
  }
154
174
 
155
175
  function setMainIcon(iconName) {
156
- mainButton.innerHTML = renderIcon(iconName);
176
+ var iconEl = mainButton.querySelector('.argus-indicator-icon');
177
+ if (iconEl) iconEl.innerHTML = renderIcon(iconName);
178
+ }
179
+
180
+ function applyIndicatorState(nextState) {
181
+ var isRecording = nextState && nextState.recording === true;
182
+ wrapper.classList.toggle('argus-indicator-recording', isRecording);
183
+ wrapper.setAttribute('data-recording', isRecording ? 'true' : 'false');
184
+ wrapper.style.setProperty('--argus-recording-dot-opacity', isRecording ? '1' : '0');
185
+ wrapper.style.setProperty('--argus-recording-dot-scale', isRecording ? '1' : '0.72');
186
+ wrapper.style.setProperty('--argus-recording-dot-animation', isRecording ? 'argus-indicator-recording-pulse 1.15s ease-in-out infinite' : 'none');
187
+ mainButton.setAttribute('title', isRecording ? 'Argus watcher: recording - copy info' : ${tooltipText});
188
+ mainButton.setAttribute('aria-label', isRecording ? 'Argus watcher recording: copy info' : 'Argus watcher: copy info');
189
+ var state = window[STATE_KEY];
190
+ if (state) state.recording = isRecording;
157
191
  }
158
192
 
159
193
  function scheduleInfoReveal() {
@@ -269,13 +303,15 @@ export const buildInstallExpression = (params) => {
269
303
  function getWatcherFields() {
270
304
  var state = window[STATE_KEY];
271
305
  var i = state ? state.info : info;
306
+ var isRecording = state ? state.recording === true : indicatorState.recording === true;
272
307
  return [
273
308
  ['ID', i.watcherId],
274
309
  ['Host', i.watcherHost + ':' + i.watcherPort],
275
310
  ['PID', String(i.watcherPid)],
276
311
  ['Target', i.targetTitle || '(no title)'],
277
312
  ['URL', i.targetUrl || '(no url)'],
278
- ['Attached', new Date(i.attachedAt).toISOString()]
313
+ ['Attached', new Date(i.attachedAt).toISOString()],
314
+ ['Recording', isRecording ? 'active' : 'inactive']
279
315
  ];
280
316
  }
281
317
 
@@ -298,16 +334,34 @@ export const buildInstallExpression = (params) => {
298
334
  })();
299
335
  `;
300
336
  };
301
- /** Build a cheap page-side heartbeat update; the installed script keeps the DOM and TTL timer. */
302
- export const buildHeartbeatExpression = (info) => {
337
+ /** Build a cheap page-side heartbeat/state update; the installed script keeps the DOM and TTL timer. */
338
+ export const buildHeartbeatExpression = (info, state) => {
303
339
  const infoJson = JSON.stringify(info);
340
+ const stateJson = JSON.stringify(state);
341
+ const tooltipText = JSON.stringify(`Argus Watcher: ${info.watcherId}`);
304
342
  return `
305
343
  (function() {
344
+ var INDICATOR_ID = 'argus-watcher-indicator';
306
345
  var STATE_KEY = '__ARGUS_WATCHER_INDICATOR__';
346
+ var nextState = ${stateJson};
307
347
  var state = window[STATE_KEY];
308
348
  if (state) {
309
349
  state.lastSeenMs = Date.now();
310
350
  state.info = ${infoJson};
351
+ state.recording = nextState.recording === true;
352
+ var indicator = document.getElementById(INDICATOR_ID);
353
+ if (indicator) {
354
+ indicator.classList.toggle('argus-indicator-recording', state.recording);
355
+ indicator.setAttribute('data-recording', state.recording ? 'true' : 'false');
356
+ indicator.style.setProperty('--argus-recording-dot-opacity', state.recording ? '1' : '0');
357
+ indicator.style.setProperty('--argus-recording-dot-scale', state.recording ? '1' : '0.72');
358
+ indicator.style.setProperty('--argus-recording-dot-animation', state.recording ? 'argus-indicator-recording-pulse 1.15s ease-in-out infinite' : 'none');
359
+ var mainButton = indicator.querySelector('.argus-indicator-main');
360
+ if (mainButton) {
361
+ mainButton.setAttribute('title', state.recording ? 'Argus watcher: recording - copy info' : ${tooltipText});
362
+ mainButton.setAttribute('aria-label', state.recording ? 'Argus watcher recording: copy info' : 'Argus watcher: copy info');
363
+ }
364
+ }
311
365
  }
312
366
  })();
313
367
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"pageIndicatorScript.js","sourceRoot":"","sources":["../../src/cdp/pageIndicatorScript.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pageIndicatorScript.js","sourceRoot":"","sources":["../../src/cdp/pageIndicatorScript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { RecordRequest, RecordStartRequest, RecordStartResponse, RecordStopRequest, RecordStopResponse } from '@vforsh/argus-core';
2
+ import type { CdpSessionHandle } from './connection.js';
3
+ export type Recorder = {
4
+ capture: (request: RecordRequest) => Promise<RecordStopResponse>;
5
+ start: (request: RecordStartRequest) => Promise<RecordStartResponse>;
6
+ stop: (request: RecordStopRequest) => Promise<RecordStopResponse>;
7
+ onDetached: (reason?: string) => void;
8
+ };
9
+ export declare const createRecorder: (options: {
10
+ session: CdpSessionHandle;
11
+ pageSession?: CdpSessionHandle;
12
+ artifactsDir: string;
13
+ onRecordingStateChange?: (recording: boolean) => void;
14
+ }) => Recorder;
15
+ //# sourceMappingURL=recording.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../../src/cdp/recording.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAgB,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACrJ,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAwCvD,MAAM,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAChE,KAAK,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACpE,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACjE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACrC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,SAAS;IACvC,OAAO,EAAE,gBAAgB,CAAA;IACzB,WAAW,CAAC,EAAE,gBAAgB,CAAA;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,sBAAsB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;CACrD,KAAG,QA0KH,CAAA"}
@@ -0,0 +1,389 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import crypto from 'node:crypto';
4
+ import { spawn } from 'node:child_process';
5
+ import { ensureArtifactsDir, ensureParentDir, resolveArtifactPath } from '../artifacts.js';
6
+ import { createVisualCapturePlan } from './visualCapture.js';
7
+ const DEFAULT_RECORD_FPS = 30;
8
+ const FIRST_FRAME_TIMEOUT_MS = 2_000;
9
+ export const createRecorder = (options) => {
10
+ let active = null;
11
+ const capture = async (request) => {
12
+ await start(request);
13
+ await delay(request.durationMs);
14
+ return stop({});
15
+ };
16
+ const start = async (request) => {
17
+ if (active) {
18
+ throw new Error('Recording already active');
19
+ }
20
+ await ensureArtifactsDir(options.artifactsDir);
21
+ const format = resolveRecordFormat(request);
22
+ const fps = normalizeFps(request.fps);
23
+ const recordId = crypto.randomUUID();
24
+ const sessionName = `record-${new Date().toISOString().replace(/[:.]/g, '-')}`;
25
+ const defaultName = `recordings/${sessionName}.${format}`;
26
+ const { absolutePath, displayPath } = resolveArtifactPath(options.artifactsDir, request.outFile, defaultName);
27
+ validateOutputPathFormat(displayPath, format);
28
+ await ensureParentDir(absolutePath);
29
+ const capturePlan = await createVisualCapturePlan(options.session, options.pageSession, request);
30
+ const firstFrameDeferred = createDeferred();
31
+ const state = {
32
+ recordId,
33
+ sessionName,
34
+ absolutePath: path.resolve(absolutePath),
35
+ outFile: displayPath,
36
+ session: capturePlan.session,
37
+ removeFrameHandler: () => { },
38
+ ffmpeg: null,
39
+ firstFrame: firstFrameDeferred.promise,
40
+ resolveFirstFrame: firstFrameDeferred.resolve,
41
+ rejectFirstFrame: firstFrameDeferred.reject,
42
+ firstFrameTimer: setTimeout(() => {
43
+ firstFrameDeferred.reject(new Error('No screencast frames received. Make the page visible with `argus page show <id>` and try again.'));
44
+ }, FIRST_FRAME_TIMEOUT_MS),
45
+ sampleTimer: null,
46
+ latestFrame: null,
47
+ pendingFrameCount: 0,
48
+ pumpBlocked: false,
49
+ frameCount: 0,
50
+ startedAt: Date.now(),
51
+ capturedDurationMs: null,
52
+ fps,
53
+ format,
54
+ clip: capturePlan.clip,
55
+ viewport: capturePlan.viewport,
56
+ state: 'starting',
57
+ };
58
+ active = state;
59
+ try {
60
+ state.removeFrameHandler = state.session.onEvent('Page.screencastFrame', (params) => {
61
+ handleScreencastFrame(state, params);
62
+ });
63
+ await state.session.sendAndWait('Page.startScreencast', { format: 'png', everyNthFrame: 1 });
64
+ const firstFrame = await state.firstFrame;
65
+ clearTimeout(state.firstFrameTimer);
66
+ const frameSize = readPngSize(firstFrame);
67
+ state.ffmpeg = await startFfmpeg({
68
+ absolutePath: state.absolutePath,
69
+ fps,
70
+ format,
71
+ clip: state.clip,
72
+ viewport: state.viewport,
73
+ frameSize,
74
+ });
75
+ state.state = 'recording';
76
+ state.startedAt = Date.now();
77
+ queueFrameSample(state);
78
+ state.sampleTimer = setInterval(() => queueFrameSample(state), Math.round(1000 / fps));
79
+ options.onRecordingStateChange?.(true);
80
+ return {
81
+ ok: true,
82
+ recordId,
83
+ sessionName,
84
+ outFile: displayPath,
85
+ format,
86
+ fps,
87
+ clipped: Boolean(state.clip),
88
+ };
89
+ }
90
+ catch (error) {
91
+ active = null;
92
+ await cleanupFailedStart(state, error);
93
+ throw error;
94
+ }
95
+ };
96
+ const stop = async (request) => {
97
+ const state = active;
98
+ if (!state) {
99
+ throw new Error('No active recording to stop');
100
+ }
101
+ if (request.recordId && request.recordId !== state.recordId) {
102
+ throw new Error('Record id does not match active recording');
103
+ }
104
+ if (state.state === 'stopping') {
105
+ await state.ffmpeg?.completion;
106
+ await resolveFinalPath(state, request.outFile);
107
+ return buildStopResponse(state);
108
+ }
109
+ state.state = 'stopping';
110
+ clearRecordingTimers(state);
111
+ state.removeFrameHandler();
112
+ state.capturedDurationMs = Math.max(0, Date.now() - state.startedAt);
113
+ try {
114
+ await state.session.sendAndWait('Page.stopScreencast', {}, { timeoutMs: 5_000 }).catch(() => { });
115
+ queueMissingDurationFrames(state);
116
+ await flushQueuedFrames(state);
117
+ state.ffmpeg?.child.stdin.end();
118
+ await state.ffmpeg?.completion;
119
+ await resolveFinalPath(state, request.outFile);
120
+ return buildStopResponse(state);
121
+ }
122
+ finally {
123
+ if (active === state) {
124
+ active = null;
125
+ }
126
+ options.onRecordingStateChange?.(false);
127
+ }
128
+ };
129
+ const onDetached = (reason) => {
130
+ const state = active;
131
+ if (!state) {
132
+ return;
133
+ }
134
+ active = null;
135
+ clearRecordingTimers(state);
136
+ state.removeFrameHandler();
137
+ state.rejectFirstFrame(new Error(reason ?? 'CDP detached while recording'));
138
+ state.ffmpeg?.child.kill('SIGTERM');
139
+ options.onRecordingStateChange?.(false);
140
+ };
141
+ return { capture, start, stop, onDetached };
142
+ async function resolveFinalPath(state, outFile) {
143
+ if (!outFile?.trim()) {
144
+ return;
145
+ }
146
+ const { absolutePath, displayPath } = resolveArtifactPath(options.artifactsDir, outFile, `recordings/${state.sessionName}.${state.format}`);
147
+ validateOutputPathFormat(displayPath, state.format);
148
+ if (path.resolve(absolutePath) === state.absolutePath) {
149
+ return;
150
+ }
151
+ await ensureParentDir(absolutePath);
152
+ try {
153
+ await fs.rename(state.absolutePath, absolutePath);
154
+ }
155
+ catch (error) {
156
+ const nodeError = error;
157
+ if (nodeError.code !== 'EXDEV') {
158
+ throw error;
159
+ }
160
+ await fs.copyFile(state.absolutePath, absolutePath);
161
+ await fs.unlink(state.absolutePath);
162
+ }
163
+ state.absolutePath = path.resolve(absolutePath);
164
+ state.outFile = displayPath;
165
+ }
166
+ };
167
+ const handleScreencastFrame = (state, params) => {
168
+ const payload = params;
169
+ if (typeof payload.data !== 'string') {
170
+ return;
171
+ }
172
+ const frame = Buffer.from(payload.data, 'base64');
173
+ state.latestFrame = frame;
174
+ state.resolveFirstFrame(frame);
175
+ if (typeof payload.sessionId === 'number') {
176
+ void state.session.sendAndWait('Page.screencastFrameAck', { sessionId: payload.sessionId }).catch(() => { });
177
+ }
178
+ };
179
+ const queueFrameSample = (state) => {
180
+ if (!state.latestFrame || state.state !== 'recording') {
181
+ return;
182
+ }
183
+ state.pendingFrameCount += 1;
184
+ pumpQueuedFrames(state);
185
+ };
186
+ const queueMissingDurationFrames = (state) => {
187
+ if (!state.latestFrame) {
188
+ return;
189
+ }
190
+ const elapsedMs = state.capturedDurationMs ?? Math.max(0, Date.now() - state.startedAt);
191
+ const targetFrameCount = Math.max(1, Math.round((elapsedMs / 1000) * state.fps));
192
+ const queuedOrWritten = state.frameCount + state.pendingFrameCount;
193
+ if (queuedOrWritten < targetFrameCount) {
194
+ state.pendingFrameCount += targetFrameCount - queuedOrWritten;
195
+ }
196
+ };
197
+ const flushQueuedFrames = async (state) => {
198
+ pumpQueuedFrames(state);
199
+ while (state.pendingFrameCount > 0 || state.pumpBlocked) {
200
+ if (!state.ffmpeg || state.ffmpeg.child.stdin.destroyed) {
201
+ return;
202
+ }
203
+ await delay(10);
204
+ pumpQueuedFrames(state);
205
+ }
206
+ };
207
+ const pumpQueuedFrames = (state) => {
208
+ if (!state.latestFrame || !state.ffmpeg || state.pumpBlocked || state.ffmpeg.child.stdin.destroyed) {
209
+ return;
210
+ }
211
+ while (state.pendingFrameCount > 0) {
212
+ state.pendingFrameCount -= 1;
213
+ state.frameCount += 1;
214
+ const ready = state.ffmpeg.child.stdin.write(state.latestFrame);
215
+ if (!ready) {
216
+ state.pumpBlocked = true;
217
+ state.ffmpeg.child.stdin.once('drain', () => {
218
+ state.pumpBlocked = false;
219
+ pumpQueuedFrames(state);
220
+ });
221
+ return;
222
+ }
223
+ }
224
+ };
225
+ const startFfmpeg = async (options) => {
226
+ const ffmpeg = process.env.ARGUS_FFMPEG?.trim() || 'ffmpeg';
227
+ const filter = buildVideoFilter(options);
228
+ const args = [
229
+ '-hide_banner',
230
+ '-loglevel',
231
+ 'error',
232
+ '-f',
233
+ 'image2pipe',
234
+ '-framerate',
235
+ String(options.fps),
236
+ '-vcodec',
237
+ 'png',
238
+ '-i',
239
+ 'pipe:0',
240
+ '-an',
241
+ '-vf',
242
+ filter,
243
+ ...buildEncoderArgs(options.format),
244
+ '-y',
245
+ options.absolutePath,
246
+ ];
247
+ const child = spawn(ffmpeg, args, { stdio: ['pipe', 'ignore', 'pipe'] });
248
+ let stderr = '';
249
+ child.stderr.setEncoding('utf8');
250
+ child.stderr.on('data', (chunk) => {
251
+ stderr = `${stderr}${chunk}`.slice(-4000);
252
+ });
253
+ const completion = new Promise((resolve, reject) => {
254
+ child.once('error', (error) => reject(formatFfmpegError(error)));
255
+ child.once('close', (code) => {
256
+ if (code === 0) {
257
+ resolve();
258
+ return;
259
+ }
260
+ reject(new Error(`ffmpeg failed with exit code ${code ?? 'unknown'}${stderr ? `: ${stderr.trim()}` : ''}`));
261
+ });
262
+ });
263
+ void completion.catch(() => { });
264
+ await new Promise((resolve, reject) => {
265
+ child.once('spawn', () => resolve());
266
+ child.once('error', (error) => reject(formatFfmpegError(error)));
267
+ });
268
+ return { child, completion };
269
+ };
270
+ const buildVideoFilter = (options) => {
271
+ if (!options.clip) {
272
+ return 'scale=trunc(iw/2)*2:trunc(ih/2)*2,format=yuv420p';
273
+ }
274
+ if (!options.viewport) {
275
+ throw new Error('Unable to compute viewport size for recording crop');
276
+ }
277
+ const ratioX = options.frameSize.width / options.viewport.width;
278
+ const ratioY = options.frameSize.height / options.viewport.height;
279
+ const x = clampEven(options.clip.x * ratioX, 0, options.frameSize.width - 2);
280
+ const y = clampEven(options.clip.y * ratioY, 0, options.frameSize.height - 2);
281
+ const width = clampEven(options.clip.width * ratioX, 2, options.frameSize.width - x);
282
+ const height = clampEven(options.clip.height * ratioY, 2, options.frameSize.height - y);
283
+ return `crop=${width}:${height}:${x}:${y},format=yuv420p`;
284
+ };
285
+ const cleanupFailedStart = async (state, error) => {
286
+ clearRecordingTimers(state);
287
+ state.removeFrameHandler();
288
+ await state.session.sendAndWait('Page.stopScreencast', {}, { timeoutMs: 5_000 }).catch(() => { });
289
+ state.ffmpeg?.child.kill('SIGTERM');
290
+ state.ffmpeg?.child.stdin.destroy();
291
+ try {
292
+ await fs.unlink(state.absolutePath);
293
+ }
294
+ catch {
295
+ // Best effort: the encoder may not have created the file yet.
296
+ }
297
+ if (error instanceof Error && error.message.startsWith('spawn ffmpeg ENOENT')) {
298
+ throw formatFfmpegError(error);
299
+ }
300
+ };
301
+ const clearRecordingTimers = (state) => {
302
+ clearTimeout(state.firstFrameTimer);
303
+ if (state.sampleTimer) {
304
+ clearInterval(state.sampleTimer);
305
+ state.sampleTimer = null;
306
+ }
307
+ };
308
+ const buildStopResponse = (state) => ({
309
+ ok: true,
310
+ recordId: state.recordId,
311
+ sessionName: state.sessionName,
312
+ outFile: state.outFile,
313
+ format: state.format,
314
+ frameCount: state.frameCount,
315
+ durationMs: state.capturedDurationMs ?? Math.max(0, Date.now() - state.startedAt),
316
+ fps: state.fps,
317
+ clipped: Boolean(state.clip),
318
+ });
319
+ const normalizeFps = (fps) => {
320
+ if (fps == null) {
321
+ return DEFAULT_RECORD_FPS;
322
+ }
323
+ return Math.min(60, Math.max(1, Math.round(fps)));
324
+ };
325
+ const resolveRecordFormat = (request) => request.format ?? inferRecordFormatFromPath(request.outFile) ?? 'mp4';
326
+ const inferRecordFormatFromPath = (outFile) => {
327
+ const ext = path.extname(outFile?.trim() ?? '').toLowerCase();
328
+ if (ext === '.mp4')
329
+ return 'mp4';
330
+ if (ext === '.webm')
331
+ return 'webm';
332
+ return undefined;
333
+ };
334
+ const validateOutputPathFormat = (outFile, format) => {
335
+ const ext = path.extname(outFile.trim()).toLowerCase();
336
+ if (ext && ext !== '.mp4' && ext !== '.webm') {
337
+ throw new Error('Recording output must use .mp4 or .webm when an extension is provided');
338
+ }
339
+ const inferred = inferRecordFormatFromPath(outFile);
340
+ if (inferred && inferred !== format) {
341
+ throw new Error(`Output extension .${inferred} does not match recording format ${format}`);
342
+ }
343
+ };
344
+ const buildEncoderArgs = (format) => {
345
+ if (format === 'webm') {
346
+ return ['-c:v', 'libvpx', '-deadline', 'realtime', '-cpu-used', '5', '-b:v', '1M', '-f', 'webm'];
347
+ }
348
+ // yuv420p + H.264 keeps files playable in Finder, QuickTime, iOS Photos, Slack, and browsers.
349
+ return ['-c:v', 'libx264', '-preset', 'veryfast', '-crf', '23', '-movflags', '+faststart', '-f', 'mp4'];
350
+ };
351
+ const readPngSize = (buffer) => {
352
+ if (buffer.length < 24 ||
353
+ buffer[0] !== 0x89 ||
354
+ buffer[1] !== 0x50 ||
355
+ buffer[2] !== 0x4e ||
356
+ buffer[3] !== 0x47 ||
357
+ buffer[4] !== 0x0d ||
358
+ buffer[5] !== 0x0a ||
359
+ buffer[6] !== 0x1a ||
360
+ buffer[7] !== 0x0a) {
361
+ throw new Error('Expected PNG screencast frame');
362
+ }
363
+ return {
364
+ width: buffer.readUInt32BE(16),
365
+ height: buffer.readUInt32BE(20),
366
+ };
367
+ };
368
+ const clampEven = (value, min, max) => {
369
+ const clamped = Math.min(max, Math.max(min, Math.floor(value)));
370
+ return Math.max(2, Math.floor(clamped / 2) * 2);
371
+ };
372
+ const formatFfmpegError = (error) => {
373
+ const nodeError = error;
374
+ if (nodeError.code === 'ENOENT') {
375
+ return new Error('ffmpeg not found. Install ffmpeg or pass ARGUS_FFMPEG=/path/to/ffmpeg.');
376
+ }
377
+ return error instanceof Error ? error : new Error(String(error));
378
+ };
379
+ const createDeferred = () => {
380
+ let resolve;
381
+ let reject;
382
+ const promise = new Promise((nextResolve, nextReject) => {
383
+ resolve = nextResolve;
384
+ reject = nextReject;
385
+ });
386
+ return { promise, resolve, reject };
387
+ };
388
+ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
389
+ //# sourceMappingURL=recording.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording.js","sourceRoot":"","sources":["../../src/cdp/recording.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/cdp/screenshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAwB,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACrG,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,iBAAiB,CAAA;AAqBzE,MAAM,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;CACpE,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,SAAS;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,KAAG,aAuBlI,CAAA"}
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/cdp/screenshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAYvD,MAAM,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;CACpE,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,SAAS;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,KAAG,aAuBlI,CAAA"}