Skip to content

Commit 0345b34

Browse files
committed
fix(proxy): refactor cached progress and handle proxy on web
1 parent d2c8f5a commit 0345b34

File tree

5 files changed

+58
-46
lines changed

5 files changed

+58
-46
lines changed

src/services/trakt.service.ts

+4-41
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { type BaseCacheOption, type BaseInit, type CacheResponse, getCachedFunction, type TypedResponse } from '@dvcol/base-http-client';
1+
import { type BaseCacheOption, type CacheResponse } from '@dvcol/base-http-client';
22

33
import { CacheRetention } from '@dvcol/common-utils/common/cache';
44
import { DateUtils } from '@dvcol/common-utils/common/date';
@@ -13,7 +13,7 @@ import {
1313
type TmdbPaginatedData,
1414
type TmdbParamPagination,
1515
} from '@dvcol/tmdb-http-client/models';
16-
import { isResponseOk, TraktClient } from '@dvcol/trakt-http-client';
16+
import { TraktClient } from '@dvcol/trakt-http-client';
1717

1818
import { TraktApiExtended } from '@dvcol/trakt-http-client/models';
1919

@@ -58,21 +58,19 @@ import type {
5858
} from '@dvcol/trakt-http-client/models';
5959

6060
import type { ImagePayload } from '~/models/poster.model';
61-
import type { ProgressItem } from '~/models/progress.model';
6261
import type { SettingsAuth, UserSetting } from '~/models/trakt-service.model';
6362

6463
import { ErrorService } from '~/services/error.service';
6564
import { LoadingBarService } from '~/services/loading-bar.service';
6665
import { Logger } from '~/services/logger.service';
6766
import { tmdbUsedApi } from '~/services/tmdb.used.api';
6867
import { traktUsedApi } from '~/services/trakt-used.api';
69-
import { ExternaLinks } from '~/settings/external.links';
7068
import { tmdbClientSettings } from '~/settings/tmdb.api';
7169
import { traktClientSettings } from '~/settings/traktv.api';
7270
import { useAuthSettingsStore } from '~/stores/settings/auth.store';
7371
import { useUserSettingsStore } from '~/stores/settings/user.store';
7472
import { CachePrefix, ChromeCacheStore } from '~/utils/cache.utils';
75-
import { cancellablePaginatedWriteJson, getSessionUser } from '~/utils/trakt-service.utils';
73+
import { cancellablePaginatedWriteJson, getCachedProgressEndpoint, getSessionUser } from '~/utils/trakt-service.utils';
7674

