Skip to content

Commit

Permalink
fix(datastore): error logging
Browse files Browse the repository at this point in the history
fix(desktop): sync ticks with hero script
  • Loading branch information
blakebyrnes committed Feb 18, 2023
1 parent d8f5611 commit 7ee3d02
Show file tree
Hide file tree
Showing 16 changed files with 204 additions and 153 deletions.
4 changes: 4 additions & 0 deletions datastore/client/lib/Runner.ts
Expand Up @@ -145,6 +145,10 @@ export default class Runner<
} catch (error) {
this.errorCount++;
error.stack = error.stack.split('at Runner.runInternal').shift().trim();
if (logOutputResult) {
error[Symbol.for('Runner.hasLogged')] = true;
console.error(error);
}
await plugins.setResolution(null, error).catch(() => null);
resultsIterable.reject(error);
} finally {
Expand Down
4 changes: 3 additions & 1 deletion datastore/client/lib/utils/Autorun.ts
Expand Up @@ -68,7 +68,9 @@ export default class Autorun {

await (runner.constructor as typeof Runner).commandLineExec(runner);
} catch (error) {
errorConsole.error(`ERROR running ${runnerName ?? runner?.name ?? 'runner'}`, error);
if (!error[Symbol.for('Runner.hasLogged')]) {
errorConsole.error(`ERROR running ${runnerName ?? runner?.name ?? 'runner'}`, error);
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion datastore/examples/news.ycombinator.com.ts
Expand Up @@ -14,7 +14,7 @@ export default new Runner(async ({ Hero, Output }) => {
const extraElem = await story.nextElementSibling;
const record = new Output();

const titleElem = await story.querySelector('a.titlelink');
const titleElem = story.querySelector('a.titlelink');

record.score = parseInt(
await extraElem.querySelector('.score').textContent.catch(() => '0'),
Expand Down
9 changes: 4 additions & 5 deletions desktop/core/lib/HeroSessionsSearch.ts
Expand Up @@ -50,7 +50,6 @@ export default class HeroSessionsSearch extends TypedEventEmitter<{

onNewSession(heroSession: HeroSession): void {
const id = heroSession.id;
console.log('on session');
const entry: IHeroSessionsListResult = {
heroSessionId: id,
scriptEntrypoint: this.processEntrypoint(heroSession.options?.scriptInstanceMeta?.entrypoint),
Expand All @@ -60,7 +59,7 @@ export default class HeroSessionsSearch extends TypedEventEmitter<{
input: heroSession.options.input,
};
this.sessions.unshift(entry);
this.emit('update', this.list());
this.emit('update', [entry]);
this.events.group(
id,
this.events.on(heroSession, 'kept-alive', this.onHeroSessionKeptAlive.bind(this, entry)),
Expand Down Expand Up @@ -194,19 +193,19 @@ export default class HeroSessionsSearch extends TypedEventEmitter<{

private onHeroSessionResumed(entry: IHeroSessionsListResult): void {
entry.state = 'running';
this.emit('update', this.list());
this.emit('update', [entry]);
}

private onHeroSessionClosed(entry: IHeroSessionsListResult): void {
const update = this.processSession(entry.heroSessionId);
Object.assign(entry, update);
this.emit('update', this.list());
this.emit('update', [entry]);
this.events.endGroup(entry.heroSessionId);
}

private onHeroSessionKeptAlive(entry: IHeroSessionsListResult): void {
const update = this.processSession(entry.heroSessionId);
Object.assign(entry, update);
this.emit('update', this.list());
this.emit('update', [entry]);
}
}
79 changes: 42 additions & 37 deletions desktop/core/lib/SessionController.ts
Expand Up @@ -38,7 +38,9 @@ import ISessionCreateOptions from '@ulixee/hero-interfaces/ISessionCreateOptions
import DetachedAssets from '@ulixee/hero-core/lib/DetachedAssets';
import MirrorNetwork from '@ulixee/hero-timetravel/lib/MirrorNetwork';
import IChromeAliveSessionEvents from '@ulixee/desktop-interfaces/events/IChromeAliveSessionEvents';
import getTimetravelTicks from '@ulixee/hero-timetravel/player/getTimetravelTicks';
import TimetravelTicks, { ITabDetails } from '@ulixee/hero-timetravel/player/TimetravelTicks';
import { IDomRecording } from '@ulixee/hero-core/models/DomChangesTable';
import ICommandMeta from '@ulixee/hero-interfaces/ICommandMeta';
import ResourceSearch from './ResourceSearch';
import ElementsModule from './app-extension-modules/ElementsModule';
import DevtoolsBackdoorModule from './app-extension-modules/DevtoolsBackdoorModule';
Expand Down Expand Up @@ -148,7 +150,7 @@ export default class SessionController extends TypedEventEmitter<{
this.scriptInstanceMeta = options.scriptInstanceMeta;
this.worldHeroSessionIds.add(this.sessionId);

this.timetravelPlayer = TimetravelPlayer.create(this.sessionId, this);
this.timetravelPlayer = new TimetravelPlayer(db, this);
this.events.on(this.timetravelPlayer, 'new-tick-command', this.sendCommandFocusedEvent);
this.events.on(this.timetravelPlayer, 'new-paint-index', this.sendPaintIndexEvent);
this.events.on(this.timetravelPlayer, 'new-offset', this.sendTimetravelOffset);
Expand Down Expand Up @@ -187,6 +189,7 @@ export default class SessionController extends TypedEventEmitter<{
this.events.on(heroSession, 'output', this.onOutputUpdated);
this.events.on(heroSession, 'collected-asset', this.onCollectedAsset);
this.events.on(heroSession, 'tab-created', this.onTabCreated);
this.events.on(heroSession.commands, 'start', this.onCommandStarted);
this.events.on(heroSession.commands, 'pause', this.onCommandsPaused);
this.events.on(heroSession.commands, 'resume', this.onCommandsResumed);

Expand All @@ -200,29 +203,31 @@ export default class SessionController extends TypedEventEmitter<{
this.events.on(this.timelineWatch, 'updated', () => this.sendActiveSession());
}

public loadTimelineTicks(): ITabDetails[] {
const ticks = new TimetravelTicks(this.db);
const commandTimeline = CommandTimeline.fromDb(this.db);
let domRecordings: { tabId: number; domRecording: IDomRecording }[];
if (this.liveSession) {
domRecordings = Object.entries(this.mirrorPagesByTabId).map(([tabId, mirrorPage]) => {
return { tabId: Number(tabId), domRecording: mirrorPage.domRecording };
});
} else {
domRecordings = TimetravelTicks.loadDomRecording(this.db);
}

return ticks.load(domRecordings, commandTimeline);
}

public async loadFromDb(): Promise<void> {
this.sourceCodeTimeline.loadCommands(this.db.commands.loadHistory());
const network = await MirrorNetwork.createFromSessionDb(this.db);
const tabDetails = await getTimetravelTicks({
sessionId: this.sessionId,
});
const timelineTicks = this.loadTimelineTicks();

for (const { tab, paintEvents, documents } of tabDetails) {
const mainFrameIds = new Set<number>();
const domNodePathByFrameId: { [frameId: number]: string } = {};
for (const frame of tab.frames) {
if (frame.isMainFrame) mainFrameIds.add(frame.id);
domNodePathByFrameId[frame.id] = frame.domNodePath;
}
const mirrorPage = new MirrorPage(network, {
paintEvents,
documents,
domNodePathByFrameId,
mainFrameIds,
});
await this.addReplayTab(tab.id, mirrorPage);
for (const { tabId, domRecording } of timelineTicks) {
const mirrorPage = new MirrorPage(network, domRecording);
await this.addReplayTab(tabId, mirrorPage);
}
await this.timetravelPlayer.setTabState(tabDetails);
await this.timetravelPlayer.setTabState(timelineTicks);
if (this.timetravelPlayer.activeTab) {
this.timetravelPlayer.activeTab.currentTimelineOffsetPct = -1;
this.timetravelPlayer.activeTab.currentTickIndex = -1;
Expand Down Expand Up @@ -464,6 +469,7 @@ export default class SessionController extends TypedEventEmitter<{
public onTabCreated(event: HeroSession['EventTypes']['tab-created']): void {
const { tab } = event;
this.events.on(tab, 'page-events', this.sendDomRecordingUpdates.bind(this, tab));
this.events.on(tab, 'page-events', () => (this.timetravelPlayer.shouldReloadTicks = true));

const mirrorPage = tab.createMirrorPage(false);
mirrorPage.showChromeInteractions = true;
Expand Down Expand Up @@ -625,34 +631,30 @@ export default class SessionController extends TypedEventEmitter<{
timelineOffsetPercent: number;
}> {
try {
await this.timetravelPlayer.load();
await this.chromeAliveWindowController.waitForPageWithHeroTabId(
this.timetravelPlayer.activeTab?.id,
this.timetravelPlayer.activeTab.id,
);
await this.timetravelPlayer.setFocusedOffsetRange(args.timelinePercentRange);

if (args.step) {
const tickIndex = this.timetravelPlayer.activeTab.currentTickIndex;
if (
args.step === 'forward' &&
tickIndex === this.timetravelPlayer.activeTab.ticks.length - 1
) {
const didStep = await this.timetravelPlayer.step(args.step);
if (!didStep && args.step === 'forward') {
if (this.liveSession) {
await this.openMode({ mode: 'Live' });
}
this.sendTimetravelOffset({
tabId: this.timetravelPlayer.activeTab.id,
percentOffset: 100,
focusedRange: undefined,
url: undefined,
});
return { timelineOffsetPercent: 100 };
}
await this.timetravelPlayer.step(args.step);
} else {
let percentOffset = args.percentOffset;
if (args.commandId) {
percentOffset = await this.timetravelPlayer.findCommandPercentOffset(args.commandId);
}
await this.timetravelPlayer.goto(percentOffset ?? 100);
} else if (args.percentOffset !== undefined) {
await this.timetravelPlayer.goto(args.percentOffset);
} else if (args.commandId) {
await this.timetravelPlayer.loadTickWithCommandId(args.commandId);
}

if (this.mode !== 'Timetravel') {
Expand Down Expand Up @@ -873,6 +875,12 @@ export default class SessionController extends TypedEventEmitter<{
this.sendDatastoreUpdatedEvent();
}

private onCommandStarted(): void {
if (this.mode === 'Live') {
this.timetravelPlayer.shouldReloadTicks = true;
}
}

private onCommandsPaused(): void {
this.playbackState = 'paused';
this.sendActiveSession();
Expand Down Expand Up @@ -912,10 +920,7 @@ export default class SessionController extends TypedEventEmitter<{
}

private sendTimetravelOffset(event: TimetravelPlayer['EventTypes']['new-offset']): void {
this.sendApiEvent('Session.timetravel', {
...event,
url: this.timetravelPlayer.activeTab.mirrorPage.page.mainFrame.url,
});
this.sendApiEvent('Session.timetravel', event);
}

private sendPaintIndexEvent(event: TimetravelPlayer['EventTypes']['new-paint-index']): void {
Expand Down
9 changes: 6 additions & 3 deletions desktop/core/lib/SourceCodeTimeline.ts
Expand Up @@ -8,6 +8,7 @@ import ISourceCodeLocation from '@ulixee/commons/interfaces/ISourceCodeLocation'
import EventSubscriber from '@ulixee/commons/lib/EventSubscriber';
import ICommandUpdatedEvent from '@ulixee/desktop-interfaces/events/ICommandUpdatedEvent';
import ISourceCodeUpdatedEvent from '@ulixee/desktop-interfaces/events/ISourceCodeUpdatedEvent';
import CommandFormatter from '@ulixee/hero-core/lib/CommandFormatter';

export default class SourceCodeTimeline extends TypedEventEmitter<{
source: ISourceCodeUpdatedEvent;
Expand All @@ -22,6 +23,8 @@ export default class SourceCodeTimeline extends TypedEventEmitter<{
bindFunctions(this);

this.entrypoint = SourceMapSupport.getSourceFile(this.entrypoint);
this.sourceFileLines[this.entrypoint] =
SourceLoader.getFileContents(this.entrypoint, false)?.split(/\r?\n/) ?? [];
}

public listen(heroSession: Session): void {
Expand All @@ -31,7 +34,7 @@ export default class SourceCodeTimeline extends TypedEventEmitter<{

public loadCommands(commands: ICommandMeta[]): void {
for (const command of commands) {
this.onCommandFinished(command, true)
this.onCommandFinished(command, true);
}
}

Expand Down Expand Up @@ -65,7 +68,7 @@ export default class SourceCodeTimeline extends TypedEventEmitter<{
);
this.checkForSourceUpdates(originalSourcePosition);
this.commandsById[command.id] = {
command,
command: CommandFormatter.parseResult(command),
isComplete: false,
originalSourcePosition,
};
Expand All @@ -79,7 +82,7 @@ export default class SourceCodeTimeline extends TypedEventEmitter<{
);
this.checkForSourceUpdates(originalSourcePosition);
this.commandsById[command.id] = {
command,
command: CommandFormatter.parseResult(command),
isComplete: true,
originalSourcePosition,
};
Expand Down
4 changes: 2 additions & 2 deletions desktop/interfaces/events/ICommandUpdatedEvent.ts
@@ -1,8 +1,8 @@
import ICommandMeta from '@ulixee/hero-interfaces/ICommandMeta';
import type ISourceCodeLocation from '@ulixee/commons/interfaces/ISourceCodeLocation';
import type ICommandWithResult from '@ulixee/hero-core/interfaces/ICommandWithResult';

export default interface ICommandUpdatedEvent {
command: ICommandMeta;
command: ICommandWithResult;
isComplete: boolean;
originalSourcePosition: ISourceCodeLocation[];
}

0 comments on commit 7ee3d02

Please sign in to comment.