1
0
Fork 0
mirror of https://github.com/classchartsapi/classcharts-api-js.git synced 2026-05-14 19:59:37 +00:00

feat: use native fetch

This commit is contained in:
James Cook 2023-05-30 18:37:24 +01:00
parent 00e3a13821
commit 6552c282d5
6 changed files with 13 additions and 92 deletions

View file

@ -0,0 +1,5 @@
---
"classcharts-api": minor
---
Migrate to native fetch

View file

@ -28,9 +28,6 @@
"test": "jest", "test": "jest",
"release": "pnpm run build && changeset publish" "release": "pnpm run build && changeset publish"
}, },
"dependencies": {
"ky-universal": "^0.11.0"
},
"devDependencies": { "devDependencies": {
"@changesets/cli": "^2.26.1", "@changesets/cli": "^2.26.1",
"@types/jest": "^29.5.1", "@types/jest": "^29.5.1",
@ -62,6 +59,6 @@
"dist/**" "dist/**"
], ],
"engines": { "engines": {
"node": ">=16" "node": ">=18"
} }
} }

76
pnpm-lock.yaml generated
View file

@ -1,10 +1,5 @@
lockfileVersion: '6.0' lockfileVersion: '6.0'
dependencies:
ky-universal:
specifier: ^0.11.0
version: 0.11.0(ky@0.33.3)
devDependencies: devDependencies:
'@changesets/cli': '@changesets/cli':
specifier: ^2.26.1 specifier: ^2.26.1
@ -1200,13 +1195,6 @@ packages:
eslint-visitor-keys: 3.4.0 eslint-visitor-keys: 3.4.0
dev: true dev: true
/abort-controller@3.0.0:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
engines: {node: '>=6.5'}
dependencies:
event-target-shim: 5.0.1
dev: false
/acorn-jsx@5.3.2(acorn@8.8.2): /acorn-jsx@5.3.2(acorn@8.8.2):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies: peerDependencies:
@ -1630,11 +1618,6 @@ packages:
stream-transform: 2.1.3 stream-transform: 2.1.3
dev: true dev: true
/data-uri-to-buffer@4.0.1:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
dev: false
/debug@4.3.4: /debug@4.3.4:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
engines: {node: '>=6.0'} engines: {node: '>=6.0'}
@ -1949,11 +1932,6 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/event-target-shim@5.0.1:
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
engines: {node: '>=6'}
dev: false
/execa@5.1.1: /execa@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -2033,14 +2011,6 @@ packages:
bser: 2.1.1 bser: 2.1.1
dev: true dev: true
/fetch-blob@3.2.0:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
engines: {node: ^12.20 || >= 14.13}
dependencies:
node-domexception: 1.0.0
web-streams-polyfill: 3.2.1
dev: false
/file-entry-cache@6.0.1: /file-entry-cache@6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0} engines: {node: ^10.12.0 || >=12.0.0}
@ -2096,13 +2066,6 @@ packages:
is-callable: 1.2.7 is-callable: 1.2.7
dev: true dev: true
/formdata-polyfill@4.0.10:
resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
engines: {node: '>=12.20.0'}
dependencies:
fetch-blob: 3.2.0
dev: false
/fs-extra@7.0.1: /fs-extra@7.0.1:
resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
engines: {node: '>=6 <7 || >=8'} engines: {node: '>=6 <7 || >=8'}
@ -3089,26 +3052,6 @@ packages:
engines: {node: '>=6'} engines: {node: '>=6'}
dev: true dev: true
/ky-universal@0.11.0(ky@0.33.3):
resolution: {integrity: sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==}
engines: {node: '>=14.16'}
peerDependencies:
ky: '>=0.31.4'
web-streams-polyfill: '>=3.2.1'
peerDependenciesMeta:
web-streams-polyfill:
optional: true
dependencies:
abort-controller: 3.0.0
ky: 0.33.3
node-fetch: 3.3.1
dev: false
/ky@0.33.3:
resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==}
engines: {node: '>=14.16'}
dev: false
/leven@3.1.0: /leven@3.1.0:
resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -3302,20 +3245,6 @@ packages:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
dev: true dev: true
/node-domexception@1.0.0:
resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
engines: {node: '>=10.5.0'}
dev: false
/node-fetch@3.3.1:
resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
data-uri-to-buffer: 4.0.1
fetch-blob: 3.2.0
formdata-polyfill: 4.0.10
dev: false
/node-int64@0.4.0: /node-int64@0.4.0:
resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
dev: true dev: true
@ -4191,11 +4120,6 @@ packages:
defaults: 1.0.4 defaults: 1.0.4
dev: true dev: true
/web-streams-polyfill@3.2.1:
resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
engines: {node: '>= 8'}
dev: false
/which-boxed-primitive@1.0.2: /which-boxed-primitive@1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies: dependencies:

