@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.
Files changed (91) hide show
  1. package/README.md +44 -19
  2. package/dist/app.js +9 -4
  3. package/dist/app.js.map +1 -1
  4. package/dist/constants.d.ts +22 -0
  5. package/dist/constants.js +22 -0
  6. package/dist/constants.js.map +1 -1
  7. package/dist/endpoints/define.d.ts +30 -0
  8. package/dist/endpoints/define.js +14 -0
  9. package/dist/endpoints/define.js.map +1 -0
  10. package/dist/endpoints/hash.d.ts +2 -0
  11. package/dist/endpoints/hash.js +16 -0
  12. package/dist/endpoints/hash.js.map +1 -0
  13. package/dist/endpoints/index.d.ts +2 -0
  14. package/dist/endpoints/index.js +4 -0
  15. package/dist/endpoints/index.js.map +1 -0
  16. package/dist/endpoints/router.d.ts +10 -0
  17. package/dist/endpoints/router.js +50 -0
  18. package/dist/endpoints/router.js.map +1 -0
  19. package/dist/manifest.d.ts +11 -0
  20. package/dist/manifest.js +12 -0
  21. package/dist/manifest.js.map +1 -0
  22. package/dist/middleware/cors.d.ts +15 -0
  23. package/dist/middleware/cors.js +25 -7
  24. package/dist/middleware/cors.js.map +1 -1
  25. package/dist/middleware/ratelimit.d.ts +53 -1
  26. package/dist/middleware/ratelimit.js +180 -71
  27. package/dist/middleware/ratelimit.js.map +1 -1
  28. package/dist/modules/v4/barcode.d.ts +1 -1
  29. package/dist/modules/v4/barcode.js +9 -2
  30. package/dist/modules/v4/barcode.js.map +1 -1
  31. package/dist/modules/v4/captcha.d.ts +1 -1
  32. package/dist/modules/v4/captcha.js +5 -1
  33. package/dist/modules/v4/captcha.js.map +1 -1
  34. package/dist/modules/v4/chat.js +61 -12
  35. package/dist/modules/v4/chat.js.map +1 -1
  36. package/dist/modules/v4/cron.js +20 -2
  37. package/dist/modules/v4/cron.js.map +1 -1
  38. package/dist/modules/v4/hyperplanning.d.ts +11 -0
  39. package/dist/modules/v4/hyperplanning.js +30 -29
  40. package/dist/modules/v4/hyperplanning.js.map +1 -1
  41. package/dist/modules/v4/qrcode.d.ts +10 -0
  42. package/dist/modules/v4/qrcode.js +138 -14
  43. package/dist/modules/v4/qrcode.js.map +1 -1
  44. package/dist/modules/v4/regex.d.ts +1 -1
  45. package/dist/modules/v4/regex.js +67 -22
  46. package/dist/modules/v4/regex.js.map +1 -1
  47. package/dist/modules/v4/tic_tac_toe.js +56 -15
  48. package/dist/modules/v4/tic_tac_toe.js.map +1 -1
  49. package/dist/modules/v5/asymmetric.d.ts +15 -0
  50. package/dist/modules/v5/asymmetric.js +67 -5
  51. package/dist/modules/v5/asymmetric.js.map +1 -1
  52. package/dist/modules/v5/barcode.d.ts +1 -1
  53. package/dist/modules/v5/barcode.js +9 -2
  54. package/dist/modules/v5/barcode.js.map +1 -1
  55. package/dist/modules/v5/captcha.d.ts +12 -4
  56. package/dist/modules/v5/captcha.js +25 -8
  57. package/dist/modules/v5/captcha.js.map +1 -1
  58. package/dist/modules/v5/chat.js +66 -17
  59. package/dist/modules/v5/chat.js.map +1 -1
  60. package/dist/modules/v5/cron.d.ts +26 -0
  61. package/dist/modules/v5/cron.js +356 -0
  62. package/dist/modules/v5/cron.js.map +1 -0
  63. package/dist/modules/v5/pow.js +1 -1
  64. package/dist/modules/v5/pow.js.map +1 -1
  65. package/dist/modules/v5/tic_tac_toe.js +61 -20
  66. package/dist/modules/v5/tic_tac_toe.js.map +1 -1
  67. package/dist/modules/v5.d.ts +3 -2
  68. package/dist/modules/v5.js +3 -2
  69. package/dist/modules/v5.js.map +1 -1
  70. package/dist/routes/delete.js +0 -8
  71. package/dist/routes/delete.js.map +1 -1
  72. package/dist/routes/get.js +0 -2
  73. package/dist/routes/get.js.map +1 -1
  74. package/dist/routes/patch.js +0 -4
  75. package/dist/routes/patch.js.map +1 -1
  76. package/dist/routes/post.js +12 -25
  77. package/dist/routes/post.js.map +1 -1
  78. package/dist/storage/index.js +9 -8
  79. package/dist/storage/index.js.map +1 -1
  80. package/dist/types/storage.d.ts +4 -0
  81. package/dist/utils/challenge.d.ts +5 -3
  82. package/dist/utils/challenge.js +52 -6
  83. package/dist/utils/challenge.js.map +1 -1
  84. package/dist/utils/helpers.d.ts +18 -0
  85. package/dist/utils/helpers.js +35 -1
  86. package/dist/utils/helpers.js.map +1 -1
  87. package/dist/utils/remote.d.ts +42 -0
  88. package/dist/utils/remote.js +313 -0
  89. package/dist/utils/remote.js.map +1 -0
  90. package/package.json +28 -8
  91. package/src/favicon.ico +0 -0
