parse-comcigan 0.2.0 → 1.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/README.md +86 -95
- package/bun.lock +175 -0
- package/dist/error.d.ts +4 -0
- package/dist/error.js +7 -0
- package/dist/error.js.map +1 -0
- package/dist/index.d.ts +34 -129
- package/dist/index.js +101 -177
- package/dist/index.js.map +1 -1
- package/package.json +8 -7
- package/test.ts +9 -0
- package/tsconfig.json +4 -3
- package/dist/cache.d.ts +0 -8
- package/dist/cache.js +0 -32
- package/dist/cache.js.map +0 -1
- package/src/cache.ts +0 -32
- package/src/index.ts +0 -335
- package/src/types/index.d.ts +0 -45
package/dist/index.js
CHANGED
|
@@ -7,207 +7,131 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
|
|
10
|
+
import ComciganError from "./error.js";
|
|
11
|
+
import axios from "axios";
|
|
12
|
+
import iconv from "iconv-lite";
|
|
13
|
+
import dayjs from "dayjs";
|
|
14
|
+
axios.defaults.validateStatus = () => true;
|
|
15
|
+
function splitData(dat) {
|
|
16
|
+
const d = String(dat).match(/\d{1,3}(?=(\d{3})+(?!\d))|\d{1,3}$/g);
|
|
17
|
+
if (!d)
|
|
18
|
+
return -1;
|
|
19
|
+
return d.reverse().map(Number);
|
|
20
|
+
}
|
|
14
21
|
export default class Comcigan {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
mTh(mm, m2) { if (m2 == 100) {
|
|
19
|
-
return Math.floor(mm / m2);
|
|
20
|
-
} return mm % m2; }
|
|
21
|
-
unusable(object, array) {
|
|
22
|
-
if (object === array[0])
|
|
23
|
-
return;
|
|
24
|
-
return object;
|
|
25
|
-
}
|
|
26
|
-
request(route, doNotParse) {
|
|
27
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
-
if (this._cache.has(route)) {
|
|
29
|
-
this._options.debug ? this._options.debug(`[request] Return cache with id registered as ${route}`) : 0;
|
|
30
|
-
return this._cache.get(route);
|
|
31
|
-
}
|
|
32
|
-
this._options.debug ? this._options.debug(`[request] Requesting to http://comci.kr:4081/${route}`) : 0;
|
|
33
|
-
const r = yield axios.get(`http://comci.kr:4081/${route}`, Object.assign({}, (this._options.doNotThrow && { "validateStatus": () => true })));
|
|
34
|
-
if (doNotParse) {
|
|
35
|
-
if (this._options.cacheMs && this._options.cacheMs !== 0) {
|
|
36
|
-
this._options.debug ? this._options.debug(`[request] Registered cache with id ${route}`) : 0;
|
|
37
|
-
this._cache.register(route, r.data, this._options.cacheMs);
|
|
38
|
-
}
|
|
39
|
-
return r.data;
|
|
40
|
-
}
|
|
41
|
-
const data = JSON.parse(r.data.slice(0, r.data.indexOf("}") + 1));
|
|
42
|
-
if (this._options.cacheMs && this._options.cacheMs !== 0) {
|
|
43
|
-
this._options.debug ? this._options.debug(`[request] Registered cache with id ${route}`) : 0;
|
|
44
|
-
this._cache.register(route, data, this._options.cacheMs);
|
|
45
|
-
}
|
|
46
|
-
return data;
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
EUC_KR_encodeURI(str) {
|
|
50
|
-
const buffer = iconv.encode(str, 'euc-kr');
|
|
51
|
-
return Array.from(buffer)
|
|
52
|
-
.map((byte) => '%' + byte.toString(16).toUpperCase().padStart(2, '0'))
|
|
53
|
-
.join('');
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* 파서를 초기화 합니다.
|
|
57
|
-
* @param options 파서의 옵션입니다.
|
|
58
|
-
*/
|
|
59
|
-
constructor(options) {
|
|
60
|
-
this._options = {
|
|
61
|
-
"cacheMs": 0,
|
|
62
|
-
"doNotThrow": false,
|
|
63
|
-
"appVersion": "2.11",
|
|
64
|
-
};
|
|
65
|
-
this._cache = new Cache();
|
|
66
|
-
this._options = Object.assign(Object.assign({}, this._options), options);
|
|
22
|
+
constructor(code) {
|
|
23
|
+
this.code = code;
|
|
24
|
+
this._data = [];
|
|
67
25
|
}
|
|
68
26
|
/**
|
|
69
27
|
* 학교를 검색합니다.
|
|
70
|
-
*
|
|
28
|
+
*
|
|
71
29
|
* @param query 검색어
|
|
72
|
-
* @returns
|
|
30
|
+
* @returns 검색 결과
|
|
73
31
|
*/
|
|
74
|
-
|
|
32
|
+
static search(query) {
|
|
75
33
|
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
-
const
|
|
77
|
-
|
|
34
|
+
const euckr = Array.from(iconv.encode(query, "euc-kr"))
|
|
35
|
+
.map(byte => '%' + byte.toString(16).toUpperCase().padStart(2, '0'))
|
|
36
|
+
.join('');
|
|
37
|
+
const r = yield axios.get("http://comci.net:4082/36179?17384l" + euckr);
|
|
38
|
+
const obj = JSON.parse(r.data.substring(0, r.data.lastIndexOf("}") + 1));
|
|
39
|
+
return obj.학교검색
|
|
40
|
+
.filter(v => v[3] !== 0)
|
|
41
|
+
.map(v => ({
|
|
42
|
+
"code": v[3],
|
|
78
43
|
"region": v[1],
|
|
79
|
-
"name": v[2]
|
|
80
|
-
|
|
81
|
-
|
|
44
|
+
"name": v[2]
|
|
45
|
+
}));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
_getdata(index) {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
const idx = index !== null && index !== void 0 ? index : 1;
|
|
51
|
+
if (this._data[idx])
|
|
52
|
+
return this._data[idx];
|
|
53
|
+
const route = btoa(`73629_${this.code}_0_${idx}`);
|
|
54
|
+
const r = yield axios.get(`http://comci.net:4082/36179?${route}`);
|
|
55
|
+
if (r.data.startsWith("{}"))
|
|
56
|
+
throw new ComciganError(`학교 정보를 가져오는데 실패했어요. 학교 코드가 올바른지 확인해주세요.`);
|
|
57
|
+
const obj = JSON.parse(r.data.substring(0, r.data.lastIndexOf("}") + 1));
|
|
58
|
+
this._data[idx] = obj;
|
|
82
59
|
});
|
|
83
60
|
}
|
|
84
61
|
/**
|
|
85
|
-
*
|
|
62
|
+
* 학교의 정보를 가져옵니다.
|
|
86
63
|
*
|
|
87
|
-
* @
|
|
88
|
-
* @param criteria
|
|
64
|
+
* @returns 학교의 정보
|
|
89
65
|
*/
|
|
90
|
-
|
|
66
|
+
schoolInfo() {
|
|
91
67
|
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
const { appVersion } = this._options;
|
|
95
|
-
const str = `36174_${schoolCode}_1_4_0_3_${appVersion}`;
|
|
96
|
-
const route = (str.substring(9) + str.substring(0, 9)).split("").reverse().join("");
|
|
97
|
-
const data = yield this.request(`7813?${route}`, true);
|
|
98
|
-
const [latestVersion, step1] = data.split("^");
|
|
99
|
-
const edited = step1.substring(0, step1.indexOf("{"));
|
|
100
|
-
const step2 = step1.slice(step1.indexOf("{"));
|
|
101
|
-
const json = JSON.parse(step2.slice(0, step2.indexOf("}") + 1));
|
|
102
|
-
const WEEKDAY = ["월", "화", "수", "목", "금"];
|
|
103
|
-
const sep = (_a = json.분리) !== null && _a !== void 0 ? _a : 100;
|
|
104
|
-
if (!json.시간표)
|
|
105
|
-
return undefined;
|
|
106
|
-
// 시간표[학년][반][요일][교시]
|
|
107
|
-
const origin = json.시간표[grade][classN];
|
|
108
|
-
const today = json.학급시간표[grade][classN];
|
|
109
|
-
const toReturn = [];
|
|
110
|
-
if (criteria === "period") {
|
|
111
|
-
for (let weekday = 1; weekday < WEEKDAY.length + 1; weekday++) {
|
|
112
|
-
const weekdayList = [];
|
|
113
|
-
for (let period = 1; period < (without8th ? 8 : 9); period++) {
|
|
114
|
-
const o = origin[weekday][period];
|
|
115
|
-
const t = today[weekday][period];
|
|
116
|
-
if (o === undefined || t === undefined) {
|
|
117
|
-
weekdayList.push({
|
|
118
|
-
"subject": "-",
|
|
119
|
-
"teacher": "-"
|
|
120
|
-
});
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
const originSubject = json.과목명[this.mSb(o, sep) % sep];
|
|
124
|
-
const originTeacher = json.성명[this.mTh(o, sep) % sep];
|
|
125
|
-
if (o === t) {
|
|
126
|
-
weekdayList.push({
|
|
127
|
-
"subject": (_b = this.unusable(originSubject, json.과목명)) !== null && _b !== void 0 ? _b : "-",
|
|
128
|
-
"teacher": (_c = this.unusable(originTeacher, json.성명)) !== null && _c !== void 0 ? _c : "-"
|
|
129
|
-
});
|
|
130
|
-
continue;
|
|
131
|
-
}
|
|
132
|
-
const changedSubject = json.과목명[this.mSb(t, sep) % sep];
|
|
133
|
-
const changedTeacher = json.성명[this.mTh(t, sep) % sep];
|
|
134
|
-
weekdayList.push({
|
|
135
|
-
"subject": (_d = this.unusable(changedSubject, json.과목명)) !== null && _d !== void 0 ? _d : "-",
|
|
136
|
-
"teacher": (_e = this.unusable(changedTeacher, json.성명)) !== null && _e !== void 0 ? _e : "-",
|
|
137
|
-
"original": {
|
|
138
|
-
"subject": (_f = this.unusable(originSubject, json.과목명)) !== null && _f !== void 0 ? _f : "-",
|
|
139
|
-
"teacher": (_g = this.unusable(originTeacher, json.성명)) !== null && _g !== void 0 ? _g : "-",
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
toReturn.push(weekdayList);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
for (let period = 1; period < (without8th ? 8 : 9); period++) {
|
|
148
|
-
const periodList = [];
|
|
149
|
-
for (let weekday = 1; weekday < WEEKDAY.length + 1; weekday++) {
|
|
150
|
-
const o = origin[weekday][period];
|
|
151
|
-
const t = today[weekday][period];
|
|
152
|
-
if (!o || !t) {
|
|
153
|
-
periodList.push({
|
|
154
|
-
"subject": "-",
|
|
155
|
-
"teacher": "-"
|
|
156
|
-
});
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
const originSubject = json.과목명[this.mSb(o, sep) % sep];
|
|
160
|
-
const originTeacher = json.성명[this.mTh(o, sep) % sep];
|
|
161
|
-
if (o === t) {
|
|
162
|
-
periodList.push({
|
|
163
|
-
"subject": originSubject,
|
|
164
|
-
"teacher": originTeacher
|
|
165
|
-
});
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
const changedSubject = json.과목명[this.mSb(t, sep) % sep];
|
|
169
|
-
const changedTeacher = json.성명[this.mTh(t, sep) % sep];
|
|
170
|
-
periodList.push({
|
|
171
|
-
"subject": originSubject,
|
|
172
|
-
"teacher": originTeacher,
|
|
173
|
-
"original": {
|
|
174
|
-
"subject": changedSubject,
|
|
175
|
-
"teacher": changedTeacher
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
toReturn.push(periodList);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
68
|
+
yield this._getdata();
|
|
69
|
+
const data = this._data[1];
|
|
182
70
|
return {
|
|
183
|
-
"
|
|
184
|
-
|
|
185
|
-
"
|
|
71
|
+
"changedAt": dayjs(data.자료244, "YYYY-MM-DD HH:mm:ss").toDate(),
|
|
72
|
+
"classes": data.학급수.slice(1),
|
|
73
|
+
"times": data.일과시간.map(v => ({
|
|
74
|
+
"number": Number(v.slice(0, 1)),
|
|
75
|
+
"start": v.slice(2, 7),
|
|
76
|
+
})),
|
|
77
|
+
"code": this.code
|
|
186
78
|
};
|
|
187
79
|
});
|
|
188
80
|
}
|
|
189
81
|
/**
|
|
190
|
-
*
|
|
82
|
+
* 시간표를 조회합니다.
|
|
191
83
|
*
|
|
192
|
-
* @param
|
|
193
|
-
* @returns
|
|
84
|
+
* @param options 시간표 옵션
|
|
85
|
+
* @returns 시간표
|
|
194
86
|
*/
|
|
195
|
-
|
|
87
|
+
timetable(options) {
|
|
196
88
|
return __awaiter(this, void 0, void 0, function* () {
|
|
197
|
-
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
const
|
|
203
|
-
const rawClasses = json.학급수;
|
|
204
|
-
if (!rawClasses)
|
|
205
|
-
return [];
|
|
89
|
+
var _a, _b, _c, _d;
|
|
90
|
+
const { grade, classNum, week } = options;
|
|
91
|
+
if (!grade || !classNum)
|
|
92
|
+
throw new ComciganError("학년 (grade), 반 (classNum)을 제공해주세요.");
|
|
93
|
+
yield this._getdata(week);
|
|
94
|
+
const data = this._data[week !== null && week !== void 0 ? week : 1];
|
|
206
95
|
const toReturn = [];
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
96
|
+
// 자료481: 현재 데이터
|
|
97
|
+
// 자료147: 원본 데이터
|
|
98
|
+
// 자료446: 선생님
|
|
99
|
+
// 자료492: 과목
|
|
100
|
+
for (let day = 1; day <= 5; day++) {
|
|
101
|
+
const dayItems = [];
|
|
102
|
+
for (let time = 1; time <= 8; time++) {
|
|
103
|
+
const now = splitData(data.자료481[grade][classNum][day][time]);
|
|
104
|
+
if (now === -1)
|
|
105
|
+
continue;
|
|
106
|
+
const subject = data.자료492[now[1]];
|
|
107
|
+
const teacher = data.자료446[now[0]];
|
|
108
|
+
const classRoom = data.자료245[grade][classNum][day][time];
|
|
109
|
+
const classRoomAvailable = classRoom !== undefined && classRoom !== "";
|
|
110
|
+
const origin = splitData((_d = (_c = (_b = (_a = data.자료147) === null || _a === void 0 ? void 0 : _a[grade]) === null || _b === void 0 ? void 0 : _b[classNum]) === null || _c === void 0 ? void 0 : _c[day]) === null || _d === void 0 ? void 0 : _d[time]);
|
|
111
|
+
if (origin !== -1) {
|
|
112
|
+
const newSubject = data.자료492[origin[1]];
|
|
113
|
+
const newTeacher = data.자료446[origin[0]];
|
|
114
|
+
dayItems.push({
|
|
115
|
+
subject,
|
|
116
|
+
teacher,
|
|
117
|
+
"classRoom": classRoomAvailable ? classRoom.split("_")[1] : undefined,
|
|
118
|
+
"original": newSubject === subject && newTeacher === teacher ? undefined : {
|
|
119
|
+
"subject": newSubject,
|
|
120
|
+
"teacher": newTeacher
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
dayItems.push({
|
|
126
|
+
subject,
|
|
127
|
+
teacher,
|
|
128
|
+
"classRoom": classRoomAvailable ? classRoom : undefined
|
|
129
|
+
});
|
|
210
130
|
}
|
|
131
|
+
toReturn[day - 1] = {
|
|
132
|
+
"total": dayItems.length,
|
|
133
|
+
"items": dayItems
|
|
134
|
+
};
|
|
211
135
|
}
|
|
212
136
|
return toReturn;
|
|
213
137
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "parse-comcigan",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "컴시간 알리미에서 시간표를 가져오는 라이브러리입니다.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -12,17 +12,18 @@
|
|
|
12
12
|
"build": "tsc",
|
|
13
13
|
"clean": "tsc --build --clean",
|
|
14
14
|
"dev": "nodemon --exec ts-node src/index.ts",
|
|
15
|
-
"
|
|
16
|
-
"
|
|
15
|
+
"watch": "tsc --watch",
|
|
16
|
+
"test": "npm run pack && node \"test.js\""
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@types/node": "^22.
|
|
20
|
-
"nodemon": "^3.1.
|
|
19
|
+
"@types/node": "^22.19.20",
|
|
20
|
+
"nodemon": "^3.1.14",
|
|
21
21
|
"ts-node": "^10.9.2",
|
|
22
|
-
"typescript": "^5.
|
|
22
|
+
"typescript": "^5.9.3"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"axios": "^1.
|
|
25
|
+
"axios": "^1.17.0",
|
|
26
|
+
"dayjs": "^1.11.21",
|
|
26
27
|
"iconv-lite": "^0.6.3"
|
|
27
28
|
},
|
|
28
29
|
"repository": {
|
package/test.ts
ADDED
package/tsconfig.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
|
-
"outDir": "dist",
|
|
3
|
+
"outDir": "./dist",
|
|
4
|
+
"rootDir": "./src",
|
|
4
5
|
"target": "ES6",
|
|
5
|
-
"module": "ESNext",
|
|
6
6
|
"lib": [
|
|
7
7
|
"ES6",
|
|
8
8
|
"DOM"
|
|
9
9
|
],
|
|
10
|
-
"moduleResolution": "
|
|
10
|
+
"moduleResolution": "node16",
|
|
11
|
+
"module": "node16",
|
|
11
12
|
"esModuleInterop": true,
|
|
12
13
|
"declaration": true,
|
|
13
14
|
"strict": true,
|
package/dist/cache.d.ts
DELETED
package/dist/cache.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export default class Cache {
|
|
2
|
-
constructor() {
|
|
3
|
-
this._cacheStorage = {};
|
|
4
|
-
}
|
|
5
|
-
register(id, data, duration) {
|
|
6
|
-
this._cacheStorage[id] = {
|
|
7
|
-
"timeout": setTimeout(() => {
|
|
8
|
-
delete this._cacheStorage[id];
|
|
9
|
-
}, duration),
|
|
10
|
-
"data": data
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
delete(id) {
|
|
14
|
-
clearTimeout(this._cacheStorage[id].timeout);
|
|
15
|
-
delete this._cacheStorage[id];
|
|
16
|
-
}
|
|
17
|
-
clear() {
|
|
18
|
-
const caches = Object.keys(this._cacheStorage);
|
|
19
|
-
for (let cache of caches) {
|
|
20
|
-
clearTimeout(this._cacheStorage[cache].timeout);
|
|
21
|
-
delete this._cacheStorage[cache];
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
has(id) {
|
|
25
|
-
return Boolean(this._cacheStorage[id]);
|
|
26
|
-
}
|
|
27
|
-
get(id) {
|
|
28
|
-
var _a;
|
|
29
|
-
return (_a = this._cacheStorage[id]) === null || _a === void 0 ? void 0 : _a.data;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=cache.js.map
|
package/dist/cache.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,KAAK;IAA1B;QACY,kBAAa,GAGhB,EAAE,CAAC;IA2BZ,CAAC;IAzBU,QAAQ,CAAC,EAAU,EAAE,IAAS,EAAE,QAAgB;QACnD,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG;YACrB,SAAS,EAAE,UAAU,CAAC,GAAG,EAAE;gBACvB,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAClC,CAAC,EAAE,QAAQ,CAAC;YACZ,MAAM,EAAE,IAAI;SACf,CAAC;IACN,CAAC;IACM,MAAM,CAAC,EAAU;QACpB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IACM,KAAK;QACR,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;IACM,GAAG,CAAC,EAAU;QACjB,OAAO,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IACM,GAAG,CAAC,EAAU;;QACjB,OAAO,MAAA,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,0CAAE,IAAI,CAAC;IACxC,CAAC;CACJ"}
|
package/src/cache.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export default class Cache {
|
|
2
|
-
private _cacheStorage: Collection<{
|
|
3
|
-
"timeout": NodeJS.Timeout;
|
|
4
|
-
"data": any;
|
|
5
|
-
}> = {};
|
|
6
|
-
|
|
7
|
-
public register(id: string, data: any, duration: number) {
|
|
8
|
-
this._cacheStorage[id] = {
|
|
9
|
-
"timeout": setTimeout(() => {
|
|
10
|
-
delete this._cacheStorage[id];
|
|
11
|
-
}, duration),
|
|
12
|
-
"data": data
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
public delete(id: string) {
|
|
16
|
-
clearTimeout(this._cacheStorage[id].timeout);
|
|
17
|
-
delete this._cacheStorage[id];
|
|
18
|
-
}
|
|
19
|
-
public clear() {
|
|
20
|
-
const caches = Object.keys(this._cacheStorage);
|
|
21
|
-
for (let cache of caches) {
|
|
22
|
-
clearTimeout(this._cacheStorage[cache].timeout);
|
|
23
|
-
delete this._cacheStorage[cache];
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
public has(id: string) {
|
|
27
|
-
return Boolean(this._cacheStorage[id]);
|
|
28
|
-
}
|
|
29
|
-
public get(id: string) {
|
|
30
|
-
return this._cacheStorage[id]?.data;
|
|
31
|
-
}
|
|
32
|
-
}
|