lila/ui/analyse/src/explorer/explorerXhr.ts

83 lines
2.7 KiB
TypeScript
Raw Normal View History

2021-10-19 10:25:07 -06:00
import { ExplorerData, ExplorerDb, OpeningData, TablebaseData } from './interfaces';
2020-09-06 06:38:32 -06:00
import * as xhr from 'common/xhr';
import { readNdJson, CancellableStream } from 'common/ndjson';
2021-10-19 09:51:12 -06:00
import { ExplorerConfigData } from './explorerConfig';
2021-10-19 10:25:07 -06:00
import { sync } from 'common/sync';
2017-09-18 14:25:22 -06:00
2020-09-07 06:52:41 -06:00
interface OpeningXhrOpts {
2021-02-06 06:26:05 -07:00
endpoint: string;
2021-10-18 11:20:52 -06:00
endpoint3: string;
2021-02-06 06:26:05 -07:00
db: ExplorerDb;
2021-10-19 09:51:12 -06:00
color: Color;
2021-02-06 06:26:05 -07:00
rootFen: Fen;
play: string[];
fen: Fen;
2021-10-19 09:51:12 -06:00
variant?: VariantKey; // only lichess & player
config: ExplorerConfigData;
2021-02-06 06:26:05 -07:00
withGames?: boolean;
2020-09-07 06:52:41 -06:00
}
2021-10-19 10:25:07 -06:00
export async function opening(
opts: OpeningXhrOpts,
processData: (data: ExplorerData) => void
): Promise<CancellableStream> {
2021-10-19 09:51:12 -06:00
const conf = opts.config;
2021-10-18 11:20:52 -06:00
const endpoint = opts.db == 'player' ? opts.endpoint3 : opts.endpoint;
const url = new URL(opts.db === 'lichess' ? '/lichess' : opts.db == 'player' ? '/personal' : '/master', endpoint);
2020-09-07 06:10:31 -06:00
const params = url.searchParams;
2020-09-07 06:52:41 -06:00
params.set('fen', opts.rootFen);
params.set('play', opts.play.join(','));
if (opts.db === 'lichess') {
params.set('variant', opts.variant || 'standard');
2021-10-19 11:03:52 -06:00
conf
.speed()
.filter(s => s != 'ultraBullet' && s != 'correspondence')
.forEach(s => params.append('speeds[]', s));
2021-10-19 09:51:12 -06:00
for (const rating of conf.rating()) params.append('ratings[]', rating.toString());
2020-09-07 06:10:31 -06:00
}
2021-10-19 09:51:12 -06:00
if (opts.db === 'player') {
params.set('player', conf.playerName.value());
params.set('color', opts.color);
params.set('update', 'true');
2021-10-19 09:51:12 -06:00
params.set('speeds', conf.speed().join(','));
params.set('modes', conf.mode().join(','));
2021-10-19 10:25:07 -06:00
if (conf.since()) params.set('since', conf.since());
if (conf.until()) params.set('until', conf.until());
2021-10-18 11:20:52 -06:00
}
2020-09-07 06:52:41 -06:00
if (!opts.withGames) {
2020-09-07 06:10:31 -06:00
params.set('topGames', '0');
params.set('recentGames', '0');
2017-06-21 04:38:08 -06:00
}
2021-10-19 10:25:07 -06:00
const res = await fetch(url.href, {
cache: 'default',
headers: {}, // avoid default headers for cors
credentials: 'omit',
});
2021-10-19 10:25:07 -06:00
const onMessage = (line: any) => {
const data = line as Partial<OpeningData>;
data.isOpening = true;
data.fen = opts.fen;
processData(data as OpeningData);
};
2021-10-19 10:25:07 -06:00
if (res.ok) return readNdJson(onMessage)(res);
return {
cancel() {},
end: sync(Promise.resolve(new Error(`Explorer error: ${res.status}`))),
};
2017-06-21 04:38:08 -06:00
}
2021-10-19 09:51:12 -06:00
export async function tablebase(endpoint: string, variant: VariantKey, fen: Fen): Promise<TablebaseData> {
2021-02-06 06:26:05 -07:00
const effectiveVariant = variant === 'fromPosition' || variant === 'chess960' ? 'standard' : variant;
2021-10-19 09:51:12 -06:00
const data = await xhr.json(xhr.url(`${endpoint}/${effectiveVariant}`, { fen }), {
cache: 'default',
headers: {}, // avoid default headers for cors
credentials: 'omit',
});
data.tablebase = true;
data.fen = fen;
return data as TablebaseData;
2017-06-21 04:38:08 -06:00
}