Skip to content

Commit

Permalink
return correct tokens and send onRefresh on initial call
Browse files Browse the repository at this point in the history
fixes #75
  • Loading branch information
d-fischer committed Jan 25, 2020
1 parent 7900305 commit eada0ba
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 26 deletions.
19 changes: 11 additions & 8 deletions packages/twitch/src/Auth/StaticAuthProvider.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import AuthProvider from './AuthProvider';
import { NonEnumerable } from '../Toolkit/Decorators/NonEnumerable';
import AccessToken from '../API/AccessToken';
import { NonEnumerable } from '../Toolkit/Decorators/NonEnumerable';
import TwitchClient from '../TwitchClient';
import AuthProvider from './AuthProvider';

/**
* An auth provider that always returns the same initially given credentials.
Expand All @@ -26,14 +26,17 @@ export default class StaticAuthProvider implements AuthProvider {
* You need to obtain one using one of the [Twitch OAuth flows](https://dev.twitch.tv/docs/authentication/getting-tokens-oauth/).
* @param scopes The scopes this token has.
*/
constructor(clientId: string, accessToken?: string, scopes: string[] = []) {
constructor(clientId: string, accessToken?: string | AccessToken, scopes: string[] = []) {
this._clientId = clientId || '';
if (accessToken) {
this._accessToken = new AccessToken({
access_token: accessToken,
scope: scopes,
refresh_token: ''
});
this._accessToken =
typeof accessToken === 'string'
? new AccessToken({
access_token: accessToken,
scope: scopes,
refresh_token: ''
})
: accessToken;
this._scopes = scopes;
}
}
Expand Down
38 changes: 20 additions & 18 deletions packages/twitch/src/TwitchClient.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
import * as fetchPonyfill from 'fetch-ponyfill';
import * as qs from 'qs';
import AuthProvider from './Auth/AuthProvider';
import { Cacheable, CachedGetter } from './Toolkit/Decorators/Cache';
import TokenInfo, { TokenInfoData } from './API/TokenInfo';
import { CheermoteBackground, CheermoteScale, CheermoteState } from './API/Kraken/Bits/CheermoteList';
import AccessToken, { AccessTokenData } from './API/AccessToken';
import StaticAuthProvider from './Auth/StaticAuthProvider';
import RefreshableAuthProvider, { RefreshConfig } from './Auth/RefreshableAuthProvider';
import ClientCredentialsAuthProvider from './Auth/ClientCredentialsAuthProvider';
import ConfigError from './Errors/ConfigError';
import HTTPStatusCodeError from './Errors/HTTPStatusCodeError';
import BadgesAPI from './API/Badges/BadgesAPI';
import HelixAPIGroup from './API/Helix/HelixAPIGroup';
import { CheermoteBackground, CheermoteScale, CheermoteState } from './API/Kraken/Bits/CheermoteList';

import KrakenAPIGroup from './API/Kraken/KrakenAPIGroup';
import HelixAPIGroup from './API/Helix/HelixAPIGroup';
import BadgesAPI from './API/Badges/BadgesAPI';
import TokenInfo, { TokenInfoData } from './API/TokenInfo';
import UnsupportedAPI from './API/Unsupported/UnsupportedAPI';

import * as fetchPonyfill from 'fetch-ponyfill';
import AuthProvider from './Auth/AuthProvider';
import ClientCredentialsAuthProvider from './Auth/ClientCredentialsAuthProvider';
import RefreshableAuthProvider, { RefreshConfig } from './Auth/RefreshableAuthProvider';
import StaticAuthProvider from './Auth/StaticAuthProvider';
import ConfigError from './Errors/ConfigError';
import HTTPStatusCodeError from './Errors/HTTPStatusCodeError';
import { Cacheable, CachedGetter } from './Toolkit/Decorators/Cache';

const { fetch, Headers } = fetchPonyfill();

Expand Down Expand Up @@ -181,17 +180,20 @@ export default class TwitchClient {
refreshConfig?: RefreshConfig,
config: Partial<TwitchConfig> = {}
) {
let passedAccessToken: string | AccessToken | undefined = accessToken;
if (!scopes && accessToken) {
let tokenData = await this.getTokenInfo(clientId, accessToken);
if (!tokenData.valid) {
if (refreshConfig) {
const newToken = await this.refreshAccessToken(
passedAccessToken = await this.refreshAccessToken(
clientId,
refreshConfig.clientSecret,
refreshConfig.refreshToken
);
accessToken = newToken.accessToken;
tokenData = await this.getTokenInfo(clientId, accessToken);
if (refreshConfig.onRefresh) {
refreshConfig.onRefresh(passedAccessToken);
}
tokenData = await this.getTokenInfo(clientId, passedAccessToken.accessToken);
}
if (!tokenData.valid) {
throw new ConfigError('Supplied an invalid access token to retrieve scopes with');
Expand All @@ -200,8 +202,8 @@ export default class TwitchClient {
scopes = tokenData.scopes;
}
const authProvider = refreshConfig
? new RefreshableAuthProvider(new StaticAuthProvider(clientId, accessToken, scopes), refreshConfig)
: new StaticAuthProvider(clientId, accessToken, scopes);
? new RefreshableAuthProvider(new StaticAuthProvider(clientId, passedAccessToken, scopes), refreshConfig)
: new StaticAuthProvider(clientId, passedAccessToken, scopes);

return new this({ ...config, authProvider });
}
Expand Down

0 comments on commit eada0ba

Please sign in to comment.