You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.3 KiB
JavaScript

import { Client, Player } from "spotify-api.js";
import { store } from "../store.mjs";
import { UserStore } from "../db/schemas.mjs";
export const createLocalUser = async ({ refreshToken = undefined, code = undefined }, retry = 4) => {
try {
const client = await Client.create({
refreshToken: true,
retryOnRateLimit: true,
token: {
clientID: store.clientID,
clientSecret: store.clientSecret,
redirectURL: store.redirectURL,
refreshToken,
code,
},
async onRefresh() {
await UserStore.findOneAndUpdate(
{ 'spotify.userId': client.user.id },
{ 'spotify.refreshToken': client.refreshMeta.refreshToken },
);
},
});
const player = new Player(client);
return { client, player };
} catch (e) {
if (retry-- < 1) throw e;
if (e.response.data.status === 503) await new Promise(_ => setTimeout(_, 500));
else throw e;
return await createLocalUser({ refreshToken, code }, retry);
}
};
export const findUserBySpotifyId = async (
{ userId, refreshToken },
{ create = false } = {},
) => {
const user = store.users.find(user => user.client.user.id === userId);
if (user) return user;
if (!create) return null;
const newUser = await createLocalUser({ refreshToken });
store.users.push(newUser);
return newUser;
}