appium-xcuitest-driver
Version:
Appium driver for iOS using XCUITest for backend
71 lines (59 loc) • 1.95 kB
text/typescript
import {EventEmitter} from 'events';
import { LRUCache } from 'lru-cache';
import type { LogEntry } from '../../commands/types';
import type { AppiumLogger } from '@appium/types';
import {logger} from 'appium/support';
// We keep only the most recent log entries to avoid out of memory error
const MAX_LOG_ENTRIES_COUNT = 10000;
export interface IOSLogOptions {
maxBufferSize?: number;
log?: AppiumLogger;
}
export abstract class IOSLog<
TRawEntry,
TSerializedEntry extends object
> extends EventEmitter {
private maxBufferSize: number;
private logs: LRUCache<number, TSerializedEntry>;
private _log: AppiumLogger;
constructor(opts: IOSLogOptions = {}) {
super();
this.maxBufferSize = opts.maxBufferSize ?? MAX_LOG_ENTRIES_COUNT;
this.logs = new LRUCache({
max: this.maxBufferSize,
});
this._log = opts.log ?? logger.getLogger(this.constructor.name);
}
abstract startCapture(): Promise<void>;
abstract stopCapture(): Promise<void>;
abstract get isCapturing(): boolean;
get log(): AppiumLogger {
return this._log;
}
async getLogs(): Promise<LogEntry[]> {
const result: LogEntry[] = [];
for (const value of this.logs.rvalues()) {
result.push(this._deserializeEntry(value as TSerializedEntry));
}
this._clearEntries();
return result;
}
protected abstract _serializeEntry(value: TRawEntry): TSerializedEntry;
protected abstract _deserializeEntry(value: TSerializedEntry): LogEntry;
protected _clearEntries() {
this.logs.clear();
}
protected broadcast(entry: TRawEntry): void {
let recentIndex = -1;
for (const key of this.logs.keys()) {
recentIndex = key;
break;
}
const serializedEntry = this._serializeEntry(entry);
this.logs.set(++recentIndex, serializedEntry);
if (this.listenerCount('output')) {
this.emit('output', this._deserializeEntry(serializedEntry));
}
}
}
export default IOSLog;