@keepsnappy/appium-driver 0.1.0-alpha.12 → 0.1.0-alpha.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.
package/dist/src/run.js CHANGED
@@ -1,12 +1,15 @@
1
- import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { parseArgs } from 'node:util';
4
4
  import { basicAuth, HUB, resolveApp, sessionCaps, sessionDetail } from './browserstack.js';
5
5
  import { END_GC_DEFAULT } from './links.js';
6
6
  import { platformOf } from './platform.js';
7
- import { Session } from './session.js';
7
+ import { FLUSH_END_RUN_FAILED, FLUSH_ERROR, FLUSH_NOT_ACKNOWLEDGED, FLUSH_OFF, FLUSH_UNREADABLE, Session } from './session.js';
8
8
  import { parseTokensJs, plan } from './tokens.js';
9
9
  import { Driver, realSleep } from './webdriver.js';
10
+ export const TERMINATION_BUDGET = { captureMs: 20_000, endMs: 10_000, hardMs: 45_000 };
11
+ const EXIT_CODE = { SIGTERM: 143, SIGINT: 130 };
12
+ export const realProcessHooks = { on: (s, h) => void process.on(s, h), off: (s, h) => void process.off(s, h), exit: (c) => process.exit(c) };
10
13
  export const realRunDeps = () => ({
11
14
  env: process.env,
12
15
  fetch: fetch,
@@ -14,8 +17,9 @@ export const realRunDeps = () => ({
14
17
  sleep: realSleep,
15
18
  print: (l) => console.log(l),
16
19
  error: (l) => console.error(l),
20
+ process: realProcessHooks,
17
21
  });
18
- /** The flags `perflab farm run` passes (docs/plans/54a section 4); a journey module adds its own through `options`. */
22
+ /** The flags `keepsnappy farm run` passes (docs/plans/54a section 4); a journey module adds its own through `options`. */
19
23
  export const DRIVER_OPTIONS = {
20
24
  'journey-module': { type: 'string' },
21
25
  app: { type: 'string' },
@@ -42,10 +46,26 @@ export function parseDriverArgs(argv, module) {
42
46
  export function journeyModulePath(argv) {
43
47
  return parseArgs({ args: [...argv], options: { 'journey-module': { type: 'string' } }, strict: false }).values['journey-module'];
44
48
  }
49
+ /** Writes a temp file and renames it over the target, so a reader (or a kill) never sees half a file. */
50
+ function writeAtomic(file, text) {
51
+ const tmp = `${file}.${process.pid}.tmp`;
52
+ writeFileSync(tmp, text);
53
+ renameSync(tmp, file);
54
+ }
55
+ /** The failure source and screen, each written as it arrives. */
56
+ async function captureFailure(driver, out) {
57
+ const source = driver.cmd('GET', '/source').then((s) => void (typeof s === 'string' && writeFileSync(join(out, 'failure-source.xml'), s)), () => null);
58
+ const screen = driver.cmd('GET', '/screenshot').then((png) => void (typeof png === 'string' && writeFileSync(join(out, 'failure-screen.png'), Buffer.from(png, 'base64'))), () => null);
59
+ await Promise.all([source, screen]);
60
+ }
45
61
  /**
46
62
  * One BrowserStack App Automate session that runs every iteration of the module's journeys, then a final flush, and
47
- * writes <out>/driver-log.json and <out>/browserstack.<platform>.json in the shape `perflab farm close --bs-build`
63
+ * writes <out>/driver-log.json and <out>/browserstack.<platform>.json in the shape `keepsnappy farm close --bs-build`
48
64
  * reads. Returns the exit code: 0, or 1 when the session or an iteration failed (the result files are written anyway).
65
+ *
66
+ * driver-log.json is rewritten (atomically) at every step and iteration boundary, `status` saying where the run is. A SIGTERM or
67
+ * SIGINT flushes it as `terminated` first, then captures the failure screen and ends the session within `TERMINATION_BUDGET`, and
68
+ * exits; a second signal exits at once.
49
69
  */
50
70
  export async function runDriver(argv, module, deps = realRunDeps()) {
51
71
  const a = parseDriverArgs(argv, module);
@@ -71,69 +91,208 @@ export async function runDriver(argv, module, deps = realRunDeps()) {
71
91
  const auth = basicAuth(user, key);
72
92
  mkdirSync(out, { recursive: true });
73
93
  const { api, tokens } = parseTokensJs(readFileSync(String(a['tokens-js']), 'utf8'));
74
- const appUrl = await resolveApp(String(a.app), String(a['app-custom-id'] ?? ''), auth, deps.fetch, platform);
75
- deps.print(`app: ${appUrl}`);
76
94
  const log = [];
77
95
  const driver = new Driver({ hub: HUB, log, headers: { Authorization: auth }, bundleId: module.app.bundleId, platform, fetch: deps.fetch, now: deps.now, sleep: deps.sleep });
78
96
  const t = new Session({ driver, scheme: module.app.scheme, fetch: deps.fetch, api, actionGc: a['action-gc'] === 'on', endGc: a['end-gc'] === 'on' });
79
- const sessionName = module.sessionName ?? 'perflab (appium)';
97
+ const sessionName = module.sessionName ?? 'keepsnappy (appium)';
80
98
  const device = String(a.device);
81
99
  const ctx = { fetch: deps.fetch, tokens, journeys, repeat, args: a };
82
- const caps = sessionCaps({ appUrl, device, buildName: String(a['build-name']), sessionName, appiumVersion: String(a['appium-version']), platform, localIdentifier: a['local-identifier'] });
83
- const startedAt = deps.now();
100
+ let startedAt = deps.now();
101
+ let endedAt = null;
102
+ let appUrl = null;
103
+ let buildId = null;
104
+ let status = 'running';
105
+ let signal = null;
84
106
  let error = null;
107
+ let finalFlush = null;
108
+ let flushNotAcknowledged = [];
109
+ let flushError = [];
110
+ let flushOff = [];
85
111
  const iterations = [];
112
+ let terminating = false;
113
+ const logFile = join(out, 'driver-log.json');
114
+ const persist = () => {
115
+ const last = t.stepLog.at(-1);
116
+ const body = {
117
+ driver: 'appium', status, device, appUrl, session: driver.sessionId, buildId, linkMode: t.linkState.linkMode ?? null, actionGc: t.actionGc, endGc: t.endGc, linkError: t.linkState.linkError ?? null,
118
+ startedAt, endedAt, total_ms: (endedAt ?? deps.now()) - startedAt, error: error?.message ?? null, signal,
119
+ lastStep: last ? { name: last.name, t: last.t, journey: last.journey ?? null, iteration: last.iteration ?? null } : null,
120
+ flushNotAcknowledged, flushError, flushOff, finalFlush, steps: t.stepLog, iterations, commands: log,
121
+ };
122
+ writeAtomic(logFile, `${JSON.stringify(body, null, 2)}\n`);
123
+ };
124
+ // Mid-run writes never fail the run: a full disk costs the log, not the measurement.
125
+ const progress = () => {
126
+ if (terminating)
127
+ return;
128
+ try {
129
+ persist();
130
+ }
131
+ catch (e) {
132
+ deps.error(`::warning::driver-log.json not written: ${e instanceof Error ? e.message : String(e)}`);
133
+ }
134
+ };
135
+ let dashboard = null;
136
+ /** The file `keepsnappy farm close --bs-build` reads; `failure` is the session's error message, null when it passed. */
137
+ const writeBuild = (failure) => writeAtomic(join(out, `browserstack.${String(a.platform)}.json`), `${JSON.stringify({
138
+ driver: 'appium',
139
+ status: failure === null ? 'passed' : 'failed',
140
+ buildId,
141
+ dashboard,
142
+ devices: [{ device, sessions: [{ id: driver.sessionId, ...(failure === null ? {} : { error: { message: failure } }) }] }],
143
+ }, null, 2)}\n`);
144
+ const readDetail = async () => {
145
+ const detail = driver.sessionId ? await sessionDetail(driver.sessionId, auth, deps.fetch) : {};
146
+ buildId = detail.build_hashed_id ?? null;
147
+ dashboard = detail.public_url ?? detail.browser_url ?? null;
148
+ };
149
+ const setSessionStatus = (failed, reason) => driver.execute(`browserstack_executor: ${JSON.stringify({ action: 'setSessionStatus', arguments: { status: failed ? 'failed' : 'passed', reason } })}`).catch(() => null);
150
+ const proc = deps.process;
151
+ const budget = { ...TERMINATION_BUDGET, ...deps.term };
152
+ const timers = new Set();
153
+ const within = async (ms, work) => {
154
+ let timer;
155
+ await Promise.race([work.catch(() => null), new Promise((resolve) => timers.add((timer = setTimeout(resolve, ms))))]);
156
+ clearTimeout(timer);
157
+ };
158
+ const leave = (code) => {
159
+ for (const timer of timers)
160
+ clearTimeout(timer);
161
+ timers.clear();
162
+ proc?.exit(code);
163
+ };
164
+ const onSignal = (sig) => async () => {
165
+ if (terminating)
166
+ return leave(EXIT_CODE[sig]);
167
+ terminating = true;
168
+ signal = sig;
169
+ status = 'terminated';
170
+ error ??= new Error('terminated');
171
+ endedAt = deps.now();
172
+ const stopped = t.stepLog.at(-1);
173
+ deps.error(`::error::terminated by ${sig}${stopped ? ` in step ${stopped.name}` : ''}`);
174
+ try {
175
+ persist();
176
+ }
177
+ catch (e) {
178
+ deps.error(`::warning::driver-log.json not written: ${e instanceof Error ? e.message : String(e)}`);
179
+ }
180
+ timers.add(setTimeout(() => leave(EXIT_CODE[sig]), budget.hardMs));
181
+ try {
182
+ if (driver.sessionId) {
183
+ await within(budget.captureMs, captureFailure(driver, out));
184
+ await within(budget.endMs, (async () => {
185
+ await setSessionStatus(true, `terminated by ${sig}`.slice(0, 250));
186
+ await driver.end();
187
+ await readDetail();
188
+ })());
189
+ writeBuild(`terminated by ${sig}`);
190
+ }
191
+ endedAt = deps.now();
192
+ persist();
193
+ }
194
+ catch (e) {
195
+ deps.error(`::warning::termination cleanup failed: ${e instanceof Error ? e.message : String(e)}`);
196
+ }
197
+ finally {
198
+ leave(EXIT_CODE[sig]);
199
+ }
200
+ };
201
+ const handlers = ['SIGTERM', 'SIGINT'].map((sig) => [sig, onSignal(sig)]);
202
+ for (const [sig, handler] of handlers)
203
+ proc?.on(sig, handler);
204
+ t.onStepChange = progress;
205
+ progress();
86
206
  try {
87
- await driver.start(caps);
88
- deps.print(`session ${driver.sessionId}`);
89
- await driver
90
- .cmd('POST', '/appium/settings', { settings: platform.settings })
91
- .catch(() => null);
92
- await module.setup?.(t, ctx);
93
- await runIterations(t, module, ctx, iterations);
207
+ appUrl = await resolveApp(String(a.app), String(a['app-custom-id'] ?? ''), auth, deps.fetch, platform);
208
+ deps.print(`app: ${appUrl}`);
209
+ const caps = sessionCaps({ appUrl, device, buildName: String(a['build-name']), sessionName, appiumVersion: String(a['appium-version']), platform, localIdentifier: a['local-identifier'] });
210
+ startedAt = deps.now();
211
+ try {
212
+ await driver.start(caps);
213
+ deps.print(`session ${driver.sessionId}`);
214
+ progress();
215
+ await driver
216
+ .cmd('POST', '/appium/settings', { settings: platform.settings })
217
+ .catch(() => null);
218
+ await module.setup?.(t, ctx);
219
+ await runIterations(t, module, ctx, iterations, progress);
220
+ }
221
+ catch (e) {
222
+ error = e instanceof Error ? e : new Error(String(e));
223
+ deps.error(`::error::${error.message}`);
224
+ progress();
225
+ if (driver.sessionId)
226
+ await captureFailure(driver, out);
227
+ }
228
+ if (driver.sessionId) {
229
+ // A failed iteration still sends what it measured.
230
+ driver.context = { phase: 'final-flush' };
231
+ t.lastFlush = null;
232
+ progress();
233
+ try {
234
+ finalFlush = { flushed: await t.endRun(), flush: t.lastFlush };
235
+ }
236
+ catch (e) {
237
+ const started = t.lastFlush ?? { linkAt: null, resentAt: null, ackAt: null, gaveUpAt: null };
238
+ finalFlush = { flushed: FLUSH_END_RUN_FAILED, flush: { ...started, gaveUpAt: deps.now(), error: e instanceof Error ? e.message : String(e) } };
239
+ }
240
+ progress();
241
+ await setSessionStatus(!!error, error ? error.message.slice(0, 250) : `${sessionName} done`);
242
+ }
243
+ // A run whose flush the SDK never acknowledged, or answered `error` (its data did not upload), cannot be judged: never a clean
244
+ // exit. The device session keeps its own status, so the farm closes the set with what arrived and blames no run for it.
245
+ // `off` (no upload configured) counts only where an upload was expected: a run with a token, and the final flush of a session
246
+ // that had one. A local run without tokens uploads nothing by design.
247
+ const flushedAs = (flushStatus, tokenOnly = false) => [
248
+ ...iterations.filter((r) => r.flushed === flushStatus && (!tokenOnly || r.token)).map((r) => `${r.journey} #${r.iteration}`),
249
+ ...(finalFlush?.flushed === flushStatus && (!tokenOnly || iterations.some((r) => r.token)) ? ['final flush'] : []),
250
+ ];
251
+ flushNotAcknowledged = [...flushedAs(FLUSH_NOT_ACKNOWLEDGED), ...flushedAs(FLUSH_UNREADABLE), ...flushedAs(FLUSH_END_RUN_FAILED)];
252
+ flushError = flushedAs(FLUSH_ERROR);
253
+ flushOff = flushedAs(FLUSH_OFF, true);
254
+ if (flushNotAcknowledged.length)
255
+ deps.error(`::error::flush not acknowledged (no answer after the re-send, an unreadable answer, or a failed end-run): ${flushNotAcknowledged.join(', ')}`);
256
+ if (flushError.length)
257
+ deps.error(`::error::flush answered error (data not uploaded): ${flushError.join(', ')}`);
258
+ if (flushOff.length)
259
+ deps.error(`::error::flush answered off in a run with a token (upload not configured, nothing uploaded): ${flushOff.join(', ')}`);
260
+ endedAt = deps.now();
261
+ await driver.end();
262
+ await readDetail();
263
+ const failed = !!(error || flushNotAcknowledged.length || flushError.length || flushOff.length);
264
+ if (terminating)
265
+ return EXIT_CODE[signal ?? 'SIGTERM'];
266
+ writeBuild(error?.message ?? null);
267
+ status = failed ? 'error' : 'done';
268
+ persist();
269
+ deps.print(`driver-log.json: ${log.length} commands, ${iterations.length} iterations, ${Math.round((endedAt - startedAt) / 1000)} s`);
270
+ for (const r of iterations)
271
+ deps.print(` ${r.journey} #${r.iteration}: ${r.total_ms ?? '?'} ms, flushed=${r.flushed}`);
272
+ return failed ? 1 : 0;
94
273
  }
95
274
  catch (e) {
96
- error = e instanceof Error ? e : new Error(String(e));
97
- deps.error(`::error::${error.message}`);
98
- if (driver.sessionId) {
99
- const source = await driver.cmd('GET', '/source').catch(() => null);
100
- if (typeof source === 'string')
101
- writeFileSync(join(out, 'failure-source.xml'), source);
102
- const png = await driver.cmd('GET', '/screenshot').catch(() => null);
103
- if (typeof png === 'string')
104
- writeFileSync(join(out, 'failure-screen.png'), Buffer.from(png, 'base64'));
275
+ // Something outside the journey broke (the app lookup, the result files): the log must not stay `running`.
276
+ if (!terminating) {
277
+ status = 'error';
278
+ error ??= e instanceof Error ? e : new Error(String(e));
279
+ endedAt = deps.now();
280
+ progress();
105
281
  }
282
+ throw e;
106
283
  }
107
- if (driver.sessionId) {
108
- // A failed iteration still sends what it measured.
109
- driver.context = { phase: 'final-flush' };
110
- await t.endRun().catch(() => null);
111
- const reason = error ? error.message.slice(0, 250) : `${sessionName} done`;
112
- await driver.execute(`browserstack_executor: ${JSON.stringify({ action: 'setSessionStatus', arguments: { status: error ? 'failed' : 'passed', reason } })}`).catch(() => null);
284
+ finally {
285
+ for (const [sig, handler] of handlers)
286
+ proc?.off(sig, handler);
113
287
  }
114
- const endedAt = deps.now();
115
- await driver.end();
116
- const detail = driver.sessionId ? await sessionDetail(driver.sessionId, auth, deps.fetch) : {};
117
- const buildId = detail.build_hashed_id ?? null;
118
- writeFileSync(join(out, `browserstack.${String(a.platform)}.json`), `${JSON.stringify({
119
- driver: 'appium',
120
- status: error ? 'failed' : 'passed',
121
- buildId,
122
- dashboard: detail.public_url ?? detail.browser_url ?? null,
123
- devices: [{ device, sessions: [{ id: driver.sessionId, ...(error ? { error: { message: error.message } } : {}) }] }],
124
- }, null, 2)}\n`);
125
- writeFileSync(join(out, 'driver-log.json'), `${JSON.stringify({ driver: 'appium', device, appUrl, session: driver.sessionId, buildId, linkMode: t.linkState.linkMode ?? null, actionGc: t.actionGc, endGc: t.endGc, linkError: t.linkState.linkError ?? null, startedAt, endedAt, total_ms: endedAt - startedAt, error: error?.message ?? null, iterations, commands: log }, null, 2)}\n`);
126
- deps.print(`driver-log.json: ${log.length} commands, ${iterations.length} iterations, ${Math.round((endedAt - startedAt) / 1000)} s`);
127
- for (const r of iterations)
128
- deps.print(` ${r.journey} #${r.iteration}: ${r.total_ms ?? '?'} ms, flushed=${r.flushed}`);
129
- return error ? 1 : 0;
130
288
  }
131
289
  /** Per iteration: begin-run (relaunch, home, activation link), the journey, `run:complete`, end-run (markers, flush link). */
132
- async function runIterations(t, module, ctx, iterations) {
290
+ async function runIterations(t, module, ctx, iterations, progress) {
133
291
  const { driver } = t;
134
292
  for (const it of plan(ctx.journeys, ctx.repeat, ctx.tokens)) {
135
293
  const rec = { journey: it.journey, iteration: it.iteration, token: it.token !== '' };
136
294
  iterations.push(rec);
295
+ progress();
137
296
  driver.context = { journey: it.journey, iteration: it.iteration, phase: 'begin' };
138
297
  const t0 = t.now();
139
298
  rec.alert = await t.beginRun({ token: it.token, home: module.home, ...(module.sdkArgs ? { args: module.sdkArgs } : {}) });
@@ -150,8 +309,10 @@ async function runIterations(t, module, ctx, iterations) {
150
309
  rec.ready = { n: waits.length, ms: waits.reduce((x, y) => x + y, 0) };
151
310
  driver.context = { ...driver.context, phase: 'end' };
152
311
  rec.flushed = await t.endRun();
312
+ rec.flush = t.lastFlush;
153
313
  const t3 = t.now();
154
314
  Object.assign(rec, { t_start: t0, begin_ms: t1 - t0, journey_ms: t2 - t1, end_ms: t3 - t2, total_ms: t3 - t0 });
315
+ progress();
155
316
  }
156
317
  }
157
318
  //# sourceMappingURL=run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export interface Marker {
9
9
  /** The GC command answered just before this step's start (GC before the action). */
10
10
  gc_n?: number;
11
11
  }
12
- /** One request/response round trip with the PerfLab API: t0/t3 this host's send/receive, t1/t2 the server's receive/send. */
12
+ /** One request/response round trip with the KeepSnappy API: t0/t3 this host's send/receive, t1/t2 the server's receive/send. */
13
13
  export interface ClockTrip {
14
14
  t0: number;
15
15
  t1: number;
@@ -37,6 +37,38 @@ export interface SendOptions {
37
37
  */
38
38
  export declare function sendMarkers(fetchImpl: FetchLike, api: string, markers: Marker[], opts?: SendOptions): Promise<number>;
39
39
  export declare const FLUSH_WAIT_MS: number;
40
+ /**
41
+ * No `keepsnappy.flushed` this long after the flush link: the link goes once more (a link or an ack lost on the way). Acks on the
42
+ * emulator and the farm came 5 to 37 s after the link (2026-10-21: 4.9 s, about 20 s, 34 s); 90 s is well clear of them. A re-send
43
+ * during a slow but live flush costs nothing: the SDK runs the second flush after the first, whose ack still shows.
44
+ */
45
+ export declare const FLUSH_RESEND_MS = 90000;
46
+ export declare const FLUSH_NOT_ACKNOWLEDGED = "not acknowledged (re-sent once)";
47
+ /** The flush of one run, host clock: when the link went, when it went again, when the SDK's ack was read or the driver gave up. */
48
+ export interface FlushEvidence {
49
+ /** null: the end-run failed before its link went. */
50
+ linkAt: number | null;
51
+ resentAt: number | null;
52
+ ackAt: number | null;
53
+ gaveUpAt: number | null;
54
+ /** The SDK's own words on its answer (with `error`: what failed to upload), without the ack echo. */
55
+ detail?: string | null;
56
+ /** Why the end-run itself failed (markers, the link). */
57
+ error?: string;
58
+ /** An answer whose status could not be read: what the element held (status null: the read failed). */
59
+ raw?: {
60
+ status: unknown;
61
+ detail: string | null;
62
+ };
63
+ }
64
+ /** An answer whose status could not be read, or is none of ok / error / off: no confirmed upload. */
65
+ export declare const FLUSH_UNREADABLE = "not acknowledged (unreadable answer)";
66
+ /** An end-run that threw before an answer was read: as unacknowledged as a flush with no answer. */
67
+ export declare const FLUSH_END_RUN_FAILED = "not acknowledged (end-run failed)";
68
+ /** The SDK's answer when the run's data did not upload. */
69
+ export declare const FLUSH_ERROR = "error";
70
+ /** The SDK's answer when it has no upload configured: nothing went up. */
71
+ export declare const FLUSH_OFF = "off";
40
72
  type Step = () => Promise<unknown> | unknown;
41
73
  /** One thing a step expects of the screen: an element shown, an element gone, or the keyboard up or down. */
42
74
  export type Condition = {
@@ -61,6 +93,16 @@ export interface SessionOptions {
61
93
  */
62
94
  endGc?: boolean;
63
95
  }
96
+ /** One declared step as the driver log keeps it: `ms` is null while the step is still running. */
97
+ export interface StepRecord {
98
+ journey: unknown;
99
+ iteration: unknown;
100
+ name: string;
101
+ depth: number;
102
+ t: number;
103
+ ms: number | null;
104
+ failed?: true;
105
+ }
64
106
  /** One measured session: the phone, the run tokens, and the step vocabulary a journey calls. */
65
107
  export declare class Session {
66
108
  readonly driver: Driver;
@@ -83,6 +125,10 @@ export declare class Session {
83
125
  gcN: number;
84
126
  /** Steps open right now: a step inside another step's action sends no GC, which would land inside the outer step. */
85
127
  stepDepth: number;
128
+ /** Every declared step in start order, for the driver log. */
129
+ readonly stepLog: StepRecord[];
130
+ /** Called when a top-level step starts and when it ends, outside its start and end markers (the driver log is rewritten then). */
131
+ onStepChange: (() => void) | null;
86
132
  /** Elements looked up again after going stale, over the session (see `frameOf`). */
87
133
  private refinds;
88
134
  get staleRefinds(): number;
@@ -94,6 +140,15 @@ export declare class Session {
94
140
  * also while the per-step command is off.
95
141
  */
96
142
  gc(atEnd?: boolean): Promise<number | null>;
143
+ /** The end GC's memory read is off for the rest of the session once an SDK did not answer it ok. */
144
+ private memReadOff;
145
+ /**
146
+ * The end GC's manual memory read (REQ-MEAS-35), asked for with the GC's own number `n` once the GC answered ok: the SDK takes
147
+ * one sample at once and answers, and the run goes on only after that answer, so the app is backgrounded after the reading and
148
+ * never a time later. Any answer but `memread:<n> ok` is logged and turns the command off for the session; the run then has no
149
+ * reading of its own and derives from the GC's `post` record. Returns whether the SDK read.
150
+ */
151
+ memRead(n: number | null): Promise<boolean>;
97
152
  now(): number;
98
153
  /** After the action just made: the next action waits until `sel` is visible (the screen or element the action leads to). */
99
154
  expectNext(sel: SelectorLike, timeoutMs?: number): void;
@@ -191,8 +246,16 @@ export declare class Session {
191
246
  args?: string;
192
247
  home: SelectorLike;
193
248
  }): Promise<string | null>;
194
- /** Markers, then the flush link, then the SDK's own `perflab.flushed` (ok | error | off). */
195
- endRun(): Promise<string | null>;
249
+ /** The last `endRun`'s flush. */
250
+ lastFlush: FlushEvidence | null;
251
+ private flushSeq;
252
+ /**
253
+ * Markers, then the flush link, then the SDK's own `keepsnappy.flushed` (ok | error | off). Without it after FLUSH_RESEND_MS the
254
+ * link goes once more and the wait starts again; still none: FLUSH_NOT_ACKNOWLEDGED.
255
+ */
256
+ endRun(): Promise<string>;
257
+ /** Polls for `keepsnappy.flushed` answering one of `acks` until `deadline`: its status, an unreadable answer, or null. */
258
+ private waitFlushed;
196
259
  /** The heavy lookup, with its setting on only while it runs. */
197
260
  private findFallback;
198
261
  }