@deploybaseline/microsoft 0.0.0-stage → 0.14.1
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/LICENSE +202 -0
- package/NOTICE +11 -0
- package/README.md +35 -2
- package/THIRD_PARTY_NOTICES.md +622 -0
- package/api-reference.json +59783 -0
- package/dist/chunk-BEGIZZSN.js +4762 -0
- package/dist/chunk-BEGIZZSN.js.map +1 -0
- package/dist/chunk-G7326MH2.js +3837 -0
- package/dist/chunk-G7326MH2.js.map +1 -0
- package/dist/chunk-PBJS3RQA.js +41 -0
- package/dist/chunk-PBJS3RQA.js.map +1 -0
- package/dist/fonts/GeistPixel-Square.woff2 +0 -0
- package/dist/fonts/favicon.ico +0 -0
- package/dist/fonts/geist-sans.woff2 +0 -0
- package/dist/index.d.ts +355 -0
- package/dist/index.js +58927 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +5 -0
- package/dist/manifest.js +7 -0
- package/dist/manifest.js.map +1 -0
- package/dist/provider.d.ts +2 -0
- package/dist/provider.js +10 -0
- package/dist/provider.js.map +1 -0
- package/dist/upload-L2WXFOLU.js +11 -0
- package/dist/upload-L2WXFOLU.js.map +1 -0
- package/init.json +20 -0
- package/package.json +93 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/graph/handlers/upload.ts","../src/graph/errors.ts","../src/graph/exchange/calendar.ts","../src/graph/exchange/ids.ts","../src/graph/exchange/timezones.generated.ts","../src/graph/exchange/timezones.ts","../src/graph/exchange/exchange.ts","../src/graph/http.ts","../src/graph/exchange/bodies.ts","../src/graph/payload.ts","../src/graph/serialize.ts"],"sourcesContent":["/**\n * Large attachment upload sessions.\n *\n * Verified live (mail.attachments.upload-session, exp.attachments.size-boundaries):\n * - POST .../attachments/createUploadSession requires AttachmentItem\n * (RequestBodyRead missing-parameter error otherwise). Size 0 answers\n * ErrorAttachmentSizeShouldBeGreaterThanZero, more than 150 MB answers\n * ErrorAttachmentSizeShouldNotBeMoreThanMaximumSize (both with the same\n * \"greater than the minimum size\" message).\n * - 201 with context \"$metadata#microsoft.graph.uploadSession\", an\n * uploadUrl on the Outlook host (/api/gv1.0/users('<mailbox guid>@<tenant\n * id>')/messages('<id>')/AttachmentSessions('<id>')?authtoken=...) and\n * nextExpectedRanges [\"0-\"].\n * - Chunks are PUT without Authorization. A chunk that does not start at\n * the next expected offset answers 400 InvalidStart. Intermediate chunks\n * answer 200 with nextExpectedRanges [\"<offset>\"] (no trailing dash).\n * The final chunk answers 201 with only a Location header pointing at the\n * new attachment. The session then answers 404 ErrorItemNotFound.\n * - Outlook host responses carry the compact OData content type,\n * OData-Version 4.0 and request-id (no client-request-id).\n *\n * - Sessions expire two hours after creation (attachments.upload-session.expiry,\n * for messages and events). DELETE on the uploadUrl cancels a session (204);\n * later chunks answer 404 ErrorItemNotFound.\n */\nimport { randomBytes, randomUUID } from \"node:crypto\";\nimport { Errors, GraphError, renderError } from \"../errors.js\";\nimport { eventId, touchEvent } from \"../exchange/calendar.js\";\nimport type { Exchange } from \"../exchange/exchange.js\";\nimport { isoSeconds } from \"../exchange/exchange.js\";\nimport type { AttachmentRecord, EventRecord, MessageRecord, UploadSessionRecord } from \"../exchange/model.js\";\nimport { type GraphResponse, ODATA_JSON, OUTLOOK_JSON, parseJsonBody } from \"../http.js\";\nimport { expectBoolean, expectEnum, expectString } from \"../payload.js\";\nimport { attachmentId } from \"../serialize.js\";\nimport type { MailCtx } from \"./mail.js\";\n\nconst MILLISECONDS_SUFFIX_GROUP = /\\.(\\d{3})Z$/;\nconst CONTENT_RANGE = /^bytes (\\d+)-(\\d+)\\/(\\d+|\\*)$/;\n\nconst MAX_SIZE = 150 * 1024 * 1024;\nconst SESSION_TTL_MS = 2 * 60 * 60 * 1000;\n\n/** ISO timestamp with seven fractional digits, as Exchange writes it. */\nfunction ticksIso(d: Date): string {\n return d\n .toISOString()\n .replace(\n MILLISECONDS_SUFFIX_GROUP,\n (_m, ms: string) => `.${ms}${String(Math.floor(Math.random() * 10_000)).padStart(4, \"0\")}Z`,\n );\n}\n\nfunction sessionId(): string {\n return Buffer.concat([Buffer.from([0x00, 0x00]), randomBytes(68)])\n .toString(\"base64\")\n .replace(/\\//g, \"-\")\n .replace(/\\+/g, \"_\");\n}\n\n/**\n * Events take upload sessions the same way (documented: event\n * attachments/createUploadSession); the uploadUrl then names events.\n */\nexport function createUploadSession(\n c: MailCtx,\n m: { immutableCounter: number },\n collection: \"messages\" | \"events\" = \"messages\",\n itemKey?: string,\n): GraphResponse {\n const body = parseJsonBody(c.req);\n const key = Object.keys(body).find((k) => k.toLowerCase() === \"attachmentitem\");\n if (!key || body[key] === null || body[key] === undefined) {\n throw Errors.missingParameters(\"createUploadSession\", [\"AttachmentItem\"]);\n }\n const item = body[key] as Record<string, unknown>;\n if (typeof item !== \"object\" || Array.isArray(item)) {\n throw Errors.unreadableJson();\n }\n for (const k of Object.keys(item)) {\n if (\n !(\n [\"attachmentType\", \"name\", \"size\", \"isInline\", \"contentType\", \"contentId\"].includes(k) || k.startsWith(\"@odata\")\n )\n ) {\n throw Errors.unknownBodyProperty(k, \"attachmentItem\");\n }\n }\n const type =\n item.attachmentType === undefined\n ? \"file\"\n : expectEnum(item.attachmentType, [\"file\", \"item\", \"reference\"] as const);\n if (type !== \"file\") {\n throw Errors.notImplemented(`upload sessions for ${type} attachments`);\n }\n const size = typeof item.size === \"number\" ? item.size : 0;\n if (size <= 0) {\n throw Errors.attachmentTooSmall();\n }\n if (size > MAX_SIZE) {\n throw Errors.attachmentTooLarge();\n }\n const name = expectString(\"name\", item.name ?? null) ?? \"\";\n const id = sessionId();\n const authtoken = randomBytes(64).toString(\"base64url\");\n const expires = new Date(Date.now() + SESSION_TTL_MS);\n const rec: UploadSessionRecord = {\n id,\n mailboxGuid: c.mbx.guid,\n itemCounter: m.immutableCounter,\n name,\n contentType:\n item.contentType === undefined || item.contentType === null\n ? \"application/octet-stream\"\n : (expectString(\"contentType\", item.contentType) ?? \"application/octet-stream\"),\n isInline: item.isInline === undefined ? false : expectBoolean(\"isInline\", item.isInline),\n contentId: item.contentId ? expectString(\"contentId\", item.contentId) : null,\n size,\n received: 0,\n chunks: [],\n expirationDateTime: ticksIso(expires),\n authtoken,\n completed: false,\n collection,\n };\n c.ex.state.uploadSessions[id] = rec;\n const tenant = c.ex.state.tenantId;\n const msgId = itemKey ?? c.ex.itemId(c.mbx, m as MessageRecord);\n return {\n status: 201,\n headers: { \"Content-Type\": ODATA_JSON },\n body: {\n \"@odata.context\": `${c.base}/$metadata#microsoft.graph.uploadSession`,\n uploadUrl: `${c.svc.baseUrl}/api/gv1.0/users('${c.mbx.guid}@${tenant}')/${collection}('${msgId}')/AttachmentSessions('${id}')?authtoken=${authtoken}`,\n expirationDateTime: rec.expirationDateTime,\n nextExpectedRanges: [\"0-\"],\n },\n };\n}\n\nfunction outlookError(err: GraphError, requestId: string): GraphResponse {\n const r = renderError(new GraphError(err.status, err.code, err.message, \"exchange\"), {\n requestId,\n clientRequestId: requestId,\n });\n return {\n status: r.status,\n headers: { \"Content-Type\": OUTLOOK_JSON, \"OData-Version\": \"4.0\", \"request-id\": requestId },\n body: r.body,\n };\n}\n\n/** DELETE {uploadUrl}: cancel the session. */\nexport function cancelUploadSession(\n ex: Exchange,\n params: { session: string; authtoken: string | null },\n): GraphResponse {\n const requestId = randomUUID();\n const rec = ex.state.uploadSessions[params.session];\n if (!rec || rec.completed || params.authtoken !== rec.authtoken || Date.parse(rec.expirationDateTime) < Date.now()) {\n return outlookError(Errors.attachmentNotFound(), requestId);\n }\n delete ex.state.uploadSessions[params.session];\n return { status: 204, headers: { \"request-id\": requestId }, body: null };\n}\n\n/** PUT {uploadUrl}: append one chunk. */\nexport function uploadChunk(\n ex: Exchange,\n baseUrl: string,\n params: {\n user: string;\n message: string;\n session: string;\n authtoken: string | null;\n contentRange: string | null;\n bytes: Buffer;\n },\n): GraphResponse {\n const requestId = randomUUID();\n const rec = ex.state.uploadSessions[params.session];\n const mbx = rec ? ex.mailboxByGuid(rec.mailboxGuid) : undefined;\n if (\n !rec ||\n rec.completed ||\n !mbx ||\n params.authtoken !== rec.authtoken ||\n Date.parse(rec.expirationDateTime) < Date.now()\n ) {\n return outlookError(Errors.attachmentNotFound(), requestId);\n }\n const range = CONTENT_RANGE.exec((params.contentRange ?? \"\").trim());\n if (!range) {\n return outlookError(Errors.uploadInvalidRange(), requestId);\n }\n const start = Number(range[1]);\n const end = Number(range[2]);\n if (start !== rec.received) {\n return outlookError(Errors.uploadInvalidStart(), requestId);\n }\n if (end < start || end - start + 1 !== params.bytes.length || end >= rec.size) {\n return outlookError(Errors.uploadInvalidRange(), requestId);\n }\n rec.chunks.push(params.bytes.toString(\"base64\"));\n rec.received = end + 1;\n const counter = mbx.immutable[rec.itemCounter];\n const isEvent = rec.collection === \"events\";\n let item: MessageRecord | EventRecord | undefined;\n if (counter !== undefined && counter >= 0) {\n item = isEvent ? mbx.events?.[counter] : mbx.items[counter];\n }\n if (!item) {\n return outlookError(Errors.attachmentNotFound(), requestId);\n }\n const collection = isEvent ? \"events\" : \"messages\";\n const msgId = isEvent ? eventId(mbx, item as EventRecord) : ex.itemId(mbx, item as MessageRecord);\n const userKey = `${mbx.guid}@${ex.state.tenantId}`;\n if (rec.received < rec.size) {\n return {\n status: 200,\n headers: { \"Content-Type\": OUTLOOK_JSON, \"OData-Version\": \"4.0\", \"request-id\": requestId },\n body: {\n \"@odata.context\": `${baseUrl}/api/gv1.0/$metadata#users('${encodeURIComponent(userKey)}')/${collection}('${msgId}')/attachmentSessions/$entity`,\n expirationDateTime: rec.expirationDateTime,\n nextExpectedRanges: [String(rec.received)],\n },\n };\n }\n const data = Buffer.concat(rec.chunks.map((s) => Buffer.from(s, \"base64\")));\n const a: AttachmentRecord = {\n counter: ex.alloc(mbx),\n type: \"file\",\n name: rec.name,\n contentType: rec.contentType,\n isInline: rec.isInline,\n contentId: rec.contentId,\n contentLocation: null,\n contentBytes: data.toString(\"base64\"),\n item: null,\n // One observation (upload-session): 41 + 6 per name character + 2 per content type character.\n size: data.length + 41 + 6 * rec.name.length + 2 * rec.contentType.length,\n lastModifiedDateTime: isoSeconds(),\n };\n item.attachments.push(a);\n if (isEvent) {\n touchEvent(ex, mbx, item as EventRecord);\n } else {\n ex.touch(mbx, item as MessageRecord);\n }\n rec.completed = true;\n rec.chunks = [];\n delete ex.state.uploadSessions[rec.id];\n return {\n status: 201,\n headers: {\n Location: `${baseUrl}/api/gv1.0/users('${userKey}')/${collection}('${msgId}')/Attachments('${attachmentId(ex, mbx, item as MessageRecord, a)}')`,\n \"request-id\": requestId,\n },\n body: null,\n };\n}\n","/**\n * Microsoft Graph error model.\n *\n * Graph responses come from two layers and their error envelopes differ\n * (verified live, see conformance recordings):\n *\n * - The Graph front end (routing, OData parsing, auth) adds\n * `innerError: { date, request-id, client-request-id }`.\n * - The Exchange (Outlook REST) workload returns `{ code, message }` only.\n * - The SharePoint drive API answers some errors (shares) with\n * `{ code, innerError: { code }?, message }` and `application/json; charset=utf-8`.\n *\n * Messages are reproduced exactly as observed, including the \", \" joined\n * two-part messages Exchange produces.\n */\nexport type ErrorLayer = \"graph\" | \"exchange\" | \"todo\" | \"sharepoint\";\n\nexport class GraphError extends Error {\n status: number;\n code: string;\n layer: ErrorLayer;\n headers: Record<string, string>;\n /** innerError.code (To Do service errors carry one). */\n innerCode?: string;\n /** Extra members of the error object (annotations such as `@error.fixItUrl`). */\n extra: Record<string, unknown>;\n\n constructor(\n status: number,\n code: string,\n message: string,\n layer: ErrorLayer = \"exchange\",\n headers: Record<string, string> = {},\n innerCode?: string,\n extra: Record<string, unknown> = {},\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.status = status;\n this.code = code;\n this.layer = layer;\n this.headers = headers;\n this.innerCode = innerCode;\n this.extra = extra;\n }\n}\n\n/**\n * Errors of the To Do service (verified live, todo.lists-and-tasks and\n * todo.query-options): front end envelope with innerError.code.\n */\nexport const TodoErrors = {\n /** Unsupported query option ($select on collections and lists, $orderby, $select on delta). */\n parseUri: () => new GraphError(400, \"invalidRequest\", \"Invalid request\", \"todo\", {}, \"RequestBroker--ParseUri\"),\n /** Body that does not bind to the model (for example an unknown enum value). */\n invalidModel: () => new GraphError(400, \"invalidRequest\", \"Invalid request\", \"todo\", {}, \"InvalidModel\"),\n notFound: () => new GraphError(404, \"ErrorItemNotFound\", \"Item not found\", \"todo\", {}, \"ErrorItemNotFound\"),\n /** Verified live (todo.dates-and-defaults): PATCH displayName of the default list. */\n defaultListRename: () => new GraphError(400, \"invalidRequest\", \"Invalid request\", \"todo\", {}, \"ErrorInvalidRequest\"),\n /** Verified live (todo.dates-and-defaults): DELETE of the default list. */\n defaultListDelete: () =>\n new GraphError(\n 400,\n \"invalidRequest\",\n \"The default Tasks folder can not be deleted\",\n \"todo\",\n {},\n \"CantDeleteDefaultFolder\",\n ),\n /** Verified live (todo.flagged-emails): DELETE of the Flagged Emails list. */\n flaggedListDelete: () =>\n new GraphError(\n 400,\n \"invalidRequest\",\n \"The Flagged Emails folder can not be deleted\",\n \"todo\",\n {},\n \"InvalidTaskFolderOperation\",\n ),\n};\n\nconst g = (status: number, code: string, message: string, headers?: Record<string, string>, options?: ErrorOptions) =>\n new GraphError(status, code, message, \"graph\", headers, undefined, undefined, options);\nconst x = (status: number, code: string, message: string, options?: ErrorOptions) =>\n new GraphError(status, code, message, \"exchange\", undefined, undefined, undefined, options);\n\nexport const Errors = {\n /** Verified live (calendar.boundaries). */\n allDayTooShort: () =>\n x(\n 400,\n \"ErrorInvalidRequest\",\n \"Your request can't be completed. The duration of an event marked as All day must be at least 24 hours.\",\n ),\n /** Verified live (contacts.boundaries). */\n tooManyContactEmails: (n: number) =>\n x(\n 400,\n \"ErrorInvalidProperty\",\n `The multi value property emailAddresses has ${n} entries, that exceeds the max allowed value of 3.`,\n ),\n /** Verified live (contacts.boundaries): a graph-layer envelope. */\n contactPhotoNotFound: () => g(404, \"ErrorItemNotFound\", \"The specified object was not found in the store.\"),\n /** Verified live for Start (calendar.allday-order-paging); End assumed to match. */\n allDayNotMidnight: (which: \"Start\" | \"End\") =>\n x(\n 400,\n \"ErrorInvalidRequest\",\n `Your request can't be completed. The Event.${which} property for an all-day event needs to be set to midnight.`,\n ),\n /** Verified live (places.rooms): an unknown place id or address. */\n placeNotFound: (id: string) => g(404, \"notFound\", `Place with identity ${id} is not found`),\n /** Verified live (permissions.write-places-and-translate): PATCH with Place.Read.All only. */\n placesWriteForbidden: () =>\n g(\n 403,\n \"forbidden\",\n \"Insufficient privileges to complete the operation. The signed-in user must be assigned a supported Microsoft Entra role. Exchange Administrator is the least privileged role supported for this operation.\",\n ),\n defaultCalendarDelete: () =>\n x(400, \"ErrorInvalidRequest\", \"Your request can't be completed. The default calendar cannot be deleted.\"),\n // ---- authentication (front end) ----\n tokenEmpty: () => g(401, \"InvalidAuthenticationToken\", \"Access token is empty.\", wwwAuthenticate()),\n tokenUnreadable: (options?: ErrorOptions) =>\n g(\n 401,\n \"InvalidAuthenticationToken\",\n \"Protocol 'Bearer' failed to validate because The token could not be read.\",\n wwwAuthenticate(),\n options,\n ),\n tokenNoAppId: () => g(401, \"InvalidAuthenticationToken\", \"NoAppIdInToken\", wwwAuthenticate()),\n tokenExpired: () =>\n g(401, \"InvalidAuthenticationToken\", \"Lifetime validation failed, the token is expired.\", wwwAuthenticate()),\n tokenSignature: () => g(401, \"InvalidAuthenticationToken\", \"Signature validation failed.\", wwwAuthenticate()),\n /** Observed on Graph (docs/research/behavior-research.md, InvalidAuthenticationToken). */\n tokenAudience: () =>\n g(401, \"InvalidAuthenticationToken\", \"Access token validation failure. Invalid audience.\", wwwAuthenticate()),\n /** A token this emulator signed that was revoked since (the revoke endpoint is an emulator extension). */\n tokenInvalid: () => g(401, \"InvalidAuthenticationToken\", \"Access token validation failure.\", wwwAuthenticate()),\n meRequiresDelegated: () => g(400, \"BadRequest\", \"/me request is only valid with delegated authentication flow.\"),\n directoryDenied: () => g(403, \"Authorization_RequestDenied\", \"Insufficient privileges to complete the operation.\"),\n directoryMethodNotAllowed: () =>\n g(405, \"Request_BadRequest\", \"Specified HTTP method is not allowed for the request target.\"),\n\n // ---- routing / OData (front end) ----\n invalidVersion: (v: string) => g(404, \"ResourceNotFound\", `Invalid version: ${v}`),\n directoryResourceNotFound: (segment: string) =>\n g(\n 404,\n \"Request_ResourceNotFound\",\n `Resource '${segment}' does not exist or one of its queried reference-property objects are not present.`,\n ),\n segmentNotFound: (segment: string) => g(400, \"BadRequest\", `Resource not found for the segment '${segment}'.`),\n noContentType: () =>\n g(400, \"BadRequest\", \"Write requests (excluding DELETE) must contain the Content-Type header declaration.\"),\n unreadableJson: () =>\n g(\n 400,\n \"BadRequest\",\n \"Unable to read JSON request payload. Please ensure Content-Type header is set and payload is of valid JSON format.\",\n ),\n selectExpandParse: (prop: string, type: string) =>\n g(\n 400,\n \"BadRequest\",\n `Parsing OData Select and Expand failed: Could not find a property named '${prop}' on type 'microsoft.graph.${type}'.`,\n ),\n invalidTop: (v: string) =>\n g(\n 400,\n \"BadRequest\",\n `Invalid value '${v}' for $top query option found. The $top query option requires a non-negative integer value.`,\n ),\n invalidSkip: (v: string) =>\n g(\n 400,\n \"BadRequest\",\n `Invalid value '${v}' for $skip query option found. The $skip query option requires a non-negative integer value.`,\n ),\n filterClause: (detail: string) => g(400, \"BadRequest\", `Invalid filter clause: ${detail}`),\n orderbyClause: (detail: string) => g(400, \"BadRequest\", `Invalid orderby clause: ${detail}`),\n badDeltaToken: () => g(400, \"BadRequest\", \"Badly formed token.\"),\n changeTrackingUnsupported: (type: string) =>\n g(400, \"BadRequest\", `Unsupported request: Change tracking is not supported against 'microsoft.graph.${type}'.`),\n batchLimit: () => g(400, \"BadRequest\", \"Number of requests inside batch exceed the limit.\"),\n batchDuplicateId: (id: string) => g(400, \"BadRequest\", `Request Id ${id} has to be unique in a batch.`),\n batchMissingContentType: (id: string) =>\n g(400, \"BadRequest\", `Write request with id '${id}' does not contain a Content-Type header.`),\n batchInvalid: (options?: ErrorOptions) => g(400, \"BadRequest\", \"Invalid batch payload format.\", undefined, options),\n batchFailedDependency: () => g(424, \"FailedDependency\", \"Request failed as dependent request failed\"),\n methodNotAllowed: () => x(405, \"ErrorInvalidRequest\", \"The OData request is not supported.\"),\n unsupportedRequest: (detail: string) => g(400, \"BadRequest\", `Unsupported request: ${detail}`),\n\n // ---- Outlook REST query layer ----\n parseUriProperty: (prop: string, type = \"microsoft.graph.message\", withInner = false) =>\n withInner\n ? g(400, \"RequestBroker--ParseUri\", `Could not find a property named '${prop}' on type '${type}'.`)\n : x(400, \"RequestBroker--ParseUri\", `Could not find a property named '${prop}' on type '${type}'.`),\n inefficientFilter: () =>\n x(400, \"InefficientFilter\", \"The restriction or sort order is too complex for this operation.\"),\n invalidFilterNodes: () =>\n x(400, \"ErrorInvalidUrlQueryFilter\", \"The query filter contains one or more invalid nodes.\"),\n deltaFilterUnsupported: () =>\n x(\n 400,\n \"ErrorInvalidUrlQuery\",\n \"The '$filter' parameter value is not supported for 'Messages' resource; only a value of 'receivedDateTime ge value' is supported.\",\n ),\n searchWithFilter: () => x(400, \"SearchWithFilter\", \"The query parameter '$filter' is not supported with '$search'.\"),\n searchWithOrderBy: () =>\n x(400, \"SearchWithOrderBy\", \"The query parameter '$orderBy' is not supported with '$search'.\"),\n unsupportedSortPath: () =>\n x(400, \"ErrorUnsupportedPathForSortGroup\", \"The property can not be used for sorting or grouping results.\"),\n searchWithSkip: () => x(400, \"SearchWithSkip\", \"The query parameter '$skip' is not supported with '$search'.\"),\n\n // ---- store ----\n idMalformed: () => x(400, \"ErrorInvalidIdMalformed\", \"Id is malformed.\"),\n itemNotFound: () =>\n x(\n 404,\n \"ErrorItemNotFound\",\n \"The specified object was not found in the store., The process failed to get the correct properties.\",\n ),\n attachmentNotFound: () => x(404, \"ErrorItemNotFound\", \"The specified object was not found in the store.\"),\n /**\n * Verified live (delegated.access-and-zones): a delegated caller with\n * .Shared scopes but no access to another user's mailbox gets 404, not 403.\n * Under a well-known folder the message names the folder.\n */\n mailboxNotAccessible: (defaultFolder?: string) =>\n x(\n 404,\n \"ErrorItemNotFound\",\n defaultFolder\n ? `The specified object was not found in the store., Default folder ${defaultFolder} not found.`\n : \"The specified object was not found in the store.\",\n ),\n folderNotFound: () => x(404, \"ErrorFolderNotFound\", \"The specified folder could not be found in the store.\"),\n wrongMailbox: (id: string, mailboxGuid: string) =>\n x(404, \"ErrorInvalidMailboxItemId\", `Item '${id}' doesn't belong to the targeted mailbox '${mailboxGuid}'.`),\n folderIdForItemId: () => x(400, \"ErrorCannotUseFolderIdForItemId\", \"Expected an item Id but received a folder Id.\"),\n itemIdForFolderId: () => x(400, \"ErrorCannotUseItemIdForFolderId\", \"Expected a folder Id but received an item Id.\"),\n invalidUser: (who: string) => x(404, \"ErrorInvalidUser\", `The requested user '${who}' is invalid.`),\n mailboxNotEnabled: () =>\n x(404, \"MailboxNotEnabledForRESTAPI\", \"The mailbox is either inactive, soft-deleted, or is hosted on-premise.\"),\n accessDenied: (options?: ErrorOptions) =>\n x(403, \"ErrorAccessDenied\", \"Access is denied. Check credentials and try again.\", options),\n cannotResubmit: () =>\n x(403, \"ErrorAccessDenied\", \"Access is denied. Check credentials and try again., Cannot submit message.\"),\n sendAsDenied: () =>\n x(\n 403,\n \"ErrorSendAsDenied\",\n \"The user account which was used to submit this request does not have the right to send mail on behalf of the specified sending account., Cannot submit message.\",\n ),\n applicationAccessPolicy: () =>\n x(\n 403,\n \"ErrorAccessDenied\",\n \"Access to OData is disabled: [RAOP] : Blocked by tenant configured AppOnly AccessPolicy settings.\",\n ),\n\n invalidReferenceItem: () =>\n x(400, \"ErrorInvalidReferenceItem\", \"The reference item does not support the requested operation.\"),\n invalidChangeKey: () => x(400, \"ErrorInvalidChangeKey\", \"The change key is invalid.\"),\n bodyContentTypeNotSupported: () =>\n x(\n 400,\n \"ErrorBodyContentTypeNotSupported\",\n \"The body content type in the body-content-type preferred header is not supported.\",\n ),\n attachmentTooSmall: () =>\n x(400, \"ErrorAttachmentSizeShouldBeGreaterThanZero\", \"Attachment size must be greater than the minimum size.\"),\n attachmentTooLarge: () =>\n x(\n 400,\n \"ErrorAttachmentSizeShouldNotBeMoreThanMaximumSize\",\n \"Attachment size must be greater than the minimum size.\",\n ),\n requestEntityTooLarge: () => x(413, \"ErrorRequestEntityTooLarge\", \"The request entity is too large.\"),\n throttled: (retryAfter: number) =>\n new GraphError(429, \"ApplicationThrottled\", \"Application is over its MailboxConcurrency limit.\", \"exchange\", {\n \"Retry-After\": String(retryAfter),\n }),\n\n // ---- folders ----\n folderExists: (name: string) =>\n x(409, \"ErrorFolderExists\", `A folder with the specified name already exists., Could not create folder '${name}'.`),\n folderSaveProperty: () =>\n x(400, \"ErrorFolderSavePropertyError\", \"The folder save operation failed due to invalid property values.\"),\n deleteDistinguished: () => x(400, \"ErrorDeleteDistinguishedFolder\", \"Distinguished folders cannot be deleted.\"),\n moveCopyFailed: () => x(500, \"ErrorMoveCopyFailed\", \"The move or copy operation failed.\"),\n\n // ---- payload ----\n requiredProperty: (prop: string) =>\n x(400, \"ErrorInvalidProperty\", `The property '${prop}' is required when creating the entity.`),\n missingParameters: (op: string, params: string[]) =>\n x(\n 400,\n \"RequestBodyRead\",\n `One or more parameters of the operation '${op}' are missing from the request payload. The missing parameters are: ${params.join(\", \")}.`,\n ),\n unknownBodyProperty: (prop: string, type: string) =>\n x(\n 400,\n \"RequestBodyRead\",\n `The property '${prop}' does not exist on type 'microsoft.graph.${type}'. Make sure to only use property names that are defined by the type or mark the type as open type.`,\n ),\n enumValueNotFound: (value: string) => x(400, \"RequestBodyRead\", `Requested value '${value}' was not found.`),\n literalConversion: (literal: string, type: string) =>\n x(400, \"RequestBodyRead\", `Cannot convert the literal '${literal}' to the expected type '${type}'.`),\n unableToDeserialize: () => x(400, \"UnableToDeserializePostBody\", \"were unable to deserialize \"),\n internalServerError: () =>\n x(500, \"ErrorInternalServerError\", \"An internal server error occurred. The operation failed.\"),\n internalServerErrorDetail: (detail: string) =>\n x(500, \"ErrorInternalServerError\", `An internal server error occurred. The operation failed., ${detail}`),\n invalidSourceFolderIds: () => x(400, \"ErrorInvalidSourceFolderIds\", \"Source Folder Ids cannot be empty.\"),\n filterQueryParse: (detail: string) => x(400, \"ErrorParsingFilterQuery-ParseUri\", detail),\n extensionExpandRequiresFilter: () =>\n x(\n 400,\n \"ErrorGraphExtensionExpandRequiresFilter\",\n \"When expanding extensions, a filter must be provided to specify which extensions to expand. For example $expand=Extensions($filter=Id eq 'Com.Insightly.CRMOpportunity').\",\n ),\n abstractType: (type: string) =>\n x(422, \"UnprocessableType\", `Cannot process input of abstract type 'microsoft.graph.${type}'`),\n parameterEmpty: (name: string) => x(400, \"ErrorInvalidParameter\", `The value of the parameter '${name}' is empty.`),\n\n // ---- send ----\n noRecipients: () =>\n x(\n 400,\n \"ErrorInvalidRecipients\",\n \"At least one recipient is not valid., A message can't be sent because it contains no recipients.\",\n ),\n unresolvedRecipient: (addr: string) =>\n x(\n 400,\n \"ErrorInvalidRecipients\",\n `At least one recipient is not valid., Recipient '${addr}' is not resolved. All recipients must be resolved before a message can be submitted.`,\n ),\n missingRecipients: () => x(400, \"ErrorMissingRecipients\", \"A message needs to have at least one recipient.\"),\n forwardRecipientsEmpty: () =>\n x(\n 400,\n \"ErrorParameterValueEmpty\",\n \"The value of the parameter 'ToRecipients' is empty. Specify 'ToRecipients' either in the message object or in the action.\",\n ),\n irresolvableConflict: () =>\n x(\n 412,\n \"ErrorIrresolvableConflict\",\n \"The send or update operation could not be performed because the change key passed in the request does not match the current change key for the item.\",\n ),\n\n // ---- MIME ----\n mimeInvalidBase64: () => x(400, \"ErrorMimeContentInvalidBase64String\", \"Invalid base64 string for MIME content.\"),\n mimeConversionFailed: () => x(400, \"ErrorMimeContentConversionFailed\", \"The MIME content could not be converted.\"),\n\n // ---- upload sessions (Outlook host) ----\n uploadInvalidStart: () =>\n x(400, \"InvalidStart\", \"Invalid Start offset for the current fragment. Fragment might already have been uploaded.\"),\n uploadInvalidRange: () => x(400, \"InvalidContentRange\", \"The Content-Range header is missing or malformed.\"),\n\n // ---- calendar (sources in docs/research/calendar-contacts.md; none verified live) ----\n /** Observed in several SDK issues (3.1). */\n timeWindowRequired: () =>\n x(\n 400,\n \"ErrorInvalidParameter\",\n \"This request requires a time window specified by the query string parameters StartDateTime and EndDateTime.\",\n ),\n /** Observed code (2); message text assumed. */\n timeZoneNotSupported: (name: string) =>\n x(\n 400,\n \"TimeZoneNotSupportedException\",\n `A valid TimeZone value must be specified. The following TimeZone value is not supported: '${name}'.`,\n ),\n /** EWS code and message (observed through EWS); Graph surface assumed. */\n endBeforeStart: () => x(400, \"ErrorCalendarEndDateIsEarlierThanStartDate\", \"EndDate is earlier than StartDate\"),\n /** Code observed (outlook-mcp); message assumed. */\n propertyValidation: () => x(400, \"ErrorPropertyValidationFailure\", \"At least one property failed validation.\"),\n invalidRecurrenceRange: () => x(400, \"ErrorInvalidRecurrenceRange\", \"The recurrence range is invalid.\"),\n /** Observed (outlook-mcp issue #86). */\n recurrenceEndBeforeStart: () =>\n x(400, \"ErrorInvalidParameter\", \"StartDateV2 should be earlier or equal to EndDateV2\"),\n /** Documented on event-update. */\n occurrenceCrossingBoundary: () =>\n x(400, \"ErrorOccurrenceCrossingBoundary\", \"Modified occurrence is crossing or overlapping adjacent occurrence.\"),\n /** Documented message on event-cancel; code assumed. */\n organizerOnlyCancel: () =>\n x(400, \"ErrorInvalidRequest\", \"Your request can't be completed. You need to be an organizer to cancel a meeting.\"),\n /** Verified live for accept; decline and tentativelyAccept assumed to match. */\n organizerCannotRespond: (_action: \"Accept\" | \"Decline\" | \"Tentative\") =>\n x(\n 400,\n \"ErrorInvalidRequest\",\n \"Your request can't be completed. You can't respond to this meeting because you're the meeting organizer.\",\n ),\n /** Observed in a Q&A thread for contacts; reused for default calendars (assumed). */\n cannotDeleteObject: () => x(400, \"ErrorCannotDeleteObject\", \"Object cannot be deleted.\"),\n /** Documented that proposals fail with 400; code and message assumed. */\n proposalsNotAllowed: () =>\n x(\n 400,\n \"ErrorInvalidRequest\",\n \"Your request can't be completed. New time proposals are not allowed for this meeting.\",\n ),\n /** Observed (outlook-mcp CHANGELOG). */\n missingEventStart: () => x(400, \"ErrorInvalidRequest\", \"Missing parameters: Event.Start\"),\n /** Documented: findMeetingTimes has no application permission. */\n delegatedOnly: () => g(401, \"UnknownError\", \"\"),\n /** Verified live (workspace.permissions.mail-only-app): places and To Do without permission. */\n unknownAuthError: () => g(401, \"UnknownError\", \"\"),\n // Assumed codes for calendar sharing validation (not observed).\n invalidDelegateRole: () =>\n x(400, \"ErrorInvalidParameter\", \"Delegate roles can only be granted on the primary calendar.\"),\n /** Verified live: a delegate role on a secondary calendar. */\n sharingRoleNotSupported: (role: string, address: string) =>\n x(\n 400,\n \"ErrorInvalidRequest\",\n `Your request can't be completed. Sharing with permission level '${role.charAt(0).toUpperCase()}${role.slice(1)}' is not supported for this calendar for user '${address}'.`,\n ),\n /** Verified live: PATCH of a calendarPermission without role. */\n permissionLevelRequired: () =>\n x(\n 400,\n \"ErrorInvalidRequest\",\n \"Your request can't be completed. Permission level needs to be specified when sharing calendar.\",\n ),\n /** Verified live: a sharee listing the owner's calendarPermissions. */\n notSupported: () => x(400, \"ErrorNotSupported\", \"Specified method is not supported.\"),\n\n // ---- generic ----\n notImplemented: (what: string) => g(501, \"NotImplemented\", `The emulator does not implement ${what}.`),\n internal: (detail: string) => g(500, \"InternalServerError\", detail),\n};\n\n/** WWW-Authenticate header Graph returns on 401 (00000003-... is the Microsoft Graph app id). */\nexport function wwwAuthenticate(): Record<string, string> {\n return {\n \"WWW-Authenticate\":\n 'Bearer realm=\"\", authorization_uri=\"https://login.microsoftonline.com/common/oauth2/authorize\", client_id=\"00000003-0000-0000-c000-000000000000\"',\n };\n}\n\nexport interface ErrorRenderContext {\n requestId: string;\n clientRequestId: string;\n now?: Date;\n}\n\nexport function renderError(\n err: GraphError,\n ctx: ErrorRenderContext,\n): { status: number; body: unknown; headers: Record<string, string> } {\n if (err.layer === \"sharepoint\") {\n const error = {\n code: err.code,\n ...(err.innerCode ? { innerError: { code: err.innerCode } } : {}),\n message: err.message,\n ...err.extra,\n };\n return { status: err.status, body: { error }, headers: err.headers };\n }\n const error: Record<string, unknown> = { code: err.code, message: err.message, ...err.extra };\n if (err.layer === \"graph\" || err.layer === \"todo\") {\n const date = (ctx.now ?? new Date()).toISOString().slice(0, 19);\n error.innerError = {\n ...(err.innerCode ? { code: err.innerCode } : {}),\n date,\n \"request-id\": ctx.requestId,\n \"client-request-id\": ctx.clientRequestId,\n };\n }\n return { status: err.status, body: { error }, headers: err.headers };\n}\n","/**\n * Calendar store: calendars (IPF.Appointment folders), calendar groups,\n * events, recurring series and their occurrences.\n *\n * Events share the mailbox counters, id codec, change numbers and journal\n * with mail, so ids, etags, delta and notifications behave like the rest of\n * the mailbox. Behavior sources are in docs/research/calendar-contacts.md\n * (documented or observed in recorded traffic; nothing here has been\n * verified against the reference tenant, which has no Calendars permission).\n */\nimport { randomBytes } from \"node:crypto\";\nimport type { Exchange } from \"./exchange.js\";\nimport { decodeId, encodeChangeKey, encodeImmutableId, encodeItemId, encodeOccurrenceId } from \"./ids.js\";\nimport type { CalendarGroupRecord, EventRecord, FolderRecord, MailboxRecord, RecurrenceRecord } from \"./model.js\";\nimport { resolveZone, utcToWall, wallToUtc } from \"./timezones.js\";\n\nconst ISO_DATE_PARTS = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport const DAY = 86_400_000;\n/** The \"never\" time Exchange reports for responses that have not happened. */\nexport const ZERO_TIME = \"0001-01-01T00:00:00Z\";\n\n// ---------------------------------------------------------------------------\n// Global object ids (MS-OXOCAL PidLidGlobalObjectId)\n// ---------------------------------------------------------------------------\n\nconst GOID_PREFIX = \"040000008200E00074C5B7101A82E008\";\n\n/** A new global object id: class id, zero date, FILETIME, reserved, 16 random bytes. */\nexport function newGoid(at = Date.now()): string {\n const filetime = (BigInt(at) * 10000n + 116444736000000000n).toString(16).padStart(16, \"0\");\n // FILETIME is stored little-endian.\n const le = filetime.match(/../g)!.reverse().join(\"\");\n return `${GOID_PREFIX}00000000${le}0000000000000000${\"10000000\"}${randomBytes(16).toString(\"hex\")}`.toUpperCase();\n}\n\n/** An occurrence's iCalUId: the series uid with the original date in bytes 16 to 19. */\nexport function occurrenceGoid(uid: string, dateMs: number): string {\n const d = new Date(dateMs);\n const hex =\n d.getUTCFullYear().toString(16).padStart(4, \"0\") +\n (d.getUTCMonth() + 1).toString(16).padStart(2, \"0\") +\n d.getUTCDate().toString(16).padStart(2, \"0\");\n return `${uid.slice(0, 32)}${hex.toUpperCase()}${uid.slice(40)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Calendars and groups\n// ---------------------------------------------------------------------------\n\nexport const GROUP_CLASSES = {\n my: \"0006f0b7-0000-0000-c000-000000000046\",\n other: \"0006f0b8-0000-0000-c000-000000000046\",\n people: \"0006f0b9-0000-0000-c000-000000000046\",\n};\n\nexport type CalendarGroup = CalendarGroupRecord & { calendars: number[] };\n\nexport function isCalendarFolder(f: FolderRecord): boolean {\n return f.folderClass.startsWith(\"IPF.Appointment\");\n}\n\nexport function defaultCalendar(ex: Exchange, mbx: MailboxRecord): FolderRecord {\n return ex.wellKnown(mbx, \"calendar\");\n}\n\n/**\n * Calendar groups, seeded with the default groups (verified live,\n * exp.mailbox.outlook-web-state): user mailboxes have My Calendars, Other\n * Calendars and People's Calendars; shared mailboxes only the first two.\n */\nexport function calendarGroups(ex: Exchange, mbx: MailboxRecord): CalendarGroup[] {\n if (!mbx.calendarGroups) {\n const root = ex.wellKnown(mbx, \"msgfolderroot\");\n const make = (name: string, classId: string, calendars: number[]): CalendarGroup => {\n const counter = ex.alloc(mbx);\n mbx.issued[counter] = \"item\";\n return {\n id: encodeItemId(mbx.store, root.counter, counter),\n name,\n classId,\n changeNumber: ex.bump(mbx),\n calendars,\n };\n };\n mbx.calendarGroups = [\n make(\"My Calendars\", GROUP_CLASSES.my, [defaultCalendar(ex, mbx).counter]),\n make(\"Other Calendars\", GROUP_CLASSES.other, []),\n ...(mbx.kind === \"user\" ? [make(\"People's Calendars\", GROUP_CLASSES.people, [])] : []),\n ];\n }\n return mbx.calendarGroups;\n}\n\nexport function groupOfCalendar(ex: Exchange, mbx: MailboxRecord, f: FolderRecord): CalendarGroup {\n const groups = calendarGroups(ex, mbx);\n return groups.find((g) => g.calendars.includes(f.counter)) ?? groups[0];\n}\n\n/** Every calendar folder in the mailbox, the default one first. */\nexport function calendarFolders(ex: Exchange, mbx: MailboxRecord): FolderRecord[] {\n const def = defaultCalendar(ex, mbx);\n const all = ex\n .descendants(mbx, ex.wellKnown(mbx, \"msgfolderroot\"))\n .filter((f) => isCalendarFolder(f) && f.counter !== def.counter && !f.isHidden);\n return [def, ...all];\n}\n\nexport interface CalendarMeta {\n color: string;\n hexColor: string;\n /** Item counter of the calendar's navigation entry; its item id is the calendar's Graph id. */\n navCounter?: number;\n}\n\n/** Folder counter the navigation entries are filed under (any fixed folder works for the id). */\nconst NAV_FOLDER = 1;\n\n/**\n * Graph id of a calendar (verified live, calendar.meetings.attendee-links):\n * not the folder id but the id of the calendar's navigation item, a 70-byte\n * item entry. The folder id names the same calendar in the calendar links of\n * a single event and is accepted as a key too.\n */\nexport function calendarId(ex: Exchange, mbx: MailboxRecord, f: FolderRecord): string {\n const m = calendarMeta(mbx, f);\n if (m.navCounter === undefined) {\n m.navCounter = ex.alloc(mbx);\n }\n return encodeItemId(mbx.store, NAV_FOLDER, m.navCounter);\n}\n\n/** The calendar folder whose navigation item id this is, or null. */\nexport function calendarByNavId(mbx: MailboxRecord, id: string): number | null {\n const d = decodeId(id);\n if (d?.kind !== \"item\" || d.folderCounter !== NAV_FOLDER) {\n return null;\n }\n for (const [counter, m] of Object.entries(mbx.calendarMeta ?? {})) {\n if ((m as CalendarMeta).navCounter === d.itemCounter) {\n return Number(counter);\n }\n }\n return null;\n}\n\nexport function calendarMeta(mbx: MailboxRecord, f: FolderRecord): CalendarMeta {\n if (!mbx.calendarMeta) {\n mbx.calendarMeta = {};\n }\n mbx.calendarMeta[f.counter] ??= { color: \"auto\", hexColor: \"\", isDefault: false };\n return mbx.calendarMeta[f.counter];\n}\n\n/** Hex values Outlook uses for the named calendar colors. */\nexport const CALENDAR_COLORS: Record<string, string> = {\n auto: \"\",\n lightBlue: \"#a6d1f5\",\n lightGreen: \"#87d28e\",\n lightOrange: \"#fcab73\",\n lightGray: \"#c0c0c0\",\n lightYellow: \"#f4d07a\",\n lightTeal: \"#5fd2c3\",\n lightPink: \"#f8a9ce\",\n lightBrown: \"#e2b38a\",\n lightRed: \"#f88a8b\",\n maxColor: \"\",\n};\n\n// ---------------------------------------------------------------------------\n// Events\n// ---------------------------------------------------------------------------\n\nexport function eventsOf(mbx: MailboxRecord): Record<string, EventRecord> {\n if (!mbx.events) {\n mbx.events = {};\n }\n return mbx.events;\n}\n\nexport function eventChangeKey(mbx: MailboxRecord, e: EventRecord): string {\n return encodeChangeKey(mbx.store, e.changeNumber, \"event\");\n}\n\n/** The long change key form carried in change notifications (observed). */\nexport function eventLongChangeKey(mbx: MailboxRecord, e: EventRecord): string {\n return encodeChangeKey(mbx.store, e.changeNumber, \"eventLong\");\n}\n\nexport function eventId(mbx: MailboxRecord, e: EventRecord, immutable = false): string {\n if (e.type === \"exception\" && e.seriesMasterCounter !== null && e.originalStartMs !== null) {\n const master = eventsOf(mbx)[e.seriesMasterCounter];\n if (master) {\n return occurrenceId(mbx, master, localDate(master, e.originalStartMs));\n }\n }\n return immutable\n ? encodeImmutableId(mbx.store, e.immutableCounter)\n : encodeItemId(mbx.store, e.folderCounter, e.counter);\n}\n\nexport function occurrenceId(mbx: MailboxRecord, master: EventRecord, dateMs: number): string {\n return encodeOccurrenceId(mbx.store, master.folderCounter, master.counter, dateMs);\n}\n\n/** \"OID.{masterId}.{yyyy-MM-dd}\" (documented and observed). */\nexport function occurrenceKey(mbx: MailboxRecord, master: EventRecord, dateMs: number): string {\n return `OID.${eventId(mbx, master)}.${new Date(dateMs).toISOString().slice(0, 10)}`;\n}\n\nexport function eventsIn(mbx: MailboxRecord, folderCounter: number): EventRecord[] {\n return Object.values(eventsOf(mbx)).filter((e) => e.folderCounter === folderCounter);\n}\n\nexport function defaultEvent(organizer: {\n name: string;\n address: string;\n}): Omit<\n EventRecord,\n \"counter\" | \"immutableCounter\" | \"folderCounter\" | \"changeNumber\" | \"createdDateTime\" | \"lastModifiedDateTime\"\n> {\n const uid = newGoid();\n return {\n categories: [],\n extensions: [],\n singleValueExtendedProperties: [],\n multiValueExtendedProperties: [],\n uid,\n iCalUId: uid,\n type: \"singleInstance\",\n seriesMasterCounter: null,\n originalStartMs: null,\n subject: \"\",\n // Verified: an event created without a body holds empty text.\n body: { contentType: \"text\", content: \"\" },\n importance: \"normal\",\n sensitivity: \"normal\",\n showAs: \"busy\",\n isAllDay: false,\n isCancelled: false,\n isDraft: false,\n startMs: 0,\n endMs: 0,\n originalStartTimeZone: \"UTC\",\n originalEndTimeZone: \"UTC\",\n location: emptyLocation(),\n locations: [],\n attendees: [],\n organizer: { emailAddress: { ...organizer } },\n isOrganizer: true,\n responseStatus: { response: \"organizer\", time: ZERO_TIME },\n responseRequested: true,\n allowNewTimeProposals: true,\n hideAttendees: false,\n isReminderOn: true,\n reminderMinutesBeforeStart: 15,\n reminderDismissedMs: null,\n reminderSnoozedUntilMs: null,\n isOnlineMeeting: false,\n onlineMeetingProvider: \"unknown\",\n transactionId: null,\n recurrence: null,\n cancelledOccurrences: [],\n attachments: [],\n sequence: 0,\n };\n}\n\nexport function emptyLocation(): Record<string, unknown> {\n return { displayName: \"\", locationType: \"default\", uniqueIdType: \"unknown\", address: {}, coordinates: {} };\n}\n\nexport function newEvent(\n ex: Exchange,\n mbx: MailboxRecord,\n folder: FolderRecord,\n init: Partial<EventRecord> & Pick<EventRecord, \"startMs\" | \"endMs\">,\n): EventRecord {\n const now = createdStamp();\n const counter = ex.alloc(mbx);\n const owner = { name: mbx.displayName, address: mbx.address };\n const e: EventRecord = {\n ...defaultEvent(owner),\n ...init,\n counter,\n immutableCounter: counter,\n folderCounter: folder.counter,\n changeNumber: ex.bump(mbx),\n createdDateTime: now,\n lastModifiedDateTime: now,\n };\n eventsOf(mbx)[counter] = e;\n mbx.issued[counter] = \"item\";\n mbx.immutable[counter] = counter;\n ex.journal(mbx, \"created\", \"event\", folder.counter, counter);\n return e;\n}\n\n/** Event timestamps carry 7 fractional digits (observed). */\nexport function createdStamp(d = new Date()): string {\n return `${d.toISOString().slice(0, 23)}0000Z`;\n}\n\nexport function touchEvent(ex: Exchange, mbx: MailboxRecord, e: EventRecord): void {\n e.changeNumber = ex.bump(mbx);\n e.lastModifiedDateTime = createdStamp();\n ex.journal(mbx, \"updated\", \"event\", e.folderCounter, e.counter);\n}\n\nexport function moveEvent(ex: Exchange, mbx: MailboxRecord, e: EventRecord, dest: FolderRecord): EventRecord {\n if (dest.counter === e.folderCounter) {\n return e;\n }\n const map = eventsOf(mbx);\n const formerId = eventId(mbx, e);\n delete map[e.counter];\n ex.journal(mbx, \"deleted\", \"event\", e.folderCounter, e.counter, formerId);\n const counter = ex.alloc(mbx);\n e.counter = counter;\n e.folderCounter = dest.counter;\n e.changeNumber = ex.bump(mbx);\n e.lastModifiedDateTime = createdStamp();\n map[counter] = e;\n mbx.issued[counter] = \"item\";\n mbx.immutable[e.immutableCounter] = counter;\n ex.journal(mbx, \"created\", \"event\", dest.counter, counter);\n return e;\n}\n\n/** Remove an event and its exceptions entirely. */\nexport function purgeEvent(ex: Exchange, mbx: MailboxRecord, e: EventRecord): void {\n const map = eventsOf(mbx);\n for (const x of exceptionsOf(mbx, e)) {\n delete map[x.counter];\n mbx.immutable[x.immutableCounter] = -1;\n }\n const formerId = eventId(mbx, e);\n delete map[e.counter];\n mbx.immutable[e.immutableCounter] = -1;\n ex.journal(mbx, \"deleted\", \"event\", e.folderCounter, e.counter, formerId);\n}\n\n/** DELETE: soft delete into Recoverable Items, like messages (verified for messages). */\nexport function deleteEvent(ex: Exchange, mbx: MailboxRecord, e: EventRecord, to = \"recoverableitemsdeletions\"): void {\n const dest = ex.wellKnown(mbx, to);\n if (e.folderCounter === dest.counter) {\n purgeEvent(ex, mbx, e);\n return;\n }\n const exceptions = exceptionsOf(mbx, e);\n moveEvent(ex, mbx, e, dest);\n for (const x of exceptions) {\n x.seriesMasterCounter = e.counter;\n }\n}\n\nexport function exceptionsOf(mbx: MailboxRecord, master: EventRecord): EventRecord[] {\n return Object.values(eventsOf(mbx)).filter((x) => x.type === \"exception\" && x.seriesMasterCounter === master.counter);\n}\n\n// ---------------------------------------------------------------------------\n// Recurrence\n// ---------------------------------------------------------------------------\n\nexport const WEEKDAYS = [\"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\"];\nconst INDEX = [\"first\", \"second\", \"third\", \"fourth\", \"last\"];\n\n/** UTC midnight of a \"yyyy-MM-dd\" date. */\nexport function dateOnly(s: string): number | null {\n const m = ISO_DATE_PARTS.exec(s);\n if (!m) {\n return null;\n }\n const ms = Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\n return Number.isNaN(ms) ? null : ms;\n}\n\nexport function formatDate(ms: number): string {\n return new Date(ms).toISOString().slice(0, 10);\n}\n\n/** Local (recurrence zone) date of an instant, as UTC midnight ms. */\nexport function localDateIn(iana: string, utcMs: number): number {\n const wall = utcToWall(utcMs, iana);\n return wall - (((wall % DAY) + DAY) % DAY);\n}\n\n/** IANA zone a series is computed in: its recurrenceTimeZone, else its start zone. */\nexport function seriesZone(master: EventRecord): string {\n const name = master.recurrence?.range.recurrenceTimeZone || master.originalStartTimeZone || \"UTC\";\n return resolveZone(name)?.iana ?? \"UTC\";\n}\n\nexport function localDate(master: EventRecord, utcMs: number): number {\n return localDateIn(seriesZone(master), utcMs);\n}\n\nfunction daysInMonth(y: number, m: number): number {\n return new Date(Date.UTC(y, m + 1, 0)).getUTCDate();\n}\n\n/** The nth (or last) day in a month whose weekday is in `days`. */\nfunction relativeDay(y: number, m: number, days: number[], index: string): number | null {\n const matches: number[] = [];\n for (let d = 1; d <= daysInMonth(y, m); d += 1) {\n if (days.includes(new Date(Date.UTC(y, m, d)).getUTCDay())) {\n matches.push(d);\n }\n }\n if (!matches.length) {\n return null;\n }\n const i = INDEX.indexOf(index);\n if (index === \"last\") {\n return matches.at(-1)!;\n }\n return matches[i] ?? null;\n}\n\n/** Candidate local dates of a pattern, in order, starting at the range start. */\nfunction* patternDates(r: RecurrenceRecord): Generator<number> {\n const start = dateOnly(r.range.startDate)!;\n const p = r.pattern;\n const interval = Math.max(1, p.interval);\n const days = p.daysOfWeek.map((d) => WEEKDAYS.indexOf(d.toLowerCase())).filter((d) => d >= 0);\n const s = new Date(start);\n switch (p.type) {\n case \"daily\":\n for (let k = 0; ; k += 1) {\n yield start + k * interval * DAY;\n }\n case \"weekly\": {\n const first = WEEKDAYS.indexOf((p.firstDayOfWeek || \"sunday\").toLowerCase());\n const offset = (s.getUTCDay() - first + 7) % 7;\n const weekStart = start - offset * DAY;\n const order = days.map((d) => (d - first + 7) % 7).sort((a, b) => a - b);\n if (!order.length) {\n return;\n }\n for (let w = 0; ; w += 1) {\n for (const o of order) {\n const d = weekStart + (w * interval * 7 + o) * DAY;\n if (d >= start) {\n yield d;\n }\n }\n }\n }\n case \"absoluteMonthly\":\n case \"relativeMonthly\":\n case \"absoluteYearly\":\n case \"relativeYearly\": {\n const yearly = p.type.endsWith(\"Yearly\");\n for (let k = 0; ; k += 1) {\n let y: number;\n let m: number;\n if (yearly) {\n y = s.getUTCFullYear() + k * interval;\n m = p.month - 1;\n } else {\n const total = s.getUTCMonth() + k * interval;\n y = s.getUTCFullYear() + Math.floor(total / 12);\n m = total % 12;\n }\n let day: number | null;\n if (p.type.startsWith(\"absolute\")) {\n day = Math.min(p.dayOfMonth, daysInMonth(y, m));\n } else {\n day = relativeDay(y, m, days, p.index);\n }\n if (day === null) {\n continue;\n }\n const d = Date.UTC(y, m, day);\n if (d >= start) {\n yield d;\n }\n if (k > 20_000) {\n return;\n }\n }\n }\n default:\n return;\n }\n}\n\nexport interface Occurrence {\n /** Original local date (UTC midnight ms). */\n dateMs: number;\n startMs: number;\n endMs: number;\n}\n\n/**\n * Occurrence slots of a series between two instants (overlap rule: start <\n * windowEnd and end > windowStart, assumed). Cancelled occurrences are left\n * out; exceptions are handled by the caller.\n */\nexport function expandSeries(master: EventRecord, fromMs: number, toMs: number, limit = 5000): Occurrence[] {\n const r = master.recurrence;\n if (!r) {\n return [];\n }\n const iana = seriesZone(master);\n const startWall = utcToWall(master.startMs, iana);\n const timeOfDay = ((startWall % DAY) + DAY) % DAY;\n const duration = master.endMs - master.startMs;\n const end = r.range.type === \"endDate\" ? dateOnly(r.range.endDate) : null;\n const out: Occurrence[] = [];\n let n = 0;\n let guard = 0;\n for (const d of patternDates(r)) {\n guard += 1;\n if (guard > 200_000) {\n break;\n }\n if (end !== null && d > end) {\n break;\n }\n if (r.range.type === \"numbered\" && n >= r.range.numberOfOccurrences) {\n break;\n }\n n += 1;\n const startMs = wallToUtc(d + timeOfDay, iana);\n if (startMs >= toMs) {\n break;\n }\n if (master.cancelledOccurrences.includes(d)) {\n continue;\n }\n const endMs = startMs + duration;\n if (endMs > fromMs || (endMs === startMs && startMs >= fromMs)) {\n out.push({ dateMs: d, startMs, endMs });\n }\n if (out.length >= limit) {\n break;\n }\n }\n return out;\n}\n\n/** The occurrence of a series on a given original local date, if there is one. */\nexport function occurrenceOn(master: EventRecord, dateMs: number): Occurrence | null {\n const all = expandSeries(master, dateMs - 2 * DAY, dateMs + 3 * DAY);\n return all.find((o) => o.dateMs === dateMs) ?? null;\n}\n\n/** Is the date a slot of the series (cancelled ones included)? */\nexport function isSeriesDate(master: EventRecord, dateMs: number): boolean {\n const r = master.recurrence;\n if (!r) {\n return false;\n }\n const end = r.range.type === \"endDate\" ? dateOnly(r.range.endDate) : null;\n let n = 0;\n for (const d of patternDates(r)) {\n if (d > dateMs) {\n return false;\n }\n if (end !== null && d > end) {\n return false;\n }\n if (r.range.type === \"numbered\" && n >= r.range.numberOfOccurrences) {\n return false;\n }\n n += 1;\n if (d === dateMs) {\n return true;\n }\n if (n > 200_000) {\n return false;\n }\n }\n return false;\n}\n\n/** First pattern date on or after the range start (the series' real first occurrence). */\nexport function firstSeriesDate(r: RecurrenceRecord): number | null {\n for (const d of patternDates(r)) {\n return d;\n }\n return null;\n}\n\n/** A virtual occurrence record: the master with the slot's times and identity. */\nexport function occurrenceView(master: EventRecord, o: Occurrence): EventRecord {\n return {\n ...master,\n type: \"occurrence\" as EventRecord[\"type\"],\n seriesMasterCounter: master.counter,\n originalStartMs: o.startMs,\n startMs: o.startMs,\n endMs: o.endMs,\n recurrence: null,\n iCalUId: occurrenceGoid(master.uid, o.dateMs),\n };\n}\n\nexport { isoSeconds } from \"./exchange.js\";\n","/**\n * Exchange identifier codec.\n *\n * Reproduces the byte layout of the REST ids that Exchange Online returns\n * through Microsoft Graph (verified by decoding live ids, see\n * docs/spec/identifiers.md):\n *\n * folder id (87 bytes): 01 03 24 00 <mailbox guid ascii x36> 00 2e 00 <folder entry id x44>\n * item id (111 bytes): 01 03 24 00 <mailbox guid ascii x36> 00 46 00 <message entry id x68>\n *\n * That is the compact form (\"AQMk...\"). Some mailboxes use the standard form\n * (\"AAMk...\", verified on two of the five test mailboxes): version byte 00\n * and the full 4-byte entry id flags, so folder ids are 89 bytes and item ids\n * 113 bytes (base64 ends in \"=\").\n * conversation id (59 b): 00 04 24 00 <mailbox guid ascii x36> 00 10 00 <conversation guid x16>\n * change key (30 bytes): <class u32le> 16 00 00 00 <store guid x16> <change number u48be>\n *\n * Entry ids embed 6-byte global counters for the folder and the item. A\n * message's id therefore changes when it moves to another folder, exactly as\n * the live service behaves.\n *\n * Exchange encodes these with standard base64 but swaps \"/\" for \"-\" and \"+\"\n * for \"_\" (the reverse of RFC 4648 base64url).\n */\nimport { randomBytes } from \"node:crypto\";\n\nconst TRAILING_PADDING = /[=]+$/;\nconst URL_SAFE_PADDING_COUNT = /^([A-Za-z0-9\\-_]*)([012])$/;\nconst BASE64_ANY_ALPHABET = /^[A-Za-z0-9\\-_+/]+={0,2}$/;\nconst GUID_FORMAT = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport function exchangeBase64(buf: Buffer): string {\n return buf.toString(\"base64\").replace(/\\//g, \"-\").replace(/\\+/g, \"_\");\n}\n\nexport function fromExchangeBase64(s: string): Buffer | null {\n if (!BASE64_ANY_ALPHABET.test(s)) {\n return null;\n }\n const std = s.replace(/-/g, \"/\").replace(/_/g, \"+\");\n if (std.replace(TRAILING_PADDING, \"\").length % 4 === 1) {\n return null;\n }\n return Buffer.from(std, \"base64\");\n}\n\nexport interface StoreIdentity {\n /** Mailbox GUID (lowercase, dashed). */\n mailboxGuid: string;\n /** 16-byte provider uid, hex. */\n providerUid: string;\n /** 16-byte database (replica) GUID, hex. */\n databaseGuid: string;\n /** Standard (\"AAMk\") instead of compact (\"AQMk\") id form. */\n standardIds?: boolean;\n}\n\nexport function newStoreIdentity(mailboxGuid: string): StoreIdentity {\n return {\n mailboxGuid,\n providerUid: randomBytes(16).toString(\"hex\"),\n databaseGuid: randomBytes(16).toString(\"hex\"),\n };\n}\n\nfunction gc(counter: number): Buffer {\n // 6-byte global counter, big-endian, as Exchange stores it.\n const b = Buffer.alloc(6);\n b.writeUIntBE(counter, 0, 6);\n return b;\n}\n\nfunction header(store: StoreIdentity, entryLen: number): Buffer {\n return Buffer.concat([\n Buffer.from([store.standardIds ? 0x00 : 0x01, 0x03, 0x24, 0x00]),\n Buffer.from(store.mailboxGuid, \"ascii\"),\n Buffer.from([0x00, entryLen, 0x00]),\n ]);\n}\n\n/** Entry id flags: 2 bytes in the compact form, 4 in the standard form. */\nfunction flags(store: StoreIdentity): Buffer {\n return store.standardIds ? Buffer.from([0x00, 0x00, 0x00, 0x00]) : Buffer.from([0x00, 0x03]);\n}\n\nexport function encodeFolderId(store: StoreIdentity, folderCounter: number): string {\n const entry = Buffer.concat([\n flags(store),\n Buffer.from(store.providerUid, \"hex\"),\n Buffer.from([0x01, 0x00]),\n Buffer.from(store.databaseGuid, \"hex\"),\n gc(folderCounter),\n Buffer.from([0x00, 0x00]),\n ]);\n return exchangeBase64(Buffer.concat([header(store, 0x2e), entry]));\n}\n\nexport function encodeItemId(store: StoreIdentity, folderCounter: number, itemCounter: number): string {\n const entry = Buffer.concat([\n flags(store),\n Buffer.from(store.providerUid, \"hex\"),\n Buffer.from([0x07, 0x00]),\n Buffer.from(store.databaseGuid, \"hex\"),\n gc(folderCounter),\n Buffer.from([0x00, 0x00]),\n Buffer.from(store.databaseGuid, \"hex\"),\n gc(itemCounter),\n Buffer.from([0x00, 0x00]),\n ]);\n return exchangeBase64(Buffer.concat([header(store, 0x46), entry]));\n}\n\nexport function encodeConversationId(mailboxGuid: string, conversationGuid: Buffer): string {\n return exchangeBase64(\n Buffer.concat([\n Buffer.from([0x00, 0x04, 0x24, 0x00]),\n Buffer.from(mailboxGuid, \"ascii\"),\n Buffer.from([0x00, 0x10, 0x00]),\n conversationGuid,\n ]),\n );\n}\n\n/**\n * Immutable item id (51 bytes, verified live): a fixed 25 byte prefix, the\n * entry id type 0x0d, the database GUID and the item's original global\n * counter. It does not embed the folder, so it survives moves.\n */\nconst IMMUTABLE_PREFIX = Buffer.from(\"0009002e00000000001d840311aa6611cd9bc800aa002fc45a\", \"hex\");\n\n/**\n * MAPI form of an immutable id (46 bytes, verified live): 4 zero flag bytes,\n * the constant GUID that ends the restImmutableEntryId prefix (the same in\n * every mailbox), then the entry type 0x0d and the 24-byte tail.\n */\nexport function immutableEntryIdBytes(restImmutable: Buffer): Buffer {\n return Buffer.concat([Buffer.alloc(4), IMMUTABLE_PREFIX.subarray(9), restImmutable.subarray(25)]);\n}\n\n/** The restImmutableEntryId binary of a MAPI immutable entry id, or null. */\nexport function restImmutableFromEntryId(bin: Buffer): Buffer | null {\n if (bin.length !== 46 || bin.readUInt32BE(0) !== 0) {\n return null;\n }\n if (!bin.subarray(4, 20).equals(IMMUTABLE_PREFIX.subarray(9)) || bin[20] !== 0x0d) {\n return null;\n }\n return Buffer.concat([IMMUTABLE_PREFIX, bin.subarray(20)]);\n}\n\n/**\n * REST id for a MAPI entry id issued by another mailbox, framed with the\n * caller's mailbox (verified live: translateExchangeIds converts it instead\n * of failing). Returns null for bytes that are not an entry id.\n */\nexport function foreignEntryIdToRest(store: StoreIdentity, bin: Buffer): string | null {\n if ((bin.length !== 46 && bin.length !== 70) || bin.readUInt32BE(0) !== 0) {\n return null;\n }\n if (bin[20] !== (bin.length === 46 ? 0x01 : 0x07)) {\n return null;\n }\n return exchangeBase64(Buffer.concat([header(store, bin.length === 46 ? 0x2e : 0x46), flags(store), bin.subarray(4)]));\n}\n\nexport function encodeImmutableId(store: StoreIdentity, immutableCounter: number): string {\n return exchangeBase64(\n Buffer.concat([\n IMMUTABLE_PREFIX,\n Buffer.from([0x0d, 0x00]),\n Buffer.from(store.databaseGuid, \"hex\"),\n gc(immutableCounter),\n Buffer.from([0x00, 0x00]),\n ]),\n );\n}\n\n/** .NET ticks (100 ns since 0001-01-01) of a UTC instant. */\nexport function dotnetTicks(ms: number): bigint {\n return (BigInt(ms) + 62135596800000n) * 10000n;\n}\n\nexport function fromDotnetTicks(ticks: bigint): number {\n return Number(ticks / 10000n - 62135596800000n);\n}\n\n/**\n * Occurrence id of a recurring series (structure decoded from real ids,\n * docs/research/calendar-contacts.md 3.5): the mailbox prefix, the marker\n * 01 51 00 08, the .NET ticks of the occurrence's original local date at\n * midnight, then 00 46 00, the master's entry id and the trailer 00 10.\n */\nexport function encodeOccurrenceId(\n store: StoreIdentity,\n folderCounter: number,\n masterCounter: number,\n dateMs: number,\n): string {\n const master = fromExchangeBase64(encodeItemId(store, folderCounter, masterCounter))!;\n const ticks = Buffer.alloc(8);\n ticks.writeBigUInt64BE(dotnetTicks(dateMs));\n return exchangeBase64(\n Buffer.concat([\n master.subarray(0, 40),\n Buffer.from([0x01, 0x51, 0x00, 0x08]),\n ticks,\n master.subarray(40),\n Buffer.from([0x00, 0x10]),\n ]),\n );\n}\n\nexport type DecodedId =\n | { kind: \"folder\"; mailboxGuid: string; databaseGuid: string; folderCounter: number }\n | {\n kind: \"occurrence\";\n mailboxGuid: string;\n databaseGuid: string;\n folderCounter: number;\n itemCounter: number;\n /** UTC midnight of the original local date. */\n dateMs: number;\n }\n | { kind: \"item\"; mailboxGuid: string; databaseGuid: string; folderCounter: number; itemCounter: number }\n | { kind: \"immutable\"; databaseGuid: string; immutableCounter: number };\n\n/**\n * Decode a REST id. Returns null when the id is malformed (the service answers\n * ErrorInvalidIdMalformed for these).\n */\nexport function decodeId(id: string): DecodedId | null {\n const buf = fromExchangeBase64(id);\n if (!buf) {\n return null;\n }\n if (buf.length === 51 && buf.subarray(0, 25).equals(IMMUTABLE_PREFIX) && buf[25] === 0x0d) {\n return {\n kind: \"immutable\",\n databaseGuid: buf.subarray(27, 43).toString(\"hex\"),\n immutableCounter: buf.readUIntBE(43, 6),\n };\n }\n if (buf.length < 44) {\n return null;\n }\n if ((buf[0] !== 0x01 && buf[0] !== 0x00) || buf[1] !== 0x03 || buf[2] !== 0x24) {\n return null;\n }\n if (buf[40] === 0x01 && buf[41] === 0x51 && buf[42] === 0x00 && buf[43] === 0x08 && buf.length > 54) {\n const ticks = buf.readBigUInt64BE(44);\n const inner = Buffer.concat([buf.subarray(0, 40), buf.subarray(52, buf.length - 2)]);\n const master = decodeId(exchangeBase64(inner));\n if (master?.kind !== \"item\") {\n return null;\n }\n return { ...master, kind: \"occurrence\", dateMs: fromDotnetTicks(ticks) };\n }\n const mailboxGuid = buf.subarray(4, 40).toString(\"ascii\");\n if (!GUID_FORMAT.test(mailboxGuid)) {\n return null;\n }\n const { 41: len } = buf;\n // Offset of the entry id body after the flags (2 bytes compact, 4 standard).\n const o = buf[0] === 0x01 ? 43 + 2 : 43 + 4;\n const extra = o - 45;\n if (buf.length === 87 + extra && len === 0x2e) {\n return {\n kind: \"folder\",\n mailboxGuid,\n databaseGuid: buf.subarray(o + 18, o + 34).toString(\"hex\"),\n folderCounter: buf.readUIntBE(o + 34, 6),\n };\n }\n if (buf.length === 111 + extra && len === 0x46) {\n const folderCounter = buf.readUIntBE(o + 34, 6);\n const itemCounter = buf.readUIntBE(o + 34 + 8 + 16, 6);\n return {\n kind: \"item\",\n mailboxGuid,\n databaseGuid: buf.subarray(o + 18, o + 34).toString(\"hex\"),\n folderCounter,\n itemCounter,\n };\n }\n return null;\n}\n\nfunction changeKeyClass(kind: string): number {\n if (kind === \"folder\") {\n return 0x01;\n }\n if (kind === \"eventLong\") {\n return 0x0f;\n }\n return kind === \"contact\" ? 0x11 : 0x09;\n}\n\n/** Change key: class marker, length, store GUID, 48-bit change number. */\n/**\n * Change key class markers (first byte): messages 0x09 (verified live),\n * meeting requests and cancellations 0x0b, meeting responses 0x0c, the long\n * event form used in notifications 0x0f, contacts 0x11 (observed in recorded\n * Graph Explorer sandbox traffic, docs/research/calendar-contacts.md 1.4).\n *\n * Events are different: GET returns the short form, the store GUID followed\n * by the change number (22 bytes), with no class header (same source, 1.3).\n */\nexport function encodeChangeKey(\n store: StoreIdentity,\n changeNumber: number,\n kind: \"item\" | \"folder\" | \"event\" | \"eventLong\" | \"contact\" = \"item\",\n): string {\n if (kind === \"event\") {\n const s = Buffer.alloc(22);\n Buffer.from(store.databaseGuid, \"hex\").copy(s, 0);\n s.writeUIntBE(changeNumber, 16, 6);\n return s.toString(\"base64\");\n }\n const cls = changeKeyClass(kind);\n const b = Buffer.alloc(30);\n b.writeUInt32LE(cls, 0);\n b.writeUInt32LE(0x16, 4);\n Buffer.from(store.databaseGuid, \"hex\").copy(b, 8);\n b.writeUIntBE(changeNumber, 24, 6);\n return b.toString(\"base64\");\n}\n\n/**\n * conversationIndex: 1 reserved byte (0x01), 5 bytes derived from the\n * FILETIME of the conversation start, and the 16-byte conversation GUID.\n * Each reply appends a 5-byte child block.\n */\nexport function newConversationIndex(at: Date, guid: Buffer): Buffer {\n const filetime = BigInt(at.getTime()) * 10000n + 116444736000000000n;\n const indexHeader = Buffer.alloc(6);\n indexHeader[0] = 0x01;\n // The top 40 bits of the 64-bit FILETIME (dropping the low 24 bits).\n const top = filetime >> 16n;\n for (let i = 0; i < 5; i += 1) {\n indexHeader[1 + i] = Number((top >> BigInt(8 * (5 - i))) & 0xffn);\n }\n return Buffer.concat([indexHeader, guid]);\n}\n\nexport function childConversationIndex(parent: Buffer, at: Date, parentAt: Date): Buffer {\n const deltaTicks = BigInt(Math.max(0, at.getTime() - parentAt.getTime())) * 10000n;\n // Child block: 1 bit code, 31 bits time delta, 8 bits random, 4 bits sequence (simplified to 5 bytes).\n const delta = Number((deltaTicks >> 18n) & 0x7fffffffn);\n const block = Buffer.alloc(5);\n block.writeUInt32BE(delta >>> 0, 0);\n block[4] = randomBytes(1)[0];\n return Buffer.concat([parent, block]);\n}\n\nexport function conversationGuidFromIndex(index: Buffer): Buffer {\n return index.subarray(6, 22);\n}\n\nexport function newInternetMessageId(): string {\n const server = `EMUP287MB${String(1000 + (randomBytes(2).readUInt16BE(0) % 9000))}`;\n return `<${server}${randomBytes(12).toString(\"hex\").toUpperCase().slice(0, 21)}@${server}.EMUP287.PROD.OUTLOOK.COM>`;\n}\n\n/**\n * Binary id transport for translateExchangeIds (documented): base64 with \"+\"\n * and \"/\" replaced by \"-\" and \"_\", padding removed and the number of removed\n * padding characters appended as a digit.\n */\nexport function urlSafeBinary(buf: Buffer): string {\n const b64 = buf.toString(\"base64\");\n const pad = b64.length - b64.replace(TRAILING_PADDING, \"\").length;\n return `${b64.replace(TRAILING_PADDING, \"\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\")}${pad}`;\n}\n\nexport function fromUrlSafeBinary(s: string): Buffer | null {\n const m = URL_SAFE_PADDING_COUNT.exec(s);\n if (!m) {\n return null;\n }\n return Buffer.from(m[1].replace(/-/g, \"+\").replace(/_/g, \"/\") + \"=\".repeat(Number(m[2])), \"base64\");\n}\n\n/** MAPI PR_ENTRYID of a folder or item (always the 4-byte flags form). */\nexport function entryIdBytes(store: StoreIdentity, folderCounter: number, itemCounter: number | null): Buffer {\n const parts = [\n Buffer.from([0x00, 0x00, 0x00, 0x00]),\n Buffer.from(store.providerUid, \"hex\"),\n Buffer.from([itemCounter === null ? 0x01 : 0x07, 0x00]),\n Buffer.from(store.databaseGuid, \"hex\"),\n gc(folderCounter),\n Buffer.from([0x00, 0x00]),\n ];\n if (itemCounter !== null) {\n parts.push(Buffer.from(store.databaseGuid, \"hex\"), gc(itemCounter), Buffer.from([0x00, 0x00]));\n }\n return Buffer.concat(parts);\n}\n\n/** Parse a MAPI entry id issued by this store. */\nexport function parseEntryId(\n buf: Buffer,\n store: StoreIdentity,\n): { folderCounter: number; itemCounter: number | null } | null {\n if (buf.length !== 46 && buf.length !== 70) {\n return null;\n }\n if (buf.readUInt32BE(0) !== 0) {\n return null;\n }\n if (buf.subarray(4, 20).toString(\"hex\") !== store.providerUid) {\n return null;\n }\n if (buf.subarray(22, 38).toString(\"hex\") !== store.databaseGuid) {\n return null;\n }\n const folderCounter = buf.readUIntBE(38, 6);\n if (buf.length === 46) {\n return buf[20] === 0x01 ? { folderCounter, itemCounter: null } : null;\n }\n if (buf[20] !== 0x07) {\n return null;\n }\n return { folderCounter, itemCounter: buf.readUIntBE(62, 6) };\n}\n","// Generated by scripts/generate-timezones.mjs. Do not edit.\n// Windows to IANA mapping from Unicode CLDR windowsZones.xml (Unicode License v3).\n// Display names from Microsoft's default time zone table plus the generator's overlay.\nexport interface WindowsZone {\n alias: string;\n displayName: string;\n /** Primary IANA zone (CLDR territory 001). */\n iana: string;\n /** Every IANA zone CLDR maps to this Windows zone. */\n ianaAll: string[];\n}\n\nexport const WINDOWS_ZONES: WindowsZone[] = [\n {\n alias: \"Dateline Standard Time\",\n displayName: \"(UTC-12:00) International Date Line West\",\n iana: \"Etc/GMT+12\",\n ianaAll: [\"Etc/GMT+12\"],\n },\n {\n alias: \"UTC-11\",\n displayName: \"(UTC-11:00) Coordinated Universal Time-11\",\n iana: \"Etc/GMT+11\",\n ianaAll: [\"Etc/GMT+11\", \"Pacific/Pago_Pago\", \"Pacific/Niue\", \"Pacific/Midway\"],\n },\n {\n alias: \"Aleutian Standard Time\",\n displayName: \"(UTC-10:00) Aleutian Islands\",\n iana: \"America/Adak\",\n ianaAll: [\"America/Adak\"],\n },\n {\n alias: \"Hawaiian Standard Time\",\n displayName: \"(UTC-10:00) Hawaii\",\n iana: \"Pacific/Honolulu\",\n ianaAll: [\"Pacific/Honolulu\", \"Pacific/Rarotonga\", \"Pacific/Tahiti\", \"Etc/GMT+10\"],\n },\n {\n alias: \"Marquesas Standard Time\",\n displayName: \"(UTC-09:30) Marquesas Islands\",\n iana: \"Pacific/Marquesas\",\n ianaAll: [\"Pacific/Marquesas\"],\n },\n {\n alias: \"Alaskan Standard Time\",\n displayName: \"(UTC-09:00) Alaska\",\n iana: \"America/Anchorage\",\n ianaAll: [\n \"America/Anchorage\",\n \"America/Juneau\",\n \"America/Metlakatla\",\n \"America/Nome\",\n \"America/Sitka\",\n \"America/Yakutat\",\n ],\n },\n {\n alias: \"UTC-09\",\n displayName: \"(UTC-09:00) Coordinated Universal Time-09\",\n iana: \"Etc/GMT+9\",\n ianaAll: [\"Etc/GMT+9\", \"Pacific/Gambier\"],\n },\n {\n alias: \"Pacific Standard Time (Mexico)\",\n displayName: \"(UTC-08:00) Baja California\",\n iana: \"America/Tijuana\",\n ianaAll: [\"America/Tijuana\"],\n },\n {\n alias: \"British Columbia Standard Time\",\n displayName: \"(UTC-08:00) British Columbia\",\n iana: \"America/Vancouver\",\n ianaAll: [\"America/Vancouver\"],\n },\n {\n alias: \"UTC-08\",\n displayName: \"(UTC-08:00) Coordinated Universal Time-08\",\n iana: \"Etc/GMT+8\",\n ianaAll: [\"Etc/GMT+8\", \"Pacific/Pitcairn\"],\n },\n {\n alias: \"Pacific Standard Time\",\n displayName: \"(UTC-08:00) Pacific Time (US & Canada)\",\n iana: \"America/Los_Angeles\",\n ianaAll: [\"America/Los_Angeles\"],\n },\n {\n alias: \"Alberta Standard Time\",\n displayName: \"(UTC-07:00) Alberta\",\n iana: \"America/Edmonton\",\n ianaAll: [\"America/Edmonton\", \"America/Inuvik\"],\n },\n {\n alias: \"US Mountain Standard Time\",\n displayName: \"(UTC-07:00) Arizona\",\n iana: \"America/Phoenix\",\n ianaAll: [\n \"America/Phoenix\",\n \"America/Creston\",\n \"America/Dawson_Creek\",\n \"America/Fort_Nelson\",\n \"America/Hermosillo\",\n \"Etc/GMT+7\",\n ],\n },\n {\n alias: \"Mountain Standard Time (Mexico)\",\n displayName: \"(UTC-07:00) La Paz, Mazatlan\",\n iana: \"America/Mazatlan\",\n ianaAll: [\"America/Mazatlan\"],\n },\n {\n alias: \"Mountain Standard Time\",\n displayName: \"(UTC-07:00) Mountain Time (US & Canada)\",\n iana: \"America/Denver\",\n ianaAll: [\"America/Denver\", \"America/Cambridge_Bay\", \"America/Ciudad_Juarez\", \"America/Boise\"],\n },\n {\n alias: \"Yukon Standard Time\",\n displayName: \"(UTC-07:00) Yukon\",\n iana: \"America/Whitehorse\",\n ianaAll: [\"America/Whitehorse\", \"America/Dawson\"],\n },\n {\n alias: \"Central America Standard Time\",\n displayName: \"(UTC-06:00) Central America\",\n iana: \"America/Guatemala\",\n ianaAll: [\n \"America/Guatemala\",\n \"America/Belize\",\n \"America/Costa_Rica\",\n \"Pacific/Galapagos\",\n \"America/Tegucigalpa\",\n \"America/Managua\",\n \"America/El_Salvador\",\n \"Etc/GMT+6\",\n ],\n },\n {\n alias: \"Central Standard Time\",\n displayName: \"(UTC-06:00) Central Time (US & Canada)\",\n iana: \"America/Chicago\",\n ianaAll: [\n \"America/Chicago\",\n \"America/Rankin_Inlet\",\n \"America/Resolute\",\n \"America/Matamoros\",\n \"America/Ojinaga\",\n \"America/Indiana/Knox\",\n \"America/Indiana/Tell_City\",\n \"America/Menominee\",\n \"America/North_Dakota/Beulah\",\n \"America/North_Dakota/Center\",\n \"America/North_Dakota/New_Salem\",\n ],\n },\n {\n alias: \"Easter Island Standard Time\",\n displayName: \"(UTC-06:00) Easter Island\",\n iana: \"Pacific/Easter\",\n ianaAll: [\"Pacific/Easter\"],\n },\n {\n alias: \"Central Standard Time (Mexico)\",\n displayName: \"(UTC-06:00) Guadalajara, Mexico City, Monterrey\",\n iana: \"America/Mexico_City\",\n ianaAll: [\n \"America/Mexico_City\",\n \"America/Bahia_Banderas\",\n \"America/Merida\",\n \"America/Monterrey\",\n \"America/Chihuahua\",\n \"\",\n ],\n },\n {\n alias: \"Manitoba Standard Time\",\n displayName: \"(UTC-06:00) Manitoba\",\n iana: \"America/Winnipeg\",\n ianaAll: [\"America/Winnipeg\"],\n },\n {\n alias: \"Canada Central Standard Time\",\n displayName: \"(UTC-06:00) Saskatchewan\",\n iana: \"America/Regina\",\n ianaAll: [\"America/Regina\", \"America/Swift_Current\"],\n },\n {\n alias: \"SA Pacific Standard Time\",\n displayName: \"(UTC-05:00) Bogota, Lima, Quito, Rio Branco\",\n iana: \"America/Bogota\",\n ianaAll: [\n \"America/Bogota\",\n \"America/Rio_Branco\",\n \"America/Eirunepe\",\n \"America/Coral_Harbour\",\n \"America/Guayaquil\",\n \"America/Jamaica\",\n \"America/Cayman\",\n \"America/Panama\",\n \"America/Lima\",\n \"Etc/GMT+5\",\n ],\n },\n {\n alias: \"Eastern Standard Time (Mexico)\",\n displayName: \"(UTC-05:00) Chetumal\",\n iana: \"America/Cancun\",\n ianaAll: [\"America/Cancun\"],\n },\n {\n alias: \"Eastern Standard Time\",\n displayName: \"(UTC-05:00) Eastern Time (US & Canada)\",\n iana: \"America/New_York\",\n ianaAll: [\n \"America/New_York\",\n \"America/Nassau\",\n \"America/Toronto\",\n \"America/Iqaluit\",\n \"America/Detroit\",\n \"America/Indiana/Petersburg\",\n \"America/Indiana/Vincennes\",\n \"America/Indiana/Winamac\",\n \"America/Kentucky/Monticello\",\n \"America/Louisville\",\n ],\n },\n {\n alias: \"Haiti Standard Time\",\n displayName: \"(UTC-05:00) Haiti\",\n iana: \"America/Port-au-Prince\",\n ianaAll: [\"America/Port-au-Prince\"],\n },\n {\n alias: \"Cuba Standard Time\",\n displayName: \"(UTC-05:00) Havana\",\n iana: \"America/Havana\",\n ianaAll: [\"America/Havana\"],\n },\n {\n alias: \"US Eastern Standard Time\",\n displayName: \"(UTC-05:00) Indiana (East)\",\n iana: \"America/Indianapolis\",\n ianaAll: [\"America/Indianapolis\", \"America/Indiana/Marengo\", \"America/Indiana/Vevay\"],\n },\n {\n alias: \"Turks And Caicos Standard Time\",\n displayName: \"(UTC-05:00) Turks and Caicos\",\n iana: \"America/Grand_Turk\",\n ianaAll: [\"America/Grand_Turk\"],\n },\n {\n alias: \"Venezuela Standard Time\",\n displayName: \"(UTC-04:30) Caracas\",\n iana: \"America/Caracas\",\n ianaAll: [\"America/Caracas\"],\n },\n {\n alias: \"Paraguay Standard Time\",\n displayName: \"(UTC-04:00) Asuncion\",\n iana: \"America/Asuncion\",\n ianaAll: [\"America/Asuncion\"],\n },\n {\n alias: \"Atlantic Standard Time\",\n displayName: \"(UTC-04:00) Atlantic Time (Canada)\",\n iana: \"America/Halifax\",\n ianaAll: [\n \"America/Halifax\",\n \"Atlantic/Bermuda\",\n \"America/Glace_Bay\",\n \"America/Goose_Bay\",\n \"America/Moncton\",\n \"America/Thule\",\n ],\n },\n {\n alias: \"Central Brazilian Standard Time\",\n displayName: \"(UTC-04:00) Cuiaba\",\n iana: \"America/Cuiaba\",\n ianaAll: [\"America/Cuiaba\", \"America/Campo_Grande\"],\n },\n {\n alias: \"SA Western Standard Time\",\n displayName: \"(UTC-04:00) Georgetown, La Paz, Manaus, San Juan\",\n iana: \"America/La_Paz\",\n ianaAll: [\n \"America/La_Paz\",\n \"America/Antigua\",\n \"America/Anguilla\",\n \"America/Aruba\",\n \"America/Barbados\",\n \"America/St_Barthelemy\",\n \"America/Kralendijk\",\n \"America/Manaus\",\n \"America/Boa_Vista\",\n \"America/Porto_Velho\",\n \"America/Blanc-Sablon\",\n \"America/Curacao\",\n \"America/Dominica\",\n \"America/Santo_Domingo\",\n \"America/Grenada\",\n \"America/Guadeloupe\",\n \"America/Guyana\",\n \"America/St_Kitts\",\n \"America/St_Lucia\",\n \"America/Marigot\",\n \"America/Martinique\",\n \"America/Montserrat\",\n \"America/Puerto_Rico\",\n \"America/Lower_Princes\",\n \"America/Port_of_Spain\",\n \"America/St_Vincent\",\n \"America/Tortola\",\n \"America/St_Thomas\",\n \"Etc/GMT+4\",\n ],\n },\n {\n alias: \"Newfoundland Standard Time\",\n displayName: \"(UTC-03:30) Newfoundland\",\n iana: \"America/St_Johns\",\n ianaAll: [\"America/St_Johns\"],\n },\n {\n alias: \"Tocantins Standard Time\",\n displayName: \"(UTC-03:00) Araguaina\",\n iana: \"America/Araguaina\",\n ianaAll: [\"America/Araguaina\"],\n },\n {\n alias: \"E. South America Standard Time\",\n displayName: \"(UTC-03:00) Brasilia\",\n iana: \"America/Sao_Paulo\",\n ianaAll: [\"America/Sao_Paulo\"],\n },\n {\n alias: \"SA Eastern Standard Time\",\n displayName: \"(UTC-03:00) Cayenne, Fortaleza\",\n iana: \"America/Cayenne\",\n ianaAll: [\n \"America/Cayenne\",\n \"Antarctica/Rothera\",\n \"Antarctica/Palmer\",\n \"America/Fortaleza\",\n \"America/Belem\",\n \"America/Maceio\",\n \"America/Recife\",\n \"America/Santarem\",\n \"Atlantic/Stanley\",\n \"America/Paramaribo\",\n \"Etc/GMT+3\",\n ],\n },\n {\n alias: \"Argentina Standard Time\",\n displayName: \"(UTC-03:00) City of Buenos Aires\",\n iana: \"America/Buenos_Aires\",\n ianaAll: [\n \"America/Buenos_Aires\",\n \"America/Argentina/La_Rioja\",\n \"America/Argentina/Rio_Gallegos\",\n \"America/Argentina/Salta\",\n \"America/Argentina/San_Juan\",\n \"America/Argentina/San_Luis\",\n \"America/Argentina/Tucuman\",\n \"America/Argentina/Ushuaia\",\n \"America/Catamarca\",\n \"America/Cordoba\",\n \"America/Jujuy\",\n \"America/Mendoza\",\n ],\n },\n {\n alias: \"Greenland Standard Time\",\n displayName: \"(UTC-03:00) Greenland\",\n iana: \"America/Godthab\",\n ianaAll: [\"America/Godthab\"],\n },\n {\n alias: \"Montevideo Standard Time\",\n displayName: \"(UTC-03:00) Montevideo\",\n iana: \"America/Montevideo\",\n ianaAll: [\"America/Montevideo\"],\n },\n {\n alias: \"Magallanes Standard Time\",\n displayName: \"(UTC-03:00) Punta Arenas\",\n iana: \"America/Punta_Arenas\",\n ianaAll: [\"America/Punta_Arenas\", \"America/Coyhaique\"],\n },\n {\n alias: \"Saint Pierre Standard Time\",\n displayName: \"(UTC-03:00) Saint Pierre and Miquelon\",\n iana: \"America/Miquelon\",\n ianaAll: [\"America/Miquelon\"],\n },\n {\n alias: \"Bahia Standard Time\",\n displayName: \"(UTC-03:00) Salvador\",\n iana: \"America/Bahia\",\n ianaAll: [\"America/Bahia\"],\n },\n {\n alias: \"Pacific SA Standard Time\",\n displayName: \"(UTC-03:00) Santiago\",\n iana: \"America/Santiago\",\n ianaAll: [\"America/Santiago\"],\n },\n {\n alias: \"UTC-02\",\n displayName: \"(UTC-02:00) Coordinated Universal Time-02\",\n iana: \"Etc/GMT+2\",\n ianaAll: [\"Etc/GMT+2\", \"America/Noronha\", \"Atlantic/South_Georgia\"],\n },\n {\n alias: \"Azores Standard Time\",\n displayName: \"(UTC-01:00) Azores\",\n iana: \"Atlantic/Azores\",\n ianaAll: [\"Atlantic/Azores\", \"America/Scoresbysund\"],\n },\n {\n alias: \"Cape Verde Standard Time\",\n displayName: \"(UTC-01:00) Cabo Verde Is.\",\n iana: \"Atlantic/Cape_Verde\",\n ianaAll: [\"Atlantic/Cape_Verde\", \"Etc/GMT+1\"],\n },\n {\n alias: \"UTC\",\n displayName: \"(UTC) Coordinated Universal Time\",\n iana: \"Etc/UTC\",\n ianaAll: [\"Etc/UTC\", \"Etc/GMT\"],\n },\n {\n alias: \"Morocco Standard Time\",\n displayName: \"(UTC+00:00) Casablanca\",\n iana: \"Africa/Casablanca\",\n ianaAll: [\"Africa/Casablanca\", \"Africa/El_Aaiun\"],\n },\n {\n alias: \"GMT Standard Time\",\n displayName: \"(UTC+00:00) Dublin, Edinburgh, Lisbon, London\",\n iana: \"Europe/London\",\n ianaAll: [\n \"Europe/London\",\n \"Atlantic/Canary\",\n \"Atlantic/Faeroe\",\n \"Europe/Guernsey\",\n \"Europe/Dublin\",\n \"Europe/Isle_of_Man\",\n \"Europe/Jersey\",\n \"Europe/Lisbon\",\n \"Atlantic/Madeira\",\n ],\n },\n {\n alias: \"Greenwich Standard Time\",\n displayName: \"(UTC+00:00) Monrovia, Reykjavik\",\n iana: \"Atlantic/Reykjavik\",\n ianaAll: [\n \"Atlantic/Reykjavik\",\n \"Africa/Ouagadougou\",\n \"Africa/Abidjan\",\n \"Africa/Accra\",\n \"America/Danmarkshavn\",\n \"Africa/Banjul\",\n \"Africa/Conakry\",\n \"Africa/Bissau\",\n \"Africa/Monrovia\",\n \"Africa/Bamako\",\n \"Africa/Nouakchott\",\n \"Atlantic/St_Helena\",\n \"Africa/Freetown\",\n \"Africa/Dakar\",\n \"Africa/Lome\",\n ],\n },\n {\n alias: \"Sao Tome Standard Time\",\n displayName: \"(UTC+00:00) Sao Tome\",\n iana: \"Africa/Sao_Tome\",\n ianaAll: [\"Africa/Sao_Tome\"],\n },\n {\n alias: \"W. Europe Standard Time\",\n displayName: \"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n iana: \"Europe/Berlin\",\n ianaAll: [\n \"Europe/Berlin\",\n \"Europe/Andorra\",\n \"Europe/Vienna\",\n \"Europe/Zurich\",\n \"Europe/Busingen\",\n \"Europe/Gibraltar\",\n \"Europe/Rome\",\n \"Europe/Vaduz\",\n \"Europe/Luxembourg\",\n \"Europe/Monaco\",\n \"Europe/Malta\",\n \"Europe/Amsterdam\",\n \"Europe/Oslo\",\n \"Europe/Stockholm\",\n \"Arctic/Longyearbyen\",\n \"Europe/San_Marino\",\n \"Europe/Vatican\",\n ],\n },\n {\n alias: \"Central Europe Standard Time\",\n displayName: \"(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague\",\n iana: \"Europe/Budapest\",\n ianaAll: [\n \"Europe/Budapest\",\n \"Europe/Tirane\",\n \"Europe/Prague\",\n \"Europe/Podgorica\",\n \"Europe/Belgrade\",\n \"Europe/Ljubljana\",\n \"Europe/Bratislava\",\n ],\n },\n {\n alias: \"Romance Standard Time\",\n displayName: \"(UTC+01:00) Brussels, Copenhagen, Madrid, Paris\",\n iana: \"Europe/Paris\",\n ianaAll: [\"Europe/Paris\", \"Europe/Brussels\", \"Europe/Copenhagen\", \"Europe/Madrid\", \"Africa/Ceuta\"],\n },\n {\n alias: \"Central European Standard Time\",\n displayName: \"(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb\",\n iana: \"Europe/Warsaw\",\n ianaAll: [\"Europe/Warsaw\", \"Europe/Sarajevo\", \"Europe/Zagreb\", \"Europe/Skopje\"],\n },\n {\n alias: \"W. Central Africa Standard Time\",\n displayName: \"(UTC+01:00) West Central Africa\",\n iana: \"Africa/Lagos\",\n ianaAll: [\n \"Africa/Lagos\",\n \"Africa/Luanda\",\n \"Africa/Porto-Novo\",\n \"Africa/Kinshasa\",\n \"Africa/Bangui\",\n \"Africa/Brazzaville\",\n \"Africa/Douala\",\n \"Africa/Algiers\",\n \"Africa/Libreville\",\n \"Africa/Malabo\",\n \"Africa/Niamey\",\n \"Africa/Ndjamena\",\n \"Africa/Tunis\",\n \"Etc/GMT-1\",\n ],\n },\n {\n alias: \"Namibia Standard Time\",\n displayName: \"(UTC+01:00) Windhoek\",\n iana: \"Africa/Windhoek\",\n ianaAll: [\"Africa/Windhoek\"],\n },\n {\n alias: \"Jordan Standard Time\",\n displayName: \"(UTC+02:00) Amman\",\n iana: \"Asia/Amman\",\n ianaAll: [\"Asia/Amman\"],\n },\n {\n alias: \"GTB Standard Time\",\n displayName: \"(UTC+02:00) Athens, Bucharest\",\n iana: \"Europe/Bucharest\",\n ianaAll: [\"Europe/Bucharest\", \"Asia/Nicosia\", \"Asia/Famagusta\", \"Europe/Athens\"],\n },\n {\n alias: \"Middle East Standard Time\",\n displayName: \"(UTC+02:00) Beirut\",\n iana: \"Asia/Beirut\",\n ianaAll: [\"Asia/Beirut\"],\n },\n {\n alias: \"Egypt Standard Time\",\n displayName: \"(UTC+02:00) Cairo\",\n iana: \"Africa/Cairo\",\n ianaAll: [\"Africa/Cairo\"],\n },\n {\n alias: \"Syria Standard Time\",\n displayName: \"(UTC+02:00) Damascus\",\n iana: \"Asia/Damascus\",\n ianaAll: [\"Asia/Damascus\"],\n },\n {\n alias: \"E. Europe Standard Time\",\n displayName: \"(UTC+02:00) E. Europe\",\n iana: \"Europe/Chisinau\",\n ianaAll: [\"Europe/Chisinau\"],\n },\n {\n alias: \"West Bank Standard Time\",\n displayName: \"(UTC+02:00) Gaza, Hebron\",\n iana: \"Asia/Hebron\",\n ianaAll: [\"Asia/Hebron\", \"Asia/Gaza\"],\n },\n {\n alias: \"South Africa Standard Time\",\n displayName: \"(UTC+02:00) Harare, Pretoria\",\n iana: \"Africa/Johannesburg\",\n ianaAll: [\n \"Africa/Johannesburg\",\n \"Africa/Bujumbura\",\n \"Africa/Gaborone\",\n \"Africa/Lubumbashi\",\n \"Africa/Maseru\",\n \"Africa/Blantyre\",\n \"Africa/Maputo\",\n \"Africa/Kigali\",\n \"Africa/Mbabane\",\n \"Africa/Lusaka\",\n \"Africa/Harare\",\n \"Etc/GMT-2\",\n ],\n },\n {\n alias: \"FLE Standard Time\",\n displayName: \"(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius\",\n iana: \"Europe/Kiev\",\n ianaAll: [\n \"Europe/Kiev\",\n \"Europe/Mariehamn\",\n \"Europe/Sofia\",\n \"Europe/Tallinn\",\n \"Europe/Helsinki\",\n \"Europe/Vilnius\",\n \"Europe/Riga\",\n ],\n },\n {\n alias: \"South Sudan Standard Time\",\n displayName: \"(UTC+02:00) Juba\",\n iana: \"Africa/Juba\",\n ianaAll: [\"Africa/Juba\"],\n },\n {\n alias: \"Kaliningrad Standard Time\",\n displayName: \"(UTC+02:00) Kaliningrad\",\n iana: \"Europe/Kaliningrad\",\n ianaAll: [\"Europe/Kaliningrad\"],\n },\n {\n alias: \"Sudan Standard Time\",\n displayName: \"(UTC+02:00) Khartoum\",\n iana: \"Africa/Khartoum\",\n ianaAll: [\"Africa/Khartoum\"],\n },\n {\n alias: \"Israel Standard Time\",\n displayName: \"(UTC+02:00) Middle East\",\n iana: \"Asia/Jerusalem\",\n ianaAll: [\"Asia/Jerusalem\"],\n },\n {\n alias: \"Libya Standard Time\",\n displayName: \"(UTC+02:00) Tripoli\",\n iana: \"Africa/Tripoli\",\n ianaAll: [\"Africa/Tripoli\"],\n },\n {\n alias: \"Arabic Standard Time\",\n displayName: \"(UTC+03:00) Baghdad\",\n iana: \"Asia/Baghdad\",\n ianaAll: [\"Asia/Baghdad\"],\n },\n {\n alias: \"Turkey Standard Time\",\n displayName: \"(UTC+03:00) Istanbul\",\n iana: \"Europe/Istanbul\",\n ianaAll: [\"Europe/Istanbul\"],\n },\n {\n alias: \"Arab Standard Time\",\n displayName: \"(UTC+03:00) Kuwait, Riyadh\",\n iana: \"Asia/Riyadh\",\n ianaAll: [\"Asia/Riyadh\", \"Asia/Bahrain\", \"Asia/Kuwait\", \"Asia/Qatar\", \"Asia/Aden\"],\n },\n {\n alias: \"Belarus Standard Time\",\n displayName: \"(UTC+03:00) Minsk\",\n iana: \"Europe/Minsk\",\n ianaAll: [\"Europe/Minsk\"],\n },\n {\n alias: \"Russian Standard Time\",\n displayName: \"(UTC+03:00) Moscow, St. Petersburg, Volgograd (RTZ 2)\",\n iana: \"Europe/Moscow\",\n ianaAll: [\"Europe/Moscow\", \"Europe/Kirov\", \"Europe/Simferopol\"],\n },\n {\n alias: \"E. Africa Standard Time\",\n displayName: \"(UTC+03:00) Nairobi\",\n iana: \"Africa/Nairobi\",\n ianaAll: [\n \"Africa/Nairobi\",\n \"Antarctica/Syowa\",\n \"Africa/Djibouti\",\n \"Africa/Asmera\",\n \"Africa/Addis_Ababa\",\n \"Indian/Comoro\",\n \"Indian/Antananarivo\",\n \"Africa/Mogadishu\",\n \"Africa/Dar_es_Salaam\",\n \"Africa/Kampala\",\n \"Indian/Mayotte\",\n \"Etc/GMT-3\",\n ],\n },\n {\n alias: \"Volgograd Standard Time\",\n displayName: \"(UTC+03:00) Volgograd\",\n iana: \"Europe/Volgograd\",\n ianaAll: [\"Europe/Volgograd\"],\n },\n {\n alias: \"Iran Standard Time\",\n displayName: \"(UTC+03:30) Tehran\",\n iana: \"Asia/Tehran\",\n ianaAll: [\"Asia/Tehran\"],\n },\n {\n alias: \"Arabian Standard Time\",\n displayName: \"(UTC+04:00) Abu Dhabi, Muscat\",\n iana: \"Asia/Dubai\",\n ianaAll: [\"Asia/Dubai\", \"Asia/Muscat\", \"Etc/GMT-4\"],\n },\n {\n alias: \"Astrakhan Standard Time\",\n displayName: \"(UTC+04:00) Astrakhan, Ulyanovsk\",\n iana: \"Europe/Astrakhan\",\n ianaAll: [\"Europe/Astrakhan\", \"Europe/Ulyanovsk\"],\n },\n {\n alias: \"Azerbaijan Standard Time\",\n displayName: \"(UTC+04:00) Baku\",\n iana: \"Asia/Baku\",\n ianaAll: [\"Asia/Baku\"],\n },\n {\n alias: \"Russia Time Zone 3\",\n displayName: \"(UTC+04:00) Izhevsk, Samara\",\n iana: \"Europe/Samara\",\n ianaAll: [\"Europe/Samara\"],\n },\n {\n alias: \"Mauritius Standard Time\",\n displayName: \"(UTC+04:00) Port Louis\",\n iana: \"Indian/Mauritius\",\n ianaAll: [\"Indian/Mauritius\", \"Indian/Reunion\", \"Indian/Mahe\"],\n },\n {\n alias: \"Saratov Standard Time\",\n displayName: \"(UTC+04:00) Saratov\",\n iana: \"Europe/Saratov\",\n ianaAll: [\"Europe/Saratov\"],\n },\n {\n alias: \"Georgian Standard Time\",\n displayName: \"(UTC+04:00) Tbilisi\",\n iana: \"Asia/Tbilisi\",\n ianaAll: [\"Asia/Tbilisi\"],\n },\n {\n alias: \"Caucasus Standard Time\",\n displayName: \"(UTC+04:00) Yerevan\",\n iana: \"Asia/Yerevan\",\n ianaAll: [\"Asia/Yerevan\"],\n },\n {\n alias: \"Afghanistan Standard Time\",\n displayName: \"(UTC+04:30) Kabul\",\n iana: \"Asia/Kabul\",\n ianaAll: [\"Asia/Kabul\"],\n },\n {\n alias: \"West Asia Standard Time\",\n displayName: \"(UTC+05:00) Ashgabat, Tashkent\",\n iana: \"Asia/Tashkent\",\n ianaAll: [\n \"Asia/Tashkent\",\n \"Antarctica/Mawson\",\n \"Asia/Oral\",\n \"Asia/Almaty\",\n \"Asia/Aqtau\",\n \"Asia/Aqtobe\",\n \"Asia/Atyrau\",\n \"Asia/Qostanay\",\n \"Indian/Maldives\",\n \"Indian/Kerguelen\",\n \"Asia/Dushanbe\",\n \"Asia/Ashgabat\",\n \"Asia/Samarkand\",\n \"Etc/GMT-5\",\n ],\n },\n {\n alias: \"Ekaterinburg Standard Time\",\n displayName: \"(UTC+05:00) Ekaterinburg\",\n iana: \"Asia/Yekaterinburg\",\n ianaAll: [\"Asia/Yekaterinburg\"],\n },\n {\n alias: \"Pakistan Standard Time\",\n displayName: \"(UTC+05:00) Islamabad, Karachi\",\n iana: \"Asia/Karachi\",\n ianaAll: [\"Asia/Karachi\"],\n },\n {\n alias: \"Qyzylorda Standard Time\",\n displayName: \"(UTC+05:00) Qyzylorda\",\n iana: \"Asia/Qyzylorda\",\n ianaAll: [\"Asia/Qyzylorda\"],\n },\n {\n alias: \"India Standard Time\",\n displayName: \"(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi\",\n iana: \"Asia/Calcutta\",\n ianaAll: [\"Asia/Calcutta\"],\n },\n {\n alias: \"Sri Lanka Standard Time\",\n displayName: \"(UTC+05:30) Sri Jayawardenepura\",\n iana: \"Asia/Colombo\",\n ianaAll: [\"Asia/Colombo\"],\n },\n {\n alias: \"Nepal Standard Time\",\n displayName: \"(UTC+05:45) Kathmandu\",\n iana: \"Asia/Katmandu\",\n ianaAll: [\"Asia/Katmandu\"],\n },\n {\n alias: \"Central Asia Standard Time\",\n displayName: \"(UTC+06:00) Astana\",\n iana: \"Asia/Bishkek\",\n ianaAll: [\"Asia/Bishkek\", \"Antarctica/Vostok\", \"Asia/Urumqi\", \"Indian/Chagos\", \"Etc/GMT-6\"],\n },\n {\n alias: \"Bangladesh Standard Time\",\n displayName: \"(UTC+06:00) Dhaka\",\n iana: \"Asia/Dhaka\",\n ianaAll: [\"Asia/Dhaka\", \"Asia/Thimphu\"],\n },\n {\n alias: \"Omsk Standard Time\",\n displayName: \"(UTC+06:00) Omsk\",\n iana: \"Asia/Omsk\",\n ianaAll: [\"Asia/Omsk\"],\n },\n {\n alias: \"Myanmar Standard Time\",\n displayName: \"(UTC+06:30) Yangon (Rangoon)\",\n iana: \"Asia/Rangoon\",\n ianaAll: [\"Asia/Rangoon\", \"Indian/Cocos\"],\n },\n {\n alias: \"SE Asia Standard Time\",\n displayName: \"(UTC+07:00) Bangkok, Hanoi, Jakarta\",\n iana: \"Asia/Bangkok\",\n ianaAll: [\n \"Asia/Bangkok\",\n \"Antarctica/Davis\",\n \"Indian/Christmas\",\n \"Asia/Jakarta\",\n \"Asia/Pontianak\",\n \"Asia/Phnom_Penh\",\n \"Asia/Vientiane\",\n \"Asia/Saigon\",\n \"Etc/GMT-7\",\n ],\n },\n {\n alias: \"Altai Standard Time\",\n displayName: \"(UTC+07:00) Barnaul, Gorno-Altaysk\",\n iana: \"Asia/Barnaul\",\n ianaAll: [\"Asia/Barnaul\"],\n },\n {\n alias: \"W. Mongolia Standard Time\",\n displayName: \"(UTC+07:00) Hovd\",\n iana: \"Asia/Hovd\",\n ianaAll: [\"Asia/Hovd\"],\n },\n {\n alias: \"North Asia Standard Time\",\n displayName: \"(UTC+07:00) Krasnoyarsk\",\n iana: \"Asia/Krasnoyarsk\",\n ianaAll: [\"Asia/Krasnoyarsk\", \"Asia/Novokuznetsk\"],\n },\n {\n alias: \"N. Central Asia Standard Time\",\n displayName: \"(UTC+07:00) Novosibirsk\",\n iana: \"Asia/Novosibirsk\",\n ianaAll: [\"Asia/Novosibirsk\"],\n },\n {\n alias: \"Tomsk Standard Time\",\n displayName: \"(UTC+07:00) Tomsk\",\n iana: \"Asia/Tomsk\",\n ianaAll: [\"Asia/Tomsk\"],\n },\n {\n alias: \"China Standard Time\",\n displayName: \"(UTC+08:00) Beijing, Chongqing, Hong Kong SAR, Urumqi\",\n iana: \"Asia/Shanghai\",\n ianaAll: [\"Asia/Shanghai\", \"Asia/Hong_Kong\", \"Asia/Macau\"],\n },\n {\n alias: \"North Asia East Standard Time\",\n displayName: \"(UTC+08:00) Irkutsk\",\n iana: \"Asia/Irkutsk\",\n ianaAll: [\"Asia/Irkutsk\"],\n },\n {\n alias: \"Singapore Standard Time\",\n displayName: \"(UTC+08:00) Kuala Lumpur, Singapore\",\n iana: \"Asia/Singapore\",\n ianaAll: [\n \"Asia/Singapore\",\n \"Asia/Brunei\",\n \"Asia/Makassar\",\n \"Asia/Kuala_Lumpur\",\n \"Asia/Kuching\",\n \"Asia/Manila\",\n \"Etc/GMT-8\",\n ],\n },\n {\n alias: \"W. Australia Standard Time\",\n displayName: \"(UTC+08:00) Perth\",\n iana: \"Australia/Perth\",\n ianaAll: [\"Australia/Perth\"],\n },\n {\n alias: \"Taipei Standard Time\",\n displayName: \"(UTC+08:00) Taipei\",\n iana: \"Asia/Taipei\",\n ianaAll: [\"Asia/Taipei\"],\n },\n {\n alias: \"Ulaanbaatar Standard Time\",\n displayName: \"(UTC+08:00) Ulaanbaatar\",\n iana: \"Asia/Ulaanbaatar\",\n ianaAll: [\"Asia/Ulaanbaatar\"],\n },\n {\n alias: \"Aus Central W. Standard Time\",\n displayName: \"(UTC+08:45) Eucla\",\n iana: \"Australia/Eucla\",\n ianaAll: [\"Australia/Eucla\"],\n },\n {\n alias: \"Transbaikal Standard Time\",\n displayName: \"(UTC+09:00) Chita\",\n iana: \"Asia/Chita\",\n ianaAll: [\"Asia/Chita\"],\n },\n {\n alias: \"Tokyo Standard Time\",\n displayName: \"(UTC+09:00) Osaka, Sapporo, Tokyo\",\n iana: \"Asia/Tokyo\",\n ianaAll: [\"Asia/Tokyo\", \"Asia/Jayapura\", \"Pacific/Palau\", \"Asia/Dili\", \"Etc/GMT-9\"],\n },\n {\n alias: \"North Korea Standard Time\",\n displayName: \"(UTC+09:00) Pyongyang\",\n iana: \"Asia/Pyongyang\",\n ianaAll: [\"Asia/Pyongyang\"],\n },\n {\n alias: \"Korea Standard Time\",\n displayName: \"(UTC+09:00) Seoul\",\n iana: \"Asia/Seoul\",\n ianaAll: [\"Asia/Seoul\"],\n },\n {\n alias: \"Yakutsk Standard Time\",\n displayName: \"(UTC+09:00) Yakutsk\",\n iana: \"Asia/Yakutsk\",\n ianaAll: [\"Asia/Yakutsk\", \"Asia/Khandyga\"],\n },\n {\n alias: \"Cen. Australia Standard Time\",\n displayName: \"(UTC+09:30) Adelaide\",\n iana: \"Australia/Adelaide\",\n ianaAll: [\"Australia/Adelaide\", \"Australia/Broken_Hill\"],\n },\n {\n alias: \"AUS Central Standard Time\",\n displayName: \"(UTC+09:30) Darwin\",\n iana: \"Australia/Darwin\",\n ianaAll: [\"Australia/Darwin\"],\n },\n {\n alias: \"E. Australia Standard Time\",\n displayName: \"(UTC+10:00) Brisbane\",\n iana: \"Australia/Brisbane\",\n ianaAll: [\"Australia/Brisbane\", \"Australia/Lindeman\"],\n },\n {\n alias: \"AUS Eastern Standard Time\",\n displayName: \"(UTC+10:00) Canberra, Melbourne, Sydney\",\n iana: \"Australia/Sydney\",\n ianaAll: [\"Australia/Sydney\", \"Australia/Melbourne\"],\n },\n {\n alias: \"West Pacific Standard Time\",\n displayName: \"(UTC+10:00) Guam, Port Moresby\",\n iana: \"Pacific/Port_Moresby\",\n ianaAll: [\n \"Pacific/Port_Moresby\",\n \"Antarctica/DumontDUrville\",\n \"Pacific/Truk\",\n \"Pacific/Guam\",\n \"Pacific/Saipan\",\n \"Etc/GMT-10\",\n ],\n },\n {\n alias: \"Tasmania Standard Time\",\n displayName: \"(UTC+10:00) Hobart\",\n iana: \"Australia/Hobart\",\n ianaAll: [\"Australia/Hobart\", \"Antarctica/Macquarie\"],\n },\n {\n alias: \"Vladivostok Standard Time\",\n displayName: \"(UTC+10:00) Vladivostok\",\n iana: \"Asia/Vladivostok\",\n ianaAll: [\"Asia/Vladivostok\", \"Asia/Ust-Nera\"],\n },\n {\n alias: \"Lord Howe Standard Time\",\n displayName: \"(UTC+10:30) Lord Howe Island\",\n iana: \"Australia/Lord_Howe\",\n ianaAll: [\"Australia/Lord_Howe\"],\n },\n {\n alias: \"Bougainville Standard Time\",\n displayName: \"(UTC+11:00) Bougainville Island\",\n iana: \"Pacific/Bougainville\",\n ianaAll: [\"Pacific/Bougainville\"],\n },\n {\n alias: \"Russia Time Zone 10\",\n displayName: \"(UTC+11:00) Chokurdakh\",\n iana: \"Asia/Srednekolymsk\",\n ianaAll: [\"Asia/Srednekolymsk\"],\n },\n {\n alias: \"Magadan Standard Time\",\n displayName: \"(UTC+11:00) Magadan\",\n iana: \"Asia/Magadan\",\n ianaAll: [\"Asia/Magadan\"],\n },\n {\n alias: \"Norfolk Standard Time\",\n displayName: \"(UTC+11:00) Norfolk Island\",\n iana: \"Pacific/Norfolk\",\n ianaAll: [\"Pacific/Norfolk\"],\n },\n {\n alias: \"Sakhalin Standard Time\",\n displayName: \"(UTC+11:00) Sakhalin\",\n iana: \"Asia/Sakhalin\",\n ianaAll: [\"Asia/Sakhalin\"],\n },\n {\n alias: \"Central Pacific Standard Time\",\n displayName: \"(UTC+11:00) Solomon Is., New Caledonia\",\n iana: \"Pacific/Guadalcanal\",\n ianaAll: [\n \"Pacific/Guadalcanal\",\n \"Antarctica/Casey\",\n \"Pacific/Ponape\",\n \"Pacific/Kosrae\",\n \"Pacific/Noumea\",\n \"Pacific/Efate\",\n \"Etc/GMT-11\",\n ],\n },\n {\n alias: \"Russia Time Zone 11\",\n displayName: \"(UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky\",\n iana: \"Asia/Kamchatka\",\n ianaAll: [\"Asia/Kamchatka\", \"Asia/Anadyr\"],\n },\n {\n alias: \"New Zealand Standard Time\",\n displayName: \"(UTC+12:00) Auckland, Wellington\",\n iana: \"Pacific/Auckland\",\n ianaAll: [\"Pacific/Auckland\", \"Antarctica/McMurdo\"],\n },\n {\n alias: \"UTC+12\",\n displayName: \"(UTC+12:00) Coordinated Universal Time+12\",\n iana: \"Etc/GMT-12\",\n ianaAll: [\n \"Etc/GMT-12\",\n \"Pacific/Tarawa\",\n \"Pacific/Majuro\",\n \"Pacific/Kwajalein\",\n \"Pacific/Nauru\",\n \"Pacific/Funafuti\",\n \"Pacific/Wake\",\n \"Pacific/Wallis\",\n ],\n },\n {\n alias: \"Fiji Standard Time\",\n displayName: \"(UTC+12:00) Fiji\",\n iana: \"Pacific/Fiji\",\n ianaAll: [\"Pacific/Fiji\"],\n },\n {\n alias: \"Chatham Islands Standard Time\",\n displayName: \"(UTC+12:45) Chatham Islands\",\n iana: \"Pacific/Chatham\",\n ianaAll: [\"Pacific/Chatham\"],\n },\n {\n alias: \"UTC+13\",\n displayName: \"(UTC+13:00) Coordinated Universal Time+13\",\n iana: \"Etc/GMT-13\",\n ianaAll: [\"Etc/GMT-13\", \"Pacific/Enderbury\", \"Pacific/Fakaofo\"],\n },\n {\n alias: \"Tonga Standard Time\",\n displayName: \"(UTC+13:00) Nuku'alofa\",\n iana: \"Pacific/Tongatapu\",\n ianaAll: [\"Pacific/Tongatapu\"],\n },\n {\n alias: \"Samoa Standard Time\",\n displayName: \"(UTC+13:00) Samoa\",\n iana: \"Pacific/Apia\",\n ianaAll: [\"Pacific/Apia\"],\n },\n {\n alias: \"Line Islands Standard Time\",\n displayName: \"(UTC+14:00) Kiritimati Island\",\n iana: \"Pacific/Kiritimati\",\n ianaAll: [\"Pacific/Kiritimati\", \"Etc/GMT-14\"],\n },\n];\n","/**\n * Time zones as Exchange understands them: Windows ids (the native form) and\n * IANA ids (accepted by Graph), with wall-clock conversion done through the\n * platform's IANA database.\n */\nimport { WINDOWS_ZONES, type WindowsZone } from \"./timezones.generated.js\";\n\nconst TIMEZONE_ABBREVIATION = /^[A-Za-z]{2,5}$/;\n\nexport interface ResolvedZone {\n /** IANA zone used for the arithmetic. */\n iana: string;\n /** Windows zone, when one maps to this zone. */\n windows: WindowsZone | null;\n}\n\nconst byWindows = new Map(WINDOWS_ZONES.map((z) => [z.alias.toLowerCase(), z]));\nconst byIana = new Map<string, WindowsZone>();\nfor (const z of WINDOWS_ZONES) {\n for (const i of z.ianaAll) {\n if (!byIana.has(i.toLowerCase())) {\n byIana.set(i.toLowerCase(), z);\n }\n }\n}\n\nlet ianaIds: string[] | null = null;\nexport function ianaZones(): string[] {\n if (!ianaIds) {\n const intl = Intl as unknown as { supportedValuesOf?: (k: string) => string[] };\n ianaIds = intl.supportedValuesOf ? intl.supportedValuesOf(\"timeZone\") : WINDOWS_ZONES.map((z) => z.iana);\n if (!ianaIds.includes(\"UTC\")) {\n ianaIds = [...ianaIds, \"UTC\"];\n }\n }\n return ianaIds;\n}\n\nfunction validIana(name: string): string | null {\n try {\n return new Intl.DateTimeFormat(\"en-US\", { timeZone: name }).resolvedOptions().timeZone;\n } catch {\n return null;\n }\n}\n\n/** Resolve a Graph time zone name (Windows or IANA, case-insensitive). Null when unknown. */\nexport function resolveZone(name: string | null | undefined): ResolvedZone | null {\n if (!name) {\n return null;\n }\n const trimmed = name.trim();\n const lower = trimmed.toLowerCase();\n if (lower === \"utc\" || lower === \"etc/utc\" || lower === \"coordinated universal time\") {\n return { iana: \"UTC\", windows: byWindows.get(\"utc\") ?? null };\n }\n const w = byWindows.get(lower);\n if (w) {\n return { iana: w.iana, windows: w };\n }\n // Graph rejects abbreviations (PDT, EST, CET, ...) even where the IANA\n // database has a legacy link of that name (observed, research doc 2).\n if (TIMEZONE_ABBREVIATION.test(trimmed) && lower !== \"gmt\") {\n return null;\n }\n const iana = validIana(trimmed);\n if (iana) {\n return { iana, windows: byIana.get(iana.toLowerCase()) ?? byIana.get(lower) ?? null };\n }\n return null;\n}\n\n/** Offset of the zone from UTC at an instant, in minutes. */\nexport function offsetAt(iana: string, at: Date): number {\n if (iana === \"UTC\") {\n return 0;\n }\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: iana,\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n }).formatToParts(at);\n const get = (t: string) => Number(parts.find((p) => p.type === t)?.value ?? 0);\n const asUtc = Date.UTC(get(\"year\"), get(\"month\") - 1, get(\"day\"), get(\"hour\"), get(\"minute\"), get(\"second\"));\n return Math.round((asUtc - Math.floor(at.getTime() / 1000) * 1000) / 60_000);\n}\n\nconst LOCAL_RE = /^(\\d{4})-(\\d{2})-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,7}))?)?)?(Z|[+-]\\d{2}:\\d{2})?$/;\n\n/** Parse a Graph dateTime string. Returns wall-clock fields and an explicit offset if present. */\nexport function parseLocal(s: string): { ms: number; offsetMinutes: number | null } | null {\n const m = LOCAL_RE.exec(s.trim());\n if (!m) {\n return null;\n }\n const [, y, mo, d, h = \"0\", mi = \"0\", se = \"0\", frac = \"0\", off] = m;\n const ms =\n Date.UTC(Number(y), Number(mo) - 1, Number(d), Number(h), Number(mi), Number(se)) +\n Math.floor(Number(`0.${frac}`) * 1000);\n if (Number(mo) < 1 || Number(mo) > 12 || Number(d) < 1 || Number(d) > 31 || Number(h) > 23 || Number(mi) > 59) {\n return null;\n }\n let offsetMinutes: number | null = null;\n if (off === \"Z\") {\n offsetMinutes = 0;\n } else if (off) {\n offsetMinutes = (off[0] === \"-\" ? -1 : 1) * (Number(off.slice(1, 3)) * 60 + Number(off.slice(4, 6)));\n }\n return { ms, offsetMinutes };\n}\n\n/** Convert wall-clock milliseconds in a zone to a UTC instant. */\nexport function wallToUtc(wallMs: number, iana: string): number {\n if (iana === \"UTC\") {\n return wallMs;\n }\n let guess = wallMs - offsetAt(iana, new Date(wallMs)) * 60_000;\n for (let i = 0; i < 3; i += 1) {\n const next = wallMs - offsetAt(iana, new Date(guess)) * 60_000;\n if (next === guess) {\n break;\n }\n guess = next;\n }\n return guess;\n}\n\n/** UTC instant to wall-clock milliseconds in a zone. */\nexport function utcToWall(utcMs: number, iana: string): number {\n return utcMs + offsetAt(iana, new Date(utcMs)) * 60_000;\n}\n\n/** Graph's dateTime rendering: 7 fractional digits, no offset. */\nexport function formatGraphDateTime(wallMs: number): string {\n const iso = new Date(wallMs).toISOString();\n return `${iso.slice(0, 19)}.${iso.slice(20, 23)}0000`;\n}\n\n/** Name Graph echoes for a zone given by a client (Windows names keep their case). */\nexport function displayZoneName(input: string, zone: ResolvedZone): string {\n if (zone.windows && zone.windows.alias.toLowerCase() === input.trim().toLowerCase()) {\n return zone.windows.alias;\n }\n if (input.trim().toLowerCase() === \"utc\") {\n return \"UTC\";\n }\n return zone.iana;\n}\n","/**\n * The Exchange store: mailboxes, folder trees, items and their change\n * history. All Graph handlers read and write through this class so changes\n * made through one endpoint are visible through every other one.\n */\nimport { randomBytes, randomUUID } from \"node:crypto\";\nimport type { Store } from \"@deploybaseline/core\";\nimport { Errors } from \"../errors.js\";\nimport {\n decodeId,\n encodeChangeKey,\n encodeConversationId,\n encodeFolderId,\n encodeImmutableId,\n encodeItemId,\n newStoreIdentity,\n} from \"./ids.js\";\nimport type {\n ExchangeConfig,\n ExchangeState,\n FolderRecord,\n JournalEntity,\n JournalKind,\n MailboxRecord,\n MailboxSettingsRecord,\n MessageRecord,\n Recipient,\n} from \"./model.js\";\n\nconst MILLISECONDS_SUFFIX = /\\.\\d{3}Z$/;\n\nconst STATE_KEY = \"microsoft.exchange\";\n\ninterface FolderTemplate {\n name: string;\n wellKnownName?: string;\n folderClass?: string;\n isHidden?: boolean;\n baseSize?: number;\n children?: FolderTemplate[];\n}\n\n/**\n * Default mailbox hierarchy. Names, nesting and the 18 children of the\n * message folder root are as observed on a fresh Exchange Online mailbox.\n * Non-mail folders (calendar, contacts, ...) are not listed under\n * /mailFolders but count toward childFolderCount.\n */\nconst DEFAULT_TREE: FolderTemplate = {\n name: \"Root\",\n isHidden: true,\n children: [\n {\n name: \"Top of Information Store\",\n wellKnownName: \"msgfolderroot\",\n children: [\n { name: \"Archive\", wellKnownName: \"archive\" },\n { name: \"Calendar\", wellKnownName: \"calendar\", folderClass: \"IPF.Appointment\" },\n { name: \"Clutter\", wellKnownName: \"clutter\" },\n { name: \"Contacts\", wellKnownName: \"contacts\", folderClass: \"IPF.Contact\" },\n { name: \"Conversation Action Settings\", folderClass: \"IPF.Configuration\", isHidden: true },\n {\n name: \"Conversation History\",\n wellKnownName: \"conversationhistory\",\n children: [{ name: \"Team Chat\", folderClass: \"IPF.SkypeTeams.Message\" }],\n },\n { name: \"Deleted Items\", wellKnownName: \"deleteditems\" },\n { name: \"Drafts\", wellKnownName: \"drafts\" },\n { name: \"ExternalContacts\", folderClass: \"IPF.Contact\", isHidden: true },\n { name: \"Files\", folderClass: \"IPF.Files\", isHidden: true },\n { name: \"Inbox\", wellKnownName: \"inbox\", baseSize: 1484 },\n { name: \"Journal\", folderClass: \"IPF.Journal\" },\n { name: \"Junk Email\", wellKnownName: \"junkemail\" },\n { name: \"Notes\", folderClass: \"IPF.StickyNote\" },\n { name: \"Outbox\", wellKnownName: \"outbox\" },\n { name: \"Sent Items\", wellKnownName: \"sentitems\" },\n { name: \"Snoozed\", wellKnownName: \"scheduled\" },\n { name: \"Tasks\", wellKnownName: \"tasks\", folderClass: \"IPF.Task\" },\n ],\n },\n { name: \"Finder\", wellKnownName: \"searchfolders\", folderClass: \"IPF\" },\n {\n name: \"Recoverable Items\",\n wellKnownName: \"recoverableitemsroot\",\n isHidden: true,\n children: [\n { name: \"Deletions\", wellKnownName: \"recoverableitemsdeletions\" },\n { name: \"Purges\", wellKnownName: \"recoverableitemspurges\" },\n { name: \"Versions\", wellKnownName: \"recoverableitemsversions\" },\n ],\n },\n ],\n};\n\n/** Well-known names Graph accepts that this mailbox type does not provision (answer 404). */\nconst ABSENT_WELL_KNOWN = new Set([\"syncissues\", \"conflicts\", \"localfailures\", \"serverfailures\"]);\n\n/** Well-known names Graph accepts on /mailFolders/{name}. */\nconst MAIL_WELL_KNOWN = new Set([\n \"archive\",\n \"clutter\",\n \"conversationhistory\",\n \"deleteditems\",\n \"drafts\",\n \"inbox\",\n \"junkemail\",\n \"msgfolderroot\",\n \"outbox\",\n \"recoverableitemsdeletions\",\n \"scheduled\",\n \"searchfolders\",\n \"sentitems\",\n \"recoverableitemsroot\",\n \"recoverableitemspurges\",\n \"recoverableitemsversions\",\n]);\n\nexport const DEFAULT_CONFIG: ExchangeConfig = {\n deliveryDelayMs: 1000,\n strictAuth: false,\n applicationAccessPolicies: {},\n};\n\n/** Verified live (exp.mailbox.outlook-web-state): mailboxSettings.userPurpose follows the recipient type. */\nconst USER_PURPOSE: Partial<Record<MailboxRecord[\"kind\"], string>> = { shared: \"shared\", room: \"room\" };\n\nfunction defaultSettings(kind: MailboxRecord[\"kind\"]): MailboxSettingsRecord {\n return {\n archiveFolder: \"\",\n timeZone: \"UTC\",\n automaticRepliesSetting: {\n status: \"disabled\",\n externalAudience: \"all\",\n internalReplyMessage: \"\",\n externalReplyMessage: \"\",\n scheduledStartDateTime: { dateTime: \"2026-01-01T00:00:00.0000000\", timeZone: \"UTC\" },\n scheduledEndDateTime: { dateTime: \"2026-01-02T00:00:00.0000000\", timeZone: \"UTC\" },\n },\n language: { locale: \"en-US\", displayName: \"English (United States)\" },\n dateFormat: \"M/d/yyyy\",\n timeFormat: \"h:mm tt\",\n delegateMeetingMessageDeliveryOptions: \"sendToDelegateOnly\",\n userPurpose: USER_PURPOSE[kind] ?? \"user\",\n unset: [\"timeZone\", \"language\", \"dateFormat\", \"timeFormat\", \"workingHours\"],\n workingHours: {\n daysOfWeek: [\"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\"],\n startTime: \"08:00:00.0000000\",\n endTime: \"17:00:00.0000000\",\n timeZone: { name: \"UTC\" },\n },\n };\n}\n\nexport function isoSeconds(d: Date = new Date()): string {\n return d.toISOString().replace(MILLISECONDS_SUFFIX, \"Z\");\n}\n\nexport function guidHex(): string {\n return randomBytes(16).toString(\"hex\");\n}\n\nexport interface MailboxInit {\n address: string;\n displayName: string;\n userOid: string;\n kind: \"user\" | \"shared\" | \"room\" | \"group\";\n /** Use the standard (\"AAMk\") id form for this mailbox instead of the compact one. */\n standardIds?: boolean;\n}\n\n/** Store change listener; formerId is the item's id before a delete or move. */\nexport type ChangeListener = (\n mbx: MailboxRecord,\n kind: JournalKind,\n entity: JournalEntity,\n counter: number,\n folderCounter: number,\n formerId?: string,\n) => void;\n\nexport class Exchange {\n private readonly store: Store;\n\n constructor(store: Store) {\n this.store = store;\n }\n\n /**\n * Evaluates a search folder's query. Installed by the OData layer so the\n * store does not depend on the filter engine.\n */\n static searchResolver: ((ex: Exchange, mbx: MailboxRecord, f: FolderRecord) => MessageRecord[]) | null = null;\n\n get state(): ExchangeState {\n let st = this.store.getData<ExchangeState>(STATE_KEY);\n if (!st) {\n st = {\n version: 1,\n tenantId: \"\",\n domain: \"\",\n mailboxes: {},\n byAddress: {},\n permissions: [],\n subscriptions: [],\n uploadSessions: {},\n pending: [],\n config: { ...DEFAULT_CONFIG },\n };\n this.store.setData(STATE_KEY, st);\n }\n return st;\n }\n\n get config(): ExchangeConfig {\n return this.state.config;\n }\n\n // ---------------------------------------------------------------------------\n // Mailboxes\n // ---------------------------------------------------------------------------\n\n ensureMailbox(init: MailboxInit): MailboxRecord {\n const key = init.address.toLowerCase();\n const existing = this.state.byAddress[key];\n if (existing) {\n const mbx = this.state.mailboxes[existing];\n mbx.displayName = init.displayName;\n return mbx;\n }\n const guid = randomUUID();\n const mbx: MailboxRecord = {\n guid,\n address: init.address,\n displayName: init.displayName,\n userOid: init.userOid,\n kind: init.kind,\n store: { ...newStoreIdentity(guid), ...(init.standardIds ? { standardIds: true } : {}) },\n nextCounter: 0x1_00_00 + (randomBytes(2).readUInt16BE(0) & 0x0f_ff),\n changeNumber: 0x10_00_00 + (randomBytes(2).readUInt16BE(0) & 0xff_ff),\n folders: {},\n items: {},\n issued: {},\n immutable: {},\n journal: [],\n journalSeq: 0,\n settings: defaultSettings(init.kind),\n categories: defaultCategories(),\n rules: [],\n overrides: [],\n };\n this.state.mailboxes[guid] = mbx;\n this.state.byAddress[key] = guid;\n this.provisionTree(mbx, DEFAULT_TREE, null);\n return mbx;\n }\n\n private provisionTree(mbx: MailboxRecord, t: FolderTemplate, parent: number | null): void {\n const counter = this.alloc(mbx);\n const folderClass = t.folderClass ?? \"IPF.Note\";\n mbx.folders[counter] = {\n counter,\n parentCounter: parent,\n displayName: t.name,\n wellKnownName: t.wellKnownName ?? null,\n folderClass,\n isHidden: t.isHidden ?? false,\n isMailFolder: folderClass === \"IPF.Note\" || folderClass === \"IPF\",\n distinguished: true,\n baseSize: t.baseSize ?? 0,\n changeNumber: this.bump(mbx),\n createdDateTime: isoSeconds(),\n };\n mbx.issued[counter] = \"folder\";\n for (const c of t.children ?? []) {\n this.provisionTree(mbx, c, counter);\n }\n }\n\n /** Move a mailbox to a new primary address (the directory user's mail changed). */\n readdressMailbox(mbx: MailboxRecord, address: string): void {\n delete this.state.byAddress[mbx.address.toLowerCase()];\n mbx.address = address;\n this.state.byAddress[address.toLowerCase()] = mbx.guid;\n }\n\n /** Remove a mailbox and the work queued for it (its directory user was deleted or lost their mail address). */\n removeMailbox(mbx: MailboxRecord): void {\n delete this.state.mailboxes[mbx.guid];\n if (this.state.byAddress[mbx.address.toLowerCase()] === mbx.guid) {\n delete this.state.byAddress[mbx.address.toLowerCase()];\n }\n this.state.pending = this.state.pending.filter((job) => job.mailboxGuid !== mbx.guid);\n }\n\n mailboxByAddress(address: string): MailboxRecord | undefined {\n const guid = this.state.byAddress[address.toLowerCase()];\n return guid ? this.state.mailboxes[guid] : undefined;\n }\n\n mailboxByGuid(guid: string): MailboxRecord | undefined {\n return this.state.mailboxes[guid];\n }\n\n mailboxByOid(oid: string): MailboxRecord | undefined {\n const lower = oid.toLowerCase();\n return Object.values(this.state.mailboxes).find((m) => m.userOid.toLowerCase() === lower);\n }\n\n allMailboxes(): MailboxRecord[] {\n return Object.values(this.state.mailboxes);\n }\n\n // ---------------------------------------------------------------------------\n // Counters and identifiers\n // ---------------------------------------------------------------------------\n\n alloc(mbx: MailboxRecord): number {\n const c = mbx.nextCounter;\n mbx.nextCounter += 1 + (randomBytes(1)[0] & 0x3);\n return c;\n }\n\n bump(mbx: MailboxRecord): number {\n mbx.changeNumber += 1 + (randomBytes(1)[0] & 0x7);\n return mbx.changeNumber;\n }\n\n folderId(mbx: MailboxRecord, f: FolderRecord | number): string {\n return encodeFolderId(mbx.store, typeof f === \"number\" ? f : f.counter);\n }\n\n itemId(mbx: MailboxRecord, item: MessageRecord, immutable = false): string {\n if (immutable) {\n return encodeImmutableId(mbx.store, item.immutableCounter);\n }\n return encodeItemId(mbx.store, item.folderCounter, item.counter);\n }\n\n conversationId(mbx: MailboxRecord, item: MessageRecord): string {\n return encodeConversationId(mbx.guid, Buffer.from(item.conversationGuid, \"hex\"));\n }\n\n changeKey(mbx: MailboxRecord, item: MessageRecord): string {\n const b = Buffer.from(encodeChangeKey(mbx.store, item.changeNumber, \"item\"), \"base64\");\n b.writeUInt32LE(item.changeKeyClass, 0);\n return b.toString(\"base64\");\n }\n\n folderChangeKey(mbx: MailboxRecord, f: FolderRecord): string {\n return encodeChangeKey(mbx.store, f.changeNumber, \"folder\");\n }\n\n // ---------------------------------------------------------------------------\n // Folder lookup\n // ---------------------------------------------------------------------------\n\n folder(mbx: MailboxRecord, counter: number): FolderRecord | undefined {\n return mbx.folders[counter];\n }\n\n wellKnown(mbx: MailboxRecord, name: string): FolderRecord {\n const f = Object.values(mbx.folders).find((x) => x.wellKnownName === name);\n if (!f) {\n throw new Error(`mailbox has no ${name} folder`);\n }\n return f;\n }\n\n root(mbx: MailboxRecord): FolderRecord {\n return Object.values(mbx.folders).find((f) => f.parentCounter === null)!;\n }\n\n /**\n * Resolve a folder reference from a URL or body: a well-known name\n * (case-insensitive) or a REST id.\n */\n /**\n * Resolve a folder id or well-known name. Under /mailFolders the calendar,\n * contacts and tasks names are not mail folders: Graph answers 404\n * ErrorItemNotFound (verified live). Contact and calendar routes pass\n * `nonMail` to accept them.\n */\n resolveFolder(mbx: MailboxRecord, ref: string, nonMail = false): FolderRecord {\n const lower = ref.toLowerCase();\n if (ABSENT_WELL_KNOWN.has(lower)) {\n throw Errors.folderNotFound();\n }\n if (MAIL_WELL_KNOWN.has(lower)) {\n return this.wellKnown(mbx, lower);\n }\n if (lower === \"calendar\" || lower === \"contacts\" || lower === \"tasks\") {\n if (!nonMail) {\n throw Errors.itemNotFound();\n }\n return this.wellKnown(mbx, lower);\n }\n const decoded = decodeId(ref);\n if (!decoded) {\n throw Errors.idMalformed();\n }\n if (decoded.kind === \"immutable\") {\n throw Errors.itemIdForFolderId();\n }\n if (decoded.mailboxGuid !== mbx.guid) {\n throw Errors.wrongMailbox(ref, mbx.guid);\n }\n if (decoded.databaseGuid !== mbx.store.databaseGuid) {\n throw Errors.idMalformed();\n }\n if (decoded.kind === \"item\") {\n throw Errors.itemIdForFolderId();\n }\n const f = mbx.folders[decoded.folderCounter];\n // Verified live (todo.dates-and-defaults): the Tasks folder's id is not a mail folder\n // either; by id, as by name, a non-mail folder answers 404 ErrorItemNotFound.\n if (f && !f.isMailFolder && !nonMail) {\n throw Errors.itemNotFound();\n }\n if (f) {\n return f;\n }\n if (mbx.issued[decoded.folderCounter]) {\n throw Errors.itemNotFound();\n }\n throw Errors.idMalformed();\n }\n\n /** Resolve a message id (regular or immutable). */\n resolveItem(mbx: MailboxRecord, ref: string): { item: MessageRecord; immutable: boolean } {\n const decoded = decodeId(ref);\n if (!decoded) {\n throw Errors.idMalformed();\n }\n if (decoded.kind === \"immutable\") {\n if (decoded.databaseGuid !== mbx.store.databaseGuid) {\n const owner = this.allMailboxes().find((m) => m.store.databaseGuid === decoded.databaseGuid);\n if (owner) {\n throw Errors.wrongMailbox(ref, mbx.guid);\n }\n throw Errors.idMalformed();\n }\n const current = mbx.immutable[decoded.immutableCounter];\n if (current !== undefined && mbx.items[current]) {\n return { item: mbx.items[current], immutable: true };\n }\n if (current !== undefined) {\n throw Errors.itemNotFound();\n }\n throw Errors.idMalformed();\n }\n if (decoded.mailboxGuid !== mbx.guid) {\n throw Errors.wrongMailbox(ref, mbx.guid);\n }\n if (decoded.databaseGuid !== mbx.store.databaseGuid) {\n throw Errors.idMalformed();\n }\n if (decoded.kind === \"folder\") {\n throw Errors.folderIdForItemId();\n }\n const item = mbx.items[decoded.itemCounter];\n if (item && item.folderCounter === decoded.folderCounter) {\n return { item, immutable: false };\n }\n if (mbx.issued[decoded.itemCounter]) {\n throw Errors.itemNotFound();\n }\n throw Errors.idMalformed();\n }\n\n /**\n * Resolve an item id against any per-mailbox item map (contacts, events).\n * Same codec and error rules as messages: wrong mailbox, malformed and\n * deleted ids are told apart.\n */\n resolveIn<T extends { counter: number; folderCounter: number }>(\n mbx: MailboxRecord,\n ref: string,\n map: Record<string, T>,\n ): { item: T; immutable: boolean } {\n const decoded = decodeId(ref);\n if (!decoded) {\n throw Errors.idMalformed();\n }\n if (decoded.kind === \"immutable\") {\n if (decoded.databaseGuid !== mbx.store.databaseGuid) {\n const owner = this.allMailboxes().find((m) => m.store.databaseGuid === decoded.databaseGuid);\n if (owner) {\n throw Errors.wrongMailbox(ref, mbx.guid);\n }\n throw Errors.idMalformed();\n }\n const current = mbx.immutable[decoded.immutableCounter];\n if (current !== undefined && map[current]) {\n return { item: map[current], immutable: true };\n }\n if (current !== undefined) {\n throw Errors.itemNotFound();\n }\n throw Errors.idMalformed();\n }\n if (decoded.mailboxGuid !== mbx.guid) {\n throw Errors.wrongMailbox(ref, mbx.guid);\n }\n if (decoded.databaseGuid !== mbx.store.databaseGuid) {\n throw Errors.idMalformed();\n }\n if (decoded.kind === \"folder\") {\n throw Errors.folderIdForItemId();\n }\n const item = map[decoded.itemCounter];\n if (item && item.folderCounter === decoded.folderCounter) {\n return { item, immutable: false };\n }\n if (mbx.issued[decoded.itemCounter]) {\n throw Errors.itemNotFound();\n }\n throw Errors.idMalformed();\n }\n\n childFolders(\n mbx: MailboxRecord,\n parent: FolderRecord,\n opts: { includeHidden?: boolean; mailOnly?: boolean } = {},\n ): FolderRecord[] {\n return Object.values(mbx.folders)\n .filter(\n (f) =>\n f.parentCounter === parent.counter &&\n (opts.includeHidden || !f.isHidden) &&\n (!opts.mailOnly || f.isMailFolder || f.folderClass.startsWith(\"IPF.Note\")),\n )\n .sort((a, b) => a.displayName.localeCompare(b.displayName, \"en\", { sensitivity: \"base\" }));\n }\n\n descendants(mbx: MailboxRecord, f: FolderRecord): FolderRecord[] {\n const out: FolderRecord[] = [];\n const walk = (p: FolderRecord) => {\n for (const c of Object.values(mbx.folders)) {\n if (c.parentCounter === p.counter) {\n out.push(c);\n walk(c);\n }\n }\n };\n walk(f);\n return out;\n }\n\n itemsIn(mbx: MailboxRecord, folderCounter: number): MessageRecord[] {\n return Object.values(mbx.items).filter((i) => i.folderCounter === folderCounter);\n }\n\n /**\n * Messages visible through a folder: its own items, or for a search folder\n * the live result of its query over the source folders (verified:\n * mail.searchfolders.lifecycle).\n */\n folderItems(mbx: MailboxRecord, f: FolderRecord): MessageRecord[] {\n if (f.search) {\n return Exchange.searchResolver ? Exchange.searchResolver(this, mbx, f) : [];\n }\n return this.itemsIn(mbx, f.counter);\n }\n\n /** Source folders a search folder looks at (with descendants when nested). */\n searchSources(mbx: MailboxRecord, f: FolderRecord): FolderRecord[] {\n const out = new Map<number, FolderRecord>();\n for (const c of f.search?.sourceFolderCounters ?? []) {\n const src = mbx.folders[c];\n if (!src) {\n continue;\n }\n out.set(src.counter, src);\n if (f.search?.includeNestedFolders) {\n for (const d of this.descendants(mbx, src)) {\n out.set(d.counter, d);\n }\n }\n }\n return [...out.values()].filter((x) => !x.search);\n }\n\n /** Items visible to the mailbox-wide /messages collection (all IPM mail folders). */\n mailboxItems(mbx: MailboxRecord): MessageRecord[] {\n const ipm = this.wellKnown(mbx, \"msgfolderroot\");\n const allowed = new Set([\n ipm.counter,\n ...this.descendants(mbx, ipm)\n .filter((f) => f.isMailFolder)\n .map((f) => f.counter),\n ]);\n return Object.values(mbx.items).filter((i) => allowed.has(i.folderCounter));\n }\n\n private otherItemsIn(mbx: MailboxRecord, folderCounter: number): number {\n const contacts = Object.values(mbx.contacts ?? {}).filter((x) => x.folderCounter === folderCounter).length;\n const events = Object.values(mbx.events ?? {}).filter((x) => x.folderCounter === folderCounter).length;\n return contacts + events;\n }\n\n counts(mbx: MailboxRecord, f: FolderRecord) {\n const items = this.folderItems(mbx, f);\n return {\n childFolderCount: Object.values(mbx.folders).filter((c) => c.parentCounter === f.counter).length,\n unreadItemCount: items.filter((i) => !i.isRead).length,\n // Verified live (contacts.delete-target): a deleted contact counts in Deleted Items, so\n // contacts and calendar items stored in a mail folder count alongside its messages.\n totalItemCount: items.length + (f.search ? 0 : this.otherItemsIn(mbx, f.counter)),\n // Verified: search folders report sizeInBytes null.\n sizeInBytes: f.search ? null : f.baseSize + items.reduce((n, i) => n + i.size, 0),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Journal (drives delta queries and change notifications)\n // ---------------------------------------------------------------------------\n\n private listeners: ChangeListener[] = [];\n\n /** Listen for journal entries; returns a function that stops listening. */\n onChange(fn: ChangeListener): () => void {\n this.listeners.push(fn);\n return () => {\n this.listeners = this.listeners.filter((l) => l !== fn);\n };\n }\n\n journal(\n mbx: MailboxRecord,\n kind: JournalKind,\n entity: JournalEntity,\n folderCounter: number,\n counter: number,\n formerId?: string,\n ): void {\n mbx.journalSeq += 1;\n mbx.journal.push({\n seq: mbx.journalSeq,\n at: new Date().toISOString(),\n kind,\n entity,\n folderCounter,\n counter,\n formerId,\n });\n for (const l of this.listeners) {\n try {\n l(mbx, kind, entity, counter, folderCounter, formerId);\n } catch {\n // listeners must not break store writes\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Folder operations\n // ---------------------------------------------------------------------------\n\n private assertUniqueName(mbx: MailboxRecord, parent: FolderRecord, name: string, except?: number): boolean {\n const lower = name.toLowerCase();\n return !Object.values(mbx.folders).some(\n (f) => f.parentCounter === parent.counter && f.counter !== except && f.displayName.toLowerCase() === lower,\n );\n }\n\n createFolder(\n mbx: MailboxRecord,\n parent: FolderRecord,\n input: { displayName: string; isHidden?: boolean; folderClass?: string; search?: FolderRecord[\"search\"] },\n ): FolderRecord {\n if (!input.displayName.trim()) {\n throw Errors.folderSaveProperty();\n }\n if (!this.assertUniqueName(mbx, parent, input.displayName)) {\n throw Errors.folderExists(input.displayName);\n }\n const counter = this.alloc(mbx);\n const f: FolderRecord = {\n counter,\n parentCounter: parent.counter,\n displayName: input.displayName,\n wellKnownName: null,\n folderClass: input.folderClass ?? \"IPF.Note\",\n isHidden: input.isHidden ?? false,\n isMailFolder: (input.folderClass ?? \"IPF.Note\").startsWith(\"IPF.Note\"),\n distinguished: false,\n baseSize: 0,\n changeNumber: this.bump(mbx),\n createdDateTime: isoSeconds(),\n ...(input.search ? { search: input.search } : {}),\n };\n mbx.folders[counter] = f;\n mbx.issued[counter] = \"folder\";\n this.journal(mbx, \"created\", \"folder\", parent.counter, counter);\n return f;\n }\n\n updateFolder(mbx: MailboxRecord, f: FolderRecord, patch: { displayName?: string; isHidden?: boolean }): FolderRecord {\n if (patch.displayName !== undefined) {\n if (f.distinguished) {\n throw Errors.folderSaveProperty();\n }\n if (!patch.displayName.trim()) {\n throw Errors.folderSaveProperty();\n }\n const parent = f.parentCounter === null ? null : mbx.folders[f.parentCounter];\n if (parent && !this.assertUniqueName(mbx, parent, patch.displayName, f.counter)) {\n throw Errors.folderSaveProperty();\n }\n f.displayName = patch.displayName;\n }\n if (patch.isHidden !== undefined) {\n f.isHidden = patch.isHidden;\n }\n f.changeNumber = this.bump(mbx);\n this.journal(mbx, \"updated\", \"folder\", f.parentCounter ?? f.counter, f.counter);\n return f;\n }\n\n deleteFolder(mbx: MailboxRecord, f: FolderRecord): void {\n if (f.distinguished) {\n throw Errors.deleteDistinguished();\n }\n const formerParent = f.parentCounter ?? f.counter;\n for (const d of [f, ...this.descendants(mbx, f)]) {\n for (const item of this.itemsIn(mbx, d.counter)) {\n this.removeItem(mbx, item, \"deleted\");\n }\n for (const [entity, map] of [\n [\"contact\", mbx.contacts],\n [\"event\", mbx.events],\n ] as const) {\n for (const x of Object.values(map ?? {})) {\n if (x.folderCounter !== d.counter) {\n continue;\n }\n delete map![x.counter];\n mbx.immutable[x.immutableCounter] = -1;\n this.journal(mbx, \"deleted\", entity, d.counter, x.counter, encodeItemId(mbx.store, d.counter, x.counter));\n }\n }\n delete mbx.folders[d.counter];\n }\n this.journal(mbx, \"deleted\", \"folder\", formerParent, f.counter, this.folderId(mbx, f));\n }\n\n moveFolder(mbx: MailboxRecord, f: FolderRecord, dest: FolderRecord): FolderRecord {\n if (f.distinguished) {\n throw Errors.moveCopyFailed();\n }\n if (dest.counter === f.counter || this.descendants(mbx, f).some((d) => d.counter === dest.counter)) {\n throw Errors.moveCopyFailed();\n }\n if (!this.assertUniqueName(mbx, dest, f.displayName, f.counter)) {\n throw Errors.folderExists(f.displayName);\n }\n const from = f.parentCounter!;\n f.parentCounter = dest.counter;\n f.changeNumber = this.bump(mbx);\n this.journal(mbx, \"deleted\", \"folder\", from, f.counter, this.folderId(mbx, f));\n this.journal(mbx, \"created\", \"folder\", dest.counter, f.counter);\n return f;\n }\n\n copyFolder(mbx: MailboxRecord, f: FolderRecord, dest: FolderRecord): FolderRecord {\n if (f.distinguished) {\n throw Errors.moveCopyFailed();\n }\n if (dest.counter === f.counter || this.descendants(mbx, f).some((d) => d.counter === dest.counter)) {\n throw Errors.moveCopyFailed();\n }\n if (!this.assertUniqueName(mbx, dest, f.displayName)) {\n throw Errors.folderExists(f.displayName);\n }\n const copyTree = (src: FolderRecord, parent: FolderRecord): FolderRecord => {\n const counter = this.alloc(mbx);\n const c: FolderRecord = {\n ...src,\n counter,\n parentCounter: parent.counter,\n distinguished: false,\n wellKnownName: null,\n changeNumber: this.bump(mbx),\n };\n mbx.folders[counter] = c;\n mbx.issued[counter] = \"folder\";\n for (const item of this.itemsIn(mbx, src.counter)) {\n this.copyItem(mbx, item, c);\n }\n for (const child of Object.values(mbx.folders).filter(\n (x) => x.parentCounter === src.counter && x.counter !== counter,\n )) {\n copyTree(child, c);\n }\n return c;\n };\n const copy = copyTree(f, dest);\n this.journal(mbx, \"created\", \"folder\", dest.counter, copy.counter);\n return copy;\n }\n\n // ---------------------------------------------------------------------------\n // Items\n // ---------------------------------------------------------------------------\n\n /** Directory display name for an address inside the tenant. */\n directoryName(address: string): string | null {\n const mbx = this.mailboxByAddress(address);\n return mbx ? mbx.displayName : null;\n }\n\n /**\n * Normalize a recipient the way the store does: tenant addresses take the\n * directory display name; external addresses keep the supplied name or\n * fall back to the address.\n */\n resolveRecipient(r: { emailAddress?: { address?: string | null; name?: string | null } | null }): Recipient {\n const address = r.emailAddress?.address ?? \"\";\n const dir = address ? this.directoryName(address) : null;\n const name = dir ?? (r.emailAddress?.name || address);\n return { emailAddress: { name, address } };\n }\n\n newMessage(mbx: MailboxRecord, folder: FolderRecord, fields: Partial<MessageRecord>): MessageRecord {\n const now = isoSeconds();\n const counter = this.alloc(mbx);\n const conversationGuid = fields.conversationGuid ?? guidHex();\n const item: MessageRecord = {\n counter,\n immutableCounter: counter,\n folderCounter: folder.counter,\n state: \"draft\",\n itemClass: \"IPM.Note\",\n createdDateTime: now,\n lastModifiedDateTime: now,\n receivedDateTime: now,\n sentDateTime: now,\n changeNumber: this.bump(mbx),\n changeKeyClass: 0x09,\n categories: [],\n internetMessageId: \"\",\n subject: \"\",\n body: { contentType: \"text\", content: \"\" },\n uniqueBody: null,\n importance: \"normal\",\n conversationGuid,\n conversationIndex: \"\",\n isDeliveryReceiptRequested: false,\n isReadReceiptRequested: false,\n isRead: true,\n inferenceClassification: \"focused\",\n sender: null,\n from: null,\n toRecipients: [],\n ccRecipients: [],\n bccRecipients: [],\n replyTo: [],\n flag: { flagStatus: \"notFlagged\" },\n internetMessageHeaders: null,\n attachments: [],\n inReplyTo: null,\n references: null,\n readReceiptSent: false,\n singleValueExtendedProperties: [],\n multiValueExtendedProperties: [],\n extensions: [],\n size: 0,\n ...fields,\n };\n item.counter = counter;\n item.immutableCounter = counter;\n item.folderCounter = folder.counter;\n // A new item always gets its own change number, even when cloned (verified: copies get a new changeKey).\n item.changeNumber = this.bump(mbx);\n this.recomputeSize(item);\n mbx.items[counter] = item;\n mbx.issued[counter] = \"item\";\n mbx.immutable[counter] = counter;\n this.journal(mbx, \"created\", \"message\", folder.counter, counter);\n return item;\n }\n\n recomputeSize(item: MessageRecord): void {\n const recips = [...item.toRecipients, ...item.ccRecipients, ...item.bccRecipients, ...item.replyTo];\n item.size =\n 1800 +\n Buffer.byteLength(item.subject) * 2 +\n Buffer.byteLength(item.body.content) +\n recips.reduce((n, r) => n + 40 + r.emailAddress.address.length + r.emailAddress.name.length, 0) +\n item.attachments.reduce((n, a) => n + a.size, 0);\n }\n\n /** Record a content change: new change number, lastModified, journal. */\n touch(mbx: MailboxRecord, item: MessageRecord, kind: \"content\" | \"read\" = \"content\"): void {\n if (kind === \"content\") {\n item.changeNumber = this.bump(mbx);\n item.lastModifiedDateTime = isoSeconds();\n this.recomputeSize(item);\n this.journal(mbx, \"updated\", \"message\", item.folderCounter, item.counter);\n } else {\n this.journal(mbx, \"read\", \"message\", item.folderCounter, item.counter);\n }\n }\n\n moveItem(mbx: MailboxRecord, item: MessageRecord, dest: FolderRecord): MessageRecord {\n if (dest.counter === item.folderCounter) {\n return item;\n }\n const formerId = this.itemId(mbx, item);\n const from = item.folderCounter;\n delete mbx.items[item.counter];\n this.journal(mbx, \"deleted\", \"message\", from, item.counter, formerId);\n const counter = this.alloc(mbx);\n item.counter = counter;\n item.folderCounter = dest.counter;\n item.changeNumber = this.bump(mbx);\n item.lastModifiedDateTime = isoSeconds();\n mbx.items[counter] = item;\n mbx.issued[counter] = \"item\";\n mbx.immutable[item.immutableCounter] = counter;\n this.journal(mbx, \"created\", \"message\", dest.counter, counter);\n return item;\n }\n\n copyItem(mbx: MailboxRecord, item: MessageRecord, dest: FolderRecord, targetMbx: MailboxRecord = mbx): MessageRecord {\n const clone: MessageRecord = JSON.parse(JSON.stringify(item));\n const copy = this.newMessage(targetMbx, dest, {\n ...clone,\n createdDateTime: isoSeconds(),\n lastModifiedDateTime: isoSeconds(),\n attachments: clone.attachments.map((a) => ({ ...a, counter: this.alloc(targetMbx) })),\n });\n return copy;\n }\n\n /** Remove an item from its folder (journaled). */\n private removeItem(mbx: MailboxRecord, item: MessageRecord, kind: JournalKind): void {\n const formerId = this.itemId(mbx, item);\n delete mbx.items[item.counter];\n this.journal(mbx, kind, \"message\", item.folderCounter, item.counter, formerId);\n }\n\n /** DELETE: soft delete into Recoverable Items/Deletions. */\n deleteItem(mbx: MailboxRecord, item: MessageRecord): void {\n const deletions = this.wellKnown(mbx, \"recoverableitemsdeletions\");\n if (item.folderCounter === deletions.counter) {\n this.purgeItem(mbx, item);\n return;\n }\n this.moveItem(mbx, item, deletions);\n }\n\n /** permanentDelete: remove entirely (ids now answer 404). */\n purgeItem(mbx: MailboxRecord, item: MessageRecord): void {\n this.removeItem(mbx, item, \"deleted\");\n delete mbx.immutable[item.immutableCounter];\n mbx.immutable[item.immutableCounter] = -1;\n }\n\n findByInternetMessageId(mbx: MailboxRecord, imid: string): MessageRecord[] {\n return Object.values(mbx.items).filter((i) => i.internetMessageId === imid);\n }\n}\n\nexport function defaultCategories() {\n const presets: [string, string][] = [\n [\"Red category\", \"preset0\"],\n [\"Orange category\", \"preset1\"],\n [\"Yellow category\", \"preset3\"],\n [\"Green category\", \"preset4\"],\n [\"Blue category\", \"preset7\"],\n [\"Purple category\", \"preset8\"],\n ];\n return presets.map(([displayName, color]) => ({ id: randomUUID(), displayName, color }));\n}\n\nconst instances = new WeakMap<Store, Exchange>();\n\nexport function getExchange(store: Store): Exchange {\n let ex = instances.get(store);\n if (!ex) {\n ex = new Exchange(store);\n instances.set(store, ex);\n }\n return ex;\n}\n","/**\n * Request and response model shared by the Graph dispatcher, the handlers\n * and $batch (which replays sub-requests through the same pipeline).\n */\nimport { randomUUID } from \"node:crypto\";\nimport type { Store, TokenMap, WebhookDispatcher } from \"@deploybaseline/core\";\nimport type { Principal } from \"./auth.js\";\nimport { Errors, GraphError, renderError } from \"./errors.js\";\nimport type { Exchange } from \"./exchange/exchange.js\";\nimport type { Transport } from \"./exchange/transport.js\";\nimport type { QueryOptions } from \"./odata/query.js\";\n\nconst PREFERENCE_PAIR = /^([\\w.-]+)\\s*=\\s*\"?([^\"]*)\"?$/;\n\n/** Content type of OData JSON responses (verified live). */\nexport const ODATA_JSON =\n \"application/json; odata.metadata=minimal; odata.streaming=true; IEEE754Compatible=false; charset=utf-8\";\n/** Content type used by the Outlook REST host (upload sessions, subscriptions). */\nexport const OUTLOOK_JSON =\n \"application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8\";\n\nexport interface GraphServices {\n store: Store;\n exchange: Exchange;\n transport: Transport;\n baseUrl: string;\n tokenMap?: TokenMap;\n webhooks: WebhookDispatcher;\n}\n\nexport interface Segment {\n name: string;\n /** Key from OData key syntax: name('key') */\n key: string | null;\n}\n\nexport interface GraphRequest {\n method: string;\n version: string;\n /** Path after the version, already split into segments. */\n segments: Segment[];\n rawPath: string;\n rawQuery: string;\n query: QueryOptions;\n headers: Record<string, string>;\n bodyText: string;\n /** Raw body bytes (binary uploads such as driveItem content). */\n bodyBytes?: Uint8Array;\n principal: Principal;\n requestId: string;\n clientRequestId: string;\n /** Inside a $batch: the batch sub-request id. */\n batchId?: string;\n}\n\nexport interface GraphResponse {\n status: number;\n headers: Record<string, string>;\n body: unknown;\n /** Raw (non JSON) body. */\n raw?: string | Uint8Array;\n}\n\nexport function json(status: number, body: unknown, headers: Record<string, string> = {}): GraphResponse {\n return { status, headers: { \"Content-Type\": ODATA_JSON, ...headers }, body };\n}\n\nexport function noContent(status = 204, headers: Record<string, string> = {}): GraphResponse {\n return { status, headers, body: null };\n}\n\nexport function errorResponse(err: GraphError, req: { requestId: string; clientRequestId: string }): GraphResponse {\n const r = renderError(err, req);\n let contentType = \"application/json\";\n if (err.layer === \"exchange\") {\n contentType = ODATA_JSON;\n } else if (err.layer === \"sharepoint\") {\n contentType = \"application/json; charset=utf-8\";\n }\n return { status: r.status, headers: { \"Content-Type\": contentType, ...r.headers }, body: r.body };\n}\n\nexport function newRequestId(): string {\n return randomUUID();\n}\n\n/** Parse the JSON body of a write request (Graph front end rules). */\nexport function parseJsonBody(req: GraphRequest, opts: { allowEmpty?: boolean } = {}): Record<string, unknown> {\n const text = req.bodyText;\n if (!text?.trim()) {\n if (opts.allowEmpty) {\n return {};\n }\n return {};\n }\n try {\n const v = JSON.parse(text);\n if (v === null || typeof v !== \"object\" || Array.isArray(v)) {\n throw Errors.unreadableJson();\n }\n return v as Record<string, unknown>;\n } catch (e) {\n if (e instanceof GraphError) {\n throw e;\n }\n throw Errors.unreadableJson();\n }\n}\n\nexport interface Preferences {\n bodyType: \"text\" | \"html\" | null;\n immutableIds: boolean;\n maxPageSize: number | null;\n applied: string[];\n returnMinimal: boolean;\n trackChangesOnly: boolean;\n /** Prefer: outlook.timezone (calendar responses), as the client wrote it. */\n timeZone: string | null;\n}\n\n/** Parse the Prefer header(s). */\nexport function parsePrefer(header: string | undefined): Preferences {\n const out: Preferences = {\n bodyType: null,\n immutableIds: false,\n maxPageSize: null,\n applied: [],\n returnMinimal: false,\n trackChangesOnly: false,\n timeZone: null,\n };\n if (!header) {\n return out;\n }\n for (const part of header.split(\",\")) {\n const p = part.trim();\n const m = PREFERENCE_PAIR.exec(p);\n if (!m) {\n if (p.toLowerCase() === \"return=minimal\") {\n out.returnMinimal = true;\n }\n continue;\n }\n const key = m[1].toLowerCase();\n const [, , value] = m;\n if (key === \"outlook.body-content-type\") {\n const v = value.toLowerCase();\n if (v !== \"text\" && v !== \"html\") {\n throw Errors.bodyContentTypeNotSupported();\n }\n out.bodyType = v;\n out.applied.push(`outlook.body-content-type=\"${v}\"`);\n } else if (key === \"idtype\") {\n if (value.toLowerCase() === \"immutableid\") {\n out.immutableIds = true;\n out.applied.push(\"IdType=ImmutableId\");\n }\n } else if (key === \"odata.maxpagesize\") {\n const n = Number.parseInt(value, 10);\n if (Number.isFinite(n) && n > 0) {\n out.maxPageSize = n;\n }\n } else if (key === \"return\") {\n out.returnMinimal = value.toLowerCase() === \"minimal\";\n } else if (key === \"outlook.timezone\") {\n out.timeZone = value;\n } else if (key === \"odata.track-changes\") {\n out.trackChangesOnly = true;\n }\n }\n return out;\n}\n\n/** Percent-encode a user key the way Graph writes it in @odata.context. */\nexport function contextUserKey(key: string): string {\n return encodeURIComponent(key).replace(/%2B/gi, \"+\");\n}\n","/**\n * Message body conversions.\n *\n * Exchange stores HTML bodies inside a fixed document wrapper and derives\n * bodyPreview and text renderings with its own HTML to text converter. The\n * rules below reproduce the conversions observed against Exchange Online\n * (see conformance recordings exp.messages.reply-to-and-flags,\n * mail.messages.create.*, mail.reply.flow):\n *\n * - `<p>`, `<ul>`, `<ol>`, `<table>` and headings are separated by a blank line.\n * - `<div>`, `<li>`, `<tr>` and `<hr>` start a new line.\n * - `<li>` items are rendered as \" * item\".\n * - `<hr>` becomes a line of 32 underscores.\n * - Anchors render as \"text<href>\" in full text and \"text\" in previews.\n * - Lines are joined with CRLF and trailing whitespace on each line is removed.\n * - bodyPreview is at most 255 characters.\n */\nimport type { ItemBody } from \"./model.js\";\n\nconst CID_SCHEME = /^cid:/i;\nconst HTML_BODY_CONTENT = /<body[^>]*>([\\s\\S]*?)<\\/body>/i;\nconst HTML_DOCTYPE = /<!DOCTYPE[^>]*>/i;\nconst HTML_HEAD_ELEMENT = /<head[\\s\\S]*?<\\/head>/i;\nconst TRAILING_WHITESPACE_CHAR = /\\s$/;\nconst LEADING_SPACES = /^[ \\t]+/;\nconst MAILTO_SCHEME = /^mailto:/i;\nconst TRAILING_SPACES = /[ \\t]+$/;\nconst LEADING_CRLFS = /^(\\r\\n)+/;\nconst TRAILING_CRLFS = /(\\r\\n)+$/;\nconst BLOCK_ELEMENT_START = /^<(div|p|ul|ol|table|blockquote|pre|h[1-6])\\b/i;\nconst TRAILING_WHITESPACE = /\\s+$/;\n\n/**\n * Body of an attendee's calendar copy when the organizer's body is empty\n * (verified, calendar.meetings.flow): Exchange stores the request's RTF body.\n */\nexport const ATTENDEE_EMPTY_BODY =\n '<html>\\r\\n<head>\\r\\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\\r\\n<meta name=\"Generator\" content=\"Microsoft Exchange Server\">\\r\\n<!-- converted from rtf -->\\r\\n<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>\\r\\n</head>\\r\\n<body>\\r\\n<font face=\"Times New Roman\" size=\"3\"><span style=\"font-size:12pt;\"><a name=\"BM_BEGIN\"></a></span></font>\\r\\n</body>\\r\\n</html>\\r\\n';\n\n/** Head of a reply or forward composed over a text original (verified). */\nconst TEXT_QUOTE_HEAD =\n '<html><head>\\r\\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><meta name=\"Generator\" content=\"Microsoft Exchange Server\"><style>\\r\\n<!--\\r\\n.EmailQuote\\r\\n\\t{margin-left:1pt;\\r\\n\\tpadding-left:4pt;\\r\\n\\tborder-left:#800000 2px solid}\\r\\n-->\\r\\n</style></head>';\nexport const HTML_HEAD = '<html><head>\\r\\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head>';\nexport const PREVIEW_LIMIT = 255;\n\nconst BLOCK_PARAGRAPH = new Set([\"p\", \"ul\", \"ol\", \"table\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"blockquote\", \"pre\"]);\nconst BLOCK_LINE = new Set([\n \"div\",\n \"li\",\n \"tr\",\n \"hr\",\n \"section\",\n \"article\",\n \"header\",\n \"footer\",\n \"dl\",\n \"dt\",\n \"dd\",\n \"center\",\n \"form\",\n]);\nconst VOID = new Set([\n \"br\",\n \"hr\",\n \"img\",\n \"meta\",\n \"link\",\n \"input\",\n \"col\",\n \"area\",\n \"base\",\n \"wbr\",\n \"source\",\n \"track\",\n \"embed\",\n \"param\",\n]);\nconst SKIP_CONTENT = new Set([\"head\", \"style\", \"script\", \"title\"]);\n\ninterface Token {\n type: \"text\" | \"open\" | \"close\" | \"comment\" | \"doctype\";\n name?: string;\n attrs?: [string, string | null][];\n selfClosing?: boolean;\n raw: string;\n}\n\n/** Minimal HTML tokenizer, sufficient for message bodies. */\nexport function tokenize(html: string): Token[] {\n const out: Token[] = [];\n const re =\n /<!--[\\s\\S]*?-->|<!\\w[^>]*>|<\\/?([a-zA-Z][a-zA-Z0-9:-]*)((?:\\s+[^\\s\"'>/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s\"'>]+))?)*)\\s*(\\/?)>/g;\n let last = 0;\n for (let m = re.exec(html); m; m = re.exec(html)) {\n if (m.index > last) {\n out.push({ type: \"text\", raw: html.slice(last, m.index) });\n }\n const [raw] = m;\n if (raw.startsWith(\"<!--\")) {\n out.push({ type: \"comment\", raw });\n } else if (raw.startsWith(\"<!\")) {\n out.push({ type: \"doctype\", raw });\n } else {\n const name = m[1].toLowerCase();\n const attrs: [string, string | null][] = [];\n const attrRe = /([^\\s\"'>/=]+)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'>]+)))?/g;\n for (let a = attrRe.exec(m[2] ?? \"\"); a; a = attrRe.exec(m[2] ?? \"\")) {\n const value = a[2] ?? a[3] ?? a[4];\n attrs.push([a[1], value === undefined ? null : value]);\n }\n out.push({ type: raw.startsWith(\"</\") ? \"close\" : \"open\", name, attrs, selfClosing: m[3] === \"/\", raw });\n }\n last = re.lastIndex;\n }\n if (last < html.length) {\n out.push({ type: \"text\", raw: html.slice(last) });\n }\n return out;\n}\n\nconst NAMED_ENTITIES: Record<string, string> = {\n amp: \"&\",\n lt: \"<\",\n gt: \">\",\n quot: '\"',\n apos: \"'\",\n nbsp: \" \",\n copy: \"©\",\n reg: \"®\",\n hellip: \"…\",\n mdash: \"—\",\n ndash: \"–\",\n lsquo: \"‘\",\n rsquo: \"’\",\n ldquo: \"“\",\n rdquo: \"”\",\n euro: \"€\",\n trade: \"™\",\n bull: \"•\",\n};\n\nexport function decodeEntities(s: string): string {\n return s.replace(/&(#x[0-9a-f]+|#\\d+|[a-z]+);/gi, (whole, e: string) => {\n if (e[0] === \"#\") {\n const code = e[1] === \"x\" || e[1] === \"X\" ? Number.parseInt(e.slice(2), 16) : Number.parseInt(e.slice(1), 10);\n return Number.isFinite(code) ? String.fromCodePoint(code) : whole;\n }\n return NAMED_ENTITIES[e.toLowerCase()] ?? whole;\n });\n}\n\nexport function escapeHtml(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&(?![a-z#0-9]+;)/gi, \"&\").replace(/\"/g, \""\");\n}\n\nfunction serializeTag(t: Token): string {\n if (t.type !== \"open\" && t.type !== \"close\") {\n return t.raw;\n }\n if (t.type === \"close\") {\n return `</${t.name}>`;\n }\n const attrs = (t.attrs ?? []).map(([k, v]) => (v === null ? ` ${k}` : ` ${k}=\"${escapeAttr(v)}\"`)).join(\"\");\n return `<${t.name}${attrs}${t.selfClosing && !VOID.has(t.name!) ? \" /\" : \"\"}>`;\n}\n\n/**\n * Normalize the inner HTML the way the store does on save: attribute values\n * are re-quoted with double quotes and inline (cid:) images receive the\n * data-outlook-trace marker.\n */\nexport function normalizeInnerHtml(inner: string): string {\n return tokenize(inner)\n .map((t) => {\n if (t.type !== \"open\") {\n return t.raw;\n }\n if (t.name === \"img\") {\n const src = t.attrs?.find(([k]) => k.toLowerCase() === \"src\")?.[1] ?? \"\";\n if (CID_SCHEME.test(src) && !t.attrs!.some(([k]) => k.toLowerCase() === \"data-outlook-trace\")) {\n const idx = t.attrs!.findIndex(([k]) => k.toLowerCase() === \"src\");\n t.attrs!.splice(idx, 0, [\"data-outlook-trace\", \"F:0|T:1\"]);\n }\n }\n return serializeTag(t);\n })\n .join(\"\");\n}\n\n/** Extract the inner HTML of <body>, or the whole fragment if there is none. */\nexport function bodyInner(html: string): string {\n const m = HTML_BODY_CONTENT.exec(html);\n if (m) {\n return m[1];\n }\n return html\n .replace(HTML_DOCTYPE, \"\")\n .replace(/<\\/?html[^>]*>/gi, \"\")\n .replace(HTML_HEAD_ELEMENT, \"\");\n}\n\nfunction endsWithInlineContent(inner: string): boolean {\n const tokens = tokenize(inner).filter((t) => !(t.type === \"text\" && t.raw.trim() === \"\"));\n const last = tokens.at(-1);\n if (!last) {\n return false;\n }\n if (last.type === \"text\") {\n return true;\n }\n if (last.type === \"close\") {\n return !(BLOCK_PARAGRAPH.has(last.name!) || BLOCK_LINE.has(last.name!));\n }\n if (last.type === \"open\") {\n return last.name === \"br\" || last.name === \"img\";\n }\n return false;\n}\n\n/** Wrap and normalize an HTML body for storage. */\nexport function storeHtml(content: string): string {\n let inner = normalizeInnerHtml(bodyInner(content));\n if (endsWithInlineContent(inner) && !TRAILING_WHITESPACE_CHAR.test(inner)) {\n inner += \" \";\n }\n return `${HTML_HEAD}<body>${inner}</body></html>`;\n}\n\n/** Normalize an incoming body ({contentType, content}) to stored form. */\nexport function storeBody(input: { contentType?: string; content?: string } | null | undefined): ItemBody {\n if (!input) {\n return { contentType: \"text\", content: \"\" };\n }\n const type = (input.contentType ?? \"text\").toLowerCase() === \"html\" ? \"html\" : \"text\";\n const content = input.content ?? \"\";\n if (type === \"html\") {\n return { contentType: \"html\", content: storeHtml(content) };\n }\n return { contentType: \"text\", content };\n}\n\ninterface TextOptions {\n /** Render anchors as \"text<href>\". */\n links: boolean;\n}\n\n/** Exchange style HTML to plain text conversion. */\nexport function htmlToText(html: string, opts: TextOptions = { links: true }): string {\n const tokens = tokenize(bodyInner(html));\n let out = \"\";\n let pending = 0;\n let pendingFromBr = false;\n let skipDepth = 0;\n const anchorStack: Array<string | null> = [];\n let preDepth = 0;\n let atLineStart = true;\n\n const requestBreak = (n: number) => {\n if (out.length === 0) {\n return;\n }\n if (pendingFromBr && pending > 0) {\n pending = Math.max(pending, n);\n } else {\n pending = Math.max(pending, n);\n }\n pendingFromBr = false;\n };\n const write = (text: string, verbatim = false) => {\n let s = text;\n if (!s) {\n return;\n }\n if (pending > 0 && out.length > 0) {\n out += \"\\n\".repeat(pending);\n atLineStart = true;\n }\n pending = 0;\n pendingFromBr = false;\n if (atLineStart && !verbatim) {\n s = s.replace(LEADING_SPACES, \"\");\n }\n if (!s) {\n return;\n }\n out += s;\n atLineStart = false;\n };\n\n for (const t of tokens) {\n if (t.type === \"comment\" || t.type === \"doctype\") {\n continue;\n }\n if (t.type === \"open\" || t.type === \"close\") {\n const name = t.name!;\n if (SKIP_CONTENT.has(name)) {\n if (t.type === \"open\" && !t.selfClosing) {\n skipDepth += 1;\n } else if (t.type === \"close\") {\n skipDepth = Math.max(0, skipDepth - 1);\n }\n continue;\n }\n if (skipDepth) {\n continue;\n }\n if (t.type === \"open\") {\n if (name === \"br\") {\n if (out.length === 0) {\n continue;\n }\n if (pending > 0 && !pendingFromBr) {\n pending = Math.max(pending, 2);\n } else {\n pending += 1;\n pendingFromBr = true;\n }\n continue;\n }\n if (name === \"hr\") {\n requestBreak(1);\n if (out.length === 0) {\n out = \"_\".repeat(32);\n } else {\n write(\"_\".repeat(32));\n }\n atLineStart = false;\n pending = 1;\n pendingFromBr = false;\n continue;\n }\n if (BLOCK_PARAGRAPH.has(name)) {\n requestBreak(2);\n } else if (BLOCK_LINE.has(name)) {\n requestBreak(1);\n }\n if (name === \"pre\") {\n preDepth += 1;\n }\n if (name === \"li\") {\n requestBreak(1);\n write(\" * \", true);\n atLineStart = false;\n }\n if (name === \"a\") {\n anchorStack.push(t.attrs?.find(([k]) => k.toLowerCase() === \"href\")?.[1] ?? null);\n }\n if (name === \"td\" || name === \"th\") {\n write(\"\\t\");\n }\n if (name === \"img\") {\n const alt = t.attrs?.find(([k]) => k.toLowerCase() === \"alt\")?.[1];\n if (alt) {\n write(`[${alt}]`);\n }\n }\n } else {\n if (BLOCK_PARAGRAPH.has(name)) {\n requestBreak(2);\n } else if (BLOCK_LINE.has(name)) {\n requestBreak(1);\n }\n if (name === \"pre\") {\n preDepth = Math.max(0, preDepth - 1);\n }\n if (name === \"a\") {\n const href = anchorStack.pop();\n if (opts.links && href && !MAILTO_SCHEME.test(href) && !href.startsWith(\"#\")) {\n write(`<${href}>`);\n }\n }\n }\n continue;\n }\n if (skipDepth) {\n continue;\n }\n let text = decodeEntities(t.raw);\n if (!preDepth) {\n text = text.replace(/[\\r\\n\\t ]+/g, \" \");\n if (text === \" \" && (atLineStart || pending > 0)) {\n continue;\n }\n }\n write(text);\n }\n\n return out\n .replace(/ /g, \" \")\n .split(\"\\n\")\n .map((l) => l.replace(TRAILING_SPACES, \"\"))\n .join(\"\\r\\n\")\n .replace(LEADING_CRLFS, \"\")\n .replace(TRAILING_CRLFS, \"\");\n}\n\n/** Text rendering returned with Prefer: outlook.body-content-type=\"text\". */\nexport function bodyAsText(body: ItemBody): ItemBody {\n if (body.contentType === \"text\") {\n const t = body.content.replace(/\\r?\\n/g, \"\\r\\n\");\n return { contentType: \"text\", content: t.endsWith(\"\\r\\n\") ? t : `${t}\\r\\n` };\n }\n const t = htmlToText(body.content, { links: true });\n return { contentType: \"text\", content: `${t}\\r\\n` };\n}\n\n/** HTML rendering of a text body with Prefer: outlook.body-content-type=\"html\". */\nexport function bodyAsHtml(body: ItemBody): ItemBody {\n if (body.contentType === \"html\") {\n return body;\n }\n // Verified for events: an empty text body converts to a single .\n const inner = body.content ? escapeHtml(body.content).replace(/\\r?\\n/g, \"<br>\\r\\n\") : \" \";\n return {\n contentType: \"html\",\n content:\n '<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\\r\\n' +\n '<meta name=\"Generator\" content=\"Microsoft Exchange Server\">\\r\\n' +\n \"<!-- converted from text -->\\r\\n\" +\n \"<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style></head>\\r\\n\" +\n \"<body>\\r\\n\" +\n `<font size=\"2\"><span style=\"font-size:11pt;\"><div class=\"PlainText\">${inner}</div></span></font>\\r\\n` +\n \"</body>\\r\\n\" +\n \"</html>\\r\\n\",\n };\n}\n\n/** uniqueBody rendering of a text body as HTML. */\nexport function uniqueBodyAsHtml(body: ItemBody): ItemBody {\n if (body.contentType === \"html\") {\n // Verified (exp.reply.unique-body-by-original): the unique fragment is\n // wrapped in two divs, with a line break before a leading block element.\n // A reply to an HTML original keeps the comment's trailing space\n // (\"<div>\\r\\n<div>Thanks </div></div>\"); a reply to a text original wraps\n // the comment in its own div (\"<div>\\r\\n<div>\\r\\n<div>Thanks</div></div></div>\").\n const inner = bodyInner(body.content).replace(/^[\\r\\n\\t]+|[\\r\\n\\t]+$/g, \"\");\n const lead = BLOCK_ELEMENT_START.test(inner) ? \"\\r\\n\" : \"\";\n return { contentType: \"html\", content: `<html><body><div>\\r\\n<div>${lead}${inner}</div></div>\\r\\n</body></html>` };\n }\n const inner = escapeHtml(body.content).replace(/\\r?\\n/g, \"<br>\\r\\n\");\n return {\n contentType: \"html\",\n content: `<html><body><div>\\r\\n<div><font size=\"2\"><span style=\"font-size:11pt;\">${inner}</span></font></div>\\r\\n</div>\\r\\n</body></html>`,\n };\n}\n\n/**\n * Verified live (calendar.meetings.forward-notification): previews of HTML\n * with table cells expand tabs to 8-column stops, so a \" \" cell\n * followed by a text cell starts the text at column 8.\n */\nfunction expandTabs(text: string): string {\n return text\n .split(\"\\r\\n\")\n .map((line) => {\n let out = \"\";\n for (const ch of line) {\n out += ch === \"\\t\" ? \" \".repeat(8 - (out.length % 8)) : ch;\n }\n return out;\n })\n .join(\"\\r\\n\");\n}\n\nexport function bodyPreview(body: ItemBody): string {\n if (!body.content) {\n return \"\";\n }\n const text =\n body.contentType === \"html\"\n ? expandTabs(htmlToText(body.content, { links: false }))\n : body.content.replace(/^\\s+|\\s+$/g, \"\");\n // Verified (mail.reply.flow): the cut at 255 characters is followed by trimming trailing whitespace.\n return text.length > PREVIEW_LIMIT ? text.slice(0, PREVIEW_LIMIT).replace(TRAILING_WHITESPACE, \"\") : text;\n}\n\n/** Rendered date used in reply headers: \"Sunday, 18 October 2026 20:20:36\". */\nexport function longDate(iso: string, locale = \"en-GB\"): string {\n const d = new Date(iso);\n const weekday = d.toLocaleDateString(locale, { weekday: \"long\", timeZone: \"UTC\" });\n const day = d.getUTCDate();\n const month = d.toLocaleDateString(locale, { month: \"long\", timeZone: \"UTC\" });\n const time = d.toISOString().slice(11, 19);\n return `${weekday}, ${day} ${month} ${d.getUTCFullYear()} ${time}`;\n}\n\nexport interface QuoteHeader {\n from: { name: string; address: string } | null;\n sentDateTime: string;\n to: Array<{ name: string; address: string }>;\n cc: Array<{ name: string; address: string }>;\n subject: string;\n}\n\nfunction fmtAddr(a: { name: string; address: string }): string {\n return `${escapeHtml(a.name || a.address)} <${escapeHtml(a.address)}>`;\n}\n\n/**\n * Build the body of a reply or forward draft: optional comment, the\n * divRplyFwdMsg header block and the original body.\n */\nexport function quoteBody(original: ItemBody, header: QuoteHeader, comment: string | null): ItemBody {\n const lines: string[] = [];\n if (header.from) {\n lines.push(`<b>From:</b> ${fmtAddr(header.from)}`);\n }\n lines.push(`<b>Sent:</b> ${longDate(header.sentDateTime)}`);\n if (header.to.length) {\n lines.push(`<b>To:</b> ${header.to.map(fmtAddr).join(\"; \")}`);\n }\n if (header.cc.length) {\n lines.push(`<b>Cc:</b> ${header.cc.map(fmtAddr).join(\"; \")}`);\n }\n lines.push(`<b>Subject:</b> ${escapeHtml(header.subject)}`);\n const lead = comment ? normalizeInnerHtml(comment) : \"\";\n if (original.contentType === \"text\") {\n // Verified (exp.reply.unique-body-by-original, received copies of replies\n // to text and empty originals): Exchange quotes a text original in its\n // plain text layout, with the converter head and x_ prefixed header ids.\n const text = original.content ? escapeHtml(original.content).replace(/\\r?\\n/g, \"<br>\") : \" \";\n const inner =\n `<div>${lead}<hr tabindex=\"-1\" style=\"display:inline-block; width:98%\">` +\n `<div id=\"x_divRplyFwdMsg\" dir=\"ltr\"><font face=\"Calibri, sans-serif\" color=\"#000000\" style=\"font-size:11pt\">${lines.join(\"<br>\")}</font><div> </div></div></div>` +\n `<font size=\"2\"><span style=\"font-size:11pt\"><div class=\"PlainText\">${text}</div></span></font>`;\n return { contentType: \"html\", content: `${TEXT_QUOTE_HEAD}<body>${inner}</body></html>` };\n }\n const originalInner = bodyInner(original.content).replace(TRAILING_WHITESPACE, \"\");\n const prefix = comment ? `${lead} ` : \"\";\n const inner =\n `${prefix}<hr tabindex=\"-1\" style=\"display:inline-block; width:98%\">` +\n `<div id=\"divRplyFwdMsg\" dir=\"ltr\"><font face=\"Calibri, sans-serif\" color=\"#000000\" style=\"font-size:11pt\">${lines.join(\"<br>\")}</font> <div> </div></div>` +\n `<div>${originalInner}</div>`;\n return { contentType: \"html\", content: `${HTML_HEAD}<body>${inner}</body></html>` };\n}\n\n/**\n * Build a uniqueBody for a reply: the part of the composed body before the\n * quote separator (the comment plus a trailing space for HTML originals, the\n * comment in a div for text originals).\n */\nexport function commentBody(comment: string | null, original: ItemBody): ItemBody {\n const c = comment ? normalizeInnerHtml(comment) : \"\";\n let fragment = c ? `${c} ` : \"\";\n if (original.contentType === \"text\") {\n fragment = `<div>${c}</div>`;\n }\n return { contentType: \"html\", content: `<html><body>${fragment}</body></html>` };\n}\n","/**\n * Request payload validation for message and folder writes.\n *\n * Mirrors the OData reader used by Graph (verified live,\n * mail.messages.update.draft): unknown properties and bad literals are\n * RequestBodyRead errors, enum values are case-insensitive, and read-only\n * properties are silently ignored.\n */\nimport { Errors, GraphError } from \"./errors.js\";\nimport { storeBody } from \"./exchange/bodies.js\";\nimport type { Exchange } from \"./exchange/exchange.js\";\nimport type { DateTimeTimeZone, FollowupFlag, ItemBody, MessageRecord, Recipient } from \"./exchange/model.js\";\n\nconst TIMEZONE_OFFSET = /[zZ]|[+-]\\d{2}:\\d{2}$/;\nconst MILLISECONDS_FRACTION = /\\.(\\d{3})$/;\n\ntype Json = Record<string, unknown>;\n\nconst MESSAGE_WRITABLE = new Set([\n \"subject\",\n \"body\",\n \"toRecipients\",\n \"ccRecipients\",\n \"bccRecipients\",\n \"replyTo\",\n \"from\",\n \"sender\",\n \"importance\",\n \"isRead\",\n \"isReadReceiptRequested\",\n \"isDeliveryReceiptRequested\",\n \"categories\",\n \"flag\",\n \"inferenceClassification\",\n \"internetMessageId\",\n \"internetMessageHeaders\",\n \"attachments\",\n \"singleValueExtendedProperties\",\n \"multiValueExtendedProperties\",\n \"extensions\",\n \"mentions\",\n]);\n\nconst MESSAGE_READONLY = new Set([\n \"id\",\n \"createdDateTime\",\n \"lastModifiedDateTime\",\n \"changeKey\",\n \"receivedDateTime\",\n \"sentDateTime\",\n \"hasAttachments\",\n \"bodyPreview\",\n \"parentFolderId\",\n \"conversationId\",\n \"conversationIndex\",\n \"isDraft\",\n \"webLink\",\n \"uniqueBody\",\n]);\n\nfunction unexpectedNode(prop: string, kind: string): GraphError {\n return new GraphError(\n 400,\n \"RequestBodyRead\",\n `An unexpected '${kind}' node was found for property named '${prop}' when reading from the JSON reader. A 'PrimitiveValue' node was expected.`,\n );\n}\n\nfunction literal(v: unknown): string {\n if (typeof v === \"string\") {\n return v;\n }\n return JSON.stringify(v);\n}\n\nexport function expectString(prop: string, v: unknown): string | null {\n if (v === null) {\n return null;\n }\n if (typeof v === \"string\") {\n return v;\n }\n if (Array.isArray(v)) {\n throw unexpectedNode(prop, \"StartArray\");\n }\n if (typeof v === \"object\") {\n throw unexpectedNode(prop, \"StartObject\");\n }\n throw Errors.literalConversion(literal(v), \"Edm.String\");\n}\n\nexport function expectBoolean(prop: string, v: unknown): boolean {\n if (typeof v === \"boolean\") {\n return v;\n }\n if (Array.isArray(v)) {\n throw unexpectedNode(prop, \"StartArray\");\n }\n if (v !== null && typeof v === \"object\") {\n throw unexpectedNode(prop, \"StartObject\");\n }\n throw Errors.literalConversion(literal(v), \"Edm.Boolean\");\n}\n\nexport function expectEnum<T extends string>(v: unknown, members: readonly T[]): T {\n if (typeof v !== \"string\") {\n throw Errors.enumValueNotFound(literal(v));\n }\n const m = members.find((x) => x.toLowerCase() === v.toLowerCase());\n if (!m) {\n throw Errors.enumValueNotFound(v);\n }\n return m;\n}\n\nexport function expectObject(_prop: string, v: unknown): Json {\n if (v === null || typeof v !== \"object\" || Array.isArray(v)) {\n throw new GraphError(\n 400,\n \"RequestBodyRead\",\n `An unexpected '${Array.isArray(v) ? \"StartArray\" : \"PrimitiveValue\"}' node was found when reading from the JSON reader. A 'StartObject' node was expected.`,\n );\n }\n return v as Json;\n}\n\nexport function expectArray(_prop: string, v: unknown): unknown[] {\n if (v === null) {\n return [];\n }\n if (!Array.isArray(v)) {\n throw new GraphError(\n 400,\n \"RequestBodyRead\",\n `An unexpected '${typeof v === \"object\" ? \"StartObject\" : \"PrimitiveValue\"}' node was found when reading from the JSON reader. A 'StartArray' node was expected.`,\n );\n }\n return v;\n}\n\n/**\n * Action parameters match case-insensitively (the Kiota SDKs send\n * \"Comment\", \"AvailabilityViewInterval\" and so on; mail actions verified\n * live). Returns the body keyed by the declared names; unknown keys fail\n * like checkKeys.\n */\nexport function actionParams(body: Json, names: string[], action: string): Json {\n const out: Json = {};\n for (const [k, v] of Object.entries(body)) {\n if (k.includes(\"@odata.\")) {\n continue;\n }\n const name = names.find((n) => n.toLowerCase() === k.toLowerCase());\n if (!name) {\n throw Errors.unknownBodyProperty(k, action);\n }\n out[name] = v;\n }\n return out;\n}\n\nexport function checkKeys(obj: Json, allowed: string[], type: string): void {\n for (const k of Object.keys(obj)) {\n if (k.startsWith(\"@odata.\") || k.includes(\"@odata.\")) {\n continue;\n }\n if (!allowed.includes(k)) {\n throw Errors.unknownBodyProperty(k, type);\n }\n }\n}\n\nexport function parseRecipient(ex: Exchange, v: unknown, prop: string): Recipient {\n const o = expectObject(prop, v);\n checkKeys(o, [\"emailAddress\"], \"recipient\");\n const ea =\n o.emailAddress === undefined || o.emailAddress === null ? {} : expectObject(\"emailAddress\", o.emailAddress);\n checkKeys(ea, [\"address\", \"name\"], \"emailAddress\");\n const address = expectString(\"address\", ea.address ?? null);\n const name = expectString(\"name\", ea.name ?? null);\n return ex.resolveRecipient({ emailAddress: { address: address ?? \"\", name } });\n}\n\nexport function parseRecipients(ex: Exchange, v: unknown, prop: string): Recipient[] {\n return expectArray(prop, v).map((r) => parseRecipient(ex, r, prop));\n}\n\nexport function parseBody(v: unknown): ItemBody {\n if (v === null) {\n return { contentType: \"text\", content: \"\" };\n }\n const o = expectObject(\"body\", v);\n checkKeys(o, [\"contentType\", \"content\"], \"itemBody\");\n const contentType =\n o.contentType === undefined || o.contentType === null\n ? \"text\"\n : expectEnum(o.contentType, [\"text\", \"html\"] as const);\n const content = expectString(\"content\", o.content ?? \"\") ?? \"\";\n return storeBody({ contentType, content });\n}\n\nfunction parseDateTimeTimeZone(v: unknown, prop: string): DateTimeTimeZone | undefined {\n if (v === null || v === undefined) {\n return undefined;\n }\n const o = expectObject(prop, v);\n checkKeys(o, [\"dateTime\", \"timeZone\"], \"dateTimeTimeZone\");\n const dt = expectString(\"dateTime\", o.dateTime ?? null);\n if (!dt) {\n throw Errors.requiredProperty(\"dateTime\");\n }\n const d = new Date(TIMEZONE_OFFSET.test(dt) ? dt : `${dt}Z`);\n const iso = Number.isNaN(d.getTime())\n ? dt\n : d.toISOString().replace(\"Z\", \"\").replace(MILLISECONDS_FRACTION, \".$10000\");\n return { dateTime: iso, timeZone: (o.timeZone as string) ?? \"UTC\" };\n}\n\nexport function parseFlag(v: unknown): FollowupFlag {\n const o = expectObject(\"flag\", v);\n checkKeys(o, [\"flagStatus\", \"startDateTime\", \"dueDateTime\", \"completedDateTime\"], \"followupFlag\");\n const status =\n o.flagStatus === undefined\n ? \"notFlagged\"\n : expectEnum(o.flagStatus, [\"notFlagged\", \"complete\", \"flagged\"] as const);\n const flag: FollowupFlag = { flagStatus: status };\n const start = parseDateTimeTimeZone(o.startDateTime, \"startDateTime\");\n const due = parseDateTimeTimeZone(o.dueDateTime, \"dueDateTime\");\n const completed = parseDateTimeTimeZone(o.completedDateTime, \"completedDateTime\");\n // Verified live: dates are only kept when supplied; completedDateTime is truncated to the day.\n if (status === \"flagged\") {\n if (start) {\n flag.startDateTime = start;\n }\n if (due) {\n flag.dueDateTime = due;\n }\n }\n if (status === \"complete\" && completed) {\n flag.completedDateTime = {\n dateTime: `${completed.dateTime.slice(0, 10)}T00:00:00.0000000`,\n timeZone: completed.timeZone,\n };\n }\n return flag;\n}\n\nexport interface MessageInput {\n fields: Partial<MessageRecord>;\n /** Which writable properties were present (after validation). */\n present: Set<string>;\n attachments: unknown[] | null;\n}\n\n/**\n * Validate a message payload. `mode` controls which properties are\n * accepted: \"create\" allows internetMessageId and internetMessageHeaders.\n */\nexport function parseMessageInput(ex: Exchange, input: Json, mode: \"create\" | \"update\" | \"action\"): MessageInput {\n const fields: Partial<MessageRecord> = {};\n const present = new Set<string>();\n let attachments: unknown[] | null = null;\n for (const [k, v] of Object.entries(input)) {\n if (k.startsWith(\"@odata.\") || k.includes(\"@odata.\")) {\n continue;\n }\n if (MESSAGE_READONLY.has(k)) {\n continue;\n }\n if (!MESSAGE_WRITABLE.has(k)) {\n throw Errors.unknownBodyProperty(k, \"message\");\n }\n switch (k) {\n case \"subject\":\n fields.subject = expectString(k, v) ?? \"\";\n break;\n case \"body\":\n fields.body = parseBody(v);\n break;\n case \"toRecipients\":\n case \"ccRecipients\":\n case \"bccRecipients\":\n case \"replyTo\":\n fields[k] = parseRecipients(ex, v, k);\n break;\n case \"from\":\n case \"sender\":\n fields[k] = v === null ? null : parseRecipient(ex, v, k);\n break;\n case \"importance\":\n fields.importance = expectEnum(v, [\"low\", \"normal\", \"high\"] as const);\n break;\n case \"inferenceClassification\":\n fields.inferenceClassification = expectEnum(v, [\"focused\", \"other\"] as const);\n break;\n case \"isRead\":\n case \"isReadReceiptRequested\":\n case \"isDeliveryReceiptRequested\":\n fields[k] = expectBoolean(k, v);\n break;\n case \"categories\":\n fields.categories = expectArray(k, v).map((c) => expectString(k, c) ?? \"\");\n break;\n case \"flag\":\n fields.flag = parseFlag(v);\n break;\n case \"internetMessageId\":\n if (mode !== \"create\") {\n continue;\n }\n fields.internetMessageId = expectString(k, v) ?? \"\";\n break;\n case \"internetMessageHeaders\": {\n if (mode === \"update\") {\n continue;\n }\n const list = expectArray(k, v).map((h) => {\n const o = expectObject(k, h);\n checkKeys(o, [\"name\", \"value\"], \"internetMessageHeader\");\n return { name: String(o.name ?? \"\"), value: String(o.value ?? \"\") };\n });\n fields.internetMessageHeaders = list;\n break;\n }\n case \"attachments\":\n attachments = expectArray(k, v);\n break;\n case \"singleValueExtendedProperties\":\n fields.singleValueExtendedProperties = expectArray(k, v).map((p) => {\n const o = expectObject(k, p);\n return { id: String(o.id ?? \"\"), value: String(o.value ?? \"\") };\n });\n break;\n case \"multiValueExtendedProperties\":\n fields.multiValueExtendedProperties = expectArray(k, v).map((p) => {\n const o = expectObject(k, p);\n return { id: String(o.id ?? \"\"), value: expectArray(\"value\", o.value).map(String) };\n });\n break;\n case \"extensions\":\n fields.extensions = expectArray(k, v).map((e) => expectObject(k, e));\n break;\n case \"mentions\":\n break;\n default:\n break;\n }\n present.add(k);\n }\n return { fields, present, attachments };\n}\n","/**\n * Projections of store records into Graph JSON.\n *\n * Property order matters to some clients and is part of the recorded\n * contract, so every entity has a canonical order (as returned by Exchange\n * Online) and $select returns the selected subset in that same order.\n */\nimport { createHash } from \"node:crypto\";\nimport { Errors } from \"./errors.js\";\nimport { bodyAsHtml, bodyAsText, bodyPreview, uniqueBodyAsHtml } from \"./exchange/bodies.js\";\nimport type { Exchange } from \"./exchange/exchange.js\";\nimport type {\n AttachmentRecord,\n FolderRecord,\n MailboxRecord,\n MeetingMessageInfo,\n MessageRecord,\n} from \"./exchange/model.js\";\n\nconst COLLECTION_TYPE = /^Collection\\((.*)\\)$/;\nconst GRAPH_TYPE_CAST_PREFIX = /^microsoft\\.graph\\.\\w+\\//;\n\nexport interface MessageProperty {\n name: string;\n /** Edm type used for $filter type checking. */\n type: string;\n /** Present in the default (no $select) projection. */\n default: boolean;\n /** Free filter properties combine with any $orderby (verified live). */\n freeFilter?: boolean;\n /** Property cannot appear in $orderby (verified live for isRead). */\n unsortable?: boolean;\n}\n\n/** Canonical order of message properties (verified live). */\nexport const MESSAGE_PROPERTIES: MessageProperty[] = [\n { name: \"createdDateTime\", type: \"Edm.DateTimeOffset\", default: true },\n { name: \"lastModifiedDateTime\", type: \"Edm.DateTimeOffset\", default: true },\n { name: \"changeKey\", type: \"Edm.String\", default: true },\n { name: \"categories\", type: \"Collection(Edm.String)\", default: true, freeFilter: true },\n { name: \"receivedDateTime\", type: \"Edm.DateTimeOffset\", default: true },\n { name: \"sentDateTime\", type: \"Edm.DateTimeOffset\", default: true },\n { name: \"hasAttachments\", type: \"Edm.Boolean\", default: true },\n { name: \"internetMessageId\", type: \"Edm.String\", default: true },\n { name: \"subject\", type: \"Edm.String\", default: true },\n { name: \"bodyPreview\", type: \"Edm.String\", default: true },\n { name: \"importance\", type: \"importance\", default: true },\n { name: \"parentFolderId\", type: \"Edm.String\", default: true },\n { name: \"conversationId\", type: \"Edm.String\", default: true },\n { name: \"conversationIndex\", type: \"Edm.Binary\", default: true },\n { name: \"isDeliveryReceiptRequested\", type: \"Edm.Boolean\", default: true },\n { name: \"isReadReceiptRequested\", type: \"Edm.Boolean\", default: true },\n { name: \"isRead\", type: \"Edm.Boolean\", default: true, freeFilter: true, unsortable: true },\n { name: \"isDraft\", type: \"Edm.Boolean\", default: true, freeFilter: true },\n { name: \"webLink\", type: \"Edm.String\", default: true },\n { name: \"inferenceClassification\", type: \"inferenceClassificationType\", default: true },\n { name: \"body\", type: \"itemBody\", default: true },\n { name: \"sender\", type: \"recipient\", default: true },\n { name: \"from\", type: \"recipient\", default: true },\n { name: \"toRecipients\", type: \"Collection(recipient)\", default: true },\n { name: \"ccRecipients\", type: \"Collection(recipient)\", default: true },\n { name: \"bccRecipients\", type: \"Collection(recipient)\", default: true },\n { name: \"replyTo\", type: \"Collection(recipient)\", default: true },\n { name: \"flag\", type: \"followupFlag\", default: true },\n { name: \"uniqueBody\", type: \"itemBody\", default: false },\n { name: \"internetMessageHeaders\", type: \"Collection(internetMessageHeader)\", default: false },\n];\n\nexport const MESSAGE_NAVIGATION = [\n \"attachments\",\n \"extensions\",\n \"singleValueExtendedProperties\",\n \"multiValueExtendedProperties\",\n];\n\nconst COMPLEX_TYPES: Record<string, Record<string, string>> = {\n itemBody: { contentType: \"bodyType\", content: \"Edm.String\" },\n recipient: { emailAddress: \"emailAddress\" },\n emailAddress: { name: \"Edm.String\", address: \"Edm.String\" },\n followupFlag: {\n flagStatus: \"followupFlagStatus\",\n startDateTime: \"dateTimeTimeZone\",\n dueDateTime: \"dateTimeTimeZone\",\n completedDateTime: \"dateTimeTimeZone\",\n },\n dateTimeTimeZone: { dateTime: \"Edm.String\", timeZone: \"Edm.String\" },\n internetMessageHeader: { name: \"Edm.String\", value: \"Edm.String\" },\n};\n\n/** Edm type of a message property path, or null when unknown. */\nexport function messagePathType(path: string[]): string | null {\n if (path[0] === \"id\") {\n return \"Edm.String\";\n }\n const p = MESSAGE_PROPERTIES.find((x) => x.name.toLowerCase() === path[0].toLowerCase());\n if (!p) {\n return null;\n }\n let t = p.type;\n for (const seg of path.slice(1)) {\n const inner = COLLECTION_TYPE.exec(t)?.[1] ?? t;\n const c = COMPLEX_TYPES[inner];\n if (!c) {\n return null;\n }\n const key = Object.keys(c).find((k) => k.toLowerCase() === seg.toLowerCase());\n if (!key) {\n return null;\n }\n t = c[key];\n }\n return t;\n}\n\nexport interface RenderOptions {\n /** Prefer: outlook.body-content-type */\n bodyType: \"text\" | \"html\" | null;\n /** Prefer: IdType=\"ImmutableId\" (or the request addressed an immutable id) */\n immutableIds: boolean;\n select: string[] | null;\n expandAttachments: boolean;\n}\n\nconst IMPORTANCE_RANK: Record<string, number> = { low: 0, normal: 1, high: 2 };\n\nexport function importanceRank(v: unknown): unknown {\n return typeof v === \"string\" && v in IMPORTANCE_RANK ? IMPORTANCE_RANK[v] : v;\n}\n\n/** Read a property path from a message for $filter / $orderby. */\nexport function messageValue(ex: Exchange, mbx: MailboxRecord, m: MessageRecord, path: string[]): unknown {\n const head = path[0].toLowerCase();\n let v: unknown;\n switch (head) {\n case \"id\":\n return ex.itemId(mbx, m);\n case \"hasattachments\":\n return m.attachments.some((a) => !a.isInline);\n case \"isdraft\":\n return m.state === \"draft\";\n case \"bodypreview\":\n return bodyPreview(m.body);\n case \"parentfolderid\":\n return ex.folderId(mbx, m.folderCounter);\n case \"conversationid\":\n return ex.conversationId(mbx, m);\n case \"changekey\":\n return ex.changeKey(mbx, m);\n default: {\n const key = Object.keys(m).find((k) => k.toLowerCase() === head);\n v = key ? (m as unknown as Record<string, unknown>)[key] : undefined;\n }\n }\n for (const seg of path.slice(1)) {\n if (v === null || v === undefined) {\n return null;\n }\n if (typeof v === \"object\") {\n const obj = v as Record<string, unknown>;\n const key = Object.keys(obj).find((k) => k.toLowerCase() === seg.toLowerCase());\n v = key ? obj[key] : undefined;\n }\n }\n return v ?? null;\n}\n\nfunction flagJson(m: MessageRecord): Record<string, unknown> {\n const f: Record<string, unknown> = { flagStatus: m.flag.flagStatus };\n if (m.flag.flagStatus === \"flagged\") {\n if (m.flag.dueDateTime) {\n f.dueDateTime = m.flag.dueDateTime;\n }\n if (m.flag.startDateTime) {\n f.startDateTime = m.flag.startDateTime;\n }\n }\n if (m.flag.flagStatus === \"complete\" && m.flag.completedDateTime) {\n f.completedDateTime = m.flag.completedDateTime;\n }\n return f;\n}\n\n/** OWA deep link. Verified: it embeds the id form in effect (immutable under IdType=\"ImmutableId\"). */\nexport function webLink(ex: Exchange, mbx: MailboxRecord, m: MessageRecord, immutable = false): string {\n const std = Buffer.from(ex.itemId(mbx, m, immutable).replace(/-/g, \"/\").replace(/_/g, \"+\"), \"base64\").toString(\n \"base64\",\n );\n return `https://outlook.office365.com/owa/?ItemID=${encodeURIComponent(std)}&exvsurl=1&viewmodel=ReadMessageItem`;\n}\n\nfunction propertyValue(ex: Exchange, mbx: MailboxRecord, m: MessageRecord, name: string, opts: RenderOptions): unknown {\n switch (name) {\n case \"createdDateTime\":\n return m.createdDateTime;\n case \"lastModifiedDateTime\":\n return m.lastModifiedDateTime;\n case \"changeKey\":\n return ex.changeKey(mbx, m);\n case \"categories\":\n return [...m.categories];\n case \"receivedDateTime\":\n return m.receivedDateTime;\n case \"sentDateTime\":\n return m.sentDateTime;\n case \"hasAttachments\":\n return m.attachments.some((a) => !a.isInline);\n case \"internetMessageId\":\n return m.internetMessageId;\n case \"subject\":\n return m.subject;\n case \"bodyPreview\":\n return bodyPreview(m.body);\n case \"importance\":\n return m.importance;\n case \"parentFolderId\":\n return ex.folderId(mbx, m.folderCounter);\n case \"conversationId\":\n return ex.conversationId(mbx, m);\n case \"conversationIndex\":\n return m.conversationIndex;\n case \"isDeliveryReceiptRequested\":\n return m.isDeliveryReceiptRequested;\n case \"isReadReceiptRequested\":\n return m.isReadReceiptRequested;\n case \"isRead\":\n return m.isRead;\n case \"isDraft\":\n return m.state === \"draft\" || m.state === \"submitted\";\n case \"webLink\":\n return webLink(ex, mbx, m, opts.immutableIds);\n case \"inferenceClassification\":\n return m.inferenceClassification;\n case \"body\":\n // Verified: a text body comes back verbatim even with Prefer text; only HTML is converted.\n if (opts.bodyType === \"text\" && m.body.contentType === \"html\") {\n return m.textBody === undefined ? bodyAsText(m.body) : { contentType: \"text\", content: m.textBody };\n }\n if (opts.bodyType === \"html\") {\n return bodyAsHtml(m.body);\n }\n return { ...m.body };\n case \"uniqueBody\": {\n const u = m.uniqueBody ?? m.body;\n if (opts.bodyType === \"html\") {\n return uniqueBodyAsHtml(u);\n }\n // Verified: drafts render uniqueBody as text by default; a received HTML\n // reply keeps HTML (protocol.action-params.case).\n const draft = m.state === \"draft\" || m.state === \"submitted\";\n if (opts.bodyType !== \"text\" && !draft && u.contentType === \"html\") {\n return uniqueBodyAsHtml(u);\n }\n return bodyAsText(u);\n }\n case \"sender\":\n return m.sender;\n case \"from\":\n return m.from;\n case \"toRecipients\":\n return m.toRecipients;\n case \"ccRecipients\":\n return m.ccRecipients;\n case \"bccRecipients\":\n return m.bccRecipients;\n case \"replyTo\":\n return m.replyTo;\n case \"flag\":\n return flagJson(m);\n case \"internetMessageHeaders\":\n return m.internetMessageHeaders;\n default:\n break;\n }\n return undefined;\n}\n\n/** Validate and canonicalize a message $select list. */\nexport function canonicalMessageSelect(select: string[]): { names: string[]; nav: string[] } {\n const names: string[] = [];\n const nav: string[] = [];\n for (const s of select) {\n if (s === \"*\") {\n names.push(...MESSAGE_PROPERTIES.filter((property) => property.default).map((property) => property.name));\n continue;\n }\n const raw = s.replace(GRAPH_TYPE_CAST_PREFIX, \"\");\n if (raw.toLowerCase() === \"id\") {\n names.push(\"id\");\n continue;\n }\n const p = MESSAGE_PROPERTIES.find((x) => x.name.toLowerCase() === raw.toLowerCase());\n if (p) {\n names.push(p.name);\n continue;\n }\n const n = MESSAGE_NAVIGATION.find((x) => x.toLowerCase() === raw.toLowerCase());\n if (n) {\n nav.push(n);\n continue;\n }\n throw Errors.parseUriProperty(raw, \"Microsoft.OutlookServices.Message\", true);\n }\n return { names: [...new Set(names)], nav: [...new Set(nav)] };\n}\n\nexport function renderMessage(\n ex: Exchange,\n mbx: MailboxRecord,\n m: MessageRecord,\n opts: RenderOptions,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n out[\"@odata.etag\"] = `W/\"${ex.changeKey(mbx, m)}\"`;\n out.id = ex.itemId(mbx, m, opts.immutableIds);\n const selected = opts.select ? new Set(opts.select) : null;\n const isDraftLike = m.state === \"draft\";\n for (const p of MESSAGE_PROPERTIES) {\n if (selected ? !selected.has(p.name) : !p.default) {\n continue;\n }\n // Drafts have no sender/from until one is set; sent items have no transport headers.\n if ((p.name === \"sender\" || p.name === \"from\") && !selected && isDraftLike && !m[p.name]) {\n continue;\n }\n if ((p.name === \"sender\" || p.name === \"from\") && selected && !m[p.name]) {\n continue;\n }\n if (p.name === \"internetMessageHeaders\" && !m.internetMessageHeaders) {\n continue;\n }\n if (p.name === \"webLink\" && selected === null) {\n out.webLink = webLink(ex, mbx, m, opts.immutableIds);\n continue;\n }\n let v = propertyValue(ex, mbx, m, p.name, opts);\n if (p.name === \"parentFolderId\") {\n v = ex.folderId(mbx, m.folderCounter);\n }\n out[p.name] = v;\n }\n if (opts.expandAttachments) {\n out.attachments = m.attachments.map((a) => renderAttachment(ex, mbx, m, a, true));\n }\n if (m.sharing) {\n return withSharingProperties(out, m.sharing, selected === null);\n }\n return m.meeting ? withMeetingProperties(out, m.meeting, selected === null) : out;\n}\n\n/**\n * calendarSharingMessage (verified live, calendar.sharing.write): @odata.type\n * first, canAccept and suggestedCalendarName after inferenceClassification,\n * the accept action after flag.\n */\nfunction withSharingProperties(\n base: Record<string, unknown>,\n info: NonNullable<MessageRecord[\"sharing\"]>,\n full: boolean,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { \"@odata.type\": \"#microsoft.graph.calendarSharingMessage\" };\n if (!full) {\n return Object.assign(out, base);\n }\n const action = { importance: \"primary\", actionType: \"accept\", action: \"acceptAndViewCalendar\" };\n for (const [k, v] of Object.entries(base)) {\n out[k] = v;\n if (k === \"inferenceClassification\") {\n out.canAccept = true;\n out.suggestedCalendarName = info.suggestedCalendarName;\n }\n }\n out.sharingMessageAction = action;\n out.sharingMessageActions = [action];\n return out;\n}\n\nconst MEETING_TYPE: Record<MeetingMessageInfo[\"kind\"], string> = {\n request: \"#microsoft.graph.eventMessageRequest\",\n response: \"#microsoft.graph.eventMessageResponse\",\n cancellation: \"#microsoft.graph.eventMessage\",\n};\n\nfunction utcDtz(ms: number): { dateTime: string; timeZone: string } {\n const iso = new Date(ms).toISOString();\n return { dateTime: `${iso.slice(0, 19)}.${iso.slice(20, 23)}0000`, timeZone: \"UTC\" };\n}\n\n/**\n * eventMessage subtypes: @odata.type first, the meeting scalars before body\n * and the meeting times after flag (order from the documented\n * eventMessageResponse example, docs/research/calendar-contacts.md 5.2).\n */\nfunction withMeetingProperties(\n base: Record<string, unknown>,\n info: MeetingMessageInfo,\n full: boolean,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { \"@odata.type\": MEETING_TYPE[info.kind] };\n if (!full) {\n return Object.assign(out, base);\n }\n const scalars: Record<string, unknown> = {\n meetingMessageType: info.meetingMessageType,\n type: info.type,\n isOutOfDate: false,\n isAllDay: info.isAllDay,\n isDelegated: false,\n };\n if (info.kind === \"request\") {\n scalars.responseRequested = info.responseRequested;\n // Observed: the request message reports null; the calendar item carries the real value.\n scalars.allowNewTimeProposals = null;\n scalars.meetingRequestType = info.meetingRequestType ?? \"newMeetingRequest\";\n }\n if (info.kind === \"response\") {\n scalars.responseType = info.responseType ?? \"none\";\n }\n scalars.recurrence = info.recurrence;\n const tail: Record<string, unknown> = {\n startDateTime: utcDtz(info.startMs),\n endDateTime: utcDtz(info.endMs),\n };\n // Observed: meeting messages for a meeting without a location have no location property.\n const located = Boolean((info.location as { displayName?: string }).displayName);\n if (located) {\n tail.location = { ...info.location };\n }\n if (info.kind === \"request\") {\n tail.previousLocation = info.previous ? { ...info.previous.location } : null;\n // Observed: a new request repeats its own times as the previous times.\n tail.previousStartDateTime = utcDtz(info.previous ? info.previous.startMs : info.startMs);\n tail.previousEndDateTime = utcDtz(info.previous ? info.previous.endMs : info.endMs);\n }\n // Observed: a plain response has no proposedNewTime property.\n if (info.kind === \"response\" && info.proposedNewTime) {\n tail.proposedNewTime = info.proposedNewTime\n ? { start: utcDtz(info.proposedNewTime.startMs), end: utcDtz(info.proposedNewTime.endMs) }\n : null;\n }\n for (const [k, v] of Object.entries(base)) {\n if (k === \"body\") {\n Object.assign(out, scalars);\n }\n out[k] = v;\n if (k === \"flag\") {\n Object.assign(out, tail);\n }\n }\n if (!(\"body\" in base)) {\n Object.assign(out, scalars);\n }\n if (!(\"flag\" in base)) {\n Object.assign(out, tail);\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\nexport const FOLDER_PROPERTIES = [\n \"displayName\",\n \"parentFolderId\",\n \"childFolderCount\",\n \"unreadItemCount\",\n \"totalItemCount\",\n \"sizeInBytes\",\n \"wellKnownName\",\n \"isHidden\",\n] as const;\n\n/** Properties the CSDL declares (wellKnownName and sizeInBytes are not in v1.0 metadata). */\nexport const FOLDER_SELECTABLE = [\n \"id\",\n \"displayName\",\n \"parentFolderId\",\n \"childFolderCount\",\n \"unreadItemCount\",\n \"totalItemCount\",\n \"isHidden\",\n];\n\nexport function renderFolder(\n ex: Exchange,\n mbx: MailboxRecord,\n f: FolderRecord,\n select: string[] | null,\n): Record<string, unknown> {\n const counts = ex.counts(mbx, f);\n const all: Record<string, unknown> = {\n displayName: f.displayName,\n parentFolderId: f.parentCounter === null ? null : ex.folderId(mbx, f.parentCounter),\n childFolderCount: counts.childFolderCount,\n unreadItemCount: counts.unreadItemCount,\n totalItemCount: counts.totalItemCount,\n sizeInBytes: counts.sizeInBytes,\n wellKnownName: f.wellKnownName,\n isHidden: f.isHidden,\n };\n // Verified (mail.searchfolders.lifecycle): search folders carry their type\n // first, even under $select, and append their definition.\n const out: Record<string, unknown> = f.search\n ? { \"@odata.type\": \"#microsoft.graph.mailSearchFolder\", id: ex.folderId(mbx, f) }\n : { id: ex.folderId(mbx, f) };\n for (const k of FOLDER_PROPERTIES) {\n if (select && !select.includes(k)) {\n continue;\n }\n out[k] = all[k];\n }\n if (f.search) {\n // Verified (exp.mailbox.outlook-web-state): a folder whose criteria Graph cannot\n // express reports only isSupported false.\n const search: Record<string, unknown> = f.search.unsupported\n ? { isSupported: false }\n : {\n isSupported: true,\n includeNestedFolders: f.search.includeNestedFolders,\n sourceFolderIds: f.search.sourceFolderCounters.map((c) => ex.folderId(mbx, c)),\n filterQuery: f.search.filterQuery,\n };\n for (const [k, v] of Object.entries(search)) {\n if (select && !select.some((x) => x.toLowerCase() === k.toLowerCase())) {\n continue;\n }\n out[k] = v;\n }\n }\n return out;\n}\n\nexport function canonicalFolderSelect(select: string[]): string[] {\n const out: string[] = [];\n for (const s of select) {\n const k = FOLDER_SELECTABLE.find((x) => x.toLowerCase() === s.toLowerCase());\n if (!k) {\n const nav = [\n \"childFolders\",\n \"messages\",\n \"messageRules\",\n \"singleValueExtendedProperties\",\n \"multiValueExtendedProperties\",\n ].find((x) => x.toLowerCase() === s.toLowerCase());\n if (nav) {\n continue;\n }\n throw Errors.selectExpandParse(s, \"mailFolder\");\n }\n out.push(k);\n }\n return [...new Set(out)];\n}\n\nexport function folderValue(ex: Exchange, mbx: MailboxRecord, f: FolderRecord, path: string[]): unknown {\n const r = renderFolder(ex, mbx, f, null);\n const key = Object.keys(r).find((k) => k.toLowerCase() === path[0].toLowerCase());\n return key ? r[key] : undefined;\n}\n\nexport function folderPathType(path: string[]): string | null {\n const types: Record<string, string> = {\n id: \"Edm.String\",\n displayName: \"Edm.String\",\n parentFolderId: \"Edm.String\",\n childFolderCount: \"Edm.Int32\",\n unreadItemCount: \"Edm.Int32\",\n totalItemCount: \"Edm.Int32\",\n isHidden: \"Edm.Boolean\",\n };\n if (path.length !== 1) {\n return null;\n }\n const k = Object.keys(types).find((x) => x.toLowerCase() === path[0].toLowerCase());\n return k ? types[k] : null;\n}\n\n// ---------------------------------------------------------------------------\n// Attachments\n// ---------------------------------------------------------------------------\n\n/**\n * Attachment ids (verified layout): the owning item id followed by\n * 01 12 00 10 00 and a 16 byte attachment key. The emulator derives the key\n * from the attachment counter so it can be decoded again.\n */\nexport function attachmentId(ex: Exchange, mbx: MailboxRecord, m: MessageRecord, a: AttachmentRecord): string {\n const item = Buffer.from(ex.itemId(mbx, m).replace(/-/g, \"/\").replace(/_/g, \"+\"), \"base64\");\n const key = createHash(\"sha1\").update(`${mbx.guid}:${a.counter}`).digest().subarray(0, 16);\n key.writeUInt32BE(a.counter >>> 0, 12);\n return Buffer.concat([item, Buffer.from([0x01, 0x12, 0x00, 0x10, 0x00]), key])\n .toString(\"base64\")\n .replace(/\\//g, \"-\")\n .replace(/\\+/g, \"_\");\n}\n\n/** Returns {itemId, counter} for an attachment id, or null when malformed. */\nexport function decodeAttachmentId(id: string): { itemId: string; counter: number } | null {\n const buf = Buffer.from(id.replace(/-/g, \"/\").replace(/_/g, \"+\"), \"base64\");\n // 111 byte (compact) or 113 byte (standard) item id + 21 byte suffix.\n const n = buf.length - 21;\n if (n !== 111 && n !== 113) {\n return null;\n }\n if (buf[n] !== 0x01 || buf[n + 1] !== 0x12 || buf[n + 3] !== 0x10) {\n return null;\n }\n const itemId = buf.subarray(0, n).toString(\"base64\").replace(/\\//g, \"-\").replace(/\\+/g, \"_\");\n return { itemId, counter: buf.readUInt32BE(n + 17) };\n}\n\nexport function renderAttachment(\n ex: Exchange,\n mbx: MailboxRecord,\n m: MessageRecord,\n a: AttachmentRecord,\n withContent: boolean,\n select: string[] | null = null,\n): Record<string, unknown> {\n const id = attachmentId(ex, mbx, m, a);\n let out: Record<string, unknown>;\n if (a.type === \"file\") {\n out = {\n \"@odata.type\": \"#microsoft.graph.fileAttachment\",\n \"@odata.mediaContentType\": a.contentType,\n id,\n lastModifiedDateTime: a.lastModifiedDateTime,\n name: a.name,\n contentType: a.contentType,\n size: a.size,\n isInline: a.isInline,\n contentId: a.contentId,\n contentLocation: a.contentLocation,\n };\n if (withContent) {\n out.contentBytes = a.contentBytes;\n }\n } else if (a.type === \"item\") {\n out = {\n \"@odata.type\": \"#microsoft.graph.itemAttachment\",\n id,\n lastModifiedDateTime: a.lastModifiedDateTime,\n name: a.name,\n contentType: null,\n size: a.size,\n isInline: a.isInline,\n };\n } else {\n out = {\n \"@odata.type\": \"#microsoft.graph.referenceAttachment\",\n id,\n lastModifiedDateTime: a.lastModifiedDateTime,\n name: a.name,\n contentType: a.contentType,\n size: a.size,\n isInline: a.isInline,\n };\n }\n if (select) {\n const keep = new Set([\"@odata.type\", \"@odata.mediaContentType\", \"id\", ...select]);\n for (const k of Object.keys(out)) {\n if (!keep.has(k)) {\n delete out[k];\n }\n }\n }\n return out;\n}\n"],"mappings":"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","names":["randomBytes","randomUUID","literal","error","randomBytes","randomBytes","randomBytes","mbx","x","randomBytes","g","x","randomUUID","randomUUID","header","t","inner","header","x","x","randomBytes","randomUUID"]}
|