aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* Makefile, main.go: Add vendor dependencies to srcFSRunxi Yu2024-10-062-2/+5
|
* .gitignore: Ignore vendorRunxi Yu2024-10-061-0/+1
|
* .gitignore: Only ignore dist/build in rootv0.1.5Runxi Yu2024-10-061-2/+2
|
* docs/.gitignore: Delete because emptyRunxi Yu2024-10-061-0/+0
|
* wsm.go: Check course group constraint first when choosingRunxi Yu2024-10-061-13/+15
|
* {courses,wsc,wsm,wsp}.go: Send course number immediately on user interactionRunxi Yu2024-10-064-14/+42
|
* main.go: Don't embed LaTeX aux/log/etc files for iadocsRunxi Yu2024-10-061-2/+2
|
* main.go: Reorder startup eventsRunxi Yu2024-10-061-16/+16
|
* Makefile, main.go: Add go.* to the served sourcesRunxi Yu2024-10-062-2/+2
|
* bench.go: Use deadlock instead of timed exitRunxi Yu2024-10-061-10/+7
|
* bench: Fix timerRunxi Yu2024-10-061-2/+2
|
* *: Overhaul structure again and embed everythingRunxi Yu2024-10-0632-151/+144
| | | | | | | | - Remove sub-Makefiles; recursive make is annoying - Just use one top-level Makefile that builds everything - Embed templates and minified static resources into the binary - Embed all compiled documentation into the binary and serve - Embed all source into the binary and serve
* Makefile: Add tmpl to .PHONYv0.1.4Runxi Yu2024-10-051-1/+1
| | | | Otherwise templates won't be copied
* */Makefile: Update againRunxi Yu2024-10-056-14/+45
|
* *: Further restructuringRunxi Yu2024-10-0511-7/+66
|
* *.go: Move to backendRunxi Yu2024-10-0518-2/+4
| | | | And adjust Makefiles, admin handbook, and lint.sh accordingly.
* iadocs: Update IA documentationRunxi Yu2024-10-0510-44/+279
|
* docs: max-width: 50rem;Runxi Yu2024-10-051-1/+1
|
* docs/admin: Document database setupRunxi Yu2024-10-051-1/+10
|
* docs/admin: Update protocol informationRunxi Yu2024-10-051-3/+2
|
* iadocs: Cover page updateRunxi Yu2024-10-051-5/+5
|
* {,u}sem.go, ws*.go: Restructure filesRunxi Yu2024-10-055-235/+319
|
* {config,main}.go: Enhance configuration file processingRunxi Yu2024-10-052-8/+124
| | | | Implements: https://todo.sr.ht/~runxiyu/cca/5
* bench.go: ReformatRunxi Yu2024-10-051-2/+2
|
* bench.go: Separate connection stage from selection stagev0.1.3Runxi Yu2024-10-051-2/+10
|
* bench.go: More realistic benchmark for one course onlyRunxi Yu2024-10-051-9/+18
|
* Makefile: BSD Make also supports wildcards in targetsRunxi Yu2024-10-051-1/+1
|
* Makefile: Add sem.go to source file listRunxi Yu2024-10-051-1/+1
|
* {config,ws}.go, cca.scfg.example: Add perf.course_update_intervalRunxi Yu2024-10-053-6/+14
| | | | | | This causes a drastic increase in performance. References: https://todo.sr.ht/~runxiyu/cca/7
* {courses,wsm}.go: Use in-memory structure to fetch cgroup, not SQLRunxi Yu2024-10-052-26/+18
|
* {config,ws}.go, cca.scfg.example: Remove chanPool/SendQRunxi Yu2024-10-053-59/+0
|
* ws.go: &usemT{} //exhaustruct:ignoreRunxi Yu2024-10-051-1/+1
|
* ws.go: Check error of populateUserCourseGroupsRunxi Yu2024-10-051-1/+4
|
* wsm.go: Omit comparison to bool constantRunxi Yu2024-10-051-1/+1
|
* wsm.go: Report error when course doesn't existRunxi Yu2024-10-051-0/+8
| | | | | Luckily we encounter a database error before we have the chance to dereference a null pointer. But it's still good practice to check.
* {courses,sem,ws,wsm}.go: Second step towards an efficient state propagatorRunxi Yu2024-10-054-16/+24
| | | | References: https://todo.sr.ht/~runxiyu/cca/7
* {courses,sem,ws}.go: First step towards an efficient state propagatorRunxi Yu2024-10-053-6/+110
| | | | References: https://todo.sr.ht/~runxiyu/cca/7
* go.sum: go mod tidy (removing old checksums)Runxi Yu2024-10-051-6/+0
|
* ws.go: Index chanPool by userID, rather than session cookieRunxi Yu2024-10-051-5/+2
|
* {main,utils,ws}.go: Initialize cancelPool directly tooRunxi Yu2024-10-053-25/+1
|
* Bump dependenciesRunxi Yu2024-10-052-3/+9
|
* {main,ws}.go: Initialize chanPool directly instead of setupChanPool()Runxi Yu2024-10-052-22/+1
| | | | | | It is possible to use var chanPool = make(map[string](*chan string)) directly during declaration, even if it's a global variable. There is no need to call a function to initialize it.
* courses.go: ReformatRunxi Yu2024-10-051-1/+1
|
* {courses,wsm}.go: Add getCourseByIDRunxi Yu2024-10-052-10/+8
| | | | This also deduplicates some code.
* {courses,wsm}.go: Add (*courseT).decrementSelectedAndPropagateRunxi Yu2024-10-052-24/+15
| | | | This is being done quite a few times, so let's make it a function.
* {courses,ws,wsm}.go: Update userCourseGroups during choose/unchooseRunxi Yu2024-10-053-12/+51
|
* config.go: Emit warning when fake auth is enabledRunxi Yu2024-10-051-0/+2
|
* bench.go: Don't close request bodyRunxi Yu2024-10-051-6/+0
| | | | | | The WebSocket library closes it for us (which is not behavior that I like, but fine). Closing it again causes segmentation faults as Body becomes a null pointer or something like that.
* {courses,ws}.go: Populate userCourseGroups in a separate functionRunxi Yu2024-10-052-32/+35
|
* {courses,ws}.go: Populate userCourseGroups for each connectionRunxi Yu2024-10-042-5/+63
| | | | | | | | | | | | | | | | | | It is way too expensive to query the database every time we need to check whether a user has chosen a course in a group. Since we can (hopefully) guarantee that there is only one usable connection for any given moment and user, we could store this data along with the connection as a local variable in handleConn, which would be eligible for garbage collection when handleConn exits. Here we create the data structures that globally represent courseTypes and courseGroups, and during the initial stages of handleConn, perform database queries to populate userCourseGroups with the groups that the user has already chosen. Note that the HELLO command handler does similar database queries, and as per the TODO listed in the comments, should be moved up here for efficiency. (HELLO also serves as some sort of an initial connection check; this should probably be replaced with WebSocket's native pings.)