@robertying/thu-learn-lib 4.1.0 → 5.0.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/lib/contents.d.ts +4 -4
- package/lib/contents.d.ts.map +1 -1
- package/lib/contents.js +18 -19
- package/lib/contents.js.map +1 -1
- package/lib/courses.d.ts +5 -3
- package/lib/courses.d.ts.map +1 -1
- package/lib/courses.js +19 -7
- package/lib/courses.js.map +1 -1
- package/lib/homework.d.ts +11 -3
- package/lib/homework.d.ts.map +1 -1
- package/lib/homework.js +27 -26
- package/lib/homework.js.map +1 -1
- package/lib/index.d.ts +39 -10
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +51 -13
- package/lib/index.js.map +1 -1
- package/lib/notices.d.ts +11 -3
- package/lib/notices.d.ts.map +1 -1
- package/lib/notices.js +31 -23
- package/lib/notices.js.map +1 -1
- package/lib/request.d.ts +32 -6
- package/lib/request.d.ts.map +1 -1
- package/lib/request.js +153 -46
- package/lib/request.js.map +1 -1
- package/lib/types.d.ts +43 -2
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +1 -0
- package/lib/types.js.map +1 -1
- package/lib/utils.d.ts +3 -0
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +2 -0
- package/lib/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/contents.ts +20 -24
- package/src/courses.ts +21 -7
- package/src/homework.ts +89 -84
- package/src/index.ts +77 -14
- package/src/notices.ts +48 -43
- package/src/request.ts +159 -46
- package/src/types.ts +50 -1
- package/src/utils.ts +5 -0
package/lib/notices.d.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import type { Session } from './request.ts';
|
|
2
|
-
import type { Notification } from './types.ts';
|
|
2
|
+
import type { INotification, Notification, NotificationListOptions, RemoteFile } from './types.ts';
|
|
3
3
|
import { CourseType } from './types.ts';
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Get all notifications (课程公告) of the specified course: current and expired lists.
|
|
6
|
+
* Attachments only for the notices `options.attachments` selects.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getNotificationList(s: Session, courseID: string, courseType?: CourseType, options?: NotificationListOptions): Promise<Notification[]>;
|
|
9
|
+
/**
|
|
10
|
+
* Get the attachment of a notice from its detail page (1 request), or `undefined` without a request if
|
|
11
|
+
* `attachmentName` says it has none.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getNotificationAttachment(s: Session, notification: Pick<INotification, 'url' | 'attachmentName'>, courseType?: CourseType): Promise<RemoteFile | undefined>;
|
|
6
14
|
//# sourceMappingURL=notices.d.ts.map
|
package/lib/notices.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notices.d.ts","sourceRoot":"","sources":["../src/notices.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"notices.d.ts","sourceRoot":"","sources":["../src/notices.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnG,OAAO,EAAe,UAAU,EAAc,MAAM,YAAY,CAAC;AAIjE;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,UAA+B,EAC3C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,YAAY,EAAE,CAAC,CAWzB;AA0CD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,CAAC,EAAE,OAAO,EACV,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,gBAAgB,CAAC,EAC3D,UAAU,GAAE,UAA+B,GAC1C,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAiCjC"}
|
package/lib/notices.js
CHANGED
|
@@ -3,13 +3,21 @@ import { Base64 } from 'js-base64';
|
|
|
3
3
|
import { $, YES } from './request.js';
|
|
4
4
|
import { ContentType, CourseType, FailReason } from './types.js';
|
|
5
5
|
import * as URLS from './urls.js';
|
|
6
|
-
import { decodeHTML, trimAndDefine } from './utils.js';
|
|
7
|
-
/**
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
import { decodeHTML, isSelected, trimAndDefine } from './utils.js';
|
|
7
|
+
/**
|
|
8
|
+
* Get all notifications (课程公告) of the specified course: current and expired lists.
|
|
9
|
+
* Attachments only for the notices `options.attachments` selects.
|
|
10
|
+
*/
|
|
11
|
+
export async function getNotificationList(s, courseID, courseType = CourseType.STUDENT, options = {}) {
|
|
12
|
+
const lists = await Promise.all([
|
|
10
13
|
getNotificationListKind(s, courseID, courseType, false),
|
|
11
14
|
getNotificationListKind(s, courseID, courseType, true),
|
|
12
|
-
])
|
|
15
|
+
]);
|
|
16
|
+
return Promise.all(lists.flat().map(async (n) => {
|
|
17
|
+
if (!n.attachmentName || !isSelected(options.attachments, n))
|
|
18
|
+
return n;
|
|
19
|
+
return { ...n, attachment: await getNotificationAttachment(s, n, courseType) };
|
|
20
|
+
}));
|
|
13
21
|
}
|
|
14
22
|
async function getNotificationListKind(s, courseID, courseType, expired) {
|
|
15
23
|
const json = await (await s.fetchWithToken(URLS.LEARN_NOTIFICATION_LIST(courseType, expired), {
|
|
@@ -23,8 +31,9 @@ async function getNotificationListKind(s, courseID, courseType, expired) {
|
|
|
23
31
|
});
|
|
24
32
|
}
|
|
25
33
|
const result = (json.object?.aaData ?? json.object?.resultsList ?? []);
|
|
26
|
-
return
|
|
27
|
-
const
|
|
34
|
+
return result.map((n) => {
|
|
35
|
+
const attachmentName = courseType === CourseType.STUDENT ? n.fjmc : n.fjbt;
|
|
36
|
+
return {
|
|
28
37
|
id: n.ggid,
|
|
29
38
|
content: Base64.decode(n.ggnr ?? ''),
|
|
30
39
|
title: decodeHTML(n.bt),
|
|
@@ -36,16 +45,17 @@ async function getNotificationListKind(s, courseID, courseType, expired) {
|
|
|
36
45
|
expireTime: n.jzsj ?? undefined,
|
|
37
46
|
isFavorite: n.sfsc === YES,
|
|
38
47
|
comment: n.bznr ?? undefined,
|
|
48
|
+
attachmentName: typeof attachmentName === 'string' && attachmentName ? attachmentName : undefined,
|
|
39
49
|
};
|
|
40
|
-
|
|
41
|
-
const attachmentName = courseType === CourseType.STUDENT ? n.fjmc : n.fjbt;
|
|
42
|
-
if (attachmentName) {
|
|
43
|
-
detail = await parseNotificationDetail(s, courseID, notification.id, courseType, attachmentName);
|
|
44
|
-
}
|
|
45
|
-
return { ...notification, ...detail };
|
|
46
|
-
}));
|
|
50
|
+
});
|
|
47
51
|
}
|
|
48
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Get the attachment of a notice from its detail page (1 request), or `undefined` without a request if
|
|
54
|
+
* `attachmentName` says it has none.
|
|
55
|
+
*/
|
|
56
|
+
export async function getNotificationAttachment(s, notification, courseType = CourseType.STUDENT) {
|
|
57
|
+
if (!notification.attachmentName)
|
|
58
|
+
return undefined;
|
|
49
59
|
/// from JSON (backup, currently not used)
|
|
50
60
|
// const postParams = new FormData();
|
|
51
61
|
// postParams.append('id', id);
|
|
@@ -56,7 +66,7 @@ async function parseNotificationDetail(s, courseID, id, courseType, attachmentNa
|
|
|
56
66
|
// })).json();
|
|
57
67
|
// const attachmentId = metadata.ggfjid as string;
|
|
58
68
|
/// parsed from HTML
|
|
59
|
-
const response = await s.fetchWithToken(
|
|
69
|
+
const response = await s.fetchWithToken(notification.url);
|
|
60
70
|
const result = $(await response.text());
|
|
61
71
|
let path = '';
|
|
62
72
|
if (courseType === CourseType.STUDENT) {
|
|
@@ -72,13 +82,11 @@ async function parseNotificationDetail(s, courseID, id, courseType, attachmentNa
|
|
|
72
82
|
path = URLS.LEARN_PREFIX + path;
|
|
73
83
|
}
|
|
74
84
|
return {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
size,
|
|
81
|
-
},
|
|
85
|
+
name: notification.attachmentName,
|
|
86
|
+
id: attachmentId,
|
|
87
|
+
downloadUrl: path,
|
|
88
|
+
previewUrl: URLS.LEARN_FILE_PREVIEW(ContentType.NOTIFICATION, attachmentId, courseType, s.previewFirstPage),
|
|
89
|
+
size,
|
|
82
90
|
};
|
|
83
91
|
}
|
|
84
92
|
//# sourceMappingURL=notices.js.map
|
package/lib/notices.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notices.js","sourceRoot":"","sources":["../src/notices.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"notices.js","sourceRoot":"","sources":["../src/notices.ts"],"names":[],"mappings":"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"}
|
package/lib/request.d.ts
CHANGED
|
@@ -6,26 +6,52 @@ import { Language } from './types.ts';
|
|
|
6
6
|
export declare const $: (html: string | Element | Element[]) => cheerio.CheerioAPI;
|
|
7
7
|
export declare const noLogin: (res: Response) => boolean;
|
|
8
8
|
export declare const YES = "\u662F";
|
|
9
|
+
/** default for `HelperConfig.maxConcurrentRequests` */
|
|
10
|
+
export declare const DEFAULT_MAX_CONCURRENT_REQUESTS = 6;
|
|
11
|
+
/** default for `HelperConfig.requestTimeout`, in milliseconds */
|
|
12
|
+
export declare const DEFAULT_REQUEST_TIMEOUT = 60000;
|
|
9
13
|
/** add CSRF token to any request URL as parameters */
|
|
10
14
|
export declare const addCSRFTokenToUrl: (url: string, token: string) => string;
|
|
15
|
+
/**
|
|
16
|
+
* Let at most `max` calls of `inner` run at once; the rest wait in FIFO order. A slot is freed when the response
|
|
17
|
+
* headers arrive (or the call fails), so reading a body does not hold one.
|
|
18
|
+
*/
|
|
19
|
+
export declare function limitConcurrency(inner: Fetch, max: number): Fetch;
|
|
20
|
+
/**
|
|
21
|
+
* Abort a call of `inner` that has no response headers after `ms` milliseconds and reject it with
|
|
22
|
+
* `FailReason.REQUEST_TIMEOUT`. A caller's own `signal` still works. Uses only `AbortController` and `setTimeout`,
|
|
23
|
+
* which React Native has (unlike `AbortSignal.timeout` / `AbortSignal.any`).
|
|
24
|
+
*/
|
|
25
|
+
export declare function withTimeout(inner: Fetch, ms: number): Fetch;
|
|
11
26
|
/**
|
|
12
27
|
* State shared by every request a `Learn2018Helper` makes: cookies, CSRF token, language and the fetch wrappers.
|
|
13
28
|
* Internal; the helper keeps it in a private field.
|
|
14
29
|
*/
|
|
15
30
|
export declare class Session {
|
|
31
|
+
#private;
|
|
16
32
|
readonly login: () => Promise<void>;
|
|
17
33
|
readonly provider?: CredentialProvider;
|
|
18
34
|
readonly cookieJar: CookieJar;
|
|
19
|
-
/**
|
|
35
|
+
/** fetch with cookies, the concurrency cap and the timeout, but no login check */
|
|
20
36
|
readonly rawFetch: Fetch;
|
|
21
|
-
/** rejects with `NOT_LOGGED_IN`, or logs in again and retries once when a `CredentialProvider` is set */
|
|
22
|
-
readonly fetch: Fetch;
|
|
23
|
-
csrfToken: string;
|
|
24
37
|
lang: Language;
|
|
25
38
|
previewFirstPage: boolean;
|
|
26
|
-
/** `login`
|
|
39
|
+
/** `login` signs in through SSO with the `CredentialProvider`; the session calls it at most once at a time */
|
|
27
40
|
constructor(config: HelperConfig | undefined, login: () => Promise<void>);
|
|
28
|
-
|
|
41
|
+
get csrfToken(): string;
|
|
42
|
+
set csrfToken(token: string);
|
|
43
|
+
/**
|
|
44
|
+
* Log in with the `CredentialProvider`. Concurrent callers share one SSO login instead of starting one each.
|
|
45
|
+
*/
|
|
46
|
+
relogin(): Promise<void>;
|
|
47
|
+
/** fetch with a login check (see `#send`) */
|
|
48
|
+
readonly fetch: Fetch;
|
|
49
|
+
/** like `fetch`, but logs in first if there is no CSRF token yet and adds the current token to the URL */
|
|
29
50
|
readonly fetchWithToken: Fetch;
|
|
51
|
+
/**
|
|
52
|
+
* Make sure the session works: if there is a CSRF token, make one cheap authenticated request (`probeUrl`) and log
|
|
53
|
+
* in only if it fails; otherwise log in.
|
|
54
|
+
*/
|
|
55
|
+
ensureSession(probeUrl: string): Promise<void>;
|
|
30
56
|
}
|
|
31
57
|
//# sourceMappingURL=request.d.ts.map
|
package/lib/request.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAY,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EAAc,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIlD,eAAO,MAAM,CAAC,SAAU,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,KAAG,OAAO,CAAC,UAE9D,CAAC;AAEF,eAAO,MAAM,OAAO,QAAS,QAAQ,YAA4D,CAAC;AAElG,eAAO,MAAM,GAAG,WAAM,CAAC;AAEvB,uDAAuD;AACvD,eAAO,MAAM,+BAA+B,IAAI,CAAC;AACjD,iEAAiE;AACjE,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,sDAAsD;AACtD,eAAO,MAAM,iBAAiB,QAAS,MAAM,SAAS,MAAM,KAAG,MAI9D,CAAC;AASF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,CAyBjE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,GAAG,KAAK,CA4B3D;AAOD;;;GAGG;AACH,qBAAa,OAAO;;IAehB,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAdrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;IAKzB,IAAI,WAAe;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAE1B,8GAA8G;IAC9G,YACE,MAAM,EAAE,YAAY,GAAG,SAAS,EACvB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EASpC;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,EAG1B;IAED;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAKvB;IAkCD,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAyD;IAE9E,0GAA0G;IAC1G,QAAQ,CAAC,cAAc,EAAE,KAAK,CAM5B;IAEF;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnD;CACF"}
|
package/lib/request.js
CHANGED
|
@@ -9,6 +9,10 @@ export const $ = (html) => {
|
|
|
9
9
|
};
|
|
10
10
|
export const noLogin = (res) => res.url.includes('login_timeout') || res.status === 403;
|
|
11
11
|
export const YES = '是';
|
|
12
|
+
/** default for `HelperConfig.maxConcurrentRequests` */
|
|
13
|
+
export const DEFAULT_MAX_CONCURRENT_REQUESTS = 6;
|
|
14
|
+
/** default for `HelperConfig.requestTimeout`, in milliseconds */
|
|
15
|
+
export const DEFAULT_REQUEST_TIMEOUT = 60_000;
|
|
12
16
|
/** add CSRF token to any request URL as parameters */
|
|
13
17
|
export const addCSRFTokenToUrl = (url, token) => {
|
|
14
18
|
const newUrl = new URL(url);
|
|
@@ -18,33 +22,84 @@ export const addCSRFTokenToUrl = (url, token) => {
|
|
|
18
22
|
function makeFetch(jar) {
|
|
19
23
|
return fetchCookie(fetch, jar);
|
|
20
24
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
25
|
+
const urlOf = (input) => typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
26
|
+
/**
|
|
27
|
+
* Let at most `max` calls of `inner` run at once; the rest wait in FIFO order. A slot is freed when the response
|
|
28
|
+
* headers arrive (or the call fails), so reading a body does not hold one.
|
|
29
|
+
*/
|
|
30
|
+
export function limitConcurrency(inner, max) {
|
|
31
|
+
if (!(max >= 1) || max === Infinity)
|
|
32
|
+
return inner;
|
|
33
|
+
let active = 0;
|
|
34
|
+
const waiting = [];
|
|
35
|
+
const acquire = () => {
|
|
36
|
+
if (active < max) {
|
|
37
|
+
active += 1;
|
|
38
|
+
return Promise.resolve();
|
|
39
|
+
}
|
|
40
|
+
return new Promise((resolve) => waiting.push(resolve));
|
|
41
|
+
};
|
|
42
|
+
const release = () => {
|
|
43
|
+
const next = waiting.shift();
|
|
44
|
+
// hand the slot straight to the next caller, so `active` stays the same
|
|
45
|
+
if (next)
|
|
46
|
+
next();
|
|
47
|
+
else
|
|
48
|
+
active -= 1;
|
|
49
|
+
};
|
|
50
|
+
return async (...args) => {
|
|
51
|
+
await acquire();
|
|
52
|
+
try {
|
|
53
|
+
return await inner(...args);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
release();
|
|
57
|
+
}
|
|
46
58
|
};
|
|
47
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Abort a call of `inner` that has no response headers after `ms` milliseconds and reject it with
|
|
62
|
+
* `FailReason.REQUEST_TIMEOUT`. A caller's own `signal` still works. Uses only `AbortController` and `setTimeout`,
|
|
63
|
+
* which React Native has (unlike `AbortSignal.timeout` / `AbortSignal.any`).
|
|
64
|
+
*/
|
|
65
|
+
export function withTimeout(inner, ms) {
|
|
66
|
+
if (!(ms > 0) || ms === Infinity)
|
|
67
|
+
return inner;
|
|
68
|
+
return async (input, init) => {
|
|
69
|
+
const controller = new AbortController();
|
|
70
|
+
const outer = init?.signal ?? undefined;
|
|
71
|
+
const forward = () => controller.abort(outer?.reason);
|
|
72
|
+
if (outer?.aborted)
|
|
73
|
+
forward();
|
|
74
|
+
else
|
|
75
|
+
outer?.addEventListener('abort', forward, { once: true });
|
|
76
|
+
let timedOut = false;
|
|
77
|
+
const timer = setTimeout(() => {
|
|
78
|
+
timedOut = true;
|
|
79
|
+
controller.abort();
|
|
80
|
+
}, ms);
|
|
81
|
+
try {
|
|
82
|
+
return await inner(input, { ...init, signal: controller.signal });
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (timedOut) {
|
|
86
|
+
throw {
|
|
87
|
+
reason: FailReason.REQUEST_TIMEOUT,
|
|
88
|
+
extra: { url: urlOf(input), timeout: ms },
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
throw err;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
outer?.removeEventListener('abort', forward);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** free the connection of a response we won't read */
|
|
100
|
+
const discard = (res) => {
|
|
101
|
+
res.body?.cancel().catch(() => { });
|
|
102
|
+
};
|
|
48
103
|
/**
|
|
49
104
|
* State shared by every request a `Learn2018Helper` makes: cookies, CSRF token, language and the fetch wrappers.
|
|
50
105
|
* Internal; the helper keeps it in a private field.
|
|
@@ -53,38 +108,90 @@ export class Session {
|
|
|
53
108
|
login;
|
|
54
109
|
provider;
|
|
55
110
|
cookieJar;
|
|
56
|
-
/**
|
|
111
|
+
/** fetch with cookies, the concurrency cap and the timeout, but no login check */
|
|
57
112
|
rawFetch;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
113
|
+
#csrfToken = '';
|
|
114
|
+
/** bumped whenever the session changes (login, `csrfToken` set), so late failures from an old session don't log in again */
|
|
115
|
+
#generation = 0;
|
|
116
|
+
#pendingLogin;
|
|
61
117
|
lang = Language.ZH;
|
|
62
118
|
previewFirstPage;
|
|
63
|
-
/** `login`
|
|
119
|
+
/** `login` signs in through SSO with the `CredentialProvider`; the session calls it at most once at a time */
|
|
64
120
|
constructor(config, login) {
|
|
65
121
|
this.login = login;
|
|
66
122
|
this.previewFirstPage = config?.generatePreviewUrlForFirstPage ?? true;
|
|
67
123
|
this.provider = config?.provider;
|
|
68
124
|
this.cookieJar = config?.cookieJar ?? new CookieJar();
|
|
69
|
-
this.rawFetch = config?.fetch ?? makeFetch(this.cookieJar);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
125
|
+
this.rawFetch = limitConcurrency(withTimeout(config?.fetch ?? makeFetch(this.cookieJar), config?.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT), config?.maxConcurrentRequests ?? DEFAULT_MAX_CONCURRENT_REQUESTS);
|
|
126
|
+
}
|
|
127
|
+
get csrfToken() {
|
|
128
|
+
return this.#csrfToken;
|
|
129
|
+
}
|
|
130
|
+
set csrfToken(token) {
|
|
131
|
+
this.#csrfToken = token;
|
|
132
|
+
this.#generation += 1;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Log in with the `CredentialProvider`. Concurrent callers share one SSO login instead of starting one each.
|
|
136
|
+
*/
|
|
137
|
+
relogin() {
|
|
138
|
+
this.#pendingLogin ??= this.login().finally(() => {
|
|
139
|
+
this.#pendingLogin = undefined;
|
|
140
|
+
});
|
|
141
|
+
return this.#pendingLogin;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Send a request built by `makeUrl` (called again for the retry, so it can pick up a new CSRF token).
|
|
145
|
+
* When the session has expired, it rejects with `NOT_LOGGED_IN` if there is no `CredentialProvider`; otherwise it
|
|
146
|
+
* logs in again (sharing a login already in progress, or skipping it if another request already renewed the
|
|
147
|
+
* session) and retries once.
|
|
148
|
+
*/
|
|
149
|
+
async #send(makeUrl, init) {
|
|
150
|
+
const generation = this.#generation;
|
|
151
|
+
const res = await this.rawFetch(makeUrl(), init);
|
|
152
|
+
if (!noLogin(res))
|
|
153
|
+
return res;
|
|
154
|
+
discard(res);
|
|
155
|
+
if (!this.provider) {
|
|
156
|
+
throw { reason: FailReason.NOT_LOGGED_IN };
|
|
157
|
+
}
|
|
158
|
+
if (this.#generation === generation) {
|
|
159
|
+
await this.relogin();
|
|
160
|
+
}
|
|
161
|
+
const retry = await this.rawFetch(makeUrl(), init);
|
|
162
|
+
if (noLogin(retry)) {
|
|
163
|
+
discard(retry);
|
|
164
|
+
throw { reason: FailReason.NOT_LOGGED_IN };
|
|
165
|
+
}
|
|
166
|
+
if (retry.status !== 200) {
|
|
167
|
+
discard(retry);
|
|
168
|
+
throw {
|
|
169
|
+
reason: FailReason.UNEXPECTED_STATUS,
|
|
170
|
+
extra: { code: retry.status, text: retry.statusText },
|
|
79
171
|
};
|
|
172
|
+
}
|
|
173
|
+
return retry;
|
|
80
174
|
}
|
|
81
|
-
/**
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
175
|
+
/** fetch with a login check (see `#send`) */
|
|
176
|
+
fetch = (input, init) => this.#send(() => urlOf(input), init);
|
|
177
|
+
/** like `fetch`, but logs in first if there is no CSRF token yet and adds the current token to the URL */
|
|
178
|
+
fetchWithToken = async (input, init) => {
|
|
179
|
+
if (this.#csrfToken === '') {
|
|
180
|
+
await this.relogin();
|
|
85
181
|
}
|
|
86
|
-
const
|
|
87
|
-
return this
|
|
182
|
+
const url = urlOf(input);
|
|
183
|
+
return this.#send(() => addCSRFTokenToUrl(url, this.#csrfToken), init);
|
|
88
184
|
};
|
|
185
|
+
/**
|
|
186
|
+
* Make sure the session works: if there is a CSRF token, make one cheap authenticated request (`probeUrl`) and log
|
|
187
|
+
* in only if it fails; otherwise log in.
|
|
188
|
+
*/
|
|
189
|
+
async ensureSession(probeUrl) {
|
|
190
|
+
if (this.#csrfToken === '') {
|
|
191
|
+
await this.relogin();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
discard(await this.fetchWithToken(probeUrl));
|
|
195
|
+
}
|
|
89
196
|
}
|
|
90
197
|
//# sourceMappingURL=request.js.map
|
package/lib/request.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,cAAc,GAA2B,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAE7D,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAkC,EAAsB,EAAE;IAC1E,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAa,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;AAElG,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC;AAEvB,sDAAsD;AACtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,KAAa,EAAU,EAAE;IACtE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,SAAS,SAAS,CAAC,GAAe;IAChC,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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"}
|
package/lib/types.d.ts
CHANGED
|
@@ -13,6 +13,10 @@ export type HelperConfig = {
|
|
|
13
13
|
fetch?: Fetch;
|
|
14
14
|
cookieJar?: CookieJar;
|
|
15
15
|
generatePreviewUrlForFirstPage?: boolean;
|
|
16
|
+
/** at most this many requests in flight at once, including login (default 6; `Infinity` for no limit) */
|
|
17
|
+
maxConcurrentRequests?: number;
|
|
18
|
+
/** milliseconds to wait for a response before rejecting with `FailReason.REQUEST_TIMEOUT` (default 60000; 0 for none) */
|
|
19
|
+
requestTimeout?: number;
|
|
16
20
|
};
|
|
17
21
|
export declare enum FailReason {
|
|
18
22
|
NO_CREDENTIAL = "no credential provided",
|
|
@@ -24,7 +28,8 @@ export declare enum FailReason {
|
|
|
24
28
|
INVALID_RESPONSE = "invalid response",
|
|
25
29
|
UNEXPECTED_STATUS = "unexpected status",
|
|
26
30
|
OPERATION_FAILED = "operation failed",
|
|
27
|
-
ERROR_SETTING_COOKIES = "could not set cookies"
|
|
31
|
+
ERROR_SETTING_COOKIES = "could not set cookies",
|
|
32
|
+
REQUEST_TIMEOUT = "request timed out"
|
|
28
33
|
}
|
|
29
34
|
export interface ApiError {
|
|
30
35
|
reason: FailReason;
|
|
@@ -67,7 +72,8 @@ interface ICourseInfo {
|
|
|
67
72
|
name: string;
|
|
68
73
|
chineseName: string;
|
|
69
74
|
englishName: string;
|
|
70
|
-
timeAndLocation:
|
|
75
|
+
/** only with `getCourseList(..., { timeAndLocation: true })`; see `getCourseTimeAndLocation` */
|
|
76
|
+
timeAndLocation?: string[];
|
|
71
77
|
url: string;
|
|
72
78
|
teacherName: string;
|
|
73
79
|
teacherNumber: string;
|
|
@@ -96,6 +102,8 @@ export interface INotification {
|
|
|
96
102
|
expireTime?: string;
|
|
97
103
|
isFavorite: boolean;
|
|
98
104
|
comment?: string;
|
|
105
|
+
/** name of the attachment, if the notice has one; fetch it with `getNotificationAttachment` */
|
|
106
|
+
attachmentName?: string;
|
|
99
107
|
}
|
|
100
108
|
export interface INotificationDetail {
|
|
101
109
|
attachment?: RemoteFile;
|
|
@@ -318,6 +326,39 @@ export interface IQuestionnaire {
|
|
|
318
326
|
detail: QuestionnaireDetail[];
|
|
319
327
|
}
|
|
320
328
|
export type Questionnaire = IQuestionnaire;
|
|
329
|
+
/** which items get their extra per-item requests: none (default), all, or those the predicate accepts */
|
|
330
|
+
export type DetailSelector<T> = 'none' | 'all' | ((item: T) => boolean);
|
|
331
|
+
export interface CourseListOptions {
|
|
332
|
+
/** fetch each course's time and location (one request per course; default false) */
|
|
333
|
+
timeAndLocation?: boolean;
|
|
334
|
+
}
|
|
335
|
+
export interface HomeworkListOptions {
|
|
336
|
+
/**
|
|
337
|
+
* Which homework gets its detail (page + description JSON, 2 requests each); default `'none'`.
|
|
338
|
+
* The same as calling `getHomeworkDetail` for those items.
|
|
339
|
+
*/
|
|
340
|
+
details?: DetailSelector<IHomework>;
|
|
341
|
+
}
|
|
342
|
+
export interface NotificationListOptions {
|
|
343
|
+
/**
|
|
344
|
+
* Which notices with an attachment get it (1 request each); default `'none'`.
|
|
345
|
+
* The same as calling `getNotificationAttachment` for those items.
|
|
346
|
+
*/
|
|
347
|
+
attachments?: DetailSelector<INotification>;
|
|
348
|
+
}
|
|
349
|
+
export interface AllContentsOptions<T extends ContentType> {
|
|
350
|
+
courseType?: CourseType;
|
|
351
|
+
/** homework `details` or notification `attachments`, passed to each course's list */
|
|
352
|
+
details?: T extends ContentType.HOMEWORK ? DetailSelector<IHomework> : T extends ContentType.NOTIFICATION ? DetailSelector<INotification> : never;
|
|
353
|
+
}
|
|
354
|
+
export interface AllContentsResult<T extends ContentType> {
|
|
355
|
+
/** content of each course that succeeded */
|
|
356
|
+
contents: CourseContent<T>;
|
|
357
|
+
/** the error of each course that failed */
|
|
358
|
+
errors: {
|
|
359
|
+
[courseID: string]: unknown;
|
|
360
|
+
};
|
|
361
|
+
}
|
|
321
362
|
export type ContentTypeMap = {
|
|
322
363
|
[ContentType.NOTIFICATION]: Notification;
|
|
323
364
|
[ContentType.FILE]: File;
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,KAAK,GAAG,OAAO,UAAU,CAAC,KAAK,CAAC;AAC5C,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACxE,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8BAA8B,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/lib/types.js
CHANGED
|
@@ -10,6 +10,7 @@ export var FailReason;
|
|
|
10
10
|
FailReason["UNEXPECTED_STATUS"] = "unexpected status";
|
|
11
11
|
FailReason["OPERATION_FAILED"] = "operation failed";
|
|
12
12
|
FailReason["ERROR_SETTING_COOKIES"] = "could not set cookies";
|
|
13
|
+
FailReason["REQUEST_TIMEOUT"] = "request timed out";
|
|
13
14
|
})(FailReason || (FailReason = {}));
|
|
14
15
|
export var SemesterType;
|
|
15
16
|
(function (SemesterType) {
|
package/lib/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAN,IAAY,UAYX;AAZD,WAAY,UAAU;IACpB,sDAAwC,CAAA;IACxC,oFAAsE,CAAA;IACtE,+CAAiC,CAAA;IACjC,uEAAyD,CAAA;IACzD,8DAAgD,CAAA;IAChD,iDAAmC,CAAA;IACnC,mDAAqC,CAAA;IACrC,qDAAuC,CAAA;IACvC,mDAAqC,CAAA;IACrC,6DAA+C,CAAA;IAC/C,mDAAqC,CAAA;AACvC,CAAC,EAZW,UAAU,KAAV,UAAU,QAYrB;AAOD,MAAM,CAAN,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,6BAAa,CAAA;IACb,iCAAiB,CAAA;IACjB,iCAAiB,CAAA;IACjB,4BAAY,CAAA;AACd,CAAC,EALW,YAAY,KAAZ,YAAY,QAKvB;AAED,MAAM,CAAN,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,4CAA6B,CAAA;IAC7B,4BAAa,CAAA;IACb,oCAAqB,CAAA;IACrB,wCAAyB,CAAA;IACzB,oCAAqB,CAAA;IACrB,8CAA+B,CAAA;AACjC,CAAC,EAPW,WAAW,KAAX,WAAW,QAOtB;AAoBD,MAAM,CAAN,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,iCAAmB,CAAA;IACnB,iCAAmB,CAAA;AACrB,CAAC,EAHW,UAAU,KAAV,UAAU,QAGrB;AAgGD,MAAM,CAAN,IAAY,kBAiCX;AAjCD,WAAY,kBAAkB;IAC5B,SAAS;IACT,yCAAmB,CAAA;IACnB,mCAAa,CAAA;IACb,6BAAO,CAAA;IACP,oCAAc,CAAA;IACd,mCAAa,CAAA;IACb,SAAS;IACT,iDAA2B,CAAA;IAC3B,6BAAO,CAAA;IACP,oCAAc,CAAA;IACd,mCAAa,CAAA;IACb,6BAAO,CAAA;IACP,oCAAc,CAAA;IACd,6BAAO,CAAA;IACP,mCAAa,CAAA;IACb,6BAAO,CAAA;IACP,SAAS;IACT,yDAAmC,CAAA;IACnC,6BAAO,CAAA;IACP,+BAAS,CAAA;IACT,SAAS;IACT,6CAAuB,CAAA;IACvB,SAAS;IACT,mCAAa,CAAA;IACb,UAAU;IACV,yCAAmB,CAAA;IACnB,6BAAO,CAAA;IACP,6BAAO,CAAA;IACP,SAAS;IACT,+CAAyB,CAAA;IACzB,+BAAS,CAAA;IACT,6BAAO,CAAA;AACT,CAAC,EAjCW,kBAAkB,KAAlB,kBAAkB,QAiC7B;AA4CD,MAAM,CAAN,IAAY,sBAGX;AAHD,WAAY,sBAAsB;IAChC,+EAAc,CAAA;IACd,qEAAS,CAAA;AACX,CAAC,EAHW,sBAAsB,KAAtB,sBAAsB,QAGjC;AAED,MAAM,CAAN,IAAY,sBAGX;AAHD,WAAY,sBAAsB;IAChC,mFAAgB,CAAA;IAChB,yEAAW,CAAA;AACb,CAAC,EAHW,sBAAsB,KAAtB,sBAAsB,QAGjC;AAqED,MAAM,CAAN,IAAY,uBAIX;AAJD,WAAY,uBAAuB;IACjC,yCAAc,CAAA;IACd,wCAAa,CAAA;IACb,sCAAW,CAAA;AACb,CAAC,EAJW,uBAAuB,KAAvB,uBAAuB,QAIlC;AAgBD,MAAM,CAAN,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IAC3B,gCAAW,CAAA;IACX,gCAAW,CAAA;IACX,kCAAa,CAAA;AACf,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,QAI5B;AA0ID,MAAM,CAAN,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,qBAAS,CAAA;IACT,qBAAS,CAAA;AACX,CAAC,EAHW,QAAQ,KAAR,QAAQ,QAGnB"}
|
package/lib/utils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { DetailSelector } from './types.ts';
|
|
1
2
|
import { ContentType, HomeworkGradeLevel, QuestionnaireType, SemesterType } from './types.ts';
|
|
2
3
|
export declare function parseSemesterType(n: number): SemesterType;
|
|
3
4
|
export declare function getMkFromType(type: ContentType): string;
|
|
@@ -10,4 +11,6 @@ export declare function formatFileSize(size: number): string;
|
|
|
10
11
|
export declare const CONTENT_TYPE_MAP: Map<ContentType, string>;
|
|
11
12
|
export declare const CONTENT_TYPE_MAP_REVERSE: Map<string, ContentType>;
|
|
12
13
|
export declare const QNR_TYPE_MAP: Map<string, QuestionnaireType>;
|
|
14
|
+
/** whether `item` is selected by a `DetailSelector` (`undefined` means `'none'`) */
|
|
15
|
+
export declare const isSelected: <T>(selector: DetailSelector<T> | undefined, item: T) => boolean;
|
|
13
16
|
//# sourceMappingURL=utils.d.ts.map
|