7775
const shouldEvict = (cache?: CacheResponse<unknown>, date?: string | number | Date): boolean => {
7876
// no cache skip
@@ -353,42 +351,7 @@ export class TraktService {
353351
return { data: await response.json(), pagination: response.pagination };
354352
}
355353

356-
private static cachedProgress = getCachedFunction(
357-
// @ts-expect-error -- CancellablePromise extends promise
358-
async (init?: BaseInit): CancellablePromise<TypedResponse<ProgressItem[]>> => {
359-
const response = await fetch(ExternaLinks.trakt.onDeck, {
360-
credentials: 'include',
361-
...init,
362-
});
363-
364-
isResponseOk(response);
365-
366-
const htmlString = await response.text();
367-
const htmlDoc = new DOMParser().parseFromString(htmlString, 'text/html');
368-
const data = Array.from(htmlDoc.querySelectorAll<HTMLAnchorElement>('a[class="watch"]')).map(
369-
a => ({ ...a.dataset }) as unknown as ProgressItem,
370-
);
371-
372-
return new Response(JSON.stringify(data)) as TypedResponse<ProgressItem[]>;
373-
},
374-
{
375-
cache: this.caches.trakt,
376-
retention: CacheRetention.Hour * 2,
377-
key: (param, init) => {
378-
return JSON.stringify({
379-
template: {
380-
method: 'GET',
381-
url: ExternaLinks.trakt.onDeck,
382-
},
383-
param,
384-
init: {
385-
credentials: 'include',
386-
...init,
387-
},
388-
});
389-
},
390-
},
391-
);
354+
private static cachedProgress = getCachedProgressEndpoint(this.caches.trakt);
392355

393356
static progress = {
394357
async onDeck() {

src/settings/external.links.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ export const ExternaLinks = {
22
trakt: {
33
production: 'https://trakt.tv/',
44
staging: 'https://staging.trakt.tv/',
5-
onDeck: 'https://trakt.tv/dashboard/on_deck',
5+
onDeck: (origin: string = 'https://trakt.tv') => `${origin}/dashboard/on_deck`,
66
signOut: 'https://trakt.tv/auth/signout',
77
},
88
tmdb: 'https://www.themoviedb.org/',

src/settings/traktv.api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const traktClientSettings: TraktClientSettings = {
3838
if (!chromeRuntimeId) {
3939
traktClientSettings.redirect_uri = window.location.href.split('#').at(0)?.replace(/\/$/, '') ?? traktClientSettings.redirect_uri;
4040
traktClientSettings.corsProxy = WebConfig.CorsProxy;
41-
traktClientSettings.corsPrefix = WebConfig.CorsPrefix.trakt;
41+
traktClientSettings.corsPrefix = WebConfig.CorsPrefix.ApiTrakt;
4242
}
4343

4444
export { traktClientSettings };

src/settings/web.config.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
export const WebConfig = {
22
CorsProxy: 'https://fastify-cors-proxy.vercel.app',
33
CorsPrefix: {
4-
trakt: 'api-trakt',
5-
tmdb: 'tmdb',
4+
Trakt: 'trakt',
5+
ApiTrakt: 'api-trakt',
6+
Tmdb: 'tmdb',
67
},
78
};

src/utils/trakt-service.utils.ts

+49-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1+
import { type BaseInit, getCachedFunction, type TypedResponse } from '@dvcol/base-http-client';
2+
import { CacheRetention } from '@dvcol/common-utils/common/cache';
3+
14
import { getJsonWriter } from '@dvcol/common-utils/common/save';
5+
6+
import { isResponseOk } from '@dvcol/trakt-http-client';
7+
28
import {
39
TraktApiExtended,
410
type TraktApiParamsExtended,
@@ -8,15 +14,24 @@ import {
814
} from '@dvcol/trakt-http-client/models';
915

1016
import { getCookie } from '@dvcol/web-extension-utils/chrome/cookie';
17+
18+
import { chromeRuntimeId } from '@dvcol/web-extension-utils/chrome/runtime';
1119
import { reactive, ref, type Ref } from 'vue';
1220

21+
import type { CacheStore } from '@dvcol/common-utils';
1322
import type { RecursiveRecord } from '@dvcol/common-utils/common';
1423
import type { JsonWriterOptions } from '@dvcol/common-utils/common/save';
1524

25+
import type { CancellablePromise } from '@dvcol/common-utils/http/fetch';
26+
27+
import type { ProgressItem } from '~/models/progress.model';
28+
1629
import { PageSize } from '~/models/page-size.model';
1730

1831
import { ExternaLinks } from '~/settings/external.links';
1932

33+
import { WebConfig } from '~/settings/web.config';
34+
2035
type PaginatedQuery = TraktApiParamsExtended & TraktApiParamsPagination;
2136
export const paginatedWriteJson = async <Q extends PaginatedQuery = PaginatedQuery, T extends RecursiveRecord = RecursiveRecord>(
2237
fetch: (query: Q) => Promise<TraktApiResponse<T>>,
@@ -68,8 +83,41 @@ export const cancellablePaginatedWriteJson = <Q extends PaginatedQuery = Paginat
6883
export const getSessionUser = async (): Promise<string | undefined> => {
6984
if (!getCookie) return;
7085
const cookie = await getCookie({
71-
url: ExternaLinks.trakt.onDeck,
86+
url: ExternaLinks.trakt.onDeck(),
7287
name: 'trakt_username',
7388
});
7489
return cookie?.value;
7590
};
91+
92+
export const getCachedProgressEndpoint = (cache: CacheStore<TraktApiResponse>) => {
93+
const origin = chromeRuntimeId ? undefined : `${WebConfig.CorsProxy}/${WebConfig.CorsPrefix.Trakt}`;
94+
const url: string = ExternaLinks.trakt.onDeck(origin);
95+
const baseInit: BaseInit = { credentials: 'include' };
96+
return getCachedFunction(
97+
// @ts-expect-error -- CancellablePromise extends promise
98+
async (init?: BaseInit): CancellablePromise<TypedResponse<ProgressItem[]>> => {
99+
const response = await fetch(url, { ...baseInit, ...init });
100+
101+
isResponseOk(response);
102+
103+
const htmlString = await response.text();
104+
const htmlDoc = new DOMParser().parseFromString(htmlString, 'text/html');
105+
const data = Array.from(htmlDoc.querySelectorAll<HTMLAnchorElement>('a[class="watch"]')).map(
106+
a => ({ ...a.dataset }) as unknown as ProgressItem,
107+
);
108+
109+
return new Response(JSON.stringify(data)) as TypedResponse<ProgressItem[]>;
110+
},
111+
{
112+
cache,
113+
retention: CacheRetention.Hour * 2,
114+
key: (param, init) => {
115+
return JSON.stringify({
116+
template: { method: 'GET', url },
117+
param,
118+
init: { ...baseInit, ...init },
119+
});
120+
},
121+
},
122+
);
123+
};

0 commit comments

Comments
 (0)