Skip to content

Commit 1f00890

Browse files
committed
feat: use fallback DB when GraphQL fails
1 parent 34422c4 commit 1f00890

File tree

4 files changed

+151
-51
lines changed

4 files changed

+151
-51
lines changed

src/index.ts

Lines changed: 94 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { UnityChangeset as UnityChangesetClass } from "./unityChangeset.ts";
1+
import { getUnityReleases, getUnityReleasesInLTS } from "./unityGraphQL.ts";
22
import {
3-
getUnityReleases,
4-
getUnityReleasesInLTS,
3+
UnityChangeset as UnityChangesetClass,
54
UnityReleaseEntitlement,
65
UnityReleaseStream,
7-
} from "./unityGraphQL.ts";
6+
} from "./unityChangeset.ts";
87

8+
const UNITY_CHANGESETS_DB_URL =
9+
"https://mob-sakai.github.io/unity-changeset/dbV3";
910
export const UnityChangeset = UnityChangesetClass;
1011
export type UnityChangeset = UnityChangesetClass;
1112

@@ -17,7 +18,14 @@ export type UnityChangeset = UnityChangesetClass;
1718
export async function getUnityChangeset(
1819
version: string,
1920
): Promise<UnityChangeset> {
20-
const changesets = (await getUnityReleases(version, [])).filter(
21+
let changesets: UnityChangeset[];
22+
try {
23+
changesets = await getUnityReleases(version, []);
24+
} catch {
25+
changesets = await getAllChangesetsFromDb();
26+
}
27+
28+
changesets = changesets.filter(
2129
(c) => c.version === version,
2230
);
2331
if (0 < changesets.length) {
@@ -144,37 +152,25 @@ export function listChangesets(
144152
});
145153
}
146154

147-
export function searchChangesets(
155+
export async function searchChangesets(
148156
searchMode: SearchMode,
149157
): Promise<UnityChangeset[]> {
150-
switch (searchMode) {
151-
case SearchMode.All:
152-
return getUnityReleases(".", [
153-
UnityReleaseStream.LTS,
154-
UnityReleaseStream.SUPPORTED,
155-
UnityReleaseStream.TECH,
156-
UnityReleaseStream.BETA,
157-
UnityReleaseStream.ALPHA,
158-
]);
159-
case SearchMode.Default:
160-
return getUnityReleases(".", [
161-
UnityReleaseStream.LTS,
162-
UnityReleaseStream.SUPPORTED,
163-
UnityReleaseStream.TECH,
164-
]);
165-
case SearchMode.PreRelease:
166-
return getUnityReleases(".", [
167-
UnityReleaseStream.BETA,
168-
UnityReleaseStream.ALPHA,
169-
]);
170-
case SearchMode.LTS:
171-
return getUnityReleasesInLTS();
172-
case SearchMode.XLTS:
173-
return getUnityReleasesInLTS([UnityReleaseEntitlement.XLTS]);
174-
case SearchMode.SUPPORTED:
175-
return getUnityReleases(".", [UnityReleaseStream.SUPPORTED]);
176-
default:
177-
throw Error(`The given search mode '${searchMode}' was not supported`);
158+
try {
159+
switch (searchMode) {
160+
case SearchMode.All:
161+
case SearchMode.Default:
162+
case SearchMode.PreRelease:
163+
case SearchMode.SUPPORTED:
164+
return await getUnityReleases(".", searchModeToStreams(searchMode));
165+
case SearchMode.LTS:
166+
return await getUnityReleasesInLTS();
167+
case SearchMode.XLTS:
168+
return await getUnityReleasesInLTS([UnityReleaseEntitlement.XLTS]);
169+
default:
170+
throw Error(`The given search mode '${searchMode}' was not supported`);
171+
}
172+
} catch {
173+
return await searchChangesetsFromDb(searchMode);
178174
}
179175
}
180176

@@ -240,3 +236,67 @@ const groupBy = <T, K extends string>(arr: T[], key: (i: T) => K) =>
240236
(groups[key(item)] ||= []).push(item);
241237
return groups;
242238
}, {} as Record<K, T[]>);
239+
240+
function searchModeToStreams(
241+
searchMode: SearchMode,
242+
): UnityReleaseStream[] {
243+
switch (searchMode) {
244+
case SearchMode.All:
245+
return [
246+
UnityReleaseStream.LTS,
247+
UnityReleaseStream.SUPPORTED,
248+
UnityReleaseStream.TECH,
249+
UnityReleaseStream.BETA,
250+
UnityReleaseStream.ALPHA,
251+
];
252+
case SearchMode.Default:
253+
return [
254+
UnityReleaseStream.LTS,
255+
UnityReleaseStream.SUPPORTED,
256+
UnityReleaseStream.TECH,
257+
];
258+
case SearchMode.PreRelease:
259+
return [
260+
UnityReleaseStream.ALPHA,
261+
UnityReleaseStream.BETA,
262+
];
263+
case SearchMode.LTS:
264+
case SearchMode.XLTS:
265+
return [
266+
UnityReleaseStream.LTS,
267+
];
268+
case SearchMode.SUPPORTED:
269+
return [
270+
UnityReleaseStream.SUPPORTED,
271+
];
272+
default:
273+
throw Error(`The given search mode '${searchMode}' was not supported`);
274+
}
275+
}
276+
277+
export function getAllChangesetsFromDb(): Promise<UnityChangeset[]> {
278+
return fetch(UNITY_CHANGESETS_DB_URL)
279+
.then((res) => {
280+
if (!res.ok) {
281+
throw Error(
282+
`The Unity changeset database could not be fetched: ${res.status} ${res.statusText}`,
283+
);
284+
}
285+
286+
return res.json() as Promise<UnityChangeset[]>;
287+
});
288+
}
289+
290+
export function searchChangesetsFromDb(
291+
searchMode: SearchMode,
292+
): Promise<UnityChangeset[]> {
293+
return getAllChangesetsFromDb()
294+
.then((changesets: UnityChangeset[]) => {
295+
if (!changesets || changesets.length == 0) return [];
296+
297+
const streams = searchModeToStreams(searchMode);
298+
return searchMode === SearchMode.XLTS
299+
? changesets.filter((c) => streams.includes(c.stream))
300+
: changesets.filter((c) => streams.includes(c.stream) && !c.xlts);
301+
});
302+
}

src/unityChangeset.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
getUnityChangeset,
1010
groupChangesets,
1111
searchChangesets,
12+
searchChangesetsFromDb,
1213
GroupMode,
1314
SearchMode,
1415
UnityChangeset,
@@ -129,3 +130,8 @@ const changesetsForTest = [
129130
assertEquals(changesets.length, testcase.expected);
130131
});
131132
});
133+
134+
Deno.test("scrapeArchivedChangesetsFromDb", async () => {
135+
const changesets = await searchChangesetsFromDb(SearchMode.Default);
136+
assertNotEquals(changesets.length, 0);
137+
});

