Skip to content

Commit 1c56b19

Browse files
committed
useStepper -> preferStepper, added hard threshold of 100 for the stepper
1 parent e873f6d commit 1c56b19

File tree

7 files changed

+57
-45
lines changed

7 files changed

+57
-45
lines changed

src/extension/codemic.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import './config.js'; // Init config
1+
import config from './config.js'; // Init config
22
import WebviewProvider from './webview_provider.js';
33
import Session from './session/session.js';
44
import * as storage from './storage.js';
@@ -577,7 +577,7 @@ class CodeMic {
577577
}
578578
case 'recorder/seek': {
579579
assert(this.session?.isLoaded());
580-
await this.session.rr.enqueueSeek(req.clock, req.useStepper);
580+
await this.session.rr.enqueueSeek(req.clock, req.preferStepper);
581581
await this.updateFrontend();
582582
return ok;
583583
}
@@ -1351,8 +1351,7 @@ class CodeMic {
13511351
history: this.context.settings.history[s.head.id],
13521352
publication: this.publications.get(s.head.id),
13531353
}));
1354-
sessions = lib.searchSessions(sessions, this.searchQuery);
1355-
sessions = lib.limitRecentSessions(sessions, 4);
1354+
sessions = lib.searchSessions(sessions, this.searchQuery, config.debug ? 100 : 4);
13561355

13571356
welcome = {
13581357
searchQuery: this.searchQuery,

src/extension/session/session_record_and_replay.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ export default class SessionRecordAndReplay {
122122
await this.pauseOnError(this.queue.enqueue(this.record.bind(this)));
123123
}
124124

125-
async enqueueSeek(clock: number, useStepper?: boolean) {
126-
await this.pauseOnError(this.queue.enqueue(this.seek.bind(this), clock, useStepper));
125+
async enqueueSeek(clock: number, preferStepper?: boolean) {
126+
await this.pauseOnError(this.queue.enqueue(this.seek.bind(this), clock, preferStepper));
127127
}
128128

129129
async enqueueSync(clock?: number) {
@@ -196,16 +196,16 @@ export default class SessionRecordAndReplay {
196196
}
197197

198198
/**
199-
* useStepper is only useful during testing to test the stepper.
199+
* preferStepper is only useful during testing to test the stepper.
200200
*/
201-
private async seek(clock: number, useStepper?: boolean) {
201+
private async seek(clock: number, preferStepper?: boolean) {
202202
const origClock = this.clock;
203203
this.clock = Math.max(0, Math.min(this.session.head.duration, clock));
204204

205205
// Must only use stepper during playback. Otherwise, we don't know if the user has changed
206206
// the files and documents while on pause or not.
207-
useStepper ??= this.playing && Math.abs(origClock - this.clock) < SEEK_USING_STEPPER_THRESHOLD_S;
208-
await this.workspacePlayer.seek(clock, useStepper);
207+
preferStepper ??= this.playing && Math.abs(origClock - this.clock) < SEEK_USING_STEPPER_THRESHOLD_S;
208+
await this.workspacePlayer.seek(clock, preferStepper);
209209
await this.syncMedia({ hard: true });
210210
this.updateLoop.resetDiff();
211211
this.session.onProgress?.();

src/extension/session/workspace_player.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import _ from 'lodash';
88
import { LoadedSession } from './session.js';
99
import VscWorkspace from './vsc_workspace.js';
1010

11+
const STEPPER_HARD_THRESHOLD = 100;
12+
1113
class WorkspacePlayer {
1214
playing = false;
1315
// onError?: (error: Error) => any;
@@ -100,14 +102,15 @@ class WorkspacePlayer {
100102
this.dispose();
101103
}
102104

103-
async seek(clock: number, useStepper: boolean) {
104-
await this.seekWithData(this.internalWorkspace.getSeekData(clock), useStepper);
105+
async seek(clock: number, preferStepper: boolean) {
106+
await this.seekWithData(this.internalWorkspace.getSeekData(clock), preferStepper);
105107
}
106108

107-
async seekWithData(seekData: SeekData, useStepper: boolean) {
109+
async seekWithData(seekData: SeekData, preferStepper: boolean) {
108110
if (seekData.steps.length === 0) return;
111+
const forceSync = seekData.steps.length > STEPPER_HARD_THRESHOLD;
109112

110-
if (useStepper || config.stepOnly) {
113+
if ((!forceSync && preferStepper) || config.stepOnly) {
111114
if (config.logTrackPlayerUpdateStep) console.log('player seek: stepping');
112115
// Apply updates one at a time.
113116
// If stepper fails for any reason, fall back to sync (unless config.stepOnly is set

src/lib/lib.ts

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -711,23 +711,33 @@ export function getRecorderSelectionClockRange(
711711
}
712712
}
713713

714-
export function searchSessions(sessions: t.SessionUIListing[], searchQuery: string): t.SessionUIListing[] {
714+
export function searchSessions(
715+
sessions: t.SessionUIListing[],
716+
searchQuery: string,
717+
recentLimit: number,
718+
): t.SessionUIListing[] {
715719
const searchQueryNorm = _.toLower(_.trim(searchQuery || ''));
716-
if (!searchQueryNorm) return sessions;
717-
718720
const tokens = searchQueryNorm.split(/\s+/);
719721

720-
let pairs = sessions.map(listing => ({
721-
listing,
722-
score:
723-
((getTokensMatchScore(getFields(listing.head)) *
724-
(listing.publication ? listing.publication.likes * 20 + listing.publication.views : 1)) /
725-
10) *
726-
(listing.head.isClip ? 1 : 2),
727-
}));
728-
pairs = _.filter(pairs, 'score');
729-
pairs = _.orderBy(pairs, 'score', 'desc');
730-
return _.map(pairs, 'listing');
722+
let pairs = sessions.map(listing => {
723+
const matchScore = searchQueryNorm ? getTokensMatchScore(getFields(listing.head)) : 1;
724+
const statsScore = (listing.publication ? listing.publication.likes * 20 + listing.publication.views : 1) / 10;
725+
const clipScore = listing.head.isClip ? 1 : 2;
726+
const score = matchScore * statsScore * clipScore;
727+
return { listing, score };
728+
});
729+
730+
let groupedPairs = _.groupBy(pairs, p => p.listing.group);
731+
let recentPairs = groupedPairs.recent ?? [];
732+
let currentPairs = groupedPairs.current ?? [];
733+
let remotePairs = groupedPairs.remote ?? [];
734+
735+
remotePairs = _.filter(remotePairs, 'score');
736+
remotePairs = _.reject(remotePairs, p => recentPairs.some(recent => recent.listing.head.id === p.listing.head.id));
737+
remotePairs = _.orderBy(remotePairs, 'score', 'desc');
738+
recentPairs = _.take(_.filter(recentPairs, 'score'), recentLimit);
739+
740+
return _.map([...recentPairs, ...currentPairs, ...remotePairs], 'listing');
731741

732742
function getFields(head: t.SessionHead): string[] {
733743
return [
@@ -759,15 +769,15 @@ export function searchSessions(sessions: t.SessionUIListing[], searchQuery: stri
759769
}
760770
}
761771

762-
export function limitRecentSessions(sessions: t.SessionUIListing[], limit: number): t.SessionUIListing[] {
763-
let res = [];
764-
let count = 0;
765-
for (const listing of sessions) {
766-
if (listing.group === 'recent') {
767-
if (count >= limit) continue;
768-
count++;
769-
}
770-
res.push(listing);
771-
}
772-
return res;
773-
}
772+
// export function limitRecentSessions(sessions: t.SessionUIListing[], limit: number): t.SessionUIListing[] {
773+
// let res = [];
774+
// let count = 0;
775+
// for (const listing of sessions) {
776+
// if (listing.group === 'recent') {
777+
// if (count >= limit) continue;
778+
// count++;
779+
// }
780+
// res.push(listing);
781+
// }
782+
// return res;
783+
// }

src/lib/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export type FrontendToBackendReqRes =
4040
| { request: { type: 'recorder/play' }; response: OKResponse }
4141
| { request: { type: 'recorder/record' }; response: OKResponse }
4242
| { request: { type: 'recorder/pause' }; response: OKResponse }
43-
| { request: { type: 'recorder/seek'; clock: number; useStepper?: boolean }; response: OKResponse }
43+
| { request: { type: 'recorder/seek'; clock: number; preferStepper?: boolean }; response: OKResponse }
4444
| { request: { type: 'recorder/syncWorkspace'; clock?: number }; response: OKResponse }
4545
| { request: { type: 'recorder/setPlaybackRate'; rate: number }; response: OKResponse }
4646
// | { request: { type: 'recorder/save' }; response: OKResponse }

src/tests/sessions.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ async function testSessionSteps(sessionHandle: string, steps: SessionTestStep[])
8484
console.log(`===== Steps: ${label}`);
8585

8686
// Seek if necessary.
87-
await getCodeMic().handleMessage({ type: 'recorder/seek', clock: step.clock, useStepper: step.useStepper });
87+
await getCodeMic().handleMessage({ type: 'recorder/seek', clock: step.clock, preferStepper: step.preferStepper });
8888

8989
const testClockPath = path.resolve(sessionTestDataPath, `clock_${step.clockStr}`);
9090
const meta = deserializeTestMeta(JSON.parse(fs.readFileSync(path.resolve(testClockPath, 'meta.json'), 'utf8')));

src/tests/test-helpers.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { timeout } from '../lib/lib.js';
1212
export type SessionTestStep = {
1313
clock: number;
1414
clockStr: string;
15-
useStepper: boolean;
15+
preferStepper: boolean;
1616
};
1717

1818
export const projectPath = path.resolve(__dirname, '..'); // relative to dist
@@ -116,11 +116,11 @@ export function createRandomSessionTestSteps(clockStrs: string[]): SessionTestSt
116116
if (candidate && candidate !== resClockStrs.at(-1)) resClockStrs.push(candidate);
117117
}
118118

119-
return resClockStrs.map(clockStr => ({ clockStr, clock: Number(clockStr), useStepper: _.sample([true, false]) }));
119+
return resClockStrs.map(clockStr => ({ clockStr, clock: Number(clockStr), preferStepper: _.sample([true, false]) }));
120120
}
121121

122122
export function sessionTestStepToString(step: SessionTestStep): string {
123-
return (step.useStepper ? 'step:' : 'sync:') + step.clockStr;
123+
return (step.preferStepper ? 'step:' : 'sync:') + step.clockStr;
124124
}
125125

126126
export async function closeAllTabs() {

0 commit comments

Comments
 (0)