(messages, options = {})
| 214 | } |
| 215 | |
| 216 | function extractVerificationCodeFromMessages(messages, options = {}) { |
| 217 | const filterAfterTimestamp = Number(options.filterAfterTimestamp || 0) || 0; |
| 218 | const senderFilters = (options.senderFilters || []).map(normalizeFilterValue).filter(Boolean); |
| 219 | const subjectFilters = (options.subjectFilters || []).map(normalizeFilterValue).filter(Boolean); |
| 220 | const excludedCodes = new Set((options.excludeCodes || []).map((value) => String(value || '').trim()).filter(Boolean)); |
| 221 | const hasExplicitFilters = senderFilters.length > 0 || subjectFilters.length > 0; |
| 222 | |
| 223 | const sortedMessages = (Array.isArray(messages) ? messages : []) |
| 224 | .map((raw) => normalizeMessage(raw, raw?.mailbox)) |
| 225 | .sort((left, right) => getMessageTimestamp(right) - getMessageTimestamp(left)); |
| 226 | |
| 227 | for (const message of sortedMessages) { |
| 228 | const receivedAt = getMessageTimestamp(message); |
| 229 | if (receivedAt && receivedAt < filterAfterTimestamp) { |
| 230 | continue; |
| 231 | } |
| 232 | |
| 233 | const sender = normalizeFilterValue(getMessageSender(message)); |
| 234 | const subject = normalizeFilterValue(message?.subject); |
| 235 | const preview = normalizeFilterValue(message?.bodyPreview); |
| 236 | const searchText = normalizeFilterValue(getMessageSearchText(message)); |
| 237 | const codeMatch = getMessageSearchText(message).match(CODE_PATTERN); |
| 238 | const code = codeMatch?.[1] || ''; |
| 239 | if (!code || excludedCodes.has(code)) { |
| 240 | continue; |
| 241 | } |
| 242 | |
| 243 | if (!hasExplicitFilters && !isOpenAiMessage(message)) { |
| 244 | continue; |
| 245 | } |
| 246 | |
| 247 | const senderMatched = senderFilters.length === 0 |
| 248 | ? true |
| 249 | : senderFilters.some((filter) => sender.includes(filter) || preview.includes(filter) || searchText.includes(filter)); |
| 250 | const subjectMatched = subjectFilters.length === 0 |
| 251 | ? true |
| 252 | : subjectFilters.some((filter) => subject.includes(filter) || preview.includes(filter) || searchText.includes(filter)); |
| 253 | if (!senderMatched && !subjectMatched) { |
| 254 | continue; |
| 255 | } |
| 256 | |
| 257 | return { |
| 258 | code, |
| 259 | emailTimestamp: receivedAt || Date.now(), |
| 260 | messageId: message?.id || null, |
| 261 | sender: getMessageSender(message), |
| 262 | subject: String(message?.subject || ''), |
| 263 | mailbox: message?.mailbox || 'INBOX', |
| 264 | message, |
| 265 | }; |
| 266 | } |
| 267 | |
| 268 | return null; |
| 269 | } |
| 270 | |
| 271 | async function fetchMicrosoftMailboxMessages(options = {}) { |
| 272 | const { |
no test coverage detected