feat(my library): osu lazer support (#485)

This commit is contained in:
Yannis Petitot
2022-05-27 22:34:06 +02:00
committed by GitHub
parent 125214d0f3
commit 14572a6b72
25 changed files with 787 additions and 146 deletions
+1
View File
@@ -117,6 +117,7 @@
"long": "^4.0.0",
"node-machine-id": "^1.1.12",
"osu-db-parser": "git+https://github.com/yadPe/osu-db-parser.git#6cc783f3a9270f730cd5038d03ada4a78634cd65",
"osu-lazer-db-reader": "0.1.6",
"ps-node": "^0.1.6",
"react": "^18.1.0",
"react-dom": "^18.1.0",
+1
View File
@@ -142,6 +142,7 @@ checkBrowsers(paths.appPath, isInteractive)
console.log(chalk.green("Run 'yarn electron-dev' from either powershell or cmd."));
} else {
console.log(chalk.yellow("Couldn't launch electron, try starting it manually"));
console.error(err);
}
}
}).stdout.pipe(process.stdout).on('exit', () => console.log('Electron process terminated'));
+22 -4
View File
@@ -6,7 +6,10 @@ import { outputJSON, readJson } from 'fs-extra';
import { join } from 'path';
import { error, log } from 'electron-log';
import { memoize } from 'underscore';
import { ipcRenderer } from 'electron';
import { connect } from 'react-redux';
import { getOsPath } from '../helpers/path';
import { getIsLazer, getOsuPath } from '../modules/Settings/reducer/selectors';
export const HistoryContext = createContext();
export const useDownloadHistory = () => useContext(HistoryContext);
@@ -74,7 +77,18 @@ class HistoryProvider extends Component {
}
componentDidMount() {
this._readHistory();
const setup = async () => {
await this._readHistory();
const { osuPath, isLazer } = this.props;
const result = await ipcRenderer.invoke('osuSongsScan', {
osuPath,
isLazer,
});
this.set(result);
};
setup();
}
componentDidUpdate() {
@@ -127,8 +141,8 @@ class HistoryProvider extends Component {
});
};
_readHistory = () => {
readJson(this.path)
_readHistory = async () => {
await readJson(this.path)
.then(rawHistory => {
// Check if history is from a version prior to 0.3.0
if (!Array.isArray(Object.values(rawHistory)[0])) {
@@ -175,4 +189,8 @@ class HistoryProvider extends Component {
}
}
export default HistoryProvider;
const mapStateToProps = state => ({
osuPath: getOsuPath(state),
isLazer: getIsLazer(state),
});
export default connect(mapStateToProps)(HistoryProvider);
+5 -4
View File
@@ -6,6 +6,7 @@ import { getFadeIn, sectionSwitchAnimation } from '../../helpers/css.utils';
import AllBeatmapsCollection from './components/AllBeatmaps';
import Collection from './components/Collection';
import CollectionDetails from './components/CollectionDetails';
import { getCollections } from './selectors';
const useStyle = createUseStyles({
...getFadeIn(),
@@ -51,7 +52,7 @@ const MyLibrary = ({ setHeaderContent, collections }) => {
<div className={classes.myLibraryWrapper}>
<div className={classes.collections}>
<AllBeatmapsCollection select={setSelectedCollection} />
{Object.entries(collections).map(([name, beatmapsHash]) => (
{collections.map(([name, beatmapsHash]) => (
<Collection
select={setSelectedCollection}
key={`${name}${beatmapsHash.length}`}
@@ -64,8 +65,8 @@ const MyLibrary = ({ setHeaderContent, collections }) => {
);
};
const mapStateToProps = ({ app, library }) => ({
windowSize: app.window,
collections: library.collections,
const mapStateToProps = (state) => ({
windowSize: state.app.window,
collections: getCollections(state)
});
export default connect(mapStateToProps)(MyLibrary);
+1
View File
@@ -0,0 +1 @@
export const getCollections = state => state.library.collections;
+6 -1
View File
@@ -108,7 +108,12 @@ const Setting = ({ settingCategory }) => {
case 'Button':
return (
<div style={{ textAlign: 'start' }}>
<Button className="btn" color={theme.palette.primary.accent} onClick={item.action}>
<Button
className="btn"
color={theme.palette.primary.accent}
onClick={item.action}
disabled={item.disabled}
>
{item.name}
</Button>
<div style={{ fontSize: '0.8rem', margin: '0px 8px' }}>{item.description}</div>
+2 -1
View File
@@ -9,6 +9,7 @@ export default Object.freeze({
autoImport: true,
importMethod: 'auto',
osuPath: '',
isLazer: false,
osuSongsPath: '',
theme: {
accentColor: config.display.defaultAccentColor,
@@ -21,7 +22,7 @@ export default Object.freeze({
isBotAccount: false,
},
osuApi: {
key: "",
key: '',
},
},
beatconnectAPI: {
+12 -5
View File
@@ -1,7 +1,7 @@
import React, { useEffect, useState, cloneElement } from 'react';
import { useTheme } from 'react-jss';
import { remote, shell } from 'electron';
import { connect, useDispatch } from 'react-redux';
import { connect, useDispatch, useSelector } from 'react-redux';
import { error } from 'electron-log';
import { setIrcUser, setIrcPass, setIRCIsBot, setOSUApiKey, setPrefix } from './reducer/actions';
import ConfLoader from './helpers/ConfLoader';
@@ -17,6 +17,7 @@ import { clearCollections } from '../MyLibrary/actions';
import { scanOsuCollection } from './utils/scanOsuCollections';
import store from '../../../shared/store';
import { getVersion } from '../../helpers/path';
import { getIsLazer } from './reducer/selectors';
const Settings = ({ userPreferences }) => {
const { irc, osuApi, prefix, osuSongsPath, osuPath, lastScan, importMethod } = userPreferences;
@@ -24,11 +25,12 @@ const Settings = ({ userPreferences }) => {
const theme = useTheme();
const history = useDownloadHistory();
const dispatch = useDispatch();
const isLazer = useSelector(getIsLazer);
const { handleAccentColorSelect, handleImportMethodChange, osuPathSetup } = useSettingsUtils(userPreferences);
const scanOsuSongs = useOsuDbScan();
const scanOsu = () => {
scanOsuSongs();
scanOsuSongs(isLazer);
scanOsuCollection(osuPath);
};
@@ -54,7 +56,12 @@ const Settings = ({ userPreferences }) => {
'Giving access to the osu! folder allow osu!.db and collection.db read, enabling Beatconnect to auto sync on startup with your game',
type: 'Text',
},
{ name: 'Select your Osu! Songs folder', action: () => osuPathSetup('song'), type: 'Button' },
{
name: 'Select your Osu! Songs folder',
action: () => osuPathSetup('song'),
type: 'Button',
disabled: isLazer,
},
{
name: osuSongsPath || 'No songs folder set',
description: 'By selecting your osu songs folder enable the Bulk import and scan option',
@@ -75,8 +82,8 @@ const Settings = ({ userPreferences }) => {
value: importMethod === config.settings.importMethod.bulk,
action: () => handleImportMethodChange(config.settings.importMethod.bulk),
description:
'Beatmaps are placed in you songs folder after downloading and osu! will import them after reload of the beatmaps selection',
disabled: !osuSongsPath || osuSongsPath === '',
'Beatmaps are placed in you songs folder after downloading and osu! will import them after reload of the beatmaps selection. Not supported for Osu!Lazer',
disabled: !osuSongsPath || osuSongsPath === '' || isLazer,
type: 'CheckBox',
},
{
@@ -45,3 +45,5 @@ export const setLastScan = payload => store.dispatch({ type: 'LASTSCAN', payload
export const setImportMethod = payload => store.dispatch({ type: 'SETIMPORTMETHOD', payload });
export const saveThemeAccentColor = payload => store.dispatch({ type: 'SET_THEME_ACCENT_COLOR', payload });
export const setIsLazer = payload => store.dispatch({ type: 'SET_IS_LAZER', payload });
@@ -45,6 +45,9 @@ export default (settings = confLoader.config, { type, payload }) => {
case 'SET_THEME_ACCENT_COLOR':
userPreferences = { ...userPreferences, theme: { accentColor: payload } };
return { ...settings, userPreferences: { ...userPreferences } };
case 'SET_IS_LAZER':
userPreferences = { ...userPreferences, isLazer: payload };
return { ...settings, userPreferences: { ...userPreferences } };
default:
return settings;
}
@@ -12,3 +12,5 @@ export const getOsuApiKey = state => {
let apiKey = _.get(getUserPreference(state), ['osuApi', 'key'], '');
return _.isEmpty(apiKey.trim()) ? process.env.BEATCONNECT_CLIENT_API_KEY_V1 : apiKey;
};
export const getIsLazer = state => _.get(getUserPreference(state), ['isLazer'], false);
@@ -7,7 +7,7 @@ import { useSelector } from 'react-redux';
import { useDownloadHistory } from '../../../Providers/HistoryProvider';
import { useTasks } from '../../../Providers/TaskProvider.bs';
import { setLastScan } from '../reducer/actions';
import { getOsuPath, getOsuSongPath } from '../reducer/selectors';
import { getIsLazer, getOsuPath, getOsuSongPath } from '../reducer/selectors';
import { scanOsuCollection } from './scanOsuCollections';
export const useOsuDbScan = () => {
@@ -17,7 +17,8 @@ export const useOsuDbScan = () => {
const history = useDownloadHistory();
const [isScanning, setIsScanning] = useState(false);
const scanOsuSongs = async () => {
const scanOsuSongs = async isLazer => {
console.log('scanOsuSongs', isLazer);
if (isScanning) return;
if (!osuPath && !osuSongsPath) {
alert('You need to select your osu! or songs folder before performing a scan');
@@ -26,7 +27,7 @@ export const useOsuDbScan = () => {
setIsScanning(true);
addTask({ name: 'Scanning beatmaps', status: 'running', description: '', section: 'Settings' });
try {
const result = await ipcRenderer.invoke('osuSongsScan', { osuPath });
const result = await ipcRenderer.invoke('osuSongsScan', { osuPath, isLazer });
history.set(result);
setLastScan({ date: Date.now(), beatmaps: Object.keys(result.beatmaps).length });
} catch (e) {
@@ -45,9 +46,10 @@ export const useOsuDbAutoScan = () => {
const osuDbScan = useOsuDbScan();
const osuSongsPath = useSelector(getOsuSongPath);
const osuPath = useSelector(getOsuPath);
const isLazer = useSelector(getIsLazer);
useEffect(() => {
if (osuPath && osuSongsPath !== '') {
osuDbScan();
osuDbScan(isLazer);
scanOsuCollection(osuPath);
}
}, []);
@@ -5,18 +5,17 @@ import { useSelector } from 'react-redux';
import config from '../../../../shared/config';
import { useDownloadQueue } from '../../../Providers/downloadManager';
import { useSetTheme } from '../../../Providers/ThemeProvider';
import { saveThemeAccentColor, setImportMethod, setOsuSongsPath, setOsuPath } from '../reducer/actions';
import { saveThemeAccentColor, setImportMethod, setOsuSongsPath, setOsuPath, setIsLazer } from '../reducer/actions';
import { getOsuSongPath } from '../reducer/selectors';
const checkOsuPath = async path => {
try {
const isPathValid = await ipcRenderer.invoke('validate-osu-path', path);
return !!isPathValid;
return await ipcRenderer.invoke('validate-osu-path', path);
} catch (e) {
// eslint-disable-next-line no-alert
alert(`An error occured while setting the osu folder, please try again.`);
error('[osuPathSetup]: ', e);
return false;
return { isValid: false, isLazer: false };
}
};
@@ -43,14 +42,16 @@ const useSettingsUtils = ({ osuSongsPath, importMethod }) => {
setPath(importMethod, filePaths[0]);
setOsuSongsPath(filePaths[0]);
} else {
const isValid = await checkOsuPath(filePaths[0]);
const { isValid, isLazer } = await checkOsuPath(filePaths[0]);
if (!isValid) {
// eslint-disable-next-line no-alert
alert(`The provided folder doesn't seems be a valid osu folder.`);
return;
}
// always set isLazer before osuPath or bad things will happen!
setIsLazer(isLazer);
setOsuPath(filePaths[0]);
if (!currentOsuSongsPath) {
if (!currentOsuSongsPath && !isLazer) {
const songsPath = join(filePaths[0], 'Songs');
if (await isDirectory(songsPath)) {
setOsuSongsPath(join(filePaths[0], 'Songs'));
+3
View File
@@ -20,6 +20,9 @@ const useStyles = createUseStyles({
'&:active': {
opacity: 0.9,
},
'&:disabled' : {
filter: 'grayscale(.55)',
},
'&:active svg': {
transform: 'scale(.88)',
},
@@ -9,7 +9,7 @@ import { changeCurrentSection } from '../../../../app.actions';
import { tFromJs as sections } from '../../../Sections.bs';
import { useOsuDbScan } from '../../../Settings/utils/useScanOsuSongs';
import { scanOsuCollection } from '../../../Settings/utils/scanOsuCollections';
import { getOsuPath } from '../../../Settings/reducer/selectors';
import { getIsLazer, getOsuPath } from '../../../Settings/reducer/selectors';
const useStyle = createUseStyles({
playOsuWrapper: {
@@ -100,6 +100,7 @@ const PlayOsu = ({ onSelect, osuGamePath, ...otherProps }) => {
const isScanning = useRef(false);
const osuScan = useOsuDbScan();
const osuPath = useSelector(getOsuPath);
const isLazer = useSelector(getIsLazer);
const invalidateNextOsuState = useRef(false);
const launchOsu = () => {
@@ -125,7 +126,7 @@ const PlayOsu = ({ onSelect, osuGamePath, ...otherProps }) => {
useEffect(() => {
if (!isOsuSet || isScanning.current || osuIsRunning) return;
isScanning.current = true;
osuScan();
osuScan(isLazer);
scanOsuCollection(osuPath)
.catch(e => {
error(`[scanOsuCollection]: ${e}`);
@@ -133,12 +134,12 @@ const PlayOsu = ({ onSelect, osuGamePath, ...otherProps }) => {
.finally(() => {
isScanning.current = false;
});
}, [osuIsRunning, isOsuSet]);
}, [osuIsRunning, isOsuSet, isLazer]);
return (
<div
className={classes.playOsuWrapper}
onClick={isOsuSet ? launchOsu : () => dispatch(changeCurrentSection(sections('Settings')))}
onClick={isOsuSet && !isLazer ? launchOsu : () => dispatch(changeCurrentSection(sections('Settings')))}
role="tab"
>
<span data-radium="true" className={classes.span}>
@@ -154,7 +155,8 @@ const PlayOsu = ({ onSelect, osuGamePath, ...otherProps }) => {
</div>
<span data-radium="true" className={classes.title}>
{!isOsuSet && 'Osu! not set'}
{isOsuSet && (osuIsRunning ? 'Playing !' : 'Play !')}
{isOsuSet && !isLazer && (osuIsRunning ? 'Playing!' : 'Play!')}
{isLazer && 'Lazer!'}
</span>
</span>
</div>
@@ -125,8 +125,10 @@ const TasksControl = ({ onSelect, ...otherProps }) => {
))}
</>
);
return null;
};
return (
// eslint-disable-next-line jsx-a11y/anchor-is-valid
<a
data-radium="true"
className={classes.a}
+6 -6
View File
@@ -23,9 +23,9 @@ const container = document.getElementById('root');
const root = createRoot(container);
root.render(
<ErrorBoundary>
<HistoryProvider>
<ThemeProvider>
<Provider store={store}>
<ThemeProvider>
<Provider store={store}>
<HistoryProvider>
<AudioPlayerProvider>
<TasksProvider>
<DownloadManagerProvider>
@@ -33,8 +33,8 @@ root.render(
</DownloadManagerProvider>
</TasksProvider>
</AudioPlayerProvider>
</Provider>
</ThemeProvider>
</HistoryProvider>
</HistoryProvider>
</Provider>
</ThemeProvider>
</ErrorBoundary>,
);
+12
View File
@@ -1,3 +1,5 @@
const { promises: fs } = require('fs');
const readableBits = (bytes, decimals) => {
if (bytes === 0) return '0 Bytes';
const k = 1000;
@@ -17,9 +19,19 @@ const getBeatconnectProtocolParams = (argv = [''], protocol) => {
return undefined;
};
async function exists(path) {
try {
await fs.access(path);
return true;
} catch {
return false;
}
}
module.exports = {
readableBits,
makeDownloadUrl,
getBeatconnectProtocolParams,
removeProtocolPrefix,
exists,
};
@@ -6,7 +6,7 @@ const readCollectionDB = path =>
fs.readFile(path, (err, buf) => {
if (err || !buf) return reject(new Error('Failed to open collection.db'));
const collections = {};
const collections = [];
// eslint-disable-next-line no-underscore-dangle, no-unused-vars
const _version = buf.readInt32LE(0);
@@ -15,7 +15,8 @@ const readCollectionDB = path =>
for (let i = 0; i < collectionCount; i++) {
const name = readString(buf, offset);
offset += name.length;
collections[name.str] = [];
collections[i] = [name.str, []];
const beatmapCount = buf.readInt32LE(offset);
offset += 4;
@@ -23,7 +24,7 @@ const readCollectionDB = path =>
for (let j = 0; j < beatmapCount; j++) {
const md5 = readString(buf, offset);
offset += md5.length;
collections[name.str].push(md5.str);
collections[i][1].push(md5.str);
}
}
@@ -36,19 +37,17 @@ const writeCollectionDB = (path, collections) =>
let buf = Buffer.alloc(8);
buf.writeInt32LE(20160212);
buf.writeInt32LE(Object.keys(collections).length, 4);
buf.writeInt32LE(collections.length, 4);
const collectionNames = Object.keys(collections);
collectionNames.forEach(name => {
collections.forEach(([name, beatmapsMd5]) => {
buf = Buffer.concat([buf, createString(name)]);
const beatmapCountBuf = Buffer.alloc(4);
beatmapCountBuf.writeInt32LE(collections[name].length);
beatmapCountBuf.writeInt32LE(beatmapsMd5.length);
buf = Buffer.concat([buf, beatmapCountBuf]);
for (let j = 0; j < collections[name].length; j++) {
buf = Buffer.concat([buf, createString(collections[name][j])]);
for (let j = 0; j < beatmapsMd5.length; j++) {
buf = Buffer.concat([buf, createString(beatmapsMd5[j])]);
}
});
+8
View File
@@ -0,0 +1,8 @@
const { open } = require('osu-lazer-db-reader');
const readLazerDb = async path => {
const { beatmaps } = await open(path);
return beatmaps;
};
module.exports = { readLazerDb };
-13
View File
@@ -190,16 +190,3 @@ module.exports = {
readScoresDB,
writeScoresDB,
};
// readCollectionDB('./collection.db', collections => {
// console.log('READ : ', collections);
// collections['Top KEK'] = [
// 'DABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB',
// 'OMEGAROBDAB',
// 'SAMARCH',
// '44444444444444444444444444444449',
// ];
// writeCollectionDB('./collection.db', collections, () => {
// readCollectionDB('./collection.db', console.log);
// });
// });
+21 -8
View File
@@ -4,13 +4,14 @@ const { ipcMain, dialog, shell } = require('electron');
const fs = require('fs').promises;
const { join } = require('path');
const { downloadAndSetWallpaper } = require('./wallpaper');
const { readCollectionDB } = require('./helpers/osuCollections/collections.utils');
const { readCollectionDB, writeCollectionDB } = require('./helpers/osuCollections/collections.utils');
const startPullingOsuState = require('./threads/osuIsRunning');
const scanOsuDb = require('./threads/osuSongsScan');
const { exists } = require('./helpers');
ipcMain.handle('osuSongsScan', async (event, { osuPath }) => {
ipcMain.handle('osuSongsScan', async (event, { osuPath, isLazer }) => {
try {
const [beatmaps, overallDuration, overallUnplayedCount] = await scanOsuDb(`${osuPath}/osu!.db`);
const [beatmaps, overallDuration, overallUnplayedCount] = await scanOsuDb(`${osuPath}/osu!.db`, isLazer);
return { beatmaps, overallDuration, overallUnplayedCount };
} catch (e) {
error(`[scan-osu-songs]: ${e.message}`);
@@ -46,6 +47,17 @@ ipcMain.once('start-pulling-osu-state', event => {
ipcMain.handle('scan-osu-collections', async (event, osuPath) => {
try {
const collection = await readCollectionDB(`${osuPath}/collection.db`);
// const test = await readCollectionDB(`${osuPath}/collection.db`);
// console.log('READ : ', test);
// test.push([
// 'Top KEK',
// ['DABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', 'OMEGAROBDAB', 'SAMARCH', '44444444444444444444444444444449'],
// ]);
// await writeCollectionDB(`${osuPath}/collection.db`, test);
return collection;
} catch (e) {
error(`[scan-osu-collections]: ${e.message}`);
@@ -54,12 +66,13 @@ ipcMain.handle('scan-osu-collections', async (event, osuPath) => {
});
ipcMain.handle('validate-osu-path', async (event, osuPath) => {
try {
const isPathValid = await fs.stat(`${osuPath}/osu!.db`);
return isPathValid.isFile();
} catch {
return false;
const isPathValid = await exists(`${osuPath}/collection.db`);
if (isPathValid) {
const isLegacyOsu = await exists(`${osuPath}/osu.db`);
const isLazer = await exists(`${osuPath}/client.realm`);
return { isValid: isLegacyOsu || isLazer, isLazer };
}
return { isValid: false, isLazer: false };
});
ipcMain.handle('is-dir', async (event, path) => {
+62 -22
View File
@@ -1,31 +1,71 @@
const { Worker } = require('worker_threads');
const { join } = require('path');
const { error } = require('electron-log');
const { readLazerDb } = require('../helpers/osuLazer');
const scanOsuDb = osuDbPath =>
const scanOsuDb = (osuDbPath, isLazer = false) =>
new Promise((resolve, reject) => {
const worker = new Worker(join(__dirname, './osuSongsScan.worker.js'));
const terminate = () => {
worker.removeAllListeners();
worker.terminate();
};
worker.on('message', data => {
switch (data[0]) {
case 'result':
terminate();
resolve(data[1]);
break;
case 'error':
terminate();
error(`[scanOsuDb thread]: ${data[1]}`);
reject(data[1]);
break;
default:
terminate();
break;
switch (isLazer) {
case true: {
readLazerDb('/Users/ypetitot/.local/share/osu/client.realm')
.then(beatmaps => {
const beatmapsList = {};
beatmaps.forEach(beatmap => {
if (beatmap.BeatmapSet.OnlineID === -1) return;
if (beatmapsList[beatmap.BeatmapSet.OnlineID]) {
beatmapsList[beatmap.BeatmapSet.OnlineID].mapsMd5.push(beatmap.MD5Hash);
return;
}
beatmapsList[beatmap.BeatmapSet.OnlineID] = {
id: beatmap.BeatmapSet.OnlineID,
date: beatmap.BeatmapSet.DateAdded.getTime(),
title: beatmap.Metadata.Title,
artist: beatmap.Metadata.Artist,
creator: beatmap.Metadata.Author.Username,
isUnplayed: false,
mapsMd5: [beatmap.MD5Hash],
audioPath: '',
previewOffset: beatmap.Metadata.PreviewTime,
songDuration: beatmap.Length / 1000,
};
});
resolve([beatmapsList]);
})
.catch(reject);
break;
}
});
worker.postMessage(osuDbPath);
case false: {
const worker = new Worker(join(__dirname, './osuSongsScan.worker.js'));
const terminate = () => {
worker.removeAllListeners();
worker.terminate();
};
worker.on('message', data => {
switch (data[0]) {
case 'result':
terminate();
resolve(data[1]);
break;
case 'error':
terminate();
error(`[scanOsuDb thread]: ${data[1]}`);
reject(data[1]);
break;
default:
terminate();
break;
}
});
worker.postMessage({ osuDbPath, isLazer });
break;
}
default:
break;
}
});
module.exports = scanOsuDb;
+46 -34
View File
@@ -2,40 +2,52 @@ const { parentPort } = require('worker_threads');
const { join } = require('path');
const { readOsuDB, winTickToMs } = require('../helpers/osudb');
parentPort.on('message', osuDbPath => {
if (osuDbPath) {
try {
const re = readOsuDB(osuDbPath);
const beatmaps = {};
let overallDuration = 0;
let overallUnplayedCount = 0;
if (!re.beatmaps || !Array.isArray(re.beatmaps)) {
throw new Error('Could not get beatmaps from osu db');
}
re.beatmaps.forEach(beatmap => {
if (beatmap.beatmapset_id === -1) return;
if (beatmaps[beatmap.beatmapset_id]) {
beatmaps[beatmap.beatmapset_id].mapsMd5.push(beatmap.md5);
return;
}
if (beatmap.unplayed) overallUnplayedCount += 1;
overallDuration += beatmap.total_time;
beatmaps[beatmap.beatmapset_id] = {
id: beatmap.beatmapset_id,
date: winTickToMs(beatmap.last_modification_time),
title: beatmap.song_title,
artist: beatmap.artist_name,
creator: beatmap.creator_name,
isUnplayed: beatmap.unplayed,
mapsMd5: [beatmap.md5],
audioPath: join(beatmap.folder_name, beatmap.audio_file_name),
previewOffset: beatmap.preview_offset,
songDuration: Math.ceil(beatmap.total_time / 1000),
};
});
parentPort.postMessage(['result', [beatmaps, overallDuration, overallUnplayedCount]]);
} catch (e) {
parentPort.postMessage(['error', e.message]);
parentPort.on('message', ({ osuDbPath, isLazer = false }) => {
if (!osuDbPath) {
parentPort.postMessage(['error', 'missing osuDbPath']);
return;
}
switch (isLazer) {
case true: {
break;
}
case false: {
try {
const re = readOsuDB(osuDbPath);
const beatmaps = {};
let overallDuration = 0;
let overallUnplayedCount = 0;
if (!re.beatmaps || !Array.isArray(re.beatmaps)) {
throw new Error('Could not get beatmaps from osu db');
}
re.beatmaps.forEach(beatmap => {
if (beatmap.beatmapset_id === -1) return;
if (beatmaps[beatmap.beatmapset_id]) {
beatmaps[beatmap.beatmapset_id].mapsMd5.push(beatmap.md5);
return;
}
if (beatmap.unplayed) overallUnplayedCount += 1;
overallDuration += beatmap.total_time;
beatmaps[beatmap.beatmapset_id] = {
id: beatmap.beatmapset_id,
date: winTickToMs(beatmap.last_modification_time),
title: beatmap.song_title,
artist: beatmap.artist_name,
creator: beatmap.creator_name,
isUnplayed: beatmap.unplayed,
mapsMd5: [beatmap.md5],
audioPath: join(beatmap.folder_name, beatmap.audio_file_name),
previewOffset: beatmap.preview_offset,
songDuration: Math.ceil(beatmap.total_time / 1000),
};
});
parentPort.postMessage(['result', [beatmaps, overallDuration, overallUnplayedCount]]);
} catch (e) {
parentPort.postMessage(['error', e.message]);
}
break;
}
default:
break;
}
});
+541 -23
View File
@@ -2208,6 +2208,13 @@ __metadata:
languageName: node
linkType: hard
"@realm.io/common@npm:^0.1.1":
version: 0.1.1
resolution: "@realm.io/common@npm:0.1.1"
checksum: 29e9e0e0f706d31e1c12babb9d019f87bbd4a51b006d7b4796de375f9bb53ca893beb05a3e21b31d32314dbb905a9dadeebd4742c09a9ff83a612af7c5656192
languageName: node
linkType: hard
"@rescript/react@npm:0.10.3":
version: 0.10.3
resolution: "@rescript/react@npm:0.10.3"
@@ -2957,6 +2964,15 @@ __metadata:
languageName: node
linkType: hard
"abort-controller@npm:^3.0.0":
version: 3.0.0
resolution: "abort-controller@npm:3.0.0"
dependencies:
event-target-shim: ^5.0.0
checksum: cc53ad8df9a6de3f55d4f804fca5106908f855e47b572fb5ab3cdd723b76374686dcefa557a2f87d4396db77e31bc0e6ce9d48637388cef6d884c29ad2691448
languageName: node
linkType: hard
"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8":
version: 1.3.8
resolution: "accepts@npm:1.3.8"
@@ -3069,6 +3085,15 @@ __metadata:
languageName: node
linkType: hard
"agent-base@npm:^4.3.0":
version: 4.3.0
resolution: "agent-base@npm:4.3.0"
dependencies:
es6-promisify: ^5.0.0
checksum: b40b7d9675c475202afac88c31d5ce42f041e50d2028bd4ad0cfc25b60abe4aedf6b976d9f653641663cbf45295539282d0cf7d50ece7f7c1dd0c05dc99a8112
languageName: node
linkType: hard
"agentkeepalive@npm:^4.2.1":
version: 4.2.1
resolution: "agentkeepalive@npm:4.2.1"
@@ -3300,7 +3325,7 @@ __metadata:
languageName: node
linkType: hard
"aproba@npm:^1.1.1":
"aproba@npm:^1.0.3, aproba@npm:^1.1.1":
version: 1.2.0
resolution: "aproba@npm:1.2.0"
checksum: d4bac3e640af1f35eea8d5ee2b96ce2682549e47289f071aa37ae56066e19d239e43dea170c207d0f71586d7634099089523dd5701f26d4ded7b31dd5848a24a
@@ -3317,6 +3342,16 @@ __metadata:
languageName: node
linkType: hard
"are-we-there-yet@npm:~1.1.2":
version: 1.1.7
resolution: "are-we-there-yet@npm:1.1.7"
dependencies:
delegates: ^1.0.0
readable-stream: ^2.0.6
checksum: 2f2301155887bba5217cadd2a8aeffbc9716bd6339353950732bf3f2df6bbbec2b8a1291066a985719e30dd2a3eb873e9d81ed7962d2c46f9ac182dd265f97ed
languageName: node
linkType: hard
"argparse@npm:^1.0.7":
version: 1.0.10
resolution: "argparse@npm:1.0.10"
@@ -3364,6 +3399,13 @@ __metadata:
languageName: node
linkType: hard
"array-back@npm:^3.0.1, array-back@npm:^3.1.0":
version: 3.1.0
resolution: "array-back@npm:3.1.0"
checksum: 959a3377f21ac97490bc14607cc3fe888d087dc7beadab8db09e03061d59e901d695ac870b050f37cddd261e03963e4fca86287e3055e0688a06b95be66f0825
languageName: node
linkType: hard
"array-equal@npm:^1.0.0":
version: 1.0.0
resolution: "array-equal@npm:1.0.0"
@@ -3464,6 +3506,13 @@ __metadata:
languageName: node
linkType: hard
"asap@npm:~2.0.3":
version: 2.0.6
resolution: "asap@npm:2.0.6"
checksum: 3d314f8c598b625a98347bacdba609d4c889c616ca5d8ea65acaae8050ab8b7aa6630df2cfe9856c20b260b432adf2ee7a65a1021f268ef70408c70f809e3a39
languageName: node
linkType: hard
"asar@npm:^3.1.0":
version: 3.1.0
resolution: "asar@npm:3.1.0"
@@ -3585,6 +3634,13 @@ __metadata:
languageName: node
linkType: hard
"async@npm:^3.2.3":
version: 3.2.3
resolution: "async@npm:3.2.3"
checksum: 566b6d62e3108757bca3bfbd2313d833bf3b13fb8d65a7715db8b5de7a284271584aee2029f7f39cc6f39cd9cb58336ea204003f76ca02c31240919022948b97
languageName: node
linkType: hard
"asynckit@npm:^0.4.0":
version: 0.4.0
resolution: "asynckit@npm:0.4.0"
@@ -3972,6 +4028,7 @@ __metadata:
miragejs: ^0.1.41
node-machine-id: ^1.1.12
osu-db-parser: "git+https://github.com/yadPe/osu-db-parser.git#6cc783f3a9270f730cd5038d03ada4a78634cd65"
osu-lazer-db-reader: 0.1.6
pnp-webpack-plugin: 1.2.1
prettier: ^1.18.2
ps-node: ^0.1.6
@@ -4028,6 +4085,17 @@ __metadata:
languageName: node
linkType: hard
"bl@npm:^4.0.3":
version: 4.1.0
resolution: "bl@npm:4.1.0"
dependencies:
buffer: ^5.5.0
inherits: ^2.0.4
readable-stream: ^3.4.0
checksum: 15d009339c2eeaedb9dab39c48f910a2fd6a9ba11400e61990917ebf3b25fa32cd9b80c7531a95467078258f6a59bd3f5d93323565423a7843855a16a1794261
languageName: node
linkType: hard
"bluebird-lst@npm:^1.0.9":
version: 1.0.9
resolution: "bluebird-lst@npm:1.0.9"
@@ -4299,6 +4367,15 @@ __metadata:
languageName: node
linkType: hard
"bson@npm:4.4.1":
version: 4.4.1
resolution: "bson@npm:4.4.1"
dependencies:
buffer: ^5.6.0
checksum: 2f6ba7f22a0818f0fd33509dd723a9f3f800f0142a7109180d5b17dca4e8cb67461c9f2c9fad71e68d9b9435f499d1b028af6eefa812f3ba727aeeec72a61c89
languageName: node
linkType: hard
"buffer-alloc-unsafe@npm:^1.1.0":
version: 1.1.0
resolution: "buffer-alloc-unsafe@npm:1.1.0"
@@ -4369,7 +4446,7 @@ __metadata:
languageName: node
linkType: hard
"buffer@npm:^5.1.0":
"buffer@npm:^5.1.0, buffer@npm:^5.5.0, buffer@npm:^5.6.0":
version: 5.7.1
resolution: "buffer@npm:5.7.1"
dependencies:
@@ -4630,6 +4707,13 @@ __metadata:
languageName: node
linkType: hard
"caseless@npm:~0.11.0":
version: 0.11.0
resolution: "caseless@npm:0.11.0"
checksum: 548c8594a26fc3ad14c8ba3df7674f0b45ca6886a3d5b6e77232b490d31e491d2d1b35ba724af6598d7be6ff4acb684afa65ae85a5ad377b91b3b5cb536ee178
languageName: node
linkType: hard
"caseless@npm:~0.12.0":
version: 0.12.0
resolution: "caseless@npm:0.12.0"
@@ -4803,6 +4887,21 @@ __metadata:
languageName: node
linkType: hard
"clang-format@npm:^1.6.0":
version: 1.8.0
resolution: "clang-format@npm:1.8.0"
dependencies:
async: ^3.2.3
glob: ^7.0.0
resolve: ^1.1.6
bin:
check-clang-format: bin/check-clang-format.js
clang-format: index.js
git-clang-format: bin/git-clang-format
checksum: ab9c75aff5ade98ff08c9599c9f557c85f6fc5e61c757c6c3f8480667bfb75f445613c8b533ce58edee44248a6e84aa9df47bbcbcf38e97703f89a80e0d832cf
languageName: node
linkType: hard
"class-utils@npm:^0.3.5":
version: 0.3.6
resolution: "class-utils@npm:0.3.6"
@@ -4924,6 +5023,13 @@ __metadata:
languageName: node
linkType: hard
"code-point-at@npm:^1.0.0":
version: 1.1.0
resolution: "code-point-at@npm:1.1.0"
checksum: 7d9837296e0f1c00239c88542f5a3e0bad11e45d3d0e8d9d097901fe54722dd5d2c006969077a287be8648a202c43f74e096f17552cbd897568308fba7b87ac0
languageName: node
linkType: hard
"collect-v8-coverage@npm:^1.0.0":
version: 1.0.1
resolution: "collect-v8-coverage@npm:1.0.1"
@@ -4998,6 +5104,18 @@ __metadata:
languageName: node
linkType: hard
"command-line-args@npm:^5.1.1":
version: 5.2.1
resolution: "command-line-args@npm:5.2.1"
dependencies:
array-back: ^3.1.0
find-replace: ^3.0.0
lodash.camelcase: ^4.3.0
typical: ^4.0.0
checksum: d1ac094956e20d52f8da015718586b04dec3b99455fd00c8c1776bbecbc5d94da97a0adb6bdcf31d100b8aebfb970bd47a82604975d15a720012b07a8da56826
languageName: node
linkType: hard
"commander@npm:2.17.x":
version: 2.17.1
resolution: "commander@npm:2.17.1"
@@ -5097,7 +5215,7 @@ __metadata:
languageName: node
linkType: hard
"concat-stream@npm:^1.5.0, concat-stream@npm:^1.6.2":
"concat-stream@npm:^1.4.6, concat-stream@npm:^1.4.7, concat-stream@npm:^1.5.0, concat-stream@npm:^1.6.2":
version: 1.6.2
resolution: "concat-stream@npm:1.6.2"
dependencies:
@@ -5161,7 +5279,7 @@ __metadata:
languageName: node
linkType: hard
"console-control-strings@npm:^1.1.0":
"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0, console-control-strings@npm:~1.1.0":
version: 1.1.0
resolution: "console-control-strings@npm:1.1.0"
checksum: 58a404d951bf270494fb91e136cf064652c1208ccedac23e4da24e6a3a3933998f302cadc45cbf6582a007a4aa44dab944e84056b24e3b1964e9a28aeedf76c9
@@ -5808,7 +5926,7 @@ __metadata:
languageName: node
linkType: hard
"debug@npm:^3.1.1, debug@npm:^3.2.5, debug@npm:^3.2.7":
"debug@npm:^3.1.0, debug@npm:^3.1.1, debug@npm:^3.2.5, debug@npm:^3.2.7":
version: 3.2.7
resolution: "debug@npm:3.2.7"
dependencies:
@@ -5857,6 +5975,15 @@ __metadata:
languageName: node
linkType: hard
"decompress-response@npm:^6.0.0":
version: 6.0.0
resolution: "decompress-response@npm:6.0.0"
dependencies:
mimic-response: ^3.1.0
checksum: bb8b8c42be7767994764d27f91a3949e3dc9008da82f1aaeab1de40f1ebb50d7abf17b31b2e4000f8d267a1e75f76052efd58d4419124c04bf430e184c164fad
languageName: node
linkType: hard
"deep-equal@npm:^1.0.1":
version: 1.1.1
resolution: "deep-equal@npm:1.1.1"
@@ -5885,6 +6012,13 @@ __metadata:
languageName: node
linkType: hard
"deepmerge@npm:2.1.0":
version: 2.1.0
resolution: "deepmerge@npm:2.1.0"
checksum: 7ddcbc182fc324df524ad7e7f079d10d70fc665613a46a04b8979cbe560742410eb866cfec9ea4d58276b2767018da8d225c5146d860340507ddee276e2f0c91
languageName: node
linkType: hard
"deepmerge@npm:^4.2.2":
version: 4.2.2
resolution: "deepmerge@npm:4.2.2"
@@ -5999,6 +6133,13 @@ __metadata:
languageName: node
linkType: hard
"detect-libc@npm:^2.0.0":
version: 2.0.1
resolution: "detect-libc@npm:2.0.1"
checksum: 18266d3cc95aff315809cd0d292cbb0e40673df164a0a674c31e05ff9574b5b088e9f6517c9ac9b5e1896548edc105ad59af71b4c8172229226fbc448a6814ad
languageName: node
linkType: hard
"detect-newline@npm:^3.0.0":
version: 3.1.0
resolution: "detect-newline@npm:3.1.0"
@@ -6543,7 +6684,7 @@ __metadata:
languageName: node
linkType: hard
"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0":
"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1":
version: 1.4.4
resolution: "end-of-stream@npm:1.4.4"
dependencies:
@@ -6659,6 +6800,22 @@ __metadata:
languageName: node
linkType: hard
"es6-promise@npm:^4.0.3":
version: 4.2.8
resolution: "es6-promise@npm:4.2.8"
checksum: b85e5faab1b3785b8bf1a6c91b5f176cf3e5e4550359508ef54dd58b19ad2b831e04607e2a0a464f2a1407bf02897d5c88daf6e3d94c2ee4510e8191b44b64ef
languageName: node
linkType: hard
"es6-promisify@npm:^5.0.0":
version: 5.0.0
resolution: "es6-promisify@npm:5.0.0"
dependencies:
es6-promise: ^4.0.3
checksum: 657d2f0623ddec94f7e3a881fcd73e33c26e796c25791169b50527014b58995a1cc35578595b6f28a71896d44dc00a98e6cf838804582c8fa38f9a4bb7ef1761
languageName: node
linkType: hard
"escalade@npm:^3.1.1":
version: 3.1.1
resolution: "escalade@npm:3.1.1"
@@ -7082,6 +7239,13 @@ __metadata:
languageName: node
linkType: hard
"event-target-shim@npm:^5.0.0":
version: 5.0.1
resolution: "event-target-shim@npm:5.0.1"
checksum: d176477a31adf328ff50148886e46cef3f61ff8bdc1d6db161f6b3ead2501085d5652a81fab8dddc59aed93727231c0b5c8a0948de77ae401b2d977a3d18329e
languageName: node
linkType: hard
"eventemitter3@npm:^4.0.0":
version: 4.0.7
resolution: "eventemitter3@npm:4.0.7"
@@ -7177,6 +7341,13 @@ __metadata:
languageName: node
linkType: hard
"expand-template@npm:^2.0.3":
version: 2.0.3
resolution: "expand-template@npm:2.0.3"
checksum: d1c08a374a2335647562d6958bf23a40371fd9eb64362f3a2475b232a8d2e4bfa8f746066ff45c17efde185dab66f5d0824eaaa26e3e491d03bff50be0be7c3d
languageName: node
linkType: hard
"expect@npm:^26.6.2":
version: 26.6.2
resolution: "expect@npm:26.6.2"
@@ -7497,6 +7668,15 @@ __metadata:
languageName: node
linkType: hard
"find-replace@npm:^3.0.0":
version: 3.0.0
resolution: "find-replace@npm:3.0.0"
dependencies:
array-back: ^3.0.1
checksum: 9aec6a6dfe746e7dddb12bf38bd395f30b40d2f3f3518ed10b63286daf9ad9f29ee6b4a74e7e4fda4a3bbd63fca9d96c32fdcb7dfe117010d601d2bf74bbf34d
languageName: node
linkType: hard
"find-root@npm:^1.1.0":
version: 1.1.0
resolution: "find-root@npm:1.1.0"
@@ -7674,6 +7854,13 @@ __metadata:
languageName: node
linkType: hard
"fs-constants@npm:^1.0.0":
version: 1.0.0
resolution: "fs-constants@npm:1.0.0"
checksum: b8382395f555012591b20bddf08d258723f660b4e7312943d10431a893e2af879295fefc15a917df43c9ed52d80d2f014c0ca8ca359367969be5c8a133e39742
languageName: node
linkType: hard
"fs-extra@npm:^10.0.0":
version: 10.0.1
resolution: "fs-extra@npm:10.0.1"
@@ -7685,6 +7872,17 @@ __metadata:
languageName: node
linkType: hard
"fs-extra@npm:^4.0.3":
version: 4.0.3
resolution: "fs-extra@npm:4.0.3"
dependencies:
graceful-fs: ^4.1.2
jsonfile: ^4.0.0
universalify: ^0.1.0
checksum: ad42def19446c82543ebfa707250de2e1adff8f1c902f9cad3946f69b3dad326696f70e86c3aebeab4bc4f19ff3ef9abee0460d7fb775122f3dc9142a4b1280f
languageName: node
linkType: hard
"fs-extra@npm:^8.1.0":
version: 8.1.0
resolution: "fs-extra@npm:8.1.0"
@@ -7804,6 +8002,22 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"gauge@npm:~2.7.3":
version: 2.7.4
resolution: "gauge@npm:2.7.4"
dependencies:
aproba: ^1.0.3
console-control-strings: ^1.0.0
has-unicode: ^2.0.0
object-assign: ^4.1.0
signal-exit: ^3.0.0
string-width: ^1.0.1
strip-ansi: ^3.0.1
wide-align: ^1.1.0
checksum: b136dbeb8e40acaaddab6c71c9f34d3c9aa104efc538c8c0ddcd74b25efb8daeb8dca24a9b30626b477d66beccd3dee8dd31e25eb4c7c97ec58a3f1a82914be1
languageName: node
linkType: hard
"gensync@npm:^1.0.0-beta.2":
version: 1.0.0-beta.2
resolution: "gensync@npm:1.0.0-beta.2"
@@ -7940,6 +8154,13 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"github-from-package@npm:0.0.0":
version: 0.0.0
resolution: "github-from-package@npm:0.0.0"
checksum: 9c3bae601535f7de7e2f54cc58dcd2ae62aa7afd262e9edea9021a264e633859ad0aef6ec23328e26607e4259f1efb97ce9b5b01e3f80d7d258085a628c9b710
languageName: node
linkType: hard
"glob-parent@npm:^3.1.0":
version: 3.1.0
resolution: "glob-parent@npm:3.1.0"
@@ -7966,6 +8187,20 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"glob@npm:^7.0.0":
version: 7.2.3
resolution: "glob@npm:7.2.3"
dependencies:
fs.realpath: ^1.0.0
inflight: ^1.0.4
inherits: 2
minimatch: ^3.1.1
once: ^1.3.0
path-is-absolute: ^1.0.0
checksum: 48c72ab438f8fc8aa2135d408d8af167d7bacf175b84d87a60d401cbdc50330aeb602cf16868efd4dbdb249117173394c25d49b2f642dd4764813ee6f9458c6c
languageName: node
linkType: hard
"glob@npm:^7.0.3, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0":
version: 7.2.0
resolution: "glob@npm:7.2.0"
@@ -8240,7 +8475,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"has-unicode@npm:^2.0.1":
"has-unicode@npm:^2.0.0, has-unicode@npm:^2.0.1":
version: 2.0.1
resolution: "has-unicode@npm:2.0.1"
checksum: ed3719f95cbd7dada9e3fde6fad113eae6d317bc8e818a2350954914c098ca6eddb203261af2c291c49a14c52f83610becbc7ab8d569bee81261b9c260a435f2
@@ -8457,6 +8692,17 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"http-basic@npm:^2.5.1":
version: 2.5.1
resolution: "http-basic@npm:2.5.1"
dependencies:
caseless: ~0.11.0
concat-stream: ^1.4.6
http-response-object: ^1.0.0
checksum: d7cc8b94838e84b8049cf4a90378f6d199c36883aa070e9212db1c877efe3b65f4e524d01c86544e9ae618b4eba78257ec1d5470928a794a53f51a0ab82c8286
languageName: node
linkType: hard
"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0":
version: 4.1.0
resolution: "http-cache-semantics@npm:4.1.0"
@@ -8548,6 +8794,13 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"http-response-object@npm:^1.0.0, http-response-object@npm:^1.0.1, http-response-object@npm:^1.1.0":
version: 1.1.0
resolution: "http-response-object@npm:1.1.0"
checksum: 4a3a131c521056ba7158b300494d9eb9a880fcf4545bb139cb107b903bbb1c52e81c32583cb45cc5ec1a5c61bd3c2f745c783fe7fa569057c19402a72711e7e8
languageName: node
linkType: hard
"http-signature@npm:~1.2.0":
version: 1.2.0
resolution: "http-signature@npm:1.2.0"
@@ -8566,6 +8819,16 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"https-proxy-agent@npm:^2.2.4":
version: 2.2.4
resolution: "https-proxy-agent@npm:2.2.4"
dependencies:
agent-base: ^4.3.0
debug: ^3.1.0
checksum: 4e42bed005d75debcfd6d3901edbd391dd72cda32a2ece4584443eb7025ac0a0f85fb01f45d385608a380f6bf2d659c632776ac17b898c6d991fd9ec1d32a1f0
languageName: node
linkType: hard
"https-proxy-agent@npm:^5.0.0":
version: 5.0.0
resolution: "https-proxy-agent@npm:5.0.0"
@@ -8785,7 +9048,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"ini@npm:^1.3.2, ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0":
"ini@npm:^1.3.2, ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:^1.3.7, ini@npm:~1.3.0":
version: 1.3.8
resolution: "ini@npm:1.3.8"
checksum: 62189ce7ea44c5778e757e4232c581212e838f3c39e79d931bb9152fd4b9275f09fb20b96afdd60ba9f5d7996b92486cad6cc617fcb84ff4beedd1b33b86221e
@@ -9085,6 +9348,15 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"is-fullwidth-code-point@npm:^1.0.0":
version: 1.0.0
resolution: "is-fullwidth-code-point@npm:1.0.0"
dependencies:
number-is-nan: ^1.0.0
checksum: fc3d51ef082eaf0c0d44e94b74cf43b97446e008b147b08186daea8bd5ff402596f04b5fe4fa4c0457470beab5c2de8339c49c96b5be65fe9fdf88f60a0001e8
languageName: node
linkType: hard
"is-fullwidth-code-point@npm:^2.0.0":
version: 2.0.0
resolution: "is-fullwidth-code-point@npm:2.0.0"
@@ -11399,6 +11671,13 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"mimic-response@npm:^3.1.0":
version: 3.1.0
resolution: "mimic-response@npm:3.1.0"
checksum: cfbf19f66de6ad46df7481d9e8c1a7f30b6fa77dd771ad4a72a0443265041a39768182bde6d1de39001c2774168635bc74f42902e401c8ba33db55d69b773004
languageName: node
linkType: hard
"min-indent@npm:^1.0.0":
version: 1.0.1
resolution: "min-indent@npm:1.0.1"
@@ -11429,7 +11708,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2":
"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2":
version: 3.1.2
resolution: "minimatch@npm:3.1.2"
dependencies:
@@ -11449,7 +11728,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"minimist@npm:^1.1.1, minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6":
"minimist@npm:^1.1.1, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6":
version: 1.2.6
resolution: "minimist@npm:1.2.6"
checksum: 56b3aeedcc7776139f72ca9dce0dae06825437f71ebd823d97dc49a34f3280e627909d54aca6fa81c47e17f11e5affc7357bfb8fd8140ca6138e80f946dd0dbc
@@ -11588,6 +11867,13 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3":
version: 0.5.3
resolution: "mkdirp-classic@npm:0.5.3"
checksum: b3c46c62840bdc82c2a5bee417e4e7518a8109d32a85a6dc67bdcfecbe6aff5cfc73cdb98844a61178ddd8ac75743f977857f0badd6e12d14fd18cf1639e41a1
languageName: node
linkType: hard
"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.3, mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.5, mkdirp@npm:~0.5.1":
version: 0.5.6
resolution: "mkdirp@npm:0.5.6"
@@ -11704,6 +11990,13 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"napi-build-utils@npm:^1.0.1":
version: 1.0.2
resolution: "napi-build-utils@npm:1.0.2"
checksum: e4dfbec94d315533fea33a96ef5fb4de0d9e8828f2bb2b30e38de089500dfe35fe058ea5bcd72e104381457263f854c3d52d4d8700df9e1f9e6b78e9500ba435
languageName: node
linkType: hard
"natural-compare@npm:^1.4.0":
version: 1.4.0
resolution: "natural-compare@npm:1.4.0"
@@ -11741,6 +12034,24 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"node-abi@npm:^3.3.0":
version: 3.22.0
resolution: "node-abi@npm:3.22.0"
dependencies:
semver: ^7.3.5
checksum: fc1a69ad3085a631ad8ef1c5b1f9554353c40f2fc8f83720a2635e363be92ad4acf04c4961a02896bf2213eaac173a4b0361228de6e762ae42f2ada39c889032
languageName: node
linkType: hard
"node-addon-api@npm:4.2.0":
version: 4.2.0
resolution: "node-addon-api@npm:4.2.0"
dependencies:
node-gyp: latest
checksum: e0911dd01efed65c0a70db660570225904bf24d77b17801be42ecea01c8aaa9423c511b78fd89ce84b09149a7a4ed115bf9a84ff9ee6b779a1f68eefeef3972c
languageName: node
linkType: hard
"node-addon-api@npm:^1.6.3":
version: 1.7.2
resolution: "node-addon-api@npm:1.7.2"
@@ -11750,7 +12061,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"node-fetch@npm:^2.6.1":
"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1":
version: 2.6.7
resolution: "node-fetch@npm:2.6.7"
dependencies:
@@ -11829,7 +12140,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"node-machine-id@npm:^1.1.12":
"node-machine-id@npm:^1.1.10, node-machine-id@npm:^1.1.12":
version: 1.1.12
resolution: "node-machine-id@npm:1.1.12"
checksum: 893cf7e3693fd693c3564a2dc1e32c5e43bb09e819365a3fbcbcc9fe1b694a2dd647da842483992653bd4afb7f797ef67c9e654665de5443143eed1db520b495
@@ -11950,6 +12261,18 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"npmlog@npm:^4.0.1":
version: 4.1.2
resolution: "npmlog@npm:4.1.2"
dependencies:
are-we-there-yet: ~1.1.2
console-control-strings: ~1.1.0
gauge: ~2.7.3
set-blocking: ~2.0.0
checksum: 0cd63f127c1bbda403a112e83b11804aaee2b58b0bc581c3bde9b82e4d957c7ed0ad3bee499af706cdd3599bb93669d7cbbf29fb500407d35fe75687ac96e2c0
languageName: node
linkType: hard
"npmlog@npm:^6.0.0":
version: 6.0.1
resolution: "npmlog@npm:6.0.1"
@@ -11980,6 +12303,13 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"number-is-nan@npm:^1.0.0":
version: 1.0.1
resolution: "number-is-nan@npm:1.0.1"
checksum: 42251b2653a16f8b47639d93c3b646fff295a4582a6b3a2fc51a651d4511427c247629709063d19befbceb8a3db1a8e9f17016b3a207291e79e4bd1413032918
languageName: node
linkType: hard
"nwsapi@npm:^2.1.3, nwsapi@npm:^2.2.0":
version: 2.2.0
resolution: "nwsapi@npm:2.2.0"
@@ -11994,7 +12324,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1":
"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1":
version: 4.1.1
resolution: "object-assign@npm:4.1.1"
checksum: 66cf021898fc1b13ea573ea8635fbd5a76533f50cecbc2fcd5eee1e8029af41bcebe7023788b6d0e06cbe4401ecea075d972f78ec74467cdc571a0f1a4d1a081
@@ -12257,6 +12587,15 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"osu-lazer-db-reader@npm:0.1.6":
version: 0.1.6
resolution: "osu-lazer-db-reader@npm:0.1.6"
dependencies:
realm: ^10.17.0
checksum: 69303143eda7fb06c7b5cbc5d6ef9d29ba327663ce2dc45629e6ae02bf419192a03877a2e8ac0f31035de8662ff577051bded1213762393e580c3b4c3913bee9
languageName: node
linkType: hard
"p-cancelable@npm:^1.0.0":
version: 1.1.0
resolution: "p-cancelable@npm:1.1.0"
@@ -12715,6 +13054,29 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"prebuild-install@npm:^7.0.1":
version: 7.1.0
resolution: "prebuild-install@npm:7.1.0"
dependencies:
detect-libc: ^2.0.0
expand-template: ^2.0.3
github-from-package: 0.0.0
minimist: ^1.2.3
mkdirp-classic: ^0.5.3
napi-build-utils: ^1.0.1
node-abi: ^3.3.0
npmlog: ^4.0.1
pump: ^3.0.0
rc: ^1.2.7
simple-get: ^4.0.0
tar-fs: ^2.0.0
tunnel-agent: ^0.6.0
bin:
prebuild-install: bin.js
checksum: 6ac90302e771952f51614bab7be7234bfd7e38c00cef4561abbe5b3f498d0f76a2d0d3f758f5c7c6d4761b13ac9342d90e39f535b2cfc063f139ab5eddc89642
languageName: node
linkType: hard
"prelude-ls@npm:^1.2.1":
version: 1.2.1
resolution: "prelude-ls@npm:1.2.1"
@@ -12815,6 +13177,15 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"promise@npm:^7.1.1":
version: 7.3.1
resolution: "promise@npm:7.3.1"
dependencies:
asap: ~2.0.3
checksum: 23267a4b078fcb02c57b06ca1a1d5739109deb0932c0fd79615a2c5636dd0571ac6a161f19c4ea9683a4ab89791da13112678fa410b65334de490e97c33410ae
languageName: node
linkType: hard
"prompts@npm:^2.0.1":
version: 2.4.2
resolution: "prompts@npm:2.4.2"
@@ -12825,7 +13196,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"prop-types@npm:^15.5.8, prop-types@npm:^15.6.0, prop-types@npm:^15.8.1":
"prop-types@npm:^15.5.8, prop-types@npm:^15.6.0, prop-types@npm:^15.6.2, prop-types@npm:^15.8.1":
version: 15.8.1
resolution: "prop-types@npm:15.8.1"
dependencies:
@@ -12965,6 +13336,15 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"qs@npm:^6.1.0":
version: 6.10.3
resolution: "qs@npm:6.10.3"
dependencies:
side-channel: ^1.0.4
checksum: 8428e7246f1cb17b6c05ca9d394ca5149926613409dafab943c7de2393efe5564944d2c8af73508a6dd825b1f9efb036053bed0f73dade26e1d44cfb465ee768
languageName: node
linkType: hard
"qs@npm:~6.5.2":
version: 6.5.3
resolution: "qs@npm:6.5.3"
@@ -13038,7 +13418,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"rc@npm:^1.2.8":
"rc@npm:^1.2.7, rc@npm:^1.2.8":
version: 1.2.8
resolution: "rc@npm:1.2.8"
dependencies:
@@ -13274,7 +13654,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6":
"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.0.6, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6":
version: 2.3.7
resolution: "readable-stream@npm:2.3.7"
dependencies:
@@ -13289,7 +13669,7 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.6, readable-stream@npm:^3.6.0":
"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0":
version: 3.6.0
resolution: "readable-stream@npm:3.6.0"
dependencies:
@@ -13320,6 +13700,51 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
"realm-network-transport@npm:^0.7.2":
version: 0.7.2
resolution: "realm-network-transport@npm:0.7.2"
dependencies:
abort-controller: ^3.0.0
node-fetch: ^2.6.0
checksum: 982b1b5a3a038d99b97dd70c54404d893a652385cd73da9905b8b51a2e03afe70ed53ddaf89f4b2326ec1e949f5e758474730efe88066a0364de0e4608b50f52
languageName: node
linkType: hard
"realm@npm:^10.17.0":
version: 10.17.0
resolution: "realm@npm:10.17.0"
dependencies:
"@realm.io/common": ^0.1.1
bindings: ^1.5.0
bson: 4.4.1
clang-format: ^1.6.0
command-line-args: ^5.1.1
deepmerge: 2.1.0
fs-extra: ^4.0.3
https-proxy-agent: ^2.2.4
ini: ^1.3.7
node-addon-api: 4.2.0
node-fetch: ^2.6.1
node-gyp: latest
node-machine-id: ^1.1.10
prebuild-install: ^7.0.1
progress: ^2.0.3
prop-types: ^15.6.2
realm-network-transport: ^0.7.2
request: ^2.88.0
stream-counter: ^1.0.0
sync-request: ^3.0.1
tar: ^6.0.1
url-parse: ^1.4.4
peerDependencies:
react-native: ">=0.60"
peerDependenciesMeta:
react-native:
optional: true
checksum: b02357598a730454edc479df1a06ed704e3ce94b65314abffcfa96df29b8d52419e3fa86b695523b5b92faa0c4c4088ca7f81176161bac6176a31f1da7bb1a04
languageName: node
linkType: hard
"realpath-native@npm:^1.1.0":
version: 1.1.0
resolution: "realpath-native@npm:1.1.0"
@@ -13654,7 +14079,7 @@ resolve@1.17.0:
languageName: node
linkType: hard
"resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0":
"resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0":
version: 1.22.0
resolution: "resolve@npm:1.22.0"
dependencies:
@@ -13686,7 +14111,7 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
"resolve@patch:resolve@^1.10.0#builtin<compat/resolve>, resolve@patch:resolve@^1.12.0#builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#builtin<compat/resolve>, resolve@patch:resolve@^1.17.0#builtin<compat/resolve>, resolve@patch:resolve@^1.18.1#builtin<compat/resolve>, resolve@patch:resolve@^1.19.0#builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#builtin<compat/resolve>":
"resolve@patch:resolve@^1.1.6#builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#builtin<compat/resolve>, resolve@patch:resolve@^1.12.0#builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#builtin<compat/resolve>, resolve@patch:resolve@^1.17.0#builtin<compat/resolve>, resolve@patch:resolve@^1.18.1#builtin<compat/resolve>, resolve@patch:resolve@^1.19.0#builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#builtin<compat/resolve>":
version: 1.22.0
resolution: "resolve@patch:resolve@npm%3A1.22.0#builtin<compat/resolve>::version=1.22.0&hash=3388aa"
dependencies:
@@ -14104,7 +14529,7 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
"set-blocking@npm:^2.0.0":
"set-blocking@npm:^2.0.0, set-blocking@npm:~2.0.0":
version: 2.0.0
resolution: "set-blocking@npm:2.0.0"
checksum: 0ac2403b0c2d39bf452f6d5d17dfd3cb952b9113098e1231cc0614c436e2f465637e39d27cf3b93556f5c59795e9790fd7e98da784c5f9919edeba4295ffeb29
@@ -14234,6 +14659,24 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
"simple-concat@npm:^1.0.0":
version: 1.0.1
resolution: "simple-concat@npm:1.0.1"
checksum: 4623960448a49731b5abeedc5430f8158c5caa05f10a685b405b13ed8532c80b5d99e6ef5d53f76a695e66f551cdbcca22c1363ceef8f8b246cda1e21b9ef871
languageName: node
linkType: hard
"simple-get@npm:^4.0.0":
version: 4.0.1
resolution: "simple-get@npm:4.0.1"
dependencies:
decompress-response: ^6.0.0
once: ^1.3.1
simple-concat: ^1.0.0
checksum: 8e7d8dd396915df8461d27ca3ecb8c0c3ddb6c48e14cc44cd6999374295ea125ad332f15b1cb5bd4b579df99685e749a27f4c72e9bd8fa81a46830172032e44b
languageName: node
linkType: hard
"sisteransi@npm:^1.0.5":
version: 1.0.5
resolution: "sisteransi@npm:1.0.5"
@@ -14651,6 +15094,13 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
"stream-counter@npm:^1.0.0":
version: 1.0.0
resolution: "stream-counter@npm:1.0.0"
checksum: fc5d2ad666d1c19866500ea0a49d22249882556ffec23f04350e87d2fea1bcb1e55cab70e447cb83c4ed3f41230be981aeb64c521235835be17fe45cee47fe7b
languageName: node
linkType: hard
"stream-each@npm:^1.1.0":
version: 1.2.3
resolution: "stream-each@npm:1.2.3"
@@ -14713,6 +15163,17 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
"string-width@npm:^1.0.1":
version: 1.0.2
resolution: "string-width@npm:1.0.2"
dependencies:
code-point-at: ^1.0.0
is-fullwidth-code-point: ^1.0.0
strip-ansi: ^3.0.0
checksum: b11745daa9398a1b3bb37ffa64263f9869c5f790901ed1242decb08171785346447112ead561cffde6b222a5ebeab9d2b382c72ae688859e852aa29325ca9d0b
languageName: node
linkType: hard
"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.0.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.2, string-width@npm:^4.2.3":
version: 4.2.3
resolution: "string-width@npm:4.2.3"
@@ -15006,6 +15467,17 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
"sync-request@npm:^3.0.1":
version: 3.0.1
resolution: "sync-request@npm:3.0.1"
dependencies:
concat-stream: ^1.4.7
http-response-object: ^1.0.1
then-request: ^2.0.1
checksum: 1d4c1bcd058018a5208ff9c8c13f7d46c1d6735c80b85e4fac8153264ff8758df1c5d941e46ee0cc071b4c00287fc5151f90f60b1e12f7a569ac575dde346169
languageName: node
linkType: hard
"table-parser@npm:^0.1.3":
version: 0.1.3
resolution: "table-parser@npm:0.1.3"
@@ -15035,7 +15507,32 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
"tar@npm:^6.1.11, tar@npm:^6.1.2":
"tar-fs@npm:^2.0.0":
version: 2.1.1
resolution: "tar-fs@npm:2.1.1"
dependencies:
chownr: ^1.1.1
mkdirp-classic: ^0.5.2
pump: ^3.0.0
tar-stream: ^2.1.4
checksum: 4739382487b6ed646670a52cac637c818ecdceb728eb4718847dfdaddd7322d8cce2ea9db160ba8ad2920194034fda7c307b44f4eeb50d244f198bd7e28f2914
languageName: node
linkType: hard
"tar-stream@npm:^2.1.4":
version: 2.2.0
resolution: "tar-stream@npm:2.2.0"
dependencies:
bl: ^4.0.3
end-of-stream: ^1.4.1
fs-constants: ^1.0.0
inherits: ^2.0.3
readable-stream: ^3.1.1
checksum: 7eec0a7fc8d0337729c1c2356d567a7527141d6ba0dd4804db979e17fc6389163e70fd4abdb855fc5ab54b944aeff7988e35e95ab6cee34a4156ca2d42980576
languageName: node
linkType: hard
"tar@npm:^6.0.1, tar@npm:^6.1.11, tar@npm:^6.1.2":
version: 6.1.11
resolution: "tar@npm:6.1.11"
dependencies:
@@ -15200,6 +15697,20 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
"then-request@npm:^2.0.1":
version: 2.2.0
resolution: "then-request@npm:2.2.0"
dependencies:
caseless: ~0.11.0
concat-stream: ^1.4.7
http-basic: ^2.5.1
http-response-object: ^1.1.0
promise: ^7.1.1
qs: ^6.1.0
checksum: 35a12253decf13fe6cd3752955c8a3f0eda1bb18bf53acdfbf4da4f5f74111d24736ddf91bd97803a6c239622d7c3e74ac40c178470ace2c2f2c7f1b84756ea6
languageName: node
linkType: hard
"throat@npm:^5.0.0":
version: 5.0.0
resolution: "throat@npm:5.0.0"
@@ -15611,6 +16122,13 @@ typescript@^3.5.3:
languageName: node
linkType: hard
"typical@npm:^4.0.0":
version: 4.0.0
resolution: "typical@npm:4.0.0"
checksum: 6b166af2fe0a11d84e114e6fb227f5f1b91e291506b86502af54e267d2ae74e5dc61c78c487af04d332affcc0626e52a6bf544fd7e45feceeaaf114b73617258
languageName: node
linkType: hard
"uglify-js@npm:3.4.x":
version: 3.4.10
resolution: "uglify-js@npm:3.4.10"
@@ -15864,7 +16382,7 @@ typescript@^3.5.3:
languageName: node
linkType: hard
"url-parse@npm:^1.4.3, url-parse@npm:^1.5.10":
"url-parse@npm:^1.4.3, url-parse@npm:^1.4.4, url-parse@npm:^1.5.10":
version: 1.5.10
resolution: "url-parse@npm:1.5.10"
dependencies:
@@ -16393,7 +16911,7 @@ typescript@^3.5.3:
languageName: node
linkType: hard
"wide-align@npm:^1.1.5":
"wide-align@npm:^1.1.0, wide-align@npm:^1.1.5":
version: 1.1.5
resolution: "wide-align@npm:1.1.5"
dependencies: