@moxon/api 6.0.0-pre → 6.2.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 +44 -19
- package/dist/app.js +9 -4
- package/dist/app.js.map +1 -1
- package/dist/constants.d.ts +22 -0
- package/dist/constants.js +22 -0
- package/dist/constants.js.map +1 -1
- package/dist/endpoints/define.d.ts +30 -0
- package/dist/endpoints/define.js +14 -0
- package/dist/endpoints/define.js.map +1 -0
- package/dist/endpoints/hash.d.ts +2 -0
- package/dist/endpoints/hash.js +16 -0
- package/dist/endpoints/hash.js.map +1 -0
- package/dist/endpoints/index.d.ts +2 -0
- package/dist/endpoints/index.js +4 -0
- package/dist/endpoints/index.js.map +1 -0
- package/dist/endpoints/router.d.ts +10 -0
- package/dist/endpoints/router.js +50 -0
- package/dist/endpoints/router.js.map +1 -0
- package/dist/manifest.d.ts +11 -0
- package/dist/manifest.js +12 -0
- package/dist/manifest.js.map +1 -0
- package/dist/middleware/cors.d.ts +15 -0
- package/dist/middleware/cors.js +25 -7
- package/dist/middleware/cors.js.map +1 -1
- package/dist/middleware/ratelimit.d.ts +53 -1
- package/dist/middleware/ratelimit.js +180 -71
- package/dist/middleware/ratelimit.js.map +1 -1
- package/dist/modules/v4/barcode.d.ts +1 -1
- package/dist/modules/v4/barcode.js +9 -2
- package/dist/modules/v4/barcode.js.map +1 -1
- package/dist/modules/v4/captcha.d.ts +1 -1
- package/dist/modules/v4/captcha.js +5 -1
- package/dist/modules/v4/captcha.js.map +1 -1
- package/dist/modules/v4/chat.js +61 -12
- package/dist/modules/v4/chat.js.map +1 -1
- package/dist/modules/v4/cron.js +20 -2
- package/dist/modules/v4/cron.js.map +1 -1
- package/dist/modules/v4/hyperplanning.d.ts +11 -0
- package/dist/modules/v4/hyperplanning.js +30 -29
- package/dist/modules/v4/hyperplanning.js.map +1 -1
- package/dist/modules/v4/qrcode.d.ts +10 -0
- package/dist/modules/v4/qrcode.js +138 -14
- package/dist/modules/v4/qrcode.js.map +1 -1
- package/dist/modules/v4/regex.d.ts +1 -1
- package/dist/modules/v4/regex.js +67 -22
- package/dist/modules/v4/regex.js.map +1 -1
- package/dist/modules/v4/tic_tac_toe.js +56 -15
- package/dist/modules/v4/tic_tac_toe.js.map +1 -1
- package/dist/modules/v5/asymmetric.d.ts +15 -0
- package/dist/modules/v5/asymmetric.js +67 -5
- package/dist/modules/v5/asymmetric.js.map +1 -1
- package/dist/modules/v5/barcode.d.ts +1 -1
- package/dist/modules/v5/barcode.js +9 -2
- package/dist/modules/v5/barcode.js.map +1 -1
- package/dist/modules/v5/captcha.d.ts +12 -4
- package/dist/modules/v5/captcha.js +25 -8
- package/dist/modules/v5/captcha.js.map +1 -1
- package/dist/modules/v5/chat.js +66 -17
- package/dist/modules/v5/chat.js.map +1 -1
- package/dist/modules/v5/cron.d.ts +26 -0
- package/dist/modules/v5/cron.js +356 -0
- package/dist/modules/v5/cron.js.map +1 -0
- package/dist/modules/v5/pow.js +1 -1
- package/dist/modules/v5/pow.js.map +1 -1
- package/dist/modules/v5/tic_tac_toe.js +61 -20
- package/dist/modules/v5/tic_tac_toe.js.map +1 -1
- package/dist/modules/v5.d.ts +3 -2
- package/dist/modules/v5.js +3 -2
- package/dist/modules/v5.js.map +1 -1
- package/dist/routes/delete.js +0 -8
- package/dist/routes/delete.js.map +1 -1
- package/dist/routes/get.js +0 -2
- package/dist/routes/get.js.map +1 -1
- package/dist/routes/patch.js +0 -4
- package/dist/routes/patch.js.map +1 -1
- package/dist/routes/post.js +12 -25
- package/dist/routes/post.js.map +1 -1
- package/dist/storage/index.js +9 -8
- package/dist/storage/index.js.map +1 -1
- package/dist/types/storage.d.ts +4 -0
- package/dist/utils/challenge.d.ts +5 -3
- package/dist/utils/challenge.js +52 -6
- package/dist/utils/challenge.js.map +1 -1
- package/dist/utils/helpers.d.ts +18 -0
- package/dist/utils/helpers.js +35 -1
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/remote.d.ts +42 -0
- package/dist/utils/remote.js +313 -0
- package/dist/utils/remote.js.map +1 -0
- package/package.json +28 -8
- package/src/favicon.ico +0 -0
package/dist/modules/v4/chat.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SESSION_TTL } from '../../constants.js';
|
|
2
|
-
import { checkRateLimit } from '../../utils/helpers.js';
|
|
1
|
+
import { MAX_CHAT_MESSAGES, MAX_ID_LENGTH, MAX_PRIVATE_CHATS, MAX_STRING_LENGTH, MAX_USERNAME_LENGTH, SESSION_TTL, } from '../../constants.js';
|
|
2
|
+
import { checkRateLimit, checkString, isTimestamp } from '../../utils/helpers.js';
|
|
3
3
|
/**
|
|
4
4
|
* Handles real-time chat actions including sending, fetching, and clearing messages.
|
|
5
5
|
*
|
|
@@ -17,6 +17,11 @@ export default function chat(action, params) {
|
|
|
17
17
|
const { messages, privateChats, sessions, rateLimits } = storage;
|
|
18
18
|
if (!params.username)
|
|
19
19
|
throw new Error('Please provide a username');
|
|
20
|
+
// Readers are keyed by their IP, which can be longer than a chat username
|
|
21
|
+
checkString(params.username, 'username', action === 'fetch' ? MAX_STRING_LENGTH : MAX_USERNAME_LENGTH);
|
|
22
|
+
checkString(params.message, 'message', MAX_STRING_LENGTH);
|
|
23
|
+
checkString(params.session, 'session ID', MAX_ID_LENGTH);
|
|
24
|
+
checkString(params.token, 'token', MAX_ID_LENGTH);
|
|
20
25
|
const u = params.username.toLowerCase();
|
|
21
26
|
const now = Date.now();
|
|
22
27
|
checkRateLimit(rateLimits, u, now);
|
|
@@ -36,44 +41,78 @@ export default function chat(action, params) {
|
|
|
36
41
|
throw new Error('Invalid action. Use "message", "private", "fetch", or "clear"');
|
|
37
42
|
}
|
|
38
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Stores a message in the public room or in the private thread of its token.
|
|
46
|
+
*
|
|
47
|
+
* @param params - Chat parameters holding the message, session and optional private token
|
|
48
|
+
* @param messages - Public room, trimmed to its newest MAX_CHAT_MESSAGES entries
|
|
49
|
+
* @param privateChats - Private threads keyed by token, each trimmed the same way
|
|
50
|
+
* @param sessions - Session bound to each lowercased username
|
|
51
|
+
* @param u - Lowercased username
|
|
52
|
+
* @param now - Current timestamp in milliseconds
|
|
53
|
+
* @returns Confirmation message
|
|
54
|
+
* @throws Error if the message or session is missing, the session does not match, or too many private chats exist
|
|
55
|
+
*/
|
|
39
56
|
function sendMessage(params, messages, privateChats, sessions, u, now) {
|
|
40
57
|
const { message, session, token } = params;
|
|
41
58
|
if (!message)
|
|
42
59
|
throw new Error('Please provide a message');
|
|
43
60
|
if (!session)
|
|
44
61
|
throw new Error('Please provide a valid session ID');
|
|
45
|
-
if (sessions
|
|
62
|
+
if (Object.hasOwn(sessions, u) && sessions[u].user !== session) {
|
|
46
63
|
throw new Error('Session ID mismatch');
|
|
47
64
|
}
|
|
48
65
|
const msg = {
|
|
49
66
|
username: params.username,
|
|
50
67
|
message,
|
|
51
|
-
timestamp: params.timestamp
|
|
68
|
+
timestamp: params.timestamp && isTimestamp(params.timestamp) ? params.timestamp : new Date().toISOString(),
|
|
52
69
|
};
|
|
53
70
|
if (token) {
|
|
54
|
-
privateChats
|
|
55
|
-
|
|
71
|
+
if (!Object.hasOwn(privateChats, token)) {
|
|
72
|
+
if (Object.keys(privateChats).length >= MAX_PRIVATE_CHATS)
|
|
73
|
+
throw new Error('Too many active private chats');
|
|
74
|
+
privateChats[token] = [];
|
|
75
|
+
}
|
|
76
|
+
const thread = privateChats[token];
|
|
77
|
+
thread.push(msg);
|
|
78
|
+
if (thread.length > MAX_CHAT_MESSAGES)
|
|
79
|
+
thread.splice(0, thread.length - MAX_CHAT_MESSAGES);
|
|
56
80
|
setTimeout(() => {
|
|
57
81
|
delete privateChats[token];
|
|
58
82
|
}, SESSION_TTL).unref();
|
|
59
83
|
}
|
|
60
84
|
else {
|
|
61
85
|
messages.push(msg);
|
|
62
|
-
|
|
86
|
+
if (messages.length > MAX_CHAT_MESSAGES)
|
|
87
|
+
messages.splice(0, messages.length - MAX_CHAT_MESSAGES);
|
|
88
|
+
setTimeout(() => {
|
|
89
|
+
const idx = messages.indexOf(msg);
|
|
90
|
+
if (idx !== -1)
|
|
91
|
+
messages.splice(idx, 1);
|
|
92
|
+
}, SESSION_TTL).unref();
|
|
63
93
|
}
|
|
64
|
-
|
|
94
|
+
if (!Object.hasOwn(sessions, u))
|
|
95
|
+
sessions[u] = { user: session, last: now };
|
|
65
96
|
sessions[u].last = now;
|
|
66
97
|
setTimeout(() => {
|
|
67
|
-
if (sessions
|
|
98
|
+
if (Object.hasOwn(sessions, u) && now - sessions[u].last >= SESSION_TTL)
|
|
68
99
|
delete sessions[u];
|
|
69
100
|
}, SESSION_TTL).unref();
|
|
70
101
|
return { message: 'Message sent successfully' };
|
|
71
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Returns the messages of a private thread.
|
|
105
|
+
*
|
|
106
|
+
* @param params - Chat parameters holding the private token
|
|
107
|
+
* @param privateChats - Private threads keyed by token
|
|
108
|
+
* @returns Messages of the thread, oldest first
|
|
109
|
+
* @throws Error if the token is missing or no thread exists for it
|
|
110
|
+
*/
|
|
72
111
|
function getPrivateChat(params, privateChats) {
|
|
73
112
|
const { token } = params;
|
|
74
113
|
if (!token)
|
|
75
114
|
throw new Error('Please provide a valid token');
|
|
76
|
-
if (privateChats
|
|
115
|
+
if (Object.hasOwn(privateChats, token))
|
|
77
116
|
return privateChats[token];
|
|
78
117
|
throw new Error('Invalid or expired token.');
|
|
79
118
|
}
|
|
@@ -82,16 +121,26 @@ function fetchMessages(messages) {
|
|
|
82
121
|
return messages;
|
|
83
122
|
throw new Error('No messages stored.');
|
|
84
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Deletes a private thread and the session of the user clearing it.
|
|
126
|
+
*
|
|
127
|
+
* @param params - Chat parameters holding the private token and session
|
|
128
|
+
* @param privateChats - Private threads keyed by token
|
|
129
|
+
* @param sessions - Session bound to each lowercased username
|
|
130
|
+
* @param u - Lowercased username
|
|
131
|
+
* @returns Confirmation message
|
|
132
|
+
* @throws Error if the token or session is missing, the session does not match, or no thread exists for the token
|
|
133
|
+
*/
|
|
85
134
|
function clearPrivateChat(params, privateChats, sessions, u) {
|
|
86
135
|
const { token, session } = params;
|
|
87
136
|
if (!token)
|
|
88
137
|
throw new Error('Please provide a valid token');
|
|
89
138
|
if (!session)
|
|
90
139
|
throw new Error('Please provide a valid session ID');
|
|
91
|
-
if (sessions
|
|
140
|
+
if (Object.hasOwn(sessions, u) && sessions[u].user !== session) {
|
|
92
141
|
throw new Error('Session ID mismatch');
|
|
93
142
|
}
|
|
94
|
-
if (!privateChats
|
|
143
|
+
if (!Object.hasOwn(privateChats, token))
|
|
95
144
|
throw new Error('Invalid or expired token.');
|
|
96
145
|
delete privateChats[token];
|
|
97
146
|
delete sessions[u];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/modules/v4/chat.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/modules/v4/chat.ts"],"names":[],"mappings":"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"}
|
package/dist/modules/v4/cron.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { MAX_CRON_ITERATIONS, MAX_CRON_RESULTS } from '../../constants.js';
|
|
1
|
+
import { MAX_CRON_DURATION_V4, MAX_CRON_ITERATIONS, MAX_CRON_RESULTS } from '../../constants.js';
|
|
2
|
+
import { cronSearch } from '../v5/cron.js';
|
|
2
3
|
import { VALID_TIMEZONES } from './time.js';
|
|
3
4
|
const FIELD_RANGES = [
|
|
4
5
|
{ min: 0, max: 59 }, // minute
|
|
@@ -158,6 +159,10 @@ export default function cron(expr, count = 5, from, timezone = 'UTC') {
|
|
|
158
159
|
dowSet.add(0);
|
|
159
160
|
dowSet.delete(7);
|
|
160
161
|
}
|
|
162
|
+
// v5 knows the last date, so the scan stops a minute past it (old offsets have seconds) instead of spinning
|
|
163
|
+
const exact = cronSearch(expr, count, from, timezone);
|
|
164
|
+
const last = exact.result.next.at(-1);
|
|
165
|
+
const horizon = !exact.complete ? Infinity : last ? Date.parse(last) + 60000 : -Infinity;
|
|
161
166
|
const formatter = new Intl.DateTimeFormat('en-US', {
|
|
162
167
|
timeZone: timezone,
|
|
163
168
|
month: 'numeric',
|
|
@@ -168,9 +173,15 @@ export default function cron(expr, count = 5, from, timezone = 'UTC') {
|
|
|
168
173
|
hour12: false,
|
|
169
174
|
});
|
|
170
175
|
let currentMs = (Math.floor(fromMs / 60000) + 1) * 60000;
|
|
176
|
+
// The wall-clock budget only applies when v5 could not settle the search, so results do not depend on load
|
|
177
|
+
const settled = exact.complete || exact.result.next.length >= count;
|
|
171
178
|
const next = [];
|
|
179
|
+
const deadline = settled ? Infinity : Date.now() + MAX_CRON_DURATION_V4;
|
|
180
|
+
let loopMs = NaN;
|
|
181
|
+
let loopHits = 0;
|
|
172
182
|
let iterations = 0;
|
|
173
|
-
|
|
183
|
+
// The horizon and the replay check end every known endless search before the iteration cap
|
|
184
|
+
while (next.length < count && iterations < MAX_CRON_ITERATIONS && Date.now() < deadline && currentMs < horizon) {
|
|
174
185
|
const { minute, hour, dom, month, dow } = getComponents(new Date(currentMs), formatter);
|
|
175
186
|
if (!monthSet.has(month)) {
|
|
176
187
|
const d = new Date(currentMs);
|
|
@@ -180,6 +191,13 @@ export default function cron(expr, count = 5, from, timezone = 'UTC') {
|
|
|
180
191
|
while (getComponents(d, formatter).month === month) {
|
|
181
192
|
d.setTime(d.getTime() + 3600000);
|
|
182
193
|
}
|
|
194
|
+
// In UTC+ zones the jump can land back before the current instant, replaying the same span forever
|
|
195
|
+
if (d.getTime() <= currentMs) {
|
|
196
|
+
if (currentMs === loopMs && next.length === loopHits)
|
|
197
|
+
break;
|
|
198
|
+
loopMs = currentMs;
|
|
199
|
+
loopHits = next.length;
|
|
200
|
+
}
|
|
183
201
|
currentMs = d.getTime();
|
|
184
202
|
}
|
|
185
203
|
else if (!domSet.has(dom) || !dowSet.has(dow)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../../src/modules/v4/cron.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../../src/modules/v4/cron.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type RemoteFetcher } from '../../utils/remote.js';
|
|
1
2
|
interface CalendarEvent {
|
|
2
3
|
summary: string[] | string;
|
|
3
4
|
subject?: string;
|
|
@@ -16,4 +17,14 @@ interface CalendarEvent {
|
|
|
16
17
|
* @throws Error if the URL is invalid, uses HTTP, points to a private host, or does not return a valid ICS file
|
|
17
18
|
*/
|
|
18
19
|
export default function hyperplanning(url: string, detail?: string): Promise<CalendarEvent[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Same as hyperplanning, with the remote fetch implementation passed in so tests can replace it.
|
|
22
|
+
*
|
|
23
|
+
* @param url - HTTPS URL to the ICS calendar
|
|
24
|
+
* @param detail - Level of detail: "full" (subject/teacher/classes), "list" (summary/times), or default (summary only)
|
|
25
|
+
* @param fetcher - Remote fetch implementation, fetchRemote in production
|
|
26
|
+
* @returns Array of calendar events sorted by start time, excluding past events
|
|
27
|
+
* @throws Error if the URL is invalid or internal, the file is too large or has too many events, or is not an ICS file
|
|
28
|
+
*/
|
|
29
|
+
export declare function fetchCalendar(url: string, detail: string | undefined, fetcher: RemoteFetcher): Promise<CalendarEvent[]>;
|
|
19
30
|
export {};
|
|
@@ -1,24 +1,7 @@
|
|
|
1
1
|
import ical from 'ical.js';
|
|
2
|
+
import { ICS_FETCH_TIMEOUT, MAX_ICS_BYTES, MAX_ICS_EVENTS } from '../../constants.js';
|
|
2
3
|
import { formatDate } from '../../utils/helpers.js';
|
|
3
|
-
|
|
4
|
-
const list = ['localhost', '127.0.0.1', '0.0.0.0', '[::1]', 'metadata.google.internal'];
|
|
5
|
-
if (list.includes(hostname))
|
|
6
|
-
return true;
|
|
7
|
-
const parts = hostname.split('.').map(Number);
|
|
8
|
-
if (parts.length === 4 && parts.every((n) => !isNaN(n))) {
|
|
9
|
-
if (parts[0] === 10)
|
|
10
|
-
return true;
|
|
11
|
-
if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31)
|
|
12
|
-
return true;
|
|
13
|
-
if (parts[0] === 192 && parts[1] === 168)
|
|
14
|
-
return true;
|
|
15
|
-
if (parts[0] === 169 && parts[1] === 254)
|
|
16
|
-
return true;
|
|
17
|
-
if (parts[0] === 0)
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
4
|
+
import { fetchRemote } from '../../utils/remote.js';
|
|
22
5
|
/**
|
|
23
6
|
* Fetches and parses an ICS calendar from a Hyperplanning URL, filtering out past events.
|
|
24
7
|
*
|
|
@@ -27,7 +10,19 @@ function blocked(hostname) {
|
|
|
27
10
|
* @returns Array of calendar events sorted by start time, excluding past events
|
|
28
11
|
* @throws Error if the URL is invalid, uses HTTP, points to a private host, or does not return a valid ICS file
|
|
29
12
|
*/
|
|
30
|
-
export default
|
|
13
|
+
export default function hyperplanning(url, detail) {
|
|
14
|
+
return fetchCalendar(url, detail, fetchRemote);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Same as hyperplanning, with the remote fetch implementation passed in so tests can replace it.
|
|
18
|
+
*
|
|
19
|
+
* @param url - HTTPS URL to the ICS calendar
|
|
20
|
+
* @param detail - Level of detail: "full" (subject/teacher/classes), "list" (summary/times), or default (summary only)
|
|
21
|
+
* @param fetcher - Remote fetch implementation, fetchRemote in production
|
|
22
|
+
* @returns Array of calendar events sorted by start time, excluding past events
|
|
23
|
+
* @throws Error if the URL is invalid or internal, the file is too large or has too many events, or is not an ICS file
|
|
24
|
+
*/
|
|
25
|
+
export async function fetchCalendar(url, detail, fetcher) {
|
|
31
26
|
let parsed;
|
|
32
27
|
try {
|
|
33
28
|
parsed = new URL(url);
|
|
@@ -37,16 +32,22 @@ export default async function hyperplanning(url, detail) {
|
|
|
37
32
|
}
|
|
38
33
|
if (parsed.protocol !== 'https:')
|
|
39
34
|
throw new Error('Only HTTPS URLs are allowed.');
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
35
|
+
const body = await fetcher(url, {
|
|
36
|
+
maxBytes: MAX_ICS_BYTES,
|
|
37
|
+
timeout: ICS_FETCH_TIMEOUT,
|
|
38
|
+
messages: { size: 'ICS file must be under 1MB.' },
|
|
39
|
+
check: ({ ok, contentType }) => {
|
|
40
|
+
if (!ok || !contentType.includes('text/calendar'))
|
|
41
|
+
throw new Error('Invalid ICS file format.');
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
const vevents = new ical.Component(ical.parse(new TextDecoder().decode(body))).getAllSubcomponents('vevent');
|
|
45
|
+
if (vevents.length > MAX_ICS_EVENTS)
|
|
46
|
+
throw new Error(`ICS file must have at most ${MAX_ICS_EVENTS} events.`);
|
|
47
|
+
const events = vevents
|
|
48
48
|
.map((e) => {
|
|
49
|
-
|
|
49
|
+
// Without an exception list, ical.js scans every sibling event for each one (quadratic)
|
|
50
|
+
const evt = new ical.Event(e, { exceptions: [] });
|
|
50
51
|
const summary = (evt.summary || '').split(' ').filter((part) => part !== '-');
|
|
51
52
|
const start = formatDate(evt.startDate.toJSDate());
|
|
52
53
|
const end = formatDate(evt.endDate.toJSDate());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hyperplanning.js","sourceRoot":"","sources":["../../../src/modules/v4/hyperplanning.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hyperplanning.js","sourceRoot":"","sources":["../../../src/modules/v4/hyperplanning.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type RemoteFetcher } from '../../utils/remote.js';
|
|
1
2
|
export interface QRCodeOptions {
|
|
2
3
|
url: string;
|
|
3
4
|
size?: number;
|
|
@@ -23,3 +24,12 @@ export interface QRCodeResult {
|
|
|
23
24
|
* @throws Error if the URL is missing, any option is invalid, or the icon URL cannot be fetched
|
|
24
25
|
*/
|
|
25
26
|
export default function qrcode(options: QRCodeOptions): Promise<QRCodeResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Same as qrcode, with the remote fetch implementation passed in so tests can replace it.
|
|
29
|
+
*
|
|
30
|
+
* @param options - QR code generation options including URL, size, margin, correction level, colors, and optional icon
|
|
31
|
+
* @param fetcher - Remote fetch implementation used for the icon, fetchRemote in production
|
|
32
|
+
* @returns Object containing the QR code as a PNG buffer or Base64 string, and the content type
|
|
33
|
+
* @throws Error if the URL is missing, any option is invalid, or the icon cannot be fetched or is too large
|
|
34
|
+
*/
|
|
35
|
+
export declare function generateQRCode(options: QRCodeOptions, fetcher: RemoteFetcher): Promise<QRCodeResult>;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createCanvas, loadImage } from 'canvas';
|
|
2
2
|
import { toBuffer, toCanvas as qrToCanvas, toDataURL } from 'qrcode';
|
|
3
|
-
import { MAX_QRCODE_LOGO_BYTES } from '../../constants.js';
|
|
3
|
+
import { MAX_QRCODE_ICON_PIXELS, MAX_QRCODE_LOGO_BYTES, QRCODE_ICON_TIMEOUT } from '../../constants.js';
|
|
4
4
|
import { normalizeColor } from '../../utils/colors.js';
|
|
5
|
+
import { fetchRemote } from '../../utils/remote.js';
|
|
5
6
|
const CORRECTIONS = new Set(['L', 'M', 'Q', 'H']);
|
|
6
7
|
const FORMATS = new Set(['png', 'base64']);
|
|
7
8
|
function clamp(value, name, def, min, max) {
|
|
@@ -13,19 +14,131 @@ function clamp(value, name, def, min, max) {
|
|
|
13
14
|
throw new Error(`${name} must be between ${min} and ${max}`);
|
|
14
15
|
return Math.floor(value);
|
|
15
16
|
}
|
|
16
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Reads the frame sizes of a GIF, since giflib allocates every frame at its own size, not the screen size.
|
|
19
|
+
*
|
|
20
|
+
* @param buf - GIF file bytes
|
|
21
|
+
* @returns Total pixel count of the logical screen and every frame, or null if the block structure is broken
|
|
22
|
+
*/
|
|
23
|
+
function gifPixels(buf) {
|
|
24
|
+
let total = buf.readUInt16LE(6) * buf.readUInt16LE(8);
|
|
25
|
+
let pos = 13 + (buf[10] & 0x80 ? 3 << ((buf[10] & 7) + 1) : 0);
|
|
26
|
+
const skipBlocks = (at) => {
|
|
27
|
+
let p = at;
|
|
28
|
+
while (p < buf.length && buf[p] !== 0)
|
|
29
|
+
p += buf[p] + 1;
|
|
30
|
+
return p + 1;
|
|
31
|
+
};
|
|
32
|
+
while (pos < buf.length) {
|
|
33
|
+
const kind = buf[pos];
|
|
34
|
+
if (kind === 0x3b)
|
|
35
|
+
return total;
|
|
36
|
+
if (kind === 0x21) {
|
|
37
|
+
pos = skipBlocks(pos + 2);
|
|
38
|
+
}
|
|
39
|
+
else if (kind === 0x2c) {
|
|
40
|
+
if (pos + 10 > buf.length)
|
|
41
|
+
return null;
|
|
42
|
+
total += buf.readUInt16LE(pos + 5) * buf.readUInt16LE(pos + 7);
|
|
43
|
+
const flags = buf[pos + 9];
|
|
44
|
+
pos = skipBlocks(pos + 11 + (flags & 0x80 ? 3 << ((flags & 7) + 1) : 0));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return total;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Reads the size of a JPEG from its first start-of-frame marker.
|
|
54
|
+
*
|
|
55
|
+
* @param buf - JPEG file bytes
|
|
56
|
+
* @returns Pixel count, or null if no frame header comes before the image data
|
|
57
|
+
*/
|
|
58
|
+
function jpegPixels(buf) {
|
|
59
|
+
let pos = 2;
|
|
60
|
+
while (pos + 9 < buf.length) {
|
|
61
|
+
if (buf[pos] !== 0xff)
|
|
62
|
+
return null;
|
|
63
|
+
const marker = buf[pos + 1];
|
|
64
|
+
if (marker === 0xff) {
|
|
65
|
+
pos++;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
|
|
69
|
+
return buf.readUInt16BE(pos + 5) * buf.readUInt16BE(pos + 7);
|
|
70
|
+
}
|
|
71
|
+
if (marker === 0xda || marker === 0xd9)
|
|
72
|
+
return null;
|
|
73
|
+
pos += 2 + (marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7) ? 0 : buf.readUInt16BE(pos + 2));
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Reads the pixel count of a raster icon from its header, before anything is decoded.
|
|
79
|
+
*
|
|
80
|
+
* The magic bytes are the ones node-canvas checks to pick a decoder. Any other buffer is an SVG,
|
|
81
|
+
* drawn as vectors at the icon size, or a format loadImage refuses on its own.
|
|
82
|
+
*
|
|
83
|
+
* @param buf - Icon file bytes
|
|
84
|
+
* @returns Pixel count of a PNG, JPEG, GIF or BMP, or null for any other data
|
|
85
|
+
* @throws Error if a PNG, JPEG, GIF or BMP header cannot be read
|
|
86
|
+
*/
|
|
87
|
+
function iconPixels(buf) {
|
|
88
|
+
let pixels;
|
|
89
|
+
if (buf.length >= 4 && buf.toString('latin1', 1, 4) === 'PNG') {
|
|
90
|
+
pixels = buf.length >= 24 ? buf.readUInt32BE(16) * buf.readUInt32BE(20) : null;
|
|
91
|
+
}
|
|
92
|
+
else if (buf.length >= 2 && buf[0] === 0xff && buf[1] === 0xd8) {
|
|
93
|
+
pixels = jpegPixels(buf);
|
|
94
|
+
}
|
|
95
|
+
else if (buf.length >= 3 && buf.toString('latin1', 0, 3) === 'GIF') {
|
|
96
|
+
pixels = buf.length >= 13 ? gifPixels(buf) : null;
|
|
97
|
+
}
|
|
98
|
+
else if (buf.length >= 2 && buf.toString('latin1', 0, 2) === 'BM') {
|
|
99
|
+
if (buf.length >= 22 && buf.readUInt32LE(14) === 12)
|
|
100
|
+
pixels = buf.readUInt16LE(18) * buf.readUInt16LE(20);
|
|
101
|
+
else
|
|
102
|
+
pixels = buf.length >= 26 ? Math.abs(buf.readInt32LE(18) * buf.readInt32LE(22)) : null;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
if (pixels === null)
|
|
108
|
+
throw new Error('Icon must be a valid image');
|
|
109
|
+
return pixels;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Downloads the icon image, refusing internal hosts, non-image responses, bodies over 2MB and huge rasters.
|
|
113
|
+
*
|
|
114
|
+
* @param url - HTTPS URL of the icon
|
|
115
|
+
* @param fetcher - Remote fetch implementation
|
|
116
|
+
* @returns Raw image bytes
|
|
117
|
+
*/
|
|
118
|
+
async function fetchIcon(url, fetcher) {
|
|
17
119
|
if (!/^https:\/\//i.test(url))
|
|
18
120
|
throw new Error('Icon URL must use HTTPS');
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
121
|
+
const body = await fetcher(url, {
|
|
122
|
+
maxBytes: MAX_QRCODE_LOGO_BYTES,
|
|
123
|
+
timeout: QRCODE_ICON_TIMEOUT,
|
|
124
|
+
messages: {
|
|
125
|
+
blocked: 'Icon URL must point to a public host',
|
|
126
|
+
protocol: 'Icon URL must use HTTPS',
|
|
127
|
+
size: 'Icon must be under 2MB',
|
|
128
|
+
},
|
|
129
|
+
check: ({ ok, status, contentType }) => {
|
|
130
|
+
if (!ok)
|
|
131
|
+
throw new Error(`Failed to fetch icon: HTTP ${status}`);
|
|
132
|
+
if (!contentType.startsWith('image/'))
|
|
133
|
+
throw new Error('Icon URL must point to an image');
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
// A few kilobytes of compressed data can declare a huge image, decoded in full by loadImage
|
|
137
|
+
const pixels = iconPixels(body);
|
|
138
|
+
if (pixels !== null && pixels > MAX_QRCODE_ICON_PIXELS) {
|
|
139
|
+
throw new Error(`Icon must be under ${MAX_QRCODE_ICON_PIXELS / 1_000_000} megapixels`);
|
|
140
|
+
}
|
|
141
|
+
return body;
|
|
29
142
|
}
|
|
30
143
|
/**
|
|
31
144
|
* Generates a QR code image for a given URL, with optional icon overlay and color customization.
|
|
@@ -34,7 +147,18 @@ async function fetchIcon(url) {
|
|
|
34
147
|
* @returns Object containing the QR code as a PNG buffer or Base64 string, and the content type
|
|
35
148
|
* @throws Error if the URL is missing, any option is invalid, or the icon URL cannot be fetched
|
|
36
149
|
*/
|
|
37
|
-
export default
|
|
150
|
+
export default function qrcode(options) {
|
|
151
|
+
return generateQRCode(options, fetchRemote);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Same as qrcode, with the remote fetch implementation passed in so tests can replace it.
|
|
155
|
+
*
|
|
156
|
+
* @param options - QR code generation options including URL, size, margin, correction level, colors, and optional icon
|
|
157
|
+
* @param fetcher - Remote fetch implementation used for the icon, fetchRemote in production
|
|
158
|
+
* @returns Object containing the QR code as a PNG buffer or Base64 string, and the content type
|
|
159
|
+
* @throws Error if the URL is missing, any option is invalid, or the icon cannot be fetched or is too large
|
|
160
|
+
*/
|
|
161
|
+
export async function generateQRCode(options, fetcher) {
|
|
38
162
|
const { url } = options;
|
|
39
163
|
if (!url || typeof url !== 'string')
|
|
40
164
|
throw new Error('Please provide a valid URL');
|
|
@@ -64,7 +188,7 @@ export default async function qrcode(options) {
|
|
|
64
188
|
}
|
|
65
189
|
const canvas = createCanvas(size, size);
|
|
66
190
|
await qrToCanvas(canvas, url, qrOpts);
|
|
67
|
-
const iconBuffer = await fetchIcon(options.icon);
|
|
191
|
+
const iconBuffer = await fetchIcon(options.icon, fetcher);
|
|
68
192
|
const iconImg = await loadImage(iconBuffer);
|
|
69
193
|
const iconSize = clamp(options.iconSize, 'iconSize', Math.round(size * 0.2), 10, Math.round(size * 0.4));
|
|
70
194
|
const iconPadding = clamp(options.iconPadding, 'iconPadding', 5, 0, 50);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qrcode.js","sourceRoot":"","sources":["../../../src/modules/v4/qrcode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"qrcode.js","sourceRoot":"","sources":["../../../src/modules/v4/qrcode.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,6 @@ export interface RegexResult {
|
|
|
18
18
|
* @param text - The text to match against (max 1000 characters)
|
|
19
19
|
* @param flags - Optional regex flags; only g, i, m, s, u are accepted (g is always forced)
|
|
20
20
|
* @returns Match results with groups and named groups, or { valid: false } if the pattern is invalid
|
|
21
|
-
* @throws Error if pattern or text is missing
|
|
21
|
+
* @throws Error if pattern or text is missing, exceeds the maximum length, or takes too long to evaluate
|
|
22
22
|
*/
|
|
23
23
|
export default function regex(pattern: string, text: string, flags?: string): RegexResult;
|