@robertying/thu-learn-lib 5.0.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -7
- package/lib/auth.d.ts +1 -1
- package/lib/auth.d.ts.map +1 -1
- package/lib/auth.js +17 -5
- package/lib/auth.js.map +1 -1
- package/lib/calendar.d.ts +6 -4
- package/lib/calendar.d.ts.map +1 -1
- package/lib/calendar.js +21 -8
- package/lib/calendar.js.map +1 -1
- package/lib/contents.d.ts.map +1 -1
- package/lib/contents.js +10 -1
- package/lib/contents.js.map +1 -1
- package/lib/courses.d.ts.map +1 -1
- package/lib/courses.js +6 -6
- package/lib/courses.js.map +1 -1
- package/lib/discussions.js +2 -2
- package/lib/discussions.js.map +1 -1
- package/lib/favorites.d.ts.map +1 -1
- package/lib/favorites.js +12 -12
- package/lib/favorites.js.map +1 -1
- package/lib/files.d.ts +1 -1
- package/lib/files.d.ts.map +1 -1
- package/lib/files.js +10 -8
- package/lib/files.js.map +1 -1
- package/lib/homework.d.ts +1 -2
- package/lib/homework.d.ts.map +1 -1
- package/lib/homework.js +19 -17
- package/lib/homework.js.map +1 -1
- package/lib/index.d.ts +11 -6
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +13 -5
- package/lib/index.js.map +1 -1
- package/lib/notices.d.ts +1 -1
- package/lib/notices.d.ts.map +1 -1
- package/lib/notices.js +11 -15
- package/lib/notices.js.map +1 -1
- package/lib/questionnaires.d.ts +6 -3
- package/lib/questionnaires.d.ts.map +1 -1
- package/lib/questionnaires.js +20 -12
- package/lib/questionnaires.js.map +1 -1
- package/lib/request.d.ts +44 -14
- package/lib/request.d.ts.map +1 -1
- package/lib/request.js +120 -43
- package/lib/request.js.map +1 -1
- package/lib/types.d.ts +11 -3
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib/user.js +1 -1
- package/lib/user.js.map +1 -1
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +9 -3
- package/lib/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/auth.ts +18 -5
- package/src/calendar.ts +28 -10
- package/src/contents.ts +10 -1
- package/src/courses.ts +11 -13
- package/src/discussions.ts +2 -2
- package/src/favorites.ts +22 -32
- package/src/files.ts +12 -12
- package/src/homework.ts +30 -40
- package/src/index.ts +19 -7
- package/src/notices.ts +12 -18
- package/src/questionnaires.ts +51 -37
- package/src/request.ts +141 -42
- package/src/types.ts +14 -3
- package/src/user.ts +1 -1
- package/src/utils.ts +10 -4
package/README.md
CHANGED
|
@@ -36,7 +36,7 @@ Linting uses type-aware [oxlint](https://oxc.rs/docs/guide/usage/linter) and for
|
|
|
36
36
|
|
|
37
37
|
## Releasing
|
|
38
38
|
|
|
39
|
-
Bump `version` in `package.json`, merge, then push a matching tag (for example `git tag
|
|
39
|
+
Bump `version` in `package.json`, merge, then push a matching tag (for example `git tag v5.1.0 && git push origin v5.1.0`). The Release workflow checks, builds, publishes to npm with provenance (npm trusted publishing, no token) and creates a GitHub release.
|
|
40
40
|
|
|
41
41
|
## Usage
|
|
42
42
|
|
|
@@ -63,6 +63,8 @@ const helper = new Learn2018Helper({
|
|
|
63
63
|
// again and retries once when a request finds the session expired, so we strongly recommend it.
|
|
64
64
|
|
|
65
65
|
// Without a CredentialProvider you must log in yourself. With one, the first request logs in.
|
|
66
|
+
// When resuming with a saved CSRF token (setCSRFToken) and cookie jar, call `await helper.ensureSession()`:
|
|
67
|
+
// it logs in again only if the session has expired.
|
|
66
68
|
try {
|
|
67
69
|
await helper.login(username, password, fingerPrint);
|
|
68
70
|
} catch (e) {
|
|
@@ -106,14 +108,23 @@ const notifications = await helper.getNotificationList(course.id);
|
|
|
106
108
|
const files = await helper.getFileList(course.id);
|
|
107
109
|
const homework = await helper.getHomeworkList(course.id);
|
|
108
110
|
const questions = await helper.getAnsweredQuestionList(course.id);
|
|
111
|
+
// questionnaires fetch their questions (one request each) unless you pass { details: 'none' }
|
|
112
|
+
const questionnaires = await helper.getQuestionnaireList(course.id, { details: 'none' });
|
|
109
113
|
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
+
// details cost extra requests per item, so they are opt-in; fetch the rest on demand
|
|
115
|
+
const withDetails = await helper.getHomeworkList(course.id, undefined, { details: (h) => !h.submitted });
|
|
116
|
+
const detail = await helper.getHomeworkDetail(homework[0]);
|
|
117
|
+
const attachment = await helper.getNotificationAttachment(notifications[0]);
|
|
118
|
+
|
|
119
|
+
// get one type of content from many courses; a course that fails is in `errors` instead of failing the rest
|
|
120
|
+
const { contents, errors } = await helper.getAllContents(
|
|
121
|
+
courses.map((c) => c.id),
|
|
122
|
+
ContentType.HOMEWORK,
|
|
123
|
+
{ details: 'none' },
|
|
124
|
+
);
|
|
114
125
|
|
|
115
126
|
// get course calendar in a period (yyyymmdd, inclusive)
|
|
116
|
-
// ranges over 28 days are fetched in windows; windows that fail
|
|
127
|
+
// ranges over 28 days are fetched in windows; windows that still fail are in failedRanges
|
|
117
128
|
try {
|
|
118
129
|
const { events, failedRanges } = await helper.getCalendar('20191001', '20191201', { graduate: false });
|
|
119
130
|
} catch (e) {
|
|
@@ -133,10 +144,33 @@ See `src/types.ts` for type definitions. Note that `ApiError` represents the typ
|
|
|
133
144
|
|
|
134
145
|
`pnpm test` runs the offline tests. They give the helper a fake `fetch` (`test/helpers/fake-server.ts`) that serves hand-written responses shaped like Web Learning's, simulates SSO login and session expiry, and records every request so tests can also check how many requests an API makes.
|
|
135
146
|
|
|
136
|
-
`pnpm test:live` runs the tests against the real server. It needs your own credentials: copy `test/live/template.env` to `test/live/.env` and fill it in.
|
|
147
|
+
`pnpm test:live` runs the tests against the real server. It needs your own credentials and a device fingerprint: copy `test/live/template.env` to `test/live/.env` and fill it in. The live tests also check what the offline tests can only assume, such as how the server answers an expired session (see [TODO.md](TODO.md)).
|
|
137
148
|
|
|
138
149
|
## Changelog
|
|
139
150
|
|
|
151
|
+
- v5.1.0
|
|
152
|
+
- Treat a 200 HTML page where JSON was expected as an expired session: log in again and retry once, like a 403
|
|
153
|
+
- `ensureSession` checks the probe's body (the current semester) instead of only its status
|
|
154
|
+
- Logins never overlap: `login(username, password, fingerPrint)` waits for a login in progress, and requests that find the session expired during it wait for it instead of starting another SSO login
|
|
155
|
+
- `submitHomework` with an attachment has no timeout (the response only starts after the upload)
|
|
156
|
+
- A caller's `signal` can still cancel reading a body after the headers arrived
|
|
157
|
+
- `getCalendar`: timed-out windows are not retried, and after two in a row the rest go to `failedRanges` without a request; an invalid date throws a `RangeError`; a bad JSONP body rejects with an `ApiError` (`INVALID_RESPONSE`) instead of a bare string
|
|
158
|
+
- `getNotificationAttachment` returns `undefined` when the detail page has no attachment link, instead of throwing
|
|
159
|
+
- `getHomeworkList(courseID, undefined, options)` type-checks; `getAllContents` rejects homework of a teacher course with `NOT_IMPLEMENTED` instead of returning student data
|
|
160
|
+
- Supports Node 22 and later (was 26)
|
|
161
|
+
- A wrong password rejects with `BAD_CREDENTIAL` (with the SSO page's message in `extra`) instead of `ERROR_FETCH_FROM_ID`, which now means the SSO server failed or couldn't be reached
|
|
162
|
+
- HTML pages (user info, homework page, notice detail, calendar ticket) also detect the short login page of an expired session and log in again
|
|
163
|
+
- `logout` forgets the CSRF token, so the next request logs in instead of sending the old token
|
|
164
|
+
- `getFileList` still returns the files (without `category`) when the category list fails
|
|
165
|
+
- `getQuestionnaireList(courseID, { details })` can skip the questions (one request per questionnaire; default still `'all'`), with `getQuestionnaireDetail(courseID, questionnaireID)` on demand; `detail` is now optional
|
|
166
|
+
- Live tests need a fingerprint, use readable `.env` names (`USERNAME`, `PASSWORD`, `FINGERPRINT`, `STUDENT_SEMESTER`, …; see `test/live/template.env`) and cover session expiry and resume, on-demand details and windowed calendar
|
|
167
|
+
- v5.0.0
|
|
168
|
+
- (_BREAKING CHANGE_) Per-item detail requests are opt-in: `getHomeworkList(id, CourseType.STUDENT, { details })`, `getNotificationList(id, type, { attachments })` (notices get `attachmentName`), `getCourseList(semester, type, lang, { timeAndLocation })` (`timeAndLocation` is now optional); fetch the rest on demand with `getHomeworkDetail`, `getExcellentHomeworkDetail`, `getNotificationAttachment` and `getCourseTimeAndLocation`
|
|
169
|
+
- (_BREAKING CHANGE_) The excellent homework list is fetched once per course and comes without details
|
|
170
|
+
- (_BREAKING CHANGE_) `getAllContents(ids, type, { courseType, details })` returns `{ contents, errors }` and no longer rejects when a course fails
|
|
171
|
+
- (_BREAKING CHANGE_) `getCalendar(start, end, { graduate })` fetches ranges over 28 days in windows and returns `{ events, failedRanges }`
|
|
172
|
+
- Requests are capped (`maxConcurrentRequests`, default 6) and time out (`requestTimeout`, default 60 s, `FailReason.REQUEST_TIMEOUT`); concurrent re-logins share one SSO login
|
|
173
|
+
- `ensureSession()` resumes a saved session (CSRF token + cookies) and logs in only if it has expired
|
|
140
174
|
- v4.1.0
|
|
141
175
|
- Published as `@robertying/thu-learn-lib`
|
|
142
176
|
- Tooling: pnpm, TypeScript 7 (`tsc` ESM + `.d.ts` build), oxlint + oxfmt, Vitest 5, Node 26
|
package/lib/auth.d.ts
CHANGED
|
@@ -6,6 +6,6 @@ import type { Session } from './request.ts';
|
|
|
6
6
|
export declare function getRoamingTicket(s: Session, username: string, password: string, fingerPrint: string, fingerGenPrint?: string, fingerGenPrint3?: string): Promise<string>;
|
|
7
7
|
/** login is necessary if you do not provide a `CredentialProvider` */
|
|
8
8
|
export declare function login(s: Session, username?: string, password?: string, fingerPrint?: string, fingerGenPrint?: string, fingerGenPrint3?: string): Promise<void>;
|
|
9
|
-
/** logout (to make everyone happy) */
|
|
9
|
+
/** logout (to make everyone happy); the CSRF token is cleared, so the next request logs in again */
|
|
10
10
|
export declare function logout(s: Session): Promise<void>;
|
|
11
11
|
//# sourceMappingURL=auth.d.ts.map
|
package/lib/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAM5C;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,MAAW,EAC3B,eAAe,GAAE,MAAW,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAM5C;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,MAAW,EAC3B,eAAe,GAAE,MAAW,mBAwD7B;AAED,sEAAsE;AACtE,wBAAsB,KAAK,CACzB,CAAC,EAAE,OAAO,EACV,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,EACvB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED,qGAAqG;AACrG,wBAAsB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtD"}
|
package/lib/auth.js
CHANGED
|
@@ -22,6 +22,7 @@ export async function getRoamingTicket(s, username, password, fingerPrint, finge
|
|
|
22
22
|
extra: err,
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
+
let page;
|
|
25
26
|
try {
|
|
26
27
|
const loginForm = await s.rawFetch(URLS.ID_LOGIN());
|
|
27
28
|
const body = $(await loginForm.text());
|
|
@@ -38,10 +39,10 @@ export async function getRoamingTicket(s, username, password, fingerPrint, finge
|
|
|
38
39
|
method: 'POST',
|
|
39
40
|
body: formData,
|
|
40
41
|
});
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
if (!checkResponse.ok) {
|
|
43
|
+
throw { code: checkResponse.status, text: checkResponse.statusText };
|
|
44
|
+
}
|
|
45
|
+
page = await checkResponse.text();
|
|
45
46
|
}
|
|
46
47
|
catch (err) {
|
|
47
48
|
throw {
|
|
@@ -49,6 +50,16 @@ export async function getRoamingTicket(s, username, password, fingerPrint, finge
|
|
|
49
50
|
extra: err,
|
|
50
51
|
};
|
|
51
52
|
}
|
|
53
|
+
// id.tsinghua.edu.cn answers with a link to the roaming URL (with the ticket), or with the form and an error
|
|
54
|
+
const body = $(page);
|
|
55
|
+
const redirectUrl = body('a').attr('href');
|
|
56
|
+
if (!redirectUrl) {
|
|
57
|
+
throw {
|
|
58
|
+
reason: FailReason.BAD_CREDENTIAL,
|
|
59
|
+
extra: body.root().text().replace(/\s+/g, ' ').trim().slice(0, 200),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return redirectUrl.split('=').slice(-1)[0];
|
|
52
63
|
}
|
|
53
64
|
/** login is necessary if you do not provide a `CredentialProvider` */
|
|
54
65
|
export async function login(s, username, password, fingerPrint, fingerGenPrint, fingerGenPrint3) {
|
|
@@ -92,8 +103,9 @@ export async function login(s, username, password, fingerPrint, fingerGenPrint,
|
|
|
92
103
|
if (langMatches.length !== 0)
|
|
93
104
|
s.lang = langMatches[0][1] === 'en' ? Language.EN : Language.ZH;
|
|
94
105
|
}
|
|
95
|
-
/** logout (to make everyone happy) */
|
|
106
|
+
/** logout (to make everyone happy); the CSRF token is cleared, so the next request logs in again */
|
|
96
107
|
export async function logout(s) {
|
|
97
108
|
await s.rawFetch(URLS.LEARN_LOGOUT(), { method: 'POST' });
|
|
109
|
+
s.csrfToken = '';
|
|
98
110
|
}
|
|
99
111
|
//# sourceMappingURL=auth.js.map
|
package/lib/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGhC,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,CAAU,EACV,QAAgB,EAChB,QAAgB,EAChB,WAAmB,EACnB,cAAc,GAAW,EAAE,EAC3B,eAAe,GAAW,EAAE;IAE5B,+CAA+C;IAC/C,oGAAoG;IACpG,uDAAuD;IACvD,sFAAsF;IACtF,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,+BAA+B,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM;YACJ,MAAM,EAAE,UAAU,CAAC,qBAAqB;YACxC,KAAK,EAAE,GAAG;SACC,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAEzD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;QACxE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACrC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAC5C,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;QACxD,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC;QAC1D,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACjC,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;YAC5D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QAEH,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/lib/calendar.d.ts
CHANGED
|
@@ -7,10 +7,12 @@ export declare function splitCalendarRange(startDate: string, endDate: string, d
|
|
|
7
7
|
/**
|
|
8
8
|
* Get calendar items during the specified period (in yyyymmdd format, both inclusive).
|
|
9
9
|
*
|
|
10
|
-
* Ranges longer than `CALENDAR_WINDOW_DAYS` are fetched in consecutive windows (one at a time, each retried once
|
|
11
|
-
* merged in date order. Windows that still fail are listed in `failedRanges`, so callers can
|
|
12
|
-
* retry only those
|
|
13
|
-
*
|
|
10
|
+
* Ranges longer than `CALENDAR_WINDOW_DAYS` are fetched in consecutive windows (one at a time, each retried once
|
|
11
|
+
* unless it timed out) and merged in date order. Windows that still fail are listed in `failedRanges`, so callers can
|
|
12
|
+
* show partial data and retry only those; after two windows in a row time out, the rest are listed there without a
|
|
13
|
+
* request. If every window fails, this rejects with the last error instead (usually `FailReason.INVALID_RESPONSE`).
|
|
14
|
+
* The result might be empty if the period is too far away from now. Throws a `RangeError` for a date that is not a
|
|
15
|
+
* valid yyyymmdd.
|
|
14
16
|
*/
|
|
15
17
|
export declare function getCalendar(s: Session, startDate: string, endDate: string, options?: CalendarOptions): Promise<CalendarResult>;
|
|
16
18
|
//# sourceMappingURL=calendar.d.ts.map
|
package/lib/calendar.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAA2B,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAK1G,iIAAiI;AACjI,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAoBvC,mGAAmG;AACnG,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,SAAuB,GAAG,aAAa,EAAE,CASnH;AAyBD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,CAAC,EAAE,OAAO,EACV,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAwCzB"}
|
package/lib/calendar.js
CHANGED
|
@@ -5,11 +5,14 @@ import { JSONP_EXTRACTOR_NAME, extractJSONPResult } from './utils.js';
|
|
|
5
5
|
/** The registrar often fails for ranges longer than about a month, so longer ranges are fetched in windows of this many days. */
|
|
6
6
|
export const CALENDAR_WINDOW_DAYS = 28;
|
|
7
7
|
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
8
|
+
/** after this many windows in a row time out, `getCalendar` gives up on the rest (they go to `failedRanges`) */
|
|
9
|
+
const MAX_CONSECUTIVE_TIMEOUTS = 2;
|
|
10
|
+
const isTimeout = (err) => err?.reason === FailReason.REQUEST_TIMEOUT;
|
|
8
11
|
const parseDate = (date) => {
|
|
9
12
|
const match = /^(\d{4})(\d{2})(\d{2})$/.exec(date);
|
|
10
13
|
const time = match ? Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3])) : NaN;
|
|
11
14
|
if (Number.isNaN(time) || formatDate(time) !== date) {
|
|
12
|
-
throw
|
|
15
|
+
throw new RangeError(`invalid date ${date}, expected yyyymmdd`);
|
|
13
16
|
}
|
|
14
17
|
return time;
|
|
15
18
|
};
|
|
@@ -45,33 +48,43 @@ async function fetchWindow(s, range, graduate) {
|
|
|
45
48
|
/**
|
|
46
49
|
* Get calendar items during the specified period (in yyyymmdd format, both inclusive).
|
|
47
50
|
*
|
|
48
|
-
* Ranges longer than `CALENDAR_WINDOW_DAYS` are fetched in consecutive windows (one at a time, each retried once
|
|
49
|
-
* merged in date order. Windows that still fail are listed in `failedRanges`, so callers can
|
|
50
|
-
* retry only those
|
|
51
|
-
*
|
|
51
|
+
* Ranges longer than `CALENDAR_WINDOW_DAYS` are fetched in consecutive windows (one at a time, each retried once
|
|
52
|
+
* unless it timed out) and merged in date order. Windows that still fail are listed in `failedRanges`, so callers can
|
|
53
|
+
* show partial data and retry only those; after two windows in a row time out, the rest are listed there without a
|
|
54
|
+
* request. If every window fails, this rejects with the last error instead (usually `FailReason.INVALID_RESPONSE`).
|
|
55
|
+
* The result might be empty if the period is too far away from now. Throws a `RangeError` for a date that is not a
|
|
56
|
+
* valid yyyymmdd.
|
|
52
57
|
*/
|
|
53
58
|
export async function getCalendar(s, startDate, endDate, options = {}) {
|
|
54
59
|
const graduate = options.graduate ?? false;
|
|
55
60
|
const ranges = splitCalendarRange(startDate, endDate);
|
|
56
61
|
if (ranges.length === 0)
|
|
57
62
|
return { events: [], failedRanges: [] };
|
|
58
|
-
|
|
63
|
+
let ticket = await s.fetchTextWithToken(URLS.REGISTRAR_TICKET(), {
|
|
59
64
|
method: 'POST',
|
|
60
65
|
body: URLS.REGISTRAR_TICKET_FORM_DATA(),
|
|
61
66
|
});
|
|
62
|
-
let ticket = await ticketResponse.text();
|
|
63
67
|
ticket = ticket.substring(1, ticket.length - 1);
|
|
64
68
|
await s.fetch(URLS.REGISTRAR_AUTH(ticket));
|
|
65
69
|
const events = [];
|
|
66
70
|
const failedRanges = [];
|
|
67
71
|
let lastError;
|
|
72
|
+
let timeouts = 0;
|
|
68
73
|
for (const range of ranges) {
|
|
74
|
+
// after this many timed-out windows in a row the registrar is taken as down, and the rest are not tried
|
|
75
|
+
if (timeouts >= MAX_CONSECUTIVE_TIMEOUTS) {
|
|
76
|
+
failedRanges.push(range);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
69
79
|
try {
|
|
70
|
-
|
|
80
|
+
// a timed-out window is not retried: the registrar is slow, not flaky, and each try takes `requestTimeout`
|
|
81
|
+
events.push(...(await fetchWindow(s, range, graduate).catch((err) => isTimeout(err) ? Promise.reject(err) : fetchWindow(s, range, graduate))));
|
|
82
|
+
timeouts = 0;
|
|
71
83
|
}
|
|
72
84
|
catch (e) {
|
|
73
85
|
lastError = e;
|
|
74
86
|
failedRanges.push(range);
|
|
87
|
+
timeouts = isTimeout(e) ? timeouts + 1 : 0;
|
|
75
88
|
}
|
|
76
89
|
}
|
|
77
90
|
if (failedRanges.length === ranges.length)
|
package/lib/calendar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAIjE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,iIAAiI;AACjI,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE;IACzC,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9F,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,
|
|
1
|
+
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"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"}
|
package/lib/contents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contents.d.ts","sourceRoot":"","sources":["../src/contents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAiC,MAAM,YAAY,CAAC;AACvG,OAAO,EAAE,WAAW,EAA0B,MAAM,YAAY,CAAC;AAOjE;;;GAGG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,WAAW,EACxD,CAAC,EAAE,OAAO,EACV,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,EAAE,CAAC,EACP,OAAO,GAAE,kBAAkB,CAAC,CAAC,CAAM,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"contents.d.ts","sourceRoot":"","sources":["../src/contents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAiC,MAAM,YAAY,CAAC;AACvG,OAAO,EAAE,WAAW,EAA0B,MAAM,YAAY,CAAC;AAOjE;;;GAGG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,WAAW,EACxD,CAAC,EAAE,OAAO,EACV,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,EAAE,CAAC,EACP,OAAO,GAAE,kBAAkB,CAAC,CAAC,CAAM,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAmD/B"}
|
package/lib/contents.js
CHANGED
|
@@ -20,6 +20,13 @@ export async function getAllContents(s, courseIDs, type, options = {}) {
|
|
|
20
20
|
case ContentType.FILE:
|
|
21
21
|
return getFileList(s, id, courseType);
|
|
22
22
|
case ContentType.HOMEWORK:
|
|
23
|
+
if (courseType === CourseType.TEACHER) {
|
|
24
|
+
// the teacher list has another shape (`HomeworkTA`); use `getHomeworkList(id, CourseType.TEACHER)`
|
|
25
|
+
return Promise.reject({
|
|
26
|
+
reason: FailReason.NOT_IMPLEMENTED,
|
|
27
|
+
extra: 'homework of a teacher course; use getHomeworkList(courseID, CourseType.TEACHER)',
|
|
28
|
+
});
|
|
29
|
+
}
|
|
23
30
|
return getHomeworkList(s, id, CourseType.STUDENT, {
|
|
24
31
|
details: options.details,
|
|
25
32
|
});
|
|
@@ -28,7 +35,9 @@ export async function getAllContents(s, courseIDs, type, options = {}) {
|
|
|
28
35
|
case ContentType.QUESTION:
|
|
29
36
|
return getAnsweredQuestionList(s, id, courseType);
|
|
30
37
|
case ContentType.QUESTIONNAIRE:
|
|
31
|
-
return getQuestionnaireList(s, id
|
|
38
|
+
return getQuestionnaireList(s, id, {
|
|
39
|
+
details: options.details,
|
|
40
|
+
});
|
|
32
41
|
default:
|
|
33
42
|
return Promise.reject({
|
|
34
43
|
reason: FailReason.NOT_IMPLEMENTED,
|
package/lib/contents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contents.js","sourceRoot":"","sources":["../src/contents.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAIhD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,CAAU,EACV,SAAmB,EACnB,IAAO,EACP,OAAO,GAA0B,EAAE;IAEnC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC;IAC5D,MAAM,qBAAqB,GAAG,CAAC,EAAU,EAAgC,EAAE;QACzE,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,WAAW,CAAC,YAAY;gBAC3B,OAAO,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE;oBAC5C,WAAW,EAAG,OAAwD,CAAC,OAAO;iBAC/E,CAAiC,CAAC;YACrC,KAAK,WAAW,CAAC,IAAI;gBACnB,OAAO,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAiC,CAAC;YACxE,KAAK,WAAW,CAAC,QAAQ;gBACvB,OAAO,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,OAAO,EAAE;oBAChD,OAAO,EAAG,OAAoD,CAAC,OAAO;iBACvE,CAAiC,CAAC;YACrC,KAAK,WAAW,CAAC,UAAU;gBACzB,OAAO,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAiC,CAAC;YAC9E,KAAK,WAAW,CAAC,QAAQ;gBACvB,OAAO,uBAAuB,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAiC,CAAC;YACpF,KAAK,WAAW,CAAC,aAAa;gBAC5B,OAAO,oBAAoB,CAAC,CAAC,EAAE,EAAE,CAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"contents.js","sourceRoot":"","sources":["../src/contents.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAIhD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,CAAU,EACV,SAAmB,EACnB,IAAO,EACP,OAAO,GAA0B,EAAE;IAEnC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC;IAC5D,MAAM,qBAAqB,GAAG,CAAC,EAAU,EAAgC,EAAE;QACzE,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,WAAW,CAAC,YAAY;gBAC3B,OAAO,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE;oBAC5C,WAAW,EAAG,OAAwD,CAAC,OAAO;iBAC/E,CAAiC,CAAC;YACrC,KAAK,WAAW,CAAC,IAAI;gBACnB,OAAO,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAiC,CAAC;YACxE,KAAK,WAAW,CAAC,QAAQ;gBACvB,IAAI,UAAU,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;oBACtC,mGAAmG;oBACnG,OAAO,OAAO,CAAC,MAAM,CAAC;wBACpB,MAAM,EAAE,UAAU,CAAC,eAAe;wBAClC,KAAK,EAAE,iFAAiF;qBACzF,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,OAAO,EAAE;oBAChD,OAAO,EAAG,OAAoD,CAAC,OAAO;iBACvE,CAAiC,CAAC;YACrC,KAAK,WAAW,CAAC,UAAU;gBACzB,OAAO,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAiC,CAAC;YAC9E,KAAK,WAAW,CAAC,QAAQ;gBACvB,OAAO,uBAAuB,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAiC,CAAC;YACpF,KAAK,WAAW,CAAC,aAAa;gBAC5B,OAAO,oBAAoB,CAAC,CAAC,EAAE,EAAE,EAAE;oBACjC,OAAO,EAAG,OAAyD,CAAC,OAAO;iBAC5E,CAAiC,CAAC;YACrC;gBACE,OAAO,OAAO,CAAC,MAAM,CAAC;oBACpB,MAAM,EAAE,UAAU,CAAC,eAAe;oBAClC,KAAK,EAAE,sBAAsB;iBAC9B,CAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAmC,EAAE,CAAC;IAElD,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC"}
|
package/lib/courses.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"courses.d.ts","sourceRoot":"","sources":["../src/courses.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAY,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,UAAU,EAAc,MAAM,YAAY,CAAC;AAIpD,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWrE;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAiB1E;AAED,uGAAuG;AACvG,wBAAsB,aAAa,CACjC,CAAC,EAAE,OAAO,EACV,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,UAA+B,EAC3C,IAAI,gCAAS,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,EAAE,CAAC,CAmCvB;AAED,0DAA0D;AAC1D,wBAAsB,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAO9F;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"courses.d.ts","sourceRoot":"","sources":["../src/courses.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAY,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,UAAU,EAAc,MAAM,YAAY,CAAC;AAIpD,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWrE;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAiB1E;AAED,uGAAuG;AACvG,wBAAsB,aAAa,CACjC,CAAC,EAAE,OAAO,EACV,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,UAA+B,EAC3C,IAAI,gCAAS,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,EAAE,CAAC,CAmCvB;AAED,0DAA0D;AAC1D,wBAAsB,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAO9F;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAchF"}
|
package/lib/courses.js
CHANGED
|
@@ -3,7 +3,7 @@ import { CourseType, FailReason } from './types.js';
|
|
|
3
3
|
import * as URLS from './urls.js';
|
|
4
4
|
import { decodeHTML, parseSemesterType } from './utils.js';
|
|
5
5
|
export async function getSemesterIdList(s) {
|
|
6
|
-
const json = await
|
|
6
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_SEMESTER_LIST());
|
|
7
7
|
if (!Array.isArray(json)) {
|
|
8
8
|
return Promise.reject({
|
|
9
9
|
reason: FailReason.INVALID_RESPONSE,
|
|
@@ -15,7 +15,7 @@ export async function getSemesterIdList(s) {
|
|
|
15
15
|
return semesters.filter((semester) => semester != null);
|
|
16
16
|
}
|
|
17
17
|
export async function getCurrentSemester(s) {
|
|
18
|
-
const json = await
|
|
18
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_CURRENT_SEMESTER());
|
|
19
19
|
if (json.message !== 'success') {
|
|
20
20
|
return Promise.reject({
|
|
21
21
|
reason: FailReason.INVALID_RESPONSE,
|
|
@@ -34,7 +34,7 @@ export async function getCurrentSemester(s) {
|
|
|
34
34
|
}
|
|
35
35
|
/** get all courses in the specified semester; time and location only with `options.timeAndLocation` */
|
|
36
36
|
export async function getCourseList(s, semesterID, courseType = CourseType.STUDENT, lang = s.lang, options = {}) {
|
|
37
|
-
const json = await
|
|
37
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_COURSE_LIST(semesterID, courseType, lang));
|
|
38
38
|
if (json.message !== 'success' || !Array.isArray(json.resultList)) {
|
|
39
39
|
return Promise.reject({
|
|
40
40
|
reason: FailReason.INVALID_RESPONSE,
|
|
@@ -70,20 +70,20 @@ export async function getCourseList(s, semesterID, courseType = CourseType.STUDE
|
|
|
70
70
|
/** get the time and location of one course (1 request) */
|
|
71
71
|
export async function getCourseTimeAndLocation(s, courseID) {
|
|
72
72
|
// see https://github.com/Harry-Chen/Learn-Helper/issues/145
|
|
73
|
-
const json = await
|
|
73
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_COURSE_TIME_LOCATION(courseID));
|
|
74
74
|
if (!Array.isArray(json)) {
|
|
75
75
|
throw { reason: FailReason.INVALID_RESPONSE, extra: json };
|
|
76
76
|
}
|
|
77
77
|
return json;
|
|
78
78
|
}
|
|
79
79
|
export async function sortCourses(s, courseIDs) {
|
|
80
|
-
const json = await
|
|
80
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_SORT_COURSES, {
|
|
81
81
|
method: 'POST',
|
|
82
82
|
body: JSON.stringify(courseIDs.map((id, index) => ({ wlkcid: id, xh: index + 1 }))),
|
|
83
83
|
headers: {
|
|
84
84
|
'Content-Type': 'application/json',
|
|
85
85
|
},
|
|
86
|
-
})
|
|
86
|
+
});
|
|
87
87
|
if (json.result !== 'success') {
|
|
88
88
|
return Promise.reject({
|
|
89
89
|
reason: FailReason.OPERATION_FAILED,
|
package/lib/courses.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"courses.js","sourceRoot":"","sources":["../src/courses.ts"],"names":[],"mappings":"AAAA,yBAAyB;AAIzB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,CAAU;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"courses.js","sourceRoot":"","sources":["../src/courses.ts"],"names":[],"mappings":"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"}
|
package/lib/discussions.js
CHANGED
|
@@ -6,7 +6,7 @@ import * as URLS from './urls.js';
|
|
|
6
6
|
import { decodeHTML } from './utils.js';
|
|
7
7
|
/** Get all discussions (课程讨论) of the specified course. */
|
|
8
8
|
export async function getDiscussionList(s, courseID, courseType = CourseType.STUDENT) {
|
|
9
|
-
const json = await
|
|
9
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_DISCUSSION_LIST(courseID, courseType));
|
|
10
10
|
if (json.result !== 'success') {
|
|
11
11
|
return Promise.reject({
|
|
12
12
|
reason: FailReason.INVALID_RESPONSE,
|
|
@@ -25,7 +25,7 @@ export async function getDiscussionList(s, courseID, courseType = CourseType.STU
|
|
|
25
25
|
* The student version supports only answered questions, while the teacher version supports all questions.
|
|
26
26
|
*/
|
|
27
27
|
export async function getAnsweredQuestionList(s, courseID, courseType = CourseType.STUDENT) {
|
|
28
|
-
const json = await
|
|
28
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_QUESTION_LIST_ANSWERED(courseID, courseType));
|
|
29
29
|
if (json.result !== 'success') {
|
|
30
30
|
return Promise.reject({
|
|
31
31
|
reason: FailReason.INVALID_RESPONSE,
|
package/lib/discussions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discussions.js","sourceRoot":"","sources":["../src/discussions.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,CAAU,EACV,QAAgB,EAChB,UAAU,GAAe,UAAU,CAAC,OAAO;IAE3C,MAAM,IAAI,GAAG,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"discussions.js","sourceRoot":"","sources":["../src/discussions.ts"],"names":[],"mappings":"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"}
|
package/lib/favorites.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"favorites.d.ts","sourceRoot":"","sources":["../src/favorites.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAIrD;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"favorites.d.ts","sourceRoot":"","sources":["../src/favorites.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAIrD;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAiC7G;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW1G;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA6B3G"}
|
package/lib/favorites.js
CHANGED
|
@@ -7,7 +7,7 @@ import { CONTENT_TYPE_MAP_REVERSE, decodeHTML } from './utils.js';
|
|
|
7
7
|
* Add an item to favorites. (收藏)
|
|
8
8
|
*/
|
|
9
9
|
export async function addToFavorites(s, type, id) {
|
|
10
|
-
const json = await
|
|
10
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_FAVORITE_ADD(type, id));
|
|
11
11
|
if (json.result !== 'success' || !json.msg?.endsWith?.('成功')) {
|
|
12
12
|
return Promise.reject({
|
|
13
13
|
reason: FailReason.OPERATION_FAILED,
|
|
@@ -19,7 +19,7 @@ export async function addToFavorites(s, type, id) {
|
|
|
19
19
|
* Remove an item from favorites. (取消收藏)
|
|
20
20
|
*/
|
|
21
21
|
export async function removeFromFavorites(s, id) {
|
|
22
|
-
const json = await
|
|
22
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_FAVORITE_REMOVE(id));
|
|
23
23
|
if (json.result !== 'success' || !json.msg?.endsWith?.('成功')) {
|
|
24
24
|
return Promise.reject({
|
|
25
25
|
reason: FailReason.OPERATION_FAILED,
|
|
@@ -32,10 +32,10 @@ export async function removeFromFavorites(s, id) {
|
|
|
32
32
|
* If `courseID` or `type` is specified, only return favorites of that course or type.
|
|
33
33
|
*/
|
|
34
34
|
export async function getFavorites(s, courseID, type) {
|
|
35
|
-
const json = await
|
|
35
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_FAVORITE_LIST(type), {
|
|
36
36
|
method: 'POST',
|
|
37
37
|
body: URLS.LEARN_PAGE_LIST_FORM_DATA(courseID),
|
|
38
|
-
})
|
|
38
|
+
});
|
|
39
39
|
if (json.result !== 'success') {
|
|
40
40
|
return Promise.reject({
|
|
41
41
|
reason: FailReason.INVALID_RESPONSE,
|
|
@@ -70,10 +70,10 @@ export async function getFavorites(s, courseID, type) {
|
|
|
70
70
|
* Pin a favorite item. (置顶)
|
|
71
71
|
*/
|
|
72
72
|
export async function pinFavoriteItem(s, id) {
|
|
73
|
-
const json = await
|
|
73
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_FAVORITE_PIN, {
|
|
74
74
|
method: 'POST',
|
|
75
75
|
body: URLS.LEARN_FAVORITE_PIN_UNPIN_FORM_DATA(id),
|
|
76
|
-
})
|
|
76
|
+
});
|
|
77
77
|
if (json.result !== 'success') {
|
|
78
78
|
return Promise.reject({
|
|
79
79
|
reason: FailReason.OPERATION_FAILED,
|
|
@@ -85,10 +85,10 @@ export async function pinFavoriteItem(s, id) {
|
|
|
85
85
|
* Unpin a favorite item. (取消置顶)
|
|
86
86
|
*/
|
|
87
87
|
export async function unpinFavoriteItem(s, id) {
|
|
88
|
-
const json = await
|
|
88
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_FAVORITE_UNPIN, {
|
|
89
89
|
method: 'POST',
|
|
90
90
|
body: URLS.LEARN_FAVORITE_PIN_UNPIN_FORM_DATA(id),
|
|
91
|
-
})
|
|
91
|
+
});
|
|
92
92
|
if (json.result !== 'success') {
|
|
93
93
|
return Promise.reject({
|
|
94
94
|
reason: FailReason.OPERATION_FAILED,
|
|
@@ -101,10 +101,10 @@ export async function unpinFavoriteItem(s, id) {
|
|
|
101
101
|
* Set an empty string to remove the comment.
|
|
102
102
|
*/
|
|
103
103
|
export async function setComment(s, type, id, content) {
|
|
104
|
-
const json = await
|
|
104
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_COMMENT_SET, {
|
|
105
105
|
method: 'POST',
|
|
106
106
|
body: URLS.LEARN_COMMENT_SET_FORM_DATA(type, id, content),
|
|
107
|
-
})
|
|
107
|
+
});
|
|
108
108
|
if (json.result !== 'success' || !json.msg?.endsWith?.('成功')) {
|
|
109
109
|
return Promise.reject({
|
|
110
110
|
reason: FailReason.OPERATION_FAILED,
|
|
@@ -117,10 +117,10 @@ export async function setComment(s, type, id, content) {
|
|
|
117
117
|
* If `courseID` or `type` is specified, only return favorites of that course or type.
|
|
118
118
|
*/
|
|
119
119
|
export async function getComments(s, courseID, type) {
|
|
120
|
-
const json = await
|
|
120
|
+
const json = await s.fetchJsonWithToken(URLS.LEARN_COMMENT_LIST(type), {
|
|
121
121
|
method: 'POST',
|
|
122
122
|
body: URLS.LEARN_PAGE_LIST_FORM_DATA(courseID),
|
|
123
|
-
})
|
|
123
|
+
});
|
|
124
124
|
if (json.result !== 'success') {
|
|
125
125
|
return Promise.reject({
|
|
126
126
|
reason: FailReason.INVALID_RESPONSE,
|
package/lib/favorites.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"favorites.js","sourceRoot":"","sources":["../src/favorites.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAGpC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAElE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,CAAU,EAAE,IAAiB,EAAE,EAAU;IAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"favorites.js","sourceRoot":"","sources":["../src/favorites.ts"],"names":[],"mappings":"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"}
|
package/lib/files.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Session } from './request.ts';
|
|
2
2
|
import type { File, FileCategory } from './types.ts';
|
|
3
3
|
import { CourseType } from './types.ts';
|
|
4
|
-
/** Get all files (课程文件) of the specified course. */
|
|
4
|
+
/** Get all files (课程文件) of the specified course; `category` is left out if the categories can't be fetched. */
|
|
5
5
|
export declare function getFileList(s: Session, courseID: string, courseType?: CourseType): Promise<File[]>;
|
|
6
6
|
/** Get file categories of the specified course. */
|
|
7
7
|
export declare function getFileCategoryList(s: Session, courseID: string, courseType?: CourseType): Promise<FileCategory[]>;
|
package/lib/files.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAe,UAAU,EAAc,MAAM,YAAY,CAAC;AAIjE
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAe,UAAU,EAAc,MAAM,YAAY,CAAC;AAIjE,+GAA+G;AAC/G,wBAAsB,WAAW,CAC/B,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,UAA+B,GAC1C,OAAO,CAAC,IAAI,EAAE,CAAC,CAsDjB;AAED,mDAAmD;AACnD,wBAAsB,mBAAmB,CACvC,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,UAA+B,GAC1C,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBzB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,UAA+B,GAC1C,OAAO,CAAC,IAAI,EAAE,CAAC,CA4FjB"}
|