@@ -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[u] && sessions[u].user !== session) {
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 || new Date().toISOString(),
68
+ timestamp: params.timestamp && isTimestamp(params.timestamp) ? params.timestamp : new Date().toISOString(),
52
69
  };
53
70
  if (token) {
54
- privateChats[token] = privateChats[token] || [];
55
- privateChats[token].push(msg);
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
- setTimeout(() => messages.splice(messages.indexOf(msg), 1), SESSION_TTL).unref();
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
- sessions[u] = sessions[u] || { user: session, last: now };
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[u] && now - sessions[u].last >= SESSION_TTL)
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[token])
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[u] && sessions[u].user !== session) {
140
+ if (Object.hasOwn(sessions, u) && sessions[u].user !== session) {
92
141
  throw new Error('Session ID mismatch');
93
142
  }
94
- if (!privateChats[token])
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":"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"}
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/modules/v4/chat.ts"],"names":[],"mappings":"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"}
@@ -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
- while (next.length < count && iterations < MAX_CRON_ITERATIONS) {
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":"AAAA,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI5C,MAAM,YAAY,GAAG;IACjB,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS;IAC9B,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO;IAC5B,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,eAAe;IACpC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,QAAQ;IAC7B,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,iCAAiC;CAC/C,CAAC;AAEX,MAAM,SAAS,GAA2B;IACtC,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AASnG,SAAS,UAAU,CAAC,KAAa,EAAE,KAAmC;IAClE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,GAAG,CAAC,CAAC;YAC1E,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YAC7B,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;gBACpF,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,aAAa,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;YAClF,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACJ,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,aAAa,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;YAClF,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAClB,IAAU,EACV,SAA8B;IAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9F,OAAO;QACH,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAO,EAAE,EAAE,CAAC;QACnC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAK,EAAE,EAAE,CAAC,GAAG,EAAE;QACpC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAI,EAAE,EAAE,CAAC;QAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAM,EAAE,EAAE,CAAC;QACjC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,OAAQ,CAAC,IAAI,CAAC;KACtC,CAAC;AACN,CAAC;AAED,SAAS,GAAG,CAAC,CAAS;IAClB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC5B,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,uBAAuB,CAAC;IACpD,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAC;IACpD,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,UAAU,CAAC;IACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC;IAClD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,MAAgB;IAC9B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,MAAkD,CAAC;IAExF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAElD,eAAe;IACf,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,yCAAyC;IACzC,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzE,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,SAAS,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACtD,CAAC;IAED,yBAAyB;IACzB,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzE,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,4BAA4B;IAC5B,IAAI,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1E,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACpD,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;IAChE,CAAC;IAED,0CAA0C;IAC1C,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7E,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9E,CAAC;IAED,4CAA4C;IAC5C,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,YAAY,IAAI,eAAe,CAAC;IACvF,CAAC;IAED,qEAAqE;IACrE,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,QAAQ,CAAC,EAAG,CAAC,CAAC,WAAW,GAAG,CAAC,QAAQ,CAAC,EAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,qBAAqB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,IAAY,EAAE,QAAgB,CAAC,EAAE,IAAa,EAAE,WAAmB,KAAK;IACjG,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAEjF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAoB,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,6CAA6C,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,gBAAgB,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,+BAA+B,gBAAgB,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5D,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAE1F,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,IAMtD,CAAC;IAEF,uCAAuC;IACvC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACd,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,4GAA4G;IAC5G,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEzF,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC/C,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAEzD,2GAA2G;IAC3G,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,oBAAoB,CAAC;IACxE,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,2FAA2F;IAC3F,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,UAAU,GAAG,mBAAmB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,SAAS,GAAG,OAAO,EAAE,CAAC;QAC7G,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;QAExF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;YACtC,OAAO,aAAa,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACjD,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;YACrC,CAAC;YAED,mGAAmG;YACnG,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC3B,IAAI,SAAS,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;oBAAE,MAAM;gBAC5D,MAAM,GAAG,SAAS,CAAC;gBACnB,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,CAAC;YACD,SAAS,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,SAAS,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;QACxD,CAAC;aAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,SAAS,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;QACvC,CAAC;aAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,SAAS,IAAI,KAAK,CAAC;QACvB,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7C,SAAS,IAAI,KAAK,CAAC;QACvB,CAAC;QAED,UAAU,EAAE,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACtF,CAAC"}
@@ -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
- function blocked(hostname) {
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 async function hyperplanning(url, detail) {
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
- if (blocked(parsed.hostname))
41
- throw new Error('Access to private/internal hosts is not allowed.');
42
- const response = await fetch(url, { signal: AbortSignal.timeout(10_000) });
43
- if (!response.ok || !(response.headers.get('content-type') || '').includes('text/calendar')) {
44
- throw new Error('Invalid ICS file format.');
45
- }
46
- const events = new ical.Component(ical.parse(await response.text()))
47
- .getAllSubcomponents('vevent')
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
- const evt = new ical.Event(e);
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":"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"}
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
- async function fetchIcon(url) {
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 response = await fetch(url, { signal: AbortSignal.timeout(5000) });
20
- if (!response.ok)
21
- throw new Error(`Failed to fetch icon: HTTP ${response.status}`);
22
- const contentType = response.headers.get('content-type') ?? '';
23
- if (!contentType.startsWith('image/'))
24
- throw new Error('Icon URL must point to an image');
25
- const buffer = Buffer.from(await response.arrayBuffer());
26
- if (buffer.length > MAX_QRCODE_LOGO_BYTES)
27
- throw new Error('Icon must be under 2MB');
28
- return buffer;
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 async function qrcode(options) {
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":"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"}
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 or exceeds the maximum length
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;