View file

@ -1,4 +1,3 @@
import ky, { type Options as KyOptions } from "ky-universal";
import type { import type {
ActivityResponse, ActivityResponse,
AnnouncementsResponse, AnnouncementsResponse,
@ -87,7 +86,7 @@ export class BaseClient {
*/ */
public async makeAuthedRequest( public async makeAuthedRequest(
path: string, path: string,
kyOptions: KyOptions, fetchOptions: RequestInit,
options?: { revalidateToken?: boolean } options?: { revalidateToken?: boolean }
) { ) {
if (!this.sessionId) throw new Error("No session ID"); if (!this.sessionId) throw new Error("No session ID");
@ -98,20 +97,19 @@ export class BaseClient {
options.revalidateToken = true; options.revalidateToken = true;
} }
const requestOptions = { const requestOptions = {
...kyOptions, ...fetchOptions,
headers: { headers: {
Cookie: this?.authCookies?.join(";") ?? [], Cookie: this?.authCookies?.join(";") ?? [],
Authorization: "Basic " + this.sessionId, Authorization: "Basic " + this.sessionId,
...kyOptions.headers, ...fetchOptions.headers,
}, },
credentials: undefined, } satisfies RequestInit;
} satisfies KyOptions;
if (options?.revalidateToken === true && this.lastPing) { if (options?.revalidateToken === true && this.lastPing) {
if (Date.now() - this.lastPing + 5000 > PING_INTERVAL) { if (Date.now() - this.lastPing + 5000 > PING_INTERVAL) {
await this.getNewSessionId(); await this.getNewSessionId();
} }
} }
const request = await ky(path, requestOptions); const request = await fetch(path, requestOptions);
let responseJSON: ClassChartsResponse<unknown, unknown>; let responseJSON: ClassChartsResponse<unknown, unknown>;
try { try {
responseJSON = await request.json(); responseJSON = await request.json();

View file

@ -1,4 +1,3 @@
import ky from "ky-universal";
import type { GetPupilsResponse } from "../types.js"; import type { GetPupilsResponse } from "../types.js";
import { BaseClient } from "./baseClient.js"; import { BaseClient } from "./baseClient.js";
@ -37,7 +36,7 @@ export class ParentClient extends BaseClient {
const headers = new Headers({ const headers = new Headers({
"Content-Type": "application/x-www-form-urlencoded", "Content-Type": "application/x-www-form-urlencoded",
}); });
const response = await ky(BASE_URL + "/parent/login", { const response = await fetch(BASE_URL + "/parent/login", {
method: "POST", method: "POST",
body: formData, body: formData,
headers: headers, headers: headers,

View file

@ -1,7 +1,6 @@
import { API_BASE_STUDENT, BASE_URL } from "../utils/consts.js"; import { API_BASE_STUDENT, BASE_URL } from "../utils/consts.js";
import { BaseClient } from "./baseClient.js"; import { BaseClient } from "./baseClient.js";
import { parseCookies } from "../utils/utils.js"; import { parseCookies } from "../utils/utils.js";
import ky from "ky-universal";
/** /**
* Student Client * Student Client
@ -40,11 +39,10 @@ export class StudentClient extends BaseClient {
formData.append("dob", this.dateOfBirth); formData.append("dob", this.dateOfBirth);
formData.append("remember_me", "1"); formData.append("remember_me", "1");
formData.append("recaptcha-token", "no-token-available"); formData.append("recaptcha-token", "no-token-available");
const request = await ky(BASE_URL + "/student/login", { const request = await fetch(BASE_URL + "/student/login", {
method: "POST", method: "POST",
body: formData, body: formData,
redirect: "manual", redirect: "manual",
throwHttpErrors: false,
credentials: undefined, credentials: undefined,
}); });
if (request.status != 302 || !request.headers.get("set-cookie")) { if (request.status != 302 || !request.headers.get("set-cookie")) {