src/unityChangeset.ts

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
11
const REGEXP_UNITY = /^(\d+)\.(\d+)\.(\d+)([a-zA-Z]+)(\d+)/;
22
const REGEXP_UNITY_NUM = /^(\d+)\.?(\d+)?\.?(\d+)?([a-zA-Z]+)?(\d+)?/;
33

4+
/*
5+
Unity Release Stream
6+
*/
7+
export enum UnityReleaseStream {
8+
SUPPORTED = "SUPPORTED",
9+
LTS = "LTS",
10+
TECH = "TECH",
11+
BETA = "BETA",
12+
ALPHA = "ALPHA",
13+
UNDEFINED = "UNDEFINED",
14+
}
15+
16+
/*
17+
Unity Release Entitlement
18+
*/
19+
export enum UnityReleaseEntitlement {
20+
XLTS = "XLTS",
21+
U7_ALPHA = "U7_ALPHA",
22+
}
23+
424
/*
525
Unity Changeset
626
*/
@@ -11,9 +31,28 @@ export class UnityChangeset {
1131
minor = "";
1232
lifecycle = "";
1333
lts = false;
34+
stream: UnityReleaseStream = UnityReleaseStream.UNDEFINED;
35+
entitlements: UnityReleaseEntitlement[] = [];
36+
xlts = false;
1437

15-
constructor(version: string, changeset: string, lts: boolean = false) {
16-
Object.assign(this, { version, changeset, lts });
38+
constructor(
39+
version: string,
40+
changeset: string,
41+
lts: boolean = false,
42+
stream?: UnityReleaseStream,
43+
entitlements?: UnityReleaseEntitlement[],
44+
) {
45+
Object.assign(this, { version, changeset });
46+
47+
if (stream && entitlements) {
48+
this.stream = stream;
49+
this.entitlements = entitlements;
50+
this.lts = stream === UnityReleaseStream.LTS;
51+
this.xlts = entitlements.includes(UnityReleaseEntitlement.XLTS);
52+
} else {
53+
this.lts = lts;
54+
this.stream = lts ? UnityReleaseStream.LTS : UnityReleaseStream.UNDEFINED;
55+
}
1756

1857
const match = this.version.match(REGEXP_UNITY);
1958
if (match) {

src/unityGraphQL.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,12 @@
1-
import { UnityChangeset } from "./unityChangeset.ts";
1+
import {
2+
UnityChangeset,
3+
UnityReleaseEntitlement,
4+
UnityReleaseStream,
5+
} from "./unityChangeset.ts";
26
import { gql, GraphQLClient } from "npm:graphql-request@6.1.0";
37

48
const UNITY_GRAPHQL_ENDPOINT: string = "https://services.unity.com/graphql";
59

6-
export enum UnityReleaseStream {
7-
SUPPORTED = "SUPPORTED",
8-
LTS = "LTS",
9-
TECH = "TECH",
10-
BETA = "BETA",
11-
ALPHA = "ALPHA",
12-
}
13-
14-
export enum UnityReleaseEntitlement {
15-
XLTS = "XLTS",
16-
U7_ALPHA = "U7_ALPHA",
17-
}
18-
1910
interface UnityReleasesResponse {
2011
getUnityReleases: {
2112
totalCount: number;
@@ -24,6 +15,7 @@ interface UnityReleasesResponse {
2415
version: string;
2516
shortRevision: string;
2617
stream: UnityReleaseStream;
18+
entitlements: UnityReleaseEntitlement[];
2719
};
2820
}[];
2921
pageInfo: { hasNextPage: boolean };
@@ -56,6 +48,7 @@ query GetRelease($limit: Int, $skip: Int, $version: String!, $stream: [UnityRele
5648
version
5749
shortRevision
5850
stream
51+
entitlements
5952
}
6053
}
6154
pageInfo {
@@ -81,7 +74,9 @@ query GetRelease($limit: Int, $skip: Int, $version: String!, $stream: [UnityRele
8174
new UnityChangeset(
8275
edge.node.version,
8376
edge.node.shortRevision,
84-
edge.node.stream == UnityReleaseStream.LTS,
77+
edge.node.stream === UnityReleaseStream.LTS,
78+
edge.node.stream,
79+
edge.node.entitlements,
8580
)
8681
),
8782
);

0 commit comments

Comments
 (0)